From 27e607199297c2407ac16443b766b749239ca2bb Mon Sep 17 00:00:00 2001 From: Mark Gregory Date: Tue, 25 Aug 2026 17:12:22 +0100 Subject: [PATCH] updated design --- .../Livewire/HelpdeskDashboardWidget.php | 6 +- Modules/Helpdesk/Livewire/KanbanBoard.php | 4 +- Modules/Helpdesk/Livewire/SettingsManager.php | 4 +- Modules/Helpdesk/Livewire/TicketCreate.php | 4 +- Modules/Helpdesk/Livewire/TicketEdit.php | 4 +- Modules/Helpdesk/Livewire/TicketIndex.php | 4 +- Modules/Helpdesk/Livewire/TicketShow.php | 6 +- Modules/Helpdesk/Livewire/TicketTimer.php | 2 +- Modules/Helpdesk/Resources/assets/css/app.css | 2 +- Modules/Helpdesk/vite.config.js | 4 + package.json | 6 +- resources/themes/backend/assets/css/app.css | 15 +- .../helpdesk-settings-simple.blade.php | 49 +++++ .../views/components/layouts/app.blade.php | 7 + .../helpdesk/livewire/kanban-board.blade.php | 172 +++++++++++++++ .../livewire/settings-manager.blade.php | 68 ++++++ .../helpdesk/livewire/ticket-create.blade.php | 76 +++++++ .../helpdesk/livewire/ticket-edit.blade.php | 59 +++++ .../helpdesk/livewire/ticket-index.blade.php | 204 ++++++++++++++++++ .../helpdesk/livewire/ticket-show.blade.php | 62 ++++++ .../helpdesk/livewire/ticket-timer.blade.php | 22 ++ .../backend/views/partials/head.blade.php | 10 + vite.config.js | 17 +- 23 files changed, 770 insertions(+), 37 deletions(-) create mode 100644 resources/themes/backend/views/components/helpdesk-settings-simple.blade.php create mode 100644 resources/themes/backend/views/components/layouts/app.blade.php create mode 100644 resources/themes/backend/views/modules/helpdesk/livewire/kanban-board.blade.php create mode 100644 resources/themes/backend/views/modules/helpdesk/livewire/settings-manager.blade.php create mode 100644 resources/themes/backend/views/modules/helpdesk/livewire/ticket-create.blade.php create mode 100644 resources/themes/backend/views/modules/helpdesk/livewire/ticket-edit.blade.php create mode 100644 resources/themes/backend/views/modules/helpdesk/livewire/ticket-index.blade.php create mode 100644 resources/themes/backend/views/modules/helpdesk/livewire/ticket-show.blade.php create mode 100644 resources/themes/backend/views/modules/helpdesk/livewire/ticket-timer.blade.php diff --git a/Modules/Helpdesk/Livewire/HelpdeskDashboardWidget.php b/Modules/Helpdesk/Livewire/HelpdeskDashboardWidget.php index 3be7987..3b53922 100644 --- a/Modules/Helpdesk/Livewire/HelpdeskDashboardWidget.php +++ b/Modules/Helpdesk/Livewire/HelpdeskDashboardWidget.php @@ -17,9 +17,9 @@ final class HelpdeskDashboardWidget extends Component $user = Auth::user(); $base = Ticket::query(); - if ($user->isHelpdeskAdmin()) { + if ($user->helpdesk_admin ?? false) { // no filter - } elseif ($user->isHelpdeskAgent()) { + } elseif ($user->helpdesk_agent ?? false) { $base->where(function ($q) use ($user) { $q->where('agent_id', $user->id) ->orWhere('user_id', $user->id); @@ -34,7 +34,7 @@ final class HelpdeskDashboardWidget extends Component $closedPercent = $totalCount > 0 ? (int) round(($closedCount / $totalCount) * 100) : 0; $openPercent = $totalCount > 0 ? (int) round(($openCount / $totalCount) * 100) : 0; - return view('helpdesk::livewire.dashboard-widget', [ + return view('modules.helpdesk.livewire.dashboard-widget', [ 'totalCount' => $totalCount, 'openCount' => $openCount, 'closedCount' => $closedCount, diff --git a/Modules/Helpdesk/Livewire/KanbanBoard.php b/Modules/Helpdesk/Livewire/KanbanBoard.php index 212d086..15ab7ba 100644 --- a/Modules/Helpdesk/Livewire/KanbanBoard.php +++ b/Modules/Helpdesk/Livewire/KanbanBoard.php @@ -185,13 +185,13 @@ final class KanbanBoard extends Component ->get(); } - return view('helpdesk::livewire.kanban-board', [ + return view('modules.helpdesk.livewire.kanban-board', [ 'boards' => $boards, 'board' => $board, 'statuses' => $board?->statuses ?? collect(), 'ticketsByStatus' => $this->ticketsByStatus($board), 'refreshNonce' => $this->refreshNonce, - ])->layout('helpdesk::layouts.app.sidebar'); + ])->layout('layouts.app', ['title' => __('Helpdesk Kanban')]); } /** diff --git a/Modules/Helpdesk/Livewire/SettingsManager.php b/Modules/Helpdesk/Livewire/SettingsManager.php index 6cd15fd..0b21945 100644 --- a/Modules/Helpdesk/Livewire/SettingsManager.php +++ b/Modules/Helpdesk/Livewire/SettingsManager.php @@ -699,7 +699,7 @@ final class SettingsManager extends Component public function render(): View { - return view('helpdesk::livewire.settings-manager', [ + return view('modules.helpdesk.livewire.settings-manager', [ 'statuses' => $this->orderedStatuses(), 'priorities' => $this->orderedPriorities(), 'categories' => $this->orderedCategories(), @@ -718,7 +718,7 @@ final class SettingsManager extends Component 'tags' => Tag::query()->orderBy('name')->get(), 'checklistTemplates' => ChecklistTemplate::query()->orderBy('name')->get(), 'colourOptions' => Color::options(), - ])->layout('helpdesk::layouts.app.sidebar'); + ])->layout('layouts.app', ['title' => __('Helpdesk Settings')]); } private function orderedStatuses(): mixed diff --git a/Modules/Helpdesk/Livewire/TicketCreate.php b/Modules/Helpdesk/Livewire/TicketCreate.php index d48bfca..f80648c 100644 --- a/Modules/Helpdesk/Livewire/TicketCreate.php +++ b/Modules/Helpdesk/Livewire/TicketCreate.php @@ -138,7 +138,7 @@ final class TicketCreate extends Component public function render(): View { - return view('helpdesk::livewire.ticket-create', [ + return view('modules.helpdesk.livewire.ticket-create', [ 'boards' => $this->boardOptions(), 'priorities' => $this->priorityOptions(), 'categories' => $this->categoryOptions(), @@ -146,7 +146,7 @@ final class TicketCreate extends Component 'projects' => $this->projectOptions(), 'products' => Product::query()->where('is_active', true)->orderBy('name')->get(), 'tags' => Tag::query()->orderBy('name')->get(), - ])->layout('helpdesk::layouts.app.sidebar'); + ])->layout('layouts.app', ['title' => __('Create Helpdesk Ticket')]); } /** diff --git a/Modules/Helpdesk/Livewire/TicketEdit.php b/Modules/Helpdesk/Livewire/TicketEdit.php index f1c355c..69551f6 100644 --- a/Modules/Helpdesk/Livewire/TicketEdit.php +++ b/Modules/Helpdesk/Livewire/TicketEdit.php @@ -188,7 +188,7 @@ final class TicketEdit extends Component public function render(): View { - return view('helpdesk::livewire.ticket-edit', [ + return view('modules.helpdesk.livewire.ticket-edit', [ 'boards' => KanbanBoard::query()->with('owner:id,name,email')->orderByDesc('is_default')->orderBy('sort_order')->orderBy('name')->get(), 'statuses' => Status::query()->orderBy('sort_order')->orderBy('name')->get(), 'priorities' => Priority::query()->orderBy('sort_order')->orderBy('name')->get(), @@ -198,7 +198,7 @@ final class TicketEdit extends Component 'products' => Product::query()->where('is_active', true)->orderBy('name')->get(), 'tags' => Tag::query()->orderBy('name')->get(), 'agents' => $this->agentOptions(), - ])->layout('helpdesk::layouts.app.sidebar'); + ])->layout('layouts.app', ['title' => __('Edit Helpdesk Ticket')]); } /** diff --git a/Modules/Helpdesk/Livewire/TicketIndex.php b/Modules/Helpdesk/Livewire/TicketIndex.php index 1f5ec24..6da2a10 100644 --- a/Modules/Helpdesk/Livewire/TicketIndex.php +++ b/Modules/Helpdesk/Livewire/TicketIndex.php @@ -101,11 +101,11 @@ final class TicketIndex extends Component public function render(): View { - return view('helpdesk::livewire.ticket-index', [ + return view('modules.helpdesk.livewire.ticket-index', [ 'tickets' => $this->tickets(), 'statuses' => Status::query()->orderBy('sort_order')->get(), 'priorities' => Priority::query()->orderBy('sort_order')->get(), - ])->layout('helpdesk::layouts.app.sidebar'); + ])->layout('layouts.app', ['title' => __('Helpdesk Tickets')]); } private function resetTicketDeletionState(): void diff --git a/Modules/Helpdesk/Livewire/TicketShow.php b/Modules/Helpdesk/Livewire/TicketShow.php index cb81907..4f50039 100644 --- a/Modules/Helpdesk/Livewire/TicketShow.php +++ b/Modules/Helpdesk/Livewire/TicketShow.php @@ -320,12 +320,12 @@ final class TicketShow extends Component public function render(): View { - return view('helpdesk::livewire.ticket-show', [ + return view('modules.helpdesk.livewire.ticket-show', [ 'statuses' => Status::query()->orderBy('sort_order')->get(), 'priorities' => Priority::query()->orderBy('sort_order')->get(), 'agents' => $this->agentOptions(), 'cannedResponses' => CannedResponse::query()->where('is_active', true)->orderBy('sort_order')->orderBy('name')->get(), - ])->layout('helpdesk::layouts.app.sidebar'); + ])->layout('layouts.app', ['title' => __('Helpdesk Ticket')]); } private function normaliseNullableInt(mixed $value): ?int @@ -691,7 +691,7 @@ final class TicketShow extends Component { $user = Auth::user(); - return $user !== null && $user->isHelpdeskAdmin(); + return $user !== null && (method_exists($user, 'isAdmin') ? $user->isAdmin() : (bool) ($user->helpdesk_admin ?? false)); } private function buildCommentTree(Collection $grouped, ?int $parentId = null): Collection diff --git a/Modules/Helpdesk/Livewire/TicketTimer.php b/Modules/Helpdesk/Livewire/TicketTimer.php index 158584b..a66d797 100644 --- a/Modules/Helpdesk/Livewire/TicketTimer.php +++ b/Modules/Helpdesk/Livewire/TicketTimer.php @@ -154,7 +154,7 @@ class TicketTimer extends Component */ public function render() { - return view('helpdesk::livewire.ticket-timer'); + return view('modules.helpdesk.livewire.ticket-timer'); } /** diff --git a/Modules/Helpdesk/Resources/assets/css/app.css b/Modules/Helpdesk/Resources/assets/css/app.css index 3b441a3..c7c675e 100644 --- a/Modules/Helpdesk/Resources/assets/css/app.css +++ b/Modules/Helpdesk/Resources/assets/css/app.css @@ -5,7 +5,7 @@ * Tailwind scanner to discover module Blade classes. */ @source "../../views/**/*.blade.php"; -@source "../../../../../resources/themes/admin/views/modules/helpdesk/**/*.blade.php"; +@source "../../../../../resources/themes/backend/views/modules/helpdesk/**/*.blade.php"; @source "../../../Livewire/**/*.php"; .hd-helpdesk-surface .hd-btn, diff --git a/Modules/Helpdesk/vite.config.js b/Modules/Helpdesk/vite.config.js index b60523a..1d7f54d 100644 --- a/Modules/Helpdesk/vite.config.js +++ b/Modules/Helpdesk/vite.config.js @@ -2,6 +2,8 @@ import { defineConfig } from 'vite'; import laravel from 'laravel-vite-plugin'; import tailwindcss from '@tailwindcss/vite'; +console.log('[Helpdesk] Running Modules/Helpdesk/vite.config.js'); + export default defineConfig({ build: { emptyOutDir: true, @@ -14,6 +16,7 @@ export default defineConfig({ laravel({ publicDirectory: '../../public', buildDirectory: 'build/helpdesk', + hotFile: '../../public/hot-helpdesk', input: [ 'Resources/assets/css/app.css', @@ -23,6 +26,7 @@ export default defineConfig({ refresh: [ 'Resources/views/**', 'Livewire/**', + '../../resources/themes/backend/views/modules/helpdesk/**', ], }), ], diff --git a/package.json b/package.json index 54a0533..4847df2 100644 --- a/package.json +++ b/package.json @@ -3,8 +3,10 @@ "private": true, "type": "module", "scripts": { - "build": "vite build", - "dev": "vite" + "build": "npm run build:backend && npm run build:helpdesk", + "build:backend": "vite build --config ./vite.config.js", + "build:helpdesk": "npm --prefix Modules/Helpdesk ci && npm --prefix Modules/Helpdesk run build", + "dev": "vite --config ./vite.config.js" }, "dependencies": { "@laravel/passkeys": "^0.2.0", diff --git a/resources/themes/backend/assets/css/app.css b/resources/themes/backend/assets/css/app.css index 87828d7..ecbf55a 100644 --- a/resources/themes/backend/assets/css/app.css +++ b/resources/themes/backend/assets/css/app.css @@ -2,13 +2,11 @@ @import '../../../../../vendor/livewire/flux/dist/flux.css'; @import './helpdesk.css'; -@source '../../views'; -@source '../../views/modules/helpdesk/**/*.blade.php'; -@source '../../../../../Modules/Helpdesk/Livewire/**/*.php'; -@source '../../../**/*.blade.php'; +@source '../../views/**/*.blade.php'; +@source '../../../../../Modules/Helpdesk/**/*.php'; @source '../../../../../vendor/laravel/framework/src/Illuminate/Pagination/resources/views/*.blade.php'; -@source '../../../../../vendor/livewire/flux-pro/stubs/**/*.blade.php'; @source '../../../../../vendor/livewire/flux/stubs/**/*.blade.php'; +@source '../../../../../vendor/livewire/flux-pro/stubs/**/*.blade.php'; @custom-variant dark (&:where(.dark, .dark *)); @@ -41,7 +39,6 @@ } @layer base { - *, ::after, ::before, @@ -56,7 +53,7 @@ } [data-flux-label] { - @apply !mb-0 !leading-tight; + @apply !mb-0 !leading-tight; } input:focus[data-flux-control], @@ -64,7 +61,3 @@ textarea:focus[data-flux-control], select:focus[data-flux-control] { @apply outline-hidden ring-2 ring-accent ring-offset-2 ring-offset-accent-foreground; } - -/* \[:where(&)\]:size-4 { - @apply size-4; -} */ diff --git a/resources/themes/backend/views/components/helpdesk-settings-simple.blade.php b/resources/themes/backend/views/components/helpdesk-settings-simple.blade.php new file mode 100644 index 0000000..c842646 --- /dev/null +++ b/resources/themes/backend/views/components/helpdesk-settings-simple.blade.php @@ -0,0 +1,49 @@ +@props([ + 'title', + 'items', + 'formPrefix', + 'saveMethod', + 'editMethod', + 'deleteMethod', + 'resetMethod', + 'nameField' => 'name', +]) + +
+
+ {{ __($title) }} + + + + @if ($nameField !== 'slug') + + @endif + +
+ {{ __('Save') }} + {{ __('Reset') }} +
+ + +
+
+ {{ __($title) }} +
+
+ @forelse ($items as $item) +
+
+
{{ data_get($item, $nameField) }}
+ @if (data_get($item, 'slug'))
{{ data_get($item, 'slug') }}
@endif +
+
+ {{ __('Edit') }} + {{ __('Delete') }} +
+
+ @empty +
{{ __('No items yet.') }}
+ @endforelse +
+
+
diff --git a/resources/themes/backend/views/components/layouts/app.blade.php b/resources/themes/backend/views/components/layouts/app.blade.php new file mode 100644 index 0000000..c5287f0 --- /dev/null +++ b/resources/themes/backend/views/components/layouts/app.blade.php @@ -0,0 +1,7 @@ +@props([ + 'title' => null, +]) + + + {{ $slot }} + diff --git a/resources/themes/backend/views/modules/helpdesk/livewire/kanban-board.blade.php b/resources/themes/backend/views/modules/helpdesk/livewire/kanban-board.blade.php new file mode 100644 index 0000000..6bffddd --- /dev/null +++ b/resources/themes/backend/views/modules/helpdesk/livewire/kanban-board.blade.php @@ -0,0 +1,172 @@ +
+
+
+ {{ __('Helpdesk Kanban') }} + + {{ __('Move tickets through the workflow for the selected board.') }} + +
+ +
+ @if ($boards->isNotEmpty()) +
+ + @foreach ($boards as $boardOption) + + @endforeach + +
+ @endif + + + {{ __('Ticket list') }} + + + + {{ __('New ticket') }} + +
+
+ + @if (session('success')) +
+ {{ session('success') }} +
+ @endif + + @if ($board === null) +
+ {{ __('No Kanban board configured') }} + + {{ __('Create a board in Helpdesk settings before using Kanban.') }} + + + + {{ __('Open settings') }} + +
+ @else +
+ @foreach ($statuses as $status) + @php + $statusTickets = collect($ticketsByStatus[$status->id] ?? []); + @endphp + +
+
+
+ + {{ $status->name }} + +
+ + + {{ $statusTickets->count() }} + +
+ +
+ @forelse ($statusTickets as $ticket) +
+
+ + + @if ($ticket->priority) + + {{ $ticket->priority->name }} + + @endif +
+ +
+ @if ($ticket->agent) +
{{ __('Agent') }}: {{ $ticket->agent->name }}
+ @endif + + @if ($ticket->category) +
{{ __('Category') }}: {{ $ticket->category->name }}
+ @endif + + @if ($ticket->project) +
{{ __('Project') }}: {{ $ticket->project->name ?? $ticket->project->title ?? '—' }}
+ @endif +
+ + @can('update', $ticket) +
+ + + +
+ @endcan +
+ @empty +
+ {{ __('No tickets') }} +
+ @endforelse +
+
+ @endforeach +
+ @endif +
diff --git a/resources/themes/backend/views/modules/helpdesk/livewire/settings-manager.blade.php b/resources/themes/backend/views/modules/helpdesk/livewire/settings-manager.blade.php new file mode 100644 index 0000000..f5f7560 --- /dev/null +++ b/resources/themes/backend/views/modules/helpdesk/livewire/settings-manager.blade.php @@ -0,0 +1,68 @@ +
+
+
+ {{ __('Helpdesk Settings') }} + {{ __('Manage statuses, priorities, categories, teams, projects and Helpdesk configuration.') }} +
+ {{ __('Back to Helpdesk') }} +
+ + @php + $sections = [ + 'statuses' => 'Statuses', + 'priorities' => 'Priorities', + 'categories' => 'Categories', + 'teams' => 'Teams', + 'projects' => 'Projects', + 'boards' => 'Boards', + 'repositories' => 'Repositories', + 'workflows' => 'Workflows', + 'canned' => 'Canned responses', + 'sla' => 'SLA policies', + 'automation' => 'Automation', + 'products' => 'Products', + 'tags' => 'Tags', + 'checklists' => 'Checklists', + ]; + @endphp + +
+ @foreach ($sections as $key => $label) + + @endforeach +
+ + @if ($section === 'statuses') + + @elseif ($section === 'priorities') + + @elseif ($section === 'categories') + + @elseif ($section === 'teams') + + @elseif ($section === 'projects') + + @elseif ($section === 'boards') + + @elseif ($section === 'repositories') + + @elseif ($section === 'workflows') + + @elseif ($section === 'canned') + + @elseif ($section === 'sla') + + @elseif ($section === 'automation') + + @elseif ($section === 'products') + + @elseif ($section === 'tags') + + @elseif ($section === 'checklists') + + @endif +
diff --git a/resources/themes/backend/views/modules/helpdesk/livewire/ticket-create.blade.php b/resources/themes/backend/views/modules/helpdesk/livewire/ticket-create.blade.php new file mode 100644 index 0000000..cf0d17d --- /dev/null +++ b/resources/themes/backend/views/modules/helpdesk/livewire/ticket-create.blade.php @@ -0,0 +1,76 @@ +
+
+
+ {{ __('Create ticket') }} + {{ __('Create a new Helpdesk request.') }} +
+ {{ __('Back to tickets') }} +
+ +
+
+
+ + @error('subject')

{{ $message }}

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

{{ $message }}

@enderror +
+ + + + @foreach ($boards as $item)@endforeach + + + + + @foreach ($priorities as $item)@endforeach + + + + + @foreach ($categories as $item)@endforeach + + + + + @foreach ($teams as $item)@endforeach + + + + + @foreach ($projects as $item)@endforeach + + + + + @foreach ($products as $item)@endforeach + + + + +
+ + +
+ +
+ + + @error('attachments.*')

{{ $message }}

@enderror +
+
+ +
+ {{ __('Clear') }} + + {{ __('Create ticket') }} + {{ __('Saving…') }} + +
+
+
diff --git a/resources/themes/backend/views/modules/helpdesk/livewire/ticket-edit.blade.php b/resources/themes/backend/views/modules/helpdesk/livewire/ticket-edit.blade.php new file mode 100644 index 0000000..71b9f58 --- /dev/null +++ b/resources/themes/backend/views/modules/helpdesk/livewire/ticket-edit.blade.php @@ -0,0 +1,59 @@ +
+
+
+ {{ __('Edit :reference', ['reference' => $ticket->reference]) }} + {{ __('Update ticket details and assignment.') }} +
+ {{ __('Cancel') }} +
+ +
+
+
+
+ + @foreach ($statuses as $item)@endforeach + @foreach ($priorities as $item)@endforeach + + @foreach ($boards as $item)@endforeach + @foreach ($agents as $item)@endforeach + + @foreach ($categories as $item)@endforeach + @foreach ($teams as $item)@endforeach + + @foreach ($projects as $item)@endforeach + @foreach ($products as $item)@endforeach + + + +
+ + +
+ +
+ + +
+ + @if ($ticket->attachments->isNotEmpty()) +
+ {{ __('Existing attachments') }} + @foreach ($ticket->attachments as $attachment) +
+ {{ $attachment->original_name ?? $attachment->filename ?? __('Attachment') }} + {{ __('Remove') }} +
+ @endforeach +
+ @endif +
+ +
+ {{ __('Clear') }} + {{ __('Save changes') }} +
+
+
diff --git a/resources/themes/backend/views/modules/helpdesk/livewire/ticket-index.blade.php b/resources/themes/backend/views/modules/helpdesk/livewire/ticket-index.blade.php new file mode 100644 index 0000000..b6656d8 --- /dev/null +++ b/resources/themes/backend/views/modules/helpdesk/livewire/ticket-index.blade.php @@ -0,0 +1,204 @@ +
+
+
+ {{ __('Tickets') }} + {{ __('Manage Helpdesk tickets, assignments and status.') }} +
+ +
+ + {{ __('Kanban') }} + + + + {{ __('New ticket') }} + +
+
+ +
+ + + + + @foreach ($statuses as $statusOption) + + @endforeach + + + + + @foreach ($priorities as $priorityOption) + + @endforeach + + + + + + + +
+ +
+
+ + + + + + + + + + + + + + @forelse ($tickets as $ticket) + + + + + + + + + + + + + + @empty + + + + @endforelse + +
+ {{ __('Reference') }} + + {{ __('Subject') }} + + {{ __('Status') }} + + {{ __('Priority') }} + + {{ __('Agent') }} + + {{ __('Actions') }} +
+ + {{ $ticket->reference }} + + +
+ + {{ $ticket->subject }} + + +
+ @if ($ticket->category) + {{ $ticket->category->name }} + @endif + + @if ($ticket->project) + {{ $ticket->project->title }} + @endif + + @if ($ticket->attachments_count) + {{ trans_choice(':count attachment|:count attachments', $ticket->attachments_count, ['count' => $ticket->attachments_count]) }} + @endif +
+
+
+ {{ $ticket->status?->name ?? '—' }} + + {{ $ticket->priority?->name ?? '—' }} + + {{ $ticket->agent_name ?? '—' }} + +
+ + {{ __('View') }} + + + @can('update', $ticket) + + {{ __('Edit') }} + + @endcan + + @can('delete', $ticket) + + {{ __('Delete') }} + + @endcan +
+
+ {{ __('No tickets found') }} + + {{ __('Try changing the filters or create a new ticket.') }} + +
+
+ + @if ($tickets->hasPages()) +
+ {{ $tickets->links() }} +
+ @endif +
+ + @if ($deleteModalOpen) +
+
+ {{ __('Delete ticket?') }} + + + {{ __('This will delete :reference — :subject.', [ + 'reference' => $pendingDeleteTicketReference, + 'subject' => $pendingDeleteTicketSubject, + ]) }} + + +
+ + {{ __('Cancel') }} + + + + {{ __('Delete') }} + +
+
+
+ @endif +
diff --git a/resources/themes/backend/views/modules/helpdesk/livewire/ticket-show.blade.php b/resources/themes/backend/views/modules/helpdesk/livewire/ticket-show.blade.php new file mode 100644 index 0000000..51473a1 --- /dev/null +++ b/resources/themes/backend/views/modules/helpdesk/livewire/ticket-show.blade.php @@ -0,0 +1,62 @@ +
+
+
+
{{ $ticket->reference }}
+ {{ $ticket->subject }} + {{ __('Opened by :name', ['name' => $ticket->user?->name ?? __('Unknown')]) }} +
+
+ {{ __('Tickets') }} + @can('update', $ticket) + {{ __('Edit') }} + @endcan +
+
+ +
+
+
+
{{ $ticket->body }}
+
+ +
+ {{ __('Comments') }} +
+ @forelse ($ticket->comments as $comment) +
+
+ {{ $comment->user?->name ?? __('System') }} + {{ $comment->created_at?->diffForHumans() }} +
+ @if ($comment->subject)
{{ $comment->subject }}
@endif +
{{ $comment->body }}
+
+ @empty + {{ __('No comments yet.') }} + @endforelse +
+ +
+ + + {{ __('Add comment') }} +
+
+ + +
+ + +
+
diff --git a/resources/themes/backend/views/modules/helpdesk/livewire/ticket-timer.blade.php b/resources/themes/backend/views/modules/helpdesk/livewire/ticket-timer.blade.php new file mode 100644 index 0000000..3e21515 --- /dev/null +++ b/resources/themes/backend/views/modules/helpdesk/livewire/ticket-timer.blade.php @@ -0,0 +1,22 @@ +
+
+
+ {{ __('Time tracking') }} + {{ $this->elapsedTime }} +
+ + @if ($this->isRunning) + {{ __('Stop timer') }} + @else + {{ __('Start timer') }} + @endif +
+ +
+ +
+ + @if ($message) +

{{ $message }}

+ @endif +
diff --git a/resources/themes/backend/views/partials/head.blade.php b/resources/themes/backend/views/partials/head.blade.php index 123bd90..d23024a 100644 --- a/resources/themes/backend/views/partials/head.blade.php +++ b/resources/themes/backend/views/partials/head.blade.php @@ -12,4 +12,14 @@ @fonts @vite('resources/themes/backend/assets/css/app.css') + + +{{-- Helpdesk owns additional Select2/Flatpickr/Tailwind assets in its module Vite build. --}} +@if (file_exists(public_path('build/helpdesk/manifest.json'))) + @vite([ + 'Resources/assets/css/app.css', + 'Resources/assets/js/app.js', + ], 'build/helpdesk') +@endif + @fluxAppearance diff --git a/vite.config.js b/vite.config.js index e1322f0..5317530 100644 --- a/vite.config.js +++ b/vite.config.js @@ -1,9 +1,7 @@ -import { - defineConfig -} from 'vite'; +import { defineConfig } from 'vite'; import laravel from 'laravel-vite-plugin'; import { bunny } from 'laravel-vite-plugin/fonts'; -import tailwindcss from "@tailwindcss/vite"; +import tailwindcss from '@tailwindcss/vite'; export default defineConfig({ plugins: [ @@ -12,7 +10,11 @@ export default defineConfig({ 'resources/themes/backend/assets/css/app.css', 'resources/themes/backend/assets/js/passkeys.js', ], - refresh: true, + refresh: [ + 'resources/themes/backend/views/**/*.blade.php', + 'resources/themes/backend/assets/**/*', + 'Modules/Helpdesk/**/*.php', + ], fonts: [ bunny('Instrument Sans', { weights: [400, 500, 600], @@ -21,10 +23,13 @@ export default defineConfig({ }), tailwindcss(), ], + server: { cors: true, watch: { - ignored: ['**/storage/framework/views/**'], + ignored: [ + '**/storage/framework/views/**', + ], }, }, });