This commit is contained in:
unknown 2018-08-07 13:11:36 +03:00
parent 01fd67b9d0
commit fd1484a6d1
7 changed files with 56 additions and 61 deletions

View File

@ -7,7 +7,6 @@ import 'package:flutter_redux/flutter_redux.dart';
import 'package:invoiceninja_flutter/data/models/entities.dart'; import 'package:invoiceninja_flutter/data/models/entities.dart';
import 'package:invoiceninja_flutter/redux/company/company_selectors.dart'; import 'package:invoiceninja_flutter/redux/company/company_selectors.dart';
import 'package:invoiceninja_flutter/redux/dashboard/dashboard_actions.dart'; import 'package:invoiceninja_flutter/redux/dashboard/dashboard_actions.dart';
import 'package:invoiceninja_flutter/ui/app/snackbar_row.dart';
import 'package:invoiceninja_flutter/ui/dashboard/dashboard_view.dart'; import 'package:invoiceninja_flutter/ui/dashboard/dashboard_view.dart';
import 'package:invoiceninja_flutter/utils/completers.dart'; import 'package:invoiceninja_flutter/utils/completers.dart';
import 'package:invoiceninja_flutter/utils/localization.dart'; import 'package:invoiceninja_flutter/utils/localization.dart';

View File

@ -6,13 +6,11 @@ import 'package:invoiceninja_flutter/redux/ui/ui_actions.dart';
import 'package:invoiceninja_flutter/ui/app/dialogs/error_dialog.dart'; import 'package:invoiceninja_flutter/ui/app/dialogs/error_dialog.dart';
import 'package:invoiceninja_flutter/ui/invoice/invoice_screen.dart'; import 'package:invoiceninja_flutter/ui/invoice/invoice_screen.dart';
import 'package:invoiceninja_flutter/ui/invoice/view/invoice_view_vm.dart'; import 'package:invoiceninja_flutter/ui/invoice/view/invoice_view_vm.dart';
import 'package:invoiceninja_flutter/utils/localization.dart';
import 'package:redux/redux.dart'; import 'package:redux/redux.dart';
import 'package:invoiceninja_flutter/redux/invoice/invoice_actions.dart'; import 'package:invoiceninja_flutter/redux/invoice/invoice_actions.dart';
import 'package:invoiceninja_flutter/data/models/models.dart'; import 'package:invoiceninja_flutter/data/models/models.dart';
import 'package:invoiceninja_flutter/ui/invoice/edit/invoice_edit.dart'; import 'package:invoiceninja_flutter/ui/invoice/edit/invoice_edit.dart';
import 'package:invoiceninja_flutter/redux/app/app_state.dart'; import 'package:invoiceninja_flutter/redux/app/app_state.dart';
import 'package:invoiceninja_flutter/ui/app/snackbar_row.dart';
class InvoiceEditScreen extends StatelessWidget { class InvoiceEditScreen extends StatelessWidget {
static const String route = '/invoice/edit'; static const String route = '/invoice/edit';

View File

@ -7,7 +7,6 @@ import 'package:flutter/foundation.dart';
import 'package:flutter/widgets.dart'; import 'package:flutter/widgets.dart';
import 'package:flutter_redux/flutter_redux.dart'; import 'package:flutter_redux/flutter_redux.dart';
import 'package:invoiceninja_flutter/redux/ui/list_ui_state.dart'; import 'package:invoiceninja_flutter/redux/ui/list_ui_state.dart';
import 'package:invoiceninja_flutter/ui/app/snackbar_row.dart';
import 'package:invoiceninja_flutter/utils/completers.dart'; import 'package:invoiceninja_flutter/utils/completers.dart';
import 'package:invoiceninja_flutter/utils/localization.dart'; import 'package:invoiceninja_flutter/utils/localization.dart';
import 'package:redux/redux.dart'; import 'package:redux/redux.dart';

View File

@ -1,5 +1,6 @@
import 'package:flutter/foundation.dart'; 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/ui/app/loading_indicator.dart'; import 'package:invoiceninja_flutter/ui/app/loading_indicator.dart';
import 'package:invoiceninja_flutter/ui/product/product_list_item.dart'; import 'package:invoiceninja_flutter/ui/product/product_list_item.dart';
import 'package:invoiceninja_flutter/ui/product/product_list_vm.dart'; import 'package:invoiceninja_flutter/ui/product/product_list_vm.dart';
@ -15,7 +16,7 @@ class ProductList extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
if (! viewModel.isLoaded) { if (!viewModel.isLoaded) {
return LoadingIndicator(); return LoadingIndicator();
} else if (viewModel.productList.isEmpty) { } else if (viewModel.productList.isEmpty) {
return Opacity( return Opacity(
@ -34,6 +35,32 @@ class ProductList extends StatelessWidget {
return _buildListView(context); return _buildListView(context);
} }
void _showMenu(BuildContext context, ProductEntity product) {
showDialog<String>(
context: context,
builder: (BuildContext context) => SimpleDialog(children: <Widget>[
ListTile(
leading: Icon(Icons.control_point_duplicate),
title: Text(AppLocalization.of(context).clone),
onTap: () => viewModel.onEntityAction(
context, product, EntityAction.clone),
),
Divider(),
ListTile(
leading: Icon(Icons.archive),
title: Text(AppLocalization.of(context).archive),
onTap: () => viewModel.onEntityAction(
context, product, EntityAction.archive),
),
ListTile(
leading: Icon(Icons.delete),
title: Text(AppLocalization.of(context).delete),
onTap: () => viewModel.onEntityAction(
context, product, EntityAction.delete),
),
]));
}
Widget _buildListView(BuildContext context) { Widget _buildListView(BuildContext context) {
return RefreshIndicator( return RefreshIndicator(
onRefresh: () => viewModel.onRefreshed(context), onRefresh: () => viewModel.onRefreshed(context),
@ -49,7 +76,7 @@ class ProductList extends StatelessWidget {
onDismissed: (DismissDirection direction) => onDismissed: (DismissDirection direction) =>
viewModel.onDismissed(context, product, direction), viewModel.onDismissed(context, product, direction),
onTap: () => viewModel.onProductTap(context, product), onTap: () => viewModel.onProductTap(context, product),
onLongPress: () => viewModel.onProductLongPress(context, product), onLongPress: () => _showMenu(context, product),
), ),
Divider( Divider(
height: 1.0, height: 1.0,

View File

@ -5,7 +5,6 @@ import 'package:flutter/material.dart';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:flutter/widgets.dart'; import 'package:flutter/widgets.dart';
import 'package:flutter_redux/flutter_redux.dart'; import 'package:flutter_redux/flutter_redux.dart';
import 'package:invoiceninja_flutter/ui/app/snackbar_row.dart';
import 'package:invoiceninja_flutter/utils/completers.dart'; import 'package:invoiceninja_flutter/utils/completers.dart';
import 'package:invoiceninja_flutter/utils/localization.dart'; import 'package:invoiceninja_flutter/utils/localization.dart';
import 'package:redux/redux.dart'; import 'package:redux/redux.dart';
@ -37,9 +36,9 @@ class ProductListVM {
final bool isLoading; final bool isLoading;
final bool isLoaded; final bool isLoaded;
final Function(BuildContext, ProductEntity) onProductTap; final Function(BuildContext, ProductEntity) onProductTap;
final Function(BuildContext, ProductEntity) onProductLongPress;
final Function(BuildContext, ProductEntity, DismissDirection) onDismissed; final Function(BuildContext, ProductEntity, DismissDirection) onDismissed;
final Function(BuildContext) onRefreshed; final Function(BuildContext) onRefreshed;
final Function(BuildContext, ProductEntity, EntityAction) onEntityAction;
ProductListVM({ ProductListVM({
@required this.productList, @required this.productList,
@ -48,9 +47,9 @@ class ProductListVM {
@required this.isLoading, @required this.isLoading,
@required this.isLoaded, @required this.isLoaded,
@required this.onProductTap, @required this.onProductTap,
@required this.onProductLongPress,
@required this.onDismissed, @required this.onDismissed,
@required this.onRefreshed, @required this.onRefreshed,
@required this.onEntityAction,
}); });
static ProductListVM fromStore(Store<AppState> store) { static ProductListVM fromStore(Store<AppState> store) {
@ -73,48 +72,25 @@ class ProductListVM {
onProductTap: (context, product) { onProductTap: (context, product) {
store.dispatch(EditProduct(product: product, context: context)); store.dispatch(EditProduct(product: product, context: context));
}, },
onProductLongPress: (context, product) async { onEntityAction: (context, product, action) {
final message = await showDialog<String>( switch (action) {
context: context, case EntityAction.clone:
builder: (BuildContext context) =>
SimpleDialog(children: <Widget>[
ListTile(
leading: Icon(Icons.control_point_duplicate),
title: Text(AppLocalization.of(context).clone),
onTap: () {
Navigator.of(context).pop(); Navigator.of(context).pop();
store.dispatch(EditProduct( store.dispatch(
context: context, product: product.clone)); EditProduct(context: context, product: product.clone));
}, break;
), case EntityAction.archive:
Divider(), store.dispatch(ArchiveProductRequest(
ListTile( popCompleter(context,
leading: Icon(Icons.archive), AppLocalization.of(context).successfullyArchivedProduct),
title: Text(AppLocalization.of(context).archive), product.id));
onTap: () => store.dispatch(ArchiveProductRequest( break;
popCompleter( case EntityAction.delete:
context, store.dispatch(DeleteProductRequest(
AppLocalization popCompleter(context,
.of(context) AppLocalization.of(context).successfullyDeletedProduct),
.successfullyArchivedProduct), product.id));
product.id))), break;
ListTile(
leading: Icon(Icons.delete),
title: Text(AppLocalization.of(context).delete),
onTap: () => store.dispatch(DeleteProductRequest(
popCompleter(
context,
AppLocalization
.of(context)
.successfullyDeletedProduct),
product.id)),
),
]));
if (message != null) {
Scaffold.of(context).showSnackBar(SnackBar(
content: SnackBarRow(
message: message,
)));
} }
}, },
onRefreshed: (context) => _handleRefresh(context), onRefreshed: (context) => _handleRefresh(context),

View File

@ -1,12 +1,8 @@
import 'dart:async';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart'; import 'package:flutter/widgets.dart';
import 'package:flutter_redux/flutter_redux.dart'; import 'package:flutter_redux/flutter_redux.dart';
import 'package:invoiceninja_flutter/constants.dart'; import 'package:invoiceninja_flutter/constants.dart';
import 'package:invoiceninja_flutter/redux/app/app_actions.dart'; import 'package:invoiceninja_flutter/redux/app/app_actions.dart';
import 'package:invoiceninja_flutter/ui/app/dialogs/error_dialog.dart';
import 'package:invoiceninja_flutter/ui/app/snackbar_row.dart';
import 'package:invoiceninja_flutter/utils/completers.dart'; import 'package:invoiceninja_flutter/utils/completers.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';

View File

@ -44,7 +44,7 @@ Completer<Null> snackBarCompleter(BuildContext context, String message) {
} }
Completer<Null> popCompleter(BuildContext context, String message) { Completer<Null> popCompleter(BuildContext context, String message) {
final Completer<Null> completer = Completer<String>(); final Completer<Null> completer = Completer<Null>();
completer.future.then((_) { completer.future.then((_) {
Navigator.of(context).pop(message); Navigator.of(context).pop(message);