import 'package:diameter/components/detail.dart'; import 'package:diameter/components/dialogs.dart'; import 'package:diameter/components/forms.dart'; import 'package:diameter/config.dart'; import 'package:diameter/models/log_entry.dart'; import 'package:diameter/models/log_event.dart'; import 'package:diameter/models/log_event_type.dart'; import 'package:diameter/navigation.dart'; import 'package:flutter/material.dart'; class LogEventDetailScreen extends StatefulWidget { static const String routeName = '/log-event'; final LogEntry? logEntry; final LogEntry? endLogEntry; final LogEvent? logEvent; const LogEventDetailScreen( {Key? key, this.logEntry, this.endLogEntry, this.logEvent}) : super(key: key); @override _LogEventDetailScreenState createState() => _LogEventDetailScreenState(); } class _LogEventDetailScreenState extends State { final GlobalKey _logEventForm = GlobalKey(); final _notesController = TextEditingController(text: ''); LogEventType? _eventType; bool _hasEndTime = false; List _logEventTypes = []; bool _isSaving = false; @override void initState() { super.initState(); if (widget.logEvent != null) { _notesController.text = widget.logEvent!.notes ?? ''; _eventType = widget.logEvent!.eventType.target; _hasEndTime = widget.logEvent!.hasEndTime; } _logEventTypes = LogEventType.getAll(); } void handleSaveAction() async { setState(() { _isSaving = true; }); if (_logEventForm.currentState!.validate()) { bool isNew = widget.logEvent == null; // isNew // ? await LogEvent.save( // logEntry: widget.logEntry!.objectId!, // eventType: _eventType!, // time: widget.logEntry!.time, // hasEndTime: _hasEndTime, // notes: _notesController.text, // ) // : await LogEvent.update( // widget.logEvent!.objectId!, // eventType: _eventType!, // time: widget.logEntry!.time, // hasEndTime: _hasEndTime, // notes: _notesController.text, // ); LogEvent event = LogEvent( id: widget.logEvent?.id ?? 0, time: widget.logEntry!.time, hasEndTime: _hasEndTime, notes: _notesController.text, ); event.eventType.target = _eventType; LogEvent.put(event); Navigator.pop(context, '${isNew ? 'New' : ''} Event Saved'); } setState(() { _isSaving = false; }); } void handleCancelAction() { bool isNew = widget.logEvent == null; if (showConfirmationDialogOnCancel && ((isNew && (_notesController.text != '' || _eventType != null || _hasEndTime)) || (!isNew && (_notesController.text != (widget.logEvent!.notes ?? '') || _eventType != widget.logEvent!.eventType.target || _hasEndTime != widget.logEvent!.hasEndTime)))) { Dialogs.showCancelConfirmationDialog( context: context, isNew: isNew, onSave: handleSaveAction, ); } else { Navigator.pop(context); } } @override Widget build(BuildContext context) { bool isNew = widget.logEvent == null; return Scaffold( appBar: AppBar( title: Text(isNew ? 'New Event' : 'Edit Event'), ), drawer: const Navigation(currentLocation: LogEventDetailScreen.routeName), body: SingleChildScrollView( child: Column( crossAxisAlignment: CrossAxisAlignment.stretch, children: [ FormWrapper( formState: _logEventForm, fields: [ LabeledDropdownButton( selectedItem: _eventType, label: 'Event Type', items: _logEventTypes, renderItem: (item) => Text(item.value), onChanged: (value) { setState(() { _eventType = value; }); }, ), BooleanFormField( value: _hasEndTime, onChanged: (value) { setState(() { _hasEndTime = value; }); }, label: 'has end time', ), TextFormField( controller: _notesController, decoration: const InputDecoration( labelText: 'Notes', alignLabelWithHint: true, ), keyboardType: TextInputType.multiline, ), ], ), // ActiveLogEventListScreen(onSetEndTime: onSetEndTime) ], ), ), bottomNavigationBar: DetailBottomRow( onCancel: handleCancelAction, onSave: _isSaving ? null : handleSaveAction, ), ); } }