UNPKG

klioso

Version:

Multi-Service Provider Management System for WordPress and Web Development with Enhanced Scanner

133 lines (130 loc) 4.95 kB
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} /> ); }