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/basal_profile.dart'; import 'package:diameter/models/bolus_profile.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; List _bolusProfiles = []; List _basalProfiles = []; final GlobalKey _logEventForm = GlobalKey(); final _reminderDurationController = TextEditingController(text: ''); final _notesController = TextEditingController(text: ''); LogEventType? _eventType; bool _hasEndTime = false; BolusProfile? _bolusProfile; BasalProfile? _basalProfile; List _logEventTypes = []; @override void initState() { super.initState(); reload(); _bolusProfiles = BolusProfile.getAll(); _basalProfiles = BasalProfile.getAll(); if (_logEvent != null) { _reminderDurationController.text = (_logEvent!.reminderDuration ?? '').toString(); _hasEndTime = _logEvent!.hasEndTime; _notesController.text = _logEvent!.notes ?? ''; _eventType = _logEvent!.eventType.target; _basalProfile = _logEvent!.basalProfile.target; _bolusProfile = _logEvent!.bolusProfile.target; } _logEventTypes = LogEventType.getAll(); } void reload() { if (widget.id != 0) { setState(() { _logEvent = LogEvent.get(widget.id); }); } _isNew = _logEvent == null; } void onSelectEventType(LogEventType eventType) { setState(() { _eventType = eventType; _hasEndTime = eventType.hasEndTime; if (eventType.basalProfile.target != null) { _basalProfile = eventType.basalProfile.target; } if (eventType.bolusProfile.target != null) { _bolusProfile = eventType.bolusProfile.target; } if (eventType.defaultReminderDuration != null) { _reminderDurationController.text = eventType.defaultReminderDuration.toString(); } }); } void handleSaveAction() async { setState(() { _isSaving = true; }); if (_logEventForm.currentState!.validate()) { LogEvent event = LogEvent( id: widget.id, time: LogEntry.get(widget.logEntryId)?.time ?? DateTime.now(), hasEndTime: _hasEndTime, reminderDuration: int.tryParse(_reminderDurationController.text), notes: _notesController.text, ); if (widget.logEntryId != 0) { event.logEntry.targetId = widget.logEntryId; } else { event.logEntry.target = LogEntry(time: DateTime.now()); } event.eventType.target = _eventType; event.basalProfile.target = _basalProfile; event.bolusProfile.target = _bolusProfile; 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, onChanged: (value) { if (value != null) { onSelectEventType(value); } }, ), BooleanFormField( value: _hasEndTime, onChanged: (value) { setState(() { _hasEndTime = value; }); }, label: 'has end time', ), Column( children: _hasEndTime ? [ TextFormField( controller: _reminderDurationController, keyboardType: const TextInputType.numberWithOptions(), decoration: InputDecoration( labelText: 'Default Reminder Duration', suffixText: ' min', enabled: _hasEndTime, ), ), AutoCompleteDropdownButton( selectedItem: _bolusProfile, label: 'Bolus Profile', items: _bolusProfiles, onChanged: (value) { setState(() { _bolusProfile = value; }); }, ), AutoCompleteDropdownButton( selectedItem: _basalProfile, label: 'Basal Profile', items: _basalProfiles, onChanged: (value) { setState(() { _basalProfile = value; }); }, ) ] : []), TextFormField( controller: _notesController, decoration: const InputDecoration( labelText: 'Notes', alignLabelWithHint: true, ), keyboardType: TextInputType.multiline, ), ], ), ], ), ), bottomNavigationBar: DetailBottomRow( onCancel: handleCancelAction, onSave: _isSaving ? null : handleSaveAction, ), ); } }