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/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';
|
||||||
|
|
|
||||||
|
|
@ -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';
|
||||||
|
|
|
||||||
|
|
@ -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';
|
||||||
|
|
|
||||||
|
|
@ -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,18 +16,18 @@ 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(
|
||||||
opacity: 0.5,
|
opacity: 0.5,
|
||||||
child: Center(
|
child: Center(
|
||||||
child: Text(
|
child: Text(
|
||||||
AppLocalization.of(context).noRecordsFound,
|
AppLocalization.of(context).noRecordsFound,
|
||||||
style: TextStyle(
|
style: TextStyle(
|
||||||
fontSize: 18.0,
|
fontSize: 18.0,
|
||||||
),
|
|
||||||
),
|
),
|
||||||
|
),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
|
|
@ -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) =>
|
Navigator.of(context).pop();
|
||||||
SimpleDialog(children: <Widget>[
|
store.dispatch(
|
||||||
ListTile(
|
EditProduct(context: context, product: product.clone));
|
||||||
leading: Icon(Icons.control_point_duplicate),
|
break;
|
||||||
title: Text(AppLocalization.of(context).clone),
|
case EntityAction.archive:
|
||||||
onTap: () {
|
store.dispatch(ArchiveProductRequest(
|
||||||
Navigator.of(context).pop();
|
popCompleter(context,
|
||||||
store.dispatch(EditProduct(
|
AppLocalization.of(context).successfullyArchivedProduct),
|
||||||
context: context, product: product.clone));
|
product.id));
|
||||||
},
|
break;
|
||||||
),
|
case EntityAction.delete:
|
||||||
Divider(),
|
store.dispatch(DeleteProductRequest(
|
||||||
ListTile(
|
popCompleter(context,
|
||||||
leading: Icon(Icons.archive),
|
AppLocalization.of(context).successfullyDeletedProduct),
|
||||||
title: Text(AppLocalization.of(context).archive),
|
product.id));
|
||||||
onTap: () => store.dispatch(ArchiveProductRequest(
|
break;
|
||||||
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,
|
|
||||||
)));
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
onRefreshed: (context) => _handleRefresh(context),
|
onRefreshed: (context) => _handleRefresh(context),
|
||||||
|
|
|
||||||
|
|
@ -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';
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue