From 74eff802f406b02c09bbd929654ff1e1dcade4b2 Mon Sep 17 00:00:00 2001 From: Codex Date: Fri, 10 Jul 2026 18:51:11 -0500 Subject: [PATCH] Polish marketplace UX --- CHANGELOG.md | 2 + docs/FORWARD_PHASE_PLAN.md | 18 ++- docs/ROADMAP.md | 19 ++- resources/css/app.css | 8 ++ resources/views/buyers/index.blade.php | 17 +-- .../views/components/empty-state.blade.php | 13 ++ resources/views/jobs/index.blade.php | 129 ++++++++++++++---- resources/views/layouts/navigation.blade.php | 4 +- resources/views/providers/index.blade.php | 21 ++- resources/views/work-orders/index.blade.php | 101 ++++++++++---- resources/views/work-orders/print.blade.php | 39 +++++- 11 files changed, 279 insertions(+), 92 deletions(-) create mode 100644 resources/views/components/empty-state.blade.php diff --git a/CHANGELOG.md b/CHANGELOG.md index 36c79f1..888cbf3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -23,6 +23,7 @@ This project uses Git as the primary rollback trail. The `.old` convention is re - Added Phase 11A mobile-safe API actions with versioned work-order endpoints, token ability checks, participant authorization, checklist/status/message/evidence/contact/running-late/schedule/dispute actions, mobile event audit records, optional geolocation evidence, API throttling, and baseline security headers. - Added Phase 12A/13A notification and admin governance controls with notification preference UI, event-level notification gating, moderation reports for profiles/jobs/attachments, reusable audit logs, and expanded admin triage panels. - Added Phase 14A deployment/scaling hardening with high-use database indexes, backup and health-check scripts, optional pre-update backups, and production notes for queue workers, scheduler, PHP-FPM, Redis, storage scaling, log rotation, and database scaling. +- Added Phase 15A UX/accessibility polish with shared empty states and controls, labeled job filters, active filter badges, mobile job cards, dense work-order table, direct print access, mobile navigation accessibility, and improved work-order print packets. - Created the Laravel Provider Exchange prototype with Breeze authentication, seeded demo users, and role support for admins, providers, buyers, and hybrid accounts. - Added provider and buyer profile management with service areas, profile details, and external profile snapshot records. - Added social posts, buyer job posts, provider quotes, quote revisions, quote decline flow, and buyer quote acceptance. @@ -47,6 +48,7 @@ This project uses Git as the primary rollback trail. The `.old` convention is re - `php artisan test` passed under Windows PHP with 55 tests and 285 assertions after Phase 11A mobile API and security hardening. - `php artisan test` passed under Windows PHP with 57 tests and 301 assertions after Phase 12A/13A notification preferences and admin governance. - `php artisan migrate:fresh --seed --env=testing`, `php artisan test` with 57 tests and 301 assertions, `npm run build`, and `bash scripts/health-check.sh` passed after Phase 14A deployment/scaling hardening. +- `php artisan test` with 57 tests and 301 assertions and `npm run build` passed after Phase 15A UX/accessibility polish. - `npm run build` passed with a production Vite build. - `https://christit.com/tse/login` loads publicly. - Seeded admin login succeeds on `https://christit.com/tse` and reaches `/tse/dashboard`. diff --git a/docs/FORWARD_PHASE_PLAN.md b/docs/FORWARD_PHASE_PLAN.md index f54ec68..f5b641b 100644 --- a/docs/FORWARD_PHASE_PLAN.md +++ b/docs/FORWARD_PHASE_PLAN.md @@ -759,12 +759,22 @@ Provider-protection rules: - Verbose buyer instructions should be collapsible and structured. - The system should guide buyers toward clear jobs instead of rewarding catch-all text dumps. +Implementation status: + +- Completed first implementation pass. +- Added shared Blade patterns for empty states, form controls, and secondary actions. +- Refined the jobs board with labeled filters, active filter badges, a dense desktop table, and mobile card alternatives. +- Refined provider and buyer directory filters with shared control styling and reusable empty states. +- Refined the work-order list with a dense desktop table, mobile cards, checklist/status badges, and direct print access. +- Added accessibility state/controls to the mobile navigation menu button. +- Improved work-order print packets with a summary strip, generated timestamp, scope-safeguard notice, and print page-break handling. + ## Recommended Immediate Sequence -1. Phase 15A: UX polish and accessibility pass. -2. Cached rating/reputation aggregates after slow pages are measured. -3. Future mobile/API expansion after native app requirements are clearer. -4. Future email/push delivery implementation after the sender and push providers are explicitly selected. +1. Cached rating/reputation aggregates after slow pages are measured. +2. Future mobile/API expansion after native app requirements are clearer. +3. Future email/push delivery implementation after the sender and push providers are explicitly selected. +4. Deeper admin operations after real moderation and support workflows emerge. ## Key Design Commitments diff --git a/docs/ROADMAP.md b/docs/ROADMAP.md index 5488c37..c00bdf5 100644 --- a/docs/ROADMAP.md +++ b/docs/ROADMAP.md @@ -61,11 +61,11 @@ Provider Exchange is a Laravel application for a provider-centered field-service ## Phase Checkpoint -Phases 1-14A have been implemented locally through deployment/scaling hardening. The next active planning block is: +Phases 1-15A have been implemented locally through UX/accessibility polish. The next active planning block is: -1. UX/accessibility polish. -2. Cached reputation aggregates after real slow pages are measured. -3. Future email/push delivery and native-app API expansion once providers are selected. +1. Cached reputation aggregates after real slow pages are measured. +2. Future email/push delivery and native-app API expansion once providers are selected. +3. Deeper operations/admin controls after real moderation and support workflows emerge. Work-order safeguards to carry into the next implementation passes: @@ -166,6 +166,15 @@ Phase 14A deployment/scaling hardening completed: - Documented queue workers, scheduler, PHP-FPM expectations, Redis migration, backups, health checks, log rotation, storage scaling, and database scaling. - Kept cached reputation aggregates deferred until real traffic shows which pages need them. +Phase 15A UX/accessibility polish completed: + +- Added shared form-control, secondary-action, and empty-state patterns. +- Improved the jobs board with a page header, labeled filters, active filter badges, desktop table, and mobile card alternative. +- Improved provider and buyer directory filters with shared control styling and reusable empty states. +- Improved work-order listing with a dense desktop table, mobile cards, checklist/status badges, and direct print access. +- Added accessible mobile-navigation button state and controls. +- Improved work-order print packets with a summary strip, generated timestamp, scope-safeguard notice, and print page-break handling. + Available-work safeguards to carry into directory and job-list phases: - Available jobs should expose pay type, provider terms, schedule type, work type, rough location, buyer reliability, support/contact certification, scope clarity status, and request/quote count. @@ -173,7 +182,7 @@ Available-work safeguards to carry into directory and job-list phases: - Risk badges should identify broad scope, missing contact backup, missing deliverables, missing required tools, compressed schedules, and unclear closeout requirements. - Keep the primary filter bar compact: work category, coverage/radius or remote mode, keyword search, reset, and saved/advanced filters. - Model work categories as nested taxonomy records with broad families and specific specialties. -- Keep every filter and table action visibly labeled or accessible to screen readers. +- Keep every filter and table action visibly labeled or accessible to screen readers. Shared Phase 15A patterns now cover the primary jobs, provider, buyer, and work-order listing pages. The July 10, 2026 Field Nation product review is captured in `docs/PLATFORM_RESEARCH.md` and should inform Phases 5, 8, 9, and 10 without copying private third-party work-order data into this repository. diff --git a/resources/css/app.css b/resources/css/app.css index 31a4e14..29c3875 100644 --- a/resources/css/app.css +++ b/resources/css/app.css @@ -28,4 +28,12 @@ .tse-muted { @apply text-slate-600 dark:text-slate-400; } + + .tse-control { + @apply 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; + } + + .tse-secondary-action { + @apply inline-flex items-center rounded-md border border-slate-300 bg-white px-4 py-2 text-sm font-semibold text-slate-700 shadow-sm hover:bg-slate-50 focus:outline-none focus:ring-2 focus:ring-sky-500 focus:ring-offset-2 dark:border-slate-700 dark:bg-slate-900 dark:text-slate-200 dark:hover:bg-slate-800; + } } diff --git a/resources/views/buyers/index.blade.php b/resources/views/buyers/index.blade.php index 2e79f85..5269787 100644 --- a/resources/views/buyers/index.blade.php +++ b/resources/views/buyers/index.blade.php @@ -17,23 +17,23 @@
- +
- +
- +
- +
- @@ -47,7 +47,7 @@
Search - Reset + Reset
@@ -105,10 +105,7 @@ @endif @empty -
-

