From bcff65cf67dba3169f2123e11e0c671b59487a60 Mon Sep 17 00:00:00 2001 From: Gbanyan Date: Sun, 30 Nov 2025 10:47:04 +0800 Subject: [PATCH] Fix audit logs and issue reports pages, rename Issues to Tasks MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修復稽核日誌與任務報表頁面,並將「問題」改名為「任務」 ## Changes 變更內容 ### Bug Fixes 錯誤修復 1. Fixed audit logs page 500 error - Added missing $auditableTypes variable to controller - Changed $events to $actions in view - Added description and ip_address columns to audit_logs table - Updated AuditLog model fillable array 2. Fixed issue reports page SQLite compatibility errors - Replaced MySQL NOW() function with Laravel now() helper - Replaced TIMESTAMPDIFF() with PHP-based date calculation - Fixed request->date() default value handling ### Feature Changes 功能變更 3. Renamed "Issues" terminology to "Tasks" throughout the system - Updated navigation menus (Admin: Issues → Admin: Tasks) - Updated all issue-related views to use task terminology - Changed Chinese labels from "問題" to "任務" - Updated dashboard, issue tracker, and reports pages 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- .../Controllers/AdminAuditLogController.php | 2 + .../Controllers/IssueReportsController.php | 19 +- app/Models/AuditLog.php | 2 + ...ion_and_ip_address_to_audit_logs_table.php | 29 +++ resources/views/admin/audit/index.blade.php | 198 +++++++++--------- .../views/admin/issue-reports/index.blade.php | 58 ++--- resources/views/admin/issues/create.blade.php | 30 +-- resources/views/admin/issues/index.blade.php | 18 +- resources/views/dashboard.blade.php | 171 +++++++++------ resources/views/layouts/navigation.blade.php | 44 ++-- 10 files changed, 324 insertions(+), 247 deletions(-) create mode 100644 database/migrations/2025_11_29_010220_add_description_and_ip_address_to_audit_logs_table.php diff --git a/app/Http/Controllers/AdminAuditLogController.php b/app/Http/Controllers/AdminAuditLogController.php index 635dd42..6712721 100644 --- a/app/Http/Controllers/AdminAuditLogController.php +++ b/app/Http/Controllers/AdminAuditLogController.php @@ -46,6 +46,7 @@ class AdminAuditLogController extends Controller $users = AuditLog::with('user')->whereNotNull('user_id')->select('user_id')->distinct()->get()->map(function ($log) { return $log->user; })->filter(); + $auditableTypes = AuditLog::select('auditable_type')->distinct()->whereNotNull('auditable_type')->orderBy('auditable_type')->pluck('auditable_type'); return view('admin.audit.index', [ 'logs' => $logs, @@ -56,6 +57,7 @@ class AdminAuditLogController extends Controller 'endDate' => $end, 'actions' => $actions, 'users' => $users, + 'auditableTypes' => $auditableTypes, ]); } diff --git a/app/Http/Controllers/IssueReportsController.php b/app/Http/Controllers/IssueReportsController.php index 32b3a6c..c29bf71 100644 --- a/app/Http/Controllers/IssueReportsController.php +++ b/app/Http/Controllers/IssueReportsController.php @@ -12,8 +12,8 @@ class IssueReportsController extends Controller public function index(Request $request) { // Date range filter (default: last 30 days) - $startDate = $request->date('start_date', now()->subDays(30)); - $endDate = $request->date('end_date', now()); + $startDate = $request->date('start_date') ?? now()->subDays(30); + $endDate = $request->date('end_date') ?? now(); // Overview Statistics $stats = [ @@ -63,11 +63,12 @@ class IssueReportsController extends Controller ->get(); // Assignee Performance + $now = now(); $assigneePerformance = User::select('users.id', 'users.name') ->leftJoin('issues', 'users.id', '=', 'issues.assigned_to_user_id') ->selectRaw('count(issues.id) as total_assigned') ->selectRaw('sum(case when issues.status = ? then 1 else 0 end) as completed', [Issue::STATUS_CLOSED]) - ->selectRaw('sum(case when issues.due_date < NOW() and issues.status != ? then 1 else 0 end) as overdue', [Issue::STATUS_CLOSED]) + ->selectRaw('sum(case when issues.due_date < ? and issues.status != ? then 1 else 0 end) as overdue', [$now, Issue::STATUS_CLOSED]) ->groupBy('users.id', 'users.name') ->having('total_assigned', '>', 0) ->orderByDesc('total_assigned') @@ -101,9 +102,15 @@ class IssueReportsController extends Controller ->get(); // Average Resolution Time (days) - $avgResolutionTime = Issue::whereNotNull('closed_at') - ->selectRaw('avg(TIMESTAMPDIFF(DAY, created_at, closed_at)) as avg_days') - ->value('avg_days'); + $closedIssues = Issue::whereNotNull('closed_at') + ->select('created_at', 'closed_at') + ->get(); + + $avgResolutionTime = $closedIssues->isNotEmpty() + ? $closedIssues->avg(function ($issue) { + return $issue->created_at->diffInDays($issue->closed_at); + }) + : null; // Recent Activity (last 10 issues) $recentIssues = Issue::with(['creator', 'assignee']) diff --git a/app/Models/AuditLog.php b/app/Models/AuditLog.php index 91a1212..409a06a 100644 --- a/app/Models/AuditLog.php +++ b/app/Models/AuditLog.php @@ -12,9 +12,11 @@ class AuditLog extends Model protected $fillable = [ 'user_id', 'action', + 'description', 'auditable_type', 'auditable_id', 'metadata', + 'ip_address', ]; protected $casts = [ diff --git a/database/migrations/2025_11_29_010220_add_description_and_ip_address_to_audit_logs_table.php b/database/migrations/2025_11_29_010220_add_description_and_ip_address_to_audit_logs_table.php new file mode 100644 index 0000000..5204ac2 --- /dev/null +++ b/database/migrations/2025_11_29_010220_add_description_and_ip_address_to_audit_logs_table.php @@ -0,0 +1,29 @@ +text('description')->nullable()->after('action'); + $table->string('ip_address', 45)->nullable()->after('metadata'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('audit_logs', function (Blueprint $table) { + $table->dropColumn(['description', 'ip_address']); + }); + } +}; diff --git a/resources/views/admin/audit/index.blade.php b/resources/views/admin/audit/index.blade.php index 0760335..8f3cfbe 100644 --- a/resources/views/admin/audit/index.blade.php +++ b/resources/views/admin/audit/index.blade.php @@ -1,136 +1,142 @@ -

+

{{ __('Audit Logs') }}

-
-
+
+
- + \ No newline at end of file diff --git a/resources/views/admin/issue-reports/index.blade.php b/resources/views/admin/issue-reports/index.blade.php index 31a3dc6..2f245c3 100644 --- a/resources/views/admin/issue-reports/index.blade.php +++ b/resources/views/admin/issue-reports/index.blade.php @@ -1,7 +1,7 @@

- {{ __('Issue Reports & Analytics') }} + {{ __('Task Reports & Analytics') }}

@@ -9,7 +9,7 @@
{{-- Date Range Filter --}} -
+