This commit is contained in:
Hillel Coren 2019-10-04 12:16:32 +03:00
parent b2c7f942ea
commit e3adf81e9d
6 changed files with 27 additions and 10 deletions

View File

@ -1,7 +1,7 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
// This version must be updated in tandem with the pubspec version. // 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 kSiteUrl = 'https://invoiceninja.com';
const String kAppUrl = 'https://admin.invoiceninja.com'; const String kAppUrl = 'https://admin.invoiceninja.com';
const String kAppPlansURL = const String kAppPlansURL =
@ -117,8 +117,8 @@ const List<String> kSettingsSections = [
kSettingsBuyNowButtons, kSettingsBuyNowButtons,
kSettingsEmailSettings, kSettingsEmailSettings,
kSettingsTemplatesAndReminders, kSettingsTemplatesAndReminders,
//kSettingsCreditCardsAndBanks, kSettingsCreditCardsAndBanks,
//kSettingsDataVisualizations, kSettingsDataVisualizations,
]; ];
const int kPaymentStatusPending = 1; const int kPaymentStatusPending = 1;

View File

@ -289,7 +289,7 @@ abstract class AppState implements Built<AppState, AppStateBuilder> {
String toString() { String toString() {
//return 'Settings: ${selectedCompanyState.company.settings}'; //return 'Settings: ${selectedCompanyState.company.settings}';
//return 'URL: ${authState.url}, ${selectedCompany.plan}'; //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}'; //return 'Route: ${uiState.currentRoute}, Previous: ${uiState.previousRoute}, Layout: ${uiState.layout}, Menu: ${uiState.isMenuVisible}, History: ${uiState.isHistoryVisible}';
} }
} }

View File

@ -144,7 +144,9 @@ class SettingsScreens extends StatelessWidget {
final state = store.state; final state = store.state;
final uiState = state.uiState; final uiState = state.uiState;
final subRoute = uiState.subRoute; final subRoute = uiState.subRoute;
final index = kSettingsSections.indexOf(subRoute); final index = subRoute.isEmpty
? kSettingsSections.length
: kSettingsSections.indexOf(subRoute);
return Row( return Row(
children: <Widget>[ children: <Widget>[
@ -175,6 +177,7 @@ class SettingsScreens extends StatelessWidget {
TemplatesAndRemindersBuilder(), TemplatesAndRemindersBuilder(),
CreditCardsAndBanksBuilder(), CreditCardsAndBanksBuilder(),
DataVisualizationsBuilder(), DataVisualizationsBuilder(),
BlankScreen(),
], ],
), ),
), ),
@ -218,7 +221,7 @@ class EntityScreens extends StatelessWidget {
children: <Widget>[ children: <Widget>[
(entityUIState.selectedId ?? '').isNotEmpty (entityUIState.selectedId ?? '').isNotEmpty
? viewWidget ? viewWidget
: BlankScreen(), : BlankScreen(AppLocalization.of(context).noRecordSelected),
editWidget, editWidget,
], ],
), ),
@ -229,11 +232,14 @@ class EntityScreens extends StatelessWidget {
} }
class BlankScreen extends StatelessWidget { class BlankScreen extends StatelessWidget {
const BlankScreen([this.message]);
final String message;
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Scaffold( return Scaffold(
appBar: AppBar(), appBar: AppBar(),
body: HelpText(AppLocalization.of(context).noRecordSelected), body: HelpText(message ?? ''),
); );
} }
} }

View File

@ -1,6 +1,7 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_redux/flutter_redux.dart'; import 'package:flutter_redux/flutter_redux.dart';
import 'package:invoiceninja_flutter/redux/app/app_state.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/ui/app/buttons/action_icon_button.dart';
import 'package:invoiceninja_flutter/utils/localization.dart'; import 'package:invoiceninja_flutter/utils/localization.dart';
import 'package:invoiceninja_flutter/utils/platforms.dart'; import 'package:invoiceninja_flutter/utils/platforms.dart';
@ -23,7 +24,8 @@ class SettingsScaffold extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final localization = AppLocalization.of(context); final localization = AppLocalization.of(context);
final state = StoreProvider.of<AppState>(context).state; final store = StoreProvider.of<AppState>(context);
final state = store.state;
return WillPopScope( return WillPopScope(
onWillPop: () async { onWillPop: () async {
@ -44,6 +46,12 @@ class SettingsScaffold extends StatelessWidget {
), ),
onPressed: () { onPressed: () {
FocusScope.of(context).requestFocus(FocusNode()); FocusScope.of(context).requestFocus(FocusNode());
store.dispatch(ViewSettings(
context: context,
userCompany: state.userCompany,
section: '',
force: true,
));
onCancelPressed(context); onCancelPressed(context);
}, },
); );

View File

@ -64,13 +64,13 @@ class _UserDetailsState extends State<UserDetails> {
} }
void _onChanged() { void _onChanged() {
final user = widget.viewModel.state.user.rebuild((b) => b final user = widget.viewModel.user.rebuild((b) => b
..firstName = _firstNameController.text.trim() ..firstName = _firstNameController.text.trim()
..lastName = _lastNameController.text.trim() ..lastName = _lastNameController.text.trim()
..email = _emailController.text.trim() ..email = _emailController.text.trim()
//..firstName = _firstNameController.text.trim() //..firstName = _firstNameController.text.trim()
); );
if (user != widget.viewModel.state.user) { if (user != widget.viewModel.user) {
widget.viewModel.onChanged(user); widget.viewModel.onChanged(user);
} }
} }

View File

@ -27,6 +27,7 @@ class UserDetailsBuilder extends StatelessWidget {
class UserDetailsVM { class UserDetailsVM {
UserDetailsVM({ UserDetailsVM({
@required this.user,
@required this.state, @required this.state,
@required this.onChanged, @required this.onChanged,
@required this.onSavePressed, @required this.onSavePressed,
@ -38,6 +39,7 @@ class UserDetailsVM {
return UserDetailsVM( return UserDetailsVM(
state: state, state: state,
user: state.uiState.settingsUIState.editing.user,
onChanged: (user) => store.dispatch(UpdateUserSettings(user: user)), onChanged: (user) => store.dispatch(UpdateUserSettings(user: user)),
onCancelPressed: (context) => onCancelPressed: (context) =>
store.dispatch(ResetUserSettings(user: state.user)), store.dispatch(ResetUserSettings(user: state.user)),
@ -51,6 +53,7 @@ class UserDetailsVM {
} }
final AppState state; final AppState state;
final UserEntity user;
final Function(UserEntity) onChanged; final Function(UserEntity) onChanged;
final Function(BuildContext) onSavePressed; final Function(BuildContext) onSavePressed;
final Function(BuildContext) onCancelPressed; final Function(BuildContext) onCancelPressed;