generated sotries
This commit is contained in:
@@ -0,0 +1,98 @@
|
||||
# Story 6.10: Audit Log Viewer
|
||||
|
||||
## Epic Reference
|
||||
**Epic 6:** Admin Dashboard
|
||||
|
||||
## User Story
|
||||
As an **admin**,
|
||||
I want **to view admin action history**,
|
||||
So that **I can maintain accountability and track changes**.
|
||||
|
||||
## Acceptance Criteria
|
||||
|
||||
### Display
|
||||
- [ ] Action type (create, update, delete)
|
||||
- [ ] Target (user, consultation, timeline, etc.)
|
||||
- [ ] Old and new values (for updates)
|
||||
- [ ] Timestamp
|
||||
- [ ] IP address
|
||||
|
||||
### Filtering
|
||||
- [ ] Filter by action type
|
||||
- [ ] Filter by target type
|
||||
- [ ] Filter by date range
|
||||
|
||||
### Search
|
||||
- [ ] Search by target name/ID
|
||||
|
||||
### Features
|
||||
- [ ] Pagination
|
||||
- [ ] Export audit log (CSV)
|
||||
|
||||
## Technical Notes
|
||||
|
||||
```php
|
||||
new class extends Component {
|
||||
use WithPagination;
|
||||
|
||||
public string $actionFilter = '';
|
||||
public string $targetFilter = '';
|
||||
public string $dateFrom = '';
|
||||
public string $dateTo = '';
|
||||
public string $search = '';
|
||||
|
||||
public function with(): array
|
||||
{
|
||||
return [
|
||||
'logs' => AdminLog::query()
|
||||
->with('admin')
|
||||
->when($this->actionFilter, fn($q) => $q->where('action_type', $this->actionFilter))
|
||||
->when($this->targetFilter, fn($q) => $q->where('target_type', $this->targetFilter))
|
||||
->when($this->dateFrom, fn($q) => $q->whereDate('created_at', '>=', $this->dateFrom))
|
||||
->when($this->dateTo, fn($q) => $q->whereDate('created_at', '<=', $this->dateTo))
|
||||
->when($this->search, fn($q) => $q->where('target_id', $this->search))
|
||||
->latest()
|
||||
->paginate(25),
|
||||
'actionTypes' => AdminLog::distinct()->pluck('action_type'),
|
||||
'targetTypes' => AdminLog::distinct()->pluck('target_type'),
|
||||
];
|
||||
}
|
||||
|
||||
public function exportCsv()
|
||||
{
|
||||
// Export filtered logs to CSV
|
||||
}
|
||||
};
|
||||
```
|
||||
|
||||
### Template
|
||||
```blade
|
||||
@foreach($logs as $log)
|
||||
<tr>
|
||||
<td>{{ $log->created_at->format('d/m/Y H:i') }}</td>
|
||||
<td>{{ $log->admin?->name ?? __('admin.system') }}</td>
|
||||
<td>
|
||||
<flux:badge>{{ $log->action_type }}</flux:badge>
|
||||
</td>
|
||||
<td>{{ $log->target_type }} #{{ $log->target_id }}</td>
|
||||
<td>{{ $log->ip_address }}</td>
|
||||
<td>
|
||||
<flux:button size="sm" wire:click="showDetails({{ $log->id }})">
|
||||
{{ __('admin.details') }}
|
||||
</flux:button>
|
||||
</td>
|
||||
</tr>
|
||||
@endforeach
|
||||
```
|
||||
|
||||
## Definition of Done
|
||||
- [ ] Logs display correctly
|
||||
- [ ] All filters work
|
||||
- [ ] Search works
|
||||
- [ ] Pagination works
|
||||
- [ ] CSV export works
|
||||
- [ ] Old/new values viewable
|
||||
- [ ] Tests pass
|
||||
|
||||
## Estimation
|
||||
**Complexity:** Medium | **Effort:** 3-4 hours
|
||||
Reference in New Issue
Block a user