From 0055762d6a76194f4ec28616c4fed3f474c4e9e5 Mon Sep 17 00:00:00 2001 From: Emmanuel Lampe Date: Wed, 18 Nov 2020 13:16:43 +0100 Subject: [PATCH] Implemented ticket reference --- config/config.php | 14 ++++- ...6_00004_create_ticket_references_table.php | 38 +++++++++++++ resources/views/tickets/create.blade.php | 27 +++++++++ resources/views/tickets/show.blade.php | 8 +++ src/Controllers/TicketController.php | 20 +++++++ src/Interfaces/TicketReference.php | 24 ++++++++ src/Models/Ticket.php | 5 ++ src/Models/TicketReference.php | 30 ++++++++++ src/Rule/TicketReferenceRule.php | 55 +++++++++++++++++++ src/Traits/HasTicketReference.php | 16 ++++++ 10 files changed, 235 insertions(+), 2 deletions(-) create mode 100644 database/migrations/2020_11_16_00004_create_ticket_references_table.php create mode 100644 src/Interfaces/TicketReference.php create mode 100644 src/Models/TicketReference.php create mode 100644 src/Rule/TicketReferenceRule.php create mode 100644 src/Traits/HasTicketReference.php diff --git a/config/config.php b/config/config.php index 18ba13e..92ebc4d 100644 --- a/config/config.php +++ b/config/config.php @@ -50,7 +50,8 @@ 'tickets-table' => 'tickets', 'ticket-messages-table' => 'ticket_messages', 'ticket-uploads-table' => 'ticket_uploads', - 'ticket-categories-table' => 'ticket_categories' + 'ticket-categories-table' => 'ticket_categories', + 'ticket-references-table' => 'ticket_references' ], /* @@ -117,5 +118,14 @@ /* * Enable categories for tickets */ - 'category' => true + 'category' => true, + /* + * Enable references for tickets + */ + 'references' => true, + 'references-nullable' => true, + /* + * Ether you define your models for references or customize the view. + */ + 'reference-models' => [] ]; diff --git a/database/migrations/2020_11_16_00004_create_ticket_references_table.php b/database/migrations/2020_11_16_00004_create_ticket_references_table.php new file mode 100644 index 0000000..44d48ba --- /dev/null +++ b/database/migrations/2020_11_16_00004_create_ticket_references_table.php @@ -0,0 +1,38 @@ +id(); + $table->unsignedBigInteger('ticket_id'); + $table->morphs('referenceable'); + $table->timestamps(); + + if (! config('laravel-tickets.models.uuid')) { + $table->foreign('ticket_id') + ->on(config('laravel-tickets.database.tickets-table'))->references('id'); + } + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists(config('laravel-tickets.database.ticket-references-table')); + } +} diff --git a/resources/views/tickets/create.blade.php b/resources/views/tickets/create.blade.php index 4558996..f2573db 100644 --- a/resources/views/tickets/create.blade.php +++ b/resources/views/tickets/create.blade.php @@ -33,6 +33,33 @@ @endif + @if (config('laravel-tickets.references')) +
+
+ + + @error('reference') +
{{ $message }}
+ @enderror +
+
+ @endif
diff --git a/resources/views/tickets/show.blade.php b/resources/views/tickets/show.blade.php index 2b4774d..71b5cf4 100644 --- a/resources/views/tickets/show.blade.php +++ b/resources/views/tickets/show.blade.php @@ -91,6 +91,14 @@ class="custom-file-input @error('files') is-invalid @enderror" id="files"> value="{{ $ticket->category()->first()->translation }}" disabled>
@endif + @if (config('laravel-tickets.references') && $ticket->reference()->exists()) +
+ + @php($referenceable = $ticket->reference->referenceable) + +
+ @endif
diff --git a/src/Controllers/TicketController.php b/src/Controllers/TicketController.php index 954cfbf..241e75f 100644 --- a/src/Controllers/TicketController.php +++ b/src/Controllers/TicketController.php @@ -4,6 +4,7 @@ namespace RexlManu\LaravelTickets\Controllers; +use Illuminate\Database\Eloquent\Relations\Relation; use Illuminate\Http\JsonResponse; use Illuminate\Http\RedirectResponse; use Illuminate\Http\Request; @@ -15,7 +16,9 @@ use RexlManu\LaravelTickets\Events\TicketOpenEvent; use RexlManu\LaravelTickets\Models\Ticket; use RexlManu\LaravelTickets\Models\TicketMessage; +use RexlManu\LaravelTickets\Models\TicketReference; use RexlManu\LaravelTickets\Models\TicketUpload; +use RexlManu\LaravelTickets\Rule\TicketReferenceRule; use Symfony\Component\HttpFoundation\BinaryFileResponse; /** @@ -103,6 +106,12 @@ public function store(Request $request) Rule::exists(config('laravel-tickets.database.ticket-categories-table'), 'id'), ]; } + if (config('laravel-tickets.references')) { + $rules[ 'reference' ] = [ + config('laravel-tickets.references-nullable') ? 'nullable' : 'required', + new TicketReferenceRule(), + ]; + } $data = $request->validate($rules); if ($request->user()->tickets()->where('state', '!=', 'CLOSED')->count() >= config('laravel-tickets.maximal-open-tickets')) { $message = trans('You have reached the limit of open tickets'); @@ -116,6 +125,17 @@ public function store(Request $request) $ticket = $request->user()->tickets()->create( $data ); + + if (array_key_exists('reference', $data)) { + $reference = explode(',', $data[ 'reference' ]); + $ticketReference = new TicketReference(); + $ticketReference->ticket()->associate($ticket); + $ticketReference->referenceable()->associate( + resolve($reference[ 0 ])->find($reference[ 1 ]) + ); + $ticketReference->save(); + } + $ticketMessage = new TicketMessage($data); $ticketMessage->user()->associate($request->user()); $ticketMessage->ticket()->associate($ticket); diff --git a/src/Interfaces/TicketReference.php b/src/Interfaces/TicketReference.php new file mode 100644 index 0000000..93b3eee --- /dev/null +++ b/src/Interfaces/TicketReference.php @@ -0,0 +1,24 @@ +belongsTo(TicketCategory::class); } + public function reference() + { + return $this->hasOne(TicketReference::class); + } + public function scopeState($query, $state) { return $query->where('state', $state); diff --git a/src/Models/TicketReference.php b/src/Models/TicketReference.php new file mode 100644 index 0000000..8a06160 --- /dev/null +++ b/src/Models/TicketReference.php @@ -0,0 +1,30 @@ +belongsTo(Ticket::class); + } + + public function referenceable() + { + return $this->morphTo(); + } + +} diff --git a/src/Rule/TicketReferenceRule.php b/src/Rule/TicketReferenceRule.php new file mode 100644 index 0000000..764704d --- /dev/null +++ b/src/Rule/TicketReferenceRule.php @@ -0,0 +1,55 @@ +find($values[ 1 ]); + if (empty($model) + || ! $model instanceof TicketReference + || ! $model->hasReferenceAccess()) { + return false; + } + return true; + } + + /** + * Get the validation error message. + * + * @return string + */ + public function message() + { + return trans('The reference is not valid'); + } +} diff --git a/src/Traits/HasTicketReference.php b/src/Traits/HasTicketReference.php new file mode 100644 index 0000000..696baee --- /dev/null +++ b/src/Traits/HasTicketReference.php @@ -0,0 +1,16 @@ +id"; + } + +}