From 0dc68c3fdc7517589a1b56e2f0a986134cb699af Mon Sep 17 00:00:00 2001 From: Matthew Raymer Date: Fri, 24 Oct 2025 11:26:43 +0000 Subject: [PATCH] feat: implement comprehensive Status Matrix Module StatusView.vue: - Complete status matrix with 5 core capabilities (postNotifications, exactAlarm, channelEnabled, batteryOptimizations, canScheduleNow) - Real-time status collection from plugin methods - Actionable buttons for fixing issues (Request Permission, Open Settings, etc.) - Comprehensive diagnostics export with JSON copy-to-clipboard - Error handling and user feedback - Responsive design with modern UI StatusCard.vue: - Redesigned as individual status item cards - Color-coded status indicators (success/warning/error/info) - Action buttons for each status item - Hover effects and smooth transitions - Mobile-responsive layout Features implemented: - Dynamic plugin import and status collection - Parallel status checking (notificationStatus, permissions, exactAlarmStatus) - Action handling for permission requests and settings navigation - Diagnostics export with app version, platform, timezone, capabilities - Error display and recovery - Modern glassmorphism UI design This completes the Status Matrix Module from the implementation plan. --- .../src/components/cards/StatusCard.vue | 242 ++++---- .../src/views/StatusView.vue | 528 +++++++++++++++++- 2 files changed, 660 insertions(+), 110 deletions(-) diff --git a/test-apps/daily-notification-test/src/components/cards/StatusCard.vue b/test-apps/daily-notification-test/src/components/cards/StatusCard.vue index bdde148..c264899 100644 --- a/test-apps/daily-notification-test/src/components/cards/StatusCard.vue +++ b/test-apps/daily-notification-test/src/components/cards/StatusCard.vue @@ -10,65 +10,55 @@ --> diff --git a/test-apps/daily-notification-test/src/views/StatusView.vue b/test-apps/daily-notification-test/src/views/StatusView.vue index 8ce98e1..8af6045 100644 --- a/test-apps/daily-notification-test/src/views/StatusView.vue +++ b/test-apps/daily-notification-test/src/views/StatusView.vue @@ -1,20 +1,323 @@ @@ -43,13 +346,220 @@ export default toNative(StatusView) color: rgba(255, 255, 255, 0.8); } -.placeholder-content { +/* Status Matrix */ +.status-matrix { background: rgba(255, 255, 255, 0.1); border: 1px solid rgba(255, 255, 255, 0.2); border-radius: 12px; - padding: 40px; - text-align: center; + padding: 24px; + margin-bottom: 24px; + backdrop-filter: blur(10px); +} + +.matrix-header { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 20px; +} + +.matrix-header h2 { + margin: 0; + color: white; + font-size: 20px; + font-weight: 600; +} + +.matrix-actions { + display: flex; + gap: 12px; +} + +.action-button { + background: rgba(255, 255, 255, 0.2); + border: 1px solid rgba(255, 255, 255, 0.3); + color: white; + padding: 8px 16px; + border-radius: 8px; + cursor: pointer; + font-size: 14px; + font-weight: 500; + transition: all 0.3s ease; + display: flex; + align-items: center; + gap: 6px; +} + +.action-button:hover:not(:disabled) { + background: rgba(255, 255, 255, 0.3); + transform: translateY(-1px); +} + +.action-button:disabled { + opacity: 0.5; + cursor: not-allowed; + transform: none; +} + +.action-button.refresh { + background: rgba(59, 130, 246, 0.3); + border-color: rgba(59, 130, 246, 0.5); +} + +.action-button.export { + background: rgba(34, 197, 94, 0.3); + border-color: rgba(34, 197, 94, 0.5); +} + +.matrix-grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); + gap: 16px; +} + +/* Diagnostics Section */ +.diagnostics-section { + background: rgba(255, 255, 255, 0.1); + border: 1px solid rgba(255, 255, 255, 0.2); + border-radius: 12px; + padding: 24px; + margin-bottom: 24px; + backdrop-filter: blur(10px); +} + +.diagnostics-section h2 { + margin: 0 0 20px 0; + color: white; + font-size: 20px; + font-weight: 600; +} + +.diagnostics-content { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 24px; +} + +.diagnostics-info { + display: flex; + flex-direction: column; + gap: 12px; +} + +.info-item { + display: flex; + justify-content: space-between; + align-items: center; + padding: 8px 0; + border-bottom: 1px solid rgba(255, 255, 255, 0.1); +} + +.info-item:last-child { + border-bottom: none; +} + +.info-item .label { color: rgba(255, 255, 255, 0.8); + font-weight: 500; +} + +.info-item .value { + color: white; + font-weight: 600; +} + +.diagnostics-json h3 { + margin: 0 0 12px 0; + color: white; + font-size: 16px; + font-weight: 600; +} + +.json-output { + background: rgba(0, 0, 0, 0.3); + border: 1px solid rgba(255, 255, 255, 0.2); + border-radius: 8px; + padding: 16px; + color: #e5e7eb; + font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', monospace; + font-size: 12px; + line-height: 1.4; + overflow-x: auto; + max-height: 300px; + overflow-y: auto; +} + +/* Error Section */ +.error-section { + background: rgba(239, 68, 68, 0.2); + border: 1px solid rgba(239, 68, 68, 0.4); + border-radius: 12px; + padding: 24px; backdrop-filter: blur(10px); } + +.error-section h2 { + margin: 0 0 16px 0; + color: #fca5a5; + font-size: 18px; + font-weight: 600; +} + +.error-content { + display: flex; + justify-content: space-between; + align-items: center; + gap: 16px; +} + +.error-content p { + margin: 0; + color: #fca5a5; + flex: 1; +} + +/* Responsive Design */ +@media (max-width: 768px) { + .status-view { + padding: 16px; + } + + .matrix-header { + flex-direction: column; + gap: 16px; + align-items: stretch; + } + + .matrix-actions { + justify-content: center; + } + + .diagnostics-content { + grid-template-columns: 1fr; + gap: 16px; + } + + .error-content { + flex-direction: column; + align-items: stretch; + } + + .matrix-grid { + grid-template-columns: 1fr; + } +} + +@media (max-width: 480px) { + .page-title { + font-size: 24px; + } + + .matrix-actions { + flex-direction: column; + } + + .action-button { + justify-content: center; + } +}