This commit is contained in:
Hillel Coren 2018-08-31 17:20:18 -07:00
parent 2d1b3997b1
commit 5f7b656db6
5 changed files with 57 additions and 15 deletions

View File

@ -1,15 +1,16 @@
import 'package:flutter/material.dart';
import 'package:flutter_redux/flutter_redux.dart';
import 'package:invoiceninja_flutter/redux/app/app_state.dart'; import 'package:invoiceninja_flutter/redux/app/app_state.dart';
import 'package:memoize/memoize.dart'; import 'package:memoize/memoize.dart';
import 'package:built_collection/built_collection.dart'; import 'package:built_collection/built_collection.dart';
import 'package:invoiceninja_flutter/data/models/models.dart'; import 'package:invoiceninja_flutter/data/models/models.dart';
import 'package:invoiceninja_flutter/redux/ui/list_ui_state.dart'; import 'package:invoiceninja_flutter/redux/ui/list_ui_state.dart';
ClientEntity paymentClientSelector(int paymentId, BuildContext context) { InvoiceEntity paymentInvoiceSelector(int paymentId, AppState state) {
final state = StoreProvider.of<AppState>(context).state;
final payment = state.paymentState.map[paymentId]; final payment = state.paymentState.map[paymentId];
final invoice = state.invoiceState.map[payment.invoiceId]; return state.invoiceState.map[payment.invoiceId];
}
ClientEntity paymentClientSelector(int paymentId, AppState state) {
final invoice = paymentInvoiceSelector(paymentId, state);
return state.clientState.map[invoice.clientId]; return state.clientState.map[invoice.clientId];
} }

View File

@ -26,9 +26,9 @@ class PaymentEditScreen extends StatelessWidget {
converter: (Store<AppState> store) { converter: (Store<AppState> store) {
return PaymentEditVM.fromStore(store); return PaymentEditVM.fromStore(store);
}, },
builder: (context, vm) { builder: (context, viewModel) {
return PaymentEdit( return PaymentEdit(
viewModel: vm, viewModel: viewModel,
); );
}, },
); );

View File

