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