diff --git a/packages/grafana-data/src/types/datasource.ts b/packages/grafana-data/src/types/datasource.ts index e314518bf54..63159188674 100644 --- a/packages/grafana-data/src/types/datasource.ts +++ b/packages/grafana-data/src/types/datasource.ts @@ -76,7 +76,7 @@ export class DataSourcePlugin< return this; } - setQueryEditorHelp(QueryEditorHelp: ComponentType) { + setQueryEditorHelp(QueryEditorHelp: ComponentType>) { this.components.QueryEditorHelp = QueryEditorHelp; return this; } @@ -84,7 +84,7 @@ export class DataSourcePlugin< /** * @deprecated prefer using `setQueryEditorHelp` */ - setExploreStartPage(ExploreStartPage: ComponentType) { + setExploreStartPage(ExploreStartPage: ComponentType>) { return this.setQueryEditorHelp(ExploreStartPage); } @@ -149,7 +149,7 @@ export interface DataSourcePluginComponents< ExploreQueryField?: ComponentType>; ExploreMetricsQueryField?: ComponentType>; ExploreLogsQueryField?: ComponentType>; - QueryEditorHelp?: ComponentType; + QueryEditorHelp?: ComponentType>; ConfigEditor?: ComponentType>; MetadataInspector?: ComponentType>; } @@ -210,7 +210,7 @@ abstract class DataSourceApi< /** * Imports queries from a different datasource */ - async importQueries?(queries: DataQuery[], originDataSource: DataSourceApi): Promise; + async importQueries?(queries: DataQuery[], originDataSource: DataSourceApi): Promise; /** * Returns configuration for importing queries from other data sources @@ -387,9 +387,9 @@ export interface ExploreQueryFieldProps< exploreId?: any; } -export interface QueryEditorHelpProps { - datasource: DataSourceApi; - onClickExample: (query: DataQuery) => void; +export interface QueryEditorHelpProps { + datasource: DataSourceApi; + onClickExample: (query: TQuery) => void; exploreId?: any; } diff --git a/packages/grafana-ui/src/components/TimePicker/TimeZonePicker.tsx b/packages/grafana-ui/src/components/TimePicker/TimeZonePicker.tsx index 0ffb918278a..c268914c622 100644 --- a/packages/grafana-ui/src/components/TimePicker/TimeZonePicker.tsx +++ b/packages/grafana-ui/src/components/TimePicker/TimeZonePicker.tsx @@ -15,7 +15,7 @@ import { TimeZoneGroup } from './TimeZonePicker/TimeZoneGroup'; import { formatUtcOffset } from './TimeZonePicker/TimeZoneOffset'; export interface Props { - onChange: (timeZone: TimeZone | undefined) => void; + onChange: (timeZone?: TimeZone) => void; value?: TimeZone; width?: number; autoFocus?: boolean; diff --git a/public/app/core/components/SharedPreferences/SharedPreferences.tsx b/public/app/core/components/SharedPreferences/SharedPreferences.tsx index 008bb45310b..6af73670b16 100644 --- a/public/app/core/components/SharedPreferences/SharedPreferences.tsx +++ b/public/app/core/components/SharedPreferences/SharedPreferences.tsx @@ -98,7 +98,7 @@ export class SharedPreferences extends PureComponent { this.setState({ theme: value }); }; - onTimeZoneChanged = (timezone: string) => { + onTimeZoneChanged = (timezone?: string) => { if (!timezone) { return; } @@ -109,7 +109,7 @@ export class SharedPreferences extends PureComponent { this.setState({ homeDashboardId: dashboardId }); }; - getFullDashName = (dashboard: DashboardSearchHit) => { + getFullDashName = (dashboard: SelectableValue) => { if (typeof dashboard.folderTitle === 'undefined' || dashboard.folderTitle === '') { return dashboard.title; } @@ -148,7 +148,9 @@ export class SharedPreferences extends PureComponent { value={dashboards.find((dashboard) => dashboard.id === homeDashboardId)} getOptionValue={(i) => i.id} getOptionLabel={this.getFullDashName} - onChange={(dashboard: DashboardSearchHit) => this.onHomeDashboardChanged(dashboard.id)} + onChange={(dashboard: SelectableValue) => + this.onHomeDashboardChanged(dashboard.id) + } options={dashboards} placeholder="Choose default dashboard" /> diff --git a/public/app/core/utils/deferred.ts b/public/app/core/utils/deferred.ts index 2108df00d68..a9146ef6730 100644 --- a/public/app/core/utils/deferred.ts +++ b/public/app/core/utils/deferred.ts @@ -1,5 +1,5 @@ export class Deferred { - resolve?: (reason?: T | PromiseLike) => void; + resolve?: (reason: T | PromiseLike) => void; reject?: (reason?: any) => void; promise: Promise; diff --git a/public/app/features/admin/UserAdminPage.tsx b/public/app/features/admin/UserAdminPage.tsx index f4ee3324c1f..729af04db2b 100644 --- a/public/app/features/admin/UserAdminPage.tsx +++ b/public/app/features/admin/UserAdminPage.tsx @@ -1,6 +1,6 @@ import React, { PureComponent } from 'react'; import { hot } from 'react-hot-loader'; -import { connect } from 'react-redux'; +import { connect, ConnectedProps } from 'react-redux'; import { NavModel } from '@grafana/data'; import { getNavModel } from 'app/core/selectors/navModel'; import config from 'app/core/config'; @@ -29,39 +29,17 @@ import { UserOrgs } from './UserOrgs'; import { GrafanaRouteComponentProps } from 'app/core/navigation/types'; import { contextSrv } from 'app/core/core'; -interface Props extends GrafanaRouteComponentProps<{ id: string }> { +interface OwnProps extends GrafanaRouteComponentProps<{ id: string }> { navModel: NavModel; - user: UserDTO; + user?: UserDTO; orgs: UserOrg[]; sessions: UserSession[]; - ldapSyncInfo: SyncInfo; + ldapSyncInfo?: SyncInfo; isLoading: boolean; - error: UserAdminError; - - loadAdminUserPage: typeof loadAdminUserPage; - revokeSession: typeof revokeSession; - revokeAllSessions: typeof revokeAllSessions; - updateUser: typeof updateUser; - setUserPassword: typeof setUserPassword; - disableUser: typeof disableUser; - enableUser: typeof enableUser; - deleteUser: typeof deleteUser; - updateUserPermissions: typeof updateUserPermissions; - addOrgUser: typeof addOrgUser; - updateOrgUserRole: typeof updateOrgUserRole; - deleteOrgUser: typeof deleteOrgUser; - syncLdapUser: typeof syncLdapUser; + error?: UserAdminError; } -interface State { - // isLoading: boolean; -} - -export class UserAdminPage extends PureComponent { - state = { - // isLoading: true, - }; - +export class UserAdminPage extends PureComponent { async componentDidMount() { const { match, loadAdminUserPage } = this.props; loadAdminUserPage(parseInt(match.params.id, 10)); @@ -73,7 +51,7 @@ export class UserAdminPage extends PureComponent { onPasswordChange = (password: string) => { const { user, setUserPassword } = this.props; - setUserPassword(user.id, password); + user && setUserPassword(user.id, password); }; onUserDelete = (userId: number) => { @@ -90,42 +68,41 @@ export class UserAdminPage extends PureComponent { onGrafanaAdminChange = (isGrafanaAdmin: boolean) => { const { user, updateUserPermissions } = this.props; - updateUserPermissions(user.id, isGrafanaAdmin); + user && updateUserPermissions(user.id, isGrafanaAdmin); }; onOrgRemove = (orgId: number) => { const { user, deleteOrgUser } = this.props; - deleteOrgUser(user.id, orgId); + user && deleteOrgUser(user.id, orgId); }; onOrgRoleChange = (orgId: number, newRole: string) => { const { user, updateOrgUserRole } = this.props; - updateOrgUserRole(user.id, orgId, newRole); + user && updateOrgUserRole(user.id, orgId, newRole); }; onOrgAdd = (orgId: number, role: string) => { const { user, addOrgUser } = this.props; - addOrgUser(user, orgId, role); + user && addOrgUser(user, orgId, role); }; onSessionRevoke = (tokenId: number) => { const { user, revokeSession } = this.props; - revokeSession(tokenId, user.id); + user && revokeSession(tokenId, user.id); }; onAllSessionsRevoke = () => { const { user, revokeAllSessions } = this.props; - revokeAllSessions(user.id); + user && revokeAllSessions(user.id); }; onUserSync = () => { const { user, syncLdapUser } = this.props; - syncLdapUser(user.id); + user && syncLdapUser(user.id); }; render() { const { navModel, user, orgs, sessions, ldapSyncInfo, isLoading } = this.props; - // const { isLoading } = this.state; const isLDAPUser = user && user.isExternal && user.authLabels && user.authLabels.includes('LDAP'); const canReadSessions = contextSrv.hasPermission(AccessControlAction.UsersAuthTokenList); const canReadLDAPStatus = contextSrv.hasPermission(AccessControlAction.LDAPStatusRead); @@ -198,4 +175,6 @@ const mapDispatchToProps = { syncLdapUser, }; -export default hot(module)(connect(mapStateToProps, mapDispatchToProps)(UserAdminPage)); +const connector = connect(mapStateToProps, mapDispatchToProps); +type Props = OwnProps & ConnectedProps; +export default hot(module)(connector(UserAdminPage)); diff --git a/public/app/features/admin/ldap/LdapPage.tsx b/public/app/features/admin/ldap/LdapPage.tsx index b575fe8a95b..9fc4203afc1 100644 --- a/public/app/features/admin/ldap/LdapPage.tsx +++ b/public/app/features/admin/ldap/LdapPage.tsx @@ -1,6 +1,6 @@ import React, { PureComponent } from 'react'; import { hot } from 'react-hot-loader'; -import { connect } from 'react-redux'; +import { connect, ConnectedProps } from 'react-redux'; import { NavModel } from '@grafana/data'; import { Alert, Button, LegacyForms } from '@grafana/ui'; const { FormField } = LegacyForms; @@ -29,19 +29,13 @@ import { import { GrafanaRouteComponentProps } from 'app/core/navigation/types'; import { contextSrv } from 'app/core/core'; -interface Props extends GrafanaRouteComponentProps<{}, { username: string }> { +interface OwnProps extends GrafanaRouteComponentProps<{}, { username: string }> { navModel: NavModel; ldapConnectionInfo: LdapConnectionInfo; - ldapUser: LdapUser; - ldapSyncInfo: SyncInfo; - ldapError: LdapError; + ldapUser?: LdapUser; + ldapSyncInfo?: SyncInfo; + ldapError?: LdapError; userError?: LdapError; - - loadLdapState: typeof loadLdapState; - loadLdapSyncStatus: typeof loadLdapSyncStatus; - loadUserMapping: typeof loadUserMapping; - clearUserError: typeof clearUserError; - clearUserMappingInfo: typeof clearUserMappingInfo; } interface State { @@ -163,4 +157,7 @@ const mapDispatchToProps = { clearUserMappingInfo, }; -export default hot(module)(connect(mapStateToProps, mapDispatchToProps)(LdapPage)); +const connector = connect(mapStateToProps, mapDispatchToProps); +type Props = OwnProps & ConnectedProps; + +export default hot(module)(connector(LdapPage)); diff --git a/public/app/features/admin/state/reducers.test.ts b/public/app/features/admin/state/reducers.test.ts index 6200a29b8f9..d735ce2fa70 100644 --- a/public/app/features/admin/state/reducers.test.ts +++ b/public/app/features/admin/state/reducers.test.ts @@ -17,15 +17,9 @@ import { LdapState, LdapUser, UserAdminState, UserDTO, UserListAdminState } from const makeInitialLdapState = (): LdapState => ({ connectionInfo: [], - syncInfo: null, - user: null, - ldapError: null, - connectionError: null, - userError: null, }); const makeInitialUserAdminState = (): UserAdminState => ({ - user: null, sessions: [], orgs: [], isLoading: true, @@ -95,7 +89,7 @@ describe('LDAP page reducer', () => { error: (null as unknown) as string, }, ], - ldapError: null, + ldapError: undefined, }); }); }); @@ -167,7 +161,7 @@ describe('LDAP page reducer', () => { .thenStateShouldEqual({ ...makeInitialLdapState(), user: getTestUserMapping(), - userError: null, + userError: undefined, }); }); }); @@ -189,7 +183,7 @@ describe('LDAP page reducer', () => { ) .thenStateShouldEqual({ ...makeInitialLdapState(), - user: null, + user: undefined, userError: { title: 'User not found', body: 'Cannot find user', @@ -208,7 +202,7 @@ describe('LDAP page reducer', () => { .whenActionIsDispatched(clearUserMappingInfoAction()) .thenStateShouldEqual({ ...makeInitialLdapState(), - user: null, + user: undefined, }); }); }); diff --git a/public/app/features/admin/state/reducers.ts b/public/app/features/admin/state/reducers.ts index 5151bce867c..2907b52d708 100644 --- a/public/app/features/admin/state/reducers.ts +++ b/public/app/features/admin/state/reducers.ts @@ -15,10 +15,10 @@ import { const initialLdapState: LdapState = { connectionInfo: [], - syncInfo: null, - user: null, - connectionError: null, - userError: null, + syncInfo: undefined, + user: undefined, + connectionError: undefined, + userError: undefined, }; const ldapSlice = createSlice({ @@ -27,7 +27,7 @@ const ldapSlice = createSlice({ reducers: { ldapConnectionInfoLoadedAction: (state, action: PayloadAction): LdapState => ({ ...state, - ldapError: null, + ldapError: undefined, connectionInfo: action.payload, }), ldapFailedAction: (state, action: PayloadAction): LdapState => ({ @@ -41,20 +41,20 @@ const ldapSlice = createSlice({ userMappingInfoLoadedAction: (state, action: PayloadAction): LdapState => ({ ...state, user: action.payload, - userError: null, + userError: undefined, }), userMappingInfoFailedAction: (state, action: PayloadAction): LdapState => ({ ...state, - user: null, + user: undefined, userError: action.payload, }), clearUserMappingInfoAction: (state, action: PayloadAction): LdapState => ({ ...state, - user: null, + user: undefined, }), clearUserErrorAction: (state, action: PayloadAction): LdapState => ({ ...state, - userError: null, + userError: undefined, }), }, }); @@ -74,11 +74,11 @@ export const ldapReducer = ldapSlice.reducer; // UserAdminPage const initialUserAdminState: UserAdminState = { - user: null, + user: undefined, sessions: [], orgs: [], isLoading: true, - error: null, + error: undefined, }; export const userAdminSlice = createSlice({ diff --git a/public/app/features/alerting/NewNotificationChannelPage.tsx b/public/app/features/alerting/NewNotificationChannelPage.tsx index 1fcf0e51176..247b5641bff 100644 --- a/public/app/features/alerting/NewNotificationChannelPage.tsx +++ b/public/app/features/alerting/NewNotificationChannelPage.tsx @@ -1,6 +1,5 @@ import React, { PureComponent } from 'react'; -import { connect, MapDispatchToProps, MapStateToProps } from 'react-redux'; -import { NavModel } from '@grafana/data'; +import { connect, ConnectedProps } from 'react-redux'; import { config } from '@grafana/runtime'; import { Form } from '@grafana/ui'; import Page from 'app/core/components/Page/Page'; @@ -13,25 +12,9 @@ import { } from './utils/notificationChannels'; import { getNavModel } from 'app/core/selectors/navModel'; import { createNotificationChannel, loadNotificationTypes, testNotificationChannel } from './state/actions'; -import { NotificationChannelType, NotificationChannelDTO, StoreState } from '../../types'; +import { NotificationChannelDTO, StoreState } from '../../types'; import { resetSecureField } from './state/reducers'; -interface OwnProps {} - -interface ConnectedProps { - navModel: NavModel; - notificationChannelTypes: NotificationChannelType[]; -} - -interface DispatchProps { - createNotificationChannel: typeof createNotificationChannel; - loadNotificationTypes: typeof loadNotificationTypes; - testNotificationChannel: typeof testNotificationChannel; - resetSecureField: typeof resetSecureField; -} - -type Props = OwnProps & ConnectedProps & DispatchProps; - class NewNotificationChannelPage extends PureComponent { componentDidMount() { this.props.loadNotificationTypes(); @@ -79,18 +62,18 @@ class NewNotificationChannelPage extends PureComponent { } } -const mapStateToProps: MapStateToProps = (state) => { - return { - navModel: getNavModel(state.navIndex, 'channels'), - notificationChannelTypes: state.notificationChannel.notificationChannelTypes, - }; -}; +const mapStateToProps = (state: StoreState) => ({ + navModel: getNavModel(state.navIndex, 'channels'), + notificationChannelTypes: state.notificationChannel.notificationChannelTypes, +}); -const mapDispatchToProps: MapDispatchToProps = { +const mapDispatchToProps = { createNotificationChannel, loadNotificationTypes, testNotificationChannel, resetSecureField, }; -export default connect(mapStateToProps, mapDispatchToProps)(NewNotificationChannelPage); +const connector = connect(mapStateToProps, mapDispatchToProps); +type Props = ConnectedProps; +export default connector(NewNotificationChannelPage); diff --git a/public/app/features/alerting/unified/components/DynamicTable.tsx b/public/app/features/alerting/unified/components/DynamicTable.tsx index 629be5f7abe..13dc4310869 100644 --- a/public/app/features/alerting/unified/components/DynamicTable.tsx +++ b/public/app/features/alerting/unified/components/DynamicTable.tsx @@ -1,4 +1,4 @@ -import React, { FC, ReactNode } from 'react'; +import React, { ReactNode } from 'react'; import { css, cx } from '@emotion/css'; import { GrafanaTheme2 } from '@grafana/data'; import { IconButton, useStyles2, useTheme2 } from '@grafana/ui'; @@ -27,11 +27,11 @@ export interface DynamicTableProps { isExpandable?: boolean; onCollapse?: (id: DynamicTableItemProps) => void; onExpand?: (id: DynamicTableItemProps) => void; - renderExpandedContent?: (item: DynamicTableItemProps, index: number) => ReactNode; + renderExpandedContent?: (item: DynamicTableItemProps, index: number) => ReactNode; testIdGenerator?: (item: DynamicTableItemProps) => string; } -export const DynamicTable: FC = ({ +export const DynamicTable = ({ cols, items, isExpandable = false, @@ -39,7 +39,7 @@ export const DynamicTable: FC = ({ onExpand, renderExpandedContent, testIdGenerator, -}) => { +}: DynamicTableProps) => { const styles = useStyles2(getStyles(cols, isExpandable)); const theme = useTheme2(); const isMobile = useMedia(`(${theme.breakpoints.down('sm')})`); @@ -84,7 +84,7 @@ export const DynamicTable: FC = ({ ); }; -const getStyles = (cols: DynamicTableColumnProps[], isExpandable: boolean) => { +const getStyles = (cols: Array>, isExpandable: boolean) => { const sizes = cols.map((col) => { if (!col.size) { return 'auto'; diff --git a/public/app/features/query/components/QueryEditorRow.tsx b/public/app/features/query/components/QueryEditorRow.tsx index b573add8488..6cb7e8179ed 100644 --- a/public/app/features/query/components/QueryEditorRow.tsx +++ b/public/app/features/query/components/QueryEditorRow.tsx @@ -29,38 +29,38 @@ import { DashboardModel } from '../../dashboard/state/DashboardModel'; import { selectors } from '@grafana/e2e-selectors'; import { PanelModel } from 'app/features/dashboard/state'; -interface Props { +interface Props { data: PanelData; - query: DataQuery; - queries: DataQuery[]; + query: TQuery; + queries: TQuery[]; id: string; index: number; dataSource: DataSourceInstanceSettings; onChangeDataSource?: (dsSettings: DataSourceInstanceSettings) => void; renderHeaderExtras?: () => ReactNode; - onAddQuery: (query: DataQuery) => void; - onRemoveQuery: (query: DataQuery) => void; - onChange: (query: DataQuery) => void; + onAddQuery: (query: TQuery) => void; + onRemoveQuery: (query: TQuery) => void; + onChange: (query: TQuery) => void; onRunQuery: () => void; visualization?: ReactNode; hideDisableQuery?: boolean; } -interface State { +interface State { loadedDataSourceIdentifier?: string | null; - datasource: DataSourceApi | null; + datasource: DataSourceApi | null; hasTextEditMode: boolean; data?: PanelData; isOpen?: boolean; showingHelp: boolean; } -export class QueryEditorRow extends PureComponent { +export class QueryEditorRow extends PureComponent, State> { element: HTMLElement | null = null; - angularScope: AngularQueryComponentScope | null = null; + angularScope: AngularQueryComponentScope | null = null; angularQueryEditor: AngularComponent | null = null; - state: State = { + state: State = { datasource: null, hasTextEditMode: false, data: undefined, @@ -78,7 +78,7 @@ export class QueryEditorRow extends PureComponent { } } - getAngularQueryComponentScope(): AngularQueryComponentScope { + getAngularQueryComponentScope(): AngularQueryComponentScope { const { query, queries } = this.props; const { datasource } = this.state; const panel = new PanelModel({ targets: queries }); @@ -129,13 +129,13 @@ export class QueryEditorRow extends PureComponent { } this.setState({ - datasource, + datasource: (datasource as unknown) as DataSourceApi, loadedDataSourceIdentifier: dataSourceIdentifier, hasTextEditMode: has(datasource, 'components.QueryCtrl.prototype.toggleEditorMode'), }); } - componentDidUpdate(prevProps: Props) { + componentDidUpdate(prevProps: Props) { const { datasource, loadedDataSourceIdentifier } = this.state; const { data, query } = this.props; @@ -252,7 +252,7 @@ export class QueryEditorRow extends PureComponent { })); }; - onClickExample = (query: DataQuery) => { + onClickExample = (query: TQuery) => { this.props.onChange({ ...query, refId: this.props.query.refId, @@ -371,7 +371,11 @@ export class QueryEditorRow extends PureComponent { } } -function notifyAngularQueryEditorsOfData(scope: AngularQueryComponentScope, data: PanelData, editor: AngularComponent) { +function notifyAngularQueryEditorsOfData( + scope: AngularQueryComponentScope, + data: PanelData, + editor: AngularComponent +) { if (data.state === LoadingState.Done) { const legacy = data.series.map((v) => toLegacyResponseData(v)); scope.events.emit(PanelEvents.dataReceived, legacy); @@ -384,14 +388,14 @@ function notifyAngularQueryEditorsOfData(scope: AngularQueryComponentScope, data setTimeout(editor.digest); } -export interface AngularQueryComponentScope { - target: DataQuery; +export interface AngularQueryComponentScope { + target: TQuery; panel: PanelModel; dashboard: DashboardModel; events: EventBusExtended; refresh: () => void; render: () => void; - datasource: DataSourceApi | null; + datasource: DataSourceApi | null; toggleEditorMode?: () => void; getCollapsedText?: () => string; range: TimeRange; diff --git a/public/app/features/query/components/QueryEditorRowHeader.tsx b/public/app/features/query/components/QueryEditorRowHeader.tsx index 2368f339daf..5cff58352fc 100644 --- a/public/app/features/query/components/QueryEditorRowHeader.tsx +++ b/public/app/features/query/components/QueryEditorRowHeader.tsx @@ -5,19 +5,19 @@ import { DataSourcePicker } from '@grafana/runtime'; import { Icon, Input, FieldValidationMessage, useStyles } from '@grafana/ui'; import { selectors } from '@grafana/e2e-selectors'; -export interface Props { - query: DataQuery; - queries: DataQuery[]; +export interface Props { + query: TQuery; + queries: TQuery[]; disabled?: boolean; dataSource: DataSourceInstanceSettings; renderExtras?: () => ReactNode; onChangeDataSource?: (settings: DataSourceInstanceSettings) => void; - onChange: (query: DataQuery) => void; + onChange: (query: TQuery) => void; onClick: (e: React.MouseEvent) => void; collapsedText: string | null; } -export const QueryEditorRowHeader: React.FC = (props) => { +export const QueryEditorRowHeader = (props: Props) => { const { query, queries, onClick, onChange, collapsedText, renderExtras, disabled } = props; const styles = useStyles(getStyles); @@ -123,7 +123,10 @@ export const QueryEditorRowHeader: React.FC = (props) => { ); }; -const renderDataSource = (props: Props, styles: ReturnType): ReactNode => { +const renderDataSource = ( + props: Props, + styles: ReturnType +): ReactNode => { const { dataSource, onChangeDataSource } = props; if (!onChangeDataSource) { diff --git a/public/app/plugins/datasource/cloud-monitoring/components/CloudMonitoringCheatSheet.tsx b/public/app/plugins/datasource/cloud-monitoring/components/CloudMonitoringCheatSheet.tsx index 3029092c818..5f281cec009 100644 --- a/public/app/plugins/datasource/cloud-monitoring/components/CloudMonitoringCheatSheet.tsx +++ b/public/app/plugins/datasource/cloud-monitoring/components/CloudMonitoringCheatSheet.tsx @@ -1,8 +1,12 @@ import React, { PureComponent } from 'react'; import { QueryEditorHelpProps } from '@grafana/data'; import { css } from '@emotion/css'; +import { CloudMonitoringQuery } from '../types'; -export default class CloudMonitoringCheatSheet extends PureComponent { +export default class CloudMonitoringCheatSheet extends PureComponent< + QueryEditorHelpProps, + { userExamples: string[] } +> { render() { return (
diff --git a/public/app/plugins/datasource/cloudwatch/components/LogsCheatSheet.tsx b/public/app/plugins/datasource/cloudwatch/components/LogsCheatSheet.tsx index 3fa1ab841ef..958dc968ed0 100644 --- a/public/app/plugins/datasource/cloudwatch/components/LogsCheatSheet.tsx +++ b/public/app/plugins/datasource/cloudwatch/components/LogsCheatSheet.tsx @@ -5,7 +5,7 @@ import Prism from 'prismjs'; import tokenizer from '../syntax'; import { flattenTokens } from '@grafana/ui/src/slate-plugins/slate-prism'; import { css, cx } from '@emotion/css'; -import { CloudWatchLogsQuery } from '../types'; +import { CloudWatchQuery } from '../types'; interface QueryExample { category: string; @@ -214,8 +214,11 @@ const exampleCategory = css` margin-top: 5px; `; -export default class LogsCheatSheet extends PureComponent { - onClickExample(query: CloudWatchLogsQuery) { +export default class LogsCheatSheet extends PureComponent< + QueryEditorHelpProps, + { userExamples: string[] } +> { + onClickExample(query: CloudWatchQuery) { this.props.onClickExample(query); } diff --git a/public/app/plugins/datasource/loki/components/LokiCheatSheet.tsx b/public/app/plugins/datasource/loki/components/LokiCheatSheet.tsx index 2a7669e20c8..6cc2a9d0ac5 100644 --- a/public/app/plugins/datasource/loki/components/LokiCheatSheet.tsx +++ b/public/app/plugins/datasource/loki/components/LokiCheatSheet.tsx @@ -1,7 +1,8 @@ import React, { PureComponent } from 'react'; import { shuffle } from 'lodash'; -import { QueryEditorHelpProps, DataQuery } from '@grafana/data'; +import { QueryEditorHelpProps } from '@grafana/data'; import LokiLanguageProvider from '../language_provider'; +import { LokiQuery } from '../types'; const DEFAULT_EXAMPLES = ['{job="default/prometheus"}']; const PREFERRED_LABELS = ['job', 'app', 'k8s_app']; @@ -32,7 +33,7 @@ const LOGQL_EXAMPLES = [ }, ]; -export default class LokiCheatSheet extends PureComponent { +export default class LokiCheatSheet extends PureComponent, { userExamples: string[] }> { userLabelTimer: NodeJS.Timeout; state = { userExamples: DEFAULT_EXAMPLES, @@ -72,11 +73,7 @@ export default class LokiCheatSheet extends PureComponent onClickExample({ refId: 'A', expr } as DataQuery)} - > +
onClickExample({ refId: 'A', expr })}> {expr}
); diff --git a/public/app/plugins/datasource/prometheus/components/PromCheatSheet.tsx b/public/app/plugins/datasource/prometheus/components/PromCheatSheet.tsx index a8d3e89985b..c0e7c2736d2 100644 --- a/public/app/plugins/datasource/prometheus/components/PromCheatSheet.tsx +++ b/public/app/plugins/datasource/prometheus/components/PromCheatSheet.tsx @@ -1,5 +1,6 @@ import React from 'react'; -import { QueryEditorHelpProps, DataQuery } from '@grafana/data'; +import { QueryEditorHelpProps } from '@grafana/data'; +import { PromQuery } from '../types'; const CHEAT_SHEET_ITEMS = [ { @@ -25,7 +26,7 @@ const CHEAT_SHEET_ITEMS = [ }, ]; -const PromCheatSheet = (props: QueryEditorHelpProps) => ( +const PromCheatSheet = (props: QueryEditorHelpProps) => (

PromQL Cheat Sheet

{CHEAT_SHEET_ITEMS.map((item, index) => ( @@ -34,7 +35,7 @@ const PromCheatSheet = (props: QueryEditorHelpProps) => ( {item.expression ? (
props.onClickExample({ refId: 'A', expr: item.expression } as DataQuery)} + onClick={(e) => props.onClickExample({ refId: 'A', expr: item.expression })} > {item.expression}
diff --git a/public/app/types/ldap.ts b/public/app/types/ldap.ts index 55f330064e4..eecc12fe01a 100644 --- a/public/app/types/ldap.ts +++ b/public/app/types/ldap.ts @@ -68,9 +68,9 @@ export type LdapConnectionInfo = LdapServerInfo[]; export interface LdapState { connectionInfo: LdapConnectionInfo; - user?: LdapUser | null; - syncInfo?: SyncInfo | null; - connectionError?: LdapError | null; - userError?: LdapError | null; - ldapError?: LdapError | null; + user?: LdapUser; + syncInfo?: SyncInfo; + connectionError?: LdapError; + userError?: LdapError; + ldapError?: LdapError; } diff --git a/public/app/types/user.ts b/public/app/types/user.ts index 0113e7dbb1a..8d3e29a7dbb 100644 --- a/public/app/types/user.ts +++ b/public/app/types/user.ts @@ -88,11 +88,11 @@ export interface UserOrg { } export interface UserAdminState { - user: UserDTO | null; + user?: UserDTO; sessions: UserSession[]; orgs: UserOrg[]; isLoading: boolean; - error?: UserAdminError | null; + error?: UserAdminError; } export interface UserAdminError {