Skip to content

Commit

Permalink
Merge branch 'develop'
Browse files Browse the repository at this point in the history
  • Loading branch information
hillelcoren committed Jan 20, 2022
2 parents 18be599 + c98b4c4 commit db4bba3
Show file tree
Hide file tree
Showing 38 changed files with 2,699 additions and 246 deletions.
3 changes: 2 additions & 1 deletion lib/constants.dart
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ class Constants {
}

// TODO remove version once #46609 is fixed
const String kClientVersion = '5.0.72';
const String kClientVersion = '5.0.73';
const String kMinServerVersion = '5.0.4';

const String kAppName = 'Invoice Ninja';
Expand Down Expand Up @@ -592,6 +592,7 @@ const List<String> kLanguages = [
'en_AU',
'es',
'es_ES',
'et',
'fa',
'fi',
'fr',
Expand Down
4 changes: 4 additions & 0 deletions lib/data/models/entities.dart
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,10 @@ class EntityType extends EnumClass {
return [
EntityType.payment,
];
case EntityType.quote:
return [
EntityType.invoice,
];
case EntityType.recurringInvoice:
return [
EntityType.invoice,
Expand Down
1 change: 0 additions & 1 deletion lib/data/models/recurring_invoice_model.dart
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ class RecurringInvoiceFields {
static const String client = 'client';
static const String statusId = 'status_id';
static const String status = 'status';
static const String invoiceNumber = 'number';
static const String discount = 'discount';
static const String number = 'number';
static const String poNumber = 'po_number';
Expand Down
3 changes: 3 additions & 0 deletions lib/data/repositories/auth_repository.dart
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import 'package:invoiceninja_flutter/data/models/entities.dart';
import 'package:invoiceninja_flutter/data/web_client.dart';
import 'package:invoiceninja_flutter/redux/app/app_state.dart';
import 'package:invoiceninja_flutter/utils/formatting.dart';
import 'package:invoiceninja_flutter/utils/platforms.dart';
import 'package:invoiceninja_flutter/utils/serialization.dart';

class AuthRepository {
Expand All @@ -36,6 +37,7 @@ class AuthRepository {
'terms_of_service': true,
'privacy_policy': true,
'token_name': _tokenName,
'platform': getPlatformName(),
};

if ((url ?? '').isEmpty) {
Expand All @@ -60,6 +62,7 @@ class AuthRepository {
'id_token': idToken,
//'access_token': accessToken,
'provider': 'google',
'platform': getPlatformName(),
};

return sendRequest(
Expand Down
3 changes: 1 addition & 2 deletions lib/redux/app/app_middleware.dart
Original file line number Diff line number Diff line change
Expand Up @@ -387,8 +387,7 @@ Middleware<AppState> _createPersistData(
};
}

final _persistUIDebouncer =
Debouncer(milliseconds: kMillisecondsToDebounceWrite);
final _persistUIDebouncer = PersistUIDebouncer();
Middleware<AppState> _createPersistUI(PersistenceRepository uiRepository) {
return (Store<AppState> store, dynamic dynamicAction, NextDispatcher next) {
final action = dynamicAction as PersistUI;
Expand Down
18 changes: 18 additions & 0 deletions lib/redux/invoice/invoice_selectors.dart
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,21 @@ import 'package:invoiceninja_flutter/data/models/models.dart';
import 'package:invoiceninja_flutter/redux/app/app_state.dart';
import 'package:invoiceninja_flutter/redux/ui/list_ui_state.dart';

InvoiceEntity invoiceQuoteSelector(
InvoiceEntity invoice, BuiltMap<String, InvoiceEntity> quoteMap) {
InvoiceEntity invoiceQuote;
quoteMap.forEach((quoteId, quote) {
if (quote.invoiceId == invoice.id) {
invoiceQuote = quote;
}
});
return invoiceQuote;
}

var memoizedInvoiceQuoteSelector = memo2(
(InvoiceEntity invoice, BuiltMap<String, InvoiceEntity> quoteMap) =>
invoiceQuoteSelector(invoice, quoteMap));

var memoizedDropdownInvoiceList = memo7(
(BuiltMap<String, InvoiceEntity> invoiceMap,
BuiltMap<String, ClientEntity> clientMap,
Expand Down Expand Up @@ -132,6 +147,9 @@ List<String> filteredInvoicesSelector(
} else if (filterEntityType == EntityType.project &&
invoice.projectId != filterEntityId) {
return false;
} else if (filterEntityType == EntityType.quote &&
invoice.invoiceId != filterEntityId) {
return false;
} else if (filterEntityType == EntityType.payment) {
bool isMatch = false;
(invoicePaymentMap[invoiceId] ?? []).forEach((paymentId) {
Expand Down
11 changes: 2 additions & 9 deletions lib/ui/app/document_grid.dart
Original file line number Diff line number Diff line change
Expand Up @@ -207,15 +207,8 @@ class DocumentTile extends StatelessWidget {
launch(state.account.defaultUrl +
document.downloadUrl);
} else {
Directory directory;
if (Platform.isAndroid) {
directory =
await getExternalStorageDirectory();
} else {
directory =
await getApplicationDocumentsDirectory();
}

final directory =
await getApplicationDocumentsDirectory();
final String folder =
'${directory.path}/documents';
await Directory(folder)
Expand Down
2 changes: 1 addition & 1 deletion lib/ui/client/client_pdf.dart
Original file line number Diff line number Diff line change
Expand Up @@ -365,7 +365,7 @@ class _ClientPdfViewState extends State<ClientPdfView> {
fileName, _response.bodyBytes);
} else {
final directory =
await getExternalStorageDirectory();
await getApplicationDocumentsDirectory();
final filePath =
'${directory.path}/${client.number}.pdf';
final pdfData = file.File(filePath);
Expand Down
15 changes: 8 additions & 7 deletions lib/ui/client/edit/client_edit_contacts.dart
Original file line number Diff line number Diff line change
Expand Up @@ -194,7 +194,7 @@ class ContactEditDetailsState extends State<ContactEditDetails> {

final _debouncer = Debouncer();
List<TextEditingController> _controllers = [];
bool _sendEmail = false;
ContactEntity _contact;

void _onDoneContactPressed() {
if (widget.isDialog) {
Expand Down Expand Up @@ -227,7 +227,7 @@ class ContactEditDetailsState extends State<ContactEditDetails> {
_controllers
.forEach((dynamic controller) => controller.removeListener(_onChanged));

final contact = widget.contact;
final contact = _contact = widget.contact;
_firstNameController.text = contact.firstName;
_lastNameController.text = contact.lastName;
_emailController.text = contact.email;
Expand All @@ -237,7 +237,6 @@ class ContactEditDetailsState extends State<ContactEditDetails> {
_custom2Controller.text = contact.customValue2;
_custom3Controller.text = contact.customValue3;
_custom4Controller.text = contact.customValue4;
_sendEmail = contact.sendEmail;

_controllers
.forEach((dynamic controller) => controller.addListener(_onChanged));
Expand All @@ -257,7 +256,7 @@ class ContactEditDetailsState extends State<ContactEditDetails> {

void _onChanged() {
final viewModel = widget.viewModel;
final contact = widget.contact.rebuild((b) => b
final contact = _contact = widget.contact.rebuild((b) => b
..firstName = _firstNameController.text.trim()
..lastName = _lastNameController.text.trim()
..email = _emailController.text.trim()
Expand Down Expand Up @@ -362,13 +361,15 @@ class ContactEditDetailsState extends State<ContactEditDetails> {
child: SwitchListTile(
activeColor: Theme.of(context).colorScheme.secondary,
title: Text(localization.addToInvoices),
value: _sendEmail,
value: _contact.sendEmail,
onChanged: (value) {
setState(() =>
_contact = _contact.rebuild((b) => b..sendEmail = value));

viewModel.onChangedContact(
widget.contact.rebuild((b) => b..sendEmail = value),
_contact.rebuild((b) => b..sendEmail = value),
widget.index,
);
setState(() => _sendEmail = value);
}),
),
],
Expand Down
39 changes: 19 additions & 20 deletions lib/ui/design/edit/design_edit.dart
Original file line number Diff line number Diff line change
Expand Up @@ -131,30 +131,29 @@ class _DesignEditState extends State<DesignEdit>
super.dispose();
}

void _onChanged() {
final design = widget.viewModel.design
.rebuild((b) => b..name = _nameController.text.trim());
void _onChanged({bool debounce = true}) {
final design = widget.viewModel.design.rebuild((b) => b
..name = _nameController.text.trim()
..design.replace(BuiltMap<String, String>({
kDesignHeader: _headerController.text.trim(),
kDesignBody: _bodyController.text.trim(),
kDesignFooter: _footerController.text.trim(),
kDesignProducts: _productsController.text.trim(),
kDesignTasks: _tasksController.text.trim() ?? '',
kDesignIncludes: _includesController.text.trim()
})));

if (design != widget.viewModel.design) {
widget.viewModel.onChanged(design);
}

_debouncer.run(() {
final design = widget.viewModel.design.rebuild((b) => b
..design.replace(BuiltMap<String, String>({
kDesignHeader: _headerController.text.trim(),
kDesignBody: _bodyController.text.trim(),
kDesignFooter: _footerController.text.trim(),
kDesignProducts: _productsController.text.trim(),
kDesignTasks: _tasksController.text.trim() ?? '',
kDesignIncludes: _includesController.text.trim()
})));

if (design != widget.viewModel.design) {
if (debounce) {
_debouncer.run(() {
widget.viewModel.onChanged(design);
_loadPreview(context, design);
});
} else {
widget.viewModel.onChanged(design);
_loadPreview(context, design);
}
});
}
}

void _onHtmlChanged() {
Expand All @@ -178,7 +177,7 @@ class _DesignEditState extends State<DesignEdit>

_controllers.forEach((controller) => controller.addListener(_onChanged));

_onChanged();
_onChanged(debounce: false);
}

void _loadPreview(BuildContext context, DesignEntity design) async {
Expand Down
4 changes: 3 additions & 1 deletion lib/ui/design/edit/design_edit_vm.dart
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,9 @@ class DesignEditScreen extends StatelessWidget {
builder: (context, viewModel) {
return DesignEdit(
viewModel: viewModel,
key: ValueKey(viewModel.design.updatedAt),
// TODO this was commented out to prevent crashing on Windows
// after creating a new design
// key: ValueKey(viewModel.design.updatedAt),
);
},
);
Expand Down
2 changes: 1 addition & 1 deletion lib/ui/invoice/invoice_pdf.dart
Original file line number Diff line number Diff line change
Expand Up @@ -279,7 +279,7 @@ class _InvoicePdfViewState extends State<InvoicePdfView> {
launch(invoice.invitationDownloadLink);
} else {
final directory =
await getExternalStorageDirectory();
await getApplicationDocumentsDirectory();
final filePath =
'${directory.path}/${invoice.invoiceId}.pdf';
final pdfData = file.File(filePath);
Expand Down
9 changes: 9 additions & 0 deletions lib/ui/invoice/view/invoice_view_overview.dart
Original file line number Diff line number Diff line change
Expand Up @@ -254,6 +254,15 @@ class InvoiceOverview extends StatelessWidget {
entity: relatedInvoice,
));
}
} else {
final relatedInvoice =
memoizedInvoiceQuoteSelector(invoice, state.quoteState.map);
if (relatedInvoice != null) {
widgets.add(EntityListTile(
isFilter: isFilter,
entity: relatedInvoice,
));
}
}

if (paymentMap.isNotEmpty) {
Expand Down
3 changes: 1 addition & 2 deletions lib/ui/recurring_invoice/recurring_invoice_presenter.dart
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@ class RecurringInvoicePresenter extends EntityPresenter {
return [
RecurringInvoiceFields.status,
RecurringInvoiceFields.number,
RecurringInvoiceFields.invoiceNumber,
RecurringInvoiceFields.client,
RecurringInvoiceFields.amount,
RecurringInvoiceFields.remainingCycles,
Expand Down Expand Up @@ -57,7 +56,7 @@ class RecurringInvoicePresenter extends EntityPresenter {
switch (field) {
case RecurringInvoiceFields.status:
return EntityStatusChip(entity: invoice);
case RecurringInvoiceFields.invoiceNumber:
case RecurringInvoiceFields.number:
return Text((invoice.number ?? '').isEmpty
? localization.pending
: invoice.number);
Expand Down
2 changes: 1 addition & 1 deletion lib/ui/reports/client_report.dart
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@ ReportResult clientReport(
final List<List<ReportElement>> data = [];
BuiltList<ClientReportFields> columns;

final reportSettings = userCompany.settings.reportSettings;
final reportSettings = userCompany.settings?.reportSettings;
final clientReportSettings =
reportSettings != null && reportSettings.containsKey(kReportClient)
? reportSettings[kReportClient]
Expand Down
2 changes: 1 addition & 1 deletion lib/ui/reports/contact_report.dart
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ ReportResult contactReport(
final List<List<ReportElement>> data = [];
BuiltList<ContactReportFields> columns;

final reportSettings = userCompany.settings.reportSettings;
final reportSettings = userCompany.settings?.reportSettings;
final clientReportSettings =
reportSettings != null && reportSettings.containsKey(kReportClient)
? reportSettings[kReportClient]
Expand Down
2 changes: 1 addition & 1 deletion lib/ui/reports/credit_report.dart
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ ReportResult creditReport(
final List<List<ReportElement>> data = [];
BuiltList<CreditReportFields> columns;

final reportSettings = userCompany.settings.reportSettings;
final reportSettings = userCompany.settings?.reportSettings;
final creditReportSettings =
reportSettings != null && reportSettings.containsKey(kReportCredit)
? reportSettings[kReportCredit]
Expand Down
2 changes: 1 addition & 1 deletion lib/ui/reports/document_report.dart
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ ReportResult documentReport(

final localization =
AppLocalization(AppLocalization.createLocale(Intl.defaultLocale));
final reportSettings = userCompany.settings.reportSettings;
final reportSettings = userCompany.settings?.reportSettings;
final documentReportSettings =
reportSettings != null && reportSettings.containsKey(kReportDocument)
? reportSettings[kReportDocument]
Expand Down
2 changes: 1 addition & 1 deletion lib/ui/reports/expense_report.dart
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ ReportResult expenseReport(
final List<List<ReportElement>> data = [];
BuiltList<ExpenseReportFields> columns;

final reportSettings = userCompany.settings.reportSettings;
final reportSettings = userCompany.settings?.reportSettings;
final expenseReportSettings =
reportSettings != null && reportSettings.containsKey(kReportExpense)
? reportSettings[kReportExpense]
Expand Down
2 changes: 1 addition & 1 deletion lib/ui/reports/invoice_item_report.dart
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ ReportResult lineItemReport(
final List<List<ReportElement>> data = [];
BuiltList<InvoiceItemReportFields> columns;

final reportSettings = userCompany.settings.reportSettings;
final reportSettings = userCompany.settings?.reportSettings;
final lineItemReportSettings =
reportSettings != null && reportSettings.containsKey(kReportInvoiceItem)
? reportSettings[kReportInvoiceItem]
Expand Down
2 changes: 1 addition & 1 deletion lib/ui/reports/invoice_report.dart
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,7 @@ ReportResult invoiceReport(
final List<List<ReportElement>> data = [];
BuiltList<InvoiceReportFields> columns;

final reportSettings = userCompany.settings.reportSettings;
final reportSettings = userCompany.settings?.reportSettings;
final invoiceReportSettings =
reportSettings != null && reportSettings.containsKey(kReportInvoice)
? reportSettings[kReportInvoice]
Expand Down
2 changes: 1 addition & 1 deletion lib/ui/reports/invoice_tax_report.dart
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ ReportResult taxReport(
final List<List<ReportElement>> data = [];
BuiltList<TaxRateReportFields> columns;

final reportSettings = userCompany.settings.reportSettings;
final reportSettings = userCompany.settings?.reportSettings;
final taxRateReportSettings =
reportSettings != null && reportSettings.containsKey(kReportInvoiceTax)
? reportSettings[kReportInvoiceTax]
Expand Down
2 changes: 1 addition & 1 deletion lib/ui/reports/payment_report.dart
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ ReportResult paymentReport(
final List<List<ReportElement>> data = [];
BuiltList<PaymentReportFields> columns;

final reportSettings = userCompany.settings.reportSettings;
final reportSettings = userCompany.settings?.reportSettings;
final paymentReportSettings =
reportSettings != null && reportSettings.containsKey(kReportPayment)
? reportSettings[kReportPayment]
Expand Down
2 changes: 1 addition & 1 deletion lib/ui/reports/payment_tax_report.dart
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ ReportResult paymentTaxReport(
final List<List<ReportElement>> data = [];
BuiltList<TaxRateReportFields> columns;

final reportSettings = userCompany.settings.reportSettings;
final reportSettings = userCompany.settings?.reportSettings;
final taxRateReportSettings =
reportSettings != null && reportSettings.containsKey(kReportPaymentTax)
? reportSettings[kReportPaymentTax]
Expand Down
2 changes: 1 addition & 1 deletion lib/ui/reports/product_report.dart
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ ReportResult productReport(
final List<List<ReportElement>> data = [];
BuiltList<ProductReportFields> columns;

final reportSettings = userCompany.settings.reportSettings;
final reportSettings = userCompany.settings?.reportSettings;
final productReportSettings =
reportSettings != null && reportSettings.containsKey(kReportProduct)
? reportSettings[kReportProduct]
Expand Down
Loading

0 comments on commit db4bba3

Please sign in to comment.