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 (

{
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
})
]);
};
}
};