refactor: 회사 폼 UI 개선 및 코드 정리
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

- 담당자 연락처 필드를 드롭다운 + 입력 방식으로 분리
- 사용자 폼과 동일한 전화번호 UI 패턴 적용
- 미사용 위젯 파일 4개 정리 (branch_card, contact_info_* 등)
- 파일명 통일성 확보 (branch_edit_screen → branch_form, company_form_simplified → company_form)
- 네이밍 일관성 개선으로 유지보수성 향상
This commit is contained in:
JiWoong Sul
2025-08-18 17:57:16 +09:00
parent 93bceb8a6c
commit 6d745051b5
37 changed files with 2743 additions and 2446 deletions

View File

@@ -1,111 +1,90 @@
import 'package:flutter/material.dart';
import 'package:superport/models/address_model.dart';
import 'package:superport/models/company_model.dart';
import 'package:superport/utils/phone_utils.dart';
import 'package:superport/models/address_model.dart';
/// 지점(Branch) 폼 컨트롤러
///
/// 각 지점의 상태, 컨트롤러, 포커스, 드롭다운, 전화번호 등 관리를 담당
/// 회사 폼에서 사용되는 지점 관리 컨트롤러
/// 각 지점의 정보를 개별적으로 관리
class BranchFormController {
// 지점 데이터
Branch branch;
// 입력 컨트롤러
final TextEditingController nameController;
final TextEditingController contactNameController;
final TextEditingController contactPositionController;
final TextEditingController contactPhoneController;
final TextEditingController contactEmailController;
final TextEditingController remarkController;
// 포커스 노드
final FocusNode focusNode;
// 카드 키(위젯 식별용)
final GlobalKey cardKey;
// 직책 드롭다운 상태
final ValueNotifier<bool> positionDropdownNotifier;
// 전화번호 접두사
String selectedPhonePrefix;
// 직책 목록(공통 상수로 관리 권장)
Branch _branch;
final List<String> positions;
// 전화번호 접두사 목록(공통 상수로 관리 권장)
final List<String> phonePrefixes;
// 컨트롤러들
final TextEditingController nameController = TextEditingController();
final TextEditingController contactNameController = TextEditingController();
final TextEditingController contactPositionController = TextEditingController();
final TextEditingController contactPhoneController = TextEditingController();
final TextEditingController contactEmailController = TextEditingController();
final TextEditingController remarkController = TextEditingController();
final FocusNode focusNode = FocusNode();
// 전화번호 관련
String selectedPhonePrefix = '010';
BranchFormController({
required this.branch,
required Branch branch,
required this.positions,
required this.phonePrefixes,
}) : nameController = TextEditingController(text: branch.name),
contactNameController = TextEditingController(
text: branch.contactName ?? '',
),
contactPositionController = TextEditingController(
text: branch.contactPosition ?? '',
),
contactPhoneController = TextEditingController(
text: PhoneUtils.extractPhoneNumberWithoutPrefix(
branch.contactPhone ?? '',
phonePrefixes,
),
),
contactEmailController = TextEditingController(
text: branch.contactEmail ?? '',
),
remarkController = TextEditingController(text: branch.remark ?? ''),
focusNode = FocusNode(),
cardKey = GlobalKey(),
positionDropdownNotifier = ValueNotifier<bool>(false),
selectedPhonePrefix = PhoneUtils.extractPhonePrefix(
branch.contactPhone ?? '',
phonePrefixes,
);
}) : _branch = branch {
// 초기값 설정
nameController.text = branch.name;
contactNameController.text = branch.contactName ?? '';
contactPositionController.text = branch.contactPosition ?? '';
contactPhoneController.text = branch.contactPhone ?? '';
contactEmailController.text = branch.contactEmail ?? '';
remarkController.text = branch.remark ?? '';
// 전화번호 접두사 추출
if (branch.contactPhone != null && branch.contactPhone!.isNotEmpty) {
for (String prefix in phonePrefixes) {
if (branch.contactPhone!.startsWith(prefix)) {
selectedPhonePrefix = prefix;
contactPhoneController.text = branch.contactPhone!.substring(prefix.length);
break;
}
}
}
}
/// Branch 객체 getter
Branch get branch => _branch.copyWith(
name: nameController.text.trim(),
contactName: contactNameController.text.trim().isEmpty ? null : contactNameController.text.trim(),
contactPosition: contactPositionController.text.trim().isEmpty ? null : contactPositionController.text.trim(),
contactPhone: contactPhoneController.text.trim().isEmpty ? null : '$selectedPhonePrefix${contactPhoneController.text.trim()}',
contactEmail: contactEmailController.text.trim().isEmpty ? null : contactEmailController.text.trim(),
remark: remarkController.text.trim().isEmpty ? null : remarkController.text.trim(),
);
/// 주소 업데이트
void updateAddress(Address address) {
branch = branch.copyWith(address: address);
_branch = _branch.copyWith(address: address);
}
/// 필드별 값 업데이트
void updateField(String fieldName, String value) {
switch (fieldName) {
/// 필드 업데이트
void updateField(String field, String value) {
switch (field) {
case 'name':
branch = branch.copyWith(name: value);
nameController.text = value;
break;
case 'contactName':
branch = branch.copyWith(contactName: value);
contactNameController.text = value;
break;
case 'contactPosition':
branch = branch.copyWith(contactPosition: value);
contactPositionController.text = value;
break;
case 'contactPhone':
branch = branch.copyWith(
contactPhone: PhoneUtils.getFullPhoneNumber(
selectedPhonePrefix,
value,
),
);
contactPhoneController.text = value;
break;
case 'contactEmail':
branch = branch.copyWith(contactEmail: value);
contactEmailController.text = value;
break;
case 'remark':
branch = branch.copyWith(remark: value);
remarkController.text = value;
break;
}
}
/// 전화번호 접두사 변경
void updatePhonePrefix(String prefix) {
selectedPhonePrefix = prefix;
branch = branch.copyWith(
contactPhone: PhoneUtils.getFullPhoneNumber(
prefix,
contactPhoneController.text,
),
);
}
/// 리소스 해제
void dispose() {
nameController.dispose();
@@ -115,7 +94,5 @@ class BranchFormController {
contactEmailController.dispose();
remarkController.dispose();
focusNode.dispose();
positionDropdownNotifier.dispose();
// cardKey는 위젯에서 자동 관리
}
}
}