diff --git a/lib/data/models/company_model.dart b/lib/data/models/company_model.dart index 8234d2c9b..a95422af9 100644 --- a/lib/data/models/company_model.dart +++ b/lib/data/models/company_model.dart @@ -544,7 +544,7 @@ abstract class CompanyEntity extends Object FormatNumberType get listDisplayAmountType => null; @override - String get listDisplayName => null; + String get listDisplayName => settings?.name ?? ''; bool hasCustomField(String field) => getCustomFieldLabel(field).isNotEmpty; diff --git a/lib/data/models/document_model.dart b/lib/data/models/document_model.dart index 59527bf85..e9d2a1ad1 100644 --- a/lib/data/models/document_model.dart +++ b/lib/data/models/document_model.dart @@ -56,6 +56,7 @@ class DocumentFields { static const String width = 'width'; static const String height = 'height'; static const String hash = 'hash'; + static const String linkedTo = 'linked_to'; } abstract class DocumentEntity extends Object diff --git a/lib/redux/app/app_state.dart b/lib/redux/app/app_state.dart index 78c63fa92..8dc6124a9 100644 --- a/lib/redux/app/app_state.dart +++ b/lib/redux/app/app_state.dart @@ -293,22 +293,16 @@ abstract class AppState implements Built { // STARTER: states switch map - do not remove comment case EntityType.schedule: return scheduleState.map; - case EntityType.transactionRule: return transactionRuleState.map; - case EntityType.transaction: return transactionState.map; - case EntityType.bankAccount: return bankAccountState.map; - case EntityType.purchaseOrder: return purchaseOrderState.map; - case EntityType.recurringExpense: return recurringExpenseState.map; - case EntityType.subscription: return subscriptionState.map; case EntityType.taskStatus: @@ -367,6 +361,12 @@ abstract class AppState implements Built { return staticState.dateFormatMap; case EntityType.timezone: return staticState.timezoneMap; + case EntityType.company: + return BuiltMap(Map.fromIterable( + companies, + key: (dynamic item) => item.id, + value: (dynamic item) => item, + )); case EntityType.dashboard: case EntityType.reports: case EntityType.settings: diff --git a/lib/redux/document/document_reducer.dart b/lib/redux/document/document_reducer.dart index 135d59f27..26450b13b 100644 --- a/lib/redux/document/document_reducer.dart +++ b/lib/redux/document/document_reducer.dart @@ -242,6 +242,110 @@ DocumentState _setLoadedCompany( ..parentType = EntityType.company)); }); + company.clients.forEach((client) { + client.documents.forEach((document) { + documents.add(document.rebuild((b) => b + ..parentId = client.id + ..parentType = EntityType.client)); + }); + }); + + company.credits.forEach((credit) { + credit.documents.forEach((document) { + documents.add(document.rebuild((b) => b + ..parentId = credit.id + ..parentType = EntityType.credit)); + }); + }); + + company.expenses.forEach((expense) { + expense.documents.forEach((document) { + documents.add(document.rebuild((b) => b + ..parentId = expense.id + ..parentType = EntityType.expense)); + }); + }); + + company.groups.forEach((group) { + group.documents.forEach((document) { + documents.add(document.rebuild((b) => b + ..parentId = group.id + ..parentType = EntityType.group)); + }); + }); + + company.invoices.forEach((invoice) { + invoice.documents.forEach((document) { + documents.add(document.rebuild((b) => b + ..parentId = invoice.id + ..parentType = EntityType.invoice)); + }); + }); + + company.products.forEach((product) { + product.documents.forEach((document) { + documents.add(document.rebuild((b) => b + ..parentId = product.id + ..parentType = EntityType.product)); + }); + }); + + company.projects.forEach((project) { + project.documents.forEach((document) { + documents.add(document.rebuild((b) => b + ..parentId = project.id + ..parentType = EntityType.project)); + }); + }); + + company.purchaseOrders.forEach((purchaseOrder) { + purchaseOrder.documents.forEach((document) { + documents.add(document.rebuild((b) => b + ..parentId = purchaseOrder.id + ..parentType = EntityType.purchaseOrder)); + }); + }); + + company.quotes.forEach((quote) { + quote.documents.forEach((document) { + documents.add(document.rebuild((b) => b + ..parentId = quote.id + ..parentType = EntityType.quote)); + }); + }); + + company.recurringExpenses.forEach((recurringExpense) { + recurringExpense.documents.forEach((document) { + documents.add(document.rebuild((b) => b + ..parentId = recurringExpense.id + ..parentType = EntityType.recurringExpense)); + }); + }); + + company.recurringInvoices.forEach((recurringInvoice) { + recurringInvoice.documents.forEach((document) { + documents.add(document.rebuild((b) => b + ..parentId = recurringInvoice.id + ..parentType = EntityType.recurringInvoice)); + }); + }); + + company.tasks.forEach((task) { + task.documents.forEach((document) { + documents.add(document.rebuild((b) => b + ..parentId = task.id + ..parentType = EntityType.task)); + }); + }); + + company.vendors.forEach((vendor) { + vendor.documents.forEach((document) { + documents.add(document.rebuild((b) => b + ..parentId = vendor.id + ..parentType = EntityType.vendor)); + }); + }); + final state = documentState.rebuild((b) => b ..map.addAll(Map.fromIterable( documents, diff --git a/lib/redux/recurring_expense/recurring_expense_middleware.dart b/lib/redux/recurring_expense/recurring_expense_middleware.dart index ac83a26a6..8bdb6def1 100644 --- a/lib/redux/recurring_expense/recurring_expense_middleware.dart +++ b/lib/redux/recurring_expense/recurring_expense_middleware.dart @@ -339,7 +339,7 @@ Middleware _saveDocument(RecurringExpenseRepository repository) { expense.documents.forEach((document) { documents.add(document.rebuild((b) => b ..parentId = expense.id - ..parentType = EntityType.expense)); + ..parentType = EntityType.recurringExpense)); }); store.dispatch(LoadDocumentsSuccess(documents)); diff --git a/lib/redux/recurring_invoice/recurring_invoice_middleware.dart b/lib/redux/recurring_invoice/recurring_invoice_middleware.dart index e6ed14a6b..c570e0643 100644 --- a/lib/redux/recurring_invoice/recurring_invoice_middleware.dart +++ b/lib/redux/recurring_invoice/recurring_invoice_middleware.dart @@ -461,7 +461,7 @@ Middleware _saveDocument(RecurringInvoiceRepository repository) { invoice.documents.forEach((document) { documents.add(document.rebuild((b) => b ..parentId = invoice.id - ..parentType = EntityType.invoice)); + ..parentType = EntityType.recurringInvoice)); }); store.dispatch(LoadDocumentsSuccess(documents)); diff --git a/lib/redux/settings/settings_middleware.dart b/lib/redux/settings/settings_middleware.dart index b8855a7a4..d922306c6 100644 --- a/lib/redux/settings/settings_middleware.dart +++ b/lib/redux/settings/settings_middleware.dart @@ -387,7 +387,7 @@ Middleware _saveDocument(SettingsRepository repository) { company.documents.forEach((document) { documents.add(document.rebuild((b) => b ..parentId = company.id - ..parentType = EntityType.document)); + ..parentType = EntityType.company)); }); store.dispatch(LoadDocumentsSuccess(documents)); diff --git a/lib/ui/document/document_presenter.dart b/lib/ui/document/document_presenter.dart index d60c4161d..00e3d45b8 100644 --- a/lib/ui/document/document_presenter.dart +++ b/lib/ui/document/document_presenter.dart @@ -1,8 +1,11 @@ // Flutter imports: import 'package:flutter/material.dart'; +import 'package:flutter_redux/flutter_redux.dart'; // Project imports: import 'package:invoiceninja_flutter/data/models/models.dart'; +import 'package:invoiceninja_flutter/redux/app/app_state.dart'; +import 'package:invoiceninja_flutter/ui/app/link_text.dart'; import 'package:invoiceninja_flutter/ui/app/presenters/entity_presenter.dart'; class DocumentPresenter extends EntityPresenter { @@ -10,6 +13,7 @@ class DocumentPresenter extends EntityPresenter { return [ DocumentFields.name, DocumentFields.type, + DocumentFields.linkedTo, DocumentFields.size, DocumentFields.width, DocumentFields.height, @@ -30,6 +34,8 @@ class DocumentPresenter extends EntityPresenter { @override Widget getField({String field, BuildContext context}) { + final store = StoreProvider.of(context); + final state = store.state; final document = entity as DocumentEntity; switch (field) { @@ -47,6 +53,12 @@ class DocumentPresenter extends EntityPresenter { return Text(document.id); case DocumentFields.hash: return Text(document.hash); + case DocumentFields.linkedTo: + final parentEntity = + state.getEntity(document.parentType, document.parentId); + print( + '## ${document.parentType} ${document.parentId} => $parentEntity'); + return LinkTextRelatedEntity(entity: parentEntity, relation: document); } return super.getField(field: field, context: context); diff --git a/lib/utils/i18n.dart b/lib/utils/i18n.dart index 4712cb9d2..88bfaa837 100644 --- a/lib/utils/i18n.dart +++ b/lib/utils/i18n.dart @@ -18,6 +18,7 @@ mixin LocalizationsProvider on LocaleCodeAware { static final Map> _localizedValues = { 'en': { // STARTER: lang key - do not remove comment + 'linked_to': 'Linked To', 'file_saved_in_path': 'The file has been saved in :path', 'unlinked_transactions': 'Successfully unlinked :count transactions', 'unlinked_transaction': 'Successfully unlinked transaction', @@ -108942,6 +108943,11 @@ mixin LocalizationsProvider on LocaleCodeAware { _localizedValues[localeCode]['file_saved_in_path'] ?? _localizedValues['en']['file_saved_in_path']; + String get linkedTo => + _localizedValues[localeCode]['linked_to'] ?? + _localizedValues['en']['linked_to']; + + // STARTER: lang field - do not remove comment String lookup(String key) {