Purchase orders
This commit is contained in:
parent
e03133292f
commit
de7923b517
|
|
@ -140,6 +140,7 @@ abstract class CompanyEntity extends Object
|
||||||
subscriptions: BuiltList<SubscriptionEntity>(),
|
subscriptions: BuiltList<SubscriptionEntity>(),
|
||||||
systemLogs: BuiltList<SystemLogEntity>(),
|
systemLogs: BuiltList<SystemLogEntity>(),
|
||||||
clientRegistrationFields: BuiltList<RegistrationFieldEntity>(),
|
clientRegistrationFields: BuiltList<RegistrationFieldEntity>(),
|
||||||
|
purchaseOrders: BuiltList<InvoiceEntity>(),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -314,6 +315,9 @@ abstract class CompanyEntity extends Object
|
||||||
|
|
||||||
BuiltList<InvoiceEntity> get credits;
|
BuiltList<InvoiceEntity> get credits;
|
||||||
|
|
||||||
|
@BuiltValueField(wireName: 'purchase_orders')
|
||||||
|
BuiltList<InvoiceEntity> get purchaseOrders;
|
||||||
|
|
||||||
BuiltList<TaskEntity> get tasks;
|
BuiltList<TaskEntity> get tasks;
|
||||||
|
|
||||||
BuiltList<ProjectEntity> get projects;
|
BuiltList<ProjectEntity> get projects;
|
||||||
|
|
@ -563,6 +567,7 @@ abstract class CompanyEntity extends Object
|
||||||
..invoices.clear()
|
..invoices.clear()
|
||||||
..payments.clear()
|
..payments.clear()
|
||||||
..quotes.clear()
|
..quotes.clear()
|
||||||
|
..purchaseOrders.clear()
|
||||||
..credits.clear()
|
..credits.clear()
|
||||||
..tasks.clear()
|
..tasks.clear()
|
||||||
..projects.clear()
|
..projects.clear()
|
||||||
|
|
@ -633,7 +638,8 @@ abstract class CompanyEntity extends Object
|
||||||
..systemLogs.replace(BuiltList<SystemLogEntity>())
|
..systemLogs.replace(BuiltList<SystemLogEntity>())
|
||||||
..subscriptions.replace(BuiltList<SubscriptionEntity>())
|
..subscriptions.replace(BuiltList<SubscriptionEntity>())
|
||||||
..recurringExpenses.replace(BuiltList<ExpenseEntity>())
|
..recurringExpenses.replace(BuiltList<ExpenseEntity>())
|
||||||
..clientRegistrationFields.replace(BuiltList<RegistrationFieldEntity>());
|
..clientRegistrationFields.replace(BuiltList<RegistrationFieldEntity>())
|
||||||
|
..purchaseOrders.replace(BuiltList<InvoiceEntity>());
|
||||||
|
|
||||||
static Serializer<CompanyEntity> get serializer => _$companyEntitySerializer;
|
static Serializer<CompanyEntity> get serializer => _$companyEntitySerializer;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -222,6 +222,10 @@ class _$CompanyEntitySerializer implements StructuredSerializer<CompanyEntity> {
|
||||||
serializers.serialize(object.credits,
|
serializers.serialize(object.credits,
|
||||||
specifiedType:
|
specifiedType:
|
||||||
const FullType(BuiltList, const [const FullType(InvoiceEntity)])),
|
const FullType(BuiltList, const [const FullType(InvoiceEntity)])),
|
||||||
|
'purchase_orders',
|
||||||
|
serializers.serialize(object.purchaseOrders,
|
||||||
|
specifiedType:
|
||||||
|
const FullType(BuiltList, const [const FullType(InvoiceEntity)])),
|
||||||
'tasks',
|
'tasks',
|
||||||
serializers.serialize(object.tasks,
|
serializers.serialize(object.tasks,
|
||||||
specifiedType:
|
specifiedType:
|
||||||
|
|
@ -643,6 +647,12 @@ class _$CompanyEntitySerializer implements StructuredSerializer<CompanyEntity> {
|
||||||
BuiltList, const [const FullType(InvoiceEntity)]))
|
BuiltList, const [const FullType(InvoiceEntity)]))
|
||||||
as BuiltList<Object>);
|
as BuiltList<Object>);
|
||||||
break;
|
break;
|
||||||
|
case 'purchase_orders':
|
||||||
|
result.purchaseOrders.replace(serializers.deserialize(value,
|
||||||
|
specifiedType: const FullType(
|
||||||
|
BuiltList, const [const FullType(InvoiceEntity)]))
|
||||||
|
as BuiltList<Object>);
|
||||||
|
break;
|
||||||
case 'tasks':
|
case 'tasks':
|
||||||
result.tasks.replace(serializers.deserialize(value,
|
result.tasks.replace(serializers.deserialize(value,
|
||||||
specifiedType: const FullType(
|
specifiedType: const FullType(
|
||||||
|
|
@ -1511,6 +1521,8 @@ class _$CompanyEntity extends CompanyEntity {
|
||||||
@override
|
@override
|
||||||
final BuiltList<InvoiceEntity> credits;
|
final BuiltList<InvoiceEntity> credits;
|
||||||
@override
|
@override
|
||||||
|
final BuiltList<InvoiceEntity> purchaseOrders;
|
||||||
|
@override
|
||||||
final BuiltList<TaskEntity> tasks;
|
final BuiltList<TaskEntity> tasks;
|
||||||
@override
|
@override
|
||||||
final BuiltList<ProjectEntity> projects;
|
final BuiltList<ProjectEntity> projects;
|
||||||
|
|
@ -1646,6 +1658,7 @@ class _$CompanyEntity extends CompanyEntity {
|
||||||
this.payments,
|
this.payments,
|
||||||
this.quotes,
|
this.quotes,
|
||||||
this.credits,
|
this.credits,
|
||||||
|
this.purchaseOrders,
|
||||||
this.tasks,
|
this.tasks,
|
||||||
this.projects,
|
this.projects,
|
||||||
this.expenses,
|
this.expenses,
|
||||||
|
|
@ -1791,6 +1804,8 @@ class _$CompanyEntity extends CompanyEntity {
|
||||||
payments, 'CompanyEntity', 'payments');
|
payments, 'CompanyEntity', 'payments');
|
||||||
BuiltValueNullFieldError.checkNotNull(quotes, 'CompanyEntity', 'quotes');
|
BuiltValueNullFieldError.checkNotNull(quotes, 'CompanyEntity', 'quotes');
|
||||||
BuiltValueNullFieldError.checkNotNull(credits, 'CompanyEntity', 'credits');
|
BuiltValueNullFieldError.checkNotNull(credits, 'CompanyEntity', 'credits');
|
||||||
|
BuiltValueNullFieldError.checkNotNull(
|
||||||
|
purchaseOrders, 'CompanyEntity', 'purchaseOrders');
|
||||||
BuiltValueNullFieldError.checkNotNull(tasks, 'CompanyEntity', 'tasks');
|
BuiltValueNullFieldError.checkNotNull(tasks, 'CompanyEntity', 'tasks');
|
||||||
BuiltValueNullFieldError.checkNotNull(
|
BuiltValueNullFieldError.checkNotNull(
|
||||||
projects, 'CompanyEntity', 'projects');
|
projects, 'CompanyEntity', 'projects');
|
||||||
|
|
@ -1920,6 +1935,7 @@ class _$CompanyEntity extends CompanyEntity {
|
||||||
payments == other.payments &&
|
payments == other.payments &&
|
||||||
quotes == other.quotes &&
|
quotes == other.quotes &&
|
||||||
credits == other.credits &&
|
credits == other.credits &&
|
||||||
|
purchaseOrders == other.purchaseOrders &&
|
||||||
tasks == other.tasks &&
|
tasks == other.tasks &&
|
||||||
projects == other.projects &&
|
projects == other.projects &&
|
||||||
expenses == other.expenses &&
|
expenses == other.expenses &&
|
||||||
|
|
@ -1980,7 +1996,7 @@ class _$CompanyEntity extends CompanyEntity {
|
||||||
$jc(
|
$jc(
|
||||||
$jc(
|
$jc(
|
||||||
$jc(
|
$jc(
|
||||||
$jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc(0, enableCustomSurchargeTaxes1.hashCode), enableCustomSurchargeTaxes2.hashCode), enableCustomSurchargeTaxes3.hashCode), enableCustomSurchargeTaxes4.hashCode), sizeId.hashCode), industryId.hashCode), subdomain.hashCode), portalMode.hashCode), portalDomain.hashCode), updateProducts.hashCode), convertProductExchangeRate.hashCode), convertRateToClient.hashCode), fillProducts.hashCode), enableProductCost.hashCode), enableProductQuantity.hashCode), enableProductDiscount.hashCode), defaultTaskIsDateBased.hashCode), defaultQuantity.hashCode), showProductDetails.hashCode), clientCanRegister.hashCode), isLarge.hashCode), isDisabled.hashCode), enableShopApi.hashCode), companyKey.hashCode), firstDayOfWeek.hashCode), firstMonthOfYear.hashCode), numberOfInvoiceTaxRates.hashCode), numberOfItemTaxRates.hashCode), expenseInclusiveTaxes.hashCode), sessionTimeout.hashCode), passwordTimeout.hashCode), oauthPasswordRequired.hashCode), markdownEnabled.hashCode), markdownEmailEnabled.hashCode), useCommaAsDecimalPlace.hashCode), reportIncludeDrafts.hashCode), useQuoteTermsOnConversion.hashCode), enableApplyingPayments.hashCode), trackInventory.hashCode), stockNotificationThreshold.hashCode), stockNotification.hashCode), groups.hashCode), activities.hashCode), taxRates.hashCode), taskStatuses.hashCode), taskStatusMap.hashCode), companyGateways.hashCode), expenseCategories.hashCode), users.hashCode), clients.hashCode), products.hashCode), invoices.hashCode), recurringInvoices.hashCode), recurringExpenses.hashCode), payments.hashCode), quotes.hashCode), credits.hashCode), tasks.hashCode), projects.hashCode), expenses.hashCode), vendors.hashCode), designs.hashCode), documents.hashCode), tokens.hashCode), webhooks.hashCode), subscriptions.hashCode), paymentTerms.hashCode), systemLogs.hashCode), clientRegistrationFields.hashCode), customFields.hashCode), slackWebhookUrl.hashCode), googleAnalyticsKey.hashCode), markExpensesInvoiceable.hashCode), markExpensesPaid.hashCode), invoiceExpenseDocuments.hashCode),
|
$jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc(0, enableCustomSurchargeTaxes1.hashCode), enableCustomSurchargeTaxes2.hashCode), enableCustomSurchargeTaxes3.hashCode), enableCustomSurchargeTaxes4.hashCode), sizeId.hashCode), industryId.hashCode), subdomain.hashCode), portalMode.hashCode), portalDomain.hashCode), updateProducts.hashCode), convertProductExchangeRate.hashCode), convertRateToClient.hashCode), fillProducts.hashCode), enableProductCost.hashCode), enableProductQuantity.hashCode), enableProductDiscount.hashCode), defaultTaskIsDateBased.hashCode), defaultQuantity.hashCode), showProductDetails.hashCode), clientCanRegister.hashCode), isLarge.hashCode), isDisabled.hashCode), enableShopApi.hashCode), companyKey.hashCode), firstDayOfWeek.hashCode), firstMonthOfYear.hashCode), numberOfInvoiceTaxRates.hashCode), numberOfItemTaxRates.hashCode), expenseInclusiveTaxes.hashCode), sessionTimeout.hashCode), passwordTimeout.hashCode), oauthPasswordRequired.hashCode), markdownEnabled.hashCode), markdownEmailEnabled.hashCode), useCommaAsDecimalPlace.hashCode), reportIncludeDrafts.hashCode), useQuoteTermsOnConversion.hashCode), enableApplyingPayments.hashCode), trackInventory.hashCode), stockNotificationThreshold.hashCode), stockNotification.hashCode), groups.hashCode), activities.hashCode), taxRates.hashCode), taskStatuses.hashCode), taskStatusMap.hashCode), companyGateways.hashCode), expenseCategories.hashCode), users.hashCode), clients.hashCode), products.hashCode), invoices.hashCode), recurringInvoices.hashCode), recurringExpenses.hashCode), payments.hashCode), quotes.hashCode), credits.hashCode), purchaseOrders.hashCode), tasks.hashCode), projects.hashCode), expenses.hashCode), vendors.hashCode), designs.hashCode), documents.hashCode), tokens.hashCode), webhooks.hashCode), subscriptions.hashCode), paymentTerms.hashCode), systemLogs.hashCode), clientRegistrationFields.hashCode), customFields.hashCode), slackWebhookUrl.hashCode), googleAnalyticsKey.hashCode), markExpensesInvoiceable.hashCode), markExpensesPaid.hashCode), invoiceExpenseDocuments.hashCode),
|
||||||
invoiceTaskDocuments.hashCode),
|
invoiceTaskDocuments.hashCode),
|
||||||
invoiceTaskTimelog.hashCode),
|
invoiceTaskTimelog.hashCode),
|
||||||
invoiceTaskDatelog.hashCode),
|
invoiceTaskDatelog.hashCode),
|
||||||
|
|
@ -2062,6 +2078,7 @@ class _$CompanyEntity extends CompanyEntity {
|
||||||
..add('payments', payments)
|
..add('payments', payments)
|
||||||
..add('quotes', quotes)
|
..add('quotes', quotes)
|
||||||
..add('credits', credits)
|
..add('credits', credits)
|
||||||
|
..add('purchaseOrders', purchaseOrders)
|
||||||
..add('tasks', tasks)
|
..add('tasks', tasks)
|
||||||
..add('projects', projects)
|
..add('projects', projects)
|
||||||
..add('expenses', expenses)
|
..add('expenses', expenses)
|
||||||
|
|
@ -2394,6 +2411,12 @@ class CompanyEntityBuilder
|
||||||
_$this._credits ??= new ListBuilder<InvoiceEntity>();
|
_$this._credits ??= new ListBuilder<InvoiceEntity>();
|
||||||
set credits(ListBuilder<InvoiceEntity> credits) => _$this._credits = credits;
|
set credits(ListBuilder<InvoiceEntity> credits) => _$this._credits = credits;
|
||||||
|
|
||||||
|
ListBuilder<InvoiceEntity> _purchaseOrders;
|
||||||
|
ListBuilder<InvoiceEntity> get purchaseOrders =>
|
||||||
|
_$this._purchaseOrders ??= new ListBuilder<InvoiceEntity>();
|
||||||
|
set purchaseOrders(ListBuilder<InvoiceEntity> purchaseOrders) =>
|
||||||
|
_$this._purchaseOrders = purchaseOrders;
|
||||||
|
|
||||||
ListBuilder<TaskEntity> _tasks;
|
ListBuilder<TaskEntity> _tasks;
|
||||||
ListBuilder<TaskEntity> get tasks =>
|
ListBuilder<TaskEntity> get tasks =>
|
||||||
_$this._tasks ??= new ListBuilder<TaskEntity>();
|
_$this._tasks ??= new ListBuilder<TaskEntity>();
|
||||||
|
|
@ -2647,6 +2670,7 @@ class CompanyEntityBuilder
|
||||||
_payments = $v.payments.toBuilder();
|
_payments = $v.payments.toBuilder();
|
||||||
_quotes = $v.quotes.toBuilder();
|
_quotes = $v.quotes.toBuilder();
|
||||||
_credits = $v.credits.toBuilder();
|
_credits = $v.credits.toBuilder();
|
||||||
|
_purchaseOrders = $v.purchaseOrders.toBuilder();
|
||||||
_tasks = $v.tasks.toBuilder();
|
_tasks = $v.tasks.toBuilder();
|
||||||
_projects = $v.projects.toBuilder();
|
_projects = $v.projects.toBuilder();
|
||||||
_expenses = $v.expenses.toBuilder();
|
_expenses = $v.expenses.toBuilder();
|
||||||
|
|
@ -2777,6 +2801,7 @@ class CompanyEntityBuilder
|
||||||
payments: payments.build(),
|
payments: payments.build(),
|
||||||
quotes: quotes.build(),
|
quotes: quotes.build(),
|
||||||
credits: credits.build(),
|
credits: credits.build(),
|
||||||
|
purchaseOrders: purchaseOrders.build(),
|
||||||
tasks: tasks.build(),
|
tasks: tasks.build(),
|
||||||
projects: projects.build(),
|
projects: projects.build(),
|
||||||
expenses: expenses.build(),
|
expenses: expenses.build(),
|
||||||
|
|
@ -2849,6 +2874,8 @@ class CompanyEntityBuilder
|
||||||
quotes.build();
|
quotes.build();
|
||||||
_$failedField = 'credits';
|
_$failedField = 'credits';
|
||||||
credits.build();
|
credits.build();
|
||||||
|
_$failedField = 'purchaseOrders';
|
||||||
|
purchaseOrders.build();
|
||||||
_$failedField = 'tasks';
|
_$failedField = 'tasks';
|
||||||
tasks.build();
|
tasks.build();
|
||||||
_$failedField = 'projects';
|
_$failedField = 'projects';
|
||||||
|
|
|
||||||
|
|
@ -62,6 +62,7 @@ class EntityType extends EnumClass {
|
||||||
static const EntityType timezone = _$timezone;
|
static const EntityType timezone = _$timezone;
|
||||||
static const EntityType dateFormat = _$dateFormat;
|
static const EntityType dateFormat = _$dateFormat;
|
||||||
static const EntityType font = _$font;
|
static const EntityType font = _$font;
|
||||||
|
static const EntityType purchaseOrder = _$purchaseOrder;
|
||||||
|
|
||||||
String get plural {
|
String get plural {
|
||||||
if (this == EntityType.expenseCategory) {
|
if (this == EntityType.expenseCategory) {
|
||||||
|
|
|
||||||
|
|
@ -50,6 +50,7 @@ const EntityType _$document = const EntityType._('document');
|
||||||
const EntityType _$timezone = const EntityType._('timezone');
|
const EntityType _$timezone = const EntityType._('timezone');
|
||||||
const EntityType _$dateFormat = const EntityType._('dateFormat');
|
const EntityType _$dateFormat = const EntityType._('dateFormat');
|
||||||
const EntityType _$font = const EntityType._('font');
|
const EntityType _$font = const EntityType._('font');
|
||||||
|
const EntityType _$purchaseOrder = const EntityType._('purchaseOrder');
|
||||||
|
|
||||||
EntityType _$typeValueOf(String name) {
|
EntityType _$typeValueOf(String name) {
|
||||||
switch (name) {
|
switch (name) {
|
||||||
|
|
@ -141,6 +142,8 @@ EntityType _$typeValueOf(String name) {
|
||||||
return _$dateFormat;
|
return _$dateFormat;
|
||||||
case 'font':
|
case 'font':
|
||||||
return _$font;
|
return _$font;
|
||||||
|
case 'purchaseOrder':
|
||||||
|
return _$purchaseOrder;
|
||||||
default:
|
default:
|
||||||
throw new ArgumentError(name);
|
throw new ArgumentError(name);
|
||||||
}
|
}
|
||||||
|
|
@ -192,6 +195,7 @@ final BuiltSet<EntityType> _$typeValues =
|
||||||
_$timezone,
|
_$timezone,
|
||||||
_$dateFormat,
|
_$dateFormat,
|
||||||
_$font,
|
_$font,
|
||||||
|
_$purchaseOrder,
|
||||||
]);
|
]);
|
||||||
|
|
||||||
const EntityState _$active = const EntityState._('active');
|
const EntityState _$active = const EntityState._('active');
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,52 @@
|
||||||
|
class PurchaseOrderFields {
|
||||||
|
static const String total = 'total';
|
||||||
|
static const String amount = 'amount';
|
||||||
|
static const String balance = 'balance';
|
||||||
|
static const String balanceDue = 'balance_due';
|
||||||
|
static const String clientId = 'client_id';
|
||||||
|
static const String client = 'client';
|
||||||
|
static const String project = 'project';
|
||||||
|
static const String vendor = 'vendor';
|
||||||
|
static const String statusId = 'status_id';
|
||||||
|
static const String status = 'status';
|
||||||
|
static const String number = 'number';
|
||||||
|
static const String discount = 'discount';
|
||||||
|
static const String poNumber = 'po_number';
|
||||||
|
static const String date = 'date';
|
||||||
|
static const String dueDate = 'due_date';
|
||||||
|
static const String nextSendDate = 'next_send_date';
|
||||||
|
static const String lastSentDate = 'last_sent_date';
|
||||||
|
static const String terms = 'terms';
|
||||||
|
static const String footer = 'footer';
|
||||||
|
static const String partial = 'partial_due';
|
||||||
|
static const String partialDueDate = 'partial_due_date';
|
||||||
|
static const String publicNotes = 'public_notes';
|
||||||
|
static const String privateNotes = 'private_notes';
|
||||||
|
static const String isRecurring = 'is_recurring';
|
||||||
|
static const String frequencyId = 'frequency_id';
|
||||||
|
static const String documents = 'documents';
|
||||||
|
static const String customValue1 = 'custom1';
|
||||||
|
static const String customValue2 = 'custom2';
|
||||||
|
static const String customValue3 = 'custom3';
|
||||||
|
static const String customValue4 = 'custom4';
|
||||||
|
static const String customSurcharge1 = 'custom_surcharge1';
|
||||||
|
static const String customSurcharge2 = 'custom_surcharge2';
|
||||||
|
static const String customSurcharge3 = 'custom_surcharge3';
|
||||||
|
static const String customSurcharge4 = 'custom_surcharge4';
|
||||||
|
static const String taxAmount = 'tax_amount';
|
||||||
|
static const String reminder1Sent = 'reminder1_sent';
|
||||||
|
static const String reminder2Sent = 'reminder2_sent';
|
||||||
|
static const String reminder3Sent = 'reminder3_sent';
|
||||||
|
static const String reminderLastSent = 'reminder_last_sent';
|
||||||
|
static const String exchangeRate = 'exchange_rate';
|
||||||
|
static const String isViewed = 'is_viewed';
|
||||||
|
static const String autoBillEnabled = 'auto_bill_enabled';
|
||||||
|
static const String contactName = 'contact_name';
|
||||||
|
static const String contactEmail = 'contact_email';
|
||||||
|
static const String clientCity = 'client_city';
|
||||||
|
static const String clientState = 'client_state';
|
||||||
|
static const String clientPostalCode = 'client_postal_code';
|
||||||
|
static const String clientCountry = 'client_country';
|
||||||
|
static const String quote = 'quote';
|
||||||
|
static const String recurringInvoice = 'recurring_invoice';
|
||||||
|
}
|
||||||
|
|
@ -1,47 +1,3 @@
|
||||||
// Package imports:
|
|
||||||
import 'package:built_collection/built_collection.dart';
|
|
||||||
import 'package:built_value/built_value.dart';
|
|
||||||
import 'package:built_value/serializer.dart';
|
|
||||||
|
|
||||||
// Project imports:
|
|
||||||
import 'package:invoiceninja_flutter/data/models/models.dart';
|
|
||||||
|
|
||||||
part 'quote_model.g.dart';
|
|
||||||
|
|
||||||
abstract class QuoteListResponse
|
|
||||||
implements Built<QuoteListResponse, QuoteListResponseBuilder> {
|
|
||||||
factory QuoteListResponse([void updates(QuoteListResponseBuilder b)]) =
|
|
||||||
_$QuoteListResponse;
|
|
||||||
|
|
||||||
QuoteListResponse._();
|
|
||||||
|
|
||||||
@override
|
|
||||||
@memoized
|
|
||||||
int get hashCode;
|
|
||||||
|
|
||||||
BuiltList<InvoiceEntity> get data;
|
|
||||||
|
|
||||||
static Serializer<QuoteListResponse> get serializer =>
|
|
||||||
_$quoteListResponseSerializer;
|
|
||||||
}
|
|
||||||
|
|
||||||
abstract class QuoteItemResponse
|
|
||||||
implements Built<QuoteItemResponse, QuoteItemResponseBuilder> {
|
|
||||||
factory QuoteItemResponse([void updates(QuoteItemResponseBuilder b)]) =
|
|
||||||
_$QuoteItemResponse;
|
|
||||||
|
|
||||||
QuoteItemResponse._();
|
|
||||||
|
|
||||||
@override
|
|
||||||
@memoized
|
|
||||||
int get hashCode;
|
|
||||||
|
|
||||||
InvoiceEntity get data;
|
|
||||||
|
|
||||||
static Serializer<QuoteItemResponse> get serializer =>
|
|
||||||
_$quoteItemResponseSerializer;
|
|
||||||
}
|
|
||||||
|
|
||||||
class QuoteFields {
|
class QuoteFields {
|
||||||
static const String total = 'total';
|
static const String total = 'total';
|
||||||
static const String amount = 'amount';
|
static const String amount = 'amount';
|
||||||
|
|
|
||||||
|
|
@ -1,282 +0,0 @@
|
||||||
// GENERATED CODE - DO NOT MODIFY BY HAND
|
|
||||||
|
|
||||||
part of 'quote_model.dart';
|
|
||||||
|
|
||||||
// **************************************************************************
|
|
||||||
// BuiltValueGenerator
|
|
||||||
// **************************************************************************
|
|
||||||
|
|
||||||
Serializer<QuoteListResponse> _$quoteListResponseSerializer =
|
|
||||||
new _$QuoteListResponseSerializer();
|
|
||||||
Serializer<QuoteItemResponse> _$quoteItemResponseSerializer =
|
|
||||||
new _$QuoteItemResponseSerializer();
|
|
||||||
|
|
||||||
class _$QuoteListResponseSerializer
|
|
||||||
implements StructuredSerializer<QuoteListResponse> {
|
|
||||||
@override
|
|
||||||
final Iterable<Type> types = const [QuoteListResponse, _$QuoteListResponse];
|
|
||||||
@override
|
|
||||||
final String wireName = 'QuoteListResponse';
|
|
||||||
|
|
||||||
@override
|
|
||||||
Iterable<Object> serialize(Serializers serializers, QuoteListResponse object,
|
|
||||||
{FullType specifiedType = FullType.unspecified}) {
|
|
||||||
final result = <Object>[
|
|
||||||
'data',
|
|
||||||
serializers.serialize(object.data,
|
|
||||||
specifiedType:
|
|
||||||
const FullType(BuiltList, const [const FullType(InvoiceEntity)])),
|
|
||||||
];
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
QuoteListResponse deserialize(
|
|
||||||
Serializers serializers, Iterable<Object> serialized,
|
|
||||||
{FullType specifiedType = FullType.unspecified}) {
|
|
||||||
final result = new QuoteListResponseBuilder();
|
|
||||||
|
|
||||||
final iterator = serialized.iterator;
|
|
||||||
while (iterator.moveNext()) {
|
|
||||||
final key = iterator.current as String;
|
|
||||||
iterator.moveNext();
|
|
||||||
final Object value = iterator.current;
|
|
||||||
switch (key) {
|
|
||||||
case 'data':
|
|
||||||
result.data.replace(serializers.deserialize(value,
|
|
||||||
specifiedType: const FullType(
|
|
||||||
BuiltList, const [const FullType(InvoiceEntity)]))
|
|
||||||
as BuiltList<Object>);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return result.build();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class _$QuoteItemResponseSerializer
|
|
||||||
implements StructuredSerializer<QuoteItemResponse> {
|
|
||||||
@override
|
|
||||||
final Iterable<Type> types = const [QuoteItemResponse, _$QuoteItemResponse];
|
|
||||||
@override
|
|
||||||
final String wireName = 'QuoteItemResponse';
|
|
||||||
|
|
||||||
@override
|
|
||||||
Iterable<Object> serialize(Serializers serializers, QuoteItemResponse object,
|
|
||||||
{FullType specifiedType = FullType.unspecified}) {
|
|
||||||
final result = <Object>[
|
|
||||||
'data',
|
|
||||||
serializers.serialize(object.data,
|
|
||||||
specifiedType: const FullType(InvoiceEntity)),
|
|
||||||
];
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
QuoteItemResponse deserialize(
|
|
||||||
Serializers serializers, Iterable<Object> serialized,
|
|
||||||
{FullType specifiedType = FullType.unspecified}) {
|
|
||||||
final result = new QuoteItemResponseBuilder();
|
|
||||||
|
|
||||||
final iterator = serialized.iterator;
|
|
||||||
while (iterator.moveNext()) {
|
|
||||||
final key = iterator.current as String;
|
|
||||||
iterator.moveNext();
|
|
||||||
final Object value = iterator.current;
|
|
||||||
switch (key) {
|
|
||||||
case 'data':
|
|
||||||
result.data.replace(serializers.deserialize(value,
|
|
||||||
specifiedType: const FullType(InvoiceEntity)) as InvoiceEntity);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return result.build();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class _$QuoteListResponse extends QuoteListResponse {
|
|
||||||
@override
|
|
||||||
final BuiltList<InvoiceEntity> data;
|
|
||||||
|
|
||||||
factory _$QuoteListResponse(
|
|
||||||
[void Function(QuoteListResponseBuilder) updates]) =>
|
|
||||||
(new QuoteListResponseBuilder()..update(updates)).build();
|
|
||||||
|
|
||||||
_$QuoteListResponse._({this.data}) : super._() {
|
|
||||||
BuiltValueNullFieldError.checkNotNull(data, 'QuoteListResponse', 'data');
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
QuoteListResponse rebuild(void Function(QuoteListResponseBuilder) updates) =>
|
|
||||||
(toBuilder()..update(updates)).build();
|
|
||||||
|
|
||||||
@override
|
|
||||||
QuoteListResponseBuilder toBuilder() =>
|
|
||||||
new QuoteListResponseBuilder()..replace(this);
|
|
||||||
|
|
||||||
@override
|
|
||||||
bool operator ==(Object other) {
|
|
||||||
if (identical(other, this)) return true;
|
|
||||||
return other is QuoteListResponse && data == other.data;
|
|
||||||
}
|
|
||||||
|
|
||||||
int __hashCode;
|
|
||||||
@override
|
|
||||||
int get hashCode {
|
|
||||||
return __hashCode ??= $jf($jc(0, data.hashCode));
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String toString() {
|
|
||||||
return (newBuiltValueToStringHelper('QuoteListResponse')..add('data', data))
|
|
||||||
.toString();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class QuoteListResponseBuilder
|
|
||||||
implements Builder<QuoteListResponse, QuoteListResponseBuilder> {
|
|
||||||
_$QuoteListResponse _$v;
|
|
||||||
|
|
||||||
ListBuilder<InvoiceEntity> _data;
|
|
||||||
ListBuilder<InvoiceEntity> get data =>
|
|
||||||
_$this._data ??= new ListBuilder<InvoiceEntity>();
|
|
||||||
set data(ListBuilder<InvoiceEntity> data) => _$this._data = data;
|
|
||||||
|
|
||||||
QuoteListResponseBuilder();
|
|
||||||
|
|
||||||
QuoteListResponseBuilder get _$this {
|
|
||||||
final $v = _$v;
|
|
||||||
if ($v != null) {
|
|
||||||
_data = $v.data.toBuilder();
|
|
||||||
_$v = null;
|
|
||||||
}
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
void replace(QuoteListResponse other) {
|
|
||||||
ArgumentError.checkNotNull(other, 'other');
|
|
||||||
_$v = other as _$QuoteListResponse;
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
void update(void Function(QuoteListResponseBuilder) updates) {
|
|
||||||
if (updates != null) updates(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
_$QuoteListResponse build() {
|
|
||||||
_$QuoteListResponse _$result;
|
|
||||||
try {
|
|
||||||
_$result = _$v ?? new _$QuoteListResponse._(data: data.build());
|
|
||||||
} catch (_) {
|
|
||||||
String _$failedField;
|
|
||||||
try {
|
|
||||||
_$failedField = 'data';
|
|
||||||
data.build();
|
|
||||||
} catch (e) {
|
|
||||||
throw new BuiltValueNestedFieldError(
|
|
||||||
'QuoteListResponse', _$failedField, e.toString());
|
|
||||||
}
|
|
||||||
rethrow;
|
|
||||||
}
|
|
||||||
replace(_$result);
|
|
||||||
return _$result;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class _$QuoteItemResponse extends QuoteItemResponse {
|
|
||||||
@override
|
|
||||||
final InvoiceEntity data;
|
|
||||||
|
|
||||||
factory _$QuoteItemResponse(
|
|
||||||
[void Function(QuoteItemResponseBuilder) updates]) =>
|
|
||||||
(new QuoteItemResponseBuilder()..update(updates)).build();
|
|
||||||
|
|
||||||
_$QuoteItemResponse._({this.data}) : super._() {
|
|
||||||
BuiltValueNullFieldError.checkNotNull(data, 'QuoteItemResponse', 'data');
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
QuoteItemResponse rebuild(void Function(QuoteItemResponseBuilder) updates) =>
|
|
||||||
(toBuilder()..update(updates)).build();
|
|
||||||
|
|
||||||
@override
|
|
||||||
QuoteItemResponseBuilder toBuilder() =>
|
|
||||||
new QuoteItemResponseBuilder()..replace(this);
|
|
||||||
|
|
||||||
@override
|
|
||||||
bool operator ==(Object other) {
|
|
||||||
if (identical(other, this)) return true;
|
|
||||||
return other is QuoteItemResponse && data == other.data;
|
|
||||||
}
|
|
||||||
|
|
||||||
int __hashCode;
|
|
||||||
@override
|
|
||||||
int get hashCode {
|
|
||||||
return __hashCode ??= $jf($jc(0, data.hashCode));
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String toString() {
|
|
||||||
return (newBuiltValueToStringHelper('QuoteItemResponse')..add('data', data))
|
|
||||||
.toString();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class QuoteItemResponseBuilder
|
|
||||||
implements Builder<QuoteItemResponse, QuoteItemResponseBuilder> {
|
|
||||||
_$QuoteItemResponse _$v;
|
|
||||||
|
|
||||||
InvoiceEntityBuilder _data;
|
|
||||||
InvoiceEntityBuilder get data => _$this._data ??= new InvoiceEntityBuilder();
|
|
||||||
set data(InvoiceEntityBuilder data) => _$this._data = data;
|
|
||||||
|
|
||||||
QuoteItemResponseBuilder();
|
|
||||||
|
|
||||||
QuoteItemResponseBuilder get _$this {
|
|
||||||
final $v = _$v;
|
|
||||||
if ($v != null) {
|
|
||||||
_data = $v.data.toBuilder();
|
|
||||||
_$v = null;
|
|
||||||
}
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
void replace(QuoteItemResponse other) {
|
|
||||||
ArgumentError.checkNotNull(other, 'other');
|
|
||||||
_$v = other as _$QuoteItemResponse;
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
void update(void Function(QuoteItemResponseBuilder) updates) {
|
|
||||||
if (updates != null) updates(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
_$QuoteItemResponse build() {
|
|
||||||
_$QuoteItemResponse _$result;
|
|
||||||
try {
|
|
||||||
_$result = _$v ?? new _$QuoteItemResponse._(data: data.build());
|
|
||||||
} catch (_) {
|
|
||||||
String _$failedField;
|
|
||||||
try {
|
|
||||||
_$failedField = 'data';
|
|
||||||
data.build();
|
|
||||||
} catch (e) {
|
|
||||||
throw new BuiltValueNestedFieldError(
|
|
||||||
'QuoteItemResponse', _$failedField, e.toString());
|
|
||||||
}
|
|
||||||
rethrow;
|
|
||||||
}
|
|
||||||
replace(_$result);
|
|
||||||
return _$result;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// ignore_for_file: always_put_control_body_on_new_line,always_specify_types,annotate_overrides,avoid_annotating_with_dynamic,avoid_as,avoid_catches_without_on_clauses,avoid_returning_this,deprecated_member_use_from_same_package,lines_longer_than_80_chars,omit_local_variable_types,prefer_expression_function_bodies,sort_constructors_first,test_types_in_equals,unnecessary_const,unnecessary_new
|
|
||||||
|
|
@ -31,6 +31,7 @@ import 'package:invoiceninja_flutter/redux/payment/payment_state.dart';
|
||||||
import 'package:invoiceninja_flutter/redux/payment_term/payment_term_state.dart';
|
import 'package:invoiceninja_flutter/redux/payment_term/payment_term_state.dart';
|
||||||
import 'package:invoiceninja_flutter/redux/product/product_state.dart';
|
import 'package:invoiceninja_flutter/redux/product/product_state.dart';
|
||||||
import 'package:invoiceninja_flutter/redux/project/project_state.dart';
|
import 'package:invoiceninja_flutter/redux/project/project_state.dart';
|
||||||
|
import 'package:invoiceninja_flutter/redux/purchase_order/purchase_order_state.dart';
|
||||||
import 'package:invoiceninja_flutter/redux/quote/quote_state.dart';
|
import 'package:invoiceninja_flutter/redux/quote/quote_state.dart';
|
||||||
import 'package:invoiceninja_flutter/redux/recurring_expense/recurring_expense_state.dart';
|
import 'package:invoiceninja_flutter/redux/recurring_expense/recurring_expense_state.dart';
|
||||||
import 'package:invoiceninja_flutter/redux/recurring_invoice/recurring_invoice_state.dart';
|
import 'package:invoiceninja_flutter/redux/recurring_invoice/recurring_invoice_state.dart';
|
||||||
|
|
@ -113,6 +114,9 @@ part 'serializers.g.dart';
|
||||||
TaxRateItemResponse,
|
TaxRateItemResponse,
|
||||||
TaxRateListResponse,
|
TaxRateListResponse,
|
||||||
// STARTER: serializers - do not remove comment
|
// STARTER: serializers - do not remove comment
|
||||||
|
InvoiceListResponse,
|
||||||
|
InvoiceItemResponse,
|
||||||
|
|
||||||
SubscriptionEntity,
|
SubscriptionEntity,
|
||||||
SubscriptionListResponse,
|
SubscriptionListResponse,
|
||||||
SubscriptionItemResponse,
|
SubscriptionItemResponse,
|
||||||
|
|
|
||||||
|
|
@ -138,6 +138,8 @@ Serializers _$serializers = (new Serializers().toBuilder()
|
||||||
..add(ProjectListResponse.serializer)
|
..add(ProjectListResponse.serializer)
|
||||||
..add(ProjectState.serializer)
|
..add(ProjectState.serializer)
|
||||||
..add(ProjectUIState.serializer)
|
..add(ProjectUIState.serializer)
|
||||||
|
..add(PurchaseOrderState.serializer)
|
||||||
|
..add(PurchaseOrderUIState.serializer)
|
||||||
..add(QuoteState.serializer)
|
..add(QuoteState.serializer)
|
||||||
..add(QuoteUIState.serializer)
|
..add(QuoteUIState.serializer)
|
||||||
..add(RecurringExpenseState.serializer)
|
..add(RecurringExpenseState.serializer)
|
||||||
|
|
@ -402,6 +404,9 @@ Serializers _$serializers = (new Serializers().toBuilder()
|
||||||
..addBuilderFactory(
|
..addBuilderFactory(
|
||||||
const FullType(BuiltList, const [const FullType(InvoiceEntity)]),
|
const FullType(BuiltList, const [const FullType(InvoiceEntity)]),
|
||||||
() => new ListBuilder<InvoiceEntity>())
|
() => new ListBuilder<InvoiceEntity>())
|
||||||
|
..addBuilderFactory(
|
||||||
|
const FullType(BuiltList, const [const FullType(InvoiceEntity)]),
|
||||||
|
() => new ListBuilder<InvoiceEntity>())
|
||||||
..addBuilderFactory(
|
..addBuilderFactory(
|
||||||
const FullType(BuiltList, const [const FullType(TaskEntity)]),
|
const FullType(BuiltList, const [const FullType(TaskEntity)]),
|
||||||
() => new ListBuilder<TaskEntity>())
|
() => new ListBuilder<TaskEntity>())
|
||||||
|
|
@ -752,6 +757,13 @@ Serializers _$serializers = (new Serializers().toBuilder()
|
||||||
..addBuilderFactory(
|
..addBuilderFactory(
|
||||||
const FullType(BuiltList, const [const FullType(String)]),
|
const FullType(BuiltList, const [const FullType(String)]),
|
||||||
() => new ListBuilder<String>())
|
() => new ListBuilder<String>())
|
||||||
|
..addBuilderFactory(
|
||||||
|
const FullType(BuiltMap,
|
||||||
|
const [const FullType(String), const FullType(InvoiceEntity)]),
|
||||||
|
() => new MapBuilder<String, InvoiceEntity>())
|
||||||
|
..addBuilderFactory(
|
||||||
|
const FullType(BuiltList, const [const FullType(String)]),
|
||||||
|
() => new ListBuilder<String>())
|
||||||
..addBuilderFactory(
|
..addBuilderFactory(
|
||||||
const FullType(BuiltMap,
|
const FullType(BuiltMap,
|
||||||
const [const FullType(String), const FullType(PaymentEntity)]),
|
const [const FullType(String), const FullType(PaymentEntity)]),
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,75 @@
|
||||||
|
import 'dart:convert';
|
||||||
|
import 'dart:core';
|
||||||
|
import 'package:built_collection/built_collection.dart';
|
||||||
|
import 'package:invoiceninja_flutter/constants.dart';
|
||||||
|
import 'package:invoiceninja_flutter/data/models/serializers.dart';
|
||||||
|
import 'package:invoiceninja_flutter/redux/app/app_state.dart';
|
||||||
|
import 'package:invoiceninja_flutter/data/models/models.dart';
|
||||||
|
import 'package:invoiceninja_flutter/data/web_client.dart';
|
||||||
|
|
||||||
|
class PurchaseOrderRepository {
|
||||||
|
const PurchaseOrderRepository({
|
||||||
|
this.webClient = const WebClient(),
|
||||||
|
});
|
||||||
|
|
||||||
|
final WebClient webClient;
|
||||||
|
|
||||||
|
Future<InvoiceEntity> loadItem(
|
||||||
|
Credentials credentials, String entityId) async {
|
||||||
|
final dynamic response = await webClient.get(
|
||||||
|
'${credentials.url}/purchase_orders/$entityId', credentials.token);
|
||||||
|
|
||||||
|
final InvoiceItemResponse purchaseOrderResponse =
|
||||||
|
serializers.deserializeWith(InvoiceItemResponse.serializer, response);
|
||||||
|
|
||||||
|
return purchaseOrderResponse.data;
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<BuiltList<InvoiceEntity>> loadList(Credentials credentials) async {
|
||||||
|
final String url = credentials.url + '/purchase_orders?';
|
||||||
|
final dynamic response = await webClient.get(url, credentials.token);
|
||||||
|
|
||||||
|
final InvoiceListResponse purchaseOrderResponse =
|
||||||
|
serializers.deserializeWith(InvoiceListResponse.serializer, response);
|
||||||
|
|
||||||
|
return purchaseOrderResponse.data;
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<List<InvoiceEntity>> bulkAction(
|
||||||
|
Credentials credentials, List<String> ids, EntityAction action) async {
|
||||||
|
if (ids.length > kMaxEntitiesPerBulkAction) {
|
||||||
|
ids = ids.sublist(0, kMaxEntitiesPerBulkAction);
|
||||||
|
}
|
||||||
|
|
||||||
|
final url = credentials.url + '/purchase_orders/bulk';
|
||||||
|
final dynamic response = await webClient.post(url, credentials.token,
|
||||||
|
data: json.encode({'ids': ids, 'action': action.toApiParam()}));
|
||||||
|
|
||||||
|
final InvoiceListResponse purchaseOrderResponse =
|
||||||
|
serializers.deserializeWith(InvoiceListResponse.serializer, response);
|
||||||
|
|
||||||
|
return purchaseOrderResponse.data.toList();
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<InvoiceEntity> saveData(
|
||||||
|
Credentials credentials, InvoiceEntity purchaseOrder) async {
|
||||||
|
final data =
|
||||||
|
serializers.serializeWith(InvoiceEntity.serializer, purchaseOrder);
|
||||||
|
dynamic response;
|
||||||
|
|
||||||
|
if (purchaseOrder.isNew) {
|
||||||
|
response = await webClient.post(
|
||||||
|
credentials.url + '/purchase_orders', credentials.token,
|
||||||
|
data: json.encode(data));
|
||||||
|
} else {
|
||||||
|
final url = '${credentials.url}/purchase_orders/${purchaseOrder.id}';
|
||||||
|
response =
|
||||||
|
await webClient.put(url, credentials.token, data: json.encode(data));
|
||||||
|
}
|
||||||
|
|
||||||
|
final InvoiceItemResponse purchaseOrderResponse =
|
||||||
|
serializers.deserializeWith(InvoiceItemResponse.serializer, response);
|
||||||
|
|
||||||
|
return purchaseOrderResponse.data;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -57,6 +57,7 @@ import 'package:invoiceninja_flutter/utils/web_stub.dart'
|
||||||
if (dart.library.html) 'package:invoiceninja_flutter/utils/web.dart';
|
if (dart.library.html) 'package:invoiceninja_flutter/utils/web.dart';
|
||||||
|
|
||||||
// STARTER: import - do not remove comment
|
// STARTER: import - do not remove comment
|
||||||
|
import 'package:invoiceninja_flutter/redux/purchase_order/purchase_order_middleware.dart';
|
||||||
|
|
||||||
void main({bool isTesting = false}) async {
|
void main({bool isTesting = false}) async {
|
||||||
WidgetsFlutterBinding.ensureInitialized();
|
WidgetsFlutterBinding.ensureInitialized();
|
||||||
|
|
@ -79,6 +80,7 @@ void main({bool isTesting = false}) async {
|
||||||
..addAll(createStoreSettingsMiddleware())
|
..addAll(createStoreSettingsMiddleware())
|
||||||
..addAll(createStoreReportsMiddleware())
|
..addAll(createStoreReportsMiddleware())
|
||||||
// STARTER: middleware - do not remove comment
|
// STARTER: middleware - do not remove comment
|
||||||
|
..addAll(createStorePurchaseOrdersMiddleware())
|
||||||
..addAll(createStoreRecurringExpensesMiddleware())
|
..addAll(createStoreRecurringExpensesMiddleware())
|
||||||
..addAll(createStoreSubscriptionsMiddleware())
|
..addAll(createStoreSubscriptionsMiddleware())
|
||||||
..addAll(createStoreTaskStatusesMiddleware())
|
..addAll(createStoreTaskStatusesMiddleware())
|
||||||
|
|
|
||||||
|
|
@ -94,6 +94,10 @@ import 'package:invoiceninja_flutter/utils/localization.dart';
|
||||||
import 'package:invoiceninja_flutter/utils/platforms.dart';
|
import 'package:invoiceninja_flutter/utils/platforms.dart';
|
||||||
|
|
||||||
// STARTER: import - do not remove comment
|
// STARTER: import - do not remove comment
|
||||||
|
import 'package:invoiceninja_flutter/ui/purchase_order/purchase_order_screen.dart';
|
||||||
|
import 'package:invoiceninja_flutter/ui/purchase_order/edit/purchase_order_edit_vm.dart';
|
||||||
|
import 'package:invoiceninja_flutter/ui/purchase_order/view/purchase_order_view_vm.dart';
|
||||||
|
import 'package:invoiceninja_flutter/ui/purchase_order/purchase_order_screen_vm.dart';
|
||||||
|
|
||||||
import 'package:invoiceninja_flutter/utils/web_stub.dart'
|
import 'package:invoiceninja_flutter/utils/web_stub.dart'
|
||||||
if (dart.library.html) 'package:invoiceninja_flutter/utils/web.dart';
|
if (dart.library.html) 'package:invoiceninja_flutter/utils/web.dart';
|
||||||
|
|
@ -490,6 +494,13 @@ class InvoiceNinjaAppState extends State<InvoiceNinjaApp> {
|
||||||
QuoteEmailScreen.route: (context) => QuoteEmailScreen(),
|
QuoteEmailScreen.route: (context) => QuoteEmailScreen(),
|
||||||
QuotePdfScreen.route: (context) => QuotePdfScreen(),
|
QuotePdfScreen.route: (context) => QuotePdfScreen(),
|
||||||
// STARTER: routes - do not remove comment
|
// STARTER: routes - do not remove comment
|
||||||
|
PurchaseOrderScreen.route: (context) =>
|
||||||
|
PurchaseOrderScreenBuilder(),
|
||||||
|
PurchaseOrderViewScreen.route: (context) =>
|
||||||
|
PurchaseOrderViewScreen(),
|
||||||
|
PurchaseOrderEditScreen.route: (context) =>
|
||||||
|
PurchaseOrderEditScreen(),
|
||||||
|
|
||||||
RecurringExpenseScreen.route: (context) =>
|
RecurringExpenseScreen.route: (context) =>
|
||||||
RecurringExpenseScreenBuilder(),
|
RecurringExpenseScreenBuilder(),
|
||||||
RecurringExpenseViewScreen.route: (context) =>
|
RecurringExpenseViewScreen.route: (context) =>
|
||||||
|
|
|
||||||
|
|
@ -64,6 +64,7 @@ import 'package:invoiceninja_flutter/utils/localization.dart';
|
||||||
import 'package:invoiceninja_flutter/utils/platforms.dart';
|
import 'package:invoiceninja_flutter/utils/platforms.dart';
|
||||||
|
|
||||||
// STARTER: import - do not remove comment
|
// STARTER: import - do not remove comment
|
||||||
|
import 'package:invoiceninja_flutter/redux/purchase_order/purchase_order_actions.dart';
|
||||||
|
|
||||||
class PersistUI {}
|
class PersistUI {}
|
||||||
|
|
||||||
|
|
@ -380,6 +381,9 @@ void viewEntitiesByType({
|
||||||
action = ViewGroupList();
|
action = ViewGroupList();
|
||||||
break;
|
break;
|
||||||
// STARTER: view list - do not remove comment
|
// STARTER: view list - do not remove comment
|
||||||
|
case EntityType.purchaseOrder:
|
||||||
|
action = ViewPurchaseOrderList();
|
||||||
|
break;
|
||||||
case EntityType.recurringExpense:
|
case EntityType.recurringExpense:
|
||||||
action = ViewRecurringExpenseList();
|
action = ViewRecurringExpenseList();
|
||||||
break;
|
break;
|
||||||
|
|
@ -589,6 +593,13 @@ void viewEntityById({
|
||||||
));
|
));
|
||||||
break;
|
break;
|
||||||
// STARTER: view - do not remove comment
|
// STARTER: view - do not remove comment
|
||||||
|
case EntityType.purchaseOrder:
|
||||||
|
store.dispatch(ViewPurchaseOrder(
|
||||||
|
purchaseOrderId: entityId,
|
||||||
|
force: force,
|
||||||
|
));
|
||||||
|
break;
|
||||||
|
|
||||||
case EntityType.recurringExpense:
|
case EntityType.recurringExpense:
|
||||||
store.dispatch(ViewRecurringExpense(
|
store.dispatch(ViewRecurringExpense(
|
||||||
recurringExpenseId: entityId,
|
recurringExpenseId: entityId,
|
||||||
|
|
@ -814,6 +825,13 @@ void createEntityByType({
|
||||||
));
|
));
|
||||||
break;
|
break;
|
||||||
// STARTER: create type - do not remove comment
|
// STARTER: create type - do not remove comment
|
||||||
|
case EntityType.purchaseOrder:
|
||||||
|
store.dispatch(EditPurchaseOrder(
|
||||||
|
force: force,
|
||||||
|
purchaseOrder: InvoiceEntity(state: state),
|
||||||
|
));
|
||||||
|
break;
|
||||||
|
|
||||||
case EntityType.recurringExpense:
|
case EntityType.recurringExpense:
|
||||||
store.dispatch(EditRecurringExpense(
|
store.dispatch(EditRecurringExpense(
|
||||||
force: force,
|
force: force,
|
||||||
|
|
@ -1018,6 +1036,14 @@ void createEntity({
|
||||||
));
|
));
|
||||||
break;
|
break;
|
||||||
// STARTER: create - do not remove comment
|
// STARTER: create - do not remove comment
|
||||||
|
case EntityType.purchaseOrder:
|
||||||
|
store.dispatch(EditPurchaseOrder(
|
||||||
|
purchaseOrder: entity,
|
||||||
|
force: force,
|
||||||
|
completer: completer,
|
||||||
|
));
|
||||||
|
break;
|
||||||
|
|
||||||
case EntityType.recurringExpense:
|
case EntityType.recurringExpense:
|
||||||
store.dispatch(EditRecurringExpense(
|
store.dispatch(EditRecurringExpense(
|
||||||
recurringExpense: entity,
|
recurringExpense: entity,
|
||||||
|
|
@ -1204,6 +1230,11 @@ void editEntity({
|
||||||
));
|
));
|
||||||
break;
|
break;
|
||||||
// STARTER: edit - do not remove comment
|
// STARTER: edit - do not remove comment
|
||||||
|
case EntityType.purchaseOrder:
|
||||||
|
store.dispatch(
|
||||||
|
EditPurchaseOrder(purchaseOrder: entity, completer: completer));
|
||||||
|
break;
|
||||||
|
|
||||||
case EntityType.recurringExpense:
|
case EntityType.recurringExpense:
|
||||||
store.dispatch(EditRecurringExpense(
|
store.dispatch(EditRecurringExpense(
|
||||||
recurringExpense: entity, completer: completer));
|
recurringExpense: entity, completer: completer));
|
||||||
|
|
@ -1371,6 +1402,10 @@ void handleEntitiesActions(List<BaseEntity> entities, EntityAction action,
|
||||||
handleDocumentAction(context, entities, action);
|
handleDocumentAction(context, entities, action);
|
||||||
break;
|
break;
|
||||||
// STARTER: actions - do not remove comment
|
// STARTER: actions - do not remove comment
|
||||||
|
case EntityType.purchaseOrder:
|
||||||
|
handlePurchaseOrderAction(context, entities, action);
|
||||||
|
break;
|
||||||
|
|
||||||
case EntityType.recurringExpense:
|
case EntityType.recurringExpense:
|
||||||
handleRecurringExpenseAction(context, entities, action);
|
handleRecurringExpenseAction(context, entities, action);
|
||||||
break;
|
break;
|
||||||
|
|
|
||||||
|
|
@ -32,6 +32,7 @@ import 'package:invoiceninja_flutter/redux/vendor/vendor_actions.dart';
|
||||||
import 'package:invoiceninja_flutter/redux/webhook/webhook_actions.dart';
|
import 'package:invoiceninja_flutter/redux/webhook/webhook_actions.dart';
|
||||||
|
|
||||||
// STARTER: import - do not remove comment
|
// STARTER: import - do not remove comment
|
||||||
|
import 'package:invoiceninja_flutter/redux/purchase_order/purchase_order_actions.dart';
|
||||||
|
|
||||||
// We create the State reducer by combining many smaller reducers into one!
|
// We create the State reducer by combining many smaller reducers into one!
|
||||||
AppState appReducer(AppState state, dynamic action) {
|
AppState appReducer(AppState state, dynamic action) {
|
||||||
|
|
@ -101,6 +102,10 @@ final lastErrorReducer = combineReducers<String>([
|
||||||
return '${action.error}';
|
return '${action.error}';
|
||||||
}),
|
}),
|
||||||
// STARTER: errors - do not remove comment
|
// STARTER: errors - do not remove comment
|
||||||
|
TypedReducer<String, LoadPurchaseOrdersFailure>((state, action) {
|
||||||
|
return '${action.error}';
|
||||||
|
}),
|
||||||
|
|
||||||
TypedReducer<String, LoadRecurringExpensesFailure>((state, action) {
|
TypedReducer<String, LoadRecurringExpensesFailure>((state, action) {
|
||||||
return '${action.error}';
|
return '${action.error}';
|
||||||
}),
|
}),
|
||||||
|
|
|
||||||
|
|
@ -88,6 +88,9 @@ import 'package:invoiceninja_flutter/utils/formatting.dart';
|
||||||
import 'package:invoiceninja_flutter/utils/platforms.dart';
|
import 'package:invoiceninja_flutter/utils/platforms.dart';
|
||||||
|
|
||||||
// STARTER: import - do not remove comment
|
// STARTER: import - do not remove comment
|
||||||
|
import 'package:invoiceninja_flutter/redux/purchase_order/purchase_order_state.dart';
|
||||||
|
import 'package:invoiceninja_flutter/ui/purchase_order/edit/purchase_order_edit_vm.dart';
|
||||||
|
import 'package:invoiceninja_flutter/redux/purchase_order/purchase_order_selectors.dart';
|
||||||
|
|
||||||
part 'app_state.g.dart';
|
part 'app_state.g.dart';
|
||||||
|
|
||||||
|
|
@ -289,6 +292,9 @@ abstract class AppState implements Built<AppState, AppStateBuilder> {
|
||||||
case EntityType.invoice:
|
case EntityType.invoice:
|
||||||
return invoiceState.map;
|
return invoiceState.map;
|
||||||
// STARTER: states switch map - do not remove comment
|
// STARTER: states switch map - do not remove comment
|
||||||
|
case EntityType.purchaseOrder:
|
||||||
|
return purchaseOrderState.map;
|
||||||
|
|
||||||
case EntityType.recurringExpense:
|
case EntityType.recurringExpense:
|
||||||
return recurringExpenseState.map;
|
return recurringExpenseState.map;
|
||||||
|
|
||||||
|
|
@ -369,6 +375,9 @@ abstract class AppState implements Built<AppState, AppStateBuilder> {
|
||||||
case EntityType.invoice:
|
case EntityType.invoice:
|
||||||
return invoiceState.list;
|
return invoiceState.list;
|
||||||
// STARTER: states switch list - do not remove comment
|
// STARTER: states switch list - do not remove comment
|
||||||
|
case EntityType.purchaseOrder:
|
||||||
|
return purchaseOrderState.list;
|
||||||
|
|
||||||
case EntityType.recurringExpense:
|
case EntityType.recurringExpense:
|
||||||
return recurringExpenseState.list;
|
return recurringExpenseState.list;
|
||||||
|
|
||||||
|
|
@ -438,6 +447,9 @@ abstract class AppState implements Built<AppState, AppStateBuilder> {
|
||||||
case EntityType.invoice:
|
case EntityType.invoice:
|
||||||
return invoiceUIState;
|
return invoiceUIState;
|
||||||
// STARTER: states switch - do not remove comment
|
// STARTER: states switch - do not remove comment
|
||||||
|
case EntityType.purchaseOrder:
|
||||||
|
return purchaseOrderUIState;
|
||||||
|
|
||||||
case EntityType.recurringExpense:
|
case EntityType.recurringExpense:
|
||||||
return recurringExpenseUIState;
|
return recurringExpenseUIState;
|
||||||
case EntityType.subscription:
|
case EntityType.subscription:
|
||||||
|
|
@ -508,6 +520,12 @@ abstract class AppState implements Built<AppState, AppStateBuilder> {
|
||||||
ListUIState get invoiceListState => uiState.invoiceUIState.listUIState;
|
ListUIState get invoiceListState => uiState.invoiceUIState.listUIState;
|
||||||
|
|
||||||
// STARTER: state getters - do not remove comment
|
// STARTER: state getters - do not remove comment
|
||||||
|
PurchaseOrderState get purchaseOrderState =>
|
||||||
|
userCompanyState.purchaseOrderState;
|
||||||
|
ListUIState get purchaseOrderListState =>
|
||||||
|
uiState.purchaseOrderUIState.listUIState;
|
||||||
|
PurchaseOrderUIState get purchaseOrderUIState => uiState.purchaseOrderUIState;
|
||||||
|
|
||||||
RecurringExpenseState get recurringExpenseState =>
|
RecurringExpenseState get recurringExpenseState =>
|
||||||
userCompanyState.recurringExpenseState;
|
userCompanyState.recurringExpenseState;
|
||||||
ListUIState get recurringExpenseListState =>
|
ListUIState get recurringExpenseListState =>
|
||||||
|
|
@ -678,6 +696,10 @@ abstract class AppState implements Built<AppState, AppStateBuilder> {
|
||||||
case CreditEditScreen.route:
|
case CreditEditScreen.route:
|
||||||
return hasCreditChanges(creditUIState.editing, creditState.map);
|
return hasCreditChanges(creditUIState.editing, creditState.map);
|
||||||
// STARTER: has changes - do not remove comment
|
// STARTER: has changes - do not remove comment
|
||||||
|
case PurchaseOrderEditScreen.route:
|
||||||
|
return hasPurchaseOrderChanges(
|
||||||
|
purchaseOrderUIState.editing, purchaseOrderState.map);
|
||||||
|
|
||||||
case RecurringExpenseEditScreen.route:
|
case RecurringExpenseEditScreen.route:
|
||||||
return hasRecurringExpenseChanges(
|
return hasRecurringExpenseChanges(
|
||||||
recurringExpenseUIState.editing, recurringExpenseState.map);
|
recurringExpenseUIState.editing, recurringExpenseState.map);
|
||||||
|
|
|
||||||
|
|
@ -35,6 +35,7 @@ import 'package:invoiceninja_flutter/redux/vendor/vendor_reducer.dart';
|
||||||
import 'package:invoiceninja_flutter/redux/webhook/webhook_reducer.dart';
|
import 'package:invoiceninja_flutter/redux/webhook/webhook_reducer.dart';
|
||||||
|
|
||||||
// STARTER: import - do not remove comment
|
// STARTER: import - do not remove comment
|
||||||
|
import 'package:invoiceninja_flutter/redux/purchase_order/purchase_order_reducer.dart';
|
||||||
|
|
||||||
UserCompanyState companyReducer(UserCompanyState state, dynamic action) {
|
UserCompanyState companyReducer(UserCompanyState state, dynamic action) {
|
||||||
if (action is DeleteCompanySuccess) {
|
if (action is DeleteCompanySuccess) {
|
||||||
|
|
@ -52,6 +53,8 @@ UserCompanyState companyReducer(UserCompanyState state, dynamic action) {
|
||||||
..vendorState.replace(vendorsReducer(state.vendorState, action))
|
..vendorState.replace(vendorsReducer(state.vendorState, action))
|
||||||
..taskState.replace(tasksReducer(state.taskState, action))
|
..taskState.replace(tasksReducer(state.taskState, action))
|
||||||
// STARTER: reducer - do not remove comment
|
// STARTER: reducer - do not remove comment
|
||||||
|
..purchaseOrderState
|
||||||
|
.replace(purchaseOrdersReducer(state.purchaseOrderState, action))
|
||||||
..recurringExpenseState
|
..recurringExpenseState
|
||||||
.replace(recurringExpensesReducer(state.recurringExpenseState, action))
|
.replace(recurringExpensesReducer(state.recurringExpenseState, action))
|
||||||
..subscriptionState
|
..subscriptionState
|
||||||
|
|
|
||||||
|
|
@ -32,6 +32,7 @@ import 'package:invoiceninja_flutter/redux/vendor/vendor_state.dart';
|
||||||
import 'package:invoiceninja_flutter/redux/webhook/webhook_state.dart';
|
import 'package:invoiceninja_flutter/redux/webhook/webhook_state.dart';
|
||||||
|
|
||||||
// STARTER: import - do not remove comment
|
// STARTER: import - do not remove comment
|
||||||
|
import 'package:invoiceninja_flutter/redux/purchase_order/purchase_order_state.dart';
|
||||||
|
|
||||||
part 'company_state.g.dart';
|
part 'company_state.g.dart';
|
||||||
|
|
||||||
|
|
@ -52,6 +53,8 @@ abstract class UserCompanyState
|
||||||
paymentState: PaymentState(),
|
paymentState: PaymentState(),
|
||||||
quoteState: QuoteState(),
|
quoteState: QuoteState(),
|
||||||
// STARTER: constructor - do not remove comment
|
// STARTER: constructor - do not remove comment
|
||||||
|
purchaseOrderState: PurchaseOrderState(),
|
||||||
|
|
||||||
recurringExpenseState: RecurringExpenseState(),
|
recurringExpenseState: RecurringExpenseState(),
|
||||||
subscriptionState: SubscriptionState(),
|
subscriptionState: SubscriptionState(),
|
||||||
taskStatusState: TaskStatusState(),
|
taskStatusState: TaskStatusState(),
|
||||||
|
|
@ -101,6 +104,8 @@ abstract class UserCompanyState
|
||||||
QuoteState get quoteState;
|
QuoteState get quoteState;
|
||||||
|
|
||||||
// STARTER: fields - do not remove comment
|
// STARTER: fields - do not remove comment
|
||||||
|
PurchaseOrderState get purchaseOrderState;
|
||||||
|
|
||||||
RecurringExpenseState get recurringExpenseState;
|
RecurringExpenseState get recurringExpenseState;
|
||||||
|
|
||||||
SubscriptionState get subscriptionState;
|
SubscriptionState get subscriptionState;
|
||||||
|
|
|
||||||
|
|
@ -55,6 +55,9 @@ class _$UserCompanyStateSerializer
|
||||||
'quoteState',
|
'quoteState',
|
||||||
serializers.serialize(object.quoteState,
|
serializers.serialize(object.quoteState,
|
||||||
specifiedType: const FullType(QuoteState)),
|
specifiedType: const FullType(QuoteState)),
|
||||||
|
'purchaseOrderState',
|
||||||
|
serializers.serialize(object.purchaseOrderState,
|
||||||
|
specifiedType: const FullType(PurchaseOrderState)),
|
||||||
'recurringExpenseState',
|
'recurringExpenseState',
|
||||||
serializers.serialize(object.recurringExpenseState,
|
serializers.serialize(object.recurringExpenseState,
|
||||||
specifiedType: const FullType(RecurringExpenseState)),
|
specifiedType: const FullType(RecurringExpenseState)),
|
||||||
|
|
@ -170,6 +173,11 @@ class _$UserCompanyStateSerializer
|
||||||
result.quoteState.replace(serializers.deserialize(value,
|
result.quoteState.replace(serializers.deserialize(value,
|
||||||
specifiedType: const FullType(QuoteState)) as QuoteState);
|
specifiedType: const FullType(QuoteState)) as QuoteState);
|
||||||
break;
|
break;
|
||||||
|
case 'purchaseOrderState':
|
||||||
|
result.purchaseOrderState.replace(serializers.deserialize(value,
|
||||||
|
specifiedType: const FullType(PurchaseOrderState))
|
||||||
|
as PurchaseOrderState);
|
||||||
|
break;
|
||||||
case 'recurringExpenseState':
|
case 'recurringExpenseState':
|
||||||
result.recurringExpenseState.replace(serializers.deserialize(value,
|
result.recurringExpenseState.replace(serializers.deserialize(value,
|
||||||
specifiedType: const FullType(RecurringExpenseState))
|
specifiedType: const FullType(RecurringExpenseState))
|
||||||
|
|
@ -417,6 +425,8 @@ class _$UserCompanyState extends UserCompanyState {
|
||||||
@override
|
@override
|
||||||
final QuoteState quoteState;
|
final QuoteState quoteState;
|
||||||
@override
|
@override
|
||||||
|
final PurchaseOrderState purchaseOrderState;
|
||||||
|
@override
|
||||||
final RecurringExpenseState recurringExpenseState;
|
final RecurringExpenseState recurringExpenseState;
|
||||||
@override
|
@override
|
||||||
final SubscriptionState subscriptionState;
|
final SubscriptionState subscriptionState;
|
||||||
|
|
@ -462,6 +472,7 @@ class _$UserCompanyState extends UserCompanyState {
|
||||||
this.projectState,
|
this.projectState,
|
||||||
this.paymentState,
|
this.paymentState,
|
||||||
this.quoteState,
|
this.quoteState,
|
||||||
|
this.purchaseOrderState,
|
||||||
this.recurringExpenseState,
|
this.recurringExpenseState,
|
||||||
this.subscriptionState,
|
this.subscriptionState,
|
||||||
this.taskStatusState,
|
this.taskStatusState,
|
||||||
|
|
@ -499,6 +510,8 @@ class _$UserCompanyState extends UserCompanyState {
|
||||||
paymentState, 'UserCompanyState', 'paymentState');
|
paymentState, 'UserCompanyState', 'paymentState');
|
||||||
BuiltValueNullFieldError.checkNotNull(
|
BuiltValueNullFieldError.checkNotNull(
|
||||||
quoteState, 'UserCompanyState', 'quoteState');
|
quoteState, 'UserCompanyState', 'quoteState');
|
||||||
|
BuiltValueNullFieldError.checkNotNull(
|
||||||
|
purchaseOrderState, 'UserCompanyState', 'purchaseOrderState');
|
||||||
BuiltValueNullFieldError.checkNotNull(
|
BuiltValueNullFieldError.checkNotNull(
|
||||||
recurringExpenseState, 'UserCompanyState', 'recurringExpenseState');
|
recurringExpenseState, 'UserCompanyState', 'recurringExpenseState');
|
||||||
BuiltValueNullFieldError.checkNotNull(
|
BuiltValueNullFieldError.checkNotNull(
|
||||||
|
|
@ -553,6 +566,7 @@ class _$UserCompanyState extends UserCompanyState {
|
||||||
projectState == other.projectState &&
|
projectState == other.projectState &&
|
||||||
paymentState == other.paymentState &&
|
paymentState == other.paymentState &&
|
||||||
quoteState == other.quoteState &&
|
quoteState == other.quoteState &&
|
||||||
|
purchaseOrderState == other.purchaseOrderState &&
|
||||||
recurringExpenseState == other.recurringExpenseState &&
|
recurringExpenseState == other.recurringExpenseState &&
|
||||||
subscriptionState == other.subscriptionState &&
|
subscriptionState == other.subscriptionState &&
|
||||||
taskStatusState == other.taskStatusState &&
|
taskStatusState == other.taskStatusState &&
|
||||||
|
|
@ -590,12 +604,12 @@ class _$UserCompanyState extends UserCompanyState {
|
||||||
$jc(
|
$jc(
|
||||||
$jc(
|
$jc(
|
||||||
$jc(
|
$jc(
|
||||||
$jc($jc($jc($jc($jc($jc($jc($jc(0, lastUpdated.hashCode), userCompany.hashCode), documentState.hashCode), productState.hashCode), clientState.hashCode), invoiceState.hashCode), expenseState.hashCode),
|
$jc($jc($jc($jc($jc($jc($jc($jc($jc(0, lastUpdated.hashCode), userCompany.hashCode), documentState.hashCode), productState.hashCode), clientState.hashCode), invoiceState.hashCode), expenseState.hashCode), vendorState.hashCode),
|
||||||
vendorState.hashCode),
|
taskState.hashCode),
|
||||||
taskState.hashCode),
|
projectState.hashCode),
|
||||||
projectState.hashCode),
|
paymentState.hashCode),
|
||||||
paymentState.hashCode),
|
quoteState.hashCode),
|
||||||
quoteState.hashCode),
|
purchaseOrderState.hashCode),
|
||||||
recurringExpenseState.hashCode),
|
recurringExpenseState.hashCode),
|
||||||
subscriptionState.hashCode),
|
subscriptionState.hashCode),
|
||||||
taskStatusState.hashCode),
|
taskStatusState.hashCode),
|
||||||
|
|
@ -627,6 +641,7 @@ class _$UserCompanyState extends UserCompanyState {
|
||||||
..add('projectState', projectState)
|
..add('projectState', projectState)
|
||||||
..add('paymentState', paymentState)
|
..add('paymentState', paymentState)
|
||||||
..add('quoteState', quoteState)
|
..add('quoteState', quoteState)
|
||||||
|
..add('purchaseOrderState', purchaseOrderState)
|
||||||
..add('recurringExpenseState', recurringExpenseState)
|
..add('recurringExpenseState', recurringExpenseState)
|
||||||
..add('subscriptionState', subscriptionState)
|
..add('subscriptionState', subscriptionState)
|
||||||
..add('taskStatusState', taskStatusState)
|
..add('taskStatusState', taskStatusState)
|
||||||
|
|
@ -718,6 +733,12 @@ class UserCompanyStateBuilder
|
||||||
set quoteState(QuoteStateBuilder quoteState) =>
|
set quoteState(QuoteStateBuilder quoteState) =>
|
||||||
_$this._quoteState = quoteState;
|
_$this._quoteState = quoteState;
|
||||||
|
|
||||||
|
PurchaseOrderStateBuilder _purchaseOrderState;
|
||||||
|
PurchaseOrderStateBuilder get purchaseOrderState =>
|
||||||
|
_$this._purchaseOrderState ??= new PurchaseOrderStateBuilder();
|
||||||
|
set purchaseOrderState(PurchaseOrderStateBuilder purchaseOrderState) =>
|
||||||
|
_$this._purchaseOrderState = purchaseOrderState;
|
||||||
|
|
||||||
RecurringExpenseStateBuilder _recurringExpenseState;
|
RecurringExpenseStateBuilder _recurringExpenseState;
|
||||||
RecurringExpenseStateBuilder get recurringExpenseState =>
|
RecurringExpenseStateBuilder get recurringExpenseState =>
|
||||||
_$this._recurringExpenseState ??= new RecurringExpenseStateBuilder();
|
_$this._recurringExpenseState ??= new RecurringExpenseStateBuilder();
|
||||||
|
|
@ -820,6 +841,7 @@ class UserCompanyStateBuilder
|
||||||
_projectState = $v.projectState.toBuilder();
|
_projectState = $v.projectState.toBuilder();
|
||||||
_paymentState = $v.paymentState.toBuilder();
|
_paymentState = $v.paymentState.toBuilder();
|
||||||
_quoteState = $v.quoteState.toBuilder();
|
_quoteState = $v.quoteState.toBuilder();
|
||||||
|
_purchaseOrderState = $v.purchaseOrderState.toBuilder();
|
||||||
_recurringExpenseState = $v.recurringExpenseState.toBuilder();
|
_recurringExpenseState = $v.recurringExpenseState.toBuilder();
|
||||||
_subscriptionState = $v.subscriptionState.toBuilder();
|
_subscriptionState = $v.subscriptionState.toBuilder();
|
||||||
_taskStatusState = $v.taskStatusState.toBuilder();
|
_taskStatusState = $v.taskStatusState.toBuilder();
|
||||||
|
|
@ -869,6 +891,7 @@ class UserCompanyStateBuilder
|
||||||
projectState: projectState.build(),
|
projectState: projectState.build(),
|
||||||
paymentState: paymentState.build(),
|
paymentState: paymentState.build(),
|
||||||
quoteState: quoteState.build(),
|
quoteState: quoteState.build(),
|
||||||
|
purchaseOrderState: purchaseOrderState.build(),
|
||||||
recurringExpenseState: recurringExpenseState.build(),
|
recurringExpenseState: recurringExpenseState.build(),
|
||||||
subscriptionState: subscriptionState.build(),
|
subscriptionState: subscriptionState.build(),
|
||||||
taskStatusState: taskStatusState.build(),
|
taskStatusState: taskStatusState.build(),
|
||||||
|
|
@ -908,6 +931,8 @@ class UserCompanyStateBuilder
|
||||||
paymentState.build();
|
paymentState.build();
|
||||||
_$failedField = 'quoteState';
|
_$failedField = 'quoteState';
|
||||||
quoteState.build();
|
quoteState.build();
|
||||||
|
_$failedField = 'purchaseOrderState';
|
||||||
|
purchaseOrderState.build();
|
||||||
_$failedField = 'recurringExpenseState';
|
_$failedField = 'recurringExpenseState';
|
||||||
recurringExpenseState.build();
|
recurringExpenseState.build();
|
||||||
_$failedField = 'subscriptionState';
|
_$failedField = 'subscriptionState';
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,323 @@
|
||||||
|
import 'dart:async';
|
||||||
|
import 'package:built_collection/built_collection.dart';
|
||||||
|
import 'package:flutter/widgets.dart';
|
||||||
|
import 'package:flutter_redux/flutter_redux.dart';
|
||||||
|
import 'package:invoiceninja_flutter/data/models/models.dart';
|
||||||
|
import 'package:invoiceninja_flutter/redux/app/app_actions.dart';
|
||||||
|
import 'package:invoiceninja_flutter/redux/app/app_state.dart';
|
||||||
|
import 'package:invoiceninja_flutter/utils/completers.dart';
|
||||||
|
import 'package:invoiceninja_flutter/utils/localization.dart';
|
||||||
|
import 'package:invoiceninja_flutter/ui/app/entities/entity_actions_dialog.dart';
|
||||||
|
|
||||||
|
class ViewPurchaseOrderList implements PersistUI {
|
||||||
|
ViewPurchaseOrderList({this.force = false});
|
||||||
|
|
||||||
|
final bool force;
|
||||||
|
}
|
||||||
|
|
||||||
|
class ViewPurchaseOrder implements PersistUI, PersistPrefs {
|
||||||
|
ViewPurchaseOrder({
|
||||||
|
@required this.purchaseOrderId,
|
||||||
|
this.force = false,
|
||||||
|
});
|
||||||
|
|
||||||
|
final String purchaseOrderId;
|
||||||
|
final bool force;
|
||||||
|
}
|
||||||
|
|
||||||
|
class EditPurchaseOrder implements PersistUI, PersistPrefs {
|
||||||
|
EditPurchaseOrder(
|
||||||
|
{@required this.purchaseOrder,
|
||||||
|
this.completer,
|
||||||
|
this.cancelCompleter,
|
||||||
|
this.force = false});
|
||||||
|
|
||||||
|
final InvoiceEntity purchaseOrder;
|
||||||
|
final Completer completer;
|
||||||
|
final Completer cancelCompleter;
|
||||||
|
final bool force;
|
||||||
|
}
|
||||||
|
|
||||||
|
class UpdatePurchaseOrder implements PersistUI {
|
||||||
|
UpdatePurchaseOrder(this.purchaseOrder);
|
||||||
|
|
||||||
|
final InvoiceEntity purchaseOrder;
|
||||||
|
}
|
||||||
|
|
||||||
|
class LoadPurchaseOrder {
|
||||||
|
LoadPurchaseOrder({this.completer, this.purchaseOrderId});
|
||||||
|
|
||||||
|
final Completer completer;
|
||||||
|
final String purchaseOrderId;
|
||||||
|
}
|
||||||
|
|
||||||
|
class LoadPurchaseOrderActivity {
|
||||||
|
LoadPurchaseOrderActivity({this.completer, this.purchaseOrderId});
|
||||||
|
|
||||||
|
final Completer completer;
|
||||||
|
final String purchaseOrderId;
|
||||||
|
}
|
||||||
|
|
||||||
|
class LoadPurchaseOrders {
|
||||||
|
LoadPurchaseOrders({this.completer});
|
||||||
|
|
||||||
|
final Completer completer;
|
||||||
|
}
|
||||||
|
|
||||||
|
class LoadPurchaseOrderRequest implements StartLoading {}
|
||||||
|
|
||||||
|
class LoadPurchaseOrderFailure implements StopLoading {
|
||||||
|
LoadPurchaseOrderFailure(this.error);
|
||||||
|
|
||||||
|
final dynamic error;
|
||||||
|
|
||||||
|
@override
|
||||||
|
String toString() {
|
||||||
|
return 'LoadPurchaseOrderFailure{error: $error}';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class LoadPurchaseOrderSuccess implements StopLoading, PersistData {
|
||||||
|
LoadPurchaseOrderSuccess(this.purchaseOrder);
|
||||||
|
|
||||||
|
final InvoiceEntity purchaseOrder;
|
||||||
|
|
||||||
|
@override
|
||||||
|
String toString() {
|
||||||
|
return 'LoadPurchaseOrderSuccess{purchaseOrder: $purchaseOrder}';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class LoadPurchaseOrdersRequest implements StartLoading {}
|
||||||
|
|
||||||
|
class LoadPurchaseOrdersFailure implements StopLoading {
|
||||||
|
LoadPurchaseOrdersFailure(this.error);
|
||||||
|
|
||||||
|
final dynamic error;
|
||||||
|
|
||||||
|
@override
|
||||||
|
String toString() {
|
||||||
|
return 'LoadPurchaseOrdersFailure{error: $error}';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class LoadPurchaseOrdersSuccess implements StopLoading {
|
||||||
|
LoadPurchaseOrdersSuccess(this.purchaseOrders);
|
||||||
|
|
||||||
|
final BuiltList<InvoiceEntity> purchaseOrders;
|
||||||
|
|
||||||
|
@override
|
||||||
|
String toString() {
|
||||||
|
return 'LoadPurchaseOrdersSuccess{purchaseOrders: $purchaseOrders}';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class SavePurchaseOrderRequest implements StartSaving {
|
||||||
|
SavePurchaseOrderRequest({this.completer, this.purchaseOrder});
|
||||||
|
|
||||||
|
final Completer completer;
|
||||||
|
final InvoiceEntity purchaseOrder;
|
||||||
|
}
|
||||||
|
|
||||||
|
class SavePurchaseOrderSuccess implements StopSaving, PersistData, PersistUI {
|
||||||
|
SavePurchaseOrderSuccess(this.purchaseOrder);
|
||||||
|
|
||||||
|
final InvoiceEntity purchaseOrder;
|
||||||
|
}
|
||||||
|
|
||||||
|
class AddPurchaseOrderSuccess implements StopSaving, PersistData, PersistUI {
|
||||||
|
AddPurchaseOrderSuccess(this.purchaseOrder);
|
||||||
|
|
||||||
|
final InvoiceEntity purchaseOrder;
|
||||||
|
}
|
||||||
|
|
||||||
|
class SavePurchaseOrderFailure implements StopSaving {
|
||||||
|
SavePurchaseOrderFailure(this.error);
|
||||||
|
|
||||||
|
final Object error;
|
||||||
|
}
|
||||||
|
|
||||||
|
class ArchivePurchaseOrdersRequest implements StartSaving {
|
||||||
|
ArchivePurchaseOrdersRequest(this.completer, this.purchaseOrderIds);
|
||||||
|
|
||||||
|
final Completer completer;
|
||||||
|
final List<String> purchaseOrderIds;
|
||||||
|
}
|
||||||
|
|
||||||
|
class ArchivePurchaseOrdersSuccess implements StopSaving, PersistData {
|
||||||
|
ArchivePurchaseOrdersSuccess(this.purchaseOrders);
|
||||||
|
|
||||||
|
final List<InvoiceEntity> purchaseOrders;
|
||||||
|
}
|
||||||
|
|
||||||
|
class ArchivePurchaseOrdersFailure implements StopSaving {
|
||||||
|
ArchivePurchaseOrdersFailure(this.purchaseOrders);
|
||||||
|
|
||||||
|
final List<InvoiceEntity> purchaseOrders;
|
||||||
|
}
|
||||||
|
|
||||||
|
class DeletePurchaseOrdersRequest implements StartSaving {
|
||||||
|
DeletePurchaseOrdersRequest(this.completer, this.purchaseOrderIds);
|
||||||
|
|
||||||
|
final Completer completer;
|
||||||
|
final List<String> purchaseOrderIds;
|
||||||
|
}
|
||||||
|
|
||||||
|
class DeletePurchaseOrdersSuccess implements StopSaving, PersistData {
|
||||||
|
DeletePurchaseOrdersSuccess(this.purchaseOrders);
|
||||||
|
|
||||||
|
final List<InvoiceEntity> purchaseOrders;
|
||||||
|
}
|
||||||
|
|
||||||
|
class DeletePurchaseOrdersFailure implements StopSaving {
|
||||||
|
DeletePurchaseOrdersFailure(this.purchaseOrders);
|
||||||
|
|
||||||
|
final List<InvoiceEntity> purchaseOrders;
|
||||||
|
}
|
||||||
|
|
||||||
|
class RestorePurchaseOrdersRequest implements StartSaving {
|
||||||
|
RestorePurchaseOrdersRequest(this.completer, this.purchaseOrderIds);
|
||||||
|
|
||||||
|
final Completer completer;
|
||||||
|
final List<String> purchaseOrderIds;
|
||||||
|
}
|
||||||
|
|
||||||
|
class RestorePurchaseOrdersSuccess implements StopSaving, PersistData {
|
||||||
|
RestorePurchaseOrdersSuccess(this.purchaseOrders);
|
||||||
|
|
||||||
|
final List<InvoiceEntity> purchaseOrders;
|
||||||
|
}
|
||||||
|
|
||||||
|
class RestorePurchaseOrdersFailure implements StopSaving {
|
||||||
|
RestorePurchaseOrdersFailure(this.purchaseOrders);
|
||||||
|
|
||||||
|
final List<InvoiceEntity> purchaseOrders;
|
||||||
|
}
|
||||||
|
|
||||||
|
class FilterPurchaseOrders implements PersistUI {
|
||||||
|
FilterPurchaseOrders(this.filter);
|
||||||
|
|
||||||
|
final String filter;
|
||||||
|
}
|
||||||
|
|
||||||
|
class SortPurchaseOrders implements PersistUI, PersistPrefs {
|
||||||
|
SortPurchaseOrders(this.field);
|
||||||
|
|
||||||
|
final String field;
|
||||||
|
}
|
||||||
|
|
||||||
|
class FilterPurchaseOrdersByState implements PersistUI {
|
||||||
|
FilterPurchaseOrdersByState(this.state);
|
||||||
|
|
||||||
|
final EntityState state;
|
||||||
|
}
|
||||||
|
|
||||||
|
class FilterPurchaseOrdersByCustom1 implements PersistUI {
|
||||||
|
FilterPurchaseOrdersByCustom1(this.value);
|
||||||
|
|
||||||
|
final String value;
|
||||||
|
}
|
||||||
|
|
||||||
|
class FilterPurchaseOrdersByCustom2 implements PersistUI {
|
||||||
|
FilterPurchaseOrdersByCustom2(this.value);
|
||||||
|
|
||||||
|
final String value;
|
||||||
|
}
|
||||||
|
|
||||||
|
class FilterPurchaseOrdersByCustom3 implements PersistUI {
|
||||||
|
FilterPurchaseOrdersByCustom3(this.value);
|
||||||
|
|
||||||
|
final String value;
|
||||||
|
}
|
||||||
|
|
||||||
|
class FilterPurchaseOrdersByCustom4 implements PersistUI {
|
||||||
|
FilterPurchaseOrdersByCustom4(this.value);
|
||||||
|
|
||||||
|
final String value;
|
||||||
|
}
|
||||||
|
|
||||||
|
class StartPurchaseOrderMultiselect {
|
||||||
|
StartPurchaseOrderMultiselect();
|
||||||
|
}
|
||||||
|
|
||||||
|
class AddToPurchaseOrderMultiselect {
|
||||||
|
AddToPurchaseOrderMultiselect({@required this.entity});
|
||||||
|
|
||||||
|
final BaseEntity entity;
|
||||||
|
}
|
||||||
|
|
||||||
|
class RemoveFromPurchaseOrderMultiselect {
|
||||||
|
RemoveFromPurchaseOrderMultiselect({@required this.entity});
|
||||||
|
|
||||||
|
final BaseEntity entity;
|
||||||
|
}
|
||||||
|
|
||||||
|
class ClearPurchaseOrderMultiselect {
|
||||||
|
ClearPurchaseOrderMultiselect();
|
||||||
|
}
|
||||||
|
|
||||||
|
class UpdatePurchaseOrderTab implements PersistUI {
|
||||||
|
UpdatePurchaseOrderTab({this.tabIndex});
|
||||||
|
|
||||||
|
final int tabIndex;
|
||||||
|
}
|
||||||
|
|
||||||
|
void handlePurchaseOrderAction(BuildContext context,
|
||||||
|
List<BaseEntity> purchaseOrders, EntityAction action) {
|
||||||
|
if (purchaseOrders.isEmpty) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
final store = StoreProvider.of<AppState>(context);
|
||||||
|
final localization = AppLocalization.of(context);
|
||||||
|
final purchaseOrder = purchaseOrders.first as InvoiceEntity;
|
||||||
|
final purchaseOrderIds =
|
||||||
|
purchaseOrders.map((purchaseOrder) => purchaseOrder.id).toList();
|
||||||
|
|
||||||
|
switch (action) {
|
||||||
|
case EntityAction.edit:
|
||||||
|
editEntity(entity: purchaseOrder);
|
||||||
|
break;
|
||||||
|
case EntityAction.restore:
|
||||||
|
store.dispatch(RestorePurchaseOrdersRequest(
|
||||||
|
snackBarCompleter<Null>(context, localization.restoredPurchaseOrder),
|
||||||
|
purchaseOrderIds));
|
||||||
|
break;
|
||||||
|
case EntityAction.archive:
|
||||||
|
store.dispatch(ArchivePurchaseOrdersRequest(
|
||||||
|
snackBarCompleter<Null>(context, localization.archivedPurchaseOrder),
|
||||||
|
purchaseOrderIds));
|
||||||
|
break;
|
||||||
|
case EntityAction.delete:
|
||||||
|
store.dispatch(DeletePurchaseOrdersRequest(
|
||||||
|
snackBarCompleter<Null>(context, localization.deletedPurchaseOrder),
|
||||||
|
purchaseOrderIds));
|
||||||
|
break;
|
||||||
|
case EntityAction.toggleMultiselect:
|
||||||
|
if (!store.state.purchaseOrderListState.isInMultiselect()) {
|
||||||
|
store.dispatch(StartPurchaseOrderMultiselect());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (purchaseOrders.isEmpty) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (final purchaseOrder in purchaseOrders) {
|
||||||
|
if (!store.state.purchaseOrderListState.isSelected(purchaseOrder.id)) {
|
||||||
|
store.dispatch(AddToPurchaseOrderMultiselect(entity: purchaseOrder));
|
||||||
|
} else {
|
||||||
|
store.dispatch(
|
||||||
|
RemoveFromPurchaseOrderMultiselect(entity: purchaseOrder));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case EntityAction.more:
|
||||||
|
showEntityActionsDialog(
|
||||||
|
entities: [purchaseOrder],
|
||||||
|
);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
print('## ERROR: unhandled action $action in purchase_order_actions');
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,245 @@
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:flutter/widgets.dart';
|
||||||
|
import 'package:redux/redux.dart';
|
||||||
|
import 'package:invoiceninja_flutter/main_app.dart';
|
||||||
|
import 'package:invoiceninja_flutter/redux/app/app_actions.dart';
|
||||||
|
import 'package:invoiceninja_flutter/data/models/models.dart';
|
||||||
|
import 'package:invoiceninja_flutter/redux/ui/ui_actions.dart';
|
||||||
|
import 'package:invoiceninja_flutter/ui/purchase_order/purchase_order_screen.dart';
|
||||||
|
import 'package:invoiceninja_flutter/ui/purchase_order/edit/purchase_order_edit_vm.dart';
|
||||||
|
import 'package:invoiceninja_flutter/ui/purchase_order/view/purchase_order_view_vm.dart';
|
||||||
|
import 'package:invoiceninja_flutter/redux/purchase_order/purchase_order_actions.dart';
|
||||||
|
import 'package:invoiceninja_flutter/redux/app/app_state.dart';
|
||||||
|
import 'package:invoiceninja_flutter/data/repositories/purchase_order_repository.dart';
|
||||||
|
|
||||||
|
List<Middleware<AppState>> createStorePurchaseOrdersMiddleware([
|
||||||
|
PurchaseOrderRepository repository = const PurchaseOrderRepository(),
|
||||||
|
]) {
|
||||||
|
final viewPurchaseOrderList = _viewPurchaseOrderList();
|
||||||
|
final viewPurchaseOrder = _viewPurchaseOrder();
|
||||||
|
final editPurchaseOrder = _editPurchaseOrder();
|
||||||
|
final loadPurchaseOrders = _loadPurchaseOrders(repository);
|
||||||
|
final loadPurchaseOrder = _loadPurchaseOrder(repository);
|
||||||
|
final savePurchaseOrder = _savePurchaseOrder(repository);
|
||||||
|
final archivePurchaseOrder = _archivePurchaseOrder(repository);
|
||||||
|
final deletePurchaseOrder = _deletePurchaseOrder(repository);
|
||||||
|
final restorePurchaseOrder = _restorePurchaseOrder(repository);
|
||||||
|
|
||||||
|
return [
|
||||||
|
TypedMiddleware<AppState, ViewPurchaseOrderList>(viewPurchaseOrderList),
|
||||||
|
TypedMiddleware<AppState, ViewPurchaseOrder>(viewPurchaseOrder),
|
||||||
|
TypedMiddleware<AppState, EditPurchaseOrder>(editPurchaseOrder),
|
||||||
|
TypedMiddleware<AppState, LoadPurchaseOrders>(loadPurchaseOrders),
|
||||||
|
TypedMiddleware<AppState, LoadPurchaseOrder>(loadPurchaseOrder),
|
||||||
|
TypedMiddleware<AppState, SavePurchaseOrderRequest>(savePurchaseOrder),
|
||||||
|
TypedMiddleware<AppState, ArchivePurchaseOrdersRequest>(
|
||||||
|
archivePurchaseOrder),
|
||||||
|
TypedMiddleware<AppState, DeletePurchaseOrdersRequest>(deletePurchaseOrder),
|
||||||
|
TypedMiddleware<AppState, RestorePurchaseOrdersRequest>(
|
||||||
|
restorePurchaseOrder),
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
Middleware<AppState> _editPurchaseOrder() {
|
||||||
|
return (Store<AppState> store, dynamic dynamicAction, NextDispatcher next) {
|
||||||
|
final action = dynamicAction as EditPurchaseOrder;
|
||||||
|
|
||||||
|
next(action);
|
||||||
|
|
||||||
|
store.dispatch(UpdateCurrentRoute(PurchaseOrderEditScreen.route));
|
||||||
|
|
||||||
|
if (store.state.prefState.isMobile) {
|
||||||
|
navigatorKey.currentState.pushNamed(PurchaseOrderEditScreen.route);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
Middleware<AppState> _viewPurchaseOrder() {
|
||||||
|
return (Store<AppState> store, dynamic dynamicAction,
|
||||||
|
NextDispatcher next) async {
|
||||||
|
final action = dynamicAction as ViewPurchaseOrder;
|
||||||
|
|
||||||
|
next(action);
|
||||||
|
|
||||||
|
store.dispatch(UpdateCurrentRoute(PurchaseOrderViewScreen.route));
|
||||||
|
|
||||||
|
if (store.state.prefState.isMobile) {
|
||||||
|
navigatorKey.currentState.pushNamed(PurchaseOrderViewScreen.route);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
Middleware<AppState> _viewPurchaseOrderList() {
|
||||||
|
return (Store<AppState> store, dynamic dynamicAction, NextDispatcher next) {
|
||||||
|
final action = dynamicAction as ViewPurchaseOrderList;
|
||||||
|
|
||||||
|
next(action);
|
||||||
|
|
||||||
|
if (store.state.staticState.isStale) {
|
||||||
|
store.dispatch(RefreshData());
|
||||||
|
}
|
||||||
|
|
||||||
|
store.dispatch(UpdateCurrentRoute(PurchaseOrderScreen.route));
|
||||||
|
|
||||||
|
if (store.state.prefState.isMobile) {
|
||||||
|
navigatorKey.currentState.pushNamedAndRemoveUntil(
|
||||||
|
PurchaseOrderScreen.route, (Route<dynamic> route) => false);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
Middleware<AppState> _archivePurchaseOrder(PurchaseOrderRepository repository) {
|
||||||
|
return (Store<AppState> store, dynamic dynamicAction, NextDispatcher next) {
|
||||||
|
final action = dynamicAction as ArchivePurchaseOrdersRequest;
|
||||||
|
final prevPurchaseOrders = action.purchaseOrderIds
|
||||||
|
.map((id) => store.state.purchaseOrderState.map[id])
|
||||||
|
.toList();
|
||||||
|
repository
|
||||||
|
.bulkAction(store.state.credentials, action.purchaseOrderIds,
|
||||||
|
EntityAction.archive)
|
||||||
|
.then((List<InvoiceEntity> purchaseOrders) {
|
||||||
|
store.dispatch(ArchivePurchaseOrdersSuccess(purchaseOrders));
|
||||||
|
if (action.completer != null) {
|
||||||
|
action.completer.complete(null);
|
||||||
|
}
|
||||||
|
}).catchError((Object error) {
|
||||||
|
print(error);
|
||||||
|
store.dispatch(ArchivePurchaseOrdersFailure(prevPurchaseOrders));
|
||||||
|
if (action.completer != null) {
|
||||||
|
action.completer.completeError(error);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
next(action);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
Middleware<AppState> _deletePurchaseOrder(PurchaseOrderRepository repository) {
|
||||||
|
return (Store<AppState> store, dynamic dynamicAction, NextDispatcher next) {
|
||||||
|
final action = dynamicAction as DeletePurchaseOrdersRequest;
|
||||||
|
final prevPurchaseOrders = action.purchaseOrderIds
|
||||||
|
.map((id) => store.state.purchaseOrderState.map[id])
|
||||||
|
.toList();
|
||||||
|
repository
|
||||||
|
.bulkAction(store.state.credentials, action.purchaseOrderIds,
|
||||||
|
EntityAction.delete)
|
||||||
|
.then((List<InvoiceEntity> purchaseOrders) {
|
||||||
|
store.dispatch(DeletePurchaseOrdersSuccess(purchaseOrders));
|
||||||
|
if (action.completer != null) {
|
||||||
|
action.completer.complete(null);
|
||||||
|
}
|
||||||
|
}).catchError((Object error) {
|
||||||
|
print(error);
|
||||||
|
store.dispatch(DeletePurchaseOrdersFailure(prevPurchaseOrders));
|
||||||
|
if (action.completer != null) {
|
||||||
|
action.completer.completeError(error);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
next(action);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
Middleware<AppState> _restorePurchaseOrder(PurchaseOrderRepository repository) {
|
||||||
|
return (Store<AppState> store, dynamic dynamicAction, NextDispatcher next) {
|
||||||
|
final action = dynamicAction as RestorePurchaseOrdersRequest;
|
||||||
|
final prevPurchaseOrders = action.purchaseOrderIds
|
||||||
|
.map((id) => store.state.purchaseOrderState.map[id])
|
||||||
|
.toList();
|
||||||
|
repository
|
||||||
|
.bulkAction(store.state.credentials, action.purchaseOrderIds,
|
||||||
|
EntityAction.restore)
|
||||||
|
.then((List<InvoiceEntity> purchaseOrders) {
|
||||||
|
store.dispatch(RestorePurchaseOrdersSuccess(purchaseOrders));
|
||||||
|
if (action.completer != null) {
|
||||||
|
action.completer.complete(null);
|
||||||
|
}
|
||||||
|
}).catchError((Object error) {
|
||||||
|
print(error);
|
||||||
|
store.dispatch(RestorePurchaseOrdersFailure(prevPurchaseOrders));
|
||||||
|
if (action.completer != null) {
|
||||||
|
action.completer.completeError(error);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
next(action);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
Middleware<AppState> _savePurchaseOrder(PurchaseOrderRepository repository) {
|
||||||
|
return (Store<AppState> store, dynamic dynamicAction, NextDispatcher next) {
|
||||||
|
final action = dynamicAction as SavePurchaseOrderRequest;
|
||||||
|
repository
|
||||||
|
.saveData(store.state.credentials, action.purchaseOrder)
|
||||||
|
.then((InvoiceEntity purchaseOrder) {
|
||||||
|
if (action.purchaseOrder.isNew) {
|
||||||
|
store.dispatch(AddPurchaseOrderSuccess(purchaseOrder));
|
||||||
|
} else {
|
||||||
|
store.dispatch(SavePurchaseOrderSuccess(purchaseOrder));
|
||||||
|
}
|
||||||
|
|
||||||
|
action.completer.complete(purchaseOrder);
|
||||||
|
}).catchError((Object error) {
|
||||||
|
print(error);
|
||||||
|
store.dispatch(SavePurchaseOrderFailure(error));
|
||||||
|
action.completer.completeError(error);
|
||||||
|
});
|
||||||
|
|
||||||
|
next(action);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
Middleware<AppState> _loadPurchaseOrder(PurchaseOrderRepository repository) {
|
||||||
|
return (Store<AppState> store, dynamic dynamicAction, NextDispatcher next) {
|
||||||
|
final action = dynamicAction as LoadPurchaseOrder;
|
||||||
|
final AppState state = store.state;
|
||||||
|
|
||||||
|
store.dispatch(LoadPurchaseOrderRequest());
|
||||||
|
repository
|
||||||
|
.loadItem(state.credentials, action.purchaseOrderId)
|
||||||
|
.then((purchaseOrder) {
|
||||||
|
store.dispatch(LoadPurchaseOrderSuccess(purchaseOrder));
|
||||||
|
|
||||||
|
if (action.completer != null) {
|
||||||
|
action.completer.complete(null);
|
||||||
|
}
|
||||||
|
}).catchError((Object error) {
|
||||||
|
print(error);
|
||||||
|
store.dispatch(LoadPurchaseOrderFailure(error));
|
||||||
|
if (action.completer != null) {
|
||||||
|
action.completer.completeError(error);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
next(action);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
Middleware<AppState> _loadPurchaseOrders(PurchaseOrderRepository repository) {
|
||||||
|
return (Store<AppState> store, dynamic dynamicAction, NextDispatcher next) {
|
||||||
|
final action = dynamicAction as LoadPurchaseOrders;
|
||||||
|
final AppState state = store.state;
|
||||||
|
|
||||||
|
store.dispatch(LoadPurchaseOrdersRequest());
|
||||||
|
repository.loadList(state.credentials).then((data) {
|
||||||
|
store.dispatch(LoadPurchaseOrdersSuccess(data));
|
||||||
|
|
||||||
|
if (action.completer != null) {
|
||||||
|
action.completer.complete(null);
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
if (state.productState.isStale) {
|
||||||
|
store.dispatch(LoadProducts());
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
}).catchError((Object error) {
|
||||||
|
print(error);
|
||||||
|
store.dispatch(LoadPurchaseOrdersFailure(error));
|
||||||
|
if (action.completer != null) {
|
||||||
|
action.completer.completeError(error);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
next(action);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,280 @@
|
||||||
|
import 'package:redux/redux.dart';
|
||||||
|
import 'package:built_collection/built_collection.dart';
|
||||||
|
import 'package:invoiceninja_flutter/redux/app/app_actions.dart';
|
||||||
|
import 'package:invoiceninja_flutter/data/models/models.dart';
|
||||||
|
import 'package:invoiceninja_flutter/redux/company/company_actions.dart';
|
||||||
|
import 'package:invoiceninja_flutter/redux/ui/entity_ui_state.dart';
|
||||||
|
import 'package:invoiceninja_flutter/redux/purchase_order/purchase_order_actions.dart';
|
||||||
|
import 'package:invoiceninja_flutter/redux/ui/list_ui_state.dart';
|
||||||
|
import 'package:invoiceninja_flutter/redux/purchase_order/purchase_order_state.dart';
|
||||||
|
|
||||||
|
EntityUIState purchaseOrderUIReducer(
|
||||||
|
PurchaseOrderUIState state, dynamic action) {
|
||||||
|
return state.rebuild((b) => b
|
||||||
|
..listUIState.replace(purchaseOrderListReducer(state.listUIState, action))
|
||||||
|
..editing.replace(editingReducer(state.editing, action))
|
||||||
|
..selectedId = selectedIdReducer(state.selectedId, action)
|
||||||
|
..forceSelected = forceSelectedReducer(state.forceSelected, action)
|
||||||
|
..tabIndex = tabIndexReducer(state.tabIndex, action));
|
||||||
|
}
|
||||||
|
|
||||||
|
final forceSelectedReducer = combineReducers<bool>([
|
||||||
|
TypedReducer<bool, ViewPurchaseOrder>((completer, action) => true),
|
||||||
|
TypedReducer<bool, ViewPurchaseOrderList>((completer, action) => false),
|
||||||
|
TypedReducer<bool, FilterPurchaseOrdersByState>((completer, action) => false),
|
||||||
|
TypedReducer<bool, FilterPurchaseOrders>((completer, action) => false),
|
||||||
|
TypedReducer<bool, FilterPurchaseOrdersByCustom1>(
|
||||||
|
(completer, action) => false),
|
||||||
|
TypedReducer<bool, FilterPurchaseOrdersByCustom2>(
|
||||||
|
(completer, action) => false),
|
||||||
|
TypedReducer<bool, FilterPurchaseOrdersByCustom3>(
|
||||||
|
(completer, action) => false),
|
||||||
|
TypedReducer<bool, FilterPurchaseOrdersByCustom4>(
|
||||||
|
(completer, action) => false),
|
||||||
|
]);
|
||||||
|
|
||||||
|
final tabIndexReducer = combineReducers<int>([
|
||||||
|
TypedReducer<int, UpdatePurchaseOrderTab>((completer, action) {
|
||||||
|
return action.tabIndex;
|
||||||
|
}),
|
||||||
|
TypedReducer<int, PreviewEntity>((completer, action) {
|
||||||
|
return 0;
|
||||||
|
}),
|
||||||
|
]);
|
||||||
|
|
||||||
|
Reducer<String> selectedIdReducer = combineReducers([
|
||||||
|
TypedReducer<String, ArchivePurchaseOrdersSuccess>((completer, action) => ''),
|
||||||
|
TypedReducer<String, DeletePurchaseOrdersSuccess>((completer, action) => ''),
|
||||||
|
TypedReducer<String, PreviewEntity>((selectedId, action) =>
|
||||||
|
action.entityType == EntityType.purchaseOrder
|
||||||
|
? action.entityId
|
||||||
|
: selectedId),
|
||||||
|
TypedReducer<String, ViewPurchaseOrder>(
|
||||||
|
(String selectedId, dynamic action) => action.purchaseOrderId),
|
||||||
|
TypedReducer<String, AddPurchaseOrderSuccess>(
|
||||||
|
(String selectedId, dynamic action) => action.purchaseOrder.id),
|
||||||
|
TypedReducer<String, SelectCompany>(
|
||||||
|
(selectedId, action) => action.clearSelection ? '' : selectedId),
|
||||||
|
TypedReducer<String, ClearEntityFilter>((selectedId, action) => ''),
|
||||||
|
TypedReducer<String, SortPurchaseOrders>((selectedId, action) => ''),
|
||||||
|
TypedReducer<String, FilterPurchaseOrders>((selectedId, action) => ''),
|
||||||
|
TypedReducer<String, FilterPurchaseOrdersByState>((selectedId, action) => ''),
|
||||||
|
TypedReducer<String, FilterPurchaseOrdersByCustom1>(
|
||||||
|
(selectedId, action) => ''),
|
||||||
|
TypedReducer<String, FilterPurchaseOrdersByCustom2>(
|
||||||
|
(selectedId, action) => ''),
|
||||||
|
TypedReducer<String, FilterPurchaseOrdersByCustom3>(
|
||||||
|
(selectedId, action) => ''),
|
||||||
|
TypedReducer<String, FilterPurchaseOrdersByCustom4>(
|
||||||
|
(selectedId, action) => ''),
|
||||||
|
TypedReducer<String, FilterByEntity>(
|
||||||
|
(selectedId, action) => action.clearSelection
|
||||||
|
? ''
|
||||||
|
: action.entityType == EntityType.purchaseOrder
|
||||||
|
? action.entityId
|
||||||
|
: selectedId),
|
||||||
|
]);
|
||||||
|
|
||||||
|
final editingReducer = combineReducers<InvoiceEntity>([
|
||||||
|
TypedReducer<InvoiceEntity, SavePurchaseOrderSuccess>(_updateEditing),
|
||||||
|
TypedReducer<InvoiceEntity, AddPurchaseOrderSuccess>(_updateEditing),
|
||||||
|
TypedReducer<InvoiceEntity, RestorePurchaseOrdersSuccess>(
|
||||||
|
(purchaseOrders, action) {
|
||||||
|
return action.purchaseOrders[0];
|
||||||
|
}),
|
||||||
|
TypedReducer<InvoiceEntity, ArchivePurchaseOrdersSuccess>(
|
||||||
|
(purchaseOrders, action) {
|
||||||
|
return action.purchaseOrders[0];
|
||||||
|
}),
|
||||||
|
TypedReducer<InvoiceEntity, DeletePurchaseOrdersSuccess>(
|
||||||
|
(purchaseOrders, action) {
|
||||||
|
return action.purchaseOrders[0];
|
||||||
|
}),
|
||||||
|
TypedReducer<InvoiceEntity, EditPurchaseOrder>(_updateEditing),
|
||||||
|
TypedReducer<InvoiceEntity, UpdatePurchaseOrder>((purchaseOrder, action) {
|
||||||
|
return action.purchaseOrder.rebuild((b) => b..isChanged = true);
|
||||||
|
}),
|
||||||
|
TypedReducer<InvoiceEntity, DiscardChanges>(_clearEditing),
|
||||||
|
]);
|
||||||
|
|
||||||
|
InvoiceEntity _clearEditing(InvoiceEntity purchaseOrder, dynamic action) {
|
||||||
|
return InvoiceEntity();
|
||||||
|
}
|
||||||
|
|
||||||
|
InvoiceEntity _updateEditing(InvoiceEntity purchaseOrder, dynamic action) {
|
||||||
|
return action.purchaseOrder;
|
||||||
|
}
|
||||||
|
|
||||||
|
final purchaseOrderListReducer = combineReducers<ListUIState>([
|
||||||
|
TypedReducer<ListUIState, SortPurchaseOrders>(_sortPurchaseOrders),
|
||||||
|
TypedReducer<ListUIState, FilterPurchaseOrdersByState>(
|
||||||
|
_filterPurchaseOrdersByState),
|
||||||
|
TypedReducer<ListUIState, FilterPurchaseOrders>(_filterPurchaseOrders),
|
||||||
|
TypedReducer<ListUIState, FilterPurchaseOrdersByCustom1>(
|
||||||
|
_filterPurchaseOrdersByCustom1),
|
||||||
|
TypedReducer<ListUIState, FilterPurchaseOrdersByCustom2>(
|
||||||
|
_filterPurchaseOrdersByCustom2),
|
||||||
|
TypedReducer<ListUIState, StartPurchaseOrderMultiselect>(
|
||||||
|
_startListMultiselect),
|
||||||
|
TypedReducer<ListUIState, AddToPurchaseOrderMultiselect>(
|
||||||
|
_addToListMultiselect),
|
||||||
|
TypedReducer<ListUIState, RemoveFromPurchaseOrderMultiselect>(
|
||||||
|
_removeFromListMultiselect),
|
||||||
|
TypedReducer<ListUIState, ClearPurchaseOrderMultiselect>(
|
||||||
|
_clearListMultiselect),
|
||||||
|
TypedReducer<ListUIState, ViewPurchaseOrderList>(_viewPurchaseOrderList),
|
||||||
|
]);
|
||||||
|
|
||||||
|
ListUIState _viewPurchaseOrderList(
|
||||||
|
ListUIState purchaseOrderListState, ViewPurchaseOrderList action) {
|
||||||
|
return purchaseOrderListState.rebuild((b) => b
|
||||||
|
..selectedIds = null
|
||||||
|
..filter = null
|
||||||
|
..filterClearedAt = DateTime.now().millisecondsSinceEpoch);
|
||||||
|
}
|
||||||
|
|
||||||
|
ListUIState _filterPurchaseOrdersByCustom1(
|
||||||
|
ListUIState purchaseOrderListState, FilterPurchaseOrdersByCustom1 action) {
|
||||||
|
if (purchaseOrderListState.custom1Filters.contains(action.value)) {
|
||||||
|
return purchaseOrderListState
|
||||||
|
.rebuild((b) => b..custom1Filters.remove(action.value));
|
||||||
|
} else {
|
||||||
|
return purchaseOrderListState
|
||||||
|
.rebuild((b) => b..custom1Filters.add(action.value));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ListUIState _filterPurchaseOrdersByCustom2(
|
||||||
|
ListUIState purchaseOrderListState, FilterPurchaseOrdersByCustom2 action) {
|
||||||
|
if (purchaseOrderListState.custom2Filters.contains(action.value)) {
|
||||||
|
return purchaseOrderListState
|
||||||
|
.rebuild((b) => b..custom2Filters.remove(action.value));
|
||||||
|
} else {
|
||||||
|
return purchaseOrderListState
|
||||||
|
.rebuild((b) => b..custom2Filters.add(action.value));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ListUIState _filterPurchaseOrdersByState(
|
||||||
|
ListUIState purchaseOrderListState, FilterPurchaseOrdersByState action) {
|
||||||
|
if (purchaseOrderListState.stateFilters.contains(action.state)) {
|
||||||
|
return purchaseOrderListState
|
||||||
|
.rebuild((b) => b..stateFilters.remove(action.state));
|
||||||
|
} else {
|
||||||
|
return purchaseOrderListState
|
||||||
|
.rebuild((b) => b..stateFilters.add(action.state));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ListUIState _filterPurchaseOrders(
|
||||||
|
ListUIState purchaseOrderListState, FilterPurchaseOrders action) {
|
||||||
|
return purchaseOrderListState.rebuild((b) => b
|
||||||
|
..filter = action.filter
|
||||||
|
..filterClearedAt = action.filter == null
|
||||||
|
? DateTime.now().millisecondsSinceEpoch
|
||||||
|
: purchaseOrderListState.filterClearedAt);
|
||||||
|
}
|
||||||
|
|
||||||
|
ListUIState _sortPurchaseOrders(
|
||||||
|
ListUIState purchaseOrderListState, SortPurchaseOrders action) {
|
||||||
|
return purchaseOrderListState.rebuild((b) => b
|
||||||
|
..sortAscending = b.sortField != action.field || !b.sortAscending
|
||||||
|
..sortField = action.field);
|
||||||
|
}
|
||||||
|
|
||||||
|
ListUIState _startListMultiselect(
|
||||||
|
ListUIState productListState, StartPurchaseOrderMultiselect action) {
|
||||||
|
return productListState.rebuild((b) => b..selectedIds = ListBuilder());
|
||||||
|
}
|
||||||
|
|
||||||
|
ListUIState _addToListMultiselect(
|
||||||
|
ListUIState productListState, AddToPurchaseOrderMultiselect action) {
|
||||||
|
return productListState.rebuild((b) => b..selectedIds.add(action.entity.id));
|
||||||
|
}
|
||||||
|
|
||||||
|
ListUIState _removeFromListMultiselect(
|
||||||
|
ListUIState productListState, RemoveFromPurchaseOrderMultiselect action) {
|
||||||
|
return productListState
|
||||||
|
.rebuild((b) => b..selectedIds.remove(action.entity.id));
|
||||||
|
}
|
||||||
|
|
||||||
|
ListUIState _clearListMultiselect(
|
||||||
|
ListUIState productListState, ClearPurchaseOrderMultiselect action) {
|
||||||
|
return productListState.rebuild((b) => b..selectedIds = null);
|
||||||
|
}
|
||||||
|
|
||||||
|
final purchaseOrdersReducer = combineReducers<PurchaseOrderState>([
|
||||||
|
TypedReducer<PurchaseOrderState, SavePurchaseOrderSuccess>(
|
||||||
|
_updatePurchaseOrder),
|
||||||
|
TypedReducer<PurchaseOrderState, AddPurchaseOrderSuccess>(_addPurchaseOrder),
|
||||||
|
TypedReducer<PurchaseOrderState, LoadPurchaseOrdersSuccess>(
|
||||||
|
_setLoadedPurchaseOrders),
|
||||||
|
TypedReducer<PurchaseOrderState, LoadPurchaseOrderSuccess>(
|
||||||
|
_setLoadedPurchaseOrder),
|
||||||
|
TypedReducer<PurchaseOrderState, LoadCompanySuccess>(_setLoadedCompany),
|
||||||
|
TypedReducer<PurchaseOrderState, ArchivePurchaseOrdersSuccess>(
|
||||||
|
_archivePurchaseOrderSuccess),
|
||||||
|
TypedReducer<PurchaseOrderState, DeletePurchaseOrdersSuccess>(
|
||||||
|
_deletePurchaseOrderSuccess),
|
||||||
|
TypedReducer<PurchaseOrderState, RestorePurchaseOrdersSuccess>(
|
||||||
|
_restorePurchaseOrderSuccess),
|
||||||
|
]);
|
||||||
|
|
||||||
|
PurchaseOrderState _archivePurchaseOrderSuccess(
|
||||||
|
PurchaseOrderState purchaseOrderState,
|
||||||
|
ArchivePurchaseOrdersSuccess action) {
|
||||||
|
return purchaseOrderState.rebuild((b) {
|
||||||
|
for (final purchaseOrder in action.purchaseOrders) {
|
||||||
|
b.map[purchaseOrder.id] = purchaseOrder;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
PurchaseOrderState _deletePurchaseOrderSuccess(
|
||||||
|
PurchaseOrderState purchaseOrderState, DeletePurchaseOrdersSuccess action) {
|
||||||
|
return purchaseOrderState.rebuild((b) {
|
||||||
|
for (final purchaseOrder in action.purchaseOrders) {
|
||||||
|
b.map[purchaseOrder.id] = purchaseOrder;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
PurchaseOrderState _restorePurchaseOrderSuccess(
|
||||||
|
PurchaseOrderState purchaseOrderState,
|
||||||
|
RestorePurchaseOrdersSuccess action) {
|
||||||
|
return purchaseOrderState.rebuild((b) {
|
||||||
|
for (final purchaseOrder in action.purchaseOrders) {
|
||||||
|
b.map[purchaseOrder.id] = purchaseOrder;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
PurchaseOrderState _addPurchaseOrder(
|
||||||
|
PurchaseOrderState purchaseOrderState, AddPurchaseOrderSuccess action) {
|
||||||
|
return purchaseOrderState.rebuild((b) => b
|
||||||
|
..map[action.purchaseOrder.id] = action.purchaseOrder
|
||||||
|
..list.add(action.purchaseOrder.id));
|
||||||
|
}
|
||||||
|
|
||||||
|
PurchaseOrderState _updatePurchaseOrder(
|
||||||
|
PurchaseOrderState purchaseOrderState, SavePurchaseOrderSuccess action) {
|
||||||
|
return purchaseOrderState
|
||||||
|
.rebuild((b) => b..map[action.purchaseOrder.id] = action.purchaseOrder);
|
||||||
|
}
|
||||||
|
|
||||||
|
PurchaseOrderState _setLoadedPurchaseOrder(
|
||||||
|
PurchaseOrderState purchaseOrderState, LoadPurchaseOrderSuccess action) {
|
||||||
|
return purchaseOrderState
|
||||||
|
.rebuild((b) => b..map[action.purchaseOrder.id] = action.purchaseOrder);
|
||||||
|
}
|
||||||
|
|
||||||
|
PurchaseOrderState _setLoadedPurchaseOrders(
|
||||||
|
PurchaseOrderState purchaseOrderState,
|
||||||
|
LoadPurchaseOrdersSuccess action) =>
|
||||||
|
purchaseOrderState.loadPurchaseOrders(action.purchaseOrders);
|
||||||
|
|
||||||
|
PurchaseOrderState _setLoadedCompany(
|
||||||
|
PurchaseOrderState purchaseOrderState, LoadCompanySuccess action) {
|
||||||
|
final company = action.userCompany.company;
|
||||||
|
return purchaseOrderState.loadPurchaseOrders(company.purchaseOrders);
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,155 @@
|
||||||
|
import 'package:invoiceninja_flutter/data/models/purchase_order_model.dart';
|
||||||
|
import 'package:invoiceninja_flutter/redux/static/static_state.dart';
|
||||||
|
import 'package:invoiceninja_flutter/redux/app/app_state.dart';
|
||||||
|
import 'package:memoize/memoize.dart';
|
||||||
|
import 'package:built_collection/built_collection.dart';
|
||||||
|
import 'package:invoiceninja_flutter/data/models/models.dart';
|
||||||
|
import 'package:invoiceninja_flutter/redux/ui/list_ui_state.dart';
|
||||||
|
|
||||||
|
var memoizedDropdownPurchaseOrderList = memo6(
|
||||||
|
(BuiltMap<String, InvoiceEntity> purchaseOrderMap,
|
||||||
|
BuiltList<String> purchaseOrderList,
|
||||||
|
StaticState staticState,
|
||||||
|
BuiltMap<String, UserEntity> userMap,
|
||||||
|
BuiltMap<String, ClientEntity> clientMap,
|
||||||
|
String clientId) =>
|
||||||
|
dropdownPurchaseOrdersSelector(purchaseOrderMap, purchaseOrderList,
|
||||||
|
staticState, userMap, clientMap, clientId));
|
||||||
|
|
||||||
|
List<String> dropdownPurchaseOrdersSelector(
|
||||||
|
BuiltMap<String, InvoiceEntity> purchaseOrderMap,
|
||||||
|
BuiltList<String> purchaseOrderList,
|
||||||
|
StaticState staticState,
|
||||||
|
BuiltMap<String, UserEntity> userMap,
|
||||||
|
BuiltMap<String, ClientEntity> clientMap,
|
||||||
|
String clientId) {
|
||||||
|
final list = purchaseOrderList.where((purchaseOrderId) {
|
||||||
|
final purchaseOrder = purchaseOrderMap[purchaseOrderId];
|
||||||
|
/*
|
||||||
|
if (clientId != null && clientId > 0 && purchaseOrder.clientId != clientId) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
return purchaseOrder.isActive;
|
||||||
|
}).toList();
|
||||||
|
|
||||||
|
list.sort((purchaseOrderAId, purchaseOrderBId) {
|
||||||
|
final purchaseOrderA = purchaseOrderMap[purchaseOrderAId];
|
||||||
|
final purchaseOrderB = purchaseOrderMap[purchaseOrderBId];
|
||||||
|
return purchaseOrderA.compareTo(
|
||||||
|
invoice: purchaseOrderB,
|
||||||
|
sortAscending: false,
|
||||||
|
sortField: PurchaseOrderFields.number,
|
||||||
|
userMap: userMap,
|
||||||
|
clientMap: clientMap,
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
|
||||||
|
var memoizedFilteredPurchaseOrderList = memo6((
|
||||||
|
SelectionState selectionState,
|
||||||
|
BuiltMap<String, InvoiceEntity> invoiceMap,
|
||||||
|
BuiltList<String> invoiceList,
|
||||||
|
BuiltMap<String, ClientEntity> clientMap,
|
||||||
|
ListUIState invoiceListState,
|
||||||
|
BuiltMap<String, UserEntity> userMap,
|
||||||
|
) =>
|
||||||
|
filteredPurchaseOrdersSelector(selectionState, invoiceMap, invoiceList,
|
||||||
|
clientMap, invoiceListState, userMap));
|
||||||
|
|
||||||
|
List<String> filteredPurchaseOrdersSelector(
|
||||||
|
SelectionState selectionState,
|
||||||
|
BuiltMap<String, InvoiceEntity> invoiceMap,
|
||||||
|
BuiltList<String> invoiceList,
|
||||||
|
BuiltMap<String, ClientEntity> clientMap,
|
||||||
|
ListUIState invoiceListState,
|
||||||
|
BuiltMap<String, UserEntity> userMap,
|
||||||
|
) {
|
||||||
|
final filterEntityId = selectionState.filterEntityId;
|
||||||
|
final filterEntityType = selectionState.filterEntityType;
|
||||||
|
|
||||||
|
final list = invoiceList.where((invoiceId) {
|
||||||
|
final invoice = invoiceMap[invoiceId];
|
||||||
|
final client =
|
||||||
|
clientMap[invoice.clientId] ?? ClientEntity(id: invoice.clientId);
|
||||||
|
|
||||||
|
if (invoice.id == selectionState.selectedId) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!client.isActive &&
|
||||||
|
!client.matchesEntityFilter(filterEntityType, filterEntityId)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (filterEntityType == EntityType.client && client.id != filterEntityId) {
|
||||||
|
return false;
|
||||||
|
} else if (filterEntityType == EntityType.user &&
|
||||||
|
invoice.assignedUserId != filterEntityId) {
|
||||||
|
return false;
|
||||||
|
} else if (filterEntityType == EntityType.recurringInvoice &&
|
||||||
|
invoice.recurringId != filterEntityId) {
|
||||||
|
return false;
|
||||||
|
} else if (filterEntityType == EntityType.subscription &&
|
||||||
|
invoice.subscriptionId != filterEntityId) {
|
||||||
|
return false;
|
||||||
|
} else if (filterEntityType == EntityType.design &&
|
||||||
|
invoice.designId != filterEntityId) {
|
||||||
|
return false;
|
||||||
|
} else if (filterEntityType == EntityType.group &&
|
||||||
|
client.groupId != filterEntityId) {
|
||||||
|
return false;
|
||||||
|
} else if (filterEntityType == EntityType.project &&
|
||||||
|
invoice.projectId != filterEntityId) {
|
||||||
|
return false;
|
||||||
|
} else if (filterEntityType == EntityType.quote &&
|
||||||
|
invoice.invoiceId != filterEntityId) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!invoice.matchesStates(invoiceListState.stateFilters)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (!invoice.matchesStatuses(invoiceListState.statusFilters)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (!invoice.matchesFilter(invoiceListState.filter) &&
|
||||||
|
!client.matchesNameOrEmail(invoiceListState.filter)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (invoiceListState.custom1Filters.isNotEmpty &&
|
||||||
|
!invoiceListState.custom1Filters.contains(invoice.customValue1)) {
|
||||||
|
return false;
|
||||||
|
} else if (invoiceListState.custom2Filters.isNotEmpty &&
|
||||||
|
!invoiceListState.custom2Filters.contains(invoice.customValue2)) {
|
||||||
|
return false;
|
||||||
|
} else if (invoiceListState.custom3Filters.isNotEmpty &&
|
||||||
|
!invoiceListState.custom3Filters.contains(invoice.customValue3)) {
|
||||||
|
return false;
|
||||||
|
} else if (invoiceListState.custom4Filters.isNotEmpty &&
|
||||||
|
!invoiceListState.custom4Filters.contains(invoice.customValue4)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}).toList();
|
||||||
|
|
||||||
|
list.sort((invoiceAId, invoiceBId) {
|
||||||
|
return invoiceMap[invoiceAId].compareTo(
|
||||||
|
invoice: invoiceMap[invoiceBId],
|
||||||
|
sortField: invoiceListState.sortField,
|
||||||
|
sortAscending: invoiceListState.sortAscending,
|
||||||
|
clientMap: clientMap,
|
||||||
|
userMap: userMap,
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool hasPurchaseOrderChanges(InvoiceEntity purchaseOrder,
|
||||||
|
BuiltMap<String, InvoiceEntity> purchaseOrderMap) =>
|
||||||
|
purchaseOrder.isNew
|
||||||
|
? purchaseOrder.isChanged
|
||||||
|
: purchaseOrder != purchaseOrderMap[purchaseOrder.id];
|
||||||
|
|
@ -0,0 +1,83 @@
|
||||||
|
import 'dart:async';
|
||||||
|
import 'package:built_value/built_value.dart';
|
||||||
|
import 'package:built_value/serializer.dart';
|
||||||
|
import 'package:built_collection/built_collection.dart';
|
||||||
|
import 'package:invoiceninja_flutter/data/models/purchase_order_model.dart';
|
||||||
|
import 'package:invoiceninja_flutter/redux/ui/entity_ui_state.dart';
|
||||||
|
import 'package:invoiceninja_flutter/redux/ui/list_ui_state.dart';
|
||||||
|
import 'package:invoiceninja_flutter/data/models/models.dart';
|
||||||
|
import 'package:invoiceninja_flutter/redux/ui/pref_state.dart';
|
||||||
|
|
||||||
|
part 'purchase_order_state.g.dart';
|
||||||
|
|
||||||
|
abstract class PurchaseOrderState
|
||||||
|
implements Built<PurchaseOrderState, PurchaseOrderStateBuilder> {
|
||||||
|
factory PurchaseOrderState() {
|
||||||
|
return _$PurchaseOrderState._(
|
||||||
|
map: BuiltMap<String, InvoiceEntity>(),
|
||||||
|
list: BuiltList<String>(),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
PurchaseOrderState._();
|
||||||
|
|
||||||
|
@override
|
||||||
|
@memoized
|
||||||
|
int get hashCode;
|
||||||
|
|
||||||
|
BuiltMap<String, InvoiceEntity> get map;
|
||||||
|
BuiltList<String> get list;
|
||||||
|
|
||||||
|
InvoiceEntity get(String purchaseOrderId) {
|
||||||
|
if (map.containsKey(purchaseOrderId)) {
|
||||||
|
return map[purchaseOrderId];
|
||||||
|
} else {
|
||||||
|
return InvoiceEntity(id: purchaseOrderId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
PurchaseOrderState loadPurchaseOrders(BuiltList<InvoiceEntity> clients) {
|
||||||
|
final map = Map<String, InvoiceEntity>.fromIterable(
|
||||||
|
clients,
|
||||||
|
key: (dynamic item) => item.id,
|
||||||
|
value: (dynamic item) => item,
|
||||||
|
);
|
||||||
|
|
||||||
|
return rebuild((b) => b
|
||||||
|
..map.addAll(map)
|
||||||
|
..list.replace((map.keys.toList() + list.toList()).toSet().toList()));
|
||||||
|
}
|
||||||
|
|
||||||
|
static Serializer<PurchaseOrderState> get serializer =>
|
||||||
|
_$purchaseOrderStateSerializer;
|
||||||
|
}
|
||||||
|
|
||||||
|
abstract class PurchaseOrderUIState extends Object
|
||||||
|
with EntityUIState
|
||||||
|
implements Built<PurchaseOrderUIState, PurchaseOrderUIStateBuilder> {
|
||||||
|
factory PurchaseOrderUIState(PrefStateSortField sortField) {
|
||||||
|
return _$PurchaseOrderUIState._(
|
||||||
|
listUIState: ListUIState(sortField?.field ?? PurchaseOrderFields.number,
|
||||||
|
sortAscending: sortField?.ascending),
|
||||||
|
editing: InvoiceEntity(),
|
||||||
|
selectedId: '',
|
||||||
|
tabIndex: 0,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
PurchaseOrderUIState._();
|
||||||
|
|
||||||
|
@override
|
||||||
|
@memoized
|
||||||
|
int get hashCode;
|
||||||
|
|
||||||
|
@nullable
|
||||||
|
InvoiceEntity get editing;
|
||||||
|
|
||||||
|
@override
|
||||||
|
bool get isCreatingNew => editing.isNew;
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get editingId => editing.id;
|
||||||
|
|
||||||
|
static Serializer<PurchaseOrderUIState> get serializer =>
|
||||||
|
_$purchaseOrderUIStateSerializer;
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,447 @@
|
||||||
|
// GENERATED CODE - DO NOT MODIFY BY HAND
|
||||||
|
|
||||||
|
part of 'purchase_order_state.dart';
|
||||||
|
|
||||||
|
// **************************************************************************
|
||||||
|
// BuiltValueGenerator
|
||||||
|
// **************************************************************************
|
||||||
|
|
||||||
|
Serializer<PurchaseOrderState> _$purchaseOrderStateSerializer =
|
||||||
|
new _$PurchaseOrderStateSerializer();
|
||||||
|
Serializer<PurchaseOrderUIState> _$purchaseOrderUIStateSerializer =
|
||||||
|
new _$PurchaseOrderUIStateSerializer();
|
||||||
|
|
||||||
|
class _$PurchaseOrderStateSerializer
|
||||||
|
implements StructuredSerializer<PurchaseOrderState> {
|
||||||
|
@override
|
||||||
|
final Iterable<Type> types = const [PurchaseOrderState, _$PurchaseOrderState];
|
||||||
|
@override
|
||||||
|
final String wireName = 'PurchaseOrderState';
|
||||||
|
|
||||||
|
@override
|
||||||
|
Iterable<Object> serialize(Serializers serializers, PurchaseOrderState object,
|
||||||
|
{FullType specifiedType = FullType.unspecified}) {
|
||||||
|
final result = <Object>[
|
||||||
|
'map',
|
||||||
|
serializers.serialize(object.map,
|
||||||
|
specifiedType: const FullType(BuiltMap,
|
||||||
|
const [const FullType(String), const FullType(InvoiceEntity)])),
|
||||||
|
'list',
|
||||||
|
serializers.serialize(object.list,
|
||||||
|
specifiedType:
|
||||||
|
const FullType(BuiltList, const [const FullType(String)])),
|
||||||
|
];
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
PurchaseOrderState deserialize(
|
||||||
|
Serializers serializers, Iterable<Object> serialized,
|
||||||
|
{FullType specifiedType = FullType.unspecified}) {
|
||||||
|
final result = new PurchaseOrderStateBuilder();
|
||||||
|
|
||||||
|
final iterator = serialized.iterator;
|
||||||
|
while (iterator.moveNext()) {
|
||||||
|
final key = iterator.current as String;
|
||||||
|
iterator.moveNext();
|
||||||
|
final Object value = iterator.current;
|
||||||
|
switch (key) {
|
||||||
|
case 'map':
|
||||||
|
result.map.replace(serializers.deserialize(value,
|
||||||
|
specifiedType: const FullType(BuiltMap, const [
|
||||||
|
const FullType(String),
|
||||||
|
const FullType(InvoiceEntity)
|
||||||
|
])));
|
||||||
|
break;
|
||||||
|
case 'list':
|
||||||
|
result.list.replace(serializers.deserialize(value,
|
||||||
|
specifiedType:
|
||||||
|
const FullType(BuiltList, const [const FullType(String)]))
|
||||||
|
as BuiltList<Object>);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return result.build();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class _$PurchaseOrderUIStateSerializer
|
||||||
|
implements StructuredSerializer<PurchaseOrderUIState> {
|
||||||
|
@override
|
||||||
|
final Iterable<Type> types = const [
|
||||||
|
PurchaseOrderUIState,
|
||||||
|
_$PurchaseOrderUIState
|
||||||
|
];
|
||||||
|
@override
|
||||||
|
final String wireName = 'PurchaseOrderUIState';
|
||||||
|
|
||||||
|
@override
|
||||||
|
Iterable<Object> serialize(
|
||||||
|
Serializers serializers, PurchaseOrderUIState object,
|
||||||
|
{FullType specifiedType = FullType.unspecified}) {
|
||||||
|
final result = <Object>[
|
||||||
|
'listUIState',
|
||||||
|
serializers.serialize(object.listUIState,
|
||||||
|
specifiedType: const FullType(ListUIState)),
|
||||||
|
'tabIndex',
|
||||||
|
serializers.serialize(object.tabIndex,
|
||||||
|
specifiedType: const FullType(int)),
|
||||||
|
];
|
||||||
|
Object value;
|
||||||
|
value = object.editing;
|
||||||
|
if (value != null) {
|
||||||
|
result
|
||||||
|
..add('editing')
|
||||||
|
..add(serializers.serialize(value,
|
||||||
|
specifiedType: const FullType(InvoiceEntity)));
|
||||||
|
}
|
||||||
|
value = object.selectedId;
|
||||||
|
if (value != null) {
|
||||||
|
result
|
||||||
|
..add('selectedId')
|
||||||
|
..add(serializers.serialize(value,
|
||||||
|
specifiedType: const FullType(String)));
|
||||||
|
}
|
||||||
|
value = object.forceSelected;
|
||||||
|
if (value != null) {
|
||||||
|
result
|
||||||
|
..add('forceSelected')
|
||||||
|
..add(
|
||||||
|
serializers.serialize(value, specifiedType: const FullType(bool)));
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
PurchaseOrderUIState deserialize(
|
||||||
|
Serializers serializers, Iterable<Object> serialized,
|
||||||
|
{FullType specifiedType = FullType.unspecified}) {
|
||||||
|
final result = new PurchaseOrderUIStateBuilder();
|
||||||
|
|
||||||
|
final iterator = serialized.iterator;
|
||||||
|
while (iterator.moveNext()) {
|
||||||
|
final key = iterator.current as String;
|
||||||
|
iterator.moveNext();
|
||||||
|
final Object value = iterator.current;
|
||||||
|
switch (key) {
|
||||||
|
case 'editing':
|
||||||
|
result.editing.replace(serializers.deserialize(value,
|
||||||
|
specifiedType: const FullType(InvoiceEntity)) as InvoiceEntity);
|
||||||
|
break;
|
||||||
|
case 'listUIState':
|
||||||
|
result.listUIState.replace(serializers.deserialize(value,
|
||||||
|
specifiedType: const FullType(ListUIState)) as ListUIState);
|
||||||
|
break;
|
||||||
|
case 'selectedId':
|
||||||
|
result.selectedId = serializers.deserialize(value,
|
||||||
|
specifiedType: const FullType(String)) as String;
|
||||||
|
break;
|
||||||
|
case 'forceSelected':
|
||||||
|
result.forceSelected = serializers.deserialize(value,
|
||||||
|
specifiedType: const FullType(bool)) as bool;
|
||||||
|
break;
|
||||||
|
case 'tabIndex':
|
||||||
|
result.tabIndex = serializers.deserialize(value,
|
||||||
|
specifiedType: const FullType(int)) as int;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return result.build();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class _$PurchaseOrderState extends PurchaseOrderState {
|
||||||
|
@override
|
||||||
|
final BuiltMap<String, InvoiceEntity> map;
|
||||||
|
@override
|
||||||
|
final BuiltList<String> list;
|
||||||
|
|
||||||
|
factory _$PurchaseOrderState(
|
||||||
|
[void Function(PurchaseOrderStateBuilder) updates]) =>
|
||||||
|
(new PurchaseOrderStateBuilder()..update(updates)).build();
|
||||||
|
|
||||||
|
_$PurchaseOrderState._({this.map, this.list}) : super._() {
|
||||||
|
BuiltValueNullFieldError.checkNotNull(map, 'PurchaseOrderState', 'map');
|
||||||
|
BuiltValueNullFieldError.checkNotNull(list, 'PurchaseOrderState', 'list');
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
PurchaseOrderState rebuild(
|
||||||
|
void Function(PurchaseOrderStateBuilder) updates) =>
|
||||||
|
(toBuilder()..update(updates)).build();
|
||||||
|
|
||||||
|
@override
|
||||||
|
PurchaseOrderStateBuilder toBuilder() =>
|
||||||
|
new PurchaseOrderStateBuilder()..replace(this);
|
||||||
|
|
||||||
|
@override
|
||||||
|
bool operator ==(Object other) {
|
||||||
|
if (identical(other, this)) return true;
|
||||||
|
return other is PurchaseOrderState &&
|
||||||
|
map == other.map &&
|
||||||
|
list == other.list;
|
||||||
|
}
|
||||||
|
|
||||||
|
int __hashCode;
|
||||||
|
@override
|
||||||
|
int get hashCode {
|
||||||
|
return __hashCode ??= $jf($jc($jc(0, map.hashCode), list.hashCode));
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
String toString() {
|
||||||
|
return (newBuiltValueToStringHelper('PurchaseOrderState')
|
||||||
|
..add('map', map)
|
||||||
|
..add('list', list))
|
||||||
|
.toString();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class PurchaseOrderStateBuilder
|
||||||
|
implements Builder<PurchaseOrderState, PurchaseOrderStateBuilder> {
|
||||||
|
_$PurchaseOrderState _$v;
|
||||||
|
|
||||||
|
MapBuilder<String, InvoiceEntity> _map;
|
||||||
|
MapBuilder<String, InvoiceEntity> get map =>
|
||||||
|
_$this._map ??= new MapBuilder<String, InvoiceEntity>();
|
||||||
|
set map(MapBuilder<String, InvoiceEntity> map) => _$this._map = map;
|
||||||
|
|
||||||
|
ListBuilder<String> _list;
|
||||||
|
ListBuilder<String> get list => _$this._list ??= new ListBuilder<String>();
|
||||||
|
set list(ListBuilder<String> list) => _$this._list = list;
|
||||||
|
|
||||||
|
PurchaseOrderStateBuilder();
|
||||||
|
|
||||||
|
PurchaseOrderStateBuilder get _$this {
|
||||||
|
final $v = _$v;
|
||||||
|
if ($v != null) {
|
||||||
|
_map = $v.map.toBuilder();
|
||||||
|
_list = $v.list.toBuilder();
|
||||||
|
_$v = null;
|
||||||
|
}
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
void replace(PurchaseOrderState other) {
|
||||||
|
ArgumentError.checkNotNull(other, 'other');
|
||||||
|
_$v = other as _$PurchaseOrderState;
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
void update(void Function(PurchaseOrderStateBuilder) updates) {
|
||||||
|
if (updates != null) updates(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
_$PurchaseOrderState build() {
|
||||||
|
_$PurchaseOrderState _$result;
|
||||||
|
try {
|
||||||
|
_$result = _$v ??
|
||||||
|
new _$PurchaseOrderState._(map: map.build(), list: list.build());
|
||||||
|
} catch (_) {
|
||||||
|
String _$failedField;
|
||||||
|
try {
|
||||||
|
_$failedField = 'map';
|
||||||
|
map.build();
|
||||||
|
_$failedField = 'list';
|
||||||
|
list.build();
|
||||||
|
} catch (e) {
|
||||||
|
throw new BuiltValueNestedFieldError(
|
||||||
|
'PurchaseOrderState', _$failedField, e.toString());
|
||||||
|
}
|
||||||
|
rethrow;
|
||||||
|
}
|
||||||
|
replace(_$result);
|
||||||
|
return _$result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class _$PurchaseOrderUIState extends PurchaseOrderUIState {
|
||||||
|
@override
|
||||||
|
final InvoiceEntity editing;
|
||||||
|
@override
|
||||||
|
final ListUIState listUIState;
|
||||||
|
@override
|
||||||
|
final String selectedId;
|
||||||
|
@override
|
||||||
|
final bool forceSelected;
|
||||||
|
@override
|
||||||
|
final int tabIndex;
|
||||||
|
@override
|
||||||
|
final Completer<SelectableEntity> saveCompleter;
|
||||||
|
@override
|
||||||
|
final Completer<Null> cancelCompleter;
|
||||||
|
|
||||||
|
factory _$PurchaseOrderUIState(
|
||||||
|
[void Function(PurchaseOrderUIStateBuilder) updates]) =>
|
||||||
|
(new PurchaseOrderUIStateBuilder()..update(updates)).build();
|
||||||
|
|
||||||
|
_$PurchaseOrderUIState._(
|
||||||
|
{this.editing,
|
||||||
|
this.listUIState,
|
||||||
|
this.selectedId,
|
||||||
|
this.forceSelected,
|
||||||
|
this.tabIndex,
|
||||||
|
this.saveCompleter,
|
||||||
|
this.cancelCompleter})
|
||||||
|
: super._() {
|
||||||
|
BuiltValueNullFieldError.checkNotNull(
|
||||||
|
listUIState, 'PurchaseOrderUIState', 'listUIState');
|
||||||
|
BuiltValueNullFieldError.checkNotNull(
|
||||||
|
tabIndex, 'PurchaseOrderUIState', 'tabIndex');
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
PurchaseOrderUIState rebuild(
|
||||||
|
void Function(PurchaseOrderUIStateBuilder) updates) =>
|
||||||
|
(toBuilder()..update(updates)).build();
|
||||||
|
|
||||||
|
@override
|
||||||
|
PurchaseOrderUIStateBuilder toBuilder() =>
|
||||||
|
new PurchaseOrderUIStateBuilder()..replace(this);
|
||||||
|
|
||||||
|
@override
|
||||||
|
bool operator ==(Object other) {
|
||||||
|
if (identical(other, this)) return true;
|
||||||
|
return other is PurchaseOrderUIState &&
|
||||||
|
editing == other.editing &&
|
||||||
|
listUIState == other.listUIState &&
|
||||||
|
selectedId == other.selectedId &&
|
||||||
|
forceSelected == other.forceSelected &&
|
||||||
|
tabIndex == other.tabIndex &&
|
||||||
|
saveCompleter == other.saveCompleter &&
|
||||||
|
cancelCompleter == other.cancelCompleter;
|
||||||
|
}
|
||||||
|
|
||||||
|
int __hashCode;
|
||||||
|
@override
|
||||||
|
int get hashCode {
|
||||||
|
return __hashCode ??= $jf($jc(
|
||||||
|
$jc(
|
||||||
|
$jc(
|
||||||
|
$jc(
|
||||||
|
$jc($jc($jc(0, editing.hashCode), listUIState.hashCode),
|
||||||
|
selectedId.hashCode),
|
||||||
|
forceSelected.hashCode),
|
||||||
|
tabIndex.hashCode),
|
||||||
|
saveCompleter.hashCode),
|
||||||
|
cancelCompleter.hashCode));
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
String toString() {
|
||||||
|
return (newBuiltValueToStringHelper('PurchaseOrderUIState')
|
||||||
|
..add('editing', editing)
|
||||||
|
..add('listUIState', listUIState)
|
||||||
|
..add('selectedId', selectedId)
|
||||||
|
..add('forceSelected', forceSelected)
|
||||||
|
..add('tabIndex', tabIndex)
|
||||||
|
..add('saveCompleter', saveCompleter)
|
||||||
|
..add('cancelCompleter', cancelCompleter))
|
||||||
|
.toString();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class PurchaseOrderUIStateBuilder
|
||||||
|
implements Builder<PurchaseOrderUIState, PurchaseOrderUIStateBuilder> {
|
||||||
|
_$PurchaseOrderUIState _$v;
|
||||||
|
|
||||||
|
InvoiceEntityBuilder _editing;
|
||||||
|
InvoiceEntityBuilder get editing =>
|
||||||
|
_$this._editing ??= new InvoiceEntityBuilder();
|
||||||
|
set editing(InvoiceEntityBuilder editing) => _$this._editing = editing;
|
||||||
|
|
||||||
|
ListUIStateBuilder _listUIState;
|
||||||
|
ListUIStateBuilder get listUIState =>
|
||||||
|
_$this._listUIState ??= new ListUIStateBuilder();
|
||||||
|
set listUIState(ListUIStateBuilder listUIState) =>
|
||||||
|
_$this._listUIState = listUIState;
|
||||||
|
|
||||||
|
String _selectedId;
|
||||||
|
String get selectedId => _$this._selectedId;
|
||||||
|
set selectedId(String selectedId) => _$this._selectedId = selectedId;
|
||||||
|
|
||||||
|
bool _forceSelected;
|
||||||
|
bool get forceSelected => _$this._forceSelected;
|
||||||
|
set forceSelected(bool forceSelected) =>
|
||||||
|
_$this._forceSelected = forceSelected;
|
||||||
|
|
||||||
|
int _tabIndex;
|
||||||
|
int get tabIndex => _$this._tabIndex;
|
||||||
|
set tabIndex(int tabIndex) => _$this._tabIndex = tabIndex;
|
||||||
|
|
||||||
|
Completer<SelectableEntity> _saveCompleter;
|
||||||
|
Completer<SelectableEntity> get saveCompleter => _$this._saveCompleter;
|
||||||
|
set saveCompleter(Completer<SelectableEntity> saveCompleter) =>
|
||||||
|
_$this._saveCompleter = saveCompleter;
|
||||||
|
|
||||||
|
Completer<Null> _cancelCompleter;
|
||||||
|
Completer<Null> get cancelCompleter => _$this._cancelCompleter;
|
||||||
|
set cancelCompleter(Completer<Null> cancelCompleter) =>
|
||||||
|
_$this._cancelCompleter = cancelCompleter;
|
||||||
|
|
||||||
|
PurchaseOrderUIStateBuilder();
|
||||||
|
|
||||||
|
PurchaseOrderUIStateBuilder get _$this {
|
||||||
|
final $v = _$v;
|
||||||
|
if ($v != null) {
|
||||||
|
_editing = $v.editing?.toBuilder();
|
||||||
|
_listUIState = $v.listUIState.toBuilder();
|
||||||
|
_selectedId = $v.selectedId;
|
||||||
|
_forceSelected = $v.forceSelected;
|
||||||
|
_tabIndex = $v.tabIndex;
|
||||||
|
_saveCompleter = $v.saveCompleter;
|
||||||
|
_cancelCompleter = $v.cancelCompleter;
|
||||||
|
_$v = null;
|
||||||
|
}
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
void replace(PurchaseOrderUIState other) {
|
||||||
|
ArgumentError.checkNotNull(other, 'other');
|
||||||
|
_$v = other as _$PurchaseOrderUIState;
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
void update(void Function(PurchaseOrderUIStateBuilder) updates) {
|
||||||
|
if (updates != null) updates(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
_$PurchaseOrderUIState build() {
|
||||||
|
_$PurchaseOrderUIState _$result;
|
||||||
|
try {
|
||||||
|
_$result = _$v ??
|
||||||
|
new _$PurchaseOrderUIState._(
|
||||||
|
editing: _editing?.build(),
|
||||||
|
listUIState: listUIState.build(),
|
||||||
|
selectedId: selectedId,
|
||||||
|
forceSelected: forceSelected,
|
||||||
|
tabIndex: BuiltValueNullFieldError.checkNotNull(
|
||||||
|
tabIndex, 'PurchaseOrderUIState', 'tabIndex'),
|
||||||
|
saveCompleter: saveCompleter,
|
||||||
|
cancelCompleter: cancelCompleter);
|
||||||
|
} catch (_) {
|
||||||
|
String _$failedField;
|
||||||
|
try {
|
||||||
|
_$failedField = 'editing';
|
||||||
|
_editing?.build();
|
||||||
|
_$failedField = 'listUIState';
|
||||||
|
listUIState.build();
|
||||||
|
} catch (e) {
|
||||||
|
throw new BuiltValueNestedFieldError(
|
||||||
|
'PurchaseOrderUIState', _$failedField, e.toString());
|
||||||
|
}
|
||||||
|
rethrow;
|
||||||
|
}
|
||||||
|
replace(_$result);
|
||||||
|
return _$result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ignore_for_file: always_put_control_body_on_new_line,always_specify_types,annotate_overrides,avoid_annotating_with_dynamic,avoid_as,avoid_catches_without_on_clauses,avoid_returning_this,deprecated_member_use_from_same_package,lines_longer_than_80_chars,omit_local_variable_types,prefer_expression_function_bodies,sort_constructors_first,test_types_in_equals,unnecessary_const,unnecessary_new
|
||||||
|
|
@ -40,6 +40,7 @@ import 'package:invoiceninja_flutter/redux/vendor/vendor_actions.dart';
|
||||||
import 'package:invoiceninja_flutter/redux/webhook/webhook_actions.dart';
|
import 'package:invoiceninja_flutter/redux/webhook/webhook_actions.dart';
|
||||||
|
|
||||||
// STARTER: import - do not remove comment
|
// STARTER: import - do not remove comment
|
||||||
|
import 'package:invoiceninja_flutter/redux/purchase_order/purchase_order_actions.dart';
|
||||||
|
|
||||||
PrefState prefReducer(
|
PrefState prefReducer(
|
||||||
PrefState state, dynamic action, String selectedCompanyId) {
|
PrefState state, dynamic action, String selectedCompanyId) {
|
||||||
|
|
@ -529,6 +530,19 @@ Reducer<BuiltList<HistoryRecord>> historyReducer = combineReducers([
|
||||||
_addToHistory(historyList,
|
_addToHistory(historyList,
|
||||||
HistoryRecord(id: action.group.id, entityType: EntityType.group))),
|
HistoryRecord(id: action.group.id, entityType: EntityType.group))),
|
||||||
// STARTER: history - do not remove comment
|
// STARTER: history - do not remove comment
|
||||||
|
TypedReducer<BuiltList<HistoryRecord>, ViewPurchaseOrder>(
|
||||||
|
(historyList, action) => _addToHistory(
|
||||||
|
historyList,
|
||||||
|
HistoryRecord(
|
||||||
|
id: action.purchaseOrderId,
|
||||||
|
entityType: EntityType.purchaseOrder))),
|
||||||
|
TypedReducer<BuiltList<HistoryRecord>, EditPurchaseOrder>(
|
||||||
|
(historyList, action) => _addToHistory(
|
||||||
|
historyList,
|
||||||
|
HistoryRecord(
|
||||||
|
id: action.purchaseOrder.id,
|
||||||
|
entityType: EntityType.purchaseOrder))),
|
||||||
|
|
||||||
TypedReducer<BuiltList<HistoryRecord>, ViewRecurringExpense>(
|
TypedReducer<BuiltList<HistoryRecord>, ViewRecurringExpense>(
|
||||||
(historyList, action) => _addToHistory(
|
(historyList, action) => _addToHistory(
|
||||||
historyList,
|
historyList,
|
||||||
|
|
|
||||||
|
|
@ -50,6 +50,7 @@ import 'package:invoiceninja_flutter/redux/vendor/vendor_reducer.dart';
|
||||||
import 'package:invoiceninja_flutter/redux/webhook/webhook_reducer.dart';
|
import 'package:invoiceninja_flutter/redux/webhook/webhook_reducer.dart';
|
||||||
|
|
||||||
// STARTER: import - do not remove comment
|
// STARTER: import - do not remove comment
|
||||||
|
import 'package:invoiceninja_flutter/redux/purchase_order/purchase_order_reducer.dart';
|
||||||
|
|
||||||
UIState uiReducer(UIState state, dynamic action) {
|
UIState uiReducer(UIState state, dynamic action) {
|
||||||
final currentRoute = currentRouteReducer(state.currentRoute, action);
|
final currentRoute = currentRouteReducer(state.currentRoute, action);
|
||||||
|
|
@ -76,6 +77,8 @@ UIState uiReducer(UIState state, dynamic action) {
|
||||||
.replace(dashboardUIReducer(state.dashboardUIState, action))
|
.replace(dashboardUIReducer(state.dashboardUIState, action))
|
||||||
..reportsUIState.replace(reportsUIReducer(state.reportsUIState, action))
|
..reportsUIState.replace(reportsUIReducer(state.reportsUIState, action))
|
||||||
// STARTER: reducer - do not remove comment
|
// STARTER: reducer - do not remove comment
|
||||||
|
..purchaseOrderUIState
|
||||||
|
.replace(purchaseOrderUIReducer(state.purchaseOrderUIState, action))
|
||||||
..recurringExpenseUIState.replace(
|
..recurringExpenseUIState.replace(
|
||||||
recurringExpenseUIReducer(state.recurringExpenseUIState, action))
|
recurringExpenseUIReducer(state.recurringExpenseUIState, action))
|
||||||
..subscriptionUIState
|
..subscriptionUIState
|
||||||
|
|
|
||||||
|
|
@ -38,6 +38,7 @@ import 'package:invoiceninja_flutter/ui/auth/login_vm.dart';
|
||||||
import 'package:invoiceninja_flutter/utils/strings.dart';
|
import 'package:invoiceninja_flutter/utils/strings.dart';
|
||||||
|
|
||||||
// STARTER: import - do not remove comment
|
// STARTER: import - do not remove comment
|
||||||
|
import 'package:invoiceninja_flutter/redux/purchase_order/purchase_order_state.dart';
|
||||||
|
|
||||||
part 'ui_state.g.dart';
|
part 'ui_state.g.dart';
|
||||||
|
|
||||||
|
|
@ -86,6 +87,9 @@ abstract class UIState implements Built<UIState, UIStateBuilder> {
|
||||||
paymentUIState: PaymentUIState(sortFields[EntityType.payment]),
|
paymentUIState: PaymentUIState(sortFields[EntityType.payment]),
|
||||||
quoteUIState: QuoteUIState(sortFields[EntityType.quote]),
|
quoteUIState: QuoteUIState(sortFields[EntityType.quote]),
|
||||||
// STARTER: constructor - do not remove comment
|
// STARTER: constructor - do not remove comment
|
||||||
|
purchaseOrderUIState:
|
||||||
|
PurchaseOrderUIState(sortFields[EntityType.purchaseOrder]),
|
||||||
|
|
||||||
recurringExpenseUIState:
|
recurringExpenseUIState:
|
||||||
RecurringExpenseUIState(sortFields[EntityType.recurringExpense]),
|
RecurringExpenseUIState(sortFields[EntityType.recurringExpense]),
|
||||||
);
|
);
|
||||||
|
|
@ -133,6 +137,8 @@ abstract class UIState implements Built<UIState, UIStateBuilder> {
|
||||||
InvoiceUIState get invoiceUIState;
|
InvoiceUIState get invoiceUIState;
|
||||||
|
|
||||||
// STARTER: properties - do not remove comment
|
// STARTER: properties - do not remove comment
|
||||||
|
PurchaseOrderUIState get purchaseOrderUIState;
|
||||||
|
|
||||||
RecurringExpenseUIState get recurringExpenseUIState;
|
RecurringExpenseUIState get recurringExpenseUIState;
|
||||||
|
|
||||||
SubscriptionUIState get subscriptionUIState;
|
SubscriptionUIState get subscriptionUIState;
|
||||||
|
|
|
||||||
|
|
@ -53,6 +53,9 @@ class _$UIStateSerializer implements StructuredSerializer<UIState> {
|
||||||
'invoiceUIState',
|
'invoiceUIState',
|
||||||
serializers.serialize(object.invoiceUIState,
|
serializers.serialize(object.invoiceUIState,
|
||||||
specifiedType: const FullType(InvoiceUIState)),
|
specifiedType: const FullType(InvoiceUIState)),
|
||||||
|
'purchaseOrderUIState',
|
||||||
|
serializers.serialize(object.purchaseOrderUIState,
|
||||||
|
specifiedType: const FullType(PurchaseOrderUIState)),
|
||||||
'recurringExpenseUIState',
|
'recurringExpenseUIState',
|
||||||
serializers.serialize(object.recurringExpenseUIState,
|
serializers.serialize(object.recurringExpenseUIState,
|
||||||
specifiedType: const FullType(RecurringExpenseUIState)),
|
specifiedType: const FullType(RecurringExpenseUIState)),
|
||||||
|
|
@ -209,6 +212,11 @@ class _$UIStateSerializer implements StructuredSerializer<UIState> {
|
||||||
result.invoiceUIState.replace(serializers.deserialize(value,
|
result.invoiceUIState.replace(serializers.deserialize(value,
|
||||||
specifiedType: const FullType(InvoiceUIState)) as InvoiceUIState);
|
specifiedType: const FullType(InvoiceUIState)) as InvoiceUIState);
|
||||||
break;
|
break;
|
||||||
|
case 'purchaseOrderUIState':
|
||||||
|
result.purchaseOrderUIState.replace(serializers.deserialize(value,
|
||||||
|
specifiedType: const FullType(PurchaseOrderUIState))
|
||||||
|
as PurchaseOrderUIState);
|
||||||
|
break;
|
||||||
case 'recurringExpenseUIState':
|
case 'recurringExpenseUIState':
|
||||||
result.recurringExpenseUIState.replace(serializers.deserialize(value,
|
result.recurringExpenseUIState.replace(serializers.deserialize(value,
|
||||||
specifiedType: const FullType(RecurringExpenseUIState))
|
specifiedType: const FullType(RecurringExpenseUIState))
|
||||||
|
|
@ -345,6 +353,8 @@ class _$UIState extends UIState {
|
||||||
@override
|
@override
|
||||||
final InvoiceUIState invoiceUIState;
|
final InvoiceUIState invoiceUIState;
|
||||||
@override
|
@override
|
||||||
|
final PurchaseOrderUIState purchaseOrderUIState;
|
||||||
|
@override
|
||||||
final RecurringExpenseUIState recurringExpenseUIState;
|
final RecurringExpenseUIState recurringExpenseUIState;
|
||||||
@override
|
@override
|
||||||
final SubscriptionUIState subscriptionUIState;
|
final SubscriptionUIState subscriptionUIState;
|
||||||
|
|
@ -408,6 +418,7 @@ class _$UIState extends UIState {
|
||||||
this.productUIState,
|
this.productUIState,
|
||||||
this.clientUIState,
|
this.clientUIState,
|
||||||
this.invoiceUIState,
|
this.invoiceUIState,
|
||||||
|
this.purchaseOrderUIState,
|
||||||
this.recurringExpenseUIState,
|
this.recurringExpenseUIState,
|
||||||
this.subscriptionUIState,
|
this.subscriptionUIState,
|
||||||
this.taskStatusUIState,
|
this.taskStatusUIState,
|
||||||
|
|
@ -454,6 +465,8 @@ class _$UIState extends UIState {
|
||||||
clientUIState, 'UIState', 'clientUIState');
|
clientUIState, 'UIState', 'clientUIState');
|
||||||
BuiltValueNullFieldError.checkNotNull(
|
BuiltValueNullFieldError.checkNotNull(
|
||||||
invoiceUIState, 'UIState', 'invoiceUIState');
|
invoiceUIState, 'UIState', 'invoiceUIState');
|
||||||
|
BuiltValueNullFieldError.checkNotNull(
|
||||||
|
purchaseOrderUIState, 'UIState', 'purchaseOrderUIState');
|
||||||
BuiltValueNullFieldError.checkNotNull(
|
BuiltValueNullFieldError.checkNotNull(
|
||||||
recurringExpenseUIState, 'UIState', 'recurringExpenseUIState');
|
recurringExpenseUIState, 'UIState', 'recurringExpenseUIState');
|
||||||
BuiltValueNullFieldError.checkNotNull(
|
BuiltValueNullFieldError.checkNotNull(
|
||||||
|
|
@ -526,6 +539,7 @@ class _$UIState extends UIState {
|
||||||
productUIState == other.productUIState &&
|
productUIState == other.productUIState &&
|
||||||
clientUIState == other.clientUIState &&
|
clientUIState == other.clientUIState &&
|
||||||
invoiceUIState == other.invoiceUIState &&
|
invoiceUIState == other.invoiceUIState &&
|
||||||
|
purchaseOrderUIState == other.purchaseOrderUIState &&
|
||||||
recurringExpenseUIState == other.recurringExpenseUIState &&
|
recurringExpenseUIState == other.recurringExpenseUIState &&
|
||||||
subscriptionUIState == other.subscriptionUIState &&
|
subscriptionUIState == other.subscriptionUIState &&
|
||||||
taskStatusUIState == other.taskStatusUIState &&
|
taskStatusUIState == other.taskStatusUIState &&
|
||||||
|
|
@ -572,7 +586,7 @@ class _$UIState extends UIState {
|
||||||
$jc(
|
$jc(
|
||||||
$jc(
|
$jc(
|
||||||
$jc(
|
$jc(
|
||||||
$jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc(0, selectedCompanyIndex.hashCode), currentRoute.hashCode), previousRoute.hashCode), loadingEntityType.hashCode), previewStack.hashCode), filterStack.hashCode), filter.hashCode), filterClearedAt.hashCode), lastActivityAt.hashCode), dashboardUIState.hashCode), productUIState.hashCode), clientUIState.hashCode), invoiceUIState.hashCode), recurringExpenseUIState.hashCode), subscriptionUIState.hashCode), taskStatusUIState.hashCode), expenseCategoryUIState.hashCode),
|
$jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc($jc(0, selectedCompanyIndex.hashCode), currentRoute.hashCode), previousRoute.hashCode), loadingEntityType.hashCode), previewStack.hashCode), filterStack.hashCode), filter.hashCode), filterClearedAt.hashCode), lastActivityAt.hashCode), dashboardUIState.hashCode), productUIState.hashCode), clientUIState.hashCode), invoiceUIState.hashCode), purchaseOrderUIState.hashCode), recurringExpenseUIState.hashCode), subscriptionUIState.hashCode), taskStatusUIState.hashCode), expenseCategoryUIState.hashCode),
|
||||||
recurringInvoiceUIState.hashCode),
|
recurringInvoiceUIState.hashCode),
|
||||||
webhookUIState.hashCode),
|
webhookUIState.hashCode),
|
||||||
tokenUIState.hashCode),
|
tokenUIState.hashCode),
|
||||||
|
|
@ -610,6 +624,7 @@ class _$UIState extends UIState {
|
||||||
..add('productUIState', productUIState)
|
..add('productUIState', productUIState)
|
||||||
..add('clientUIState', clientUIState)
|
..add('clientUIState', clientUIState)
|
||||||
..add('invoiceUIState', invoiceUIState)
|
..add('invoiceUIState', invoiceUIState)
|
||||||
|
..add('purchaseOrderUIState', purchaseOrderUIState)
|
||||||
..add('recurringExpenseUIState', recurringExpenseUIState)
|
..add('recurringExpenseUIState', recurringExpenseUIState)
|
||||||
..add('subscriptionUIState', subscriptionUIState)
|
..add('subscriptionUIState', subscriptionUIState)
|
||||||
..add('taskStatusUIState', taskStatusUIState)
|
..add('taskStatusUIState', taskStatusUIState)
|
||||||
|
|
@ -709,6 +724,12 @@ class UIStateBuilder implements Builder<UIState, UIStateBuilder> {
|
||||||
set invoiceUIState(InvoiceUIStateBuilder invoiceUIState) =>
|
set invoiceUIState(InvoiceUIStateBuilder invoiceUIState) =>
|
||||||
_$this._invoiceUIState = invoiceUIState;
|
_$this._invoiceUIState = invoiceUIState;
|
||||||
|
|
||||||
|
PurchaseOrderUIStateBuilder _purchaseOrderUIState;
|
||||||
|
PurchaseOrderUIStateBuilder get purchaseOrderUIState =>
|
||||||
|
_$this._purchaseOrderUIState ??= new PurchaseOrderUIStateBuilder();
|
||||||
|
set purchaseOrderUIState(PurchaseOrderUIStateBuilder purchaseOrderUIState) =>
|
||||||
|
_$this._purchaseOrderUIState = purchaseOrderUIState;
|
||||||
|
|
||||||
RecurringExpenseUIStateBuilder _recurringExpenseUIState;
|
RecurringExpenseUIStateBuilder _recurringExpenseUIState;
|
||||||
RecurringExpenseUIStateBuilder get recurringExpenseUIState =>
|
RecurringExpenseUIStateBuilder get recurringExpenseUIState =>
|
||||||
_$this._recurringExpenseUIState ??= new RecurringExpenseUIStateBuilder();
|
_$this._recurringExpenseUIState ??= new RecurringExpenseUIStateBuilder();
|
||||||
|
|
@ -871,6 +892,7 @@ class UIStateBuilder implements Builder<UIState, UIStateBuilder> {
|
||||||
_productUIState = $v.productUIState.toBuilder();
|
_productUIState = $v.productUIState.toBuilder();
|
||||||
_clientUIState = $v.clientUIState.toBuilder();
|
_clientUIState = $v.clientUIState.toBuilder();
|
||||||
_invoiceUIState = $v.invoiceUIState.toBuilder();
|
_invoiceUIState = $v.invoiceUIState.toBuilder();
|
||||||
|
_purchaseOrderUIState = $v.purchaseOrderUIState.toBuilder();
|
||||||
_recurringExpenseUIState = $v.recurringExpenseUIState.toBuilder();
|
_recurringExpenseUIState = $v.recurringExpenseUIState.toBuilder();
|
||||||
_subscriptionUIState = $v.subscriptionUIState.toBuilder();
|
_subscriptionUIState = $v.subscriptionUIState.toBuilder();
|
||||||
_taskStatusUIState = $v.taskStatusUIState.toBuilder();
|
_taskStatusUIState = $v.taskStatusUIState.toBuilder();
|
||||||
|
|
@ -934,6 +956,7 @@ class UIStateBuilder implements Builder<UIState, UIStateBuilder> {
|
||||||
productUIState: productUIState.build(),
|
productUIState: productUIState.build(),
|
||||||
clientUIState: clientUIState.build(),
|
clientUIState: clientUIState.build(),
|
||||||
invoiceUIState: invoiceUIState.build(),
|
invoiceUIState: invoiceUIState.build(),
|
||||||
|
purchaseOrderUIState: purchaseOrderUIState.build(),
|
||||||
recurringExpenseUIState: recurringExpenseUIState.build(),
|
recurringExpenseUIState: recurringExpenseUIState.build(),
|
||||||
subscriptionUIState: subscriptionUIState.build(),
|
subscriptionUIState: subscriptionUIState.build(),
|
||||||
taskStatusUIState: taskStatusUIState.build(),
|
taskStatusUIState: taskStatusUIState.build(),
|
||||||
|
|
@ -973,6 +996,8 @@ class UIStateBuilder implements Builder<UIState, UIStateBuilder> {
|
||||||
clientUIState.build();
|
clientUIState.build();
|
||||||
_$failedField = 'invoiceUIState';
|
_$failedField = 'invoiceUIState';
|
||||||
invoiceUIState.build();
|
invoiceUIState.build();
|
||||||
|
_$failedField = 'purchaseOrderUIState';
|
||||||
|
purchaseOrderUIState.build();
|
||||||
_$failedField = 'recurringExpenseUIState';
|
_$failedField = 'recurringExpenseUIState';
|
||||||
recurringExpenseUIState.build();
|
recurringExpenseUIState.build();
|
||||||
_$failedField = 'subscriptionUIState';
|
_$failedField = 'subscriptionUIState';
|
||||||
|
|
|
||||||
|
|
@ -125,4 +125,4 @@ enum _ShortcutIntentType {
|
||||||
list,
|
list,
|
||||||
}
|
}
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
|
||||||
|
|
@ -513,6 +513,13 @@ class MenuDrawer extends StatelessWidget {
|
||||||
iconTooltip: localization.newExpense,
|
iconTooltip: localization.newExpense,
|
||||||
),
|
),
|
||||||
// STARTER: menu - do not remove comment
|
// STARTER: menu - do not remove comment
|
||||||
|
DrawerTile(
|
||||||
|
company: company,
|
||||||
|
entityType: EntityType.purchaseOrder,
|
||||||
|
icon: getEntityIcon(EntityType.purchaseOrder),
|
||||||
|
title: localization.purchaseOrders,
|
||||||
|
),
|
||||||
|
|
||||||
DrawerTile(
|
DrawerTile(
|
||||||
company: company,
|
company: company,
|
||||||
entityType: EntityType.recurringExpense,
|
entityType: EntityType.recurringExpense,
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,95 @@
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:invoiceninja_flutter/ui/app/edit_scaffold.dart';
|
||||||
|
import 'package:invoiceninja_flutter/ui/app/form_card.dart';
|
||||||
|
import 'package:invoiceninja_flutter/ui/purchase_order/edit/purchase_order_edit_vm.dart';
|
||||||
|
import 'package:invoiceninja_flutter/utils/localization.dart';
|
||||||
|
import 'package:invoiceninja_flutter/ui/app/scrollable_listview.dart';
|
||||||
|
|
||||||
|
class PurchaseOrderEdit extends StatefulWidget {
|
||||||
|
const PurchaseOrderEdit({
|
||||||
|
Key key,
|
||||||
|
@required this.viewModel,
|
||||||
|
}) : super(key: key);
|
||||||
|
|
||||||
|
final PurchaseOrderEditVM viewModel;
|
||||||
|
|
||||||
|
@override
|
||||||
|
_PurchaseOrderEditState createState() => _PurchaseOrderEditState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _PurchaseOrderEditState extends State<PurchaseOrderEdit> {
|
||||||
|
static final GlobalKey<FormState> _formKey =
|
||||||
|
GlobalKey<FormState>(debugLabel: '_purchaseOrderEdit');
|
||||||
|
|
||||||
|
List<TextEditingController> _controllers = [];
|
||||||
|
|
||||||
|
@override
|
||||||
|
void didChangeDependencies() {
|
||||||
|
_controllers = [
|
||||||
|
// STARTER: array - do not remove comment
|
||||||
|
];
|
||||||
|
|
||||||
|
_controllers.forEach((controller) => controller.removeListener(_onChanged));
|
||||||
|
|
||||||
|
// STARTER: read value - do not remove comment
|
||||||
|
//_purchase_ordersController.text = purchase_order.purchase_orders;
|
||||||
|
|
||||||
|
_controllers.forEach((controller) => controller.addListener(_onChanged));
|
||||||
|
|
||||||
|
super.didChangeDependencies();
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
void dispose() {
|
||||||
|
_controllers.forEach((controller) {
|
||||||
|
controller.removeListener(_onChanged);
|
||||||
|
controller.dispose();
|
||||||
|
});
|
||||||
|
|
||||||
|
super.dispose();
|
||||||
|
}
|
||||||
|
|
||||||
|
void _onChanged() {
|
||||||
|
//
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
final viewModel = widget.viewModel;
|
||||||
|
final localization = AppLocalization.of(context);
|
||||||
|
final purchaseOrder = viewModel.purchaseOrder;
|
||||||
|
|
||||||
|
return EditScaffold(
|
||||||
|
title: purchaseOrder.isNew
|
||||||
|
? localization.newPurchaseOrder
|
||||||
|
: localization.editPurchaseOrder,
|
||||||
|
onCancelPressed: (context) => viewModel.onCancelPressed(context),
|
||||||
|
onSavePressed: (context) {
|
||||||
|
final bool isValid = _formKey.currentState.validate();
|
||||||
|
|
||||||
|
/*
|
||||||
|
setState(() {
|
||||||
|
_autoValidate = !isValid;
|
||||||
|
});
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (!isValid) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
viewModel.onSavePressed(context);
|
||||||
|
},
|
||||||
|
body: Form(
|
||||||
|
key: _formKey,
|
||||||
|
child: Builder(builder: (BuildContext context) {
|
||||||
|
return ScrollableListView(
|
||||||
|
children: <Widget>[
|
||||||
|
FormCard(
|
||||||
|
children: <Widget>[],
|
||||||
|
),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
})),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,116 @@
|
||||||
|
import 'dart:async';
|
||||||
|
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:redux/redux.dart';
|
||||||
|
import 'package:invoiceninja_flutter/utils/completers.dart';
|
||||||
|
import 'package:invoiceninja_flutter/data/models/models.dart';
|
||||||
|
import 'package:invoiceninja_flutter/ui/app/dialogs/error_dialog.dart';
|
||||||
|
import 'package:invoiceninja_flutter/ui/purchase_order/view/purchase_order_view_vm.dart';
|
||||||
|
import 'package:invoiceninja_flutter/redux/purchase_order/purchase_order_actions.dart';
|
||||||
|
import 'package:invoiceninja_flutter/ui/purchase_order/edit/purchase_order_edit.dart';
|
||||||
|
import 'package:invoiceninja_flutter/redux/app/app_state.dart';
|
||||||
|
import 'package:flutter_styled_toast/flutter_styled_toast.dart';
|
||||||
|
import 'package:invoiceninja_flutter/utils/localization.dart';
|
||||||
|
|
||||||
|
class PurchaseOrderEditScreen extends StatelessWidget {
|
||||||
|
const PurchaseOrderEditScreen({Key key}) : super(key: key);
|
||||||
|
static const String route = '/purchase_order/edit';
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return StoreConnector<AppState, PurchaseOrderEditVM>(
|
||||||
|
converter: (Store<AppState> store) {
|
||||||
|
return PurchaseOrderEditVM.fromStore(store);
|
||||||
|
},
|
||||||
|
builder: (context, viewModel) {
|
||||||
|
return PurchaseOrderEdit(
|
||||||
|
viewModel: viewModel,
|
||||||
|
key: ValueKey(viewModel.purchaseOrder.updatedAt),
|
||||||
|
);
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class PurchaseOrderEditVM {
|
||||||
|
PurchaseOrderEditVM({
|
||||||
|
@required this.state,
|
||||||
|
@required this.purchaseOrder,
|
||||||
|
@required this.company,
|
||||||
|
@required this.onChanged,
|
||||||
|
@required this.isSaving,
|
||||||
|
@required this.origPurchaseOrder,
|
||||||
|
@required this.onSavePressed,
|
||||||
|
@required this.onCancelPressed,
|
||||||
|
@required this.isLoading,
|
||||||
|
});
|
||||||
|
|
||||||
|
factory PurchaseOrderEditVM.fromStore(Store<AppState> store) {
|
||||||
|
final state = store.state;
|
||||||
|
final purchaseOrder = state.purchaseOrderUIState.editing;
|
||||||
|
|
||||||
|
return PurchaseOrderEditVM(
|
||||||
|
state: state,
|
||||||
|
isLoading: state.isLoading,
|
||||||
|
isSaving: state.isSaving,
|
||||||
|
origPurchaseOrder: state.purchaseOrderState.map[purchaseOrder.id],
|
||||||
|
purchaseOrder: purchaseOrder,
|
||||||
|
company: state.company,
|
||||||
|
onChanged: (InvoiceEntity purchaseOrder) {
|
||||||
|
store.dispatch(UpdatePurchaseOrder(purchaseOrder));
|
||||||
|
},
|
||||||
|
onCancelPressed: (BuildContext context) {
|
||||||
|
createEntity(context: context, entity: InvoiceEntity(), force: true);
|
||||||
|
if (state.purchaseOrderUIState.cancelCompleter != null) {
|
||||||
|
state.purchaseOrderUIState.cancelCompleter.complete();
|
||||||
|
} else {
|
||||||
|
store.dispatch(UpdateCurrentRoute(state.uiState.previousRoute));
|
||||||
|
}
|
||||||
|
},
|
||||||
|
onSavePressed: (BuildContext context) {
|
||||||
|
Debouncer.runOnComplete(() {
|
||||||
|
final purchaseOrder = store.state.purchaseOrderUIState.editing;
|
||||||
|
final localization = AppLocalization.of(context);
|
||||||
|
final Completer<InvoiceEntity> completer =
|
||||||
|
new Completer<InvoiceEntity>();
|
||||||
|
store.dispatch(SavePurchaseOrderRequest(
|
||||||
|
completer: completer, purchaseOrder: purchaseOrder));
|
||||||
|
return completer.future.then((savedPurchaseOrder) {
|
||||||
|
showToast(purchaseOrder.isNew
|
||||||
|
? localization.createdPurchaseOrder
|
||||||
|
: localization.updatedPurchaseOrder);
|
||||||
|
if (state.prefState.isMobile) {
|
||||||
|
store.dispatch(UpdateCurrentRoute(PurchaseOrderViewScreen.route));
|
||||||
|
if (purchaseOrder.isNew) {
|
||||||
|
Navigator.of(context)
|
||||||
|
.pushReplacementNamed(PurchaseOrderViewScreen.route);
|
||||||
|
} else {
|
||||||
|
Navigator.of(context).pop(savedPurchaseOrder);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
viewEntity(entity: savedPurchaseOrder, force: true);
|
||||||
|
}
|
||||||
|
}).catchError((Object error) {
|
||||||
|
showDialog<ErrorDialog>(
|
||||||
|
context: context,
|
||||||
|
builder: (BuildContext context) {
|
||||||
|
return ErrorDialog(error);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
final InvoiceEntity purchaseOrder;
|
||||||
|
final CompanyEntity company;
|
||||||
|
final Function(InvoiceEntity) onChanged;
|
||||||
|
final Function(BuildContext) onSavePressed;
|
||||||
|
final Function(BuildContext) onCancelPressed;
|
||||||
|
final bool isLoading;
|
||||||
|
final bool isSaving;
|
||||||
|
final InvoiceEntity origPurchaseOrder;
|
||||||
|
final AppState state;
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,99 @@
|
||||||
|
import 'package:flutter_redux/flutter_redux.dart';
|
||||||
|
import 'package:invoiceninja_flutter/redux/app/app_actions.dart';
|
||||||
|
import 'package:invoiceninja_flutter/redux/app/app_state.dart';
|
||||||
|
import 'package:invoiceninja_flutter/ui/app/entity_state_label.dart';
|
||||||
|
import 'package:invoiceninja_flutter/utils/formatting.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:invoiceninja_flutter/data/models/models.dart';
|
||||||
|
import 'package:invoiceninja_flutter/ui/app/dismissible_entity.dart';
|
||||||
|
|
||||||
|
class PurchaseOrderListItem extends StatelessWidget {
|
||||||
|
const PurchaseOrderListItem({
|
||||||
|
@required this.user,
|
||||||
|
@required this.purchaseOrder,
|
||||||
|
@required this.filter,
|
||||||
|
this.onTap,
|
||||||
|
this.onLongPress,
|
||||||
|
this.onCheckboxChanged,
|
||||||
|
this.isChecked = false,
|
||||||
|
});
|
||||||
|
|
||||||
|
final UserEntity user;
|
||||||
|
final GestureTapCallback onTap;
|
||||||
|
final GestureTapCallback onLongPress;
|
||||||
|
final InvoiceEntity purchaseOrder;
|
||||||
|
final String filter;
|
||||||
|
final Function(bool) onCheckboxChanged;
|
||||||
|
final bool isChecked;
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
final store = StoreProvider.of<AppState>(context);
|
||||||
|
final state = store.state;
|
||||||
|
final uiState = state.uiState;
|
||||||
|
final purchaseOrderUIState = uiState.purchaseOrderUIState;
|
||||||
|
final listUIState = purchaseOrderUIState.listUIState;
|
||||||
|
final isInMultiselect = listUIState.isInMultiselect();
|
||||||
|
final showCheckbox = onCheckboxChanged != null || isInMultiselect;
|
||||||
|
|
||||||
|
final filterMatch = filter != null && filter.isNotEmpty
|
||||||
|
? purchaseOrder.matchesFilterValue(filter)
|
||||||
|
: null;
|
||||||
|
final subtitle = filterMatch;
|
||||||
|
|
||||||
|
return DismissibleEntity(
|
||||||
|
userCompany: state.userCompany,
|
||||||
|
entity: purchaseOrder,
|
||||||
|
isSelected: purchaseOrder.id ==
|
||||||
|
(uiState.isEditing
|
||||||
|
? purchaseOrderUIState.editing.id
|
||||||
|
: purchaseOrderUIState.selectedId),
|
||||||
|
child: ListTile(
|
||||||
|
onTap: () =>
|
||||||
|
onTap != null ? onTap() : selectEntity(entity: purchaseOrder),
|
||||||
|
onLongPress: () => onLongPress != null
|
||||||
|
? onLongPress()
|
||||||
|
: selectEntity(entity: purchaseOrder, longPress: true),
|
||||||
|
leading: showCheckbox
|
||||||
|
? IgnorePointer(
|
||||||
|
ignoring: listUIState.isInMultiselect(),
|
||||||
|
child: Checkbox(
|
||||||
|
value: isChecked,
|
||||||
|
materialTapTargetSize: MaterialTapTargetSize.shrinkWrap,
|
||||||
|
onChanged: (value) => onCheckboxChanged(value),
|
||||||
|
activeColor: Theme.of(context).colorScheme.secondary,
|
||||||
|
),
|
||||||
|
)
|
||||||
|
: null,
|
||||||
|
title: Container(
|
||||||
|
width: MediaQuery.of(context).size.width,
|
||||||
|
child: Row(
|
||||||
|
children: <Widget>[
|
||||||
|
Expanded(
|
||||||
|
child: Text(
|
||||||
|
purchaseOrder.number,
|
||||||
|
style: Theme.of(context).textTheme.subtitle1,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Text(formatNumber(purchaseOrder.listDisplayAmount, context),
|
||||||
|
style: Theme.of(context).textTheme.subtitle1),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
subtitle: Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
children: <Widget>[
|
||||||
|
subtitle != null && subtitle.isNotEmpty
|
||||||
|
? Text(
|
||||||
|
subtitle,
|
||||||
|
maxLines: 3,
|
||||||
|
overflow: TextOverflow.ellipsis,
|
||||||
|
)
|
||||||
|
: Container(),
|
||||||
|
EntityStateLabel(purchaseOrder),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,124 @@
|
||||||
|
import 'dart:async';
|
||||||
|
import 'package:invoiceninja_flutter/ui/app/tables/entity_list.dart';
|
||||||
|
import 'package:invoiceninja_flutter/ui/purchase_order/purchase_order_list_item.dart';
|
||||||
|
import 'package:invoiceninja_flutter/ui/purchase_order/purchase_order_presenter.dart';
|
||||||
|
import 'package:redux/redux.dart';
|
||||||
|
import 'package:invoiceninja_flutter/redux/app/app_actions.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:flutter/widgets.dart';
|
||||||
|
import 'package:flutter_redux/flutter_redux.dart';
|
||||||
|
import 'package:built_collection/built_collection.dart';
|
||||||
|
import 'package:invoiceninja_flutter/redux/ui/list_ui_state.dart';
|
||||||
|
import 'package:invoiceninja_flutter/utils/completers.dart';
|
||||||
|
import 'package:invoiceninja_flutter/utils/localization.dart';
|
||||||
|
import 'package:invoiceninja_flutter/redux/purchase_order/purchase_order_selectors.dart';
|
||||||
|
import 'package:invoiceninja_flutter/data/models/models.dart';
|
||||||
|
import 'package:invoiceninja_flutter/redux/app/app_state.dart';
|
||||||
|
import 'package:invoiceninja_flutter/redux/purchase_order/purchase_order_actions.dart';
|
||||||
|
|
||||||
|
class PurchaseOrderListBuilder extends StatelessWidget {
|
||||||
|
const PurchaseOrderListBuilder({Key key}) : super(key: key);
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return StoreConnector<AppState, PurchaseOrderListVM>(
|
||||||
|
converter: PurchaseOrderListVM.fromStore,
|
||||||
|
builder: (context, viewModel) {
|
||||||
|
return EntityList(
|
||||||
|
entityType: EntityType.purchaseOrder,
|
||||||
|
presenter: PurchaseOrderPresenter(),
|
||||||
|
state: viewModel.state,
|
||||||
|
entityList: viewModel.purchaseOrderList,
|
||||||
|
tableColumns: viewModel.tableColumns,
|
||||||
|
onRefreshed: viewModel.onRefreshed,
|
||||||
|
onSortColumn: viewModel.onSortColumn,
|
||||||
|
onClearMultiselect: viewModel.onClearMultielsect,
|
||||||
|
itemBuilder: (BuildContext context, index) {
|
||||||
|
final state = viewModel.state;
|
||||||
|
final purchaseOrderId = viewModel.purchaseOrderList[index];
|
||||||
|
final purchaseOrder = viewModel.purchaseOrderMap[purchaseOrderId];
|
||||||
|
final listState = state.getListState(EntityType.purchaseOrder);
|
||||||
|
final isInMultiselect = listState.isInMultiselect();
|
||||||
|
|
||||||
|
return PurchaseOrderListItem(
|
||||||
|
user: viewModel.state.user,
|
||||||
|
filter: viewModel.filter,
|
||||||
|
purchaseOrder: purchaseOrder,
|
||||||
|
isChecked:
|
||||||
|
isInMultiselect && listState.isSelected(purchaseOrder.id),
|
||||||
|
);
|
||||||
|
});
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class PurchaseOrderListVM {
|
||||||
|
PurchaseOrderListVM({
|
||||||
|
@required this.state,
|
||||||
|
@required this.userCompany,
|
||||||
|
@required this.purchaseOrderList,
|
||||||
|
@required this.purchaseOrderMap,
|
||||||
|
@required this.filter,
|
||||||
|
@required this.isLoading,
|
||||||
|
@required this.listState,
|
||||||
|
@required this.onRefreshed,
|
||||||
|
@required this.onEntityAction,
|
||||||
|
@required this.tableColumns,
|
||||||
|
@required this.onSortColumn,
|
||||||
|
@required this.onClearMultielsect,
|
||||||
|
});
|
||||||
|
|
||||||
|
static PurchaseOrderListVM fromStore(Store<AppState> store) {
|
||||||
|
Future<Null> _handleRefresh(BuildContext context) {
|
||||||
|
if (store.state.isLoading) {
|
||||||
|
return Future<Null>(null);
|
||||||
|
}
|
||||||
|
final completer = snackBarCompleter<Null>(
|
||||||
|
context, AppLocalization.of(context).refreshComplete);
|
||||||
|
store.dispatch(RefreshData(completer: completer));
|
||||||
|
return completer.future;
|
||||||
|
}
|
||||||
|
|
||||||
|
final state = store.state;
|
||||||
|
|
||||||
|
return PurchaseOrderListVM(
|
||||||
|
state: state,
|
||||||
|
userCompany: state.userCompany,
|
||||||
|
listState: state.purchaseOrderListState,
|
||||||
|
purchaseOrderList: memoizedFilteredPurchaseOrderList(
|
||||||
|
state.getUISelection(EntityType.purchaseOrder),
|
||||||
|
state.purchaseOrderState.map,
|
||||||
|
state.purchaseOrderState.list,
|
||||||
|
state.clientState.map,
|
||||||
|
state.purchaseOrderListState,
|
||||||
|
state.userState.map,
|
||||||
|
),
|
||||||
|
purchaseOrderMap: state.purchaseOrderState.map,
|
||||||
|
isLoading: state.isLoading,
|
||||||
|
filter: state.purchaseOrderUIState.listUIState.filter,
|
||||||
|
onEntityAction: (BuildContext context, List<BaseEntity> purchaseOrders,
|
||||||
|
EntityAction action) =>
|
||||||
|
handlePurchaseOrderAction(context, purchaseOrders, action),
|
||||||
|
onRefreshed: (context) => _handleRefresh(context),
|
||||||
|
tableColumns: state.userCompany.settings
|
||||||
|
?.getTableColumns(EntityType.purchaseOrder) ??
|
||||||
|
PurchaseOrderPresenter.getDefaultTableFields(state.userCompany),
|
||||||
|
onSortColumn: (field) => store.dispatch(SortPurchaseOrders(field)),
|
||||||
|
onClearMultielsect: () => store.dispatch(ClearPurchaseOrderMultiselect()),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
final AppState state;
|
||||||
|
final UserCompanyEntity userCompany;
|
||||||
|
final List<String> purchaseOrderList;
|
||||||
|
final BuiltMap<String, InvoiceEntity> purchaseOrderMap;
|
||||||
|
final ListUIState listState;
|
||||||
|
final String filter;
|
||||||
|
final bool isLoading;
|
||||||
|
final Function(BuildContext) onRefreshed;
|
||||||
|
final Function(BuildContext, List<BaseEntity>, EntityAction) onEntityAction;
|
||||||
|
final List<String> tableColumns;
|
||||||
|
final Function(String) onSortColumn;
|
||||||
|
final Function onClearMultielsect;
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,27 @@
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:invoiceninja_flutter/data/models/models.dart';
|
||||||
|
import 'package:invoiceninja_flutter/ui/app/presenters/entity_presenter.dart';
|
||||||
|
|
||||||
|
class PurchaseOrderPresenter extends EntityPresenter {
|
||||||
|
static List<String> getDefaultTableFields(UserCompanyEntity userCompany) {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
|
||||||
|
static List<String> getAllTableFields(UserCompanyEntity userCompany) {
|
||||||
|
return [
|
||||||
|
...getDefaultTableFields(userCompany),
|
||||||
|
...EntityPresenter.getBaseFields(),
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget getField({String field, BuildContext context}) {
|
||||||
|
//final state = StoreProvider.of<AppState>(context).state;
|
||||||
|
//final purchaseOrder = entity as InvoiceEntity;
|
||||||
|
|
||||||
|
switch (field) {
|
||||||
|
}
|
||||||
|
|
||||||
|
return super.getField(field: field, context: context);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,119 @@
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:flutter_redux/flutter_redux.dart';
|
||||||
|
import 'package:invoiceninja_flutter/data/models/models.dart';
|
||||||
|
import 'package:invoiceninja_flutter/data/models/purchase_order_model.dart';
|
||||||
|
import 'package:invoiceninja_flutter/redux/app/app_actions.dart';
|
||||||
|
import 'package:invoiceninja_flutter/redux/app/app_state.dart';
|
||||||
|
import 'package:invoiceninja_flutter/redux/purchase_order/purchase_order_actions.dart';
|
||||||
|
import 'package:invoiceninja_flutter/ui/app/app_bottom_bar.dart';
|
||||||
|
import 'package:invoiceninja_flutter/ui/app/list_scaffold.dart';
|
||||||
|
import 'package:invoiceninja_flutter/ui/app/list_filter.dart';
|
||||||
|
import 'package:invoiceninja_flutter/ui/purchase_order/purchase_order_list_vm.dart';
|
||||||
|
import 'package:invoiceninja_flutter/ui/purchase_order/purchase_order_presenter.dart';
|
||||||
|
import 'package:invoiceninja_flutter/utils/localization.dart';
|
||||||
|
|
||||||
|
import 'purchase_order_screen_vm.dart';
|
||||||
|
|
||||||
|
class PurchaseOrderScreen extends StatelessWidget {
|
||||||
|
const PurchaseOrderScreen({
|
||||||
|
Key key,
|
||||||
|
@required this.viewModel,
|
||||||
|
}) : super(key: key);
|
||||||
|
|
||||||
|
static const String route = '/purchase_order';
|
||||||
|
|
||||||
|
final PurchaseOrderScreenVM viewModel;
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
final store = StoreProvider.of<AppState>(context);
|
||||||
|
final state = store.state;
|
||||||
|
final company = state.company;
|
||||||
|
final userCompany = state.userCompany;
|
||||||
|
final localization = AppLocalization.of(context);
|
||||||
|
|
||||||
|
return ListScaffold(
|
||||||
|
entityType: EntityType.purchaseOrder,
|
||||||
|
onHamburgerLongPress: () =>
|
||||||
|
store.dispatch(StartPurchaseOrderMultiselect()),
|
||||||
|
appBarTitle: ListFilter(
|
||||||
|
key: ValueKey(
|
||||||
|
'__filter_${state.purchaseOrderListState.filterClearedAt}__'),
|
||||||
|
entityType: EntityType.purchaseOrder,
|
||||||
|
entityIds: viewModel.purchaseOrderList,
|
||||||
|
filter: state.purchaseOrderListState.filter,
|
||||||
|
onFilterChanged: (value) {
|
||||||
|
store.dispatch(FilterPurchaseOrders(value));
|
||||||
|
},
|
||||||
|
onSelectedState: (EntityState state, value) {
|
||||||
|
store.dispatch(FilterPurchaseOrdersByState(state));
|
||||||
|
},
|
||||||
|
),
|
||||||
|
onCheckboxPressed: () {
|
||||||
|
if (store.state.purchaseOrderListState.isInMultiselect()) {
|
||||||
|
store.dispatch(ClearPurchaseOrderMultiselect());
|
||||||
|
} else {
|
||||||
|
store.dispatch(StartPurchaseOrderMultiselect());
|
||||||
|
}
|
||||||
|
},
|
||||||
|
body: PurchaseOrderListBuilder(),
|
||||||
|
bottomNavigationBar: AppBottomBar(
|
||||||
|
entityType: EntityType.purchaseOrder,
|
||||||
|
tableColumns: PurchaseOrderPresenter.getAllTableFields(userCompany),
|
||||||
|
defaultTableColumns:
|
||||||
|
PurchaseOrderPresenter.getDefaultTableFields(userCompany),
|
||||||
|
onSelectedSortField: (value) {
|
||||||
|
store.dispatch(SortPurchaseOrders(value));
|
||||||
|
},
|
||||||
|
sortFields: [
|
||||||
|
PurchaseOrderFields.number,
|
||||||
|
PurchaseOrderFields.date,
|
||||||
|
PurchaseOrderFields.dueDate,
|
||||||
|
EntityFields.updatedAt,
|
||||||
|
],
|
||||||
|
onSelectedState: (EntityState state, value) {
|
||||||
|
store.dispatch(FilterPurchaseOrdersByState(state));
|
||||||
|
},
|
||||||
|
onCheckboxPressed: () {
|
||||||
|
if (store.state.purchaseOrderListState.isInMultiselect()) {
|
||||||
|
store.dispatch(ClearPurchaseOrderMultiselect());
|
||||||
|
} else {
|
||||||
|
store.dispatch(StartPurchaseOrderMultiselect());
|
||||||
|
}
|
||||||
|
},
|
||||||
|
customValues1: company.getCustomFieldValues(CustomFieldType.invoice1,
|
||||||
|
excludeBlank: true),
|
||||||
|
customValues2: company.getCustomFieldValues(CustomFieldType.invoice2,
|
||||||
|
excludeBlank: true),
|
||||||
|
customValues3: company.getCustomFieldValues(CustomFieldType.invoice3,
|
||||||
|
excludeBlank: true),
|
||||||
|
customValues4: company.getCustomFieldValues(CustomFieldType.invoice4,
|
||||||
|
excludeBlank: true),
|
||||||
|
onSelectedCustom1: (value) =>
|
||||||
|
store.dispatch(FilterPurchaseOrdersByCustom1(value)),
|
||||||
|
onSelectedCustom2: (value) =>
|
||||||
|
store.dispatch(FilterPurchaseOrdersByCustom2(value)),
|
||||||
|
onSelectedCustom3: (value) =>
|
||||||
|
store.dispatch(FilterPurchaseOrdersByCustom3(value)),
|
||||||
|
onSelectedCustom4: (value) =>
|
||||||
|
store.dispatch(FilterPurchaseOrdersByCustom4(value)),
|
||||||
|
),
|
||||||
|
floatingActionButton: state.prefState.isMenuFloated &&
|
||||||
|
userCompany.canCreate(EntityType.purchaseOrder)
|
||||||
|
? FloatingActionButton(
|
||||||
|
heroTag: 'purchase_order_fab',
|
||||||
|
backgroundColor: Theme.of(context).primaryColorDark,
|
||||||
|
onPressed: () {
|
||||||
|
createEntityByType(
|
||||||
|
context: context, entityType: EntityType.purchaseOrder);
|
||||||
|
},
|
||||||
|
child: Icon(
|
||||||
|
Icons.add,
|
||||||
|
color: Colors.white,
|
||||||
|
),
|
||||||
|
tooltip: localization.newPurchaseOrder,
|
||||||
|
)
|
||||||
|
: null,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,64 @@
|
||||||
|
import 'package:built_collection/built_collection.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:flutter/widgets.dart';
|
||||||
|
import 'package:flutter_redux/flutter_redux.dart';
|
||||||
|
import 'package:invoiceninja_flutter/data/models/models.dart';
|
||||||
|
import 'package:invoiceninja_flutter/redux/app/app_state.dart';
|
||||||
|
import 'package:invoiceninja_flutter/redux/purchase_order/purchase_order_actions.dart';
|
||||||
|
import 'package:invoiceninja_flutter/redux/purchase_order/purchase_order_selectors.dart';
|
||||||
|
import 'package:redux/redux.dart';
|
||||||
|
|
||||||
|
import 'purchase_order_screen.dart';
|
||||||
|
|
||||||
|
class PurchaseOrderScreenBuilder extends StatelessWidget {
|
||||||
|
const PurchaseOrderScreenBuilder({Key key}) : super(key: key);
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return StoreConnector<AppState, PurchaseOrderScreenVM>(
|
||||||
|
converter: PurchaseOrderScreenVM.fromStore,
|
||||||
|
builder: (context, vm) {
|
||||||
|
return PurchaseOrderScreen(
|
||||||
|
viewModel: vm,
|
||||||
|
);
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class PurchaseOrderScreenVM {
|
||||||
|
PurchaseOrderScreenVM({
|
||||||
|
@required this.isInMultiselect,
|
||||||
|
@required this.purchaseOrderList,
|
||||||
|
@required this.userCompany,
|
||||||
|
@required this.onEntityAction,
|
||||||
|
@required this.purchaseOrderMap,
|
||||||
|
});
|
||||||
|
|
||||||
|
final bool isInMultiselect;
|
||||||
|
final UserCompanyEntity userCompany;
|
||||||
|
final List<String> purchaseOrderList;
|
||||||
|
final Function(BuildContext, List<BaseEntity>, EntityAction) onEntityAction;
|
||||||
|
final BuiltMap<String, InvoiceEntity> purchaseOrderMap;
|
||||||
|
|
||||||
|
static PurchaseOrderScreenVM fromStore(Store<AppState> store) {
|
||||||
|
final state = store.state;
|
||||||
|
|
||||||
|
return PurchaseOrderScreenVM(
|
||||||
|
purchaseOrderMap: state.purchaseOrderState.map,
|
||||||
|
purchaseOrderList: memoizedFilteredPurchaseOrderList(
|
||||||
|
state.getUISelection(EntityType.purchaseOrder),
|
||||||
|
state.purchaseOrderState.map,
|
||||||
|
state.purchaseOrderState.list,
|
||||||
|
state.clientState.map,
|
||||||
|
state.purchaseOrderListState,
|
||||||
|
state.userState.map,
|
||||||
|
),
|
||||||
|
userCompany: state.userCompany,
|
||||||
|
isInMultiselect: state.purchaseOrderListState.isInMultiselect(),
|
||||||
|
onEntityAction: (BuildContext context, List<BaseEntity> purchaseOrders,
|
||||||
|
EntityAction action) =>
|
||||||
|
handlePurchaseOrderAction(context, purchaseOrders, action),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,34 @@
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:invoiceninja_flutter/ui/app/scrollable_listview.dart';
|
||||||
|
import 'package:invoiceninja_flutter/ui/purchase_order/view/purchase_order_view_vm.dart';
|
||||||
|
import 'package:invoiceninja_flutter/ui/app/view_scaffold.dart';
|
||||||
|
|
||||||
|
class PurchaseOrderView extends StatefulWidget {
|
||||||
|
const PurchaseOrderView({
|
||||||
|
Key key,
|
||||||
|
@required this.viewModel,
|
||||||
|
@required this.isFilter,
|
||||||
|
}) : super(key: key);
|
||||||
|
|
||||||
|
final PurchaseOrderViewVM viewModel;
|
||||||
|
final bool isFilter;
|
||||||
|
|
||||||
|
@override
|
||||||
|
_PurchaseOrderViewState createState() => new _PurchaseOrderViewState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _PurchaseOrderViewState extends State<PurchaseOrderView> {
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
final viewModel = widget.viewModel;
|
||||||
|
final purchaseOrder = viewModel.purchaseOrder;
|
||||||
|
|
||||||
|
return ViewScaffold(
|
||||||
|
isFilter: widget.isFilter,
|
||||||
|
entity: purchaseOrder,
|
||||||
|
body: ScrollableListView(
|
||||||
|
children: <Widget>[],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,84 @@
|
||||||
|
import 'dart:async';
|
||||||
|
import 'package:invoiceninja_flutter/redux/app/app_actions.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:invoiceninja_flutter/utils/completers.dart';
|
||||||
|
import 'package:invoiceninja_flutter/utils/localization.dart';
|
||||||
|
import 'package:redux/redux.dart';
|
||||||
|
import 'package:flutter_redux/flutter_redux.dart';
|
||||||
|
import 'package:invoiceninja_flutter/redux/purchase_order/purchase_order_actions.dart';
|
||||||
|
import 'package:invoiceninja_flutter/data/models/models.dart';
|
||||||
|
import 'package:invoiceninja_flutter/ui/purchase_order/view/purchase_order_view.dart';
|
||||||
|
import 'package:invoiceninja_flutter/redux/app/app_state.dart';
|
||||||
|
|
||||||
|
class PurchaseOrderViewScreen extends StatelessWidget {
|
||||||
|
const PurchaseOrderViewScreen({
|
||||||
|
Key key,
|
||||||
|
this.isFilter = false,
|
||||||
|
}) : super(key: key);
|
||||||
|
static const String route = '/purchase_order/view';
|
||||||
|
final bool isFilter;
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return StoreConnector<AppState, PurchaseOrderViewVM>(
|
||||||
|
converter: (Store<AppState> store) {
|
||||||
|
return PurchaseOrderViewVM.fromStore(store);
|
||||||
|
},
|
||||||
|
builder: (context, vm) {
|
||||||
|
return PurchaseOrderView(
|
||||||
|
viewModel: vm,
|
||||||
|
isFilter: isFilter,
|
||||||
|
);
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class PurchaseOrderViewVM {
|
||||||
|
PurchaseOrderViewVM({
|
||||||
|
@required this.state,
|
||||||
|
@required this.purchaseOrder,
|
||||||
|
@required this.company,
|
||||||
|
@required this.onEntityAction,
|
||||||
|
@required this.onRefreshed,
|
||||||
|
@required this.isSaving,
|
||||||
|
@required this.isLoading,
|
||||||
|
@required this.isDirty,
|
||||||
|
});
|
||||||
|
|
||||||
|
factory PurchaseOrderViewVM.fromStore(Store<AppState> store) {
|
||||||
|
final state = store.state;
|
||||||
|
final purchaseOrder =
|
||||||
|
state.purchaseOrderState.map[state.purchaseOrderUIState.selectedId] ??
|
||||||
|
InvoiceEntity(id: state.purchaseOrderUIState.selectedId);
|
||||||
|
|
||||||
|
Future<Null> _handleRefresh(BuildContext context) {
|
||||||
|
final completer = snackBarCompleter<Null>(
|
||||||
|
context, AppLocalization.of(context).refreshComplete);
|
||||||
|
store.dispatch(LoadPurchaseOrder(
|
||||||
|
completer: completer, purchaseOrderId: purchaseOrder.id));
|
||||||
|
return completer.future;
|
||||||
|
}
|
||||||
|
|
||||||
|
return PurchaseOrderViewVM(
|
||||||
|
state: state,
|
||||||
|
company: state.company,
|
||||||
|
isSaving: state.isSaving,
|
||||||
|
isLoading: state.isLoading,
|
||||||
|
isDirty: purchaseOrder.isNew,
|
||||||
|
purchaseOrder: purchaseOrder,
|
||||||
|
onRefreshed: (context) => _handleRefresh(context),
|
||||||
|
onEntityAction: (BuildContext context, EntityAction action) =>
|
||||||
|
handleEntitiesActions([purchaseOrder], action, autoPop: true),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
final AppState state;
|
||||||
|
final InvoiceEntity purchaseOrder;
|
||||||
|
final CompanyEntity company;
|
||||||
|
final Function(BuildContext, EntityAction) onEntityAction;
|
||||||
|
final Function(BuildContext) onRefreshed;
|
||||||
|
final bool isSaving;
|
||||||
|
final bool isLoading;
|
||||||
|
final bool isDirty;
|
||||||
|
}
|
||||||
|
|
@ -16,6 +16,18 @@ mixin LocalizationsProvider on LocaleCodeAware {
|
||||||
static final Map<String, Map<String, String>> _localizedValues = {
|
static final Map<String, Map<String, String>> _localizedValues = {
|
||||||
'en': {
|
'en': {
|
||||||
// STARTER: lang key - do not remove comment
|
// STARTER: lang key - do not remove comment
|
||||||
|
'purchase_order': 'PurchaseOrder',
|
||||||
|
'purchase_orders': 'PurchaseOrders',
|
||||||
|
'new_purchase_order': 'New PurchaseOrder',
|
||||||
|
'edit_purchase_order': 'Edit PurchaseOrder',
|
||||||
|
'created_purchase_order': 'Successfully created purchase_order',
|
||||||
|
'updated_purchase_order': 'Successfully updated purchase_order',
|
||||||
|
'archived_purchase_order': 'Successfully archived purchase_order',
|
||||||
|
'deleted_purchase_order': 'Successfully deleted purchase_order',
|
||||||
|
'removed_purchase_order': 'Successfully removed purchase_order',
|
||||||
|
'restored_purchase_order': 'Successfully restored purchase_order',
|
||||||
|
'search_purchase_order': 'Search PurchaseOrder',
|
||||||
|
|
||||||
'login_url': 'Login URL',
|
'login_url': 'Login URL',
|
||||||
'enable_applying_payments': 'Enable Applying Payments',
|
'enable_applying_payments': 'Enable Applying Payments',
|
||||||
'enable_applying_payments_help':
|
'enable_applying_payments_help':
|
||||||
|
|
@ -70606,6 +70618,36 @@ mixin LocalizationsProvider on LocaleCodeAware {
|
||||||
_localizedValues['en']['login_url'];
|
_localizedValues['en']['login_url'];
|
||||||
|
|
||||||
// STARTER: lang field - do not remove comment
|
// STARTER: lang field - do not remove comment
|
||||||
|
String get purchaseOrder =>
|
||||||
|
_localizedValues[localeCode]['purchase_order'] ??
|
||||||
|
_localizedValues['en']['purchase_order'];
|
||||||
|
String get purchaseOrders =>
|
||||||
|
_localizedValues[localeCode]['purchase_orders'] ??
|
||||||
|
_localizedValues['en']['purchase_orders'];
|
||||||
|
String get newPurchaseOrder =>
|
||||||
|
_localizedValues[localeCode]['new_purchase_order'] ??
|
||||||
|
_localizedValues['en']['new_purchase_order'];
|
||||||
|
String get createdPurchaseOrder =>
|
||||||
|
_localizedValues[localeCode]['created_purchase_order'] ??
|
||||||
|
_localizedValues['en']['created_purchase_order'];
|
||||||
|
String get updatedPurchaseOrder =>
|
||||||
|
_localizedValues[localeCode]['updated_purchase_order'] ??
|
||||||
|
_localizedValues['en']['updated_purchase_order'];
|
||||||
|
String get archivedPurchaseOrder =>
|
||||||
|
_localizedValues[localeCode]['archived_purchase_order'] ??
|
||||||
|
_localizedValues['en']['archived_purchase_order'];
|
||||||
|
String get deletedPurchaseOrder =>
|
||||||
|
_localizedValues[localeCode]['deleted_purchase_order'] ??
|
||||||
|
_localizedValues['en']['deleted_purchase_order'];
|
||||||
|
String get restoredPurchaseOrder =>
|
||||||
|
_localizedValues[localeCode]['restored_purchase_order'] ??
|
||||||
|
_localizedValues['en']['restored_purchase_order'];
|
||||||
|
String get editPurchaseOrder =>
|
||||||
|
_localizedValues[localeCode]['edit_purchase_order'] ??
|
||||||
|
_localizedValues['en']['edit_purchase_order'];
|
||||||
|
String get searchPurchaseOrder =>
|
||||||
|
_localizedValues[localeCode]['search_purchase_order'] ??
|
||||||
|
_localizedValues['en']['search_purchase_order'];
|
||||||
|
|
||||||
String lookup(String key) {
|
String lookup(String key) {
|
||||||
final lookupKey = toSnakeCase(key);
|
final lookupKey = toSnakeCase(key);
|
||||||
|
|
|
||||||
|
|
@ -443,7 +443,7 @@ else
|
||||||
|
|
||||||
comment="STARTER: entity type - do not remove comment"
|
comment="STARTER: entity type - do not remove comment"
|
||||||
code="static const EntityType ${module_camel} = _\$${module_camel};${lineBreak}"
|
code="static const EntityType ${module_camel} = _\$${module_camel};${lineBreak}"
|
||||||
#sed -i -e "s/$comment/$comment${lineBreak}$code/g" ./lib/data/models/entities.dart
|
sed -i -e "s/$comment/$comment${lineBreak}$code/g" ./lib/data/models/entities.dart
|
||||||
|
|
||||||
echo "Generating built files.."
|
echo "Generating built files.."
|
||||||
flutter packages pub run build_runner clean
|
flutter packages pub run build_runner clean
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
import 'dart:async';
|
|
||||||
import 'dart:convert';
|
import 'dart:convert';
|
||||||
import 'dart:core';
|
import 'dart:core';
|
||||||
import 'package:built_collection/built_collection.dart';
|
import 'package:built_collection/built_collection.dart';
|
||||||
|
import 'package:invoiceninja_flutter/constants.dart';
|
||||||
import 'package:invoiceninja_flutter/data/models/serializers.dart';
|
import 'package:invoiceninja_flutter/data/models/serializers.dart';
|
||||||
import 'package:invoiceninja_flutter/redux/app/app_state.dart';
|
import 'package:invoiceninja_flutter/redux/app/app_state.dart';
|
||||||
import 'package:invoiceninja_flutter/data/models/models.dart';
|
import 'package:invoiceninja_flutter/data/models/models.dart';
|
||||||
|
|
|
||||||
|
|
@ -276,14 +276,13 @@ void handleStubAction(
|
||||||
}
|
}
|
||||||
|
|
||||||
final store = StoreProvider.of<AppState>(context);
|
final store = StoreProvider.of<AppState>(context);
|
||||||
final state = store.state;
|
|
||||||
final localization = AppLocalization.of(context);
|
final localization = AppLocalization.of(context);
|
||||||
final stub = stubs.first as StubEntity;
|
final stub = stubs.first as StubEntity;
|
||||||
final stubIds = stubs.map((stub) => stub.id).toList();
|
final stubIds = stubs.map((stub) => stub.id).toList();
|
||||||
|
|
||||||
switch (action) {
|
switch (action) {
|
||||||
case EntityAction.edit:
|
case EntityAction.edit:
|
||||||
editEntity(context: context, entity: stub);
|
editEntity(entity: stub);
|
||||||
break;
|
break;
|
||||||
case EntityAction.restore:
|
case EntityAction.restore:
|
||||||
store.dispatch(RestoreStubsRequest(
|
store.dispatch(RestoreStubsRequest(
|
||||||
|
|
|
||||||
|
|
@ -51,11 +51,11 @@ class StubListItem extends StatelessWidget {
|
||||||
child: ListTile(
|
child: ListTile(
|
||||||
onTap: () => onTap != null
|
onTap: () => onTap != null
|
||||||
? onTap()
|
? onTap()
|
||||||
: selectEntity(entity: stub, context: context),
|
: selectEntity(entity: stub),
|
||||||
onLongPress: () => onLongPress != null
|
onLongPress: () => onLongPress != null
|
||||||
? onLongPress()
|
? onLongPress()
|
||||||
: selectEntity(
|
: selectEntity(
|
||||||
entity: stub, context: context, longPress: true),
|
entity: stub, longPress: true),
|
||||||
leading: showCheckbox
|
leading: showCheckbox
|
||||||
? IgnorePointer(
|
? IgnorePointer(
|
||||||
ignoring: listUIState.isInMultiselect(),
|
ignoring: listUIState.isInMultiselect(),
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue