Starter...

This commit is contained in:
Hillel Coren 2020-03-02 21:41:14 +02:00
parent e895d00981
commit 36a0fe56bc
3 changed files with 228 additions and 0 deletions

View File

@ -0,0 +1,97 @@
import 'dart:async';
import 'package:built_collection/built_collection.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_redux/flutter_redux.dart';
import 'package:invoiceninja_flutter/redux/app/app_actions.dart';
import 'package:invoiceninja_flutter/redux/ui/ui_actions.dart';
import 'package:invoiceninja_flutter/ui/credit/edit/credit_edit_vm.dart';
import 'package:invoiceninja_flutter/ui/invoice/edit/invoice_edit_desktop.dart';
import 'package:invoiceninja_flutter/ui/invoice/edit/invoice_edit_details.dart';
import 'package:invoiceninja_flutter/ui/invoice/edit/invoice_edit_details_vm.dart';
import 'package:redux/redux.dart';
import 'package:invoiceninja_flutter/redux/credit/credit_actions.dart';
import 'package:invoiceninja_flutter/data/models/models.dart';
import 'package:invoiceninja_flutter/redux/app/app_state.dart';
class CreditEditDetailsScreen extends StatelessWidget {
const CreditEditDetailsScreen({Key key}) : super(key: key);
@override
Widget build(BuildContext context) {
return StoreConnector<AppState, CreditEditDetailsVM>(
converter: (Store<AppState> store) {
return CreditEditDetailsVM.fromStore(store);
},
builder: (context, viewModel) {
if (viewModel.state.prefState.isDesktop) {
return InvoiceEditDesktop(
viewModel: viewModel,
key: ValueKey('__credit_${viewModel.invoice.id}__'),
entityType: EntityType.credit,
);
} else {
return InvoiceEditDetails(
viewModel: viewModel,
entityType: EntityType.credit,
);
}
},
);
}
}
class CreditEditDetailsVM extends EntityEditDetailsVM {
CreditEditDetailsVM({
AppState state,
CompanyEntity company,
InvoiceEntity invoice,
Function(InvoiceEntity) onChanged,
Function(InvoiceEntity, ClientEntity) onClientChanged,
BuiltMap<String, ClientEntity> clientMap,
BuiltList<String> clientList,
Function(BuildContext context, Completer<SelectableEntity> completer)
onAddClientPressed,
}) : super(
state: state,
company: company,
invoice: invoice,
onChanged: onChanged,
onClientChanged: onClientChanged,
clientMap: clientMap,
clientList: clientList,
onAddClientPressed: onAddClientPressed,
);
factory CreditEditDetailsVM.fromStore(Store<AppState> store) {
final AppState state = store.state;
final credit = state.creditUIState.editing;
return CreditEditDetailsVM(
state: state,
company: state.company,
invoice: credit,
onChanged: (InvoiceEntity credit) => store.dispatch(UpdateCredit(credit)),
clientMap: state.clientState.map,
clientList: state.clientState.list,
onClientChanged: (invoice, client) {
store.dispatch(UpdateCreditClient(client: client));
},
onAddClientPressed: (context, completer) {
createEntity(
context: context,
entity: ClientEntity(),
force: true,
completer: completer,
cancelCompleter: Completer<Null>()
..future.then((_) {
store.dispatch(UpdateCurrentRoute(CreditEditScreen.route));
}));
completer.future.then((SelectableEntity client) {
store.dispatch(UpdateCurrentRoute(CreditEditScreen.route));
});
},
);
}
}

View File

