Skip to content

Commit

Permalink
dynamic actions
Browse files Browse the repository at this point in the history
  • Loading branch information
ppisljar committed Aug 5, 2020
1 parent e9139ff commit 412dfc9
Show file tree
Hide file tree
Showing 6 changed files with 79 additions and 3 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License;
* you may not use this file except in compliance with the Elastic License.
*/

import { EnhancementRegistryDefinition } from '../../../../../src/plugins/embeddable/public';
import { SavedObjectReference, Serializable } from '../../../../../src/core/types';
import { StartServicesGetter } from '../../../../../src/plugins/kibana_utils/public';
import { StartDependencies } from '../plugin';

export interface DynamicActionEnhancementDeps {
start: StartServicesGetter<Pick<StartDependencies, 'uiActionsEnhanced'>>;
}

export const dynamicActionEnhancement = (start) => {
return {
id: 'dynamicActions',
migrate: (state: Serializable) => {
return start.uiActionsEnhanced.migrateEvent(state);
},
extract: (state: Serializable) => {
return start.uiActionsEnhanced.extractEvent(state);
},
inject: (state: Serializable, refereces: SavedObjectReference[]) => {
return start.uiActionsEnhanced.injectEvent(state, references);
},
};
};
6 changes: 5 additions & 1 deletion x-pack/plugins/embeddable_enhanced/public/plugin.ts
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ import {
AdvancedUiActionsStart,
} from '../../ui_actions_enhanced/public';
import { PanelNotificationsAction, ACTION_PANEL_NOTIFICATIONS } from './actions';
import { createStartServicesGetter } from '../../../../src/plugins/kibana_utils/public';

declare module '../../../../src/plugins/ui_actions/public' {
export interface ActionContextMapping {
Expand Down Expand Up @@ -62,14 +63,17 @@ export class EmbeddableEnhancedPlugin
public setup(core: CoreSetup<StartDependencies>, plugins: SetupDependencies): SetupContract {
this.setCustomEmbeddableFactoryProvider(plugins);

const start = createStartServicesGetter(core.getStartServices);

const panelNotificationAction = new PanelNotificationsAction();
plugins.uiActionsEnhanced.registerAction(panelNotificationAction);
plugins.uiActionsEnhanced.attachAction(PANEL_NOTIFICATION_TRIGGER, panelNotificationAction.id);
plugins.embeddable.registerEmbeddableEnhancement(dynamicActionEnhancement(start));

return {};
}

public start(core: CoreStart, plugins: StartDependencies): StartContract {
public start(core: CoreStart, plugins: StartDependenciesStartDependencies): StartContract {
this.uiActions = plugins.uiActionsEnhanced;

return {};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import { Configurable } from '../../../../../src/plugins/kibana_utils/public';
import { SerializedAction } from './types';
import { ILicense } from '../../../licensing/public';
import { UiActionsActionDefinition as ActionDefinition } from '../../../../../src/plugins/ui_actions/public';
import { SavedObjectReference } from '../../../../../src/core/types';

export class ActionFactory<
Config extends object = object,
Expand Down Expand Up @@ -74,4 +75,16 @@ export class ActionFactory<
},
};
}

public migrate(state: unknown) {
return this.def.migrate ? this.def.migrate(state) : state;
}

public extract(state: SerializedEvent) {
return this.def.extract ? this.def.extract(state) : { state, references: [] };
}

public inject(state: SerializedEvent, references: SavedObjectReference[]) {
return this.def.inject ? this.def.inject(state, references) : state;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import {
UiActionsActionDefinition as ActionDefinition,
UiActionsPresentable as Presentable,
} from '../../../../../src/plugins/ui_actions/public';
import { SavedObjectReference } from '../../../../../src/core/types';

/**
* This is a convenience interface for registering new action factories.
Expand Down Expand Up @@ -42,4 +43,8 @@ export interface ActionFactoryDefinition<
create(
serializedAction: Omit<SerializedAction<Config>, 'factoryId'>
): ActionDefinition<ActionContext>;

migrate?(state: unknown): SerializedEvent;
extract?(state: SerializedEvent): { state: SerializedEvent; references: SavedObjectReference[] };
inject?(state: SerializedEvent, references: SavedObjectReference[]): SerializedEvent;
}
5 changes: 4 additions & 1 deletion x-pack/plugins/ui_actions_enhanced/public/plugin.ts
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,10 @@ export interface SetupContract

export interface StartContract
extends UiActionsStart,
Pick<UiActionsServiceEnhancements, 'getActionFactory' | 'getActionFactories'> {
Pick<
UiActionsServiceEnhancements,
'getActionFactory' | 'getActionFactories' | 'migrateEvent' | 'extractEvent' | 'injectEvent'
> {
FlyoutManageDrilldowns: ReturnType<typeof createFlyoutManageDrilldowns>;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,10 @@
*/

import { ActionFactoryRegistry } from '../types';
import { ActionFactory, ActionFactoryDefinition } from '../dynamic_actions';
import { ActionFactory, ActionFactoryDefinition, SerializedEvent } from '../dynamic_actions';
import { DrilldownDefinition } from '../drilldowns';
import { ILicense } from '../../../licensing/common/types';
import { SavedObjectReference } from '../../../../../src/core/types';

export interface UiActionsServiceEnhancementsParams {
readonly actionFactories?: ActionFactoryRegistry;
Expand Down Expand Up @@ -103,4 +104,25 @@ export class UiActionsServiceEnhancements {

this.registerActionFactory(actionFactory);
};

public migrateEvent(event: unknown) {
return this.actionFactories.has(event.id)
? this.actionFactories.get(event.id).migrate(event)
: event;
}

public extractEvent(event: SerializedEvent) {
return this.actionFactories.has(event.id)
? this.actionFactories.get(event.id).extract(event)
: {
event,
references: [],
};
}

public injectEvent(event: SerializedEvent, references: SavedObjectReference[]) {
return this.actionFactories.has(event.id)
? this.actionFactories.get(event.id).inject(event, references)
: event;
}
}

0 comments on commit 412dfc9

Please sign in to comment.