diff --git a/app/Exports/MediaMonitoringExport.php b/app/Exports/MediaMonitoringExport.php new file mode 100644 index 0000000..ce55c31 --- /dev/null +++ b/app/Exports/MediaMonitoringExport.php @@ -0,0 +1,151 @@ +news_title = $news_title; + $this->channel = $channel; + $this->issue_status = $issue_status; + $this->input_year = $input_year; + $this->input_month = $input_month; + $this->input_date = $input_date; + $this->release_year = $release_year; + $this->release_month = $release_month; + $this->release_date = $release_date; + } + + public function collection() + { + $query = MediaMonitoring::with(['enhancer', 'issue']); + + if($this->news_title){ + $query->where('title', 'LIKE', '%'. $this->news_title.'%'); + } + + if($this->channel && $this->channel !== 'all'){ + $query->where('channel', $this->channel); + } + + if ($this->issue_status && $this->issue_status !== 'all') { + if ($this->issue_status === 'added') { + $query->whereHas('issue'); + } elseif ($this->issue_status === 'not_added') { + $query->whereDoesntHave('issue'); + } + } + + if ($this->input_year) { + $query->whereYear('created_at', $this->input_year); + } + + if ($this->input_month) { + $monthYear = Carbon::parse($this->input_month); + $query->whereYear('created_at', $monthYear->year) + ->whereMonth('created_at', $monthYear->month); + } + + if ($this->input_date) { + $query->whereDate('created_at', $this->input_date); + } + + if ($this->release_year) { + $query->whereYear('release_date', $this->release_year); + } + + if ($this->release_month) { + $monthYear = Carbon::parse($this->release_month); + $query->whereYear('release_date', $monthYear->year) + ->whereMonth('release_date', $monthYear->month); + } + + if ($this->release_date) { + $query->whereDate('release_date', $this->release_date); + } + + return $query->get(); + } + + public function map($mediaMonitoring): array + { + return [ + $this->no++, + $mediaMonitoring->code, + $mediaMonitoring->title, + $mediaMonitoring->media_name, + $mediaMonitoring->theme, + $mediaMonitoring->writter, + $mediaMonitoring->channel, + $mediaMonitoring->keyword, + $mediaMonitoring->influencer, + $mediaMonitoring->link, + $mediaMonitoring->news_page, + $mediaMonitoring->release_date, + $mediaMonitoring->issue ? 'Sudah Ditambahkan' : 'Belum Ditambahkan', + $mediaMonitoring->enhancer->name ?? 'Admin', + Carbon::parse($mediaMonitoring->created_at)->locale('id')->translatedFormat('l, d F Y'), + ]; + } + + public function headings(): array + { + return [ + ['Data Rekap Konten', '', '', '', '', '', '', '', '', '', '', '', '', ''], + ['NO', 'Kode', 'Judul Berita', 'Media', 'Tema', 'Penulis', 'Channel', 'Kata Kunci', 'Influencer', 'Link', 'Halaman Berita', 'Tanggal Rilis', 'Status Isu', 'Oleh', + 'Tanggal Input'] + ]; + } + + public function styles(Worksheet $sheet) + { + $sheet->mergeCells('A1:N1'); // A1 sampai D1 digabung + + // Set alignment untuk pusat horizontal dan vertikal + $sheet->getStyle('A1:N1')->getAlignment()->setHorizontal('center'); + $sheet->getStyle('A1:N1')->getAlignment()->setVertical('center'); + + $sheet->getColumnDimension('A')->setWidth(7); // Set column A width + $sheet->getColumnDimension('B')->setAutoSize(true); + $sheet->getColumnDimension('C')->setAutoSize(true); + $sheet->getColumnDimension('D')->setAutoSize(true); + $sheet->getColumnDimension('E')->setAutoSize(true); + $sheet->getColumnDimension('F')->setAutoSize(true); + $sheet->getColumnDimension('G')->setAutoSize(true); + $sheet->getColumnDimension('H')->setAutoSize(true); + $sheet->getColumnDimension('I')->setAutoSize(true); + $sheet->getColumnDimension('J')->setAutoSize(true); + $sheet->getColumnDimension('K')->setAutoSize(true); + $sheet->getColumnDimension('L')->setAutoSize(true); + $sheet->getColumnDimension('M')->setAutoSize(true); + $sheet->getColumnDimension('N')->setAutoSize(true); + + // Menambahkan gaya lain jika diperlukan + $sheet->getStyle('A1:N1')->getFont()->setBold(true); + $sheet->getStyle('A1:N1')->getFont()->setSize(14); + } +} diff --git a/app/Http/Controllers/Dashboard/DatatableController.php b/app/Http/Controllers/Dashboard/DatatableController.php index 9330d5b..f32f7f2 100644 --- a/app/Http/Controllers/Dashboard/DatatableController.php +++ b/app/Http/Controllers/Dashboard/DatatableController.php @@ -2193,9 +2193,68 @@ public function contentRecap(Request $request){ public function mediaMonitoring(Request $request){ if ($request->ajax()) { + $news_title = $request->input('news_title', null); + $channel = $request->input('channel', null); + $issue_status = $request->input('issue_status', null); + $keyword = $request->input('keyword', null); + $input_year = $request->input('input_year', null); + $input_month = $request->input('input_month', null); + $input_date = $request->input('input_date', null); + $release_year = $request->input('release_year', null); + $release_month = $request->input('release_month', null); + $release_date = $request->input('release_date', null); + $query = MediaMonitoring::with(['enhancer', 'issue']); - $data = MediaMonitoring::with(['enhancer'])->get(); + if($news_title){ + $query->where('title', 'LIKE', '%'. $news_title.'%'); + } + + if($channel && $channel !== 'all'){ + $query->where('channel', $channel); + } + + if ($issue_status && $issue_status !== 'all') { + if ($issue_status === 'added') { + $query->whereHas('issue'); + } elseif ($issue_status === 'not_added') { + $query->whereDoesntHave('issue'); + } + } + + if($keyword){ + $query->where('keyword', 'LIKE', '%'. $keyword.'%'); + } + + if ($input_year) { + $query->whereYear('created_at', $input_year); + } + + if ($input_month) { + $monthYear = Carbon::parse($input_month); + $query->whereYear('created_at', $monthYear->year) + ->whereMonth('created_at', $monthYear->month); + } + + if ($input_date) { + $query->whereDate('created_at', $input_date); + } + + if ($release_year) { + $query->whereYear('release_date', $release_year); + } + + if ($release_month) { + $monthYear = Carbon::parse($release_month); + $query->whereYear('release_date', $monthYear->year) + ->whereMonth('release_date', $monthYear->month); + } + + if ($release_date) { + $query->whereDate('release_date', $release_date); + } + + $data = $query->get(); return DataTables::of($data) ->addIndexColumn() @@ -2203,10 +2262,11 @@ public function mediaMonitoring(Request $request){ return $data->enhancer ? $data->enhancer->name : 'Undefined'; }) ->addColumn('input_date', function ($data) { - return idn_date($data->input_date, 'd F Y'); + return idn_date($data->created_at, 'd F Y'); }) ->addColumn('title', function ($data) { - return shorten_text($data->title, 40); + return ''.shorten_text($data->title, 40).''; + // return shorten_text($data->title, 40); }) ->addColumn('link', function ($data) { if(filled($data->link)){ @@ -2215,6 +2275,9 @@ public function mediaMonitoring(Request $request){ return '-'; } }) + ->addColumn('channel', function ($data) { + return ucfirst($data->channel); + }) ->addColumn('issue_status', function ($data) { if ($data->issue) { return 'Sudah Ditambahkan'; @@ -2257,7 +2320,7 @@ public function mediaMonitoring(Request $request){ return $dropdown; }) - ->rawColumns(['issue_status', 'link', 'action']) + ->rawColumns(['title', 'issue_status', 'link', 'action']) ->make(true); } diff --git a/app/Http/Controllers/Dashboard/MediaMonitoringController.php b/app/Http/Controllers/Dashboard/MediaMonitoringController.php index 329b3cb..4cbe1ca 100644 --- a/app/Http/Controllers/Dashboard/MediaMonitoringController.php +++ b/app/Http/Controllers/Dashboard/MediaMonitoringController.php @@ -2,17 +2,30 @@ namespace App\Http\Controllers\Dashboard; +use App\Exports\MediaMonitoringExport; use App\Http\Controllers\Controller; use App\Http\Requests\MediaMonitoringRequest; use App\Models\MediaMonitoring; +use Carbon\Carbon; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; +use Maatwebsite\Excel\Facades\Excel; class MediaMonitoringController extends Controller { - public function index(){ + public function index(Request $request){ return view('dashboard.media-monitorings.index', [ - 'title' => 'Monitoring Media' + 'title' => 'Monitoring Media', + 'news_title' => $request->input('news_title', null), + 'channel' => $request->input('channel', null), + 'issue_status' => $request->input('issue_status', null), + 'keyword' => $request->input('keyword', null), + 'input_year' => $request->input('input_year', null), + 'input_month' => $request->input('input_month', null), + 'input_date' => $request->input('input_date', null), + 'release_year' => $request->input('release_year', null), + 'release_month' => $request->input('release_month', null), + 'release_date' => $request->input('release_date', null), ]); } @@ -107,4 +120,37 @@ public function checkLink(Request $request) 'exists' => $linkExists ]); } + + public function filter(Request $request){ + + $filteredRequest = $request->except('_token'); + + // if(!$request->has('news_title')){ + // unset($filteredRequest['news_title']); + // } + + $filterField = array_filter($filteredRequest, function ($value) { + return filled($value); + }); + + return redirect()->route('dashboard.media.monitorings.index', $filterField); + } + + public function export(Request $request) + { + $news_title = $request->input('news_title', null); + $channel = $request->input('channel', 'all'); + $issue_status = $request->input('issue_status', 'all'); + $keywords = $request->input('keywords', 'all'); + $input_year = $request->input('input_year', null); + $input_month = $request->input('input_month', null); + $input_date = $request->input('input_date', null); + $release_year = $request->input('release_year', null); + $release_month = $request->input('release_month', null); + $release_date = $request->input('release_date', null); + + $formattedNow = Carbon::parse(now())->locale('id')->translatedFormat('d-m-Y'); + + return Excel::download(new MediaMonitoringExport($news_title, $channel, $issue_status, $input_year, $input_month, $input_date, $release_year, $release_month, $release_date), 'media-monitoring-'.$formattedNow.'.xlsx'); + } } diff --git a/app/Http/Requests/MediaMonitoringRequest.php b/app/Http/Requests/MediaMonitoringRequest.php index d938747..12de9d4 100644 --- a/app/Http/Requests/MediaMonitoringRequest.php +++ b/app/Http/Requests/MediaMonitoringRequest.php @@ -27,11 +27,12 @@ public function rules(): array 'theme' => ['required', 'max:100'], 'title' => ['required'], 'link' => ['nullable', 'url'], - 'writter' => ['required'], + 'news_page' => ['nullable'], + 'writter' => ['required', 'max:100'], 'channel'=> ['required', 'in:website,tiktok,youtube,instagram,facebook,twitter,cetak'], 'content' => ['required'], - 'influencer' => ['nullable'], - 'keyword' => ['required'], + 'influencer' => ['nullable', 'max:100'], + 'keyword' => ['required', 'max:100'], 'quote' => ['nullable'], 'release_date' => ['required', 'date'], ]; @@ -45,40 +46,50 @@ public function rules(): array return $rules; } + protected function prepareForValidation() + { + $this->merge([ + 'link' => filled($this->link) ? $this->link : null, + 'influencer' => filled($this->influencer) ? $this->influencer : null, + 'quote' => filled($this->quote) ? $this->quote : null, + ]); + } + public function messages() -{ - return [ - 'media_name.required' => 'Nama media wajib diisi.', - 'media_name.max' => 'Nama media tidak boleh lebih dari 100 karakter.', + { + return [ + 'media_name.required' => 'Nama media wajib diisi.', + 'media_name.max' => 'Nama media tidak boleh lebih dari 100 karakter.', - 'theme.required' => 'Tema wajib diisi.', - 'theme.max' => 'Tema tidak boleh lebih dari 100 karakter.', + 'theme.required' => 'Tema wajib diisi.', + 'theme.max' => 'Tema tidak boleh lebih dari 100 karakter.', - 'title.required' => 'Judul wajib diisi.', + 'title.required' => 'Judul wajib diisi.', - 'link.url' => 'Link harus dalam format URL yang valid.', + 'link.url' => 'Link harus berupa URL yang valid.', - 'writter.required' => 'Nama penulis wajib diisi.', + 'writter.required' => 'Nama penulis wajib diisi.', + 'writter.max' => 'Nama penulis tidak boleh lebih dari 100 karakter.', - 'channel.required' => 'Channel wajib dipilih.', - 'channel.in' => 'Channel yang dipilih tidak valid.', + 'channel.required' => 'Channel wajib dipilih.', + 'channel.in' => 'Channel yang dipilih tidak valid. Pilih salah satu dari: website, tiktok, youtube, instagram, facebook, twitter, atau cetak.', - 'content.required' => 'Konten wajib diisi.', + 'content.required' => 'Konten wajib diisi.', - 'influencer.nullable' => 'Nama influencer boleh dikosongkan.', + 'influencer.max' => 'Nama influencer tidak boleh lebih dari 100 karakter.', - 'keyword.required' => 'Keyword wajib diisi.', + 'keyword.required' => 'Keyword wajib diisi.', + 'keyword.max' => 'Keyword tidak boleh lebih dari 100 karakter.', - 'quote.nullable' => 'Quote boleh dikosongkan.', + 'release_date.required' => 'Tanggal rilis wajib diisi.', + 'release_date.date' => 'Tanggal rilis harus dalam format tanggal yang valid.', - 'release_date.required' => 'Tanggal rilis wajib diisi.', - 'release_date.date' => 'Tanggal rilis harus dalam format tanggal yang valid.', + 'image.required' => 'Gambar wajib diunggah.', + 'image.image' => 'File yang diunggah harus berupa gambar.', + 'image.mimes' => 'Gambar hanya boleh berformat PNG, JPG, atau JPEG.', + 'image.max' => 'Ukuran gambar tidak boleh lebih dari 2MB.', + ]; + } - 'image.required' => 'Gambar wajib diunggah.', - 'image.image' => 'File yang diunggah harus berupa gambar.', - 'image.mimes' => 'Gambar hanya boleh berformat PNG, JPG, atau JPEG.', - 'image.max' => 'Gambar tidak boleh lebih dari 2MB.', - ]; -} } diff --git a/resources/views/dashboard/media-monitorings/create.blade.php b/resources/views/dashboard/media-monitorings/create.blade.php index 5e5b979..ded5fe2 100644 --- a/resources/views/dashboard/media-monitorings/create.blade.php +++ b/resources/views/dashboard/media-monitorings/create.blade.php @@ -10,16 +10,19 @@
-
{{$title}}
+
+
Buat Monitoring Media Baru
+

Masukkan informasi yang diperlukan untuk membuat monitoring media.

+
-
+ @csrf
- +
@error('media_name') {{$message}} @@ -30,18 +33,18 @@
- +
@error('theme') {{$message}} @enderror
-
+
- +
@error('title') {{$message}} @@ -52,7 +55,7 @@
- +
@error('link') @@ -64,7 +67,7 @@
- +
@error('writter') {{$message}} @@ -76,6 +79,7 @@
+ @error('channel') + {{$message}} + @enderror +
+
+
+
+ +
+ +
+ @error('news_page') + {{$message}} + @enderror
@@ -102,7 +120,7 @@
- +
@error('influencer') {{$message}} @@ -113,7 +131,7 @@
- +
@error('keyword') {{$message}} @@ -132,7 +150,7 @@
- +
@error('release_date') {{$message}} @@ -143,7 +161,10 @@
- +
+ + +
@error('image') {{$message}} @@ -154,7 +175,7 @@
Kembali - +
diff --git a/resources/views/dashboard/media-monitorings/edit.blade.php b/resources/views/dashboard/media-monitorings/edit.blade.php index da2a7f6..b104290 100644 --- a/resources/views/dashboard/media-monitorings/edit.blade.php +++ b/resources/views/dashboard/media-monitorings/edit.blade.php @@ -10,9 +10,12 @@
-
{{$title}}
+
+
Ubah Monitoring Media
+

Perbarui informasi monitoring media ini.

+
- + @csrf @method('put')
@@ -20,7 +23,7 @@
- +
@error('media_name') {{$message}} @@ -31,18 +34,18 @@
- +
@error('theme') {{$message}} @enderror
-
+
- +
@error('title') {{$message}} @@ -53,7 +56,7 @@
- +
@error('link') @@ -65,7 +68,7 @@
- +
@error('writter') {{$message}} @@ -86,6 +89,20 @@
+ @error('channel') + {{$message}} + @enderror +
+
+
+
+ +
+ +
+ @error('news_page') + {{$message}} + @enderror
@@ -103,7 +120,7 @@
- +
@error('influencer') {{$message}} @@ -114,7 +131,7 @@
- +
@error('keyword') {{$message}} @@ -142,9 +159,22 @@
- +
- +
+ + +
@error('image') {{$message}} @@ -155,11 +185,26 @@
Kembali - +
+
diff --git a/resources/views/dashboard/media-monitorings/index.blade.php b/resources/views/dashboard/media-monitorings/index.blade.php index 63a3bf3..0f7178f 100644 --- a/resources/views/dashboard/media-monitorings/index.blade.php +++ b/resources/views/dashboard/media-monitorings/index.blade.php @@ -16,18 +16,25 @@
@@ -35,6 +42,7 @@
+ {{-- {{asset('assets/dashboard/css/custom.css')}} --}}
@@ -48,6 +56,9 @@ Tanggal Input Judul Media + Kanal + Tema + Penulis Link Issue @@ -58,6 +69,196 @@
+ +
diff --git a/resources/views/partials/app/datatable.blade.php b/resources/views/partials/app/datatable.blade.php index ccbf53f..ab7dc21 100644 --- a/resources/views/partials/app/datatable.blade.php +++ b/resources/views/partials/app/datatable.blade.php @@ -1041,7 +1041,22 @@ $('#mediaMonitoringsTable').DataTable({ processing: true, serverSide: true, - ajax: '{{ route('dashboard.media.monitorings.data') }}', + ajax: { + url: '{{ route('dashboard.media.monitorings.data') }}', + type: 'GET', + data: function(d) { + d.news_title = '{{ $news_title }}'; + d.channel = '{{ $channel }}'; + d.issue_status = '{{ $issue_status }}'; + d.keyword = '{{ $keyword }}'; + d.input_year = '{{ $input_year }}'; + d.input_month = '{{ $input_month }}'; + d.input_date = '{{ $input_date }}'; + d.release_year = '{{ $release_year }}'; + d.release_month = '{{ $release_month }}'; + d.release_date = '{{ $release_date }}'; + } + }, columns: [ { data: 'DT_RowIndex', name: 'DT_RowIndex', orderable: false, searchable: false }, { data: 'enhancer', name: 'enhancer' }, @@ -1049,6 +1064,9 @@ { data: 'input_date', name: 'input_date' }, { data: 'title', name: 'title' }, { data: 'media_name', name: 'media_name' }, + { data: 'channel', name: 'channel' }, + { data: 'theme', name: 'theme' }, + { data: 'writter', name: 'writter' }, { data: 'link', name: 'link' }, { data: 'issue_status', name: 'issue_status' }, { data: 'action', name: 'action', orderable: false, searchable: false }, @@ -1058,7 +1076,7 @@ language: datatableLanguage, // responsive: true, autoWidth: false, - order: [[9, 'desc']], + order: [[11, 'desc']], pagingType: "simple", lengthMenu: [[10, 25, 50, 100, -1], ['Tampilkan 10 data', 'Tampilkan 25 data', 'Tampilkan 50 data', 'Tampilkan 100 data', 'Tampilkan semua']], scrollX: true diff --git a/routes/web.php b/routes/web.php index fd3cf7e..bd38456 100644 --- a/routes/web.php +++ b/routes/web.php @@ -516,6 +516,9 @@ Route::get('/{id}/edit', 'edit')->name('edit'); Route::put('/{id}', 'update')->name('update'); Route::delete('/{id}', 'destroy')->name('destroy'); + + Route::post('/export', 'export')->name('export'); + Route::post('/filter', 'filter')->name('filter'); }); Route::get('/data', [DatatableController::class, 'mediaMonitoring'])->name('data');