From 9bd7476a6bc70902dd511feaf971c63db399776c Mon Sep 17 00:00:00 2001 From: Hillel Coren Date: Sun, 19 Jan 2020 21:55:49 +0200 Subject: [PATCH] Flutter web --- lib/redux/app/app_actions.dart | 23 +++++++++++------------ lib/redux/app/app_state.dart | 2 +- lib/redux/ui/pref_reducer.dart | 2 +- lib/redux/ui/pref_state.dart | 1 + lib/redux/ui/pref_state.g.dart | 12 ++++++------ lib/ui/app/main_screen.dart | 9 ++++----- lib/ui/client/client_list.dart | 9 +++++---- lib/ui/document/document_list.dart | 4 ++-- lib/ui/expense/expense_list.dart | 13 ++++++++++--- lib/ui/invoice/invoice_list.dart | 9 +++++---- lib/ui/payment/payment_list.dart | 4 ++-- lib/ui/product/product_list.dart | 5 ++--- lib/ui/project/project_list.dart | 11 +++++++++-- lib/ui/task/task_list.dart | 4 ++-- lib/ui/vendor/vendor_list.dart | 15 +++++++++++---- 15 files changed, 72 insertions(+), 51 deletions(-) diff --git a/lib/redux/app/app_actions.dart b/lib/redux/app/app_actions.dart index d06b9153c..b45ffcc21 100644 --- a/lib/redux/app/app_actions.dart +++ b/lib/redux/app/app_actions.dart @@ -301,21 +301,20 @@ void viewEntitiesByType({ } } -void viewEntityById( - {BuildContext context, - String entityId, - EntityType entityType, - bool force = false, - bool showError = true}) { +void viewEntityById({ + BuildContext context, + String entityId, + EntityType entityType, + bool force = false, +}) { final store = StoreProvider.of(context); final navigator = Navigator.of(context); - if (!store.state.getEntityMap(entityType).containsKey(entityId)) { - if (showError) { - showErrorDialog( - context: context, - message: AppLocalization.of(context).failedToFindRecord); - } + if (entityId != null && + !store.state.getEntityMap(entityType).containsKey(entityId)) { + showErrorDialog( + context: context, + message: AppLocalization.of(context).failedToFindRecord); return; } diff --git a/lib/redux/app/app_state.dart b/lib/redux/app/app_state.dart index 60666c982..d49431ce8 100644 --- a/lib/redux/app/app_state.dart +++ b/lib/redux/app/app_state.dart @@ -444,7 +444,7 @@ abstract class AppState implements Built { //return 'Payment: ${uiState.paymentUIState.editing.paymentables}'; //return 'isAuthenticated: ${authState.isAuthenticated}'; //return 'MultiSelect: ${productListState.isInMultiselect()} SelectedIds: ${productListState.selectedIds}'; - return 'History: $historyList'; + //return 'History: $historyList'; return 'Route: ${uiState.currentRoute} Prev: ${uiState.previousRoute}'; } } diff --git a/lib/redux/ui/pref_reducer.dart b/lib/redux/ui/pref_reducer.dart index 17cda377a..4ce04cb5c 100644 --- a/lib/redux/ui/pref_reducer.dart +++ b/lib/redux/ui/pref_reducer.dart @@ -391,7 +391,7 @@ Reducer> historyReducer = combineReducers([ BuiltList _addToHistory( BuiltList list, HistoryRecord record) { // don't track new records - if (record.id.startsWith('-')) { + if (record.id == null || record.id.startsWith('-')) { return list; } diff --git a/lib/redux/ui/pref_state.dart b/lib/redux/ui/pref_state.dart index be7cf749f..bfd6e575a 100644 --- a/lib/redux/ui/pref_state.dart +++ b/lib/redux/ui/pref_state.dart @@ -183,6 +183,7 @@ abstract class HistoryRecord HistoryRecord._(); + @nullable String get id; EntityType get entityType; diff --git a/lib/redux/ui/pref_state.g.dart b/lib/redux/ui/pref_state.g.dart index 33cba4a12..7818e97c5 100644 --- a/lib/redux/ui/pref_state.g.dart +++ b/lib/redux/ui/pref_state.g.dart @@ -363,8 +363,6 @@ class _$HistoryRecordSerializer implements StructuredSerializer { Iterable serialize(Serializers serializers, HistoryRecord object, {FullType specifiedType = FullType.unspecified}) { final result = [ - 'id', - serializers.serialize(object.id, specifiedType: const FullType(String)), 'entityType', serializers.serialize(object.entityType, specifiedType: const FullType(EntityType)), @@ -372,7 +370,12 @@ class _$HistoryRecordSerializer implements StructuredSerializer { serializers.serialize(object.timestamp, specifiedType: const FullType(int)), ]; - + if (object.id != null) { + result + ..add('id') + ..add(serializers.serialize(object.id, + specifiedType: const FullType(String))); + } return result; } @@ -833,9 +836,6 @@ class _$HistoryRecord extends HistoryRecord { (new HistoryRecordBuilder()..update(updates)).build(); _$HistoryRecord._({this.id, this.entityType, this.timestamp}) : super._() { - if (id == null) { - throw new BuiltValueNullFieldError('HistoryRecord', 'id'); - } if (entityType == null) { throw new BuiltValueNullFieldError('HistoryRecord', 'entityType'); } diff --git a/lib/ui/app/main_screen.dart b/lib/ui/app/main_screen.dart index 64e3548a0..5fb87984e 100644 --- a/lib/ui/app/main_screen.dart +++ b/lib/ui/app/main_screen.dart @@ -156,11 +156,10 @@ class MainScreen extends StatelessWidget { } viewEntityById( - entityType: history.entityType, - entityId: history.id, - context: context, - showError: - false); // in case the history record has since been deleted + entityType: history.entityType, + entityId: history.id, + context: context, + ); return false; }, diff --git a/lib/ui/client/client_list.dart b/lib/ui/client/client_list.dart index 987cd971e..faed7e005 100644 --- a/lib/ui/client/client_list.dart +++ b/lib/ui/client/client_list.dart @@ -74,15 +74,16 @@ class _ClientListState extends State { if (!viewModel.isLoaded) { return viewModel.isLoading ? LoadingIndicator() : SizedBox(); - } else if (clientList.isEmpty) { + } else if (viewModel.clientMap.isEmpty) { return HelpText(AppLocalization.of(context).noRecordsFound); } if (state.shouldSelectEntity(EntityType.client)) { viewEntityById( - context: context, - entityType: EntityType.client, - entityId: clientList.first); + context: context, + entityType: EntityType.client, + entityId: clientList.isEmpty ? null : clientList.first, + ); } final listOrTable = () { diff --git a/lib/ui/document/document_list.dart b/lib/ui/document/document_list.dart index 22fe52179..161cce776 100644 --- a/lib/ui/document/document_list.dart +++ b/lib/ui/document/document_list.dart @@ -33,7 +33,7 @@ class DocumentList extends StatelessWidget { viewEntityById( context: context, entityType: EntityType.document, - entityId: documentList.first); + entityId: documentList.isEmpty ? null : documentList.first); } /* @@ -51,7 +51,7 @@ class DocumentList extends StatelessWidget { ? LoadingIndicator() : RefreshIndicator( onRefresh: () => viewModel.onRefreshed(context), - child: viewModel.documentList.isEmpty + child: viewModel.documentMap.isEmpty ? HelpText(AppLocalization.of(context).noRecordsFound) : ListView.separated( shrinkWrap: true, diff --git a/lib/ui/expense/expense_list.dart b/lib/ui/expense/expense_list.dart index 638f72fec..0d24944e6 100644 --- a/lib/ui/expense/expense_list.dart +++ b/lib/ui/expense/expense_list.dart @@ -85,13 +85,20 @@ class _ExpenseListState extends State { final store = StoreProvider.of(context); final listUIState = store.state.uiState.expenseUIState.listUIState; final isInMultiselect = listUIState.isInMultiselect(); - final expenseList = widget.viewModel.expenseList; + final viewModel = widget.viewModel; + final expenseList = viewModel.expenseList; + + if (!viewModel.isLoaded) { + return viewModel.isLoading ? LoadingIndicator() : SizedBox(); + } else if (viewModel.expenseMap.isEmpty) { + return HelpText(AppLocalization.of(context).noRecordsFound); + } if (state.shouldSelectEntity(EntityType.expense)) { viewEntityById( context: context, entityType: EntityType.expense, - entityId: expenseList.first); + entityId: expenseList.isEmpty ? null : expenseList.first); } widgets.add(Expanded( @@ -99,7 +106,7 @@ class _ExpenseListState extends State { ? LoadingIndicator() : RefreshIndicator( onRefresh: () => widget.viewModel.onRefreshed(context), - child: widget.viewModel.expenseList.isEmpty + child: widget.viewModel.expenseMap.isEmpty ? HelpText(AppLocalization.of(context).noRecordsFound) : state.prefState.moduleLayout == ModuleLayout.list ? ListView.separated( diff --git a/lib/ui/invoice/invoice_list.dart b/lib/ui/invoice/invoice_list.dart index 8ea6c498d..240464d69 100644 --- a/lib/ui/invoice/invoice_list.dart +++ b/lib/ui/invoice/invoice_list.dart @@ -78,15 +78,16 @@ class _EntityListState extends State { if (!viewModel.isLoaded) { return viewModel.isLoading ? LoadingIndicator() : SizedBox(); - } else if (invoiceList.isEmpty) { + } else if (viewModel.invoiceMap.isEmpty) { return HelpText(AppLocalization.of(context).noRecordsFound); } if (state.shouldSelectEntity(EntityType.invoice)) { viewEntityById( - context: context, - entityType: EntityType.invoice, - entityId: invoiceList.first); + context: context, + entityType: EntityType.invoice, + entityId: invoiceList.isEmpty ? null : invoiceList.first, + ); } final listOrTable = () { diff --git a/lib/ui/payment/payment_list.dart b/lib/ui/payment/payment_list.dart index 58d0851d2..f0907162d 100644 --- a/lib/ui/payment/payment_list.dart +++ b/lib/ui/payment/payment_list.dart @@ -77,7 +77,7 @@ class _PaymentListState extends State { if (!viewModel.isLoaded) { return viewModel.isLoading ? LoadingIndicator() : SizedBox(); - } else if (paymentList.isEmpty) { + } else if (viewModel.paymentMap.isEmpty) { return HelpText(AppLocalization.of(context).noRecordsFound); } @@ -85,7 +85,7 @@ class _PaymentListState extends State { viewEntityById( context: context, entityType: EntityType.payment, - entityId: paymentList.first); + entityId: paymentList.isEmpty ? null : paymentList.first); } final listOrTable = () { diff --git a/lib/ui/product/product_list.dart b/lib/ui/product/product_list.dart index 14b49ba41..abe894d0b 100644 --- a/lib/ui/product/product_list.dart +++ b/lib/ui/product/product_list.dart @@ -74,7 +74,7 @@ class _ProductListState extends State { if (!viewModel.isLoaded) { return viewModel.isLoading ? LoadingIndicator() : SizedBox(); - } else if (productList.isEmpty) { + } else if (viewModel.productMap.isEmpty) { return HelpText(AppLocalization.of(context).noRecordsFound); } @@ -82,7 +82,7 @@ class _ProductListState extends State { viewEntityById( context: context, entityType: EntityType.product, - entityId: productList.first); + entityId: productList.isEmpty ? null : productList.first); } final listOrTable = () { @@ -153,7 +153,6 @@ class _ProductListState extends State { header: DatatableHeader( entityType: EntityType.product, ), - ), )); } diff --git a/lib/ui/project/project_list.dart b/lib/ui/project/project_list.dart index 4a8e02ce3..9b2907536 100644 --- a/lib/ui/project/project_list.dart +++ b/lib/ui/project/project_list.dart @@ -68,15 +68,22 @@ class _ProjectListState extends State { Widget build(BuildContext context) { final store = StoreProvider.of(context); final state = store.state; + final viewModel = widget.viewModel; final listState = widget.viewModel.listState; final isInMultiselect = listState.isInMultiselect(); final projectList = widget.viewModel.projectList; + if (!viewModel.isLoaded) { + return viewModel.isLoading ? LoadingIndicator() : SizedBox(); + } else if (viewModel.projectMap.isEmpty) { + return HelpText(AppLocalization.of(context).noRecordsFound); + } + if (state.shouldSelectEntity(EntityType.project)) { viewEntityById( context: context, entityType: EntityType.project, - entityId: projectList.first); + entityId: projectList.isEmpty ? null : projectList.first); } return Column( @@ -93,7 +100,7 @@ class _ProjectListState extends State { ? LoadingIndicator() : RefreshIndicator( onRefresh: () => widget.viewModel.onRefreshed(context), - child: widget.viewModel.projectList.isEmpty + child: widget.viewModel.projectMap.isEmpty ? HelpText(AppLocalization.of(context).noRecordsFound) : state.prefState.moduleLayout == ModuleLayout.list ? ListView.separated( diff --git a/lib/ui/task/task_list.dart b/lib/ui/task/task_list.dart index ecfcc6c8c..4a1ba5a77 100644 --- a/lib/ui/task/task_list.dart +++ b/lib/ui/task/task_list.dart @@ -76,7 +76,7 @@ class _TaskListState extends State { viewEntityById( context: context, entityType: EntityType.task, - entityId: taskList.first); + entityId: taskList.isEmpty ? null : taskList.first); } return Column( @@ -93,7 +93,7 @@ class _TaskListState extends State { ? LoadingIndicator() : RefreshIndicator( onRefresh: () => widget.viewModel.onRefreshed(context), - child: widget.viewModel.taskList.isEmpty + child: widget.viewModel.taskMap.isEmpty ? HelpText(AppLocalization.of(context).noRecordsFound) : state.prefState.moduleLayout == ModuleLayout.list ? ListView.separated( diff --git a/lib/ui/vendor/vendor_list.dart b/lib/ui/vendor/vendor_list.dart index 14bf8841e..b75594255 100644 --- a/lib/ui/vendor/vendor_list.dart +++ b/lib/ui/vendor/vendor_list.dart @@ -66,15 +66,22 @@ class _VendorListState extends State { Widget build(BuildContext context) { final store = StoreProvider.of(context); final state = store.state; - final listUIState = store.state.uiState.vendorUIState.listUIState; + final viewModel = widget.viewModel; + final listUIState = state.uiState.vendorUIState.listUIState; final isInMultiselect = listUIState.isInMultiselect(); - final vendorList = widget.viewModel.vendorList; + final vendorList = viewModel.vendorList; + + if (!viewModel.isLoaded) { + return viewModel.isLoading ? LoadingIndicator() : SizedBox(); + } else if (viewModel.vendorMap.isEmpty) { + return HelpText(AppLocalization.of(context).noRecordsFound); + } if (state.shouldSelectEntity(EntityType.vendor)) { viewEntityById( context: context, entityType: EntityType.vendor, - entityId: vendorList.first); + entityId: vendorList.isEmpty ? null : vendorList.first); } return Column( @@ -84,7 +91,7 @@ class _VendorListState extends State { ? LoadingIndicator() : RefreshIndicator( onRefresh: () => widget.viewModel.onRefreshed(context), - child: widget.viewModel.vendorList.isEmpty + child: widget.viewModel.vendorMap.isEmpty ? HelpText(AppLocalization.of(context).noRecordsFound) : state.prefState.moduleLayout == ModuleLayout.list ? ListView.separated(