mirror of
https://github.com/bigcapitalhq/bigcapital.git
synced 2026-02-17 21:30:31 +00:00
feat: universal search.
This commit is contained in:
131
client/src/hooks/query/GenericResource/index.js
Normal file
131
client/src/hooks/query/GenericResource/index.js
Normal file
@@ -0,0 +1,131 @@
|
||||
import { useRequestQuery } from '../../useQueryRequest';
|
||||
import { RESOURCES_TYPES } from 'common/resourcesTypes';
|
||||
|
||||
/**
|
||||
*
|
||||
* @param {string} type
|
||||
* @param {string} searchKeyword
|
||||
* @param {*} query
|
||||
* @returns
|
||||
*/
|
||||
export function useResourceData(type, query, props) {
|
||||
const url = getResourceUrlFromType(type);
|
||||
|
||||
return useRequestQuery(
|
||||
['UNIVERSAL_SEARCH', type, query],
|
||||
{ method: 'get', url, params: query },
|
||||
{
|
||||
select: transformResourceData(type),
|
||||
defaultData: {
|
||||
items: [],
|
||||
},
|
||||
...props,
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve the resource url by the given resource type.
|
||||
* @param {string} type
|
||||
* @returns {string}
|
||||
*/
|
||||
function getResourceUrlFromType(type) {
|
||||
const config = {
|
||||
[RESOURCES_TYPES.INVOICE]: '/sales/invoices',
|
||||
[RESOURCES_TYPES.ESTIMATE]: '/sales/estimates',
|
||||
[RESOURCES_TYPES.ITEM]: '/items',
|
||||
[RESOURCES_TYPES.RECEIPT]: '/sales/receipts',
|
||||
[RESOURCES_TYPES.BILL]: '/purchases/bills',
|
||||
[RESOURCES_TYPES.PAYMENT_RECEIVE]: '/sales/payment_receives',
|
||||
[RESOURCES_TYPES.PAYMENT_MADE]: '/purchases/bill_payments',
|
||||
[RESOURCES_TYPES.CUSTOMER]: '/customers',
|
||||
[RESOURCES_TYPES.VENDOR]: '/vendors',
|
||||
[RESOURCES_TYPES.MANUAL_JOURNAL]: '/manual-journals',
|
||||
[RESOURCES_TYPES.ACCOUNT]: '/accounts',
|
||||
};
|
||||
return config[type] || '';
|
||||
}
|
||||
|
||||
/**
|
||||
* Transformes invoices to resource data.
|
||||
*/
|
||||
const transformInvoices = (response) => ({
|
||||
items: response.data.sales_invoices,
|
||||
});
|
||||
|
||||
/**
|
||||
* Transformes items to resource data.
|
||||
*/
|
||||
const transformItems = (response) => ({
|
||||
items: response.data.items,
|
||||
});
|
||||
|
||||
/**
|
||||
* Transformes payment receives to resource data.
|
||||
*/
|
||||
const transformPaymentReceives = (response) => ({
|
||||
items: response.data.payment_receives,
|
||||
});
|
||||
|
||||
/**
|
||||
* Transformes customers to resoruce data.
|
||||
*/
|
||||
const transformCustomers = (response) => ({
|
||||
items: response.data.customers,
|
||||
});
|
||||
|
||||
/**
|
||||
* Transformes customers to resoruce data.
|
||||
*/
|
||||
const transformVendors = (response) => ({
|
||||
items: response.data.vendors,
|
||||
});
|
||||
|
||||
|
||||
const transformPaymentMades = (response) => ({
|
||||
items: response.data.bill_payments,
|
||||
});
|
||||
|
||||
const transformSaleReceipts = (response) => ({
|
||||
items: response.data.data,
|
||||
});
|
||||
|
||||
const transformBills = (response) => ({
|
||||
items: response.data.bills,
|
||||
});
|
||||
|
||||
const transformManualJournals = (response) => ({
|
||||
items: response.data.manual_journals,
|
||||
});
|
||||
|
||||
const transformsEstimates = (response) => ({
|
||||
items: response.data.sales_estimates,
|
||||
});
|
||||
|
||||
const transformAccounts = (response) => ({
|
||||
items: response.data.accounts,
|
||||
})
|
||||
|
||||
/**
|
||||
* Detarmines the transformer based on the given resource type.
|
||||
* @param {string} type - Resource type.
|
||||
*/
|
||||
const transformResourceData = (type) => (response) => {
|
||||
const pairs = {
|
||||
[RESOURCES_TYPES.ESTIMATE]: transformsEstimates,
|
||||
[RESOURCES_TYPES.INVOICE]: transformInvoices,
|
||||
[RESOURCES_TYPES.RECEIPT]: transformSaleReceipts,
|
||||
[RESOURCES_TYPES.ITEM]: transformItems,
|
||||
[RESOURCES_TYPES.PAYMENT_RECEIVE]: transformPaymentReceives,
|
||||
[RESOURCES_TYPES.PAYMENT_MADE]: transformPaymentMades,
|
||||
[RESOURCES_TYPES.CUSTOMER]: transformCustomers,
|
||||
[RESOURCES_TYPES.VENDOR]: transformVendors,
|
||||
[RESOURCES_TYPES.BILL]: transformBills,
|
||||
[RESOURCES_TYPES.MANUAL_JOURNAL]: transformManualJournals,
|
||||
[RESOURCES_TYPES.ACCOUNT]: transformAccounts
|
||||
};
|
||||
return {
|
||||
...pairs[type](response),
|
||||
_type: type,
|
||||
};
|
||||
};
|
||||
41
client/src/hooks/query/UniversalSearch/UniversalSearch.js
Normal file
41
client/src/hooks/query/UniversalSearch/UniversalSearch.js
Normal file
@@ -0,0 +1,41 @@
|
||||
import { getUniversalSearchBind } from '../../../containers/UniversalSearch/utils';
|
||||
import { useResourceData } from '../GenericResource';
|
||||
|
||||
/**
|
||||
* Transformes the resource data to search entries based on
|
||||
* the given resource type.
|
||||
* @param {string} type
|
||||
* @param {any} resource
|
||||
* @returns
|
||||
*/
|
||||
function transfromResourceDataToSearch(resource) {
|
||||
const selectItem = getUniversalSearchBind(resource._type, 'itemSelect');
|
||||
|
||||
return resource.items
|
||||
.map((item) => ({
|
||||
...selectItem ? selectItem(item) : {},
|
||||
_type: resource._type,
|
||||
}));
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param {*} type
|
||||
* @param {*} searchKeyword
|
||||
* @returns
|
||||
*/
|
||||
export function useUniversalSearch(type, searchKeyword, props) {
|
||||
const { data, ...restProps } = useResourceData(
|
||||
type,
|
||||
{
|
||||
search_keyword: searchKeyword,
|
||||
},
|
||||
props,
|
||||
);
|
||||
const searchData = transfromResourceDataToSearch(data);
|
||||
|
||||
return {
|
||||
data: searchData,
|
||||
...restProps,
|
||||
};
|
||||
}
|
||||
@@ -24,3 +24,5 @@ export * from './contacts';
|
||||
export * from './subscriptions';
|
||||
export * from './organization';
|
||||
export * from './landedCost';
|
||||
export * from './UniversalSearch/UniversalSearch';
|
||||
export * from './GenericResource';
|
||||
|
||||
@@ -99,7 +99,7 @@ export function useCloseReceipt(props) {
|
||||
}
|
||||
|
||||
const transformReceipts = (res) => ({
|
||||
receipts: res.data.sale_receipts,
|
||||
receipts: res.data.data,
|
||||
pagination: transformPagination(res.data.pagination),
|
||||
filterMeta: res.data.filter_meta,
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user