@eztrak/shared 0.16.6 → 0.17.1
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/dist/{chunk-SS3J2WBE.mjs → chunk-4ASJWHN3.mjs} +3 -6
- package/dist/chunk-4ASJWHN3.mjs.map +1 -0
- package/dist/{chunk-WZVYTP6G.mjs → chunk-LS7AI4ER.mjs} +2 -2
- package/dist/{chunk-EIX5CUQF.mjs → chunk-QOYMQFOB.mjs} +238 -20
- package/dist/chunk-QOYMQFOB.mjs.map +1 -0
- package/dist/components/index.d.mts +2 -1
- package/dist/components/index.d.ts +2 -1
- package/dist/components/index.js +237 -23
- package/dist/components/index.js.map +1 -1
- package/dist/components/index.mjs +2 -2
- package/dist/{handleApiError-CwVIJOqO.d.mts → handleApiError-BIAaN76q.d.mts} +32 -1
- package/dist/{handleApiError-CwVIJOqO.d.ts → handleApiError-BIAaN76q.d.ts} +32 -1
- package/dist/index.d.mts +2 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.js +239 -23
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +5 -3
- package/dist/utils/index.d.mts +2 -1
- package/dist/utils/index.d.ts +2 -1
- package/dist/utils/index.js +238 -19
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/index.mjs +4 -2
- package/package.json +1 -1
- package/dist/chunk-EIX5CUQF.mjs.map +0 -1
- package/dist/chunk-SS3J2WBE.mjs.map +0 -1
- /package/dist/{chunk-WZVYTP6G.mjs.map → chunk-LS7AI4ER.mjs.map} +0 -0
|
@@ -8,7 +8,7 @@ import {
|
|
|
8
8
|
storeItemInLocalStorage,
|
|
9
9
|
toDateInputValue,
|
|
10
10
|
truncateText
|
|
11
|
-
} from "./chunk-
|
|
11
|
+
} from "./chunk-QOYMQFOB.mjs";
|
|
12
12
|
|
|
13
13
|
// src/components/tabs/EztrakTabs.tsx
|
|
14
14
|
import {
|
|
@@ -1610,10 +1610,7 @@ function Sidebar({
|
|
|
1610
1610
|
"div",
|
|
1611
1611
|
{
|
|
1612
1612
|
"data-sidebar-item": item.name,
|
|
1613
|
-
className:
|
|
1614
|
-
"has-sub-items max-w-full min-w-0 flex flex-col",
|
|
1615
|
-
collapsed ? "my-1" : "my-2"
|
|
1616
|
-
),
|
|
1613
|
+
className: "has-sub-items max-w-full min-w-0 flex flex-col",
|
|
1617
1614
|
children: [
|
|
1618
1615
|
/* @__PURE__ */ jsx13(
|
|
1619
1616
|
ToolTip,
|
|
@@ -2652,4 +2649,4 @@ export {
|
|
|
2652
2649
|
RowActions,
|
|
2653
2650
|
TableErrorBoundary
|
|
2654
2651
|
};
|
|
2655
|
-
//# sourceMappingURL=chunk-
|
|
2652
|
+
//# sourceMappingURL=chunk-4ASJWHN3.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.css","../src/components/Loader/Loader.tsx","../src/components/button/Button.tsx","../src/components/card/Card.tsx","../src/components/header/Header.tsx","../src/components/breadcrumbs/Breadcrumbs.tsx","../src/components/sidebar/Sidebar.tsx","../src/components/tooltip/ToolTip.tsx","../src/components/skeleton/CardSkeleton.tsx","../src/components/tooltip/TooltipText.tsx","../src/components/cell-editor/CustomCellEditor.tsx","../src/components/popup-cell-renderer/PopupCellRenderer.tsx","../src/components/row-actions/presets.ts","../src/components/row-actions/ActionMenuItem.tsx","../src/components/row-actions/resolveActions.ts","../src/components/row-actions/RowActions.tsx","../src/components/table-error-boundary/TableErrorBoundary.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 { useEffect, useRef } from \"react\";\r\nimport Select from \"react-select\";\r\nimport { useSearchParams } from \"react-router-dom\";\r\nimport { dropdownStyles } from \"./dropdownStyles\";\r\nimport { cn } from \"../../utils/cn\";\r\nimport { resetPageParam } from \"../../utils/resetPageParam\";\r\nimport {\r\n getItemFromLocalStorage,\r\n removeItem,\r\n storeItemInLocalStorage,\r\n} from \"../../utils/localStorage\";\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 = \"12px\",\r\n className,\r\n isClearable = true,\r\n isSearchable = true,\r\n isDisabled = false,\r\n isLoading = false,\r\n saveToLocalStorage = false,\r\n pageParam = \"page\",\r\n ...otherProps\r\n}: DropdownFilterProps<Option>) {\r\n const [searchParams, setSearchParams] = useSearchParams();\r\n const hasRestoredFromStorage = useRef(false);\r\n\r\n useEffect(() => {\r\n if (!saveToLocalStorage || hasRestoredFromStorage.current) return;\r\n hasRestoredFromStorage.current = true;\r\n\r\n if (searchParams.get(name)) return;\r\n\r\n const stored = getItemFromLocalStorage<string>(name);\r\n if (stored != null && stored !== \"\") {\r\n setSearchParams((prev) => {\r\n prev.set(name, String(stored));\r\n // Restoring a stored filter narrows the result set too, so a deep-linked\r\n // page number would land out of range.\r\n return resetPageParam(prev, pageParam);\r\n });\r\n }\r\n }, [saveToLocalStorage, name, pageParam, searchParams, setSearchParams]);\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 const selectedValue =\r\n selected && selected[valueKey] !== \"\" ? String(selected[valueKey]) : null;\r\n\r\n setSearchParams((prev) => {\r\n // Re-selecting the current option leaves the result set alone, so keep the\r\n // page the user is on.\r\n if ((prev.get(name) ?? \"\") === (selectedValue ?? \"\")) {\r\n return prev;\r\n }\r\n\r\n if (!selectedValue) {\r\n prev.delete(name);\r\n } else {\r\n prev.set(name, selectedValue);\r\n }\r\n\r\n return resetPageParam(prev, pageParam);\r\n });\r\n\r\n if (saveToLocalStorage) {\r\n if (selectedValue) {\r\n storeItemInLocalStorage(name, selectedValue);\r\n } else {\r\n removeItem(name);\r\n }\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: string\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: _borderRadius,\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 { resetPageParam } from \"../../utils/resetPageParam\";\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 pageParam = \"page\",\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 const nextValue = searchQuery?.trim() ?? \"\";\r\n\r\n setSearchParams((prev) => {\r\n // Same query as the URL already holds: the result set is unchanged, so\r\n // leave the current page alone.\r\n if ((prev.get(defaultParam) ?? \"\") === nextValue) {\r\n return prev;\r\n }\r\n\r\n if (nextValue) {\r\n prev.set(defaultParam, nextValue);\r\n } else {\r\n prev.delete(defaultParam);\r\n }\r\n\r\n return resetPageParam(prev, pageParam);\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 modalHeader,\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 {modalHeader ? \r\n modalHeader \r\n : (\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 )}\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 <div\r\n className={cn(\r\n \"sticky bottom-0 flex justify-end p-4 space-x-4 border-t bg-white \",\r\n 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 \"@eztrak/shared/components/loader.css\";","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};\r\n","import { forwardRef } from \"react\";\r\nimport { cn } from \"../../utils/cn\";\r\nimport type { ButtonProps } from \"./types\";\r\n\r\nconst BASE_STYLES =\r\n \"flex gap-1 items-center font-medium text-sm px-5 py-3 rounded-md transition-colors duration-200 disabled:opacity-50 disabled:cursor-not-allowed\";\r\n\r\nconst VARIANTS: Record<string, string> = {\r\n primary:\r\n \"bg-white text-secondary border-secondary hover:bg-lightGray hover:text-black\",\r\n \"primary-outline\":\r\n \"bg-white text-primary-150 border-primary-150 hover:bg-primary-100 hover:text-white font-bold\",\r\n \"primary-fill\": \"bg-primary-150 text-white border-primary hover:bg-primary/90\",\r\n secondary: \"bg-primary-150 text-white border-primary hover:bg-primary/90\",\r\n danger: \"bg-red-600 text-white border-red-600 hover:bg-red-700\",\r\n outline: \"bg-white text-primary border-primary hover:bg-primary/10\",\r\n ghost:\r\n \"bg-transparent text-secondary border-transparent hover:bg-primary/10 p-2\",\r\n inline:\r\n \"bg-transparent text-gray-500 border-none hover:text-gray-600 underline shadow-none p-0 m-0\",\r\n};\r\n\r\nconst SIZES: Record<string, string> = {\r\n sm: \"px-3 py-2 text-xs\",\r\n md: \"px-5 py-3 text-sm\",\r\n lg: \"px-6 py-4 text-base\",\r\n};\r\n\r\nexport const Button = forwardRef<HTMLButtonElement, ButtonProps>(\r\n (\r\n {\r\n children,\r\n className = \"\",\r\n type = \"button\",\r\n onClick,\r\n disabled = false,\r\n variant = \"primary\",\r\n size = \"md\",\r\n ...props\r\n },\r\n ref\r\n ) => {\r\n const variantStyles = VARIANTS[variant] || VARIANTS.primary;\r\n const sizeStyles = SIZES[size];\r\n\r\n return (\r\n <button\r\n ref={ref}\r\n type={type}\r\n className={cn(\r\n BASE_STYLES,\r\n variantStyles,\r\n size !== \"md\" && sizeStyles,\r\n className\r\n )}\r\n onClick={onClick}\r\n disabled={disabled}\r\n {...props}\r\n >\r\n {children}\r\n </button>\r\n );\r\n }\r\n);\r\n\r\nButton.displayName = \"Button\";\r\n","import { cn } from \"../../utils/cn\";\r\nimport type { CardProps } from \"./types\";\r\n\r\nexport function Card({\r\n title,\r\n content,\r\n icon,\r\n onClick,\r\n containerClassName = \"shadow p-6\",\r\n iconClassName = \"\",\r\n titleClassName = \"\",\r\n contentClassName = \"\",\r\n cardBodyClassName = \"\",\r\n}: CardProps) {\r\n return (\r\n <div\r\n className={cn(\r\n \"transform transition duration-300 cursor-pointer select-none\",\r\n containerClassName\r\n )}\r\n onClick={onClick}\r\n >\r\n <div className={cn(\"flex space-x-4\", cardBodyClassName)}>\r\n <span className={cn(\"text-primary text-3xl\", iconClassName)}>{icon}</span>\r\n <div>\r\n <h3 className={cn(\"font-semibold text-lg text-primary\", titleClassName)}>\r\n {title}\r\n </h3>\r\n {content != null && (\r\n <p className={cn(\"text-sm text-secondary\", contentClassName)}>{content}</p>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import type { HeaderProps } from \"./types\";\r\n\r\nexport function Header({\r\n title = \"Header\",\r\n className = \"p-2 gap-2 flex-col\",\r\n containerClass = \"\",\r\n breadcrumbs = \"\",\r\n titleStyle = \"text-4xl h-fit font-bold\",\r\n breadcrumbsStyle = \"text-sm\",\r\n children,\r\n}: HeaderProps) {\r\n return (\r\n <div className={`flex ${className}`}>\r\n <div className=\"title-wrapper\">\r\n <h1 className={titleStyle}>{title}</h1>\r\n {breadcrumbs && (\r\n <div className={`breadcrumbs-wraper ${breadcrumbsStyle}`}>{breadcrumbs}</div>\r\n )}\r\n </div>\r\n <div className={`flex flex-row justify-between items-center ${containerClass}`}>\r\n {children}\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import {\r\n cloneElement,\r\n isValidElement,\r\n type CSSProperties,\r\n type ReactNode,\r\n} from \"react\";\r\nimport { Link, useLocation } from \"react-router-dom\";\r\nimport { cn } from \"../../utils/cn\";\r\nimport type { BreadcrumbRoute, BreadcrumbsProps } from \"./types\";\r\n\r\nconst DEFAULT_BACKGROUND = \"#F7F7F5\";\r\nconst DEFAULT_INACTIVE = \"#6B7280\";\r\nconst DEFAULT_ACTIVE = \"#111111\";\r\nconst DEFAULT_SEPARATOR = \"#9CA3AF\";\r\n\r\nconst CRUMB_LAYOUT =\r\n \"inline-flex items-center gap-1.5 whitespace-nowrap leading-5 rounded-sm\";\r\n\r\nconst LINK_INTERACTION =\r\n \"font-normal transition-colors duration-200 motion-reduce:transition-none hover:!text-[color-mix(in_srgb,var(--bc-inactive)_65%,#111111)] focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-[#111111]\";\r\n\r\ntype BreadcrumbNavStyle = CSSProperties & {\r\n \"--bc-inactive\": string;\r\n};\r\n\r\nfunction BreadcrumbChevron() {\r\n return (\r\n <svg\r\n width=\"12\"\r\n height=\"12\"\r\n viewBox=\"0 0 12 12\"\r\n fill=\"none\"\r\n aria-hidden=\"true\"\r\n className=\"shrink-0\"\r\n >\r\n <path\r\n d=\"M4.5 2.5L8 6L4.5 9.5\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"1.5\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n />\r\n </svg>\r\n );\r\n}\r\n\r\nfunction asTitleMap(\r\n customTitles: BreadcrumbsProps[\"customTitles\"]\r\n): Record<string, string> {\r\n if (Object.prototype.toString.call(customTitles) !== \"[object Object]\") {\r\n return {};\r\n }\r\n return customTitles as Record<string, string>;\r\n}\r\n\r\nfunction findRoute(\r\n pathname: string,\r\n routes: BreadcrumbRoute[],\r\n parentPath = \"\"\r\n): BreadcrumbRoute | null {\r\n for (const route of routes) {\r\n const fullPath = `${parentPath}/${route.path}`.replace(/\\/+/g, \"/\");\r\n if (fullPath === pathname) {\r\n return route;\r\n }\r\n if (route.children) {\r\n const childRoute = findRoute(pathname, route.children, fullPath);\r\n if (childRoute) {\r\n return childRoute;\r\n }\r\n }\r\n }\r\n return null;\r\n}\r\n\r\nfunction getLastParam(str: string) {\r\n return str.endsWith(\"/\")\r\n ? str.slice(0, -1).split(\"/\").pop()\r\n : str.split(\"/\").pop();\r\n}\r\n\r\ntype Crumb = {\r\n key: string;\r\n to: string;\r\n title: string;\r\n icon: ReactNode | null;\r\n isCurrent: boolean;\r\n isLink: boolean;\r\n};\r\n\r\nexport function Breadcrumbs({\r\n routes = [],\r\n containerClassName,\r\n linkClassName = \"\",\r\n separatorClassName = \"\",\r\n separator,\r\n activeClassName = \"font-semibold\",\r\n customTitles = {},\r\n customIcons = {},\r\n prefix,\r\n suffix,\r\n nonClickablePaths = [],\r\n backgroundColor = DEFAULT_BACKGROUND,\r\n inactiveColor = DEFAULT_INACTIVE,\r\n activeColor = DEFAULT_ACTIVE,\r\n separatorColor = DEFAULT_SEPARATOR,\r\n iconColor,\r\n iconClassName,\r\n showHome = false,\r\n}: BreadcrumbsProps) {\r\n const location = useLocation();\r\n const pathnames = location.pathname.split(\"/\").filter((segment) => segment);\r\n const titles = asTitleMap(customTitles);\r\n\r\n const getTitle = (pathname: string) => {\r\n const match = findRoute(pathname, routes);\r\n if (match && match.title) {\r\n return match.title;\r\n }\r\n\r\n const lastParamPath = getLastParam(pathname);\r\n if (lastParamPath && titles[lastParamPath]) {\r\n return titles[lastParamPath];\r\n }\r\n\r\n if (lastParamPath) {\r\n return lastParamPath;\r\n }\r\n\r\n return pathname;\r\n };\r\n\r\n const getIcon = (pathname: string) => {\r\n const segment = getLastParam(pathname);\r\n if (segment && customIcons[segment]) {\r\n return customIcons[segment];\r\n }\r\n return null;\r\n };\r\n\r\n const crumbs: Crumb[] = [];\r\n\r\n if (showHome) {\r\n crumbs.push({\r\n key: \"home\",\r\n to: \"/\",\r\n title: titles.home || \"Home\",\r\n icon: customIcons.home ?? null,\r\n isCurrent: pathnames.length === 0,\r\n isLink: pathnames.length > 0,\r\n });\r\n }\r\n\r\n pathnames.forEach((segment, index) => {\r\n const to = `/${pathnames.slice(0, index + 1).join(\"/\")}`;\r\n const isCurrent = index === pathnames.length - 1;\r\n const isNonClickable = nonClickablePaths.some(\r\n (token) => to.includes(token) || segment === token\r\n );\r\n\r\n crumbs.push({\r\n key: to,\r\n to,\r\n title: getTitle(to),\r\n icon: getIcon(to),\r\n isCurrent,\r\n isLink: !isCurrent && !isNonClickable,\r\n });\r\n });\r\n\r\n const navStyle: BreadcrumbNavStyle = {\r\n backgroundColor,\r\n \"--bc-inactive\": inactiveColor,\r\n };\r\n\r\n const inactiveClassName = cn(CRUMB_LAYOUT, LINK_INTERACTION, linkClassName);\r\n const staticInactiveClassName = cn(CRUMB_LAYOUT, \"font-normal\", linkClassName);\r\n const currentClassName = cn(CRUMB_LAYOUT, activeClassName);\r\n\r\n const renderCrumb = (crumb: Crumb) => {\r\n const content = (\r\n <>\r\n {crumb.icon ? (\r\n <span\r\n className={cn(\"inline-flex shrink-0 items-center\", iconClassName)}\r\n style={iconColor ? { color: iconColor } : undefined}\r\n >\r\n {crumb.icon}\r\n </span>\r\n ) : null}\r\n {crumb.title}\r\n </>\r\n );\r\n\r\n if (crumb.isCurrent) {\r\n return (\r\n <span\r\n className={currentClassName}\r\n style={{ color: activeColor }}\r\n aria-current=\"page\"\r\n >\r\n {content}\r\n </span>\r\n );\r\n }\r\n\r\n if (crumb.isLink) {\r\n return (\r\n <Link\r\n to={crumb.to}\r\n className={inactiveClassName}\r\n style={{ color: inactiveColor }}\r\n >\r\n {content}\r\n </Link>\r\n );\r\n }\r\n\r\n return (\r\n <span className={staticInactiveClassName} style={{ color: inactiveColor }}>\r\n {content}\r\n </span>\r\n );\r\n };\r\n\r\n return (\r\n <nav\r\n aria-label=\"Breadcrumb\"\r\n className={cn(\r\n \"flex w-full flex-row items-center gap-2 overflow-x-auto px-4 py-3 text-sm leading-5\",\r\n containerClassName\r\n )}\r\n style={navStyle}\r\n >\r\n {prefix ? <div className=\"breadcrumb-prefix\">{prefix}</div> : null}\r\n <ol className=\"flex min-w-0 flex-row flex-nowrap items-center gap-2\">\r\n {crumbs.map((crumb, index) => (\r\n <li key={crumb.key} className=\"inline-flex items-center gap-2\">\r\n {index > 0 ? (\r\n <span\r\n aria-hidden=\"true\"\r\n className={cn(\r\n \"inline-flex shrink-0 items-center\",\r\n separatorClassName\r\n )}\r\n style={{ color: separatorColor }}\r\n >\r\n {separator === undefined ? (\r\n <BreadcrumbChevron />\r\n ) : isValidElement(separator) ? (\r\n cloneElement(separator)\r\n ) : (\r\n separator\r\n )}\r\n </span>\r\n ) : null}\r\n {renderCrumb(crumb)}\r\n </li>\r\n ))}\r\n </ol>\r\n {suffix ? <div className=\"breadcrumb-suffix\">{suffix}</div> : null}\r\n </nav>\r\n );\r\n}\r\n","import { useEffect, useRef, useState } from \"react\";\r\nimport { Link, useLocation } from \"react-router-dom\";\r\nimport { cn } from \"../../utils/cn\";\r\nimport { ToolTip } from \"../tooltip/ToolTip\";\r\nimport type { SidebarItem, SidebarProps } from \"./types\";\r\n\r\nfunction getItemTooltip(item: SidebarItem) {\r\n return item.tooltip || item.name;\r\n}\r\n\r\nfunction getTooltipPlacement(item: SidebarItem, collapsed: boolean) {\r\n return item.tooltipPlacement || (collapsed ? \"right\" : \"top\");\r\n}\r\n\r\nfunction isItemActive(pathname: string, link?: string) {\r\n if (!link || link === \"#\") return false;\r\n return pathname === link || pathname.startsWith(`${link}/`);\r\n}\r\n\r\nfunction SidebarItemLabel({\r\n name,\r\n collapsed,\r\n className,\r\n}: {\r\n name: string;\r\n collapsed: boolean;\r\n className?: string;\r\n}) {\r\n return (\r\n <span\r\n className={cn(\r\n className,\r\n collapsed &&\r\n \"block w-full text-center text-[10px] font-medium leading-tight line-clamp-2 wrap-break-word\"\r\n )}\r\n >\r\n {name}\r\n </span>\r\n );\r\n}\r\n\r\nfunction SidebarItemIcon({\r\n icon,\r\n className,\r\n}: {\r\n icon?: SidebarItem[\"icon\"];\r\n className?: string;\r\n}) {\r\n if (!icon) return null;\r\n return (\r\n <span className={cn(\"inline-flex shrink-0\", className)} aria-hidden=\"true\">\r\n {icon}\r\n </span>\r\n );\r\n}\r\n\r\nexport function Sidebar({\r\n className,\r\n sideCollapseWidth = \"w-24\",\r\n sidebarWidth = \"w-48\",\r\n header,\r\n children,\r\n footer,\r\n items = [],\r\n logoUrl = \"\",\r\n logoRouteUrl = \"\",\r\n logoAltText = \"Logo\",\r\n collapseButtonText = \"⬅️ Collapse\",\r\n expandButtonText = \"➡️\",\r\n location: _location,\r\n classNames = {},\r\n onCollapseChange,\r\n isCollapsed = false,\r\n itemDropdownIcon = <span>▼</span>,\r\n ...rest\r\n}: SidebarProps) {\r\n const location = useLocation();\r\n const [collapsed, setCollapsed] = useState<boolean>(isCollapsed);\r\n const [openGroups, setOpenGroups] = useState<Record<string, boolean>>({});\r\n const onCollapseChangeRef = useRef(onCollapseChange);\r\n onCollapseChangeRef.current = onCollapseChange;\r\n\r\n useEffect(() => {\r\n setCollapsed(isCollapsed);\r\n }, [isCollapsed]);\r\n\r\n useEffect(() => {\r\n onCollapseChangeRef.current?.(collapsed);\r\n }, [collapsed]);\r\n\r\n const toggleGroup = (group: string) => {\r\n setOpenGroups((prevState) => ({\r\n ...prevState,\r\n [group]: !prevState[group],\r\n }));\r\n };\r\n\r\n const itemLayoutClass = (active: boolean, itemClassName?: string) =>\r\n cn(\r\n \"flex cursor-pointer\",\r\n classNames?.navItem,\r\n collapsed &&\r\n \"w-full flex-col items-center justify-center gap-0.5 px-1 py-2 my-1 !mx-0 max-w-full min-w-0 box-border text-center min-h-11\",\r\n active && \"active\",\r\n itemClassName\r\n );\r\n\r\n const renderLink = (item: SidebarItem, key: string) => {\r\n const active = isItemActive(location.pathname, item.link);\r\n\r\n return (\r\n <div key={key} className=\"max-w-full min-w-0\" data-sidebar-item={item.name}>\r\n <ToolTip\r\n text={getItemTooltip(item)}\r\n placement={getTooltipPlacement(item, collapsed)}\r\n delayShow={150}\r\n className=\"block max-w-full min-w-0\"\r\n >\r\n <Link\r\n to={item.link || \"#\"}\r\n className={itemLayoutClass(active, item.itemClassName)}\r\n aria-current={active ? \"page\" : undefined}\r\n >\r\n <SidebarItemIcon icon={item.icon} className={classNames?.navItemText} />\r\n <SidebarItemLabel\r\n name={item.name}\r\n collapsed={collapsed}\r\n className={classNames?.navItemText}\r\n />\r\n </Link>\r\n </ToolTip>\r\n </div>\r\n );\r\n };\r\n\r\n return (\r\n <div\r\n className={cn(\r\n \"flex flex-col h-screen overflow-hidden\",\r\n collapsed ? `${sideCollapseWidth} items-stretch collapsed` : sidebarWidth,\r\n \"transition-[width] duration-200 ease-in-out motion-reduce:transition-none\",\r\n className\r\n )}\r\n {...rest}\r\n >\r\n {logoUrl && (\r\n <div\r\n className={cn(\r\n \"flex items-center justify-center h-16 border-b border-gray-300\",\r\n classNames.logoSection\r\n )}\r\n >\r\n {logoRouteUrl ? (\r\n <Link\r\n to={logoRouteUrl}\r\n className=\"sidebar-logo-link inline-flex items-center justify-center\"\r\n >\r\n <img src={logoUrl} alt={logoAltText} className=\"h-10\" />\r\n </Link>\r\n ) : (\r\n <img src={logoUrl} alt={logoAltText} className=\"h-10\" />\r\n )}\r\n </div>\r\n )}\r\n\r\n {header && (\r\n <div className=\"flex items-center justify-between p-4 border-b border-gray-300 shrink-0\">\r\n {header}\r\n </div>\r\n )}\r\n\r\n <nav\r\n aria-label=\"Sidebar\"\r\n className={cn(\r\n \"grow min-h-0 min-w-0 w-full\",\r\n classNames.navSection\r\n )}\r\n >\r\n {items.map((item, index) => {\r\n if (item.subItems) {\r\n const groupOpen = Boolean(openGroups[item.name]);\r\n const groupId = `sidebar-group-${index}`;\r\n\r\n return (\r\n <div\r\n key={index}\r\n data-sidebar-item={item.name}\r\n className=\"has-sub-items max-w-full min-w-0 flex flex-col\"\r\n >\r\n <ToolTip\r\n text={getItemTooltip(item)}\r\n placement={getTooltipPlacement(item, collapsed)}\r\n delayShow={150}\r\n className=\"flex flex-col w-full max-w-full min-w-0\"\r\n >\r\n <button\r\n type=\"button\"\r\n onClick={() => toggleGroup(item.name)}\r\n data-sidebar-item={item.name}\r\n aria-expanded={groupOpen}\r\n aria-controls={groupId}\r\n className={cn(\r\n itemLayoutClass(false, item.itemClassName),\r\n !collapsed && \"dropdown-title-wrapper\",\r\n \"relative appearance-none border-0 bg-transparent [font:inherit]\"\r\n )}\r\n >\r\n <span\r\n className={cn(\r\n \"flex items-center min-w-0\",\r\n collapsed\r\n ? \"flex-col gap-0.5 w-full\"\r\n : \"space-x-2 flex-1\"\r\n )}\r\n >\r\n {collapsed ? (\r\n <span className=\"flex w-full items-center justify-center\">\r\n <span className=\"inline-flex items-center gap-2\">\r\n <span className=\"inline-flex w-3 shrink-0\" aria-hidden=\"true\" />\r\n <SidebarItemIcon\r\n icon={item.icon}\r\n className={classNames?.navItemText}\r\n />\r\n <span\r\n className={cn(\r\n \"sidebar-group-caret inline-flex w-3 shrink-0 items-center justify-center text-current [&>svg]:h-3 [&>svg]:w-3 transition-transform duration-200 motion-reduce:transition-none\",\r\n groupOpen ? \"rotate-180\" : \"rotate-0\"\r\n )}\r\n aria-hidden=\"true\"\r\n >\r\n {itemDropdownIcon}\r\n </span>\r\n </span>\r\n </span>\r\n ) : (\r\n <span className=\"flex items-center space-x-2 min-w-0 flex-1\">\r\n <SidebarItemIcon\r\n icon={item.icon}\r\n className={classNames?.navItemText}\r\n />\r\n <SidebarItemLabel\r\n name={item.name}\r\n collapsed={false}\r\n className={classNames?.navItemText}\r\n />\r\n </span>\r\n )}\r\n {collapsed && (\r\n <SidebarItemLabel\r\n name={item.name}\r\n collapsed\r\n className={classNames?.navItemText}\r\n />\r\n )}\r\n </span>\r\n {!collapsed && (\r\n <span\r\n className={cn(\r\n \"transform transition-transform duration-200 motion-reduce:transition-none\",\r\n groupOpen ? \"rotate-180\" : \"rotate-0\"\r\n )}\r\n aria-hidden=\"true\"\r\n >\r\n {itemDropdownIcon}\r\n </span>\r\n )}\r\n </button>\r\n </ToolTip>\r\n {groupOpen && (\r\n <div\r\n id={groupId}\r\n role=\"group\"\r\n aria-label={item.name}\r\n className={cn(\r\n collapsed\r\n ? \"sidebar-sub-panel flex flex-col items-center max-w-full min-w-0 box-border\"\r\n : \"collapse-btn-wrapper\",\r\n classNames.subItem\r\n )}\r\n >\r\n {item.subItems.map((subItem, subIndex) => {\r\n if (subItem.component) {\r\n const SubItemComponent = subItem.component;\r\n return (\r\n <div\r\n key={`${index}-${subIndex}`}\r\n className={cn(\r\n \"min-w-0 max-w-full\",\r\n collapsed && \"flex flex-col items-center text-center\"\r\n )}\r\n data-sidebar-item={subItem.name}\r\n >\r\n <SubItemComponent />\r\n {collapsed && (\r\n <SidebarItemLabel\r\n name={subItem.name}\r\n collapsed\r\n className={classNames?.navItemText}\r\n />\r\n )}\r\n </div>\r\n );\r\n }\r\n\r\n return renderLink(subItem, `${index}-${subIndex}`);\r\n })}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n }\r\n\r\n if (item.component) {\r\n const ItemComponent = item.component;\r\n return <ItemComponent key={index} />;\r\n }\r\n\r\n return renderLink(item, String(index));\r\n })}\r\n </nav>\r\n {children != null && (\r\n <div\r\n className={cn(\r\n \"sidebar-chrome w-full shrink-0\",\r\n collapsed && \"flex flex-col items-center\"\r\n )}\r\n >\r\n {children}\r\n </div>\r\n )}\r\n\r\n <button\r\n type=\"button\"\r\n onClick={() => setCollapsed(!collapsed)}\r\n aria-expanded={!collapsed}\r\n aria-label={collapsed ? \"Expand sidebar\" : \"Collapse sidebar\"}\r\n className={cn(\r\n \"shrink-0 border-t border-gray-300\",\r\n classNames.collapseButton,\r\n collapsed && \"flex items-center justify-center\"\r\n )}\r\n >\r\n {collapsed ? expandButtonText : collapseButtonText}\r\n </button>\r\n\r\n {footer && (\r\n <div className={classNames?.footer ?? \"p-4 border-t border-gray-300\"}>\r\n {footer}\r\n </div>\r\n )}\r\n </div>\r\n );\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 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 { 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 { useRef, 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 ariaLabel = \"Row actions\",\r\n openOnHover = false,\r\n}: PopupCellRendererProps<TRow>) {\r\n const [visible, setVisible] = useState(false);\r\n const instanceRef = useRef<{ hide: () => void } | null>(null);\r\n\r\n const show = () => setVisible(true);\r\n const hide = () => {\r\n setVisible(false);\r\n instanceRef.current?.hide();\r\n };\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 const hoverOrClickProps: Partial<TippyProps> = openOnHover\r\n ? {\r\n trigger: \"mouseenter\",\r\n delay: [0, 150],\r\n hideOnClick: false,\r\n }\r\n : {\r\n visible,\r\n onClickOutside: hide,\r\n };\r\n\r\n return (\r\n <div className=\"flex h-full\">\r\n <Tippy\r\n content={content}\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 onCreate={(instance) => {\r\n instanceRef.current = instance;\r\n }}\r\n {...hoverOrClickProps}\r\n {...tippyProps}\r\n >\r\n <button\r\n type=\"button\"\r\n onClick={openOnHover ? undefined : 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={ariaLabel}\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","import type { CSSProperties } from \"react\";\r\nimport {\r\n FaArchive,\r\n FaCheckCircle,\r\n FaDownload,\r\n FaEdit,\r\n FaEye,\r\n FaFileAlt,\r\n FaHistory,\r\n FaTrashAlt,\r\n} from \"react-icons/fa\";\r\nimport type { RowActionPreset, RowActionPresetName } from \"./types\";\r\n\r\n/** Settings-app hover: peach bg `#FFF1EB` + orange text (`primary-50` / `primary-150`). */\r\nexport const ROW_ACTION_ITEM_HOVER_CLASS =\r\n \"hover:bg-primary-50 hover:text-primary-150\";\r\n\r\n/** Settings/Department rest color (`#6C757D`). */\r\nexport const ROW_ACTION_ITEM_TEXT_CLASS = \"text-secondary\";\r\n\r\nexport const ROW_ACTION_DEFAULT_ICON_SIZE = 16;\r\n\r\nexport const ROW_ACTION_DEFAULT_MENU_TOOLTIP_STYLE: CSSProperties = {\r\n zIndex: 10000,\r\n};\r\n\r\nexport const ROW_ACTION_PRESETS: Record<RowActionPresetName, RowActionPreset> = {\r\n edit: { label: \"Edit\", icon: FaEdit },\r\n delete: { label: \"Delete\", icon: FaTrashAlt, danger: true, iconClassName: \"text-red-500\" },\r\n view: { label: \"View\", icon: FaEye },\r\n notes: { label: \"Notes\", icon: FaFileAlt },\r\n history: { label: \"History\", icon: FaHistory },\r\n download: { label: \"Download\", icon: FaDownload },\r\n archive: { label: \"Archive\", icon: FaArchive },\r\n resolve: { label: \"Resolve\", icon: FaCheckCircle },\r\n};\r\n","import { ToolTip } from \"../tooltip/ToolTip\";\r\nimport { cn } from \"../../utils/cn\";\r\nimport {\r\n ROW_ACTION_DEFAULT_ICON_SIZE,\r\n ROW_ACTION_DEFAULT_MENU_TOOLTIP_STYLE,\r\n ROW_ACTION_ITEM_HOVER_CLASS,\r\n ROW_ACTION_ITEM_TEXT_CLASS,\r\n} from \"./presets\";\r\nimport type { ActionMenuItemProps } from \"./types\";\r\n\r\nexport function ActionMenuItem({\r\n label,\r\n icon: Icon,\r\n iconSize = ROW_ACTION_DEFAULT_ICON_SIZE,\r\n iconClassName,\r\n labelClassName,\r\n tooltip,\r\n tooltipPlacement = \"top\",\r\n tooltipDelayShow,\r\n tooltipDelayHide,\r\n tooltipClassName,\r\n tooltipStyle,\r\n disabled = false,\r\n danger = false,\r\n highlight = false,\r\n showLabel = true,\r\n className,\r\n onClick,\r\n}: ActionMenuItemProps) {\r\n const tooltipText = tooltip ?? label;\r\n\r\n return (\r\n <ToolTip\r\n text={tooltipText}\r\n disabled={!tooltipText}\r\n placement={tooltipPlacement}\r\n delayShow={tooltipDelayShow}\r\n delayHide={tooltipDelayHide}\r\n tooltipClassName={tooltipClassName}\r\n tooltipStyle={{ ...ROW_ACTION_DEFAULT_MENU_TOOLTIP_STYLE, ...tooltipStyle }}\r\n className={showLabel ? \"block w-full\" : \"inline-flex\"}\r\n >\r\n <button\r\n type=\"button\"\r\n disabled={disabled}\r\n aria-label={label}\r\n onClick={(event) => {\r\n event.stopPropagation();\r\n if (disabled) return;\r\n onClick();\r\n }}\r\n className={cn(\r\n \"flex items-center gap-2 text-sm transition-colors duration-150\",\r\n ROW_ACTION_ITEM_TEXT_CLASS,\r\n showLabel\r\n ? \"w-full rounded-xl px-3 py-2 text-left\"\r\n : \"justify-center rounded-md p-1\",\r\n disabled ? \"cursor-not-allowed opacity-50\" : ROW_ACTION_ITEM_HOVER_CLASS,\r\n highlight && !danger && \"text-primary-150\",\r\n className,\r\n )}\r\n >\r\n {Icon ? (\r\n <Icon\r\n className={cn(\"shrink-0\", iconClassName)}\r\n aria-hidden\r\n size={iconSize}\r\n />\r\n ) : null}\r\n {showLabel ? <span className={labelClassName}>{label}</span> : null}\r\n </button>\r\n </ToolTip>\r\n );\r\n}\r\n","import { ROW_ACTION_PRESETS } from \"./presets\";\r\nimport { cn } from \"../../utils/cn\";\r\nimport type {\r\n ResolvedRowAction,\r\n RowAction,\r\n RowActionFlag,\r\n RowActionPreset,\r\n RowActionPresetName,\r\n RowActionsList,\r\n} from \"./types\";\r\n\r\nfunction evalFlag<TRow>(\r\n flag: RowActionFlag<TRow> | undefined,\r\n data: TRow | undefined,\r\n): boolean {\r\n if (typeof flag === \"function\") return Boolean(flag(data));\r\n return Boolean(flag);\r\n}\r\n\r\nfunction mergePreset(\r\n name: RowActionPresetName | undefined,\r\n overrides?: Partial<Record<RowActionPresetName, Partial<RowActionPreset>>>,\r\n): RowActionPreset | undefined {\r\n if (!name) return undefined;\r\n const base = ROW_ACTION_PRESETS[name];\r\n const extra = overrides?.[name];\r\n if (!extra) return base;\r\n return { ...base, ...extra };\r\n}\r\n\r\nexport function resolveActions<TRow>(\r\n actions: RowActionsList<TRow>,\r\n data: TRow | undefined,\r\n hasPermission?: (permission: string) => boolean,\r\n presets?: Partial<Record<RowActionPresetName, Partial<RowActionPreset>>>,\r\n): ResolvedRowAction<TRow>[] {\r\n const list = typeof actions === \"function\" ? actions(data) : actions;\r\n\r\n return list.flatMap((action: RowAction<TRow>, index) => {\r\n const type = action.type ?? \"item\";\r\n const preset = mergePreset(action.preset, presets);\r\n const key = action.key ?? action.preset ?? `action-${index}`;\r\n const label = action.label ?? preset?.label ?? key;\r\n\r\n if (action.permission && hasPermission && !hasPermission(action.permission)) {\r\n return [];\r\n }\r\n\r\n if (evalFlag(action.hidden, data)) {\r\n return [];\r\n }\r\n\r\n const tooltip =\r\n action.tooltip === false\r\n ? undefined\r\n : (action.tooltip ?? (type === \"divider\" ? undefined : label));\r\n\r\n const resolved: ResolvedRowAction<TRow> = {\r\n key,\r\n type,\r\n label,\r\n icon: action.icon ?? preset?.icon,\r\n iconSize: action.iconSize,\r\n content: action.content,\r\n onClick: action.onClick,\r\n disabled: evalFlag(action.disabled, data),\r\n danger: action.danger ?? preset?.danger ?? false,\r\n highlight: evalFlag(action.highlight, data),\r\n tooltip,\r\n tooltipPlacement: action.tooltipPlacement,\r\n confirm: action.confirm,\r\n closeOnClick: action.closeOnClick !== false,\r\n className: action.className,\r\n iconClassName: cn(preset?.iconClassName, action.iconClassName) || undefined,\r\n labelClassName: action.labelClassName,\r\n };\r\n\r\n return [resolved];\r\n });\r\n}\r\n","import type { ReactNode } from \"react\";\r\nimport { ToolTip } from \"../tooltip/ToolTip\";\r\nimport { PopupCellRenderer } from \"../popup-cell-renderer/PopupCellRenderer\";\r\nimport { confirmationAlert } from \"../../utils/handleApiError\";\r\nimport { cn } from \"../../utils/cn\";\r\nimport { ActionMenuItem } from \"./ActionMenuItem\";\r\nimport {\r\n ROW_ACTION_DEFAULT_ICON_SIZE,\r\n ROW_ACTION_DEFAULT_MENU_TOOLTIP_STYLE,\r\n} from \"./presets\";\r\nimport { resolveActions } from \"./resolveActions\";\r\nimport type { ResolvedRowAction, RowActionsProps } from \"./types\";\r\n\r\nfunction runAction<TRow>(\r\n action: ResolvedRowAction<TRow>,\r\n data: TRow | undefined,\r\n hide?: () => void,\r\n confirmFn: RowActionsProps<TRow>[\"confirmFn\"] = confirmationAlert,\r\n) {\r\n if (!action.onClick) {\r\n if (action.closeOnClick) hide?.();\r\n return;\r\n }\r\n\r\n const execute = () => action.onClick?.(data);\r\n\r\n if (action.confirm) {\r\n confirmFn?.(execute, action.confirm);\r\n } else {\r\n execute();\r\n }\r\n\r\n if (action.closeOnClick) {\r\n hide?.();\r\n }\r\n}\r\n\r\nexport function RowActions<TRow = unknown>({\r\n actions,\r\n data,\r\n mode = \"menu\",\r\n actionIcon,\r\n className,\r\n menuClassName,\r\n itemClassName,\r\n itemIconClassName,\r\n itemLabelClassName,\r\n iconSize = ROW_ACTION_DEFAULT_ICON_SIZE,\r\n triggerTooltip = \"Actions\",\r\n triggerAriaLabel = \"Row actions\",\r\n hasPermission,\r\n placement = \"bottom-end\",\r\n openOnHover = false,\r\n tippyProps,\r\n presets,\r\n confirmFn = confirmationAlert,\r\n tooltipPlacement = \"top\",\r\n tooltipDelayShow,\r\n tooltipDelayHide,\r\n tooltipClassName,\r\n tooltipStyle,\r\n renderItem,\r\n renderMenu,\r\n renderTrigger,\r\n}: RowActionsProps<TRow>) {\r\n const resolved = resolveActions(actions, data, hasPermission, presets);\r\n\r\n if (resolved.length === 0) {\r\n return null;\r\n }\r\n\r\n const mergedTooltipStyle = {\r\n ...ROW_ACTION_DEFAULT_MENU_TOOLTIP_STYLE,\r\n ...tooltipStyle,\r\n };\r\n\r\n const renderDefaultItem = (\r\n action: ResolvedRowAction<TRow>,\r\n hide?: () => void,\r\n showLabel = true,\r\n ): ReactNode => {\r\n if (action.type === \"divider\") {\r\n return (\r\n <div\r\n key={action.key}\r\n role=\"separator\"\r\n className={cn(\"my-1 h-px bg-gray-100\", action.className)}\r\n />\r\n );\r\n }\r\n\r\n if (action.content) {\r\n return (\r\n <div key={action.key} className={action.className}>\r\n {action.content}\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <ActionMenuItem\r\n key={action.key}\r\n label={action.label}\r\n icon={action.icon}\r\n iconSize={action.iconSize ?? iconSize}\r\n iconClassName={cn(itemIconClassName, action.iconClassName)}\r\n labelClassName={cn(itemLabelClassName, action.labelClassName)}\r\n tooltip={action.tooltip}\r\n tooltipPlacement={action.tooltipPlacement ?? tooltipPlacement}\r\n tooltipDelayShow={tooltipDelayShow}\r\n tooltipDelayHide={tooltipDelayHide}\r\n tooltipClassName={tooltipClassName}\r\n tooltipStyle={mergedTooltipStyle}\r\n disabled={action.disabled}\r\n danger={action.danger}\r\n highlight={action.highlight}\r\n showLabel={showLabel}\r\n className={cn(itemClassName, action.className)}\r\n onClick={() => runAction(action, data, hide, confirmFn)}\r\n />\r\n );\r\n };\r\n\r\n const renderItems = (hide?: () => void, showLabel = true): ReactNode =>\r\n resolved.map((action) => {\r\n const defaultItem = renderDefaultItem(action, hide, showLabel);\r\n if (!renderItem) return defaultItem;\r\n return (\r\n <div key={action.key}>\r\n {renderItem(action, { data, hide: hide ?? (() => undefined), defaultItem })}\r\n </div>\r\n );\r\n });\r\n\r\n if (mode === \"inline\") {\r\n const inlineItems = renderItems(undefined, false);\r\n return (\r\n <div className={cn(\"flex h-full items-center justify-center gap-1\", className)}>\r\n {inlineItems}\r\n </div>\r\n );\r\n }\r\n\r\n const triggerTooltipText =\r\n triggerTooltip === false ? undefined : triggerTooltip;\r\n\r\n const buildMenu = (hide: () => void): ReactNode => {\r\n const defaultMenu = (\r\n <div\r\n className={cn(\r\n \"flex min-w-[180px] flex-col rounded-lg border border-gray-100 bg-white p-2 shadow-lg\",\r\n menuClassName,\r\n )}\r\n >\r\n {renderItems(hide, true)}\r\n </div>\r\n );\r\n\r\n if (!renderMenu) return defaultMenu;\r\n return renderMenu({\r\n data,\r\n actions: resolved,\r\n hide,\r\n defaultMenu,\r\n });\r\n };\r\n\r\n if (renderTrigger) {\r\n return (\r\n <>\r\n {renderTrigger({\r\n data,\r\n actions: resolved,\r\n hide: () => undefined,\r\n defaultMenu: buildMenu(() => undefined),\r\n })}\r\n </>\r\n );\r\n }\r\n\r\n return (\r\n <ToolTip\r\n text={triggerTooltipText}\r\n disabled={!triggerTooltipText}\r\n placement={tooltipPlacement}\r\n delayShow={tooltipDelayShow}\r\n delayHide={tooltipDelayHide}\r\n tooltipClassName={tooltipClassName}\r\n tooltipStyle={tooltipStyle}\r\n className=\"flex h-full items-center justify-center\"\r\n >\r\n <PopupCellRenderer\r\n params={{ data }}\r\n actionIcon={actionIcon}\r\n hideTitle\r\n className={className}\r\n placement={placement}\r\n openOnHover={openOnHover}\r\n tippyProps={tippyProps}\r\n ariaLabel={triggerAriaLabel}\r\n dropDownContent={(handleAction) =>\r\n buildMenu(() => handleAction(\"close\"))\r\n }\r\n />\r\n </ToolTip>\r\n );\r\n}\r\n","import React, { useMemo } from \"react\";\r\nimport { FaArrowsRotate, FaTriangleExclamation } from \"react-icons/fa6\";\r\nimport { cn } from \"../../utils/cn\";\r\nimport { classifyError } from \"../../utils/handleApiError\";\r\nimport { Loader } from \"../Loader\";\r\nimport type { TableErrorBoundaryProps } from \"./types\";\r\n\r\nexport const TableErrorBoundary: React.FC<TableErrorBoundaryProps> = ({\r\n isError,\r\n isLoading = false,\r\n refetch,\r\n children,\r\n error,\r\n errorMessage,\r\n className,\r\n minHeight = \"280px\",\r\n}) => {\r\n const message = useMemo(() => {\r\n if (errorMessage) return errorMessage;\r\n if (error) return classifyError(error).userMessage;\r\n return \"Unable to load table data. Please try again.\";\r\n }, [error, errorMessage]);\r\n\r\n if (isLoading && !isError) {\r\n return (\r\n <div\r\n className={cn(\r\n \"flex w-full items-center justify-center rounded-xl bg-neutral-50\",\r\n className\r\n )}\r\n style={{ minHeight }}\r\n role=\"status\"\r\n aria-live=\"polite\"\r\n aria-busy=\"true\"\r\n >\r\n <Loader size=\"40px\" />\r\n </div>\r\n );\r\n }\r\n\r\n if (isError) {\r\n return (\r\n <div\r\n className={cn(\r\n \"flex w-full flex-col items-center justify-center gap-4 rounded-xl border border-red-100 bg-red-50 px-6 py-10 text-center\",\r\n className\r\n )}\r\n style={{ minHeight }}\r\n role=\"alert\"\r\n aria-live=\"assertive\"\r\n >\r\n <FaTriangleExclamation\r\n className=\"text-red-500\"\r\n size={32}\r\n aria-hidden\r\n />\r\n <div className=\"max-w-md space-y-1\">\r\n <p className=\"text-base font-semibold text-gray-800\">\r\n Failed to load data\r\n </p>\r\n <p className=\"text-sm text-gray-600\">{message}</p>\r\n </div>\r\n {refetch && (\r\n <button\r\n type=\"button\"\r\n onClick={() => refetch()}\r\n disabled={isLoading}\r\n className=\"inline-flex items-center gap-2 rounded-lg bg-primary-150 px-4 py-2 text-sm font-medium text-white transition-colors hover:opacity-90 disabled:cursor-not-allowed disabled:opacity-60\"\r\n >\r\n <FaArrowsRotate className={cn(isLoading && \"animate-spin\")} />\r\n {isLoading ? \"Retrying...\" : \"Try again\"}\r\n </button>\r\n )}\r\n </div>\r\n );\r\n }\r\n\r\n return <>{children}</>;\r\n};\r\n"],"mappings":"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","names":["jsx","jsxs","useEffect","useRef","useSearchParams","jsx","useSearchParams","useRef","useEffect","useSearchParams","jsx","jsxs","useSearchParams","useEffect","useRef","useState","useSearchParams","jsx","jsxs","useSearchParams","useState","useRef","useEffect","useEffect","useRef","jsx","jsx","jsxs","useRef","useEffect","jsx","BASE_STYLES","VARIANTS","jsx","jsxs","jsx","jsxs","jsx","jsxs","useEffect","useRef","useState","Link","useLocation","useId","Fragment","jsx","jsxs","jsx","jsxs","useLocation","useState","useRef","useEffect","Link","Fragment","jsx","jsxs","_","jsx","forwardRef","useEffect","useRef","useState","jsx","jsxs","forwardRef","useState","useRef","useEffect","useRef","useState","jsx","jsxs","useState","useRef","jsx","jsxs","Fragment","jsx","useMemo","Fragment","jsx","jsxs","useMemo"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
isRetryableError
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-QOYMQFOB.mjs";
|
|
4
4
|
|
|
5
5
|
// src/utils/permissions.ts
|
|
6
6
|
function transformPermissions(permissions) {
|
|
@@ -57,4 +57,4 @@ export {
|
|
|
57
57
|
transformPermissions,
|
|
58
58
|
createBaseQueryWithRetry
|
|
59
59
|
};
|
|
60
|
-
//# sourceMappingURL=chunk-
|
|
60
|
+
//# sourceMappingURL=chunk-LS7AI4ER.mjs.map
|