229 lines
7.3 KiB
Dart
229 lines
7.3 KiB
Dart
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<LogEventDetailScreen> {
|
|
LogEvent? _logEvent;
|
|
bool _isNew = true;
|
|
bool _isSaving = false;
|
|
|
|
List<BolusProfile> _bolusProfiles = [];
|
|
List<BasalProfile> _basalProfiles = [];
|
|
|
|
final GlobalKey<FormState> _logEventForm = GlobalKey<FormState>();
|
|
|
|
final _reminderDurationController = TextEditingController(text: '');
|
|
final _notesController = TextEditingController(text: '');
|
|
LogEventType? _eventType;
|
|
bool _hasEndTime = false;
|
|
BolusProfile? _bolusProfile;
|
|
BasalProfile? _basalProfile;
|
|
|
|
List<LogEventType> _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: <Widget>[
|
|
FormWrapper(
|
|
formState: _logEventForm,
|
|
fields: [
|
|
AutoCompleteDropdownButton<LogEventType>(
|
|
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<BolusProfile>(
|
|
selectedItem: _bolusProfile,
|
|
label: 'Bolus Profile',
|
|
items: _bolusProfiles,
|
|
onChanged: (value) {
|
|
setState(() {
|
|
_bolusProfile = value;
|
|
});
|
|
},
|
|
),
|
|
AutoCompleteDropdownButton<BasalProfile>(
|
|
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,
|
|
),
|
|
);
|
|
}
|
|
}
|