grafana/public/app/features/explore/QueryRows.tsx
Kristina c3e4f1f876
Explore: Add resize to split view, with Min/Max button (#54420)
* Add split resize to Explore without keeping width in state

* debug commit

* ugly hack around split lib only supporting one child

* Use SplitView to accomodate one or two elements, remove debug code, fix test

* More cleanup, fix state action

* Fix even split from manual size scenario

* cleanup

* Add new state elements to test

* Handle scrollable on internal element for virtualized lists

* Left align overflow button for explore

* Change min/max buttons

* Apply suggestions from code review

Co-authored-by: Giordano Ricci <me@giordanoricci.com>

* Add more suggestions from the code review

* Fix problems tests found

* commit broken test with debug info

* Add test, remove debug code

* Remove second get of panes

* Remove second get of panes

Co-authored-by: Elfo404 <me@giordanoricci.com>
2022-09-23 08:20:33 -05:00

107 lines
3.7 KiB
TypeScript

import { createSelector } from '@reduxjs/toolkit';
import React, { useCallback, useMemo } from 'react';
import { CoreApp, DataQuery, DataSourceInstanceSettings } from '@grafana/data';
import { getDataSourceSrv, reportInteraction } from '@grafana/runtime';
import { getNextRefIdChar } from 'app/core/utils/query';
import { useDispatch, useSelector } from 'app/types';
import { ExploreId } from 'app/types/explore';
import { getDatasourceSrv } from '../plugins/datasource_srv';
import { QueryEditorRows } from '../query/components/QueryEditorRows';
import { runQueries, changeQueriesAction, importQueries } from './state/query';
import { getExploreItemSelector } from './state/selectors';
interface Props {
exploreId: ExploreId;
}
const makeSelectors = (exploreId: ExploreId) => {
const exploreItemSelector = getExploreItemSelector(exploreId);
return {
getQueries: createSelector(exploreItemSelector, (s) => s!.queries),
getQueryResponse: createSelector(exploreItemSelector, (s) => s!.queryResponse),
getHistory: createSelector(exploreItemSelector, (s) => s!.history),
getEventBridge: createSelector(exploreItemSelector, (s) => s!.eventBridge),
getDatasourceInstanceSettings: createSelector(
exploreItemSelector,
(s) => getDatasourceSrv().getInstanceSettings(s!.datasourceInstance?.uid)!
),
};
};
export const QueryRows = ({ exploreId }: Props) => {
const dispatch = useDispatch();
const { getQueries, getDatasourceInstanceSettings, getQueryResponse, getHistory, getEventBridge } = useMemo(
() => makeSelectors(exploreId),
[exploreId]
);
const queries = useSelector(getQueries)!;
const dsSettings = useSelector(getDatasourceInstanceSettings)!;
const queryResponse = useSelector(getQueryResponse)!;
const history = useSelector(getHistory);
const eventBridge = useSelector(getEventBridge);
const onRunQueries = useCallback(() => {
dispatch(runQueries(exploreId));
}, [dispatch, exploreId]);
const onChange = useCallback(
(newQueries: DataQuery[]) => {
dispatch(changeQueriesAction({ queries: newQueries, exploreId }));
// if we are removing a query we want to run the remaining ones
if (newQueries.length < queries.length) {
onRunQueries();
}
},
[dispatch, exploreId, onRunQueries, queries]
);
const onAddQuery = useCallback(
(query: DataQuery) => {
onChange([...queries, { ...query, refId: getNextRefIdChar(queries) }]);
},
[onChange, queries]
);
// a datasource change on the query row level means the root datasource is mixed
const onMixedDataSourceChange = async (ds: DataSourceInstanceSettings, query: DataQuery) => {
const queryDatasource = await getDataSourceSrv().get(query.datasource);
const targetDS = await getDataSourceSrv().get({ uid: ds.uid });
dispatch(importQueries(exploreId, queries, queryDatasource, targetDS, query.refId));
};
const onQueryCopied = () => {
reportInteraction('grafana_explore_query_row_copy');
};
const onQueryRemoved = () => {
reportInteraction('grafana_explore_query_row_remove');
};
const onQueryToggled = (queryStatus?: boolean) => {
reportInteraction('grafana_query_row_toggle', queryStatus === undefined ? {} : { queryEnabled: queryStatus });
};
return (
<QueryEditorRows
dsSettings={dsSettings}
onDatasourceChange={(ds: DataSourceInstanceSettings, query: DataQuery) => onMixedDataSourceChange(ds, query)}
queries={queries}
onQueriesChange={onChange}
onAddQuery={onAddQuery}
onRunQueries={onRunQueries}
onQueryCopied={onQueryCopied}
onQueryRemoved={onQueryRemoved}
onQueryToggled={onQueryToggled}
data={queryResponse}
app={CoreApp.Explore}
history={history}
eventBus={eventBridge}
/>
);
};