diff --git a/lib/ui/app/entity_dropdown.dart b/lib/ui/app/entity_dropdown.dart index 24a8a1b29..957e59167 100644 --- a/lib/ui/app/entity_dropdown.dart +++ b/lib/ui/app/entity_dropdown.dart @@ -15,6 +15,7 @@ class EntityDropdown extends StatefulWidget { @required this.entityMap, @required this.onFilterChanged, @required this.onSelected, + this.validator, this.initialValue, }); @@ -25,6 +26,7 @@ class EntityDropdown extends StatefulWidget { final String initialValue; final Function(String) onFilterChanged; final Function(int) onSelected; + final Function validator; @override _EntityDropdownState createState() => _EntityDropdownState(); @@ -138,6 +140,7 @@ class _EntityDropdownState extends State { onTap: () => _showOptions(), child: IgnorePointer( child: TextFormField( + validator: widget.validator, controller: _textController, decoration: InputDecoration( labelText: widget.labelText, diff --git a/lib/ui/invoice/edit/invoice_edit_details.dart b/lib/ui/invoice/edit/invoice_edit_details.dart index 0f027b395..61503fbed 100644 --- a/lib/ui/invoice/edit/invoice_edit_details.dart +++ b/lib/ui/invoice/edit/invoice_edit_details.dart @@ -20,7 +20,7 @@ class InvoiceEditDetails extends StatefulWidget { InvoiceEditDetailsState createState() => new InvoiceEditDetailsState(); } -class InvoiceEditDetailsState extends State { +class InvoiceEditDetailsState extends State with AutomaticKeepAliveClientMixin { final _invoiceNumberController = TextEditingController(); final _invoiceDateController = TextEditingController(); final _poNumberController = TextEditingController(); @@ -29,6 +29,9 @@ class InvoiceEditDetailsState extends State { List _controllers = []; + @override + bool get wantKeepAlive => true; + @override void didChangeDependencies() { _controllers = [ @@ -98,6 +101,9 @@ class InvoiceEditDetailsState extends State { viewModel.clientMap[invoice.clientId]?.displayName, entityList: viewModel.clientList, entityMap: viewModel.clientMap, + validator: (String val) => val.trim().isEmpty + ? AppLocalization.of(context).pleaseSelectAClient + : null, onFilterChanged: viewModel.onEntityFilterChanged, onSelected: (clientId) { viewModel.onChanged( diff --git a/lib/ui/invoice/edit/invoice_edit_items.dart b/lib/ui/invoice/edit/invoice_edit_items.dart index 5560e8e42..691777729 100644 --- a/lib/ui/invoice/edit/invoice_edit_items.dart +++ b/lib/ui/invoice/edit/invoice_edit_items.dart @@ -58,7 +58,7 @@ class ItemEditDetails extends StatefulWidget { ItemEditDetailsState createState() => ItemEditDetailsState(); } -class ItemEditDetailsState extends State { +class ItemEditDetailsState extends State with AutomaticKeepAliveClientMixin { final _productKeyController = TextEditingController(); final _notesController = TextEditingController(); final _costController = TextEditingController(); @@ -66,6 +66,9 @@ class ItemEditDetailsState extends State { var _controllers = []; + @override + bool get wantKeepAlive => true; + @override void didChangeDependencies() { _controllers = [ diff --git a/lib/utils/localization.dart b/lib/utils/localization.dart index 92ad0eaf2..525823431 100644 --- a/lib/utils/localization.dart +++ b/lib/utils/localization.dart @@ -143,6 +143,7 @@ class AppLocalization { 'edit': 'Edit', 'dismiss': 'Dismiss', 'please_select_a_date': 'Please select a date', + 'please_select_a_client': 'Please select a client', 'payment': 'Payment', 'payments': 'Payments', @@ -296,6 +297,7 @@ class AppLocalization { String get edit => _localizedValues[locale.languageCode]['edit']; String get dismiss => _localizedValues[locale.languageCode]['dismiss']; String get pleaseSelectADate => _localizedValues[locale.languageCode]['please_select_a_date']; + String get pleaseSelectAClient => _localizedValues[locale.languageCode]['please_select_a_client']; String get payment => _localizedValues[locale.languageCode]['payment']; String get payments => _localizedValues[locale.languageCode]['payments'];