@ -1,5 +1,8 @@
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:font_awesome_flutter/font_awesome_flutter.dart';
import 'package:invoiceninja_flutter/redux/app/app_state.dart';
import 'package:invoiceninja_flutter/redux/payment/payment_selectors.dart'; import 'package:invoiceninja_flutter/redux/payment/payment_selectors.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/icon_message.dart'; import 'package:invoiceninja_flutter/ui/app/icon_message.dart';
@ -26,6 +29,9 @@ class _PaymentViewState extends State<PaymentView> {
Widget build(BuildContext context) { Widget build(BuildContext context) {
final viewModel = widget.viewModel; final viewModel = widget.viewModel;
final payment = viewModel.payment; final payment = viewModel.payment;
final state = StoreProvider.of<AppState>(context).state;
final client = paymentClientSelector(payment.id, state);
final invoice = paymentInvoiceSelector(payment.id, state);
final localization = AppLocalization.of(context); final localization = AppLocalization.of(context);
return Scaffold( return Scaffold(
@ -54,18 +60,41 @@ class _PaymentViewState extends State<PaymentView> {
? TwoValueHeader( ? TwoValueHeader(
label1: localization.amount, label1: localization.amount,
value1: formatNumber(payment.amount, context, value1: formatNumber(payment.amount, context,
clientId: clientId: client.id),
paymentClientSelector(payment.id, context).id),
label2: localization.refunded, label2: localization.refunded,
value2: formatNumber(payment.refunded, context, value2: formatNumber(payment.refunded, context,
clientId: clientId: client.id),
paymentClientSelector(payment.id, context).id),
) )
: OneValueHeader( : OneValueHeader(
label: localization.amount, label: localization.amount,
value: formatNumber(payment.amount, context, value: formatNumber(payment.amount, context,
clientId: clientId: client.id),
paymentClientSelector(payment.id, context).id), ),
Material(
color: Theme.of(context).canvasColor,
child: ListTile(
title: Text(client.displayName ?? ''),
leading: Icon(FontAwesomeIcons.users, size: 18.0),
trailing: Icon(Icons.navigate_next),
onTap: () => viewModel.onTapClient(context),
),
),
Container(
color: Theme.of(context).backgroundColor,
height: 12.0,
),
Material(
color: Theme.of(context).canvasColor,
child: ListTile(
title: Text('${localization.invoice} ${invoice.invoiceNumber}'),
leading: Icon(FontAwesomeIcons.filePdfO, size: 18.0),
trailing: Icon(Icons.navigate_next),
onTap: () => viewModel.onTapInvoice(context),
),
),
Container(
color: Theme.of(context).backgroundColor,
height: 12.0,
), ),
payment.privateNotes != null && payment.privateNotes.isNotEmpty payment.privateNotes != null && payment.privateNotes.isNotEmpty
? IconMessage(payment.privateNotes) ? IconMessage(payment.privateNotes)

View File

@ -1,5 +1,8 @@
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:invoiceninja_flutter/redux/client/client_actions.dart';
import 'package:invoiceninja_flutter/redux/invoice/invoice_actions.dart';
import 'package:invoiceninja_flutter/redux/payment/payment_selectors.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';
@ -35,6 +38,8 @@ class PaymentViewVM {
final CompanyEntity company; final CompanyEntity company;
final Function(BuildContext, EntityAction) onActionSelected; final Function(BuildContext, EntityAction) onActionSelected;
final Function(BuildContext) onEditPressed; final Function(BuildContext) onEditPressed;
final Function(BuildContext) onTapInvoice;
final Function(BuildContext) onTapClient;
final bool isSaving; final bool isSaving;
final bool isLoading; final bool isLoading;
final bool isDirty; final bool isDirty;
@ -44,6 +49,8 @@ class PaymentViewVM {
@required this.company, @required this.company,
@required this.onActionSelected, @required this.onActionSelected,
@required this.onEditPressed, @required this.onEditPressed,
@required this.onTapClient,
@required this.onTapInvoice,
@required this.isSaving, @required this.isSaving,
@required this.isLoading, @required this.isLoading,
@required this.isDirty, @required this.isDirty,
@ -52,6 +59,7 @@ class PaymentViewVM {
factory PaymentViewVM.fromStore(Store<AppState> store) { factory PaymentViewVM.fromStore(Store<AppState> store) {
final state = store.state; final state = store.state;
final payment = state.paymentState.map[state.paymentUIState.selectedId]; final payment = state.paymentState.map[state.paymentUIState.selectedId];
final client = paymentClientSelector(payment.id, state);
return PaymentViewVM( return PaymentViewVM(
company: state.selectedCompany, company: state.selectedCompany,
@ -62,6 +70,10 @@ class PaymentViewVM {
onEditPressed: (BuildContext context) { onEditPressed: (BuildContext context) {
store.dispatch(EditPayment(payment: payment, context: context)); store.dispatch(EditPayment(payment: payment, context: context));
}, },
onTapClient: (context) =>
store.dispatch(ViewClient(clientId: client.id, context: context)),
onTapInvoice: (context) => store.dispatch(
ViewInvoice(invoiceId: payment.invoiceId, context: context)),
onActionSelected: (BuildContext context, EntityAction action) { onActionSelected: (BuildContext context, EntityAction action) {
final localization = AppLocalization.of(context); final localization = AppLocalization.of(context);
switch (action) { switch (action) {

View File

@ -21,9 +21,9 @@ class StubEditScreen extends StatelessWidget {
converter: (Store<AppState> store) { converter: (Store<AppState> store) {
return StubEditVM.fromStore(store); return StubEditVM.fromStore(store);
}, },
builder: (context, vm) { builder: (context, viewModel) {
return StubEdit( return StubEdit(
viewModel: vm, viewModel: viewModel,
); );
}, },
); );