This commit is contained in:
Hillel Coren 2019-10-06 16:12:52 +03:00
parent 635377cf5a
commit 141866fb89
9 changed files with 104 additions and 104 deletions

View File

@ -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> {
),
],
);
})
),
})),
),
);
}

View File

@ -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>(

View File

@ -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(

View File

@ -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;
}

View File

@ -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] ??

View File

@ -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),

View File

@ -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';

View File

@ -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';

View File

@ -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';