feat: 장비 관리 API 통합 완료

- 장비 출고 API 연동 및 Provider 패턴 적용
- 장비 수정 API 연동 (데이터 로드 시 API 사용)
- 장비 삭제 API 연동 (Controller 메서드 추가)
- 장비 이력 조회 화면 추가 및 API 연동
- 모든 컨트롤러에 ChangeNotifier 패턴 적용
- 에러 처리 및 로딩 상태 관리 개선
- API/Mock 데이터 전환 가능 (Feature Flag)

진행률: 전체 API 통합 70%, 장비 관리 100% 완료
This commit is contained in:
JiWoong Sul
2025-07-24 17:11:05 +09:00
parent 1d1e38bcfa
commit 47bfa3a26a
9 changed files with 650 additions and 144 deletions

View File

@@ -320,19 +320,40 @@ class _EquipmentListRedesignState extends State<EquipmentListRedesign> {
child: const Text('취소'),
),
TextButton(
onPressed: () {
setState(() {
if (equipment.status == EquipmentStatus.in_) {
MockDataService().deleteEquipmentIn(equipment.id!);
} else if (equipment.status == EquipmentStatus.out) {
MockDataService().deleteEquipmentOut(equipment.id!);
}
_controller.loadData();
});
onPressed: () async {
Navigator.pop(context);
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(content: Text('장비가 삭제되었습니다.')),
// 로딩 다이얼로그 표시
showDialog(
context: context,
barrierDismissible: false,
builder: (context) => const Center(
child: CircularProgressIndicator(),
),
);
// Controller를 통한 삭제 처리
final success = await _controller.deleteEquipment(equipment);
// 로딩 다이얼로그 닫기
if (mounted) Navigator.pop(context);
if (success) {
if (mounted) {
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(content: Text('장비가 삭제되었습니다.')),
);
}
} else {
if (mounted) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(_controller.error ?? '삭제 중 오류가 발생했습니다.'),
backgroundColor: Colors.red,
),
);
}
}
},
child: const Text('삭제', style: TextStyle(color: Colors.red)),
),
@@ -341,6 +362,29 @@ class _EquipmentListRedesignState extends State<EquipmentListRedesign> {
);
}
/// 이력 보기 핸들러
void _handleHistory(UnifiedEquipment equipment) async {
if (equipment.equipment.id == null) {
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(content: Text('장비 ID가 없습니다.')),
);
return;
}
final result = await Navigator.pushNamed(
context,
Routes.equipmentHistory,
arguments: {
'equipmentId': equipment.equipment.id,
'equipmentName': '${equipment.equipment.manufacturer} ${equipment.equipment.name}',
},
);
if (result == true) {
_controller.loadData(isRefresh: true);
}
}
@override
Widget build(BuildContext context) {
return ChangeNotifierProvider<EquipmentListController>.value(
@@ -961,10 +1005,15 @@ class _EquipmentListRedesignState extends State<EquipmentListRedesign> {
],
// 관리 버튼
SizedBox(
width: 100,
width: 140,
child: Row(
mainAxisSize: MainAxisSize.min,
children: [
IconButton(
icon: const Icon(Icons.history, size: 16),
onPressed: () => _handleHistory(equipment),
tooltip: '이력',
),
IconButton(
icon: const Icon(Icons.edit_outlined, size: 16),
onPressed: () => _handleEdit(equipment),