62220186af
- New ExternalImportSource and ExternalWorkHistoryEntry models, controller and migrations - Screening fields on external profile imports - Admin and provider profile views, routes and workflow tests updated - Phase 1 validation, route inventory, gap report template and roadmap docs - Add the Google Sheets work-order parser tool (tools/google-sheets-wo-parser)
330 lines
28 KiB
PHP
330 lines
28 KiB
PHP
@php
|
|
$servicesText = collect($profile?->services ?? [])->map(fn ($row) => trim(($row['name'] ?? '').' | '.($row['level'] ?? ''), ' |'))->implode("\n");
|
|
$toolsText = collect($profile?->tool_inventory ?? [])->map(fn ($row) => trim(($row['name'] ?? '').' | '.($row['category'] ?? ''), ' |'))->implode("\n");
|
|
$certsText = collect($profile?->certification_records ?? [])->map(fn ($row) => trim(($row['name'] ?? '').' | '.($row['issuer'] ?? ''), ' |'))->implode("\n");
|
|
$visibility = $profile?->profile_visibility ?? [];
|
|
$visible = fn (string $field): bool => (bool) ($visibility[$field] ?? true);
|
|
$selectedTaxonomy = $profile?->taxonomyTerms?->pluck('id')->all() ?? [];
|
|
@endphp
|
|
|
|
<x-app-layout>
|
|
<x-slot name="header">
|
|
<x-page-header
|
|
title="Provider Profile"
|
|
description="Build a public business profile with services, tools, proof records, galleries, and private owner notes."
|
|
/>
|
|
</x-slot>
|
|
|
|
<div class="mx-auto max-w-5xl space-y-6 px-4 py-8 sm:px-6 lg:px-8">
|
|
<form method="POST" action="{{ route('providers.update') }}" class="tse-panel space-y-4 p-6">
|
|
@csrf
|
|
@method('PUT')
|
|
<x-field name="business_name" label="Business name" :value="$profile?->business_name" />
|
|
<x-field name="headline" label="Headline" :value="$profile?->headline" />
|
|
<x-field name="bio" label="Bio" :value="$profile?->bio" textarea />
|
|
<x-field name="service_area" label="Service area" :value="$profile?->service_area" />
|
|
<div>
|
|
<label for="max_technician_level" class="block text-sm font-medium text-slate-800 dark:text-slate-200">Maximum technician level</label>
|
|
<select id="max_technician_level" name="max_technician_level" class="mt-1 block w-full rounded-md border-slate-300 bg-white text-slate-950 shadow-sm focus:border-sky-500 focus:ring-sky-500 dark:border-slate-700 dark:bg-slate-950 dark:text-slate-100">
|
|
@foreach ($technicianLevels as $level => $definition)
|
|
<option value="{{ $level }}" @selected((int) ($profile?->max_technician_level ?? 1) === $level)>{{ $definition['name'] }}</option>
|
|
@endforeach
|
|
</select>
|
|
<p class="mt-1 text-sm text-slate-500 dark:text-slate-400">This is self-declared until native work history, buyer endorsements, certifications, or admin verification support it.</p>
|
|
</div>
|
|
<x-field name="skills" label="Skills summary" :value="$profile?->skills" textarea />
|
|
<div class="rounded-md border border-slate-200 p-4 dark:border-slate-800">
|
|
<h3 class="font-semibold text-slate-950 dark:text-white">Self-declared tags and evidence</h3>
|
|
<p class="mt-1 text-sm text-slate-600 dark:text-slate-400">Choose categories, specialties, skills, tools, and certifications that describe your work. Later passes can let buyers endorse or challenge these after completed work orders.</p>
|
|
<div class="mt-3 grid gap-2 md:grid-cols-2">
|
|
@foreach ($taxonomyTerms as $term)
|
|
<label class="inline-flex items-center gap-2 rounded-md border border-slate-200 px-3 py-2 text-sm text-slate-700 dark:border-slate-800 dark:text-slate-300">
|
|
<input type="checkbox" name="taxonomy_terms[]" value="{{ $term->id }}" @checked(in_array($term->id, $selectedTaxonomy, true)) class="rounded border-slate-300 text-sky-600 shadow-sm focus:ring-sky-500 dark:border-slate-700 dark:bg-slate-950">
|
|
<span>{{ $term->name }} <span class="text-xs text-slate-500">({{ str_replace('_', ' ', $term->type) }})</span></span>
|
|
</label>
|
|
@endforeach
|
|
</div>
|
|
</div>
|
|
<x-field name="services_text" label="Structured services" :value="$servicesText" textarea help="One per line. Use: service name | level, for example POS install | experienced." />
|
|
<x-field name="tools" label="Tools and equipment summary" :value="$profile?->tools" textarea />
|
|
<x-field name="tool_inventory_text" label="Tool inventory" :value="$toolsText" textarea help="One per line. Use: tool name | category, for example Cable tester | network." />
|
|
<x-field name="certifications" label="Certifications summary" :value="$profile?->certifications" textarea />
|
|
<x-field name="certification_records_text" label="Certification records" :value="$certsText" textarea help="One per line. Use: certification | issuer. Upload proof files below." />
|
|
<x-field name="insurance_status" label="Insurance status" :value="$profile?->insurance_status" />
|
|
<x-field name="rate_card" label="Rate card" :value="$profile?->rate_card" textarea />
|
|
<x-field name="travel_policy" label="Travel policy" :value="$profile?->travel_policy" textarea />
|
|
<x-field name="availability_notes" label="Availability notes" :value="$profile?->availability_notes" textarea />
|
|
<x-field name="website_url" label="Website URL" :value="$profile?->website_url" />
|
|
<x-field name="phone" label="Phone" :value="$profile?->phone" />
|
|
|
|
<div class="rounded-md border border-slate-200 p-4 dark:border-slate-800">
|
|
<h3 class="font-semibold text-slate-950 dark:text-white">Public sections</h3>
|
|
<p class="mt-1 text-sm text-slate-600 dark:text-slate-400">Unchecked sections remain available to you but do not display on the public provider profile.</p>
|
|
<div class="mt-3 grid gap-3 md:grid-cols-3">
|
|
@foreach (['bio' => 'Bio', 'services' => 'Services', 'tools' => 'Tools', 'certifications' => 'Certifications', 'rate_card' => 'Rate card', 'availability' => 'Availability', 'imports' => 'Imported history'] as $key => $label)
|
|
<label class="inline-flex items-center gap-2 text-sm text-slate-700 dark:text-slate-300">
|
|
<input type="checkbox" name="profile_visibility[{{ $key }}]" value="1" @checked($visible($key)) class="rounded border-slate-300 text-sky-600 shadow-sm focus:ring-sky-500 dark:border-slate-700 dark:bg-slate-950">
|
|
{{ $label }}
|
|
</label>
|
|
@endforeach
|
|
</div>
|
|
</div>
|
|
|
|
<label class="flex gap-2 text-sm text-slate-700 dark:text-slate-300">
|
|
<input type="checkbox" name="public_contact" value="1" @checked($profile?->public_contact) class="rounded border-slate-300 text-sky-600 shadow-sm focus:ring-sky-500 dark:border-slate-700 dark:bg-slate-950">
|
|
Show contact details publicly
|
|
</label>
|
|
<x-field name="private_notes" label="Private notes" :value="$profile?->private_notes" textarea help="Internal notes for your account. These are not shown publicly." />
|
|
<x-primary-button>Save provider profile</x-primary-button>
|
|
</form>
|
|
@if ($profile)
|
|
<section class="tse-panel p-6">
|
|
<h3 class="font-semibold text-slate-950 dark:text-white">Profile photos, certification proof, tools, and job files</h3>
|
|
<p class="mt-1 text-sm text-slate-600 dark:text-slate-400">Use captions to distinguish van photos, tool photos, certification proof, job photos, and insurance documents.</p>
|
|
<x-attachments :attachments="$profile->attachments" />
|
|
<x-attachment-form type="provider_profile" :id="$profile->id" kind="profile" />
|
|
</section>
|
|
<form method="POST" action="{{ route('provider-imports.store') }}" class="tse-panel space-y-4 p-6">
|
|
@csrf
|
|
<div>
|
|
<h3 class="font-semibold text-slate-950 dark:text-white">Guided imported-history wizard</h3>
|
|
<p class="mt-1 text-sm text-slate-600 dark:text-slate-400">Manually preserve earned history from Field Nation, WorkMarket, or similar platforms without scraping private systems. Keep client names, addresses, work-order IDs, and sensitive buyer details out of public fields.</p>
|
|
</div>
|
|
<div class="grid gap-4 md:grid-cols-3">
|
|
<x-field name="platform" label="Platform" value="Field Nation" />
|
|
<x-field name="external_id" label="External ID" value="172-630" />
|
|
<x-field name="profile_url" label="Profile URL" />
|
|
<x-field name="rating" label="Rating" type="number" />
|
|
<x-field name="review_count" label="Review count" type="number" />
|
|
<x-field name="completed_jobs" label="Completed jobs" type="number" />
|
|
<x-field name="client_count" label="Buyer/client count" type="number" />
|
|
<x-field name="on_time_rate" label="On-time rate %" type="number" />
|
|
<x-field name="backout_rate" label="Backout rate %" type="number" />
|
|
</div>
|
|
<div>
|
|
<label for="visibility" class="block text-sm font-medium text-slate-800 dark:text-slate-200">Public visibility</label>
|
|
<select id="visibility" name="visibility" class="mt-1 block w-full rounded-md border-slate-300 bg-white text-slate-950 shadow-sm focus:border-sky-500 focus:ring-sky-500 dark:border-slate-700 dark:bg-slate-950 dark:text-slate-100">
|
|
@foreach (\App\Models\ExternalProfileImport::VISIBILITIES as $value => $label)
|
|
<option value="{{ $value }}">{{ $label }}</option>
|
|
@endforeach
|
|
</select>
|
|
</div>
|
|
<x-field name="work_categories_text" label="Work categories, one per line" textarea help="Examples: POS installs, network troubleshooting, cabling, printers." />
|
|
<div class="rounded-md border border-slate-200 p-4 dark:border-slate-800">
|
|
<h4 class="font-semibold text-slate-950 dark:text-white">Imported endorsement categories</h4>
|
|
<div class="mt-3 grid gap-2 md:grid-cols-3">
|
|
@foreach (['communication', 'professionalism', 'problem_solving', 'preparedness', 'work_quality', 'responsiveness'] as $endorsement)
|
|
<label class="inline-flex items-center gap-2 text-sm text-slate-700 dark:text-slate-300">
|
|
<input type="checkbox" name="endorsements[]" value="{{ $endorsement }}" class="rounded border-slate-300 text-sky-600 shadow-sm focus:ring-sky-500 dark:border-slate-700 dark:bg-slate-950">
|
|
{{ str_replace('_', ' ', $endorsement) }}
|
|
</label>
|
|
@endforeach
|
|
</div>
|
|
</div>
|
|
<x-field name="selected_reviews_text" label="Selected review excerpts, one per line" textarea help="Only paste short excerpts you are comfortable showing according to the visibility setting." />
|
|
<x-field name="notes" label="Private notes or summary" textarea />
|
|
<x-primary-button>Save imported history</x-primary-button>
|
|
</form>
|
|
<section class="tse-panel space-y-4 p-6">
|
|
<div>
|
|
<h3 class="font-semibold text-slate-950 dark:text-white">Private import source vault</h3>
|
|
<p class="mt-1 text-sm text-slate-600 dark:text-slate-400">Upload provider-owned Field Nation, WorkMarket, or similar source material here before creating a public summary. Raw files stay private by default for provider/admin review and should not be published directly.</p>
|
|
</div>
|
|
<form method="POST" action="{{ route('provider-import-sources.store') }}" enctype="multipart/form-data" class="space-y-4 rounded-md border border-slate-200 p-4 dark:border-slate-800">
|
|
@csrf
|
|
<div class="grid gap-4 md:grid-cols-3">
|
|
<div>
|
|
<label for="import_source_platform" class="block text-sm font-medium text-slate-800 dark:text-slate-200">Platform</label>
|
|
<select id="import_source_platform" name="platform" class="mt-1 block w-full rounded-md border-slate-300 bg-white text-slate-950 shadow-sm focus:border-sky-500 focus:ring-sky-500 dark:border-slate-700 dark:bg-slate-950 dark:text-slate-100">
|
|
@foreach (\App\Models\ExternalImportSource::PLATFORMS as $value => $label)
|
|
<option value="{{ $value }}">{{ $label }}</option>
|
|
@endforeach
|
|
</select>
|
|
</div>
|
|
<div>
|
|
<label for="source_type" class="block text-sm font-medium text-slate-800 dark:text-slate-200">Source type</label>
|
|
<select id="source_type" name="source_type" class="mt-1 block w-full rounded-md border-slate-300 bg-white text-slate-950 shadow-sm focus:border-sky-500 focus:ring-sky-500 dark:border-slate-700 dark:bg-slate-950 dark:text-slate-100">
|
|
@foreach (\App\Models\ExternalImportSource::SOURCE_TYPES as $value => $label)
|
|
<option value="{{ $value }}">{{ $label }}</option>
|
|
@endforeach
|
|
</select>
|
|
</div>
|
|
<div>
|
|
<label for="external_profile_import_id" class="block text-sm font-medium text-slate-800 dark:text-slate-200">Attach to saved summary</label>
|
|
<select id="external_profile_import_id" name="external_profile_import_id" class="mt-1 block w-full rounded-md border-slate-300 bg-white text-slate-950 shadow-sm focus:border-sky-500 focus:ring-sky-500 dark:border-slate-700 dark:bg-slate-950 dark:text-slate-100">
|
|
<option value="">No summary yet</option>
|
|
@foreach ($profile->externalImports as $import)
|
|
<option value="{{ $import->id }}">{{ $import->platform }} {{ $import->external_id ? '#'.$import->external_id : '' }}</option>
|
|
@endforeach
|
|
</select>
|
|
</div>
|
|
</div>
|
|
<x-field name="provider_notes" label="Private source notes" textarea help="Record where this file came from and whether it contains customer names, addresses, work-order IDs, or private buyer details." />
|
|
<div>
|
|
<label for="source_file" class="block text-sm font-medium text-slate-800 dark:text-slate-200">Source file</label>
|
|
<input id="source_file" name="source_file" type="file" required class="mt-1 block w-full rounded-md border border-slate-300 bg-white text-sm text-slate-950 shadow-sm file:mr-4 file:border-0 file:bg-slate-100 file:px-4 file:py-2 file:text-sm file:font-semibold file:text-slate-700 hover:file:bg-slate-200 dark:border-slate-700 dark:bg-slate-950 dark:text-slate-100 dark:file:bg-slate-800 dark:file:text-slate-200">
|
|
<p class="mt-1 text-sm text-slate-500 dark:text-slate-400">Allowed: images, PDF, text, CSV, JSON, HTML, and zip files. Default storage is private.</p>
|
|
<x-input-error :messages="$errors->get('source_file')" class="mt-2" />
|
|
</div>
|
|
<x-primary-button>Upload private source</x-primary-button>
|
|
</form>
|
|
|
|
<div>
|
|
<h4 class="font-semibold text-slate-950 dark:text-white">Uploaded import sources</h4>
|
|
@forelse ($profile->externalImportSources->sortByDesc('uploaded_at') as $source)
|
|
<div class="mt-3 rounded-md border border-slate-200 p-4 text-sm dark:border-slate-800">
|
|
<div class="flex flex-wrap items-center gap-2">
|
|
<p class="font-semibold text-slate-950 dark:text-white">{{ $source->platform }} | {{ $source->sourceTypeLabel() }}</p>
|
|
<x-badge tone="slate">{{ $source->parseStatusLabel() }}</x-badge>
|
|
<x-badge tone="amber">{{ $source->reviewStatusLabel() }}</x-badge>
|
|
</div>
|
|
<p class="mt-2 text-slate-600 dark:text-slate-400">{{ $source->original_name }} | {{ number_format($source->size / 1024, 1) }} KB | {{ $source->uploaded_at?->format('M j, Y g:i A') }}</p>
|
|
@if ($source->externalProfileImport)
|
|
<p class="mt-1 text-slate-600 dark:text-slate-400">Linked summary: {{ $source->externalProfileImport->platform }} {{ $source->externalProfileImport->external_id ? '#'.$source->externalProfileImport->external_id : '' }}</p>
|
|
@endif
|
|
@if ($source->provider_notes)
|
|
<p class="mt-2 whitespace-pre-line text-slate-700 dark:text-slate-300">{{ $source->provider_notes }}</p>
|
|
@endif
|
|
@if ($source->parse_warnings)
|
|
<div class="mt-3 rounded-md border border-amber-200 bg-amber-50 p-3 text-amber-900 dark:border-amber-900 dark:bg-amber-950/40 dark:text-amber-100">
|
|
<p class="font-semibold">Parser warnings</p>
|
|
<ul class="mt-1 list-disc space-y-1 pl-5">
|
|
@foreach ($source->parse_warnings as $warning)
|
|
<li>{{ $warning }}</li>
|
|
@endforeach
|
|
</ul>
|
|
</div>
|
|
@endif
|
|
@if ($source->parsed_payload)
|
|
<div class="mt-3 rounded-md border border-slate-200 bg-slate-50 p-3 dark:border-slate-800 dark:bg-slate-950">
|
|
<p class="font-semibold text-slate-950 dark:text-white">Parsed draft</p>
|
|
<dl class="mt-2 grid gap-2 md:grid-cols-2">
|
|
@foreach ($source->parsed_payload as $field => $value)
|
|
<div>
|
|
<dt class="text-xs uppercase text-slate-500">{{ str_replace('_', ' ', $field) }}</dt>
|
|
<dd class="text-slate-700 dark:text-slate-300">
|
|
@if (is_array($value))
|
|
{{ collect($value)->contains(fn ($item) => is_array($item)) ? json_encode($value) : implode(', ', $value) }}
|
|
@else
|
|
{{ $value }}
|
|
@endif
|
|
</dd>
|
|
</div>
|
|
@endforeach
|
|
</dl>
|
|
</div>
|
|
@endif
|
|
<div class="mt-3 flex flex-wrap gap-2">
|
|
<form method="POST" action="{{ route('provider-import-sources.parse', $source) }}">
|
|
@csrf
|
|
<x-secondary-button type="submit">Parse source</x-secondary-button>
|
|
</form>
|
|
@if ($source->parse_status === 'parsed')
|
|
<form method="POST" action="{{ route('provider-import-sources.approve', $source) }}" class="flex flex-wrap items-center gap-2">
|
|
@csrf
|
|
<select name="visibility" class="rounded-md border-slate-300 bg-white text-sm text-slate-950 shadow-sm focus:border-sky-500 focus:ring-sky-500 dark:border-slate-700 dark:bg-slate-950 dark:text-slate-100">
|
|
@foreach (\App\Models\ExternalProfileImport::VISIBILITIES as $value => $label)
|
|
<option value="{{ $value }}" @selected($value === 'private')>{{ $label }}</option>
|
|
@endforeach
|
|
</select>
|
|
<input type="text" name="notes" placeholder="Optional private approval note" class="rounded-md border-slate-300 bg-white text-sm text-slate-950 shadow-sm focus:border-sky-500 focus:ring-sky-500 dark:border-slate-700 dark:bg-slate-950 dark:text-slate-100">
|
|
<x-primary-button>Approve draft</x-primary-button>
|
|
</form>
|
|
@endif
|
|
</div>
|
|
</div>
|
|
@empty
|
|
<p class="mt-2 text-sm text-slate-600 dark:text-slate-400">No raw import sources have been uploaded yet.</p>
|
|
@endforelse
|
|
</div>
|
|
</section>
|
|
<section class="tse-panel p-6">
|
|
<h3 class="font-semibold text-slate-950 dark:text-white">Saved imported-history records</h3>
|
|
@forelse ($profile->externalImports as $import)
|
|
<div class="mt-4 rounded-md border border-slate-200 p-4 dark:border-slate-800">
|
|
<div class="flex flex-wrap items-center gap-2">
|
|
<p class="font-semibold text-slate-950 dark:text-white">{{ $import->platform }} {{ $import->external_id ? '#'.$import->external_id : '' }}</p>
|
|
<x-badge tone="amber">{{ \App\Models\ExternalProfileImport::VERIFICATION_STATUSES[$import->verification_status] ?? $import->verification_status }}</x-badge>
|
|
<x-badge tone="slate">{{ \App\Models\ExternalProfileImport::VISIBILITIES[$import->visibility] ?? $import->visibility }}</x-badge>
|
|
</div>
|
|
<p class="mt-2 text-sm text-slate-600 dark:text-slate-400">Rating {{ $import->rating ?? 'n/a' }} | Reviews {{ $import->review_count ?? 'n/a' }} | Completed {{ $import->completed_jobs ?? 'n/a' }}</p>
|
|
@if ($import->operational_metrics)
|
|
<p class="mt-1 text-sm text-slate-600 dark:text-slate-400">
|
|
Clients {{ $import->operational_metrics['client_count'] ?? 'n/a' }}
|
|
| On-time {{ $import->operational_metrics['on_time_rate'] ?? 'n/a' }}%
|
|
| Backout {{ $import->operational_metrics['backout_rate'] ?? 'n/a' }}%
|
|
</p>
|
|
@endif
|
|
@if ($import->background_check_status || $import->drug_test_status)
|
|
<div class="mt-3 grid gap-2 md:grid-cols-2">
|
|
@if ($import->background_check_status)
|
|
<div class="rounded-md border border-emerald-200 bg-emerald-50 p-3 text-sm text-emerald-950 dark:border-emerald-900 dark:bg-emerald-950/40 dark:text-emerald-100">
|
|
<p class="font-semibold">Background check</p>
|
|
<p class="mt-1">{{ ucfirst($import->background_check_status) }}{{ $import->background_check_date ? ' on '.$import->background_check_date : '' }}</p>
|
|
</div>
|
|
@endif
|
|
@if ($import->drug_test_status)
|
|
<div class="rounded-md border border-emerald-200 bg-emerald-50 p-3 text-sm text-emerald-950 dark:border-emerald-900 dark:bg-emerald-950/40 dark:text-emerald-100">
|
|
<p class="font-semibold">Drug test</p>
|
|
<p class="mt-1">{{ ucfirst($import->drug_test_status) }}{{ $import->drug_test_date ? ' on '.$import->drug_test_date : '' }}</p>
|
|
</div>
|
|
@endif
|
|
</div>
|
|
@endif
|
|
@if ($import->work_categories)
|
|
<div class="mt-2 flex flex-wrap gap-2">
|
|
@foreach ($import->work_categories as $category)
|
|
<x-badge tone="sky">{{ $category }}</x-badge>
|
|
@endforeach
|
|
</div>
|
|
@endif
|
|
@if ($import->workHistoryEntries->isNotEmpty())
|
|
<div class="mt-4 rounded-md border border-slate-200 bg-slate-50 p-3 dark:border-slate-800 dark:bg-slate-950">
|
|
<div class="flex flex-col gap-2 sm:flex-row sm:items-center sm:justify-between">
|
|
<div>
|
|
<p class="font-semibold text-slate-950 dark:text-white">External work history</p>
|
|
<p class="mt-1 text-sm text-slate-600 dark:text-slate-400">{{ $import->workHistoryEntries->count() }} private imported job rows. Customer names and work-order links stay private here.</p>
|
|
</div>
|
|
<x-badge tone="amber">Private proof</x-badge>
|
|
</div>
|
|
<div class="mt-3 overflow-x-auto">
|
|
<table class="min-w-full text-left text-sm">
|
|
<thead class="text-xs uppercase text-slate-500 dark:text-slate-400">
|
|
<tr>
|
|
<th class="py-2 pr-4">Date</th>
|
|
<th class="py-2 pr-4">Service</th>
|
|
<th class="py-2 pr-4">Customer</th>
|
|
<th class="py-2 pr-4">Type</th>
|
|
<th class="py-2 pr-4">Location</th>
|
|
<th class="py-2 pr-4">Rating</th>
|
|
<th class="py-2 pr-4">Status</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody class="divide-y divide-slate-200 dark:divide-slate-800">
|
|
@foreach ($import->workHistoryEntries->sortByDesc('performed_on')->take(8) as $entry)
|
|
<tr>
|
|
<td class="py-2 pr-4 text-slate-600 dark:text-slate-400">{{ $entry->performed_on?->format('M j, Y') ?? 'n/a' }}</td>
|
|
<td class="py-2 pr-4 text-slate-800 dark:text-slate-200">{{ \Illuminate\Support\Str::limit($entry->service_title, 72) }}</td>
|
|
<td class="py-2 pr-4 text-slate-600 dark:text-slate-400">{{ $entry->customer_name ?? 'n/a' }}</td>
|
|
<td class="py-2 pr-4 text-slate-600 dark:text-slate-400">{{ $entry->work_type ?? 'n/a' }}</td>
|
|
<td class="py-2 pr-4 text-slate-600 dark:text-slate-400">{{ $entry->location ?? 'n/a' }}</td>
|
|
<td class="py-2 pr-4 text-slate-600 dark:text-slate-400">{{ $entry->rating ?? 'n/a' }}</td>
|
|
<td class="py-2 pr-4 text-slate-600 dark:text-slate-400">{{ $entry->status ?? 'n/a' }}</td>
|
|
</tr>
|
|
@endforeach
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
</div>
|
|
@endif
|
|
<x-attachments :attachments="$import->attachments" />
|
|
<x-attachment-form type="external_profile_import" :id="$import->id" kind="import_proof" />
|
|
</div>
|
|
@empty
|
|
<p class="mt-2 text-sm text-slate-600 dark:text-slate-400">No imported-history records yet.</p>
|
|
@endforelse
|
|
</section>
|
|
@endif
|
|
</div>
|
|
</x-app-layout>
|