From f4e1a18808f3891d8d00d7cb189ea567b50c34db Mon Sep 17 00:00:00 2001 From: Fady Mondy Date: Mon, 14 Sep 2026 17:40:29 +0300 Subject: [PATCH 1/3] Add React support and Laravel 13 compatibility - React tables, grid view, API tester, toolbars and every column type. Shared changes: - Laravel 13 / Inertia v3 / testbench 11 / Pest 4-5 compatible constraints, PHPStan 2 config and an empty PHPStan baseline. - New Laravilt cover in the new brand. - Pint formatting. Co-Authored-By: Claude Opus 5 (1M context) --- arts/screenshot.jpg | Bin 227581 -> 245549 bytes composer.json | 14 +- phpstan-baseline.neon | 2 + phpstan.neon | 3 +- resources/react/app.ts | 15 + resources/react/components/ApiTester.css | 90 ++ resources/react/components/ApiTester.tsx | 1358 +++++++++++++++++ resources/react/components/CardGrid.tsx | 1025 +++++++++++++ resources/react/components/DataTable.css | 45 + resources/react/components/DataTable.tsx | 700 +++++++++ resources/react/components/GridToolbar.tsx | 291 ++++ resources/react/components/Table.tsx | 1041 +++++++++++++ resources/react/components/TableToolbar.tsx | 467 ++++++ .../react/components/columns/ColorColumn.tsx | 127 ++ .../react/components/columns/IconColumn.tsx | 52 + .../react/components/columns/ImageColumn.tsx | 211 +++ .../react/components/columns/TextColumn.tsx | 310 ++++ .../react/components/columns/ToggleColumn.tsx | 129 ++ .../react/components/filters/TextFilter.tsx | 52 + .../react/components/filters/ToggleFilter.tsx | 26 + .../grid-columns/ColorGridColumn.tsx | 68 + .../grid-columns/IconGridColumn.tsx | 75 + .../grid-columns/ImageGridColumn.tsx | 202 +++ .../grid-columns/TextGridColumn.tsx | 186 +++ .../grid-columns/ToggleGridColumn.tsx | 107 ++ resources/react/composables/useStateRef.ts | 18 + resources/react/composables/useWatch.ts | 21 + resources/react/lib/display.ts | 24 + resources/react/lib/icons.ts | 43 + src/Mcp/Tools/GenerateTableTool.php | 2 +- src/Mcp/Tools/SearchDocsTool.php | 2 +- 31 files changed, 6696 insertions(+), 10 deletions(-) create mode 100644 phpstan-baseline.neon create mode 100644 resources/react/app.ts create mode 100644 resources/react/components/ApiTester.css create mode 100644 resources/react/components/ApiTester.tsx create mode 100644 resources/react/components/CardGrid.tsx create mode 100644 resources/react/components/DataTable.css create mode 100644 resources/react/components/DataTable.tsx create mode 100644 resources/react/components/GridToolbar.tsx create mode 100644 resources/react/components/Table.tsx create mode 100644 resources/react/components/TableToolbar.tsx create mode 100644 resources/react/components/columns/ColorColumn.tsx create mode 100644 resources/react/components/columns/IconColumn.tsx create mode 100644 resources/react/components/columns/ImageColumn.tsx create mode 100644 resources/react/components/columns/TextColumn.tsx create mode 100644 resources/react/components/columns/ToggleColumn.tsx create mode 100644 resources/react/components/filters/TextFilter.tsx create mode 100644 resources/react/components/filters/ToggleFilter.tsx create mode 100644 resources/react/components/grid-columns/ColorGridColumn.tsx create mode 100644 resources/react/components/grid-columns/IconGridColumn.tsx create mode 100644 resources/react/components/grid-columns/ImageGridColumn.tsx create mode 100644 resources/react/components/grid-columns/TextGridColumn.tsx create mode 100644 resources/react/components/grid-columns/ToggleGridColumn.tsx create mode 100644 resources/react/composables/useStateRef.ts create mode 100644 resources/react/composables/useWatch.ts create mode 100644 resources/react/lib/display.ts create mode 100644 resources/react/lib/icons.ts diff --git a/arts/screenshot.jpg b/arts/screenshot.jpg index ff5fb83395e71783e152213700c68bf01d0add97..c0217ffdaf94cd3ecccb295ce8de223877643238 100644 GIT binary patch literal 245549 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 z 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 literal 227581 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