No buyers matched this search.

-

Try removing one filter or broadening the hiring region.

-
+ @endforelse diff --git a/resources/views/components/empty-state.blade.php b/resources/views/components/empty-state.blade.php new file mode 100644 index 0000000..92a4e8d --- /dev/null +++ b/resources/views/components/empty-state.blade.php @@ -0,0 +1,13 @@ +@props(['title', 'description' => null]) + +
merge(['class' => 'tse-panel p-8 text-center']) }}> +

{{ $title }}

+ @if ($description) +

{{ $description }}

+ @endif + @if (trim($slot) !== '') +
+ {{ $slot }} +
+ @endif +
diff --git a/resources/views/jobs/index.blade.php b/resources/views/jobs/index.blade.php index 899c45a..09337d6 100644 --- a/resources/views/jobs/index.blade.php +++ b/resources/views/jobs/index.blade.php @@ -1,33 +1,60 @@ -

Jobs

-
-
+ + + @auth + @role('buyer') + Post job + @endrole + @endauth + + + +
+
- - +
+
+ + - - - + +
+
+ + +
+
+ + +
+
+ + +
Filter - Reset + Reset
- @auth @role('buyer')Post job@endrole @endauth -
+ +
+

+ Showing {{ $jobs->firstItem() ?? 0 }}-{{ $jobs->lastItem() ?? 0 }} of {{ $jobs->total() }} jobs. +

+
+ @foreach (['q' => 'Search', 'scope_clarity' => 'Clarity', 'status' => 'Status'] as $key => $label) + @if (request($key)) + {{ $label }}: {{ str_replace('_', ' ', request($key)) }} + @endif + @endforeach + @if (request()->boolean('support_certified')) + Support certified + @endif + @if (request()->boolean('remote_only')) + Remote eligible + @endif + @if (request()->boolean('hide_risky')) + Risk hidden + @endif +
+
+ + + + + {{ $jobs->links() }}
diff --git a/resources/views/layouts/navigation.blade.php b/resources/views/layouts/navigation.blade.php index d02e7f0..c343ff0 100644 --- a/resources/views/layouts/navigation.blade.php +++ b/resources/views/layouts/navigation.blade.php @@ -102,7 +102,7 @@
-
-