diff --git a/app/Exports/JournalistExport.php b/app/Exports/JournalistExport.php new file mode 100644 index 0000000..d6ce346 --- /dev/null +++ b/app/Exports/JournalistExport.php @@ -0,0 +1,141 @@ +media_ids = $media_ids; + $this->status = $status; + $this->edit_status = $edit_status; + $this->register_year = $register_year; + $this->register_month = $register_month; + $this->register_date = $register_date; + } + + public function collection() + { + $query = Journalist::with(['media' => function($q) { + $q->withTrashed(); + }, 'media.company' => function($q) { + $q->withTrashed(); + }, 'media.company.user' => function($q) { + $q->withTrashed(); + }]) + ->where('approved_status', '1') + ->whereNull('deleted_at'); + + if (is_array($this->media_ids) && !in_array('all', $this->media_ids)) { + $query->whereIn('media_id', array_map('decrypt_id', $this->media_ids)); + } + + if ($this->status !== 'all') { + if ($this->status === 'waiting') { + $query->whereHas('media.company.user', function ($q) { + $q->where('status', '0'); // Status waiting di User + }); + } elseif ($this->status === 'accepted') { + $query->whereHas('media.company.user', function ($q) { + $q->where('status', '1'); // Status accepted di User + }); + } elseif ($this->status === 'rejected') { + $query->whereHas('media.company.user', function ($q) { + $q->where('status', '2'); // Status rejected di User + }); + } + } + + if($this->edit_status !== 'all'){ + if($this->edit_status === 'no-edit'){ + $query->where('edit_status', '0'); + }elseif($this->edit_status === 'waiting'){ + $query->where('edit_status', '1'); + }else if($this->edit_status === 'accepted'){ + $query->where('edit_status', '2'); + }else if($this->edit_status === 'rejected'){ + $query->where('edit_status', '3'); + } + } + + if ($this->register_year) { + $query->whereYear('created_at', $this->register_year); + } + + if ($this->register_month) { + $monthYear = Carbon::parse($this->register_month); + $query->whereYear('created_at', $monthYear->year) + ->whereMonth('created_at', $monthYear->month); + } + + if ($this->register_date) { + $query->whereDate('created_at', $this->register_date); + } + + return $query->get(); + } + + public function map($journalist): array + { + return [ + $this->no++, + $journalist->name, + $journalist->media->name, + $journalist->media->company->name, + $journalist->media->company->email, + get_user_status($journalist->media->company->user->status), + get_edit_status($journalist->edit_status), + Carbon::parse($journalist->created_at)->locale('id')->translatedFormat('l, d F Y'), + ]; + } + + public function headings(): array + { + return [ + ['Data Jurnalis', '', '', '', '', '', '', ''], + ['NO', 'Nama Jurnalis', 'Nama Media', 'Nama Perusahaan', 'Email', 'Status', 'Status Edit', 'Tanggal Daftar'] + ]; + } + + public function styles(Worksheet $sheet) + { + $sheet->mergeCells('A1:H1'); // A1 sampai D1 digabung + + // Set alignment untuk pusat horizontal dan vertikal + $sheet->getStyle('A1:H1')->getAlignment()->setHorizontal('center'); + $sheet->getStyle('A1:H1')->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); + + // Menambahkan gaya lain jika diperlukan + $sheet->getStyle('A1:H1')->getFont()->setBold(true); + $sheet->getStyle('A1:H1')->getFont()->setSize(14); + } +} diff --git a/app/Http/Controllers/Dashboard/DatatableController.php b/app/Http/Controllers/Dashboard/DatatableController.php index a0f18f7..fc24022 100644 --- a/app/Http/Controllers/Dashboard/DatatableController.php +++ b/app/Http/Controllers/Dashboard/DatatableController.php @@ -1002,16 +1002,76 @@ public function media(Request $request){ public function journalist(Request $request){ if ($request->ajax()) { - $data = Journalist::with(['media' => function($query) { - $query->withTrashed(); - }, 'media.company' => function($query) { - $query->withTrashed(); - }, 'media.company.user' => function($query) { - $query->withTrashed(); + $media_ids = $request->input('media_ids', null); + $media_ids_array = json_decode(rtrim($media_ids, ';'), true); + $status = $request->input('status', null); + $edit_status = $request->input('edit_status', null); + $address = $request->input('address', null); + $register_year = $request->input('register_year', null); + $register_month = $request->input('register_month', null); + $register_date = $request->input('register_date', null); + + $query = Journalist::with(['media' => function($q) { + $q->withTrashed(); + }, 'media.company' => function($q) { + $q->withTrashed(); + }, 'media.company.user' => function($q) { + $q->withTrashed(); }]) ->where('approved_status', '1') - ->whereNull('deleted_at') - ->get(); + ->whereNull('deleted_at'); + + if (is_array($media_ids_array) && !in_array('all', $media_ids_array)) { + $query->whereIn('media_id', array_map('decrypt_id', $media_ids_array)); + } + + if ($status !== 'all') { + if ($status === 'waiting') { + $query->whereHas('media.company.user', function ($q) { + $q->where('status', '0'); // Status waiting di User + }); + } elseif ($status === 'accepted') { + $query->whereHas('media.company.user', function ($q) { + $q->where('status', '1'); // Status accepted di User + }); + } elseif ($status === 'rejected') { + $query->whereHas('media.company.user', function ($q) { + $q->where('status', '2'); // Status rejected di User + }); + } + } + + if($edit_status !== 'all'){ + if($edit_status === 'no-edit'){ + $query->where('edit_status', '0'); + }elseif($edit_status === 'waiting'){ + $query->where('edit_status', '1'); + }else if($edit_status === 'accepted'){ + $query->where('edit_status', '2'); + }else if($edit_status === 'rejected'){ + $query->where('edit_status', '3'); + } + } + + if ($address) { + $query->where('address', 'LIKE', '%'.$address.'%'); + } + + if ($register_year) { + $query->whereYear('created_at', $register_year); + } + + if ($register_month) { + $monthYear = Carbon::parse($register_month); + $query->whereYear('created_at', $monthYear->year) + ->whereMonth('created_at', $monthYear->month); + } + + if ($register_date) { + $query->whereDate('created_at', $register_date); + } + + $data = $query->get(); return DataTables::of($data) @@ -1019,9 +1079,12 @@ public function journalist(Request $request){ ->addColumn('journalist_name', function ($data) { return $data->name; }) - ->addColumn('company_name', function ($data) { + ->addColumn('company_name', function ($data) use ($media_ids_array) { return $data->media->company->name; }) + ->addColumn('media_name', function ($data) use ($media_ids_array) { + return $data->media->name; + }) ->addColumn('status', function ($data) { switch($data->media->company->user->status){ case 0: diff --git a/app/Http/Controllers/Dashboard/JournalistController.php b/app/Http/Controllers/Dashboard/JournalistController.php index 3c1b1c5..80921d9 100644 --- a/app/Http/Controllers/Dashboard/JournalistController.php +++ b/app/Http/Controllers/Dashboard/JournalistController.php @@ -2,19 +2,35 @@ namespace App\Http\Controllers\Dashboard; +use App\Exports\JournalistExport; use App\Http\Controllers\Controller; use App\Http\Requests\JournalistRequest; use App\Models\Journalist; +use App\Models\Media; use App\Models\User; +use Carbon\Carbon; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; +use Maatwebsite\Excel\Facades\Excel; class JournalistController extends Controller { - public function index(){ + public function index(Request $request){ if(is_role(['1'])){ + + if($request->has('media_ids') && $request->input('media_ids') && count($request->input('media_ids')) > 10){ + return redirect()->back()->with('failed-status', 'Hanya bisa memfilter 10 media'); + } + return view('dashboard.journalists.admin.index',[ - 'title' => 'Data Jurnalis' + 'title' => 'Data Jurnalis', + 'media' => Media::all(), + 'media_ids' => $request->input('media_ids', null), + 'status' => $request->input('status', null), + 'edit_status' => $request->input('edit_status', null), + 'register_year' => $request->input('register_year', null), + 'register_month' => $request->input('register_month', null), + 'register_date' => $request->input('register_date', null), ]); }else if(is_role(['3'])){ $user = User::with(['role', 'company.media.journalists'])->findOrFail(Auth::id()); @@ -291,4 +307,37 @@ public function destroy($id){ return response()->json(['message' => 'Gagal menghapus jurnalis.'], 500); } } + + public function export(Request $request) + { + $media_ids = $request->input('media_ids', null); + $status = $request->input('status', null); + $edit_status = $request->input('edit_status', null); + $register_year = $request->input('register_year', null); + $register_month = $request->input('register_month', null); + $register_date = $request->input('register_date', null); + + $formattedNow = Carbon::parse(now())->locale('id')->translatedFormat('d-m-Y'); + + return Excel::download(new JournalistExport($media_ids, $status, $edit_status, $register_year, $register_month, $register_date), 'journalist-'.$formattedNow.'.xlsx'); + } + + public function filter(Request $request) + { + $filteredRequest = $request->except('_token'); + + // Kalau "all" dipilih di media_ids, set ulang jadi hanya ["all"] + if (isset($filteredRequest['media_ids']) && in_array('all', $filteredRequest['media_ids'])) { + $filteredRequest['media_ids'] = ['all']; + } else { + // Buang media kosong + $filteredRequest['media_ids'] = array_filter($filteredRequest['media_ids'] ?? []); + } + + // Filter semua field yang terisi + $filterField = array_filter($filteredRequest, fn($val) => filled($val)); + + return redirect()->route('dashboard.journalists.index', $filterField); + } + } diff --git a/resources/views/dashboard/journalists/admin/index.blade.php b/resources/views/dashboard/journalists/admin/index.blade.php index ddaa046..017a04a 100644 --- a/resources/views/dashboard/journalists/admin/index.blade.php +++ b/resources/views/dashboard/journalists/admin/index.blade.php @@ -16,7 +16,24 @@
@@ -33,6 +50,7 @@ No Nama Jurnalis Perusahaan + Media Email No Telepon Status @@ -45,6 +63,155 @@ + + diff --git a/resources/views/dashboard/journalists/index.blade.php b/resources/views/dashboard/journalists/index.blade.php index df1bfc4..47035de 100644 --- a/resources/views/dashboard/journalists/index.blade.php +++ b/resources/views/dashboard/journalists/index.blade.php @@ -21,7 +21,7 @@
diff --git a/resources/views/partials/app/datatable.blade.php b/resources/views/partials/app/datatable.blade.php index b955ba7..6d403a7 100644 --- a/resources/views/partials/app/datatable.blade.php +++ b/resources/views/partials/app/datatable.blade.php @@ -56,6 +56,7 @@ } ], language: datatableLanguage, + responsive: true, autoWidth: false, order: [ [6, 'desc'], @@ -104,6 +105,7 @@ } ], language: datatableLanguage, + responsive: true, autoWidth: false, order: [ [6, 'desc'] @@ -151,6 +153,7 @@ } ], language: datatableLanguage, + responsive: true, autoWidth: false, order: [[6, 'desc']], pagingType: "simple", @@ -197,6 +200,7 @@ } ], language: datatableLanguage, + responsive: true, autoWidth: false, order: [[6, 'desc']], pagingType: "simple", @@ -238,6 +242,7 @@ } ], language: datatableLanguage, + responsive: true, autoWidth: false, order: [[4, 'desc']], pagingType: "simple", @@ -292,6 +297,7 @@ } ], language: datatableLanguage, + responsive: true, autoWidth: false, order: [[6, 'desc']], pagingType: "simple", @@ -337,6 +343,7 @@ { targets: 4, width: '5%' }, // Kolom aksi ], language: datatableLanguage, + responsive: true, autoWidth: false, order: [ [5, 'desc'] @@ -386,6 +393,7 @@ { targets: 5, width: '5%' }, // Kolom aksi ], language: datatableLanguage, + responsive: true, autoWidth: false, order: [ [4, 'desc'], @@ -414,6 +422,7 @@ { data: 'id', name: 'id', orderable: true, searchable: false, visible: false }, ], language: datatableLanguage, + responsive: true, autoWidth: false, order: [[3, 'desc']], pagingType: "simple", @@ -457,6 +466,7 @@ { data: 'id', name: 'id', orderable: true, searchable: false, visible: false }, ], language: datatableLanguage, + responsive: true, autoWidth: false, order: [[10, 'desc']], pagingType: "simple", @@ -502,6 +512,7 @@ { data: 'id', name: 'id', orderable: true, searchable: false, visible: false }, ], language: datatableLanguage, + responsive: true, autoWidth: false, order: [[10, 'desc']], pagingType: "simple", @@ -518,11 +529,23 @@ $('#journalistsTable').DataTable({ processing: true, serverSide: true, - ajax: '{{ route('dashboard.journalists.data') }}', + ajax: { + url: '{{ route('dashboard.journalists.data') }}', + type: 'GET', + data: function(d) { + d.media_ids = '@json($media_ids);'; + d.status = '{{ $status }}'; + d.edit_status = '{{ $edit_status }}'; + d.register_year = '{{ $register_year }}'; + d.register_month = '{{ $register_month }}'; + d.register_date = '{{ $register_date }}'; + } + }, columns: [ { data: 'DT_RowIndex', name: 'DT_RowIndex', orderable: false, searchable: false }, { data: 'journalist_name', name: 'journalist_name' }, { data: 'company_name', name: 'company_name' }, + { data: 'media_name', name: 'media_name' }, { data: 'email', name: 'email' }, { data: 'phone_number', name: 'phone_number' }, { data: 'status', name: 'status' }, @@ -532,6 +555,7 @@ { data: 'id', name: 'id', orderable: true, searchable: false, visible: false }, ], language: datatableLanguage, + responsive: true, autoWidth: false, order: [[8, 'desc']], pagingType: "simple", @@ -575,6 +599,7 @@ ], @endif language: datatableLanguage, + responsive: true, autoWidth: false, order: [[6, 'desc']], pagingType: "simple", @@ -605,6 +630,7 @@ { data: 'id', name: 'id', orderable: true, searchable: false, visible: false }, ], language: datatableLanguage, + responsive: true, autoWidth: false, order: [[6, 'desc']], pagingType: "simple", @@ -635,6 +661,7 @@ { data: 'id', name: 'id', orderable: true, searchable: false, visible: false }, ], language: datatableLanguage, + responsive: true, autoWidth: false, order: [[7, 'desc']], pagingType: "simple", @@ -663,6 +690,7 @@ { data: 'id', name: 'id', orderable: true, searchable: false, visible: false }, ], language: datatableLanguage, + responsive: true, autoWidth: false, order: [[7, 'desc']], pagingType: "simple", @@ -694,6 +722,7 @@ { data: 'id', name: 'id', orderable: true, searchable: false, visible: false }, ], language: datatableLanguage, + responsive: true, autoWidth: false, order: [[7, 'desc']], pagingType: "simple", @@ -723,6 +752,7 @@ { data: 'id', name: 'id', orderable: true, searchable: false, visible: false }, ], language: datatableLanguage, + responsive: true, autoWidth: false, order: [[5, 'desc']], pagingType: "simple", @@ -754,6 +784,7 @@ { data: 'id', name: 'id', orderable: true, searchable: false, visible: false }, ], language: datatableLanguage, + responsive: true, autoWidth: false, order: [[7, 'desc']], pagingType: "simple", @@ -782,6 +813,7 @@ { data: 'id', name: 'id', orderable: true, searchable: false, visible: false }, ], language: datatableLanguage, + responsive: true, autoWidth: false, order: [[6, 'desc']], pagingType: "simple", @@ -809,6 +841,7 @@ { data: 'id', name: 'id', orderable: true, searchable: false, visible: false }, ], language: datatableLanguage, + responsive: true, autoWidth: false, order: [[5, 'desc']], pagingType: "simple", @@ -837,6 +870,7 @@ { data: 'id', name: 'id', orderable: true, searchable: false, visible: false }, ], language: datatableLanguage, + responsive: true, autoWidth: false, order: [[7, 'desc']], pagingType: "simple", @@ -866,6 +900,7 @@ { data: 'id', name: 'id', orderable: true, searchable: false, visible: false }, ], language: datatableLanguage, + responsive: true, autoWidth: false, order: [[7, 'desc']], pagingType: "simple", @@ -897,6 +932,7 @@ { data: 'id', name: 'id', orderable: true, searchable: false, visible: false }, ], language: datatableLanguage, + responsive: true, autoWidth: false, order: [[9, 'desc']], pagingType: "simple", @@ -951,6 +987,7 @@ } ], language: datatableLanguage, + responsive: true, autoWidth: false, order: [[3, 'desc']], pagingType: "simple", @@ -986,6 +1023,7 @@ { data: 'id', name: 'id', orderable: true, searchable: false, visible: false }, ], language: datatableLanguage, + responsive: true, autoWidth: false, order: [[6, 'desc']], pagingType: "simple", @@ -1010,6 +1048,7 @@ { data: 'id', name: 'id', orderable: true, searchable: false, visible: false }, ], language: datatableLanguage, + responsive: true, autoWidth: false, order: [[1, 'desc']], pagingType: "simple", @@ -1045,6 +1084,7 @@ { data: 'id', name: 'id', orderable: true, searchable: false, visible: false }, ], language: datatableLanguage, + responsive: true, autoWidth: false, order: [[4, 'desc']], pagingType: "simple", @@ -1081,6 +1121,7 @@ { data: 'id', name: 'id', orderable: true, searchable: false, visible: false }, ], language: datatableLanguage, + responsive: true, autoWidth: false, order: [[4, 'desc']], pagingType: "simple", diff --git a/resources/views/partials/dashboard/footer.blade.php b/resources/views/partials/dashboard/footer.blade.php index e0a520d..fb0f032 100644 --- a/resources/views/partials/dashboard/footer.blade.php +++ b/resources/views/partials/dashboard/footer.blade.php @@ -131,6 +131,16 @@ @endif + + + + diff --git a/routes/web.php b/routes/web.php index 6b62975..2642068 100644 --- a/routes/web.php +++ b/routes/web.php @@ -315,8 +315,11 @@ Route::put('/{id}/process/{action}', 'processEditAction')->name('edit.process.action'); Route::get('/{id}/edit', 'edit')->name('edit'); - Route::post('/{id}', 'update')->name('update'); + Route::post('/{id}/edit', '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, 'journalist'])->name('data');