diff --git a/docs/development/plugins/embeddable/public/kibana-plugin-plugins-embeddable-public.iscontextmenutriggercontext.md b/docs/development/plugins/embeddable/public/kibana-plugin-plugins-embeddable-public.iscontextmenutriggercontext.md
new file mode 100644
index 0000000000000..62610624655a1
--- /dev/null
+++ b/docs/development/plugins/embeddable/public/kibana-plugin-plugins-embeddable-public.iscontextmenutriggercontext.md
@@ -0,0 +1,11 @@
+
+
+[Home](./index.md) > [kibana-plugin-plugins-embeddable-public](./kibana-plugin-plugins-embeddable-public.md) > [isContextMenuTriggerContext](./kibana-plugin-plugins-embeddable-public.iscontextmenutriggercontext.md)
+
+## isContextMenuTriggerContext variable
+
+Signature:
+
+```typescript
+isContextMenuTriggerContext: (context: unknown) => context is EmbeddableContext
+```
diff --git a/docs/development/plugins/embeddable/public/kibana-plugin-plugins-embeddable-public.md b/docs/development/plugins/embeddable/public/kibana-plugin-plugins-embeddable-public.md
index df67eda5074b9..06f792837e4fe 100644
--- a/docs/development/plugins/embeddable/public/kibana-plugin-plugins-embeddable-public.md
+++ b/docs/development/plugins/embeddable/public/kibana-plugin-plugins-embeddable-public.md
@@ -77,6 +77,7 @@
| [contextMenuTrigger](./kibana-plugin-plugins-embeddable-public.contextmenutrigger.md) | |
| [defaultEmbeddableFactoryProvider](./kibana-plugin-plugins-embeddable-public.defaultembeddablefactoryprovider.md) | |
| [EmbeddableRenderer](./kibana-plugin-plugins-embeddable-public.embeddablerenderer.md) | Helper react component to render an embeddable Can be used if you have an embeddable object or an embeddable factory Supports updating input by passing input
prop |
+| [isContextMenuTriggerContext](./kibana-plugin-plugins-embeddable-public.iscontextmenutriggercontext.md) | |
| [isRangeSelectTriggerContext](./kibana-plugin-plugins-embeddable-public.israngeselecttriggercontext.md) | |
| [isValueClickTriggerContext](./kibana-plugin-plugins-embeddable-public.isvalueclicktriggercontext.md) | |
| [PANEL\_BADGE\_TRIGGER](./kibana-plugin-plugins-embeddable-public.panel_badge_trigger.md) | |
diff --git a/src/plugins/embeddable/public/index.ts b/src/plugins/embeddable/public/index.ts
index 789353ca4abd7..0d2dcf208f2ef 100644
--- a/src/plugins/embeddable/public/index.ts
+++ b/src/plugins/embeddable/public/index.ts
@@ -70,6 +70,7 @@ export {
isSavedObjectEmbeddableInput,
isRangeSelectTriggerContext,
isValueClickTriggerContext,
+ isContextMenuTriggerContext,
EmbeddableStateTransfer,
EmbeddableEditorState,
EmbeddablePackageState,
diff --git a/src/plugins/embeddable/public/lib/triggers/triggers.ts b/src/plugins/embeddable/public/lib/triggers/triggers.ts
index 54c7a2ecc129d..b2965b55dbdfa 100644
--- a/src/plugins/embeddable/public/lib/triggers/triggers.ts
+++ b/src/plugins/embeddable/public/lib/triggers/triggers.ts
@@ -17,6 +17,7 @@
* under the License.
*/
+import { i18n } from '@kbn/i18n';
import { Datatable } from '../../../../expressions';
import { Trigger } from '../../../../ui_actions/public';
import { IEmbeddable } from '..';
@@ -53,31 +54,49 @@ export type ChartActionContext =
| ValueClickContext
| RangeSelectContext;
-export const isValueClickTriggerContext = (
- context: ChartActionContext
-): context is ValueClickContext => context.data && 'data' in context.data;
-
-export const isRangeSelectTriggerContext = (
- context: ChartActionContext
-): context is RangeSelectContext => context.data && 'range' in context.data;
-
export const CONTEXT_MENU_TRIGGER = 'CONTEXT_MENU_TRIGGER';
export const contextMenuTrigger: Trigger<'CONTEXT_MENU_TRIGGER'> = {
id: CONTEXT_MENU_TRIGGER,
- title: 'Context menu',
- description: 'Triggered on top-right corner context-menu select.',
+ title: i18n.translate('embeddableApi.contextMenuTrigger.title', {
+ defaultMessage: 'Context menu',
+ }),
+ description: i18n.translate('embeddableApi.contextMenuTrigger.description', {
+ defaultMessage: 'A panel top-right corner context menu click.',
+ }),
};
export const PANEL_BADGE_TRIGGER = 'PANEL_BADGE_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.',
+ title: i18n.translate('embeddableApi.panelBadgeTrigger.title', {
+ defaultMessage: 'Panel badges',
+ }),
+ description: i18n.translate('embeddableApi.panelBadgeTrigger.description', {
+ defaultMessage: 'Actions appear in title bar when an embeddable loads in a panel.',
+ }),
};
export const PANEL_NOTIFICATION_TRIGGER = 'PANEL_NOTIFICATION_TRIGGER';
export const panelNotificationTrigger: Trigger<'PANEL_NOTIFICATION_TRIGGER'> = {
id: PANEL_NOTIFICATION_TRIGGER,
- title: 'Panel notifications',
- description: 'Actions appear in top-right corner of a panel.',
+ title: i18n.translate('embeddableApi.panelNotificationTrigger.title', {
+ defaultMessage: 'Panel notifications',
+ }),
+ description: i18n.translate('embeddableApi.panelNotificationTrigger.description', {
+ defaultMessage: 'Actions appear in top-right corner of a panel.',
+ }),
};
+
+export const isValueClickTriggerContext = (
+ context: ChartActionContext
+): context is ValueClickContext => context.data && 'data' in context.data;
+
+export const isRangeSelectTriggerContext = (
+ context: ChartActionContext
+): context is RangeSelectContext => context.data && 'range' in context.data;
+
+export const isContextMenuTriggerContext = (context: unknown): context is EmbeddableContext =>
+ !!context &&
+ typeof context === 'object' &&
+ !!(context as EmbeddableContext).embeddable &&
+ typeof (context as EmbeddableContext).embeddable === 'object';
diff --git a/src/plugins/embeddable/public/public.api.md b/src/plugins/embeddable/public/public.api.md
index 00971ed37db3a..e84dff1172c2e 100644
--- a/src/plugins/embeddable/public/public.api.md
+++ b/src/plugins/embeddable/public/public.api.md
@@ -695,6 +695,11 @@ export interface IEmbeddable): void;
}
+// Warning: (ae-missing-release-tag) "isContextMenuTriggerContext" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal)
+//
+// @public (undocumented)
+export const isContextMenuTriggerContext: (context: unknown) => context is EmbeddableContext;
+
// Warning: (ae-missing-release-tag) "isErrorEmbeddable" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal)
//
// @public (undocumented)
@@ -884,7 +889,7 @@ export const withEmbeddableSubscription: {
});
});
- test('not compatible if no triggers intersection', async () => {
+ test('not compatible if no triggers intersect', async () => {
await assertNonCompatibility({
actionFactoriesTriggers: [],
});
diff --git a/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/actions/flyout_create_drilldown/flyout_create_drilldown.tsx b/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/actions/flyout_create_drilldown/flyout_create_drilldown.tsx
index a2192808c2d40..a417deb47db53 100644
--- a/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/actions/flyout_create_drilldown/flyout_create_drilldown.tsx
+++ b/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/actions/flyout_create_drilldown/flyout_create_drilldown.tsx
@@ -10,9 +10,12 @@ import { ActionByType } from '../../../../../../../../src/plugins/ui_actions/pub
import { toMountPoint } from '../../../../../../../../src/plugins/kibana_react/public';
import {
isEnhancedEmbeddable,
- embeddableEnhancedContextMenuDrilldownGrouping,
+ embeddableEnhancedDrilldownGrouping,
} from '../../../../../../embeddable_enhanced/public';
-import { EmbeddableContext } from '../../../../../../../../src/plugins/embeddable/public';
+import {
+ CONTEXT_MENU_TRIGGER,
+ EmbeddableContext,
+} from '../../../../../../../../src/plugins/embeddable/public';
import { StartDependencies } from '../../../../plugin';
import { StartServicesGetter } from '../../../../../../../../src/plugins/kibana_utils/public';
import { ensureNestedTriggers } from '../drilldown_shared';
@@ -27,7 +30,7 @@ export class FlyoutCreateDrilldownAction implements ActionByType handle.close()}
viewMode={'create'}
dynamicActionManager={embeddable.enhancements.dynamicActions}
- triggers={ensureNestedTriggers(embeddable.supportedTriggers())}
+ triggers={[...ensureNestedTriggers(embeddable.supportedTriggers()), CONTEXT_MENU_TRIGGER]}
placeContext={{ embeddable }}
/>
),
diff --git a/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/actions/flyout_edit_drilldown/flyout_edit_drilldown.tsx b/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/actions/flyout_edit_drilldown/flyout_edit_drilldown.tsx
index 56ef25005078b..1f0570445a8fc 100644
--- a/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/actions/flyout_edit_drilldown/flyout_edit_drilldown.tsx
+++ b/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/actions/flyout_edit_drilldown/flyout_edit_drilldown.tsx
@@ -10,12 +10,16 @@ import {
reactToUiComponent,
toMountPoint,
} from '../../../../../../../../src/plugins/kibana_react/public';
-import { EmbeddableContext, ViewMode } from '../../../../../../../../src/plugins/embeddable/public';
+import {
+ EmbeddableContext,
+ ViewMode,
+ CONTEXT_MENU_TRIGGER,
+} from '../../../../../../../../src/plugins/embeddable/public';
import { txtDisplayName } from './i18n';
import { MenuItem } from './menu_item';
import {
isEnhancedEmbeddable,
- embeddableEnhancedContextMenuDrilldownGrouping,
+ embeddableEnhancedDrilldownGrouping,
} from '../../../../../../embeddable_enhanced/public';
import { StartDependencies } from '../../../../plugin';
import { StartServicesGetter } from '../../../../../../../../src/plugins/kibana_utils/public';
@@ -31,7 +35,7 @@ export class FlyoutEditDrilldownAction implements ActionByType handle.close()}
viewMode={'manage'}
dynamicActionManager={embeddable.enhancements.dynamicActions}
- triggers={ensureNestedTriggers(embeddable.supportedTriggers())}
+ triggers={[...ensureNestedTriggers(embeddable.supportedTriggers()), CONTEXT_MENU_TRIGGER]}
placeContext={{ embeddable }}
/>
),
diff --git a/x-pack/plugins/drilldowns/url_drilldown/public/lib/url_drilldown.tsx b/x-pack/plugins/drilldowns/url_drilldown/public/lib/url_drilldown.tsx
index 85e92d0827daa..807dfeed21d1f 100644
--- a/x-pack/plugins/drilldowns/url_drilldown/public/lib/url_drilldown.tsx
+++ b/x-pack/plugins/drilldowns/url_drilldown/public/lib/url_drilldown.tsx
@@ -6,7 +6,11 @@
import React from 'react';
import { reactToUiComponent } from '../../../../../../src/plugins/kibana_react/public';
-import { ChartActionContext, IEmbeddable } from '../../../../../../src/plugins/embeddable/public';
+import {
+ ChartActionContext,
+ CONTEXT_MENU_TRIGGER,
+ IEmbeddable,
+} from '../../../../../../src/plugins/embeddable/public';
import { CollectConfigProps as CollectConfigPropsBase } from '../../../../../../src/plugins/kibana_utils/public';
import {
SELECT_RANGE_TRIGGER,
@@ -34,7 +38,10 @@ interface UrlDrilldownDeps {
export type ActionContext = ChartActionContext;
export type Config = UrlDrilldownConfig;
-export type UrlTrigger = typeof VALUE_CLICK_TRIGGER | typeof SELECT_RANGE_TRIGGER;
+export type UrlTrigger =
+ | typeof CONTEXT_MENU_TRIGGER
+ | typeof VALUE_CLICK_TRIGGER
+ | typeof SELECT_RANGE_TRIGGER;
export interface ActionFactoryContext extends BaseActionFactoryContext {
embeddable?: IEmbeddable;
}
@@ -58,7 +65,7 @@ export class UrlDrilldown implements Drilldown = ({
diff --git a/x-pack/plugins/drilldowns/url_drilldown/public/lib/url_drilldown_scope.test.ts b/x-pack/plugins/drilldowns/url_drilldown/public/lib/url_drilldown_scope.test.ts
index 6989819da2b0b..a93e150deee8f 100644
--- a/x-pack/plugins/drilldowns/url_drilldown/public/lib/url_drilldown_scope.test.ts
+++ b/x-pack/plugins/drilldowns/url_drilldown/public/lib/url_drilldown_scope.test.ts
@@ -87,25 +87,25 @@ describe('VALUE_CLICK_TRIGGER', () => {
]) as ValueClickTriggerEventScope;
expect(mockEventScope.points.length).toBeGreaterThan(3);
expect(mockEventScope.points).toMatchInlineSnapshot(`
- Array [
- Object {
- "key": "event.points.0.key",
- "value": "event.points.0.value",
- },
- Object {
- "key": "event.points.1.key",
- "value": "event.points.1.value",
- },
- Object {
- "key": "event.points.2.key",
- "value": "event.points.2.value",
- },
- Object {
- "key": "event.points.3.key",
- "value": "event.points.3.value",
- },
- ]
- `);
+ Array [
+ Object {
+ "key": "event.points.0.key",
+ "value": "event.points.0.value",
+ },
+ Object {
+ "key": "event.points.1.key",
+ "value": "event.points.1.value",
+ },
+ Object {
+ "key": "event.points.2.key",
+ "value": "event.points.2.value",
+ },
+ Object {
+ "key": "event.points.3.key",
+ "value": "event.points.3.value",
+ },
+ ]
+ `);
});
});
@@ -130,3 +130,12 @@ describe('VALUE_CLICK_TRIGGER', () => {
});
});
});
+
+describe('CONTEXT_MENU_TRIGGER', () => {
+ test('getMockEventScope() results in empty scope', () => {
+ const mockEventScope = getMockEventScope([
+ 'CONTEXT_MENU_TRIGGER',
+ ]) as ValueClickTriggerEventScope;
+ expect(mockEventScope).toEqual({});
+ });
+});
diff --git a/x-pack/plugins/drilldowns/url_drilldown/public/lib/url_drilldown_scope.ts b/x-pack/plugins/drilldowns/url_drilldown/public/lib/url_drilldown_scope.ts
index 0f66cb144c967..234af380689e9 100644
--- a/x-pack/plugins/drilldowns/url_drilldown/public/lib/url_drilldown_scope.ts
+++ b/x-pack/plugins/drilldowns/url_drilldown/public/lib/url_drilldown_scope.ts
@@ -14,11 +14,15 @@ import {
IEmbeddable,
isRangeSelectTriggerContext,
isValueClickTriggerContext,
+ isContextMenuTriggerContext,
RangeSelectContext,
ValueClickContext,
} from '../../../../../../src/plugins/embeddable/public';
import type { ActionContext, ActionFactoryContext, UrlTrigger } from './url_drilldown';
-import { SELECT_RANGE_TRIGGER } from '../../../../../../src/plugins/ui_actions/public';
+import {
+ SELECT_RANGE_TRIGGER,
+ VALUE_CLICK_TRIGGER,
+} from '../../../../../../src/plugins/ui_actions/public';
type ContextScopeInput = ActionContext | ActionFactoryContext;
@@ -101,7 +105,10 @@ export function getContextScope(contextScopeInput: ContextScopeInput): UrlDrilld
* URL drilldown event scope,
* available as {{event.$}}
*/
-export type UrlDrilldownEventScope = ValueClickTriggerEventScope | RangeSelectTriggerEventScope;
+export type UrlDrilldownEventScope =
+ | ValueClickTriggerEventScope
+ | RangeSelectTriggerEventScope
+ | ContextMenuTriggerEventScope;
export type EventScopeInput = ActionContext;
export interface ValueClickTriggerEventScope {
key?: string;
@@ -115,11 +122,15 @@ export interface RangeSelectTriggerEventScope {
to?: string | number;
}
+export type ContextMenuTriggerEventScope = object;
+
export function getEventScope(eventScopeInput: EventScopeInput): UrlDrilldownEventScope {
if (isRangeSelectTriggerContext(eventScopeInput)) {
return getEventScopeFromRangeSelectTriggerContext(eventScopeInput);
} else if (isValueClickTriggerContext(eventScopeInput)) {
return getEventScopeFromValueClickTriggerContext(eventScopeInput);
+ } else if (isContextMenuTriggerContext(eventScopeInput)) {
+ return {};
} else {
throw new Error("UrlDrilldown [getEventScope] can't build scope from not supported trigger");
}
@@ -169,7 +180,9 @@ export function getMockEventScope([trigger]: UrlTrigger[]): UrlDrilldownEventSco
from: new Date(Date.now() - 15 * 60 * 1000).toISOString(), // 15 minutes ago
to: new Date().toISOString(),
};
- } else {
+ }
+
+ if (trigger === VALUE_CLICK_TRIGGER) {
// number of mock points to generate
// should be larger or equal of any possible data points length emitted by VALUE_CLICK_TRIGGER
const nPoints = 4;
@@ -184,6 +197,8 @@ export function getMockEventScope([trigger]: UrlTrigger[]): UrlDrilldownEventSco
points,
};
}
+
+ return {};
}
type Primitive = string | number | boolean | null;
diff --git a/x-pack/plugins/embeddable_enhanced/public/actions/drilldown_grouping.ts b/x-pack/plugins/embeddable_enhanced/public/actions/drilldown_grouping.ts
index 5ea8928532c28..0aa1c0e6f08ae 100644
--- a/x-pack/plugins/embeddable_enhanced/public/actions/drilldown_grouping.ts
+++ b/x-pack/plugins/embeddable_enhanced/public/actions/drilldown_grouping.ts
@@ -4,15 +4,19 @@
* you may not use this file except in compliance with the Elastic License.
*/
+import { i18n } from '@kbn/i18n';
import { IEmbeddable } from '../../../../../src/plugins/embeddable/public';
import { UiActionsPresentableGrouping as PresentableGrouping } from '../../../../../src/plugins/ui_actions/public';
-export const contextMenuDrilldownGrouping: PresentableGrouping<{
+export const drilldownGrouping: PresentableGrouping<{
embeddable?: IEmbeddable;
}> = [
{
id: 'drilldowns',
- getDisplayName: () => 'Drilldowns',
+ getDisplayName: () =>
+ i18n.translate('xpack.embeddableEnhanced.Drilldowns', {
+ defaultMessage: 'Drilldowns',
+ }),
getIconType: () => 'symlink',
order: 25,
},
diff --git a/x-pack/plugins/embeddable_enhanced/public/index.ts b/x-pack/plugins/embeddable_enhanced/public/index.ts
index a7916685239df..24f8eb623abe0 100644
--- a/x-pack/plugins/embeddable_enhanced/public/index.ts
+++ b/x-pack/plugins/embeddable_enhanced/public/index.ts
@@ -20,4 +20,4 @@ export function plugin(context: PluginInitializerContext) {
export { EnhancedEmbeddable, EnhancedEmbeddableContext } from './types';
export { isEnhancedEmbeddable } from './embeddables';
-export { contextMenuDrilldownGrouping as embeddableEnhancedContextMenuDrilldownGrouping } from './actions';
+export { drilldownGrouping as embeddableEnhancedDrilldownGrouping } from './actions';
diff --git a/x-pack/plugins/ui_actions_enhanced/public/dynamic_actions/dynamic_action_grouping.ts b/x-pack/plugins/ui_actions_enhanced/public/dynamic_actions/dynamic_action_grouping.ts
new file mode 100644
index 0000000000000..feda1c93e2511
--- /dev/null
+++ b/x-pack/plugins/ui_actions_enhanced/public/dynamic_actions/dynamic_action_grouping.ts
@@ -0,0 +1,23 @@
+/*
+ * 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 { i18n } from '@kbn/i18n';
+import { IEmbeddable } from '../../../../../src/plugins/embeddable/public';
+import { UiActionsPresentableGrouping as PresentableGrouping } from '../../../../../src/plugins/ui_actions/public';
+
+export const dynamicActionGrouping: PresentableGrouping<{
+ embeddable?: IEmbeddable;
+}> = [
+ {
+ id: 'dynamicActions',
+ getDisplayName: () =>
+ i18n.translate('xpack.uiActionsEnhanced.CustomActions', {
+ defaultMessage: 'Custom actions',
+ }),
+ getIconType: () => 'symlink',
+ order: 26,
+ },
+];
diff --git a/x-pack/plugins/ui_actions_enhanced/public/dynamic_actions/dynamic_action_manager.test.ts b/x-pack/plugins/ui_actions_enhanced/public/dynamic_actions/dynamic_action_manager.test.ts
index cdd357f3560b8..cbc381c911c3d 100644
--- a/x-pack/plugins/ui_actions_enhanced/public/dynamic_actions/dynamic_action_manager.test.ts
+++ b/x-pack/plugins/ui_actions_enhanced/public/dynamic_actions/dynamic_action_manager.test.ts
@@ -13,6 +13,7 @@ import { UiActionsServiceEnhancements } from '../services';
import { ActionFactoryDefinition } from './action_factory_definition';
import { SerializedAction, SerializedEvent } from './types';
import { licensingMock } from '../../../licensing/public/mocks';
+import { dynamicActionGrouping } from './dynamic_action_grouping';
const actionFactoryDefinition1: ActionFactoryDefinition = {
id: 'ACTION_FACTORY_1',
@@ -294,6 +295,27 @@ describe('DynamicActionManager', () => {
expect(manager.state.get().events.length).toBe(1);
});
+ test('adds revived actiosn to "dynamic action" grouping', async () => {
+ const { manager, uiActions, actions } = setup([]);
+ const action: SerializedAction = {
+ factoryId: actionFactoryDefinition1.id,
+ name: 'foo',
+ config: {},
+ };
+
+ uiActions.registerActionFactory(actionFactoryDefinition1);
+
+ await manager.start();
+
+ expect(manager.state.get().events.length).toBe(0);
+
+ await manager.createEvent(action, ['VALUE_CLICK_TRIGGER']);
+
+ const createdAction = actions.values().next().value;
+
+ expect(createdAction.grouping).toBe(dynamicActionGrouping);
+ });
+
test('optimistically adds event to UI state', async () => {
const { manager, uiActions } = setup([]);
const action: SerializedAction = {
diff --git a/x-pack/plugins/ui_actions_enhanced/public/dynamic_actions/dynamic_action_manager.ts b/x-pack/plugins/ui_actions_enhanced/public/dynamic_actions/dynamic_action_manager.ts
index b414296690c9e..f096b17f8a78d 100644
--- a/x-pack/plugins/ui_actions_enhanced/public/dynamic_actions/dynamic_action_manager.ts
+++ b/x-pack/plugins/ui_actions_enhanced/public/dynamic_actions/dynamic_action_manager.ts
@@ -18,6 +18,7 @@ import {
} from '../../../../../src/plugins/kibana_utils/common';
import { StartContract } from '../plugin';
import { SerializedAction, SerializedEvent } from './types';
+import { dynamicActionGrouping } from './dynamic_action_grouping';
const compareEvents = (
a: ReadonlyArray<{ eventId: string }>,
@@ -93,6 +94,7 @@ export class DynamicActionManager {
uiActions.registerAction({
...actionDefinition,
id: actionId,
+ grouping: dynamicActionGrouping,
isCompatible: async (context) => {
if (!(await isCompatible(context))) return false;
if (!actionDefinition.isCompatible) return true;