user()->hasRole(RoleEnum::PERUSAHAAN)) {
return null;
}
return static::getModel()::pending()->count();
}
public static function infolist(Schema $schema): Schema
{
return $schema
->schema([
TextEntry::make('comparison')
->hiddenLabel()
->html()
->state(function (DataChangeRequest $record): string {
$old = $record->old_data ?? [];
$new = $record->new_data ?? [];
if (! is_array($old) || ! is_array($new)) {
return 'Format data tidak valid.';
}
$renderValue = function ($value) {
if (empty($value)) {
return 'Kosong';
}
$paths = is_array($value) ? $value : [$value];
$isProbablyPath = false;
foreach ($paths as $path) {
if (is_string($path) && (str_contains($path, '/') || str_contains($path, '\\'))) {
$isProbablyPath = true;
break;
}
}
if ($isProbablyPath) {
return collect($paths)
->map(function ($path) {
if (! is_string($path)) {
return e(json_encode($path));
}
$url = Storage::disk(config('filesystems.default'))->url($path);
$extension = strtolower(pathinfo($path, PATHINFO_EXTENSION));
if (in_array($extension, ['jpg', 'jpeg', 'png', 'gif', 'webp', 'svg'])) {
return "
";
}
if ($extension === 'pdf') {
return "
";
}
return "📎 Buka Dokumen (".strtoupper($extension).')';
})
->implode('
');
}
return e(is_scalar($value) ? $value : json_encode($value));
};
// 1. Deletion Request
if (isset($new['__delete_request__']) && $new['__delete_request__'] === true) {
return "
".CheerfulNotification::getByKey('data_change.deletion_request_title')."
".CheerfulNotification::getByKey('data_change.deletion_request_desc').'
';
}
// 2. New Addition Request
if (empty($old)) {
$rows = collect($new)
->map(function ($value, $key) use ($renderValue) {
return sprintf(
"",
e($key),
$renderValue($value)
);
})
->implode('');
return "
".CheerfulNotification::getByKey('data_change.addition_request_title')."
".CheerfulNotification::getByKey('data_change.addition_request_desc')."
{$rows}
";
}
// 3. Standard Comparison (Update)
return collect($new)
->map(function ($newValue, $key) use ($old, $renderValue) {
$oldValue = $old[$key] ?? null;
if ($oldValue === $newValue) {
return null;
}
return sprintf(
"",
e($key),
$renderValue($oldValue),
$renderValue($newValue)
);
})
->filter()
->implode('');
})
->columnSpanFull(),
])
->columns(1);
}
public static function table(Table $table): Table
{
return $table
->columns([
...RowIndexColumn::make(),
TextColumn::make('user.name')
->label('Pemohon')
->searchable()
->sortable()
->description(fn (DataChangeRequest $record): ?string => $record?->entity?->name)
->visible(! auth()->user()->hasRole(RoleEnum::PERUSAHAAN->value)),
TextColumn::make('entity_type')
->label('Jenis Data')
->searchable()
->sortable()
->description(fn (DataChangeRequest $record): ?string => match (true) {
isset($record->new_data['__delete_request__']) => CheerfulNotification::getByKey('data_change.deletion'),
empty($record->old_data) => CheerfulNotification::getByKey('data_change.addition'),
default => CheerfulNotification::getByKey('data_change.change'),
})
->formatStateUsing(fn (DataChangeRequest $record): ?string => match ($record->entity_type) {
Company::class => 'Perusahaan',
PartnerMedia::class => 'Media',
Journalist::class => 'Jurnalis',
default => 'Lainnya',
})
->color(fn (DataChangeRequest $record): ?string => match ($record->entity_type) {
Company::class => 'success',
PartnerMedia::class => 'info',
Journalist::class => 'warning',
default => 'secondary',
})
->badge(),
TextColumn::make('status')
->label('Status')
->searchable()
->sortable()
->badge()
->formatStateUsing(fn (DataChangeStatus $state): string => $state->getLabel())
->color(fn (DataChangeStatus $state): string => $state->getColor())
->description(fn (DataChangeRequest $record): ?string => $record?->review ? 'Oleh: '.$record->review?->reviewer?->name : ''),
TextColumn::make('change_reason')
->label('Alasan Perubahan')
->limit(50),
TextColumn::make('review.note')
->label('Alasan Penolakan')
->limit(50),
TextColumn::make('created_at')
->label('Tgl Permohonan')
->date()
->sortable()
->dateTime('l, d F Y H:i:s')
->wrap(),
])
->filters([
SelectFilter::make('status')
->label('Status')
->options(DataChangeStatus::class)
->native(false),
TrashedFilter::make()
->native(false)
->visible(fn () => auth()->user()?->hasRole(RoleEnum::DEVELOPER->value)),
])
->recordActions([
ViewAction::make(),
AcceptAction::make('accept'),
RejectAction::make('reject'),
])
->toolbarActions([
BulkActionGroup::make([
...DefaultBulkActions::make('permohonan perubahan data'),
]),
])
->emptyStateIcon(Heroicon::OutlinedDocumentText)
->emptyStateDescription(fn () => CheerfulNotification::getByKey('data_change.empty_state'))
->defaultSort('created_at', 'desc')
->deferFilters(false)
->paginated([25, 50, 100, 'all'])
->deferLoading();
}
public static function getEloquentQuery(): Builder
{
return parent::getEloquentQuery()
->when(auth()->user()->hasRole(RoleEnum::PERUSAHAAN->value), function (Builder $q): Builder {
return $q->where('user_id', auth()->id());
});
}
public static function getPages(): array
{
return [
'index' => ManageDataChanges::route('/'),
'view' => ViewDataChange::route('/{record}'),
];
}
}