Line item fixes

This commit is contained in:
Hillel Coren 2019-11-10 17:00:11 +02:00
parent 4e22a59942
commit d7d9b07f13
20 changed files with 127 additions and 361 deletions

View File

@ -512,13 +512,10 @@ abstract class InvoiceEntity extends Object
static Serializer<InvoiceEntity> get serializer => _$invoiceEntitySerializer;
}
abstract class InvoiceItemEntity extends Object
with BaseEntity, SelectableEntity
abstract class InvoiceItemEntity
implements Built<InvoiceItemEntity, InvoiceItemEntityBuilder> {
factory InvoiceItemEntity({String productKey, double quantity}) {
return _$InvoiceItemEntity._(
id: BaseEntity.nextId,
isChanged: false,
productKey: productKey ?? '',
notes: '',
cost: 0.0,
@ -533,19 +530,11 @@ abstract class InvoiceItemEntity extends Object
customValue1: '',
customValue2: '',
discount: 0.0,
updatedAt: 0,
archivedAt: 0,
isDeleted: false,
);
}
InvoiceItemEntity._();
@override
EntityType get entityType {
return EntityType.invoiceItem;
}
@BuiltValueField(wireName: 'product_key')
String get productKey;
@ -598,24 +587,6 @@ abstract class InvoiceItemEntity extends Object
bool get isExpense => expenseId != null && expenseId.isNotEmpty;
@override
bool matchesFilter(String filter) {
if (filter == null || filter.isEmpty) {
return true;
}
return false;
}
@override
String matchesFilterValue(String filter) {
if (filter == null || filter.isEmpty) {
return null;
}
return null;
}
InvoiceItemEntity applyTax(TaxRateEntity taxRate, {bool isSecond = false}) {
InvoiceItemEntity item;
@ -637,17 +608,6 @@ abstract class InvoiceItemEntity extends Object
return item;
}
@override
String get listDisplayName {
return '';
}
@override
double get listDisplayAmount => null;
@override
FormatNumberType get listDisplayAmountType => FormatNumberType.money;
static Serializer<InvoiceItemEntity> get serializer =>
_$invoiceItemEntitySerializer;
}

View File

