pam-grid 1.0.8 → 1.0.9

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/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/components/PamGrid.tsx","../src/components/AdvanceFilter.tsx","../src/core/utils.ts","../src/components/FacetFilter.tsx","../src/components/PamHeaderOption.tsx","../src/components/FilterApplied.tsx","../src/components/icons/Minimize.tsx","../src/components/icons/Compress.tsx","../src/components/EmptyState.tsx","../src/components/icons/ArrowFromBottonToRight.tsx","../src/core/Tooltip.ts","../src/components/BulkAction.tsx","../src/components/Paginantion.tsx","../src/components/dropdown/PamDropdown.tsx","../src/components/MainFilter.tsx","../src/components/FallBack.tsx","../src/components/icons/ColumnIcon.tsx","../src/components/ColumnVisibilityPanel.tsx","../src/core/useGridCore.ts"],"sourcesContent":["// css\r\nimport \"./styles/pam.core.css\";\r\nimport \"./styles/pam.grid.css\";\r\n\r\n// Components\r\nexport { default as PamGrid } from \"./components/PamGrid\";\r\nexport { default as ColumnVisibilityPanel } from \"./components/ColumnVisibilityPanel\";\r\nexport { default as PamHeaderOption } from \"./components/PamHeaderOption\";\r\nexport { default as FilterApplied } from \"./components/FilterApplied\";\r\nexport { default as PamDropDown } from \"./components/dropdown/PamDropdown\";\r\n\r\n// Hook\r\nexport { useGridCore } from \"./core/useGridCore\";\r\n\r\n// Types\r\nexport type {\r\n GridColumn,\r\n GridRowId,\r\n PinnedPosition,\r\n AdvancedFilter,\r\n AdvancedFilterType,\r\n TableAction,\r\n GridFetaures,\r\n} from \"./types/grid.types\";\r\n\r\nexport type {\r\n PamDropdownItem,\r\n PamDropdownPlacement,\r\n} from \"./types/PamDropdown.types\";\r\n\r\nexport type { PamGridProps } from \"./types/grid.props\";\r\n\r\n// Helpers (optional but recommended)\r\nexport {\r\n getAdvancedFilterType,\r\n getLeftOffset,\r\n getRightOffset,\r\n} from \"./core/utils\";\r\n","import React, { useEffect, useRef, useState } from \"react\";\r\nimport PamHeaderOption from \"./PamHeaderOption\";\r\nimport FilterApplied from \"./FilterApplied\";\r\nimport { PamGridProps } from \"../types/grid.props\";\r\nimport {\r\n ActiveCell,\r\n GridColumn,\r\n GridRowId,\r\n GroupKey,\r\n} from \"../types/grid.types\";\r\nimport {\r\n getLeftOffset,\r\n getNestedValue,\r\n getRightOffset,\r\n useLocalStorageState,\r\n} from \"../core/utils\";\r\nimport Minimize from \"./icons/Minimize\";\r\nimport Compress from \"./icons/Compress\";\r\nimport \"../styles/pam.core.css\";\r\nimport \"../styles/pam.grid.css\";\r\nimport EmptyState from \"./EmptyState\";\r\nimport BoxIcon from \"../assets/icons/Box.svg\";\r\nimport NoRecord from \"../assets/icons/NoSearchResult.svg\";\r\nimport BulkAction from \"./BulkAction\";\r\nimport { hideTooltip, showTooltip } from \"../core/Tooltip\";\r\nimport Pagination from \"./Paginantion\";\r\nimport MainFilter, { TableAction } from \"./MainFilter\";\r\nimport { safeGridHandle } from \"./FallBack\";\r\n\r\n/*\r\n Props:\r\n - columns: [{ key, title, width, pinned: 'left'|'right'|null, sortable, render, aggregate }]\r\n - data OR serverMode + fetcher\r\n - rowKey\r\n - features: { selection, search, export, pagination, pinning, resizing, reorder, grouping, aggregation, expand }\r\n - renderExpanded\r\n*/\r\nconst PamGrid = <T extends Record<string, unknown>>({\r\n columns = [],\r\n grid,\r\n loading = false,\r\n features = {},\r\n rowKey = \"id\",\r\n isDropdown = false,\r\n maxHeight = \"80vh\",\r\n isFetching = false,\r\n addNew,\r\n renderExpanded,\r\n}: PamGridProps<T>) => {\r\n const [isFullScreen, setFullScreen] = useState<boolean>(false);\r\n const [draggingCol, setDraggingCol] = useState<string | null>(null);\r\n const [activeCell, setActiveCell] = useState<ActiveCell<T> | null>(null);\r\n const [isBulkAction, setBulkAction] = useLocalStorageState<boolean>(\r\n \"bulk-data-toggle\",\r\n false,\r\n );\r\n\r\n const wrapperRef = useRef<HTMLDivElement | null>(null);\r\n\r\n const dragState = useRef<{ from: GridRowId | null }>({ from: null });\r\n\r\n const {\r\n rows,\r\n page,\r\n totalPages,\r\n pageSize,\r\n setPage,\r\n setPageSize,\r\n setGroupBy,\r\n groupBy,\r\n search,\r\n setSearch,\r\n selected,\r\n toggleSelect,\r\n selectAllOnPage,\r\n deselectAllOnPage,\r\n changeSort,\r\n sortBy,\r\n visibleColumns,\r\n colState,\r\n updateColumn,\r\n totalRows,\r\n expanded,\r\n toggleExpand,\r\n setColState,\r\n emptyState,\r\n addNewRecord,\r\n advanceFilters,\r\n setColumnAdvanceFilter,\r\n } = grid ?? safeGridHandle;\r\n\r\n // resizing via mouse down on handle\r\n const onResizeMouseDown = (\r\n e: React.MouseEvent,\r\n key: GridColumn<T>[\"key\"],\r\n ) => {\r\n e.preventDefault();\r\n const startX = e.clientX;\r\n const col = colState.find((c: GridColumn<T>) => c.key === key);\r\n if (!col) return;\r\n const startWidth = col.width || 120;\r\n\r\n const onMove = (ev: MouseEvent) => {\r\n const diff = ev.clientX - startX;\r\n const newWidth = Math.max(60, startWidth + diff);\r\n updateColumn(key, { width: newWidth });\r\n };\r\n\r\n const onUp = () => {\r\n document.removeEventListener(\"mousemove\", onMove);\r\n document.removeEventListener(\"mouseup\", onUp);\r\n };\r\n document.addEventListener(\"mousemove\", onMove);\r\n document.addEventListener(\"mouseup\", onUp);\r\n };\r\n\r\n const onDragStart = (e: React.DragEvent, key: GridRowId) => {\r\n dragState.current.from = key;\r\n e.dataTransfer.effectAllowed = \"move\";\r\n };\r\n const onDrop = (e: React.DragEvent, toKey: GridColumn<T>[\"key\"]) => {\r\n e.preventDefault();\r\n const fromKey = dragState.current.from;\r\n if (!fromKey || fromKey === toKey) return;\r\n const from = colState.find((c) => c.key === fromKey);\r\n const to = colState.find((c) => c.key === toKey);\r\n if (!from || !to) return;\r\n // swap orders\r\n setColState((prev) => {\r\n const next = prev.map((p) => ({ ...p }));\r\n const f = next.find((p) => p.key === fromKey);\r\n const t = next.find((p) => p.key === toKey);\r\n if (!f || !t) return prev;\r\n const tmp = f.order;\r\n f.order = t.order;\r\n t.order = tmp;\r\n return next.sort((a, b) => a.order - b.order);\r\n });\r\n };\r\n\r\n // group & aggregate (simple client-side grouping by column key)\r\n // const groupBy = features.groupByKey || null;\r\n const groupedRows = React.useMemo(() => {\r\n if (!groupBy) return null;\r\n\r\n const column = visibleColumns.find((col) => col.key === groupBy.key);\r\n\r\n const map: Record<string, { rawValue: GroupKey; items: T[] }> = {};\r\n\r\n rows.forEach((r: T) => {\r\n // 1) Get raw group value\r\n const rawValue: GroupKey = column?.groupByValue\r\n ? column.groupByValue(r)\r\n : column?.nestedPath\r\n ? getNestedValue(r, column.nestedPath)\r\n : (r[groupBy.key as keyof T] as any);\r\n\r\n // 2) Convert rawValue into string key\r\n const groupKey =\r\n rawValue === null || rawValue === undefined\r\n ? \"unknown\"\r\n : typeof rawValue === \"object\"\r\n ? String((rawValue as any)?.id ?? JSON.stringify(rawValue))\r\n : String(rawValue);\r\n\r\n // 3) init group\r\n if (!map[groupKey]) {\r\n map[groupKey] = { rawValue, items: [] };\r\n }\r\n\r\n // 4) push row\r\n map[groupKey].items.push(r);\r\n });\r\n\r\n // 5) build final grouped result\r\n return Object.entries(map).map(([key, group]) => {\r\n const aggregates: Partial<Record<GridColumn<T>[\"key\"], string>> = {};\r\n\r\n visibleColumns.forEach((col: GridColumn<T>) => {\r\n if (col.aggregate) {\r\n aggregates[col.key] = col.aggregate(\r\n group.items.map((it) => it[col.key as keyof T] as number),\r\n );\r\n }\r\n });\r\n\r\n const displayLabel = column?.groupLabel\r\n ? column.groupLabel(group.rawValue, group.items)\r\n : String(key);\r\n\r\n return {\r\n key,\r\n rawValue: group.rawValue,\r\n displayLabel,\r\n items: group.items,\r\n aggregates,\r\n };\r\n });\r\n }, [rows, groupBy, visibleColumns]);\r\n\r\n const currentRows = rows;\r\n\r\n const gridHeight = isFullScreen\r\n ? \"calc(100vh - 120px)\"\r\n : \"calc(100vh - 220px)\";\r\n\r\n useEffect(() => {\r\n document.body.style.overflow = isFullScreen ? \"hidden\" : \"\";\r\n }, [isFullScreen]);\r\n\r\n return (\r\n <div\r\n className={`pms-grid ${\r\n isFullScreen ? \"card card-action card-fullscreen p-4\" : \"\"\r\n }`}\r\n >\r\n <div className=\"row align-items-center g-2\">\r\n {/* LEFT SECTION */}\r\n <div className=\"col-12 col-md-8 col-lg-9\">\r\n <div className=\"row\">\r\n {features.search && (\r\n <div className=\"col-8 col-md-4\">\r\n <input\r\n type=\"search\"\r\n className=\"form-control form-control-sm\"\r\n placeholder=\"Search...\"\r\n value={search}\r\n onChange={(e) => setSearch(e.target.value)}\r\n />\r\n </div>\r\n )}\r\n\r\n <div className=\"col-4 col-md-4\">\r\n <MainFilter gridFetaures={features} grid={grid} />\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {/* RIGHT SECTION */}\r\n <div className=\"col-12 col-md-4 col-lg-3\">\r\n <div className=\"d-flex justify-content-md-end justify-content-between align-items-center gap-2 mt-2 mt-md-0\">\r\n {addNewRecord && (\r\n <button\r\n type=\"button\"\r\n className={`${\r\n addNewRecord?.class || \"btn btn-sm btn-label-secondary\"\r\n } d-flex align-items-center gap-1`}\r\n onClick={addNewRecord.onClick}\r\n onMouseEnter={(e) =>\r\n showTooltip(addNewRecord?.label, e.clientX, e.clientY)\r\n }\r\n onMouseMove={(e) =>\r\n showTooltip(addNewRecord?.label, e.clientX, e.clientY)\r\n }\r\n onMouseLeave={hideTooltip}\r\n >\r\n <span\r\n className={`icon-base ${\r\n addNewRecord?.icon || \"bx bx-plus-circle\"\r\n }`}\r\n ></span>\r\n\r\n {addNewRecord?.name && (\r\n <span className=\"d-none d-sm-inline\">\r\n {addNewRecord?.name}\r\n </span>\r\n )}\r\n </button>\r\n )}\r\n\r\n <div className=\"flex-shrink-0\">\r\n {isFullScreen ? (\r\n <Minimize onClick={() => setFullScreen(!isFullScreen)} />\r\n ) : (\r\n <Compress onClick={() => setFullScreen(!isFullScreen)} />\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div className=\"d-flex flex-row gap-1\">\r\n {selected.size > 0 && features.bulkActionsConfig && (\r\n <BulkAction records={selected} actions={features.bulkActionsConfig} />\r\n )}\r\n <FilterApplied\r\n groupBy={groupBy}\r\n removeGroupby={() => setGroupBy(null)}\r\n advance={advanceFilters}\r\n removeFilter={(columnKey) =>\r\n setColumnAdvanceFilter(String(columnKey), null)\r\n }\r\n grid={grid}\r\n />\r\n </div>\r\n {/* Table-Start*/}\r\n <div\r\n ref={wrapperRef}\r\n className=\"grid-wrapper text-nowrap border\"\r\n style={{\r\n height: gridHeight,\r\n }}\r\n >\r\n <table\r\n className=\"table table-sm rounded mb-0 position-relative\"\r\n style={{ width: \"max-content\", minWidth: \"100%\" }}\r\n >\r\n <thead\r\n className=\"bg-light-secondary border p-2 bg-light rounded\"\r\n style={{ position: \"sticky\", top: 0, zIndex: 10 }}\r\n >\r\n <tr className=\"p-2\">\r\n {features.IsNumbering && <th className=\"text-center\">#</th>}\r\n {features.expand && (\r\n <th className=\"text-center ticky-action-column\">\r\n <i className=\"bx bx-collapse-vertical d-none\"></i>\r\n </th>\r\n )}\r\n {isBulkAction && (\r\n <th\r\n style={{ width: 32, position: \"sticky\", top: 0, zIndex: 10 }}\r\n className=\"text-center ticky-action-column\"\r\n >\r\n <input\r\n type=\"checkbox\"\r\n className=\"form-check-input mx-3\"\r\n checked={\r\n currentRows.length > 0 &&\r\n currentRows.every((r) => selected.has(String(r[rowKey])))\r\n }\r\n onChange={(e) =>\r\n e.target.checked\r\n ? selectAllOnPage(currentRows)\r\n : deselectAllOnPage(currentRows)\r\n }\r\n disabled={isFetching}\r\n />\r\n </th>\r\n )}\r\n\r\n {visibleColumns.map((col) => {\r\n const style: React.CSSProperties = {\r\n minWidth: col.width || 120,\r\n width: col.width,\r\n ...(col.pinned && { position: \"sticky\" }),\r\n ...(col.pinned === \"left\" && {\r\n left: `${getLeftOffset(colState, col.key)}px`,\r\n }),\r\n ...(col.pinned === \"right\" && {\r\n right: `${getRightOffset(colState, col.key)}px`,\r\n }),\r\n };\r\n\r\n return (\r\n <th\r\n key={String(col.key)}\r\n draggable={features.reorder}\r\n onDragStart={(e) => {\r\n setDraggingCol(String(col.key));\r\n onDragStart(e, String(col.key));\r\n }}\r\n onDragEnd={() => setDraggingCol(null)}\r\n onDragOver={(e) => e.preventDefault()}\r\n onDrop={(e) => onDrop(e, col.key)}\r\n className={`pms-col-header vs-th\r\n ${features.reorder ? \"cursor-grab\" : \"\"}\r\n ${draggingCol === col.key ? \"cursor-grabbing\" : \"\"}\r\n ${col.pinned ? `pinned pinned-${col.pinned}` : \"\"}\r\n `}\r\n style={style}\r\n >\r\n <div\r\n className={`d-flex align-items-center justify-content-${col.align ?? \"between\"} px-1 rounded ${\r\n col.pinned ? \"z-6\" : \"\"\r\n }`}\r\n >\r\n <div\r\n onClick={() =>\r\n col.sortable && changeSort(String(col.key))\r\n }\r\n className={col.sortable ? \"cursor-pointer\" : \"\"}\r\n >\r\n <small>{col.title}</small>\r\n\r\n {sortBy.key === col.key && (\r\n <i\r\n className={`bx bx-sm ${\r\n sortBy.dir === \"asc\"\r\n ? \"bxs-chevron-up\"\r\n : \"bxs-chevron-down\"\r\n } cursor-pointer`}\r\n ></i>\r\n )}\r\n\r\n {col.pinned === col.key && (\r\n <i className=\"bx bx-x cursor-pointer\"></i>\r\n )}\r\n </div>\r\n\r\n <i\r\n className=\"bx bx-move-horizontal text-white cursor-resize\"\r\n onMouseDown={(e) => onResizeMouseDown(e, col.key)}\r\n ></i>\r\n\r\n <div className=\"d-flex align-items-center gap-1\">\r\n {features.pinning && (\r\n <PamHeaderOption\r\n currentColumn={col}\r\n gridFetaures={features}\r\n grid={grid}\r\n />\r\n )}\r\n </div>\r\n </div>\r\n </th>\r\n );\r\n })}\r\n\r\n {features.actions && (\r\n <th\r\n className=\"text-center sticky-action-column vs-th bg-white fw-semibold th-lastChild\"\r\n style={{ position: \"sticky\", right: 0, zIndex: 10 }}\r\n >\r\n Action\r\n </th>\r\n )}\r\n </tr>\r\n </thead>\r\n\r\n <tbody>\r\n {loading || rows.length === 0\r\n ? Array.from({ length: 1 }).map((_, index) => (\r\n <tr className=\"\" key={`row-${index}`}>\r\n <td\r\n key={index}\r\n colSpan={\r\n visibleColumns.length +\r\n (features.IsNumbering ? 1 : 0) +\r\n (features.selection ? 1 : 0) +\r\n (features.actions ? 1 : 0)\r\n }\r\n className=\"text-center py-4 \"\r\n >\r\n <div className=\" d-flex justify-content-center align-items-center vh-50\">\r\n <div>\r\n {loading ? (\r\n <p>Loading...</p>\r\n ) : !loading && search ? (\r\n <EmptyState\r\n title={emptyState.title}\r\n description={`No results found for \"${search}\"`}\r\n imgSrc={NoRecord}\r\n />\r\n ) : (\r\n <EmptyState\r\n title={emptyState.title}\r\n imgSrc={BoxIcon}\r\n description={emptyState.description}\r\n />\r\n )}\r\n </div>\r\n </div>\r\n </td>\r\n </tr>\r\n ))\r\n : !loading && groupBy && groupedRows && groupedRows.length > 0\r\n ? groupedRows.map((g, indG) => (\r\n <React.Fragment key={g.key}>\r\n <tr className=\"pam-bg-light-primary\">\r\n <td\r\n colSpan={\r\n visibleColumns.length +\r\n (features.selection ? 1 : 0) +\r\n (features.actions ? columns.length : 0)\r\n }\r\n className=\"text-start pinned pinned-left tr-group\"\r\n >\r\n <strong>{g.displayLabel}</strong>\r\n {features.aggregation &&\r\n Object.keys(g.aggregates).length > 0 && (\r\n <small className=\"ms-3 text-muted \">\r\n {Object.entries(g.aggregates)\r\n .map(([k, v]) => `${k}: ${v}`)\r\n .join(\" | \")}\r\n </small>\r\n )}\r\n </td>\r\n </tr>\r\n {g.items.map((row, indG) => renderRow(row, indG))}\r\n </React.Fragment>\r\n ))\r\n : currentRows.map((row, ind) => renderRow(row, ind))}\r\n </tbody>\r\n {isFetching && (\r\n <div className=\"pam-overlay show d-flex justify-content-center align-items-center\">\r\n <div className=\"p-3 bg-light rounded\">\r\n <div className=\"spinner-border spinner-border-sm text-white\" />\r\n <span className=\"ms-2 te text-white fw-2 text-light fw-bolder\">\r\n Loading....\r\n </span>\r\n </div>\r\n </div>\r\n )}\r\n </table>\r\n </div>\r\n {/* Table-End */}\r\n {features.pagination && (\r\n <div className=\"d-flex justify-content-between align-items-center mt-2\">\r\n <div className=\"d-flex flex-row align-items-center gap-2\">\r\n {features.pageSizeSelector && (\r\n <select\r\n className=\"form-select form-select-sm\"\r\n style={{ width: \"80px\" }}\r\n value={pageSize}\r\n onChange={(e) => setPageSize(Number(e.target.value))}\r\n >\r\n {[20, 50, 100].map((n) => (\r\n <option key={n} value={n}>\r\n {n}\r\n </option>\r\n ))}\r\n </select>\r\n )}{\" \"}\r\n <small>{rows.length} Record</small>\r\n </div>\r\n <div>\r\n <Pagination\r\n currentPage={page}\r\n totalPages={totalRows}\r\n onPageChange={setPage}\r\n />\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n\r\n // render a single row (function hoisted so it can reference visibleColumns)\r\n function renderRow(row: T, ind: number) {\r\n const isSelected = selected.has(String(row[rowKey]));\r\n const isExpanded = expanded.has(String(row[rowKey]));\r\n\r\n return (\r\n <React.Fragment key={String(row[rowKey])}>\r\n <tr>\r\n {features.IsNumbering && (\r\n <td className=\"text-center align-middle p-2\">\r\n <small className=\"text-secondry\">{ind + 1}</small>\r\n </td>\r\n )}\r\n {/* Expand toggle next to selection */}\r\n {features.expand && (\r\n <td className=\"text-center align-middle \">\r\n <button\r\n type=\"button\"\r\n className=\"btn btn-link p-0 border-none text-secondary\"\r\n onClick={() => toggleExpand(String(row[rowKey]))}\r\n >\r\n <i\r\n className={`bx ${\r\n isExpanded ? \"bxs-chevron-up\" : \"bxs-chevron-down\"\r\n } bx-sm`}\r\n ></i>\r\n </button>\r\n </td>\r\n )}\r\n {/* Selection checkbox (always left) */}\r\n {isBulkAction && (\r\n <td className=\"text-center align-middle p-2\">\r\n <input\r\n type=\"checkbox\"\r\n className=\"form-check-input\"\r\n checked={isSelected}\r\n onChange={() => toggleSelect(String(row[rowKey]))}\r\n />\r\n </td>\r\n )}\r\n {/* Data columns */}\r\n {visibleColumns.map((col) => {\r\n const style: React.CSSProperties = {\r\n minWidth: col.minWidth || 120, // minimum width\r\n maxWidth: col.maxWidth || 200, // maximum width (optional)\r\n width: col.width || \"auto\", // preferred width\r\n overflow: \"hidden\", // hide overflow\r\n textOverflow: \"ellipsis\",\r\n };\r\n\r\n if (col.pinned) style.position = \"sticky\";\r\n if (col.pinned === \"left\")\r\n style.left = `${getLeftOffset(colState, col.key)}px`;\r\n if (col.pinned === \"right\")\r\n style.right = `${getRightOffset(colState, col.key)}px`;\r\n\r\n const isActive =\r\n activeCell?.row[rowKey] === row[rowKey] &&\r\n activeCell?.column.key === col.key;\r\n\r\n return (\r\n <td\r\n key={String(col.key)}\r\n style={style}\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n setActiveCell({\r\n row,\r\n column: col,\r\n });\r\n col.onCellClick && col.onCellClick(row, col);\r\n }}\r\n className={`${col.className ?? \"\"} ${\r\n col.pinned\r\n ? \"pinned-left px-3 bg-white pms-grid td pinned\"\r\n : \"px-3\"\r\n } ${isActive ? \"grid-cell-active\" : \"\"} cursor-pointer`}\r\n >\r\n {col.render ? col.render(row) : (String(row[col.key]) ?? \"\")}\r\n </td>\r\n );\r\n })}\r\n\r\n {/* Actions column (always right) */}\r\n {features.actions && (\r\n <td\r\n className=\"text-center sticky-action-column bg-white td-lastChild\"\r\n style={{\r\n position: \"sticky\",\r\n right: 0,\r\n zIndex: 2,\r\n width: \"1%\",\r\n whiteSpace: \"nowrap\",\r\n }}\r\n >\r\n {isDropdown ? (\r\n <div className=\"text-center \">\r\n <TableAction gridFetaures={features} row={row} />\r\n </div>\r\n ) : (\r\n <div\r\n className=\"d-inline-flex justify-content-center align-items-center gap-2\"\r\n style={{ minWidth: \"fit-content\", padding: \"0 4px\" }}\r\n >\r\n {Array.isArray(features.actions)\r\n ? features.actions\r\n .filter((act) => {\r\n if (typeof act.isVisible === \"function\") {\r\n return act.isVisible(row);\r\n }\r\n if (typeof act.isVisible === \"boolean\") {\r\n return act.isVisible;\r\n }\r\n return true;\r\n })\r\n .map((act, i) => (\r\n <i\r\n key={i}\r\n title={act.label}\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n act.onClick && act.onClick(row);\r\n }}\r\n className={`${act.icon}`}\r\n onMouseEnter={(e) =>\r\n showTooltip(act.label, e.clientX, e.clientY)\r\n }\r\n onMouseMove={(e) =>\r\n showTooltip(act.label, e.clientX, e.clientY)\r\n }\r\n onMouseLeave={hideTooltip}\r\n />\r\n ))\r\n : typeof features.actions === \"function\"\r\n ? features.actions(row, toggleExpand)\r\n : null}\r\n </div>\r\n )}\r\n </td>\r\n )}\r\n </tr>\r\n\r\n {/* 5. Expanded row content (full width) */}\r\n {isExpanded && renderExpanded && (\r\n <tr className=\"expanded-row\">\r\n <td\r\n colSpan={\r\n visibleColumns.length +\r\n (features.selection ? 1 : 0) +\r\n (features.expand ? 1 : 0) +\r\n (features.actions ? 1 : 0)\r\n }\r\n >\r\n {renderExpanded(row)}\r\n </td>\r\n </tr>\r\n )}\r\n </React.Fragment>\r\n );\r\n }\r\n};\r\n\r\nexport default PamGrid;\r\n","import { useState, useEffect } from \"react\";\r\nimport { AdvancedFilterInput, AdvancedFilterProps } from \"../types/grid.props\";\r\n\r\nconst OPERATORS = {\r\n number: [\r\n { key: \"eq\", label: \"Equals\" },\r\n { key: \"neq\", label: \"Not Equal\" },\r\n { key: \"gt\", label: \"Greater Than\" },\r\n { key: \"gte\", label: \"Greater or Equal\" },\r\n { key: \"lt\", label: \"Less Than\" },\r\n { key: \"lte\", label: \"Less or Equal\" },\r\n { key: \"between\", label: \"Between\" },\r\n ],\r\n text: [\r\n { key: \"contains\", label: \"Contains\" },\r\n { key: \"starts\", label: \"Starts With\" },\r\n { key: \"ends\", label: \"Ends With\" },\r\n { key: \"eq\", label: \"Equals\" },\r\n ],\r\n date: [\r\n { key: \"before\", label: \"Before\" },\r\n { key: \"after\", label: \"After\" },\r\n { key: \"between\", label: \"Between\" },\r\n ],\r\n};\r\n\r\nexport function AdvanceFilter({\r\n type = \"number\",\r\n value,\r\n onApply,\r\n onClear,\r\n}: AdvancedFilterProps) {\r\n const [operation, setOperation] = useState<string | undefined>(\"\");\r\n const [v1, setV1] = useState<string>(\"\");\r\n const [v2, setV2] = useState<string>(\"\");\r\n\r\n useEffect(() => {\r\n if (!value) {\r\n setOperation(\"\");\r\n setV1(\"\");\r\n setV2(\"\");\r\n return;\r\n }\r\n\r\n setOperation(value.operation);\r\n setV1(value.value ?? value.from ?? \"\");\r\n setV2(value.to ?? \"\");\r\n }, [value]);\r\n\r\n const apply = () => {\r\n if (!operation) return;\r\n\r\n onApply(\r\n operation === \"between\"\r\n ? { operation, from: v1, to: v2 }\r\n : { operation, value: v1 }\r\n );\r\n };\r\n\r\n if (!type) return null;\r\n\r\n return (\r\n <div style={{ width: 240 }} onClick={(e) => e.stopPropagation()}>\r\n <div className=\"mb-2\">\r\n <label className=\"form-label\">Condition</label>\r\n <select\r\n className=\"form-select form-select-sm\"\r\n value={operation}\r\n onChange={(e) => setOperation(e.target.value)}\r\n >\r\n <option value=\"\">Select</option>\r\n {OPERATORS[type].map((o) => (\r\n <option key={o.key} value={o.key}>\r\n {o.label}\r\n </option>\r\n ))}\r\n </select>\r\n </div>\r\n\r\n {operation && (\r\n <div className=\"mb-2\">\r\n <label className=\"form-label\">Value</label>\r\n\r\n {operation !== \"between\" ? (\r\n <input\r\n type={type}\r\n className=\"form-control form-control-sm\"\r\n value={v1}\r\n onChange={(e) => setV1(e.target.value)}\r\n />\r\n ) : (\r\n <div className=\"d-flex gap-2\">\r\n <input\r\n type={type}\r\n className=\"form-control form-control-sm\"\r\n placeholder=\"From\"\r\n value={v1}\r\n onChange={(e) => setV1(e.target.value)}\r\n />\r\n <input\r\n type={type}\r\n className=\"form-control form-control-sm\"\r\n placeholder=\"To\"\r\n value={v2}\r\n onChange={(e) => setV2(e.target.value)}\r\n />\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n\r\n <div className=\"d-flex justify-content-between mt-3\">\r\n <button className=\"btn btn-label-secondary btn-xs\" onClick={onClear}>\r\n Clear\r\n </button>\r\n <button className=\"btn btn-primary btn-xs\" onClick={apply}>\r\n Apply\r\n </button>\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import { useEffect, useState } from \"react\";\r\nimport {\r\n AdvancedFilter,\r\n AdvancedFilterType,\r\n GridColumn,\r\n} from \"../types/grid.types\";\r\n\r\nexport function getAdvancedFilterType<T extends object>(\r\n column: GridColumn<T>,\r\n): AdvancedFilterType | null {\r\n const f = column.enableAdvancedFilter;\r\n\r\n if (!f) return null;\r\n\r\n // enableAdvancedFilter={true}\r\n if (f === true) {\r\n return \"number\"; // default filter type\r\n }\r\n\r\n // enableAdvancedFilter={{ type: \"text\" }}\r\n return f.type;\r\n}\r\n\r\n// small helpers to compute sticky offsets\r\nexport function getLeftOffset<T extends object>(\r\n colState: GridColumn<T>[],\r\n key: GridColumn<T>[\"key\"],\r\n) {\r\n let offset = 0;\r\n\r\n const leftCols = colState\r\n .filter((c) => c.visible && c.pinned === \"left\")\r\n .sort((a, b) => a.order - b.order);\r\n\r\n for (const c of leftCols) {\r\n if (c.key === key) return offset;\r\n offset += c.width ?? 120;\r\n }\r\n\r\n return offset;\r\n}\r\n\r\nexport function getRightOffset<T extends object>(\r\n colState: GridColumn<T>[],\r\n key: GridColumn<T>[\"key\"],\r\n) {\r\n let offset = 0;\r\n\r\n const rightCols = colState\r\n .filter((c) => c.visible && c.pinned === \"right\")\r\n .sort((a, b) => b.order - a.order);\r\n\r\n for (const c of rightCols) {\r\n if (c.key === key) return offset;\r\n offset += c.width ?? 120;\r\n }\r\n\r\n return offset;\r\n}\r\n\r\nexport const getNestedValue = <T, R = unknown>(\r\n obj: T,\r\n path: string,\r\n): R | undefined => {\r\n return path.split(\".\").reduce<any>((acc, key) => acc?.[key], obj);\r\n};\r\n\r\n\r\n\r\nexport function useLocalStorageState<T>(key: string, initialValue: T) {\r\n const getValue = (): T => {\r\n try {\r\n const stored = localStorage.getItem(key);\r\n return stored ? JSON.parse(stored) : initialValue;\r\n } catch {\r\n return initialValue;\r\n }\r\n };\r\n\r\n const [value, setValue] = useState<T>(getValue);\r\n\r\n const updateValue = (newValue: T) => {\r\n setValue(newValue);\r\n localStorage.setItem(key, JSON.stringify(newValue));\r\n\r\n // SAME TAB update\r\n window.dispatchEvent(\r\n new CustomEvent(\"pam-localstorage\", {\r\n detail: { key, value: newValue },\r\n }),\r\n );\r\n };\r\n\r\n useEffect(() => {\r\n const sync = (e: any) => {\r\n // same tab\r\n if (e?.detail?.key === key) {\r\n setValue(e.detail.value);\r\n return;\r\n }\r\n\r\n // other tab\r\n if (e?.key === key) {\r\n setValue(getValue());\r\n }\r\n };\r\n\r\n window.addEventListener(\"pam-localstorage\", sync);\r\n window.addEventListener(\"storage\", sync);\r\n\r\n return () => {\r\n window.removeEventListener(\"pam-localstorage\", sync);\r\n window.removeEventListener(\"storage\", sync);\r\n };\r\n }, [key]);\r\n\r\n return [value, updateValue] as const;\r\n}\r\n","import { useEffect, useMemo, useState } from \"react\";\r\nimport { FacetFilterProps } from \"../types/grid.props\";\r\n\r\nconst FacetFilter = <T extends Record<string, any>>({\r\n columnKey,\r\n grid,\r\n}: FacetFilterProps<T>) => {\r\n const {\r\n facetItems,\r\n facetFilters,\r\n toggleFacetFilter,\r\n loadFacets,\r\n facetLoading,\r\n clearFacetFilters,\r\n } = grid;\r\n\r\n const [search, setSearch] = useState(\"\");\r\n\r\n const items = facetItems?.[columnKey] || [];\r\n const selected = facetFilters?.[columnKey] || [];\r\n\r\n useEffect(() => {\r\n loadFacets(columnKey);\r\n }, [columnKey]);\r\n\r\n /* ---------------- SEARCH FILTER ---------------- */\r\n const filteredItems = useMemo(() => {\r\n if (!search) return items;\r\n\r\n const q = search.toLowerCase();\r\n\r\n return items.filter((i: any) => i.name.toLowerCase().includes(q));\r\n }, [items, search]);\r\n\r\n /* ---------------- LOADING ---------------- */\r\n if (facetLoading?.[columnKey]) {\r\n return (\r\n <div className=\"p-3 text-center\">\r\n <p className=\"text-secondary\">Loading...</p>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"pam-grid-facet-filter\" style={{ width: 240 }}>\r\n {/* Search */}\r\n <div className=\"mb-2\">\r\n <input\r\n type=\"search\"\r\n className=\"form-control form-control-sm\"\r\n placeholder=\"Search...\"\r\n value={search}\r\n onChange={(e) => setSearch(e.target.value)}\r\n />\r\n </div>\r\n\r\n {/* List */}\r\n <div\r\n className=\"list-group list-group-flush text-truncate\"\r\n style={{\r\n maxHeight: 220,\r\n overflowY: \"auto\",\r\n }}\r\n >\r\n {filteredItems.map((item: any) => {\r\n const checked = selected.some((s: any) => s.id === item.id);\r\n\r\n return (\r\n <label\r\n key={item.id}\r\n className=\"list-group-item list-group-item-action d-flex align-items-center gap-2 py-2\"\r\n >\r\n <input\r\n type=\"checkbox\"\r\n className=\"form-check-input mt-0\"\r\n checked={checked}\r\n onChange={() => toggleFacetFilter(columnKey, item)}\r\n />\r\n\r\n <span className=\"flex-grow-1\">{item.name}</span>\r\n\r\n {checked && <i className=\"bx bx-check text-primary\" />}\r\n </label>\r\n );\r\n })}\r\n\r\n {!filteredItems.length && (\r\n <div className=\"text-center text-muted py-3 small\">No results</div>\r\n )}\r\n </div>\r\n\r\n {/* Footer */}\r\n {selected.length > 0 && (\r\n <div className=\"pt-2 border-top mt-2 d-flex justify-content-end\">\r\n <button\r\n className=\"btn btn-sm btn-label-secondary\"\r\n onClick={clearFacetFilters}\r\n >\r\n Clear\r\n </button>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n};\r\n\r\nexport default FacetFilter;\r\n","import { AdvanceFilter } from \"./AdvanceFilter\";\r\nimport { PamHeaderOptionProps } from \"../types/grid.props\";\r\nimport { getAdvancedFilterType } from \"../core/utils\";\r\nimport { GridColumn, PinnedPosition } from \"../types/grid.types\";\r\nimport { PamDropdownItem } from \"../types/PamDropdown.types\";\r\nimport { PamDropDown } from \"..\";\r\nimport FacetFilter from \"./FacetFilter\";\r\n\r\nconst PamHeaderOptions = <T extends Record<string, any>>({\r\n currentColumn,\r\n gridFetaures,\r\n grid,\r\n}: PamHeaderOptionProps<T>) => {\r\n const items: PamDropdownItem[] = [];\r\n\r\n const { advanceFilters, setColumnAdvanceFilter, colState, updateColumn } =\r\n grid;\r\n\r\n const { key: columnKey } = currentColumn;\r\n\r\n // --- Pin / Unpin helpers ---\r\n const pinColumn = (key: GridColumn<T>[\"key\"], side: PinnedPosition) => {\r\n const col = colState.find((c: GridColumn<T>) => c.key === key);\r\n if (!col) return;\r\n // if already pinned to that side → unpin\r\n const newPinned = col.pinned === side ? null : side;\r\n updateColumn(key, { pinned: newPinned });\r\n };\r\n\r\n const unpinColumn = (key: GridColumn<T>[\"key\"]) => {\r\n updateColumn(key, { pinned: null });\r\n };\r\n\r\n if (gridFetaures.pinning) {\r\n items.push({\r\n key: `pined-col-${String(currentColumn.key)}`,\r\n label: \"Pinned\",\r\n icon: \"bx bx-pin\",\r\n keepOpenOnClick: true,\r\n children: [\r\n {\r\n key: `pined-col-${String(currentColumn.key)}-noPinned`,\r\n label: \"No Pinned\",\r\n icon: !currentColumn.pinned ? \"bx bx-check text-primary\" : \"\",\r\n onClick: () => unpinColumn(currentColumn.key),\r\n },\r\n {\r\n key: `pined-col-${String(currentColumn.key)}-leftPinned`,\r\n label: \"Left Pinned\",\r\n icon:\r\n currentColumn.pinned === \"left\" ? \"bx bx-check text-primary\" : \"\",\r\n onClick: () => pinColumn(currentColumn.key, \"left\"),\r\n },\r\n {\r\n key: `pined-col-${String(currentColumn.key)}-rightPinned`,\r\n label: \"Right Pinned\",\r\n icon:\r\n currentColumn.pinned === \"right\" ? \"bx bx-check text-primary\" : \"\",\r\n onClick: () => pinColumn(currentColumn.key, \"right\"),\r\n },\r\n ],\r\n });\r\n }\r\n\r\n if (currentColumn.enableAdvancedFilter) {\r\n items.push({\r\n key: `advance-filter-${String(currentColumn.key)}`,\r\n label: \"Filte By Column\",\r\n icon: \"bx bx-sm bx-filter\",\r\n children: [\r\n {\r\n key: `advance-filter-${String(currentColumn.key)}-apply`,\r\n keepOpenOnClick: true,\r\n custome: true,\r\n label: (\r\n <AdvanceFilter\r\n type={getAdvancedFilterType(currentColumn)}\r\n value={advanceFilters[String(columnKey)]}\r\n onApply={(f) => setColumnAdvanceFilter(String(columnKey), f)}\r\n onClear={() => setColumnAdvanceFilter(String(columnKey), null)}\r\n />\r\n ),\r\n },\r\n ],\r\n });\r\n }\r\n\r\n if (currentColumn.facetedFilter) {\r\n items.push({\r\n key: `facet-filter-${String(currentColumn.key)}`,\r\n label: \"Filter\",\r\n icon: \"bx bx-list-check\",\r\n children: [\r\n {\r\n key: `facet-filter-${String(currentColumn.key)}-items`,\r\n keepOpenOnClick: true,\r\n custome: true,\r\n label: <FacetFilter columnKey={String(columnKey)} grid={grid} />,\r\n },\r\n ],\r\n });\r\n }\r\n\r\n return (\r\n <PamDropDown\r\n trigger={\r\n <>\r\n <i className=\"bx bx-sm bx-dots-vertical-rounded cursor-pointer\"></i>\r\n {advanceFilters[String(columnKey)] && (\r\n <span className=\"badge rounded-pill bg-info badge-dot badge-notifications\" />\r\n )}\r\n </>\r\n }\r\n items={items}\r\n />\r\n );\r\n};\r\n\r\nexport default PamHeaderOptions;\r\n","import React from \"react\";\r\nimport { AdvancedFilterInput, FilterAppliedProps } from \"../types/grid.props\";\r\n\r\nconst FilterApplied = <T extends Record<string, unknown>>({\r\n groupBy,\r\n removeGroupby,\r\n advance,\r\n removeFilter,\r\n grid,\r\n}: FilterAppliedProps<T>) => {\r\n const { switchFiltersConfig, switchQuery, toggleSwitchFilter } = grid;\r\n const OPERATION = [\r\n { key: \"eq\", label: \" == \" },\r\n { key: \"neq\", label: \" ≠ \" },\r\n { key: \"gt\", label: \" > \" },\r\n { key: \"gte\", label: \" ≥ \" },\r\n { key: \"lt\", label: \" < \" },\r\n { key: \"lte\", label: \" ≤ \" },\r\n { key: \"between\", label: \"Between\" },\r\n { key: \"contains\", label: \"Contains\" },\r\n { key: \"starts\", label: \"Starts With\" },\r\n { key: \"ends\", label: \"Ends With\" },\r\n { key: \"eq\", label: \"Equals\" },\r\n { key: \"before\", label: \"Before\" },\r\n { key: \"after\", label: \"After\" },\r\n { key: \"between\", label: \"Between\" },\r\n ];\r\n const getOperatinName = (key: string | undefined) => {\r\n if (!key) return;\r\n let oper = OPERATION.find((item) => item.key === key);\r\n return oper?.label;\r\n };\r\n\r\n const appliedFilters = Object.values(advance || {}).filter(\r\n (filter) => filter.operation !== null,\r\n );\r\n\r\n const removeFilterFun = (filter: AdvancedFilterInput) => {\r\n if (filter.column) {\r\n removeFilter(filter.column);\r\n }\r\n };\r\n\r\n const getColumnLabel = (columnKey: string) => {\r\n const col = grid.colState?.find((c) => c.key === columnKey);\r\n\r\n return col?.facetedFilter?.label || col?.title || columnKey;\r\n };\r\n\r\n // Facet\r\n const facetFilters = grid.facetFilters || {};\r\n const removeFacetFilter = grid.removeFacetFilter;\r\n return (\r\n <div className=\"d-flex flex-row flex-wrap gap-1 py-1 px-3\">\r\n {groupBy && (\r\n <span className=\"badge bg-label-primary text-capitalize\">\r\n GroupBy : {groupBy.label}{\" \"}\r\n <i\r\n className=\"bx bx-x bx-xs cursor-pointer\"\r\n onClick={() => removeGroupby?.()}\r\n />\r\n </span>\r\n )}\r\n\r\n {appliedFilters.map((item) => (\r\n <span\r\n key={item.column}\r\n className=\"badge bg-label-info text-capitalize me-2\"\r\n >\r\n {item.type === \"date\" && item.operation === \"between\"\r\n ? `${item.column} ${item.from} ${getOperatinName(item.operation)} ${\r\n item.to\r\n }`\r\n : `${item.column} ${getOperatinName(item.operation)} ${item.value}`}\r\n\r\n <i\r\n className=\"bx bx-x bx-xs cursor-pointer ms-1\"\r\n onClick={() => removeFilterFun(item)}\r\n />\r\n </span>\r\n ))}\r\n\r\n {Object.entries(facetFilters).map(([column, items]) =>\r\n items.map((item) => (\r\n <span\r\n key={`${column}-${item.id}`}\r\n className=\"badge bg-label-success text-capitalize me-2\"\r\n >\r\n {getColumnLabel(column)}: {item.name}\r\n <i\r\n className=\"bx bx-x bx-xs cursor-pointer ms-1\"\r\n onClick={() => removeFacetFilter?.(column, item.id)}\r\n />\r\n </span>\r\n )),\r\n )}\r\n {switchFiltersConfig !== undefined &&\r\n switchFiltersConfig?.length > 0 &&\r\n switchFiltersConfig.map((swicth) => {\r\n return Object.entries(switchQuery).map(([key, value]) => {\r\n if (swicth.queryParam === key && swicth.defaultValue !== value) {\r\n return (\r\n <span\r\n key={key}\r\n className=\"badge bg-label-warning text-capitalize\"\r\n >\r\n {swicth.label}\r\n <i\r\n className=\"bx bx-x bx-xs cursor-pointer\"\r\n onClick={() => toggleSwitchFilter?.(swicth.key)}\r\n />\r\n </span>\r\n );\r\n }\r\n return null;\r\n });\r\n })}\r\n </div>\r\n );\r\n};\r\n\r\nexport default FilterApplied;\r\n","import React from \"react\";\r\ninterface MinimizeProps {\r\n onClick: () => void;\r\n}\r\nconst Minimize = ({ onClick }: MinimizeProps) => {\r\n return (\r\n <svg\r\n className=\"w-6 h-6 text-gray-800 dark:text-white cursor-pointer\"\r\n aria-hidden=\"true\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"18\"\r\n height=\"18\"\r\n fill=\"none\"\r\n viewBox=\"0 0 24 24\"\r\n onClick={onClick}\r\n \r\n >\r\n <path\r\n stroke=\"currentColor\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n strokeWidth=\"2\"\r\n d=\"M5 9h4m0 0V5m0 4L4 4m15 5h-4m0 0V5m0 4 5-5M5 15h4m0 0v4m0-4-5 5m15-5h-4m0 0v4m0-4 5 5\"\r\n />\r\n </svg>\r\n );\r\n};\r\n\r\nexport default Minimize;\r\n","interface CompressProps {\r\n onClick: () => void;\r\n}\r\nconst Compress = ({ onClick }: CompressProps) => {\r\n return (\r\n <svg\r\n className=\"w-6 h-6 text-gray-800 dark:text-white cursor-pointer\"\r\n aria-hidden=\"true\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"18\"\r\n height=\"18\"\r\n fill=\"none\"\r\n viewBox=\"0 0 24 24\"\r\n onClick={onClick}\r\n >\r\n <path\r\n stroke=\"currentColor\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n strokeWidth=\"2\"\r\n d=\"M4 8h4V4m12 4h-4V4M4 16h4v4m12-4h-4v4\"\r\n />\r\n </svg>\r\n );\r\n};\r\n\r\nexport default Compress;\r\n","import { EmptyStateProps } from \"../types/grid.props\";\r\nimport BoxIcon from \"../assets/icons/Box.svg\";\r\nconst EmptyState = ({\r\n title = \"No data available\",\r\n description = \"There is nothing to display here.\",\r\n imgSrc = BoxIcon,\r\n}: EmptyStateProps) => {\r\n return (\r\n <div className=\"empty-state\">\r\n <div className=\"empty-image-wrapper\">\r\n <img src={imgSrc} alt=\"Empty\" />\r\n </div>\r\n <h6>{title}</h6>\r\n <p className=\"text-muted mb-0\">{description}</p>\r\n </div>\r\n );\r\n};\r\n\r\nexport default EmptyState;\r\n","import React from \"react\";\r\n\r\nconst ArrowFromBottonToRight = () => {\r\n return (\r\n <svg\r\n className=\"w-[18px] h-[18px] text-gray-800 dark:text-white cursor-pointer\"\r\n aria-hidden=\"true\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"18\"\r\n height=\"18\"\r\n fill=\"none\"\r\n viewBox=\"0 0 24 24\"\r\n >\r\n <path\r\n d=\"M4 20V18.6C4 15.2397 4 13.5595 4.65396 12.2761C5.2292 11.1471 6.14708 10.2292 7.27606 9.65396C8.55953 9 10.2397 9 13.6 9H20M20 9L15 14M20 9L15 4\"\r\n stroke=\"currentColor\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n strokeWidth=\"2\"\r\n />\r\n </svg>\r\n );\r\n};\r\n\r\nexport default ArrowFromBottonToRight;\r\n","let tooltipEl: HTMLDivElement | null = null;\r\nconst OFFSET = 10;\r\n\r\nconst createToolTip = (): HTMLDivElement => {\r\n const el = document.createElement(\"div\");\r\n el.className = \"grid-tooltip\";\r\n el.style.position = \"fixed\";\r\n el.style.pointerEvents = \"none\";\r\n el.style.opacity = \"0\";\r\n\r\n document.body.appendChild(el);\r\n tooltipEl = el;\r\n\r\n return el;\r\n};\r\n\r\nconst getToolTip = (): HTMLDivElement => {\r\n if (!tooltipEl) {\r\n return createToolTip();\r\n }\r\n return tooltipEl;\r\n};\r\n\r\nconst getPosition = (x: number, y: number, el: HTMLDivElement) => {\r\n const { innerHeight, innerWidth } = window;\r\n\r\n const rect = el.getBoundingClientRect();\r\n\r\n let left = x + OFFSET;\r\n let top = y + OFFSET;\r\n\r\n // Right Overflow\r\n if (left + rect.width > innerWidth) {\r\n left = x - rect.width - OFFSET;\r\n }\r\n\r\n // Left Overflow\r\n\r\n if (left < 0) {\r\n left = OFFSET;\r\n }\r\n\r\n // Bottom overflow\r\n if (top + rect.height > innerHeight) {\r\n top = y - rect.height - OFFSET;\r\n }\r\n // Top overflow\r\n if (top < 0) {\r\n top = OFFSET;\r\n }\r\n\r\n return { left, top };\r\n};\r\n\r\nexport const showTooltip = (text: string, x: number, y: number): void => {\r\n const el = getToolTip();\r\n\r\n el.textContent = text;\r\n el.style.opacity = \"1\";\r\n\r\n el.style.left = \"0px\";\r\n el.style.top = \"0px\";\r\n\r\n const { left, top } = getPosition(x, y, el);\r\n el.style.left = `${left}px`;\r\n el.style.top = `${top}px`;\r\n};\r\n\r\nexport const hideTooltip = (): void => {\r\n if (!tooltipEl) return;\r\n tooltipEl.style.opacity = \"0\";\r\n};\r\n","import ArrowFromBottonToRight from \"./icons/ArrowFromBottonToRight\";\r\nimport { BulkActionProps } from \"../types/grid.props\";\r\nimport { hideTooltip, showTooltip } from \"../core/Tooltip\";\r\nimport { act } from \"react\";\r\n\r\nfunction BulkAction({ records, actions }: BulkActionProps) {\r\n return (\r\n <div className=\"d-flex flex-row gap-1 align-items-center py-1 ps-4\">\r\n <ArrowFromBottonToRight />\r\n <span>{`(${records.size}) ${\r\n records.size > 1 ? \"Records\" : \"Record\"\r\n }`}</span>{\" \"}\r\n {actions.length > 0 &&\r\n actions\r\n ?.filter((act) => act.isVisible)\r\n ?.map((action, index) => (\r\n <i\r\n key={`${action.label}_${index}`}\r\n className={`${action.icon}`}\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n action.onBulkClick && action.onBulkClick(records);\r\n }}\r\n onMouseEnter={(e) =>\r\n showTooltip(action.label, e.clientX, e.clientY)\r\n }\r\n onMouseMove={(e) =>\r\n showTooltip(action.label, e.clientX, e.clientY)\r\n }\r\n onMouseLeave={hideTooltip}\r\n />\r\n ))}\r\n </div>\r\n );\r\n}\r\n\r\nexport default BulkAction;\r\n","import React from \"react\";\r\nimport { PaginationProps } from \"../types/grid.props\";\r\n\r\ntype PaginationItem = number | \"...\";\r\n\r\nconst getPaginationRange = (\r\n currentPage: number,\r\n totalPages: number,\r\n delta = 1,\r\n): PaginationItem[] => {\r\n const range: number[] = [];\r\n const rangeWithDots: PaginationItem[] = [];\r\n let last: number | undefined;\r\n\r\n for (let i = 1; i <= totalPages; i++) {\r\n if (\r\n i === 1 ||\r\n i === totalPages ||\r\n (i >= currentPage - delta && i <= currentPage + delta)\r\n ) {\r\n range.push(i);\r\n }\r\n }\r\n\r\n for (const page of range) {\r\n if (last !== undefined) {\r\n if (page - last === 2) {\r\n rangeWithDots.push(last + 1);\r\n } else if (page - last > 2) {\r\n rangeWithDots.push(\"...\");\r\n }\r\n }\r\n rangeWithDots.push(page);\r\n last = page;\r\n }\r\n\r\n return rangeWithDots;\r\n};\r\n\r\nconst Pagination = ({\r\n currentPage,\r\n totalPages,\r\n onPageChange,\r\n}: PaginationProps) => {\r\n if (totalPages <= 1) return null;\r\n\r\n const paginationRange = getPaginationRange(currentPage, totalPages);\r\n\r\n return (\r\n <nav aria-label=\"Page navigation\">\r\n <ul className=\"pagination pagination-sm justify-content-end py-1 mx-1\">\r\n {/* Prev */}\r\n <li className={`page-item ${currentPage === 1 ? \"disabled\" : \"\"}`}>\r\n <button\r\n className=\"page-link\"\r\n onClick={() => onPageChange(currentPage - 1)}\r\n disabled={currentPage === 1}\r\n >\r\n &laquo;\r\n </button>\r\n </li>\r\n\r\n {paginationRange.map((item, index) => (\r\n <li\r\n key={index}\r\n className={`page-item ${\r\n item === currentPage ? \"active\" : \"\"\r\n } ${item === \"...\" ? \"disabled\" : \"\"}`}\r\n >\r\n {item === \"...\" ? (\r\n <span className=\"page-link\">…</span>\r\n ) : (\r\n <button className=\"page-link\" onClick={() => onPageChange(item)}>\r\n {item}\r\n </button>\r\n )}\r\n </li>\r\n ))}\r\n\r\n {/* Next */}\r\n <li\r\n className={`page-item ${\r\n currentPage === totalPages ? \"disabled\" : \"\"\r\n }`}\r\n >\r\n <button\r\n className=\"page-link\"\r\n onClick={() => onPageChange(currentPage + 1)}\r\n disabled={currentPage === totalPages}\r\n >\r\n &raquo;\r\n </button>\r\n </li>\r\n </ul>\r\n </nav>\r\n );\r\n};\r\n\r\nexport default Pagination;\r\n","import React, {\r\n useEffect,\r\n useLayoutEffect,\r\n useMemo,\r\n useRef,\r\n useState,\r\n} from \"react\";\r\nimport { createPortal } from \"react-dom\";\r\nimport type {\r\n PamDropdownItem,\r\n PamDropdownPlacement,\r\n} from \"../../types/PamDropdown.types\";\r\n\r\ntype PamDropdownProps = {\r\n trigger: React.ReactNode;\r\n items: PamDropdownItem[];\r\n placement?: PamDropdownPlacement;\r\n offset?: number;\r\n disabled?: boolean;\r\n closeOnItemClick?: boolean;\r\n className?: string;\r\n};\r\n\r\ntype DropdownPosition = { top: number; left: number };\r\n\r\nexport default function PamDropdown({\r\n trigger,\r\n items,\r\n placement = \"bottom-start\",\r\n offset = 6,\r\n disabled = false,\r\n closeOnItemClick = true,\r\n className = \"\",\r\n}: PamDropdownProps) {\r\n const triggerRef = useRef<HTMLSpanElement | null>(null);\r\n const menuRef = useRef<HTMLDivElement | null>(null);\r\n\r\n const [open, setOpen] = useState(false);\r\n const [pos, setPos] = useState<DropdownPosition>({ top: 0, left: 0 });\r\n\r\n // Multiple submenus can be open\r\n const [openSubKeys, setOpenSubKeys] = useState<Record<string, boolean>>({});\r\n\r\n const portalRoot = useMemo(() => {\r\n const el = document.getElementById(\"pam-portal-root\");\r\n if (el) return el;\r\n\r\n const created = document.createElement(\"div\");\r\n created.id = \"pam-portal-root\";\r\n document.body.appendChild(created);\r\n return created;\r\n }, []);\r\n\r\n function close() {\r\n setOpen(false);\r\n setOpenSubKeys({});\r\n }\r\n\r\n function toggle() {\r\n if (disabled) return;\r\n setOpen((v) => {\r\n const next = !v;\r\n if (!next) setOpenSubKeys({});\r\n return next;\r\n });\r\n }\r\n\r\n // MAIN dropdown position\r\n function getDropdownPosition(\r\n triggerEl: HTMLElement,\r\n menuEl: HTMLElement,\r\n ): DropdownPosition {\r\n const rect = triggerEl.getBoundingClientRect();\r\n const menuRect = menuEl.getBoundingClientRect();\r\n\r\n let top = rect.bottom + offset + window.scrollY;\r\n let left = rect.left + window.scrollX;\r\n\r\n if (placement.startsWith(\"top\")) {\r\n top = rect.top - menuRect.height - offset + window.scrollY;\r\n }\r\n\r\n if (placement.endsWith(\"end\")) {\r\n left = rect.right - menuRect.width + window.scrollX;\r\n }\r\n\r\n // clamp X\r\n const minLeft = 8 + window.scrollX;\r\n const maxLeft = window.innerWidth - menuRect.width - 8 + window.scrollX;\r\n left = Math.max(minLeft, Math.min(left, maxLeft));\r\n\r\n // clamp Y\r\n const minTop = 8 + window.scrollY;\r\n const maxTop = window.innerHeight - menuRect.height - 8 + window.scrollY;\r\n top = Math.max(minTop, Math.min(top, maxTop));\r\n\r\n // auto flip if bottom overflow\r\n const bottomOverflow =\r\n top + menuRect.height > window.innerHeight + window.scrollY;\r\n const topOverflow = top < window.scrollY;\r\n\r\n if (bottomOverflow && rect.top > menuRect.height) {\r\n top = rect.top - menuRect.height - offset + window.scrollY;\r\n } else if (\r\n topOverflow &&\r\n window.innerHeight - rect.bottom > menuRect.height\r\n ) {\r\n top = rect.bottom + offset + window.scrollY;\r\n }\r\n\r\n return { top, left };\r\n }\r\n\r\n function updatePosition() {\r\n const t = triggerRef.current;\r\n const m = menuRef.current;\r\n if (!t || !m) return;\r\n setPos(getDropdownPosition(t, m));\r\n }\r\n\r\n useLayoutEffect(() => {\r\n if (!open) return;\r\n updatePosition();\r\n }, [open, placement]);\r\n\r\n // close on outside click\r\n useEffect(() => {\r\n if (!open) return;\r\n\r\n const onDown = (e: MouseEvent) => {\r\n const t = triggerRef.current;\r\n const m = menuRef.current;\r\n if (!t || !m) return;\r\n\r\n const target = e.target as Node;\r\n if (t.contains(target)) return;\r\n if (m.contains(target)) return;\r\n\r\n close();\r\n };\r\n\r\n const onKey = (e: KeyboardEvent) => {\r\n if (e.key === \"Escape\") close();\r\n };\r\n\r\n document.addEventListener(\"mousedown\", onDown);\r\n document.addEventListener(\"keydown\", onKey);\r\n\r\n return () => {\r\n document.removeEventListener(\"mousedown\", onDown);\r\n document.removeEventListener(\"keydown\", onKey);\r\n };\r\n }, [open]);\r\n\r\n // reposition on scroll/resize\r\n useEffect(() => {\r\n if (!open) return;\r\n\r\n const handler = () => updatePosition();\r\n\r\n window.addEventListener(\"scroll\", handler, true);\r\n window.addEventListener(\"resize\", handler);\r\n\r\n return () => {\r\n window.removeEventListener(\"scroll\", handler, true);\r\n window.removeEventListener(\"resize\", handler);\r\n };\r\n }, [open]);\r\n\r\n return (\r\n <>\r\n <span ref={triggerRef} className={`pam-dropdown-trigger ${className}`}>\r\n <span onClick={toggle} style={{ display: \"inline-flex\" }}>\r\n {trigger}\r\n </span>\r\n </span>\r\n\r\n {open &&\r\n createPortal(\r\n <div\r\n ref={menuRef}\r\n className=\"pam-dropdown-menu\"\r\n style={{\r\n top: pos.top,\r\n left: pos.left,\r\n }}\r\n >\r\n <PamDropdownList\r\n items={items}\r\n closeOnItemClick={closeOnItemClick}\r\n onClose={close}\r\n openSubKeys={openSubKeys}\r\n setOpenSubKeys={setOpenSubKeys}\r\n level={0}\r\n />\r\n </div>,\r\n portalRoot,\r\n )}\r\n </>\r\n );\r\n}\r\n\r\ntype PamDropdownListProps = {\r\n items: PamDropdownItem[];\r\n onClose: () => void;\r\n closeOnItemClick: boolean;\r\n\r\n openSubKeys: Record<string, boolean>;\r\n setOpenSubKeys: React.Dispatch<React.SetStateAction<Record<string, boolean>>>;\r\n\r\n level: number;\r\n};\r\n\r\nfunction PamDropdownList({\r\n items,\r\n onClose,\r\n closeOnItemClick,\r\n openSubKeys,\r\n setOpenSubKeys,\r\n level,\r\n}: PamDropdownListProps) {\r\n return (\r\n <ul className=\"pam-dropdown-list\">\r\n {items.map((item, index) => (\r\n <PamDropdownNode\r\n key={item.key ?? `${level}-${index}`}\r\n item={item}\r\n onClose={onClose}\r\n closeOnItemClick={closeOnItemClick}\r\n openSubKeys={openSubKeys}\r\n setOpenSubKeys={setOpenSubKeys}\r\n level={level}\r\n index={index}\r\n />\r\n ))}\r\n </ul>\r\n );\r\n}\r\n\r\ntype PamDropdownNodeProps = {\r\n item: PamDropdownItem;\r\n onClose: () => void;\r\n closeOnItemClick: boolean;\r\n\r\n openSubKeys: Record<string, boolean>;\r\n setOpenSubKeys: React.Dispatch<React.SetStateAction<Record<string, boolean>>>;\r\n\r\n level: number;\r\n index: number;\r\n};\r\n\r\nfunction PamDropdownNode({\r\n item,\r\n onClose,\r\n closeOnItemClick,\r\n openSubKeys,\r\n setOpenSubKeys,\r\n level,\r\n index,\r\n}: PamDropdownNodeProps) {\r\n const liRef = useRef<HTMLLIElement | null>(null);\r\n const submenuRef = useRef<HTMLDivElement | null>(null);\r\n\r\n const hasChildren = !!item.children?.length;\r\n const nodeKey = item.key ?? `${level}-${index}`;\r\n\r\n const submenuOpen = !!openSubKeys[nodeKey];\r\n\r\n // Submenu positioning (left/right + top/bottom clamp + maxHeight scroll)\r\n useLayoutEffect(() => {\r\n if (!submenuOpen) return;\r\n\r\n const li = liRef.current;\r\n const menu = submenuRef.current;\r\n if (!li || !menu) return;\r\n\r\n const rect = li.getBoundingClientRect();\r\n\r\n // reset for measuring\r\n menu.style.left = \"0px\";\r\n menu.style.top = \"0px\";\r\n menu.style.maxHeight = \"\";\r\n menu.style.overflowY = \"\";\r\n\r\n const menuRect = menu.getBoundingClientRect();\r\n\r\n const gap = 6;\r\n\r\n const spaceRight = window.innerWidth - rect.right;\r\n const spaceLeft = rect.left;\r\n const spaceBottom = window.innerHeight - rect.bottom;\r\n const spaceTop = rect.top;\r\n\r\n // default = right\r\n let left = rect.right + gap;\r\n let top = rect.top;\r\n\r\n let mode: \"right\" | \"left\" | \"bottom\" | \"top\" = \"right\";\r\n\r\n // ---- Step 1: horizontal try ----\r\n if (spaceRight >= menuRect.width) {\r\n mode = \"right\";\r\n left = rect.right + gap;\r\n top = rect.top;\r\n } else if (spaceLeft >= menuRect.width) {\r\n mode = \"left\";\r\n left = rect.left - menuRect.width - gap;\r\n top = rect.top;\r\n } else {\r\n // ---- Step 2: no horizontal space -> open vertical ----\r\n if (spaceBottom >= menuRect.height) {\r\n mode = \"bottom\";\r\n left = rect.left;\r\n top = rect.bottom + gap;\r\n } else if (spaceTop >= menuRect.height) {\r\n mode = \"top\";\r\n left = rect.left;\r\n top = rect.top - menuRect.height - gap;\r\n } else {\r\n // fallback: bottom with clamp\r\n mode = \"bottom\";\r\n left = rect.left;\r\n top = rect.bottom + gap;\r\n }\r\n }\r\n\r\n // ---- Clamp inside viewport ----\r\n const minLeft = 8;\r\n const maxLeft = window.innerWidth - menuRect.width - 8;\r\n left = Math.max(minLeft, Math.min(left, maxLeft));\r\n\r\n const minTop = 8;\r\n const maxTop = window.innerHeight - menuRect.height - 8;\r\n top = Math.max(minTop, Math.min(top, maxTop));\r\n\r\n // ---- If submenu too tall -> scroll ----\r\n const maxHeight = window.innerHeight - 16;\r\n menu.style.maxHeight = `${maxHeight}px`;\r\n menu.style.overflowY = \"auto\";\r\n\r\n menu.style.left = `${left}px`;\r\n menu.style.top = `${top}px`;\r\n\r\n // optional: for CSS styling\r\n menu.setAttribute(\"data-placement\", mode);\r\n }, [submenuOpen]);\r\n\r\n const handleClick = (e: React.MouseEvent) => {\r\n e.stopPropagation();\r\n\r\n if (item.disabled) return;\r\n\r\n // submenu parent\r\n if (hasChildren) {\r\n setOpenSubKeys((prev) => {\r\n const next: Record<string, boolean> = {};\r\n\r\n // keep only parent levels (close same + deeper)\r\n Object.keys(prev).forEach((k) => {\r\n const lvl = Number(k.split(\"-\")[0]);\r\n if (lvl < level) next[k] = prev[k];\r\n });\r\n\r\n // toggle current\r\n next[nodeKey] = !prev[nodeKey];\r\n\r\n return next;\r\n });\r\n\r\n return;\r\n }\r\n\r\n // normal item\r\n item.onClick?.();\r\n\r\n if (item.keepOpenOnClick) return;\r\n if (closeOnItemClick) onClose();\r\n };\r\n\r\n return (\r\n <li\r\n ref={liRef}\r\n className={[\r\n !item.custome ? \"pam-dropdown-item\" : \"\",\r\n item.danger ? \"danger\" : \"\",\r\n item.disabled ? \"disabled\" : \"\",\r\n hasChildren ? \"has-children\" : \"\",\r\n submenuOpen ? \"open\" : \"\",\r\n ].join(\" \")}\r\n onClick={handleClick}\r\n >\r\n <div\r\n className={`${item.rightSlot ? \"pam-dropdown-item-inner-rightSlot\" : \"pam-dropdown-item-inner\"} `}\r\n >\r\n <div className=\"pam-left\">\r\n {item.icon && <i className={`${item.icon} pam-icon`} />}\r\n <span className=\"pam-label\">{item.label}</span>\r\n </div>\r\n\r\n <div className=\"pam-right\">\r\n {item.rightSlot && (\r\n <span\r\n className=\"pam-rightslot\"\r\n onClick={(e) => e.stopPropagation()}\r\n >\r\n {item.rightSlot}\r\n </span>\r\n )}\r\n\r\n {hasChildren && <i className=\"bx bx-chevron-right pam-arrow\" />}\r\n </div>\r\n </div>\r\n\r\n {hasChildren && submenuOpen && (\r\n <div ref={submenuRef} className=\"pam-submenu\">\r\n <PamDropdownList\r\n items={item.children!}\r\n onClose={onClose}\r\n closeOnItemClick={closeOnItemClick}\r\n openSubKeys={openSubKeys}\r\n setOpenSubKeys={setOpenSubKeys}\r\n level={level + 1}\r\n />\r\n </div>\r\n )}\r\n </li>\r\n );\r\n}\r\n","import React, { useState } from \"react\";\r\nimport { PamDropdownItem } from \"../types/PamDropdown.types\";\r\nimport PamDropdown from \"./dropdown/PamDropdown\";\r\nimport {\r\n GridFetaures,\r\n MainFilterProps,\r\n TableActionProps,\r\n} from \"../types/grid.types\";\r\nimport { useLocalStorageState } from \"../core/utils\";\r\nimport { hideTooltip, showTooltip } from \"../core/Tooltip\";\r\n\r\nconst MainFilter = <T extends Record<string, unknown>>({\r\n gridFetaures,\r\n grid,\r\n}: MainFilterProps<T>) => {\r\n const {\r\n setGroupBy,\r\n visibleColumns,\r\n colState,\r\n updateColumn,\r\n switchFiltersConfig,\r\n switchFilters,\r\n toggleSwitchFilter,\r\n } = grid;\r\n const [isBulkData, setBulkData] = useLocalStorageState<boolean>(\r\n \"bulk-data-toggle\",\r\n false,\r\n );\r\n\r\n const items: PamDropdownItem[] = [];\r\n\r\n items.push({\r\n key: \"column-visibility\",\r\n label: \"Column Visibility\",\r\n icon: \"bx bx-table\",\r\n children: gridFetaures.columnVisibility\r\n ? colState.map((c) => ({\r\n key: `col-${String(c.key)}`,\r\n label: c.title,\r\n keepOpenOnClick: true,\r\n rightSlot: (\r\n <input\r\n className=\"form-check-input m-0\"\r\n type=\"checkbox\"\r\n checked={c.visible !== false}\r\n onChange={() => {\r\n updateColumn(c.key, { visible: !(c.visible !== false) });\r\n }}\r\n onClick={(e) => e.stopPropagation()}\r\n />\r\n ),\r\n }))\r\n : [],\r\n });\r\n\r\n if (gridFetaures.grouping) {\r\n items.push({\r\n key: \"group-by\",\r\n label: \"Group By\",\r\n icon: \"bx bx-columns\",\r\n children:\r\n visibleColumns.length > 0\r\n ? visibleColumns\r\n .filter((c) => c.groupable)\r\n .map((c) => ({\r\n key: `group-${String(c.key)}`,\r\n label: c.title,\r\n onClick: () =>\r\n setGroupBy({ key: String(c.key), label: c.title }),\r\n }))\r\n : [],\r\n });\r\n }\r\n\r\n if (\r\n gridFetaures?.bulkActionsConfig &&\r\n gridFetaures.bulkActionsConfig.length > 0\r\n ) {\r\n items.push({\r\n key: \"bulk-data\",\r\n keepOpenOnClick: true,\r\n label: (\r\n <>\r\n <label\r\n className=\"switch switch-square switch-sm\"\r\n onClick={(e) => e.stopPropagation()}\r\n >\r\n <input\r\n type=\"checkbox\"\r\n className=\"switch-input\"\r\n checked={isBulkData}\r\n onChange={(e) => setBulkData(e.target.checked)}\r\n />\r\n\r\n <span className=\"switch-toggle-slider\">\r\n <span className=\"switch-on\">\r\n <i className=\"icon-base bx bx-check\"></i>\r\n </span>\r\n <span className=\"switch-off\">\r\n <i className=\"icon-base bx bx-x\"></i>\r\n </span>\r\n </span>\r\n </label>\r\n\r\n <span className=\"pam-label ms-4\">Bulk Data</span>\r\n </>\r\n ),\r\n });\r\n }\r\n\r\n if (switchFiltersConfig !== undefined && switchFiltersConfig?.length > 0) {\r\n switchFiltersConfig.forEach((filter) => {\r\n items.push({\r\n key: `switch-${filter.key}`,\r\n keepOpenOnClick: true,\r\n label: filter.label,\r\n rightSlot: (\r\n <label\r\n className=\"switch switch-square switch-sm\"\r\n onClick={(e) => e.stopPropagation()}\r\n >\r\n <input\r\n type=\"checkbox\"\r\n className=\"switch-input\"\r\n checked={!!switchFilters?.[filter.key]}\r\n onChange={() => toggleSwitchFilter(filter.key)}\r\n />\r\n <span className=\"switch-toggle-slider\">\r\n <span className=\"switch-on\">\r\n <i className=\"icon-base bx bx-check\"></i>\r\n </span>\r\n <span className=\"switch-off\">\r\n <i className=\"icon-base bx bx-x\"></i>\r\n </span>\r\n </span>\r\n </label>\r\n ),\r\n });\r\n });\r\n }\r\n return (\r\n <PamDropdown\r\n trigger={\r\n <button type=\"button\" className=\"btn btn-sm btn-label-secondary me-2\">\r\n <span className=\"icon-base bx bx-filter-alt\"></span>\r\n <span className=\"d-none d-sm-inline ms-1\">Filter</span>\r\n </button>\r\n }\r\n items={items}\r\n />\r\n );\r\n};\r\n\r\nexport default MainFilter;\r\n\r\nexport const TableAction = <T extends Record<string, unknown>>({\r\n gridFetaures,\r\n row,\r\n}: TableActionProps<T>) => {\r\n const items: PamDropdownItem[] = Array.isArray(gridFetaures.actions)\r\n ? gridFetaures.actions\r\n .filter((act) => {\r\n if (typeof act.isVisible === \"function\") {\r\n if (row) {\r\n return act.isVisible(row);\r\n }\r\n return false;\r\n }\r\n if (typeof act.isVisible === \"boolean\") {\r\n return act.isVisible;\r\n }\r\n return true;\r\n })\r\n .map((a, i) => ({\r\n key: `action-${String(a.label)}-${i}`,\r\n label: a.label,\r\n icon: a.icon,\r\n onClick: (e) => {\r\n a.onClick && row && a.onClick(row);\r\n },\r\n }))\r\n : [];\r\n return (\r\n <PamDropdown\r\n trigger={\r\n <i\r\n className=\"bx bx-dots-vertical-rounded cursor-pointer\"\r\n onMouseEnter={(e) => showTooltip(\"Action\", e.clientX, e.clientY)}\r\n onMouseMove={(e) => showTooltip(\"Action\", e.clientX, e.clientY)}\r\n onMouseLeave={hideTooltip}\r\n ></i>\r\n }\r\n items={items}\r\n />\r\n );\r\n};\r\n","export const safeGridHandle = {\r\n rows: [],\r\n page: 1,\r\n totalPages: 1,\r\n pageSize: 20,\r\n setPage: () => {},\r\n setPageSize: () => {},\r\n setGroupBy: () => {},\r\n groupBy: null,\r\n search: \"\",\r\n setSearch: () => {},\r\n selected: new Set(),\r\n toggleSelect: () => {},\r\n selectAllOnPage: () => {},\r\n deselectAllOnPage: () => {},\r\n changeSort: () => {},\r\n sortBy: { key: \"\", dir: \"asc\" },\r\n visibleColumns: [],\r\n colState: [],\r\n updateColumn: () => {},\r\n totalRows: 0,\r\n expanded: new Set(),\r\n toggleExpand: () => {},\r\n setColState: () => {},\r\n emptyState: { title: \"No records\", description: \"No data available\" },\r\n addNewRecord: undefined,\r\n advanceFilters: [],\r\n setColumnAdvanceFilter: () => {},\r\n};\r\n","import React from \"react\";\r\n\r\nconst ColumnIcon = () => {\r\n return (\r\n <svg\r\n className=\"w-[18px] h-[18px] text-gray-800 dark:text-white cursor-pointer\"\r\n aria-hidden=\"true\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"18\"\r\n height=\"18\"\r\n fill=\"none\"\r\n viewBox=\"0 0 24 24\"\r\n >\r\n <path\r\n stroke=\"currentColor\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n strokeWidth=\"2\"\r\n d=\"M15 5v14M9 5v14M4 5h16a1 1 0 0 1 1 1v12a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1V6a1 1 0 0 1 1-1Z\"\r\n />\r\n </svg>\r\n );\r\n};\r\n\r\nexport default ColumnIcon;\r\n","import { ColumnVisibilityPanelProps } from \"../types/grid.props\";\r\nimport ColumnIcon from \"./icons/ColumnIcon\";\r\n\r\nconst ColumnVisibilityPanel = <T extends Record<string, any>>({\r\n columns,\r\n onToggle,\r\n}: ColumnVisibilityPanelProps<T>) => {\r\n return (\r\n <div className=\"dropdown\">\r\n <button\r\n className=\"btn btn-sm btn-outline-secondary\"\r\n data-bs-toggle=\"dropdown\"\r\n >\r\n <ColumnIcon /> Columns\r\n </button>\r\n <div className=\"dropdown-menu dropdown-menu-end p-2\">\r\n {columns.map((c) => (\r\n <div key={String(c.key)} className=\"form-check\">\r\n <input\r\n className=\"form-check-input\"\r\n type=\"checkbox\"\r\n id={`colvis-${String(c.key)}`}\r\n checked={c.visible !== false}\r\n onChange={() => onToggle(c.key)}\r\n />\r\n <label\r\n className=\"form-check-label\"\r\n htmlFor={`colvis-${String(c.key)}`}\r\n >\r\n {c.title}\r\n </label>\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n );\r\n};\r\nexport default ColumnVisibilityPanel;\r\n","import { useState, useMemo, useCallback, useEffect } from \"react\";\r\nimport {\r\n AdvancedFilterInput,\r\n AdvancedFilterState,\r\n useGridCoreProps,\r\n} from \"../types/grid.props\";\r\nimport {\r\n EmptySate,\r\n FacetItem,\r\n GridColumn,\r\n GridColumnState,\r\n GridRowId,\r\n groupByObj,\r\n SortState,\r\n} from \"../types/grid.types\";\r\n\r\n/*\r\n options:\r\n - data (array) OR serverMode: true + fetcher({ page, pageSize, sortBy, filter, search })\r\n - rowKey\r\n - initialPageSize\r\n*/\r\n\r\nexport function useGridCore<T extends Record<string, any>>({\r\n data = [],\r\n columns = [],\r\n serverMode = false,\r\n rowKey = \"id\",\r\n initialPageSize = 20,\r\n addNewRecord,\r\n switchFiltersConfig,\r\n}: useGridCoreProps<T>) {\r\n /* ---------------- BASIC STATE ---------------- */\r\n const [page, setPage] = useState<number>(1);\r\n const [pageSize, setPageSize] = useState<number>(initialPageSize);\r\n const [search, setSearch] = useState<string>(\"\");\r\n const [debouncedSearch, setDebouncedSearch] = useState<string>(\"\");\r\n const [groupBy, setGroupBy] = useState<groupByObj | null>(null);\r\n const [emptyState, setEmptyState] = useState<EmptySate>({});\r\n const [facetItems, setFacetItems] = useState<Record<string, FacetItem[]>>({});\r\n const [facetFilters, setFacetFilters] = useState<Record<string, FacetItem[]>>(\r\n {},\r\n );\r\n const [facetLoading, setFacetLoading] = useState<Record<string, boolean>>({});\r\n const [advanceFilters, setAdvanceFilters] = useState<AdvancedFilterState>({});\r\n const [sortBy, setSortBy] = useState<SortState>({ key: null, dir: \"asc\" });\r\n\r\n const [selected, setSelected] = useState<Set<GridRowId>>(new Set());\r\n const [expanded, setExpanded] = useState<Set<GridRowId>>(new Set());\r\n\r\n const [switchFilters, setSwitchFilters] = useState<Record<string, boolean>>(\r\n () => {\r\n const initial: Record<string, boolean> = {};\r\n\r\n switchFiltersConfig?.forEach((f) => {\r\n initial[f.key] = f.defaultValue ?? false;\r\n });\r\n\r\n return initial;\r\n },\r\n );\r\n\r\n /* ---------------- SERVER MODE STATE ---------------- */\r\n const [serverRows, setServerRows] = useState<T[]>([]);\r\n const [serverTotal, setServerTotal] = useState(0);\r\n const [serverTotalPages, setServerTotalPages] = useState(1); // <-- new\r\n\r\n /* ---------------- COLUMN STATE ---------------- */\r\n const [colState, setColState] = useState<GridColumnState<T>[]>(() =>\r\n columns.map((c: any, i: any) => ({\r\n ...c,\r\n visible: c.visible !== false,\r\n order: i,\r\n })),\r\n );\r\n\r\n /* ---------------- SEARCH (DEBOUNCE) ---------------- */\r\n useEffect(() => {\r\n const t = setTimeout(() => {\r\n setDebouncedSearch(search);\r\n setPage(1);\r\n }, 400);\r\n return () => clearTimeout(t);\r\n }, [search]);\r\n\r\n /* ---------------- CLIENT MODE (PURE DERIVED DATA) ---------------- */\r\n const filteredData = useMemo(() => {\r\n if (serverMode) return [];\r\n\r\n let filtered = [...data]; // clone\r\n\r\n // SEARCH\r\n if (debouncedSearch) {\r\n const q = debouncedSearch.toLowerCase();\r\n filtered = filtered.filter((r) =>\r\n Object.values(r).some((v) =>\r\n String(v ?? \"\")\r\n .toLowerCase()\r\n .includes(q),\r\n ),\r\n );\r\n }\r\n\r\n // SORT\r\n if (sortBy.key) {\r\n const dir = sortBy.dir === \"asc\" ? 1 : -1;\r\n filtered.sort(\r\n (a, b) =>\r\n String(a?.[sortBy.key as GridRowId] ?? \"\").localeCompare(\r\n String(b?.[sortBy.key as GridRowId] ?? \"\"),\r\n undefined,\r\n { numeric: true, sensitivity: \"base\" },\r\n ) * dir,\r\n );\r\n }\r\n\r\n return filtered;\r\n }, [data, debouncedSearch, sortBy, serverMode]);\r\n\r\n const pagedClientRows = useMemo(() => {\r\n if (serverMode) return [];\r\n const start = (page - 1) * pageSize;\r\n return filteredData.slice(start, start + pageSize);\r\n }, [filteredData, page, pageSize, serverMode]);\r\n\r\n /* ---------------- FINAL ROW SOURCE ---------------- */\r\n const rows = serverMode ? serverRows : pagedClientRows;\r\n const totalRows = serverMode ? serverTotal : filteredData.length;\r\n const totalPages = serverMode\r\n ? serverTotalPages\r\n : Math.max(1, Math.ceil(totalRows / pageSize));\r\n\r\n /* ---------------- SELECTION ---------------- */\r\n const toggleSelect = useCallback((id: GridRowId) => {\r\n const key = String(id);\r\n setSelected((prev) => {\r\n const s = new Set(prev);\r\n s.has(key) ? s.delete(key) : s.add(key);\r\n return s;\r\n });\r\n }, []);\r\n\r\n const selectAllOnPage = useCallback(\r\n (rows: T[]) => {\r\n setSelected((prev) => {\r\n const s = new Set(prev);\r\n rows.forEach((r) => s.add(String(r[rowKey])));\r\n return s;\r\n });\r\n },\r\n [rowKey],\r\n );\r\n\r\n const deselectAllOnPage = useCallback(\r\n (rows: T[]) => {\r\n setSelected((prev) => {\r\n const s = new Set(prev);\r\n rows.forEach((r) => s.delete(String(r[rowKey])));\r\n return s;\r\n });\r\n },\r\n [rowKey],\r\n );\r\n\r\n /* ---------------- SORT ---------------- */\r\n const changeSort = useCallback((key: string) => {\r\n setSortBy((p: SortState) =>\r\n p.key !== key\r\n ? { key, dir: \"asc\" }\r\n : p.dir === \"asc\"\r\n ? { key, dir: \"desc\" }\r\n : { key: null, dir: \"asc\" },\r\n );\r\n setPage(1);\r\n }, []);\r\n\r\n /* ---------------- ADVANCED FILTER ---------------- */\r\n const setColumnAdvanceFilter = useCallback(\r\n (column: string, filter: AdvancedFilterInput | null) => {\r\n setAdvanceFilters((prev: AdvancedFilterState) => {\r\n if (!filter) {\r\n const c = { ...prev };\r\n delete c[column];\r\n return c;\r\n }\r\n return { ...prev, [column]: { column, ...filter } };\r\n });\r\n setPage(1);\r\n },\r\n [],\r\n );\r\n\r\n // -----------------Facet Filter-------------------\r\n const loadFacets = async (columnKey: string) => {\r\n if (facetItems[columnKey]) return;\r\n\r\n const column = columns.find((c) => c.key === columnKey);\r\n\r\n if (!column?.facetedFilter) return;\r\n\r\n const { items, fetcher, mapItem } = column.facetedFilter;\r\n\r\n if (items) {\r\n setFacetItems((prev) => ({\r\n ...prev,\r\n [columnKey]: items,\r\n }));\r\n return;\r\n }\r\n\r\n if (fetcher) {\r\n setFacetLoading((prev) => ({\r\n ...prev,\r\n [columnKey]: true,\r\n }));\r\n\r\n const result = await fetcher();\r\n\r\n const raw = Array.isArray(result) ? result : result?.[columnKey] || [];\r\n\r\n const normalized = raw.map(\r\n mapItem ||\r\n ((r: any) => ({\r\n id: r.id,\r\n name: r.name,\r\n })),\r\n );\r\n\r\n setFacetItems((prev) => ({\r\n ...prev,\r\n [columnKey]: normalized,\r\n }));\r\n\r\n setFacetLoading((prev) => ({\r\n ...prev,\r\n [columnKey]: false,\r\n }));\r\n }\r\n};\r\n\r\n const toggleFacetFilter = (columnKey: string, item: FacetItem) => {\r\n setFacetFilters((prev) => {\r\n const values = prev[columnKey] ?? [];\r\n\r\n const exists = values.some((v) => v.id === item.id);\r\n\r\n const nextValues = exists\r\n ? values.filter((v) => v.id !== item.id)\r\n : [...values, item];\r\n\r\n if (!nextValues.length) {\r\n const copy = { ...prev };\r\n delete copy[columnKey];\r\n return copy;\r\n }\r\n\r\n return {\r\n ...prev,\r\n [columnKey]: nextValues,\r\n };\r\n });\r\n\r\n setPage(1);\r\n };\r\n const removeFacetFilter = (columnKey: string, id: any) => {\r\n setFacetFilters((prev) => {\r\n const values = prev[columnKey] || [];\r\n\r\n const next = values.filter((v) => v.id !== id);\r\n\r\n if (!next.length) {\r\n const copy = { ...prev };\r\n delete copy[columnKey];\r\n return copy;\r\n }\r\n\r\n return {\r\n ...prev,\r\n [columnKey]: next,\r\n };\r\n });\r\n };\r\n const clearFacetFilters = () => {\r\n setFacetFilters({});\r\n };\r\n\r\n /* ---------------- Switch FILTER ---------------- */\r\n const toggleSwitchFilter = useCallback((key: string) => {\r\n setSwitchFilters((prev) => ({\r\n ...prev,\r\n [key]: !prev[key],\r\n }));\r\n setPage(1);\r\n }, []);\r\n const switchQuery = useMemo(() => {\r\n if (!switchFiltersConfig) return {};\r\n\r\n const query: Record<string, any> = {};\r\n\r\n switchFiltersConfig.forEach((filter) => {\r\n const state = switchFilters[filter.key];\r\n\r\n query[filter.queryParam] = state\r\n ? (filter.trueValue ?? true)\r\n : (filter.falseValue ?? false);\r\n });\r\n\r\n return query;\r\n }, [switchFilters, switchFiltersConfig]);\r\n /* ---------------- COLUMNS ---------------- */\r\n const visibleColumns = useMemo(\r\n () =>\r\n colState\r\n .filter((c: GridColumnState<T>) => c.visible)\r\n .sort((a: any, b: any) => a.order - b.order),\r\n [colState],\r\n );\r\n\r\n const updateColumn = useCallback(\r\n (key: GridColumn<T>[\"key\"], patch: Partial<GridColumnState<T>>) => {\r\n setColState((prev) =>\r\n prev.map((c) => (c.key === key ? { ...c, ...patch } : c)),\r\n );\r\n },\r\n [],\r\n );\r\n\r\n /* ---------------- EXPAND ---------------- */\r\n const toggleExpand = useCallback((id: GridRowId) => {\r\n setExpanded((prev: Set<GridRowId>) => {\r\n const s = new Set(prev);\r\n s.has(id) ? s.delete(id) : s.add(id);\r\n return s;\r\n });\r\n }, []);\r\n\r\n /* ---------------- RETURN API ---------------- */\r\n return {\r\n // paging\r\n page,\r\n setPage,\r\n pageSize,\r\n setPageSize,\r\n totalRows,\r\n totalPages,\r\n\r\n // search\r\n search,\r\n setSearch,\r\n debouncedSearch,\r\n\r\n // sorting\r\n sortBy,\r\n changeSort,\r\n\r\n // grouping\r\n groupBy,\r\n setGroupBy,\r\n\r\n // advanced filters\r\n advanceFilters,\r\n setColumnAdvanceFilter,\r\n\r\n // selection\r\n selected,\r\n toggleSelect,\r\n selectAllOnPage,\r\n deselectAllOnPage,\r\n\r\n // expand\r\n expanded,\r\n toggleExpand,\r\n\r\n // New Record Button\r\n addNewRecord,\r\n\r\n // columns\r\n colState,\r\n visibleColumns,\r\n updateColumn,\r\n setColState,\r\n\r\n // data\r\n rows,\r\n\r\n // server setters (ONLY used in serverMode)\r\n setServerRows,\r\n setServerTotal,\r\n setServerTotalPages, // <-- new\r\n\r\n // flags\r\n serverMode,\r\n rowKey,\r\n\r\n // empty state\r\n emptyState,\r\n setEmptyState,\r\n\r\n // switch filters\r\n switchFilters,\r\n toggleSwitchFilter,\r\n setSwitchFilters,\r\n switchQuery,\r\n switchFiltersConfig,\r\n\r\n // facet filter\r\n facetItems,\r\n facetFilters,\r\n toggleFacetFilter,\r\n loadFacets,\r\n facetLoading,\r\n\r\n removeFacetFilter,\r\n clearFacetFilters,\r\n };\r\n}\r\n"],"mappings":"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","names":["import_react","import_react","import_react","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","React","indG","import_jsx_runtime","import_jsx_runtime","import_react","rows"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/components/PamGrid.tsx","../src/components/AdvanceFilter.tsx","../src/core/utils.ts","../src/components/FacetFilter.tsx","../src/components/PamHeaderOption.tsx","../src/components/FilterApplied.tsx","../src/components/icons/Minimize.tsx","../src/components/icons/Compress.tsx","../src/components/EmptyState.tsx","../src/components/icons/ArrowFromBottonToRight.tsx","../src/core/Tooltip.ts","../src/components/BulkAction.tsx","../src/components/Paginantion.tsx","../src/components/dropdown/PamDropdown.tsx","../src/components/MainFilter.tsx","../src/components/FallBack.tsx","../src/components/icons/ColumnIcon.tsx","../src/components/ColumnVisibilityPanel.tsx","../src/core/useGridCore.ts"],"sourcesContent":["// css\r\nimport \"./styles/pam.core.css\";\r\nimport \"./styles/pam.grid.css\";\r\n\r\n// Components\r\nexport { default as PamGrid } from \"./components/PamGrid\";\r\nexport { default as ColumnVisibilityPanel } from \"./components/ColumnVisibilityPanel\";\r\nexport { default as PamHeaderOption } from \"./components/PamHeaderOption\";\r\nexport { default as FilterApplied } from \"./components/FilterApplied\";\r\nexport { default as PamDropDown } from \"./components/dropdown/PamDropdown\";\r\n\r\n// Hook\r\nexport { useGridCore } from \"./core/useGridCore\";\r\n\r\n// Types\r\nexport type {\r\n GridColumn,\r\n GridRowId,\r\n PinnedPosition,\r\n AdvancedFilter,\r\n AdvancedFilterType,\r\n TableAction,\r\n GridFetaures,\r\n} from \"./types/grid.types\";\r\n\r\nexport type {\r\n PamDropdownItem,\r\n PamDropdownPlacement,\r\n} from \"./types/PamDropdown.types\";\r\n\r\nexport type { PamGridProps } from \"./types/grid.props\";\r\n\r\n// Helpers (optional but recommended)\r\nexport {\r\n getAdvancedFilterType,\r\n getLeftOffset,\r\n getRightOffset,\r\n} from \"./core/utils\";\r\n","import React, { useEffect, useRef, useState } from \"react\";\r\nimport PamHeaderOption from \"./PamHeaderOption\";\r\nimport FilterApplied from \"./FilterApplied\";\r\nimport { PamGridProps } from \"../types/grid.props\";\r\nimport {\r\n ActiveCell,\r\n GridColumn,\r\n GridRowId,\r\n GroupKey,\r\n} from \"../types/grid.types\";\r\nimport {\r\n getLeftOffset,\r\n getNestedValue,\r\n getRightOffset,\r\n resolveValue,\r\n useLocalStorageState,\r\n} from \"../core/utils\";\r\nimport Minimize from \"./icons/Minimize\";\r\nimport Compress from \"./icons/Compress\";\r\nimport \"../styles/pam.core.css\";\r\nimport \"../styles/pam.grid.css\";\r\nimport EmptyState from \"./EmptyState\";\r\nimport BoxIcon from \"../assets/icons/Box.svg\";\r\nimport NoRecord from \"../assets/icons/NoSearchResult.svg\";\r\nimport BulkAction from \"./BulkAction\";\r\nimport { hideTooltip, showTooltip } from \"../core/Tooltip\";\r\nimport Pagination from \"./Paginantion\";\r\nimport MainFilter, { TableAction } from \"./MainFilter\";\r\nimport { safeGridHandle } from \"./FallBack\";\r\n\r\n/*\r\n Props:\r\n - columns: [{ key, title, width, pinned: 'left'|'right'|null, sortable, render, aggregate }]\r\n - data OR serverMode + fetcher\r\n - rowKey\r\n - features: { selection, search, export, pagination, pinning, resizing, reorder, grouping, aggregation, expand }\r\n - renderExpanded\r\n*/\r\nconst PamGrid = <T extends Record<string, unknown>>({\r\n columns = [],\r\n grid,\r\n loading = false,\r\n features = {},\r\n rowKey = \"id\",\r\n isDropdown = false,\r\n maxHeight = \"80vh\",\r\n isFetching = false,\r\n addNew,\r\n renderExpanded,\r\n}: PamGridProps<T>) => {\r\n const [isFullScreen, setFullScreen] = useState<boolean>(false);\r\n const [draggingCol, setDraggingCol] = useState<string | null>(null);\r\n const [activeCell, setActiveCell] = useState<ActiveCell<T> | null>(null);\r\n const [isBulkAction, setBulkAction] = useLocalStorageState<boolean>(\r\n \"bulk-data-toggle\",\r\n false,\r\n );\r\n\r\n const wrapperRef = useRef<HTMLDivElement | null>(null);\r\n\r\n const dragState = useRef<{ from: GridRowId | null }>({ from: null });\r\n\r\n const {\r\n rows,\r\n page,\r\n totalPages,\r\n pageSize,\r\n setPage,\r\n setPageSize,\r\n setGroupBy,\r\n groupBy,\r\n search,\r\n setSearch,\r\n selected,\r\n toggleSelect,\r\n selectAllOnPage,\r\n deselectAllOnPage,\r\n changeSort,\r\n sortBy,\r\n visibleColumns,\r\n colState,\r\n updateColumn,\r\n totalRows,\r\n expanded,\r\n toggleExpand,\r\n setColState,\r\n emptyState,\r\n addNewRecord,\r\n advanceFilters,\r\n setColumnAdvanceFilter,\r\n } = grid ?? safeGridHandle;\r\n\r\n // resizing via mouse down on handle\r\n const onResizeMouseDown = (\r\n e: React.MouseEvent,\r\n key: GridColumn<T>[\"key\"],\r\n ) => {\r\n e.preventDefault();\r\n const startX = e.clientX;\r\n const col = colState.find((c: GridColumn<T>) => c.key === key);\r\n if (!col) return;\r\n const startWidth = col.width || 120;\r\n\r\n const onMove = (ev: MouseEvent) => {\r\n const diff = ev.clientX - startX;\r\n const newWidth = Math.max(60, startWidth + diff);\r\n updateColumn(key, { width: newWidth });\r\n };\r\n\r\n const onUp = () => {\r\n document.removeEventListener(\"mousemove\", onMove);\r\n document.removeEventListener(\"mouseup\", onUp);\r\n };\r\n document.addEventListener(\"mousemove\", onMove);\r\n document.addEventListener(\"mouseup\", onUp);\r\n };\r\n\r\n const onDragStart = (e: React.DragEvent, key: GridRowId) => {\r\n dragState.current.from = key;\r\n e.dataTransfer.effectAllowed = \"move\";\r\n };\r\n const onDrop = (e: React.DragEvent, toKey: GridColumn<T>[\"key\"]) => {\r\n e.preventDefault();\r\n const fromKey = dragState.current.from;\r\n if (!fromKey || fromKey === toKey) return;\r\n const from = colState.find((c) => c.key === fromKey);\r\n const to = colState.find((c) => c.key === toKey);\r\n if (!from || !to) return;\r\n // swap orders\r\n setColState((prev) => {\r\n const next = prev.map((p) => ({ ...p }));\r\n const f = next.find((p) => p.key === fromKey);\r\n const t = next.find((p) => p.key === toKey);\r\n if (!f || !t) return prev;\r\n const tmp = f.order;\r\n f.order = t.order;\r\n t.order = tmp;\r\n return next.sort((a, b) => a.order - b.order);\r\n });\r\n };\r\n\r\n // group & aggregate (simple client-side grouping by column key)\r\n // const groupBy = features.groupByKey || null;\r\n const groupedRows = React.useMemo(() => {\r\n if (!groupBy) return null;\r\n\r\n const column = visibleColumns.find((col) => col.key === groupBy.key);\r\n\r\n const map: Record<string, { rawValue: GroupKey; items: T[] }> = {};\r\n\r\n rows.forEach((r: T) => {\r\n // 1) Get raw group value\r\n const rawValue: GroupKey = column?.groupByValue\r\n ? column.groupByValue(r)\r\n : column?.nestedPath\r\n ? getNestedValue(r, column.nestedPath)\r\n : (r[groupBy.key as keyof T] as any);\r\n\r\n // 2) Convert rawValue into string key\r\n const groupKey =\r\n rawValue === null || rawValue === undefined\r\n ? \"unknown\"\r\n : typeof rawValue === \"object\"\r\n ? String((rawValue as any)?.id ?? JSON.stringify(rawValue))\r\n : String(rawValue);\r\n\r\n // 3) init group\r\n if (!map[groupKey]) {\r\n map[groupKey] = { rawValue, items: [] };\r\n }\r\n\r\n // 4) push row\r\n map[groupKey].items.push(r);\r\n });\r\n\r\n // 5) build final grouped result\r\n return Object.entries(map).map(([key, group]) => {\r\n const aggregates: Partial<Record<GridColumn<T>[\"key\"], string>> = {};\r\n\r\n visibleColumns.forEach((col: GridColumn<T>) => {\r\n if (col.aggregate) {\r\n aggregates[col.key] = col.aggregate(\r\n group.items.map((it) => it[col.key as keyof T] as number),\r\n );\r\n }\r\n });\r\n\r\n const displayLabel = column?.groupLabel\r\n ? column.groupLabel(group.rawValue, group.items)\r\n : String(key);\r\n\r\n return {\r\n key,\r\n rawValue: group.rawValue,\r\n displayLabel,\r\n items: group.items,\r\n aggregates,\r\n };\r\n });\r\n }, [rows, groupBy, visibleColumns]);\r\n\r\n const currentRows = rows;\r\n\r\n const gridHeight = isFullScreen\r\n ? \"calc(100vh - 120px)\"\r\n : \"calc(100vh - 220px)\";\r\n\r\n useEffect(() => {\r\n document.body.style.overflow = isFullScreen ? \"hidden\" : \"\";\r\n }, [isFullScreen]);\r\n\r\n return (\r\n <div\r\n className={`pms-grid ${\r\n isFullScreen ? \"card card-action card-fullscreen p-4\" : \"\"\r\n }`}\r\n >\r\n <div className=\"row align-items-center g-2\">\r\n {/* LEFT SECTION */}\r\n <div className=\"col-12 col-md-8 col-lg-9\">\r\n <div className=\"row\">\r\n {features.search && (\r\n <div className=\"col-8 col-md-4\">\r\n <input\r\n type=\"search\"\r\n className=\"form-control form-control-sm\"\r\n placeholder=\"Search...\"\r\n value={search}\r\n onChange={(e) => setSearch(e.target.value)}\r\n />\r\n </div>\r\n )}\r\n\r\n <div className=\"col-4 col-md-4\">\r\n <MainFilter gridFetaures={features} grid={grid} />\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {/* RIGHT SECTION */}\r\n <div className=\"col-12 col-md-4 col-lg-3\">\r\n <div className=\"d-flex justify-content-md-end justify-content-between align-items-center gap-2 mt-2 mt-md-0\">\r\n {addNewRecord && (\r\n <button\r\n type=\"button\"\r\n className={`${\r\n addNewRecord?.class || \"btn btn-sm btn-label-secondary\"\r\n } d-flex align-items-center gap-1`}\r\n onClick={addNewRecord.onClick}\r\n onMouseEnter={(e) =>\r\n showTooltip(addNewRecord?.label, e.clientX, e.clientY)\r\n }\r\n onMouseMove={(e) =>\r\n showTooltip(addNewRecord?.label, e.clientX, e.clientY)\r\n }\r\n onMouseLeave={hideTooltip}\r\n >\r\n <span\r\n className={`icon-base ${\r\n addNewRecord?.icon || \"bx bx-plus-circle\"\r\n }`}\r\n ></span>\r\n\r\n {addNewRecord?.name && (\r\n <span className=\"d-none d-sm-inline\">\r\n {addNewRecord?.name}\r\n </span>\r\n )}\r\n </button>\r\n )}\r\n\r\n <div className=\"flex-shrink-0\">\r\n {isFullScreen ? (\r\n <Minimize onClick={() => setFullScreen(!isFullScreen)} />\r\n ) : (\r\n <Compress onClick={() => setFullScreen(!isFullScreen)} />\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div className=\"d-flex flex-row gap-1\">\r\n {selected.size > 0 && features.bulkActionsConfig && (\r\n <BulkAction records={selected} actions={features.bulkActionsConfig} />\r\n )}\r\n <FilterApplied\r\n groupBy={groupBy}\r\n removeGroupby={() => setGroupBy(null)}\r\n advance={advanceFilters}\r\n removeFilter={(columnKey) =>\r\n setColumnAdvanceFilter(String(columnKey), null)\r\n }\r\n grid={grid}\r\n />\r\n </div>\r\n {/* Table-Start*/}\r\n <div\r\n ref={wrapperRef}\r\n className=\"grid-wrapper text-nowrap border\"\r\n style={{\r\n height: gridHeight,\r\n }}\r\n >\r\n <table\r\n className=\"table table-sm rounded mb-0 position-relative\"\r\n style={{ width: \"max-content\", minWidth: \"100%\" }}\r\n >\r\n <thead\r\n className=\"bg-light-secondary border p-2 bg-light rounded\"\r\n style={{ position: \"sticky\", top: 0, zIndex: 10 }}\r\n >\r\n <tr className=\"p-2\">\r\n {features.IsNumbering && <th className=\"text-center\">#</th>}\r\n {features.expand && (\r\n <th className=\"text-center ticky-action-column\">\r\n <i className=\"bx bx-collapse-vertical d-none\"></i>\r\n </th>\r\n )}\r\n {isBulkAction && (\r\n <th\r\n style={{ width: 32, position: \"sticky\", top: 0, zIndex: 10 }}\r\n className=\"text-center ticky-action-column\"\r\n >\r\n <input\r\n type=\"checkbox\"\r\n className=\"form-check-input mx-3\"\r\n checked={\r\n currentRows.length > 0 &&\r\n currentRows.every((r) => selected.has(String(r[rowKey])))\r\n }\r\n onChange={(e) =>\r\n e.target.checked\r\n ? selectAllOnPage(currentRows)\r\n : deselectAllOnPage(currentRows)\r\n }\r\n disabled={isFetching}\r\n />\r\n </th>\r\n )}\r\n\r\n {visibleColumns.map((col) => {\r\n const style: React.CSSProperties = {\r\n minWidth: col.width || 120,\r\n width: col.width,\r\n ...(col.pinned && { position: \"sticky\" }),\r\n ...(col.pinned === \"left\" && {\r\n left: `${getLeftOffset(colState, col.key)}px`,\r\n }),\r\n ...(col.pinned === \"right\" && {\r\n right: `${getRightOffset(colState, col.key)}px`,\r\n }),\r\n };\r\n return (\r\n <th\r\n key={String(col.key)}\r\n draggable={features.reorder}\r\n onDragStart={(e) => {\r\n setDraggingCol(String(col.key));\r\n onDragStart(e, String(col.key));\r\n }}\r\n onDragEnd={() => setDraggingCol(null)}\r\n onDragOver={(e) => e.preventDefault()}\r\n onDrop={(e) => onDrop(e, col.key)}\r\n className={`pms-col-header vs-th\r\n ${features.reorder ? \"cursor-grab\" : \"\"}\r\n ${draggingCol === col.key ? \"cursor-grabbing\" : \"\"}\r\n ${col.pinned ? `pinned pinned-${col.pinned}` : \"\"}\r\n `}\r\n style={style}\r\n >\r\n <div\r\n className={`d-flex align-items-center justify-content-${col.align ?? \"between\"} px-1 rounded ${\r\n col.pinned ? \"z-6\" : \"\"\r\n }`}\r\n >\r\n <div\r\n onClick={() =>\r\n col.sortable && changeSort(String(col.key))\r\n }\r\n className={col.sortable ? \"cursor-pointer\" : \"\"}\r\n >\r\n <small>{col.title}</small>\r\n\r\n {sortBy.key === col.key && (\r\n <i\r\n className={`bx bx-sm ${\r\n sortBy.dir === \"asc\"\r\n ? \"bxs-chevron-up\"\r\n : \"bxs-chevron-down\"\r\n } cursor-pointer`}\r\n ></i>\r\n )}\r\n </div>\r\n\r\n <i\r\n className=\"bx bx-move-horizontal text-white cursor-resize\"\r\n onMouseDown={(e) => onResizeMouseDown(e, col.key)}\r\n ></i>\r\n\r\n <div className=\"d-flex align-items-center gap-1\">\r\n {features.pinning && (\r\n <PamHeaderOption\r\n currentColumn={col}\r\n gridFetaures={features}\r\n grid={grid}\r\n />\r\n )}\r\n </div>\r\n </div>\r\n </th>\r\n );\r\n })}\r\n\r\n {features.actions && (\r\n <th\r\n className=\"text-center sticky-action-column vs-th bg-white fw-semibold th-lastChild\"\r\n style={{ position: \"sticky\", right: 0, zIndex: 10 }}\r\n >\r\n Action\r\n </th>\r\n )}\r\n </tr>\r\n </thead>\r\n\r\n <tbody>\r\n {loading || rows.length === 0\r\n ? Array.from({ length: 1 }).map((_, index) => (\r\n <tr className=\"\" key={`row-${index}`}>\r\n <td\r\n key={index}\r\n colSpan={\r\n visibleColumns.length +\r\n (features.IsNumbering ? 1 : 0) +\r\n (features.selection ? 1 : 0) +\r\n (features.actions ? 1 : 0)\r\n }\r\n className=\"text-center py-4 \"\r\n >\r\n <div className=\" d-flex justify-content-center align-items-center vh-50\">\r\n <div>\r\n {loading ? (\r\n <p>Loading...</p>\r\n ) : !loading && search ? (\r\n <EmptyState\r\n title={emptyState.title}\r\n description={`No results found for \"${search}\"`}\r\n imgSrc={NoRecord}\r\n />\r\n ) : (\r\n <EmptyState\r\n title={emptyState.title}\r\n imgSrc={BoxIcon}\r\n description={emptyState.description}\r\n />\r\n )}\r\n </div>\r\n </div>\r\n </td>\r\n </tr>\r\n ))\r\n : !loading && groupBy && groupedRows && groupedRows.length > 0\r\n ? groupedRows.map((g, indG) => (\r\n <React.Fragment key={g.key}>\r\n <tr className=\"pam-bg-light-primary\">\r\n <td\r\n colSpan={\r\n visibleColumns.length +\r\n (features.selection ? 1 : 0) +\r\n (features.actions ? columns.length : 0)\r\n }\r\n className=\"text-start pinned pinned-left tr-group\"\r\n >\r\n <strong>{g.displayLabel}</strong>\r\n {features.aggregation &&\r\n Object.keys(g.aggregates).length > 0 && (\r\n <small className=\"ms-3 text-muted \">\r\n {Object.entries(g.aggregates)\r\n .map(([k, v]) => `${k}: ${v}`)\r\n .join(\" | \")}\r\n </small>\r\n )}\r\n </td>\r\n </tr>\r\n {g.items.map((row, indG) => renderRow(row, indG))}\r\n </React.Fragment>\r\n ))\r\n : currentRows.map((row, ind) => renderRow(row, ind))}\r\n </tbody>\r\n {isFetching && (\r\n <div className=\"pam-overlay show d-flex justify-content-center align-items-center\">\r\n <div className=\"p-3 bg-light rounded\">\r\n <div className=\"spinner-border spinner-border-sm text-white\" />\r\n <span className=\"ms-2 te text-white fw-2 text-light fw-bolder\">\r\n Loading....\r\n </span>\r\n </div>\r\n </div>\r\n )}\r\n </table>\r\n </div>\r\n {/* Table-End */}\r\n {features.pagination && (\r\n <div className=\"d-flex justify-content-between align-items-center mt-2\">\r\n <div className=\"d-flex flex-row align-items-center gap-2\">\r\n {features.pageSizeSelector && (\r\n <select\r\n className=\"form-select form-select-sm\"\r\n style={{ width: \"80px\" }}\r\n value={pageSize}\r\n onChange={(e) => setPageSize(Number(e.target.value))}\r\n >\r\n {[20, 50, 100].map((n) => (\r\n <option key={n} value={n}>\r\n {n}\r\n </option>\r\n ))}\r\n </select>\r\n )}{\" \"}\r\n <small>{rows.length} Record</small>\r\n </div>\r\n <div>\r\n <Pagination\r\n currentPage={page}\r\n totalPages={totalRows}\r\n onPageChange={setPage}\r\n />\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n\r\n // render a single row (function hoisted so it can reference visibleColumns)\r\n function renderRow(row: T, ind: number) {\r\n const isSelected = selected.has(String(row[rowKey]));\r\n const isExpanded = expanded.has(String(row[rowKey]));\r\n\r\n return (\r\n <React.Fragment key={String(row[rowKey])}>\r\n <tr>\r\n {features.IsNumbering && (\r\n <td className=\"text-center align-middle p-2\">\r\n <small className=\"text-secondry\">{ind + 1}</small>\r\n </td>\r\n )}\r\n {/* Expand toggle next to selection */}\r\n {features.expand && (\r\n <td className=\"text-center align-middle \">\r\n <button\r\n type=\"button\"\r\n className=\"btn btn-link p-0 border-none text-secondary\"\r\n onClick={() => toggleExpand(String(row[rowKey]))}\r\n >\r\n <i\r\n className={`bx ${\r\n isExpanded ? \"bxs-chevron-up\" : \"bxs-chevron-down\"\r\n } bx-sm`}\r\n ></i>\r\n </button>\r\n </td>\r\n )}\r\n {/* Selection checkbox (always left) */}\r\n {isBulkAction && (\r\n <td className=\"text-center align-middle p-2\">\r\n <input\r\n type=\"checkbox\"\r\n className=\"form-check-input\"\r\n checked={isSelected}\r\n onChange={() => toggleSelect(String(row[rowKey]))}\r\n />\r\n </td>\r\n )}\r\n {/* Data columns */}\r\n {visibleColumns.map((col) => {\r\n const style: React.CSSProperties = {\r\n minWidth: col.minWidth || 120, // minimum width\r\n maxWidth: col.maxWidth || 200, // maximum width (optional)\r\n width: col.width || \"auto\", // preferred width\r\n overflow: \"hidden\", // hide overflow\r\n textOverflow: \"ellipsis\",\r\n };\r\n\r\n if (col.pinned) style.position = \"sticky\";\r\n\r\n if (col.pinned === \"left\")\r\n style.left = `${getLeftOffset(colState, col.key)}px`;\r\n\r\n if (col.pinned === \"right\")\r\n style.right = `${getRightOffset(colState, col.key)}px`;\r\n\r\n const isActive =\r\n activeCell?.row[rowKey] === row[rowKey] &&\r\n activeCell?.column.key === col.key;\r\n\r\n return (\r\n <td\r\n key={String(col.key)}\r\n style={style}\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n setActiveCell({\r\n row,\r\n column: col,\r\n });\r\n col.onCellClick && col.onCellClick(row, col);\r\n }}\r\n className={`${col.className ?? \"\"} ${\r\n col.pinned\r\n ? \"pinned-left px-3 bg-white pms-grid td pinned\"\r\n : \"px-3\"\r\n } ${isActive ? \"grid-cell-active\" : \"\"} cursor-pointer`}\r\n >\r\n {col.render ? col.render(row) : (String(row[col.key]) ?? \"\")}\r\n </td>\r\n );\r\n })}\r\n\r\n {/* Actions column (always right) */}\r\n {features.actions && (\r\n <td\r\n className=\"text-center sticky-action-column bg-white td-lastChild\"\r\n style={{\r\n position: \"sticky\",\r\n right: 0,\r\n zIndex: 2,\r\n width: \"1%\",\r\n whiteSpace: \"nowrap\",\r\n }}\r\n >\r\n {isDropdown ? (\r\n <div className=\"text-center\">\r\n <TableAction gridFetaures={features} row={row} />\r\n </div>\r\n ) : (\r\n <div\r\n className=\"d-inline-flex justify-content-center align-items-center gap-2\"\r\n style={{ minWidth: \"fit-content\", padding: \"0 4px\" }}\r\n >\r\n {Array.isArray(features.actions)\r\n ? features.actions\r\n .filter((act) => {\r\n const visible = resolveValue(\r\n act.isVisible ?? true,\r\n row,\r\n );\r\n return visible;\r\n })\r\n .map((act, i) => {\r\n const label = resolveValue(act.label, row);\r\n const icon = resolveValue(act.icon, row);\r\n const className = resolveValue(act.className, row);\r\n const disabled = resolveValue(\r\n act.disabled ?? false,\r\n row,\r\n );\r\n\r\n return act.onlyIcon ? (\r\n <i\r\n key={i}\r\n title={label}\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n if (!disabled) act.onClick?.(row);\r\n }}\r\n className={`${icon} ${disabled ? \"opacity-50\" : \"\"}`}\r\n style={{\r\n cursor: disabled ? \"not-allowed\" : \"pointer\",\r\n }}\r\n onMouseMove={(e) =>\r\n typeof label === \"string\" &&\r\n showTooltip(label, e.clientX, e.clientY)\r\n }\r\n onMouseLeave={hideTooltip}\r\n />\r\n ) : (\r\n <button\r\n key={i}\r\n className={className}\r\n disabled={disabled}\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n if (!disabled) act.onClick?.(row);\r\n }}\r\n >\r\n {icon && <i className={`${icon} me-1`} />}\r\n {label}\r\n </button>\r\n );\r\n })\r\n : typeof features.actions === \"function\"\r\n ? features.actions(row, toggleExpand)\r\n : null}\r\n </div>\r\n )}\r\n </td>\r\n )}\r\n </tr>\r\n\r\n {/* 5. Expanded row content (full width) */}\r\n {isExpanded && renderExpanded && (\r\n <tr className=\"expanded-row\">\r\n <td\r\n colSpan={\r\n visibleColumns.length +\r\n (features.selection ? 1 : 0) +\r\n (features.expand ? 1 : 0) +\r\n (features.actions ? 1 : 0)\r\n }\r\n >\r\n {renderExpanded(row)}\r\n </td>\r\n </tr>\r\n )}\r\n </React.Fragment>\r\n );\r\n }\r\n};\r\n\r\nexport default PamGrid;\r\n","import { useState, useEffect } from \"react\";\r\nimport { AdvancedFilterInput, AdvancedFilterProps } from \"../types/grid.props\";\r\n\r\nconst OPERATORS = {\r\n number: [\r\n { key: \"eq\", label: \"Equals\" },\r\n { key: \"neq\", label: \"Not Equal\" },\r\n { key: \"gt\", label: \"Greater Than\" },\r\n { key: \"gte\", label: \"Greater or Equal\" },\r\n { key: \"lt\", label: \"Less Than\" },\r\n { key: \"lte\", label: \"Less or Equal\" },\r\n { key: \"between\", label: \"Between\" },\r\n ],\r\n text: [\r\n { key: \"contains\", label: \"Contains\" },\r\n { key: \"starts\", label: \"Starts With\" },\r\n { key: \"ends\", label: \"Ends With\" },\r\n { key: \"eq\", label: \"Equals\" },\r\n ],\r\n date: [\r\n { key: \"before\", label: \"Before\" },\r\n { key: \"after\", label: \"After\" },\r\n { key: \"between\", label: \"Between\" },\r\n ],\r\n};\r\n\r\nexport function AdvanceFilter({\r\n type = \"number\",\r\n value,\r\n onApply,\r\n onClear,\r\n}: AdvancedFilterProps) {\r\n const [operation, setOperation] = useState<string | undefined>(\"\");\r\n const [v1, setV1] = useState<string>(\"\");\r\n const [v2, setV2] = useState<string>(\"\");\r\n\r\n useEffect(() => {\r\n if (!value) {\r\n setOperation(\"\");\r\n setV1(\"\");\r\n setV2(\"\");\r\n return;\r\n }\r\n\r\n setOperation(value.operation);\r\n setV1(value.value ?? value.from ?? \"\");\r\n setV2(value.to ?? \"\");\r\n }, [value]);\r\n\r\n const apply = () => {\r\n if (!operation) return;\r\n\r\n onApply(\r\n operation === \"between\"\r\n ? { operation, from: v1, to: v2 }\r\n : { operation, value: v1 }\r\n );\r\n };\r\n\r\n if (!type) return null;\r\n\r\n return (\r\n <div style={{ width: 270 }} onClick={(e) => e.stopPropagation()}>\r\n <div className=\"mb-2\">\r\n <label className=\"form-label\">Condition</label>\r\n <select\r\n className=\"form-select form-select-sm\"\r\n value={operation}\r\n onChange={(e) => setOperation(e.target.value)}\r\n >\r\n <option value=\"\">Select</option>\r\n {OPERATORS[type].map((o) => (\r\n <option key={o.key} value={o.key}>\r\n {o.label}\r\n </option>\r\n ))}\r\n </select>\r\n </div>\r\n\r\n {operation && (\r\n <div className=\"mb-2\">\r\n <label className=\"form-label\">Value</label>\r\n\r\n {operation !== \"between\" ? (\r\n <input\r\n type={type}\r\n className=\"form-control form-control-sm\"\r\n value={v1}\r\n onChange={(e) => setV1(e.target.value)}\r\n />\r\n ) : (\r\n <div className=\"d-flex gap-2\">\r\n <input\r\n type={type}\r\n className=\"form-control form-control-sm\"\r\n placeholder=\"From\"\r\n value={v1}\r\n onChange={(e) => setV1(e.target.value)}\r\n />\r\n <input\r\n type={type}\r\n className=\"form-control form-control-sm\"\r\n placeholder=\"To\"\r\n value={v2}\r\n onChange={(e) => setV2(e.target.value)}\r\n />\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n\r\n <div className=\"d-flex justify-content-between mt-3\">\r\n <button className=\"btn btn-label-secondary btn-xs\" onClick={onClear}>\r\n Clear\r\n </button>\r\n <button className=\"btn btn-primary btn-xs\" onClick={apply}>\r\n Apply\r\n </button>\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import { useEffect, useState } from \"react\";\r\nimport {\r\n AdvancedFilter,\r\n AdvancedFilterType,\r\n GridColumn,\r\n} from \"../types/grid.types\";\r\n\r\nexport function getAdvancedFilterType<T extends object>(\r\n column: GridColumn<T>,\r\n): AdvancedFilterType | null {\r\n const f = column.enableAdvancedFilter;\r\n\r\n if (!f) return null;\r\n\r\n // enableAdvancedFilter={true}\r\n if (f === true) {\r\n return \"number\"; // default filter type\r\n }\r\n\r\n // enableAdvancedFilter={{ type: \"text\" }}\r\n return f.type;\r\n}\r\n\r\n// small helpers to compute sticky offsets\r\nexport function getLeftOffset<T extends object>(\r\n colState: GridColumn<T>[],\r\n key: GridColumn<T>[\"key\"],\r\n) {\r\n let offset = 0;\r\n\r\n const leftCols = colState\r\n .filter((c) => c.visible && c.pinned === \"left\")\r\n .sort((a, b) => a.order - b.order);\r\n\r\n for (const c of leftCols) {\r\n if (c.key === key) return offset;\r\n offset += c.width ?? 120;\r\n }\r\n\r\n return offset;\r\n}\r\n\r\nexport function getRightOffset<T extends object>(\r\n colState: GridColumn<T>[],\r\n key: GridColumn<T>[\"key\"],\r\n) {\r\n let offset = 0;\r\n\r\n const rightCols = colState\r\n .filter((c) => c.visible && c.pinned === \"right\")\r\n .sort((a, b) => b.order - a.order);\r\n\r\n for (const c of rightCols) {\r\n if (c.key === key) return offset;\r\n offset += c.width ?? 120;\r\n }\r\n\r\n return offset;\r\n}\r\n\r\nexport const getNestedValue = <T, R = unknown>(\r\n obj: T,\r\n path: string,\r\n): R | undefined => {\r\n return path.split(\".\").reduce<any>((acc, key) => acc?.[key], obj);\r\n};\r\n\r\n\r\n\r\nexport function useLocalStorageState<T>(key: string, initialValue: T) {\r\n const getValue = (): T => {\r\n try {\r\n const stored = localStorage.getItem(key);\r\n return stored ? JSON.parse(stored) : initialValue;\r\n } catch {\r\n return initialValue;\r\n }\r\n };\r\n\r\n const [value, setValue] = useState<T>(getValue);\r\n\r\n const updateValue = (newValue: T) => {\r\n setValue(newValue);\r\n localStorage.setItem(key, JSON.stringify(newValue));\r\n\r\n // SAME TAB update\r\n window.dispatchEvent(\r\n new CustomEvent(\"pam-localstorage\", {\r\n detail: { key, value: newValue },\r\n }),\r\n );\r\n };\r\n\r\n useEffect(() => {\r\n const sync = (e: any) => {\r\n // same tab\r\n if (e?.detail?.key === key) {\r\n setValue(e.detail.value);\r\n return;\r\n }\r\n\r\n // other tab\r\n if (e?.key === key) {\r\n setValue(getValue());\r\n }\r\n };\r\n\r\n window.addEventListener(\"pam-localstorage\", sync);\r\n window.addEventListener(\"storage\", sync);\r\n\r\n return () => {\r\n window.removeEventListener(\"pam-localstorage\", sync);\r\n window.removeEventListener(\"storage\", sync);\r\n };\r\n }, [key]);\r\n\r\n return [value, updateValue] as const;\r\n}\r\n\r\n\r\nexport const resolveValue = <T, R>(\r\n value: R | ((row: T) => R) | undefined,\r\n row: T\r\n): R | undefined => {\r\n return typeof value === \"function\"\r\n ? (value as (row: T) => R)(row)\r\n : value;\r\n};","import { useEffect, useMemo, useState } from \"react\";\r\nimport { FacetFilterProps } from \"../types/grid.props\";\r\n\r\nconst FacetFilter = <T extends Record<string, any>>({\r\n columnKey,\r\n grid,\r\n}: FacetFilterProps<T>) => {\r\n const {\r\n facetItems,\r\n facetFilters,\r\n toggleFacetFilter,\r\n loadFacets,\r\n facetLoading,\r\n clearFacetFilters,\r\n } = grid;\r\n\r\n const [search, setSearch] = useState(\"\");\r\n\r\n const items = facetItems?.[columnKey] || [];\r\n const selected = facetFilters?.[columnKey] || [];\r\n\r\n useEffect(() => {\r\n loadFacets(columnKey);\r\n }, [columnKey]);\r\n\r\n /* ---------------- SEARCH FILTER ---------------- */\r\n const filteredItems = useMemo(() => {\r\n if (!search) return items;\r\n\r\n const q = search.toLowerCase();\r\n\r\n return items.filter((i: any) => i.name.toLowerCase().includes(q));\r\n }, [items, search]);\r\n\r\n /* ---------------- LOADING ---------------- */\r\n if (facetLoading?.[columnKey]) {\r\n return (\r\n <div className=\"p-3 text-center\">\r\n <p className=\"text-secondary\">Loading...</p>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"pam-grid-facet-filter\" style={{ width: 240 }}>\r\n {/* Search */}\r\n <div className=\"mb-2\">\r\n <input\r\n type=\"search\"\r\n className=\"form-control form-control-sm\"\r\n placeholder=\"Search...\"\r\n value={search}\r\n onChange={(e) => setSearch(e.target.value)}\r\n />\r\n </div>\r\n\r\n {/* List */}\r\n <div\r\n className=\"list-group list-group-flush text-truncate\"\r\n style={{\r\n maxHeight: 220,\r\n overflowY: \"auto\",\r\n }}\r\n >\r\n {filteredItems.map((item: any) => {\r\n const checked = selected.some((s: any) => s.id === item.id);\r\n\r\n return (\r\n <label\r\n key={item.id}\r\n className=\"list-group-item list-group-item-action d-flex align-items-center gap-2 py-2\"\r\n >\r\n <input\r\n type=\"checkbox\"\r\n className=\"form-check-input mt-0\"\r\n checked={checked}\r\n onChange={() => toggleFacetFilter(columnKey, item)}\r\n />\r\n\r\n <span className=\"flex-grow-1\">{item.name}</span>\r\n\r\n {checked && <i className=\"bx bx-check text-primary\" />}\r\n </label>\r\n );\r\n })}\r\n\r\n {!filteredItems.length && (\r\n <div className=\"text-center text-muted py-3 small\">No results</div>\r\n )}\r\n </div>\r\n\r\n {/* Footer */}\r\n {selected.length > 0 && (\r\n <div className=\"pt-2 border-top mt-2 d-flex justify-content-end\">\r\n <button\r\n className=\"btn btn-sm btn-label-secondary\"\r\n onClick={clearFacetFilters}\r\n >\r\n Clear\r\n </button>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n};\r\n\r\nexport default FacetFilter;\r\n","import { AdvanceFilter } from \"./AdvanceFilter\";\r\nimport { PamHeaderOptionProps } from \"../types/grid.props\";\r\nimport { getAdvancedFilterType } from \"../core/utils\";\r\nimport { GridColumn, PinnedPosition } from \"../types/grid.types\";\r\nimport { PamDropdownItem } from \"../types/PamDropdown.types\";\r\nimport { PamDropDown } from \"..\";\r\nimport FacetFilter from \"./FacetFilter\";\r\n\r\nconst PamHeaderOptions = <T extends Record<string, any>>({\r\n currentColumn,\r\n gridFetaures,\r\n grid,\r\n}: PamHeaderOptionProps<T>) => {\r\n const items: PamDropdownItem[] = [];\r\n\r\n const { advanceFilters, setColumnAdvanceFilter, colState, updateColumn } =\r\n grid;\r\n\r\n const { key: columnKey } = currentColumn;\r\n\r\n // --- Pin / Unpin helpers ---\r\n const pinColumn = (key: GridColumn<T>[\"key\"], side: PinnedPosition) => {\r\n const col = colState.find((c: GridColumn<T>) => c.key === key);\r\n if (!col) return;\r\n // if already pinned to that side → unpin\r\n const newPinned = col.pinned === side ? null : side;\r\n updateColumn(key, { pinned: newPinned });\r\n };\r\n\r\n const unpinColumn = (key: GridColumn<T>[\"key\"]) => {\r\n updateColumn(key, { pinned: null });\r\n };\r\n\r\n if (gridFetaures.pinning) {\r\n items.push({\r\n key: `pined-col-${String(currentColumn.key)}`,\r\n label: \"Pinned\",\r\n icon: \"bx bx-pin\",\r\n keepOpenOnClick: true,\r\n children: [\r\n {\r\n key: `pined-col-${String(currentColumn.key)}-noPinned`,\r\n label: \"No Pinned\",\r\n icon: !currentColumn.pinned ? \"bx bx-check text-primary\" : \"\",\r\n onClick: () => unpinColumn(currentColumn.key),\r\n },\r\n {\r\n key: `pined-col-${String(currentColumn.key)}-leftPinned`,\r\n label: \"Left Pinned\",\r\n icon:\r\n currentColumn.pinned === \"left\" ? \"bx bx-check text-primary\" : \"\",\r\n onClick: () => pinColumn(currentColumn.key, \"left\"),\r\n },\r\n {\r\n key: `pined-col-${String(currentColumn.key)}-rightPinned`,\r\n label: \"Right Pinned\",\r\n icon:\r\n currentColumn.pinned === \"right\" ? \"bx bx-check text-primary\" : \"\",\r\n onClick: () => pinColumn(currentColumn.key, \"right\"),\r\n },\r\n ],\r\n });\r\n }\r\n\r\n if (currentColumn.enableAdvancedFilter) {\r\n items.push({\r\n key: `advance-filter-${String(currentColumn.key)}`,\r\n label: \"Filte By Column\",\r\n icon: \"bx bx-sm bx-filter\",\r\n children: [\r\n {\r\n key: `advance-filter-${String(currentColumn.key)}-apply`,\r\n keepOpenOnClick: true,\r\n custome: true,\r\n label: (\r\n <AdvanceFilter\r\n type={getAdvancedFilterType(currentColumn)}\r\n value={advanceFilters[String(columnKey)]}\r\n onApply={(f) => setColumnAdvanceFilter(String(columnKey), f)}\r\n onClear={() => setColumnAdvanceFilter(String(columnKey), null)}\r\n />\r\n ),\r\n },\r\n ],\r\n });\r\n }\r\n\r\n if (currentColumn.facetedFilter) {\r\n items.push({\r\n key: `facet-filter-${String(currentColumn.key)}`,\r\n label: \"Filter\",\r\n icon: \"bx bx-list-check\",\r\n children: [\r\n {\r\n key: `facet-filter-${String(currentColumn.key)}-items`,\r\n keepOpenOnClick: true,\r\n custome: true,\r\n label: <FacetFilter columnKey={String(columnKey)} grid={grid} />,\r\n },\r\n ],\r\n });\r\n }\r\n\r\n return (\r\n <PamDropDown\r\n trigger={\r\n <>\r\n <i className=\"bx bx-sm bx-dots-vertical-rounded cursor-pointer\"></i>\r\n {advanceFilters[String(columnKey)] && (\r\n <span className=\"badge rounded-pill bg-info badge-dot badge-notifications\" />\r\n )}\r\n </>\r\n }\r\n items={items}\r\n />\r\n );\r\n};\r\n\r\nexport default PamHeaderOptions;\r\n","import React from \"react\";\r\nimport { AdvancedFilterInput, FilterAppliedProps } from \"../types/grid.props\";\r\n\r\nconst FilterApplied = <T extends Record<string, unknown>>({\r\n groupBy,\r\n removeGroupby,\r\n advance,\r\n removeFilter,\r\n grid,\r\n}: FilterAppliedProps<T>) => {\r\n const { switchFiltersConfig, switchQuery, toggleSwitchFilter } = grid;\r\n const OPERATION = [\r\n { key: \"eq\", label: \" == \" },\r\n { key: \"neq\", label: \" ≠ \" },\r\n { key: \"gt\", label: \" > \" },\r\n { key: \"gte\", label: \" ≥ \" },\r\n { key: \"lt\", label: \" < \" },\r\n { key: \"lte\", label: \" ≤ \" },\r\n { key: \"between\", label: \"Between\" },\r\n { key: \"contains\", label: \"Contains\" },\r\n { key: \"starts\", label: \"Starts With\" },\r\n { key: \"ends\", label: \"Ends With\" },\r\n { key: \"eq\", label: \"Equals\" },\r\n { key: \"before\", label: \"Before\" },\r\n { key: \"after\", label: \"After\" },\r\n { key: \"between\", label: \"Between\" },\r\n ];\r\n const getOperatinName = (key: string | undefined) => {\r\n if (!key) return;\r\n let oper = OPERATION.find((item) => item.key === key);\r\n return oper?.label;\r\n };\r\n\r\n const appliedFilters = Object.values(advance || {}).filter(\r\n (filter) => filter.operation !== null,\r\n );\r\n\r\n const removeFilterFun = (filter: AdvancedFilterInput) => {\r\n if (filter.column) {\r\n removeFilter(filter.column);\r\n }\r\n };\r\n\r\n const getColumnLabel = (columnKey: string) => {\r\n const col = grid.colState?.find((c) => c.key === columnKey);\r\n\r\n return col?.facetedFilter?.label || col?.title || columnKey;\r\n };\r\n\r\n // Facet\r\n const facetFilters = grid.facetFilters || {};\r\n const removeFacetFilter = grid.removeFacetFilter;\r\n return (\r\n <div className=\"d-flex flex-row flex-wrap gap-1 py-1 px-3\">\r\n {groupBy && (\r\n <span className=\"badge bg-label-primary text-capitalize\">\r\n GroupBy : {groupBy.label}{\" \"}\r\n <i\r\n className=\"bx bx-x bx-xs cursor-pointer\"\r\n onClick={() => removeGroupby?.()}\r\n />\r\n </span>\r\n )}\r\n\r\n {appliedFilters.map((item) => (\r\n <span\r\n key={item.column}\r\n className=\"badge bg-label-info text-capitalize me-2\"\r\n >\r\n {item.type === \"date\" && item.operation === \"between\"\r\n ? `${item.column} ${item.from} ${getOperatinName(item.operation)} ${\r\n item.to\r\n }`\r\n : `${item.column} ${getOperatinName(item.operation)} ${item.value}`}\r\n\r\n <i\r\n className=\"bx bx-x bx-xs cursor-pointer ms-1\"\r\n onClick={() => removeFilterFun(item)}\r\n />\r\n </span>\r\n ))}\r\n\r\n {Object.entries(facetFilters).map(([column, items]) =>\r\n items.map((item) => (\r\n <span\r\n key={`${column}-${item.id}`}\r\n className=\"badge bg-label-success text-capitalize me-2\"\r\n >\r\n {getColumnLabel(column)}: {item.name}\r\n <i\r\n className=\"bx bx-x bx-xs cursor-pointer ms-1\"\r\n onClick={() => removeFacetFilter?.(column, item.id)}\r\n />\r\n </span>\r\n )),\r\n )}\r\n {switchFiltersConfig !== undefined &&\r\n switchFiltersConfig?.length > 0 &&\r\n switchFiltersConfig.map((swicth) => {\r\n return Object.entries(switchQuery).map(([key, value]) => {\r\n if (swicth.queryParam === key && swicth.defaultValue !== value) {\r\n return (\r\n <span\r\n key={key}\r\n className=\"badge bg-label-warning text-capitalize\"\r\n >\r\n {swicth.label}\r\n <i\r\n className=\"bx bx-x bx-xs cursor-pointer\"\r\n onClick={() => toggleSwitchFilter?.(swicth.key)}\r\n />\r\n </span>\r\n );\r\n }\r\n return null;\r\n });\r\n })}\r\n </div>\r\n );\r\n};\r\n\r\nexport default FilterApplied;\r\n","import React from \"react\";\r\ninterface MinimizeProps {\r\n onClick: () => void;\r\n}\r\nconst Minimize = ({ onClick }: MinimizeProps) => {\r\n return (\r\n <svg\r\n className=\"w-6 h-6 text-gray-800 dark:text-white cursor-pointer\"\r\n aria-hidden=\"true\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"18\"\r\n height=\"18\"\r\n fill=\"none\"\r\n viewBox=\"0 0 24 24\"\r\n onClick={onClick}\r\n \r\n >\r\n <path\r\n stroke=\"currentColor\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n strokeWidth=\"2\"\r\n d=\"M5 9h4m0 0V5m0 4L4 4m15 5h-4m0 0V5m0 4 5-5M5 15h4m0 0v4m0-4-5 5m15-5h-4m0 0v4m0-4 5 5\"\r\n />\r\n </svg>\r\n );\r\n};\r\n\r\nexport default Minimize;\r\n","interface CompressProps {\r\n onClick: () => void;\r\n}\r\nconst Compress = ({ onClick }: CompressProps) => {\r\n return (\r\n <svg\r\n className=\"w-6 h-6 text-gray-800 dark:text-white cursor-pointer\"\r\n aria-hidden=\"true\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"18\"\r\n height=\"18\"\r\n fill=\"none\"\r\n viewBox=\"0 0 24 24\"\r\n onClick={onClick}\r\n >\r\n <path\r\n stroke=\"currentColor\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n strokeWidth=\"2\"\r\n d=\"M4 8h4V4m12 4h-4V4M4 16h4v4m12-4h-4v4\"\r\n />\r\n </svg>\r\n );\r\n};\r\n\r\nexport default Compress;\r\n","import { EmptyStateProps } from \"../types/grid.props\";\r\nimport BoxIcon from \"../assets/icons/Box.svg\";\r\nconst EmptyState = ({\r\n title = \"No data available\",\r\n description = \"There is nothing to display here.\",\r\n imgSrc = BoxIcon,\r\n}: EmptyStateProps) => {\r\n return (\r\n <div className=\"empty-state\">\r\n <div className=\"empty-image-wrapper\">\r\n <img src={imgSrc} alt=\"Empty\" />\r\n </div>\r\n <h6>{title}</h6>\r\n <p className=\"text-muted mb-0\">{description}</p>\r\n </div>\r\n );\r\n};\r\n\r\nexport default EmptyState;\r\n","import React from \"react\";\r\n\r\nconst ArrowFromBottonToRight = () => {\r\n return (\r\n <svg\r\n className=\"w-[18px] h-[18px] text-gray-800 dark:text-white cursor-pointer\"\r\n aria-hidden=\"true\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"18\"\r\n height=\"18\"\r\n fill=\"none\"\r\n viewBox=\"0 0 24 24\"\r\n >\r\n <path\r\n d=\"M4 20V18.6C4 15.2397 4 13.5595 4.65396 12.2761C5.2292 11.1471 6.14708 10.2292 7.27606 9.65396C8.55953 9 10.2397 9 13.6 9H20M20 9L15 14M20 9L15 4\"\r\n stroke=\"currentColor\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n strokeWidth=\"2\"\r\n />\r\n </svg>\r\n );\r\n};\r\n\r\nexport default ArrowFromBottonToRight;\r\n","let tooltipEl: HTMLDivElement | null = null;\r\nconst OFFSET = 10;\r\n\r\nconst createToolTip = (): HTMLDivElement => {\r\n const el = document.createElement(\"div\");\r\n el.className = \"grid-tooltip\";\r\n el.style.position = \"fixed\";\r\n el.style.pointerEvents = \"none\";\r\n el.style.opacity = \"0\";\r\n\r\n document.body.appendChild(el);\r\n tooltipEl = el;\r\n\r\n return el;\r\n};\r\n\r\nconst getToolTip = (): HTMLDivElement => {\r\n if (!tooltipEl) {\r\n return createToolTip();\r\n }\r\n return tooltipEl;\r\n};\r\n\r\nconst getPosition = (x: number, y: number, el: HTMLDivElement) => {\r\n const { innerHeight, innerWidth } = window;\r\n\r\n const rect = el.getBoundingClientRect();\r\n\r\n let left = x + OFFSET;\r\n let top = y + OFFSET;\r\n\r\n // Right Overflow\r\n if (left + rect.width > innerWidth) {\r\n left = x - rect.width - OFFSET;\r\n }\r\n\r\n // Left Overflow\r\n\r\n if (left < 0) {\r\n left = OFFSET;\r\n }\r\n\r\n // Bottom overflow\r\n if (top + rect.height > innerHeight) {\r\n top = y - rect.height - OFFSET;\r\n }\r\n // Top overflow\r\n if (top < 0) {\r\n top = OFFSET;\r\n }\r\n\r\n return { left, top };\r\n};\r\n\r\nexport const showTooltip = (text: string, x: number, y: number): void => {\r\n const el = getToolTip();\r\n\r\n el.textContent = text;\r\n el.style.opacity = \"1\";\r\n\r\n el.style.left = \"0px\";\r\n el.style.top = \"0px\";\r\n\r\n const { left, top } = getPosition(x, y, el);\r\n el.style.left = `${left}px`;\r\n el.style.top = `${top}px`;\r\n};\r\n\r\nexport const hideTooltip = (): void => {\r\n if (!tooltipEl) return;\r\n tooltipEl.style.opacity = \"0\";\r\n};\r\n","import ArrowFromBottonToRight from \"./icons/ArrowFromBottonToRight\";\r\nimport { BulkActionProps } from \"../types/grid.props\";\r\nimport { hideTooltip, showTooltip } from \"../core/Tooltip\";\r\nimport { act } from \"react\";\r\n\r\nfunction BulkAction({ records, actions }: BulkActionProps) {\r\n return (\r\n <div className=\"d-flex flex-row gap-1 align-items-center py-1 ps-4\">\r\n <ArrowFromBottonToRight />\r\n <span>{`(${records.size}) ${\r\n records.size > 1 ? \"Records\" : \"Record\"\r\n }`}</span>{\" \"}\r\n {actions.length > 0 &&\r\n actions\r\n ?.filter((act) => act.isVisible)\r\n ?.map((action, index) => (\r\n <i\r\n key={`${action.label}_${index}`}\r\n className={`${action.icon}`}\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n action.onBulkClick && action.onBulkClick(records);\r\n }}\r\n onMouseEnter={(e) =>\r\n showTooltip(action.label, e.clientX, e.clientY)\r\n }\r\n onMouseMove={(e) =>\r\n showTooltip(action.label, e.clientX, e.clientY)\r\n }\r\n onMouseLeave={hideTooltip}\r\n />\r\n ))}\r\n </div>\r\n );\r\n}\r\n\r\nexport default BulkAction;\r\n","import React from \"react\";\r\nimport { PaginationProps } from \"../types/grid.props\";\r\n\r\ntype PaginationItem = number | \"...\";\r\n\r\nconst getPaginationRange = (\r\n currentPage: number,\r\n totalPages: number,\r\n delta = 1,\r\n): PaginationItem[] => {\r\n const range: number[] = [];\r\n const rangeWithDots: PaginationItem[] = [];\r\n let last: number | undefined;\r\n\r\n for (let i = 1; i <= totalPages; i++) {\r\n if (\r\n i === 1 ||\r\n i === totalPages ||\r\n (i >= currentPage - delta && i <= currentPage + delta)\r\n ) {\r\n range.push(i);\r\n }\r\n }\r\n\r\n for (const page of range) {\r\n if (last !== undefined) {\r\n if (page - last === 2) {\r\n rangeWithDots.push(last + 1);\r\n } else if (page - last > 2) {\r\n rangeWithDots.push(\"...\");\r\n }\r\n }\r\n rangeWithDots.push(page);\r\n last = page;\r\n }\r\n\r\n return rangeWithDots;\r\n};\r\n\r\nconst Pagination = ({\r\n currentPage,\r\n totalPages,\r\n onPageChange,\r\n}: PaginationProps) => {\r\n if (totalPages <= 1) return null;\r\n\r\n const paginationRange = getPaginationRange(currentPage, totalPages);\r\n\r\n return (\r\n <nav aria-label=\"Page navigation\">\r\n <ul className=\"pagination pagination-sm justify-content-end py-1 mx-1\">\r\n {/* Prev */}\r\n <li className={`page-item ${currentPage === 1 ? \"disabled\" : \"\"}`}>\r\n <button\r\n className=\"page-link\"\r\n onClick={() => onPageChange(currentPage - 1)}\r\n disabled={currentPage === 1}\r\n >\r\n &laquo;\r\n </button>\r\n </li>\r\n\r\n {paginationRange.map((item, index) => (\r\n <li\r\n key={index}\r\n className={`page-item ${\r\n item === currentPage ? \"active\" : \"\"\r\n } ${item === \"...\" ? \"disabled\" : \"\"}`}\r\n >\r\n {item === \"...\" ? (\r\n <span className=\"page-link\">…</span>\r\n ) : (\r\n <button className=\"page-link\" onClick={() => onPageChange(item)}>\r\n {item}\r\n </button>\r\n )}\r\n </li>\r\n ))}\r\n\r\n {/* Next */}\r\n <li\r\n className={`page-item ${\r\n currentPage === totalPages ? \"disabled\" : \"\"\r\n }`}\r\n >\r\n <button\r\n className=\"page-link\"\r\n onClick={() => onPageChange(currentPage + 1)}\r\n disabled={currentPage === totalPages}\r\n >\r\n &raquo;\r\n </button>\r\n </li>\r\n </ul>\r\n </nav>\r\n );\r\n};\r\n\r\nexport default Pagination;\r\n","import React, {\r\n useEffect,\r\n useLayoutEffect,\r\n useMemo,\r\n useRef,\r\n useState,\r\n} from \"react\";\r\nimport { createPortal } from \"react-dom\";\r\nimport type {\r\n PamDropdownItem,\r\n PamDropdownPlacement,\r\n} from \"../../types/PamDropdown.types\";\r\n\r\ntype PamDropdownProps = {\r\n trigger: React.ReactNode;\r\n items: PamDropdownItem[];\r\n placement?: PamDropdownPlacement;\r\n offset?: number;\r\n disabled?: boolean;\r\n closeOnItemClick?: boolean;\r\n className?: string;\r\n};\r\n\r\ntype DropdownPosition = { top: number; left: number };\r\n\r\nexport default function PamDropdown({\r\n trigger,\r\n items,\r\n placement = \"bottom-start\",\r\n offset = 6,\r\n disabled = false,\r\n closeOnItemClick = true,\r\n className = \"\",\r\n}: PamDropdownProps) {\r\n const triggerRef = useRef<HTMLSpanElement | null>(null);\r\n const menuRef = useRef<HTMLDivElement | null>(null);\r\n\r\n const [open, setOpen] = useState(false);\r\n const [pos, setPos] = useState<DropdownPosition>({ top: 0, left: 0 });\r\n\r\n // Multiple submenus can be open\r\n const [openSubKeys, setOpenSubKeys] = useState<Record<string, boolean>>({});\r\n\r\n const portalRoot = useMemo(() => {\r\n const el = document.getElementById(\"pam-portal-root\");\r\n if (el) return el;\r\n\r\n const created = document.createElement(\"div\");\r\n created.id = \"pam-portal-root\";\r\n document.body.appendChild(created);\r\n return created;\r\n }, []);\r\n\r\n function close() {\r\n setOpen(false);\r\n setOpenSubKeys({});\r\n }\r\n\r\n function toggle() {\r\n if (disabled) return;\r\n setOpen((v) => {\r\n const next = !v;\r\n if (!next) setOpenSubKeys({});\r\n return next;\r\n });\r\n }\r\n\r\n // MAIN dropdown position\r\n function getDropdownPosition(\r\n triggerEl: HTMLElement,\r\n menuEl: HTMLElement,\r\n ): DropdownPosition {\r\n const rect = triggerEl.getBoundingClientRect();\r\n const menuRect = menuEl.getBoundingClientRect();\r\n\r\n let top = rect.bottom + offset + window.scrollY;\r\n let left = rect.left + window.scrollX;\r\n\r\n if (placement.startsWith(\"top\")) {\r\n top = rect.top - menuRect.height - offset + window.scrollY;\r\n }\r\n\r\n if (placement.endsWith(\"end\")) {\r\n left = rect.right - menuRect.width + window.scrollX;\r\n }\r\n\r\n // clamp X\r\n const minLeft = 8 + window.scrollX;\r\n const maxLeft = window.innerWidth - menuRect.width - 8 + window.scrollX;\r\n left = Math.max(minLeft, Math.min(left, maxLeft));\r\n\r\n // clamp Y\r\n const minTop = 8 + window.scrollY;\r\n const maxTop = window.innerHeight - menuRect.height - 8 + window.scrollY;\r\n top = Math.max(minTop, Math.min(top, maxTop));\r\n\r\n // auto flip if bottom overflow\r\n const bottomOverflow =\r\n top + menuRect.height > window.innerHeight + window.scrollY;\r\n const topOverflow = top < window.scrollY;\r\n\r\n if (bottomOverflow && rect.top > menuRect.height) {\r\n top = rect.top - menuRect.height - offset + window.scrollY;\r\n } else if (\r\n topOverflow &&\r\n window.innerHeight - rect.bottom > menuRect.height\r\n ) {\r\n top = rect.bottom + offset + window.scrollY;\r\n }\r\n\r\n return { top, left };\r\n }\r\n\r\n function updatePosition() {\r\n const t = triggerRef.current;\r\n const m = menuRef.current;\r\n if (!t || !m) return;\r\n setPos(getDropdownPosition(t, m));\r\n }\r\n\r\n useLayoutEffect(() => {\r\n if (!open) return;\r\n updatePosition();\r\n }, [open, placement]);\r\n\r\n // close on outside click\r\n useEffect(() => {\r\n if (!open) return;\r\n\r\n const onDown = (e: MouseEvent) => {\r\n const t = triggerRef.current;\r\n const m = menuRef.current;\r\n if (!t || !m) return;\r\n\r\n const target = e.target as Node;\r\n if (t.contains(target)) return;\r\n if (m.contains(target)) return;\r\n\r\n close();\r\n };\r\n\r\n const onKey = (e: KeyboardEvent) => {\r\n if (e.key === \"Escape\") close();\r\n };\r\n\r\n document.addEventListener(\"mousedown\", onDown);\r\n document.addEventListener(\"keydown\", onKey);\r\n\r\n return () => {\r\n document.removeEventListener(\"mousedown\", onDown);\r\n document.removeEventListener(\"keydown\", onKey);\r\n };\r\n }, [open]);\r\n\r\n // reposition on scroll/resize\r\n useEffect(() => {\r\n if (!open) return;\r\n\r\n const handler = () => updatePosition();\r\n\r\n window.addEventListener(\"scroll\", handler, true);\r\n window.addEventListener(\"resize\", handler);\r\n\r\n return () => {\r\n window.removeEventListener(\"scroll\", handler, true);\r\n window.removeEventListener(\"resize\", handler);\r\n };\r\n }, [open]);\r\n\r\n return (\r\n <>\r\n <span ref={triggerRef} className={`pam-dropdown-trigger ${className}`}>\r\n <span onClick={toggle} style={{ display: \"inline-flex\" }}>\r\n {trigger}\r\n </span>\r\n </span>\r\n\r\n {open &&\r\n createPortal(\r\n <div\r\n ref={menuRef}\r\n className=\"pam-dropdown-menu\"\r\n style={{\r\n top: pos.top,\r\n left: pos.left,\r\n }}\r\n >\r\n <PamDropdownList\r\n items={items}\r\n closeOnItemClick={closeOnItemClick}\r\n onClose={close}\r\n openSubKeys={openSubKeys}\r\n setOpenSubKeys={setOpenSubKeys}\r\n level={0}\r\n />\r\n </div>,\r\n portalRoot,\r\n )}\r\n </>\r\n );\r\n}\r\n\r\ntype PamDropdownListProps = {\r\n items: PamDropdownItem[];\r\n onClose: () => void;\r\n closeOnItemClick: boolean;\r\n\r\n openSubKeys: Record<string, boolean>;\r\n setOpenSubKeys: React.Dispatch<React.SetStateAction<Record<string, boolean>>>;\r\n\r\n level: number;\r\n};\r\n\r\nfunction PamDropdownList({\r\n items,\r\n onClose,\r\n closeOnItemClick,\r\n openSubKeys,\r\n setOpenSubKeys,\r\n level,\r\n}: PamDropdownListProps) {\r\n return (\r\n <ul className=\"pam-dropdown-list\">\r\n {items.map((item, index) => (\r\n <PamDropdownNode\r\n key={item.key ?? `${level}-${index}`}\r\n item={item}\r\n onClose={onClose}\r\n closeOnItemClick={closeOnItemClick}\r\n openSubKeys={openSubKeys}\r\n setOpenSubKeys={setOpenSubKeys}\r\n level={level}\r\n index={index}\r\n />\r\n ))}\r\n </ul>\r\n );\r\n}\r\n\r\ntype PamDropdownNodeProps = {\r\n item: PamDropdownItem;\r\n onClose: () => void;\r\n closeOnItemClick: boolean;\r\n\r\n openSubKeys: Record<string, boolean>;\r\n setOpenSubKeys: React.Dispatch<React.SetStateAction<Record<string, boolean>>>;\r\n\r\n level: number;\r\n index: number;\r\n};\r\n\r\nfunction PamDropdownNode({\r\n item,\r\n onClose,\r\n closeOnItemClick,\r\n openSubKeys,\r\n setOpenSubKeys,\r\n level,\r\n index,\r\n}: PamDropdownNodeProps) {\r\n const liRef = useRef<HTMLLIElement | null>(null);\r\n const submenuRef = useRef<HTMLDivElement | null>(null);\r\n\r\n const hasChildren = !!item.children?.length;\r\n const nodeKey = item.key ?? `${level}-${index}`;\r\n\r\n const submenuOpen = !!openSubKeys[nodeKey];\r\n\r\n // Submenu positioning (left/right + top/bottom clamp + maxHeight scroll)\r\n useLayoutEffect(() => {\r\n if (!submenuOpen) return;\r\n\r\n const li = liRef.current;\r\n const menu = submenuRef.current;\r\n if (!li || !menu) return;\r\n\r\n const rect = li.getBoundingClientRect();\r\n\r\n // reset for measuring\r\n menu.style.left = \"0px\";\r\n menu.style.top = \"0px\";\r\n menu.style.maxHeight = \"\";\r\n menu.style.overflowY = \"\";\r\n\r\n const menuRect = menu.getBoundingClientRect();\r\n\r\n const gap = 6;\r\n\r\n const spaceRight = window.innerWidth - rect.right;\r\n const spaceLeft = rect.left;\r\n const spaceBottom = window.innerHeight - rect.bottom;\r\n const spaceTop = rect.top;\r\n\r\n // default = right\r\n let left = rect.right + gap;\r\n let top = rect.top;\r\n\r\n let mode: \"right\" | \"left\" | \"bottom\" | \"top\" = \"right\";\r\n\r\n // ---- Step 1: horizontal try ----\r\n if (spaceRight >= menuRect.width) {\r\n mode = \"right\";\r\n left = rect.right + gap;\r\n top = rect.top;\r\n } else if (spaceLeft >= menuRect.width) {\r\n mode = \"left\";\r\n left = rect.left - menuRect.width - gap;\r\n top = rect.top;\r\n } else {\r\n // ---- Step 2: no horizontal space -> open vertical ----\r\n if (spaceBottom >= menuRect.height) {\r\n mode = \"bottom\";\r\n left = rect.left;\r\n top = rect.bottom + gap;\r\n } else if (spaceTop >= menuRect.height) {\r\n mode = \"top\";\r\n left = rect.left;\r\n top = rect.top - menuRect.height - gap;\r\n } else {\r\n // fallback: bottom with clamp\r\n mode = \"bottom\";\r\n left = rect.left;\r\n top = rect.bottom + gap;\r\n }\r\n }\r\n\r\n // ---- Clamp inside viewport ----\r\n const minLeft = 8;\r\n const maxLeft = window.innerWidth - menuRect.width - 8;\r\n left = Math.max(minLeft, Math.min(left, maxLeft));\r\n\r\n const minTop = 8;\r\n const maxTop = window.innerHeight - menuRect.height - 8;\r\n top = Math.max(minTop, Math.min(top, maxTop));\r\n\r\n // ---- If submenu too tall -> scroll ----\r\n const maxHeight = window.innerHeight - 16;\r\n menu.style.maxHeight = `${maxHeight}px`;\r\n menu.style.overflowY = \"auto\";\r\n\r\n menu.style.left = `${left}px`;\r\n menu.style.top = `${top}px`;\r\n\r\n // optional: for CSS styling\r\n menu.setAttribute(\"data-placement\", mode);\r\n }, [submenuOpen]);\r\n\r\n const handleClick = (e: React.MouseEvent) => {\r\n e.stopPropagation();\r\n\r\n if (item.disabled) return;\r\n\r\n // submenu parent\r\n if (hasChildren) {\r\n setOpenSubKeys((prev) => {\r\n const next: Record<string, boolean> = {};\r\n\r\n // keep only parent levels (close same + deeper)\r\n Object.keys(prev).forEach((k) => {\r\n const lvl = Number(k.split(\"-\")[0]);\r\n if (lvl < level) next[k] = prev[k];\r\n });\r\n\r\n // toggle current\r\n next[nodeKey] = !prev[nodeKey];\r\n\r\n return next;\r\n });\r\n\r\n return;\r\n }\r\n\r\n // normal item\r\n item.onClick?.();\r\n\r\n if (item.keepOpenOnClick) return;\r\n if (closeOnItemClick) onClose();\r\n };\r\n\r\n return (\r\n <li\r\n ref={liRef}\r\n className={[\r\n !item.custome ? \"pam-dropdown-item\" : \"\",\r\n item.danger ? \"danger\" : \"\",\r\n item.disabled ? \"disabled\" : \"\",\r\n hasChildren ? \"has-children\" : \"\",\r\n submenuOpen ? \"open\" : \"\",\r\n ].join(\" \")}\r\n onClick={handleClick}\r\n >\r\n <div\r\n className={`${item.rightSlot ? \"pam-dropdown-item-inner-rightSlot\" : \"pam-dropdown-item-inner\"} `}\r\n >\r\n <div className=\"pam-left\">\r\n {item.icon && <i className={`${item.icon} pam-icon`} />}\r\n <span className=\"pam-label\">{item.label}</span>\r\n </div>\r\n\r\n <div className=\"pam-right\">\r\n {item.rightSlot && (\r\n <span\r\n className=\"pam-rightslot\"\r\n onClick={(e) => e.stopPropagation()}\r\n >\r\n {item.rightSlot}\r\n </span>\r\n )}\r\n\r\n {hasChildren && <i className=\"bx bx-chevron-right pam-arrow\" />}\r\n </div>\r\n </div>\r\n\r\n {hasChildren && submenuOpen && (\r\n <div ref={submenuRef} className=\"pam-submenu\">\r\n <PamDropdownList\r\n items={item.children!}\r\n onClose={onClose}\r\n closeOnItemClick={closeOnItemClick}\r\n openSubKeys={openSubKeys}\r\n setOpenSubKeys={setOpenSubKeys}\r\n level={level + 1}\r\n />\r\n </div>\r\n )}\r\n </li>\r\n );\r\n}\r\n","import React, { useState } from \"react\";\r\nimport { PamDropdownItem } from \"../types/PamDropdown.types\";\r\nimport PamDropdown from \"./dropdown/PamDropdown\";\r\nimport {\r\n GridFetaures,\r\n MainFilterProps,\r\n TableActionProps,\r\n} from \"../types/grid.types\";\r\nimport { useLocalStorageState } from \"../core/utils\";\r\nimport { hideTooltip, showTooltip } from \"../core/Tooltip\";\r\n\r\nconst MainFilter = <T extends Record<string, unknown>>({\r\n gridFetaures,\r\n grid,\r\n}: MainFilterProps<T>) => {\r\n const {\r\n setGroupBy,\r\n visibleColumns,\r\n colState,\r\n updateColumn,\r\n switchFiltersConfig,\r\n switchFilters,\r\n toggleSwitchFilter,\r\n } = grid;\r\n const [isBulkData, setBulkData] = useLocalStorageState<boolean>(\r\n \"bulk-data-toggle\",\r\n false,\r\n );\r\n\r\n const items: PamDropdownItem[] = [];\r\n\r\n items.push({\r\n key: \"column-visibility\",\r\n label: \"Column Visibility\",\r\n icon: \"bx bx-table\",\r\n children: gridFetaures.columnVisibility\r\n ? colState.map((c) => ({\r\n key: `col-${String(c.key)}`,\r\n label: c.title,\r\n keepOpenOnClick: true,\r\n rightSlot: (\r\n <input\r\n className=\"form-check-input m-0\"\r\n type=\"checkbox\"\r\n checked={c.visible !== false}\r\n onChange={() => {\r\n updateColumn(c.key, { visible: !(c.visible !== false) });\r\n }}\r\n onClick={(e) => e.stopPropagation()}\r\n />\r\n ),\r\n }))\r\n : [],\r\n });\r\n\r\n if (gridFetaures.grouping) {\r\n items.push({\r\n key: \"group-by\",\r\n label: \"Group By\",\r\n icon: \"bx bx-columns\",\r\n children:\r\n visibleColumns.length > 0\r\n ? visibleColumns\r\n .filter((c) => c.groupable)\r\n .map((c) => ({\r\n key: `group-${String(c.key)}`,\r\n label: c.title,\r\n onClick: () =>\r\n setGroupBy({ key: String(c.key), label: c.title }),\r\n }))\r\n : [],\r\n });\r\n }\r\n\r\n if (\r\n gridFetaures?.bulkActionsConfig &&\r\n gridFetaures.bulkActionsConfig.length > 0\r\n ) {\r\n items.push({\r\n key: \"bulk-data\",\r\n keepOpenOnClick: true,\r\n label: (\r\n <>\r\n <label\r\n className=\"switch switch-square switch-sm\"\r\n onClick={(e) => e.stopPropagation()}\r\n >\r\n <input\r\n type=\"checkbox\"\r\n className=\"switch-input\"\r\n checked={isBulkData}\r\n onChange={(e) => setBulkData(e.target.checked)}\r\n />\r\n\r\n <span className=\"switch-toggle-slider\">\r\n <span className=\"switch-on\">\r\n <i className=\"icon-base bx bx-check\"></i>\r\n </span>\r\n <span className=\"switch-off\">\r\n <i className=\"icon-base bx bx-x\"></i>\r\n </span>\r\n </span>\r\n </label>\r\n\r\n <span className=\"pam-label ms-4\">Bulk Data</span>\r\n </>\r\n ),\r\n });\r\n }\r\n\r\n if (switchFiltersConfig !== undefined && switchFiltersConfig?.length > 0) {\r\n switchFiltersConfig.forEach((filter) => {\r\n items.push({\r\n key: `switch-${filter.key}`,\r\n keepOpenOnClick: true,\r\n label: filter.label,\r\n rightSlot: (\r\n <label\r\n className=\"switch switch-square switch-sm\"\r\n onClick={(e) => e.stopPropagation()}\r\n >\r\n <input\r\n type=\"checkbox\"\r\n className=\"switch-input\"\r\n checked={!!switchFilters?.[filter.key]}\r\n onChange={() => toggleSwitchFilter(filter.key)}\r\n />\r\n <span className=\"switch-toggle-slider\">\r\n <span className=\"switch-on\">\r\n <i className=\"icon-base bx bx-check\"></i>\r\n </span>\r\n <span className=\"switch-off\">\r\n <i className=\"icon-base bx bx-x\"></i>\r\n </span>\r\n </span>\r\n </label>\r\n ),\r\n });\r\n });\r\n }\r\n return (\r\n <PamDropdown\r\n trigger={\r\n <button type=\"button\" className=\"btn btn-sm btn-label-secondary me-2\">\r\n <span className=\"icon-base bx bx-filter-alt\"></span>\r\n <span className=\"d-none d-sm-inline ms-1\">Filter</span>\r\n </button>\r\n }\r\n items={items}\r\n />\r\n );\r\n};\r\n\r\nexport default MainFilter;\r\n\r\nexport const TableAction = <T extends Record<string, unknown>>({\r\n gridFetaures,\r\n row,\r\n}: TableActionProps<T>) => {\r\n const items: PamDropdownItem[] = Array.isArray(gridFetaures.actions)\r\n ? gridFetaures.actions\r\n .filter((act) => {\r\n if (typeof act.isVisible === \"function\") {\r\n if (row) {\r\n return act.isVisible(row);\r\n }\r\n return false;\r\n }\r\n if (typeof act.isVisible === \"boolean\") {\r\n return act.isVisible;\r\n }\r\n return true;\r\n })\r\n .map((a, i) => ({\r\n key: `action-${String(a.label)}-${i}`,\r\n label: a.label,\r\n icon: a.icon,\r\n onClick: (e) => {\r\n a.onClick && row && a.onClick(row);\r\n },\r\n }))\r\n : [];\r\n return (\r\n <PamDropdown\r\n trigger={\r\n <i\r\n className=\"bx bx-dots-vertical-rounded cursor-pointer\"\r\n onMouseEnter={(e) => showTooltip(\"Action\", e.clientX, e.clientY)}\r\n onMouseMove={(e) => showTooltip(\"Action\", e.clientX, e.clientY)}\r\n onMouseLeave={hideTooltip}\r\n ></i>\r\n }\r\n items={items}\r\n />\r\n );\r\n};\r\n","export const safeGridHandle = {\r\n rows: [],\r\n page: 1,\r\n totalPages: 1,\r\n pageSize: 20,\r\n setPage: () => {},\r\n setPageSize: () => {},\r\n setGroupBy: () => {},\r\n groupBy: null,\r\n search: \"\",\r\n setSearch: () => {},\r\n selected: new Set(),\r\n toggleSelect: () => {},\r\n selectAllOnPage: () => {},\r\n deselectAllOnPage: () => {},\r\n changeSort: () => {},\r\n sortBy: { key: \"\", dir: \"asc\" },\r\n visibleColumns: [],\r\n colState: [],\r\n updateColumn: () => {},\r\n totalRows: 0,\r\n expanded: new Set(),\r\n toggleExpand: () => {},\r\n setColState: () => {},\r\n emptyState: { title: \"No records\", description: \"No data available\" },\r\n addNewRecord: undefined,\r\n advanceFilters: [],\r\n setColumnAdvanceFilter: () => {},\r\n};\r\n","import React from \"react\";\r\n\r\nconst ColumnIcon = () => {\r\n return (\r\n <svg\r\n className=\"w-[18px] h-[18px] text-gray-800 dark:text-white cursor-pointer\"\r\n aria-hidden=\"true\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"18\"\r\n height=\"18\"\r\n fill=\"none\"\r\n viewBox=\"0 0 24 24\"\r\n >\r\n <path\r\n stroke=\"currentColor\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n strokeWidth=\"2\"\r\n d=\"M15 5v14M9 5v14M4 5h16a1 1 0 0 1 1 1v12a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1V6a1 1 0 0 1 1-1Z\"\r\n />\r\n </svg>\r\n );\r\n};\r\n\r\nexport default ColumnIcon;\r\n","import { ColumnVisibilityPanelProps } from \"../types/grid.props\";\r\nimport ColumnIcon from \"./icons/ColumnIcon\";\r\n\r\nconst ColumnVisibilityPanel = <T extends Record<string, any>>({\r\n columns,\r\n onToggle,\r\n}: ColumnVisibilityPanelProps<T>) => {\r\n return (\r\n <div className=\"dropdown\">\r\n <button\r\n className=\"btn btn-sm btn-outline-secondary\"\r\n data-bs-toggle=\"dropdown\"\r\n >\r\n <ColumnIcon /> Columns\r\n </button>\r\n <div className=\"dropdown-menu dropdown-menu-end p-2\">\r\n {columns.map((c) => (\r\n <div key={String(c.key)} className=\"form-check\">\r\n <input\r\n className=\"form-check-input\"\r\n type=\"checkbox\"\r\n id={`colvis-${String(c.key)}`}\r\n checked={c.visible !== false}\r\n onChange={() => onToggle(c.key)}\r\n />\r\n <label\r\n className=\"form-check-label\"\r\n htmlFor={`colvis-${String(c.key)}`}\r\n >\r\n {c.title}\r\n </label>\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n );\r\n};\r\nexport default ColumnVisibilityPanel;\r\n","import { useState, useMemo, useCallback, useEffect } from \"react\";\r\nimport {\r\n AdvancedFilterInput,\r\n AdvancedFilterState,\r\n useGridCoreProps,\r\n} from \"../types/grid.props\";\r\nimport {\r\n EmptySate,\r\n FacetItem,\r\n GridColumn,\r\n GridColumnState,\r\n GridRowId,\r\n groupByObj,\r\n SortState,\r\n} from \"../types/grid.types\";\r\n\r\n/*\r\n options:\r\n - data (array) OR serverMode: true + fetcher({ page, pageSize, sortBy, filter, search })\r\n - rowKey\r\n - initialPageSize\r\n*/\r\n\r\nexport function useGridCore<T extends Record<string, any>>({\r\n data = [],\r\n columns = [],\r\n serverMode = false,\r\n rowKey = \"id\",\r\n initialPageSize = 20,\r\n addNewRecord,\r\n switchFiltersConfig,\r\n}: useGridCoreProps<T>) {\r\n /* ---------------- BASIC STATE ---------------- */\r\n const [page, setPage] = useState<number>(1);\r\n const [pageSize, setPageSize] = useState<number>(initialPageSize);\r\n const [search, setSearch] = useState<string>(\"\");\r\n const [debouncedSearch, setDebouncedSearch] = useState<string>(\"\");\r\n const [groupBy, setGroupBy] = useState<groupByObj | null>(null);\r\n const [emptyState, setEmptyState] = useState<EmptySate>({});\r\n const [facetItems, setFacetItems] = useState<Record<string, FacetItem[]>>({});\r\n const [facetFilters, setFacetFilters] = useState<Record<string, FacetItem[]>>(\r\n {},\r\n );\r\n const [facetLoading, setFacetLoading] = useState<Record<string, boolean>>({});\r\n const [advanceFilters, setAdvanceFilters] = useState<AdvancedFilterState>({});\r\n const [sortBy, setSortBy] = useState<SortState>({ key: null, dir: \"asc\" });\r\n\r\n const [selected, setSelected] = useState<Set<GridRowId>>(new Set());\r\n const [expanded, setExpanded] = useState<Set<GridRowId>>(new Set());\r\n\r\n const [switchFilters, setSwitchFilters] = useState<Record<string, boolean>>(\r\n () => {\r\n const initial: Record<string, boolean> = {};\r\n\r\n switchFiltersConfig?.forEach((f) => {\r\n initial[f.key] = f.defaultValue ?? false;\r\n });\r\n\r\n return initial;\r\n },\r\n );\r\n\r\n /* ---------------- SERVER MODE STATE ---------------- */\r\n const [serverRows, setServerRows] = useState<T[]>([]);\r\n const [serverTotal, setServerTotal] = useState(0);\r\n const [serverTotalPages, setServerTotalPages] = useState(1); // <-- new\r\n\r\n /* ---------------- COLUMN STATE ---------------- */\r\n const [colState, setColState] = useState<GridColumnState<T>[]>(() =>\r\n columns.map((c: any, i: any) => ({\r\n ...c,\r\n visible: c.visible !== false,\r\n order: i,\r\n })),\r\n );\r\n\r\n /* ---------------- SEARCH (DEBOUNCE) ---------------- */\r\n useEffect(() => {\r\n const t = setTimeout(() => {\r\n setDebouncedSearch(search);\r\n setPage(1);\r\n }, 400);\r\n return () => clearTimeout(t);\r\n }, [search]);\r\n\r\n /* ---------------- CLIENT MODE (PURE DERIVED DATA) ---------------- */\r\n const filteredData = useMemo(() => {\r\n if (serverMode) return [];\r\n\r\n let filtered = [...data]; // clone\r\n\r\n // SEARCH\r\n if (debouncedSearch) {\r\n const q = debouncedSearch.toLowerCase();\r\n filtered = filtered.filter((r) =>\r\n Object.values(r).some((v) =>\r\n String(v ?? \"\")\r\n .toLowerCase()\r\n .includes(q),\r\n ),\r\n );\r\n }\r\n\r\n // SORT\r\n if (sortBy.key) {\r\n const dir = sortBy.dir === \"asc\" ? 1 : -1;\r\n filtered.sort(\r\n (a, b) =>\r\n String(a?.[sortBy.key as GridRowId] ?? \"\").localeCompare(\r\n String(b?.[sortBy.key as GridRowId] ?? \"\"),\r\n undefined,\r\n { numeric: true, sensitivity: \"base\" },\r\n ) * dir,\r\n );\r\n }\r\n\r\n return filtered;\r\n }, [data, debouncedSearch, sortBy, serverMode]);\r\n\r\n const pagedClientRows = useMemo(() => {\r\n if (serverMode) return [];\r\n const start = (page - 1) * pageSize;\r\n return filteredData.slice(start, start + pageSize);\r\n }, [filteredData, page, pageSize, serverMode]);\r\n\r\n /* ---------------- FINAL ROW SOURCE ---------------- */\r\n const rows = serverMode ? serverRows : pagedClientRows;\r\n const totalRows = serverMode ? serverTotal : filteredData.length;\r\n const totalPages = serverMode\r\n ? serverTotalPages\r\n : Math.max(1, Math.ceil(totalRows / pageSize));\r\n\r\n /* ---------------- SELECTION ---------------- */\r\n const toggleSelect = useCallback((id: GridRowId) => {\r\n const key = String(id);\r\n setSelected((prev) => {\r\n const s = new Set(prev);\r\n s.has(key) ? s.delete(key) : s.add(key);\r\n return s;\r\n });\r\n }, []);\r\n\r\n const selectAllOnPage = useCallback(\r\n (rows: T[]) => {\r\n setSelected((prev) => {\r\n const s = new Set(prev);\r\n rows.forEach((r) => s.add(String(r[rowKey])));\r\n return s;\r\n });\r\n },\r\n [rowKey],\r\n );\r\n\r\n const deselectAllOnPage = useCallback(\r\n (rows: T[]) => {\r\n setSelected((prev) => {\r\n const s = new Set(prev);\r\n rows.forEach((r) => s.delete(String(r[rowKey])));\r\n return s;\r\n });\r\n },\r\n [rowKey],\r\n );\r\n\r\n /* ---------------- SORT ---------------- */\r\n const changeSort = useCallback((key: string) => {\r\n setSortBy((p: SortState) =>\r\n p.key !== key\r\n ? { key, dir: \"asc\" }\r\n : p.dir === \"asc\"\r\n ? { key, dir: \"desc\" }\r\n : { key: null, dir: \"asc\" },\r\n );\r\n setPage(1);\r\n }, []);\r\n\r\n /* ---------------- ADVANCED FILTER ---------------- */\r\n const setColumnAdvanceFilter = useCallback(\r\n (column: string, filter: AdvancedFilterInput | null) => {\r\n setAdvanceFilters((prev: AdvancedFilterState) => {\r\n if (!filter) {\r\n const c = { ...prev };\r\n delete c[column];\r\n return c;\r\n }\r\n return { ...prev, [column]: { column, ...filter } };\r\n });\r\n setPage(1);\r\n },\r\n [],\r\n );\r\n\r\n // -----------------Facet Filter-------------------\r\n const loadFacets = async (columnKey: string) => {\r\n if (facetItems[columnKey]) return;\r\n\r\n const column = columns.find((c) => c.key === columnKey);\r\n\r\n if (!column?.facetedFilter) return;\r\n\r\n const { items, fetcher, mapItem } = column.facetedFilter;\r\n\r\n if (items) {\r\n setFacetItems((prev) => ({\r\n ...prev,\r\n [columnKey]: items,\r\n }));\r\n return;\r\n }\r\n\r\n if (fetcher) {\r\n setFacetLoading((prev) => ({\r\n ...prev,\r\n [columnKey]: true,\r\n }));\r\n\r\n const result = await fetcher();\r\n\r\n const raw = Array.isArray(result) ? result : result?.[columnKey] || [];\r\n\r\n const normalized = raw.map(\r\n mapItem ||\r\n ((r: any) => ({\r\n id: r.id,\r\n name: r.name,\r\n })),\r\n );\r\n\r\n setFacetItems((prev) => ({\r\n ...prev,\r\n [columnKey]: normalized,\r\n }));\r\n\r\n setFacetLoading((prev) => ({\r\n ...prev,\r\n [columnKey]: false,\r\n }));\r\n }\r\n};\r\n\r\n const toggleFacetFilter = (columnKey: string, item: FacetItem) => {\r\n setFacetFilters((prev) => {\r\n const values = prev[columnKey] ?? [];\r\n\r\n const exists = values.some((v) => v.id === item.id);\r\n\r\n const nextValues = exists\r\n ? values.filter((v) => v.id !== item.id)\r\n : [...values, item];\r\n\r\n if (!nextValues.length) {\r\n const copy = { ...prev };\r\n delete copy[columnKey];\r\n return copy;\r\n }\r\n\r\n return {\r\n ...prev,\r\n [columnKey]: nextValues,\r\n };\r\n });\r\n\r\n setPage(1);\r\n };\r\n const removeFacetFilter = (columnKey: string, id: any) => {\r\n setFacetFilters((prev) => {\r\n const values = prev[columnKey] || [];\r\n\r\n const next = values.filter((v) => v.id !== id);\r\n\r\n if (!next.length) {\r\n const copy = { ...prev };\r\n delete copy[columnKey];\r\n return copy;\r\n }\r\n\r\n return {\r\n ...prev,\r\n [columnKey]: next,\r\n };\r\n });\r\n };\r\n const clearFacetFilters = () => {\r\n setFacetFilters({});\r\n };\r\n\r\n /* ---------------- Switch FILTER ---------------- */\r\n const toggleSwitchFilter = useCallback((key: string) => {\r\n setSwitchFilters((prev) => ({\r\n ...prev,\r\n [key]: !prev[key],\r\n }));\r\n setPage(1);\r\n }, []);\r\n const switchQuery = useMemo(() => {\r\n if (!switchFiltersConfig) return {};\r\n\r\n const query: Record<string, any> = {};\r\n\r\n switchFiltersConfig.forEach((filter) => {\r\n const state = switchFilters[filter.key];\r\n\r\n query[filter.queryParam] = state\r\n ? (filter.trueValue ?? true)\r\n : (filter.falseValue ?? false);\r\n });\r\n\r\n return query;\r\n }, [switchFilters, switchFiltersConfig]);\r\n /* ---------------- COLUMNS ---------------- */\r\n const visibleColumns = useMemo(\r\n () =>\r\n colState\r\n .filter((c: GridColumnState<T>) => c.visible)\r\n .sort((a: any, b: any) => a.order - b.order),\r\n [colState],\r\n );\r\n\r\n const updateColumn = useCallback(\r\n (key: GridColumn<T>[\"key\"], patch: Partial<GridColumnState<T>>) => {\r\n setColState((prev) =>\r\n prev.map((c) => (c.key === key ? { ...c, ...patch } : c)),\r\n );\r\n },\r\n [],\r\n );\r\n\r\n /* ---------------- EXPAND ---------------- */\r\n const toggleExpand = useCallback((id: GridRowId) => {\r\n setExpanded((prev: Set<GridRowId>) => {\r\n const s = new Set(prev);\r\n s.has(id) ? s.delete(id) : s.add(id);\r\n return s;\r\n });\r\n }, []);\r\n\r\n /* ---------------- RETURN API ---------------- */\r\n return {\r\n // paging\r\n page,\r\n setPage,\r\n pageSize,\r\n setPageSize,\r\n totalRows,\r\n totalPages,\r\n\r\n // search\r\n search,\r\n setSearch,\r\n debouncedSearch,\r\n\r\n // sorting\r\n sortBy,\r\n changeSort,\r\n\r\n // grouping\r\n groupBy,\r\n setGroupBy,\r\n\r\n // advanced filters\r\n advanceFilters,\r\n setColumnAdvanceFilter,\r\n\r\n // selection\r\n selected,\r\n toggleSelect,\r\n selectAllOnPage,\r\n deselectAllOnPage,\r\n\r\n // expand\r\n expanded,\r\n toggleExpand,\r\n\r\n // New Record Button\r\n addNewRecord,\r\n\r\n // columns\r\n colState,\r\n visibleColumns,\r\n updateColumn,\r\n setColState,\r\n\r\n // data\r\n rows,\r\n\r\n // server setters (ONLY used in serverMode)\r\n setServerRows,\r\n setServerTotal,\r\n setServerTotalPages, // <-- new\r\n\r\n // flags\r\n serverMode,\r\n rowKey,\r\n\r\n // empty state\r\n emptyState,\r\n setEmptyState,\r\n\r\n // switch filters\r\n switchFilters,\r\n toggleSwitchFilter,\r\n setSwitchFilters,\r\n switchQuery,\r\n switchFiltersConfig,\r\n\r\n // facet filter\r\n facetItems,\r\n facetFilters,\r\n toggleFacetFilter,\r\n loadFacets,\r\n facetLoading,\r\n\r\n removeFacetFilter,\r\n clearFacetFilters,\r\n };\r\n}\r\n"],"mappings":"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","names":["import_react","import_react","import_react","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","React","indG","import_jsx_runtime","import_jsx_runtime","import_react","rows"]}