프로젝트 최초 커밋

This commit is contained in:
JiWoong Sul
2025-07-02 17:45:44 +09:00
commit e346f83c97
235 changed files with 23139 additions and 0 deletions

View File

@@ -0,0 +1,139 @@
import 'package:flutter/material.dart';
import 'package:superport/models/address_model.dart';
import 'package:superport/screens/common/widgets/address_input.dart';
import 'package:superport/screens/common/widgets/remark_input.dart';
import 'package:superport/screens/common/theme_tailwind.dart';
import 'package:superport/utils/constants.dart';
import 'controllers/warehouse_location_form_controller.dart';
/// 입고지 추가/수정 폼 화면 (SRP 적용, 상태/로직 분리)
class WarehouseLocationFormScreen extends StatefulWidget {
final int? id; // 수정 모드 지원을 위한 id 파라미터
const WarehouseLocationFormScreen({Key? key, this.id}) : super(key: key);
@override
State<WarehouseLocationFormScreen> createState() =>
_WarehouseLocationFormScreenState();
}
class _WarehouseLocationFormScreenState
extends State<WarehouseLocationFormScreen> {
/// 폼 컨트롤러 (상태 및 저장/수정 로직 위임)
late final WarehouseLocationFormController _controller;
@override
void initState() {
super.initState();
// 컨트롤러 생성 및 초기화
_controller = WarehouseLocationFormController();
_controller.initialize(widget.id);
}
@override
void dispose() {
// 컨트롤러 해제
_controller.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(_controller.isEditMode ? '입고지 수정' : '입고지 추가'),
leading: IconButton(
icon: const Icon(Icons.arrow_back),
onPressed: () => Navigator.of(context).maybePop(),
),
),
body: SafeArea(
child: Form(
key: _controller.formKey,
child: SingleChildScrollView(
padding: const EdgeInsets.symmetric(horizontal: 24, vertical: 32),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
// 입고지명 입력
TextFormField(
controller: _controller.nameController,
decoration: const InputDecoration(
labelText: '입고지명',
hintText: '입고지명을 입력하세요',
),
validator: (value) {
if (value == null || value.trim().isEmpty) {
return '입고지명을 입력하세요';
}
return null;
},
),
const SizedBox(height: 24),
// 주소 입력 (공통 위젯)
AddressInput(
initialZipCode: _controller.address.zipCode,
initialRegion: _controller.address.region,
initialDetailAddress: _controller.address.detailAddress,
isRequired: true,
onAddressChanged: (zip, region, detail) {
setState(() {
_controller.updateAddress(
Address(
zipCode: zip,
region: region,
detailAddress: detail,
),
);
});
},
),
const SizedBox(height: 24),
// 비고 입력
RemarkInput(controller: _controller.remarkController),
const SizedBox(height: 80), // 하단 버튼 여백 확보
],
),
),
),
),
bottomNavigationBar: Padding(
padding: const EdgeInsets.fromLTRB(24, 0, 24, 24),
child: SizedBox(
width: double.infinity,
height: 48,
child: ElevatedButton(
onPressed:
_controller.isSaving
? null
: () async {
setState(() {}); // 저장 중 상태 갱신
await _controller.save(context);
setState(() {}); // 저장 완료 후 상태 갱신
},
style: ElevatedButton.styleFrom(
backgroundColor: AppThemeTailwind.primary,
minimumSize: const Size.fromHeight(48),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(8),
),
),
child:
_controller.isSaving
? const SizedBox(
width: 18,
height: 18,
child: CircularProgressIndicator(strokeWidth: 2),
)
: const Text(
'저장',
style: TextStyle(
fontSize: 16,
fontWeight: FontWeight.bold,
),
),
),
),
),
);
}
}