klioso
Version:
Multi-Service Provider Management System for WordPress and Web Development with Enhanced Scanner
133 lines (130 loc) • 4.95 kB
JSX
import ResponsiveTableLayout from '@/Layouts/ResponsiveTableLayout';
import { Link } from '@inertiajs/react';
import Button from '@/Components/Button';
import DeleteButton from '@/Components/DeleteButton';
export default function Index({ hostingProviders, pagination, sortBy, sortDirection, filters }) {
const columns = [
{
label: 'Name',
key: 'name',
sortable: true,
render: provider => (
<Link
href={`/hosting-providers/${provider.id}`}
className="text-indigo-600 hover:text-indigo-900 font-medium"
>
{provider.name}
</Link>
)
},
{
label: 'Services',
key: 'services',
sortable: false,
render: provider => provider.services ? (
<div className="flex flex-wrap gap-1">
{provider.services.split(', ').map((service, index) => (
<span
key={index}
className="inline-flex items-center px-2 py-0.5 rounded text-xs font-medium bg-indigo-100 text-indigo-800"
>
{service}
</span>
))}
</div>
) : '-'
},
{
label: 'Description',
key: 'description',
sortable: true,
hideOnMobile: true,
render: provider => provider.description ? (
<div className="max-w-xs truncate" title={provider.description}>
{provider.description.length > 60 ? `${provider.description.substring(0, 60)}...` : provider.description}
</div>
) : '-'
},
{
label: 'Website',
key: 'website',
sortable: false,
hideOnMobile: true,
render: provider => provider.website ? (
<a
href={provider.website}
target="_blank"
rel="noopener noreferrer"
className="text-blue-600 hover:text-blue-800 truncate block max-w-xs"
title={provider.website}
>
Visit Website
</a>
) : '-'
},
{
label: 'Login',
key: 'login_url',
sortable: false,
hideOnMobile: true,
render: provider => provider.login_url ? (
<a
href={provider.login_url}
target="_blank"
rel="noopener noreferrer"
className="inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium bg-indigo-100 text-indigo-800 hover:bg-indigo-200"
>
Login Portal
</a>
) : '-'
},
{
label: 'Contact Info',
key: 'contact_info',
sortable: false,
hideOnMobile: true,
render: provider => provider.contact_info ? (
<div className="max-w-xs truncate" title={provider.contact_info}>
{provider.contact_info.length > 40 ? `${provider.contact_info.substring(0, 40)}...` : provider.contact_info}
</div>
) : '-'
},
{
label: 'Actions',
key: 'actions',
sortable: false,
render: provider => (
<div className="flex flex-col sm:flex-row gap-2">
<Button as={Link} href={`/hosting-providers/${provider.id}`} size="sm" variant="outline">
View
</Button>
<Button as={Link} href={`/hosting-providers/${provider.id}/edit`} size="sm">
Edit
</Button>
<DeleteButton
resource={provider}
resourceName="hosting provider"
deleteRoute={`/hosting-providers/${provider.id}`}
size="sm"
/>
</div>
)
}
];
return (
<ResponsiveTableLayout
title="Hosting Providers"
data={hostingProviders}
columns={columns}
createRoute="/hosting-providers/create"
createButtonText="Add Provider"
searchPlaceholder="Search hosting providers by name or description..."
searchRoute="/hosting-providers"
emptyStateMessage="No hosting providers found. Start by adding your first provider."
filters={filters}
sortBy={sortBy}
sortDirection={sortDirection}
pagination={pagination}
/>
);
}