This commit is contained in:
unknown 2018-07-05 12:35:09 +03:00
parent 85ea508ef4
commit 58d9dc8fc8
19 changed files with 114 additions and 33 deletions

View File

@ -2,6 +2,7 @@ import 'package:built_collection/built_collection.dart';
import 'package:built_value/built_value.dart';
import 'package:built_value/serializer.dart';
import 'package:invoiceninja/data/models/entities.dart';
import 'package:invoiceninja/utils/formatting.dart';
part 'client_model.g.dart';
@ -288,7 +289,10 @@ abstract class ClientEntity extends Object
}
@override
double get listDisplayAmount => 0.0;
double get listDisplayAmount => null;
@override
FormatNumberType get listDisplayAmountType => FormatNumberType.money;
static Serializer<ClientEntity> get serializer => _$clientEntitySerializer;
}
@ -395,7 +399,10 @@ abstract class ContactEntity extends Object
}
@override
double get listDisplayAmount => 0.0;
double get listDisplayAmount => null;
@override
FormatNumberType get listDisplayAmountType => FormatNumberType.money;
static Serializer<ContactEntity> get serializer => _$contactEntitySerializer;
}

View File

@ -2,6 +2,7 @@ import 'package:built_collection/built_collection.dart';
import 'package:built_value/built_value.dart';
import 'package:built_value/serializer.dart';
import 'package:invoiceninja/data/models/entities.dart';
import 'package:invoiceninja/utils/formatting.dart';
part 'credit_model.g.dart';
@ -122,7 +123,10 @@ abstract class CreditEntity extends Object with BaseEntity implements Built<Cred
}
@override
double get listDisplayAmount => 0.0;
double get listDisplayAmount => null;
@override
FormatNumberType get listDisplayAmountType => FormatNumberType.money;
static Serializer<CreditEntity> get serializer => _$creditEntitySerializer;
}

View File

@ -2,6 +2,7 @@ import 'package:built_collection/built_collection.dart';
import 'package:built_value/built_value.dart';
import 'package:built_value/serializer.dart';
import 'package:invoiceninja/data/models/models.dart';
import 'package:invoiceninja/utils/formatting.dart';
part 'entities.g.dart';
@ -65,7 +66,8 @@ abstract class SelectableEntity {
String get listDisplayName => 'Error: listDisplayName not set';
double get listDisplayAmount => 0.0;
double get listDisplayAmount => null;
FormatNumberType get listDisplayAmountType => FormatNumberType.money;
}
abstract class BaseEntity extends Object with SelectableEntity {

View File

@ -2,6 +2,7 @@ import 'package:built_collection/built_collection.dart';
import 'package:built_value/built_value.dart';
import 'package:built_value/serializer.dart';
import 'package:invoiceninja/data/models/entities.dart';
import 'package:invoiceninja/utils/formatting.dart';
part 'expense_model.g.dart';
@ -198,7 +199,10 @@ abstract class ExpenseEntity extends Object
}
@override
double get listDisplayAmount => 0.0;
double get listDisplayAmount => null;
@override
FormatNumberType get listDisplayAmountType => FormatNumberType.money;
static Serializer<ExpenseEntity> get serializer => _$expenseEntitySerializer;
}
@ -235,7 +239,10 @@ abstract class ExpenseCategoryEntity extends Object
}
@override
double get listDisplayAmount => 0.0;
double get listDisplayAmount => null;
@override
FormatNumberType get listDisplayAmountType => FormatNumberType.money;
String get name;

View File

@ -336,7 +336,10 @@ abstract class InvoiceEntity extends Object with BaseEntity, CalculateInvoiceTot
}
@override
double get listDisplayAmount => 0.0;
double get listDisplayAmount => null;
@override
FormatNumberType get listDisplayAmountType => FormatNumberType.money;
bool get isPastDue {
return ! isDeleted && isPublic && balance > 0 && DateTime.tryParse(dueDate).isBefore(DateTime.now());
@ -433,7 +436,10 @@ abstract class InvoiceItemEntity extends Object with BaseEntity implements Built
}
@override
double get listDisplayAmount => 0.0;
double get listDisplayAmount => null;
@override
FormatNumberType get listDisplayAmountType => FormatNumberType.money;
static Serializer<InvoiceItemEntity> get serializer => _$invoiceItemEntitySerializer;
}
@ -493,7 +499,10 @@ abstract class InvitationEntity extends Object with BaseEntity implements Built<
}
@override
double get listDisplayAmount => 0.0;
double get listDisplayAmount => null;
@override
FormatNumberType get listDisplayAmountType => FormatNumberType.money;
static Serializer<InvitationEntity> get serializer => _$invitationEntitySerializer;
}

View File

@ -2,6 +2,7 @@ import 'package:built_collection/built_collection.dart';
import 'package:built_value/built_value.dart';
import 'package:built_value/serializer.dart';
import 'package:invoiceninja/data/models/entities.dart';
import 'package:invoiceninja/utils/formatting.dart';
part 'payment_model.g.dart';
@ -133,7 +134,10 @@ abstract class PaymentEntity extends Object with BaseEntity implements Built<Pay
}
@override
double get listDisplayAmount => 0.0;
double get listDisplayAmount => null;
@override
FormatNumberType get listDisplayAmountType => FormatNumberType.money;
static Serializer<PaymentEntity> get serializer => _$paymentEntitySerializer;
}

