From e8fe1bd97076fa85355bf96d2218b6796e0cc007 Mon Sep 17 00:00:00 2001 From: Widle Date: Wed, 13 May 2026 13:04:23 +0530 Subject: [PATCH] Delete code due to some mistakes. --- .../.DS_Store | Bin 6148 -> 0 bytes .../README.md | 137 -- .../cover.png | Bin 59947 -> 0 bytes .../metadata.json | 17 - .../package.json | 47 - .../src/index.tsx | 1903 ----------------- 6 files changed, 2104 deletions(-) delete mode 100644 components/expandable-row-table-component-v2/.DS_Store delete mode 100644 components/expandable-row-table-component-v2/README.md delete mode 100644 components/expandable-row-table-component-v2/cover.png delete mode 100644 components/expandable-row-table-component-v2/metadata.json delete mode 100644 components/expandable-row-table-component-v2/package.json delete mode 100644 components/expandable-row-table-component-v2/src/index.tsx diff --git a/components/expandable-row-table-component-v2/.DS_Store b/components/expandable-row-table-component-v2/.DS_Store deleted file mode 100644 index 7e590d2adcb537f0df2046f8405880c82fb58eb5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHKL2uJA6n<_CO*AI;0Mag#B5|!sM`6;mODNr82QCYO1E7*LRSC=DDoNKvRVioo zW4Q85_%EE`d$x;cx?K@Me$w;jJipJ5za(}{L}IvzkBB-%+u3)lVIpmy zP<`aoqd8?XJ5P7AZQx&2fS;X96OwdIQ~Kli$w`#T2(A2Tyny$9DnpHEpRSNyQb;kJ zu}7b&Krh*Oy2bojV?Mz95n{Yclr!{k2TvTpXh=XgcDa$@2|X8a17SIeZ8+vM?tUp+-mlo=PX-YqX_Rz$&nh1U`~1I6 zvR76CtH6JyfM|_^(GXKId+W~Rc(3)~AK`4AS84oBK}BuF$mOm00Im#ik1IgmV5Jce QnEeq@GT6c@@K+W11*nFL9{>OV diff --git a/components/expandable-row-table-component-v2/README.md b/components/expandable-row-table-component-v2/README.md deleted file mode 100644 index 6503e6c..0000000 --- a/components/expandable-row-table-component-v2/README.md +++ /dev/null @@ -1,137 +0,0 @@ -# Expandable Row Table for Retool - -A highly customizable expandable row table component built with React, TypeScript, and the Retool Custom Component SDK. - -This component is designed for advanced operational dashboards, analytics tooling, audit monitoring, transaction inspection, and enterprise-style data grid interactions inside Retool. - ---- - -## Features - -### Expandable Rows - -* Expandable detail sections -* Recursive nested JSON rendering -* Automatic key-value formatting -* Multi-key expandable support -* API response inspection -* Object and array visualization -* Long text handling -* URL rendering - -### Advanced Table Features - -* Dynamic column visibility -* Drag-and-drop column rearranging -* Persistent column ordering -* ASC → DESC → Reset sorting -* Search and filtering -* Pagination -* Responsive layout -* CSV export -* Interactive row selection - -### Styling Controls - -* Header colors -* Row colors -* Alternate row colors -* Font customization -* Footer styling -* Pagination styling -* Theme-aware design - ---- - -## Technology Stack - -* React 18 -* TypeScript -* Retool Custom Component SDK -* Lucide React Icons - ---- - -## Inputs - -| Property | Type | Description | -| ---------------------- | ------- | -------------------------------- | -| tableData | Array | Main table dataset | -| pageSize | Number | Rows per page | -| expandableDataKey | String | Expandable object field(s) | -| showToolbar | Boolean | Toggle toolbar | -| showSearchBar | Boolean | Toggle search | -| headerColor | String | Header background | -| headerTextColor | String | Header text color | -| rowBackground | String | Row background | -| alternateRowBackground | String | Alternate row background | -| accentColor | String | Accent/highlight color | -| footerBackgroundColor | String | Footer background | -| paginationTextColor | String | Pagination text color | -| rowHeight | Enum | Small / Medium / Large / Dynamic | -| columnWidthMode | Enum | Auto / Manual | - ---- - -## Outputs - -| Property | Type | Description | -| --------------- | ------ | -------------------------- | -| selectedRowData | Object | Selected row data | -| columnOrder | Array | Current column arrangement | -| visibleColumns | Array | Visible table columns | - ---- - -## Expandable Data Examples - -### Single Key - -```txt -metadata -``` - -### Multiple Keys - -```txt -metadata,api_response,tags -``` - -### JSON Array Format - -```json -["metadata","api_response","tags"] -``` - ---- - -## Sorting Behavior - -* First click → Ascending -* Second click → Descending -* Third click → Reset sorting - ---- - -## Column Rearranging - -Columns support drag-and-drop reordering and persist after refresh using Retool state storage. - ---- - -## Use Cases - -* Audit Logs -* Transaction Monitoring -* API Debugging -* Financial Dashboards -* Shipment Tracking -* Analytics Dashboards -* Internal Admin Tools -* Operational Monitoring - ---- - -## License - -MIT License diff --git a/components/expandable-row-table-component-v2/cover.png b/components/expandable-row-table-component-v2/cover.png deleted file mode 100644 index 1af05fe387bc14d7be0b50194ad8c47389c4f89d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 59947 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