gBw 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 Z>iGZtvBlV = {}): void { + // No table-specific components to register yet + // Filters use BaseFilter + Form components which are already registered + }, +}; diff --git a/resources/react/components/ApiTester.css b/resources/react/components/ApiTester.css new file mode 100644 index 0000000..a87a2c9 --- /dev/null +++ b/resources/react/components/ApiTester.css @@ -0,0 +1,90 @@ +/* Sidebar tooltip styles (scoped in ApiTester.vue; `.sidebar-tooltip` is only used by this component) */ +.sidebar-tooltip { + position: absolute; + left: 100%; + top: 50%; + transform: translateY(-50%); + margin-left: 8px; + padding: 6px 10px; + background: hsl(var(--popover)); + color: hsl(var(--popover-foreground)); + border: 1px solid hsl(var(--border)); + border-radius: 6px; + font-size: 12px; + white-space: nowrap; + z-index: 50; + opacity: 0; + visibility: hidden; + transition: opacity 0.15s ease, visibility 0.15s ease; + box-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1); + pointer-events: none; +} + +/* Tooltip arrow */ +.sidebar-tooltip::before { + content: ''; + position: absolute; + left: -5px; + top: 50%; + transform: translateY(-50%) rotate(45deg); + width: 8px; + height: 8px; + background: hsl(var(--popover)); + border-left: 1px solid hsl(var(--border)); + border-bottom: 1px solid hsl(var(--border)); +} + +/* Show tooltip on hover */ +.group:hover .sidebar-tooltip { + opacity: 1; + visibility: visible; +} + +/* Global scrollbar styles (not scoped) */ +/* Custom scrollbar for API Tester */ +.api-tester-scrollbar::-webkit-scrollbar { + width: 8px; + height: 8px; +} + +.api-tester-scrollbar::-webkit-scrollbar-track { + background: #e5e5e5; + border-radius: 4px; +} + +.api-tester-scrollbar::-webkit-scrollbar-thumb { + background: #a3a3a3; + border-radius: 4px; +} + +.api-tester-scrollbar::-webkit-scrollbar-thumb:hover { + background: #737373; +} + +/* Dark mode scrollbar */ +.dark .api-tester-scrollbar::-webkit-scrollbar-track { + background: #262626; +} + +.dark .api-tester-scrollbar::-webkit-scrollbar-thumb { + background: #525252; +} + +.dark .api-tester-scrollbar::-webkit-scrollbar-thumb:hover { + background: #737373; +} + +/* Firefox scrollbar */ +.api-tester-scrollbar { + scrollbar-width: thin; + scrollbar-color: #a3a3a3 #e5e5e5; +} + +.dark .api-tester-scrollbar { + scrollbar-color: #525252 #262626; +} + +/* Scrollbar corner */ +.api-tester-scrollbar::-webkit-scrollbar-corner { + background: transparent; +} diff --git a/resources/react/components/ApiTester.tsx b/resources/react/components/ApiTester.tsx new file mode 100644 index 0000000..f283497 --- /dev/null +++ b/resources/react/components/ApiTester.tsx @@ -0,0 +1,1358 @@ +import { cn } from '@/lib/utils'; +import { + Check, + ChevronDown, + ChevronRight, + ChevronsDownUp, + ChevronsUpDown, + Code, + Copy, + Database, + Download, + Edit, + Eye, + EyeOff, + FileJson, + FolderOpen, + Key, + List, + Loader2, + Plus, + PlusCircle, + Send, + Trash, + Trash2, + Zap, + type LucideIcon, +} from 'lucide-react'; +import { useEffect, useMemo, useState, type CSSProperties } from 'react'; +import { useWatch } from '../composables/useWatch'; +import './ApiTester.css'; + +// Scoped `pre` / `select option` rules from ApiTester.vue, applied inline +const PRE_STYLE: CSSProperties = { margin: 0, background: 'transparent' }; +const OPTION_STYLE: CSSProperties = { backgroundColor: 'var(--background)', color: 'var(--foreground)' }; + +interface JsonNodeProps { + data: any; + keyName?: string; + depth?: number; + isLast?: boolean; + forceExpand?: boolean | null; +} + +// Recursive JSON Tree component for collapsible display +function JsonNode({ data, keyName = '', depth = 0, isLast = true, forceExpand = null }: JsonNodeProps) { + const [isExpanded, setIsExpanded] = useState(() => (forceExpand !== null ? forceExpand : depth < 2)); + + const isObject = data !== null && typeof data === 'object' && !Array.isArray(data); + const isArray = Array.isArray(data); + const isCollapsible = isObject || isArray; + const isEmpty = isArray ? data.length === 0 : isObject ? Object.keys(data).length === 0 : false; + + const entries: [any, any][] = isArray ? data.map((v: any, i: number) => [i, v]) : isObject ? Object.entries(data) : []; + + const valueColor = (() => { + if (data === null) return 'text-gray-500'; + if (typeof data === 'boolean') return 'text-purple-600 dark:text-purple-400'; + if (typeof data === 'number') return 'text-blue-600 dark:text-blue-400'; + if (typeof data === 'string') return 'text-green-600 dark:text-green-400'; + return 'text-foreground'; + })(); + + const formatValue = (val: any) => { + if (val === null) return 'null'; + if (typeof val === 'string') return `"${val}"`; + return String(val); + }; + + const toggle = () => { + if (isCollapsible) { + setIsExpanded(!isExpanded); + } + }; + + const indent = depth * 16; + const comma = isLast ? '' : ','; + + if (!isCollapsible) { + return ( +
+ {keyName && "{keyName}"} + {keyName && : } + {formatValue(data)} + {comma} +
+ ); + } + + if (isEmpty) { + const brackets = isArray ? '[]' : '{}'; + return ( +
+ {keyName && "{keyName}"} + {keyName && : } + {brackets + comma} +
+ ); + } + + const openBracket = isArray ? '[' : '{'; + const closeBracket = isArray ? ']' : '}'; + const itemCount = entries.length; + + if (!isExpanded) { + return ( +
+ + {keyName && "{keyName}"} + {keyName && : } + {openBracket} + {`${itemCount} ${isArray ? 'items' : 'keys'}`} + {closeBracket + comma} +
+ ); + } + + return ( +
+
+ + {keyName && "{keyName}"} + {keyName && : } + {openBracket} +
+ {entries.map(([key, value], index) => ( + + ))} +
+ {closeBracket + comma} +
+
+ ); +} + +interface ApiColumn { + name: string; + label?: string; + type?: string; + format?: string; + nullable?: boolean; + description?: string; + example?: any; + sortable?: boolean; + filterable?: boolean; + searchable?: boolean; + enum?: string[]; +} + +interface ApiAction { + name: string; + slug: string; + label: string; + description?: string; + method: string; + requiresRecord: boolean; + bulk: boolean; + requiresConfirmation: boolean; + confirmationMessage?: string; + hidden: boolean; + requestSchema?: any; + responseSchema?: any; + successMessage?: string; +} + +export interface ApiResource { + columns: ApiColumn[]; + endpoint: string; + baseUrl: string; + fullUrl: string; + paginated: boolean; + perPage: number; + allowedFilters: string[]; + allowedSorts: string[]; + allowedIncludes?: string[]; + searchableColumns: string[]; + description?: string; + version?: string; + authenticated: boolean; + headers: Record; + sampleRequest?: any; + sampleResponse?: any; + fillableFields?: string[]; + actions?: ApiAction[]; + openApiSpec?: any; +} + +export interface ApiTesterProps { + apiResource: ApiResource; + resourceSlug?: string; + records?: any[]; + apiToken?: string | null; +} + +// HTTP Methods +const httpMethods = ['GET', 'POST', 'PUT', 'PATCH', 'DELETE'] as const; +type HttpMethod = (typeof httpMethods)[number]; + +// Operation types +type OperationType = 'index' | 'show' | 'store' | 'update' | 'destroy' | 'bulkDestroy' | string; + +interface Operation { + key: OperationType; + label: string; + method: HttpMethod; + icon: LucideIcon; + description: string; + path: string; + needsId?: boolean; + hasBody?: boolean; + bulk?: boolean; + action?: ApiAction; +} + +interface KeyValueRow { + key: string; + value: string; + enabled: boolean; +} + +// Method colors +const methodColors: Record = { + GET: 'bg-green-500', + POST: 'bg-yellow-500', + PUT: 'bg-blue-500', + PATCH: 'bg-purple-500', + DELETE: 'bg-red-500', +}; + +const methodTextColors: Record = { + GET: 'text-green-500', + POST: 'text-yellow-500', + PUT: 'text-blue-500', + PATCH: 'text-purple-500', + DELETE: 'text-red-500', +}; + +const methodBadgeColors: Record = { + GET: 'bg-green-500/10 text-green-600 dark:text-green-400', + POST: 'bg-yellow-500/10 text-yellow-600 dark:text-yellow-400', + PUT: 'bg-blue-500/10 text-blue-600 dark:text-blue-400', + PATCH: 'bg-purple-500/10 text-purple-600 dark:text-purple-400', + DELETE: 'bg-red-500/10 text-red-600 dark:text-red-400', +}; + +// Status colors +const getStatusColor = (status: number) => { + if (status >= 200 && status < 300) return 'text-green-500'; + if (status >= 300 && status < 400) return 'text-blue-500'; + if (status >= 400 && status < 500) return 'text-yellow-500'; + if (status >= 500) return 'text-red-500'; + return 'text-gray-500'; +}; + +const getStatusBg = (status: number) => { + if (status >= 200 && status < 300) return 'bg-green-500/10'; + if (status >= 300 && status < 400) return 'bg-blue-500/10'; + if (status >= 400 && status < 500) return 'bg-yellow-500/10'; + if (status >= 500) return 'bg-red-500/10'; + return 'bg-gray-500/10'; +}; + +// Faker-like random data generators +const faker = { + firstName: () => ['John', 'Jane', 'Michael', 'Sarah', 'David', 'Emily', 'James', 'Emma'][Math.floor(Math.random() * 8)], + lastName: () => ['Smith', 'Johnson', 'Williams', 'Brown', 'Jones', 'Garcia', 'Miller', 'Davis'][Math.floor(Math.random() * 8)], + fullName: () => `${faker.firstName()} ${faker.lastName()}`, + email: () => `${faker.firstName().toLowerCase()}${Math.floor(Math.random() * 999)}@example.com`, + phone: () => + `+1 ${Math.floor(Math.random() * 900) + 100} ${Math.floor(Math.random() * 900) + 100} ${Math.floor(Math.random() * 9000) + 1000}`, + company: () => ['Acme Inc.', 'Tech Corp', 'Global Solutions', 'Digital Services', 'Innovation Labs'][Math.floor(Math.random() * 5)], + website: () => `https://${faker.company().toLowerCase().replace(/[^a-z]/g, '')}.com`, + address: () => + `${Math.floor(Math.random() * 9999) + 1} ${['Main', 'Oak', 'Park', 'Cedar', 'Elm'][Math.floor(Math.random() * 5)]} ${['St', 'Ave', 'Blvd', 'Dr'][Math.floor(Math.random() * 4)]}`, + city: () => ['New York', 'Los Angeles', 'Chicago', 'Houston', 'Phoenix', 'San Diego'][Math.floor(Math.random() * 6)], + state: () => ['NY', 'CA', 'TX', 'FL', 'IL', 'PA', 'OH', 'GA'][Math.floor(Math.random() * 8)], + country: () => ['USA', 'Canada', 'UK', 'Australia', 'Germany'][Math.floor(Math.random() * 5)], + postalCode: () => String(Math.floor(Math.random() * 90000) + 10000), + boolean: () => Math.random() > 0.5, + number: (min = 0, max = 10000) => Math.floor(Math.random() * (max - min + 1)) + min, + decimal: (min = 0, max = 10000) => Number((Math.random() * (max - min) + min).toFixed(2)), + date: () => { + const d = new Date(); + d.setDate(d.getDate() - Math.floor(Math.random() * 365 * 30)); + return d.toISOString().split('T')[0]; + }, + datetime: () => new Date(Date.now() - Math.floor(Math.random() * 365 * 24 * 60 * 60 * 1000)).toISOString(), + tags: () => { + const allTags = ['vip', 'newsletter', 'premium', 'active', 'loyal', 'new']; + return allTags.slice(0, Math.floor(Math.random() * 3) + 1); + }, + status: () => ['active', 'inactive', 'pending'][Math.floor(Math.random() * 3)], + type: () => ['individual', 'business'][Math.floor(Math.random() * 2)], + text: () => ['Lorem ipsum dolor sit amet', 'Consectetur adipiscing elit', 'Sed do eiusmod tempor'][Math.floor(Math.random() * 3)], +}; + +// Format bytes +const formatBytes = (bytes: number) => { + if (bytes === 0) return '0 B'; + const k = 1024; + const sizes = ['B', 'KB', 'MB', 'GB']; + const i = Math.floor(Math.log(bytes) / Math.log(k)); + return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i]; +}; + +const toYaml = (obj: any, indent = 0): string => { + const prefix = ' '.repeat(indent); + let yaml = ''; + for (const [key, value] of Object.entries(obj)) { + if (value === null || value === undefined) { + yaml += `${prefix}${key}: null\n`; + } else if (typeof value === 'boolean') { + yaml += `${prefix}${key}: ${value}\n`; + } else if (typeof value === 'number') { + yaml += `${prefix}${key}: ${value}\n`; + } else if (typeof value === 'string') { + if (value.includes('\n') || value.includes(':') || value.includes('#')) { + yaml += `${prefix}${key}: "${value.replace(/"/g, '\\"')}"\n`; + } else { + yaml += `${prefix}${key}: ${value}\n`; + } + } else if (Array.isArray(value)) { + if (value.length === 0) { + yaml += `${prefix}${key}: []\n`; + } else { + yaml += `${prefix}${key}:\n`; + for (const item of value) { + if (typeof item === 'object' && item !== null) { + const itemYaml = toYaml(item, indent + 2).trim(); + yaml += `${prefix}- ${itemYaml.split('\n').join('\n' + prefix + ' ')}\n`; + } else { + yaml += `${prefix}- ${item}\n`; + } + } + } + } else if (typeof value === 'object') { + yaml += `${prefix}${key}:\n`; + yaml += toYaml(value, indent + 1); + } + } + return yaml; +}; + +const INPUT_CLASS = + 'flex-1 px-3 py-1.5 text-sm rounded border border-border bg-background focus:outline-none focus:ring-1 focus:ring-primary'; + +export default function ApiTester({ apiResource, resourceSlug = '', apiToken = null }: ApiTesterProps) { + // Selected operation + const [selectedOperation, setSelectedOperation] = useState('index'); + const [recordId, setRecordId] = useState(''); + + // Request state + const [method, setMethod] = useState('GET'); + const [url, setUrl] = useState(apiResource?.fullUrl || ''); + const [isLoading, setIsLoading] = useState(false); + const [response, setResponse] = useState(null); + const [responseStatus, setResponseStatus] = useState(null); + const [responseTime, setResponseTime] = useState(null); + const [responseSize, setResponseSize] = useState(null); + const [responseHeaders, setResponseHeaders] = useState>({}); + const [error, setError] = useState(null); + const [copiedResponse, setCopiedResponse] = useState(false); + + // Active tabs + const [requestTab, setRequestTab] = useState<'params' | 'headers' | 'body' | 'auth'>('params'); + const [responseTab, setResponseTab] = useState<'body' | 'headers'>('body'); + + // Response view + const [responseViewMode, setResponseViewMode] = useState<'pretty' | 'raw'>('pretty'); + const [jsonExpandKey, setJsonExpandKey] = useState(0); + const [forceExpandAll, setForceExpandAll] = useState(false); + + // API Token + const [apiTokenInput, setApiTokenInput] = useState(apiToken || ''); + const [showToken, setShowToken] = useState(false); + + // Headers + const [headers, setHeaders] = useState([ + { key: 'Accept', value: 'application/json', enabled: true }, + { key: 'Content-Type', value: 'application/json', enabled: true }, + ]); + + // Query parameters + const [queryParams, setQueryParams] = useState([]); + + // Request body + const [requestBody, setRequestBody] = useState(''); + + // Sidebar collapsed + const [sidebarCollapsed, setSidebarCollapsed] = useState(false); + + // Export + const [showExportMenu, setShowExportMenu] = useState(false); + const [copiedOpenApi, setCopiedOpenApi] = useState(false); + + const fullUrl = apiResource?.fullUrl || ''; + + // Operations list + const operations = useMemo( + () => [ + { + key: 'index', + label: 'List All', + method: 'GET', + icon: List, + description: 'Get paginated list of records', + path: fullUrl, + }, + { + key: 'show', + label: 'Get One', + method: 'GET', + icon: Eye, + description: 'Get a single record by ID', + path: `${fullUrl}/{id}`, + needsId: true, + }, + { + key: 'store', + label: 'Create', + method: 'POST', + icon: PlusCircle, + description: 'Create a new record', + path: fullUrl, + hasBody: true, + }, + { + key: 'update', + label: 'Update', + method: 'PUT', + icon: Edit, + description: 'Update an existing record', + path: `${fullUrl}/{id}`, + needsId: true, + hasBody: true, + }, + { + key: 'destroy', + label: 'Delete', + method: 'DELETE', + icon: Trash, + description: 'Delete a single record', + path: `${fullUrl}/{id}`, + needsId: true, + }, + { + key: 'bulkDestroy', + label: 'Bulk Delete', + method: 'DELETE', + icon: Database, + description: 'Delete multiple records', + path: `${fullUrl}/bulk`, + hasBody: true, + }, + ], + [fullUrl], + ); + + // Custom actions from API resource + const customActions = useMemo(() => { + if (!apiResource?.actions) return []; + return apiResource.actions + .filter((a) => !a.hidden) + .map((action) => ({ + key: `action_${action.slug}`, + label: action.label, + method: action.method.toUpperCase() as HttpMethod, + icon: Zap, + description: action.description || '', + path: action.requiresRecord ? `${fullUrl}/{id}/actions/${action.slug}` : `${fullUrl}/actions/${action.slug}`, + needsId: action.requiresRecord, + hasBody: ['POST', 'PUT', 'PATCH'].includes(action.method.toUpperCase()), + bulk: action.bulk, + action, + })); + }, [apiResource?.actions, fullUrl]); + + const findOperation = (opKey: OperationType): Operation | undefined => { + const op = operations.find((o) => o.key === opKey); + if (op) return op; + return customActions.find((a) => a.key === opKey); + }; + + // Current operation + const currentOperation = findOperation(selectedOperation); + + // URL for an operation (Vue: updateUrlForOperation) + const urlForOperation = (op: Operation, id: string): string => { + let path = op.path; + if (op.needsId && id) { + path = path.replace('{id}', id); + } + return path; + }; + + // Reset params for operation + const resetParamsForOperation = (opKey: OperationType) => { + if (opKey === 'index') { + setQueryParams([ + { key: 'page', value: '1', enabled: true }, + { key: 'per_page', value: String(apiResource?.perPage || 12), enabled: true }, + ]); + } else { + setQueryParams([]); + } + }; + + // Generate sample request body + const generateSampleBody = () => { + if (!apiResource?.columns) { + setRequestBody('{}'); + return; + } + + const sampleData: Record = {}; + const fillableFields = apiResource.fillableFields || []; + + apiResource.columns.forEach((col) => { + if (fillableFields.length > 0 && !fillableFields.includes(col.name)) return; + if (['id', 'created_at', 'updated_at', 'deleted_at'].includes(col.name)) return; + + const name = col.name.toLowerCase(); + + if (name === 'name' || name === 'full_name' || name === 'fullname') { + sampleData[col.name] = faker.fullName(); + } else if (name === 'first_name' || name === 'firstname') { + sampleData[col.name] = faker.firstName(); + } else if (name === 'last_name' || name === 'lastname') { + sampleData[col.name] = faker.lastName(); + } else if (name === 'email' || name.includes('email')) { + sampleData[col.name] = faker.email(); + } else if (name === 'phone' || name.includes('phone') || name.includes('mobile')) { + sampleData[col.name] = faker.phone(); + } else if (name === 'company' || name.includes('company')) { + sampleData[col.name] = faker.company(); + } else if (name === 'website' || name.includes('url') || name.includes('site')) { + sampleData[col.name] = faker.website(); + } else if (name === 'address' || name.includes('address') || name.includes('street')) { + sampleData[col.name] = faker.address(); + } else if (name === 'city') { + sampleData[col.name] = faker.city(); + } else if (name === 'state' || name === 'province') { + sampleData[col.name] = faker.state(); + } else if (name === 'country') { + sampleData[col.name] = faker.country(); + } else if (name === 'postal_code' || name === 'zip' || name === 'zipcode') { + sampleData[col.name] = faker.postalCode(); + } else if (name === 'status') { + sampleData[col.name] = col.enum ? col.enum[Math.floor(Math.random() * col.enum.length)] : faker.status(); + } else if (name === 'type') { + sampleData[col.name] = col.enum ? col.enum[Math.floor(Math.random() * col.enum.length)] : faker.type(); + } else if (name.includes('birth') || name.includes('dob')) { + sampleData[col.name] = faker.date(); + } else if (name.includes('tags') || name.includes('labels')) { + sampleData[col.name] = faker.tags(); + } else if ( + name.includes('credit') || + name.includes('limit') || + name.includes('amount') || + name.includes('price') || + name.includes('spent') || + name.includes('total') + ) { + sampleData[col.name] = faker.decimal(100, 10000); + } else if (col.enum && col.enum.length > 0) { + sampleData[col.name] = col.enum[Math.floor(Math.random() * col.enum.length)]; + } else if (col.type === 'boolean' || name.includes('is_') || name.includes('has_')) { + sampleData[col.name] = faker.boolean(); + } else if (col.type === 'integer' || col.type === 'number') { + sampleData[col.name] = faker.number(1, 1000); + } else if (col.type === 'date') { + sampleData[col.name] = faker.date(); + } else if (col.type === 'datetime') { + sampleData[col.name] = faker.datetime(); + } else if (col.type === 'array') { + sampleData[col.name] = []; + } else { + sampleData[col.name] = col.example !== undefined && col.example !== null ? col.example : faker.text(); + } + }); + + setRequestBody(JSON.stringify(sampleData, null, 2)); + }; + + // Select an operation + const selectOperation = (opKey: OperationType) => { + setSelectedOperation(opKey); + const op = findOperation(opKey); + if (op) { + setMethod(op.method); + setUrl(urlForOperation(op, recordId)); + resetParamsForOperation(opKey); + + if (op.hasBody) { + setRequestTab('body'); + if (opKey === 'store' || opKey === 'update') { + generateSampleBody(); + } else if (opKey === 'bulkDestroy') { + setRequestBody(JSON.stringify({ ids: [] }, null, 2)); + } + } else { + setRequestTab('params'); + } + } + }; + + // Watch recordId changes (Vue watcher → handled where recordId changes) + const handleRecordIdChange = (id: string) => { + setRecordId(id); + if (currentOperation) { + setUrl(urlForOperation(currentOperation, id)); + } + }; + + // Computed URL with query params + const computedUrl = (() => { + const baseUrl = url; + const enabledParams = queryParams.filter((p) => p.enabled && p.key && p.value); + if (enabledParams.length === 0) return baseUrl; + const params = new URLSearchParams(); + enabledParams.forEach((p) => params.append(p.key, p.value)); + return `${baseUrl}?${params.toString()}`; + })(); + + // Formatted response + const formattedResponse = !response ? '' : typeof response === 'string' ? response : JSON.stringify(response, null, 2); + + // Send request + const sendRequest = async () => { + setIsLoading(true); + setError(null); + setResponse(null); + setResponseStatus(null); + setResponseTime(null); + setResponseSize(null); + setResponseHeaders({}); + + const startTime = performance.now(); + + try { + const requestHeaders: Record = {}; + headers + .filter((h) => h.enabled && h.key) + .forEach((h) => { + requestHeaders[h.key] = h.value; + }); + + if (apiTokenInput) { + requestHeaders['Authorization'] = `Bearer ${apiTokenInput}`; + } + + if (method !== 'GET') { + const csrfToken = document.querySelector('meta[name="csrf-token"]')?.getAttribute('content'); + if (csrfToken) { + requestHeaders['X-CSRF-TOKEN'] = csrfToken; + } + } + + const options: RequestInit = { + method, + headers: requestHeaders, + credentials: 'same-origin', + }; + + if (['POST', 'PUT', 'PATCH', 'DELETE'].includes(method) && requestBody) { + options.body = requestBody; + } + + const res = await fetch(computedUrl, options); + const endTime = performance.now(); + + setResponseStatus(res.status); + setResponseTime(Math.round(endTime - startTime)); + + const collectedHeaders: Record = {}; + res.headers.forEach((value, key) => { + collectedHeaders[key] = value; + }); + setResponseHeaders(collectedHeaders); + + const text = await res.text(); + setResponseSize(new Blob([text]).size); + + const contentType = res.headers.get('content-type'); + if (contentType?.includes('application/json')) { + try { + setResponse(JSON.parse(text)); + } catch { + setResponse(text); + } + } else { + setResponse(text); + } + } catch (err: any) { + setError(err.message || 'Request failed'); + } finally { + setIsLoading(false); + } + }; + + // Add/remove functions + const addQueryParam = () => { + setQueryParams([...queryParams, { key: '', value: '', enabled: true }]); + }; + + const removeQueryParam = (index: number) => { + setQueryParams(queryParams.filter((_, i) => i !== index)); + }; + + const updateQueryParam = (index: number, patch: Partial) => { + setQueryParams(queryParams.map((param, i) => (i === index ? { ...param, ...patch } : param))); + }; + + const addHeader = () => { + setHeaders([...headers, { key: '', value: '', enabled: true }]); + }; + + const removeHeader = (index: number) => { + setHeaders(headers.filter((_, i) => i !== index)); + }; + + const updateHeader = (index: number, patch: Partial) => { + setHeaders(headers.map((header, i) => (i === index ? { ...header, ...patch } : header))); + }; + + // Copy response + const copyResponse = async () => { + try { + const text = typeof response === 'string' ? response : JSON.stringify(response, null, 2); + await navigator.clipboard.writeText(text); + setCopiedResponse(true); + setTimeout(() => setCopiedResponse(false), 2000); + } catch (err) { + console.error('Failed to copy response:', err); + } + }; + + // Expand/Collapse all + const expandAllJson = () => { + setForceExpandAll(true); + setJsonExpandKey(jsonExpandKey + 1); + }; + + const collapseAllJson = () => { + setForceExpandAll(false); + setJsonExpandKey(jsonExpandKey + 1); + }; + + const downloadBlob = (blob: Blob, filename: string) => { + const downloadUrl = URL.createObjectURL(blob); + const a = document.createElement('a'); + a.href = downloadUrl; + a.download = filename; + document.body.appendChild(a); + a.click(); + document.body.removeChild(a); + URL.revokeObjectURL(downloadUrl); + }; + + const exportOpenApiJson = () => { + if (!apiResource?.openApiSpec) return; + const blob = new Blob([JSON.stringify(apiResource.openApiSpec, null, 2)], { type: 'application/json' }); + downloadBlob(blob, `${resourceSlug || 'api'}-openapi.json`); + setShowExportMenu(false); + }; + + const exportOpenApiYaml = () => { + if (!apiResource?.openApiSpec) return; + const yamlContent = toYaml(apiResource.openApiSpec); + const blob = new Blob([yamlContent], { type: 'text/yaml' }); + downloadBlob(blob, `${resourceSlug || 'api'}-openapi.yaml`); + setShowExportMenu(false); + }; + + const copyOpenApiToClipboard = async () => { + if (!apiResource?.openApiSpec) return; + try { + await navigator.clipboard.writeText(JSON.stringify(apiResource.openApiSpec, null, 2)); + setCopiedOpenApi(true); + setTimeout(() => setCopiedOpenApi(false), 2000); + setShowExportMenu(false); + } catch (err) { + console.error('Failed to copy:', err); + } + }; + + // Watch for apiResource URL changes (immediate) + useEffect(() => { + if (fullUrl) { + const op = findOperation(selectedOperation); + if (op) { + setUrl(urlForOperation(op, recordId)); + } + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [fullUrl]); + + // Watch for apiToken prop changes + useWatch(apiToken, (newToken) => { + if (newToken) { + setApiTokenInput(newToken); + } + }); + + // Initialize + useEffect(() => { + if (apiToken) { + setApiTokenInput(apiToken); + } + selectOperation('index'); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + const sendDisabled = !!(isLoading || (currentOperation?.needsId && !recordId)); + const enabledParamsCount = queryParams.filter((p) => p.enabled).length; + + return ( +
+ {/* Sidebar - Endpoints */} +
+ {/* Sidebar Header */} +
+ {!sidebarCollapsed && ( +
+ + Endpoints +
+ )} + +
+ + {/* Endpoints List */} +
+ {/* CRUD Operations */} + {!sidebarCollapsed && ( +

CRUD Operations

+ )} + + {operations.map((op) => ( +
+ + {/* Tooltip for collapsed state */} + {sidebarCollapsed && ( +
+ {op.method} + {op.label} +
+ )} +
+ ))} + + {/* Custom Actions */} + {customActions.length > 0 && ( + <> + {!sidebarCollapsed ? ( + <> +
+

Actions

+ + ) : ( +
+ )} + + {customActions.map((action) => ( +
+ + {/* Tooltip for collapsed state */} + {sidebarCollapsed && ( +
+ {action.method} + {action.label} +
+ )} +
+ ))} + + )} +
+ + {/* API Info Footer */} + {!sidebarCollapsed && apiResource?.version && ( +
+

API {apiResource.version}

+
+ )} +
+ + {/* Main Content */} +
+ {/* Request Section */} +
+ {/* Operation Info */} + {currentOperation && ( +
+
+ {method} + {currentOperation.label} +
+ {currentOperation.description &&

{currentOperation.description}

} +
+ )} + + {/* Record ID Input */} + {currentOperation?.needsId && ( +
+
+ + handleRecordIdChange(event.target.value)} + type="text" + placeholder="Enter ID" + className="w-32 px-2 py-1 text-sm rounded border border-border bg-background focus:outline-none focus:ring-1 focus:ring-primary" + /> +
+
+ )} + + {/* URL Bar */} +
+
+
+ + +
+ + setUrl(event.target.value)} + type="text" + placeholder="Enter request URL" + className="flex-1 bg-transparent px-3 py-2 text-sm font-mono focus:outline-none" + /> + + +
+
+ + {/* Request Tabs */} +
+ {(['params', 'headers', 'body', 'auth'] as const).map((tab) => ( + + ))} + +
+
+ + {showExportMenu && ( +
+
+ + + +
+
+ )} +
+
+
+ + {/* Tab Content */} +
+ {/* Params Tab */} + {requestTab === 'params' && ( +
+ {queryParams.length === 0 ? ( +
+

No query parameters

+ +
+ ) : ( + <> + {queryParams.map((param, index) => ( +
+ updateQueryParam(index, { enabled: event.target.checked })} + className="h-4 w-4 rounded border-border accent-primary" + /> + updateQueryParam(index, { key: event.target.value })} + type="text" + placeholder="Key" + className={INPUT_CLASS} + /> + updateQueryParam(index, { value: event.target.value })} + type="text" + placeholder="Value" + className={INPUT_CLASS} + /> + +
+ ))} + + + )} +
+ )} + + {/* Headers Tab */} + {requestTab === 'headers' && ( +
+ {headers.map((header, index) => ( +
+ updateHeader(index, { enabled: event.target.checked })} + className="h-4 w-4 rounded border-border accent-primary" + /> + updateHeader(index, { key: event.target.value })} + type="text" + placeholder="Key" + className={INPUT_CLASS} + /> + updateHeader(index, { value: event.target.value })} + type="text" + placeholder="Value" + className={INPUT_CLASS} + /> + +
+ ))} + +
+ )} + + {/* Body Tab */} + {requestTab === 'body' && ( +
+
+ Request Body (JSON) + +
+ +
+ )} + + {/* Auth Tab */} + {requestTab === 'auth' && ( +
+
+ + Bearer Token +
+
+ +
+ setApiTokenInput(event.target.value)} + type={showToken ? 'text' : 'password'} + placeholder="Enter your API token" + className="w-full px-3 py-2 pr-10 text-sm font-mono rounded border border-border bg-background focus:outline-none focus:ring-1 focus:ring-primary" + /> + +
+

Token will be sent as: Authorization: Bearer <token>

+
+
+ )} +
+
+ + {/* Response Section */} +
+ {/* Response Header */} +
+
+ Response + {responseStatus ? ( + <> + + {responseStatus} + + {responseTime}ms + {responseSize ? {formatBytes(responseSize)} : null} + + ) : null} +
+ +
+
+ + +
+ + {responseTab === 'body' && response && typeof response === 'object' && ( + <> +
+ + +
+ + + + + )} + + {response && ( + + )} +
+
+ + {/* Response Body */} +
+ {isLoading ? ( +
+
+ + Sending request... +
+
+ ) : error ? ( +
+
+

Request Failed

+

{error}

+
+
+ ) : !response ? ( +
+
+ +

No Response Yet

+

Click Send to make a request

+
+
+ ) : responseTab === 'body' ? ( + responseViewMode === 'pretty' && typeof response === 'object' ? ( +
+ +
+ ) : ( +
+                                    {formattedResponse}
+                                
+ ) + ) : responseTab === 'headers' ? ( +
+ {Object.entries(responseHeaders).map(([key, value]) => ( +
+ {key}: + {value} +
+ ))} + {Object.keys(responseHeaders).length === 0 && ( +
+

No response headers

+
+ )} +
+ ) : null} +
+
+
+
+ ); +} diff --git a/resources/react/components/CardGrid.tsx b/resources/react/components/CardGrid.tsx new file mode 100644 index 0000000..9cc8c70 --- /dev/null +++ b/resources/react/components/CardGrid.tsx @@ -0,0 +1,1025 @@ +import { Avatar, AvatarFallback, AvatarImage } from '@/components/ui/avatar'; +import { Badge } from '@/components/ui/badge'; +import { Card, CardContent, CardFooter, CardHeader } from '@/components/ui/card'; +import { Checkbox } from '@/components/ui/checkbox'; +import { Skeleton } from '@/components/ui/skeleton'; +import { cn } from '@/lib/utils'; +import { router } from '@inertiajs/react'; +import RecordActions from '@laravilt/actions/components/RecordActions'; +import { + AlertCircle, + AlertTriangle, + Archive, + Calendar, + CheckCircle2, + Circle, + Clock, + FileText, + Inbox, + Loader2, + Package, + PenLine, + Play, + Star, + User, + XCircle, + type LucideIcon, +} from 'lucide-react'; +import { useState, type ChangeEvent, type ComponentType, type MouseEvent } from 'react'; +import { useWatch } from '../composables/useWatch'; +import { toDisplayString } from '../lib/display'; +import { resolveColumnIcon } from '../lib/icons'; +import ColorGridColumn from './grid-columns/ColorGridColumn'; +import IconGridColumn from './grid-columns/IconGridColumn'; +import ImageGridColumn from './grid-columns/ImageGridColumn'; +import TextGridColumn from './grid-columns/TextGridColumn'; +import ToggleGridColumn from './grid-columns/ToggleGridColumn'; + +export interface CardGridProps { + grid: any; + records: any[]; + recordActions?: any[]; + loading?: boolean; + loadingMore?: boolean; + bulkActionsAvailable?: boolean; + resourceSlug: string; + modelClass?: string; + clearSelections?: number; + onUpdateSelectedRecords?: (records: (number | string)[]) => void; +} + +const columnComponents: Record> = { + text_grid_column: TextGridColumn, + image_grid_column: ImageGridColumn, + color_grid_column: ColorGridColumn, + icon_grid_column: IconGridColumn, + toggle_grid_column: ToggleGridColumn, +}; + +const getColumnComponent = (columnType: string): ComponentType => columnComponents[columnType] || TextGridColumn; + +const skeletonCount = 12; +const SKELETON_INDEXES = Array.from({ length: skeletonCount }, (_, index) => index + 1); +const LOADING_MORE_INDEXES = Array.from({ length: 12 }, (_, index) => index + 1); +const FIVE = [1, 2, 3, 4, 5]; + +// Helper to get nested value using dot notation (e.g., 'category.name') +const getNestedValue = (record: any, field: string) => { + if (!field) return null; + + // First check if the flattened key exists (from backend processing) + if (record[field] !== undefined) { + return record[field]; + } + + // Otherwise, traverse nested objects + if (field.includes('.')) { + const parts = field.split('.'); + let value = record; + for (const part of parts) { + if (value === null || value === undefined) return null; + value = value[part]; + } + return value; + } + + return record[field]; +}; + +const formatBadgeText = (text: string) => { + if (!text) return ''; + // Replace underscores with spaces and convert to title case + return String(text) + .replace(/_/g, ' ') + .split(' ') + .map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase()) + .join(' '); +}; + +// Get badge variant based on status value +const getBadgeVariant = (status: string) => { + const variantMap: Record = { + active: 'success', + draft: 'warning', + pending: 'warning', + out_of_stock: 'destructive', + archived: 'secondary', + inactive: 'secondary', + }; + return variantMap[status] || 'default'; +}; + +// Get relative time from created_at or updated_at +const getRelativeTime = (record: any) => { + const dateField = record.created_at || record.updated_at; + if (!dateField) return null; + + const date = new Date(dateField); + const now = new Date(); + const diffInSeconds = Math.floor((now.getTime() - date.getTime()) / 1000); + + if (diffInSeconds < 60) return 'Just now'; + if (diffInSeconds < 3600) return `${Math.floor(diffInSeconds / 60)}m ago`; + if (diffInSeconds < 86400) return `${Math.floor(diffInSeconds / 3600)}h ago`; + if (diffInSeconds < 604800) return `${Math.floor(diffInSeconds / 86400)}d ago`; + if (diffInSeconds < 2592000) return `${Math.floor(diffInSeconds / 604800)}w ago`; + return date.toLocaleDateString(); +}; + +// Get avatar color based on record id or title +const avatarColors = [ + 'bg-red-500', + 'bg-orange-500', + 'bg-amber-500', + 'bg-yellow-500', + 'bg-lime-500', + 'bg-green-500', + 'bg-emerald-500', + 'bg-teal-500', + 'bg-cyan-500', + 'bg-sky-500', + 'bg-blue-500', + 'bg-indigo-500', + 'bg-violet-500', + 'bg-purple-500', + 'bg-fuchsia-500', + 'bg-pink-500', + 'bg-rose-500', +]; + +const getAvatarColor = (record: any) => { + const index = (record.id || 0) % avatarColors.length; + return avatarColors[index]; +}; + +// Get badge color class based on status +const badgeColorClasses: Record = { + active: 'bg-emerald-500/10 text-emerald-600 border-emerald-500/20', + published: 'bg-emerald-500/10 text-emerald-600 border-emerald-500/20', + approved: 'bg-emerald-500/10 text-emerald-600 border-emerald-500/20', + completed: 'bg-emerald-500/10 text-emerald-600 border-emerald-500/20', + draft: 'bg-amber-500/10 text-amber-600 border-amber-500/20', + pending: 'bg-amber-500/10 text-amber-600 border-amber-500/20', + processing: 'bg-blue-500/10 text-blue-600 border-blue-500/20', + in_progress: 'bg-blue-500/10 text-blue-600 border-blue-500/20', + inactive: 'bg-slate-500/10 text-slate-600 border-slate-500/20', + archived: 'bg-slate-500/10 text-slate-600 border-slate-500/20', + cancelled: 'bg-red-500/10 text-red-600 border-red-500/20', + rejected: 'bg-red-500/10 text-red-600 border-red-500/20', + failed: 'bg-red-500/10 text-red-600 border-red-500/20', + out_of_stock: 'bg-red-500/10 text-red-600 border-red-500/20', +}; + +const getBadgeColorClass = (status: string) => badgeColorClasses[status] || 'bg-primary/10 text-primary border-primary/20'; + +// Get status icon based on status +const statusIcons: Record = { + active: CheckCircle2, + published: CheckCircle2, + approved: CheckCircle2, + completed: CheckCircle2, + draft: PenLine, + pending: Clock, + processing: Loader2, + in_progress: Play, + inactive: Circle, + archived: Archive, + cancelled: XCircle, + rejected: XCircle, + failed: AlertCircle, + out_of_stock: AlertTriangle, +}; + +const getStatusIcon = (status: string): LucideIcon => statusIcons[status] || Circle; + +const gridColsMap: Record = { + 1: 'grid-cols-1', + 2: 'grid-cols-1 sm:grid-cols-2', + 3: 'grid-cols-1 sm:grid-cols-2 lg:grid-cols-3', + 4: 'grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4', + 5: 'grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-5', + 6: 'grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-6', +}; + +function SelectCheckmark() { + return ( + + + + ); +} + +function ProductSkeleton() { + return ( + <> + {/* Product Image Skeleton */} + + + {/* Product Info Skeleton */} +
+ {/* Category / SKU */} +
+ + +
+ + {/* Title */} + + + + {/* Description */} + + + + {/* Rating */} +
+
+ {FIVE.map((s) => ( + + ))} +
+ +
+ + {/* Price & Stock */} +
+
+ +
+ + +
+
+
+
+ + {/* Actions Footer Skeleton */} +
+ + + +
+ + ); +} + +function SimpleSkeleton() { + return ( + <> + {/* Main Card Content Skeleton */} +
+ {/* Header: Checkbox + ID */} +
+ + +
+ + {/* Body: Avatar + Info (centered) */} +
+ {/* Avatar Skeleton */} + + + {/* Title and Description Skeleton */} +
+
+ + +
+
+ + +
+
+
+ + {/* Meta Row Skeleton */} +
+ {/* Status Badge Skeleton */} + + {/* Timestamp Skeleton */} + +
+
+ + {/* Actions Footer Skeleton */} +
+ + + +
+ + ); +} + +export default function CardGrid({ + grid, + records, + loading = false, + loadingMore = false, + bulkActionsAvailable = false, + resourceSlug, + modelClass, + clearSelections = 0, + onUpdateSelectedRecords, +}: CardGridProps) { + const [selectedRecords, setSelectedRecords] = useState>(() => new Set()); + const [selectAll, setSelectAll] = useState(false); + + // If loading more (infinite scroll), don't show full skeleton - show records + skeleton at bottom + const isLoading = loadingMore ? false : !!loading; + + const handleSelectAll = (event: ChangeEvent) => { + const target = event.target; + setSelectAll(target.checked); + + const next = target.checked ? new Set(records.map((r) => r.id)) : new Set(); + setSelectedRecords(next); + onUpdateSelectedRecords?.(Array.from(next)); + }; + + const handleSelectRecord = (recordId: number | string) => { + const next = new Set(selectedRecords); + if (next.has(recordId)) { + next.delete(recordId); + } else { + next.add(recordId); + } + setSelectedRecords(next); + setSelectAll(next.size === records.length); + onUpdateSelectedRecords?.(Array.from(next)); + }; + + const isSelected = (recordId: number | string) => selectedRecords.has(recordId); + + // Watch for clear selections signal + useWatch(clearSelections, () => { + setSelectedRecords(new Set()); + setSelectAll(false); + }); + + const gridColumns: any[] = (() => { + // Priority 1: Use card-specific schema if defined + if (grid.card?.schema && grid.card.schema.length > 0) { + return grid.card.schema; + } + + // Priority 2: Use card-specific columns if defined + if (grid.card?.columns && grid.card.columns.length > 0) { + return grid.card.columns; + } + + // Priority 3: If using card builder fields, filter out the fields that are already displayed + if (grid.card?.imageField || grid.card?.titleField || grid.card?.priceField || grid.card?.descriptionField || grid.card?.badgeField) { + const usedFields = [ + grid.card?.imageField, + grid.card?.titleField, + grid.card?.priceField, + grid.card?.descriptionField, + grid.card?.badgeField, + ].filter(Boolean); + + return grid.columns.filter((column: any) => !usedFields.includes(column.name)); + } + + // Priority 4: Use grid columns as fallback + return grid.columns; + })(); + + // Card styling + const cardGap = (() => { + switch (grid.card?.gap) { + case 'sm': + return 'space-y-2'; + case 'md': + return 'space-y-3'; + case 'lg': + return 'space-y-4'; + default: + return 'space-y-3'; + } + })(); + + const getImageUrl = (record: any) => { + const imageField = grid.card?.imageField; + if (!imageField) return null; + return getNestedValue(record, imageField); + }; + + const getTitle = (record: any) => { + const titleField = grid.card?.titleField; + if (!titleField) return null; + return getNestedValue(record, titleField); + }; + + const getSubtitle = (record: any) => { + const subtitleField = grid.card?.subtitleField; + if (!subtitleField) return null; + return getNestedValue(record, subtitleField); + }; + + const getDescription = (record: any) => { + const descriptionField = grid.card?.descriptionField; + if (!descriptionField) return null; + return getNestedValue(record, descriptionField); + }; + + const getPrice = (record: any) => { + const priceField = grid.card?.priceField; + if (!priceField) return null; + return getNestedValue(record, priceField); + }; + + const getBadge = (record: any) => { + const badgeField = grid.card?.badgeField; + if (!badgeField) return null; + return getNestedValue(record, badgeField); + }; + + const getBadgeIcon = (record: any) => { + const badgeField = grid.card?.badgeField; + if (!badgeField) return null; + return record._icons?.[badgeField] || null; + }; + + const getBadgeIconComponent = (record: any): LucideIcon | null => { + const iconName = getBadgeIcon(record); + if (!iconName) return null; + return resolveColumnIcon(iconName); + }; + + // Dynamic grid columns based on cardsPerRow + const gridColsClass = gridColsMap[grid?.cardsPerRow || 3] || gridColsMap[3]; + + // Card style - determines which card template to use + const cardStyle = grid.card?.style || 'default'; + + // Get avatar initials from title + const getAvatarInitials = (record: any) => { + const title = getTitle(record); + if (!title) return '?'; + const words = title.split(' '); + if (words.length >= 2) { + return (words[0].charAt(0) + words[1].charAt(0)).toUpperCase(); + } + return title.substring(0, 2).toUpperCase(); + }; + + // Handle card click to navigate to record URL + const handleCardClick = (event: MouseEvent, record: any) => { + // Don't navigate if there's no URL + if (!record._url) return; + + // Don't navigate if clicking on interactive elements + const target = event.target as HTMLElement; + const interactiveElements = ['A', 'BUTTON', 'INPUT', 'SELECT', 'TEXTAREA', 'LABEL']; + + // Check if click is on or inside an interactive element + let element: HTMLElement | null = target; + while (element) { + if (interactiveElements.includes(element.tagName)) return; + if (element.hasAttribute('data-no-card-click')) return; + if (element.classList.contains('record-actions')) return; + element = element.parentElement; + } + + // Navigate using Inertia + router.visit(record._url); + }; + + const renderRecordActions = (record: any) => ( + + ); + + // ================================ + // SIMPLE CARD STYLE + // User card design with avatar, info, status and timestamp + // ================================ + const renderSimpleCard = (record: any) => { + const badge = getBadge(record); + const imageUrl = getImageUrl(record); + const title = getTitle(record); + const description = getDescription(record); + const relativeTime = getRelativeTime(record); + const StatusIcon = getStatusIcon(badge); + + return ( +
handleCardClick(event, record)} + > + {/* Main Card Content */} +
+ {/* Top Header: Checkbox + ID */} +
+ {/* Selection Checkbox */} + {bulkActionsAvailable && ( +
{ + event.stopPropagation(); + handleSelectRecord(record.id); + }} + > +
+ {isSelected(record.id) && } +
+
+ )} + {/* Record ID */} + #{toDisplayString(record.id)} +
+ + {/* Body: Avatar + Info (centered horizontally) */} +
+ {/* Avatar with Status Indicator */} +
+ + {imageUrl && } + + {getAvatarInitials(record)} + + + {/* Online/Status Indicator Dot */} + {badge && ( +
+ )} +
+ + {/* Title and Description (centered) */} +
+
+ + {title &&

{toDisplayString(title)}

} +
+ {description && ( +
+ +

{toDisplayString(description)}

+
+ )} +
+
+ + {/* Meta Row: Status Badge + Timestamp */} +
+ {/* Status Badge */} + {badge ? ( +
+ + {formatBadgeText(badge)} +
+ ) : ( +
+ )} + + {/* Timestamp with Calendar Icon */} + {relativeTime && ( +
+ + {relativeTime} +
+ )} +
+
+ + {/* Actions Footer (CENTERED) */} + {record._actions && record._actions.length > 0 && ( +
+ {renderRecordActions(record)} +
+ )} +
+ ); + }; + + // ================================ + // MEDIA CARD STYLE + // Full background image with gradient overlay + // ================================ + const renderMediaCard = (record: any) => { + const badge = getBadge(record); + const imageUrl = getImageUrl(record); + const title = getTitle(record); + const description = getDescription(record); + const BadgeIcon = getBadgeIconComponent(record); + + return ( +
handleCardClick(event, record)} + > + {/* Background Image */} +
+ {imageUrl ? ( + {title + ) : ( +
+ {title?.charAt(0) || '?'} +
+ )} + + {/* Gradient Overlay */} +
+ + {/* Selection Checkbox (top-left) */} + {bulkActionsAvailable && ( +
+ handleSelectRecord(record.id)} + className="border-white/50 data-[state=checked]:bg-primary data-[state=checked]:border-primary" + /> +
+ )} + + {/* Badge (top-right) */} + {badge && ( +
+ + {BadgeIcon && } + {formatBadgeText(badge)} + +
+ )} + + {/* Content Overlay (bottom) */} +
+ {/* Title */} + {title &&

{toDisplayString(title)}

} + + {/* Description */} + {description &&

{toDisplayString(description)}

} +
+
+ + {/* Actions Bar */} + {record._actions && record._actions.length > 0 && ( +
+ {renderRecordActions(record)} +
+ )} +
+ ); + }; + + // ================================ + // PRODUCT CARD STYLE + // E-commerce style with image, structured info, and price + // ================================ + const renderProductCard = (record: any) => { + const badge = getBadge(record); + const imageUrl = getImageUrl(record); + const title = getTitle(record); + const subtitle = getSubtitle(record); + const description = getDescription(record); + const price = getPrice(record); + const StatusIcon = getStatusIcon(badge); + + return ( +
handleCardClick(event, record)} + > + {/* Selection Checkbox (floating) */} + {bulkActionsAvailable && ( +
+
{ + event.stopPropagation(); + handleSelectRecord(record.id); + }} + className={cn( + 'h-5 w-5 rounded border-2 flex items-center justify-center cursor-pointer transition-all duration-200 shadow-sm', + isSelected(record.id) + ? 'bg-primary border-primary' + : 'border-white/80 hover:border-primary/60 bg-white/90 backdrop-blur-sm', + )} + > + {isSelected(record.id) && } +
+
+ )} + + {/* Badge (floating top-right) */} + {badge && ( +
+
+ + {formatBadgeText(badge)} +
+
+ )} + + {/* Product Image Container */} + {grid.card?.showImage !== false && ( +
+ {imageUrl ? ( + {title + ) : ( +
+
+ + No Image +
+
+ )} +
+ )} + + {/* Product Info */} +
+ {/* Subtitle (e.g., Category) */} + {subtitle && ( +
+ {toDisplayString(subtitle)} +
+ )} + + {/* Title */} + {title && ( +

+ {toDisplayString(title)} +

+ )} + + {/* Description */} + {description &&

{toDisplayString(description)}

} + + {/* Rating */} + {record.rating ? ( +
+
+ {FIVE.map((i) => ( + + ))} +
+ ({toDisplayString(record.review_count || 0)}) +
+ ) : null} + + {/* Price & Stock Section */} +
+
+ {/* Price */} + {price ? ( +
+ + {typeof price === 'number' ? `$${price.toFixed(2)}` : toDisplayString(price)} + +
+ ) : null} + + {/* Stock Status */} + {record.stock_quantity !== undefined && ( +
+
10 ? 'bg-emerald-500' : record.stock_quantity > 0 ? 'bg-amber-500' : 'bg-red-500', + )} + >
+ 10 ? 'text-emerald-600' : record.stock_quantity > 0 ? 'text-amber-600' : 'text-red-600', + )} + > + {record.stock_quantity > 0 ? `${record.stock_quantity} in stock` : 'Out of stock'} + +
+ )} +
+
+
+ + {/* Actions Footer */} + {record._actions && record._actions.length > 0 && grid.card?.actionsPosition === 'bottom' && ( +
+ {renderRecordActions(record)} +
+ )} +
+ ); + }; + + // ================================ + // DEFAULT CARD STYLE (Fallback) + // Used when no specific style or when style is unrecognized + // ================================ + const renderDefaultCard = (record: any) => { + const badge = getBadge(record); + const title = getTitle(record); + + return ( + handleCardClick(event, record)} + > + {/* Card Header with Checkbox */} + {(bulkActionsAvailable || title) && ( + + {bulkActionsAvailable && ( + handleSelectRecord(record.id)} className="mt-1" /> + )} +
+ {title ? ( +

{toDisplayString(title)}

+ ) : ( + Record #{toDisplayString(record.id)} + )} +
+ {badge && ( + + {formatBadgeText(badge)} + + )} +
+ )} + + + {gridColumns.map((column: any) => { + const ColumnComponent = getColumnComponent(column.component); + + return ( + + ); + })} + + + {/* Actions Footer */} + {record._actions && record._actions.length > 0 && ( + + {renderRecordActions(record)} + + )} +
+ ); + }; + + const renderCard = + cardStyle === 'simple' + ? renderSimpleCard + : cardStyle === 'media' + ? renderMediaCard + : cardStyle === 'product' + ? renderProductCard + : renderDefaultCard; + + return ( +
+ {/* Select All (when bulk actions available) */} + {bulkActionsAvailable && records.length > 0 && ( +
+ +
+ )} + + {isLoading && !loadingMore ? ( + // Loading State (show skeleton when loading initial data) +
+ {cardStyle === 'product' + ? // Product Card Skeleton + SKELETON_INDEXES.map((i) => ( +
+ +
+ )) + : // Simple Card Skeleton (default) + SKELETON_INDEXES.map((i) => ( +
+ +
+ ))} +
+ ) : records.length > 0 ? ( + // Grid Content with records (+ loading more skeletons at bottom) +
+ {records.map((record) => renderCard(record))} + + {/* Loading more skeleton cards (shown at bottom while infinite scrolling) */} + {loadingMore && cardStyle === 'product' + ? LOADING_MORE_INDEXES.map((i) => ( +
+ +
+ )) + : loadingMore + ? LOADING_MORE_INDEXES.map((i) => ( +
+ +
+ )) + : null} +
+ ) : ( + // Empty State (only when not loading and no records) +
+
+ +
+

{grid.emptyState?.heading || 'No records found'}

+ {grid.emptyState?.description ? ( +

{grid.emptyState.description}

+ ) : ( +

There are no records to display. Try adjusting your filters or search query.

+ )} +
+ )} +
+ ); +} diff --git a/resources/react/components/DataTable.css b/resources/react/components/DataTable.css new file mode 100644 index 0000000..2ab5952 --- /dev/null +++ b/resources/react/components/DataTable.css @@ -0,0 +1,45 @@ +/* Global scrollbar styles from DataTable.vue (not scoped for proper pseudo-element support) */ +/* Custom scrollbar for DataTable - thin and elegant */ +.custom-scrollbar::-webkit-scrollbar { + width: 6px; + height: 6px; +} + +.custom-scrollbar::-webkit-scrollbar-track { + background: transparent; + margin: 4px; +} + +.custom-scrollbar::-webkit-scrollbar-thumb { + background: hsl(var(--muted-foreground) / 0.3); + border-radius: 9999px; + transition: background 0.15s ease; +} + +.custom-scrollbar::-webkit-scrollbar-thumb:hover { + background: hsl(var(--muted-foreground) / 0.5); +} + +/* Dark mode scrollbar */ +.dark .custom-scrollbar::-webkit-scrollbar-thumb { + background: hsl(var(--muted-foreground) / 0.25); +} + +.dark .custom-scrollbar::-webkit-scrollbar-thumb:hover { + background: hsl(var(--muted-foreground) / 0.4); +} + +/* Firefox scrollbar */ +.custom-scrollbar { + scrollbar-width: thin; + scrollbar-color: hsl(var(--muted-foreground) / 0.3) transparent; +} + +.dark .custom-scrollbar { + scrollbar-color: hsl(var(--muted-foreground) / 0.25) transparent; +} + +/* Scrollbar corner */ +.custom-scrollbar::-webkit-scrollbar-corner { + background: transparent; +} diff --git a/resources/react/components/DataTable.tsx b/resources/react/components/DataTable.tsx new file mode 100644 index 0000000..5e3c45a --- /dev/null +++ b/resources/react/components/DataTable.tsx @@ -0,0 +1,700 @@ +import { Skeleton } from '@/components/ui/skeleton'; +import { cn } from '@/lib/utils'; +import { router } from '@inertiajs/react'; +import RecordActions from '@laravilt/actions/components/RecordActions'; +import { useLatest } from '@laravilt/support/composables/hooks'; +import { useLocalization } from '@laravilt/support/composables/useLocalization'; +import { ArrowDown, ArrowUp, ArrowUpDown, GripVertical, Inbox } from 'lucide-react'; +import { useMemo, useState, type ComponentType, type CSSProperties, type DragEvent, type MouseEvent, type ReactNode } from 'react'; +import { useWatch } from '../composables/useWatch'; +import ColorColumn from './columns/ColorColumn'; +import IconColumn from './columns/IconColumn'; +import ImageColumn from './columns/ImageColumn'; +import TextColumn from './columns/TextColumn'; +import ToggleColumn from './columns/ToggleColumn'; +import './DataTable.css'; + +export interface Column { + component: string; + name: string; + label: string; + sortable?: boolean; + toggleable?: boolean; + [key: string]: any; +} + +export interface TableRecord { + id: number | string; + _url?: string; + [key: string]: any; +} + +export interface Action { + name: string; + label?: string; + icon?: string; + color?: string; + url?: string; + requiresConfirmation?: boolean; + [key: string]: any; +} + +export interface GroupConfig { + column: string; + label: string; + collapsible: boolean; +} + +export interface RecordGroup { + value: string | number | null; + title: string; + description?: string | null; + records: TableRecord[]; +} + +export interface DataTableProps { + columns?: Column[]; + records?: TableRecord[]; + loading?: boolean; + skeletonRows?: number; + sortColumn?: string | null; + sortDirection?: 'asc' | 'desc'; + visibleColumns?: string[]; + bulkActionsAvailable?: boolean; + resourceSlug?: string; + columnExecutionRoute?: string; + modelClass?: string; + recordActions?: Action[]; + executionRoute?: string; + clearSelections?: number; + fixedActions?: boolean; + striped?: boolean; + infiniteScroll?: boolean; + useAjax?: boolean; + reorderable?: boolean; + reorderableColumn?: string; + reorderRoute?: string; + activeGroup?: string | null; + groups?: GroupConfig[]; + onSort?: (column: string, direction: 'asc' | 'desc') => void; + onUpdateSelectedRecords?: (records: (number | string)[]) => void; + onActionComplete?: (data?: any) => void; + onReorder?: (items: { id: number | string; order: number }[]) => void; + /** Vue slot `empty` */ + empty?: ReactNode; + /** Vue scoped slot `actions` */ + actions?: (scope: { record: TableRecord }) => ReactNode; +} + +const EMPTY_COLUMNS: Column[] = []; +const EMPTY_RECORDS: TableRecord[] = []; +const EMPTY_STRINGS: string[] = []; +const EMPTY_ACTIONS: Action[] = []; +const EMPTY_GROUPS: GroupConfig[] = []; + +// Scoped `.group` rule from DataTable.vue (smooth transitions for row hover states) +const ROW_TRANSITION_STYLE: CSSProperties = { + transition: 'background-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out', +}; + +const CHECKBOX_CLASS = + 'peer size-4 shrink-0 appearance-none rounded border border-input bg-background shadow-sm ring-offset-background transition-all duration-150 hover:border-primary/50 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1 disabled:cursor-not-allowed disabled:opacity-50 checked:border-primary checked:bg-primary checked:text-primary-foreground cursor-pointer'; + +function CheckIcon() { + return ( + + + + ); +} + +export default function DataTable({ + columns = EMPTY_COLUMNS, + records = EMPTY_RECORDS, + loading = false, + skeletonRows = 10, + sortColumn = null, + sortDirection = 'asc', + visibleColumns = EMPTY_STRINGS, + bulkActionsAvailable = false, + resourceSlug = '', + columnExecutionRoute, + modelClass, + executionRoute, + clearSelections = 0, + fixedActions = false, + striped = false, + reorderable = false, + reorderableColumn = 'sort_order', + reorderRoute, + activeGroup = null, + groups = EMPTY_GROUPS, + onSort, + onUpdateSelectedRecords, + onActionComplete, + onReorder, + empty, + actions, +}: DataTableProps) { + const { trans } = useLocalization(); + const recordsRef = useLatest(records); + + // Drag and drop state for reorderable + const [draggedIndex, setDraggedIndex] = useState(null); + const [dragOverIndex, setDragOverIndex] = useState(null); + const [localRecords, setLocalRecords] = useState(() => [...records]); + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const [isReordering, setIsReordering] = useState(false); + + // Keep local records in sync with props (Vue: immediate deep watcher) + const [syncedRecords, setSyncedRecords] = useState(records); + if (syncedRecords !== records) { + setSyncedRecords(records); + setLocalRecords([...records]); + } + + // Drag and drop handlers + const handleDragStart = (event: DragEvent, index: number) => { + if (!reorderable) return; + setDraggedIndex(index); + if (event.dataTransfer) { + event.dataTransfer.effectAllowed = 'move'; + event.dataTransfer.setData('text/plain', String(index)); + } + }; + + const handleDragOver = (event: DragEvent, index: number) => { + if (!reorderable || draggedIndex === null) return; + event.preventDefault(); + if (event.dataTransfer) { + event.dataTransfer.dropEffect = 'move'; + } + setDragOverIndex(index); + }; + + const handleDragLeave = () => { + setDragOverIndex(null); + }; + + const saveReorder = async (items: { id: number | string; order: number }[]) => { + if (!reorderRoute && !resourceSlug) return; + + setIsReordering(true); + try { + const url = reorderRoute || `/admin/${resourceSlug}/reorder`; + await fetch(url, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + Accept: 'application/json', + 'X-CSRF-TOKEN': document.querySelector('meta[name="csrf-token"]')?.content || '', + 'X-Requested-With': 'XMLHttpRequest', + }, + body: JSON.stringify({ + items, + column: reorderableColumn, + }), + }); + } catch (error) { + console.error('Failed to save reorder:', error); + // Revert to original order on error + setLocalRecords([...recordsRef.current]); + } finally { + setIsReordering(false); + } + }; + + const handleDrop = async (event: DragEvent, targetIndex: number) => { + if (!reorderable || draggedIndex === null) return; + event.preventDefault(); + + const sourceIndex = draggedIndex; + if (sourceIndex === targetIndex) { + setDraggedIndex(null); + setDragOverIndex(null); + return; + } + + // Reorder local records + const newRecords = [...localRecords]; + const [movedItem] = newRecords.splice(sourceIndex, 1); + newRecords.splice(targetIndex, 0, movedItem); + setLocalRecords(newRecords); + + // Reset drag state + setDraggedIndex(null); + setDragOverIndex(null); + + // Build new order data + const reorderData = newRecords.map((record, index) => ({ + id: record.id, + order: index + 1, + })); + + // Emit reorder event + onReorder?.(reorderData); + + // Send to server + await saveReorder(reorderData); + }; + + const handleDragEnd = () => { + setDraggedIndex(null); + setDragOverIndex(null); + }; + + // Use local records for rendering when reorderable + const displayRecords = reorderable ? localRecords : records; + + // Track collapsed groups (not used by the template — same as Vue) + const [collapsedGroups, setCollapsedGroups] = useState>(() => new Set()); + + // Check if grouping is active + const isGrouped = activeGroup !== null && activeGroup !== undefined; + + // Get active group config (not used by the template — same as Vue) + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const activeGroupConfig = !activeGroup ? null : groups?.find((g) => g.column === activeGroup) || null; + + // Group records by active group column (not used by the template — same as Vue) + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const groupedRecords = useMemo(() => { + if (!isGrouped || !activeGroup) { + return []; + } + + const groupMap = new Map(); + + for (const record of displayRecords) { + const groupInfo = record._group; + const groupValue = groupInfo?.value ?? null; + const groupKey = String(groupValue); + + if (!groupMap.has(groupKey)) { + groupMap.set(groupKey, { + value: groupValue, + title: groupInfo?.title || String(groupValue), + description: groupInfo?.description || null, + records: [], + }); + } + + groupMap.get(groupKey)!.records.push(record); + } + + return Array.from(groupMap.values()); + }, [isGrouped, activeGroup, displayRecords]); + + // Toggle group collapse state (not used by the template — same as Vue) + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const toggleGroupCollapse = (groupValue: string | number | null) => { + const groupKey = String(groupValue); + const next = new Set(collapsedGroups); + if (next.has(groupKey)) { + next.delete(groupKey); + } else { + next.add(groupKey); + } + setCollapsedGroups(next); + }; + + // Check if a group is collapsed (not used by the template — same as Vue) + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const isGroupCollapsed = (groupValue: string | number | null) => collapsedGroups.has(String(groupValue)); + + const [selectedRecords, setSelectedRecords] = useState>(() => new Set()); + + // Watch for clearSelections prop changes to clear selections + useWatch(clearSelections, (value) => { + if (value > 0) { + setSelectedRecords(new Set()); + onUpdateSelectedRecords?.([]); + } + }); + + const isColumnVisible = (column: Column): boolean => { + if (visibleColumns.length === 0) return true; + if (column.toggleable === false) return true; + return visibleColumns.includes(column.name); + }; + + const visibleColumnsFiltered = columns.filter((col) => isColumnVisible(col)); + + const allSelected = records.length === 0 ? false : records.every((record) => selectedRecords.has(record.id)); + + const someSelected = records.length === 0 ? false : records.some((record) => selectedRecords.has(record.id)) && !allSelected; + + const toggleSelectAll = () => { + const next = allSelected ? new Set() : new Set(records.map((record) => record.id)); + setSelectedRecords(next); + onUpdateSelectedRecords?.(Array.from(next)); + }; + + const toggleSelectRecord = (recordId: number | string) => { + const newSet = new Set(selectedRecords); + if (newSet.has(recordId)) { + newSet.delete(recordId); + } else { + newSet.add(recordId); + } + setSelectedRecords(newSet); + onUpdateSelectedRecords?.(Array.from(newSet)); + }; + + const isRecordSelected = (recordId: number | string) => selectedRecords.has(recordId); + + const handleSort = (column: Column) => { + if (!column.sortable) return; + + let direction: 'asc' | 'desc' = 'asc'; + + if (sortColumn === column.name) { + direction = sortDirection === 'asc' ? 'desc' : 'asc'; + } + + onSort?.(column.name, direction); + }; + + const getSortIcon = (column: Column) => { + if (!column.sortable) return null; + + if (sortColumn === column.name) { + return sortDirection === 'asc' ? ArrowUp : ArrowDown; + } + + return ArrowUpDown; + }; + + // Check if any record has actions + const hasRecordActions = records.some((record) => record._actions && record._actions.length > 0); + + // Get max actions count across all records for consistent column width + const maxActionsCount = !records.length + ? 3 // Default for skeleton + : Math.max(...records.map((record) => record._actions?.filter((a: Action) => !a.isHidden)?.length || 0), 1); + + // Calculate actions column width based on max actions (not used by the template — same as Vue) + // Each button is 32px (h-8 w-8) + 4px gap, plus 32px padding (px-4 = 16px each side) + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const actionsColumnWidth = `${32 * maxActionsCount + 4 * (maxActionsCount - 1) + 32}px`; + + // Get component for column type + const getColumnComponent = (columnType: string): ComponentType => { + switch (columnType) { + case 'TextColumn': + return TextColumn; + case 'IconColumn': + return IconColumn; + case 'ImageColumn': + return ImageColumn; + case 'ColorColumn': + return ColorColumn; + case 'ToggleColumn': + return ToggleColumn; + default: + return TextColumn; + } + }; + + // Handle row click to navigate to record URL + const handleRowClick = (event: MouseEvent, record: TableRecord) => { + // Don't navigate if there's no URL + if (!record._url) return; + + // Don't navigate if clicking on interactive elements + const target = event.target as HTMLElement; + const interactiveElements = ['A', 'BUTTON', 'INPUT', 'SELECT', 'TEXTAREA', 'LABEL']; + + // Check if click is on or inside an interactive element + let element: HTMLElement | null = target; + while (element) { + if (interactiveElements.includes(element.tagName)) return; + if (element.hasAttribute('data-no-row-click')) return; + if (element.classList.contains('record-actions')) return; + element = element.parentElement; + } + + // Navigate using Inertia + router.visit(record._url); + }; + + // Get column width style based on column config + const getColumnWidthStyle = (column: Column): CSSProperties => { + const style: CSSProperties = {}; + + // Only apply explicit width if developer specified it + if (column.width) { + // Support various formats: '200px', '20%', 200 (number) + const width = typeof column.width === 'number' ? `${column.width}px` : column.width; + style.width = width; + style.minWidth = width; + style.maxWidth = width; + return style; + } + + // If column should grow, let it expand to fill remaining space + if (column.grow) { + style.flex = '1'; + return style; + } + + // Default: auto width - let content determine the width + return style; + }; + + const skeletonIndexes = Array.from({ length: skeletonRows }, (_, index) => index + 1); + const actionSkeletonIndexes = Array.from({ length: maxActionsCount }, (_, index) => index + 1); + + return ( +
+ {!loading && !records.length ? ( + // Empty State +
+
+ {empty != null ? ( + empty + ) : ( +
+
+ +
+

No records found

+

+ There are no records to display. Try adjusting your filters or search query. +

+
+ )} +
+
+ ) : ( + // Table Content (only show when there are records or loading) + + {/* Table Header */} + + + {/* Drag Handle Header (if reorderable) */} + {reorderable && ( + + )} + + {/* Checkbox Column (if bulk actions available) */} + {bulkActionsAvailable && ( + + )} + + {/* Data Column Headers */} + {visibleColumnsFiltered.map((column) => { + const SortIcon = getSortIcon(column); + + return ( + + ); + })} + + {/* Actions Header */} + {hasRecordActions && ( + + )} + + + + {/* Table Body */} + + {loading + ? // Loading State + skeletonIndexes.map((i) => ( + + {/* Checkbox Skeleton */} + {bulkActionsAvailable && ( + + )} + + {/* Column Skeletons */} + {visibleColumnsFiltered.map((column) => ( + + ))} + + {/* Actions Skeleton */} + {hasRecordActions && ( + + )} + + )) + : displayRecords.length > 0 + ? // Data Rows + displayRecords.map((record, index) => ( + handleDragStart(event, index)} + onDragOver={(event) => handleDragOver(event, index)} + onDragLeave={handleDragLeave} + onDrop={(event) => handleDrop(event, index)} + onDragEnd={handleDragEnd} + onClick={(event) => handleRowClick(event, record)} + > + {/* Drag Handle */} + {reorderable && ( + + )} + + {/* Checkbox Column */} + {bulkActionsAvailable && ( + + )} + + {/* Data Columns */} + {visibleColumnsFiltered.map((column, columnIndex) => { + const ColumnComponent = getColumnComponent(column.component); + + return ( + + ); + })} + + {/* Actions Column */} + {record._actions && record._actions.length > 0 ? ( + + ) : hasRecordActions ? ( + + ) : null} + + )) + : null} + +
+ Reorder + + + handleSort(column)} + > +
+ {column.label} + {column.sortable && SortIcon && ( + + )} +
+
+ {trans('tables::tables.columns.actions')} +
+ + + + +
+ {actionSkeletonIndexes.map((n) => ( + + ))} +
+
+ + + + + {/* Same binding order as Vue: column config overrides the record-level values */} + + +
+ {actions ? ( + actions({ record }) + ) : ( + onActionComplete?.(data)} + /> + )} +
+
+ )} +
+ ); +} diff --git a/resources/react/components/GridToolbar.tsx b/resources/react/components/GridToolbar.tsx new file mode 100644 index 0000000..8d39395 --- /dev/null +++ b/resources/react/components/GridToolbar.tsx @@ -0,0 +1,291 @@ +import { Badge } from '@/components/ui/badge'; +import { Button } from '@/components/ui/button'; +import { Input } from '@/components/ui/input'; +import { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover'; +import { cn } from '@/lib/utils'; +import { useLocalization } from '@laravilt/support/composables'; +import { ArrowDown, ArrowUp, ArrowUpDown, Search, SlidersHorizontal, X } from 'lucide-react'; +import { useState, type KeyboardEvent, type ReactNode } from 'react'; +import { useWatch } from '../composables/useWatch'; + +interface FilterIndicator { + label: string; + removeField: string; +} + +export interface GridToolbarProps { + searchable?: boolean; + searchPlaceholder?: string; + search?: string; + filters?: any[]; + activeFilters?: Record; + filterIndicators?: FilterIndicator[]; + bulkActionsAvailable?: boolean; + selectedCount?: number; + columns?: any[]; + sortColumn?: string | null; + sortDirection?: 'asc' | 'desc'; + onUpdateSearch?: (value: string) => void; + onUpdateFilters?: (filters: Record) => void; + onRemoveFilter?: (filterName: string) => void; + onClearFilters?: () => void; + onUpdateSort?: (column: string, direction: 'asc' | 'desc') => void; + /** Vue slot `bulk-actions` */ + bulkActions?: ReactNode; + /** Vue slot `filters` (renamed: `filters` is already the filter-definitions prop) */ + filtersSlot?: ReactNode; + /** Vue slot `toolbar-actions` */ + toolbarActions?: ReactNode; + /** Vue slot `active-filters` (renamed: `activeFilters` is already the active-filter-values prop) */ + activeFiltersSlot?: ReactNode; +} + +const EMPTY: any[] = []; +const EMPTY_ACTIVE_FILTERS: Record = {}; + +export default function GridToolbar({ + searchable = true, + searchPlaceholder = 'Search...', + search = '', + filters = EMPTY, + activeFilters = EMPTY_ACTIVE_FILTERS, + bulkActionsAvailable = false, + selectedCount = 0, + columns = EMPTY, + sortColumn = null, + sortDirection = 'asc', + onUpdateSearch, + onRemoveFilter, + onClearFilters, + onUpdateSort, + bulkActions, + filtersSlot, + toolbarActions, + activeFiltersSlot, +}: GridToolbarProps) { + const { trans } = useLocalization(); + + const [localSearch, setLocalSearch] = useState(search); + + useWatch(search, (newValue) => { + setLocalSearch(newValue); + }); + + const handleSearchSubmit = () => { + onUpdateSearch?.(localSearch); + }; + + const activeFilterCount = Object.values(activeFilters).filter((value) => value !== null && value !== '' && value !== undefined).length; + + // Compute filter indicators from activeFilters instead of using the prop + const computedFilterIndicators: Array<{ label: string; removeField: string }> = []; + + Object.entries(activeFilters).forEach(([filterName, value]) => { + if (value === null || value === '' || value === undefined || value === false) { + return; + } + + // Find the filter definition + const filter = filters.find((f: any) => f.name === filterName); + if (!filter) return; + + // Get the indicator label from the filter + let label = `${filter.label || filterName}: ${value}`; + + // If filter has indicateUsing callback, use it + if (filter.indicateUsing) { + label = filter.indicateUsing; + } + + computedFilterIndicators.push({ + label, + removeField: filterName, + }); + }); + + const sortableColumns = columns.filter((col: any) => col.sortable); + + const currentSortLabel = (() => { + if (!sortColumn) return 'Sort by...'; + const column = sortableColumns.find((col: any) => col.name === sortColumn); + return column ? column.label : 'Sort by...'; + })(); + + const SortIcon = !sortColumn ? ArrowUpDown : sortDirection === 'asc' ? ArrowUp : ArrowDown; + const DirectionIcon = sortDirection === 'asc' ? ArrowUp : ArrowDown; + + const handleSortChange = (columnName: string) => { + let direction: 'asc' | 'desc' = 'asc'; + + if (sortColumn === columnName) { + // Toggle direction if same column + direction = sortDirection === 'asc' ? 'desc' : 'asc'; + } + + onUpdateSort?.(columnName, direction); + }; + + const clearSearch = () => { + onUpdateSearch?.(''); + }; + + const clearFilters = () => { + onClearFilters?.(); + }; + + const removeFilter = (filterName: string) => { + onRemoveFilter?.(filterName); + }; + + const hasActiveFilters = activeFilterCount > 0; + const hasActiveSearch = search.length > 0; + const hasComputedFilterIndicators = computedFilterIndicators.length > 0; + + return ( +
+ {/* Bulk Actions Bar */} + {bulkActionsAvailable && selectedCount > 0 && ( +
+ {selectedCount} selected +
{bulkActions}
+
+ )} + + {/* Top Row: Search and Filters */} +
+ {/* Search */} + {searchable && ( +
+ + setLocalSearch(event.target.value)} + type="search" + placeholder={searchPlaceholder || trans('tables::tables.search.placeholder')} + className="pl-9 pr-9" + onKeyUp={(event: KeyboardEvent) => { + if (event.key === 'Enter') handleSearchSubmit(); + }} + /> + {hasActiveSearch && ( + + )} +
+ )} + +
+ {/* Sort Button */} + {sortableColumns.length > 0 && ( + + + + + +
+

Sort by

+
+ {sortableColumns.map((column: any) => ( + + ))} +
+
+
+
+ )} + + {/* Filters Button */} + {filters.length > 0 && ( + + + + + +
+
+

Filters

+ {hasActiveFilters && ( + + )} +
+
{filtersSlot}
+
+
+
+ )} + + {/* Toolbar Actions Slot */} + {toolbarActions} +
+
+ + {/* Active Filters Display */} + {(hasActiveFilters || hasActiveSearch || hasComputedFilterIndicators) && ( +
+ Active filters: + + {hasActiveSearch && ( + + Search: "{search}" + + + )} + + {computedFilterIndicators.map((indicator, index) => ( + + {indicator.label} + + + ))} + + {activeFiltersSlot} + + {(hasActiveFilters || hasActiveSearch || hasComputedFilterIndicators) && ( + + )} +
+ )} +
+ ); +} diff --git a/resources/react/components/Table.tsx b/resources/react/components/Table.tsx new file mode 100644 index 0000000..e24267a --- /dev/null +++ b/resources/react/components/Table.tsx @@ -0,0 +1,1041 @@ +import { cn } from '@/lib/utils'; +import { router } from '@inertiajs/react'; +import ActionButton from '@laravilt/actions/components/ActionButton'; +import LaraviltComponentRenderer from '@laravilt/forms/components/LaraviltComponentRenderer'; +import { useLocalization } from '@laravilt/support/composables'; +import { useLatest } from '@laravilt/support/composables/hooks'; +import { useCallback, useEffect, useMemo, useRef, useState, type ChangeEvent, type MouseEvent } from 'react'; +import { useStateRef } from '../composables/useStateRef'; +import { useWatch } from '../composables/useWatch'; +import CardGrid from './CardGrid'; +import DataTable from './DataTable'; +import TableToolbar from './TableToolbar'; + +export interface FilterIndicator { + label: string; + removeField: string; +} + +export interface RelationContext { + baseUrl: string; + relationship: string; + canEdit: boolean; + canDelete: boolean; + columnExecutionRoute?: string; +} + +export interface TableProps { + table: any; + records?: any[]; + pagination?: any; + recordActions?: any[]; + bulkActions?: any[]; + filterIndicators?: FilterIndicator[]; + resourceSlug: string; + queryRoute: string; + loading?: boolean; + currentView?: 'table' | 'grid'; + useAjax?: boolean; // Use fetch API instead of Inertia router (for relation managers) + onDataLoaded?: (data: { records: any[]; pagination: any }) => void; // Callback when data is loaded via AJAX (Vue: prop + `data-loaded` event) + relationContext?: RelationContext; // Context for relation manager to build record-specific URLs + onActionComplete?: (data?: any) => void; +} + +const DEFAULT_PAGINATION = { + total: 0, + per_page: 12, + current_page: 1, + last_page: 1, + from: 0, + to: 0, +}; + +const EMPTY: any[] = []; +const EMPTY_INDICATORS: FilterIndicator[] = []; + +// Preserve existing URL params that we don't manage (like 'view') +const PRESERVE_PARAMS = ['view']; + +export default function Table({ + table, + records = EMPTY, + pagination = DEFAULT_PAGINATION, + recordActions = EMPTY, + bulkActions = EMPTY, + filterIndicators = EMPTY_INDICATORS, + resourceSlug, + queryRoute, + loading = false, + currentView = 'table', + useAjax = false, + onDataLoaded, + relationContext, + onActionComplete, +}: TableProps) { + const { trans } = useLocalization(); + + // Latest props for async callbacks (timeouts, observer, window listener, fetch) + const live = useLatest({ table, pagination, queryRoute, useAjax, onDataLoaded, onActionComplete }); + + // Extract bulk actions from toolbarActions (handles BulkActionGroup) + const extractedBulkActions = useMemo(() => { + let actions: any[] = []; + + // First, check if bulk actions are directly provided + if (bulkActions && bulkActions.length > 0) { + actions = bulkActions; + } + // Then check table's bulkActions + else if (table.bulkActions && table.bulkActions.length > 0) { + actions = table.bulkActions; + } + // Finally, extract from toolbarActions (look for BulkActionGroup) + else if (table.toolbarActions && table.toolbarActions.length > 0) { + for (const action of table.toolbarActions) { + // Check if this is a BulkActionGroup + if (action.type === 'bulk-action-group' && action.actions) { + actions.push(...action.actions); + } + } + } + + // Filter out hidden actions (based on isHidden property from backend) + // and set preserveState: false for all bulk actions so table refreshes after action + return actions + .filter((action) => !action.isHidden) + .map((action) => ({ + ...action, + preserveState: action.preserveState ?? false, + isBulkAction: true, + deselectRecordsAfterCompletion: action.deselectRecordsAfterCompletion ?? true, + })); + }, [bulkActions, table.bulkActions, table.toolbarActions]); + + // Check if table is configured for grid-only mode + const isGridOnly = table.gridOnly === true && table.card !== null && table.card !== undefined; + + // Determine if we should show grid view (if gridOnly is enabled, always show grid) + const isGridView = isGridOnly ? true : currentView === 'grid' && table.card !== null && table.card !== undefined; + + // Check if table has card configuration (for view toggle visibility) — not used by the template (same as Vue) + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const hasGridOption = isGridOnly ? false : table.card !== null && table.card !== undefined; + + const [sortColumn, setSortColumn, sortColumnRef] = useStateRef(table.defaultSortColumn || null); + const [sortDirection, setSortDirection, sortDirectionRef] = useStateRef<'asc' | 'desc'>(table.defaultSortDirection || 'asc'); + const [activeGroup, setActiveGroup, activeGroupRef] = useStateRef(table.activeGroup || table.defaultGroup || null); + const [selectedRecords, setSelectedRecords] = useState<(number | string)[]>([]); + const [searchQuery, setSearchQuery, searchQueryRef] = useStateRef(''); + + // Infinite scroll is disabled when grouping is active + const isInfiniteScrollActive = !!(table.infiniteScroll && !activeGroup); + const isInfiniteScrollActiveNow = (): boolean => !!(live.current.table.infiniteScroll && !activeGroupRef.current); + + const [activeFilters, setActiveFilters, activeFiltersRef] = useStateRef>({}); + const [clearSelectionsKey, setClearSelectionsKey] = useState(0); + const [isLoadingData, setIsLoadingData, isLoadingDataRef] = useStateRef(false); + const [perPage, setPerPage, perPageRef] = useStateRef(pagination.per_page || 12); + const currentPageRef = useRef(pagination.current_page || 1); + const [isLoadingMore, setIsLoadingMore, isLoadingMoreRef] = useStateRef(false); + const isInitializedRef = useRef(false); + + // Track if we're doing a filter/search reload (should replace, not append) + const isFilterReloadRef = useRef(false); + + // Enhance records with actions for relation manager context + const enhancedRecords = useMemo(() => { + // If we have relation context, add _actions to each record with proper URLs + if (relationContext) { + return records.map((record) => { + const actions: any[] = []; + + // Add view action (no URL needed, just displays modal with data) + const viewAction = recordActions.find((a: any) => a.name === 'view'); + if (viewAction) { + actions.push({ + ...viewAction, + externalFormData: record, // Pass record data to populate form + // No URL or method - view is display only + }); + } + + // Add edit action + if (relationContext.canEdit) { + const editAction = recordActions.find((a: any) => a.name === 'edit'); + if (editAction) { + actions.push({ + ...editAction, + url: `${relationContext.baseUrl}/${record.id}`, + externalFormData: record, // Pass record data to populate form + }); + } + } + + // Add delete action + if (relationContext.canDelete) { + const deleteAction = recordActions.find((a: any) => a.name === 'delete'); + if (deleteAction) { + actions.push({ + ...deleteAction, + url: `${relationContext.baseUrl}/${record.id}`, + }); + } + } + + // Add any other actions that aren't view/edit/delete + recordActions.forEach((action: any) => { + if (action.name !== 'view' && action.name !== 'edit' && action.name !== 'delete') { + actions.push({ + ...action, + url: action.url || `${relationContext.baseUrl}/${record.id}`, + }); + } + }); + + return { + ...record, + _actions: actions, + }; + }); + } + + // For non-relation context, just use the records as-is with existing _actions + return records; + }, [relationContext, records, recordActions]); + + // Column visibility persistence + const getColumnStorageKey = () => `laravilt_columns_${resourceSlug || 'default'}`; + + const getSavedColumns = (): string[] | null => { + if (typeof window === 'undefined') return null; + try { + const saved = localStorage.getItem(getColumnStorageKey()); + if (saved) { + return JSON.parse(saved); + } + } catch (e) { + console.error('Failed to parse saved columns:', e); + } + return null; + }; + + const saveColumnPreferences = (columns: string[]) => { + if (typeof window === 'undefined') return; + try { + localStorage.setItem(getColumnStorageKey(), JSON.stringify(columns)); + } catch (e) { + console.error('Failed to save column preferences:', e); + } + }; + + // Initialize visible columns - load from localStorage or use defaults + const [visibleColumns, setVisibleColumnsState] = useState(() => { + const saved = getSavedColumns(); + if (saved && saved.length > 0) { + return saved; + } + // Default: show all non-hidden columns + return table.columns?.filter((col: any) => !col.isToggledHiddenByDefault).map((col: any) => col.name) || []; + }); + + // Vue watches visibleColumns and saves to localStorage on every change + const setVisibleColumns = (columns: string[]) => { + setVisibleColumnsState(columns); + saveColumnPreferences(columns); + }; + + // Pagination page size options + const paginationOptions: number[] = + table.paginationPageOptions && table.paginationPageOptions.length > 0 + ? table.paginationPageOptions + : // Default options (12-based for grid layout compatibility) + [12, 24, 48, 96]; + + // Records: append or replace based on infinite scroll. + // Initial value reproduces Vue's immediate watcher run during setup. + const [allRecords, setAllRecords, allRecordsRef] = useStateRef(() => { + if (table.infiniteScroll && !(table.activeGroup || table.defaultGroup) && pagination.current_page !== 1 && pagination.current_page > 1) { + return [...records, ...records]; + } + return records; + }); + + useWatch(records, (newRecords) => { + if (isInfiniteScrollActiveNow()) { + // If it's a filter reload OR page 1, replace all records + // Only append if loading more pages (page > 1 and NOT a filter reload) + if (isFilterReloadRef.current || live.current.pagination.current_page === 1) { + setAllRecords(newRecords); + isFilterReloadRef.current = false; // Reset the flag + } else if (live.current.pagination.current_page > 1) { + // Only append if we're actually loading more (not a filter change) + setAllRecords([...allRecordsRef.current, ...newRecords]); + } else { + setAllRecords(newRecords); + } + } else { + setAllRecords(newRecords); + } + }); + + // Watch for search, filter, sort changes to reset records (only after initialization) + useWatch(JSON.stringify([searchQuery, activeFilters, sortColumn, sortDirection]), () => { + if (!isInitializedRef.current) return; // Don't trigger on initial mount + + if (isInfiniteScrollActiveNow()) { + // Don't clear records here - let skeleton show by setting isLoadingData + // Records will be replaced when new data arrives via the other watcher + currentPageRef.current = 1; + } + }); + + // Build query params, only including non-empty values + const collectParams = (page: number, includeGroup: boolean, urlParams: URLSearchParams): Record => { + const params: Record = { + page, + per_page: perPageRef.current, + }; + + PRESERVE_PARAMS.forEach((param) => { + const value = urlParams.get(param); + if (value !== null) { + params[param] = value; + } + }); + + // Only add search if it has a value + if (searchQueryRef.current) { + params.search = searchQueryRef.current; + } + + // Only add sort if it has a value + if (sortColumnRef.current) { + params.sort = sortColumnRef.current; + params.direction = sortDirectionRef.current; + } + + // Only add filters that have values + Object.entries(activeFiltersRef.current).forEach(([key, value]) => { + if (value !== null && value !== undefined && value !== '' && value !== false) { + params[key] = value; + } + }); + + // Add group if active + if (includeGroup && activeGroupRef.current) { + params.group = activeGroupRef.current; + } + + return params; + }; + + const reloadData = async (page?: number, resetPage = false) => { + // Set loading state immediately and keep it true + setIsLoadingData(true); + + const params = collectParams( + resetPage ? 1 : page || live.current.pagination.current_page, + true, + new URLSearchParams(window.location.search), + ); + + // Use AJAX (fetch) if useAjax is true - this avoids Inertia page reload + if (live.current.useAjax) { + try { + const queryString = new URLSearchParams(params).toString(); + const fetchUrl = `${live.current.queryRoute}?${queryString}`; + + const response = await fetch(fetchUrl, { + headers: { + Accept: 'application/json', + 'X-Requested-With': 'XMLHttpRequest', + }, + }); + + if (response.ok) { + const data = await response.json(); + // Emit data-loaded event for parent to update its state + live.current.onDataLoaded?.({ + records: data.data || [], + pagination: data.pagination || live.current.pagination, + }); + } + } catch (error) { + console.error('Failed to fetch data:', error); + } finally { + setIsLoadingData(false); + } + return; + } + + // Update URL manually (only for Inertia mode) + const url = new URL(window.location.href); + url.search = new URLSearchParams(params).toString(); + window.history.replaceState({}, '', url.toString()); + + router.get(live.current.queryRoute, params, { + preserveState: true, + preserveScroll: true, + onBefore: () => { + setIsLoadingData(true); + }, + onSuccess: () => { + setTimeout(() => { + setIsLoadingData(false); + }, 100); + }, + onError: () => { + setIsLoadingData(false); + }, + }); + }; + + // Handle action completion from record actions - reload data and emit to parent + const handleActionComplete = (data?: any) => { + // If using AJAX mode, reload data after action + if (live.current.useAjax) { + reloadData(); + } + + live.current.onActionComplete?.(data); + }; + + const handleSort = (column: string, direction: 'asc' | 'desc') => { + setSortColumn(column); + setSortDirection(direction); + + // For infinite scroll, mark as filter reload to replace records instead of appending + if (isInfiniteScrollActiveNow()) { + isFilterReloadRef.current = true; + currentPageRef.current = 1; + } + + reloadData(1, true); // Reset to page 1 when sorting + }; + + const handleSearch = (query: string) => { + setSearchQuery(query); + isFilterReloadRef.current = true; // Mark this as a search/filter reload + reloadData(1, true); // Reset to page 1 when searching + }; + + const handleFilterChange = (filters: Record) => { + setActiveFilters(filters); + isFilterReloadRef.current = true; + reloadData(1, true); + }; + + const handleFilterUpdate = (filterName: string, value: any) => { + // Remove filter if value is empty or false (for toggles) + if (value === null || value === undefined || value === '' || value === false) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const { [filterName]: _, ...rest } = activeFiltersRef.current; + setActiveFilters(rest); + } else { + setActiveFilters({ + ...activeFiltersRef.current, + [filterName]: value, + }); + } + isFilterReloadRef.current = true; // Mark this as a filter reload + reloadData(1, true); // Reset to page 1 when filtering + }; + + const clearAllFilters = () => { + setActiveFilters({}); + setSearchQuery(''); + isFilterReloadRef.current = true; // Mark this as a filter reload + reloadData(1, true); + }; + + const removeFilter = (filterName: string) => { + handleFilterUpdate(filterName, null); + }; + + const handleUpdateSelectedRecords = (ids: (number | string)[]) => { + setSelectedRecords(ids); + }; + + // Track pending load more request + const loadMorePendingRef = useRef(false); + const loadMoreTimeoutRef = useRef | null>(null); + + // Infinite scroll load more with debouncing + const loadMoreRecords = () => { + const currentPagination = live.current.pagination; + + // Guard against multiple rapid calls + if (loadMorePendingRef.current || isLoadingMoreRef.current || isLoadingDataRef.current || !currentPagination) return; + if (currentPagination.current_page >= currentPagination.last_page) return; + + // Debounce rapid scroll events + if (loadMoreTimeoutRef.current) { + clearTimeout(loadMoreTimeoutRef.current); + } + + loadMorePendingRef.current = true; + loadMoreTimeoutRef.current = setTimeout(async () => { + loadMorePendingRef.current = false; + + const latestPagination = live.current.pagination; + + // Re-check conditions after debounce + if (isLoadingMoreRef.current || isLoadingDataRef.current || !latestPagination) return; + if (latestPagination.current_page >= latestPagination.last_page) return; + + setIsLoadingMore(true); + const nextPage = latestPagination.current_page + 1; + + const params = collectParams(nextPage, false, new URLSearchParams(window.location.search)); + + // Use AJAX (fetch) if useAjax is true - this avoids Inertia page reload + if (live.current.useAjax) { + try { + const queryString = new URLSearchParams(params).toString(); + const fetchUrl = `${live.current.queryRoute}?${queryString}`; + + const response = await fetch(fetchUrl, { + headers: { + Accept: 'application/json', + 'X-Requested-With': 'XMLHttpRequest', + }, + }); + + if (response.ok) { + const data = await response.json(); + // Emit data-loaded event for parent to update its state + live.current.onDataLoaded?.({ + records: data.data || [], + pagination: data.pagination || live.current.pagination, + }); + } + } catch (error) { + console.error('Failed to fetch data:', error); + } finally { + setIsLoadingMore(false); + } + return; + } + + // Update URL (only for Inertia mode) + const url = new URL(window.location.href); + url.search = new URLSearchParams(params).toString(); + window.history.replaceState({}, '', url.toString()); + + router.get(live.current.queryRoute, params, { + preserveState: true, + preserveScroll: true, + onSuccess: () => { + setIsLoadingMore(false); + }, + onError: () => { + setIsLoadingMore(false); + }, + }); + }, 150); // 150ms debounce + }; + + // Set up intersection observer for infinite scroll + const tableEndRef = useRef(null); + const scrollContainerRef = useRef(null); + const observerRef = useRef(null); + + const setupInfiniteScroll = () => { + if (!isInfiniteScrollActiveNow()) return; + + // Clean up existing observer + if (observerRef.current) { + observerRef.current.disconnect(); + } + + observerRef.current = new IntersectionObserver( + (entries) => { + const entry = entries[0]; + if (entry.isIntersecting && !isLoadingMoreRef.current && !isLoadingDataRef.current) { + const currentPagination = live.current.pagination; + // Check if there are more pages before loading + if (currentPagination && currentPagination.current_page < currentPagination.last_page) { + fns.current.loadMoreRecords(); + } + } + }, + { + threshold: 0.1, + rootMargin: '50px', + }, + ); + + if (tableEndRef.current) { + observerRef.current.observe(tableEndRef.current); + } + }; + + // Handle group change + const handleGroupChange = (group: string | null) => { + setActiveGroup(group); + + // Reset infinite scroll state when toggling grouping + if (table.infiniteScroll) { + currentPageRef.current = 1; + isFilterReloadRef.current = true; + // Disconnect observer when grouping is active + if (observerRef.current && group) { + observerRef.current.disconnect(); + } + } + + // Update URL with group parameter + const urlParams = new URLSearchParams(window.location.search); + if (group) { + urlParams.set('group', group); + } else { + urlParams.delete('group'); + } + + // If using AJAX mode, reload data + if (useAjax) { + // Vue calls an undefined `updateUrl({ group })` here, which throws a ReferenceError + // before reloadData() runs (and before the observer re-setup below). Ported as-is. + throw new ReferenceError('updateUrl is not defined'); + } else { + // For Inertia, do a full navigation + const currentUrl = new URL(window.location.href); + currentUrl.search = urlParams.toString(); + router.get( + currentUrl.toString(), + {}, + { + preserveState: true, + preserveScroll: true, + }, + ); + } + + // Re-setup infinite scroll observer when grouping is disabled + if (table.infiniteScroll && !group) { + setTimeout(() => { + fns.current.setupInfiniteScroll(); + }, 100); + } + }; + + // Handle reorder events from DataTable + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const handleReorder = async (items: { id: number | string; order: number }[]) => { + // The DataTable component handles the actual reorder request + // This handler is for any additional processing needed at Table level + // For now, we just reload data after reorder to ensure consistency + if (useAjax) { + // Wait a moment for the reorder to complete, then reload + setTimeout(() => { + fns.current.reloadData(); + }, 500); + } + }; + + const bulkActionData = useMemo( + () => ({ + ids: selectedRecords, + model: table.model, + }), + [selectedRecords, table.model], + ); + + const handlePageChange = (page: number, event?: MouseEvent) => { + if (event) { + event.preventDefault(); + } + reloadData(page); + }; + + const handlePerPageChange = (event: ChangeEvent) => { + event.preventDefault(); + setPerPage(parseInt(event.target.value)); + reloadData(undefined, true); // Reset to page 1 when changing per page + }; + + const getPageNumbers = (): (number | string)[] => { + const current = pagination.current_page; + const last = pagination.last_page; + const pages: (number | string)[] = []; + + if (last <= 7) { + // Show all pages if 7 or fewer + for (let i = 1; i <= last; i++) { + pages.push(i); + } + } else { + // Always show first page + pages.push(1); + + if (current > 3) { + pages.push('...'); + } + + // Show pages around current + const start = Math.max(2, current - 1); + const end = Math.min(last - 1, current + 1); + + for (let i = start; i <= end; i++) { + pages.push(i); + } + + if (current < last - 2) { + pages.push('...'); + } + + // Always show last page + pages.push(last); + } + + return pages; + }; + + // Listen for bulk action completion to clear selected records and reload table + const handleBulkActionCompleted = () => { + setSelectedRecords([]); + setClearSelectionsKey((key) => key + 1); + + // If using AJAX mode, reload data + if (live.current.useAjax) { + reloadData(); + } + + // Emit action-complete to notify parent + live.current.onActionComplete?.(); + }; + + // Latest function instances for long-lived callbacks + const fns = useLatest({ setupInfiniteScroll, loadMoreRecords, reloadData, handleBulkActionCompleted, isInfiniteScrollActiveNow }); + + // Vue: watch(tableEndRef) — re-setup the observer when the sentinel element changes + const setTableEndRef = useCallback( + (element: HTMLDivElement | null) => { + const changed = element !== tableEndRef.current; + tableEndRef.current = element; + if (changed && element && fns.current.isInfiniteScrollActiveNow()) { + fns.current.setupInfiniteScroll(); + } + }, + [fns], + ); + + // Watch for view changes - reset scroll and re-setup observer + useWatch(currentView, (newView, oldView) => { + if (newView !== oldView) { + // Reset scroll position when switching views + if (scrollContainerRef.current) { + scrollContainerRef.current.scrollTop = 0; + } + + // Re-setup observer after view change (wait for DOM update) + if (fns.current.isInfiniteScrollActiveNow()) { + setTimeout(() => { + fns.current.setupInfiniteScroll(); + }, 100); + } + } + }); + + useEffect(() => { + // Initialize filters from URL query parameters + const urlParams = new URLSearchParams(window.location.search); + const initialFilters: Record = {}; + + // Get all filter names from table configuration + const filterNames: string[] = live.current.table.filters?.map((f: any) => f.name) || []; + + // Read filter values from URL + filterNames.forEach((filterName: string) => { + const value = urlParams.get(filterName); + if (value !== null && value !== '') { + initialFilters[filterName] = value; + } + }); + + // Initialize activeFilters with URL values + setActiveFilters(initialFilters); + + // Initialize search from URL + const searchParam = urlParams.get('search'); + if (searchParam) { + setSearchQuery(searchParam); + } + + // Initialize sort from URL + const sortParam = urlParams.get('sort'); + const directionParam = urlParams.get('direction'); + if (sortParam) { + setSortColumn(sortParam); + // Validate direction - only accept 'asc' or 'desc', default to 'asc' + setSortDirection(directionParam === 'asc' || directionParam === 'desc' ? directionParam : 'asc'); + } + + // Initialize group from URL + const groupParam = urlParams.get('group'); + if (groupParam) { + setActiveGroup(groupParam); + } + + // Mark as initialized to enable watchers + isInitializedRef.current = true; + + // Update URL with current state if URL is empty or missing parameters + const currentUrl = new URL(window.location.href); + const hasPageParam = urlParams.has('page'); + const hasPerPageParam = urlParams.has('per_page'); + + if (!hasPageParam || !hasPerPageParam) { + // Build query params for current state + const params = collectParams(live.current.pagination.current_page || 1, true, urlParams); + + // Update URL without reloading + currentUrl.search = new URLSearchParams(params).toString(); + window.history.replaceState({}, '', currentUrl.toString()); + } + + const listener = () => fns.current.handleBulkActionCompleted(); + window.addEventListener('bulk-action-completed', listener); + fns.current.setupInfiniteScroll(); + + return () => { + window.removeEventListener('bulk-action-completed', listener); + if (observerRef.current) { + observerRef.current.disconnect(); + } + }; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + const displayedRecords = relationContext ? enhancedRecords : isInfiniteScrollActive ? allRecords : records; + + return ( +
+ {/* Table with integrated toolbar */} +
+ {/* Search, Filters, and Column Visibility (Fixed at top) */} +
+ {table && ( + 0} + selectedCount={selectedRecords.length} + showSort={isGridView} + sortColumn={sortColumn} + sortDirection={sortDirection} + groups={table.groups} + activeGroup={activeGroup} + visibleColumns={visibleColumns} + onUpdateVisibleColumns={setVisibleColumns} + onUpdateSearch={handleSearch} + onUpdateFilters={handleFilterChange} + onRemoveFilter={removeFilter} + onClearFilters={clearAllFilters} + onUpdateSort={handleSort} + onUpdateActiveGroup={handleGroupChange} + toolbarActions={(table.headerActions || []).map((action: any) => ( + + ))} + filtersSlot={(table.filters || []).map((filter: any) => ( +
+ {filter.formField ? ( + // Render custom form field if available + handleFilterUpdate(filter.name, value), + }} + /> + ) : ( + // Fallback to default filter component based on type + handleFilterUpdate(filter.name, value), + }} + /> + )} +
+ ))} + bulkActions={extractedBulkActions.map((action: any) => ( + + ))} + /> + )} +
+ + {/* Scrollable Records Area */} +
+ {!isGridView ? ( + // Render DataTable for table view + 0} + resourceSlug={resourceSlug} + columnExecutionRoute={relationContext?.columnExecutionRoute || table.columnExecutionRoute} + modelClass={table.model} + clearSelections={clearSelectionsKey} + fixedActions={table.fixedActions} + striped={table.striped} + infiniteScroll={isInfiniteScrollActive} + useAjax={useAjax} + reorderable={table.reorderable} + reorderableColumn={table.reorderableColumn} + reorderRoute={table.reorderRoute} + groups={table.groups} + activeGroup={activeGroup} + onSort={handleSort} + onUpdateSelectedRecords={handleUpdateSelectedRecords} + onActionComplete={handleActionComplete} + onReorder={handleReorder} + /> + ) : ( + // Render CardGrid for grid view + 0} + resourceSlug={resourceSlug} + modelClass={table.model} + clearSelections={clearSelectionsKey} + onUpdateSelectedRecords={handleUpdateSelectedRecords} + /> + )} + + {/* Infinite Scroll Loading Indicator & Observer (inside scrollable area) */} + {isInfiniteScrollActive && ( +
+ {isLoadingMore ? ( +
+
+
+ {trans('tables::tables.infinite_scroll.loading_more')} +
+
+ ) : pagination && pagination.current_page < pagination.last_page ? ( +
+
+ {trans('tables::tables.infinite_scroll.scroll_for_more')} +
+
+ ) : ( +
+ {trans('tables::tables.infinite_scroll.no_more_records')} +
+ )} +
+ )} +
+ {/* End Scrollable Records Area */} + + {/* Pagination (Fixed at bottom) */} + {!isInfiniteScrollActive && pagination && pagination.total > 0 && ( +
+
+ {/* Pagination Info (left side) */} +
+ {trans('tables::tables.pagination.showing')} {pagination.from} {trans('tables::tables.pagination.to')} {pagination.to}{' '} + {trans('tables::tables.pagination.of')} {pagination.total} +
+ + {/* Pagination Controls (centered) */} +
+ {/* Previous Button */} + + + {/* Page Numbers */} +
+ {getPageNumbers().map((page, index) => + page === '...' ? ( + + ... + + ) : ( + + ), + )} +
+ + {/* Next Button */} + +
+ + {/* Per Page Selector (right side) */} +
+ + +
+
+
+ )} +
+
+ ); +} diff --git a/resources/react/components/TableToolbar.tsx b/resources/react/components/TableToolbar.tsx new file mode 100644 index 0000000..8ababd9 --- /dev/null +++ b/resources/react/components/TableToolbar.tsx @@ -0,0 +1,467 @@ +import { Badge } from '@/components/ui/badge'; +import { Button } from '@/components/ui/button'; +import { + DropdownMenu, + DropdownMenuCheckboxItem, + DropdownMenuContent, + DropdownMenuLabel, + DropdownMenuSeparator, + DropdownMenuTrigger, +} from '@/components/ui/dropdown-menu'; +import { Input } from '@/components/ui/input'; +import { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover'; +import { cn } from '@/lib/utils'; +import { useLocalization } from '@laravilt/support/composables/useLocalization'; +import { ArrowDown, ArrowUp, ArrowUpDown, Check, Columns3, Eye, EyeOff, LayoutList, Search, SlidersHorizontal, X } from 'lucide-react'; +import { useState, type KeyboardEvent, type ReactNode } from 'react'; +import { useWatch } from '../composables/useWatch'; + +interface Column { + name: string; + label: string; + toggleable?: boolean; + [key: string]: any; +} + +interface Filter { + name: string; + label: string; + component: string; + [key: string]: any; +} + +interface FilterIndicator { + label: string; + removeField: string; +} + +interface GroupConfig { + column: string; + label: string; + collapsible: boolean; +} + +export interface TableToolbarProps { + searchable?: boolean; + searchPlaceholder?: string; + search?: string; + filters?: Filter[]; + activeFilters?: Record; + filterIndicators?: FilterIndicator[]; + columns?: Column[]; + visibleColumns?: string[]; + bulkActionsAvailable?: boolean; + selectedCount?: number; + showSort?: boolean; + sortColumn?: string | null; + sortDirection?: 'asc' | 'desc'; + groups?: GroupConfig[]; + activeGroup?: string | null; + onUpdateSearch?: (value: string) => void; + onUpdateFilters?: (filters: Record) => void; + onUpdateVisibleColumns?: (columns: string[]) => void; + onRemoveFilter?: (filterName: string) => void; + onClearFilters?: () => void; + onUpdateSort?: (column: string, direction: 'asc' | 'desc') => void; + onUpdateActiveGroup?: (group: string | null) => void; + /** Vue slot `bulk-actions` */ + bulkActions?: ReactNode; + /** Vue slot `filters` (renamed: `filters` is already the filter-definitions prop) */ + filtersSlot?: ReactNode; + /** Vue slot `toolbar-actions` */ + toolbarActions?: ReactNode; + /** Vue slot `active-filters` (renamed: `activeFilters` is already the active-filter-values prop) */ + activeFiltersSlot?: ReactNode; +} + +const EMPTY_FILTERS: Filter[] = []; +const EMPTY_ACTIVE_FILTERS: Record = {}; +const EMPTY_INDICATORS: FilterIndicator[] = []; +const EMPTY_COLUMNS: Column[] = []; +const EMPTY_VISIBLE: string[] = []; +const EMPTY_GROUPS: GroupConfig[] = []; + +export default function TableToolbar({ + searchable = true, + searchPlaceholder = 'Search...', + search = '', + filters = EMPTY_FILTERS, + activeFilters = EMPTY_ACTIVE_FILTERS, + columns = EMPTY_COLUMNS, + visibleColumns = EMPTY_VISIBLE, + bulkActionsAvailable = false, + selectedCount = 0, + showSort = false, + sortColumn = null, + sortDirection = 'asc', + groups = EMPTY_GROUPS, + activeGroup = null, + onUpdateSearch, + onUpdateVisibleColumns, + onRemoveFilter, + onClearFilters, + onUpdateSort, + onUpdateActiveGroup, + bulkActions, + filtersSlot, + toolbarActions, + activeFiltersSlot, +}: TableToolbarProps) { + const { trans } = useLocalization(); + + const [localSearch, setLocalSearch] = useState(search); + + // Update local search when prop changes (e.g., from clear button) + useWatch(search, (newValue) => { + setLocalSearch(newValue); + }); + + const handleSearchSubmit = () => { + onUpdateSearch?.(localSearch); + }; + + const toggleableColumns = columns.filter((col) => col.toggleable !== false); + + const activeFilterCount = Object.values(activeFilters).filter((value) => value !== null && value !== '' && value !== undefined).length; + + // Compute filter indicators from activeFilters instead of using the prop + const computedFilterIndicators: Array<{ label: string; removeField: string }> = []; + + Object.entries(activeFilters).forEach(([filterName, value]) => { + if (value === null || value === '' || value === undefined || value === false) { + return; + } + + // Find the filter definition + const filter = filters.find((f: any) => f.name === filterName); + if (!filter) return; + + // Get the indicator label from the filter + let label = `${filter.label || filterName}: ${value}`; + + // If filter has indicateUsing callback, use it + if (filter.indicateUsing) { + label = filter.indicateUsing; + } + + computedFilterIndicators.push({ + label, + removeField: filterName, + }); + }); + + const isColumnVisible = (columnName: string) => { + if (visibleColumns.length === 0) return true; + return visibleColumns.includes(columnName); + }; + + const toggleColumn = (columnName: string) => { + let newVisibleColumns: string[]; + + // If starting from "show all" state (empty array), initialize with all columns + if (visibleColumns.length === 0) { + // User is hiding a column, so start with all columns except this one + newVisibleColumns = columns.map((col) => col.name).filter((name) => name !== columnName); + } else { + // Toggle column in existing array + newVisibleColumns = isColumnVisible(columnName) + ? visibleColumns.filter((name) => name !== columnName) + : [...visibleColumns, columnName]; + } + + onUpdateVisibleColumns?.(newVisibleColumns); + }; + + const clearSearch = () => { + onUpdateSearch?.(''); + }; + + const clearFilters = () => { + onClearFilters?.(); + }; + + const removeFilter = (filterName: string) => { + onRemoveFilter?.(filterName); + }; + + const hasActiveFilters = activeFilterCount > 0; + const hasActiveSearch = search.length > 0; + const hasComputedFilterIndicators = computedFilterIndicators.length > 0; + + // Sorting functionality for grid view + const sortableColumns = columns.filter((col) => col.sortable); + + const currentSortLabel = (() => { + if (!sortColumn) return trans('tables::tables.toolbar.sort_by') + '...'; + const column = sortableColumns.find((col) => col.name === sortColumn); + return column ? column.label : trans('tables::tables.toolbar.sort_by') + '...'; + })(); + + const SortIcon = !sortColumn ? ArrowUpDown : sortDirection === 'asc' ? ArrowUp : ArrowDown; + + const handleSortChange = (columnName: string) => { + let direction: 'asc' | 'desc' = 'asc'; + + if (sortColumn === columnName) { + // Toggle direction if same column + direction = sortDirection === 'asc' ? 'desc' : 'asc'; + } + + onUpdateSort?.(columnName, direction); + }; + + // Grouping functionality + const hasGroups = groups && groups.length > 0; + + const activeGroupLabel = (() => { + if (!activeGroup) return trans('tables::tables.toolbar.group_by') || 'Group by'; + const group = groups?.find((g) => g.column === activeGroup); + return group ? group.label : trans('tables::tables.toolbar.group_by') || 'Group by'; + })(); + + const handleGroupChange = (groupColumn: string | null) => { + onUpdateActiveGroup?.(groupColumn); + }; + + const DirectionIcon = sortDirection === 'asc' ? ArrowUp : ArrowDown; + + return ( +
+ {/* Bulk Actions Bar (when items are selected) */} + {bulkActionsAvailable && selectedCount > 0 && ( +
+ + {selectedCount} {trans('tables::tables.bulk.selected').replace(':count ', '')} + +
{bulkActions}
+
+ )} + + {/* Top Row: Search, Filters, Column Toggle */} +
+ {/* Search */} + {searchable && ( +
+ + setLocalSearch(event.target.value)} + type="search" + placeholder={searchPlaceholder || trans('tables::tables.search.placeholder')} + className="ps-9 pe-9" + onKeyUp={(event: KeyboardEvent) => { + if (event.key === 'Enter') handleSearchSubmit(); + }} + /> + {hasActiveSearch && ( + + )} +
+ )} + +
+ {/* Sort Button (for grid view) */} + {showSort && sortableColumns.length > 0 && ( + + + + + +
+

{trans('tables::tables.toolbar.sort_by')}

+
+ {sortableColumns.map((column) => ( + + ))} +
+
+
+
+ )} + + {/* Filters Button */} + {filters.length > 0 && ( + + + + + +
+
+

{trans('tables::tables.toolbar.filters')}

+ {hasActiveFilters && ( + + )} +
+
{filtersSlot}
+
+
+
+ )} + + {/* Group By Selector */} + {hasGroups && ( + + + + + +
+

{trans('tables::tables.toolbar.group_by') || 'Group by'}

+
+ {/* No Grouping Option */} + + {/* Group Options */} + {groups.map((group) => ( + + ))} +
+
+
+
+ )} + + {/* Column Toggle */} + {toggleableColumns.length > 0 && ( + + + + + + {trans('tables::tables.toolbar.toggle_columns')} + + {toggleableColumns.map((column) => { + const VisibilityIcon = isColumnVisible(column.name) ? Eye : EyeOff; + + return ( + { + event.preventDefault(); + toggleColumn(column.name); + }} + className="gap-2" + > + + {column.label} + + ); + })} + + + )} + + {/* Toolbar Actions Slot */} + {toolbarActions} +
+
+ + {/* Active Filters Display */} + {(hasActiveFilters || hasActiveSearch || hasComputedFilterIndicators) && ( +
+ {trans('tables::tables.toolbar.active_filters')}: + + {hasActiveSearch && ( + + {trans('tables::tables.toolbar.search')}: "{search}" + + + )} + + {/* Computed filter indicators with individual removal */} + {computedFilterIndicators.map((indicator, index) => ( + + {indicator.label} + + + ))} + + {activeFiltersSlot} + + {(hasActiveFilters || hasActiveSearch || hasComputedFilterIndicators) && ( + + )} +
+ )} +
+ ); +} diff --git a/resources/react/components/columns/ColorColumn.tsx b/resources/react/components/columns/ColorColumn.tsx new file mode 100644 index 0000000..1cc4f6f --- /dev/null +++ b/resources/react/components/columns/ColorColumn.tsx @@ -0,0 +1,127 @@ +import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@/components/ui/tooltip'; +import { cn } from '@/lib/utils'; +import { useNotification } from '@laravilt/notifications/composables/useNotification'; + +export interface ColorColumnProps { + value: any; + copyable?: boolean; + copyMessage?: string | null; + copyMessageDuration?: number | null; + wrap?: boolean; + description?: string | null; + descriptionPosition?: 'above' | 'below'; + maxVisible?: number; +} + +export default function ColorColumn({ + value, + copyable = false, + copyMessage = null, + copyMessageDuration = null, + description = null, + descriptionPosition = 'below', + maxVisible = 4, +}: ColorColumnProps) { + const { notify } = useNotification(); + + const colors: any[] = !value ? [] : Array.isArray(value) ? value : [value]; + const visibleColors = colors.slice(0, maxVisible); + const hiddenColors = colors.slice(maxVisible); + const hasMoreColors = colors.length > maxVisible; + + const handleCopy = (color: string) => { + if (copyable && color) { + navigator.clipboard.writeText(color); + notify(copyMessage || 'Copied!', `Color ${color} copied to clipboard`, 'success', { + duration: copyMessageDuration || 1500, + }); + } + }; + + return ( +
+ {/* Description above */} + {description && descriptionPosition === 'above' && ( +
{description}
+ )} + + {colors.length > 1 ? ( + // Main content - stacked circles style for multiple colors +
+
+ {visibleColors.map((color: any, index: number) => ( +
+ + + + )} +
+
+ ) : colors.length === 1 ? ( + // Single color - simple square style +
+
+ ) : null} + + {/* Description below */} + {description && descriptionPosition === 'below' && ( +
{description}
+ )} +
+ ); +} diff --git a/resources/react/components/columns/IconColumn.tsx b/resources/react/components/columns/IconColumn.tsx new file mode 100644 index 0000000..8dc22ee --- /dev/null +++ b/resources/react/components/columns/IconColumn.tsx @@ -0,0 +1,52 @@ +import { cn } from '@/lib/utils'; +import { resolveColumnIcon } from '../../lib/icons'; + +export interface IconColumnProps { + value: any; + boolean?: boolean; + wrap?: boolean; + icon?: string | null; + color?: string | null; + size?: string | null; +} + +// Map color to Tailwind classes +const colorMap: Record = { + primary: 'text-primary', + success: 'text-green-500', + danger: 'text-destructive', + warning: 'text-yellow-500', + info: 'text-blue-500', + gray: 'text-muted-foreground', + secondary: 'text-muted-foreground', +}; + +// Map size to icon classes +const sizeMap: Record = { + xs: 'h-3 w-3', + sm: 'h-4 w-4', + md: 'h-5 w-5', + lg: 'h-6 w-6', + xl: 'h-8 w-8', + '2xl': 'h-10 w-10', + 'extra-small': 'h-3 w-3', + small: 'h-4 w-4', + medium: 'h-5 w-5', + large: 'h-6 w-6', + 'extra-large': 'h-8 w-8', + 'two-extra-large': 'h-10 w-10', +}; + +export default function IconColumn({ value, wrap = false, icon = null, color = null, size = null }: IconColumnProps) { + // Use evaluated icon from backend, or fallback to value (column data) + const LucideIconComponent = resolveColumnIcon(icon || value); + + const colorClass = !color ? 'text-muted-foreground' : colorMap[color] || 'text-muted-foreground'; + const sizeClass = sizeMap[size || 'large'] || 'h-6 w-6'; + + return ( +
+ {LucideIconComponent && } +
+ ); +} diff --git a/resources/react/components/columns/ImageColumn.tsx b/resources/react/components/columns/ImageColumn.tsx new file mode 100644 index 0000000..9b7ff1d --- /dev/null +++ b/resources/react/components/columns/ImageColumn.tsx @@ -0,0 +1,211 @@ +import { cn } from '@/lib/utils'; +import type { CSSProperties, SyntheticEvent } from 'react'; + +export interface ImageColumnProps { + value: any; + imageWidth?: string | number | null; + imageHeight?: string | number | null; + square?: boolean; + circular?: boolean; + stacked?: boolean; + ring?: number; + overlap?: number; + limit?: number | null; + limitedRemainingText?: boolean; + limitedRemainingTextSize?: string; + wrap?: boolean; + disk?: string | null; + visibility?: string | null; + defaultImageUrl?: string | null; + checkFileExistence?: boolean; + extraImgAttributes?: Record; + description?: string | null; + descriptionPosition?: 'above' | 'below'; +} + +const EMPTY_ATTRIBUTES: Record = {}; + +const ringMap: Record = { + 0: 'ring-0', + 1: 'ring-1', + 2: 'ring-2', + 3: 'ring', + 4: 'ring-4', + 5: 'ring-[5px]', + 6: 'ring-[6px]', + 7: 'ring-[7px]', + 8: 'ring-8', +}; + +// Negative margin for overlap +const overlapMap: Record = { + 0: '', + 1: '-ml-1', + 2: '-ml-2', + 3: '-ml-3', + 4: '-ml-4', + 5: '-ml-5', + 6: '-ml-6', + 7: '-ml-7', + 8: '-ml-8', +}; + +const remainingSizeMap: Record = { + xs: 'text-xs', + sm: 'text-sm', + md: 'text-base', + lg: 'text-lg', + xl: 'text-xl', +}; + +/** + * Split `v-bind="extraImgAttributes"` into DOM props, merging `class`/`style` like Vue does. + */ +function splitExtraAttributes(extra: Record): { rest: Record; className?: string; style?: CSSProperties } { + const { class: extraClass, style: extraStyle, ...rest } = extra || {}; + + return { + rest, + className: typeof extraClass === 'string' ? extraClass : undefined, + style: extraStyle && typeof extraStyle === 'object' ? (extraStyle as CSSProperties) : undefined, + }; +} + +export default function ImageColumn({ + value, + imageWidth = null, + imageHeight = null, + square = false, + circular = false, + stacked = false, + ring = 3, + overlap = 4, + limit = null, + limitedRemainingText = false, + limitedRemainingTextSize = 'sm', + wrap = false, + disk = null, + visibility = null, + defaultImageUrl = null, + extraImgAttributes = EMPTY_ATTRIBUTES, + description = null, + descriptionPosition = 'below', +}: ImageColumnProps) { + const images: any[] = !value + ? // Show default image if no value but defaultImageUrl is set + defaultImageUrl + ? [defaultImageUrl] + : [] + : Array.isArray(value) + ? value + : [value]; + + // Track if we're showing the default image (to prevent error handler loop) + const isDefaultImage = (image: string) => image === defaultImageUrl; + + const displayImages = !limit ? images : images.slice(0, limit); + + const remainingCount = !limit || images.length <= limit ? 0 : images.length - limit; + + // Default size for table images (36x36 - compact but visible) + const defaultSize = '36px'; + const sizeStyle: CSSProperties = { + width: imageWidth ? (typeof imageWidth === 'number' ? `${imageWidth}px` : imageWidth) : defaultSize, + height: imageHeight ? (typeof imageHeight === 'number' ? `${imageHeight}px` : imageHeight) : defaultSize, + }; + + const shapeClass = circular ? 'rounded-full' : square ? 'aspect-square' : 'rounded-md'; + const ringClass = ringMap[ring] || 'ring'; + const overlapClass = overlapMap[overlap] || '-ml-4'; + const remainingSizeClass = remainingSizeMap[limitedRemainingTextSize] || 'text-sm'; + + const getImageUrl = (image: string): string => { + // If it's already an absolute URL, return it + if (image.startsWith('http://') || image.startsWith('https://') || image.startsWith('data:')) { + return image; + } + + // Handle disk and visibility for Laravel storage + // If visibility is 'public' or disk is 'public', use /storage/ path + // Otherwise, this should be a temporary URL generated by the backend + if (visibility === 'public' || disk === 'public') { + return `/storage/${image}`; + } + + // For non-public storage, assume the backend will provide temporary URLs + // If it's a relative path, prepend /storage/ as default + if (!image.startsWith('/')) { + return `/storage/${image}`; + } + + return image; + }; + + const handleImageError = (event: SyntheticEvent, image: string) => { + const imgElement = event.currentTarget; + // Only set default image if this isn't already the default + if (defaultImageUrl && !isDefaultImage(image)) { + imgElement.src = defaultImageUrl; + } + }; + + const extra = splitExtraAttributes(extraImgAttributes); + + return ( +
+ {/* Description above */} + {description && descriptionPosition === 'above' && ( +
{description}
+ )} + + {/* Main content */} +
+ {stacked ? ( + // Stacked images +
+ {displayImages.map((image: any, index: number) => ( +
0 && overlapClass)}> + {`Image handleImageError(event, image)} + /> +
+ ))} + + {limitedRemainingText && remainingCount > 0 && ( + +{remainingCount} + )} +
+ ) : ( + // Regular images + <> + {displayImages.map((image: any, index: number) => ( + {`Image handleImageError(event, image)} + /> + ))} + + {limitedRemainingText && remainingCount > 0 && ( + +{remainingCount} + )} + + )} +
+ + {/* Description below */} + {description && descriptionPosition === 'below' && ( +
{description}
+ )} +
+ ); +} diff --git a/resources/react/components/columns/TextColumn.tsx b/resources/react/components/columns/TextColumn.tsx new file mode 100644 index 0000000..ec3f17e --- /dev/null +++ b/resources/react/components/columns/TextColumn.tsx @@ -0,0 +1,310 @@ +import { Badge } from '@/components/ui/badge'; +import { Button } from '@/components/ui/button'; +import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@/components/ui/tooltip'; +import { cn } from '@/lib/utils'; +import { useNotification } from '@laravilt/notifications/composables/useNotification'; +import { Copy } from 'lucide-react'; +import type { MouseEvent } from 'react'; +import { toDisplayString } from '../../lib/display'; +import { resolveColumnIcon } from '../../lib/icons'; + +export interface TextColumnProps { + value: any; + limit?: number; + wrap?: boolean; + copyable?: string | null; + badge?: boolean; + dateTimeFormat?: string | null; + dateFormat?: string | null; + icon?: string | null; + weight?: string | null; + moneyFormat?: { currency: string; divideBy: number } | null; + color?: string | null; + description?: string | null; + descriptionPosition?: 'above' | 'below'; + html?: boolean; + placeholder?: string | null; + // New FilamentPHP v4 compatible props + alignment?: 'start' | 'center' | 'end' | 'justify'; + tooltip?: string | null; + url?: string | null; + openUrlInNewTab?: boolean; + prefix?: string | null; + suffix?: string | null; + grow?: boolean; + size?: 'xs' | 'sm' | 'base' | 'lg' | 'xl' | null; +} + +// Map color to badge variant +const badgeColorMap: Record = { + primary: 'primary', + success: 'success', + danger: 'danger', + warning: 'warning', + info: 'info', + gray: 'gray', + secondary: 'secondary', + // Legacy mappings + destructive: 'danger', + default: 'primary', +}; + +const weightClasses: Record = { + thin: 'font-thin', + extralight: 'font-extralight', + light: 'font-light', + normal: 'font-normal', + medium: 'font-medium', + semibold: 'font-semibold', + bold: 'font-bold', + extrabold: 'font-extrabold', + black: 'font-black', +}; + +const alignmentClasses: Record = { + start: 'text-start', + center: 'text-center', + end: 'text-end', + justify: 'text-justify', +}; + +const sizeClasses: Record = { + xs: 'text-xs', + sm: 'text-sm', + base: 'text-base', + lg: 'text-lg', + xl: 'text-xl', +}; + +export default function TextColumn({ + value, + limit, + wrap = false, + copyable = null, + badge = false, + dateTimeFormat = null, + dateFormat = null, + icon = null, + weight = null, + moneyFormat = null, + color = null, + description = null, + descriptionPosition = 'below', + html = false, + placeholder = null, + alignment = 'start', + tooltip = null, + url = null, + openUrlInNewTab = false, + prefix = null, + suffix = null, + grow = false, + size = null, +}: TextColumnProps) { + const { notify } = useNotification(); + + // Check if value is an array (for badge rendering of many-to-many relationships) + const isArray = Array.isArray(value); + + // Check if value is empty (null, undefined, empty string, or empty array) + const isEmpty = value === null || value === undefined || value === '' || (Array.isArray(value) && value.length === 0); + + // Check if value is an object or array (for JSON formatting) + const isObjectOrArray = typeof value === 'object' && value !== null; + + const badgeVariant = !color ? 'secondary' : badgeColorMap[color] || 'secondary'; + + const formattedValue = ((): string => { + if (value === null || value === undefined || value === '') { + return ''; + } + + // If it's an array for badges, don't format it here - we'll render badges individually + if (isArray && badge) { + return ''; + } + + // If it's an object or array (not for badges), format as JSON + if (isObjectOrArray && !badge) { + try { + return JSON.stringify(value, null, 2); + } catch { + return String(value); + } + } + + let result = String(value); + + // Format as date/datetime + if (dateTimeFormat) { + try { + const date = new Date(value); + // Check if date is valid + if (!isNaN(date.getTime())) { + result = date.toLocaleString('en-US', { + year: 'numeric', + month: '2-digit', + day: '2-digit', + hour: '2-digit', + minute: '2-digit', + second: '2-digit', + }); + } + } catch { + result = String(value); + } + } else if (dateFormat) { + try { + const date = new Date(value); + // Check if date is valid + if (!isNaN(date.getTime())) { + result = date.toLocaleDateString('en-US', { + year: 'numeric', + month: '2-digit', + day: '2-digit', + }); + } + } catch { + result = String(value); + } + } + + // Format as money + if (moneyFormat) { + const numValue = Number(value) / moneyFormat.divideBy; + result = new Intl.NumberFormat('en-US', { + style: 'currency', + currency: moneyFormat.currency, + }).format(numValue); + } + + // Apply character limit (not for HTML or JSON) + if (limit && result.length > limit && !html && !isObjectOrArray) { + result = result.substring(0, limit) + '...'; + } + + return result; + })(); + + const LucideIconComponent = icon ? resolveColumnIcon(icon) : null; + + const handleCopy = () => { + if (copyable && formattedValue) { + navigator.clipboard.writeText(formattedValue); + notify(copyable, 'Copied to clipboard', 'success', { + duration: 2000, + }); + } + }; + + const weightClass = (weight && weightClasses[weight]) || ''; + const alignmentClass = alignmentClasses[alignment] || 'text-start'; + const sizeClass = (size && sizeClasses[size]) || ''; + + const containerClass = ['flex flex-col gap-1 max-w-full overflow-hidden', grow ? 'flex-1' : '', alignmentClass] + .filter(Boolean) + .join(' '); + + // Combine prefix and suffix with value + const displayValue = ((): string => { + const current = formattedValue; + if (!current) return current; + + let result = current; + if (prefix) result = prefix + result; + if (suffix) result = result + suffix; + return result; + })(); + + const textClass = cn(weightClass, sizeClass, wrap ? 'whitespace-normal break-words' : limit ? 'truncate' : 'break-words'); + + // Vue renders `` + const Tag = (url ? 'a' : 'div') as 'a'; + + const content = ( + + {/* Icon outside badge when not using badge */} + {LucideIconComponent && !badge && } + + {isEmpty && placeholder ? ( + // Show placeholder when empty + {placeholder} + ) : badge && isArray && !isEmpty ? ( + // Multiple badges for array values (many-to-many relationships) +
+ {(value as any[]).map((item: any, index: number) => ( + + {LucideIconComponent && } + {toDisplayString(item)} + + ))} +
+ ) : badge && !isEmpty ? ( + // Single badge + + {LucideIconComponent && } + {displayValue} + + ) : html ? ( + // HTML content +
+ ) : isObjectOrArray && !badge ? ( + // JSON/Object/Array formatting +
+                    {displayValue}
+                
+ ) : ( + // Regular text + {displayValue} + )} + + {copyable && ( + + )} + + ); + + return ( +
+ {/* Description above */} + {description && descriptionPosition === 'above' && ( +
{description}
+ )} + + {/* Wrap with tooltip if provided */} + {tooltip ? ( + + + {content} + +

{tooltip}

+
+
+
+ ) : ( + content + )} + + {/* Description below */} + {description && descriptionPosition === 'below' && ( +
{description}
+ )} +
+ ); +} diff --git a/resources/react/components/columns/ToggleColumn.tsx b/resources/react/components/columns/ToggleColumn.tsx new file mode 100644 index 0000000..84a76b2 --- /dev/null +++ b/resources/react/components/columns/ToggleColumn.tsx @@ -0,0 +1,129 @@ +import { Switch } from '@/components/ui/switch'; +import { cn } from '@/lib/utils'; +import { router } from '@inertiajs/react'; +import { useNotification } from '@laravilt/notifications/composables/useNotification'; +import { useLocalization } from '@laravilt/support/composables/useLocalization'; +import { useEffect, useState } from 'react'; +import { useStateRef } from '../../composables/useStateRef'; + +export interface ToggleColumnProps { + value: any; + name: string; + recordId: number | string; + resourceSlug?: string; + columnExecutionRoute?: string; + editable?: boolean; + disabled?: boolean; + description?: string | null; + descriptionPosition?: 'above' | 'below'; + // Text labels for i18n support + successNotificationTitle?: string; + successNotificationMessage?: string; + errorNotificationTitle?: string; + errorNotificationMessage?: string; +} + +export default function ToggleColumn({ + value, + name, + recordId, + columnExecutionRoute, + editable = true, + disabled = false, + description = null, + descriptionPosition = 'below', + successNotificationTitle = 'Updated', + successNotificationMessage = 'Value updated successfully', + errorNotificationTitle = 'Error', + errorNotificationMessage = 'Failed to update value', +}: ToggleColumnProps) { + const { trans } = useLocalization(); + const { notify } = useNotification(); + + // Compute the execution URL - replace __ID__ placeholder with actual record ID + const executionUrl = columnExecutionRoute ? columnExecutionRoute.replace('__ID__', String(recordId)) : null; + + // Translated labels - use tables::tables namespace + const translatedSuccessTitle = + successNotificationTitle !== 'Updated' ? successNotificationTitle : trans('tables::tables.toggle_column.success_notification_title'); + const translatedSuccessMessage = + successNotificationMessage !== 'Value updated successfully' + ? successNotificationMessage + : trans('tables::tables.toggle_column.success_notification_message'); + const translatedErrorTitle = + errorNotificationTitle !== 'Error' ? errorNotificationTitle : trans('tables::tables.toggle_column.error_notification_title'); + const translatedErrorMessage = + errorNotificationMessage !== 'Failed to update value' + ? errorNotificationMessage + : trans('tables::tables.toggle_column.error_notification_message'); + + // Use the same boolean conversion as the Edit page - simple Boolean() cast + const [localValue, setLocalValue] = useState(() => Boolean(value)); + const [isUpdating, setIsUpdating, isUpdatingRef] = useStateRef(false); + + // Watch for prop changes to update local value (but not during updates to avoid conflicts) + useEffect(() => { + if (!isUpdatingRef.current) { + setLocalValue(Boolean(value)); + } + }, [value, isUpdatingRef]); + + const setChecked = (newValue: boolean) => { + if (disabled || !editable || isUpdatingRef.current || !executionUrl) return; + + setIsUpdating(true); + + // Send update to backend (convert to 1/0 for database) + router.patch( + executionUrl, + { + column: name, + value: newValue ? 1 : 0, + }, + { + preserveScroll: true, + preserveState: true, + only: ['records'], + onSuccess: () => { + setLocalValue(newValue); + setIsUpdating(false); + notify(translatedSuccessTitle, translatedSuccessMessage, 'success', { + duration: 2000, + }); + }, + onError: (errors: Record) => { + setIsUpdating(false); + + const errorMessage = errors[name] || translatedErrorMessage; + notify(translatedErrorTitle, errorMessage, 'error', { + duration: 3000, + }); + }, + }, + ); + }; + + return ( +
+ {/* Description above */} + {description && descriptionPosition === 'above' && ( +
{description}
+ )} + + {/* Main content */} +
+ setChecked(checked)} + /> +
+ + {/* Description below */} + {description && descriptionPosition === 'below' && ( +
{description}
+ )} +
+ ); +} diff --git a/resources/react/components/filters/TextFilter.tsx b/resources/react/components/filters/TextFilter.tsx new file mode 100644 index 0000000..17c6ff1 --- /dev/null +++ b/resources/react/components/filters/TextFilter.tsx @@ -0,0 +1,52 @@ +import { Input } from '@/components/ui/input'; +import { Label } from '@/components/ui/label'; +import { useState, type KeyboardEvent } from 'react'; +import { useWatch } from '../../composables/useWatch'; + +export interface TextFilterProps { + name: string; + label: string; + modelValue?: string | null; + placeholder?: string; + type?: 'text' | 'email' | 'url' | 'number'; + onUpdateModelValue?: (value: string | null) => void; +} + +export default function TextFilter({ + name, + label, + modelValue = null, + placeholder = 'Enter text...', + type = 'text', + onUpdateModelValue, +}: TextFilterProps) { + const [localValue, setLocalValue] = useState(modelValue || ''); + + useWatch(modelValue, (newValue) => { + setLocalValue(newValue || ''); + }); + + const handleInput = () => { + const value = localValue.trim(); + onUpdateModelValue?.(value || null); + }; + + return ( +
+ + setLocalValue(event.target.value)} + onBlur={handleInput} + onKeyUp={(event: KeyboardEvent) => { + if (event.key === 'Enter') handleInput(); + }} + /> +
+ ); +} diff --git a/resources/react/components/filters/ToggleFilter.tsx b/resources/react/components/filters/ToggleFilter.tsx new file mode 100644 index 0000000..17a34bd --- /dev/null +++ b/resources/react/components/filters/ToggleFilter.tsx @@ -0,0 +1,26 @@ +import { Label } from '@/components/ui/label'; +import { Switch } from '@/components/ui/switch'; + +export interface ToggleFilterProps { + name: string; + label: string; + modelValue?: boolean | null; + description?: string; + onUpdateModelValue?: (value: boolean | null) => void; +} + +export default function ToggleFilter({ name, label, modelValue = null, description, onUpdateModelValue }: ToggleFilterProps) { + const checked = modelValue === true; + + return ( +
+
+ + {description &&

{description}

} +
+ onUpdateModelValue?.(value)} /> +
+ ); +} diff --git a/resources/react/components/grid-columns/ColorGridColumn.tsx b/resources/react/components/grid-columns/ColorGridColumn.tsx new file mode 100644 index 0000000..d03420d --- /dev/null +++ b/resources/react/components/grid-columns/ColorGridColumn.tsx @@ -0,0 +1,68 @@ +import { cn } from '@/lib/utils'; +import { useNotification } from '@laravilt/notifications/composables/useNotification'; + +export interface ColorGridColumnProps { + value: any; + copyable?: boolean; + copyMessage?: string | null; + copyMessageDuration?: number | null; + wrap?: boolean; + description?: string | null; + descriptionPosition?: 'above' | 'below'; +} + +export default function ColorGridColumn({ + value, + copyable = false, + copyMessage = null, + copyMessageDuration = null, + wrap = false, + description = null, + descriptionPosition = 'below', +}: ColorGridColumnProps) { + const { notify } = useNotification(); + + const colors: any[] = !value ? [] : Array.isArray(value) ? value : [value]; + + const handleCopy = (color: string) => { + if (copyable && color) { + navigator.clipboard.writeText(color); + notify(copyMessage || 'Copied!', `Color ${color} copied to clipboard`, 'success', { + duration: copyMessageDuration || 1500, + }); + } + }; + + return ( +
+ {/* Description above */} + {description && descriptionPosition === 'above' && ( +
{description}
+ )} + + {/* Main content */} +
+ {colors.map((color: any, index: number) => ( +
+ + {/* Description below */} + {description && descriptionPosition === 'below' && ( +
{description}
+ )} +
+ ); +} diff --git a/resources/react/components/grid-columns/IconGridColumn.tsx b/resources/react/components/grid-columns/IconGridColumn.tsx new file mode 100644 index 0000000..bd9bc47 --- /dev/null +++ b/resources/react/components/grid-columns/IconGridColumn.tsx @@ -0,0 +1,75 @@ +import { cn } from '@/lib/utils'; +import { resolveColumnIcon } from '../../lib/icons'; + +export interface IconGridColumnProps { + value: any; + boolean?: boolean; + wrap?: boolean; + icon?: string | null; + color?: string | null; + size?: string | null; + description?: string | null; + descriptionPosition?: 'above' | 'below'; +} + +// Map color to Tailwind classes +const colorMap: Record = { + primary: 'text-primary', + success: 'text-green-500', + danger: 'text-destructive', + warning: 'text-yellow-500', + info: 'text-blue-500', + gray: 'text-muted-foreground', + secondary: 'text-muted-foreground', +}; + +// Map size to icon classes +const sizeMap: Record = { + xs: 'h-3 w-3', + sm: 'h-4 w-4', + md: 'h-5 w-5', + lg: 'h-6 w-6', + xl: 'h-8 w-8', + '2xl': 'h-10 w-10', + 'extra-small': 'h-3 w-3', + small: 'h-4 w-4', + medium: 'h-5 w-5', + large: 'h-6 w-6', + 'extra-large': 'h-8 w-8', + 'two-extra-large': 'h-10 w-10', +}; + +export default function IconGridColumn({ + value, + wrap = false, + icon = null, + color = null, + size = null, + description = null, + descriptionPosition = 'below', +}: IconGridColumnProps) { + // Use evaluated icon from backend, or fallback to value (column data) + const LucideIconComponent = resolveColumnIcon(icon || value); + + const colorClass = !color ? 'text-muted-foreground' : colorMap[color] || 'text-muted-foreground'; + const sizeClass = sizeMap[size || 'large'] || 'h-6 w-6'; + + return ( +
+ {/* Description above */} + {description && descriptionPosition === 'above' && ( +
{description}
+ )} + + {/* Main content */} +
+ {LucideIconComponent && } +
+ + {/* Description below */} + {description && descriptionPosition === 'below' && ( +
{description}
+ )} +
+ ); +} diff --git a/resources/react/components/grid-columns/ImageGridColumn.tsx b/resources/react/components/grid-columns/ImageGridColumn.tsx new file mode 100644 index 0000000..5a91166 --- /dev/null +++ b/resources/react/components/grid-columns/ImageGridColumn.tsx @@ -0,0 +1,202 @@ +import { cn } from '@/lib/utils'; +import type { CSSProperties, SyntheticEvent } from 'react'; + +export interface ImageGridColumnProps { + value: any; + imageWidth?: string | number | null; + imageHeight?: string | number | null; + square?: boolean; + circular?: boolean; + stacked?: boolean; + ring?: number; + overlap?: number; + limit?: number | null; + limitedRemainingText?: boolean; + limitedRemainingTextSize?: string; + wrap?: boolean; + disk?: string | null; + visibility?: string | null; + defaultImageUrl?: string | null; + checkFileExistence?: boolean; + extraImgAttributes?: Record; + description?: string | null; + descriptionPosition?: 'above' | 'below'; +} + +const EMPTY_ATTRIBUTES: Record = {}; + +const ringMap: Record = { + 0: 'ring-0', + 1: 'ring-1', + 2: 'ring-2', + 3: 'ring', + 4: 'ring-4', + 5: 'ring-[5px]', + 6: 'ring-[6px]', + 7: 'ring-[7px]', + 8: 'ring-8', +}; + +// Negative margin for overlap +const overlapMap: Record = { + 0: '', + 1: '-ml-1', + 2: '-ml-2', + 3: '-ml-3', + 4: '-ml-4', + 5: '-ml-5', + 6: '-ml-6', + 7: '-ml-7', + 8: '-ml-8', +}; + +const remainingSizeMap: Record = { + xs: 'text-xs', + sm: 'text-sm', + md: 'text-base', + lg: 'text-lg', + xl: 'text-xl', +}; + +/** + * Split `v-bind="extraImgAttributes"` into DOM props, merging `class`/`style` like Vue does. + */ +function splitExtraAttributes(extra: Record): { rest: Record; className?: string; style?: CSSProperties } { + const { class: extraClass, style: extraStyle, ...rest } = extra || {}; + + return { + rest, + className: typeof extraClass === 'string' ? extraClass : undefined, + style: extraStyle && typeof extraStyle === 'object' ? (extraStyle as CSSProperties) : undefined, + }; +} + +export default function ImageGridColumn({ + value, + imageWidth = null, + imageHeight = null, + square = false, + circular = false, + stacked = false, + ring = 3, + overlap = 4, + limit = null, + limitedRemainingText = false, + limitedRemainingTextSize = 'sm', + wrap = false, + disk = null, + visibility = null, + defaultImageUrl = null, + extraImgAttributes = EMPTY_ATTRIBUTES, + description = null, + descriptionPosition = 'below', +}: ImageGridColumnProps) { + const images: any[] = !value ? [] : Array.isArray(value) ? value : [value]; + + const displayImages = !limit ? images : images.slice(0, limit); + + const remainingCount = !limit || images.length <= limit ? 0 : images.length - limit; + + const sizeStyle: CSSProperties = {}; + + if (imageWidth) { + sizeStyle.width = typeof imageWidth === 'number' ? `${imageWidth}px` : imageWidth; + } + + if (imageHeight) { + sizeStyle.height = typeof imageHeight === 'number' ? `${imageHeight}px` : imageHeight; + } + + const shapeClass = circular ? 'rounded-full' : square ? 'aspect-square' : 'rounded-md'; + const ringClass = ringMap[ring] || 'ring'; + const overlapClass = overlapMap[overlap] || '-ml-4'; + const remainingSizeClass = remainingSizeMap[limitedRemainingTextSize] || 'text-sm'; + + const getImageUrl = (image: string): string => { + // If it's already an absolute URL, return it + if (image.startsWith('http://') || image.startsWith('https://') || image.startsWith('data:')) { + return image; + } + + // Handle disk and visibility for Laravel storage + // If visibility is 'public' or disk is 'public', use /storage/ path + // Otherwise, this should be a temporary URL generated by the backend + if (visibility === 'public' || disk === 'public') { + return `/storage/${image}`; + } + + // For non-public storage, assume the backend will provide temporary URLs + // If it's a relative path, prepend /storage/ as default + if (!image.startsWith('/')) { + return `/storage/${image}`; + } + + return image; + }; + + const handleImageError = (event: SyntheticEvent) => { + if (defaultImageUrl) { + event.currentTarget.src = defaultImageUrl; + } + }; + + const extra = splitExtraAttributes(extraImgAttributes); + + return ( +
+ {/* Description above */} + {description && descriptionPosition === 'above' && ( +
{description}
+ )} + + {/* Main content */} +
+ {stacked ? ( + // Stacked images +
+ {displayImages.map((image: any, index: number) => ( +
0 && overlapClass)}> + {`Image +
+ ))} + + {limitedRemainingText && remainingCount > 0 && ( + +{remainingCount} + )} +
+ ) : ( + // Regular images + <> + {displayImages.map((image: any, index: number) => ( + {`Image + ))} + + {limitedRemainingText && remainingCount > 0 && ( + +{remainingCount} + )} + + )} +
+ + {/* Description below */} + {description && descriptionPosition === 'below' && ( +
{description}
+ )} +
+ ); +} diff --git a/resources/react/components/grid-columns/TextGridColumn.tsx b/resources/react/components/grid-columns/TextGridColumn.tsx new file mode 100644 index 0000000..605bfeb --- /dev/null +++ b/resources/react/components/grid-columns/TextGridColumn.tsx @@ -0,0 +1,186 @@ +import { Badge } from '@/components/ui/badge'; +import { Button } from '@/components/ui/button'; +import { cn } from '@/lib/utils'; +import { useNotification } from '@laravilt/notifications/composables/useNotification'; +import { Copy } from 'lucide-react'; +import { toDisplayString } from '../../lib/display'; +import { resolveColumnIcon } from '../../lib/icons'; + +export interface TextGridColumnProps { + value: any; + limit?: number; + wrap?: boolean; + copyable?: string | null; + badge?: boolean; + dateTimeFormat?: string | null; + dateFormat?: string | null; + icon?: string | null; + weight?: string | null; + moneyFormat?: { currency: string; divideBy: number } | null; + color?: string | null; + description?: string | null; + descriptionPosition?: 'above' | 'below'; +} + +// Map color to badge variant +const badgeColorMap: Record = { + primary: 'default', + success: 'success', + danger: 'destructive', + warning: 'warning', + info: 'secondary', + gray: 'secondary', + secondary: 'secondary', +}; + +const weightClasses: Record = { + thin: 'font-thin', + extralight: 'font-extralight', + light: 'font-light', + normal: 'font-normal', + medium: 'font-medium', + semibold: 'font-semibold', + bold: 'font-bold', + extrabold: 'font-extrabold', + black: 'font-black', +}; + +export default function TextGridColumn({ + value, + limit, + wrap = false, + copyable = null, + badge = false, + dateTimeFormat = null, + dateFormat = null, + icon = null, + weight = null, + moneyFormat = null, + color = null, + description = null, + descriptionPosition = 'below', +}: TextGridColumnProps) { + const { notify } = useNotification(); + + // Check if value is an array (for badge rendering of many-to-many relationships) + const isArray = Array.isArray(value); + + const badgeVariant = !color ? 'secondary' : badgeColorMap[color] || 'secondary'; + + const formattedValue = ((): string => { + if (value === null || value === undefined) { + return ''; + } + + // If it's an array, don't format it here - we'll render badges individually + if (isArray) { + return ''; + } + + let result = String(value); + + // Format as date/datetime + if (dateTimeFormat && value) { + try { + const date = new Date(value); + result = date.toLocaleString('en-US', { + year: 'numeric', + month: '2-digit', + day: '2-digit', + hour: '2-digit', + minute: '2-digit', + second: '2-digit', + }); + } catch { + result = String(value); + } + } else if (dateFormat && value) { + try { + const date = new Date(value); + result = date.toLocaleDateString('en-US', { + year: 'numeric', + month: '2-digit', + day: '2-digit', + }); + } catch { + result = String(value); + } + } + + // Format as money + if (moneyFormat) { + const numValue = Number(value) / moneyFormat.divideBy; + result = new Intl.NumberFormat('en-US', { + style: 'currency', + currency: moneyFormat.currency, + }).format(numValue); + } + + // Apply character limit + if (limit && result.length > limit) { + result = result.substring(0, limit) + '...'; + } + + return result; + })(); + + const LucideIconComponent = icon ? resolveColumnIcon(icon) : null; + + const handleCopy = () => { + if (copyable && formattedValue) { + navigator.clipboard.writeText(formattedValue); + notify(copyable, 'Copied to clipboard', 'success', { + duration: 1500, + }); + } + }; + + const weightClass = (weight && weightClasses[weight]) || ''; + + return ( +
+ {/* Description above */} + {description && descriptionPosition === 'above' && ( +
{description}
+ )} + + {/* Main content */} +
+ {/* Icon outside badge when not using badge */} + {LucideIconComponent && !badge && } + + {badge && isArray ? ( + // Multiple badges for array values (many-to-many relationships) +
+ {(value as any[]).map((item: any, index: number) => ( + + {LucideIconComponent && } + {toDisplayString(item)} + + ))} +
+ ) : badge ? ( + // Single badge + + {LucideIconComponent && } + {formattedValue} + + ) : ( + // Regular text + {formattedValue} + )} + + {copyable && ( + + )} +
+ + {/* Description below */} + {description && descriptionPosition === 'below' && ( +
{description}
+ )} +
+ ); +} diff --git a/resources/react/components/grid-columns/ToggleGridColumn.tsx b/resources/react/components/grid-columns/ToggleGridColumn.tsx new file mode 100644 index 0000000..075f3ea --- /dev/null +++ b/resources/react/components/grid-columns/ToggleGridColumn.tsx @@ -0,0 +1,107 @@ +import { Switch } from '@/components/ui/switch'; +import { router, usePage } from '@inertiajs/react'; +import { useNotification } from '@laravilt/notifications/composables/useNotification'; +import { useLocalization } from '@laravilt/support/composables/useLocalization'; +import { useEffect, useState } from 'react'; +import { useStateRef } from '../../composables/useStateRef'; + +export interface ToggleGridColumnProps { + value: any; + name: string; + recordId: number | string; + resourceSlug: string; + editable?: boolean; + disabled?: boolean; + description?: string | null; + descriptionPosition?: 'above' | 'below'; +} + +export default function ToggleGridColumn({ + value, + name, + recordId, + resourceSlug, + editable = true, + disabled = false, + description = null, + descriptionPosition = 'below', +}: ToggleGridColumnProps) { + const { trans } = useLocalization(); + const { notify } = useNotification(); + + // Get the panel path from Inertia shared data + const page = usePage(); + const panelPath = (page.props as any).panel?.path || 'dashboard'; + + // Use the same boolean conversion as the Edit page - simple Boolean() cast + const [localValue, setLocalValue] = useState(() => Boolean(value)); + const [isUpdating, setIsUpdating, isUpdatingRef] = useStateRef(false); + + // Watch for prop changes to update local value (but not during updates to avoid conflicts) + useEffect(() => { + if (!isUpdatingRef.current) { + setLocalValue(Boolean(value)); + } + }, [value, isUpdatingRef]); + + const setChecked = (newValue: boolean) => { + if (disabled || !editable || isUpdatingRef.current) return; + + setIsUpdating(true); + + // Send update to backend (convert to 1/0 for database) + router.patch( + `/${panelPath}/${resourceSlug}/${recordId}/column`, + { + column: name, + value: newValue ? 1 : 0, + }, + { + preserveScroll: true, + preserveState: true, + only: ['records'], + onSuccess: () => { + setLocalValue(newValue); + setIsUpdating(false); + notify( + trans('tables::tables.toggle_column.success_notification_title'), + trans('tables::tables.toggle_column.success_notification_message'), + 'success', + { duration: 2000 }, + ); + }, + onError: (errors: Record) => { + setIsUpdating(false); + + const errorMessage = errors[name] || trans('tables::tables.toggle_column.error_notification_message'); + notify(trans('tables::tables.toggle_column.error_notification_title'), errorMessage, 'error', { + duration: 3000, + }); + }, + }, + ); + }; + + return ( +
+ {/* Description above */} + {description && descriptionPosition === 'above' && ( +
{description}
+ )} + + {/* Main content */} +
+ setChecked(checked)} + /> +
+ + {/* Description below */} + {description && descriptionPosition === 'below' && ( +
{description}
+ )} +
+ ); +} diff --git a/resources/react/composables/useStateRef.ts b/resources/react/composables/useStateRef.ts new file mode 100644 index 0000000..3561ef2 --- /dev/null +++ b/resources/react/composables/useStateRef.ts @@ -0,0 +1,18 @@ +import { useCallback, useRef, useState, type RefObject } from 'react'; + +/** + * State that is also readable synchronously through a ref — the React equivalent of a Vue `ref()` that is + * written in a handler and read right away (or later from a timeout/observer) in the same tick. + * The setter updates the ref immediately and schedules the re-render. + */ +export function useStateRef(initial: T | (() => T)): [T, (value: T) => void, RefObject] { + const [state, setState] = useState(initial); + const ref = useRef(state); + + const set = useCallback((value: T) => { + ref.current = value; + setState(value); + }, []); + + return [state, set, ref]; +} diff --git a/resources/react/composables/useWatch.ts b/resources/react/composables/useWatch.ts new file mode 100644 index 0000000..50dbc35 --- /dev/null +++ b/resources/react/composables/useWatch.ts @@ -0,0 +1,21 @@ +import { useLatest } from '@laravilt/support/composables/hooks'; +import { useEffect, useRef } from 'react'; + +/** + * React twin of a non-immediate Vue `watch(source, cb)`: runs `callback(value, previous)` after a render in + * which `value` changed (Object.is), never on mount. Safe under StrictMode's double effect invocation. + */ +export function useWatch(value: T, callback: (value: T, previous: T) => void): void { + const previous = useRef(value); + const latest = useLatest(callback); + + useEffect(() => { + if (Object.is(previous.current, value)) { + return; + } + + const old = previous.current; + previous.current = value; + latest.current(value, old); + }, [value, latest]); +} diff --git a/resources/react/lib/display.ts b/resources/react/lib/display.ts new file mode 100644 index 0000000..522d8c0 --- /dev/null +++ b/resources/react/lib/display.ts @@ -0,0 +1,24 @@ +/** + * Equivalent of Vue's `{{ value }}` interpolation (`toDisplayString`): + * null/undefined → '', arrays and plain objects → pretty JSON, everything else → String(). + * React cannot render objects or booleans as children, Vue can. + */ +export function toDisplayString(value: unknown): string { + if (typeof value === 'string') { + return value; + } + + if (value === null || value === undefined) { + return ''; + } + + if ( + Array.isArray(value) || + (typeof value === 'object' && + ((value as object).toString === Object.prototype.toString || typeof (value as any).toString !== 'function')) + ) { + return JSON.stringify(value, null, 2); + } + + return String(value); +} diff --git a/resources/react/lib/icons.ts b/resources/react/lib/icons.ts new file mode 100644 index 0000000..bcb5948 --- /dev/null +++ b/resources/react/lib/icons.ts @@ -0,0 +1,43 @@ +import { resolveIcon } from '@laravilt/support/lib/icons'; +import * as LucideIcons from 'lucide-react'; +import type { LucideIcon } from 'lucide-react'; + +/** + * Heroicon → Lucide mapping used by every Vue column component. + */ +const heroiconMap: Record = { + 'heroicon-o-check-circle': 'CheckCircle', + 'heroicon-o-x-circle': 'XCircle', + 'heroicon-o-exclamation-circle': 'AlertCircle', + 'heroicon-o-information-circle': 'Info', +}; + +/** + * Resolve a column icon name exactly like the Vue columns did + * (`iconMap[name] || name` → PascalCase on `-` → lookup in every lucide export, aliases included), + * falling back to the shared `resolveIcon()` for the formats it understands. + * + * The fallback is needed because `resolveIcon()` only searches lucide's `icons` map, + * which does not contain aliases such as `CheckCircle`, `XCircle` or `AlertCircle`. + */ +export function resolveColumnIcon(name: unknown): LucideIcon | null { + if (!name) { + return null; + } + + const iconName = String(name); + const mappedIconName = heroiconMap[iconName] || iconName; + + const pascalCaseName = mappedIconName + .split('-') + .map((part) => part.charAt(0).toUpperCase() + part.slice(1)) + .join(''); + + const direct = (LucideIcons as Record)[pascalCaseName]; + + if (direct && (typeof direct === 'object' || typeof direct === 'function')) { + return direct as LucideIcon; + } + + return resolveIcon(iconName); +} diff --git a/src/Mcp/Tools/GenerateTableTool.php b/src/Mcp/Tools/GenerateTableTool.php index 1322ec8..f2f3e88 100644 --- a/src/Mcp/Tools/GenerateTableTool.php +++ b/src/Mcp/Tools/GenerateTableTool.php @@ -2,7 +2,7 @@ namespace Laravilt\Tables\Mcp\Tools; -use Illuminate\JsonSchema\JsonSchema; +use Illuminate\Contracts\JsonSchema\JsonSchema; use Laravel\Mcp\Request; use Laravel\Mcp\Response; use Laravel\Mcp\Server\Tool; diff --git a/src/Mcp/Tools/SearchDocsTool.php b/src/Mcp/Tools/SearchDocsTool.php index 03167c9..f646038 100644 --- a/src/Mcp/Tools/SearchDocsTool.php +++ b/src/Mcp/Tools/SearchDocsTool.php @@ -2,7 +2,7 @@ namespace Laravilt\Tables\Mcp\Tools; -use Illuminate\JsonSchema\JsonSchema; +use Illuminate\Contracts\JsonSchema\JsonSchema; use Illuminate\Support\Facades\File; use Laravel\Mcp\Request; use Laravel\Mcp\Response; From e51af5287c05630130ce4fc4f2ccd21118e7747a Mon Sep 17 00:00:00 2001 From: Fady Mondy Date: Mon, 14 Sep 2026 17:52:43 +0300 Subject: [PATCH 2/3] Stop configuring coverage reports in phpunit.xml With PHPUnit 12 (Pest 4/5), configured coverage reports make the test run exit 1 without running any tests when no coverage driver is installed, which failed CI. Coverage stays available on demand with pest --coverage. Co-Authored-By: Claude Opus 5 (1M context) --- phpunit.xml | 7 ------- 1 file changed, 7 deletions(-) diff --git a/phpunit.xml b/phpunit.xml index c2db6e4..6839f7e 100644 --- a/phpunit.xml +++ b/phpunit.xml @@ -9,13 +9,6 @@ ./tests - - - - - - - ./src From 282478a58b76fb425b6b53b1c7093548e3584f5b Mon Sep 17 00:00:00 2001 From: Fady Mondy Date: Tue, 15 Sep 2026 09:07:42 +0300 Subject: [PATCH 3/3] Fix React table bugs flagged in review - CardGrid: normalize title values before string ops, use keyboard-operable Checkbox with accessible labels for selection, and forward the full column config (plus recordId) to grid column components - DataTable: treat non-OK reorder responses as failures (revert order), add the drag-handle cell to skeleton rows - Table: seed allRecords without duplicating page > 1, reload data on AJAX group change instead of throwing - ImageGridColumn: render defaultImageUrl for empty values, stop retrying when the default image fails - TextGridColumn: format non-badge arrays/objects as JSON, skip invalid dates - ApiTester: quote/escape YAML string scalars in the OpenAPI export Co-Authored-By: Claude Opus 5 (1M context) --- resources/react/components/ApiTester.tsx | 19 ++++-- resources/react/components/CardGrid.tsx | 66 ++++++++----------- resources/react/components/DataTable.tsx | 10 ++- resources/react/components/Table.tsx | 17 ++--- .../grid-columns/ImageGridColumn.tsx | 15 ++++- .../grid-columns/TextGridColumn.tsx | 45 ++++++++----- 6 files changed, 96 insertions(+), 76 deletions(-) diff --git a/resources/react/components/ApiTester.tsx b/resources/react/components/ApiTester.tsx index f283497..e63b804 100644 --- a/resources/react/components/ApiTester.tsx +++ b/resources/react/components/ApiTester.tsx @@ -309,6 +309,17 @@ const formatBytes = (bytes: number) => { return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i]; }; +// Quote strings that would break or be re-typed as plain YAML scalars (newlines, indicators, booleans, null, +// numbers). JSON string syntax is a valid double-quoted YAML scalar and escapes newlines and quotes. +const toYamlString = (value: string): string => + value === '' || + /[\n\r:#]/.test(value) || + /^[\s\-?,[\]{}&*!|>'"%@`]|\s$/.test(value) || + /^(?:true|false|yes|no|on|off|null|~)$/i.test(value) || + !isNaN(Number(value)) + ? JSON.stringify(value) + : value; + const toYaml = (obj: any, indent = 0): string => { const prefix = ' '.repeat(indent); let yaml = ''; @@ -320,11 +331,7 @@ const toYaml = (obj: any, indent = 0): string => { } else if (typeof value === 'number') { yaml += `${prefix}${key}: ${value}\n`; } else if (typeof value === 'string') { - if (value.includes('\n') || value.includes(':') || value.includes('#')) { - yaml += `${prefix}${key}: "${value.replace(/"/g, '\\"')}"\n`; - } else { - yaml += `${prefix}${key}: ${value}\n`; - } + yaml += `${prefix}${key}: ${toYamlString(value)}\n`; } else if (Array.isArray(value)) { if (value.length === 0) { yaml += `${prefix}${key}: []\n`; @@ -335,7 +342,7 @@ const toYaml = (obj: any, indent = 0): string => { const itemYaml = toYaml(item, indent + 2).trim(); yaml += `${prefix}- ${itemYaml.split('\n').join('\n' + prefix + ' ')}\n`; } else { - yaml += `${prefix}- ${item}\n`; + yaml += `${prefix}- ${typeof item === 'string' ? toYamlString(item) : item}\n`; } } } diff --git a/resources/react/components/CardGrid.tsx b/resources/react/components/CardGrid.tsx index 9cc8c70..c83c05f 100644 --- a/resources/react/components/CardGrid.tsx +++ b/resources/react/components/CardGrid.tsx @@ -201,14 +201,6 @@ const gridColsMap: Record = { 6: 'grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-6', }; -function SelectCheckmark() { - return ( - - - - ); -} - function ProductSkeleton() { return ( <> @@ -455,7 +447,8 @@ export default function CardGrid({ // Get avatar initials from title const getAvatarInitials = (record: any) => { - const title = getTitle(record); + // Normalize first: the configured title field may hold a number or object + const title = toDisplayString(getTitle(record)); if (!title) return '?'; const words = title.split(' '); if (words.length >= 2) { @@ -518,21 +511,12 @@ export default function CardGrid({
{/* Selection Checkbox */} {bulkActionsAvailable && ( -
{ - event.stopPropagation(); - handleSelectRecord(record.id); - }} - > -
- {isSelected(record.id) && } -
-
+ handleSelectRecord(record.id)} + aria-label={`Select record #${toDisplayString(record.id)}`} + className="size-5 rounded border-2 border-muted-foreground/40 bg-background cursor-pointer hover:border-primary/60" + /> )} {/* Record ID */} #{toDisplayString(record.id)} @@ -648,7 +632,7 @@ export default function CardGrid({ /> ) : (
- {title?.charAt(0) || '?'} + {toDisplayString(title).charAt(0) || '?'}
)} @@ -661,6 +645,7 @@ export default function CardGrid({ handleSelectRecord(record.id)} + aria-label={`Select record #${toDisplayString(record.id)}`} className="border-white/50 data-[state=checked]:bg-primary data-[state=checked]:border-primary" />
@@ -725,20 +710,12 @@ export default function CardGrid({ {/* Selection Checkbox (floating) */} {bulkActionsAvailable && (
-
{ - event.stopPropagation(); - handleSelectRecord(record.id); - }} - className={cn( - 'h-5 w-5 rounded border-2 flex items-center justify-center cursor-pointer transition-all duration-200 shadow-sm', - isSelected(record.id) - ? 'bg-primary border-primary' - : 'border-white/80 hover:border-primary/60 bg-white/90 backdrop-blur-sm', - )} - > - {isSelected(record.id) && } -
+ handleSelectRecord(record.id)} + aria-label={`Select record #${toDisplayString(record.id)}`} + className="size-5 rounded border-2 border-white/80 bg-white/90 backdrop-blur-sm shadow-sm cursor-pointer hover:border-primary/60" + />
)} @@ -881,7 +858,12 @@ export default function CardGrid({ {(bulkActionsAvailable || title) && ( {bulkActionsAvailable && ( - handleSelectRecord(record.id)} className="mt-1" /> + handleSelectRecord(record.id)} + aria-label={`Select record #${toDisplayString(record.id)}`} + className="mt-1" + /> )}
{title ? ( @@ -903,10 +885,14 @@ export default function CardGrid({ const ColumnComponent = getColumnComponent(column.component); return ( + // Spread the column config (limit, wrap, badge, imageWidth, editable, name, ...) first, + // then override the record-specific values ( + {/* Drag Handle Skeleton (keeps cells aligned with the reorder header) */} + {reorderable && } + {/* Checkbox Skeleton */} {bulkActionsAvailable && ( diff --git a/resources/react/components/Table.tsx b/resources/react/components/Table.tsx index e24267a..5410bc3 100644 --- a/resources/react/components/Table.tsx +++ b/resources/react/components/Table.tsx @@ -252,13 +252,9 @@ export default function Table({ [12, 24, 48, 96]; // Records: append or replace based on infinite scroll. - // Initial value reproduces Vue's immediate watcher run during setup. - const [allRecords, setAllRecords, allRecordsRef] = useStateRef(() => { - if (table.infiniteScroll && !(table.activeGroup || table.defaultGroup) && pagination.current_page !== 1 && pagination.current_page > 1) { - return [...records, ...records]; - } - return records; - }); + // Seed with the initial records; the watcher below handles appends. (Vue's immediate watcher appended the + // initial page to itself on deep links to page > 1, duplicating every record — not ported.) + const [allRecords, setAllRecords, allRecordsRef] = useStateRef(records); useWatch(records, (newRecords) => { if (isInfiniteScrollActiveNow()) { @@ -592,11 +588,10 @@ export default function Table({ urlParams.delete('group'); } - // If using AJAX mode, reload data + // If using AJAX mode, reload data (reloadData() sends the new group from activeGroupRef). + // Vue calls an undefined `updateUrl()` first, which throws before reloading; AJAX mode keeps state out of the URL. if (useAjax) { - // Vue calls an undefined `updateUrl({ group })` here, which throws a ReferenceError - // before reloadData() runs (and before the observer re-setup below). Ported as-is. - throw new ReferenceError('updateUrl is not defined'); + reloadData(); } else { // For Inertia, do a full navigation const currentUrl = new URL(window.location.href); diff --git a/resources/react/components/grid-columns/ImageGridColumn.tsx b/resources/react/components/grid-columns/ImageGridColumn.tsx index 5a91166..452d1b5 100644 --- a/resources/react/components/grid-columns/ImageGridColumn.tsx +++ b/resources/react/components/grid-columns/ImageGridColumn.tsx @@ -91,7 +91,14 @@ export default function ImageGridColumn({ description = null, descriptionPosition = 'below', }: ImageGridColumnProps) { - const images: any[] = !value ? [] : Array.isArray(value) ? value : [value]; + const images: any[] = !value + ? // Show default image if no value but defaultImageUrl is set + defaultImageUrl + ? [defaultImageUrl] + : [] + : Array.isArray(value) + ? value + : [value]; const displayImages = !limit ? images : images.slice(0, limit); @@ -135,8 +142,10 @@ export default function ImageGridColumn({ }; const handleImageError = (event: SyntheticEvent) => { - if (defaultImageUrl) { - event.currentTarget.src = defaultImageUrl; + const imgElement = event.currentTarget; + // Only fall back once: if the default image itself fails, stop (prevents an error/reload loop) + if (defaultImageUrl && imgElement.getAttribute('src') !== defaultImageUrl) { + imgElement.src = defaultImageUrl; } }; diff --git a/resources/react/components/grid-columns/TextGridColumn.tsx b/resources/react/components/grid-columns/TextGridColumn.tsx index 605bfeb..7d65f2c 100644 --- a/resources/react/components/grid-columns/TextGridColumn.tsx +++ b/resources/react/components/grid-columns/TextGridColumn.tsx @@ -72,36 +72,51 @@ export default function TextGridColumn({ return ''; } - // If it's an array, don't format it here - we'll render badges individually - if (isArray) { + // If it's an array for badges, don't format it here - we'll render badges individually + if (isArray && badge) { return ''; } + // If it's an object or array (not for badges), format as JSON (same as TextColumn) + if (typeof value === 'object' && !badge) { + try { + return JSON.stringify(value, null, 2); + } catch { + return String(value); + } + } + let result = String(value); // Format as date/datetime if (dateTimeFormat && value) { try { const date = new Date(value); - result = date.toLocaleString('en-US', { - year: 'numeric', - month: '2-digit', - day: '2-digit', - hour: '2-digit', - minute: '2-digit', - second: '2-digit', - }); + // Check if date is valid + if (!isNaN(date.getTime())) { + result = date.toLocaleString('en-US', { + year: 'numeric', + month: '2-digit', + day: '2-digit', + hour: '2-digit', + minute: '2-digit', + second: '2-digit', + }); + } } catch { result = String(value); } } else if (dateFormat && value) { try { const date = new Date(value); - result = date.toLocaleDateString('en-US', { - year: 'numeric', - month: '2-digit', - day: '2-digit', - }); + // Check if date is valid + if (!isNaN(date.getTime())) { + result = date.toLocaleDateString('en-US', { + year: 'numeric', + month: '2-digit', + day: '2-digit', + }); + } } catch { result = String(value); }