View File

@ -3,6 +3,7 @@ import 'package:built_value/built_value.dart';
import 'package:built_value/serializer.dart';
import 'package:invoiceninja/data/models/entities.dart';
import 'package:invoiceninja/data/models/invoice_model.dart';
import 'package:invoiceninja/utils/formatting.dart';
part 'product_model.g.dart';
@ -102,6 +103,9 @@ abstract class ProductEntity extends Object
@override
double get listDisplayAmount => cost;
@override
FormatNumberType get listDisplayAmountType => FormatNumberType.money;
@override
InvoiceItemEntity get asInvoiceItem {
return InvoiceItemEntity().rebuild((b) => b

View File

@ -2,6 +2,7 @@ import 'package:built_collection/built_collection.dart';
import 'package:built_value/built_value.dart';
import 'package:built_value/serializer.dart';
import 'package:invoiceninja/data/models/entities.dart';
import 'package:invoiceninja/utils/formatting.dart';
part 'project_model.g.dart';
@ -131,7 +132,10 @@ abstract class ProjectEntity extends Object with BaseEntity implements Built<Pro
}
@override
double get listDisplayAmount => 0.0;
double get listDisplayAmount => null;
@override
FormatNumberType get listDisplayAmountType => FormatNumberType.money;
static Serializer<ProjectEntity> get serializer => _$projectEntitySerializer;
}

View File

@ -182,7 +182,7 @@ abstract class CountryEntity extends Object with SelectableEntity implements Bui
}
@override
double get listDisplayAmount => 0.0;
double get listDisplayAmount => null;
static Serializer<CountryEntity> get serializer => _$countryEntitySerializer;
}

View File

@ -113,7 +113,7 @@ abstract class CurrencyEntity extends Object with SelectableEntity implements Bu
}
@override
double get listDisplayAmount => 0.0;
double get listDisplayAmount => null;
static Serializer<CurrencyEntity> get serializer => _$currencyEntitySerializer;
}

View File

@ -83,7 +83,7 @@ abstract class LanguageEntity extends Object with SelectableEntity implements Bu
}
@override
double get listDisplayAmount => 0.0;
double get listDisplayAmount => null;
static Serializer<LanguageEntity> get serializer => _$languageEntitySerializer;
}

View File

@ -2,6 +2,7 @@ import 'package:built_collection/built_collection.dart';
import 'package:built_value/built_value.dart';
import 'package:built_value/serializer.dart';
import 'package:invoiceninja/data/models/entities.dart';
import 'package:invoiceninja/utils/formatting.dart';
part 'task_model.g.dart';
@ -136,7 +137,10 @@ abstract class TaskEntity extends Object with BaseEntity implements Built<TaskEn
}
@override
double get listDisplayAmount => 0.0;
double get listDisplayAmount => null;
@override
FormatNumberType get listDisplayAmountType => FormatNumberType.money;
static Serializer<TaskEntity> get serializer => _$taskEntitySerializer;
}

View File

@ -2,6 +2,7 @@ import 'package:built_collection/built_collection.dart';
import 'package:built_value/built_value.dart';
import 'package:built_value/serializer.dart';
import 'package:invoiceninja/data/models/entities.dart';
import 'package:invoiceninja/utils/formatting.dart';
part 'vendor_model.g.dart';
@ -177,7 +178,10 @@ abstract class VendorEntity extends Object with BaseEntity implements Built<Vend
}
@override
double get listDisplayAmount => 0.0;
double get listDisplayAmount => null;
@override
FormatNumberType get listDisplayAmountType => FormatNumberType.money;
static Serializer<VendorEntity> get serializer => _$vendorEntitySerializer;
}
@ -238,7 +242,10 @@ abstract class VendorContactEntity extends Object with BaseEntity implements Bui
}
@override
double get listDisplayAmount => 0.0;
double get listDisplayAmount => null;
@override
FormatNumberType get listDisplayAmountType => FormatNumberType.money;
static Serializer<VendorContactEntity> get serializer => _$vendorContactEntitySerializer;
}

View File