*tSnd-Qyf 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 i8-o#^6#xL(KK=t|o4xDUJ*^r50000=20.0.0" - }, - "scripts": { - "dev": "npx retool-ccl dev", - "deploy": "npx retool-ccl deploy" - }, - "browserslist": { - "production": [ - ">0.2%", - "not dead", - "not op_mini all" - ], - "development": [ - "last 1 chrome version", - "last 1 firefox version", - "last 1 safari version" - ] - }, - "devDependencies": { - "@types/react": "^18.2.55", - "@typescript-eslint/eslint-plugin": "^7.3.1", - "@typescript-eslint/parser": "^7.3.1", - "eslint": "^8.57.0", - "eslint-plugin-react": "^7.34.1", - "postcss-modules": "^6.0.0", - "prettier": "^3.0.3" - }, - "retoolCustomComponentLibraryConfig": { - "name": "ExpandableRowTable", - "label": "Expandable Row Table", - "description": "Table with exapndable row feature with responsive.", - "entryPoint": "src/index.tsx", - "outputPath": "dist" - } -} \ No newline at end of file diff --git a/components/expandable-row-table-component-v2/src/index.tsx b/components/expandable-row-table-component-v2/src/index.tsx deleted file mode 100644 index 281af38..0000000 --- a/components/expandable-row-table-component-v2/src/index.tsx +++ /dev/null @@ -1,1903 +0,0 @@ -import React, { FC, useEffect, useMemo, useState } from 'react' -import { Retool } from '@tryretool/custom-component-support' -import { - ChevronDown, - ChevronRight, - Download, - RefreshCcw, -} from 'lucide-react' - -export const ExpandableTableComponent: FC = () => { - const [data] = Retool.useStateArray({ - name: 'tableData', - label: 'Table Data', - description: - 'Main dataset for the table component', - }) - - const [ - selectedRowData, - setSelectedRowData, - ] = Retool.useStateObject({ - name: 'selectedRowData', - label: 'Selected Row Data', - description: - 'Currently selected row output', - }) - - const [expandableDataKey] = - Retool.useStateString({ - name: 'expandableDataKey', - initialValue: '', - label: 'Expandable Data Keys', - description: - 'Single or multiple expandable keys. Supports: metadata OR metadata,api_response OR ["metadata","api_response"]', - }) - - const [pageSize] = - Retool.useStateNumber({ - name: 'pageSize', - initialValue: 10, - label: 'Page Size', - description: - 'Number of rows per page', - }) - - const [headerColor] = - Retool.useStateString({ - name: 'headerColor', - initialValue: '#f3f4f6', - label: 'Header Background', - description: - 'Table header background color', - }) - - const [headerTextColor] = - Retool.useStateString({ - name: 'headerTextColor', - initialValue: '#111827', - label: 'Header Text Color', - description: - 'Table header text color', - }) - - const [accentColor] = - Retool.useStateString({ - name: 'accentColor', - initialValue: '#2563eb', - label: 'Accent Color', - description: - 'Primary highlight color', - }) - - const [ - visibleColumns, - setVisibleColumns, - ] = Retool.useStateArray({ - name: 'visibleColumns', - label: 'Visible Columns', - description: - 'Columns visible in the table', - }) - - const [ - columnOrder, - setColumnOrder, - ] = Retool.useStateArray({ - name: 'columnOrder', - label: 'Column Order', - description: - 'Persisted draggable column order', - }) - - const [fontFamily] = - Retool.useStateString({ - name: 'fontFamily', - initialValue: - 'Inter, system-ui, sans-serif', - label: 'Font Family', - description: - 'Global table font family', - }) - - const [headerFontSize] = - Retool.useStateNumber({ - name: 'headerFontSize', - initialValue: 14, - label: 'Header Font Size', - description: - 'Header text font size', - }) - - const [bodyFontSize] = - Retool.useStateNumber({ - name: 'bodyFontSize', - initialValue: 14, - label: 'Body Font Size', - description: - 'Table body font size', - }) - - const [rowBackground] = - Retool.useStateString({ - name: 'rowBackground', - initialValue: '#ffffff', - label: 'Row Background', - description: - 'Default table row background', - }) - - const [alternateRowBackground] = - Retool.useStateString({ - name: - 'alternateRowBackground', - initialValue: '#fafafa', - label: - 'Alternate Row Background', - description: - 'Alternate row background color', - }) - - const [emptyStateMessage] = - Retool.useStateString({ - name: 'emptyStateMessage', - initialValue: 'No rows found', - label: 'Empty State Message', - description: - 'Shown when no table rows exist', - }) - - const [showSearchBar] = - Retool.useStateBoolean({ - name: 'showSearchBar', - initialValue: true, - label: 'Show Search Bar', - inspector: 'checkbox', - description: - 'Toggle search bar visibility', - }) - - const [showToolbar] = - Retool.useStateBoolean({ - name: 'showToolbar', - initialValue: true, - label: 'Show Toolbar', - inspector: 'checkbox', - description: - 'Toggle footer toolbar actions', - }) - - const [rowHeight] = - Retool.useStateEnumeration({ - name: 'rowHeight', - enumDefinition: [ - 'small', - 'medium', - 'large', - 'dynamic', - ], - enumLabels: { - small: 'Small', - medium: 'Medium', - large: 'Large', - dynamic: 'Dynamic', - }, - initialValue: 'medium', - inspector: 'select', - label: 'Row Height', - description: - 'Height style of table rows', - }) - - const [columnWidthMode] = - Retool.useStateEnumeration({ - name: 'columnWidthMode', - enumDefinition: [ - 'auto', - 'manual', - ], - enumLabels: { - auto: 'Auto', - manual: 'Manual', - }, - initialValue: 'auto', - inspector: 'select', - label: 'Column Width Mode', - description: - 'Auto width or manual resizable columns', - }) - - const [footerBackgroundColor] = - Retool.useStateString({ - name: - 'footerBackgroundColor', - initialValue: '#ffffff', - label: - 'Footer Background Color', - description: - 'Footer background color', - }) - - const [footerBorderColor] = - Retool.useStateString({ - name: - 'footerBorderColor', - initialValue: '#e5e7eb', - label: - 'Footer Border Color', - description: - 'Footer top border color', - }) - - const [paginationTextColor] = - Retool.useStateString({ - name: - 'paginationTextColor', - initialValue: '#111827', - label: - 'Pagination Text Color', - description: - 'Pagination text/icon color', - }) - - const [paginationButtonBackground] = - Retool.useStateString({ - name: - 'paginationButtonBackground', - initialValue: '#ffffff', - label: - 'Pagination Button Background', - description: - 'Pagination button background', - }) - - const [paginationActiveBackground] = - Retool.useStateString({ - name: - 'paginationActiveBackground', - initialValue: '#eff6ff', - label: - 'Pagination Active Background', - description: - 'Current page indicator background', - }) - - const [paginationFontSize] = - Retool.useStateNumber({ - name: - 'paginationFontSize', - initialValue: 14, - label: - 'Pagination Font Size', - description: - 'Pagination font size', - }) - - const safeData = Array.isArray(data) - ? data - : [] - - const safeHeaderColor = - headerColor || '#f3f4f6' - - const safeHeaderTextColor = - headerTextColor || '#111827' - - const safeAccentColor = - accentColor || '#2563eb' - - const safeFontFamily = - fontFamily || - 'Inter, system-ui, sans-serif' - - const safeRowBackground = - rowBackground || '#ffffff' - - const safeAlternateRowBackground = - alternateRowBackground || '#fafafa' - - const safeHeaderFontSize = - Number(headerFontSize) || 14 - - const safeBodyFontSize = - Number(bodyFontSize) || 14 - - const safePageSize = - Number(pageSize) || 10 - - const safeFooterBackgroundColor = - footerBackgroundColor || - '#ffffff' - - const safeFooterBorderColor = - footerBorderColor || - '#e5e7eb' - - const safePaginationTextColor = - paginationTextColor || - '#111827' - - const safePaginationButtonBackground = - paginationButtonBackground || - '#ffffff' - - const safePaginationActiveBackground = - paginationActiveBackground || - '#eff6ff' - - const safePaginationFontSize = - Number( - paginationFontSize - ) || 14 - - const [selectedRow, setSelectedRow] = - useState(null) - - const [expandedRow, setExpandedRow] = - useState(null) - - const [searchTerm, setSearchTerm] = - useState('') - - const [sortConfig, setSortConfig] = - useState<{ - key: string - direction: 'asc' | 'desc' - } | null>(null) - - const [currentPage, setCurrentPage] = - useState(1) - - const [ - draggedColumn, - setDraggedColumn, - ] = useState( - null - ) - - const getRowHeight = () => { - switch (rowHeight) { - case 'small': - return 38 - - case 'large': - return 72 - - case 'dynamic': - return 'auto' - - default: - return 52 - } - } - - useEffect(() => { - if ( - selectedRow !== null && - paginatedData.length - ) { - const matchedRow = - paginatedData.find( - (row, index) => - (row?.id ?? index) === - selectedRow - ) - - if (matchedRow) { - setSelectedRowData({ - ...matchedRow, - __selectedRowId: - selectedRow, - }) - } - } - }, [selectedRow]) - - const rowHeightValue = - getRowHeight() - - const allColumns = useMemo(() => { - if ( - !safeData.length || - typeof safeData[0] !== 'object' - ) { - return [] - } - - return Object.keys( - safeData[0] - ).filter((key) => { - if (!expandableDataKey) - return true - - return ( - key !== expandableDataKey - ) - }) - }, [safeData, expandableDataKey]) - - useEffect(() => { - if (!allColumns.length) { - return - } - - if ( - !Array.isArray( - columnOrder - ) || - !columnOrder.length - ) { - setColumnOrder(allColumns) - - return - } - - const missingColumns = - allColumns.filter( - (col) => - !columnOrder.includes(col) - ) - - if (missingColumns.length) { - setColumnOrder([ - ...columnOrder, - ...missingColumns, - ]) - } - }, [allColumns]) - - const tableHeaders = useMemo(() => { - const orderedColumns = - Array.isArray( - columnOrder - ) && - columnOrder.length - ? columnOrder.filter((col) => - allColumns.includes(col) - ) - : allColumns - - if ( - !Array.isArray( - visibleColumns - ) || - !visibleColumns.length - ) { - return orderedColumns - } - - return orderedColumns.filter((col) => - visibleColumns.includes(col) - ) - }, [ - allColumns, - visibleColumns, - columnOrder, - ]) - - const filteredSortedData = useMemo(() => { - let filtered = [...safeData] - - if (searchTerm) { - filtered = filtered.filter( - (row) => - Object.values( - row || {} - ).some((value) => - String(value) - .toLowerCase() - .includes( - searchTerm.toLowerCase() - ) - ) - ) - } - - if (sortConfig) { - filtered.sort((a, b) => { - const A = - a?.[sortConfig.key] - const B = - b?.[sortConfig.key] - - if (A < B) { - return sortConfig.direction === - 'asc' - ? -1 - : 1 - } - - if (A > B) { - return sortConfig.direction === - 'asc' - ? 1 - : -1 - } - - return 0 - }) - } - - return filtered - }, [ - safeData, - searchTerm, - sortConfig, - ]) - - const paginatedData = useMemo(() => { - const start = - (currentPage - 1) * - safePageSize - - return filteredSortedData.slice( - start, - start + safePageSize - ) - }, [ - filteredSortedData, - currentPage, - safePageSize, - ]) - - const totalPages = Math.max( - 1, - Math.ceil( - filteredSortedData.length / - safePageSize - ) - ) - - useEffect(() => { - if (paginatedData.length > 0) { - const existsOnPage = - paginatedData.some( - (row, index) => - (row?.id ?? index) === - selectedRow - ) - - if (!existsOnPage) { - const firstRow = - paginatedData[0] - - const rowId = - firstRow?.id ?? 0 - - setSelectedRow(rowId) - - setSelectedRowData({ - ...firstRow, - __selectedRowId: - rowId, - }) - } - } - }, [paginatedData]) - - const toggleRow = (id: any) => { - setExpandedRow((prev) => - prev === id ? null : id - ) - } - - const handleSort = ( - key: string - ) => { - if ( - !sortConfig || - sortConfig.key !== key - ) { - setSortConfig({ - key, - direction: 'asc', - }) - - return - } - - if ( - sortConfig.direction === - 'asc' - ) { - setSortConfig({ - key, - direction: 'desc', - }) - - return - } - - if ( - sortConfig.direction === - 'desc' - ) { - setSortConfig(null) - - return - } - } - - const exportCSV = () => { - const rows = [] - - rows.push(tableHeaders.join(',')) - - filteredSortedData.forEach( - (row) => { - rows.push( - tableHeaders - .map((header) => - JSON.stringify( - row?.[header] ?? '' - ) - ) - .join(',') - ) - } - ) - - const blob = new Blob( - [rows.join('\n')], - { - type: 'text/csv', - } - ) - - const url = - URL.createObjectURL(blob) - - const a = - document.createElement('a') - - a.href = url - - a.download = - 'table-data.csv' - - a.click() - - URL.revokeObjectURL(url) - } - - const formatLabel = (key: string) => { - return key - .split('.') - .map((part) => - part - .replace(/_/g, ' ') - .replace( - /([a-z])([A-Z])/g, - '$1 $2' - ) - .replace(/\b\w/g, (c) => - c.toUpperCase() - ) - ) - .join('.') - } - - const isDateValue = ( - value: any - ) => { - if ( - value === null || - value === undefined - ) { - return false - } - - if (value instanceof Date) { - return true - } - - if ( - typeof value !== 'string' - ) { - return false - } - - const parsedDate = - new Date(value) - - return ( - !isNaN( - parsedDate.getTime() - ) && - ( - /^\d{4}-\d{2}-\d{2}/.test( - value - ) || - value.includes('T') || - value.includes(':') - ) - ) - } - - const formatDateTime = ( - value: any - ) => { - try { - const date = - new Date(value) - - if ( - isNaN(date.getTime()) - ) { - return value - } - - return date.toLocaleString( - 'en-US', - { - month: 'long', - day: 'numeric', - year: 'numeric', - hour: '2-digit', - minute: '2-digit', - hour12: true, - } - ) - } catch { - return value - } - } - - const normalizeExpandableData = ( - data: any, - parentKey = '' - ): any[] => { - if ( - data === null || - data === undefined || - data === '' - ) { - return [] - } - - if (typeof data === 'string') { - const trimmed = data.trim() - - if ( - (trimmed.startsWith('{') && - trimmed.endsWith('}')) || - (trimmed.startsWith('[') && - trimmed.endsWith(']')) - ) { - try { - const parsed = JSON.parse(trimmed) - - return normalizeExpandableData( - parsed, - parentKey - ) - } catch { - return [ - { - key: formatLabel( - parentKey || 'Value' - ), - value: isDateValue(data) - ? formatDateTime( - data - ) - : data, - }, - ] - } - } - - return [ - { - key: formatLabel( - parentKey || 'Value' - ), - value: isDateValue(data) - ? formatDateTime( - data - ) - : String(data), - }, - ] - } - - if (Array.isArray(data)) { - return data.flatMap( - (item, index) => - normalizeExpandableData( - item, - parentKey - ? `${parentKey}.${index}` - : `${index}` - ) - ) - } - - if ( - typeof data === 'object' && - data !== null - ) { - return Object.entries(data).flatMap( - ([key, value]) => - normalizeExpandableData( - value, - parentKey - ? `${parentKey}.${key}` - : key - ) - ) - } - - return [ - { - key: formatLabel( - parentKey || 'Value' - ), - value: isDateValue(data) - ? formatDateTime( - data - ) - : String(data), - }, - ] - } - - const getExpandableData = ( - item: any - ) => { - if (!expandableDataKey) { - return item - } - - let keys: string[] = [] - - if ( - typeof expandableDataKey === - 'string' - ) { - const trimmed = - expandableDataKey.trim() - - if ( - trimmed.startsWith('[') - ) { - try { - const parsed = - JSON.parse(trimmed) - - if ( - Array.isArray(parsed) - ) { - keys = parsed.map( - String - ) - } - } catch { - keys = trimmed - .split(',') - .map((k) => - k.trim() - ) - } - } else { - keys = trimmed - .split(',') - .map((k) => - k.trim() - ) - } - } - - if (!keys.length) { - return item - } - - const combined: Record< - string, - any - > = {} - - keys.forEach((key) => { - combined[key] = - item?.[key] - }) - - return combined - } - - const renderExpandableContent = ( - details: any - ) => { - const normalized = - normalizeExpandableData(details) - - if (!normalized.length) { - return ( -

