openreplay/frontend/app/utils/search.ts
Andrey Babushkin fd5c0c9747
Add lokalisation (#3092)
* applied eslint

* add locales and lint the project

* removed error boundary

* updated locales

* fix min files

* fix locales
2025-03-06 17:43:15 +01:00

227 lines
6.9 KiB
TypeScript

import Period, { CUSTOM_RANGE, LAST_24_HOURS } from 'Types/app/period';
const DEFAULT_SORT = 'startTs';
const DEFAULT_ORDER = 'desc';
const DEFAULT_EVENTS_ORDER = 'then';
class Filter {
key: string;
operator: string;
value?: string[];
filters?: Filter[];
constructor(
key: string,
operator: string,
value?: string[],
filters?: Filter[],
) {
this.key = key;
this.operator = operator;
this.value = value;
this.filters = filters;
}
toJSON(): any {
return {
key: this.key,
operator: this.operator,
value: this.value,
filters: this.filters ? this.filters.map((f) => f.toJSON()) : undefined,
};
}
}
export class InputJson {
filters: Filter[];
rangeValue: string;
startDate?: number;
endDate?: number;
sort: string;
order: string;
eventsOrder: string;
constructor(
filters: Filter[],
rangeValue: string,
sort: string,
order: string,
eventsOrder: string,
startDate?: string | number,
endDate?: string | number,
) {
this.filters = filters;
this.rangeValue = rangeValue;
this.startDate = startDate ? +startDate : undefined;
this.endDate = endDate ? +endDate : undefined;
this.sort = sort;
this.order = order;
this.eventsOrder = eventsOrder;
}
toJSON() {
return {
filters: this.filters.map((f) => f.toJSON()),
rangeValue: this.rangeValue,
startDate: this.startDate ?? null,
endDate: this.endDate ?? null,
sort: this.sort,
order: this.order,
eventsOrder: this.eventsOrder,
};
}
fromJSON(json: Record<string, any>): InputJson {
return new InputJson(
json.filters.map(
(f: any) => new Filter(f.key, f.operator, f.value, f.filters),
),
json.rangeValue,
json.sort,
json.order,
json.eventsOrder,
json.startDate,
json.endDate,
);
}
}
export class JsonUrlConverter {
static keyMap = {
rangeValue: 'rv',
startDate: 'sd',
endDate: 'ed',
sort: 's',
order: 'o',
eventsOrder: 'eo',
key: 'k',
operator: 'op',
value: 'v',
filters: 'f',
};
static getDateRangeValues(
rangeValue: string,
startDate: string | null,
endDate: string | null,
): [string, string] {
if (rangeValue === CUSTOM_RANGE) {
return [startDate || '', endDate || ''];
}
const period: any = Period({ rangeName: rangeValue });
return [period.start, period.end];
}
static jsonToUrlParams(json: Record<string, any>): string {
const params = new URLSearchParams();
const addFilterParams = (filter: Filter, prefix: string) => {
params.append(`${prefix}${this.keyMap.key}`, filter.key);
params.append(`${prefix}${this.keyMap.operator}`, filter.operator);
filter.value?.forEach((v, i) =>
params.append(`${prefix}${this.keyMap.value}[${i}]`, v || ''),
);
filter.filters?.forEach((f, i) =>
addFilterParams(f, `${prefix}${this.keyMap.filters}[${i}].`),
);
};
json.filters.forEach((filter: any, index: number) =>
addFilterParams(filter, `${this.keyMap.filters}[${index}].`),
);
params.append(this.keyMap.rangeValue, json.rangeValue);
if (json.rangeValue === CUSTOM_RANGE) {
const rangeValues = this.getDateRangeValues(
json.rangeValue,
json.startDate?.toString() || null,
json.endDate?.toString() || null,
);
params.append(this.keyMap.startDate, rangeValues[0]);
params.append(this.keyMap.endDate, rangeValues[1]);
}
params.append(this.keyMap.sort, json.sort);
params.append(this.keyMap.order, json.order);
params.append(this.keyMap.eventsOrder, json.eventsOrder);
return decodeURIComponent(params.toString());
}
static urlParamsToJson(urlParams: string): InputJson {
const params = new URLSearchParams(urlParams);
const getFilterParams = (prefix: string): Filter => {
const key = params.get(`${prefix}${this.keyMap.key}`) || '';
const operator = params.get(`${prefix}${this.keyMap.operator}`) || '';
const value: string[] = [];
let index = 0;
while (params.has(`${prefix}${this.keyMap.value}[${index}]`)) {
value.push(params.get(`${prefix}${this.keyMap.value}[${index}]`) || '');
index++;
}
const filters: Filter[] = [];
index = 0;
while (
params.has(
`${prefix}${this.keyMap.filters}[${index}].${this.keyMap.key}`,
)
) {
filters.push(
getFilterParams(`${prefix}${this.keyMap.filters}[${index}].`),
);
index++;
}
return new Filter(
key,
operator,
value.length ? value : [],
filters.length ? filters : [],
);
};
const filters: Filter[] = [];
let index = 0;
while (params.has(`${this.keyMap.filters}[${index}].${this.keyMap.key}`)) {
filters.push(getFilterParams(`${this.keyMap.filters}[${index}].`));
index++;
}
const rangeValue = params.get(this.keyMap.rangeValue) || LAST_24_HOURS;
const rangeValues = this.getDateRangeValues(
rangeValue,
params.get(this.keyMap.startDate),
params.get(this.keyMap.endDate),
);
return new InputJson(
filters,
rangeValue,
params.get(this.keyMap.sort) || DEFAULT_SORT,
params.get(this.keyMap.order) || DEFAULT_ORDER,
params.get(this.keyMap.eventsOrder) || DEFAULT_EVENTS_ORDER,
rangeValues[0],
rangeValues[1],
);
}
}
// Example usage
// const urlParams = '?f[0].k=click&f[0].op=on&f[0].v[0]=Refresh&f[1].k=fetch&f[1].op=is&f[1].v[0]=&f[1].f[0].k=fetchUrl&f[1].f[0].op=is&f[1].f[0].v[0]=/g/collect&f[1].f[1].k=fetchStatusCode&f[1].f[1].op=>=&f[1].f[1].v[0]=400&f[1].f[2].k=fetchMethod&f[1].f[2].op=is&f[1].f[2].v[0]=&f[1].f[3].k=fetchDuration&f[1].f[3].op==&f[1].f[3].v[0]=&f[1].f[4].k=fetchRequestBody&f[1].f[4].op=is&f[1].f[4].v[0]=&f[1].f[5].k=fetchResponseBody&f[1].f[5].op=is&f[1].f[5].v[0]=&rv=LAST_24_HOURS&sd=1731343412555&ed=1731429812555&s=startTs&o=desc&st=false&eo=then';
// const parsedJson = JsonUrlConverter.urlParamsToJson(urlParams);
// console.log(parsedJson);
// const inputJson: any = {"filters":[{"key":"input","operator":"is","value":["one","two"],"filters":null},{"key":"fetch","operator":"is","filters":[{"key":"fetchUrl","operator":"is","value":["PATH","another"]},{"key":"fetchStatusCode","operator":"=","value":["400","200"]},{"key":"fetchMethod","operator":"is","value":["PUT","POST"]},{"key":"fetchDuration","operator":">=","value":["1"]},{"key":"fetchRequestBody","operator":"is","value":[null]},{"key":"fetchResponseBody","operator":"is","value":[null]}],"value":[""]}],"rangeValue":"LAST_24_HOURS","startDate":1720952011000,"endDate":1721038411000,"sort":"startTs","order":"desc","strict":false,"eventsOrder":"then"};
// const urlParams = JsonUrlConverter.jsonToUrlParams(inputJson);
// const parsedJson = JsonUrlConverter.urlParamsToJson(urlParams);
//
// console.log(urlParams);
// console.log(parsedJson);