feat: implement announcement management with CRUD functionality

This commit is contained in:
Yoga Pangestu 2026-08-30 21:11:30 +07:00
parent 26a6771448
commit 5cc33cce2c
7 changed files with 23 additions and 28 deletions

View File

@ -1,12 +1,12 @@
<?php <?php
namespace App\Http\Controllers\Admin\Announcements; namespace App\Http\Controllers\Admin\Manage;
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;
use App\Http\Requests\Admin\Announcements\AnnouncementRequest; use App\Http\Requests\Admin\Manage\AnnouncementRequest;
use App\Http\Requests\PaginatedRequest; use App\Http\Requests\PaginatedRequest;
use App\Models\Announcement; use App\Models\Announcement;
use App\Services\Admin\Announcements\AnnouncementService; use App\Services\Admin\Manage\AnnouncementService;
use App\Services\Admin\Master\DepartmentService; use App\Services\Admin\Master\DepartmentService;
use Illuminate\Http\RedirectResponse; use Illuminate\Http\RedirectResponse;
use Inertia\Inertia; use Inertia\Inertia;
@ -21,7 +21,7 @@ public function __construct(
public function index(PaginatedRequest $request): Response public function index(PaginatedRequest $request): Response
{ {
return Inertia::render('admin/announcements/index', [ return Inertia::render('admin/manage/announcements/index', [
'announcements' => $this->service->paginated( 'announcements' => $this->service->paginated(
...$request->validatedWithDefaults(), ...$request->validatedWithDefaults(),
departmentId: $request->validated('department_id'), departmentId: $request->validated('department_id'),
@ -37,7 +37,7 @@ public function store(AnnouncementRequest $request): RedirectResponse
Inertia::flash('toast', ['type' => 'success', 'message' => 'Pengumuman berhasil ditambahkan.']); Inertia::flash('toast', ['type' => 'success', 'message' => 'Pengumuman berhasil ditambahkan.']);
return to_route('admin.announcements.index'); return to_route('admin.manage.announcements.index');
} }
public function update(AnnouncementRequest $request, Announcement $announcement): RedirectResponse public function update(AnnouncementRequest $request, Announcement $announcement): RedirectResponse
@ -46,7 +46,7 @@ public function update(AnnouncementRequest $request, Announcement $announcement)
Inertia::flash('toast', ['type' => 'success', 'message' => 'Pengumuman berhasil diperbarui.']); Inertia::flash('toast', ['type' => 'success', 'message' => 'Pengumuman berhasil diperbarui.']);
return to_route('admin.announcements.index'); return to_route('admin.manage.announcements.index');
} }
public function destroy(Announcement $announcement): RedirectResponse public function destroy(Announcement $announcement): RedirectResponse

View File

@ -1,6 +1,6 @@
<?php <?php
namespace App\Http\Requests\Admin\Announcements; namespace App\Http\Requests\Admin\Manage;
use Illuminate\Foundation\Http\FormRequest; use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Validation\Rule; use Illuminate\Validation\Rule;

View File

@ -1,6 +1,6 @@
<?php <?php
namespace App\Services\Admin\Announcements; namespace App\Services\Admin\Manage;
use App\Models\Announcement; use App\Models\Announcement;
use Illuminate\Contracts\Pagination\LengthAwarePaginator; use Illuminate\Contracts\Pagination\LengthAwarePaginator;

View File

@ -37,9 +37,9 @@ import { index as assignmentsRoute } from '@/routes/admin/academic-classes/assig
import { index as attendancesRoute } from '@/routes/admin/academic-classes/attendances'; import { index as attendancesRoute } from '@/routes/admin/academic-classes/attendances';
import { index as materialsRoute } from '@/routes/admin/academic-classes/materials'; import { index as materialsRoute } from '@/routes/admin/academic-classes/materials';
import { index as schedulesRoute } from '@/routes/admin/academic-classes/schedules'; import { index as schedulesRoute } from '@/routes/admin/academic-classes/schedules';
import { index as announcementsRoute } from '@/routes/admin/announcements';
import { index as feedbackRoute } from '@/routes/admin/feedback'; import { index as feedbackRoute } from '@/routes/admin/feedback';
import { index as tuitionInvoicesRoute } from '@/routes/admin/finances/tuition-invoices'; import { index as tuitionInvoicesRoute } from '@/routes/admin/finances/tuition-invoices';
import { index as announcementsRoute } from '@/routes/admin/manage/announcements';
import { index as courseClassesRoute } from '@/routes/admin/manage/course-classes'; import { index as courseClassesRoute } from '@/routes/admin/manage/course-classes';
import { index as courseRegistrationsRoute } from '@/routes/admin/manage/course-registrations'; import { index as courseRegistrationsRoute } from '@/routes/admin/manage/course-registrations';
import { index as academicTerm } from '@/routes/admin/master/academic-terms'; import { index as academicTerm } from '@/routes/admin/master/academic-terms';
@ -114,6 +114,11 @@ const data: {
url: courseClassesRoute.url(), url: courseClassesRoute.url(),
icon: School, icon: School,
}, },
{
name: 'Pengumuman',
url: announcementsRoute.url(),
icon: Megaphone,
},
], ],
}, },
{ {
@ -141,16 +146,6 @@ const data: {
}, },
], ],
}, },
{
label: 'Pengumuman',
items: [
{
name: 'Pengumuman',
url: announcementsRoute.url(),
icon: Megaphone,
},
],
},
{ {
label: 'Keuangan', label: 'Keuangan',
items: [ items: [

View File

@ -26,7 +26,7 @@ import {
destroy, destroy,
store, store,
update, update,
} from '@/routes/admin/announcements'; } from '@/routes/admin/manage/announcements';
import type { import type {
Announcement, Announcement,
AnnouncementDepartment, AnnouncementDepartment,

View File

@ -5,10 +5,10 @@
use App\Http\Controllers\Admin\AcademicClasses\MaterialController; use App\Http\Controllers\Admin\AcademicClasses\MaterialController;
use App\Http\Controllers\Admin\AcademicClasses\ScheduleController; use App\Http\Controllers\Admin\AcademicClasses\ScheduleController;
use App\Http\Controllers\Admin\AcademicClasses\SubmissionController; use App\Http\Controllers\Admin\AcademicClasses\SubmissionController;
use App\Http\Controllers\Admin\Announcements\AnnouncementController;
use App\Http\Controllers\Admin\FeedbackController; use App\Http\Controllers\Admin\FeedbackController;
use App\Http\Controllers\Admin\Finances\TuitionInvoiceController; use App\Http\Controllers\Admin\Finances\TuitionInvoiceController;
use App\Http\Controllers\Admin\Finances\TuitionPaymentController; use App\Http\Controllers\Admin\Finances\TuitionPaymentController;
use App\Http\Controllers\Admin\Manage\AnnouncementController;
use App\Http\Controllers\Admin\Manage\ClassEnrollmentController; use App\Http\Controllers\Admin\Manage\ClassEnrollmentController;
use App\Http\Controllers\Admin\Manage\CourseClassController; use App\Http\Controllers\Admin\Manage\CourseClassController;
use App\Http\Controllers\Admin\Manage\CourseRegistrationController; use App\Http\Controllers\Admin\Manage\CourseRegistrationController;
@ -76,6 +76,13 @@
Route::post('/', [ClassEnrollmentController::class, 'store'])->name('store'); Route::post('/', [ClassEnrollmentController::class, 'store'])->name('store');
Route::delete('{enrollment}', [ClassEnrollmentController::class, 'destroy'])->name('destroy'); Route::delete('{enrollment}', [ClassEnrollmentController::class, 'destroy'])->name('destroy');
}); });
Route::prefix('announcements')->name('announcements.')->group(function () {
Route::get('/', [AnnouncementController::class, 'index'])->name('index');
Route::post('/', [AnnouncementController::class, 'store'])->name('store');
Route::put('{announcement}', [AnnouncementController::class, 'update'])->name('update');
Route::delete('{announcement}', [AnnouncementController::class, 'destroy'])->name('destroy');
});
}); });
Route::middleware('role:mahasiswa')->prefix('course-registrations')->name('student.course-registrations.')->group(function () { Route::middleware('role:mahasiswa')->prefix('course-registrations')->name('student.course-registrations.')->group(function () {
@ -85,13 +92,6 @@
Route::get('{submission}', [CourseRegistrationController::class, 'show'])->name('show'); Route::get('{submission}', [CourseRegistrationController::class, 'show'])->name('show');
}); });
Route::prefix('admin/announcements')->name('admin.announcements.')->group(function () {
Route::get('/', [AnnouncementController::class, 'index'])->name('index');
Route::post('/', [AnnouncementController::class, 'store'])->name('store');
Route::put('{announcement}', [AnnouncementController::class, 'update'])->name('update');
Route::delete('{announcement}', [AnnouncementController::class, 'destroy'])->name('destroy');
});
Route::prefix('admin/finances')->name('admin.finances.')->group(function () { Route::prefix('admin/finances')->name('admin.finances.')->group(function () {
Route::resource('tuition-invoices', TuitionInvoiceController::class)->except(['create', 'edit', 'show']); Route::resource('tuition-invoices', TuitionInvoiceController::class)->except(['create', 'edit', 'show']);