columns([ TextColumn::make('title') ->label('Judul') ->searchable() ->sortable() ->wrap(), TextColumn::make('partnerMedia.name') ->label('Media') ->listWithLineBreaks() ->limitList(3) ->expandableLimitedList() ->badge() ->visible(! auth()->user()->hasRole(RoleEnum::PERUSAHAAN->value)), TextColumn::make('initial_submission_date') ->label('Tgl Pengajuan Awal') ->searchable() ->sortable() ->date('l, d F Y'), TextColumn::make('final_submission_date') ->label('Tgl Pengajuan Akhir') ->searchable() ->sortable() ->date('l, d F Y') ->description( fn (Cooperation $record): string => now()->greaterThan($record->final_submission_date->copy()->endOfDay()) ? 'Waktu Pengajuan Habis' : 'Sisa waktu pengajuan: '.now()->diffForHumans( $record->final_submission_date->copy()->endOfDay(), ['syntax' => CarbonInterface::DIFF_ABSOLUTE] ) ), TextColumn::make('status') ->searchable() ->sortable() ->badge(), TextColumn::make('media_count') ->label('Tanggapan Media') ->html() ->getStateUsing(function (Cooperation $record): string { $record->loadCount([ 'partnerMedia as approved_count' => fn (Builder $query): Builder => $query->wherePivotAccepted(), 'partnerMedia as rejected_count' => fn (Builder $query): Builder => $query->wherePivotRejected(), 'partnerMedia as pending_count' => fn (Builder $query): Builder => $query->wherePivotPending(), ]); $totalCount = $record->partnerMedia()->count(); return "Menerima: {$record->approved_count}
Menolak: {$record->rejected_count}
Belum Menanggapi: {$record->pending_count}
Total: {$totalCount}"; }) ->visible(! auth()->user()->hasRole(RoleEnum::PERUSAHAAN->value)), TextColumn::make('status_tanggapan') ->label('Tanggapan') ->getStateUsing(function (Cooperation $record): ?ApprovalStatus { if (auth()->user()->hasRole(RoleEnum::PERUSAHAAN->value)) { $cooperationMedia = $record->cooperationMedia() ->whereHas('partnerMedia', function (Builder $query): void { $query->whereHas('company', function (Builder $subQuery): void { $subQuery->where('user_id', auth()->id()); }); }) ->first(); return $cooperationMedia?->status; } return null; }) ->badge() ->visible(auth()->user()->hasRole(RoleEnum::PERUSAHAAN->value)), TextColumn::make('payment_amount') ->label('Jumlah Pembayaran') ->money('IDR') ->sortable() ->placeholder('Belum ditentukan') ->toggleable(isToggledHiddenByDefault: true), TextColumn::make('payment_date') ->label('Tanggal Pembayaran') ->date('l, d F Y') ->sortable() ->placeholder('Belum dibayar') ->toggleable(isToggledHiddenByDefault: true), TextColumn::make('description') ->label('Deskripsi') ->searchable() ->limit(50) ->wrap() ->toggleable(isToggledHiddenByDefault: true), ...TimestampColumns::make(), ]) ->filters([ TrashedFilter::make()->native(false), SelectFilter::make('status') ->label('Status') ->options(CooperationStatus::class), SelectFilter::make('partnerMedia') ->label('Media') ->relationship('partnerMedia', 'name') ->searchable() ->preload(), Filter::make('title') ->schema([ TextInput::make('title') ->label('Nama Kegiatan') ->placeholder('Cari nama kegiatan...'), ]) ->query(function (Builder $query, array $data): Builder { return $query->when( $data['title'], fn (Builder $query, $title): Builder => $query->where('title', 'like', "%{$title}%"), ); }), Filter::make('date_filter') ->schema([ Select::make('date_type') ->label('Jenis Filter Tanggal') ->options([ 'date' => 'Tanggal Penyerahan Awal', 'month' => 'Bulan & Tahun', 'year' => 'Tahun', 'range' => 'Rentang Tanggal', ]) ->default('date') ->live(), DatePicker::make('specific_date') ->label('Tanggal') ->visible(fn (Get $get) => $get('date_type') === 'date'), Select::make('month') ->label('Bulan') ->options([ 1 => 'Januari', 2 => 'Februari', 3 => 'Maret', 4 => 'April', 5 => 'Mei', 6 => 'Juni', 7 => 'Juli', 8 => 'Agustus', 9 => 'September', 10 => 'Oktober', 11 => 'November', 12 => 'Desember', ]) ->visible(fn (Get $get) => $get('date_type') === 'month'), Select::make('year') ->label('Tahun') ->options(function () { $years = range(date('Y'), 2020); return array_combine($years, $years); }) ->visible(fn (Get $get) => in_array($get('date_type'), ['month', 'year'])), DatePicker::make('start_date') ->label('Mulai Tanggal') ->visible(fn (Get $get) => $get('date_type') === 'range'), DatePicker::make('end_date') ->label('Sampai Tanggal') ->visible(fn (Get $get) => $get('date_type') === 'range'), ]) ->query(function (Builder $query, array $data): Builder { $type = $data['date_type'] ?? null; $column = 'initial_submission_date'; if ($type === 'date' && ! empty($data['specific_date'])) { return $query->whereDate($column, $data['specific_date']); } if ($type === 'month' && ! empty($data['month']) && ! empty($data['year'])) { return $query->whereMonth($column, $data['month']) ->whereYear($column, $data['year']); } if ($type === 'year' && ! empty($data['year'])) { return $query->whereYear($column, $data['year']); } if ($type === 'range' && ! empty($data['start_date']) && ! empty($data['end_date'])) { return $query->whereBetween($column, [$data['start_date'], $data['end_date']]); } return $query; }), ]) ->recordActions([ ViewAction::make(), AcceptAction::make('accept'), RejectAction::make('reject'), SendProposalAction::make('sendProposal'), CreateTaskAssignmentAction::make('createTaskAssignment'), ProceedToPaymentAction::make('proceedToPayment'), CompleteCooperationAction::make('completeCooperation'), EditAction::make() ->visible(fn (): bool => ! auth()->user()->hasRole(RoleEnum::PERUSAHAAN->value)), DeleteAction::make() ->visible(fn (): bool => ! auth()->user()->hasRole(RoleEnum::PERUSAHAAN->value)), ]) ->headerActions([ ExportAction::make() ->exports([ CooperationExcelExport::make(), ]) ->color('success'), ]) ->toolbarActions([ BulkActionGroup::make([ ...DefaultBulkActions::make('Kerja Sama'), ]), ]) ->emptyStateIcon(Heroicon::HandRaised) ->emptyStateDescription('Setelah Anda membuat data pertama, maka akan muncul disini.') ->defaultSort('created_at', 'desc') ->deferFilters(false); } }