From 292cda7ffc7effde19b968b334b215e8ad802f16 Mon Sep 17 00:00:00 2001 From: Mark Gregory Date: Fri, 12 Jun 2026 11:32:47 +0100 Subject: [PATCH] FIXING TICKET SAVE --- .../Controllers/TicketStoreController.php | 66 +++++++++ .../Providers/HelpdeskServiceProvider.php | 46 +++--- .../views/livewire/ticket-create.blade.php | 133 +++++++++++++++--- Modules/Helpdesk/Routes/web.php | 2 + Modules/Helpdesk/changelog.yaml | 9 ++ Modules/Helpdesk/module.json | 2 +- composer.json | 4 + 7 files changed, 228 insertions(+), 34 deletions(-) create mode 100644 Modules/Helpdesk/Http/Controllers/TicketStoreController.php mode change 100755 => 100644 Modules/Helpdesk/changelog.yaml diff --git a/Modules/Helpdesk/Http/Controllers/TicketStoreController.php b/Modules/Helpdesk/Http/Controllers/TicketStoreController.php new file mode 100644 index 00000000..6daadb67 --- /dev/null +++ b/Modules/Helpdesk/Http/Controllers/TicketStoreController.php @@ -0,0 +1,66 @@ +validate([ + 'company_id' => ['nullable', 'integer'], + 'subject' => ['required', 'string', 'max:200'], + 'body' => ['required', 'string', 'min:10'], + 'priority_id' => ['required', 'integer', Rule::exists('helpdesk_priorities', 'id')], + 'category_id' => ['nullable', 'integer', Rule::exists('helpdesk_categories', 'id')], + 'project_id' => ['nullable', 'integer', Rule::exists('helpdesk_projects', 'id')], + 'team_id' => ['nullable', 'integer', Rule::exists('helpdesk_teams', 'id')], + 'due_at' => ['nullable', 'date'], + 'attachments' => ['nullable', 'array'], + 'attachments.*' => ['file', 'max:' . $maxUploadKilobytes, 'mimes:' . implode(',', $allowedMimes)], + ]); + + $user = Auth::user(); + + abort_if($user === null, 403); + + $uploadedFiles = $request->file('attachments', []); + $uploadedFiles = is_array($uploadedFiles) ? $uploadedFiles : [$uploadedFiles]; + + $ticket = $tickets->create($user, [ + 'company_id' => $validated['company_id'] ?? null, + 'subject' => $validated['subject'], + 'body' => $validated['body'], + 'priority_id' => $validated['priority_id'], + 'category_id' => $validated['category_id'] ?? null, + 'project_id' => $validated['project_id'] ?? null, + 'team_id' => $validated['team_id'] ?? null, + 'due_at' => $validated['due_at'] ?? null, + ], $uploadedFiles); + + return redirect() + ->route('helpdesk.tickets.index') + ->with('success', 'Ticket ' . $ticket->reference . ' has been created.'); + } +} diff --git a/Modules/Helpdesk/Providers/HelpdeskServiceProvider.php b/Modules/Helpdesk/Providers/HelpdeskServiceProvider.php index 380aaaa1..55b99a7b 100644 --- a/Modules/Helpdesk/Providers/HelpdeskServiceProvider.php +++ b/Modules/Helpdesk/Providers/HelpdeskServiceProvider.php @@ -8,7 +8,6 @@ use Illuminate\Support\Facades\Blade; use Illuminate\Support\Facades\Config; use Illuminate\Support\Facades\File; use Illuminate\Support\Facades\Gate; -use Illuminate\Support\Facades\Route; use Illuminate\Support\ServiceProvider; use Livewire\Livewire; use Modules\Helpdesk\Livewire\HelpdeskDashboardWidget; @@ -25,16 +24,22 @@ final class HelpdeskServiceProvider extends ServiceProvider { /** * Module name. + * + * @var string */ protected string $moduleName = 'Helpdesk'; /** * Lowercase module name. + * + * @var string */ protected string $moduleNameLower = 'helpdesk'; /** * Register module services. + * + * @return void */ public function register(): void { @@ -48,6 +53,8 @@ final class HelpdeskServiceProvider extends ServiceProvider /** * Bootstrap module services. + * + * @return void */ public function boot(): void { @@ -60,17 +67,12 @@ final class HelpdeskServiceProvider extends ServiceProvider $this->registerPolicies(); $this->loadMigrationsFrom(module_path(ModuleInfo::name(), 'Database/Migrations')); - Livewire::setUpdateRoute(function ($handle) { - - return Route::post('/livewire-cfc83872/update', $handle) - - ->middleware('web'); - - }); } /** * Register Livewire components used by the module. + * + * @return void */ protected function registerLivewireComponents(): void { @@ -84,6 +86,8 @@ final class HelpdeskServiceProvider extends ServiceProvider /** * Register policies and gates. + * + * @return void */ protected function registerPolicies(): void { @@ -95,6 +99,8 @@ final class HelpdeskServiceProvider extends ServiceProvider /** * Register helpers. + * + * @return void */ protected function registerHelpers(): void { @@ -105,6 +111,8 @@ final class HelpdeskServiceProvider extends ServiceProvider /** * Dynamically register console commands. + * + * @return void */ protected function registerCommands(): void { @@ -119,7 +127,7 @@ final class HelpdeskServiceProvider extends ServiceProvider } $commands = collect(File::allFiles($commandPath)) - ->map(fn ($file): string => 'Modules\\'.$this->moduleName.'\\Console\\'.$file->getFilenameWithoutExtension()) + ->map(fn ($file): string => 'Modules\\' . $this->moduleName . '\\Console\\' . $file->getFilenameWithoutExtension()) ->filter(fn (string $class): bool => class_exists($class)) ->values() ->all(); @@ -129,38 +137,44 @@ final class HelpdeskServiceProvider extends ServiceProvider /** * Register config publishing. + * + * @return void */ protected function registerConfig(): void { $this->publishes([ - module_path(ModuleInfo::name(), 'Config/config.php') => config_path(ModuleInfo::nameLower().'.php'), + module_path(ModuleInfo::name(), 'Config/config.php') => config_path(ModuleInfo::nameLower() . '.php'), ], 'config'); } /** * Register module views. + * + * @return void */ protected function registerViews(): void { - $viewPath = resource_path('views/modules/'.ModuleInfo::nameLower()); + $viewPath = resource_path('views/modules/' . ModuleInfo::nameLower()); $sourcePath = module_path(ModuleInfo::name(), 'Resources/views'); $this->publishes([ $sourcePath => $viewPath, - ], ['views', ModuleInfo::nameLower().'-module-views']); + ], ['views', ModuleInfo::nameLower() . '-module-views']); $this->loadViewsFrom(array_merge($this->getPublishableViewPaths(), [$sourcePath]), ModuleInfo::nameLower()); Blade::componentNamespace('Modules\Helpdesk\View\Components', 'helpdesk'); - Blade::anonymousComponentPath($sourcePath.'/components', 'helpdesk'); + Blade::anonymousComponentPath($sourcePath . '/components', 'helpdesk'); } /** * Register translations. + * + * @return void */ protected function registerTranslations(): void { - $langPath = resource_path('lang/modules/'.ModuleInfo::nameLower()); + $langPath = resource_path('lang/modules/' . ModuleInfo::nameLower()); if (is_dir($langPath)) { $this->loadTranslationsFrom($langPath, ModuleInfo::nameLower()); @@ -181,8 +195,8 @@ final class HelpdeskServiceProvider extends ServiceProvider $paths = []; foreach (Config::get('view.paths') as $path) { - if (is_dir($path.'/modules/'.ModuleInfo::nameLower())) { - $paths[] = $path.'/modules/'.ModuleInfo::nameLower(); + if (is_dir($path . '/modules/' . ModuleInfo::nameLower())) { + $paths[] = $path . '/modules/' . ModuleInfo::nameLower(); } } diff --git a/Modules/Helpdesk/Resources/views/livewire/ticket-create.blade.php b/Modules/Helpdesk/Resources/views/livewire/ticket-create.blade.php index 3afbe5e5..2c06fe46 100644 --- a/Modules/Helpdesk/Resources/views/livewire/ticket-create.blade.php +++ b/Modules/Helpdesk/Resources/views/livewire/ticket-create.blade.php @@ -5,7 +5,30 @@ 'subtitle' => 'Raise a new support request with priority, project, category, team and full details.', ]) -
+ + @csrf +

Ticket details

@@ -15,17 +38,30 @@
- + @error('subject')

{{ $message }}

@enderror
@if($companies->isNotEmpty())
- @foreach ($companies as $company) - + @endforeach @error('company_id')

{{ $message }}

@enderror @@ -34,10 +70,17 @@
- @foreach ($priorities as $priority) - + @endforeach @error('priority_id')

{{ $message }}

@enderror @@ -45,10 +88,16 @@
- @foreach ($categories as $category) - + @endforeach @error('category_id')

{{ $message }}

@enderror @@ -56,10 +105,16 @@
- @foreach ($projects as $project) - + @endforeach @error('project_id')

{{ $message }}

@enderror @@ -67,10 +122,16 @@
- @foreach ($teams as $team) - + @endforeach @error('team_id')

{{ $message }}

@enderror @@ -78,25 +139,63 @@
- + @error('due_at')

{{ $message }}

@enderror
- + + +
+
+ + + + + + + + +
+ +
+
+ + + + @error('body')

{{ $message }}

@enderror
- + @error('attachments')

{{ $message }}

@enderror @error('attachments.*')

{{ $message }}

@enderror
- Cancel - + Cancel +
diff --git a/Modules/Helpdesk/Routes/web.php b/Modules/Helpdesk/Routes/web.php index af919dad..40b20763 100644 --- a/Modules/Helpdesk/Routes/web.php +++ b/Modules/Helpdesk/Routes/web.php @@ -4,6 +4,7 @@ declare(strict_types=1); use Illuminate\Support\Facades\Route; use Modules\Helpdesk\Http\Controllers\HelpdeskController; +use Modules\Helpdesk\Http\Controllers\TicketStoreController; use Modules\Helpdesk\Livewire\KanbanBoard; use Modules\Helpdesk\Livewire\SettingsManager; use Modules\Helpdesk\Livewire\TicketCreate; @@ -17,4 +18,5 @@ Route::get('/kanban', KanbanBoard::class)->name('kanban'); Route::get('/tickets', TicketIndex::class)->name('tickets.index'); Route::get('/tickets/create', TicketCreate::class)->name('tickets.create'); +Route::post('/tickets', TicketStoreController::class)->name('tickets.store'); Route::get('/tickets/{ticket}', TicketShow::class)->name('tickets.show'); diff --git a/Modules/Helpdesk/changelog.yaml b/Modules/Helpdesk/changelog.yaml old mode 100755 new mode 100644 index d1e8ba6b..47480b36 --- a/Modules/Helpdesk/changelog.yaml +++ b/Modules/Helpdesk/changelog.yaml @@ -28,3 +28,12 @@ versions: - Changed ticket create save to validate all fields and return to the tickets index after creation to avoid route-model redirect issues. - Added a root layout replacement containing the Support sidebar menu and Livewire update endpoint configuration. - Kept module.json version in sync with changelog.yaml. + + "1.0.5": + changed: + - Reworked ticket creation to use a normal HTTP POST route instead of the Livewire update endpoint, preventing proxy or hashed Livewire update-route 404s from blocking ticket creation. + - Added a dedicated TicketStoreController for standard ticket creation validation, attachments and redirects. + - Changed the ticket-create Blade form to use real form field names, CSRF protection and a non-Livewire rich HTML editor payload. + - Removed the module-level Livewire update route override so the Helpdesk module no longer changes the application's global Livewire endpoint. + - Kept module.json version in sync with changelog.yaml. + diff --git a/Modules/Helpdesk/module.json b/Modules/Helpdesk/module.json index e592e5ba..c399ce32 100644 --- a/Modules/Helpdesk/module.json +++ b/Modules/Helpdesk/module.json @@ -13,5 +13,5 @@ "Modules\\Helpdesk\\Providers\\HelpdeskServiceProvider" ], "files": [], - "version": "1.0.4" + "version": "1.0.5" } diff --git a/composer.json b/composer.json index da5a00c4..31a9a8eb 100644 --- a/composer.json +++ b/composer.json @@ -103,6 +103,10 @@ "@php artisan optimize:clear", "@php artisan octane:reload" ], + "restart": [ + "@php artisan optimize:clear", + "@php artisan octane:reload" + ], "dev": [ "Composer\\Config::disableProcessTimeout", "npx concurrently -c \"#93c5fd,#c4b5fd,#fb7185,#fdba74\" \"php artisan serve --host=localhost\" \"php artisan queue:listen --tries=1 --timeout=0\" \"php artisan pail --timeout=0\" \"npm run dev\" --names=server,queue,logs,vite --kill-others"