Skip to content

Commit a1c5c7a

Browse files
committed
add status and messages to tickets
1 parent 583c877 commit a1c5c7a

File tree

20 files changed

+658
-155
lines changed

20 files changed

+658
-155
lines changed

tickets/database/migrations/001_create_tickets_table.php

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,18 +10,22 @@ public function up(): void
1010
{
1111
Schema::create('tickets', function (Blueprint $table) {
1212
$table->increments('id');
13+
1314
$table->string('title');
1415
$table->string('category');
1516
$table->string('priority');
17+
$table->string('status');
1618
$table->text('description')->nullable();
17-
$table->boolean('is_answered')->default(false);
18-
$table->text('answer')->nullable();
19+
1920
$table->unsignedInteger('server_id');
2021
$table->foreign('server_id')->references('id')->on('servers')->cascadeOnDelete();
22+
2123
$table->unsignedInteger('author_id')->nullable();
2224
$table->foreign('author_id')->references('id')->on('users')->nullOnDelete();
25+
2326
$table->unsignedInteger('assigned_user_id')->nullable();
2427
$table->foreign('assigned_user_id')->references('id')->on('users')->nullOnDelete();
28+
2529
$table->timestamps();
2630
});
2731
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
<?php
2+
3+
use Illuminate\Database\Migrations\Migration;
4+
use Illuminate\Database\Schema\Blueprint;
5+
use Illuminate\Support\Facades\Schema;
6+
7+
return new class extends Migration
8+
{
9+
public function up(): void
10+
{
11+
Schema::create('ticket_messages', function (Blueprint $table) {
12+
$table->increments('id');
13+
14+
$table->text('message')->nullable();
15+
$table->boolean('hidden')->default(false);
16+
17+
$table->unsignedInteger('ticket_id');
18+
$table->foreign('ticket_id')->references('id')->on('tickets')->cascadeOnDelete();
19+
20+
$table->unsignedInteger('author_id')->nullable();
21+
$table->foreign('author_id')->references('id')->on('users')->nullOnDelete();
22+
23+
$table->timestamps();
24+
});
25+
}
26+
27+
public function down(): void
28+
{
29+
Schema::dropIfExists('ticket_messages');
30+
}
31+
};

tickets/lang/de/tickets.php

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,28 +3,33 @@
33
return [
44
'no_tickets' => 'Keine Tickets',
55
'ticket' => 'Ticket|Tickets',
6+
'message' => 'Nachricht|Nachrichten',
67
'title' => 'Titel',
78
'category' => 'Kategorie',
89
'priority' => 'Priorität',
10+
'status' => 'Status',
911
'description' => 'Beschreibung',
1012
'no_description' => 'Keine Beschreibung',
11-
'answered' => 'Beantwortet',
12-
'unanswered' => 'Unbeantwortet',
13+
'open' => 'Offen',
14+
'closed' => 'Geschlossen',
1315
'all' => 'Alle',
1416
'answer_verb' => 'Antworten',
1517
'answer_noun' => 'Antwort',
1618
'server' => 'Server',
1719
'owner' => 'Server Besitzer',
1820
'created_at' => 'Erstellt am',
1921
'created_by' => 'Erstellt von',
22+
'author' => 'Author',
23+
'admin' => 'Admin',
24+
'hidden' => 'Versteckt',
2025
'unknown' => 'Unbekannt',
2126
'assigned_to' => 'Zugewiesen an',
2227
'noone' => 'Niemand',
2328
'assign_to_me' => 'Mir zuweisen',
2429
'assigned_to_me' => 'Mir zugewiesene',
2530

2631
'notifications' => [
27-
'answered' => 'Ticket wurde beantwortet',
32+
'closed' => 'Ticket wurde geschlossen',
2833
'assigned_to_you' => 'Ticket wurde dir zugewiesen',
2934
],
3035
];

tickets/lang/en/tickets.php

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,28 +3,33 @@
33
return [
44
'no_tickets' => 'No tickets',
55
'ticket' => 'Ticket|Tickets',
6+
'message' => 'Message|Messages',
67
'title' => 'Title',
78
'category' => 'Category',
89
'priority' => 'Priority',
10+
'status' => 'Status',
911
'description' => 'Description',
1012
'no_description' => 'No description',
11-
'answered' => 'Answered',
12-
'unanswered' => 'Unanswered',
13+
'open' => 'Open',
14+
'closed' => 'Closed',
1315
'all' => 'All',
1416
'answer_verb' => 'Answer',
1517
'answer_noun' => 'Answer',
1618
'server' => 'Server',
1719
'owner' => 'Server Owner',
1820
'created_at' => 'Created at',
1921
'created_by' => 'Created by',
22+
'author' => 'Author',
23+
'admin' => 'Admin',
24+
'hidden' => 'Hidden',
2025
'unknown' => 'Unknown',
2126
'assigned_to' => 'Assigned to',
22-
'noone' => 'Noone',
27+
'noone' => 'No one',
2328
'assign_to_me' => 'Assign to me',
2429
'assigned_to_me' => 'Assigned to me',
2530

2631
'notifications' => [
27-
'answered' => 'Ticket answered',
32+
'closed' => 'Ticket closed',
2833
'assigned_to_you' => 'Ticket assigned to you',
2934
],
3035
];

tickets/src/Enums/TicketStatus.php

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
<?php
2+
3+
namespace Boy132\Tickets\Enums;
4+
5+
use Filament\Support\Contracts\HasColor;
6+
use Filament\Support\Contracts\HasIcon;
7+
use Filament\Support\Contracts\HasLabel;
8+
9+
enum TicketStatus: string implements HasColor, HasIcon, HasLabel
10+
{
11+
case Open = 'open';
12+
case InProgress = 'in_progress';
13+
case Closed = 'closed';
14+
15+
public function getIcon(): string
16+
{
17+
return match ($this) {
18+
self::Open => 'tabler-circle-dashed',
19+
self::InProgress => 'tabler-progress',
20+
self::Closed => 'tabler-circle-check',
21+
};
22+
}
23+
24+
public function getColor(): string
25+
{
26+
return match ($this) {
27+
self::Open => 'primary',
28+
self::InProgress => 'success',
29+
self::Closed => 'danger',
30+
};
31+
}
32+
33+
public function getLabel(): string
34+
{
35+
return str($this->value)->headline();
36+
}
37+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<?php
2+
3+
namespace Boy132\Tickets\Filament\Admin\Resources\Tickets\Pages;
4+
5+
use Boy132\Tickets\Filament\Admin\Resources\Tickets\TicketResource;
6+
use Filament\Resources\Pages\CreateRecord;
7+
8+
class CreateTicket extends CreateRecord
9+
{
10+
protected static string $resource = TicketResource::class;
11+
12+
protected static bool $canCreateAnother = false;
13+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
<?php
2+
3+
namespace Boy132\Tickets\Filament\Admin\Resources\Tickets\Pages;
4+
5+
use Boy132\Tickets\Filament\Admin\Resources\Tickets\TicketResource;
6+
use Boy132\Tickets\Filament\Components\Actions\AnswerAction;
7+
use Boy132\Tickets\Filament\Components\Actions\AssignToMeAction;
8+
use Filament\Resources\Pages\EditRecord;
9+
10+
class EditTicket extends EditRecord
11+
{
12+
protected static string $resource = TicketResource::class;
13+
14+
protected function getHeaderActions(): array
15+
{
16+
return [
17+
AnswerAction::make(),
18+
AssignToMeAction::make(),
19+
$this->getSaveFormAction()->formId('form'),
20+
$this->getCancelFormAction()->formId('form'),
21+
];
22+
}
23+
24+
protected function getFormActions(): array
25+
{
26+
return [];
27+
}
28+
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
<?php
2+
3+
namespace Boy132\Tickets\Filament\Admin\Resources\Tickets\Pages;
4+
5+
use Boy132\Tickets\Enums\TicketStatus;
6+
use Boy132\Tickets\Filament\Admin\Resources\Tickets\TicketResource;
7+
use Boy132\Tickets\Models\Ticket;
8+
use Filament\Actions\CreateAction;
9+
use Filament\Resources\Pages\ListRecords;
10+
use Filament\Schemas\Components\Tabs\Tab;
11+
use Illuminate\Database\Eloquent\Builder;
12+
13+
class ListTickets extends ListRecords
14+
{
15+
protected static string $resource = TicketResource::class;
16+
17+
protected function getHeaderActions(): array
18+
{
19+
return [
20+
CreateAction::make()
21+
->createAnother(false),
22+
];
23+
}
24+
25+
public function getTabs(): array
26+
{
27+
return [
28+
'my' => Tab::make(trans('tickets::tickets.assigned_to_me'))
29+
->modifyQueryUsing(fn (Builder $query) => $query->whereNot('status', TicketStatus::Closed->value)->where('assigned_user_id', auth()->user()->id))
30+
->badge(fn () => Ticket::whereNot('status', TicketStatus::Closed->value)->where('assigned_user_id', auth()->user()->id)->count()),
31+
32+
'open' => Tab::make(trans('tickets::tickets.open'))
33+
->modifyQueryUsing(fn (Builder $query) => $query->whereNot('status', TicketStatus::Closed->value))
34+
->badge(fn () => Ticket::whereNot('status', TicketStatus::Closed->value)->count()),
35+
36+
'closed' => Tab::make(trans('tickets::tickets.closed'))
37+
->modifyQueryUsing(fn (Builder $query) => $query->where('status', TicketStatus::Closed->value))
38+
->badge(fn () => Ticket::where('status', TicketStatus::Closed->value)->count()),
39+
40+
'all' => Tab::make(trans('tickets::tickets.all'))
41+
->badge(fn () => Ticket::count()),
42+
];
43+
}
44+
}

tickets/src/Filament/Admin/Resources/Tickets/Pages/ManageTickets.php

Lines changed: 0 additions & 50 deletions
This file was deleted.
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
<?php
2+
3+
namespace Boy132\Tickets\Filament\Admin\Resources\Tickets\Pages;
4+
5+
use Boy132\Tickets\Filament\Admin\Resources\Tickets\TicketResource;
6+
use Filament\Actions\EditAction;
7+
use Filament\Resources\Pages\ViewRecord;
8+
9+
class ViewTicket extends ViewRecord
10+
{
11+
protected static string $resource = TicketResource::class;
12+
13+
protected function getHeaderActions(): array
14+
{
15+
return [
16+
EditAction::make(),
17+
];
18+
}
19+
}

0 commit comments

Comments
 (0)