결재/인벤토리 주석화 1단계 및 계획 문서 추가

This commit is contained in:
JiWoong Sul
2025-09-29 17:15:32 +09:00
parent d40cdf8272
commit 2a0db08079
11 changed files with 157 additions and 13 deletions

View File

@@ -24,6 +24,7 @@ class ApprovalApproverAutocompleteField extends StatefulWidget {
_ApprovalApproverAutocompleteFieldState();
}
/// 승인자 자동완성 필드의 내부 상태를 관리한다.
class _ApprovalApproverAutocompleteFieldState
extends State<ApprovalApproverAutocompleteField> {
late final TextEditingController _textController;
@@ -39,6 +40,7 @@ class _ApprovalApproverAutocompleteFieldState
_syncFromId();
}
/// 외부에서 제공된 ID 값으로부터 표시 문자열을 동기화한다.
void _syncFromId() {
final idText = widget.idController.text.trim();
final id = int.tryParse(idText);
@@ -55,10 +57,12 @@ class _ApprovalApproverAutocompleteFieldState
}
}
/// 검색어에 매칭되는 승인자 목록을 반환한다.
Iterable<ApprovalApproverCatalogItem> _options(String query) {
return ApprovalApproverCatalog.filter(query);
}
/// 특정 승인자를 선택했을 때 내부 상태와 콜백을 갱신한다.
void _handleSelected(ApprovalApproverCatalogItem item) {
setState(() {
_selected = item;
@@ -68,6 +72,7 @@ class _ApprovalApproverAutocompleteFieldState
});
}
/// 선택된 값을 초기화한다.
void _handleCleared() {
setState(() {
_selected = null;
@@ -81,6 +86,7 @@ class _ApprovalApproverAutocompleteFieldState
return '${item.name} (${item.employeeNo}) · ${item.team}';
}
/// 사용자가 직접 입력한 사번(ID)을 기반으로 값을 결정한다.
void _applyManualEntry(String value) {
final trimmed = value.trim();
if (trimmed.isEmpty) {
@@ -104,6 +110,7 @@ class _ApprovalApproverAutocompleteFieldState
});
}
/// 포커스가 해제될 때 수동 입력을 확정한다.
void _handleFocusChange() {
if (!_focusNode.hasFocus) {
_applyManualEntry(_textController.text);