Settings
This commit is contained in:
parent
635377cf5a
commit
141866fb89
|
|
@ -4,6 +4,7 @@ import 'package:invoiceninja_flutter/ui/app/form_card.dart';
|
||||||
import 'package:invoiceninja_flutter/ui/group/edit/group_edit_vm.dart';
|
import 'package:invoiceninja_flutter/ui/group/edit/group_edit_vm.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';
|
||||||
|
|
||||||
class GroupEdit extends StatefulWidget {
|
class GroupEdit extends StatefulWidget {
|
||||||
const GroupEdit({
|
const GroupEdit({
|
||||||
|
|
@ -26,7 +27,6 @@ class _GroupEditState extends State<GroupEdit> {
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void didChangeDependencies() {
|
void didChangeDependencies() {
|
||||||
|
|
||||||
_controllers = [
|
_controllers = [
|
||||||
// STARTER: array - do not remove comment
|
// STARTER: array - do not remove comment
|
||||||
];
|
];
|
||||||
|
|
@ -53,8 +53,8 @@ class _GroupEditState extends State<GroupEdit> {
|
||||||
|
|
||||||
void _onChanged() {
|
void _onChanged() {
|
||||||
final group = widget.viewModel.group.rebuild((b) => b
|
final group = widget.viewModel.group.rebuild((b) => b
|
||||||
// STARTER: set value - do not remove comment
|
// STARTER: set value - do not remove comment
|
||||||
);
|
);
|
||||||
if (group != widget.viewModel.group) {
|
if (group != widget.viewModel.group) {
|
||||||
widget.viewModel.onChanged(group);
|
widget.viewModel.onChanged(group);
|
||||||
}
|
}
|
||||||
|
|
@ -72,33 +72,33 @@ class _GroupEditState extends State<GroupEdit> {
|
||||||
return true;
|
return true;
|
||||||
},
|
},
|
||||||
child: Scaffold(
|
child: Scaffold(
|
||||||
automaticallyImplyLeading: isMobile(context),
|
|
||||||
appBar: AppBar(
|
appBar: AppBar(
|
||||||
|
automaticallyImplyLeading: isMobile(context),
|
||||||
title: Text(viewModel.group.isNew
|
title: Text(viewModel.group.isNew
|
||||||
? localization.newGroup
|
? localization.newGroup
|
||||||
: localization.editGroup),
|
: localization.editGroup),
|
||||||
actions: <Widget>[
|
actions: <Widget>[
|
||||||
if (!isMobile(context))
|
if (!isMobile(context))
|
||||||
FlatButton(
|
FlatButton(
|
||||||
child: Text(
|
child: Text(
|
||||||
localization.cancel,
|
localization.cancel,
|
||||||
style: TextStyle(color: Colors.white),
|
style: TextStyle(color: Colors.white),
|
||||||
),
|
|
||||||
onPressed: () => viewModel.onCancelPressed(context),
|
|
||||||
),
|
|
||||||
ActionIconButton(
|
|
||||||
icon: Icons.cloud_upload,
|
|
||||||
tooltip: localization.save,
|
|
||||||
isVisible: !group.isDeleted,
|
|
||||||
isDirty: group.isNew || group != viewModel.origGroup,
|
|
||||||
isSaving: viewModel.isSaving,
|
|
||||||
onPressed: () {
|
|
||||||
if (! _formKey.currentState.validate()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
viewModel.onSavePressed(context);
|
|
||||||
},
|
|
||||||
),
|
),
|
||||||
|
onPressed: () => viewModel.onCancelPressed(context),
|
||||||
|
),
|
||||||
|
ActionIconButton(
|
||||||
|
icon: Icons.cloud_upload,
|
||||||
|
tooltip: localization.save,
|
||||||
|
isVisible: !group.isDeleted,
|
||||||
|
isDirty: group.isNew || group != viewModel.origGroup,
|
||||||
|
isSaving: viewModel.isSaving,
|
||||||
|
onPressed: () {
|
||||||
|
if (!_formKey.currentState.validate()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
viewModel.onSavePressed(context);
|
||||||
|
},
|
||||||
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
body: Form(
|
body: Form(
|
||||||
|
|
@ -113,8 +113,7 @@ class _GroupEditState extends State<GroupEdit> {
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
})
|
})),
|
||||||
),
|
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,7 @@ import 'package:flutter/material.dart';
|
||||||
import 'package:flutter_redux/flutter_redux.dart';
|
import 'package:flutter_redux/flutter_redux.dart';
|
||||||
import 'package:invoiceninja_flutter/redux/ui/ui_actions.dart';
|
import 'package:invoiceninja_flutter/redux/ui/ui_actions.dart';
|
||||||
import 'package:invoiceninja_flutter/ui/group/group_screen.dart';
|
import 'package:invoiceninja_flutter/ui/group/group_screen.dart';
|
||||||
|
import 'package:invoiceninja_flutter/utils/platforms.dart';
|
||||||
import 'package:redux/redux.dart';
|
import 'package:redux/redux.dart';
|
||||||
import 'package:invoiceninja_flutter/data/models/models.dart';
|
import 'package:invoiceninja_flutter/data/models/models.dart';
|
||||||
import 'package:invoiceninja_flutter/ui/app/dialogs/error_dialog.dart';
|
import 'package:invoiceninja_flutter/ui/app/dialogs/error_dialog.dart';
|
||||||
|
|
@ -62,25 +63,26 @@ class GroupEditVM {
|
||||||
},
|
},
|
||||||
onBackPressed: () {
|
onBackPressed: () {
|
||||||
if (state.uiState.currentRoute.contains(GroupScreen.route)) {
|
if (state.uiState.currentRoute.contains(GroupScreen.route)) {
|
||||||
store.dispatch(UpdateCurrentRoute(group.isNew ? GroupScreen.route : GroupViewScreen.route));
|
store.dispatch(UpdateCurrentRoute(
|
||||||
|
group.isNew ? GroupScreen.route : GroupViewScreen.route));
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
onCancelPressed: (BuildContext context) {
|
onCancelPressed: (BuildContext context) {
|
||||||
store.dispatch(EditGroup(
|
store.dispatch(
|
||||||
group: GroupEntity(), context: context, force: true));
|
EditGroup(group: GroupEntity(), context: context, force: true));
|
||||||
store.dispatch(UpdateCurrentRoute(state.uiState.previousRoute));
|
store.dispatch(UpdateCurrentRoute(state.uiState.previousRoute));
|
||||||
},
|
},
|
||||||
onSavePressed: (BuildContext context) {
|
onSavePressed: (BuildContext context) {
|
||||||
final Completer<GroupEntity> completer = new Completer<GroupEntity>();
|
final Completer<GroupEntity> completer = new Completer<GroupEntity>();
|
||||||
store.dispatch(SaveGroupRequest(completer: completer, group: group));
|
store.dispatch(SaveGroupRequest(completer: completer, group: group));
|
||||||
return completer.future.then((savedGroup) {
|
return completer.future.then((savedGroup) {
|
||||||
store.dispatch(UpdateCurrentRoute(GroupViewScreen.route));
|
store.dispatch(UpdateCurrentRoute(GroupViewScreen.route));
|
||||||
if (isMobile(context)) {
|
if (isMobile(context)) {
|
||||||
if (group.isNew) {
|
if (group.isNew) {
|
||||||
Navigator.of(context).pushReplacementNamed(GroupViewScreen.route);
|
Navigator.of(context).pushReplacementNamed(GroupViewScreen.route);
|
||||||
} else {
|
} else {
|
||||||
Navigator.of(context).pop(savedGroup);
|
Navigator.of(context).pop(savedGroup);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}).catchError((Object error) {
|
}).catchError((Object error) {
|
||||||
showDialog<ErrorDialog>(
|
showDialog<ErrorDialog>(
|
||||||
|
|
|
||||||
|
|
@ -2,12 +2,11 @@ import 'package:flutter/foundation.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:invoiceninja_flutter/data/models/models.dart';
|
import 'package:invoiceninja_flutter/data/models/models.dart';
|
||||||
import 'package:invoiceninja_flutter/ui/app/entities/entity_actions_dialog.dart';
|
import 'package:invoiceninja_flutter/ui/app/entities/entity_actions_dialog.dart';
|
||||||
|
import 'package:invoiceninja_flutter/ui/app/help_text.dart';
|
||||||
import 'package:invoiceninja_flutter/ui/app/lists/list_divider.dart';
|
import 'package:invoiceninja_flutter/ui/app/lists/list_divider.dart';
|
||||||
import 'package:invoiceninja_flutter/ui/app/loading_indicator.dart';
|
import 'package:invoiceninja_flutter/ui/app/loading_indicator.dart';
|
||||||
import 'package:invoiceninja_flutter/ui/app/snackbar_row.dart';
|
|
||||||
import 'package:invoiceninja_flutter/ui/group/group_list_item.dart';
|
import 'package:invoiceninja_flutter/ui/group/group_list_item.dart';
|
||||||
import 'package:invoiceninja_flutter/ui/group/group_list_vm.dart';
|
import 'package:invoiceninja_flutter/ui/group/group_list_vm.dart';
|
||||||
import 'package:invoiceninja_flutter/utils/icons.dart';
|
|
||||||
import 'package:invoiceninja_flutter/utils/localization.dart';
|
import 'package:invoiceninja_flutter/utils/localization.dart';
|
||||||
|
|
||||||
class GroupList extends StatelessWidget {
|
class GroupList extends StatelessWidget {
|
||||||
|
|
@ -30,53 +29,48 @@ class GroupList extends StatelessWidget {
|
||||||
|
|
||||||
return Column(
|
return Column(
|
||||||
children: <Widget>[
|
children: <Widget>[
|
||||||
|
Expanded(
|
||||||
Expanded(
|
child: !viewModel.isLoaded
|
||||||
child: !viewModel.isLoaded
|
? (viewModel.isLoading ? LoadingIndicator() : SizedBox())
|
||||||
? (viewModel.isLoading ? LoadingIndicator() : SizedBox())
|
: RefreshIndicator(
|
||||||
: RefreshIndicator(
|
onRefresh: () => viewModel.onRefreshed(context),
|
||||||
onRefresh: () => viewModel.onRefreshed(context),
|
child: viewModel.groupList.isEmpty
|
||||||
child: viewModel.groupList.isEmpty
|
? HelpText(AppLocalization.of(context).noRecordsFound)
|
||||||
? HelpText(AppLocalization.of(context).noRecordsFound)
|
: ListView.separated(
|
||||||
: ListView.separated(
|
shrinkWrap: true,
|
||||||
shrinkWrap: true,
|
separatorBuilder: (context, index) => ListDivider(),
|
||||||
separatorBuilder: (context, index) => ListDivider(),
|
itemCount: viewModel.groupList.length,
|
||||||
itemCount: viewModel.groupList.length,
|
itemBuilder: (BuildContext context, index) {
|
||||||
itemBuilder: (BuildContext context, index) {
|
final groupId = viewModel.groupList[index];
|
||||||
final groupId = viewModel.groupList[index];
|
final group = viewModel.groupMap[groupId];
|
||||||
final group = viewModel.groupMap[groupId];
|
final user = viewModel.user;
|
||||||
final user = viewModel.user;
|
|
||||||
|
|
||||||
void showDialog() => showEntityActionsDialog(
|
void showDialog() => showEntityActionsDialog(
|
||||||
entity: group,
|
entity: group,
|
||||||
context: context,
|
context: context,
|
||||||
user: user,
|
user: user,
|
||||||
onEntityAction: viewModel.onEntityAction);
|
onEntityAction: viewModel.onEntityAction);
|
||||||
|
|
||||||
|
return GroupListItem(
|
||||||
|
user: viewModel.user,
|
||||||
|
filter: viewModel.filter,
|
||||||
|
group: group,
|
||||||
|
onTap: () => viewModel.onGroupTap(context, group),
|
||||||
|
onEntityAction: (EntityAction action) {
|
||||||
|
if (action == EntityAction.more) {
|
||||||
|
showDialog();
|
||||||
|
} else {
|
||||||
|
viewModel.onEntityAction(
|
||||||
|
context, group, action);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
onLongPress: () => showDialog(),
|
||||||
|
);
|
||||||
|
},
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
|
||||||
return GroupListItem(
|
|
||||||
user: viewModel.user,
|
|
||||||
filter: viewModel.filter,
|
|
||||||
group: group,
|
|
||||||
onTap: () =>
|
|
||||||
viewModel.onGroupTap(context, group),
|
|
||||||
onEntityAction: (EntityAction action) {
|
|
||||||
if (action == EntityAction.more) {
|
|
||||||
showDialog();
|
|
||||||
} else {
|
|
||||||
viewModel.onEntityAction(
|
|
||||||
context, group, action);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
onLongPress: () =>
|
|
||||||
showDialog(),
|
|
||||||
);
|
|
||||||
},
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
filteredClient != null
|
filteredClient != null
|
||||||
? Material(
|
? Material(
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,5 @@
|
||||||
import 'dart:async';
|
import 'dart:async';
|
||||||
|
import 'package:invoiceninja_flutter/data/models/group_model.dart';
|
||||||
import 'package:redux/redux.dart';
|
import 'package:redux/redux.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter/foundation.dart';
|
import 'package:flutter/foundation.dart';
|
||||||
|
|
@ -61,27 +62,25 @@ class GroupListVM {
|
||||||
final state = store.state;
|
final state = store.state;
|
||||||
|
|
||||||
return GroupListVM(
|
return GroupListVM(
|
||||||
user: state.user,
|
user: state.user,
|
||||||
listState: state.groupListState,
|
listState: state.groupListState,
|
||||||
groupList: memoizedFilteredGroupList(state.groupState.map,
|
groupList: memoizedFilteredGroupList(
|
||||||
state.groupState.list, state.groupListState),
|
state.groupState.map, state.groupState.list, state.groupListState),
|
||||||
groupMap: state.groupState.map,
|
groupMap: state.groupState.map,
|
||||||
isLoading: state.isLoading,
|
isLoading: state.isLoading,
|
||||||
isLoaded: state.groupState.isLoaded,
|
isLoaded: state.groupState.isLoaded,
|
||||||
filter: state.groupUIState.listUIState.filter,
|
filter: state.groupUIState.listUIState.filter,
|
||||||
onClearEntityFilterPressed: () =>
|
onClearEntityFilterPressed: () => store.dispatch(FilterGroupsByEntity()),
|
||||||
store.dispatch(FilterGroupsByEntity()),
|
onViewEntityFilterPressed: (BuildContext context) => store.dispatch(
|
||||||
onViewEntityFilterPressed: (BuildContext context) => store.dispatch(
|
ViewClient(
|
||||||
ViewClient(
|
clientId: state.groupListState.filterEntityId, context: context)),
|
||||||
clientId: state.groupListState.filterEntityId,
|
onGroupTap: (context, group) {
|
||||||
context: context)),
|
store.dispatch(ViewGroup(groupId: group.id, context: context));
|
||||||
onGroupTap: (context, group) {
|
},
|
||||||
store.dispatch(ViewGroup(groupId: group.id, context: context));
|
|
||||||
},
|
|
||||||
onEntityAction:
|
onEntityAction:
|
||||||
(BuildContext context, BaseEntity group, EntityAction action) =>
|
(BuildContext context, BaseEntity group, EntityAction action) =>
|
||||||
handleGroupAction(context, group, action),
|
handleGroupAction(context, group, action),
|
||||||
onRefreshed: (context) => _handleRefresh(context),
|
onRefreshed: (context) => _handleRefresh(context),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -97,5 +96,4 @@ class GroupListVM {
|
||||||
final Function(BuildContext, GroupEntity, EntityAction) onEntityAction;
|
final Function(BuildContext, GroupEntity, EntityAction) onEntityAction;
|
||||||
final Function onClearEntityFilterPressed;
|
final Function onClearEntityFilterPressed;
|
||||||
final Function(BuildContext) onViewEntityFilterPressed;
|
final Function(BuildContext) onViewEntityFilterPressed;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -15,6 +15,7 @@ mixin LocalizationsProvider on LocaleCodeAware {
|
||||||
static final Map<String, Map<String, String>> _localizedValues = {
|
static final Map<String, Map<String, String>> _localizedValues = {
|
||||||
'en': {
|
'en': {
|
||||||
'new_group': 'New Group',
|
'new_group': 'New Group',
|
||||||
|
'edit_group': 'Edit Group',
|
||||||
'created_group': 'Successfully created group',
|
'created_group': 'Successfully created group',
|
||||||
'updated_group': 'Successfully updated group',
|
'updated_group': 'Successfully updated group',
|
||||||
'archived_group': 'Successfully archived group',
|
'archived_group': 'Successfully archived group',
|
||||||
|
|
@ -14706,6 +14707,8 @@ mixin LocalizationsProvider on LocaleCodeAware {
|
||||||
|
|
||||||
String get restoredGroup => _localizedValues[localeCode]['restored_group'];
|
String get restoredGroup => _localizedValues[localeCode]['restored_group'];
|
||||||
|
|
||||||
|
String get editGroup => _localizedValues[localeCode]['edit_group'];
|
||||||
|
|
||||||
String lookup(String key) {
|
String lookup(String key) {
|
||||||
final lookupKey = toSnakeCase(key);
|
final lookupKey = toSnakeCase(key);
|
||||||
return _localizedValues[localeCode][lookupKey] ??
|
return _localizedValues[localeCode][lookupKey] ??
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,7 @@ import 'package:invoiceninja_flutter/ui/app/form_card.dart';
|
||||||
import 'package:invoiceninja_flutter/ui/stub/edit/stub_edit_vm.dart';
|
import 'package:invoiceninja_flutter/ui/stub/edit/stub_edit_vm.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';
|
||||||
|
|
||||||
class StubEdit extends StatefulWidget {
|
class StubEdit extends StatefulWidget {
|
||||||
const StubEdit({
|
const StubEdit({
|
||||||
|
|
@ -72,8 +73,8 @@ class _StubEditState extends State<StubEdit> {
|
||||||
return true;
|
return true;
|
||||||
},
|
},
|
||||||
child: Scaffold(
|
child: Scaffold(
|
||||||
automaticallyImplyLeading: isMobile(context),
|
|
||||||
appBar: AppBar(
|
appBar: AppBar(
|
||||||
|
automaticallyImplyLeading: isMobile(context),
|
||||||
title: Text(viewModel.stub.isNew
|
title: Text(viewModel.stub.isNew
|
||||||
? localization.newStub
|
? localization.newStub
|
||||||
: localization.editStub),
|
: localization.editStub),
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,7 @@ import 'package:flutter/material.dart';
|
||||||
import 'package:flutter_redux/flutter_redux.dart';
|
import 'package:flutter_redux/flutter_redux.dart';
|
||||||
import 'package:invoiceninja_flutter/redux/ui/ui_actions.dart';
|
import 'package:invoiceninja_flutter/redux/ui/ui_actions.dart';
|
||||||
import 'package:invoiceninja_flutter/ui/stub/stub_screen.dart';
|
import 'package:invoiceninja_flutter/ui/stub/stub_screen.dart';
|
||||||
|
import 'package:invoiceninja_flutter/utils/platforms.dart';
|
||||||
import 'package:redux/redux.dart';
|
import 'package:redux/redux.dart';
|
||||||
import 'package:invoiceninja_flutter/data/models/models.dart';
|
import 'package:invoiceninja_flutter/data/models/models.dart';
|
||||||
import 'package:invoiceninja_flutter/ui/app/dialogs/error_dialog.dart';
|
import 'package:invoiceninja_flutter/ui/app/dialogs/error_dialog.dart';
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,7 @@ import 'package:invoiceninja_flutter/data/models/models.dart';
|
||||||
import 'package:invoiceninja_flutter/ui/app/entities/entity_actions_dialog.dart';
|
import 'package:invoiceninja_flutter/ui/app/entities/entity_actions_dialog.dart';
|
||||||
import 'package:invoiceninja_flutter/ui/app/lists/list_divider.dart';
|
import 'package:invoiceninja_flutter/ui/app/lists/list_divider.dart';
|
||||||
import 'package:invoiceninja_flutter/ui/app/loading_indicator.dart';
|
import 'package:invoiceninja_flutter/ui/app/loading_indicator.dart';
|
||||||
|
import 'package:invoiceninja_flutter/ui/app/help_text.dart';
|
||||||
import 'package:invoiceninja_flutter/ui/app/snackbar_row.dart';
|
import 'package:invoiceninja_flutter/ui/app/snackbar_row.dart';
|
||||||
import 'package:invoiceninja_flutter/ui/stub/stub_list_item.dart';
|
import 'package:invoiceninja_flutter/ui/stub/stub_list_item.dart';
|
||||||
import 'package:invoiceninja_flutter/ui/stub/stub_list_vm.dart';
|
import 'package:invoiceninja_flutter/ui/stub/stub_list_vm.dart';
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,5 @@
|
||||||
import 'dart:async';
|
import 'dart:async';
|
||||||
|
import 'package:invoiceninja_flutter/data/models/stub_model.dart';
|
||||||
import 'package:redux/redux.dart';
|
import 'package:redux/redux.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter/foundation.dart';
|
import 'package:flutter/foundation.dart';
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue