/** * Code Quality Violations List Component * Manages the violations list page with filtering and pagination */ // ✅ Use centralized logger const codeQualityViolationsLog = window.LogConfig.createLogger('CODE-QUALITY'); function codeQualityViolations() { return { // Extend base data ...data(), // Set current page for navigation currentPage: 'code-quality', // Violations-specific data loading: false, error: null, violations: [], pagination: { page: 1, page_size: 50, total: 0, total_pages: 0 }, filters: { severity: '', status: '', rule_id: '', file_path: '' }, async init() { // Load filters from URL params const params = new URLSearchParams(window.location.search); this.filters.severity = params.get('severity') || ''; this.filters.status = params.get('status') || ''; this.filters.rule_id = params.get('rule_id') || ''; this.filters.file_path = params.get('file_path') || ''; await this.loadViolations(); }, async loadViolations() { this.loading = true; this.error = null; try { // Build query params const params = { page: this.pagination.page.toString(), page_size: this.pagination.page_size.toString() }; if (this.filters.severity) params.severity = this.filters.severity; if (this.filters.status) params.status = this.filters.status; if (this.filters.rule_id) params.rule_id = this.filters.rule_id; if (this.filters.file_path) params.file_path = this.filters.file_path; const data = await apiClient.get('/admin/code-quality/violations', params); this.violations = data.violations; this.pagination = { page: data.page, page_size: data.page_size, total: data.total, total_pages: data.total_pages }; // Update URL with current filters (without reloading) this.updateURL(); } catch (err) { codeQualityViolationsLog.error('Failed to load violations:', err); this.error = err.message; // Redirect to login if unauthorized if (err.message.includes('Unauthorized')) { window.location.href = '/admin/login'; } } finally { this.loading = false; } }, applyFilters() { // Reset to page 1 when filters change this.pagination.page = 1; this.loadViolations(); }, async nextPage() { if (this.pagination.page < this.pagination.total_pages) { this.pagination.page++; await this.loadViolations(); } }, async previousPage() { if (this.pagination.page > 1) { this.pagination.page--; await this.loadViolations(); } }, updateURL() { const params = new URLSearchParams(); if (this.filters.severity) params.set('severity', this.filters.severity); if (this.filters.status) params.set('status', this.filters.status); if (this.filters.rule_id) params.set('rule_id', this.filters.rule_id); if (this.filters.file_path) params.set('file_path', this.filters.file_path); const newURL = params.toString() ? `${window.location.pathname}?${params.toString()}` : window.location.pathname; window.history.replaceState({}, '', newURL); } }; }