- {emptyStateMessage || - 'No data found'} -
- ) - } - - return ( -
- {normalized.map( - (item, index) => ( -
-
- {item.key} -
- -
- {item.value} -
-
- ) - )} -
- ) - } - - return ( -
-
- {/*
-
- Visible Columns -
- -
- {allColumns.map((column) => { - const isSelected = - !visibleColumns?.length || - visibleColumns.includes( - column - ) - - return ( - - ) - })} -
-
*/} - {showSearchBar && ( -
- - setSearchTerm( - e.target.value - ) - } - style={{ - width: 280, - height: 38, - padding: '0 14px', - border: - '1px solid #d1d5db', - borderRadius: 8, - outline: 'none', - fontSize: 14, - }} - /> -
- )} - -
- - - - - ) - )} - - - - - {!paginatedData.length ? ( - - - - ) : ( - paginatedData.map( - ( - item, - index - ) => { - const rowId = - item?.id ?? - index - - const isExpanded = - expandedRow === - rowId - - const expandableData = - getExpandableData(item) - - return ( - - { - setSelectedRow( - rowId - ) - - setSelectedRowData( - { - ...item, - __selectedRowId: - rowId, - } - ) - }} - style={{ - background: - selectedRow === - rowId - ? `${safeAccentColor}15` - : index % - 2 === - 0 - ? safeRowBackground - : safeAlternateRowBackground, - borderBottom: - '1px solid #e5e7eb', - height: - rowHeightValue, - cursor: - 'pointer', - transition: - '0.15s ease', - }} - > - - - {tableHeaders.map( - ( - key - ) => { - const value = - item[ - key - ] - - const renderCellValue = - () => { - if ( - value === - null || - value === - undefined || - value === - '' - ) { - return '—' - } - - if ( - typeof value === - 'boolean' - ) { - return value - ? 'Yes' - : 'No' - } - - if ( - typeof value === - 'number' - ) { - return value.toLocaleString() - } - - if ( - Array.isArray( - value - ) - ) { - return ( -
- {value.map( - ( - v, - i - ) => ( - - {typeof v === - 'object' - ? JSON.stringify( - v - ) - : String( - v - )} - - ) - )} -
- ) - } - if ( - isDateValue(value) - ) { - return formatDateTime( - value - ) - } - if ( - typeof value === - 'object' && - value !== - null - ) { - return ( -
-
-                                          {JSON.stringify(
-                                            value,
-                                            null,
-                                            2
-                                          )}
-                                        
-
- ) - } - - if ( - typeof value === - 'string' && - /^(https?:\/\/)/i.test( - value - ) - ) { - return ( - - { - value - } - - ) - } - - if ( - typeof value === - 'string' && - value.length > - 120 - ) { - return ( -
- { - value - } -
- ) - } - - return String( - value - ) - } - - return ( - - ) - } - )} - - - {isExpanded && ( - - - - )} - - ) - } - ) - )} - -
- - {tableHeaders.map( - (key) => ( - { - setDraggedColumn(key) - }} - onDragOver={(e) => { - e.preventDefault() - }} - onDrop={() => { - if ( - !draggedColumn || - draggedColumn === key - ) { - return - } - - const updated = [ - ...columnOrder, - ] - - const fromIndex = - updated.indexOf( - draggedColumn - ) - - const toIndex = - updated.indexOf(key) - - updated.splice( - fromIndex, - 1 - ) - - updated.splice( - toIndex, - 0, - draggedColumn - ) - - setColumnOrder(updated) - }} - onClick={() => - handleSort( - key - ) - } - style={{ - padding: - '14px 16px', - textAlign: - 'left', - cursor: - 'pointer', - fontWeight: 600, - fontSize: - safeHeaderFontSize, - resize: - columnWidthMode === - 'manual' - ? 'horizontal' - : 'none', - overflow: - 'auto', - minWidth: 160, - color: - safeHeaderTextColor, - borderBottom: - '1px solid #d1d5db', - whiteSpace: - 'nowrap', - userSelect: - 'none', - opacity: - draggedColumn === key - ? 0.5 - : 1, - }} - > -
- {key - .replace( - /_/g, - ' ' - ) - .replace( - /\b\w/g, - ( - c - ) => - c.toUpperCase() - )} - - {sortConfig?.key === - key && - (sortConfig.direction === - 'asc' - ? '↑' - : sortConfig.direction === - 'desc' - ? '↓' - : '')} -
-
- {emptyStateMessage || - 'No rows found'} -
{ - e.stopPropagation() - - toggleRow( - rowId - ) - }} - > - {isExpanded ? ( - - ) : ( - - )} - - {renderCellValue()} -
- {renderExpandableContent( - expandableData - )} -
-
- -
-
- Showing{' '} - {(currentPage - 1) * - safePageSize + - 1} - - - {Math.min( - currentPage * - safePageSize, - filteredSortedData.length - )}{' '} - of{' '} - { - filteredSortedData.length - } -
- -
- - -
-
- {currentPage} -
- - - of {totalPages} - -
- - -
- - {showToolbar && ( -
- - - -
- )} -
-
-
- ) -} \ No newline at end of file