사용하지 않는 파일 정리 전 백업 (Phase 10 완료 후 상태)

This commit is contained in:
JiWoong Sul
2025-08-29 15:11:59 +09:00
parent a740ff10c8
commit d916b281a7
333 changed files with 53617 additions and 22574 deletions

View File

@@ -1,16 +1,15 @@
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:intl/intl.dart';
import 'package:superport/screens/common/theme_shadcn.dart';
import 'package:superport/screens/common/components/shadcn_components.dart';
import 'package:superport/screens/overview/controllers/overview_controller.dart';
// MockDataService 제거 - 실제 API 사용
import 'package:superport/services/auth_service.dart';
import 'package:superport/services/health_check_service.dart';
import 'package:superport/core/widgets/auth_guard.dart';
import 'package:superport/data/models/auth/auth_user.dart';
import 'package:superport/screens/overview/widgets/license_expiry_alert.dart';
import 'package:superport/screens/overview/widgets/statistics_card_grid.dart';
import 'package:shadcn_ui/shadcn_ui.dart';
/// shadcn/ui 스타일로 재설계된 대시보드 화면
class OverviewScreen extends StatefulWidget {
@@ -328,7 +327,7 @@ class _OverviewScreenState extends State<OverviewScreen> {
return FutureBuilder<AuthUser?>(
future: context.read<AuthService>().getCurrentUser(),
builder: (context, snapshot) {
final userRole = snapshot.data?.role?.toLowerCase() ?? '';
final userRole = snapshot.data?.role.toLowerCase() ?? '';
final isAdminOrManager = userRole == 'admin' || userRole == 'manager';
return Column(
@@ -371,19 +370,15 @@ class _OverviewScreenState extends State<OverviewScreen> {
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text('시스템 상태', style: ShadcnTheme.headingH4),
IconButton(
icon: _isHealthCheckLoading
? SizedBox(
ShadButton.ghost(
onPressed: _isHealthCheckLoading ? null : _checkHealthStatus,
child: _isHealthCheckLoading
? const SizedBox(
width: 16,
height: 16,
child: CircularProgressIndicator(
strokeWidth: 2,
valueColor: AlwaysStoppedAnimation<Color>(ShadcnTheme.primary),
),
child: ShadProgress(),
)
: Icon(Icons.refresh, size: 20, color: ShadcnTheme.muted),
onPressed: _isHealthCheckLoading ? null : _checkHealthStatus,
tooltip: '새로고침',
),
],
),
@@ -535,23 +530,6 @@ class _OverviewScreenState extends State<OverviewScreen> {
),
);
}
Widget _buildStatusItem(String label, String status) {
return Padding(
padding: const EdgeInsets.symmetric(vertical: 8),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(label, style: ShadcnTheme.bodyMedium),
ShadcnBadge(
text: status,
variant: ShadcnBadgeVariant.success,
size: ShadcnBadgeSize.small,
),
],
),
);
}
/// 헬스 상태 아이템 빌더
Widget _buildHealthStatusItem(String label, Map<String, dynamic> statusInfo) {

View File

@@ -1,9 +1,10 @@
import 'package:flutter/material.dart';
import 'package:shadcn_ui/shadcn_ui.dart';
import 'package:superport/utils/constants.dart';
import 'package:superport/core/extensions/license_expiry_summary_extensions.dart';
import 'package:superport/data/models/dashboard/license_expiry_summary.dart';
/// 라이선스 만료 알림 배너 위젯
/// 라이선스 만료 알림 배너 위젯 (ShadCN UI)
class LicenseExpiryAlert extends StatelessWidget {
final LicenseExpirySummary summary;
@@ -18,74 +19,67 @@ class LicenseExpiryAlert extends StatelessWidget {
return const SizedBox.shrink(); // 알림이 필요없으면 숨김
}
return Container(
margin: const EdgeInsets.all(16.0),
decoration: BoxDecoration(
color: _getAlertBackgroundColor(summary.alertLevel),
borderRadius: BorderRadius.circular(8.0),
border: Border.all(
color: _getAlertBorderColor(summary.alertLevel),
width: 1.0,
),
),
child: Material(
color: Colors.transparent,
child: InkWell(
onTap: () => _navigateToLicenses(context),
borderRadius: BorderRadius.circular(8.0),
child: Padding(
padding: const EdgeInsets.all(16.0),
child: Row(
children: [
Icon(
_getAlertIcon(summary.alertLevel),
color: _getAlertIconColor(summary.alertLevel),
size: 24,
),
const SizedBox(width: 12),
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
return GestureDetector(
onTap: () => _navigateToLicenses(context),
child: Container(
margin: const EdgeInsets.all(16.0),
child: ShadCard(
backgroundColor: _getAlertBackgroundColor(summary.alertLevel),
border: Border.all(
color: _getAlertBorderColor(summary.alertLevel),
width: 1.0,
),
padding: const EdgeInsets.all(16.0),
child: Row(
children: [
Icon(
_getAlertIcon(summary.alertLevel),
color: _getAlertIconColor(summary.alertLevel),
size: 24,
),
const SizedBox(width: 12),
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
_getAlertTitle(summary.alertLevel),
style: TextStyle(
fontSize: 16,
fontWeight: FontWeight.bold,
color: _getAlertTextColor(summary.alertLevel),
),
),
const SizedBox(height: 4),
Text(
summary.alertMessage,
style: TextStyle(
fontSize: 14,
color: _getAlertTextColor(summary.alertLevel).withValues(alpha: 0.8 * 255),
),
),
if (summary.alertLevel > 1) ...[
const SizedBox(height: 8),
Text(
_getAlertTitle(summary.alertLevel),
'상세 내용을 확인하려면 탭하세요',
style: TextStyle(
fontSize: 16,
fontWeight: FontWeight.bold,
color: _getAlertTextColor(summary.alertLevel),
fontSize: 12,
fontStyle: FontStyle.italic,
color: _getAlertTextColor(summary.alertLevel).withValues(alpha: 0.6 * 255),
),
),
const SizedBox(height: 4),
Text(
summary.alertMessage,
style: TextStyle(
fontSize: 14,
color: _getAlertTextColor(summary.alertLevel).withOpacity(0.8),
),
),
if (summary.alertLevel > 1) ...[
const SizedBox(height: 8),
Text(
'상세 내용을 확인하려면 탭하세요',
style: TextStyle(
fontSize: 12,
fontStyle: FontStyle.italic,
color: _getAlertTextColor(summary.alertLevel).withOpacity(0.6),
),
),
],
],
),
],
),
_buildStatsBadges(),
const SizedBox(width: 8),
Icon(
Icons.arrow_forward_ios,
size: 16,
color: _getAlertTextColor(summary.alertLevel).withOpacity(0.6),
),
],
),
),
_buildStatsBadges(),
const SizedBox(width: 8),
Icon(
Icons.arrow_forward_ios,
size: 16,
color: _getAlertTextColor(summary.alertLevel).withValues(alpha: 0.6 * 255),
),
],
),
),
),
@@ -97,39 +91,45 @@ class LicenseExpiryAlert extends StatelessWidget {
return Row(
children: [
if (summary.expired > 0)
_buildBadge('만료 ${summary.expired}', Colors.red),
Padding(
padding: const EdgeInsets.only(left: 4),
child: ShadBadge(
backgroundColor: Colors.red.shade100,
child: Text(
'만료 ${summary.expired}',
style: const TextStyle(fontSize: 10, fontWeight: FontWeight.bold),
),
),
),
if (summary.expiring7Days > 0)
_buildBadge('7일 ${summary.expiring7Days}', Colors.orange),
Padding(
padding: const EdgeInsets.only(left: 4),
child: ShadBadge(
backgroundColor: Colors.orange.shade100,
child: Text(
'7일 ${summary.expiring7Days}',
style: const TextStyle(fontSize: 10, fontWeight: FontWeight.bold),
),
),
),
if (summary.expiring30Days > 0)
_buildBadge('30일 ${summary.expiring30Days}', Colors.yellow[700]!),
Padding(
padding: const EdgeInsets.only(left: 4),
child: ShadBadge(
backgroundColor: Colors.yellow.shade100,
child: Text(
'30일 ${summary.expiring30Days}',
style: const TextStyle(fontSize: 10, fontWeight: FontWeight.bold),
),
),
),
],
);
}
/// 개별 배지 생성
Widget _buildBadge(String text, Color color) {
return Container(
margin: const EdgeInsets.only(left: 4),
padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4),
decoration: BoxDecoration(
color: color.withOpacity(0.2),
borderRadius: BorderRadius.circular(12),
border: Border.all(color: color.withOpacity(0.5)),
),
child: Text(
text,
style: TextStyle(
fontSize: 10,
fontWeight: FontWeight.bold,
color: Colors.black87,
),
),
);
}
/// 라이선스 화면으로 이동
/// 유지보수 일정 화면으로 이동
void _navigateToLicenses(BuildContext context) {
Navigator.pushNamed(context, Routes.licenses);
Navigator.pushNamed(context, Routes.maintenanceSchedule);
}
/// 알림 레벨별 배경색
@@ -185,10 +185,10 @@ class LicenseExpiryAlert extends StatelessWidget {
/// 알림 레벨별 타이틀
String _getAlertTitle(int level) {
switch (level) {
case 3: return '라이선스 만료 위험';
case 2: return '라이선스 만료 경고';
case 1: return '라이선스 만료 주의';
default: return '라이선스 정상';
case 3: return '유지보수 만료 위험';
case 2: return '유지보수 만료 경고';
case 1: return '유지보수 만료 주의';
default: return '유지보수 정상';
}
}
}

View File

@@ -3,6 +3,7 @@ import 'package:superport/utils/constants.dart';
import 'package:superport/data/models/dashboard/overview_stats.dart';
import 'package:superport/screens/common/components/shadcn_components.dart';
import 'package:superport/screens/common/theme_shadcn.dart';
import 'package:shadcn_ui/shadcn_ui.dart';
/// 대시보드 통계 카드 그리드
class StatisticsCardGrid extends StatelessWidget {
@@ -120,57 +121,49 @@ class StatisticsCardGrid extends StatelessWidget {
Color color,
String? route,
) {
return ShadcnCard(
padding: EdgeInsets.zero,
child: Material(
color: Colors.transparent,
borderRadius: BorderRadius.circular(8),
child: InkWell(
onTap: route != null ? () => _navigateToRoute(context, route) : null,
borderRadius: BorderRadius.circular(8),
child: Padding(
padding: const EdgeInsets.all(20),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.start,
return GestureDetector(
onTap: route != null ? () => _navigateToRoute(context, route) : null,
child: ShadcnCard(
padding: const EdgeInsets.all(20),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Icon(
icon,
color: color,
size: 24,
),
if (route != null)
Icon(
Icons.arrow_forward_ios,
size: 12,
color: ShadcnTheme.muted,
),
],
Icon(
icon,
color: color,
size: 24,
),
const SizedBox(height: 12),
Text(
value,
style: TextStyle(
fontSize: 24,
fontWeight: FontWeight.bold,
color: ShadcnTheme.foreground,
if (route != null)
Icon(
Icons.arrow_forward_ios,
size: 12,
color: ShadcnTheme.muted,
),
),
const SizedBox(height: 4),
Text(
title,
style: TextStyle(
fontSize: 12,
color: ShadcnTheme.mutedForeground,
fontWeight: FontWeight.w500,
),
),
],
),
),
const SizedBox(height: 12),
Text(
value,
style: TextStyle(
fontSize: 24,
fontWeight: FontWeight.bold,
color: ShadcnTheme.foreground,
),
),
const SizedBox(height: 4),
Text(
title,
style: TextStyle(
fontSize: 12,
color: ShadcnTheme.mutedForeground,
fontWeight: FontWeight.w500,
),
),
],
),
),
);
@@ -193,12 +186,15 @@ class StatisticsCardGrid extends StatelessWidget {
'장비 상태 분포',
style: ShadcnTheme.headingH5,
),
TextButton.icon(
ShadButton.ghost(
onPressed: () => Navigator.pushNamed(context, Routes.equipment),
icon: const Icon(Icons.arrow_forward, size: 16),
label: const Text('전체 보기'),
style: TextButton.styleFrom(
foregroundColor: ShadcnTheme.primary,
size: ShadButtonSize.sm,
child: const Row(
children: [
Text('전체 보기'),
SizedBox(width: 4),
Icon(Icons.arrow_forward, size: 16),
],
),
),
],
@@ -233,7 +229,7 @@ class StatisticsCardGrid extends StatelessWidget {
Container(
padding: const EdgeInsets.all(16),
decoration: BoxDecoration(
color: ShadcnTheme.muted.withOpacity(0.5),
color: ShadcnTheme.muted.withValues(alpha: 0.5 * 255),
borderRadius: BorderRadius.circular(8),
),
child: Row(
@@ -265,11 +261,8 @@ class StatisticsCardGrid extends StatelessWidget {
],
),
const SizedBox(height: 4),
LinearProgressIndicator(
value: percentage,
backgroundColor: ShadcnTheme.border,
valueColor: AlwaysStoppedAnimation<Color>(color),
borderRadius: BorderRadius.circular(2),
ShadProgress(
value: percentage * 100,
),
],
);
@@ -312,7 +305,7 @@ class StatisticsCardGrid extends StatelessWidget {
Navigator.pushNamed(context, Routes.equipment);
break;
case '/licenses':
Navigator.pushNamed(context, Routes.licenses);
Navigator.pushNamed(context, Routes.maintenanceSchedule);
break;
case '/warehouse-locations':
Navigator.pushNamed(context, Routes.warehouseLocations);