Phase 8 and 9 marketplace matching

This commit is contained in:
Codex
2026-07-10 14:27:51 -05:00
parent 5009269907
commit 24f73084fa
21 changed files with 778 additions and 50 deletions
+22
View File
@@ -4,6 +4,7 @@
$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>
@@ -22,7 +23,28 @@
<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." />
+29
View File
@@ -27,6 +27,24 @@
<label for="skill" class="block text-sm font-medium text-slate-800 dark:text-slate-200">Skill</label>
<input id="skill" name="skill" value="{{ $filters['skill'] ?? '' }}" placeholder="POS, network, cabling" 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">
</div>
<div>
<label for="technician_level" class="block text-sm font-medium text-slate-800 dark:text-slate-200">Technician level</label>
<select id="technician_level" name="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">
<option value="">Any level</option>
@foreach ($technicianLevels as $level => $definition)
<option value="{{ $level }}" @selected((int) ($filters['technician_level'] ?? 0) === $level)>{{ $definition['name'] }}</option>
@endforeach
</select>
</div>
<div>
<label for="taxonomy_term_id" class="block text-sm font-medium text-slate-800 dark:text-slate-200">Tag</label>
<select id="taxonomy_term_id" name="taxonomy_term_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="">Any tag</option>
@foreach ($taxonomyTerms as $term)
<option value="{{ $term->id }}" @selected((int) ($filters['taxonomy_term_id'] ?? 0) === $term->id)>{{ $term->name }} ({{ str_replace('_', ' ', $term->type) }})</option>
@endforeach
</select>
</div>
<div>
<label for="insurance" class="block text-sm font-medium text-slate-800 dark:text-slate-200">Insurance</label>
<input id="insurance" name="insurance" value="{{ $filters['insurance'] ?? '' }}" placeholder="Insured, COI available" 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">
@@ -65,6 +83,9 @@
@if (request()->boolean('public_contact'))
<x-badge tone="emerald">Public contact</x-badge>
@endif
@if (! empty($filters['technician_level']))
<x-badge tone="sky">Level: {{ $technicianLevels[(int) $filters['technician_level']]['short_name'] ?? $filters['technician_level'] }}</x-badge>
@endif
</div>
</div>
@@ -90,6 +111,7 @@
@if ($profile->service_area)
<x-badge tone="slate">{{ $profile->service_area }}</x-badge>
@endif
<x-badge tone="sky">{{ $profile->technicianLevel()['short_name'] }}</x-badge>
@if ($profile->public_contact)
<x-badge tone="emerald">Public contact</x-badge>
@endif
@@ -107,6 +129,13 @@
@if ($profile->skills)
<p class="mt-4 text-sm leading-6 text-slate-600 dark:text-slate-400">{{ \Illuminate\Support\Str::limit($profile->skills, 220) }}</p>
@endif
@if ($profile->taxonomyTerms->isNotEmpty())
<div class="mt-3 flex flex-wrap gap-2">
@foreach ($profile->taxonomyTerms->take(8) as $term)
<x-badge tone="slate">{{ $term->name }}</x-badge>
@endforeach
</div>
@endif
</a>
@empty
<div class="tse-panel p-8 text-center lg:col-span-2">
+16
View File
@@ -18,6 +18,12 @@
@if ($profile->insurance_status)
<x-badge tone="sky">{{ $profile->insurance_status }}</x-badge>
@endif
<x-badge tone="sky">{{ $profile->technicianLevel()['name'] }}</x-badge>
</div>
<div class="mt-4 rounded-md border border-sky-200 bg-sky-50 p-4 text-sm text-sky-950 dark:border-sky-900 dark:bg-sky-950/40 dark:text-sky-100">
<p class="font-semibold">{{ $profile->technicianLevel()['short_name'] }}</p>
<p class="mt-1">{{ $profile->technicianLevel()['description'] }}</p>
<p class="mt-2 text-xs">Level and tags are self-declared unless supported by buyer endorsements, completed TSE work, certification proof, or admin verification.</p>
</div>
@if ($profile->visible('bio'))
@@ -25,6 +31,16 @@
@endif
<dl class="mt-6 grid gap-4 md:grid-cols-2">
<div>
<dt class="text-sm text-slate-500 dark:text-slate-400">Tags and evidence</dt>
<dd class="mt-2 flex flex-wrap gap-2">
@forelse ($profile->taxonomyTerms as $term)
<x-badge tone="slate">{{ $term->name }}{{ $term->pivot?->evidence_source ? ' | '.str_replace('_', ' ', $term->pivot->evidence_source) : '' }}</x-badge>
@empty
<span class="text-sm text-slate-600 dark:text-slate-400">No taxonomy tags yet.</span>
@endforelse
</dd>
</div>
@if ($profile->visible('services'))
<div>
<dt class="text-sm text-slate-500 dark:text-slate-400">Services</dt>