Working on products

This commit is contained in:
Hillel Coren 2019-07-15 14:03:45 +03:00
parent 6698c5f097
commit a92ca3bad5
2 changed files with 74 additions and 10 deletions

View File

@ -1,8 +1,12 @@
import 'dart:async';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_redux/flutter_redux.dart'; import 'package:flutter_redux/flutter_redux.dart';
import 'package:invoiceninja_flutter/redux/ui/ui_actions.dart'; import 'package:invoiceninja_flutter/redux/ui/ui_actions.dart';
import 'package:invoiceninja_flutter/ui/app/dialogs/error_dialog.dart';
import 'package:invoiceninja_flutter/ui/product/product_screen.dart'; import 'package:invoiceninja_flutter/ui/product/product_screen.dart';
import 'package:invoiceninja_flutter/ui/product/view/product_view_vm.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';
@ -63,13 +67,27 @@ class ProductEditVM {
} }
}, },
onSavePressed: (BuildContext context) { onSavePressed: (BuildContext context) {
store.dispatch(SaveProductRequest( final Completer<ProductEntity> completer =
completer: snackBarCompleter( new Completer<ProductEntity>();
context, store.dispatch(
product.isNew SaveProductRequest(completer: completer, product: product));
? AppLocalization.of(context).createdProduct return completer.future.then((_) {
: AppLocalization.of(context).updatedProduct), return completer.future.then((savedProduct) {
product: product)); store.dispatch(UpdateCurrentRoute(ProductViewScreen.route));
if (product.isNew) {
Navigator.of(context)
.pushReplacementNamed(ProductViewScreen.route);
} else {
Navigator.of(context).pop(savedProduct);
}
}).catchError((Object error) {
showDialog<ErrorDialog>(
context: context,
builder: (BuildContext context) {
return ErrorDialog(error);
});
});
});
}, },
onEntityAction: (BuildContext context, EntityAction action) { onEntityAction: (BuildContext context, EntityAction action) {
// TODO Add view page for products // TODO Add view page for products

View File

@ -1,10 +1,14 @@
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_redux/flutter_redux.dart'; import 'package:flutter_redux/flutter_redux.dart';
import 'package:invoiceninja_flutter/data/models/entities.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/FieldGrid.dart';
import 'package:invoiceninja_flutter/ui/app/actions_menu_button.dart'; import 'package:invoiceninja_flutter/ui/app/actions_menu_button.dart';
import 'package:invoiceninja_flutter/ui/app/buttons/edit_icon_button.dart'; import 'package:invoiceninja_flutter/ui/app/buttons/edit_icon_button.dart';
import 'package:invoiceninja_flutter/ui/app/one_value_header.dart';
import 'package:invoiceninja_flutter/ui/product/view/product_view_vm.dart'; import 'package:invoiceninja_flutter/ui/product/view/product_view_vm.dart';
import 'package:invoiceninja_flutter/utils/formatting.dart';
import 'package:invoiceninja_flutter/utils/localization.dart'; import 'package:invoiceninja_flutter/utils/localization.dart';
class ProductView extends StatefulWidget { class ProductView extends StatefulWidget {
@ -38,11 +42,38 @@ class _ProductViewState extends State<ProductView>
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final localization = AppLocalization.of(context); final localization = AppLocalization.of(context);
final store = StoreProvider.of<AppState>(context);
final viewModel = widget.viewModel; final viewModel = widget.viewModel;
final product = viewModel.product; final product = viewModel.product;
final company = viewModel.company; final company = viewModel.company;
final user = company.user;
String tax = '';
if (product.taxName1.isNotEmpty) {
tax += formatNumber(product.taxRate1, context,
formatNumberType: FormatNumberType.percent) +
' ' +
product.taxName1;
}
if (product.taxName2.isNotEmpty) {
tax += ' ' +
formatNumber(product.taxRate2, context,
formatNumberType: FormatNumberType.percent) +
' ' +
product.taxName2;
}
final fields = <String, String>{
localization.tax: tax,
};
if (product.customValue1.isNotEmpty) {
final label1 = company.getCustomFieldLabel(CustomFieldType.product1);
fields[label1] = product.customValue1;
}
if (product.customValue2.isNotEmpty) {
final label2 = company.getCustomFieldLabel(CustomFieldType.product2);
fields[label2] = product.customValue2;
}
return WillPopScope( return WillPopScope(
onWillPop: () async { onWillPop: () async {
@ -53,7 +84,22 @@ class _ProductViewState extends State<ProductView>
appBar: _CustomAppBar( appBar: _CustomAppBar(
viewModel: viewModel, viewModel: viewModel,
), ),
body: Text('test'), body: ListView(
children: <Widget>[
OneValueHeader(
label: localization.cost,
value: formatNumber(product.cost, context),
),
FieldGrid(fields),
Divider(
height: 1.0,
),
Padding(
padding: EdgeInsets.all(16),
child: Text(product.notes),
),
],
),
), ),
); );
} }