openreplay/frontend/app/utils/search.ts
2023-04-25 18:30:47 +02:00

134 lines
3.7 KiB
TypeScript

import { getFilterKeyTypeByKey, setQueryParamKeyFromFilterkey } from 'Types/filter/filterType';
import Period, { CUSTOM_RANGE } from 'Types/app/period';
import Filter from 'Types/filter/filter';
import { filtersMap } from 'Types/filter/newFilter';
type QueryItem = {
key: any;
value: string;
};
export const createUrlQuery = (filter: { filters: any[]; rangeValue: string; startDate?: string; endDate?: string }) => {
const query: QueryItem[] = [];
filter.filters.forEach((f: any) => {
if (!f.value.length) {
return;
}
let str = `${f.operator}|${f.value.join('|')}`;
if (f.hasSource) {
const sourceOperator = f.sourceOperator || '';
const source = f.source ? f.source.join('|') : '';
str = `${str}^${sourceOperator}|${source}`;
}
let key: any = setQueryParamKeyFromFilterkey(f.key);
if (!key) {
key = [f.key];
}
query.push({ key, value: str });
});
if (query.length > 0) {
query.push({ key: 'range', value: filter.rangeValue });
if (filter.rangeValue === CUSTOM_RANGE) {
query.push({ key: 'rStart', value: filter.startDate! });
query.push({ key: 'rEnd', value: filter.endDate! });
}
}
return query.map(({ key, value }) => `${key}=${value}`).join('&');
};
export const getFiltersFromQuery = (search: string, filter: any) => {
if (!search || filter.filters.size > 0) {
return;
}
const entires = getQueryObject(search);
const period: any = getPeriodFromEntries(entires);
const filters = getFiltersFromEntries(entires);
return Filter({ filters, rangeValue: period.rangeName });
};
const getFiltersFromEntries = (entires: any) => {
const _filters: any = { ...filtersMap };
const filters: any = [];
if (entires.length > 0) {
entires.forEach((item: any) => {
if (!item.key || !item.value) {
return;
}
let filter: any = {};
const filterKey = getFilterKeyTypeByKey(item.key);
const tmp = item.value.split('^');
const valueArr = tmp[0].split('|');
const operator = valueArr.shift();
const sourceArr = tmp[1] ? tmp[1].split('|') : [];
const sourceOperator = sourceArr.shift();
if (filterKey) {
filter.type = filterKey;
filter.key = filterKey;
} else {
filter = _filters[item.key];
if (!!filter) {
filter.type = filter.key;
filter.key = filter.key;
}
}
if (!filter) {
return;
}
filter.value = valueArr;
filter.operator = operator;
if (filter.icon === 'filters/metadata') {
filter.source = filter.type;
filter.type = 'MULTIPLE';
} else {
filter.source = sourceArr && sourceArr.length > 0 ? sourceArr : null;
filter.sourceOperator = !!sourceOperator ? decodeURI(sourceOperator) : null;
}
if (!filter.filters || filter.filters.size === 0) {
// TODO support subfilters in url
filters.push(filter);
}
});
}
return filters;
};
const getPeriodFromEntries = (entires: any) => {
const rangeFilter = entires.find(({ key }: any) => key === 'range');
if (!rangeFilter) {
return Period();
}
if (rangeFilter.value === CUSTOM_RANGE) {
const start = entires.find(({ key }: any) => key === 'rStart').value;
const end = entires.find(({ key }: any) => key === 'rEnd').value;
return Period({ rangeName: rangeFilter.value, start, end });
}
return Period({ rangeName: rangeFilter.value });
};
function getQueryObject(search: any) {
let jsonArray = search
.slice(1)
.split('&')
.map((item: any) => {
let [key, value] = item.split('=');
key = key.replace('[]', '');
return { key: key, value: decodeURI(value) };
});
return jsonArray;
}