diff --git a/lib/pages/task_edit_page.dart b/lib/pages/task_edit_page.dart index 0f741b2..feacf3e 100644 --- a/lib/pages/task_edit_page.dart +++ b/lib/pages/task_edit_page.dart @@ -1,18 +1,170 @@ import 'package:flutter/material.dart'; +import '../model/callback_models/create_task_request.dart'; import '../model/task.dart'; +import '../service/tools.dart'; +import '../service/validators.dart'; -class TaskEditPage extends StatelessWidget { +class TaskEditPage extends StatefulWidget { static const routeName = '/edit'; const TaskEditPage({super.key}); @override - Widget build(BuildContext context) { - final task = ModalRoute.of(context)!.settings.arguments as Task?; + State createState() => _TaskEditPageState(); +} +class _TaskEditPageState extends State { + final titleController = TextEditingController(); + final descriptionController = TextEditingController(); + final categoryController = TextEditingController(); + final urlController = TextEditingController(); + final dueDateController = TextEditingController(); + final dueTimeController = TextEditingController(); + late String pageTitle; + + @override + void didChangeDependencies() { + super.didChangeDependencies(); + final task = ModalRoute.of(context)!.settings.arguments as Task?; + if (task != null) { + titleController.text = task.title; + descriptionController.text = task.description; + categoryController.text = task.category; + urlController.text = task.url; + dueDateController.text = task.due != null + ? getIsoDateString(task.due!) + : ''; + dueTimeController.text = task.due != null + ? TimeOfDay.fromDateTime(task.due!).format(context) + : ''; + } + pageTitle = task?.title ?? 'CreateTask'; + } + + @override + Widget build(BuildContext context) { return Scaffold( - appBar: AppBar(title: Text(task?.title ?? 'Create Task')), - body: Form(child: Column()), + appBar: AppBar(title: Text(pageTitle)), + body: Form( + autovalidateMode: AutovalidateMode.onUnfocus, + child: Column( + children: [ + TextFormField( + autofocus: true, + controller: titleController, + decoration: InputDecoration(label: Text('Title')), + keyboardType: TextInputType.text, + textInputAction: TextInputAction.next, + ), + TextFormField( + controller: descriptionController, + decoration: InputDecoration(label: Text('Description')), + keyboardType: TextInputType.text, + textInputAction: TextInputAction.next, + ), + TextFormField( + controller: dueDateController, + onChanged: (value) { + if (dateTimeValidator(value) == null) {} + + setState(() {}); + }, + decoration: InputDecoration( + label: Text('Due Date'), + suffix: IconButton( + onPressed: () async { + final result = await onOpenCalendarPickerPressed(); + if (result != null) { + dueDateController.text = getIsoDateString(result); + } + setState(() {}); + }, + icon: Icon(Icons.calendar_month), + ), + ), + validator: dateTimeValidator, + keyboardType: TextInputType.text, + textInputAction: TextInputAction.next, + ), + TextFormField( + controller: dueTimeController, + enabled: DateTime.tryParse(dueDateController.text) != null + ? true + : false, + decoration: InputDecoration( + label: Text('Due Time'), + suffix: IconButton( + onPressed: () async { + final result = await onOpenTimePickerPressed(); + if (result != null) { + setState(() { + dueTimeController.text = result.format(context); + }); + } + }, + icon: Icon(Icons.schedule), + ), + ), + validator: timeValidator, + keyboardType: TextInputType.text, + textInputAction: TextInputAction.next, + ), + TextFormField( + controller: categoryController, + decoration: InputDecoration(label: Text('Category')), + keyboardType: TextInputType.text, + textInputAction: TextInputAction.next, + ), + TextFormField( + controller: urlController, + decoration: InputDecoration(label: Text('Url')), + keyboardType: TextInputType.text, + textInputAction: TextInputAction.next, + ), + ], + ), + ), + floatingActionButton: FloatingActionButton( + onPressed: onSavePressed, + child: Icon(Icons.save), + ), + ); + } + + Future onOpenCalendarPickerPressed() { + return showDialog( + context: context, + builder: (context) => DatePickerDialog( + firstDate: DateTime(DateTime.now().year - 100), + lastDate: DateTime(DateTime.now().year + 100), + initialDate: + DateTime.tryParse(dueDateController.text) ?? DateTime.now(), + ), + ); + } + + Future onOpenTimePickerPressed() { + return showDialog( + context: context, + builder: (context) => + TimePickerDialog(initialTime: TimeOfDay(hour: 0, minute: 0)), + ); + } + + void onSavePressed() { + Navigator.of(context).pop( + CreateTaskRequest( + title: titleController.text, + description: descriptionController.text, + start: null, + due: DateTime.tryParse(dueDateController.text), + isCompleted: false, + category: categoryController.text, + subtasks: [], + alarms: [], + location: null, + url: urlController.text, + ), ); } }