Skip to content

Commit

Permalink
refactor: 💡 simplify Trigger interface
Browse files Browse the repository at this point in the history
  • Loading branch information
streamich committed Feb 20, 2020
1 parent 90450bf commit 4f8c5a4
Show file tree
Hide file tree
Showing 10 changed files with 29 additions and 55 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -304,12 +304,12 @@ export class VisualizeEmbeddable extends Embeddable<VisualizeInput, VisualizeOut
if (!this.input.disableTriggers) {
const triggerId: 'SELECT_RANGE_TRIGGER' | 'VALUE_CLICK_TRIGGER' =
event.name === 'brush' ? selectRangeTrigger.id : valueClickTrigger.id;
const params: EmbeddableVisTriggerContext = {
const context: EmbeddableVisTriggerContext = {
embeddable: this,
timeFieldName: this.vis.indexPattern.timeFieldName,
data: event.data,
};
npStart.plugins.uiActions.getTrigger(triggerId).exec(params);
npStart.plugins.uiActions.getTrigger(triggerId).exec(context);
}
})
);
Expand Down
13 changes: 6 additions & 7 deletions src/plugins/embeddable/public/bootstrap.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,24 +18,23 @@
*/

import { UiActionsSetup } from 'src/plugins/ui_actions/public';
import { Trigger } from '../../ui_actions/public';
import {
applyFilterTrigger,
contextMenuTrigger,
createFilterAction,
panelBadgeTrigger,
selectRangeTrigger,
valueClickTrigger,
EmbeddableVisTrigger,
EmbeddableVisTriggerContext,
} from './lib';

declare module '../../ui_actions/public' {
export interface TriggerContextMapping {
SELECT_RANGE_TRIGGER: EmbeddableVisTrigger<'SELECT_RANGE_TRIGGER'>;
VALUE_CLICK_TRIGGER: EmbeddableVisTrigger<'VALUE_CLICK_TRIGGER'>;
CONTEXT_MENU_TRIGGER: Trigger;
APPLY_FILTER_TRIGGER: Trigger;
PANEL_BADGE_TRIGGER: Trigger;
SELECT_RANGE_TRIGGER: EmbeddableVisTriggerContext;
VALUE_CLICK_TRIGGER: EmbeddableVisTriggerContext;
CONTEXT_MENU_TRIGGER: object;
APPLY_FILTER_TRIGGER: object;
PANEL_BADGE_TRIGGER: object;
}
}

Expand Down
1 change: 0 additions & 1 deletion src/plugins/embeddable/public/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,6 @@ export {
EmbeddableOutput,
EmbeddablePanel,
EmbeddableRoot,
EmbeddableVisTrigger,
EmbeddableVisTriggerContext,
ErrorEmbeddable,
GetEmbeddableFactories,
Expand Down
16 changes: 5 additions & 11 deletions src/plugins/embeddable/public/lib/triggers/triggers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,42 +29,36 @@ export interface EmbeddableVisTriggerContext {
};
}

export type EmbeddableVisTrigger<ID extends string> = Trigger<
ID,
EmbeddableVisTriggerContext,
EmbeddableVisTriggerContext
>;

