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 @@