mirror of
https://github.com/grafana/grafana.git
synced 2025-02-16 02:23:31 -06:00
* Move xss and sanitize packages to grafana-data
* Move text, url and location utils to grafana-data
* Move grafana config types to grafana-data
* Move field display value proxy to grafana-data
* Fix
* Move data links built in vars to grafana-data
* Attach links supplier to when applying field overrides
* Prep tests
* Use links suppliers attached via field overrides
* locationUtil dependencies type
* Move sanitize-url declaration to grafana-data
* Revert "Move sanitize-url declaration to grafana-data"
This reverts commit 11db9f5e55
.
* Fix typo
* fix ts vol1
* Remove import from runtime in data.... Make TS happy at the same time ;)
* Lovely TS, please shut up
* Lovely TS, please shut up vol2
* fix tests
* Fixes
* minor refactor
* Attach get links to FieldDisplayValue for seamless usage
* Update packages/grafana-data/src/field/fieldOverrides.ts
* Make storybook build
47 lines
1.5 KiB
TypeScript
47 lines
1.5 KiB
TypeScript
import _ from 'lodash';
|
|
import { Action, createAction } from '@reduxjs/toolkit';
|
|
import { LocationUpdate } from '@grafana/runtime';
|
|
|
|
import { LocationState } from 'app/types';
|
|
import { urlUtil } from '@grafana/data';
|
|
|
|
export const initialState: LocationState = {
|
|
url: '',
|
|
path: '',
|
|
query: {},
|
|
routeParams: {},
|
|
replace: false,
|
|
lastUpdated: 0,
|
|
};
|
|
|
|
export const updateLocation = createAction<LocationUpdate>('location/updateLocation');
|
|
|
|
// Redux Toolkit uses ImmerJs as part of their solution to ensure that state objects are not mutated.
|
|
// ImmerJs has an autoFreeze option that freezes objects from change which means this reducer can't be migrated to createSlice
|
|
// because the state would become frozen and during run time we would get errors because Angular would try to mutate
|
|
// the frozen state.
|
|
// https://github.com/reduxjs/redux-toolkit/issues/242
|
|
export const locationReducer = (state: LocationState = initialState, action: Action<unknown>) => {
|
|
if (updateLocation.match(action)) {
|
|
const payload: LocationUpdate = action.payload;
|
|
const { path, routeParams, replace } = payload;
|
|
let query = payload.query || state.query;
|
|
|
|
if (payload.partial) {
|
|
query = _.defaults(query, state.query);
|
|
query = _.omitBy(query, _.isNull);
|
|
}
|
|
|
|
return {
|
|
url: urlUtil.renderUrl(path || state.path, query),
|
|
path: path || state.path,
|
|
query: { ...query },
|
|
routeParams: routeParams || state.routeParams,
|
|
replace: replace === true,
|
|
lastUpdated: new Date().getTime(),
|
|
};
|
|
}
|
|
|
|
return state;
|
|
};
|