pam-grid 1.1.1 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/PamGrid.tsx","../src/components/AdvanceFilter.tsx","../src/components/dropdown/PamDropdown.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/MainFilter.tsx","../src/components/FallBack.tsx","../src/components/icons/ColumnIcon.tsx","../src/components/ColumnVisibilityPanel.tsx","../src/core/useGridCore.ts"],"sourcesContent":["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 getResizeSide,\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\nimport PamDropdown from \"./dropdown/PamDropdown\";\r\nimport { PamDropdownItem } from \"../types/PamDropdown.types\";\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 customeDiv,\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 const [editingCell, setEditingCell] = useState<{\r\n rowId: GridRowId;\r\n columnKey: string;\r\n value: any;\r\n } | null>(null);\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 side: \"left\" | \"right\" = \"right\",\r\n ) => {\r\n e.preventDefault();\r\n\r\n const startX = e.clientX;\r\n\r\n const colIndex = colState.findIndex((c) => c.key === key);\r\n if (colIndex === -1) return;\r\n\r\n let targetIndex = colIndex;\r\n\r\n if (side === \"left\" && colIndex > 0) {\r\n targetIndex = colIndex - 1;\r\n }\r\n\r\n const targetCol = colState[targetIndex];\r\n if (!targetCol) return;\r\n\r\n const startWidth = targetCol.width || 120;\r\n\r\n const onMove = (ev: MouseEvent) => {\r\n let diff = ev.clientX - startX;\r\n\r\n if (side === \"left\") {\r\n diff = -diff;\r\n }\r\n\r\n const newWidth = Math.max(60, startWidth + diff);\r\n updateColumn(targetCol.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\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\r\n className={`flex-shrink-0 ${features.fullScreen ? \"\" : \"d-none\"}`}\r\n >\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 {customeDiv && customeDiv}\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, index) => {\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 onMouseMove={(e) => {\r\n const side = getResizeSide(e, index);\r\n\r\n if (side) {\r\n e.currentTarget.style.cursor = \"col-resize\";\r\n } else if (draggingCol === col.key) {\r\n e.currentTarget.style.cursor = \"grabbing\";\r\n } else if (features.reorder) {\r\n e.currentTarget.style.cursor = \"grab\";\r\n } else {\r\n e.currentTarget.style.cursor = \"default\";\r\n }\r\n }}\r\n onMouseLeave={(e) => {\r\n e.currentTarget.style.cursor = \"default\";\r\n }}\r\n onMouseDown={(e) => {\r\n const side = getResizeSide(e, index);\r\n if (!side) return;\r\n\r\n e.stopPropagation();\r\n onResizeMouseDown(e, col.key, side);\r\n }}\r\n className={`pms-col-header vs-th\r\n ${col.pinned ? `pinned pinned-${col.pinned}` : \"\"}\r\n `}\r\n style={style}\r\n >\r\n <div className=\"d-flex align-items-center w-100 px-1\">\r\n <div\r\n className={`flex-grow-1 d-flex align-items-center\r\n ${col.align === \"center\" ? \"justify-content-center\" : \"\"}\r\n ${col.align === \"end\" ? \"justify-content-end\" : \"\"}\r\n ${!col.align || col.align === \"start\" ? \"justify-content-start\" : \"\"}\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 }`}\r\n ></i>\r\n )}\r\n </div>\r\n </div>\r\n\r\n <div className=\"d-flex align-items-center gap-1 flex-shrink-0\">\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 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-secondary text-capitalize \">\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 </table>\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 </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 const isEditing =\r\n editingCell?.rowId === row[rowKey] &&\r\n editingCell?.columnKey === col.key;\r\n\r\n const handleEditStart = () => {\r\n if (features.editable && col.editable) {\r\n setEditingCell({\r\n rowId: row[rowKey] as GridRowId,\r\n columnKey: String(col.key),\r\n value: row[col.key as keyof T],\r\n });\r\n }\r\n };\r\n\r\n const handleEditSave = () => {\r\n if (editingCell) {\r\n grid.updateRow(editingCell.rowId, {\r\n [editingCell.columnKey]: editingCell.value,\r\n } as Partial<T>);\r\n setEditingCell(null);\r\n }\r\n };\r\n\r\n const handleEditCancel = () => {\r\n setEditingCell(null);\r\n };\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 handleEditStart();\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\" : \"\"} ${\r\n isEditing ? \"p-0\" : \"\"\r\n } cursor-pointer`}\r\n >\r\n {isEditing ? (\r\n <div className=\"w-100 h-100 d-flex align-items-center p-0\">\r\n {col.editType === \"select\" ? (\r\n <div className=\"w-100 h-100\">\r\n <PamDropdown\r\n placement=\"bottom-start\"\r\n className=\"w-100 h-100\"\r\n trigger={\r\n <div className=\"border-0 rounded-0 h-100 d-flex align-items-center justify-content-between bg-white px-2\">\r\n <div className=\"d-flex align-items-center gap-2\">\r\n {col.editOptions?.find(\r\n (o) =>\r\n String(o.value) ===\r\n String(editingCell.value),\r\n )?.icon && (\r\n <i\r\n className={`${\r\n col.editOptions?.find(\r\n (o) =>\r\n String(o.value) ===\r\n String(editingCell.value),\r\n )?.icon\r\n } text-secondary`}\r\n />\r\n )}\r\n <span>\r\n {col.editOptions?.find(\r\n (o) =>\r\n String(o.value) ===\r\n String(editingCell.value),\r\n )?.label ?? \"Select...\"}\r\n </span>\r\n </div>\r\n <i className=\"bx bx-chevron-down text-muted\" />\r\n </div>\r\n }\r\n items={\r\n col.editOptions?.map((opt) => ({\r\n key: String(opt.value),\r\n label: opt.label,\r\n icon: opt.icon,\r\n onClick: () => {\r\n grid.updateRow(editingCell.rowId, {\r\n [editingCell.columnKey]: opt.value,\r\n } as Partial<T>);\r\n setEditingCell(null);\r\n },\r\n })) || []\r\n }\r\n />\r\n </div>\r\n ) : (\r\n <input\r\n type={\r\n col.editType === \"number\"\r\n ? \"number\"\r\n : col.editType === \"date\"\r\n ? \"date\"\r\n : \"text\"\r\n }\r\n className=\"form-control form-control-sm border-0 rounded-0 p-0 m-0\"\r\n autoFocus\r\n value={editingCell.value ?? \"\"}\r\n onChange={(e) =>\r\n setEditingCell({\r\n ...editingCell,\r\n value: e.target.value,\r\n })\r\n }\r\n onBlur={handleEditSave}\r\n onKeyDown={(e) => {\r\n if (e.key === \"Enter\") handleEditSave();\r\n if (e.key === \"Escape\") handleEditCancel();\r\n }}\r\n />\r\n )}\r\n </div>\r\n ) : col.render ? (\r\n col.render(row)\r\n ) : (\r\n (String(row[col.key as keyof T]) ?? \"\")\r\n )}\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\nimport PamDropDown from \"./dropdown/PamDropdown\";\r\nimport { PamDropdownItem } from \"../types/PamDropdown.types\";\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 ? { type, operation, from: v1, to: v2 }\r\n : { type, operation, value: v1 }\r\n );\r\n };\r\n\r\n if (!type) return null;\r\n\r\n const isApplyDisabled =\r\n !operation || (operation === \"between\" ? !v1 || !v2 : !v1);\r\n\r\n const selectedOpLabel =\r\n OPERATORS[type].find((o) => o.key === operation)?.label || \"Select condition...\";\r\n\r\n const opItems: PamDropdownItem[] = OPERATORS[type].map((o) => ({\r\n key: o.key,\r\n label: o.label,\r\n onClick: () => setOperation(o.key),\r\n }));\r\n\r\n return (\r\n <div\r\n className=\"advance-filter-panel\"\r\n style={{ width: 260, minWidth: 260, }}\r\n onClick={(e) => e.stopPropagation()}\r\n onMouseDown={(e) => e.stopPropagation()}\r\n >\r\n {/* Header */}\r\n <div className=\"d-flex align-items-center mb-3\">\r\n <i className=\"bx bx-filter text-secondary me-2\"></i>\r\n <span className=\"text-secondary\" >\r\n Filter by Column\r\n </span>\r\n </div>\r\n\r\n {/* Operator Selection using PamDropDown */}\r\n <div className=\"mb-3\">\r\n <PamDropDown\r\n trigger={\r\n <button\r\n type=\"button\"\r\n className=\"btn d-flex align-items-center gap-2 px-2 py-1 bg-light-secondary-hover rounded\"\r\n >\r\n\r\n\r\n <span className=\"text-truncate\" style={{ maxWidth: 140 }}>\r\n {selectedOpLabel}\r\n </span>\r\n\r\n <i className=\"bx bx-xs bx-expand-vertical\"></i>\r\n </button>\r\n }\r\n items={opItems}\r\n placement=\"bottom-start\"\r\n />\r\n </div>\r\n\r\n {/* Value Inputs */}\r\n {operation && (\r\n <div className=\"mb-3\">\r\n {operation !== \"between\" ? (\r\n <input\r\n type={type === \"date\" ? \"date\" : type === \"number\" ? \"number\" : \"text\"}\r\n className=\"form-control form-control-sm\"\r\n placeholder=\"Value...\"\r\n value={v1}\r\n onChange={(e) => setV1(e.target.value)}\r\n autoFocus\r\n />\r\n ) : (\r\n <div className=\"d-flex flex-column gap-2\">\r\n <input\r\n type={type === \"date\" ? \"date\" : type === \"number\" ? \"number\" : \"text\"}\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 === \"date\" ? \"date\" : type === \"number\" ? \"number\" : \"text\"}\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 {/* Footer Actions */}\r\n <div className=\"d-flex align-items-center justify-content-between gap-2 mt-3 pt-2 border-top\">\r\n <button\r\n className=\"btn btn-sm btn-label-secondary border-0\"\r\n onClick={onClear}\r\n style={{ fontSize: \"0.75rem\", padding: \"4px 8px\" }}\r\n >\r\n Clear\r\n </button>\r\n <button\r\n className=\"btn btn-sm btn-primary\"\r\n onClick={apply}\r\n disabled={isApplyDisabled}\r\n style={{ fontSize: \"0.75rem\", padding: \"4px 16px\", borderRadius: \"4px\" }}\r\n >\r\n Apply\r\n </button>\r\n </div>\r\n\r\n <style>{`\r\n .dropdown-item-custom:hover {\r\n background-color: #f5f5f9;\r\n color: #696cff;\r\n }\r\n .advance-filter-panel .form-control:focus {\r\n border-color: #696cff;\r\n box-shadow: 0 0 0 0.1rem rgba(105, 108, 255, 0.1);\r\n }\r\n `}</style>\r\n </div>\r\n );\r\n}\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 { useEffect, useState } from \"react\";\r\nimport {\r\n AdvancedFilter,\r\n AdvancedFilterType,\r\n GridColumn,\r\n} from \"../types/grid.types\";\r\n\r\n\r\nconst EDGE_SIZE = 8; // resize trigger zone (px)\r\n// Detect edge\r\nexport const getResizeSide = (\r\n e: React.MouseEvent,\r\n index: number\r\n): \"left\" | \"right\" | null => {\r\n const rect = (e.currentTarget as HTMLElement).getBoundingClientRect();\r\n\r\n const nearRight = rect.right - e.clientX < EDGE_SIZE;\r\n const nearLeft = e.clientX - rect.left < EDGE_SIZE;\r\n\r\n if (nearRight) return \"right\";\r\n if (nearLeft && index > 0) return \"left\";\r\n\r\n return null;\r\n};\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, { 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 { getNestedValue } from \"./utils\";\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 onRowUpdate,\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 const [editedData, setEditedData] = useState<Record<string, Partial<T>>>({});\r\n\r\n const mergedData = useMemo(() => {\r\n if (Object.keys(editedData).length === 0) return data;\r\n return data.map((row) => {\r\n const id = String(row[rowKey]);\r\n return editedData[id] ? { ...row, ...editedData[id] } : row;\r\n });\r\n }, [data, editedData, rowKey]);\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 = [...mergedData]; // clone\r\n\r\n // 1. 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 // 2. ADVANCED FILTERS\r\n Object.values(advanceFilters).forEach((f) => {\r\n const { column, operation, value, from, to, type } = f;\r\n if (!column || !operation) return;\r\n\r\n filtered = filtered.filter((row) => {\r\n const rawValue = getNestedValue(row, column);\r\n if (rawValue === undefined || rawValue === null) return false;\r\n\r\n const val = type === \"number\" ? Number(rawValue) : rawValue;\r\n const compareValue = type === \"number\" ? Number(value) : value;\r\n const compareFrom = type === \"number\" ? Number(from) : from;\r\n const compareTo = type === \"number\" ? Number(to) : to;\r\n\r\n // Date comparison helper\r\n const toDate = (v: any) => {\r\n const d = new Date(v);\r\n return isNaN(d.getTime()) ? null : d;\r\n };\r\n\r\n switch (operation) {\r\n // Text & Generic\r\n case \"eq\":\r\n return String(val).toLowerCase() === String(compareValue).toLowerCase();\r\n case \"neq\":\r\n return String(val).toLowerCase() !== String(compareValue).toLowerCase();\r\n case \"contains\":\r\n return String(val).toLowerCase().includes(String(compareValue).toLowerCase());\r\n case \"starts\":\r\n return String(val).toLowerCase().startsWith(String(compareValue).toLowerCase());\r\n case \"ends\":\r\n return String(val).toLowerCase().endsWith(String(compareValue).toLowerCase());\r\n\r\n // Numbers & Generic comparison\r\n case \"gt\":\r\n return val > compareValue;\r\n case \"gte\":\r\n return val >= compareValue;\r\n case \"lt\":\r\n return val < compareValue;\r\n case \"lte\":\r\n return val <= compareValue;\r\n case \"between\":\r\n if (type === \"date\") {\r\n const dVal = toDate(val);\r\n const dFrom = toDate(compareFrom);\r\n const dTo = toDate(compareTo);\r\n if (!dVal || !dFrom || !dTo) return false;\r\n return dVal >= dFrom && dVal <= dTo;\r\n }\r\n return val >= compareFrom && val <= compareTo;\r\n\r\n // Dates specific\r\n case \"before\": {\r\n const dVal = toDate(val);\r\n const dComp = toDate(compareValue);\r\n return dVal && dComp ? dVal < dComp : false;\r\n }\r\n case \"after\": {\r\n const dVal = toDate(val);\r\n const dComp = toDate(compareValue);\r\n return dVal && dComp ? dVal > dComp : false;\r\n }\r\n\r\n default:\r\n return true;\r\n }\r\n });\r\n });\r\n\r\n // 3. FACET FILTERS\r\n Object.entries(facetFilters).forEach(([column, items]) => {\r\n if (!items || items.length === 0) return;\r\n const allowedIds = new Set(items.map((i) => String(i.id)));\r\n\r\n filtered = filtered.filter((row) => {\r\n const val = getNestedValue(row, column);\r\n return allowedIds.has(String(val ?? \"\"));\r\n });\r\n });\r\n\r\n // 4. SORT\r\n if (sortBy.key) {\r\n const dir = sortBy.dir === \"asc\" ? 1 : -1;\r\n filtered.sort((a, b) => {\r\n const vA = a?.[sortBy.key as string] ?? \"\";\r\n const vB = b?.[sortBy.key as string] ?? \"\";\r\n\r\n return (\r\n String(vA).localeCompare(String(vB), undefined, {\r\n numeric: true,\r\n sensitivity: \"base\",\r\n }) * dir\r\n );\r\n });\r\n }\r\n\r\n return filtered;\r\n }, [mergedData, debouncedSearch, sortBy, serverMode, advanceFilters, facetFilters]);\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 const updateRow = useCallback((id: GridRowId, patch: Partial<T>) => {\r\n setEditedData((prev) => ({\r\n ...prev,\r\n [String(id)]: { ...(prev[String(id)] || {}), ...patch },\r\n }));\r\n if (onRowUpdate) onRowUpdate(id, patch);\r\n }, [onRowUpdate]);\r\n\r\n const clearEdits = useCallback(() => {\r\n setEditedData({});\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 updateRow,\r\n clearEdits,\r\n };\r\n}\r\n"],"mappings":"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","names":["React","useEffect","useRef","useState","useState","useEffect","jsx","jsxs","useState","useEffect","useEffect","useState","useEffect","useMemo","useState","jsx","jsxs","Fragment","jsx","jsxs","jsx","jsxs","jsx","jsx","jsx","jsxs","jsx","jsx","jsxs","jsx","jsxs","Fragment","jsx","jsxs","jsx","jsxs","useState","useRef","React","useEffect","indG","jsx","jsx","jsxs","useState","useMemo","useEffect","useState","useMemo","useEffect","rows"]}
1
+ {"version":3,"sources":["../src/components/PamGrid.tsx","../src/components/AdvanceFilter.tsx","../src/components/dropdown/PamDropdown.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/MainFilter.tsx","../src/components/FallBack.tsx","../src/components/icons/ColumnIcon.tsx","../src/components/ColumnVisibilityPanel.tsx","../src/core/useGridCore.ts"],"sourcesContent":["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 getResizeSide,\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\nimport PamDropdown from \"./dropdown/PamDropdown\";\r\nimport { PamDropdownItem } from \"../types/PamDropdown.types\";\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 customeDiv,\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 const [editingCell, setEditingCell] = useState<{\r\n rowId: GridRowId;\r\n columnKey: string;\r\n value: any;\r\n } | null>(null);\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 totalRecord,\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 side: \"left\" | \"right\" = \"right\",\r\n ) => {\r\n e.preventDefault();\r\n\r\n const startX = e.clientX;\r\n\r\n const colIndex = colState.findIndex((c) => c.key === key);\r\n if (colIndex === -1) return;\r\n\r\n let targetIndex = colIndex;\r\n\r\n if (side === \"left\" && colIndex > 0) {\r\n targetIndex = colIndex - 1;\r\n }\r\n\r\n const targetCol = colState[targetIndex];\r\n if (!targetCol) return;\r\n\r\n const startWidth = targetCol.width || 120;\r\n\r\n const onMove = (ev: MouseEvent) => {\r\n let diff = ev.clientX - startX;\r\n\r\n if (side === \"left\") {\r\n diff = -diff;\r\n }\r\n\r\n const newWidth = Math.max(60, startWidth + diff);\r\n updateColumn(targetCol.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\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 ${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={`${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 ${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\r\n className={`flex-shrink-0 ${features.fullScreen ? \"\" : \"d-none\"}`}\r\n >\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 {customeDiv && customeDiv}\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, index) => {\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 onMouseMove={(e) => {\r\n const side = getResizeSide(e, index);\r\n\r\n if (side) {\r\n e.currentTarget.style.cursor = \"col-resize\";\r\n } else if (draggingCol === col.key) {\r\n e.currentTarget.style.cursor = \"grabbing\";\r\n } else if (features.reorder) {\r\n e.currentTarget.style.cursor = \"grab\";\r\n } else {\r\n e.currentTarget.style.cursor = \"default\";\r\n }\r\n }}\r\n onMouseLeave={(e) => {\r\n e.currentTarget.style.cursor = \"default\";\r\n }}\r\n onMouseDown={(e) => {\r\n const side = getResizeSide(e, index);\r\n if (!side) return;\r\n\r\n e.stopPropagation();\r\n onResizeMouseDown(e, col.key, side);\r\n }}\r\n className={`pms-col-header vs-th\r\n ${col.pinned ? `pinned pinned-${col.pinned}` : \"\"}\r\n `}\r\n style={style}\r\n >\r\n <div className=\"d-flex align-items-center w-100 px-1\">\r\n <div\r\n className={`flex-grow-1 d-flex align-items-center\r\n ${col.align === \"center\" ? \"justify-content-center\" : \"\"}\r\n ${col.align === \"end\" ? \"justify-content-end\" : \"\"}\r\n ${!col.align || col.align === \"start\" ? \"justify-content-start\" : \"\"}\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 ${sortBy.dir === \"asc\"\r\n ? \"bxs-chevron-up\"\r\n : \"bxs-chevron-down\"\r\n }`}\r\n ></i>\r\n )}\r\n </div>\r\n </div>\r\n\r\n <div className=\"d-flex align-items-center gap-1 flex-shrink-0\">\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 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-secondary text-capitalize \">\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 </table>\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 </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 <small className=\"text-secondary\">\r\n Showing {rows.length === 0 ? 0 : (page - 1) * pageSize + 1} - {(page - 1) * pageSize + rows.length} of {totalRecord}\r\n </small>\r\n {features.pageSizeSelector && (\r\n <div className=\"d-flex align-items-center gap-2 ms-2\">\r\n <PamDropdown\r\n placement=\"top-start\"\r\n trigger={\r\n <button className=\"btn btn-sm border bg-white d-flex align-items-center gap-1\">\r\n {pageSize} <i className=\"bx bx-chevron-down text-muted\" />\r\n </button>\r\n }\r\n items={[20, 50, 100].map((n) => ({\r\n key: String(n),\r\n label: String(n),\r\n onClick: () => setPageSize(n),\r\n }))}\r\n />\r\n <small className=\"text-secondary\">per page</small>\r\n </div>\r\n )}\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 ${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 const isEditing =\r\n editingCell?.rowId === row[rowKey] &&\r\n editingCell?.columnKey === col.key;\r\n\r\n const handleEditStart = () => {\r\n if (features.editable && col.editable) {\r\n setEditingCell({\r\n rowId: row[rowKey] as GridRowId,\r\n columnKey: String(col.key),\r\n value: row[col.key as keyof T],\r\n });\r\n }\r\n };\r\n\r\n const handleEditSave = () => {\r\n if (editingCell) {\r\n grid.updateRow(editingCell.rowId, {\r\n [editingCell.columnKey]: editingCell.value,\r\n } as Partial<T>);\r\n setEditingCell(null);\r\n }\r\n };\r\n\r\n const handleEditCancel = () => {\r\n setEditingCell(null);\r\n };\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 handleEditStart();\r\n }}\r\n className={`${col.className ?? \"\"} ${col.pinned\r\n ? \"pinned-left px-3 bg-white pms-grid td pinned\"\r\n : \"px-3\"\r\n } ${isActive ? \"grid-cell-active\" : \"\"} ${isEditing ? \"p-0\" : \"\"\r\n } cursor-pointer`}\r\n >\r\n {isEditing ? (\r\n <div className=\"w-100 h-100 d-flex align-items-center p-0\">\r\n {col.editType === \"select\" ? (\r\n <div className=\"w-100 h-100\">\r\n <PamDropdown\r\n placement=\"bottom-start\"\r\n className=\"w-100 h-100\"\r\n trigger={\r\n <div className=\"border-0 rounded-0 h-100 d-flex align-items-center justify-content-between bg-white px-2\">\r\n <div className=\"d-flex align-items-center gap-2\">\r\n {col.editOptions?.find(\r\n (o) =>\r\n String(o.value) ===\r\n String(editingCell.value),\r\n )?.icon && (\r\n <i\r\n className={`${col.editOptions?.find(\r\n (o) =>\r\n String(o.value) ===\r\n String(editingCell.value),\r\n )?.icon\r\n } text-secondary`}\r\n />\r\n )}\r\n <span>\r\n {col.editOptions?.find(\r\n (o) =>\r\n String(o.value) ===\r\n String(editingCell.value),\r\n )?.label ?? \"Select...\"}\r\n </span>\r\n </div>\r\n <i className=\"bx bx-chevron-down text-muted\" />\r\n </div>\r\n }\r\n items={\r\n col.editOptions?.map((opt) => ({\r\n key: String(opt.value),\r\n label: opt.label,\r\n icon: opt.icon,\r\n onClick: () => {\r\n grid.updateRow(editingCell.rowId, {\r\n [editingCell.columnKey]: opt.value,\r\n } as Partial<T>);\r\n setEditingCell(null);\r\n },\r\n })) || []\r\n }\r\n />\r\n </div>\r\n ) : (\r\n <input\r\n type={\r\n col.editType === \"number\"\r\n ? \"number\"\r\n : col.editType === \"date\"\r\n ? \"date\"\r\n : \"text\"\r\n }\r\n className=\"form-control form-control-sm border-0 rounded-0 p-0 m-0\"\r\n autoFocus\r\n value={editingCell.value ?? \"\"}\r\n onChange={(e) =>\r\n setEditingCell({\r\n ...editingCell,\r\n value: e.target.value,\r\n })\r\n }\r\n onBlur={handleEditSave}\r\n onKeyDown={(e) => {\r\n if (e.key === \"Enter\") handleEditSave();\r\n if (e.key === \"Escape\") handleEditCancel();\r\n }}\r\n />\r\n )}\r\n </div>\r\n ) : col.render ? (\r\n col.render(row)\r\n ) : (\r\n (String(row[col.key as keyof T]) ?? \"\")\r\n )}\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\nimport PamDropDown from \"./dropdown/PamDropdown\";\r\nimport { PamDropdownItem } from \"../types/PamDropdown.types\";\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 ? { type, operation, from: v1, to: v2 }\r\n : { type, operation, value: v1 }\r\n );\r\n };\r\n\r\n if (!type) return null;\r\n\r\n const isApplyDisabled =\r\n !operation || (operation === \"between\" ? !v1 || !v2 : !v1);\r\n\r\n const selectedOpLabel =\r\n OPERATORS[type].find((o) => o.key === operation)?.label || \"Select condition...\";\r\n\r\n const opItems: PamDropdownItem[] = OPERATORS[type].map((o) => ({\r\n key: o.key,\r\n label: o.label,\r\n onClick: () => setOperation(o.key),\r\n }));\r\n\r\n return (\r\n <div\r\n className=\"advance-filter-panel\"\r\n style={{ width: 260, minWidth: 260, }}\r\n onClick={(e) => e.stopPropagation()}\r\n onMouseDown={(e) => e.stopPropagation()}\r\n >\r\n {/* Header */}\r\n <div className=\"d-flex align-items-center mb-3\">\r\n <i className=\"bx bx-filter text-secondary me-2\"></i>\r\n <span className=\"text-secondary\" >\r\n Filter by Column\r\n </span>\r\n </div>\r\n\r\n {/* Operator Selection using PamDropDown */}\r\n <div className=\"mb-3\">\r\n <PamDropDown\r\n trigger={\r\n <button\r\n type=\"button\"\r\n className=\"btn d-flex align-items-center gap-2 px-2 py-1 bg-light-secondary-hover rounded\"\r\n >\r\n\r\n\r\n <span className=\"text-truncate\" style={{ maxWidth: 140 }}>\r\n {selectedOpLabel}\r\n </span>\r\n\r\n <i className=\"bx bx-xs bx-expand-vertical\"></i>\r\n </button>\r\n }\r\n items={opItems}\r\n placement=\"bottom-start\"\r\n />\r\n </div>\r\n\r\n {/* Value Inputs */}\r\n {operation && (\r\n <div className=\"mb-3\">\r\n {operation !== \"between\" ? (\r\n <input\r\n type={type === \"date\" ? \"date\" : type === \"number\" ? \"number\" : \"text\"}\r\n className=\"form-control form-control-sm\"\r\n placeholder=\"Value...\"\r\n value={v1}\r\n onChange={(e) => setV1(e.target.value)}\r\n autoFocus\r\n />\r\n ) : (\r\n <div className=\"d-flex flex-column gap-2\">\r\n <input\r\n type={type === \"date\" ? \"date\" : type === \"number\" ? \"number\" : \"text\"}\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 === \"date\" ? \"date\" : type === \"number\" ? \"number\" : \"text\"}\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 {/* Footer Actions */}\r\n <div className=\"d-flex align-items-center justify-content-between gap-2 mt-3 pt-2 border-top\">\r\n <button\r\n className=\"btn btn-sm btn-label-secondary border-0\"\r\n onClick={onClear}\r\n style={{ fontSize: \"0.75rem\", padding: \"4px 8px\" }}\r\n >\r\n Clear\r\n </button>\r\n <button\r\n className=\"btn btn-sm btn-primary\"\r\n onClick={apply}\r\n disabled={isApplyDisabled}\r\n style={{ fontSize: \"0.75rem\", padding: \"4px 16px\", borderRadius: \"4px\" }}\r\n >\r\n Apply\r\n </button>\r\n </div>\r\n\r\n <style>{`\r\n .dropdown-item-custom:hover {\r\n background-color: #f5f5f9;\r\n color: #696cff;\r\n }\r\n .advance-filter-panel .form-control:focus {\r\n border-color: #696cff;\r\n box-shadow: 0 0 0 0.1rem rgba(105, 108, 255, 0.1);\r\n }\r\n `}</style>\r\n </div>\r\n );\r\n}\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 title?: 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 title,\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 {title && <div className=\"pam-dropdown-title\">{title}</div>}\r\n <div className=\"pam-list-wrapper\">\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\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 { useEffect, useState } from \"react\";\r\nimport {\r\n AdvancedFilter,\r\n AdvancedFilterType,\r\n GridColumn,\r\n} from \"../types/grid.types\";\r\n\r\n\r\nconst EDGE_SIZE = 8; // resize trigger zone (px)\r\n// Detect edge\r\nexport const getResizeSide = (\r\n e: React.MouseEvent,\r\n index: number\r\n): \"left\" | \"right\" | null => {\r\n const rect = (e.currentTarget as HTMLElement).getBoundingClientRect();\r\n\r\n const nearRight = rect.right - e.clientX < EDGE_SIZE;\r\n const nearLeft = e.clientX - rect.left < EDGE_SIZE;\r\n\r\n if (nearRight) return \"right\";\r\n if (nearLeft && index > 0) return \"left\";\r\n\r\n return null;\r\n};\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 \r\n className=\"pam-grid-facet-filter\" \r\n style={{ width: 240 }}\r\n onClick={(e) => e.stopPropagation()}\r\n onMouseDown={(e) => e.stopPropagation()}\r\n >\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, { 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 { getNestedValue } from \"./utils\";\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 onRowUpdate,\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 [totalRecord, setTotalRecord] = useState<number>(0)\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 const [editedData, setEditedData] = useState<Record<string, Partial<T>>>({});\r\n\r\n const mergedData = useMemo(() => {\r\n if (Object.keys(editedData).length === 0) return data;\r\n return data.map((row) => {\r\n const id = String(row[rowKey]);\r\n return editedData[id] ? { ...row, ...editedData[id] } : row;\r\n });\r\n }, [data, editedData, rowKey]);\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 = [...mergedData]; // clone\r\n\r\n // 1. 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 // 2. ADVANCED FILTERS\r\n Object.values(advanceFilters).forEach((f) => {\r\n const { column, operation, value, from, to, type } = f;\r\n if (!column || !operation) return;\r\n\r\n filtered = filtered.filter((row) => {\r\n const rawValue = getNestedValue(row, column);\r\n if (rawValue === undefined || rawValue === null) return false;\r\n\r\n const val = type === \"number\" ? Number(rawValue) : rawValue;\r\n const compareValue = type === \"number\" ? Number(value) : value;\r\n const compareFrom = type === \"number\" ? Number(from) : from;\r\n const compareTo = type === \"number\" ? Number(to) : to;\r\n\r\n // Date comparison helper\r\n const toDate = (v: any) => {\r\n const d = new Date(v);\r\n return isNaN(d.getTime()) ? null : d;\r\n };\r\n\r\n switch (operation) {\r\n // Text & Generic\r\n case \"eq\":\r\n return String(val).toLowerCase() === String(compareValue).toLowerCase();\r\n case \"neq\":\r\n return String(val).toLowerCase() !== String(compareValue).toLowerCase();\r\n case \"contains\":\r\n return String(val).toLowerCase().includes(String(compareValue).toLowerCase());\r\n case \"starts\":\r\n return String(val).toLowerCase().startsWith(String(compareValue).toLowerCase());\r\n case \"ends\":\r\n return String(val).toLowerCase().endsWith(String(compareValue).toLowerCase());\r\n\r\n // Numbers & Generic comparison\r\n case \"gt\":\r\n return val > compareValue;\r\n case \"gte\":\r\n return val >= compareValue;\r\n case \"lt\":\r\n return val < compareValue;\r\n case \"lte\":\r\n return val <= compareValue;\r\n case \"between\":\r\n if (type === \"date\") {\r\n const dVal = toDate(val);\r\n const dFrom = toDate(compareFrom);\r\n const dTo = toDate(compareTo);\r\n if (!dVal || !dFrom || !dTo) return false;\r\n return dVal >= dFrom && dVal <= dTo;\r\n }\r\n return val >= compareFrom && val <= compareTo;\r\n\r\n // Dates specific\r\n case \"before\": {\r\n const dVal = toDate(val);\r\n const dComp = toDate(compareValue);\r\n return dVal && dComp ? dVal < dComp : false;\r\n }\r\n case \"after\": {\r\n const dVal = toDate(val);\r\n const dComp = toDate(compareValue);\r\n return dVal && dComp ? dVal > dComp : false;\r\n }\r\n\r\n default:\r\n return true;\r\n }\r\n });\r\n });\r\n\r\n // 3. FACET FILTERS\r\n Object.entries(facetFilters).forEach(([column, items]) => {\r\n if (!items || items.length === 0) return;\r\n const allowedIds = new Set(items.map((i) => String(i.id)));\r\n\r\n filtered = filtered.filter((row) => {\r\n const val = getNestedValue(row, column);\r\n return allowedIds.has(String(val ?? \"\"));\r\n });\r\n });\r\n\r\n // 4. SORT\r\n if (sortBy.key) {\r\n const dir = sortBy.dir === \"asc\" ? 1 : -1;\r\n filtered.sort((a, b) => {\r\n const vA = a?.[sortBy.key as string] ?? \"\";\r\n const vB = b?.[sortBy.key as string] ?? \"\";\r\n\r\n return (\r\n String(vA).localeCompare(String(vB), undefined, {\r\n numeric: true,\r\n sensitivity: \"base\",\r\n }) * dir\r\n );\r\n });\r\n }\r\n\r\n return filtered;\r\n }, [mergedData, debouncedSearch, sortBy, serverMode, advanceFilters, facetFilters]);\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 const updateRow = useCallback((id: GridRowId, patch: Partial<T>) => {\r\n setEditedData((prev) => ({\r\n ...prev,\r\n [String(id)]: { ...(prev[String(id)] || {}), ...patch },\r\n }));\r\n if (onRowUpdate) onRowUpdate(id, patch);\r\n }, [onRowUpdate]);\r\n\r\n const clearEdits = useCallback(() => {\r\n setEditedData({});\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 totalRecord,\r\n setTotalRecord,\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 updateRow,\r\n clearEdits,\r\n };\r\n}\r\n"],"mappings":"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","names":["React","useEffect","useRef","useState","useState","useEffect","jsx","jsxs","useState","useEffect","useEffect","useState","useEffect","useMemo","useState","jsx","jsxs","Fragment","jsx","jsxs","jsx","jsxs","jsx","jsx","jsx","jsxs","jsx","jsx","jsxs","jsx","jsxs","Fragment","jsx","jsxs","jsx","jsxs","useState","useRef","React","useEffect","indG","jsx","jsx","jsxs","useState","useMemo","useEffect","useState","useMemo","useEffect","rows"]}