Began work on handling panel type switching and keep setting

This commit is contained in:
Torkel Ödegaard
2019-02-17 07:03:42 +01:00
parent 1d4dae7aa8
commit dede40d459
5 changed files with 25 additions and 11 deletions

View File

@ -25,10 +25,13 @@ export interface PanelEditorProps<T = any> {
onChange: (options: T) => void; onChange: (options: T) => void;
} }
export type PreservePanelOptionsHandler<TOptions> = (pluginId: string, prevOptions: any) => Partial<TOptions>;
export class ReactPanelPlugin<TOptions = any> { export class ReactPanelPlugin<TOptions = any> {
panel: ComponentClass<PanelProps<TOptions>>; panel: ComponentClass<PanelProps<TOptions>>;
editor?: ComponentClass<PanelEditorProps<TOptions>>; editor?: ComponentClass<PanelEditorProps<TOptions>>;
defaults?: TOptions; defaults?: TOptions;
preserveOptions?: PreservePanelOptionsHandler<TOptions>;
constructor(panel: ComponentClass<PanelProps<TOptions>>) { constructor(panel: ComponentClass<PanelProps<TOptions>>) {
this.panel = panel; this.panel = panel;
@ -41,6 +44,10 @@ export class ReactPanelPlugin<TOptions = any> {
setDefaults(defaults: TOptions) { setDefaults(defaults: TOptions) {
this.defaults = defaults; this.defaults = defaults;
} }
setPreserveOptionsHandler(handler: PreservePanelOptionsHandler<TOptions>) {
this.preserveOptions = handler;
}
} }
export interface PanelSize { export interface PanelSize {

View File

@ -76,23 +76,21 @@ export class DashboardPanel extends PureComponent<Props, State> {
// unmount angular panel // unmount angular panel
this.cleanUpAngularPanel(); this.cleanUpAngularPanel();
if (panel.type !== pluginId) { if (!plugin.exports) {
this.props.panel.changeType(pluginId, fromAngularPanel);
}
if (plugin.exports) {
this.setState({ plugin, angularPanel: null });
} else {
try { try {
plugin.exports = await importPluginModule(plugin.module); plugin.exports = await importPluginModule(plugin.module);
} catch (e) { } catch (e) {
plugin = getPanelPluginNotFound(pluginId); plugin = getPanelPluginNotFound(pluginId);
} }
}
if (panel.type !== pluginId) {
this.props.panel.changeType(pluginId, fromAngularPanel);
}
this.setState({ plugin, angularPanel: null }); this.setState({ plugin, angularPanel: null });
} }
} }
}
componentDidMount() { componentDidMount() {
this.loadPlugin(this.props.panel.type); this.loadPlugin(this.props.panel.type);

View File

@ -19,6 +19,6 @@ export const defaults: BarGaugeOptions = {
suffix: '', suffix: '',
decimals: null, decimals: null,
}, },
thresholds: [{ index: 2, value: 80, color: 'red' }, { index: 0, value: -Infinity, color: 'green' }], thresholds: [{ index: 1, value: 80, color: 'red' }, { index: 0, value: -Infinity, color: 'green' }],
valueMappings: [], valueMappings: [],
}; };

View File

@ -8,3 +8,12 @@ export const reactPanel = new ReactPanelPlugin<GaugeOptions>(GaugePanel);
reactPanel.setEditor(GaugePanelEditor); reactPanel.setEditor(GaugePanelEditor);
reactPanel.setDefaults(defaults); reactPanel.setDefaults(defaults);
reactPanel.setPreserveOptionsHandler((pluginId: string, prevOptions: any) => {
const options: Partial<GaugeOptions> = {};
if (prevOptions.valueOptions.unit) {
options.valueOptions = prevOptions.valueOptions;
}
return options;
});

View File

@ -31,5 +31,5 @@ export const defaults: GaugeOptions = {
unit: 'none', unit: 'none',
}, },
valueMappings: [], valueMappings: [],
thresholds: [], thresholds: [{ index: 1, value: 80, color: 'red' }, { index: 0, value: -Infinity, color: 'green' }],
}; };