Refactor
This commit is contained in:
parent
01fd67b9d0
commit
fd1484a6d1
|
|
@ -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';
|
||||
|
|
|
|||
|
|
@ -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';
|
||||
|
|
|
|||
|
|
@ -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';
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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),
|
||||
|
|
|
|||
|
|
@ -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';
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Reference in New Issue