212 lines
7.9 KiB
Dart
212 lines
7.9 KiB
Dart
// 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();
|
||
}
|
||
} |