Files
rog_app/lib/pages/team/member_detail_page.dart

212 lines
7.9 KiB
Dart
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// lib/pages/team/member_detail_page.dart
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;
@override
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);
}
});
}
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)),
);
}
});
controller.lastname.listen((value) {
if (_lastNameController.text != value) {
_lastNameController.value = TextEditingValue(
text: value,
selection: TextSelection.fromPosition(TextPosition(offset: value.length)),
);
}
});
controller.email.listen((value) {
if (_emailController.text != value) {
_emailController.value = TextEditingValue(
text: value,
selection: TextSelection.fromPosition(TextPosition(offset: value.length)),
);
}
});
}
@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);
},
),
],
),
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();
}
}