Implements Spec 091 “BackupSchedule Retention & Lifecycle (Archive/Restore/Force Delete)”.
- BackupSchedule lifecycle:
- Archive (soft delete) with confirmation; restores via Restore action; Force delete with confirmation and strict gating.
- Force delete blocked when historical runs exist.
- Archived schedules never dispatch/execute (dispatcher + job guard).
- Audit events emitted for archive/restore/force delete.
- RBAC UX semantics preserved (non-member hidden/404; member w/o capability disabled + server-side 403).
- Filament UX contract update:
- Create CTA placement rule across create-enabled list pages:
- Empty list: only large centered empty-state Create CTA.
- Non-empty list: only header Create action.
- Tests added/updated to enforce the rule.
Verification:
- `vendor/bin/sail bin pint --dirty`
- Focused tests: BackupScheduling + RBAC enforcement + EmptyState CTAs + Create CTA placement
Notes:
- Filament v5 / Livewire v4 compliant.
- Manual quickstart verification in `specs/091-backupschedule-retention-lifecycle/quickstart.md` remains to be checked (T031).
Co-authored-by: Ahmed Darrazi <ahmed.darrazi@live.de>
Reviewed-on: #109
34 lines
949 B
PHP
34 lines
949 B
PHP
<?php
|
|
|
|
namespace App\Filament\Resources\BackupScheduleResource\Pages;
|
|
|
|
use App\Filament\Resources\BackupScheduleResource;
|
|
use Filament\Resources\Pages\EditRecord;
|
|
use Illuminate\Database\Eloquent\Model;
|
|
use Illuminate\Database\Eloquent\ModelNotFoundException;
|
|
|
|
class EditBackupSchedule extends EditRecord
|
|
{
|
|
protected static string $resource = BackupScheduleResource::class;
|
|
|
|
protected function resolveRecord(int|string $key): Model
|
|
{
|
|
$record = BackupScheduleResource::getEloquentQuery()
|
|
->withTrashed()
|
|
->find($key);
|
|
|
|
if ($record === null) {
|
|
throw (new ModelNotFoundException)->setModel(BackupScheduleResource::getModel(), [$key]);
|
|
}
|
|
|
|
return $record;
|
|
}
|
|
|
|
protected function mutateFormDataBeforeSave(array $data): array
|
|
{
|
|
$data = BackupScheduleResource::ensurePolicyTypes($data);
|
|
|
|
return BackupScheduleResource::hydrateNextRun($data);
|
|
}
|
|
}
|