@ -606,54 +606,6 @@ class _$InvoiceItemEntitySerializer
..add(serializers.serialize(object.expenseId,
specifiedType: const FullType(String)));
}
if (object.isChanged != null) {
result
..add('isChanged')
..add(serializers.serialize(object.isChanged,
specifiedType: const FullType(bool)));
}
if (object.createdAt != null) {
result
..add('created_at')
..add(serializers.serialize(object.createdAt,
specifiedType: const FullType(int)));
}
if (object.updatedAt != null) {
result
..add('updated_at')
..add(serializers.serialize(object.updatedAt,
specifiedType: const FullType(int)));
}
if (object.archivedAt != null) {
result
..add('archived_at')
..add(serializers.serialize(object.archivedAt,
specifiedType: const FullType(int)));
}
if (object.isDeleted != null) {
result
..add('is_deleted')
..add(serializers.serialize(object.isDeleted,
specifiedType: const FullType(bool)));
}
if (object.createdUserId != null) {
result
..add('user_id')
..add(serializers.serialize(object.createdUserId,
specifiedType: const FullType(String)));
}
if (object.assignedUserId != null) {
result
..add('assigned_user_id')
..add(serializers.serialize(object.assignedUserId,
specifiedType: const FullType(String)));
}
if (object.id != null) {
result
..add('id')
..add(serializers.serialize(object.id,
specifiedType: const FullType(String)));
}
return result;
}
@ -733,38 +685,6 @@ class _$InvoiceItemEntitySerializer
result.expenseId = serializers.deserialize(value,
specifiedType: const FullType(String)) as String;
break;
case 'isChanged':
result.isChanged = serializers.deserialize(value,
specifiedType: const FullType(bool)) as bool;
break;
case 'created_at':
result.createdAt = serializers.deserialize(value,
specifiedType: const FullType(int)) as int;
break;
case 'updated_at':
result.updatedAt = serializers.deserialize(value,
specifiedType: const FullType(int)) as int;
break;
case 'archived_at':
result.archivedAt = serializers.deserialize(value,
specifiedType: const FullType(int)) as int;
break;
case 'is_deleted':
result.isDeleted = serializers.deserialize(value,
specifiedType: const FullType(bool)) as bool;
break;
case 'user_id':
result.createdUserId = serializers.deserialize(value,
specifiedType: const FullType(String)) as String;
break;
case 'assigned_user_id':
result.assignedUserId = serializers.deserialize(value,
specifiedType: const FullType(String)) as String;
break;
case 'id':
result.id = serializers.deserialize(value,
specifiedType: const FullType(String)) as String;
break;
}
}
@ -1894,22 +1814,6 @@ class _$InvoiceItemEntity extends InvoiceItemEntity {
final String taskId;
@override
final String expenseId;
@override
final bool isChanged;
@override
final int createdAt;
@override
final int updatedAt;
@override
final int archivedAt;
@override
final bool isDeleted;
@override
final String createdUserId;
@override
final String assignedUserId;
@override
final String id;
factory _$InvoiceItemEntity(
[void Function(InvoiceItemEntityBuilder) updates]) =>
@ -1931,15 +1835,7 @@ class _$InvoiceItemEntity extends InvoiceItemEntity {
this.customValue2,
this.discount,
this.taskId,
this.expenseId,
this.isChanged,
this.createdAt,
this.updatedAt,
this.archivedAt,
this.isDeleted,
this.createdUserId,
this.assignedUserId,
this.id})
this.expenseId})
: super._() {
if (productKey == null) {
throw new BuiltValueNullFieldError('InvoiceItemEntity', 'productKey');
@ -2013,15 +1909,7 @@ class _$InvoiceItemEntity extends InvoiceItemEntity {
customValue2 == other.customValue2 &&
discount == other.discount &&
taskId == other.taskId &&
expenseId == other.expenseId &&
isChanged == other.isChanged &&
createdAt == other.createdAt &&
updatedAt == other.updatedAt &&
archivedAt == other.archivedAt &&
isDeleted == other.isDeleted &&
createdUserId == other.createdUserId &&
assignedUserId == other.assignedUserId &&
id == other.id;
expenseId == other.expenseId;
}
@override
@ -2042,28 +1930,24 @@ class _$InvoiceItemEntity extends InvoiceItemEntity {
$jc(
$jc(
$jc(
$jc(
$jc(
$jc($jc($jc($jc($jc($jc(0, productKey.hashCode), notes.hashCode), cost.hashCode), quantity.hashCode), taxName1.hashCode),
taxRate1.hashCode),
taxName2.hashCode),
taxRate2.hashCode),
taxName3.hashCode),
taxRate3.hashCode),
invoiceItemTypeId.hashCode),
customValue1.hashCode),
customValue2.hashCode),
discount.hashCode),
taskId.hashCode),
expenseId.hashCode),
isChanged.hashCode),
createdAt.hashCode),
updatedAt.hashCode),
archivedAt.hashCode),
isDeleted.hashCode),
createdUserId.hashCode),
assignedUserId.hashCode),
id.hashCode));
0,
productKey
.hashCode),
notes.hashCode),
cost.hashCode),
quantity.hashCode),
taxName1.hashCode),
taxRate1.hashCode),
taxName2.hashCode),
taxRate2.hashCode),
taxName3.hashCode),
taxRate3.hashCode),
invoiceItemTypeId.hashCode),
customValue1.hashCode),
customValue2.hashCode),
discount.hashCode),
taskId.hashCode),
expenseId.hashCode));
}
@override
@ -2084,15 +1968,7 @@ class _$InvoiceItemEntity extends InvoiceItemEntity {
..add('customValue2', customValue2)
..add('discount', discount)
..add('taskId', taskId)
..add('expenseId', expenseId)
..add('isChanged', isChanged)
..add('createdAt', createdAt)
..add('updatedAt', updatedAt)
..add('archivedAt', archivedAt)
..add('isDeleted', isDeleted)
..add('createdUserId', createdUserId)
..add('assignedUserId', assignedUserId)
..add('id', id))
..add('expenseId', expenseId))
.toString();
}
}
@ -2166,40 +2042,6 @@ class InvoiceItemEntityBuilder
String get expenseId => _$this._expenseId;
set expenseId(String expenseId) => _$this._expenseId = expenseId;
bool _isChanged;
bool get isChanged => _$this._isChanged;
set isChanged(bool isChanged) => _$this._isChanged = isChanged;
int _createdAt;
int get createdAt => _$this._createdAt;
set createdAt(int createdAt) => _$this._createdAt = createdAt;
int _updatedAt;
int get updatedAt => _$this._updatedAt;
set updatedAt(int updatedAt) => _$this._updatedAt = updatedAt;
int _archivedAt;
int get archivedAt => _$this._archivedAt;
set archivedAt(int archivedAt) => _$this._archivedAt = archivedAt;
bool _isDeleted;
bool get isDeleted => _$this._isDeleted;
set isDeleted(bool isDeleted) => _$this._isDeleted = isDeleted;
String _createdUserId;
String get createdUserId => _$this._createdUserId;
set createdUserId(String createdUserId) =>
_$this._createdUserId = createdUserId;
String _assignedUserId;
String get assignedUserId => _$this._assignedUserId;
set assignedUserId(String assignedUserId) =>
_$this._assignedUserId = assignedUserId;
String _id;
String get id => _$this._id;
set id(String id) => _$this._id = id;
InvoiceItemEntityBuilder();
InvoiceItemEntityBuilder get _$this {
@ -2220,14 +2062,6 @@ class InvoiceItemEntityBuilder
_discount = _$v.discount;
_taskId = _$v.taskId;
_expenseId = _$v.expenseId;
_isChanged = _$v.isChanged;
_createdAt = _$v.createdAt;
_updatedAt = _$v.updatedAt;
_archivedAt = _$v.archivedAt;
_isDeleted = _$v.isDeleted;
_createdUserId = _$v.createdUserId;
_assignedUserId = _$v.assignedUserId;
_id = _$v.id;
_$v = null;
}
return this;
@ -2265,15 +2099,7 @@ class InvoiceItemEntityBuilder
customValue2: customValue2,
discount: discount,
taskId: taskId,
expenseId: expenseId,
isChanged: isChanged,
createdAt: createdAt,
updatedAt: updatedAt,
archivedAt: archivedAt,
isDeleted: isDeleted,
createdUserId: createdUserId,
assignedUserId: assignedUserId,
id: id);
expenseId: expenseId);
replace(_$result);
return _$result;
}

