diff --git a/lib/constants.dart b/lib/constants.dart index abddc3a62..994fe6d3b 100644 --- a/lib/constants.dart +++ b/lib/constants.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; // This version must be updated in tandem with the pubspec version. -const String kAppVersion = '2.0.1'; +const String kAppVersion = '2.0.2'; const String kSiteUrl = 'https://invoiceninja.com'; const String kAppUrl = 'https://admin.invoiceninja.com'; const String kAppPlansURL = @@ -117,8 +117,8 @@ const List kSettingsSections = [ kSettingsBuyNowButtons, kSettingsEmailSettings, kSettingsTemplatesAndReminders, - //kSettingsCreditCardsAndBanks, - //kSettingsDataVisualizations, + kSettingsCreditCardsAndBanks, + kSettingsDataVisualizations, ]; const int kPaymentStatusPending = 1; diff --git a/lib/redux/app/app_state.dart b/lib/redux/app/app_state.dart index 72e1bdf1c..ddb88230c 100644 --- a/lib/redux/app/app_state.dart +++ b/lib/redux/app/app_state.dart @@ -289,7 +289,7 @@ abstract class AppState implements Built { String toString() { //return 'Settings: ${selectedCompanyState.company.settings}'; //return 'URL: ${authState.url}, ${selectedCompany.plan}'; - return 'Route: ${uiState.currentRoute}, size: ${selectedCompany.sizeId}/${uiState.settingsUIState.editing.company.sizeId}, country: ${selectedCompany.countryId}/${uiState.settingsUIState.editing.company.countryId} updatedAt: ${settingsUIState.updatedAt}'; + return 'Route: ${uiState.currentRoute}, settings isChanged: ${uiState.settingsUIState.isChanged}'; //return 'Route: ${uiState.currentRoute}, Previous: ${uiState.previousRoute}, Layout: ${uiState.layout}, Menu: ${uiState.isMenuVisible}, History: ${uiState.isHistoryVisible}'; } } diff --git a/lib/ui/app/main_screen.dart b/lib/ui/app/main_screen.dart index c2e5be7c3..08a73a146 100644 --- a/lib/ui/app/main_screen.dart +++ b/lib/ui/app/main_screen.dart @@ -144,7 +144,9 @@ class SettingsScreens extends StatelessWidget { final state = store.state; final uiState = state.uiState; final subRoute = uiState.subRoute; - final index = kSettingsSections.indexOf(subRoute); + final index = subRoute.isEmpty + ? kSettingsSections.length + : kSettingsSections.indexOf(subRoute); return Row( children: [ @@ -175,6 +177,7 @@ class SettingsScreens extends StatelessWidget { TemplatesAndRemindersBuilder(), CreditCardsAndBanksBuilder(), DataVisualizationsBuilder(), + BlankScreen(), ], ), ), @@ -218,7 +221,7 @@ class EntityScreens extends StatelessWidget { children: [ (entityUIState.selectedId ?? '').isNotEmpty ? viewWidget - : BlankScreen(), + : BlankScreen(AppLocalization.of(context).noRecordSelected), editWidget, ], ), @@ -229,11 +232,14 @@ class EntityScreens extends StatelessWidget { } class BlankScreen extends StatelessWidget { + const BlankScreen([this.message]); + final String message; + @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(), - body: HelpText(AppLocalization.of(context).noRecordSelected), + body: HelpText(message ?? ''), ); } } diff --git a/lib/ui/settings/settings_scaffold.dart b/lib/ui/settings/settings_scaffold.dart index db9adca69..645cd557d 100644 --- a/lib/ui/settings/settings_scaffold.dart +++ b/lib/ui/settings/settings_scaffold.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_redux/flutter_redux.dart'; import 'package:invoiceninja_flutter/redux/app/app_state.dart'; +import 'package:invoiceninja_flutter/redux/settings/settings_actions.dart'; import 'package:invoiceninja_flutter/ui/app/buttons/action_icon_button.dart'; import 'package:invoiceninja_flutter/utils/localization.dart'; import 'package:invoiceninja_flutter/utils/platforms.dart'; @@ -23,7 +24,8 @@ class SettingsScaffold extends StatelessWidget { @override Widget build(BuildContext context) { final localization = AppLocalization.of(context); - final state = StoreProvider.of(context).state; + final store = StoreProvider.of(context); + final state = store.state; return WillPopScope( onWillPop: () async { @@ -44,6 +46,12 @@ class SettingsScaffold extends StatelessWidget { ), onPressed: () { FocusScope.of(context).requestFocus(FocusNode()); + store.dispatch(ViewSettings( + context: context, + userCompany: state.userCompany, + section: '', + force: true, + )); onCancelPressed(context); }, ); diff --git a/lib/ui/settings/user_details.dart b/lib/ui/settings/user_details.dart index edec9ee13..ac30543c0 100644 --- a/lib/ui/settings/user_details.dart +++ b/lib/ui/settings/user_details.dart @@ -64,13 +64,13 @@ class _UserDetailsState extends State { } void _onChanged() { - final user = widget.viewModel.state.user.rebuild((b) => b + final user = widget.viewModel.user.rebuild((b) => b ..firstName = _firstNameController.text.trim() ..lastName = _lastNameController.text.trim() ..email = _emailController.text.trim() //..firstName = _firstNameController.text.trim() ); - if (user != widget.viewModel.state.user) { + if (user != widget.viewModel.user) { widget.viewModel.onChanged(user); } } diff --git a/lib/ui/settings/user_details_vm.dart b/lib/ui/settings/user_details_vm.dart index beb2db71b..b0d2052fc 100644 --- a/lib/ui/settings/user_details_vm.dart +++ b/lib/ui/settings/user_details_vm.dart @@ -27,6 +27,7 @@ class UserDetailsBuilder extends StatelessWidget { class UserDetailsVM { UserDetailsVM({ + @required this.user, @required this.state, @required this.onChanged, @required this.onSavePressed, @@ -38,6 +39,7 @@ class UserDetailsVM { return UserDetailsVM( state: state, + user: state.uiState.settingsUIState.editing.user, onChanged: (user) => store.dispatch(UpdateUserSettings(user: user)), onCancelPressed: (context) => store.dispatch(ResetUserSettings(user: state.user)), @@ -51,6 +53,7 @@ class UserDetailsVM { } final AppState state; + final UserEntity user; final Function(UserEntity) onChanged; final Function(BuildContext) onSavePressed; final Function(BuildContext) onCancelPressed;