Semi Final 7th Aug 2024
This commit is contained in:
@ -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,
|
||||
|
||||
Reference in New Issue
Block a user