This commit is contained in:
unknown 2018-06-17 07:50:46 -07:00
parent 7fff37fd3b
commit 2257c32422
9 changed files with 38 additions and 18 deletions

View File

@ -37,6 +37,8 @@ class PersistenceRepository {
}
}
/*
AppState _deserialize(String data) {
return serializers.deserializeWith(AppState.serializer, json.decode(data));
}
*/

View File

@ -6,6 +6,7 @@ import 'package:invoiceninja/redux/client/client_actions.dart';
import 'package:invoiceninja/redux/client/client_middleware.dart';
import 'package:invoiceninja/redux/invoice/invoice_actions.dart';
import 'package:invoiceninja/ui/client/client_screen.dart';
import 'package:invoiceninja/ui/product/edit/product_edit_vm.dart';
import 'package:redux/redux.dart';
import 'package:invoiceninja/utils/localization.dart';
import 'package:invoiceninja/ui/auth/login_vm.dart';
@ -95,6 +96,7 @@ class _InvoiceNinjaAppState extends State<InvoiceNinjaApp> {
widget.store.dispatch(LoadProductsAction());
return ProductScreen();
},
ProductEditScreen.route: (context) => ProductEditScreen(),
ClientScreen.route: (context) {
widget.store.dispatch(LoadClientsAction());
return ClientScreen();

View File

@ -1,5 +1,5 @@
import 'dart:async';
import 'package:flutter/widgets.dart';
import 'package:invoiceninja/data/models/models.dart';
import 'package:built_collection/built_collection.dart';
@ -32,9 +32,10 @@ class LoadProductsSuccess {
}
}
class SelectProductAction {
class EditProductAction {
final ProductEntity product;
SelectProductAction(this.product);
final BuildContext context;
EditProductAction({this.product, this.context});
}
class SaveProductRequest {

View File

@ -1,5 +1,8 @@
import 'package:flutter/material.dart';
import 'package:invoiceninja/data/models/models.dart';
import 'package:invoiceninja/redux/client/client_actions.dart';
import 'package:invoiceninja/redux/ui/ui_actions.dart';
import 'package:invoiceninja/ui/product/edit/product_edit_vm.dart';
import 'package:redux/redux.dart';
import 'package:invoiceninja/redux/product/product_actions.dart';
import 'package:invoiceninja/redux/app/app_state.dart';
@ -13,6 +16,7 @@ List<Middleware<AppState>> createStoreProductsMiddleware([
final archiveProduct = _archiveProduct(repository);
final deleteProduct = _deleteProduct(repository);
final restoreProduct = _restoreProduct(repository);
final editProduct = _editProduct();
return [
TypedMiddleware<AppState, LoadProductsAction>(loadProducts),
@ -20,9 +24,19 @@ List<Middleware<AppState>> createStoreProductsMiddleware([
TypedMiddleware<AppState, ArchiveProductRequest>(archiveProduct),
TypedMiddleware<AppState, DeleteProductRequest>(deleteProduct),
TypedMiddleware<AppState, RestoreProductRequest>(restoreProduct),
TypedMiddleware<AppState, EditProductAction>(editProduct),
];
}
Middleware<AppState> _editProduct() {
return (Store<AppState> store, action, NextDispatcher next) {
next(action);
store.dispatch(UpdateCurrentRoute(ProductEditScreen.route));
Navigator.of(action.context).pushReplacementNamed(ProductEditScreen.route);
};
}
Middleware<AppState> _archiveProduct(ProductRepository repository) {
return (Store<AppState> store, action, NextDispatcher next) {
var origProduct = store.state.productState.map[action.productId];
@ -106,7 +120,6 @@ Middleware<AppState> _saveProduct(ProductRepository repository) {
Middleware<AppState> _loadProducts(ProductRepository repository) {
return (Store<AppState> store, action, NextDispatcher next) {
AppState state = store.state;
if (!state.productState.isStale && !action.force) {
@ -120,9 +133,7 @@ Middleware<AppState> _loadProducts(ProductRepository repository) {
}
store.dispatch(LoadProductsRequest());
repository
.loadList(state.selectedCompany, state.authState)
.then((data) {
repository.loadList(state.selectedCompany, state.authState).then((data) {
store.dispatch(LoadProductsSuccess(data));
if (action.completer != null) {
action.completer.complete(null);

View File

@ -47,7 +47,7 @@ final productsReducer = combineReducers<ProductState>([
TypedReducer<ProductState, AddProductSuccess>(_addProduct),
TypedReducer<ProductState, LoadProductsSuccess>(_setLoadedProducts),
TypedReducer<ProductState, LoadProductsFailure>(_setNoProducts),
TypedReducer<ProductState, SelectProductAction>(_selectProduct),
TypedReducer<ProductState, EditProductAction>(_selectProduct),
TypedReducer<ProductState, ArchiveProductRequest>(_archiveProductRequest),
TypedReducer<ProductState, ArchiveProductSuccess>(_archiveProductSuccess),
@ -163,7 +163,7 @@ ProductState _setNoProducts(
}
ProductState _selectProduct(
ProductState productState, SelectProductAction action) {
ProductState productState, EditProductAction action) {
return productState.rebuild((b) => b
..editing.replace(action.product));
}

View File

@ -0,0 +1,4 @@
class UpdateCurrentRoute {
final String route;
UpdateCurrentRoute(this.route);
}

View File

@ -11,6 +11,7 @@ import 'package:invoiceninja/redux/app/app_state.dart';
import 'package:invoiceninja/ui/app/snackbar_row.dart';
class ProductEditScreen extends StatelessWidget {
static final String route = '/products/edit';
ProductEditScreen({Key key}) : super(key: key);
@override

View File

@ -69,10 +69,7 @@ class ProductListVM {
isLoading: store.state.isLoading,
isLoaded: store.state.productState.isLoaded,
onProductTap: (context, product) {
store.dispatch(SelectProductAction(product));
Navigator
.of(context)
.push(MaterialPageRoute(builder: (_) => ProductEditScreen()));
store.dispatch(EditProductAction(product: product, context: context));
},
onRefreshed: (context) => _handleRefresh(context),
onDismissed: (BuildContext context, ProductEntity product,

View File

@ -1,3 +1,4 @@
import 'package:invoiceninja/redux/ui/ui_actions.dart';
import 'package:invoiceninja/ui/app/app_search.dart';
import 'package:invoiceninja/ui/app/app_search_button.dart';
import 'package:invoiceninja/ui/product/edit/product_edit_vm.dart';
@ -55,12 +56,13 @@ class ProductScreen extends StatelessWidget {
floatingActionButton: FloatingActionButton(
backgroundColor: Theme.of(context).primaryColorDark,
onPressed: () {
store.dispatch(SelectProductAction(ProductEntity()));
Navigator
.of(context)
.push(MaterialPageRoute(builder: (_) => ProductEditScreen()));
store.dispatch(
EditProductAction(product: ProductEntity(), context: context));
},
child: Icon(Icons.add,color: Colors.white,),
child: Icon(
Icons.add,
color: Colors.white,
),
tooltip: localization.newProduct,
),
);