Variables: Fix for flickering repeat panels (#43447)

* Variables: Fix for flickering repeat panels

* Refactor: updates after PR comments
pull/43844/head
Hugo Häggmark 4 years ago committed by GitHub
parent 34f757ba5a
commit 9d11c9153f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 21
      public/app/features/dashboard/state/DashboardModel.ts
  2. 4
      public/app/features/variables/state/actions.ts
  3. 8
      public/app/features/variables/types.ts

@ -49,7 +49,12 @@ import { RefreshEvent, TimeRangeUpdatedEvent } from '@grafana/runtime';
import { sortedDeepCloneWithoutNulls } from 'app/core/utils/object'; import { sortedDeepCloneWithoutNulls } from 'app/core/utils/object';
import { Subscription } from 'rxjs'; import { Subscription } from 'rxjs';
import { appEvents } from '../../../core/core'; import { appEvents } from '../../../core/core';
import { VariablesChanged, VariablesChangedEvent, VariablesChangedInUrl } from '../../variables/types'; import {
VariablesChanged,
VariablesChangedEvent,
VariablesChangedInUrl,
VariablesTimeRangeProcessDone,
} from '../../variables/types';
export interface CloneOptions { export interface CloneOptions {
saveVariables?: boolean; saveVariables?: boolean;
@ -178,6 +183,9 @@ export class DashboardModel {
this.appEventsSubscription = new Subscription(); this.appEventsSubscription = new Subscription();
this.lastRefresh = Date.now(); this.lastRefresh = Date.now();
this.appEventsSubscription.add(appEvents.subscribe(VariablesChanged, this.variablesChangedHandler.bind(this))); this.appEventsSubscription.add(appEvents.subscribe(VariablesChanged, this.variablesChangedHandler.bind(this)));
this.appEventsSubscription.add(
appEvents.subscribe(VariablesTimeRangeProcessDone, this.variablesTimeRangeProcessDoneHandler.bind(this))
);
this.appEventsSubscription.add( this.appEventsSubscription.add(
appEvents.subscribe(VariablesChangedInUrl, this.variablesChangedInUrlHandler.bind(this)) appEvents.subscribe(VariablesChangedInUrl, this.variablesChangedInUrlHandler.bind(this))
); );
@ -1210,8 +1218,15 @@ export class DashboardModel {
}); });
} }
private variablesChangedHandler(event: VariablesChanged) { private variablesTimeRangeProcessDoneHandler(event: VariablesTimeRangeProcessDone) {
this.processRepeats(); const processRepeats = event.payload.variableIds.length > 0;
this.variablesChangedHandler(new VariablesChanged({ panelIds: [], refreshAll: true }), processRepeats);
}
private variablesChangedHandler(event: VariablesChanged, processRepeats = true) {
if (processRepeats) {
this.processRepeats();
}
if (event.payload.refreshAll || getTimeSrv().isRefreshOutsideThreshold(this.lastRefresh)) { if (event.payload.refreshAll || getTimeSrv().isRefreshOutsideThreshold(this.lastRefresh)) {
this.startRefresh({ refreshAll: true, panelIds: [] }); this.startRefresh({ refreshAll: true, panelIds: [] });

@ -23,6 +23,7 @@ import {
VariablesChanged, VariablesChanged,
VariablesChangedEvent, VariablesChangedEvent,
VariablesChangedInUrl, VariablesChangedInUrl,
VariablesTimeRangeProcessDone,
VariableWithMultiSupport, VariableWithMultiSupport,
VariableWithOptions, VariableWithOptions,
} from '../types'; } from '../types';
@ -571,13 +572,14 @@ export const onTimeRangeUpdated = (
return false; return false;
}) as VariableWithOptions[]; }) as VariableWithOptions[];
const variableIds = variablesThatNeedRefresh.map((variable) => variable.id);
const promises = variablesThatNeedRefresh.map((variable: VariableWithOptions) => const promises = variablesThatNeedRefresh.map((variable: VariableWithOptions) =>
dispatch(timeRangeUpdated(toVariableIdentifier(variable))) dispatch(timeRangeUpdated(toVariableIdentifier(variable)))
); );
try { try {
await Promise.all(promises); await Promise.all(promises);
dependencies.events.publish(new VariablesChanged({ panelIds: [], refreshAll: true })); dependencies.events.publish(new VariablesTimeRangeProcessDone({ variableIds }));
} catch (error) { } catch (error) {
console.error(error); console.error(error);
dispatch(notifyApp(createVariableErrorNotification('Template variable service failed', error))); dispatch(notifyApp(createVariableErrorNotification('Template variable service failed', error)));

@ -162,6 +162,14 @@ export class VariablesChanged extends BusEventWithPayload<VariablesChangedEvent>
static type = 'variables-changed'; static type = 'variables-changed';
} }
export interface VariablesTimeRangeProcessDoneEvent {
variableIds: string[];
}
export class VariablesTimeRangeProcessDone extends BusEventWithPayload<VariablesTimeRangeProcessDoneEvent> {
static type = 'variables-time-range-process-done';
}
export class VariablesChangedInUrl extends BusEventWithPayload<VariablesChangedEvent> { export class VariablesChangedInUrl extends BusEventWithPayload<VariablesChangedEvent> {
static type = 'variables-changed-in-url'; static type = 'variables-changed-in-url';
} }

Loading…
Cancel
Save