diff --git a/composer.json b/composer.json new file mode 100644 index 0000000..94dd4d9 --- /dev/null +++ b/composer.json @@ -0,0 +1,23 @@ +{ + "name": "dashboard/ticketing", + "description": "Ticketing / help-desk snap-in for the Dashboard platform", + "type": "library", + "license": "MIT", + "autoload": { + "psr-4": { + "Dashboard\\Ticketing\\": "src/" + } + }, + "extra": { + "laravel": { + "providers": [ + "Dashboard\\Ticketing\\TicketingServiceProvider" + ] + } + }, + "require": { + "php": "^8.2", + "illuminate/support": "^11.0|^12.0|^13.0", + "inertiajs/inertia-laravel": "^1.0|^2.0" + } +} diff --git a/database/migrations/2026_04_08_000001_create_tickets_table.php b/database/migrations/2026_04_08_000001_create_tickets_table.php new file mode 100644 index 0000000..453ed03 --- /dev/null +++ b/database/migrations/2026_04_08_000001_create_tickets_table.php @@ -0,0 +1,28 @@ +id(); + $table->foreignId('user_id')->constrained()->cascadeOnDelete(); + $table->foreignId('assigned_to')->nullable()->constrained('users')->nullOnDelete(); + $table->string('title'); + $table->text('description'); + $table->enum('category', ['IT', 'Facilities', 'HR', 'Other'])->default('Other'); + $table->enum('priority', ['low', 'medium', 'high', 'urgent'])->default('medium'); + $table->enum('status', ['open', 'in_progress', 'resolved', 'closed'])->default('open'); + $table->timestamps(); + }); + } + + public function down(): void + { + Schema::dropIfExists('tickets'); + } +}; diff --git a/database/migrations/2026_04_08_000002_create_ticket_comments_table.php b/database/migrations/2026_04_08_000002_create_ticket_comments_table.php new file mode 100644 index 0000000..109072e --- /dev/null +++ b/database/migrations/2026_04_08_000002_create_ticket_comments_table.php @@ -0,0 +1,25 @@ +id(); + $table->foreignId('ticket_id')->constrained()->cascadeOnDelete(); + $table->foreignId('user_id')->constrained()->cascadeOnDelete(); + $table->text('body'); + $table->boolean('is_internal')->default(false); + $table->timestamps(); + }); + } + + public function down(): void + { + Schema::dropIfExists('ticket_comments'); + } +}; diff --git a/resources/js/Pages/Ticketing/Create.vue b/resources/js/Pages/Ticketing/Create.vue new file mode 100644 index 0000000..d2e45ff --- /dev/null +++ b/resources/js/Pages/Ticketing/Create.vue @@ -0,0 +1,112 @@ +