import 'package:diameter/components/detail.dart'; import 'package:diameter/components/dialogs.dart'; import 'package:diameter/components/dropdown.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 int logEntryId; final int endLogEntryId; final int id; const LogEventDetailScreen( {Key? key, this.logEntryId = 0, this.endLogEntryId = 0, this.id = 0}) : super(key: key); @override _LogEventDetailScreenState createState() => _LogEventDetailScreenState(); } class _LogEventDetailScreenState extends State { LogEvent? _logEvent; bool _isNew = true; bool _isSaving = false; final GlobalKey _logEventForm = GlobalKey(); LogEventType? _eventType; bool _hasEndTime = false; final _notesController = TextEditingController(text: ''); List _logEventTypes = []; @override void initState() { super.initState(); reload(); if (_logEvent != null) { _notesController.text = _logEvent!.notes ?? ''; _eventType = _logEvent!.eventType.target; _hasEndTime = _logEvent!.hasEndTime; } _logEventTypes = LogEventType.getAll(); } void reload() { if (widget.id != 0) { setState(() { _logEvent = LogEvent.get(widget.id); }); } _isNew = _logEvent == null; } void handleSaveAction() async { setState(() { _isSaving = true; }); if (_logEventForm.currentState!.validate()) { LogEvent event = LogEvent( id: widget.id, time: LogEntry.get(widget.logEntryId)!.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() { if (showConfirmationDialogOnCancel && ((_isNew && (_notesController.text != '' || _eventType != null || _hasEndTime)) || (!_isNew && (_notesController.text != (_logEvent!.notes ?? '') || _eventType != _logEvent!.eventType.target || _hasEndTime != _logEvent!.hasEndTime)))) { Dialogs.showCancelConfirmationDialog( context: context, isNew: _isNew, onSave: handleSaveAction, ); } else { Navigator.pop(context); } } @override Widget build(BuildContext context) { 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: [ AutoCompleteDropdownButton( selectedItem: _eventType, label: 'Event Type', items: _logEventTypes, renderItem: (item) => 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, ), ], ), ], ), ), bottomNavigationBar: DetailBottomRow( onCancel: handleCancelAction, onSave: _isSaving ? null : handleSaveAction, ), ); } }