feat: supplier modal wizard, pipeline delete, sidebar cleanup

- Replace two-tab supplier selector with two-step wizard (method select → suppliers → summary)
- Add per-item channel picker (Email / WhatsApp / Both) in By Item mode
- Add confirmation summary step before submitting By Item supplier assignments
- Add type-to-confirm delete on pipeline list rows
- Redirect purchase.requests.index to pipeline (same data, single entry point)
- Remove Purchase Requests from sidebar nav
- Add edit-request-modal, supplier-invite-list components
- Add address coordinates migration for settings_locations

Co-Authored-By: Claude Sonnet 4.6 <[email protected]>
This commit is contained in:
ghassanandClaude Sonnet 4.6 committed 2026-05-25 17:08:58 +03:00
1 parent dd924904c5
commit d8cab94bcb
18 files changed
+1943 -840

No files matched your search

@@ -1,6 +1,18 @@
@php
$hasErrors = $errors->any();
$mprProjects = \App\Models\Settings\ProjectSetting::active()->with(['locations' => function($q){ $q->where('is_active', true)->orderBy('name'); }])->orderBy('name')->get();
$hasErrors = $errors->any();
$mprProjects = \App\Models\Settings\ProjectSetting::active()
->with(['locations' => function ($q) { $q->where('is_active', true)->orderBy('name'); }])
->orderBy('name')
->get();
$mprProjectsJson = $mprProjects->map(function ($p) {
return [
'id' => $p->id,
'name' => $p->name,
'locations' => $p->locations->map(function ($l) {
return ['name' => $l->name];
})->values(),
];
})->values();
@endphp
{{-- Trigger button --}}
@@ -242,7 +254,7 @@ document.addEventListener('DOMContentLoaded', function () { mprModalOpen(); });
})();
// Cascading project → location dropdown
var mprProjectsData = @json($mprProjects->map(fn($p) => ['id' => $p->id, 'name' => $p->name, 'locations' => $p->locations->map(fn($l) => ['name' => $l->name])->values()])->values());
var mprProjectsData = @json($mprProjectsJson);
var mprOldLocation = "{{ old('location') }}";
var mprOldProjectName = "{{ old('project_name') }}";