diff --git a/app/Http/Controllers/Admin/SupportTicketController.php b/app/Http/Controllers/Admin/SupportTicketController.php index 6567f3d8..6d0c513e 100644 --- a/app/Http/Controllers/Admin/SupportTicketController.php +++ b/app/Http/Controllers/Admin/SupportTicketController.php @@ -67,14 +67,7 @@ public function index(Request $request) 'category' => $category, 'search' => $search, ], - 'categories' => [ - SupportTicket::CATEGORY_GENERAL => 'General Inquiry', - SupportTicket::CATEGORY_BUG_REPORT => 'Bug Report', - SupportTicket::CATEGORY_MISSING_RESOURCE => 'Missing / Broken Resource', - SupportTicket::CATEGORY_ACCOUNT_ISSUE => 'Account Issue', - SupportTicket::CATEGORY_SUGGESTION => 'Suggestion / Feedback', - SupportTicket::CATEGORY_OTHER => 'Other', - ], + 'categories' => SupportTicket::getCategories(), ]); } diff --git a/app/Http/Controllers/SupportTicketController.php b/app/Http/Controllers/SupportTicketController.php index 13e933df..aebd96f5 100644 --- a/app/Http/Controllers/SupportTicketController.php +++ b/app/Http/Controllers/SupportTicketController.php @@ -21,14 +21,7 @@ public function index(Request $request) return Inertia::render('Support', [ 'ticketsCount' => $ticketsCount, 'openTicketsCount' => $openTicketsCount, - 'categories' => [ - SupportTicket::CATEGORY_GENERAL => 'General Inquiry', - SupportTicket::CATEGORY_BUG_REPORT => 'Bug Report', - SupportTicket::CATEGORY_MISSING_RESOURCE => 'Missing / Broken Resource', - SupportTicket::CATEGORY_ACCOUNT_ISSUE => 'Account Issue', - SupportTicket::CATEGORY_SUGGESTION => 'Suggestion / Feedback', - SupportTicket::CATEGORY_OTHER => 'Other', - ], + 'categories' => SupportTicket::getCategories(), ]); } @@ -43,14 +36,7 @@ public function myTickets(Request $request) return Inertia::render('SupportMyTickets', [ 'tickets' => $tickets, - 'categories' => [ - SupportTicket::CATEGORY_GENERAL => 'General Inquiry', - SupportTicket::CATEGORY_BUG_REPORT => 'Bug Report', - SupportTicket::CATEGORY_MISSING_RESOURCE => 'Missing / Broken Resource', - SupportTicket::CATEGORY_ACCOUNT_ISSUE => 'Account Issue', - SupportTicket::CATEGORY_SUGGESTION => 'Suggestion / Feedback', - SupportTicket::CATEGORY_OTHER => 'Other', - ], + 'categories' => SupportTicket::getCategories(), ]); } @@ -68,7 +54,7 @@ public function store(Request $request) } $validated = $request->validate([ - 'category' => 'required|string|in:general,bug_report,missing_resource,account_issue,suggestion,other', + 'category' => 'required|string|in:'.implode(',', array_keys(SupportTicket::getCategories())), 'subject' => 'required|string|min:3|max:255', 'message' => 'required|string|min:10|max:5000', 'attachment' => 'nullable|image|mimes:jpeg,png,jpg,webp|max:5120', diff --git a/app/Models/SupportTicket.php b/app/Models/SupportTicket.php index 4f62974e..68ca768c 100644 --- a/app/Models/SupportTicket.php +++ b/app/Models/SupportTicket.php @@ -14,6 +14,8 @@ class SupportTicket extends Model public const CATEGORY_GENERAL = 'general'; + public const CATEGORY_APPLY_ROLE = 'apply_role'; + public const CATEGORY_BUG_REPORT = 'bug_report'; public const CATEGORY_MISSING_RESOURCE = 'missing_resource'; @@ -32,6 +34,19 @@ class SupportTicket extends Model public const STATUS_CLOSED = 'closed'; + public static function getCategories(): array + { + return [ + self::CATEGORY_GENERAL => 'General Inquiry', + self::CATEGORY_APPLY_ROLE => 'Apply for Contributor Role', + self::CATEGORY_BUG_REPORT => 'Bug Report', + self::CATEGORY_MISSING_RESOURCE => 'Missing / Broken Resource', + self::CATEGORY_ACCOUNT_ISSUE => 'Account Issue', + self::CATEGORY_SUGGESTION => 'Suggestion / Feedback', + self::CATEGORY_OTHER => 'Other', + ]; + } + protected $fillable = [ 'ticket_number', 'user_id', diff --git a/resources/js/pages/Support.vue b/resources/js/pages/Support.vue index 70e0d93a..abeb82c7 100644 --- a/resources/js/pages/Support.vue +++ b/resources/js/pages/Support.vue @@ -32,6 +32,15 @@ const authUser = computed( () => (page.props.auth?.user as UserInfo) || null, ); +const urlParams = + typeof window !== 'undefined' + ? new URLSearchParams(window.location.search) + : null; + +const initialCategory = urlParams?.get('category') || 'general'; +const initialSubject = urlParams?.get('subject') || ''; +const initialMessage = urlParams?.get('message') || ''; + const form = useForm<{ category: string; subject: string; @@ -39,12 +48,22 @@ const form = useForm<{ attachment: File | null; general?: string; }>({ - category: 'general', - subject: '', - message: '', + category: initialCategory, + subject: initialSubject, + message: initialMessage, attachment: null, }); +const loginRedirectUrl = computed(() => { + if (typeof window !== 'undefined') { + const fullPath = window.location.pathname + window.location.search; + + return `/login?redirect=${encodeURIComponent(fullPath)}`; + } + + return '/login?redirect=/support'; +}); + const previewUrl = ref(null); const handleFileChange = (e: Event) => { @@ -123,7 +142,7 @@ const submitTicket = () => { class="mt-6 flex flex-col justify-center gap-3 sm:flex-row" > লগইন করুন diff --git a/resources/js/pages/platform/JoinTeam.vue b/resources/js/pages/platform/JoinTeam.vue index 7fb1f41f..cdf793e5 100644 --- a/resources/js/pages/platform/JoinTeam.vue +++ b/resources/js/pages/platform/JoinTeam.vue @@ -1,73 +1,257 @@ diff --git a/tests/Feature/SupportTicketTest.php b/tests/Feature/SupportTicketTest.php index d2867352..cab479f8 100644 --- a/tests/Feature/SupportTicketTest.php +++ b/tests/Feature/SupportTicketTest.php @@ -51,6 +51,25 @@ }); }); +test('authenticated user can submit a ticket to apply for a role', function () { + $user = User::factory()->create(); + + $response = $this->actingAs($user)->post('/support/tickets', [ + 'category' => 'apply_role', + 'subject' => 'Application for Resource Curator', + 'message' => 'I would like to apply for the Resource Curator role.', + ]); + + $response->assertRedirect('/support/my-tickets'); + + $this->assertDatabaseHas('support_tickets', [ + 'user_id' => $user->id, + 'category' => 'apply_role', + 'subject' => 'Application for Resource Curator', + 'status' => 'open', + ]); +}); + test('my tickets page loads for authenticated user and redirects for guest', function () { $this->get('/support/my-tickets')->assertRedirect('/login');