2019-08-13 16:41:15 +02:00

78 lines
1.7 KiB
JavaScript

import { isEmpty, toString } from 'lodash';
/**
* Generate filters object from string
* @param {String} search
* @return {Object}
*/
const generateFiltersFromSearch = search => {
return search
.split('&')
.filter(
x =>
!x.includes('_limit') &&
!x.includes('_page') &&
!x.includes('_sort') &&
!x.includes('source') &&
!x.includes('_q=')
)
.reduce((acc, curr) => {
const [name, value] = curr.split('=');
const split = name.split('_');
let filter = `_${split[split.length - 1]}`;
if (
![
'_ne',
'_lt',
'_lte',
'_gt',
'_gte',
'_contains',
'_containss',
'_in',
'_nin',
].includes(filter)
) {
filter = '=';
}
const toSlice = filter === '=' ? split.length : split.length - 1;
acc.push({
name: split
.slice(0, toSlice)
.join('_')
.replace('?', ''),
filter,
value: decodeURIComponent(value),
});
return acc;
}, []);
};
const generateSearchFromFilters = filters => {
return Object.keys(filters)
.filter(key => !isEmpty(toString(filters[key])))
.map(key => {
let ret = `${key}=${filters[key]}`;
if (key === 'filters') {
const formattedFilters = filters[key]
.reduce((acc, curr) => {
const key =
curr.filter === '=' ? curr.name : `${curr.name}${curr.filter}`;
acc.push(`${key}=${curr.value}`);
return acc;
}, [])
.join('&');
ret = formattedFilters;
}
return ret;
})
.join('&');
};
export { generateFiltersFromSearch, generateSearchFromFilters };