Team,Member, Entryの登録まで完了

This commit is contained in:
2024-07-29 08:41:28 +09:00
parent 7f8adeea01
commit 9c98d3ed53
10 changed files with 803 additions and 260 deletions

View File

@ -3,92 +3,210 @@
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:rogapp/pages/team/member_controller.dart';
import 'package:intl/intl.dart'; // この行を追加
import 'package:flutter_localizations/flutter_localizations.dart'; // 追加
import 'package:flutter/cupertino.dart';
class MemberDetailPage extends StatefulWidget {
@override
_MemberDetailPageState createState() => _MemberDetailPageState();
}
class _MemberDetailPageState extends State<MemberDetailPage> {
final MemberController controller = Get.find<MemberController>();
late TextEditingController _firstNameController;
late TextEditingController _lastNameController;
late TextEditingController _emailController;
class MemberDetailPage extends GetView<MemberController> {
final TextEditingController _firstNameController = TextEditingController();
final TextEditingController _lastNameController = TextEditingController();
@override
Widget build(BuildContext context) {
final mode = Get.arguments['mode'];
final member = Get.arguments['member'];
void initState() {
super.initState();
_initializeControllers();
WidgetsBinding.instance.addPostFrameCallback((_) {
final mode = Get.arguments['mode'];
final member = Get.arguments['member'];
if (mode == 'edit' && member != null) {
controller.setSelectedMember(member);
}
});
}
return Scaffold(
appBar: AppBar(
title: Text(mode == 'new' ? 'メンバー追加' : 'メンバー詳細'),
actions: [
IconButton(
icon: Icon(Icons.save),
onPressed: () async {
await controller.saveMember();
Get.back();
},
),
],
),
body: Obx(()
{
if (controller.isLoading.value) {
return Center(child: CircularProgressIndicator());
void _initializeControllers() {
_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)),
);
}
});
_firstNameController.value = _firstNameController.value.copyWith(
text: controller.firstname.value,
selection: TextSelection.collapsed(
offset: controller.firstname.value.length),
);
_lastNameController.value = _lastNameController.value.copyWith(
text: controller.lastname.value,
selection: TextSelection.collapsed(
offset: controller.lastname.value.length),
);
controller.lastname.listen((value) {
if (_lastNameController.text != value) {
_lastNameController.value = TextEditingValue(
text: value,
selection: TextSelection.fromPosition(TextPosition(offset: value.length)),
);
}
});
return Padding(
padding: EdgeInsets.all(16.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
if (mode == 'edit' && member.email != null)
Text('Email: ${member.email}'),
if (mode == 'new' || (mode == 'edit' && member.email == null))
TextField(
decoration: InputDecoration(labelText: 'Email'),
onChanged: (value) => controller.updateEmail(value),
),
TextField(
decoration: InputDecoration(labelText: ''),
controller: _lastNameController,
onChanged: (value) => controller.updateLastName(value),
),
TextField(
decoration: InputDecoration(labelText: ''),
controller: _firstNameController,
onChanged: (value) => controller.updateFirstName(value),
),
controller.email.listen((value) {
if (_emailController.text != value) {
_emailController.value = TextEditingValue(
text: value,
selection: TextSelection.fromPosition(TextPosition(offset: value.length)),
);
}
});
}
// 誕生日選択ウィジェットを追加
if (mode == 'edit')
Text('ステータス: ${controller.getMemberStatus()}'),
if (mode == 'edit' && controller.getMemberStatus() == '招待中')
ElevatedButton(
child: Text('招待メールを再送信'),
onPressed: () => controller.resendInvitation(),
@override
Widget build(BuildContext context) {
final mode = Get.arguments['mode'] as String;
//final member = Get.arguments['member'];
final teamId = Get.arguments['teamId'] as int;
/*
return MaterialApp( // MaterialApp をここに追加
localizationsDelegates: [
GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
GlobalCupertinoLocalizations.delegate,
],
supportedLocales: [
const Locale('ja', 'JP'),
],
home:Scaffold(
*/
return Scaffold(
appBar: AppBar(
title: Text(mode == 'new' ? 'メンバー追加' : 'メンバー詳細'),
actions: [
IconButton(
icon: Icon(Icons.save),
onPressed: () async {
await controller.saveMember();
Get.back(result: true);
},
),
if (mode == 'edit')
ElevatedButton(
child: Text('メンバーから除外'),
onPressed: () => controller.deleteMember(),
],
),
body: Obx(() {
if (controller.isLoading.value) {
return Center(child: CircularProgressIndicator());
}
return SingleChildScrollView(
padding: EdgeInsets.all(16.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
if (mode == 'new')
TextField(
decoration: InputDecoration(labelText: 'メールアドレス'),
onChanged: (value) => controller.email.value = value,
controller: TextEditingController(text: controller.email.value),
)
else if (controller.isDummyEmail)
Text('メールアドレス: (メアド無し)')
else
Text('メールアドレス: ${controller.email.value}'),
if (controller.email.value.isEmpty || mode == 'edit') ...[
TextField(
decoration: InputDecoration(labelText: ''),
onChanged: (value) => controller.lastname.value = value,
controller: TextEditingController(text: controller.lastname.value),
),
TextField(
decoration: InputDecoration(labelText: ''),
onChanged: (value) => controller.firstname.value = value,
controller: TextEditingController(text: controller.firstname.value),
),
// 生年月日
if (controller.isDummyEmail || !controller.isOver18())
ListTile(
title: Text('生年月日'),
subtitle: Text(controller.dateOfBirth.value != null
? '${DateFormat('yyyy年MM月dd日').format(controller.dateOfBirth.value!)} (${controller.getAgeAndGrade()})'
: '未設定'),
onTap: () async {
final date = await showDatePicker(
context: context,
initialDate: controller.dateOfBirth.value ?? DateTime.now(),
firstDate: DateTime(1900),
lastDate: DateTime.now(),
//locale: const Locale('ja', 'JP'),
);
if (date != null) controller.dateOfBirth.value = date;
},
)
else
Text('18歳以上'),
SwitchListTile(
title: Text('性別'),
subtitle: Text(controller.female.value ? '女性' : '男性'),
value: controller.female.value,
onChanged: (value) => controller.female.value = value,
),
],
// 招待メール再送信ボタン通常のEmailで未承認の場合のみ
if (!controller.isDummyEmail && !controller.isApproved)
ElevatedButton(
child: Text('招待メールを再送信'),
onPressed: () => controller.resendInvitation(),
),
// メンバー削除ボタン
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);
}
},
style: ElevatedButton.styleFrom(backgroundColor: Colors.red),
),
],
),
],
),
);
})
);
);
}),
);
}
@override
void dispose() {
_firstNameController.dispose();
_lastNameController.dispose();
_emailController.dispose();
super.dispose();
}
}