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/redux/company/company_selectors.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/utils/completers.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/invoice/invoice_screen.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:invoiceninja_flutter/redux/invoice/invoice_actions.dart';
import 'package:invoiceninja_flutter/data/models/models.dart';
import 'package:invoiceninja_flutter/ui/invoice/edit/invoice_edit.dart';
import 'package:invoiceninja_flutter/redux/app/app_state.dart';
import 'package:invoiceninja_flutter/ui/app/snackbar_row.dart';
class InvoiceEditScreen extends StatelessWidget {
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_redux/flutter_redux.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/localization.dart';
import 'package:redux/redux.dart';

View File

@ -1,5 +1,6 @@
import 'package:flutter/foundation.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/product/product_list_item.dart';
import 'package:invoiceninja_flutter/ui/product/product_list_vm.dart';
@ -15,18 +16,18 @@ class ProductList extends StatelessWidget {
@override
Widget build(BuildContext context) {
if (! viewModel.isLoaded) {
if (!viewModel.isLoaded) {
return LoadingIndicator();
} else if (viewModel.productList.isEmpty) {
return Opacity(
opacity: 0.5,
child: Center(
child: Text(
AppLocalization.of(context).noRecordsFound,
style: TextStyle(
fontSize: 18.0,
),
child: Text(
AppLocalization.of(context).noRecordsFound,
style: TextStyle(
fontSize: 18.0,
),
),
),
);
}
@ -34,6 +35,32 @@ class ProductList extends StatelessWidget {
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) {
return RefreshIndicator(
onRefresh: () => viewModel.onRefreshed(context),
@ -49,7 +76,7 @@ class ProductList extends StatelessWidget {
onDismissed: (DismissDirection direction) =>
viewModel.onDismissed(context, product, direction),
onTap: () => viewModel.onProductTap(context, product),
onLongPress: () => viewModel.onProductLongPress(context, product),
onLongPress: () => _showMenu(context, product),
),
Divider(
height: 1.0,

View File

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

View File

@ -1,12 +1,8 @@
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import 'package:flutter_redux/flutter_redux.dart';
import 'package:invoiceninja_flutter/constants.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/localization.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) {
final Completer<Null> completer = Completer<String>();
final Completer<Null> completer = Completer<Null>();
completer.future.then((_) {
Navigator.of(context).pop(message);