From 52dd954e544f80063e56a26f57b83b7f4d786848 Mon Sep 17 00:00:00 2001 From: myuqinurrohman Date: Tue, 11 Mar 2025 14:18:20 +0700 Subject: [PATCH] feat: announcement --- app/Helpers/CustomHelper.php | 17 +++ .../Dashboard/AnnouncementController.php | 121 ++++++++++++++++++ .../Dashboard/DatatableController.php | 113 +++++++++++++++- .../Middleware/AnnouncementMiddleware.php | 32 +++++ app/Http/Requests/AnnouncementRequest.php | 44 +++++++ app/Models/Announcement.php | 28 ++++ app/Models/AnnouncementMedia.php | 26 ++++ app/Models/Media.php | 8 ++ bootstrap/app.php | 4 +- ...3_10_063647_create_announcements_table.php | 31 +++++ ...64204_create_announcements_media_table.php | 33 +++++ database/seeders/AnnouncementSeeder.php | 17 +++ .../assets/dashboard/images/information.png | Bin 0 -> 13766 bytes public/assets/dashboard/images/marketing.png | Bin 0 -> 18210 bytes .../dashboard/announcements/create.blade.php | 72 +++++++++++ .../dashboard/announcements/edit.blade.php | 73 +++++++++++ .../dashboard/announcements/index.blade.php | 63 +++++++++ .../announcements/media/index.blade.php | 65 ++++++++++ .../dashboard/announcements/read.blade.php | 65 ++++++++++ .../dashboard/announcements/show.blade.php | 80 ++++++++++++ .../issue-managements/create.blade.php | 2 +- .../issue-managements/edit.blade.php | 2 +- .../issue-managements/index.blade.php | 2 +- .../media-monitorings/create.blade.php | 4 +- .../media-monitorings/edit.blade.php | 4 +- .../media-monitorings/index.blade.php | 2 +- .../media-monitorings/show.blade.php | 4 +- .../views/partials/app/datatable.blade.php | 56 +++++++- .../views/partials/dashboard/header.blade.php | 57 ++++++++- .../partials/dashboard/sidebar.blade.php | 14 +- routes/web.php | 28 +++- 31 files changed, 1046 insertions(+), 21 deletions(-) create mode 100644 app/Http/Controllers/Dashboard/AnnouncementController.php create mode 100644 app/Http/Middleware/AnnouncementMiddleware.php create mode 100644 app/Http/Requests/AnnouncementRequest.php create mode 100644 app/Models/Announcement.php create mode 100644 app/Models/AnnouncementMedia.php create mode 100644 database/migrations/2025_03_10_063647_create_announcements_table.php create mode 100644 database/migrations/2025_03_10_064204_create_announcements_media_table.php create mode 100644 database/seeders/AnnouncementSeeder.php create mode 100644 public/assets/dashboard/images/information.png create mode 100644 public/assets/dashboard/images/marketing.png create mode 100644 resources/views/dashboard/announcements/create.blade.php create mode 100644 resources/views/dashboard/announcements/edit.blade.php create mode 100644 resources/views/dashboard/announcements/index.blade.php create mode 100644 resources/views/dashboard/announcements/media/index.blade.php create mode 100644 resources/views/dashboard/announcements/read.blade.php create mode 100644 resources/views/dashboard/announcements/show.blade.php diff --git a/app/Helpers/CustomHelper.php b/app/Helpers/CustomHelper.php index c04403e..f186998 100644 --- a/app/Helpers/CustomHelper.php +++ b/app/Helpers/CustomHelper.php @@ -154,3 +154,20 @@ function slugify($param) { return Str::slug($param); } } + +if (! function_exists('get_unread_announcements')) { + function get_unread_announcements() { + $user = User::findOrFail(Auth::id()); + if($user->role_id === 3){ + $mediaId = $user->company->media->id; + + $media = Media::with('announcements')->findOrFail($mediaId); + return $media->announcements() + ->wherePivot('status', '=', '0') + ->count(); + + }else{ + return 0; + } + } +} diff --git a/app/Http/Controllers/Dashboard/AnnouncementController.php b/app/Http/Controllers/Dashboard/AnnouncementController.php new file mode 100644 index 0000000..3260365 --- /dev/null +++ b/app/Http/Controllers/Dashboard/AnnouncementController.php @@ -0,0 +1,121 @@ + 'Pengumuman' + ]); + }else if(is_role(['3'])){ + return view('dashboard.announcements.media.index', [ + 'title' => 'Pengumuman' + ]); + } + } + + public function create(){ + return view('dashboard.announcements.create', [ + 'title' => 'Tambah Pengumuman', + 'media' => Media::all() + ]); + } + + public function store(AnnouncementRequest $request){ + $validatedData = $request->validated(); + $validatedData['enhancer_id'] = Auth::id(); + + $announcement = Announcement::create($validatedData); + $announcement->media()->attach($validatedData['media_ids']); + + if ($announcement->media()->count() > 0) { + return redirect()->back()->with('success-status', 'Berhasil membuat pengumuman.'); + } else { + return redirect()->back()->with('failed-status', 'Gagal membuat pengumuman'); + } + } + + public function edit($id){ + $announcement = Announcement::with(['media'])->findOrFail(decrypt_id($id)); + + return view('dashboard.announcements.edit', [ + 'title' => 'Tambah Pengumuman', + 'announcement' => $announcement, + 'media' => Media::all(), + 'selectedMediaIds' => $announcement->media->pluck('id')->toArray() + ]); + } + + public function update(AnnouncementRequest $request, $id){ + $validatedData = $request->validated(); + $validatedData['enhancer_id'] = Auth::id(); + + $announcement = Announcement::with(['media'])->findOrFail(decrypt_id($id)); + + $announcement->update($validatedData); + if ($request->has('media_ids')) { + $mediaData = []; + foreach ($validatedData['media_ids'] as $mediaId) { + $mediaData[$mediaId] = ['status' => '0']; + } + + $announcement->media()->sync($mediaData); + } + + if ($announcement->media()->count() > 0) { + return redirect()->back()->with('success-status', 'Berhasil mengubah pengumuman.'); + } else { + return redirect()->back()->with('failed-status', 'Gagal mengubah pengumuman'); + } + } + + public function show($id){ + $announcement = Announcement::with(['media'])->findOrFail(decrypt_id($id)); + + return view('dashboard.announcements.show', [ + 'title' => 'Detail Pengumuman', + 'announcement' => $announcement, + ]); + } + + public function read($id){ + $announcement = Announcement::with(['media'])->findOrFail(decrypt_id($id)); + + $mediaId = Auth::user()->company->media->id; + if(!in_array($mediaId, $announcement->media->pluck('id')->toArray())){ + abort(404, "Pengumuman tidak ditemukan."); + } + + $announcement->media()->updateExistingPivot($mediaId, [ + 'status' => '1', + ]); + + return view('dashboard.announcements.read', [ + 'title' => 'Detail Pengumuman', + 'announcement' => $announcement, + ]); + } + + public function destroy($id){ + try { + $announcement = Announcement::with(['media'])->findOrFail(decrypt_id($id)); + + $announcement->media()->detach(); + + $announcement->delete(); + + return response()->json(['message' => 'Berhasil menghapus pengumuman.']); + } catch (\Exception $e) { + return response()->json(['message' => 'Gagal menghapus pengumuman.'], 500); + } + } +} diff --git a/app/Http/Controllers/Dashboard/DatatableController.php b/app/Http/Controllers/Dashboard/DatatableController.php index 0d6a45f..ce17373 100644 --- a/app/Http/Controllers/Dashboard/DatatableController.php +++ b/app/Http/Controllers/Dashboard/DatatableController.php @@ -4,6 +4,7 @@ use App\Http\Controllers\Controller; use App\Models\AiringProofTheme; +use App\Models\Announcement; use App\Models\Classification; use App\Models\Company; use App\Models\ContentRecap; @@ -399,6 +400,112 @@ public function news(Request $request){ } + public function announcement(Request $request){ + if ($request->ajax()) { + $data = Announcement::whereHas('media', function ($query) { + $query->where('announcements_media.category', 'general'); + })->get(); + + + return DataTables::of($data) + ->addIndexColumn() + ->addColumn('sent_at', function ($data) { + return idn_date($data->created_at, 'l, d F Y'); + }) + ->addColumn('action', function ($data) { + $showUrl = route('dashboard.announcements.show', ['id' => encrypt_id($data->id)]); + + $editUrl = route('dashboard.announcements.edit', ['id' => encrypt_id($data->id)]); + + $deleteUrl = route('dashboard.announcements.destroy', ['id' => encrypt_id($data->id)]); + + $dropdown = ''; + + return $dropdown; + }) + + ->rawColumns(['action']) + ->make(true); + } + + return response()->json(['error' => 'Unauthorized'], 401); + + } + + public function mediaAnnouncement(Request $request){ + if ($request->ajax()) { + $data = Media::with(['announcements'])->findOrFail(Auth::user()->company->media->id)->announcements; + + + return DataTables::of($data) + ->addIndexColumn() + ->addColumn('sent_at', function ($data) { + return idn_date($data->created_at, 'l, d F Y'); + }) + ->addColumn('sender', function ($data) { + return $data->enhancer->name. ' (admin)'; + }) + ->addColumn('status', function ($data) { + if ($data->pivot->status == '0') { + return 'Belum Dibaca'; + }else{ + return 'Sudah Dibaca'; + } + }) + ->addColumn('action', function ($data) { + $showUrl = route('dashboard.announcements.read', ['id' => encrypt_id($data->id)]); + + $editUrl = route('dashboard.announcements.edit', ['id' => encrypt_id($data->id)]); + + $deleteUrl = route('dashboard.announcements.destroy', ['id' => encrypt_id($data->id)]); + + $dropdown = ''; + + return $dropdown; + }) + + ->rawColumns(['sender', 'status', 'action']) + ->make(true); + } + + return response()->json(['error' => 'Unauthorized'], 401); + + } + public function airingProofTheme(Request $request){ if ($request->ajax()) { @@ -1167,13 +1274,13 @@ public function mediaMonitoring(Request $request){ } }) ->addColumn('action', function ($data) { - $showUrl = route('dashboard.media.monitoring.show', ['id' => encrypt_id($data->id)]); + $showUrl = route('dashboard.media.monitorings.show', ['id' => encrypt_id($data->id)]); $addIssueUrl = route('dashboard.issue.managements.create', ['media_monitoring' => encrypt_id($data->id)]); - $editUrl = route('dashboard.media.monitoring.edit', ['id' => encrypt_id($data->id)]); + $editUrl = route('dashboard.media.monitorings.edit', ['id' => encrypt_id($data->id)]); - $deleteUrl = route('dashboard.media.monitoring.destroy', ['id' => encrypt_id($data->id)]); + $deleteUrl = route('dashboard.media.monitorings.destroy', ['id' => encrypt_id($data->id)]); $dropdown = ' -
  • Tambah
  • +
  • Tambah
  • diff --git a/resources/views/dashboard/media-monitorings/create.blade.php b/resources/views/dashboard/media-monitorings/create.blade.php index 898ec13..5069ff4 100644 --- a/resources/views/dashboard/media-monitorings/create.blade.php +++ b/resources/views/dashboard/media-monitorings/create.blade.php @@ -12,7 +12,7 @@
    {{$title}}
    -
    + @csrf
    @@ -153,7 +153,7 @@

    - Kembali + Kembali
    diff --git a/resources/views/dashboard/media-monitorings/edit.blade.php b/resources/views/dashboard/media-monitorings/edit.blade.php index ed9b14b..da2a7f6 100644 --- a/resources/views/dashboard/media-monitorings/edit.blade.php +++ b/resources/views/dashboard/media-monitorings/edit.blade.php @@ -12,7 +12,7 @@
    {{$title}}
    - + @csrf @method('put')
    @@ -154,7 +154,7 @@

    - Kembali + Kembali
    diff --git a/resources/views/dashboard/media-monitorings/index.blade.php b/resources/views/dashboard/media-monitorings/index.blade.php index c2be48e..63a3bf3 100644 --- a/resources/views/dashboard/media-monitorings/index.blade.php +++ b/resources/views/dashboard/media-monitorings/index.blade.php @@ -28,7 +28,7 @@
    --}} -
  • Tambah
  • +
  • Tambah
  • diff --git a/resources/views/dashboard/media-monitorings/show.blade.php b/resources/views/dashboard/media-monitorings/show.blade.php index 6fa30a4..a4efe59 100644 --- a/resources/views/dashboard/media-monitorings/show.blade.php +++ b/resources/views/dashboard/media-monitorings/show.blade.php @@ -128,8 +128,8 @@ diff --git a/resources/views/partials/app/datatable.blade.php b/resources/views/partials/app/datatable.blade.php index 7f179f4..17baa50 100644 --- a/resources/views/partials/app/datatable.blade.php +++ b/resources/views/partials/app/datatable.blade.php @@ -184,6 +184,60 @@ @endif +@if ($datatable === 'announcement') + +@endif + +@if ($datatable === 'media_announcement') + +@endif + @if ($datatable === 'airing_proof_theme')