@ -0,0 +1,81 @@
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_redux/flutter_redux.dart';
import 'package:invoiceninja_flutter/ui/invoice/edit/invoice_edit_items.dart';
import 'package:invoiceninja_flutter/ui/invoice/edit/invoice_edit_items_desktop.dart';
import 'package:invoiceninja_flutter/ui/invoice/edit/invoice_edit_items_vm.dart';
import 'package:redux/redux.dart';
import 'package:invoiceninja_flutter/redux/credit/credit_actions.dart';
import 'package:invoiceninja_flutter/data/models/models.dart';
import 'package:invoiceninja_flutter/redux/app/app_state.dart';
class CreditEditItemsScreen extends StatelessWidget {
const CreditEditItemsScreen({
Key key,
}) : super(key: key);
@override
Widget build(BuildContext context) {
return StoreConnector<AppState, CreditEditItemsVM>(
converter: (Store<AppState> store) {
return CreditEditItemsVM.fromStore(store);
},
builder: (context, viewModel) {
if (viewModel.state.prefState.isDesktop) {
return InvoiceEditItemsDesktop(
viewModel: viewModel,
);
} else {
return InvoiceEditItems(
viewModel: viewModel,
);
}
},
);
}
}
class CreditEditItemsVM extends EntityEditItemsVM {
CreditEditItemsVM({
AppState state,
CompanyEntity company,
InvoiceEntity invoice,
int invoiceItemIndex,
Function addLineItem,
Function deleteLineItem,
Function(int) onRemoveInvoiceItemPressed,
Function onDoneInvoiceItemPressed,
Function(InvoiceItemEntity, int) onChangedInvoiceItem,
}) : super(
state: state,
company: company,
invoice: invoice,
addLineItem: addLineItem,
deleteLineItem: deleteLineItem,
invoiceItemIndex: invoiceItemIndex,
onRemoveInvoiceItemPressed: onRemoveInvoiceItemPressed,
onDoneInvoiceItemPressed: onDoneInvoiceItemPressed,
onChangedInvoiceItem: onChangedInvoiceItem,
);
factory CreditEditItemsVM.fromStore(Store<AppState> store) {
final AppState state = store.state;
final credit = state.creditUIState.editing;
return CreditEditItemsVM(
state: state,
company: state.company,
invoice: credit,
invoiceItemIndex: state.creditUIState.editingItemIndex,
onRemoveInvoiceItemPressed: (index) =>
store.dispatch(DeleteCreditItem(index)),
onDoneInvoiceItemPressed: () => store.dispatch(EditCreditItem()),
onChangedInvoiceItem: (creditItem, index) {
if (index == credit.lineItems.length) {
store.dispatch(AddCreditItem(creditItem: creditItem));
} else {
store.dispatch(UpdateCreditItem(creditItem: creditItem, index: index));
}
});
}
}

View File

@ -0,0 +1,50 @@
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_redux/flutter_redux.dart';
import 'package:invoiceninja_flutter/redux/credit/credit_actions.dart';
import 'package:invoiceninja_flutter/ui/invoice/edit/invoice_edit_notes.dart';
import 'package:invoiceninja_flutter/ui/invoice/edit/invoice_edit_notes_vm.dart';
import 'package:redux/redux.dart';
import 'package:invoiceninja_flutter/data/models/models.dart';
import 'package:invoiceninja_flutter/redux/app/app_state.dart';
class CreditEditNotesScreen extends StatelessWidget {
const CreditEditNotesScreen({Key key}) : super(key: key);
@override
Widget build(BuildContext context) {
return StoreConnector<AppState, CreditEditNotesVM>(
converter: (Store<AppState> store) {
return CreditEditNotesVM.fromStore(store);
},
builder: (context, viewModel) {
return InvoiceEditNotes(
viewModel: viewModel,
);
},
);
}
}
class CreditEditNotesVM extends EntityEditNotesVM {
CreditEditNotesVM({
CompanyEntity company,
InvoiceEntity invoice,
Function(InvoiceEntity) onChanged,
}) : super(
company: company,
invoice: invoice,
onChanged: onChanged,
);
factory CreditEditNotesVM.fromStore(Store<AppState> store) {
final AppState state = store.state;
final credit = state.creditUIState.editing;
return CreditEditNotesVM(
company: state.company,
invoice: credit,
onChanged: (InvoiceEntity credit) => store.dispatch(UpdateCredit(credit)),
);
}
}