Null safety

This commit is contained in:
Hillel Coren 2023-09-18 18:03:39 +03:00
parent 3b435fd70b
commit 9de6d6ee53
16 changed files with 118 additions and 91 deletions

View File

@ -499,17 +499,19 @@ List<ChartDataGroup> chartPayments(
refundedData.entityMap[date] = [];
}
totals[STATUS_COMPLETED]![date] += completedAmount;
totals[STATUS_REFUNDED]![date] += refunded ?? 0;
totals[STATUS_COMPLETED]![date] =
totals[STATUS_COMPLETED]![date]! + completedAmount;
totals[STATUS_REFUNDED]![date] =
totals[STATUS_REFUNDED]![date]! + refunded;
counts[STATUS_COMPLETED]++;
counts[STATUS_COMPLETED] = counts[STATUS_COMPLETED]! + 1;
activeData.entityMap[date]!.add(payment.id);
activeData.periodTotal += completedAmount;
if ((payment.refunded ?? 0) > 0) {
counts[STATUS_REFUNDED]++;
counts[STATUS_REFUNDED] = counts[STATUS_REFUNDED]! + 1;
refundedData.entityMap[date]!.add(payment.id);
refundedData.periodTotal += refunded ?? 0;
refundedData.periodTotal += refunded;
}
}
}
@ -693,16 +695,19 @@ List<ChartDataGroup> chartTasks(
if (task.isInvoiced) {
if (invoiceMap.containsKey(task.invoiceId) &&
invoiceMap[task.invoiceId]!.isPaid) {
totals[STATUS_PAID]![date] += amount;
totals[STATUS_PAID]![date] =
totals[STATUS_PAID]![date]! + amount;
paidData.entityMap[date]!.add(task.id);
paidData.periodTotal += amount;
} else {
totals[STATUS_INVOICED]![date] += amount;
totals[STATUS_INVOICED]![date] =
totals[STATUS_INVOICED]![date]! + amount;
invoicedData.entityMap[date]!.add(task.id);
invoicedData.periodTotal += amount;
}
} else {
totals[STATUS_LOGGED]![date] += amount;
totals[STATUS_LOGGED]![date] =
totals[STATUS_LOGGED]![date]! + amount;
loggedData.entityMap[date]!.add(task.id);
loggedData.periodTotal += amount;
}
@ -713,12 +718,12 @@ List<ChartDataGroup> chartTasks(
if (task.isInvoiced) {
if (invoiceMap.containsKey(task.invoiceId) &&
invoiceMap[task.invoiceId]!.isPaid) {
counts[STATUS_PAID]++;
counts[STATUS_PAID] = counts[STATUS_PAID]! + 1;
} else {
counts[STATUS_INVOICED]++;
counts[STATUS_INVOICED] = counts[STATUS_INVOICED]! + 1;
}
} else {
counts[STATUS_LOGGED]++;
counts[STATUS_LOGGED] = counts[STATUS_LOGGED]! + 1;
}
}
});
@ -857,24 +862,26 @@ List<ChartDataGroup> chartExpenses(
if (expense.isInvoiced) {
final invoice = invoiceMap[expense.invoiceId] ?? InvoiceEntity();
if (invoice.isPaid) {
totals[STATUS_PAID]![date] += amount;
counts[STATUS_PAID]++;
totals[STATUS_PAID]![date] = totals[STATUS_PAID]![date]! + amount;
counts[STATUS_PAID] = counts[STATUS_PAID]! + 1;
paidData.entityMap[date]!.add(expense.id);
paidData.periodTotal += amount;
} else {
totals[STATUS_INVOICED]![date] += amount;
counts[STATUS_INVOICED]++;
totals[STATUS_INVOICED]![date] =
totals[STATUS_INVOICED]![date]! + amount;
counts[STATUS_INVOICED] = counts[STATUS_INVOICED]! + 1;
invoicedData.entityMap[date]!.add(expense.id);
invoicedData.periodTotal += amount;
}
} else if (expense.isPending) {
totals[STATUS_PENDING]![date] += amount;
counts[STATUS_PENDING]++;
totals[STATUS_PENDING]![date] =
totals[STATUS_PENDING]![date]! + amount;
counts[STATUS_PENDING] = counts[STATUS_PENDING]! + 1;
pendingData.entityMap[date]!.add(expense.id);
pendingData.periodTotal += amount;
} else {
totals[STATUS_LOGGED]![date] += amount;
counts[STATUS_LOGGED]++;
totals[STATUS_LOGGED]![date] = totals[STATUS_LOGGED]![date]! + amount;
counts[STATUS_LOGGED] = counts[STATUS_LOGGED]! + 1;
loggedData.entityMap[date]!.add(expense.id);
loggedData.periodTotal += amount;
}

View File

@ -483,67 +483,82 @@ void handleDocumentAction(
context, AppLocalization.of(context)!.deletedDocument);
switch (document!.parentType) {
case EntityType.client:
completer.future.then<Null>(((value) => store
.dispatch(LoadClient(clientId: document.parentId))) as FutureOr<Null> Function(Null));
completer.future.then<Null>((() => store.dispatch(
LoadClient(clientId: document.parentId)))
as FutureOr<Null> Function(Null));
break;
case EntityType.credit:
completer.future.then<Null>(((value) => store
.dispatch(LoadCredit(creditId: document.parentId))) as FutureOr<Null> Function(Null));
completer.future.then<Null>((() => store.dispatch(
LoadCredit(creditId: document.parentId)))
as FutureOr<Null> Function(Null));
break;
case EntityType.expense:
completer.future.then<Null>(((value) => store
.dispatch(LoadExpense(expenseId: document.parentId))) as FutureOr<Null> Function(Null));
completer.future.then<Null>((() => store.dispatch(
LoadExpense(expenseId: document.parentId)))
as FutureOr<Null> Function(Null));
break;
case EntityType.group:
completer.future.then<Null>(((value) => store
.dispatch(LoadGroup(groupId: document.parentId))) as FutureOr<Null> Function(Null));
completer.future.then<Null>((() => store
.dispatch(LoadGroup(groupId: document.parentId)))
as FutureOr<Null> Function(Null));
break;
case EntityType.invoice:
completer.future.then<Null>(((value) => store
.dispatch(LoadInvoice(invoiceId: document.parentId))) as FutureOr<Null> Function(Null));
completer.future.then<Null>((() => store.dispatch(
LoadInvoice(invoiceId: document.parentId)))
as FutureOr<Null> Function(Null));
break;
case EntityType.product:
completer.future.then<Null>(((value) => store
.dispatch(LoadProduct(productId: document.parentId))) as FutureOr<Null> Function(Null));
completer.future.then<Null>((() => store.dispatch(
LoadProduct(productId: document.parentId)))
as FutureOr<Null> Function(Null));
break;
case EntityType.project:
completer.future.then<Null>(((value) => store
.dispatch(LoadProject(projectId: document.parentId))) as FutureOr<Null> Function(Null));
completer.future.then<Null>((() => store.dispatch(
LoadProject(projectId: document.parentId)))
as FutureOr<Null> Function(Null));
break;
case EntityType.purchaseOrder:
completer.future.then<Null>(((value) => store.dispatch(
LoadPurchaseOrder(
purchaseOrderId: document.parentId))) as FutureOr<Null> Function(Null));
completer.future.then<Null>((() => store.dispatch(
LoadPurchaseOrder(
purchaseOrderId: document.parentId)))
as FutureOr<Null> Function(Null));
break;
case EntityType.quote:
completer.future.then<Null>(((value) => store
.dispatch(LoadQuote(quoteId: document.parentId))) as FutureOr<Null> Function(Null));
completer.future.then<Null>((() => store
.dispatch(LoadQuote(quoteId: document.parentId)))
as FutureOr<Null> Function(Null));
break;
case EntityType.recurringExpense:
completer.future.then<Null>(((value) => store.dispatch(
LoadRecurringExpense(
recurringExpenseId: document.parentId))) as FutureOr<Null> Function(Null));
completer.future.then<Null>((() => store.dispatch(
LoadRecurringExpense(
recurringExpenseId: document.parentId)))
as FutureOr<Null> Function(Null));
break;
case EntityType.recurringInvoice:
completer.future.then<Null>(((value) => store.dispatch(
LoadRecurringInvoice(
recurringInvoiceId: document.parentId))) as FutureOr<Null> Function(Null));
completer.future.then<Null>((() => store.dispatch(
LoadRecurringInvoice(
recurringInvoiceId: document.parentId)))
as FutureOr<Null> Function(Null));
break;
case EntityType.task:
completer.future.then<Null>(((value) =>
store.dispatch(LoadTask(taskId: document.parentId))) as FutureOr<Null> Function(Null));
completer.future.then<Null>((() => store
.dispatch(LoadTask(taskId: document.parentId)))
as FutureOr<Null> Function(Null));
break;
case EntityType.vendor:
completer.future.then<Null>(((value) => store
.dispatch(LoadVendor(vendorId: document.parentId))) as FutureOr<Null> Function(Null));
completer.future.then<Null>((() => store.dispatch(
LoadVendor(vendorId: document.parentId)))
as FutureOr<Null> Function(Null));
break;
default:
completer.future
.then<Null>(((value) => store.dispatch(RefreshData())) as FutureOr<Null> Function(Null));
completer.future.then<Null>((() =>
store.dispatch(RefreshData()))
as FutureOr<Null> Function(Null));
}
completer.future
.then<Null>(((value) => store.dispatch(RefreshData())) as FutureOr<Null> Function(Null));
completer.future.then<Null>((() =>
store.dispatch(RefreshData()))
as FutureOr<Null> Function(Null));
store.dispatch(DeleteDocumentRequest(
completer: completer,
documentIds: [document.id],

View File

@ -147,7 +147,7 @@ class ClientEditBillingAddressState extends State<ClientEditBillingAddress> {
entityList: memoizedCountryList(viewModel.staticState.countryMap),
labelText: localization.country,
entityId: client.countryId,
onSelected: (SelectableEntity country) => viewModel.onChanged(
onSelected: (SelectableEntity? country) => viewModel.onChanged(
client.rebuild((b) => b..countryId = country?.id ?? '')),
),
if (client.hasShippingAddress && client.areAddressesDifferent)

View File

@ -123,7 +123,7 @@ class ClientEditNotesState extends State<ClientEditNotes> {
entityList: memoizedIndustryList(viewModel.staticState.industryMap),
labelText: localization.industry,
entityId: client.industryId,
onSelected: (SelectableEntity industry) => viewModel.onChanged(
onSelected: (SelectableEntity? industry) => viewModel.onChanged(
client.rebuild((b) => b..industryId = industry?.id ?? '')),
),
],

View File

@ -99,7 +99,7 @@ class ClientEditSettingsState extends State<ClientEditSettings> {
entityList: memoizedCurrencyList(viewModel.staticState.currencyMap),
labelText: localization.currency,
entityId: client.currencyId,
onSelected: (SelectableEntity currency) => viewModel.onChanged(client
onSelected: (SelectableEntity? currency) => viewModel.onChanged(client
.rebuild((b) => b..settings.currencyId = currency?.id ?? '')),
),
EntityDropdown(
@ -107,7 +107,7 @@ class ClientEditSettingsState extends State<ClientEditSettings> {
entityList: memoizedLanguageList(viewModel.staticState.languageMap),
labelText: localization.language,
entityId: client.languageId,
onSelected: (SelectableEntity language) => viewModel.onChanged(client
onSelected: (SelectableEntity? language) => viewModel.onChanged(client
.rebuild((b) => b..settings.languageId = language?.id ?? '')),
),
if (company.isModuleEnabled(EntityType.invoice))

View File

@ -143,7 +143,7 @@ class ClientEditShippingAddressState extends State<ClientEditShippingAddress> {
entityList: memoizedCountryList(viewModel.staticState.countryMap),
labelText: localization.country,
entityId: client.shippingCountryId,
onSelected: (SelectableEntity country) => viewModel.onChanged(
onSelected: (SelectableEntity? country) => viewModel.onChanged(
client.rebuild((b) => b..shippingCountryId = country?.id ?? '')),
),
if (client.hasBillingAddress && client.areAddressesDifferent)

View File

@ -155,7 +155,7 @@ class _CompanyGatewayEditState extends State<CompanyGatewayEdit>
memoizedGatewayList(state.staticState.gatewayMap),
labelText: localization.provider,
entityId: companyGateway.gatewayId,
onSelected: (SelectableEntity gateway) {
onSelected: (SelectableEntity? gateway) {
viewModel.onChanged(
companyGateway.rebuild((b) => b
..feesAndLimitsMap[((gateway ?? GatewayEntity())
@ -237,18 +237,18 @@ class _CompanyGatewayEditState extends State<CompanyGatewayEdit>
AppDropdownButton<String>(
labelText: localization.captureCard,
value: companyGateway.tokenBilling,
selectedItemBuilder: (companyGateway.tokenBilling ?? '')
.isEmpty
? null
: (context) => [
SettingsEntity.AUTO_BILL_ALWAYS,
SettingsEntity.AUTO_BILL_OPT_OUT,
SettingsEntity.AUTO_BILL_OPT_IN,
SettingsEntity.AUTO_BILL_OFF,
]
.map(
(type) => Text(localization.lookup(type)!))
.toList(),
selectedItemBuilder:
(companyGateway.tokenBilling ?? '').isEmpty
? null
: (context) => [
SettingsEntity.AUTO_BILL_ALWAYS,
SettingsEntity.AUTO_BILL_OPT_OUT,
SettingsEntity.AUTO_BILL_OPT_IN,
SettingsEntity.AUTO_BILL_OFF,
]
.map((type) =>
Text(localization.lookup(type)!))
.toList(),
onChanged: (dynamic value) => viewModel.onChanged(
companyGateway
.rebuild((b) => b..tokenBilling = value)),

View File

@ -300,7 +300,7 @@ class ExpenseEditDetailsState extends State<ExpenseEditDetails> {
entityList: memoizedCurrencyList(staticState.currencyMap),
labelText: localization.currency,
entityId: expense.currencyId,
onSelected: (SelectableEntity currency) => viewModel.onChanged!(
onSelected: (SelectableEntity? currency) => viewModel.onChanged!(
viewModel.expense!
.rebuild((b) => b..currencyId = currency?.id ?? '')),
),

View File

@ -134,7 +134,8 @@ class ExpenseEditSettingsState extends State<ExpenseEditSettings> {
formatNumberType: FormatNumberType.inputMoney)!;
_exchangeRateController.addListener(_onChanged);
viewModel.onChanged!(expense.rebuild((b) => b..exchangeRate = exchangeRate));
viewModel
.onChanged!(expense.rebuild((b) => b..exchangeRate = exchangeRate));
_convertedAmount = 0;
}
@ -252,7 +253,7 @@ class ExpenseEditSettingsState extends State<ExpenseEditSettings> {
entityList: memoizedCurrencyList(staticState.currencyMap),
labelText: localization.currency,
entityId: expense.invoiceCurrencyId,
onSelected: (SelectableEntity currency) =>
onSelected: (SelectableEntity? currency) =>
_setCurrency(currency as CurrencyEntity?),
),
DecoratedFormField(

View File

@ -376,7 +376,7 @@ class _PaymentEditState extends State<PaymentEdit> {
memoizedCurrencyList(viewModel.staticState.currencyMap),
labelText: localization.currency,
entityId: payment.exchangeCurrencyId,
onSelected: (SelectableEntity currency) =>
onSelected: (SelectableEntity? currency) =>
convertCurrency(currency),
),
DecoratedFormField(

View File

@ -438,7 +438,7 @@ class _CompanyDetailsState extends State<CompanyDetails>
memoizedIndustryList(state.staticState.industryMap),
labelText: localization.industry,
entityId: company.industryId,
onSelected: (SelectableEntity industry) =>
onSelected: (SelectableEntity? industry) =>
viewModel.onCompanyChanged(
company
.rebuild((b) => b..industryId = industry?.id ?? ''),
@ -496,7 +496,7 @@ class _CompanyDetailsState extends State<CompanyDetails>
memoizedCountryList(state.staticState.countryMap),
labelText: localization.country,
entityId: settings.countryId,
onSelected: (SelectableEntity country) =>
onSelected: (SelectableEntity? country) =>
viewModel.onSettingsChanged(settings
.rebuild((b) => b..countryId = country?.id)),
),

View File

@ -147,7 +147,7 @@ class _LocalizationSettingsState extends State<LocalizationSettings>
memoizedCurrencyList(state.staticState.currencyMap),
labelText: localization.currency,
entityId: settings.currencyId,
onSelected: (SelectableEntity currency) =>
onSelected: (SelectableEntity? currency) =>
viewModel.onSettingsChanged(settings
.rebuild((b) => b..currencyId = currency?.id)),
),
@ -175,7 +175,7 @@ class _LocalizationSettingsState extends State<LocalizationSettings>
memoizedLanguageList(state.staticState.languageMap),
labelText: localization.language,
entityId: settings.languageId,
onSelected: (SelectableEntity language) =>
onSelected: (SelectableEntity? language) =>
viewModel.onSettingsChanged(settings
.rebuild((b) => b..languageId = language?.id)),
),
@ -186,7 +186,7 @@ class _LocalizationSettingsState extends State<LocalizationSettings>
memoizedTimezoneList(state.staticState.timezoneMap),
labelText: localization.timezone,
entityId: settings.timezoneId,
onSelected: (SelectableEntity timezone) =>
onSelected: (SelectableEntity? timezone) =>
viewModel.onSettingsChanged(settings
.rebuild((b) => b..timezoneId = timezone?.id)),
),
@ -196,7 +196,7 @@ class _LocalizationSettingsState extends State<LocalizationSettings>
memoizedDateFormatList(state.staticState.dateFormatMap),
labelText: localization.dateFormat,
entityId: settings.dateFormatId,
onSelected: (SelectableEntity dateFormat) =>
onSelected: (SelectableEntity? dateFormat) =>
viewModel.onSettingsChanged(settings
.rebuild((b) => b..dateFormatId = dateFormat?.id)),
),
@ -418,7 +418,7 @@ class _AddCompanyDialogState extends State<_AddCompanyDialog> {
entityType: EntityType.country,
entityList: memoizedCountryList(state.staticState.countryMap),
labelText: localization.country,
onSelected: (SelectableEntity country) {
onSelected: (SelectableEntity? country) {
_countryId = country.id;
},
),

View File

@ -146,15 +146,18 @@ class _SettingsWizardState extends State<SettingsWizard> {
callback: (password, idToken) {
final localization = AppLocalization.of(context);
final completer = Completer<Null>();
completer.future.then((value) {
completer.future
.then((value) {
final toastCompleter =
snackBarCompleter<Null>(context, localization!.savedSettings);
toastCompleter.future.then((value) {
toastCompleter.future
.then((value) {
setState(() {
_isSaving = false;
_showLogo = true;
});
} as FutureOr<_> Function(Null)).catchError((Object error) {
} as FutureOr<_> Function(Null))
.catchError((Object error) {
setState(() {
_isSaving = false;
});
@ -171,7 +174,8 @@ class _SettingsWizardState extends State<SettingsWizard> {
),
),
);
} as FutureOr<_> Function(Null)).catchError((Object error) {
} as FutureOr<_> Function(Null))
.catchError((Object error) {
setState(() => _isSaving = false);
});
@ -232,7 +236,7 @@ class _SettingsWizardState extends State<SettingsWizard> {
entityList: memoizedCurrencyList(state.staticState.currencyMap),
labelText: localization.currency,
entityId: _currencyId,
onSelected: (SelectableEntity currency) =>
onSelected: (SelectableEntity? currency) =>
setState(() => _currencyId = currency?.id),
validator: (dynamic value) =>
value.isEmpty ? localization.pleaseEnterAValue : null,
@ -243,7 +247,7 @@ class _SettingsWizardState extends State<SettingsWizard> {
entityList: memoizedLanguageList(state.staticState.languageMap),
labelText: localization.language,
entityId: _languageId,
onSelected: (SelectableEntity language) {
onSelected: (SelectableEntity? language) {
setState(() => _languageId = language?.id);
store.dispatch(UpdateCompanyLanguage(languageId: language?.id));
AppBuilder.of(context)!.rebuild();

View File

@ -150,7 +150,7 @@ class _TransactionEditState extends State<TransactionEdit> {
memoizedCurrencyList(state.staticState.currencyMap),
labelText: localization.currency,
entityId: transaction.currencyId,
onSelected: (SelectableEntity currency) =>
onSelected: (SelectableEntity? currency) =>
viewModel.onChanged(viewModel.transaction.rebuild(
(b) => b..currencyId = currency?.id ?? '')),
),

View File

@ -138,7 +138,7 @@ class VendorEditAddressState extends State<VendorEditAddress> {
memoizedCountryList(viewModel.state.staticState.countryMap),
labelText: localization.country,
entityId: vendor.countryId,
onSelected: (SelectableEntity country) => viewModel
onSelected: (SelectableEntity? country) => viewModel
.onChanged(vendor.rebuild((b) => b..countryId = country?.id)),
),
],

View File

@ -46,7 +46,7 @@ class VendorEditSettingsState extends State<VendorEditSettings> {
entityList: memoizedCurrencyList(state.staticState.currencyMap),
labelText: localization.currency,
entityId: vendor.currencyId,
onSelected: (SelectableEntity currency) => viewModel.onChanged(
onSelected: (SelectableEntity? currency) => viewModel.onChanged(
vendor.rebuild((b) => b..currencyId = currency?.id ?? '')),
),
EntityDropdown(
@ -54,7 +54,7 @@ class VendorEditSettingsState extends State<VendorEditSettings> {
entityList: memoizedLanguageList(state.staticState.languageMap),
labelText: localization.language,
entityId: vendor.languageId,
onSelected: (SelectableEntity language) => viewModel.onChanged(
onSelected: (SelectableEntity? language) => viewModel.onChanged(
vendor.rebuild((b) => b..languageId = language?.id ?? '')),
),
],