feat: 소프트 딜리트 기능 전면 구현 완료
Some checks failed
Flutter Test & Quality Check / Test on macos-latest (push) Has been cancelled
Flutter Test & Quality Check / Test on ubuntu-latest (push) Has been cancelled
Flutter Test & Quality Check / Build APK (push) Has been cancelled

## 주요 변경사항
- Company, Equipment, License, Warehouse Location 모든 화면에 소프트 딜리트 구현
- 관리자 권한으로 삭제된 데이터 조회 가능 (includeInactive 파라미터)
- 데이터 무결성 보장을 위한 논리 삭제 시스템 완성

## 기능 개선
- 각 리스트 컨트롤러에 toggleIncludeInactive() 메서드 추가
- UI에 "비활성 포함" 체크박스 추가 (관리자 전용)
- API 데이터소스에 includeInactive 파라미터 지원

## 문서 정리
- 불필요한 문서 파일 제거 및 재구성
- CLAUDE.md 프로젝트 상태 업데이트 (진행률 80%)
- 테스트 결과 문서화 (test20250812v01.md)

## UI 컴포넌트
- Equipment 화면 위젯 모듈화 (custom_dropdown_field, equipment_basic_info_section)
- 폼 유효성 검증 강화

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
JiWoong Sul
2025-08-12 20:02:54 +09:00
parent 1645182b38
commit e7860ae028
48 changed files with 2096 additions and 1242 deletions

View File

@@ -142,6 +142,32 @@ class _MaintenanceFormScreenState extends State<MaintenanceFormScreen> {
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
// 수정 모드일 때 안내 메시지
if (_controller.isEditMode)
Container(
padding: const EdgeInsets.all(12),
margin: const EdgeInsets.only(bottom: 16),
decoration: BoxDecoration(
color: Colors.amber.shade50,
border: Border.all(color: Colors.amber.shade200),
borderRadius: BorderRadius.circular(8),
),
child: Row(
children: [
Icon(Icons.info_outline, color: Colors.amber.shade700, size: 20),
const SizedBox(width: 8),
Expanded(
child: Text(
'라이선스 키, 현위치, 할당 사용자, 구매일은 보안상 수정할 수 없습니다.',
style: TextStyle(
color: Colors.amber.shade900,
fontSize: 13,
),
),
),
],
),
),
// 기본 정보 섹션
FormSection(
title: '기본 정보',
@@ -166,9 +192,18 @@ class _MaintenanceFormScreenState extends State<MaintenanceFormScreen> {
required: true,
child: TextFormField(
controller: _controller.licenseKeyController,
decoration: const InputDecoration(
readOnly: _controller.isEditMode, // 수정 모드에서 읽기 전용
decoration: InputDecoration(
hintText: '라이선스 키를 입력하세요',
border: OutlineInputBorder(),
filled: _controller.isEditMode,
fillColor: _controller.isEditMode ? Colors.grey.shade100 : null,
suffixIcon: _controller.isEditMode
? Tooltip(
message: '라이선스 키는 수정할 수 없습니다',
child: Icon(Icons.lock_outline, color: Colors.grey.shade600, size: 20),
)
: null,
),
validator: (value) => validateRequired(value, '라이선스 키'),
),
@@ -192,9 +227,18 @@ class _MaintenanceFormScreenState extends State<MaintenanceFormScreen> {
required: true,
child: TextFormField(
controller: _controller.locationController,
decoration: const InputDecoration(
readOnly: _controller.isEditMode, // 수정 모드에서 읽기 전용
decoration: InputDecoration(
hintText: '현재 위치를 입력하세요',
border: OutlineInputBorder(),
filled: _controller.isEditMode,
fillColor: _controller.isEditMode ? Colors.grey.shade100 : null,
suffixIcon: _controller.isEditMode
? Tooltip(
message: '현위치는 수정할 수 없습니다',
child: Icon(Icons.lock_outline, color: Colors.grey.shade600, size: 20),
)
: null,
),
validator: (value) => validateRequired(value, '현위치'),
),
@@ -204,9 +248,18 @@ class _MaintenanceFormScreenState extends State<MaintenanceFormScreen> {
label: '할당 사용자',
child: TextFormField(
controller: _controller.assignedUserController,
decoration: const InputDecoration(
readOnly: _controller.isEditMode, // 수정 모드에서 읽기 전용
decoration: InputDecoration(
hintText: '할당된 사용자를 입력하세요',
border: OutlineInputBorder(),
filled: _controller.isEditMode,
fillColor: _controller.isEditMode ? Colors.grey.shade100 : null,
suffixIcon: _controller.isEditMode
? Tooltip(
message: '할당 사용자는 수정할 수 없습니다',
child: Icon(Icons.lock_outline, color: Colors.grey.shade600, size: 20),
)
: null,
),
),
),
@@ -234,7 +287,7 @@ class _MaintenanceFormScreenState extends State<MaintenanceFormScreen> {
label: '구매일',
required: true,
child: InkWell(
onTap: () async {
onTap: _controller.isEditMode ? null : () async { // 수정 모드에서 비활성화
final date = await showDatePicker(
context: context,
initialDate: _controller.purchaseDate ?? DateTime.now(),
@@ -246,14 +299,24 @@ class _MaintenanceFormScreenState extends State<MaintenanceFormScreen> {
}
},
child: InputDecorator(
decoration: const InputDecoration(
decoration: InputDecoration(
border: OutlineInputBorder(),
suffixIcon: Icon(Icons.calendar_today),
filled: _controller.isEditMode,
fillColor: _controller.isEditMode ? Colors.grey.shade100 : null,
suffixIcon: _controller.isEditMode
? Tooltip(
message: '구매일은 수정할 수 없습니다',
child: Icon(Icons.lock_outline, color: Colors.grey.shade600, size: 20),
)
: Icon(Icons.calendar_today),
),
child: Text(
_controller.purchaseDate != null
? DateFormat('yyyy-MM-dd').format(_controller.purchaseDate!)
: '구매일을 선택하세요',
style: TextStyle(
color: _controller.isEditMode ? Colors.grey.shade600 : null,
),
),
),
),