export const SELECT_RANGE_TRIGGER = 'SELECT_RANGE_TRIGGER';
export const selectRangeTrigger: EmbeddableVisTrigger<'SELECT_RANGE_TRIGGER'> = {
export const selectRangeTrigger: Trigger<'SELECT_RANGE_TRIGGER'> = {
id: SELECT_RANGE_TRIGGER,
title: 'Select range',
description: 'Applies a range filter',
};

export const VALUE_CLICK_TRIGGER = 'VALUE_CLICK_TRIGGER';
export const valueClickTrigger: EmbeddableVisTrigger<'VALUE_CLICK_TRIGGER'> = {
export const valueClickTrigger: Trigger<'VALUE_CLICK_TRIGGER'> = {
id: VALUE_CLICK_TRIGGER,
title: 'Value clicked',
description: 'Value was clicked',
};

export const CONTEXT_MENU_TRIGGER = 'CONTEXT_MENU_TRIGGER';
export const contextMenuTrigger: Trigger = {
export const contextMenuTrigger: Trigger<'CONTEXT_MENU_TRIGGER'> = {
id: CONTEXT_MENU_TRIGGER,
title: 'Context menu',
description: 'Triggered on top-right corner context-menu select.',
};

export const APPLY_FILTER_TRIGGER = 'FILTER_TRIGGER';
export const applyFilterTrigger: Trigger = {
export const applyFilterTrigger: Trigger<'FILTER_TRIGGER'> = {
id: APPLY_FILTER_TRIGGER,
title: 'Filter click',
description: 'Triggered when user applies filter to an embeddable.',
};

export const PANEL_BADGE_TRIGGER = 'PANEL_BADGE_TRIGGER';
export const panelBadgeTrigger: Trigger = {
export const panelBadgeTrigger: Trigger<'PANEL_BADGE_TRIGGER'> = {
id: PANEL_BADGE_TRIGGER,
title: 'Panel badges',
description: 'Actions appear in title bar when an embeddable loads in a panel',
Expand Down
2 changes: 1 addition & 1 deletion src/plugins/ui_actions/public/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ export { UiActionsSetup, UiActionsStart } from './plugin';
export { UiActionsServiceParams, UiActionsService } from './service';
export { Action, createAction, IncompatibleActionError } from './actions';
export { buildContextMenuForActions } from './context_menu';
export { Trigger, AnyTrigger, TriggerContext, TriggerContextParams } from './triggers';
export { Trigger, AnyTrigger, TriggerContext } from './triggers';
export { TriggerContextMapping } from './types';

/**
Expand Down
8 changes: 4 additions & 4 deletions src/plugins/ui_actions/public/service/ui_actions_service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ import {
TriggerContextMapping,
} from '../types';
import { Action } from '../actions';
import { TriggerContextParams, AnyTrigger } from '../triggers/trigger';
import { AnyTrigger, Trigger } from '../triggers/trigger';
import { TriggerInternal } from '../triggers/trigger_internal';
import { TriggerContract } from '../triggers/trigger_contract';

Expand Down Expand Up @@ -66,7 +66,7 @@ export class UiActionsService {

public readonly getTrigger = <T extends keyof TriggerContextMapping>(
triggerId: T
): TriggerContract<TriggerContextMapping[T]> => {
): TriggerContract<Trigger<T extends string ? T : never>> => {
const trigger = this.triggers.get(triggerId as string);

if (!trigger) {
Expand Down Expand Up @@ -145,10 +145,10 @@ export class UiActionsService {
*/
public readonly executeTriggerActions = async <T extends AnyTrigger>(
triggerId: string,
params: TriggerContextParams<T>
context: TriggerContextMapping[T['id']]
) => {
const trigger = this.getTrigger<any>(triggerId);
await trigger.exec(params);
await trigger.exec(context);
};

/**
Expand Down
21 changes: 5 additions & 16 deletions src/plugins/ui_actions/public/triggers/trigger.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@
* under the License.
*/

import { TriggerContextMapping } from '../types';

/**
* This is a convenience interface used to register a *trigger*.
*
Expand All @@ -28,11 +30,7 @@
* trigger is *called* it first displays a context menu for user to pick a
* single action to execute.
*/
export interface Trigger<
ID extends string = string,
Context extends object = object,
CreateContextParams extends object = object
> {
export interface Trigger<ID extends string = string> {
/**
* Unique name of the trigger as identified in `ui_actions` plugin trigger
* registry, such as "SELECT_RANGE_TRIGGER" or "VALUE_CLICK_TRIGGER".
Expand All @@ -48,17 +46,8 @@ export interface Trigger<
* A longer user friendly description of the trigger.
*/
description?: string;

/**
* Method called to create trigger `Context`, which is passed to `Action`.
* If omitted, an identity function is used.
*/
createContext?: (params: CreateContextParams) => Context;
}

export type AnyTrigger = Trigger<any, any, any>;
export type AnyTrigger = Trigger<any>;

export type TriggerContext<T> = T extends Trigger<any, infer Context, any> ? Context : never;
export type TriggerContextParams<T> = T extends Trigger<any, any, infer ContextParams>
? ContextParams
: never;
export type TriggerContext<T> = T extends Trigger<infer ID> ? TriggerContextMapping[ID] : never;
6 changes: 3 additions & 3 deletions src/plugins/ui_actions/public/triggers/trigger_contract.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
* under the License.
*/

import { AnyTrigger, TriggerContextParams } from './trigger';
import { AnyTrigger, TriggerContext } from './trigger';
import { TriggerInternal } from './trigger_internal';

/**
Expand Down Expand Up @@ -49,7 +49,7 @@ export class TriggerContract<T extends AnyTrigger> {
/**
* Use this method to execute action attached to this trigger.
*/
public readonly exec = async (params: TriggerContextParams<T>) => {
await this.internal.execute(params);
public readonly exec = async (context: TriggerContext<T>) => {
await this.internal.execute(context);
};
}
10 changes: 2 additions & 8 deletions src/plugins/ui_actions/public/triggers/trigger_internal.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
* under the License.
*/

import { AnyTrigger, TriggerContext, TriggerContextParams } from './trigger';
import { AnyTrigger, TriggerContext } from './trigger';
import { TriggerContract } from './trigger_contract';
import { UiActionsService } from '../service';
import { Action } from '../actions';
Expand All @@ -32,13 +32,7 @@ export class TriggerInternal<T extends AnyTrigger> {

constructor(public readonly service: UiActionsService, public readonly trigger: T) {}

public createContext(params: TriggerContextParams<T>): TriggerContext<T> {
if (!this.trigger.createContext) return (params as unknown) as TriggerContext<T>;
return this.trigger.createContext(params);
}

public async execute(params: TriggerContextParams<T>) {
const context = this.createContext(params);
public async execute(context: TriggerContext<T>) {
const triggerId = this.trigger.id;
const actions = await this.service.getTriggerCompatibleActions!(triggerId, context);

Expand Down
3 changes: 1 addition & 2 deletions src/plugins/ui_actions/public/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,12 +19,11 @@

import { Action } from './actions/action';
import { TriggerInternal } from './triggers/trigger_internal';
import { AnyTrigger } from './triggers';

export type TriggerRegistry = Map<string, TriggerInternal<any>>;
export type ActionRegistry = Map<string, Action>;
export type TriggerToActionsRegistry = Map<string, string[]>;

export interface TriggerContextMapping {
[key: string]: AnyTrigger;
[key: string]: object;
}

0 comments on commit 4f8c5a4

Please sign in to comment.