Semi Final 7th Aug 2024

This commit is contained in:
2024-08-07 14:24:05 +09:00
parent 66ade1fe09
commit 347861e5a1
23 changed files with 342 additions and 160 deletions

View File

@ -91,6 +91,7 @@ class MemberController extends GetxController {
lastname.value = value;
}
Future<bool> saveMember() async {
if (!_validateInputs()) return false;
@ -139,8 +140,8 @@ class MemberController extends GetxController {
return '${lastname.value} ${firstname.value}'.trim();
}
Future<void> updateMember() async {
if (member.value == null) return;
Future<bool> updateMember() async {
if (member.value == null) return false;
int? memberId = member.value?.id;
try {
final updatedMember = await _apiService.updateTeamMember(
@ -152,15 +153,17 @@ class MemberController extends GetxController {
female.value,
);
member.value = updatedMember;
return true;
} catch (e) {
print('Error updating member: $e');
return false;
}
}
Future<void> deleteMember() async {
Future<bool> deleteMember() async {
if (member.value == null || member.value!.id == null) {
Get.snackbar('エラー', 'メンバー情報が不正です', snackPosition: SnackPosition.BOTTOM);
return;
return false;
}
try {
@ -168,11 +171,14 @@ class MemberController extends GetxController {
await _apiService.deleteTeamMember(teamId, member.value!.id!);
Get.snackbar('成功', 'メンバーが削除されました', snackPosition: SnackPosition.BOTTOM);
member.value = null;
isLoading.value = false;
return true;
} catch (e) {
print('Error deleting member: $e');
Get.snackbar('エラー', 'メンバーの削除に失敗しました: ${e.toString()}', snackPosition: SnackPosition.BOTTOM);
} finally {
isLoading.value = false;
return false;
}
}
@ -251,10 +257,10 @@ class MemberController extends GetxController {
yearsFromSchoolStart--;
}
if (yearsFromSchoolStart < 0) return '未就学';
if (yearsFromSchoolStart < 6) return '${yearsFromSchoolStart + 1}';
if (yearsFromSchoolStart < 9) return '${yearsFromSchoolStart - 5}';
if (yearsFromSchoolStart < 12) return '${yearsFromSchoolStart - 8}';
if (yearsFromSchoolStart < 7) return '未就学';
if (yearsFromSchoolStart < 13) return '${yearsFromSchoolStart - 6}';
if (yearsFromSchoolStart < 16) return '${yearsFromSchoolStart - 12}';
if (yearsFromSchoolStart < 19) return '${yearsFromSchoolStart - 15}';
return '成人';
}

View File

@ -7,6 +7,8 @@ import 'package:intl/intl.dart'; // この行を追加
import 'package:flutter_localizations/flutter_localizations.dart'; // 追加
import 'package:flutter/cupertino.dart';
import 'package:rogapp/routes/app_pages.dart';
class MemberDetailPage extends StatefulWidget {
@override
_MemberDetailPageState createState() => _MemberDetailPageState();
@ -34,15 +36,18 @@ class _MemberDetailPageState extends State<MemberDetailPage> {
}
void _initializeControllers() {
_firstNameController = TextEditingController(text: controller.firstname.value);
_lastNameController = TextEditingController(text: controller.lastname.value);
_firstNameController =
TextEditingController(text: controller.firstname.value);
_lastNameController =
TextEditingController(text: controller.lastname.value);
_emailController = TextEditingController(text: controller.email.value);
controller.firstname.listen((value) {
if (_firstNameController.text != value) {
_firstNameController.value = TextEditingValue(
text: value,
selection: TextSelection.fromPosition(TextPosition(offset: value.length)),
selection: TextSelection.fromPosition(
TextPosition(offset: value.length)),
);
}
});
@ -51,7 +56,8 @@ class _MemberDetailPageState extends State<MemberDetailPage> {
if (_lastNameController.text != value) {
_lastNameController.value = TextEditingValue(
text: value,
selection: TextSelection.fromPosition(TextPosition(offset: value.length)),
selection: TextSelection.fromPosition(
TextPosition(offset: value.length)),
);
}
});
@ -60,12 +66,71 @@ class _MemberDetailPageState extends State<MemberDetailPage> {
if (_emailController.text != value) {
_emailController.value = TextEditingValue(
text: value,
selection: TextSelection.fromPosition(TextPosition(offset: value.length)),
selection: TextSelection.fromPosition(
TextPosition(offset: value.length)),
);
}
});
}
Future<void> _handleSaveAndNavigateBack() async {
bool success = await controller.saveMember();
if (success) {
Get.until((route) => Get.currentRoute == AppPages.TEAM_DETAIL);
// スナックバーが表示されるのを待つ
await Future.delayed(Duration(seconds: 1));
// 現在のスナックバーを安全に閉じる
if (Get.isSnackbarOpen) {
await Get.closeCurrentSnackbar();
}
// リストページに戻る
//Get.until((route) => Get.currentRoute == '/team');
// または、リストページの具体的なルート名がある場合は以下を使用
// Get.offNamed('/team');
}
}
Future<void> _handleDeleteAndNavigateBack() async {
final confirmed = await Get.dialog<bool>(
AlertDialog(
title: Text('確認'),
content: Text('このメンバーを削除してもよろしいですか?'),
actions: [
TextButton(
child: Text('キャンセル'),
onPressed: () => Get.back(result: false),
),
TextButton(
child: Text('削除'),
onPressed: () => Get.back(result: true),
),
],
),
);
if (confirmed == true) {
bool success = await controller.deleteMember();
if (success) {
// リストページに戻る
//Get.offNamed(result: true);
Get.until((route) => Get.currentRoute == AppPages.TEAM_DETAIL);
// スナックバーが表示されるのを待つ
await Future.delayed(Duration(seconds: 1));
// 現在のスナックバーを安全に閉じる
if (Get.isSnackbarOpen) {
await Get.closeCurrentSnackbar();
}
}
}
}
@override
Widget build(BuildContext context) {
final mode = Get.arguments['mode'] as String;
@ -109,17 +174,9 @@ class _MemberDetailPageState extends State<MemberDetailPage> {
children: [
if (mode == 'new')
TextFormField(
controller: _emailController,
onChanged: (value) => controller.updateEmail(value),
decoration: InputDecoration(labelText: 'メールアドレス'),
//onChanged: (value) => controller.email.value = value,
onChanged: (value) {
controller.email.value = value;
// カーソル位置を更新
emailController.selection = TextSelection.fromPosition(
TextPosition(offset: value.length),
);
},
controller: emailController,
//controller: TextEditingController(text: controller.email.value),
keyboardType: TextInputType.emailAddress, // メールアドレス用のキーボードを表示
autocorrect: false, // 自動修正を無効化
enableSuggestions: false,
@ -129,16 +186,20 @@ class _MemberDetailPageState extends State<MemberDetailPage> {
else
Text('メールアドレス: ${controller.email.value}'),
if (controller.email.value.isEmpty || mode == 'edit') ...[
if (controller.email.value.isEmpty || controller.isDummyEmail || mode == 'edit') ...[
TextFormField(
decoration: InputDecoration(labelText: ''),
onChanged: (value) => controller.lastname.value = value,
controller: TextEditingController(text: controller.lastname.value),
controller: _lastNameController,
onChanged: (value) => controller.updateLastName(value),
//controller: TextEditingController(text: controller.lastname.value),
),
TextFormField(
decoration: InputDecoration(labelText: ''),
onChanged: (value) => controller.firstname.value = value,
controller: TextEditingController(text: controller.firstname.value),
controller: _firstNameController,
//onChanged: (value) => controller.firstname.value = value,
onChanged: (value) => controller.updateFirstName(value),
//controller: TextEditingController(text: controller.firstname.value),
),
// 生年月日
if (controller.isDummyEmail || !controller.isOver18())
@ -178,28 +239,7 @@ class _MemberDetailPageState extends State<MemberDetailPage> {
children: [
ElevatedButton(
child: Text('削除'),
onPressed: () async {
final confirmed = await Get.dialog<bool>(
AlertDialog(
title: Text('確認'),
content: Text('このメンバーを削除してもよろしいですか?'),
actions: [
TextButton(
child: Text('キャンセル'),
onPressed: () => Get.back(result: false),
),
TextButton(
child: Text('削除'),
onPressed: () => Get.back(result: true),
),
],
),
);
if (confirmed == true) {
await controller.deleteMember();
Get.back(result: true);
}
},
onPressed: _handleDeleteAndNavigateBack,
style: ElevatedButton.styleFrom(
backgroundColor: Colors.red,
foregroundColor: Colors.white,
@ -216,10 +256,7 @@ class _MemberDetailPageState extends State<MemberDetailPage> {
),
ElevatedButton(
child: Text('保存・招待'),
onPressed: () async {
await controller.saveMember();
Get.back(result: true);
},
onPressed: _handleSaveAndNavigateBack,
style: ElevatedButton.styleFrom(
backgroundColor: Colors.green,
foregroundColor: Colors.white,

View File

@ -175,9 +175,9 @@ class _TeamDetailPageState extends State<TeamDetailPage> {
AppPages.MEMBER_DETAIL,
arguments: {'mode': 'edit', 'member': member, 'teamId': controller.selectedTeam.value?.id},
);
if (result == true) {
await controller.fetchTeamMembers(controller.selectedTeam.value!.id);
}
await controller.fetchTeamMembers(controller.selectedTeam.value!.id);
},
);
},