@ -3,7 +3,19 @@ import 'package:built_collection/built_collection.dart';
import 'package:invoiceninja/data/models/models.dart';
import 'package:invoiceninja/redux/ui/list_ui_state.dart';
var memoizedProductList = memo3((
var memoizedProductList = memo1((BuiltMap<int, ProductEntity> productMap) =>
productList(productMap));
List<int> productList(BuiltMap<int, ProductEntity> productMap) {
final list = productMap.keys.where((productId) => productMap[productId].isActive).toList();
list.sort((idA, idB) => productMap[idA].listDisplayName
.compareTo(productMap[idB].listDisplayName));
return list;
}
var memoizedFilteredProductList = memo3((
BuiltMap<int, ProductEntity> productMap,
BuiltList<int> productList,
ListUIState productListState) => visibleProductsSelector(productMap, productList, productListState)

View File

@ -1,6 +1,7 @@
import 'package:built_collection/built_collection.dart';
import 'package:flutter/material.dart';
import 'package:invoiceninja/data/models/models.dart';
import 'package:invoiceninja/utils/formatting.dart';
import 'package:invoiceninja/utils/localization.dart';
class EntityDropdown extends StatefulWidget {
@ -149,6 +150,10 @@ class _EntityDropdownDialogState extends State<EntityDropdownDialog> {
Expanded(
child: Text(entity.listDisplayName),
),
entity.listDisplayAmount != null
? Text(formatNumber(entity.listDisplayAmount, context,
formatNumberType: entity.listDisplayAmountType))
: Container(),
],
),
subtitle: subtitle != null ? Text(subtitle, maxLines: 2) : null,

View File

@ -110,6 +110,7 @@ class _InvoiceEditState extends State<InvoiceEdit>
context: context,
builder: (BuildContext context) {
return InvoiceItemSelector(
productMap: viewModel.productMap,
onItemsSelected: viewModel.onItemsAdded,
);
});

View File

@ -1,4 +1,5 @@
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';
@ -37,6 +38,7 @@ class InvoiceEditVM {
final CompanyEntity company;
final InvoiceEntity invoice;
final InvoiceEntity origInvoice;
final BuiltMap<int, ProductEntity> productMap;
final Function(BuildContext) onSavePressed;
final Function(BuildContext, EntityAction) onActionSelected;
final Function(List<InvoiceItemEntity>) onItemsAdded;
@ -47,6 +49,7 @@ class InvoiceEditVM {
@required this.company,
@required this.invoice,
@required this.origInvoice,
@required this.productMap,
@required this.onSavePressed,
@required this.onItemsAdded,
@required this.onBackPressed,
@ -61,6 +64,7 @@ class InvoiceEditVM {
return InvoiceEditVM(
company: state.selectedCompany,
isLoading: state.isLoading,
productMap: state.selectedCompanyState.productState.map,
invoice: invoice,
origInvoice: store.state.invoiceState.map[invoice.id],
onBackPressed: () =>

View File

@ -1,12 +1,18 @@
import 'package:built_collection/built_collection.dart';
import 'package:invoiceninja/data/models/invoice_model.dart';
import 'package:invoiceninja/redux/app/app_state.dart';
import 'package:invoiceninja/data/models/models.dart';
import 'package:invoiceninja/redux/product/product_selectors.dart';
import 'package:flutter/material.dart';
import 'package:invoiceninja/utils/formatting.dart';
import 'package:invoiceninja/utils/localization.dart';
class InvoiceItemSelector extends StatefulWidget {
const InvoiceItemSelector({this.state, this.onItemsSelected});
const InvoiceItemSelector({
@required this.productMap,
this.onItemsSelected,
});
final AppState state;
final BuiltMap<int, ProductEntity> productMap;
final Function(List<InvoiceItemEntity>) onItemsSelected;
@override
@ -35,7 +41,7 @@ class _InvoiceItemSelectorState extends State<InvoiceItemSelector> {
final List<InvoiceItemEntity> items = [];
_selectedIds.forEach((entityId) {
final product = widget.state.productState.map[entityId];
final product = widget.productMap[entityId];
items.add(product.asInvoiceItem);
});
@ -130,22 +136,20 @@ class _InvoiceItemSelectorState extends State<InvoiceItemSelector> {
}
Widget _entityList() {
final state = widget.state.selectedCompanyState.productState;
final matches = state.list
.where((entityId) {
final entity = state.map[entityId];
final matches = memoizedProductList(widget.productMap).where((entityId) {
final entity = widget.productMap[entityId];
return entity.isActive && entity.matchesSearch(_filter);
})
.toList();
}).toList();
matches.sort((idA, idB) => state.map[idA].compareTo(state.map[idB]));
matches.sort((idA, idB) =>
widget.productMap[idA].compareTo(widget.productMap[idB]));
return ListView.builder(
shrinkWrap: true,
itemCount: matches.length,
itemBuilder: (BuildContext context, int index) {
final int entityId = matches[index];
final entity = state.map[entityId];
final entity = widget.productMap[entityId];
final String subtitle = entity.matchesSearchValue(_filter);
return ListTile(
dense: true,
@ -158,7 +162,10 @@ class _InvoiceItemSelectorState extends State<InvoiceItemSelector> {
Expanded(
child: Text(entity.listDisplayName),
),
//Text(entity.listDisplayAmount),
entity.listDisplayAmount != null
? Text(formatNumber(entity.listDisplayAmount, context,
formatNumberType: entity.listDisplayAmountType))
: Container(),
],
),
subtitle: subtitle != null ? Text(subtitle, maxLines: 2) : null,

View File

@ -64,7 +64,7 @@ class ProductListVM {
}
return ProductListVM(
productList: memoizedProductList(store.state.productState.map, store.state.productState.list, store.state.productListState),
productList: memoizedFilteredProductList(store.state.productState.map, store.state.productState.list, store.state.productListState),
productMap: store.state.productState.map,
isLoading: store.state.isLoading,
isLoaded: store.state.productState.isLoaded,