Settings
This commit is contained in:
parent
b2c7f942ea
commit
e3adf81e9d
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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}';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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 ?? ''),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue