mirror of
https://github.com/grafana/grafana.git
synced 2025-02-16 18:34:52 -06:00
* Initial pass to move panel state to it's own, and make it by key not panel.id * Progress * Not making much progress, having panel.key be mutable is causing a lot of issues * Think this is starting to work * Began fixing tests * Add selector * Bug fixes and changes to cleanup, and fixing all flicking when switching library panels * Removed console.log * fixes after merge * fixing tests * fixing tests * Added new test for changePlugin thunk * Initial struture in place * responding to state changes in another part of the state * bha * going in a different direction * This is getting exciting * minor * More structure * More real * Added builder to reduce boiler plate * Lots of progress * Adding more visualizations * More smarts * tweaks * suggestions * Move to separate view * Refactoring to builder concept * Before hover preview test * Increase line width in preview * More suggestions * Removed old elements of onSuggestVisualizations * Don't call suggestion suppliers if there is no data * Restore card styles to only borders * Changing supplier interface to support data vs option suggestion scenario * Renamed functions * Add dynamic width support * not sure about this * Improve suggestions * Improve suggestions * Single grid/list * Store vis select pane & size * Prep for option suggestions * more suggestions * Name/title option for preview cards * Improve barchart suggestions * Support suggestions when there are no data * Minor change * reverted some changes * Improve suggestions for stacking * Removed size option * starting on unit tests, hit cyclic dependency issue * muuu * First test for getting suggestion seems to work, going to bed * add missing file * A basis for more unit tests * More tests * More unit tests * Fixed unit tests * Update * Some extreme scenarios * Added basic e2e test * Added another unit test for changePanelPlugin action * More cleanup * Minor tweak * add wait to e2e test * Renamed function and cleanup of unused function * Adding search support and adding search test to e2e test
88 lines
2.7 KiB
TypeScript
88 lines
2.7 KiB
TypeScript
import { AnyAction, combineReducers } from 'redux';
|
|
import { CleanUp, cleanUpAction } from '../actions/cleanUp';
|
|
import sharedReducers from 'app/core/reducers';
|
|
import alertingReducers from 'app/features/alerting/state/reducers';
|
|
import teamsReducers from 'app/features/teams/state/reducers';
|
|
import apiKeysReducers from 'app/features/api-keys/state/reducers';
|
|
import foldersReducers from 'app/features/folders/state/reducers';
|
|
import dashboardReducers from 'app/features/dashboard/state/reducers';
|
|
import exploreReducers from 'app/features/explore/state/main';
|
|
import pluginReducers from 'app/features/plugins/state/reducers';
|
|
import dataSourcesReducers from 'app/features/datasources/state/reducers';
|
|
import usersReducers from 'app/features/users/state/reducers';
|
|
import userReducers from 'app/features/profile/state/reducers';
|
|
import organizationReducers from 'app/features/org/state/reducers';
|
|
import ldapReducers from 'app/features/admin/state/reducers';
|
|
import templatingReducers from 'app/features/variables/state/reducers';
|
|
import importDashboardReducers from 'app/features/manage-dashboards/state/reducers';
|
|
import panelEditorReducers from 'app/features/dashboard/components/PanelEditor/state/reducers';
|
|
import panelsReducers from 'app/features/panel/state/reducers';
|
|
|
|
const rootReducers = {
|
|
...sharedReducers,
|
|
...alertingReducers,
|
|
...teamsReducers,
|
|
...apiKeysReducers,
|
|
...foldersReducers,
|
|
...dashboardReducers,
|
|
...exploreReducers,
|
|
...pluginReducers,
|
|
...dataSourcesReducers,
|
|
...usersReducers,
|
|
...userReducers,
|
|
...organizationReducers,
|
|
...ldapReducers,
|
|
...templatingReducers,
|
|
...importDashboardReducers,
|
|
...panelEditorReducers,
|
|
...panelsReducers,
|
|
};
|
|
|
|
const addedReducers = {};
|
|
|
|
export const addReducer = (newReducers: any) => {
|
|
Object.assign(addedReducers, newReducers);
|
|
};
|
|
|
|
export const createRootReducer = () => {
|
|
const appReducer = combineReducers({
|
|
...rootReducers,
|
|
...addedReducers,
|
|
});
|
|
|
|
return (state: any, action: AnyAction) => {
|
|
if (action.type !== cleanUpAction.type) {
|
|
return appReducer(state, action);
|
|
}
|
|
|
|
const { stateSelector } = action.payload as CleanUp<any>;
|
|
const stateSlice = stateSelector(state);
|
|
recursiveCleanState(state, stateSlice);
|
|
|
|
return appReducer(state, action);
|
|
};
|
|
};
|
|
|
|
export const recursiveCleanState = (state: any, stateSlice: any): boolean => {
|
|
for (const stateKey in state) {
|
|
if (!state.hasOwnProperty(stateKey)) {
|
|
continue;
|
|
}
|
|
|
|
const slice = state[stateKey];
|
|
if (slice === stateSlice) {
|
|
state[stateKey] = undefined;
|
|
return true;
|
|
}
|
|
|
|
if (typeof slice === 'object') {
|
|
const cleaned = recursiveCleanState(slice, stateSlice);
|
|
if (cleaned) {
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
|
|
return false;
|
|
};
|