mirror of
https://git.mirrors.martin98.com/https://github.com/SigNoz/signoz
synced 2025-08-18 02:35:57 +08:00
feat: search filter is added in the trace filter
This commit is contained in:
parent
7b315c6766
commit
224ec8d0d9
@ -1,12 +1,19 @@
|
|||||||
import React from 'react';
|
import { Button, Input } from 'antd';
|
||||||
import { useSelector } from 'react-redux';
|
import React, { useState } from 'react';
|
||||||
|
import { useDispatch, useSelector } from 'react-redux';
|
||||||
|
import { Dispatch } from 'redux';
|
||||||
import { AppState } from 'store/reducers';
|
import { AppState } from 'store/reducers';
|
||||||
|
import { INITIAL_FILTER_VALUE } from 'store/reducers/trace';
|
||||||
|
import AppActions from 'types/actions';
|
||||||
|
import { UPDATE_SPAN_UPDATE_FILTER_DISPLAY_VALUE } from 'types/actions/trace';
|
||||||
import { TraceFilterEnum, TraceReducer } from 'types/reducer/trace';
|
import { TraceFilterEnum, TraceReducer } from 'types/reducer/trace';
|
||||||
|
|
||||||
import CheckBoxComponent from '../Common/Checkbox';
|
import CheckBoxComponent from '../Common/Checkbox';
|
||||||
|
|
||||||
|
const { Search } = Input;
|
||||||
|
|
||||||
function CommonCheckBox(props: CommonCheckBoxProps): JSX.Element {
|
function CommonCheckBox(props: CommonCheckBoxProps): JSX.Element {
|
||||||
const { filter } = useSelector<AppState, TraceReducer>(
|
const { filter, filterDisplayValue } = useSelector<AppState, TraceReducer>(
|
||||||
(state) => state.traces,
|
(state) => state.traces,
|
||||||
);
|
);
|
||||||
|
|
||||||
@ -15,9 +22,34 @@ function CommonCheckBox(props: CommonCheckBoxProps): JSX.Element {
|
|||||||
const status = filter.get(name) || {};
|
const status = filter.get(name) || {};
|
||||||
|
|
||||||
const statusObj = Object.keys(status);
|
const statusObj = Object.keys(status);
|
||||||
|
const numberOfFilters = filterDisplayValue.get(name) || 0;
|
||||||
|
const dispatch = useDispatch<Dispatch<AppActions>>();
|
||||||
|
const [searchFilter, setSearchFilter] = useState<string>('');
|
||||||
|
|
||||||
|
const onClickMoreHandler = (): void => {
|
||||||
|
const newFilterDisplayValue = new Map(filterDisplayValue);
|
||||||
|
const preValue =
|
||||||
|
(newFilterDisplayValue.get(name) || 0) + INITIAL_FILTER_VALUE;
|
||||||
|
|
||||||
|
newFilterDisplayValue.set(name, preValue);
|
||||||
|
|
||||||
|
dispatch({
|
||||||
|
type: UPDATE_SPAN_UPDATE_FILTER_DISPLAY_VALUE,
|
||||||
|
payload: newFilterDisplayValue,
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
|
<Search
|
||||||
|
value={searchFilter}
|
||||||
|
onChange={(e): void => setSearchFilter(e.target.value)}
|
||||||
|
style={{
|
||||||
|
padding: '0 3%',
|
||||||
|
}}
|
||||||
|
placeholder="Filter Values"
|
||||||
|
/>
|
||||||
|
|
||||||
{statusObj
|
{statusObj
|
||||||
.sort((a, b) => {
|
.sort((a, b) => {
|
||||||
const countA = +status[a];
|
const countA = +status[a];
|
||||||
@ -28,6 +60,13 @@ function CommonCheckBox(props: CommonCheckBoxProps): JSX.Element {
|
|||||||
}
|
}
|
||||||
return countA - countB;
|
return countA - countB;
|
||||||
})
|
})
|
||||||
|
.filter((_, index) => index < numberOfFilters)
|
||||||
|
.filter((filter) => {
|
||||||
|
if (searchFilter.length === 0) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return filter.includes(searchFilter);
|
||||||
|
})
|
||||||
.map((e) => (
|
.map((e) => (
|
||||||
<CheckBoxComponent
|
<CheckBoxComponent
|
||||||
key={e}
|
key={e}
|
||||||
@ -38,6 +77,12 @@ function CommonCheckBox(props: CommonCheckBoxProps): JSX.Element {
|
|||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
))}
|
))}
|
||||||
|
|
||||||
|
{numberOfFilters && statusObj.length > numberOfFilters && (
|
||||||
|
<Button onClick={onClickMoreHandler} type="link">
|
||||||
|
More
|
||||||
|
</Button>
|
||||||
|
)}
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -11,6 +11,7 @@ import {
|
|||||||
UPDATE_SELECTED_TAGS,
|
UPDATE_SELECTED_TAGS,
|
||||||
UPDATE_SPAN_ORDER,
|
UPDATE_SPAN_ORDER,
|
||||||
UPDATE_SPAN_ORDER_PARAMS,
|
UPDATE_SPAN_ORDER_PARAMS,
|
||||||
|
UPDATE_SPAN_UPDATE_FILTER_DISPLAY_VALUE,
|
||||||
UPDATE_SPANS_AGGREGATE,
|
UPDATE_SPANS_AGGREGATE,
|
||||||
UPDATE_SPANS_AGGREGATE_PAGE_NUMBER,
|
UPDATE_SPANS_AGGREGATE_PAGE_NUMBER,
|
||||||
UPDATE_SPANS_AGGREGATE_PAGE_SIZE,
|
UPDATE_SPANS_AGGREGATE_PAGE_SIZE,
|
||||||
@ -23,6 +24,8 @@ import {
|
|||||||
} from 'types/actions/trace';
|
} from 'types/actions/trace';
|
||||||
import { TraceFilterEnum, TraceReducer } from 'types/reducer/trace';
|
import { TraceFilterEnum, TraceReducer } from 'types/reducer/trace';
|
||||||
|
|
||||||
|
export const INITIAL_FILTER_VALUE = 4;
|
||||||
|
|
||||||
const initialValue: TraceReducer = {
|
const initialValue: TraceReducer = {
|
||||||
filter: new Map(),
|
filter: new Map(),
|
||||||
filterToFetchData: ['duration', 'status', 'serviceName'],
|
filterToFetchData: ['duration', 'status', 'serviceName'],
|
||||||
@ -53,6 +56,17 @@ const initialValue: TraceReducer = {
|
|||||||
loading: true,
|
loading: true,
|
||||||
payload: { items: {} },
|
payload: { items: {} },
|
||||||
},
|
},
|
||||||
|
filterDisplayValue: new Map<TraceFilterEnum, number>([
|
||||||
|
['component', INITIAL_FILTER_VALUE],
|
||||||
|
['duration', INITIAL_FILTER_VALUE],
|
||||||
|
['httpCode', INITIAL_FILTER_VALUE],
|
||||||
|
['httpHost', INITIAL_FILTER_VALUE],
|
||||||
|
['httpMethod', INITIAL_FILTER_VALUE],
|
||||||
|
['httpUrl', INITIAL_FILTER_VALUE],
|
||||||
|
['operation', INITIAL_FILTER_VALUE],
|
||||||
|
['serviceName', INITIAL_FILTER_VALUE],
|
||||||
|
['status', INITIAL_FILTER_VALUE],
|
||||||
|
]),
|
||||||
};
|
};
|
||||||
|
|
||||||
const traceReducer = (
|
const traceReducer = (
|
||||||
@ -251,6 +265,13 @@ const traceReducer = (
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case UPDATE_SPAN_UPDATE_FILTER_DISPLAY_VALUE: {
|
||||||
|
return {
|
||||||
|
...state,
|
||||||
|
filterDisplayValue: action.payload,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return state;
|
return state;
|
||||||
}
|
}
|
||||||
|
@ -31,6 +31,8 @@ export const UPDATE_SPANS_AGGREGATE_PAGE_NUMBER =
|
|||||||
export const UPDATE_SPANS_AGGREGATE_PAGE_SIZE =
|
export const UPDATE_SPANS_AGGREGATE_PAGE_SIZE =
|
||||||
'UPDATE_SPANS_AGGREGATE_PAGE_SIZE';
|
'UPDATE_SPANS_AGGREGATE_PAGE_SIZE';
|
||||||
export const UPDATE_SPAN_ORDER_PARAMS = 'UPDATE_SPAN_ORDER_PARAMS';
|
export const UPDATE_SPAN_ORDER_PARAMS = 'UPDATE_SPAN_ORDER_PARAMS';
|
||||||
|
export const UPDATE_SPAN_UPDATE_FILTER_DISPLAY_VALUE =
|
||||||
|
'UPDATE_SPAN_UPDATE_FILTER_DISPLAY_VALUE';
|
||||||
|
|
||||||
export interface UpdateFilter {
|
export interface UpdateFilter {
|
||||||
type: typeof UPDATE_TRACE_FILTER;
|
type: typeof UPDATE_TRACE_FILTER;
|
||||||
@ -187,6 +189,11 @@ export interface UpdateSpanParams {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export interface UpdateTraceFilterDisplayValue {
|
||||||
|
type: typeof UPDATE_SPAN_UPDATE_FILTER_DISPLAY_VALUE;
|
||||||
|
payload: TraceReducer['filterDisplayValue'];
|
||||||
|
}
|
||||||
|
|
||||||
export type TraceActions =
|
export type TraceActions =
|
||||||
| UpdateFilter
|
| UpdateFilter
|
||||||
| GetTraceFilter
|
| GetTraceFilter
|
||||||
@ -208,4 +215,5 @@ export type TraceActions =
|
|||||||
| UpdateSpanOrder
|
| UpdateSpanOrder
|
||||||
| UpdateSpansAggregatePageNumber
|
| UpdateSpansAggregatePageNumber
|
||||||
| UpdateSpanSize
|
| UpdateSpanSize
|
||||||
| UpdateSpanParams;
|
| UpdateSpanParams
|
||||||
|
| UpdateTraceFilterDisplayValue;
|
||||||
|
@ -32,6 +32,7 @@ export interface TraceReducer {
|
|||||||
payload: PayloadProps;
|
payload: PayloadProps;
|
||||||
};
|
};
|
||||||
yAxisUnit: string | undefined;
|
yAxisUnit: string | undefined;
|
||||||
|
filterDisplayValue: Map<TraceFilterEnum, number>;
|
||||||
}
|
}
|
||||||
|
|
||||||
interface SpansAggregateData {
|
interface SpansAggregateData {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user