import React from 'react'; import { Badge } from '@/components/ui/badge'; import { cn } from '@/lib/utils'; import { Link } from '@inertiajs/react'; import { Switch } from '@/components/ui/switch'; // Simple renderers without TypeScript types export const columnRenderers = { // Status badge renderer status: (colorMap = {}, defaultColor = 'bg-gray-100 text-gray-800') => { return (value) => { if (value === null || value === undefined) return -; // Handle boolean status values if (typeof value === 'boolean') { return ( {value ? 'Active' : 'Inactive'} ); } const color = colorMap[value] || defaultColor; return ( {value} ); }; }, // Image renderer image: (className = 'h-16 w-20 rounded-md object-cover shadow-sm', fallbackSrc = 'https://placehold.co/200x150?text=Image+Not+Found') => { return (value, row) => { if (!value) return
No image
; const imageSrc = typeof value === 'string' && value.startsWith('http') ? value : `/storage/${value}`; return (
Image { e.currentTarget.src = fallbackSrc; }} />
); }; }, // Price renderer price: (currency = 'USD', locale = 'en-US') => { return (value) => { if (value === null || value === undefined) return -; const numValue = typeof value === 'string' ? parseFloat(value) : value; return ( {numValue.toLocaleString(locale, { style: 'currency', currency })} ); }; }, // Date renderer with settings support date: (includeTime = false) => { return (value) => { if (!value) return -; try { // Try to use global settings if available if (typeof window !== 'undefined' && window.appSettings) { const formatted = window.appSettings.formatDateTime(value, false); return {formatted}; } // Fallback to default formatting const date = new Date(value); const options = includeTime ? { dateStyle: 'medium', timeStyle: 'short' } : { dateStyle: 'medium' }; return {date.toLocaleDateString('en-US', options)}; } catch (e) { return {value}; } }; }, // Boolean renderer boolean: () => { return (value) => {value ? 'Yes' : 'No'}; }, // Relation renderer relation: (field) => { return (value, row) => { if (!row) return -; return row && row[field] ? {row[field]} : -; }; }, // Link renderer - for making a column value clickable link: (getUrl, className = 'text-blue-600 hover:underline', newTab = false) => { return (value, row) => { if (!value) return -; const url = typeof getUrl === 'function' ? getUrl(row) : getUrl.replace(':id', row.id); return ( {value} ); }; }, // Button renderer - for adding a button in a column button: (label, getUrl, className = 'px-2 py-1 text-xs bg-blue-500 text-white rounded hover:bg-blue-600', newTab = false) => { return (value, row) => { const url = typeof getUrl === 'function' ? getUrl(row) : getUrl.replace(':id', row.id); return ( {label} ); }; }, // Switch renderer - for status toggles switch: (onToggle, disabled = false) => { return (value, row) => { const handleToggle = () => { if (!disabled && onToggle) { onToggle(row.id, !value); } }; return React.createElement('div', { className: 'flex items-center justify-center' }, [ React.createElement(Switch, { key: 'switch', checked: !!value, onCheckedChange: handleToggle, disabled }) ]); }; } };