View File

@ -33,11 +33,11 @@ class EditInvoice implements PersistUI {
{this.invoice,
this.context,
this.completer,
this.invoiceItem,
this.invoiceItemIndex,
this.force = false});
final InvoiceEntity invoice;
final InvoiceItemEntity invoiceItem;
final int invoiceItemIndex;
final BuildContext context;
final Completer completer;
final bool force;
@ -52,9 +52,9 @@ class ShowEmailInvoice {
}
class EditInvoiceItem implements PersistUI {
EditInvoiceItem([this.invoiceItem]);
EditInvoiceItem([this.invoiceItemIndex]);
final InvoiceItemEntity invoiceItem;
final int invoiceItemIndex;
}
class UpdateInvoice implements PersistUI {

View File

@ -13,20 +13,15 @@ EntityUIState invoiceUIReducer(InvoiceUIState state, dynamic action) {
return state.rebuild((b) => b
..listUIState.replace(invoiceListReducer(state.listUIState, action))
..editing.replace(editingReducer(state.editing, action))
..editingItem.replace(editingItemReducer(state.editingItem, action))
..editingItemIndex = editingItemIndexReducer(state.editingItemIndex, action)
..selectedId = selectedIdReducer(state.selectedId, action));
}
final editingItemReducer = combineReducers<InvoiceItemEntity>([
TypedReducer<InvoiceItemEntity, EditInvoice>(editInvoiceItem),
TypedReducer<InvoiceItemEntity, EditInvoiceItem>(editInvoiceItem),
final editingItemIndexReducer = combineReducers<int>([
TypedReducer<int, EditInvoice>((index, action) => action.invoiceItemIndex),
TypedReducer<int, EditInvoiceItem>((index, action) => action.invoiceItemIndex),
]);
InvoiceItemEntity editInvoiceItem(
InvoiceItemEntity invoiceItem, dynamic action) {
return action.invoiceItem ?? InvoiceItemEntity();
}
Reducer<String> dropdownFilterReducer = combineReducers([
TypedReducer<String, FilterInvoiceDropdown>(filterInvoiceDropdownReducer),
]);

View File

@ -59,7 +59,6 @@ abstract class InvoiceUIState extends Object
listUIState:
ListUIState(InvoiceFields.invoiceNumber, sortAscending: false),
editing: InvoiceEntity(),
editingItem: InvoiceItemEntity(),
selectedId: '',
);
}
@ -70,7 +69,7 @@ abstract class InvoiceUIState extends Object
InvoiceEntity get editing;
@nullable
InvoiceItemEntity get editingItem;
int get editingItemIndex;
@override
bool get isCreatingNew => editing.isNew;

View File

@ -95,11 +95,11 @@ class _$InvoiceUIStateSerializer
..add(serializers.serialize(object.editing,
specifiedType: const FullType(InvoiceEntity)));
}
if (object.editingItem != null) {
if (object.editingItemIndex != null) {
result
..add('editingItem')
..add(serializers.serialize(object.editingItem,
specifiedType: const FullType(InvoiceItemEntity)));
..add('editingItemIndex')
..add(serializers.serialize(object.editingItemIndex,
specifiedType: const FullType(int)));
}
if (object.selectedId != null) {
result
@ -126,10 +126,9 @@ class _$InvoiceUIStateSerializer
result.editing.replace(serializers.deserialize(value,
specifiedType: const FullType(InvoiceEntity)) as InvoiceEntity);
break;
case 'editingItem':
result.editingItem.replace(serializers.deserialize(value,
specifiedType: const FullType(InvoiceItemEntity))
as InvoiceItemEntity);
case 'editingItemIndex':
result.editingItemIndex = serializers.deserialize(value,
specifiedType: const FullType(int)) as int;
break;
case 'listUIState':
result.listUIState.replace(serializers.deserialize(value,
@ -269,7 +268,7 @@ class _$InvoiceUIState extends InvoiceUIState {
@override
final InvoiceEntity editing;
@override
final InvoiceItemEntity editingItem;
final int editingItemIndex;
@override
final ListUIState listUIState;
@override
@ -284,7 +283,7 @@ class _$InvoiceUIState extends InvoiceUIState {
_$InvoiceUIState._(
{this.editing,
this.editingItem,
this.editingItemIndex,
this.listUIState,
this.selectedId,
this.saveCompleter,
@ -308,7 +307,7 @@ class _$InvoiceUIState extends InvoiceUIState {
if (identical(other, this)) return true;
return other is InvoiceUIState &&
editing == other.editing &&
editingItem == other.editingItem &&
editingItemIndex == other.editingItemIndex &&
listUIState == other.listUIState &&
selectedId == other.selectedId &&
saveCompleter == other.saveCompleter &&
@ -320,7 +319,7 @@ class _$InvoiceUIState extends InvoiceUIState {
return $jf($jc(
$jc(
$jc(
$jc($jc($jc(0, editing.hashCode), editingItem.hashCode),
$jc($jc($jc(0, editing.hashCode), editingItemIndex.hashCode),
listUIState.hashCode),
selectedId.hashCode),
saveCompleter.hashCode),
@ -331,7 +330,7 @@ class _$InvoiceUIState extends InvoiceUIState {
String toString() {
return (newBuiltValueToStringHelper('InvoiceUIState')
..add('editing', editing)
..add('editingItem', editingItem)
..add('editingItemIndex', editingItemIndex)
..add('listUIState', listUIState)
..add('selectedId', selectedId)
..add('saveCompleter', saveCompleter)
@ -349,11 +348,10 @@ class InvoiceUIStateBuilder
_$this._editing ??= new InvoiceEntityBuilder();
set editing(InvoiceEntityBuilder editing) => _$this._editing = editing;
InvoiceItemEntityBuilder _editingItem;
InvoiceItemEntityBuilder get editingItem =>
_$this._editingItem ??= new InvoiceItemEntityBuilder();
set editingItem(InvoiceItemEntityBuilder editingItem) =>
_$this._editingItem = editingItem;
int _editingItemIndex;
int get editingItemIndex => _$this._editingItemIndex;
set editingItemIndex(int editingItemIndex) =>
_$this._editingItemIndex = editingItemIndex;
ListUIStateBuilder _listUIState;
ListUIStateBuilder get listUIState =>
@ -380,7 +378,7 @@ class InvoiceUIStateBuilder
InvoiceUIStateBuilder get _$this {
if (_$v != null) {
_editing = _$v.editing?.toBuilder();
_editingItem = _$v.editingItem?.toBuilder();
_editingItemIndex = _$v.editingItemIndex;
_listUIState = _$v.listUIState?.toBuilder();
_selectedId = _$v.selectedId;
_saveCompleter = _$v.saveCompleter;
@ -410,7 +408,7 @@ class InvoiceUIStateBuilder
_$result = _$v ??
new _$InvoiceUIState._(
editing: _editing?.build(),
editingItem: _editingItem?.build(),
editingItemIndex: editingItemIndex,
listUIState: listUIState.build(),
selectedId: selectedId,
saveCompleter: saveCompleter,
@ -420,8 +418,7 @@ class InvoiceUIStateBuilder
try {
_$failedField = 'editing';
_editing?.build();
_$failedField = 'editingItem';
_editingItem?.build();
_$failedField = 'listUIState';
listUIState.build();
} catch (e) {

View File

@ -33,11 +33,11 @@ class EditQuote implements PersistUI {
{this.quote,
this.context,
this.completer,
this.quoteItem,
this.quoteItemIndex,
this.force = false});
final InvoiceEntity quote;
final InvoiceItemEntity quoteItem;
final int quoteItemIndex;
final BuildContext context;
final Completer completer;
final bool force;
@ -52,9 +52,9 @@ class ShowEmailQuote {
}
class EditQuoteItem implements PersistUI {
EditQuoteItem([this.quoteItem]);
EditQuoteItem([this.quoteItemIndex]);
final InvoiceItemEntity quoteItem;
final int quoteItemIndex;
}
class UpdateQuote implements PersistUI {

View File

@ -13,19 +13,15 @@ EntityUIState quoteUIReducer(QuoteUIState state, dynamic action) {
return state.rebuild((b) => b
..listUIState.replace(quoteListReducer(state.listUIState, action))
..editing.replace(editingReducer(state.editing, action))
..editingItem.replace(editingItemReducer(state.editingItem, action))
..editingItemIndex = editingItemReducer(state.editingItemIndex, action)
..selectedId = selectedIdReducer(state.selectedId, action));
}
final editingItemReducer = combineReducers<InvoiceItemEntity>([
TypedReducer<InvoiceItemEntity, EditQuote>(editQuoteItem),
TypedReducer<InvoiceItemEntity, EditQuoteItem>(editQuoteItem),
final editingItemReducer = combineReducers<int>([
TypedReducer<int, EditQuote>((index, action) => action.quoteItemIndex),
TypedReducer<int, EditQuoteItem>((index, action) => action.quoteItemIndex),
]);
InvoiceItemEntity editQuoteItem(InvoiceItemEntity quoteItem, dynamic action) {
return action.quoteItem ?? InvoiceItemEntity();
}
Reducer<String> dropdownFilterReducer = combineReducers([
TypedReducer<String, FilterQuoteDropdown>(filterquoteDropdownReducer),
]);

View File

@ -51,7 +51,6 @@ abstract class QuoteUIState extends Object
return _$QuoteUIState._(
listUIState: ListUIState(QuoteFields.quoteNumber, sortAscending: false),
editing: InvoiceEntity(),
editingItem: InvoiceItemEntity(),
selectedId: '',
);
}
@ -62,7 +61,7 @@ abstract class QuoteUIState extends Object
InvoiceEntity get editing;
@nullable
InvoiceItemEntity get editingItem;
int get editingItemIndex;
@override
bool get isCreatingNew => editing.isNew;

View File

@ -93,11 +93,11 @@ class _$QuoteUIStateSerializer implements StructuredSerializer<QuoteUIState> {
..add(serializers.serialize(object.editing,
specifiedType: const FullType(InvoiceEntity)));
}
if (object.editingItem != null) {
if (object.editingItemIndex != null) {
result
..add('editingItem')
..add(serializers.serialize(object.editingItem,
specifiedType: const FullType(InvoiceItemEntity)));
..add('editingItemIndex')
..add(serializers.serialize(object.editingItemIndex,
specifiedType: const FullType(int)));
}
if (object.selectedId != null) {
result
@ -123,10 +123,9 @@ class _$QuoteUIStateSerializer implements StructuredSerializer<QuoteUIState> {
result.editing.replace(serializers.deserialize(value,
specifiedType: const FullType(InvoiceEntity)) as InvoiceEntity);
break;
case 'editingItem':
result.editingItem.replace(serializers.deserialize(value,
specifiedType: const FullType(InvoiceItemEntity))
as InvoiceItemEntity);
case 'editingItemIndex':
result.editingItemIndex = serializers.deserialize(value,
specifiedType: const FullType(int)) as int;
break;
case 'listUIState':
result.listUIState.replace(serializers.deserialize(value,
@ -265,7 +264,7 @@ class _$QuoteUIState extends QuoteUIState {
@override
final InvoiceEntity editing;
@override
final InvoiceItemEntity editingItem;
final int editingItemIndex;
@override
final ListUIState listUIState;
@override
@ -280,7 +279,7 @@ class _$QuoteUIState extends QuoteUIState {
_$QuoteUIState._(
{this.editing,
this.editingItem,
this.editingItemIndex,
this.listUIState,
this.selectedId,
this.saveCompleter,
@ -303,7 +302,7 @@ class _$QuoteUIState extends QuoteUIState {
if (identical(other, this)) return true;
return other is QuoteUIState &&
editing == other.editing &&
editingItem == other.editingItem &&
editingItemIndex == other.editingItemIndex &&
listUIState == other.listUIState &&
selectedId == other.selectedId &&
saveCompleter == other.saveCompleter &&
@ -315,7 +314,7 @@ class _$QuoteUIState extends QuoteUIState {
return $jf($jc(
$jc(
$jc(
$jc($jc($jc(0, editing.hashCode), editingItem.hashCode),
$jc($jc($jc(0, editing.hashCode), editingItemIndex.hashCode),
listUIState.hashCode),
selectedId.hashCode),
saveCompleter.hashCode),
@ -326,7 +325,7 @@ class _$QuoteUIState extends QuoteUIState {
String toString() {
return (newBuiltValueToStringHelper('QuoteUIState')
..add('editing', editing)
..add('editingItem', editingItem)
..add('editingItemIndex', editingItemIndex)
..add('listUIState', listUIState)
..add('selectedId', selectedId)
..add('saveCompleter', saveCompleter)
@ -344,11 +343,10 @@ class QuoteUIStateBuilder
_$this._editing ??= new InvoiceEntityBuilder();
set editing(InvoiceEntityBuilder editing) => _$this._editing = editing;
InvoiceItemEntityBuilder _editingItem;
InvoiceItemEntityBuilder get editingItem =>
_$this._editingItem ??= new InvoiceItemEntityBuilder();
set editingItem(InvoiceItemEntityBuilder editingItem) =>
_$this._editingItem = editingItem;
int _editingItemIndex;
int get editingItemIndex => _$this._editingItemIndex;
set editingItemIndex(int editingItemIndex) =>
_$this._editingItemIndex = editingItemIndex;
ListUIStateBuilder _listUIState;
ListUIStateBuilder get listUIState =>
@ -375,7 +373,7 @@ class QuoteUIStateBuilder
QuoteUIStateBuilder get _$this {
if (_$v != null) {
_editing = _$v.editing?.toBuilder();
_editingItem = _$v.editingItem?.toBuilder();
_editingItemIndex = _$v.editingItemIndex;
_listUIState = _$v.listUIState?.toBuilder();
_selectedId = _$v.selectedId;
_saveCompleter = _$v.saveCompleter;
@ -405,7 +403,7 @@ class QuoteUIStateBuilder
_$result = _$v ??
new _$QuoteUIState._(
editing: _editing?.build(),
editingItem: _editingItem?.build(),
editingItemIndex: editingItemIndex,
listUIState: listUIState.build(),
selectedId: selectedId,
saveCompleter: saveCompleter,
@ -415,8 +413,7 @@ class QuoteUIStateBuilder
try {
_$failedField = 'editing';
_editing?.build();
_$failedField = 'editingItem';
_editingItem?.build();
_$failedField = 'listUIState';
listUIState.build();
} catch (e) {

View File

@ -38,11 +38,10 @@ class _InvoiceEditState extends State<InvoiceEdit>
void initState() {
super.initState();
final invoice = widget.viewModel.invoice;
final invoiceItem = widget.viewModel.invoiceItem;
final viewModel = widget.viewModel;
final index =
invoice.lineItems.contains(invoiceItem) ? kItemScreen : kDetailsScreen;
viewModel.invoiceItemIndex != null ? kItemScreen : kDetailsScreen;
_controller = TabController(vsync: this, length: 4, initialIndex: index);
}

View File

@ -28,8 +28,7 @@ class InvoiceEditItems extends StatefulWidget {
class _InvoiceEditItemsState extends State<InvoiceEditItems> {
InvoiceItemEntity selectedInvoiceItem;
void _showInvoiceItemEditor(
InvoiceItemEntity invoiceItem, BuildContext context) {
void _showInvoiceItemEditor(int lineItemIndex, BuildContext context) {
showDialog<ItemEditDetails>(
context: context,
builder: (BuildContext context) {
@ -38,10 +37,9 @@ class _InvoiceEditItemsState extends State<InvoiceEditItems> {
return ItemEditDetails(
viewModel: viewModel,
key: Key(invoiceItem.entityKey),
invoiceItem: invoiceItem,
index: invoice.lineItems.indexOf(
invoice.lineItems.firstWhere((i) => i.id == invoiceItem.id)),
key: ValueKey('__${lineItemIndex}__'),
invoiceItem: invoice.lineItems[lineItemIndex],
index: lineItemIndex,
);
});
}
@ -51,30 +49,31 @@ class _InvoiceEditItemsState extends State<InvoiceEditItems> {
final localization = AppLocalization.of(context);
final viewModel = widget.viewModel;
final invoice = viewModel.invoice;
final invoiceItem = invoice.lineItems.contains(viewModel.invoiceItem)
? viewModel.invoiceItem
: null;
final itemIndex = viewModel.invoiceItemIndex;
final invoiceItem =
itemIndex != null && invoice.lineItems.length > itemIndex
? invoice.lineItems[itemIndex]
: null;
if (invoiceItem != null && invoiceItem != selectedInvoiceItem) {
selectedInvoiceItem = invoiceItem;
WidgetsBinding.instance.addPostFrameCallback((duration) {
_showInvoiceItemEditor(invoiceItem, context);
_showInvoiceItemEditor(itemIndex, context);
});
}
if (invoice.lineItems.isEmpty) {
return HelpText(localization.clickPlusToAddItem);
}
final lineItems =
invoice.lineItems.map((invoiceItem) => InvoiceItemListTile(
invoice: invoice,
invoiceItem: invoiceItem,
onTap: () => _showInvoiceItemEditor(invoiceItem, context),
));
return ListView(
children: lineItems.toList(),
children: [
for (int i = 0; i < invoice.lineItems.length; i++)
InvoiceItemListTile(
invoice: invoice,
invoiceItem: invoice.lineItems[i],
onTap: () => _showInvoiceItemEditor(i, context),
)
],
);
}
}

View File

@ -29,7 +29,7 @@ class EntityEditItemsVM {
EntityEditItemsVM({
@required this.company,
@required this.invoice,
@required this.invoiceItem,
@required this.invoiceItemIndex,
@required this.onRemoveInvoiceItemPressed,
@required this.onDoneInvoiceItemPressed,
@required this.onChangedInvoiceItem,
@ -37,7 +37,7 @@ class EntityEditItemsVM {
final CompanyEntity company;
final InvoiceEntity invoice;
final InvoiceItemEntity invoiceItem;
final int invoiceItemIndex;
final Function(int) onRemoveInvoiceItemPressed;
final Function onDoneInvoiceItemPressed;
final Function(InvoiceItemEntity, int) onChangedInvoiceItem;
@ -47,14 +47,14 @@ class InvoiceEditItemsVM extends EntityEditItemsVM {
InvoiceEditItemsVM({
CompanyEntity company,
InvoiceEntity invoice,
InvoiceItemEntity invoiceItem,
int invoiceItemIndex,
Function(int) onRemoveInvoiceItemPressed,
Function onDoneInvoiceItemPressed,
Function(InvoiceItemEntity, int) onChangedInvoiceItem,
}) : super(
company: company,
invoice: invoice,
invoiceItem: invoiceItem,
invoiceItemIndex: invoiceItemIndex,
onRemoveInvoiceItemPressed: onRemoveInvoiceItemPressed,
onDoneInvoiceItemPressed: onDoneInvoiceItemPressed,
onChangedInvoiceItem: onChangedInvoiceItem,
@ -67,7 +67,7 @@ class InvoiceEditItemsVM extends EntityEditItemsVM {
return InvoiceEditItemsVM(
company: state.selectedCompany,
invoice: invoice,
invoiceItem: state.invoiceUIState.editingItem,
invoiceItemIndex: state.invoiceUIState.editingItemIndex,
onRemoveInvoiceItemPressed: (index) =>
store.dispatch(DeleteInvoiceItem(index)),
onDoneInvoiceItemPressed: () => store.dispatch(EditInvoiceItem()),

View File

@ -41,7 +41,7 @@ class EntityEditVM {
@required this.state,
@required this.company,
@required this.invoice,
@required this.invoiceItem,
@required this.invoiceItemIndex,
@required this.origInvoice,
@required this.onSavePressed,
@required this.onItemsAdded,
@ -53,7 +53,7 @@ class EntityEditVM {
final AppState state;
final CompanyEntity company;
final InvoiceEntity invoice;
final InvoiceItemEntity invoiceItem;
final int invoiceItemIndex;
final InvoiceEntity origInvoice;
final Function(BuildContext) onSavePressed;
final Function(List<InvoiceItemEntity>, String) onItemsAdded;
@ -67,7 +67,7 @@ class InvoiceEditVM extends EntityEditVM {
AppState state,
CompanyEntity company,
InvoiceEntity invoice,
InvoiceItemEntity invoiceItem,
int invoiceItemIndex,
InvoiceEntity origInvoice,
Function(BuildContext) onSavePressed,
Function(List<InvoiceItemEntity>, String) onItemsAdded,
@ -78,7 +78,7 @@ class InvoiceEditVM extends EntityEditVM {
state: state,
company: company,
invoice: invoice,
invoiceItem: invoiceItem,
invoiceItemIndex: invoiceItemIndex,
origInvoice: origInvoice,
onSavePressed: onSavePressed,
onItemsAdded: onItemsAdded,
@ -96,7 +96,7 @@ class InvoiceEditVM extends EntityEditVM {
company: state.selectedCompany,
isSaving: state.isSaving,
invoice: invoice,
invoiceItem: state.invoiceUIState.editingItem,
invoiceItemIndex: state.invoiceUIState.editingItemIndex,
origInvoice: store.state.invoiceState.map[invoice.id],
onBackPressed: () {
if (state.uiState.currentRoute.contains(InvoiceScreen.route)) {
@ -134,7 +134,7 @@ class InvoiceEditVM extends EntityEditVM {
store.dispatch(AddInvoiceItems(items));
// if we're just adding one item automatically show the editor
if (items.length == 1) {
store.dispatch(EditInvoiceItem(items[0]));
store.dispatch(EditInvoiceItem(invoice.lineItems.length));
}
},
onCancelPressed: (BuildContext context) {

View File

@ -160,7 +160,7 @@ class InvoiceOverview extends StatelessWidget {
invoice: invoice,
invoiceItem: invoiceItem,
onTap: () => userCompany.canEditEntity(invoice)
? viewModel.onEditPressed(context, invoiceItem)
? viewModel.onEditPressed(context, invoice.lineItems.indexOf(invoiceItem))
: null,
);
},

View File

@ -67,7 +67,7 @@ class EntityViewVM {
final bool isSaving;
final bool isDirty;
final Function(BuildContext, EntityAction) onActionSelected;
final Function(BuildContext, [InvoiceItemEntity]) onEditPressed;
final Function(BuildContext, [int]) onEditPressed;
final Function(BuildContext, [bool]) onClientPressed;
final Function(BuildContext) onPaymentsPressed;
final Function(BuildContext, PaymentEntity, [bool]) onPaymentPressed;
@ -87,7 +87,7 @@ class InvoiceViewVM extends EntityViewVM {
bool isSaving,
bool isDirty,
Function(BuildContext, EntityAction) onEntityAction,
Function(BuildContext, [InvoiceItemEntity]) onEditPressed,
Function(BuildContext, [int]) onEditPressed,
Function(BuildContext, [bool]) onClientPressed,
Function(BuildContext, PaymentEntity, [bool]) onPaymentPressed,
Function(BuildContext) onPaymentsPressed,
@ -133,14 +133,14 @@ class InvoiceViewVM extends EntityViewVM {
isDirty: invoice.isNew,
invoice: invoice,
client: client,
onEditPressed: (BuildContext context, [InvoiceItemEntity invoiceItem]) {
onEditPressed: (BuildContext context, [invoiceItemIndex]) {
final Completer<InvoiceEntity> completer =
new Completer<InvoiceEntity>();
store.dispatch(EditInvoice(
invoice: invoice,
context: context,
completer: completer,
invoiceItem: invoiceItem));
invoiceItemIndex: invoiceItemIndex));
completer.future.then((invoice) {
Scaffold.of(context).showSnackBar(SnackBar(
content: SnackBarRow(

View File

@ -30,14 +30,14 @@ class QuoteEditItemsVM extends EntityEditItemsVM {
QuoteEditItemsVM({
CompanyEntity company,
InvoiceEntity invoice,
InvoiceItemEntity invoiceItem,
int invoiceItemIndex,
Function(int) onRemoveInvoiceItemPressed,
Function onDoneInvoiceItemPressed,
Function(InvoiceItemEntity, int) onChangedInvoiceItem,
}) : super(
company: company,
invoice: invoice,
invoiceItem: invoiceItem,
invoiceItemIndex: invoiceItemIndex,
onRemoveInvoiceItemPressed: onRemoveInvoiceItemPressed,
onDoneInvoiceItemPressed: onDoneInvoiceItemPressed,
onChangedInvoiceItem: onChangedInvoiceItem,
@ -50,7 +50,7 @@ class QuoteEditItemsVM extends EntityEditItemsVM {
return QuoteEditItemsVM(
company: state.selectedCompany,
invoice: quote,
invoiceItem: state.quoteUIState.editingItem,
invoiceItemIndex: state.quoteUIState.editingItemIndex,
onRemoveInvoiceItemPressed: (index) =>
store.dispatch(DeleteQuoteItem(index)),
onDoneInvoiceItemPressed: () => store.dispatch(EditQuoteItem()),

View File

@ -42,7 +42,7 @@ class QuoteEditVM extends EntityEditVM {
AppState state,
CompanyEntity company,
InvoiceEntity invoice,
InvoiceItemEntity invoiceItem,
int invoiceItemIndex,
InvoiceEntity origInvoice,
Function(BuildContext) onSavePressed,
Function(List<InvoiceItemEntity>, String) onItemsAdded,
@ -53,7 +53,7 @@ class QuoteEditVM extends EntityEditVM {
state: state,
company: company,
invoice: invoice,
invoiceItem: invoiceItem,
invoiceItemIndex: invoiceItemIndex,
origInvoice: origInvoice,
onSavePressed: onSavePressed,
onItemsAdded: onItemsAdded,
@ -70,7 +70,7 @@ class QuoteEditVM extends EntityEditVM {
company: state.selectedCompany,
isSaving: state.isSaving,
invoice: quote,
invoiceItem: state.quoteUIState.editingItem,
invoiceItemIndex: state.quoteUIState.editingItemIndex,
origInvoice: store.state.quoteState.map[quote.id],
onBackPressed: () {
if (state.uiState.currentRoute.contains(QuoteScreen.route)) {
@ -100,7 +100,7 @@ class QuoteEditVM extends EntityEditVM {
},
onItemsAdded: (items, clientId) {
if (items.length == 1) {
store.dispatch(EditQuoteItem(items[0]));
store.dispatch(EditQuoteItem(quote.lineItems.length));
}
store.dispatch(AddQuoteItems(items));
},

View File

@ -36,11 +36,10 @@ class _QuoteEditState extends State<QuoteEdit>
void initState() {
super.initState();
final invoice = widget.viewModel.invoice;
final invoiceItem = widget.viewModel.invoiceItem;
final viewModel = widget.viewModel;
final index =
invoice.lineItems.contains(invoiceItem) ? kItemScreen : kDetailsScreen;
viewModel.invoiceItemIndex != null ? kItemScreen : kDetailsScreen;
_controller = TabController(vsync: this, length: 3, initialIndex: index);
}

View File

@ -49,7 +49,7 @@ class QuoteViewVM extends EntityViewVM {
bool isSaving,
bool isDirty,
Function(BuildContext, EntityAction) onEntityAction,
Function(BuildContext, [InvoiceItemEntity]) onEditPressed,
Function(BuildContext, [int]) onEditPressed,
Function(BuildContext, [bool]) onClientPressed,
Function(BuildContext) onPaymentsPressed,
Function(BuildContext, PaymentEntity) onPaymentPressed,
@ -98,14 +98,14 @@ class QuoteViewVM extends EntityViewVM {
isDirty: quote.isNew,
invoice: quote,
client: client,
onEditPressed: (BuildContext context, [InvoiceItemEntity invoiceItem]) {
onEditPressed: (BuildContext context, [int index]) {
final Completer<InvoiceEntity> completer =
new Completer<InvoiceEntity>();
store.dispatch(EditQuote(
quote: quote,
context: context,
completer: completer,
quoteItem: invoiceItem));
quoteItemIndex: index));
completer.future.then((invoice) {
Scaffold.of(context).showSnackBar(SnackBar(
content: SnackBarRow(