grafana/public/app/features/search/reducers/searchQueryReducer.ts

71 lines
1.9 KiB
TypeScript

import { DashboardQuery, SearchQueryParams, SearchAction, SearchLayout } from '../types';
import {
ADD_TAG,
CLEAR_FILTERS,
LAYOUT_CHANGE,
QUERY_CHANGE,
REMOVE_STARRED,
REMOVE_TAG,
SET_TAGS,
DATASOURCE_CHANGE,
TOGGLE_SORT,
TOGGLE_STARRED,
} from './actionTypes';
export const defaultQuery: DashboardQuery = {
query: '',
tag: [],
starred: false,
sort: null,
layout: SearchLayout.Folders,
prevSort: null,
};
export const defaultQueryParams: SearchQueryParams = {
sort: null,
starred: null,
query: null,
tag: null,
layout: null,
};
export const queryReducer = (state: DashboardQuery, action: SearchAction) => {
switch (action.type) {
case QUERY_CHANGE:
return { ...state, query: action.payload };
case REMOVE_TAG:
return { ...state, tag: state.tag.filter((t) => t !== action.payload) };
case SET_TAGS:
return { ...state, tag: action.payload };
case ADD_TAG: {
const tag = action.payload;
return tag && !state.tag.includes(tag) ? { ...state, tag: [...state.tag, tag] } : state;
}
case DATASOURCE_CHANGE:
return { ...state, datasource: action.payload };
case TOGGLE_STARRED:
return { ...state, starred: action.payload };
case REMOVE_STARRED:
return { ...state, starred: false };
case CLEAR_FILTERS:
return { ...state, query: '', tag: [], starred: false, sort: null };
case TOGGLE_SORT: {
const sort = action.payload;
if (state.layout === SearchLayout.Folders) {
return { ...state, sort, layout: SearchLayout.List };
}
return { ...state, sort };
}
case LAYOUT_CHANGE: {
const layout = action.payload;
if (state.sort && layout === SearchLayout.Folders) {
return { ...state, layout, sort: null, prevSort: state.sort };
}
return { ...state, layout, sort: state.prevSort };
}
default:
return state;
}
};