diff --git a/android/fastlane/report.xml b/android/fastlane/report.xml index 8c49ec9..51f7c1d 100644 --- a/android/fastlane/report.xml +++ b/android/fastlane/report.xml @@ -5,27 +5,27 @@ - + - + - + - + - + diff --git a/asset/image/plus.svg b/asset/image/plus.svg new file mode 100644 index 0000000..48b3c95 --- /dev/null +++ b/asset/image/plus.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/ios/Runner.app.dSYM.zip b/ios/Runner.app.dSYM.zip index 88de928..b785185 100644 Binary files a/ios/Runner.app.dSYM.zip and b/ios/Runner.app.dSYM.zip differ diff --git a/ios/Runner.ipa b/ios/Runner.ipa index f7cb350..48227a4 100644 Binary files a/ios/Runner.ipa and b/ios/Runner.ipa differ diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index bbefb28..efceb1b 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -474,9 +474,9 @@ CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 6; + CURRENT_PROJECT_VERSION = 7; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 643M65W7HH; ENABLE_BITCODE = NO; @@ -488,7 +488,7 @@ PRODUCT_BUNDLE_IDENTIFIER = com.example.pladi; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; - "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = "match AppStore com.example.pladi"; + "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = "match Development com.example.pladi"; SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; SUPPORTS_MACCATALYST = NO; SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; @@ -505,7 +505,7 @@ buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 6; + CURRENT_PROJECT_VERSION = 7; DEVELOPMENT_TEAM = 643M65W7HH; GENERATE_INFOPLIST_FILE = YES; MARKETING_VERSION = 1.0; @@ -524,7 +524,7 @@ buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 6; + CURRENT_PROJECT_VERSION = 7; DEVELOPMENT_TEAM = 643M65W7HH; GENERATE_INFOPLIST_FILE = YES; MARKETING_VERSION = 1.0; @@ -541,7 +541,7 @@ buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 6; + CURRENT_PROJECT_VERSION = 7; DEVELOPMENT_TEAM = 643M65W7HH; GENERATE_INFOPLIST_FILE = YES; MARKETING_VERSION = 1.0; @@ -667,9 +667,9 @@ CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 6; + CURRENT_PROJECT_VERSION = 7; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 643M65W7HH; ENABLE_BITCODE = NO; @@ -681,7 +681,7 @@ PRODUCT_BUNDLE_IDENTIFIER = com.example.pladi; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; - "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = "match AppStore com.example.pladi"; + "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = "match Development com.example.pladi"; SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; SUPPORTS_MACCATALYST = NO; SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; @@ -701,9 +701,9 @@ CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 6; + CURRENT_PROJECT_VERSION = 7; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 643M65W7HH; ENABLE_BITCODE = NO; @@ -715,7 +715,7 @@ PRODUCT_BUNDLE_IDENTIFIER = com.example.pladi; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; - "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = "match AppStore com.example.pladi"; + "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = "match Development com.example.pladi"; SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; SUPPORTS_MACCATALYST = NO; SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist index 6a78bf8..cf6bfa2 100644 --- a/ios/Runner/Info.plist +++ b/ios/Runner/Info.plist @@ -23,7 +23,7 @@ CFBundleSignature ???? CFBundleVersion - 6 + 7 LSRequiresIPhoneOS UIApplicationSupportsIndirectInputEvents diff --git a/ios/fastlane/.env b/ios/fastlane/.env index c3c8d3f..bd472d1 100644 --- a/ios/fastlane/.env +++ b/ios/fastlane/.env @@ -1,4 +1,5 @@ APP_IDENTIFIER="com.example.pladi" APPLE_ID="yoo7969@naver.com" +SLACK_WEBHOOK_URL="https://hooks.slack.com/services/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" FASTLANE_USER="fastlane" FASTLANE_APPLE_APPLICATION_SPECIFIC_PASSWORD="ilyo-rtji-kcfa-lqhg" diff --git a/ios/fastlane/report.xml b/ios/fastlane/report.xml index 03c0909..b2bb0a1 100644 --- a/ios/fastlane/report.xml +++ b/ios/fastlane/report.xml @@ -5,72 +5,72 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + diff --git a/lib/Model/model/equipment/equipment_list_model.dart b/lib/Model/model/equipment/equipment_list_model.dart index 40c9115..b048b38 100644 --- a/lib/Model/model/equipment/equipment_list_model.dart +++ b/lib/Model/model/equipment/equipment_list_model.dart @@ -53,7 +53,7 @@ class EquipmentModel { String keeper; String? location; String name; - int quantity; + String quantity; EquipmentModel({ required this.category, diff --git a/lib/Model/model/equipment/equipment_list_model.g.dart b/lib/Model/model/equipment/equipment_list_model.g.dart index 2f8dbd4..427acb7 100644 --- a/lib/Model/model/equipment/equipment_list_model.g.dart +++ b/lib/Model/model/equipment/equipment_list_model.g.dart @@ -66,7 +66,7 @@ EquipmentModel _$EquipmentModelFromJson(Map json) => keeper: json['keeper'] as String, location: json['location'] as String?, name: json['name'] as String, - quantity: json['quantity'] as int, + quantity: json['quantity'] as String, ); Map _$EquipmentModelToJson(EquipmentModel instance) => diff --git a/lib/Presenter/equipment/equipment_service.dart b/lib/Presenter/equipment/equipment_service.dart index 4d87cd0..7af8f38 100644 --- a/lib/Presenter/equipment/equipment_service.dart +++ b/lib/Presenter/equipment/equipment_service.dart @@ -1,7 +1,7 @@ import 'package:frontend/Model/network/api_manager.dart'; class EquipmentService { - final equipmentURL = '/equipments?size=100'; + final equipmentURL = '/equipments?cond='; static final EquipmentService _equipmentService = EquipmentService._(); EquipmentService._(); @@ -14,4 +14,10 @@ class EquipmentService { APIManager().request(RequestType.get, equipmentURL, null, null, null); return response; } + + Future getEquipmentCategory() async { + final response = + APIManager().request(RequestType.get, equipmentURL, null, null, null); + return response; + } } diff --git a/lib/View/equipment/component/equipment_cell.dart b/lib/View/equipment/component/equipment_cell.dart index 862f3e6..fcdefa1 100644 --- a/lib/View/equipment/component/equipment_cell.dart +++ b/lib/View/equipment/component/equipment_cell.dart @@ -28,20 +28,32 @@ class _EquipmentCellState extends State { width: double.infinity, height: 120, decoration: ShapeDecoration( - color: const Color(0xFFF7F3FB), + color: const Color(0xFFFCFBFF), shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(10), + borderRadius: BorderRadius.circular(5.76), ), + shadows: const [ + BoxShadow( + color: Color(0x517A7A7B), + blurRadius: 19.20, + offset: Offset(0, 7.68), + spreadRadius: 0, + ) + ], ), margin: const EdgeInsets.only(top: 10), child: Row( children: [ Container( margin: const EdgeInsets.only(top: 14, left: 14, bottom: 14), - child: (widget.equipment.imgUrl == null) - ? Image.asset('asset/image/pladi_icon.png') - : Image.network(widget.equipment.imgUrl!, - fit: BoxFit.fitWidth)), + child: SizedBox( + width: 90, + height: 90, + child: (widget.equipment.imgUrl == null) + ? Image.asset('asset/image/pladi_icon.png') + : Image.network(widget.equipment.imgUrl!, + fit: BoxFit.fitWidth), + )), Container( margin: const EdgeInsets.only( top: 17, left: 10, bottom: 14, right: 10), @@ -49,13 +61,12 @@ class _EquipmentCellState extends State { crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( + crossAxisAlignment: CrossAxisAlignment.center, children: [ Container( alignment: Alignment.center, width: 65, - height: 30, - padding: const EdgeInsets.symmetric( - horizontal: 4.72, vertical: 1.18), + height: 22, decoration: ShapeDecoration( color: const Color(0xFF640FAF), shape: RoundedRectangleBorder( @@ -84,7 +95,6 @@ class _EquipmentCellState extends State { fontSize: 15, fontFamily: 'NanumSquare_ac', fontWeight: FontWeight.w700, - height: 0.10, letterSpacing: 0.10, ), ), @@ -92,13 +102,12 @@ class _EquipmentCellState extends State { width: 10, ), Text( - widget.equipment.quantity.toString(), + widget.equipment.quantity, style: const TextStyle( color: Color(0xFF717171), fontSize: 13, fontFamily: 'NanumSquare_ac', fontWeight: FontWeight.w700, - height: 0.14, letterSpacing: 0.10, ), ) @@ -124,7 +133,6 @@ class _EquipmentCellState extends State { fontSize: 13, fontFamily: 'NanumSquare_ac', fontWeight: FontWeight.w700, - height: 0.14, letterSpacing: 0.10, ), ) @@ -152,7 +160,6 @@ class _EquipmentCellState extends State { fontSize: 13, fontFamily: 'NanumSquare_ac', fontWeight: FontWeight.w700, - height: 0.14, letterSpacing: 0.10, ), ) diff --git a/lib/View/equipment/screen/equipment_add_screen.dart b/lib/View/equipment/screen/equipment_add_screen.dart new file mode 100644 index 0000000..17f41d8 --- /dev/null +++ b/lib/View/equipment/screen/equipment_add_screen.dart @@ -0,0 +1,335 @@ +import 'package:flutter/material.dart'; +import 'package:frontend/View/common/component/sub_app_bar.dart'; + +class EquipmentAddScreen extends StatefulWidget { + const EquipmentAddScreen({super.key}); + + @override + State createState() => _EquipmentAddScreen(); +} + +class _EquipmentAddScreen extends State { + final categories = ["1", "2", "3"]; + String? _selectedCategory; + FocusNode nameFocusNode = FocusNode(); + FocusNode quantityFocusNode = FocusNode(); + FocusNode loacationFocusNode = FocusNode(); + FocusNode descriptionFocusNode = FocusNode(); + + TextEditingController nameController = TextEditingController(); + TextEditingController quantityController = TextEditingController(); + TextEditingController loacationController = TextEditingController(); + TextEditingController descriptionController = TextEditingController(); + + @override + void initState() { + super.initState(); + } + + @override + void dispose() { + nameFocusNode.dispose(); + quantityFocusNode.dispose(); + loacationFocusNode.dispose(); + descriptionFocusNode.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: const SubAppBar( + titleText: '신규 비품 추가', + ), + body: renderBody(), + ); + } + + Widget renderBody() { + return Container( + margin: const EdgeInsets.only(top: 14, right: 20, left: 20), + child: Column( + children: [ + const SizedBox( + width: double.infinity, + child: Text.rich( + TextSpan( + children: [ + TextSpan( + text: '비품명 ', + style: TextStyle( + color: Color(0xFF4C4C4C), + fontSize: 16, + fontFamily: 'NanumSquare_ac', + fontWeight: FontWeight.w700, + height: 0, + ), + ), + TextSpan( + text: '*', + style: TextStyle( + color: Color(0xFFEC6240), + fontSize: 16, + fontFamily: 'NanumSquare_ac', + fontWeight: FontWeight.w700, + height: 0, + ), + ), + ], + ), + ), + ), + const SizedBox( + height: 14, + ), + SizedBox( + width: double.infinity, + height: 42, + child: TextField( + maxLines: 1, + focusNode: nameFocusNode, + obscureText: false, + controller: nameController, + decoration: const InputDecoration( + enabledBorder: OutlineInputBorder( + borderRadius: BorderRadius.all(Radius.circular(10)), + borderSide: BorderSide(color: Color(0xFF939393))), + focusedBorder: OutlineInputBorder( + borderRadius: BorderRadius.all(Radius.circular(10)), + borderSide: BorderSide(color: Color(0xFF640FAF))), + isDense: true, + hintText: "비품명을 입력해주세요.", + contentPadding: EdgeInsets.all(10)), + ), + ), + const SizedBox( + height: 14, + ), + const SizedBox( + width: double.infinity, + child: Text.rich( + TextSpan( + children: [ + TextSpan( + text: '수량 ', + style: TextStyle( + color: Color(0xFF4C4C4C), + fontSize: 16, + fontFamily: 'NanumSquare_ac', + fontWeight: FontWeight.w700, + height: 0, + ), + ), + TextSpan( + text: '*', + style: TextStyle( + color: Color(0xFFEC6240), + fontSize: 16, + fontFamily: 'NanumSquare_ac', + fontWeight: FontWeight.w700, + height: 0, + ), + ), + ], + ), + ), + ), + const SizedBox( + height: 14, + ), + SizedBox( + width: double.infinity, + height: 42, + child: TextField( + maxLines: 1, + keyboardType: TextInputType.number, + focusNode: quantityFocusNode, + obscureText: false, + controller: quantityController, + decoration: const InputDecoration( + enabledBorder: OutlineInputBorder( + borderRadius: BorderRadius.all(Radius.circular(10)), + borderSide: BorderSide(color: Color(0xFF939393))), + focusedBorder: OutlineInputBorder( + borderRadius: BorderRadius.all(Radius.circular(10)), + borderSide: BorderSide(color: Color(0xFF640FAF))), + isDense: true, + hintText: "수량을 입력해주세요.", + contentPadding: EdgeInsets.all(10)), + ), + ), + const SizedBox( + height: 14, + ), + const SizedBox( + width: double.infinity, + child: Text.rich( + TextSpan( + children: [ + TextSpan( + text: '카테고리 ', + style: TextStyle( + color: Color(0xFF4C4C4C), + fontSize: 16, + fontFamily: 'NanumSquare_ac', + fontWeight: FontWeight.w700, + height: 0, + ), + ), + TextSpan( + text: '*', + style: TextStyle( + color: Color(0xFFEC6240), + fontSize: 16, + fontFamily: 'NanumSquare_ac', + fontWeight: FontWeight.w700, + height: 0, + ), + ), + ], + ), + ), + ), + const SizedBox( + height: 14, + ), + SizedBox( + width: double.infinity, + height: 42, + child: DropdownButton( + hint: const Text('카테고리를 선택해주세요.', + style: TextStyle( + color: Color(0xFFC9C9C9), + fontSize: 13, + fontFamily: 'NanumSquare_ac', + fontWeight: FontWeight.w400, + height: 0, + )), + value: _selectedCategory, + items: categories.map((category) { + return DropdownMenuItem( + value: category, + child: Text(category), + ); + }).toList(), + onChanged: (value) { + setState(() { + _selectedCategory = value!; + }); + }, + ), + ), + const SizedBox( + height: 14, + ), + const SizedBox( + width: double.infinity, + child: Text( + '보관 장소', + style: TextStyle( + color: Color(0xFF4C4C4C), + fontSize: 16, + fontFamily: 'NanumSquare_ac', + fontWeight: FontWeight.w700, + ), + )), + const SizedBox( + height: 14, + ), + SizedBox( + width: double.infinity, + height: 42, + child: TextField( + maxLines: 1, + focusNode: loacationFocusNode, + obscureText: false, + controller: loacationController, + decoration: const InputDecoration( + enabledBorder: OutlineInputBorder( + borderRadius: BorderRadius.all(Radius.circular(10)), + borderSide: BorderSide(color: Color(0xFF939393))), + focusedBorder: OutlineInputBorder( + borderRadius: BorderRadius.all(Radius.circular(10)), + borderSide: BorderSide(color: Color(0xFF640FAF))), + isDense: true, + hintText: "보관장소를 입력해주세요.", + contentPadding: EdgeInsets.all(10)), + ), + ), + const SizedBox( + height: 14, + ), + const SizedBox( + width: double.infinity, + child: Text( + '설명', + style: TextStyle( + color: Color(0xFF4C4C4C), + fontSize: 16, + fontFamily: 'NanumSquare_ac', + fontWeight: FontWeight.w700, + ), + )), + const SizedBox( + height: 14, + ), + SizedBox( + width: double.infinity, + height: 87, + child: TextField( + maxLines: 10, + focusNode: descriptionFocusNode, + obscureText: false, + controller: descriptionController, + decoration: const InputDecoration( + enabledBorder: OutlineInputBorder( + borderRadius: BorderRadius.all(Radius.circular(10)), + borderSide: BorderSide(color: Color(0xFF939393))), + focusedBorder: OutlineInputBorder( + borderRadius: BorderRadius.all(Radius.circular(10)), + borderSide: BorderSide(color: Color(0xFF640FAF))), + isDense: true, + hintText: "비품 설명을 입력해주세요.", + contentPadding: EdgeInsets.all(10)), + ), + ), + const SizedBox( + height: 14, + ), + const SizedBox( + width: double.infinity, + child: Text( + '첨부사진', + style: TextStyle( + color: Color(0xFF4C4C4C), + fontSize: 16, + fontFamily: 'NanumSquare_ac', + fontWeight: FontWeight.w700, + ), + )), + const SizedBox( + height: 14, + ), + SizedBox( + width: double.infinity, + height: 42, + child: TextField( + maxLines: 1, + focusNode: nameFocusNode, + obscureText: false, + controller: nameController, + decoration: const InputDecoration( + focusedBorder: UnderlineInputBorder( + borderSide: BorderSide(color: Color(0xFF640FAF))), + isDense: true, + hintText: "비품명을 입력해주세요.", + contentPadding: EdgeInsets.all(10)), + ), + ), + ], + ), + ); + } + + void moveToAddEquipment() {} +} diff --git a/lib/View/equipment/screen/equipment_screen.dart b/lib/View/equipment/screen/equipment_screen.dart index 6208703..86496cb 100644 --- a/lib/View/equipment/screen/equipment_screen.dart +++ b/lib/View/equipment/screen/equipment_screen.dart @@ -1,8 +1,10 @@ import 'package:flutter/material.dart'; +import 'package:flutter_svg/svg.dart'; import 'package:frontend/Model/model/equipment/equipment_list_model.dart'; import 'package:frontend/Presenter/equipment/equipment_service.dart'; import 'package:frontend/View/common/component/main_app_bar.dart'; import 'package:frontend/View/equipment/component/equipment_cell.dart'; +import 'package:frontend/View/equipment/screen/equipment_add_screen.dart'; class EquipmentScreen extends StatefulWidget { const EquipmentScreen({super.key}); @@ -14,7 +16,18 @@ class EquipmentScreen extends StatefulWidget { class _EquipmentScreen extends State { @override Widget build(BuildContext context) { - return Scaffold(appBar: const MainAppBar(), body: futureBody()); + return Scaffold( + appBar: const MainAppBar(), + body: futureBody(), + floatingActionButton: FloatingActionButton( + onPressed: () { + moveToAddEquipment(); + }, + tooltip: 'Increment', + backgroundColor: const Color(0xFF640FAF), + child: addButton(), + ), + ); } Widget futureBody() { @@ -61,4 +74,35 @@ class _EquipmentScreen extends State { }, ); } + + Widget addButton() { + return Container( + width: 48, + height: 48, + decoration: const ShapeDecoration( + color: Color(0xFF640FAF), + shape: OvalBorder(), + shadows: [ + BoxShadow( + color: Color(0x19000000), + blurRadius: 20, + offset: Offset(0, 4), + spreadRadius: 0, + ) + ], + ), + child: Center( + child: SvgPicture.asset( + 'asset/image/plus.svg', + width: 22, + height: 22, + ), + ), + ); + } + + void moveToAddEquipment() { + Navigator.of(context) + .push(MaterialPageRoute(builder: (_) => const EquipmentAddScreen())); + } } diff --git a/pubspec.yaml b/pubspec.yaml index 488b512..6cae2d0 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -2,7 +2,7 @@ name: frontend description: A new Flutter project. publish_to: none -version: 16.0.0+16 +version: 17.0.0+17 environment: sdk: ">=3.0.5 <4.0.0" dependencies: