Skip to content

7829 Read hiddenVariables, mode, FNDashboard from grfana's state #44

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
86 changes: 48 additions & 38 deletions public/app/core/reducers/fn-slice.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
import { createSlice, PayloadAction } from '@reduxjs/toolkit';
import { WritableDraft } from 'immer/dist/internal';
import { createSlice, PayloadAction, SliceCaseReducers } from '@reduxjs/toolkit';

import { GrafanaThemeType } from '@grafana/data';
import { dispatch } from 'app/store/store';

import { AnyObject } from '../../fn-app/types';

Expand All @@ -14,17 +12,41 @@ export interface FnGlobalState {
controlsContainer: string | null;
pageTitle: string;
queryParams: AnyObject;
hiddenVariables: string[];
hiddenVariables: readonly string[];
}

export type UpdateFNGlobalStateAction = PayloadAction<{
type: keyof FnGlobalState;
payload: FnGlobalState[keyof FnGlobalState];
}>;
export type UpdateFNGlobalStateAction = PayloadAction<Partial<FnGlobalState>>;

export type SetFnStateAction = PayloadAction<Omit<FnGlobalState, 'hiddenVariables'>>;

export type FnPropMappedFromState = Extract<keyof FnGlobalState, 'FNDashboard' | 'hiddenVariables' | 'mode'>;
export type FnStateProp = keyof FnGlobalState;

export type FnPropsMappedFromState = Pick<FnGlobalState, FnPropMappedFromState>;

export const fnStateProps: FnStateProp[] = [
'FNDashboard',
'controlsContainer',
'hiddenVariables',
'mode',
'pageTitle',
'queryParams',
'slug',
'uid',
];

export const fnPropsMappedFromState: readonly FnPropMappedFromState[] = [
'FNDashboard',
'hiddenVariables',
'mode',
] as const;

const INITIAL_MODE = GrafanaThemeType.Light;

const initialState: FnGlobalState = {
export const FN_STATE_KEY = 'fnGlobalState';

export const INITIAL_FN_STATE: FnGlobalState = {
// NOTE: initial value is false
FNDashboard: false,
uid: '',
slug: '',
Expand All @@ -33,37 +55,25 @@ const initialState: FnGlobalState = {
pageTitle: '',
queryParams: {},
hiddenVariables: [],
};
} as const;

const fnSlice = createSlice({
name: 'fnGlobalState',
initialState,
reducers: {
setInitialMountState: (state, action: PayloadAction<Omit<FnGlobalState, 'hiddenVariables'>>) => {
return { ...state, ...action.payload };
},
updateFnState: (state: WritableDraft<FnGlobalState>, action: UpdateFNGlobalStateAction) => {
const { type, payload } = action.payload;

return {
...state,
[type]: payload,
};
},
const reducers: SliceCaseReducers<FnGlobalState> = {
updateFnState: (state, action: SetFnStateAction) => {
return { ...state, ...action.payload };
},
updatePartialFnStates: (state, action: UpdateFNGlobalStateAction) => {
return {
...state,
...action.payload,
};
},
};

const fnSlice = createSlice<FnGlobalState, SliceCaseReducers<FnGlobalState>, string>({
name: FN_STATE_KEY,
initialState: INITIAL_FN_STATE,
reducers,
});

export const { updateFnState, setInitialMountState } = fnSlice.actions;
export const { updatePartialFnStates, updateFnState } = fnSlice.actions;
export const fnSliceReducer = fnSlice.reducer;

export const updateFNGlobalState = (
type: keyof FnGlobalState,
payload: UpdateFNGlobalStateAction['payload']['payload']
): void => {
dispatch(
updateFnState({
type,
payload,
})
);
};
5 changes: 4 additions & 1 deletion public/app/features/dashboard/components/SubMenu/SubMenu.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import React, { PureComponent } from 'react';
import { connect, MapStateToProps } from 'react-redux';

import { AnnotationQuery, DataQuery } from '@grafana/data';
import { FnGlobalState } from 'app/core/reducers/fn-slice';

import { StoreState } from '../../../../types';
import { getSubMenuVariables, getVariablesState } from '../../../variables/state/selectors';
Expand All @@ -18,11 +19,11 @@ interface OwnProps {
dashboard: DashboardModel;
links: DashboardLink[];
annotations: AnnotationQuery[];
hiddenVariables?: string[];
}

interface ConnectedProps {
variables: VariableModel[];
hiddenVariables: FnGlobalState['hiddenVariables'];
}

interface DispatchProps {}
Expand Down Expand Up @@ -76,8 +77,10 @@ class SubMenuUnConnected extends PureComponent<Props> {
const mapStateToProps: MapStateToProps<ConnectedProps, OwnProps, StoreState> = (state, ownProps) => {
const { uid } = ownProps.dashboard;
const templatingState = getVariablesState(uid, state);

return {
variables: getSubMenuVariables(uid, templatingState.variables),
hiddenVariables: state.fnGlobalState.hiddenVariables,
};
};

Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,15 @@
import React, { FunctionComponent, useEffect, useState } from 'react';

import { selectors } from '@grafana/e2e-selectors';
import { FnGlobalState } from 'app/core/reducers/fn-slice';

import { PickerRenderer } from '../../../variables/pickers/PickerRenderer';
import { VariableHide, VariableModel } from '../../../variables/types';

interface Props {
variables: VariableModel[];
readOnly?: boolean;
hiddenVariables?: string[];
hiddenVariables?: FnGlobalState['hiddenVariables'];
}

export const SubMenuItems: FunctionComponent<Props> = ({ variables, readOnly, hiddenVariables }) => {
Expand Down
46 changes: 23 additions & 23 deletions public/app/features/dashboard/containers/DashboardPage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import { GrafanaContext, GrafanaContextType } from 'app/core/context/GrafanaCont
import { createErrorNotification } from 'app/core/copy/appNotification';
import { getKioskMode } from 'app/core/navigation/kiosk';
import { GrafanaRouteComponentProps } from 'app/core/navigation/types';
import { FnGlobalState } from 'app/core/reducers/fn-slice';
import { getNavModel } from 'app/core/selectors/navModel';
import { PanelModel } from 'app/features/dashboard/state';
import { dashboardWatcher } from 'app/features/live/dashboard/dashboardWatcher';
Expand Down Expand Up @@ -60,7 +61,10 @@ export type DashboardPageRouteSearchParams = {
};

export type MapStateToDashboardPageProps = MapStateToProps<
Pick<DashboardState, 'initPhase' | 'initError'> & { dashboard: ReturnType<DashboardState['getModel']> },
Pick<DashboardState, 'initPhase' | 'initError'> & { dashboard: ReturnType<DashboardState['getModel']> } & Pick<
FnGlobalState,
'FNDashboard'
>,
OwnProps,
StoreState
>;
Expand All @@ -80,6 +84,7 @@ export const mapStateToProps: MapStateToDashboardPageProps = (state) => ({
initError: state.dashboard.initError,
dashboard: state.dashboard.getModel(),
navIndex: state.navIndex,
FNDashboard: state.fnGlobalState.FNDashboard,
});

const mapDispatchToProps: MapDispatchToDashboardPageProps = {
Expand All @@ -94,9 +99,7 @@ const connector = connect(mapStateToProps, mapDispatchToProps);

type OwnProps = {
isPublic?: boolean;
isFNDashboard?: boolean;
controlsContainer?: string | null;
hiddenVariables?: string[];
fnLoader?: ReactNode;
};

Expand Down Expand Up @@ -141,9 +144,11 @@ export class UnthemedDashboardPage extends PureComponent<Props, State> {

componentDidMount() {
this.initDashboard();
const { isPublic, isFNDashboard } = this.props;
if (!isPublic && !isFNDashboard) {
this.forceRouteReloadCounter = (this.props.history.location.state as any)?.routeReloadCounter || 0;

const { isPublic, FNDashboard } = this.props;

if (!isPublic && !FNDashboard) {
this.forceRouteReloadCounter = (this.props.history.location?.state as any)?.routeReloadCounter || 0;
}
}

Expand All @@ -157,7 +162,7 @@ export class UnthemedDashboardPage extends PureComponent<Props, State> {
}

initDashboard() {
const { dashboard, isPublic, match, queryParams, isFNDashboard } = this.props;
const { dashboard, isPublic, match, queryParams, FNDashboard } = this.props;

if (dashboard) {
this.closeDashboard();
Expand All @@ -170,7 +175,7 @@ export class UnthemedDashboardPage extends PureComponent<Props, State> {
urlFolderId: queryParams.folderId,
panelType: queryParams.panelType,
routeName: this.props.route.routeName,
fixUrl: !isPublic && !isFNDashboard,
fixUrl: !isPublic && !FNDashboard,
accessToken: match.params.accessToken,
keybindingSrv: this.context.keybindings,
});
Expand All @@ -180,13 +185,13 @@ export class UnthemedDashboardPage extends PureComponent<Props, State> {
}

componentDidUpdate(prevProps: Props, prevState: State) {
const { dashboard, match, templateVarsChangedInUrl, isPublic, isFNDashboard } = this.props;
const { dashboard, match, templateVarsChangedInUrl, isPublic, FNDashboard } = this.props;

if (!dashboard) {
return;
}

if (!isPublic && !isFNDashboard) {
if (!isPublic && !FNDashboard) {
const routeReloadCounter = (this.props.history.location?.state as any)?.routeReloadCounter;

if (
Expand Down Expand Up @@ -372,11 +377,11 @@ export class UnthemedDashboardPage extends PureComponent<Props, State> {
}

render() {
const { dashboard, initError, queryParams, isPublic, isFNDashboard, fnLoader } = this.props;
const { dashboard, initError, queryParams, isPublic, FNDashboard, fnLoader } = this.props;
const { editPanel, viewPanel, updateScrollTop, pageNav, sectionNav } = this.state;
const kioskMode = isFNDashboard ? KioskMode.FN : !isPublic ? getKioskMode(this.props.queryParams) : KioskMode.Full;
const kioskMode = FNDashboard ? KioskMode.FN : !isPublic ? getKioskMode(this.props.queryParams) : KioskMode.Full;

if (!dashboard ) {
if (!dashboard) {
return fnLoader ? <>{fnLoader}</> : <DashboardLoading initPhase={this.props.initPhase} />;
}

Expand All @@ -387,7 +392,7 @@ export class UnthemedDashboardPage extends PureComponent<Props, State> {
<header data-testid={selectors.pages.Dashboard.DashNav.navV2}>
<DashNav
dashboard={dashboard}
title={!isFNDashboard ? dashboard.title : ''}
title={!FNDashboard ? dashboard.title : ''}
folderTitle={dashboard.meta.folderTitle}
isFullscreen={!!viewPanel}
onAddPanel={this.onAddPanel}
Expand Down Expand Up @@ -420,17 +425,12 @@ export class UnthemedDashboardPage extends PureComponent<Props, State> {
scrollRef={this.setScrollRef}
scrollTop={updateScrollTop}
>
{!isFNDashboard && <DashboardPrompt dashboard={dashboard} />}
{!FNDashboard && <DashboardPrompt dashboard={dashboard} />}

{initError && <DashboardFailed />}
{showSubMenu && (
<section aria-label={selectors.pages.Dashboard.SubMenu.submenu}>
<SubMenu
dashboard={dashboard}
annotations={dashboard.annotations.list}
links={dashboard.links}
hiddenVariables={this.props.hiddenVariables}
/>
<SubMenu dashboard={dashboard} annotations={dashboard.annotations.list} links={dashboard.links} />
</section>
)}

Expand Down Expand Up @@ -465,9 +465,9 @@ export class UnthemedDashboardPage extends PureComponent<Props, State> {
}

function updateStatePageNavFromProps(props: Props, state: State): State {
const { dashboard, isFNDashboard } = props;
const { dashboard, FNDashboard } = props;

if (!dashboard || isFNDashboard) {
if (!dashboard || FNDashboard) {
return state;
}

Expand Down
Loading