Refactor
This commit is contained in:
parent
85ea508ef4
commit
58d9dc8fc8
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -110,6 +110,7 @@ class _InvoiceEditState extends State<InvoiceEdit>
|
|||
context: context,
|
||||
builder: (BuildContext context) {
|
||||
return InvoiceItemSelector(
|
||||
productMap: viewModel.productMap,
|
||||
onItemsSelected: viewModel.onItemsAdded,
|
||||
);
|
||||
});
|
||||
|
|
|
|||
|
|
@ -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: () =>
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
Loading…
Reference in New Issue