diff --git a/app/Livewire/Tickets/Show.php b/app/Livewire/Tickets/Show.php index db612bf85..fad4beb3b 100644 --- a/app/Livewire/Tickets/Show.php +++ b/app/Livewire/Tickets/Show.php @@ -9,28 +9,79 @@ use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Storage; use Livewire\Attributes\Locked; use Livewire\Attributes\Rule; +use Livewire\WithFileUploads; #[DisabledIf('tickets_disabled')] class Show extends Component { + use WithFileUploads; + #[Locked] public Ticket $ticket; #[Rule('required', 'string')] - public string $message; + public string $message = ''; + + #[Rule(['attachments.*' => 'image|max:5120'])] // 5MB max per image + public array $attachments = []; + + public function updatedAttachments() + { + $this->validateOnly('attachments.*'); + } + + public function removeAttachment($index) + { + unset($this->attachments[$index]); + $this->attachments = array_values($this->attachments); + } + + public function uploadImage() + { + $this->validate([ + 'attachments.*' => 'image|max:5120', + ]); + + $uploadedPaths = []; + foreach ($this->attachments as $attachment) { + $path = $attachment->store('ticket-attachments', 'public'); + $uploadedPaths[] = [ + 'path' => $path, + 'name' => $attachment->getClientOriginalName(), + 'url' => Storage::url($path), + ]; + } + + return $uploadedPaths; + } public function save() { $this->validate(); + // Handle attachments + $attachmentData = []; + if (!empty($this->attachments)) { + foreach ($this->attachments as $attachment) { + $path = $attachment->store('ticket-attachments', 'public'); + $attachmentData[] = [ + 'path' => $path, + 'name' => $attachment->getClientOriginalName(), + 'url' => Storage::url($path), + ]; + } + } + $this->ticket->messages()->create([ 'user_id' => Auth::id(), 'message' => $this->message, + 'attachments' => !empty($attachmentData) ? $attachmentData : null, ]); $this->notify('Message sent successfully'); $this->message = ''; + $this->attachments = []; $this->dispatch('saved'); } diff --git a/app/Models/TicketMessage.php b/app/Models/TicketMessage.php index 1801322da..e7d82108f 100644 --- a/app/Models/TicketMessage.php +++ b/app/Models/TicketMessage.php @@ -16,6 +16,11 @@ class TicketMessage extends Model 'ticket_id', 'user_id', 'message', + 'attachments', + ]; + + protected $casts = [ + 'attachments' => 'array', ]; public function ticket() diff --git a/database/migrations/2024_12_07_000000_add_attachments_to_ticket_messages_table.php b/database/migrations/2024_12_07_000000_add_attachments_to_ticket_messages_table.php new file mode 100644 index 000000000..b286fbe7b --- /dev/null +++ b/database/migrations/2024_12_07_000000_add_attachments_to_ticket_messages_table.php @@ -0,0 +1,28 @@ +json('attachments')->nullable()->after('message'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('ticket_messages', function (Blueprint $table) { + $table->dropColumn('attachments'); + }); + } +}; diff --git a/lang/en/ticket.php b/lang/en/ticket.php index ce39439fa..394601196 100644 --- a/lang/en/ticket.php +++ b/lang/en/ticket.php @@ -22,4 +22,11 @@ return [ 'service' => 'Service', 'select_service' => 'Select Service', 'create' => 'Create', + + // Attachment translations + 'attachments' => 'Attachments', + 'click_to_upload' => 'Click to upload', + 'or_drag_drop' => 'or drag and drop', + 'image_formats' => 'PNG, JPG, GIF up to 5MB', + 'uploading' => 'Uploading...', ]; diff --git a/themes/lucentui/views/tickets/show.blade.php b/themes/lucentui/views/tickets/show.blade.php index b98508e19..954366d8f 100644 --- a/themes/lucentui/views/tickets/show.blade.php +++ b/themes/lucentui/views/tickets/show.blade.php @@ -25,6 +25,26 @@
+
{{ $attachment['name'] }}
+ + @endforeach +{{ $attachment->getClientOriginalName() }}
+{{ $message }}
+ @enderror +