in dashboards-observability/public/components/trace_analytics/components/services/services.tsx [18:102]
export function Services(props: ServicesProps) {
const [tableItems, setTableItems] = useState([]);
const [redirect, setRedirect] = useState(true);
const [loading, setLoading] = useState(false);
useEffect(() => {
props.chrome.setBreadcrumbs([
props.parentBreadcrumb,
{
text: 'Trace analytics',
href: '#/trace_analytics/home',
},
{
text: 'Services',
href: '#/trace_analytics/services',
},
]);
const validFilters = getValidFilterFields('services');
props.setFilters([
...props.filters.map((filter) => ({
...filter,
locked: validFilters.indexOf(filter.field) === -1,
})),
]);
setRedirect(false);
}, []);
useEffect(() => {
if (!redirect && props.indicesExist) refresh();
}, [props.filters]);
const refresh = async () => {
setLoading(true);
const DSL = filtersToDsl(props.filters, props.query, props.startTime, props.endTime);
await handleServicesRequest(props.http, DSL, tableItems, setTableItems, null, serviceQuery);
setLoading(false);
};
const addFilter = (filter: FilterType) => {
for (const addedFilter of props.filters) {
if (
addedFilter.field === filter.field &&
addedFilter.operator === filter.operator &&
addedFilter.value === filter.value
) {
return;
}
}
const newFilters = [...props.filters, filter];
props.setFilters(newFilters);
};
const [serviceQuery, setServiceQuery] = useState('');
return (
<>
<EuiTitle size="l">
<h2 style={{ fontWeight: 430 }}>Services</h2>
</EuiTitle>
<SearchBar
query={props.query}
filters={props.filters}
setFilters={props.setFilters}
setQuery={props.setQuery}
startTime={props.startTime}
setStartTime={props.setStartTime}
endTime={props.endTime}
setEndTime={props.setEndTime}
refresh={refresh}
page="services"
/>
<EuiSpacer size="m" />
<ServicesTable
items={tableItems}
addFilter={addFilter}
setRedirect={setRedirect}
serviceQuery={serviceQuery}
setServiceQuery={setServiceQuery}
refresh={refresh}
indicesExist={props.indicesExist}
loading={loading}
/>
</>
);
}