From 5defb5a279fd4bb06fce52154fa043a071ce3005 Mon Sep 17 00:00:00 2001 From: "a.bouhuolia" Date: Sat, 25 Dec 2021 18:52:46 +0200 Subject: [PATCH] feat: credit note and vendor credit universal search. --- .../VendorCreditIUniversalSearchBind.js | 121 ++++++++++++++++++ .../CreditNotes/CreditNoteUniversalSearch.js | 119 +++++++++++++++++ .../DashboardUniversalSearchBinds.js | 4 + src/hooks/query/GenericResource/index.js | 19 ++- 4 files changed, 259 insertions(+), 4 deletions(-) create mode 100644 src/containers/Purchases/CreditNotes/VendorCreditIUniversalSearchBind.js create mode 100644 src/containers/Sales/CreditNotes/CreditNoteUniversalSearch.js diff --git a/src/containers/Purchases/CreditNotes/VendorCreditIUniversalSearchBind.js b/src/containers/Purchases/CreditNotes/VendorCreditIUniversalSearchBind.js new file mode 100644 index 000000000..2bea3e560 --- /dev/null +++ b/src/containers/Purchases/CreditNotes/VendorCreditIUniversalSearchBind.js @@ -0,0 +1,121 @@ +import React from 'react'; +import { MenuItem, Intent } from '@blueprintjs/core'; + +import { TextStatus, Icon, Choose, T } from 'components'; + +import { RESOURCES_TYPES } from '../../../common/resourcesTypes'; +import withDrawerActions from '../../Drawer/withDrawerActions'; +import { + AbilitySubject, + VendorCreditAction, +} from '../../../common/abilityOption'; +import { DRAWERS } from 'common/drawers'; + +/** + * Vendor credit universal search item select action. + */ +function VendorCreditUniversalSearchSelectComponent({ + // #ownProps + resourceType, + resourceId, + onAction, + + // #withDrawerActions + openDrawer, +}) { + if (resourceType === RESOURCES_TYPES.VENDOR_CREDIT) { + openDrawer(DRAWERS.VENDOR_CREDIT_DETAIL_DRAWER, { + vendorCreditId: resourceId, + }); + onAction && onAction(); + } + return null; +} + +export const VendorCreditUniversalSearchSelect = withDrawerActions( + VendorCreditUniversalSearchSelectComponent, +); + +/** + * Status accessor. + */ +function VendorCreditUniversalSearchStatus({ receipt }) { + return ( + + + + + + + + + + + + + + + + + + + + ); +} + +/** + * Credit note universal search item. + */ +export function VendorCreditUniversalSearchItem( + item, + { handleClick, modifiers, query }, +) { + return ( + +
{item.text}
+ + {item.reference.vendor_credit_number}{' '} + + {item.reference.formatted_vendor_credit_date} + + + } + label={ + <> +
${item.reference.amount}
+ + + } + onClick={handleClick} + className={'universal-search__item--receipt'} + /> + ); +} + +/** + * Transformes receipt resource item to search item. + */ +const transformVendorCreditsToSearch = (vendorCredit) => ({ + id: vendorCredit.id, + text: vendorCredit.vendor.display_name, + label: vendorCredit.formatted_amount, + reference: vendorCredit, +}); + +/** + * Credit note universal search bind configuration. + */ +export const universalSearchVendorCreditBind = () => ({ + resourceType: RESOURCES_TYPES.VENDOR_CREDIT, + optionItemLabel: 'Vendor credits', + selectItemAction: VendorCreditUniversalSearchSelect, + itemRenderer: VendorCreditUniversalSearchItem, + itemSelect: transformVendorCreditsToSearch, + permission: { + ability: VendorCreditAction.View, + subject: AbilitySubject.VendorCredit, + }, +}); diff --git a/src/containers/Sales/CreditNotes/CreditNoteUniversalSearch.js b/src/containers/Sales/CreditNotes/CreditNoteUniversalSearch.js new file mode 100644 index 000000000..314a45fba --- /dev/null +++ b/src/containers/Sales/CreditNotes/CreditNoteUniversalSearch.js @@ -0,0 +1,119 @@ +import React from 'react'; +import { MenuItem, Intent } from '@blueprintjs/core'; + +import { Icon, Choose, T, TextStatus } from 'components'; + +import { RESOURCES_TYPES } from '../../../common/resourcesTypes'; +import withDrawerActions from '../../Drawer/withDrawerActions'; +import { + AbilitySubject, + CreditNoteAction, +} from '../../../common/abilityOption'; +import { DRAWERS } from 'common/drawers'; + +/** + * Credit note universal search item select action. + */ +function CreditNoteUniversalSearchSelectComponent({ + // #ownProps + resourceType, + resourceId, + onAction, + + // #withDrawerActions + openDrawer, +}) { + if (resourceType === RESOURCES_TYPES.CREDIT_NOTE) { + openDrawer(DRAWERS.CREDIT_NOTE_DETAIL_DRAWER, { creditNoteId: resourceId }); + onAction && onAction(); + } + return null; +} + +export const CreditNoteUniversalSearchSelect = withDrawerActions( + CreditNoteUniversalSearchSelectComponent, +); + +/** + * Status accessor. + */ +function CreditNoteUniversalSearchStatus({ receipt }) { + return ( + + + + + + + + + + + + + + + + + + + + ); +} + +/** + * Credit note universal search item. + */ +export function CreditNoteUniversalSearchItem( + item, + { handleClick, modifiers, query }, +) { + return ( + +
{item.text}
+ + {item.reference.credit_note_number}{' '} + + {item.reference.formatted_credit_note_date} + + + } + label={ + <> +
${item.reference.amount}
+ + + } + onClick={handleClick} + className={'universal-search__item--receipt'} + /> + ); +} + +/** + * Transformes receipt resource item to search item. + */ +const transformReceiptsToSearch = (creditNote) => ({ + id: creditNote.id, + text: creditNote.customer.display_name, + label: creditNote.formatted_amount, + reference: creditNote, +}); + +/** + * Credit note universal search bind configuration. + */ +export const universalSearchCreditNoteBind = () => ({ + resourceType: RESOURCES_TYPES.CREDIT_NOTE, + optionItemLabel: 'Credit notes', + selectItemAction: CreditNoteUniversalSearchSelect, + itemRenderer: CreditNoteUniversalSearchItem, + itemSelect: transformReceiptsToSearch, + permission: { + ability: CreditNoteAction.View, + subject: AbilitySubject.CreditNote, + }, +}); diff --git a/src/containers/UniversalSearch/DashboardUniversalSearchBinds.js b/src/containers/UniversalSearch/DashboardUniversalSearchBinds.js index ef28e4dd1..2de45627f 100644 --- a/src/containers/UniversalSearch/DashboardUniversalSearchBinds.js +++ b/src/containers/UniversalSearch/DashboardUniversalSearchBinds.js @@ -9,6 +9,8 @@ import { universalSearchCustomerBind } from '../Customers/CustomersUniversalSear import { universalSearchJournalBind } from '../Accounting/ManualJournalUniversalSearch'; import { universalSearchAccountBind } from '../Accounts/AccountUniversalSearch'; import { universalSearchVendorBind } from '../Vendors/VendorsUniversalSearch'; +import { universalSearchCreditNoteBind } from '../Sales/CreditNotes/CreditNoteUniversalSearch'; +import { universalSearchVendorCreditBind } from '../Purchases/CreditNotes/VendorCreditIUniversalSearchBind'; // Universal search binds. export const universalSearchBinds = [ @@ -23,4 +25,6 @@ export const universalSearchBinds = [ universalSearchCustomerBind, universalSearchVendorBind, universalSearchJournalBind, + universalSearchCreditNoteBind, + universalSearchVendorCreditBind, ]; diff --git a/src/hooks/query/GenericResource/index.js b/src/hooks/query/GenericResource/index.js index 27580ce9f..353d9e436 100644 --- a/src/hooks/query/GenericResource/index.js +++ b/src/hooks/query/GenericResource/index.js @@ -26,7 +26,7 @@ export function useResourceData(type, query, props) { /** * Retrieve the resource url by the given resource type. - * @param {string} type + * @param {string} type * @returns {string} */ function getResourceUrlFromType(type) { @@ -42,6 +42,8 @@ function getResourceUrlFromType(type) { [RESOURCES_TYPES.VENDOR]: '/vendors', [RESOURCES_TYPES.MANUAL_JOURNAL]: '/manual-journals', [RESOURCES_TYPES.ACCOUNT]: '/accounts', + [RESOURCES_TYPES.CREDIT_NOTE]: '/sales/credit_notes', + [RESOURCES_TYPES.VENDOR_CREDIT]: '/purchases/vendor-credit', }; return config[type] || ''; } @@ -81,7 +83,6 @@ const transformVendors = (response) => ({ items: response.data.vendors, }); - const transformPaymentMades = (response) => ({ items: response.data.bill_payments, }); @@ -104,7 +105,15 @@ const transformsEstimates = (response) => ({ const transformAccounts = (response) => ({ items: response.data.accounts, -}) +}); + +const transformCreditNotes = (response) => ({ + items: response.data.credit_notes, +}); + +const transformVendorCredits = (response) => ({ + items: response.data.vendor_credits, +}); /** * Detarmines the transformer based on the given resource type. @@ -122,7 +131,9 @@ const transformResourceData = (type) => (response) => { [RESOURCES_TYPES.VENDOR]: transformVendors, [RESOURCES_TYPES.BILL]: transformBills, [RESOURCES_TYPES.MANUAL_JOURNAL]: transformManualJournals, - [RESOURCES_TYPES.ACCOUNT]: transformAccounts + [RESOURCES_TYPES.ACCOUNT]: transformAccounts, + [RESOURCES_TYPES.CREDIT_NOTE]: transformCreditNotes, + [RESOURCES_TYPES.VENDOR_CREDIT]: transformVendorCredits, }; return { ...pairs[type](response),