mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
* Refactor: Removes replaceUrl from actions * Refactor: Moves saveState thunk to epic * Refactor: Moves thunks to epics * Wip: removes resulttype and queries once * Refactor: LiveTailing uses observer in query * Refactor: Creates epics folder for epics and move back actioncreators * Tests: Adds tests for epics and reducer * Fix: Checks for undefined as well * Refactor: Cleans up previous live tailing implementation * Chore: merge with master * Fix: Fixes url issuses and prom graph in Panels * Refactor: Removes supportsStreaming and adds sockets to DataSourcePluginMeta instead * Refactor: Changes the way we create TimeSeries * Refactor: Renames sockets to streaming * Refactor: Changes the way Explore does incremental updates * Refactor: Removes unused method * Refactor: Adds back Loading indication
73 lines
2.4 KiB
TypeScript
73 lines
2.4 KiB
TypeScript
import { Epic } from 'redux-observable';
|
|
import { mergeMap } from 'rxjs/operators';
|
|
import { RawTimeRange, TimeRange } from '@grafana/ui/src/types/time';
|
|
import { isDateTime } from '@grafana/ui/src/utils/moment_wrapper';
|
|
|
|
import { ActionOf } from 'app/core/redux/actionCreatorFactory';
|
|
import { StoreState } from 'app/types/store';
|
|
import { ExploreUrlState, ExploreId } from 'app/types/explore';
|
|
import { clearQueryKeys, serializeStateToUrlParam } from 'app/core/utils/explore';
|
|
import { updateLocation } from 'app/core/actions/location';
|
|
import { setUrlReplacedAction, stateSaveAction } from '../actionTypes';
|
|
|
|
const toRawTimeRange = (range: TimeRange): RawTimeRange => {
|
|
let from = range.raw.from;
|
|
if (isDateTime(from)) {
|
|
from = from.valueOf().toString(10);
|
|
}
|
|
|
|
let to = range.raw.to;
|
|
if (isDateTime(to)) {
|
|
to = to.valueOf().toString(10);
|
|
}
|
|
|
|
return {
|
|
from,
|
|
to,
|
|
};
|
|
};
|
|
|
|
export const stateSaveEpic: Epic<ActionOf<any>, ActionOf<any>, StoreState> = (action$, state$) => {
|
|
return action$.ofType(stateSaveAction.type).pipe(
|
|
mergeMap(() => {
|
|
const { left, right, split } = state$.value.explore;
|
|
const replace = left && left.urlReplaced === false;
|
|
const urlStates: { [index: string]: string } = {};
|
|
const leftUrlState: ExploreUrlState = {
|
|
datasource: left.datasourceInstance.name,
|
|
queries: left.queries.map(clearQueryKeys),
|
|
range: toRawTimeRange(left.range),
|
|
ui: {
|
|
showingGraph: left.showingGraph,
|
|
showingLogs: true,
|
|
showingTable: left.showingTable,
|
|
dedupStrategy: left.dedupStrategy,
|
|
},
|
|
};
|
|
urlStates.left = serializeStateToUrlParam(leftUrlState, true);
|
|
if (split) {
|
|
const rightUrlState: ExploreUrlState = {
|
|
datasource: right.datasourceInstance.name,
|
|
queries: right.queries.map(clearQueryKeys),
|
|
range: toRawTimeRange(right.range),
|
|
ui: {
|
|
showingGraph: right.showingGraph,
|
|
showingLogs: true,
|
|
showingTable: right.showingTable,
|
|
dedupStrategy: right.dedupStrategy,
|
|
},
|
|
};
|
|
|
|
urlStates.right = serializeStateToUrlParam(rightUrlState, true);
|
|
}
|
|
|
|
const actions: Array<ActionOf<any>> = [updateLocation({ query: urlStates, replace })];
|
|
if (replace) {
|
|
actions.push(setUrlReplacedAction({ exploreId: ExploreId.left }));
|
|
}
|
|
|
|
return actions;
|
|
})
|
|
);
|
|
};
|