> ## Documentation Index
> Fetch the complete documentation index at: https://docs.aseeflow.org/llms.txt
> Use this file to discover all available pages before exploring further.

# Cockpit Plugins

Cockpit defines a plugin concept to add own functionality without being forced to extend or hack the Cockpit web application. You can add plugins at various plugin points, e.g., the processes dashboard as shown in the following example:

<img src="https://mintcdn.com/aseeflow/dqqUjdK6iArE_QQL/webapps/cockpit/img/cockpit-plugin.png?fit=max&auto=format&n=dqqUjdK6iArE_QQL&q=85&s=71c06ac5512ba98dd032a8ca401acd43" alt="Cockpit Plugin" width="1200" height="700" data-path="webapps/cockpit/img/cockpit-plugin.png" />

## The Nature of a Cockpit Plugin

A Cockpit plugin is a maven jar project that is included in the Cockpit webapplication as a library dependency. It provides a server-side and a client-side extension to Cockpit.

On the server-side, it can extend Cockpit with custom SQL queries and JAX-RS resource classes. Queries (defined via [MyBatis](http://www.mybatis.org/)) may be used to squeeze additional intel out of an engine database or to execute custom engine operations. JAX-RS resources on the other hand extend the Cockpit API and expose data to the client-side part of the plugin.

On the client-side a plugin may include Javascript modules to extend the Cockpit webapplication. Via those modules a plugin provides custom views.

### File structure

The basic skeleton of a Cockpit plugin looks as follows:

```
cockpit-plugin/
├── src/
|   ├── main/
|   |   ├── java/
|   |   |   └── org/my/plugin/
|   |   |       ├── db/
|   |   |       |   └── MyDto.java                                    (5)
|   |   |       ├── resource/
|   |   |       |   ├── MyPluginRootResource.java                     (3)
|   |   |       |   └── ...                                           (4)
|   |   |       └── MyPlugin.java                                     (1)
|   |   └── resources/
|   |       ├── META-INF/services/
|   |       |   └── org.camunda.bpm.cockpit.plugin.spi.CockpitPlugin  (2)
|   |       ├── org/my/plugin/queries/                                (6)
|   |       |   └── sample.xml
|   |       └── plugin-webapp/MyPlugin/                               (7)
|   |           └── app/
|   |               ├── plugin.js                                     (8)
|   |               ├── plugin.css                                    (9)
|   |               └── ...
|   └── test/
|       ├── java/
|       |   └── org/my/plugin/
|       |       └── MyPluginTest.java
|       └── resources/
|           └── camunda.cfg.xml
└── pom.xml
```

As runtime relevant resource it defines

1. a plugin main class
2. a `META-INF/services` entry that publishes the plugin to Cockpit
3. a plugin root [JAX-RS](https://jax-rs-spec.java.net/) resource that wires the server-side API.
   When you want to include a frontend module in your plugin, you can use `AbstractCockpitPluginRootResource` as the plug-in resources base class.
   This allows you to serve static client-side resources under the `/static` path.
   Per convention, these resources must reside in a `/plugin-webapp/$plugin_id` directory absolute to the classpath root.
   * the plugin root resource has to explicitly declare the assets that are allowed to be served via the REST API.
     You can declare your assets by overriding the `AbstractAppPluginRootResource#getAllowedAssets()` method in your root resource.
     Undeclared assets won't be served.
     The default implementation contains two predefined assets: `app/plugin.js` and `app/plugin.css`.
4. other resources that are part of the server-side API
5. data transfer objects used by the resources
6. mapping files that provide additional Cockpit queries as [MyBatis](http://www.mybatis.org/) mappings
7. resource directory from which client-side plugin assets are served as static files
8. a js file that exports a frontend module. This file must be named `plugin.js` and be located in the `app` directory of the plugin asset directory
9. a css file that contains the style definitions for the client-side plugin. This file must be named `plugin.css` and be located in the `app` directory of the plugin asset directory

<Info>
  **Related Example**

  [How to develop a Cockpit plugin](https://github.com/camunda/camunda-bpm-examples/tree/master/cockpit/cockpit-fullstack-count-processes)
</Info>

### Structure of a Frontend Module

A frontend module always follows the same structure. This is how a sample `plugin.js` could look like:

```Javascript theme={null}
export default {
  id: "customPlugin",
  pluginPoint: "cockpit.dashboard",
  priority: 5,
  render: container => {
    container.innerHTML = "Hello World!";
  }
};
```

This file can also be included standalone as a [custom script](/webapps/cockpit/extend/configuration#custom-scripts).

<Info>
  **Important notes about the structure**

  1. The default export is either one plugin or an array of plugins. Only the default export will be considered in Cockpit.
  2. The render function must not have a return value.
</Info>

#### Attributes in Detail

* `id`: A string which defines this plugin. Should be unique across the application. This can be used to exclude plugins, see [Plugin exclusion](#plugin-exclusion-client-side).

* `pluginPoint`: A string which describes where the plugin is rendered. This also defines which parameters are passed into the render function, see the [plugin point reference](#plugin-points)

* `priority`: Number, describes in which order the plugins at the same pluginPoint will be mounted. For certain Plugin points (like `cockpit.navigation`), a negative priority hides the entry in a dropdown. How this is handled depends on the Plugin Point.

* `render`: Function, the heart of your Plugin. Arguments are (`DOMNode`|`BPMNioViewerInstance`, additionalData (`Object`)). Using the DOM node, you can render your plugin into the DOM.\
  The second argument contains API endpoints and CSRF cookie information, as well as constants like a `processDefinitionId`. The `api` key is always present and contains
  * `engine`: the engine name
  * `CSRFToken`: the current CSRF token for your requests
  * `baseApi`, `adminApi`, `cockpitApi`, `engineApi`: The paths to different API endpoints. The engineApi corresponds to the [Rest Api](/reference/rest)
    The details of which data is passed into the plugin can be found at the [plugin point reference](#plugin-points).

* `result`: Function, only available in data plugins. Argument is a (`Promise`).

* `unmount`: Optional function which is called when the Plugin is unmounted. Use this to cleanup any listeners you or your Framework might have registered.

* `properties`: Optional object which contains all additional configuration for the plugin point, such as labels.

## Plugin Exclusion (Client Side)

You can exclude some plugins from the interface by adding a `cam-exclude-plugins`
attribute to the HTML `base` tag of the page loading the interface.
The content of the attribute is a comma separated list formatted like: `<plugin.key>:<feature.id>`.
If the feature ID is not provided, the whole plugin will be excluded.

### Excluding a Complete Plugin

This example will completely deactivate the action buttons on the right side of the process instance view.

```html theme={null}
<base href="/"
      cam-exclude-plugins="cockpit.processInstance.runtime.action" />
```

### Excluding a Plugin Feature

In this example we deactivate the cancel action in the Cockpit process instance view and disable the job retry action button:

```html theme={null}
<base href="/"
      cam-exclude-plugins="cockpit.processInstance.runtime.action:cancel-process-instance-action,
                           cockpit.processInstance.runtime.action:job-retry-action" />
```

## Plugin points

In this section you will find all Cockpit plugin points.
To configure where you place your plugin, enter the ID into the `pluginPoint` attribute of you frontend module.

Plugin Points describe where a Plugin will be rendered and define which additional data is passed into the second argument of the render function.

For more information on creating and configuring your own plugin, please see [How to develop a Cockpit plugin](https://github.com/camunda/camunda-bpm-examples/tree/master/cockpit/cockpit-fullstack-count-processes).

### Data

**Data Plugin Points** have a `#result` function that gets the response data as a promise of a called REST endpoint passed.
The `#result` function is called when the respective HTTP request is performed.
The first argument of the `#result` function is a (`Promise`).

#### Login Data

**Name:** `cockit.login.data`\
**REST Endpoint:** `POST /camunda/api/admin/auth/user/default/login/cockpit`

When a user clicks on the **Login** button of the login form, the plugin points `#result` function is called.
Your [Login Plugin](#login) can react to the data that this data plugin will retrieve.

This plugin point is available for all web apps. Just change the canonical app name for the respective webapp (`tasklist.login.data`, `admin.login.data`, `welcome.login.data`).

### Route

**Name:** `cockpit.route`

This plugin points properties contain the attribute `path`, which stands for the hashRoute for this page. This will be rendered when the user navigates in the browser to the url, e.g. `#/my-path`.

```Javascript theme={null}
properties: {
  path: "/my-path"
}
```

### Navigation

<img src="https://mintcdn.com/aseeflow/4yOBzdSDvByji_-L/webapps/cockpit/img/plugin-points/plugin-point-navigation.png?fit=max&auto=format&n=4yOBzdSDvByji_-L&q=85&s=80f0134939fe5a27c4c412d9b3940dcb" alt="Navigation" width="1200" height="700" data-path="webapps/cockpit/img/plugin-points/plugin-point-navigation.png" />

**Name:** `cockpit.navigation`

This plugin point can be used in conjunction with a `cockpit.route` plugin or for shortcuts to existing pages. Negative priority will hide the entry in a drop-down.

This plugin points properties contain the attribute `path`, which matches the location to highlight the active menu entry when the user is on a certain page. The value can be a regex. If no `path` is set, the menu entry will never be highlighted.

```Javascript theme={null}
properties: {
  path: "/my-path"
}
```

### Login

**Name:** `cockpit.login`

<img src="https://mintcdn.com/aseeflow/4yOBzdSDvByji_-L/webapps/cockpit/img/plugin-points/plugin-point-login-custom.png?fit=max&auto=format&n=4yOBzdSDvByji_-L&q=85&s=b0e4d069b2ff4795baaea0000bb9c9f1" alt="Login" width="1200" height="600" data-path="webapps/cockpit/img/plugin-points/plugin-point-login-custom.png" />

The `cockpit.login` plugin point allows to add your custom views at the place where the web app renders the login form.

This plugin point is available for all web apps. Just change the canonical app name for the respective webapp (`tasklist.login`, `admin.login`, `welcome.login`).

### Dashboard

**Name:** `cockpit.dashboard`

<img src="https://mintcdn.com/aseeflow/dqqUjdK6iArE_QQL/webapps/cockpit/img/plugin-points/plugin-point-dashboard-custom.png?fit=max&auto=format&n=dqqUjdK6iArE_QQL&q=85&s=ac82b8d14b4412dda278c32f0da0d015" alt="Dashboard" width="1200" height="700" data-path="webapps/cockpit/img/plugin-points/plugin-point-dashboard-custom.png" />

The `cockpit.dashboard` plugin point will allow to add your custom views at the bottom of the dashboard.

### Metrics

**Name:** `cockpit.dashboard.metrics`

<img src="https://mintcdn.com/aseeflow/dqqUjdK6iArE_QQL/webapps/cockpit/img/plugin-points/plugin-point-dashboard-metrics-view.png?fit=max&auto=format&n=dqqUjdK6iArE_QQL&q=85&s=72c19b03adc717c21d4cd269812eae31" alt="Dashboard" width="1200" height="700" data-path="webapps/cockpit/img/plugin-points/plugin-point-dashboard-metrics-view.png" />

### Processes Dashboard

**Name:** `cockpit.processes.dashboard`

<img src="https://mintcdn.com/aseeflow/dqqUjdK6iArE_QQL/webapps/cockpit/img/plugin-points/plugin-point-cockpit-processes-dashboard.png?fit=max&auto=format&n=dqqUjdK6iArE_QQL&q=85&s=3a72817f3a349df2e8501e57c6bdb91c" alt="Dashboard" width="1200" height="700" data-path="webapps/cockpit/img/plugin-points/plugin-point-cockpit-processes-dashboard.png" />

### Decisions Dashboard

**Name:** `cockpit.decisions.dashboard`

<img src="https://mintcdn.com/aseeflow/dqqUjdK6iArE_QQL/webapps/cockpit/img/plugin-points/plugin-point-cockpit-decisions-dashboard.png?fit=max&auto=format&n=dqqUjdK6iArE_QQL&q=85&s=777813abe46704268eff74752da3657f" alt="Dashboard" width="1200" height="700" data-path="webapps/cockpit/img/plugin-points/plugin-point-cockpit-decisions-dashboard.png" />

### Cases Dashboard

**Name:** `cockpit.cases.dashboard`

<img src="https://mintcdn.com/aseeflow/dqqUjdK6iArE_QQL/webapps/cockpit/img/plugin-points/plugin-point-cockpit-cases-dashboard.png?fit=max&auto=format&n=dqqUjdK6iArE_QQL&q=85&s=46eb3180f56391a9dd1b5ed27c4a4e14" alt="Dashboard" width="1200" height="700" data-path="webapps/cockpit/img/plugin-points/plugin-point-cockpit-cases-dashboard.png" />

### Process Definition Runtime Tab

**Name:** `cockpit.processDefinition.runtime.tab`

<img src="https://mintcdn.com/aseeflow/4yOBzdSDvByji_-L/webapps/cockpit/img/plugin-points/plugin-point-process-definition-details.png?fit=max&auto=format&n=4yOBzdSDvByji_-L&q=85&s=00e00dffb63aa58caf6e16f3acca63f2" alt="Process Definition Runtime Tab" width="1200" height="700" data-path="webapps/cockpit/img/plugin-points/plugin-point-process-definition-details.png" />

This plugin points properties contain the attribute `label`, which will be rendered in the navigation even when the plugin is not selected.

```Javascript theme={null}
properties: {
  label: "My Plugin"
}
```

This additional data is passed into the render function:

* `processDefinitionId`

### Process Instance Runtime Tab

**Name:** `cockpit.processInstance.runtime.tab`

<img src="https://mintcdn.com/aseeflow/4yOBzdSDvByji_-L/webapps/cockpit/img/plugin-points/plugin-point-process-instance-details.png?fit=max&auto=format&n=4yOBzdSDvByji_-L&q=85&s=33f04d68eeab15b6c6e66c0d8a3879ed" alt="Process Instance Runtime Tab" width="1200" height="700" data-path="webapps/cockpit/img/plugin-points/plugin-point-process-instance-details.png" />

This plugin points properties contain the attribute `label`, which will be rendered in the navigation even when the plugin is not selected.

```Javascript theme={null}
properties: {
  label: "My Plugin"
}
```

This additional data is passed into the render function:

* `processInstanceId`

### Process Definition Runtime Action

**Name:** `cockpit.processDefinition.runtime.action`

<img src="https://mintcdn.com/aseeflow/4yOBzdSDvByji_-L/webapps/cockpit/img/plugin-points/plugin-point-process-definition-runtime-action.png?fit=max&auto=format&n=4yOBzdSDvByji_-L&q=85&s=919e564cfc2beb7996f12a7ea99a9beb" alt="Process Definition Runtime Action" width="1200" height="700" data-path="webapps/cockpit/img/plugin-points/plugin-point-process-definition-runtime-action.png" />

This additional data is passed into the render function:

* `processDefinitionId`

### Process Instance Runtime Action

**Name:** `cockpit.processInstance.runtime.action`

<img src="https://mintcdn.com/aseeflow/4yOBzdSDvByji_-L/webapps/cockpit/img/plugin-points/plugin-point-process-instance-runtime-action.png?fit=max&auto=format&n=4yOBzdSDvByji_-L&q=85&s=cb9e8702ae061ea797175ef488183055" alt="Process Instance Runtime Action" width="1200" height="700" data-path="webapps/cockpit/img/plugin-points/plugin-point-process-instance-runtime-action.png" />

This additional data is passed into the render function:

* `processInstanceId`

### Process Definition View

**Name:** `cockpit.processDefinition.view`

<img src="https://mintcdn.com/aseeflow/dqqUjdK6iArE_QQL/webapps/cockpit/img/plugin-points/plugin-point-cockpit-process-definition-view.png?fit=max&auto=format&n=dqqUjdK6iArE_QQL&q=85&s=0ee92825329c9c8c567b15d4efaf4a25" alt="Process Definition View" width="1200" height="700" data-path="webapps/cockpit/img/plugin-points/plugin-point-cockpit-process-definition-view.png" />

### Process Instance View

**Name:** `cockpit.processInstance.view`

<img src="https://mintcdn.com/aseeflow/dqqUjdK6iArE_QQL/webapps/cockpit/img/plugin-points/plugin-point-cockpit-process-instance-view.png?fit=max&auto=format&n=dqqUjdK6iArE_QQL&q=85&s=c0b33bea760f5f2833f70b2f407ee26c" alt="Process Instance View" width="1200" height="700" data-path="webapps/cockpit/img/plugin-points/plugin-point-cockpit-process-instance-view.png" />

### Process Definition Diagram Overlay

**Name:** `cockpit.processDefinition.diagram.plugin`

<img src="https://mintcdn.com/aseeflow/dqqUjdK6iArE_QQL/webapps/cockpit/img/plugin-points/plugin-point-definition-diagram-overlay.png?fit=max&auto=format&n=dqqUjdK6iArE_QQL&q=85&s=3b1c121624457061ed4ed3b728436ea5" alt="Definition Diagram Overlay" width="1200" height="700" data-path="webapps/cockpit/img/plugin-points/plugin-point-definition-diagram-overlay.png" />

Diagram overlay plugins are a little different from other plugins.
This plugin point does not receive a DOM node to render into but an instance of the Diagram viewer to create an overlay.

```Javascript theme={null}
export default {
  id: "myOverlay",
  pluginPoint: "cockpit.processDefinition.diagram.plugin",
  priority: 0,
  render: (viewer, {processDefinitionId}) => {
    viewer.get("overlays").add(
      // ...
    )
  }
};
```

This additional data is passed into the render function:

* `processDefinitionId`

### Process Instance Diagram Overlay

**Name:** `cockpit.processInstance.diagram.plugin`

<img src="https://mintcdn.com/aseeflow/dqqUjdK6iArE_QQL/webapps/cockpit/img/plugin-points/plugin-point-instance-diagram-overlay.png?fit=max&auto=format&n=dqqUjdK6iArE_QQL&q=85&s=56ab684e431648bd4a1cf78863a2b7fa" alt="Instance Diagram Overlay" width="1200" height="700" data-path="webapps/cockpit/img/plugin-points/plugin-point-instance-diagram-overlay.png" />

Diagram overlay plugins are a little different from other plugins.
This plugin point does not receive a DOM node to render into but an instance of the Diagram viewer to create an overlay. See [Process Definition Diagram Overlay](#process-definition-diagram-overlay) for an example.

This additional data is passed into the render function:

* `processInstanceId`

### Job Definition Action

**Name:** `cockpit.jobDefinition.action`

<img src="https://mintcdn.com/aseeflow/dqqUjdK6iArE_QQL/webapps/cockpit/img/plugin-points/plugin-point-job-definition-action.png?fit=max&auto=format&n=dqqUjdK6iArE_QQL&q=85&s=4d0a74125983c2c6869021d739d1bbd2" alt="Job Definition Action" width="1200" height="700" data-path="webapps/cockpit/img/plugin-points/plugin-point-job-definition-action.png" />

This additional data is passed into the render function:

* `jobDefinitionId`

### Decision Definition Tab

**Name:** `cockpit.decisionDefinition.tab`

<img src="https://mintcdn.com/aseeflow/dqqUjdK6iArE_QQL/webapps/cockpit/img/plugin-points/plugin-point-decision-definition-tab.png?fit=max&auto=format&n=dqqUjdK6iArE_QQL&q=85&s=9f69b9f5e0304f6b5d75b460f5beb712" alt="Decision Definition Tab" width="1200" height="700" data-path="webapps/cockpit/img/plugin-points/plugin-point-decision-definition-tab.png" />

This plugin points properties contain the attribute `label`, which will be rendered in the navigation even when the plugin is not selected.

```Javascript theme={null}
properties: {
  label: "My Plugin"
}
```

This additional data is passed into the render function:

* `decisionDefinitionId`

### Decision Definition Action

**Name:** `cockpit.decisionDefinition.action`

<img src="https://mintcdn.com/aseeflow/dqqUjdK6iArE_QQL/webapps/cockpit/img/plugin-points/plugin-point-decision-definition-action.png?fit=max&auto=format&n=dqqUjdK6iArE_QQL&q=85&s=5fd5d7c7045072d03530f1ba6a7f6b8f" alt="Decision Definition Action" width="1200" height="700" data-path="webapps/cockpit/img/plugin-points/plugin-point-decision-definition-action.png" />

This additional data is passed into the render function:

* `decisionDefinitionId`

### Decision Definition Table

**Name:** `cockpit.decisionDefinition.table`

<img src="https://mintcdn.com/aseeflow/dqqUjdK6iArE_QQL/webapps/cockpit/img/plugin-points/plugin-point-decision-definition-table.png?fit=max&auto=format&n=dqqUjdK6iArE_QQL&q=85&s=9e22399123e79c932c8a56583b60134b" alt="Decision Definition Table" width="1200" height="700" data-path="webapps/cockpit/img/plugin-points/plugin-point-decision-definition-table.png" />

Diagram overlay plugins are a little different from other plugins.
This plugin point does not receive a DOM node to render into but an instance of the Diagram viewer to create an overlay. See [Process Definition Diagram Overlay](#process-definition-diagram-overlay) for an example.

This additional data is passed into the render function:

* `decisionDefinitionId`

### Decision Instance Tab

**Name:** `cockpit.decisionInstance.tab`

<img src="https://mintcdn.com/aseeflow/dqqUjdK6iArE_QQL/webapps/cockpit/img/plugin-points/plugin-point-decision-instance-tab.png?fit=max&auto=format&n=dqqUjdK6iArE_QQL&q=85&s=e641900325e305d7bdcefe4526d2055d" alt="Decision Instance Tab" width="1200" height="700" data-path="webapps/cockpit/img/plugin-points/plugin-point-decision-instance-tab.png" />

This plugin points properties contain the attribute `label`, which will be rendered in the navigation even when the plugin is not selected.

```Javascript theme={null}
properties: {
  label: "My Plugin"
}
```

This additional data is passed into the render function:

* `decisionInstanceId`

### Decision Instance Action

**Name:** `cockpit.decisionInstance.action`

<img src="https://mintcdn.com/aseeflow/dqqUjdK6iArE_QQL/webapps/cockpit/img/plugin-points/plugin-point-decision-instance-action.png?fit=max&auto=format&n=dqqUjdK6iArE_QQL&q=85&s=ae1cf195ce6c187675ae3cd1cb0cf83a" alt="Decision Instance Action" width="1200" height="700" data-path="webapps/cockpit/img/plugin-points/plugin-point-decision-instance-action.png" />

This additional data is passed into the render function:

* `decisionInstanceId`

### Decision Instance Table

**Name:** `cockpit.decisionInstance.table`

<img src="https://mintcdn.com/aseeflow/dqqUjdK6iArE_QQL/webapps/cockpit/img/plugin-points/plugin-point-decision-instance-table.png?fit=max&auto=format&n=dqqUjdK6iArE_QQL&q=85&s=554fd922a54017d6419eb717d4de10f6" alt="Decision Instance Table" width="1200" height="700" data-path="webapps/cockpit/img/plugin-points/plugin-point-decision-instance-table.png" />

Diagram overlay plugins are a little different from other plugins.
This plugin point does not receive a DOM node to render into but an instance of the Diagram viewer to create an overlay. See [Process Definition Diagram Overlay](#process-definition-diagram-overlay) for an example.

This additional data is passed into the render function:

* `decisionInstanceId`

### Case Definition Tab

**Name:** `cockpit.caseDefinition.tab`

<img src="https://mintcdn.com/aseeflow/dqqUjdK6iArE_QQL/webapps/cockpit/img/plugin-points/plugin-point-case-definition-tab.png?fit=max&auto=format&n=dqqUjdK6iArE_QQL&q=85&s=50d5bf75aac57bebdec04a79fee86188" alt="Case Definition Tab" width="1200" height="700" data-path="webapps/cockpit/img/plugin-points/plugin-point-case-definition-tab.png" />

This plugin points properties contain the attribute `label`, which will be rendered in the navigation even when the plugin is not selected.

```Javascript theme={null}
properties: {
  label: "My Plugin"
}
```

This additional data is passed into the render function:

* `decisionInstanceId`

### Case Definition Action

**Name:** `cockpit.caseDefinition.action`

<img src="https://mintcdn.com/aseeflow/dqqUjdK6iArE_QQL/webapps/cockpit/img/plugin-points/plugin-point-case-definition-action.png?fit=max&auto=format&n=dqqUjdK6iArE_QQL&q=85&s=29ab0c6596024f475fdd4e147ebb7001" alt="Case Definition Action" width="1200" height="700" data-path="webapps/cockpit/img/plugin-points/plugin-point-case-definition-action.png" />

This plugin points properties contain the attribute `label`, which will be rendered in the navigation even when the plugin is not selected.

```Javascript theme={null}
properties: {
  label: "My Plugin"
}
```

This additional data is passed into the render function:

* `caseDefinitionId`

### Case Definition Diagram Overlay

**Name:** `cockpit.caseDefinition.diagram.overlay`

<img src="https://mintcdn.com/aseeflow/dqqUjdK6iArE_QQL/webapps/cockpit/img/plugin-points/plugin-point-case-definition-diagram-overlay.png?fit=max&auto=format&n=dqqUjdK6iArE_QQL&q=85&s=f480d7f4acc963fe916d38d0cb448fb3" alt="Case Definition Diagram Overlay" width="1200" height="700" data-path="webapps/cockpit/img/plugin-points/plugin-point-case-definition-diagram-overlay.png" />

### Case Definition Diagram Plugin

**Name:** `cockpit.caseDefinition.diagram.plugin`

<img src="https://mintcdn.com/aseeflow/dqqUjdK6iArE_QQL/webapps/cockpit/img/plugin-points/plugin-point-case-definition-diagram-overlay.png?fit=max&auto=format&n=dqqUjdK6iArE_QQL&q=85&s=f480d7f4acc963fe916d38d0cb448fb3" alt="Case Definition Diagram Overlay" width="1200" height="700" data-path="webapps/cockpit/img/plugin-points/plugin-point-case-definition-diagram-overlay.png" />

Diagram overlay plugins are a little different from other plugins.
This plugin point does not receive a DOM node to render into but an instance of the Diagram viewer to create an overlay. See [Process Definition Diagram Overlay](#process-definition-diagram-overlay) for an example.

This additional data is passed into the render function:

* `caseDefinitionId`

### Case Instance Tab

**Name:** `cockpit.caseInstance.tab`

<img src="https://mintcdn.com/aseeflow/dqqUjdK6iArE_QQL/webapps/cockpit/img/plugin-points/plugin-point-case-instance-tab.png?fit=max&auto=format&n=dqqUjdK6iArE_QQL&q=85&s=57ba69251baa83a27c834efc15c3f3a1" alt="Case Instance Tab" width="1200" height="700" data-path="webapps/cockpit/img/plugin-points/plugin-point-case-instance-tab.png" />

This plugin points properties contain the attribute `label`, which will be rendered in the navigation even when the plugin is not selected.

```Javascript theme={null}
properties: {
  label: "My Plugin"
}
```

This additional data is passed into the render function:

* `caseInstanceId`

### Case Instance Action

**Name:** `cockpit.caseInstance.action`

<img src="https://mintcdn.com/aseeflow/dqqUjdK6iArE_QQL/webapps/cockpit/img/plugin-points/plugin-point-case-instance-action.png?fit=max&auto=format&n=dqqUjdK6iArE_QQL&q=85&s=ba00aeec613db87ca54e0bb0f224243e" alt="Case Instance Action" width="1200" height="700" data-path="webapps/cockpit/img/plugin-points/plugin-point-case-instance-action.png" />

This additional data is passed into the render function:

* `caseInstanceId`

### Case Instance Diagram Overlay

**Name:** `cockpit.caseInstance.diagram.overlay`

<img src="https://mintcdn.com/aseeflow/dqqUjdK6iArE_QQL/webapps/cockpit/img/plugin-points/plugin-point-case-instance-diagram-overlay.png?fit=max&auto=format&n=dqqUjdK6iArE_QQL&q=85&s=e8c0ce22bf74db05587a468f3871ccb2" alt="Case Instance Diagram Overlay" width="1200" height="700" data-path="webapps/cockpit/img/plugin-points/plugin-point-case-instance-diagram-overlay.png" />

### Case Instance Diagram Plugin

**Name:** `cockpit.caseInstance.diagram.plugin`

<img src="https://mintcdn.com/aseeflow/dqqUjdK6iArE_QQL/webapps/cockpit/img/plugin-points/plugin-point-case-instance-diagram-overlay.png?fit=max&auto=format&n=dqqUjdK6iArE_QQL&q=85&s=e8c0ce22bf74db05587a468f3871ccb2" alt="Case Instance Diagram Overlay" width="1200" height="700" data-path="webapps/cockpit/img/plugin-points/plugin-point-case-instance-diagram-overlay.png" />

Diagram overlay plugins are a little different from other plugins.
This plugin point does not receive a DOM node to render into but an instance of the Diagram viewer to create an overlay. See [Process Definition Diagram Overlay](#process-definition-diagram-overlay) for an example.

This additional data is passed into the render function:

* `caseDefinitionId`
* `caseInstanceId`

### Repository Resource Action

**Name:** `cockpit.repository.resource.action`

<img src="https://mintcdn.com/aseeflow/4yOBzdSDvByji_-L/webapps/cockpit/img/plugin-points/plugin-point-repository-resource-action.png?fit=max&auto=format&n=4yOBzdSDvByji_-L&q=85&s=404aaf16dcb1aacd74577303b5d2959c" alt="Repository Resource Action" width="1200" height="700" data-path="webapps/cockpit/img/plugin-points/plugin-point-repository-resource-action.png" />

This additional data is passed into the render function:

* `deploymentId`
* `resourceId`

### Repository Resource Detail

**Name:** `cockpit.repository.resource.detail`

<img src="https://mintcdn.com/aseeflow/4yOBzdSDvByji_-L/webapps/cockpit/img/plugin-points/plugin-point-repository-resource-detail.png?fit=max&auto=format&n=4yOBzdSDvByji_-L&q=85&s=af23bb1df84226e9ea9f2720ea460f4c" alt="Repository Resource Detail" width="1200" height="700" data-path="webapps/cockpit/img/plugin-points/plugin-point-repository-resource-detail.png" />

This additional data is passed into the render function:

* `deploymentId`
* `resourceId`

### Open Task Dashboard

**Name:** `cockpit.tasks.dashboard`

<img src="https://mintcdn.com/aseeflow/4yOBzdSDvByji_-L/webapps/cockpit/img/plugin-points/plugin-point-task-dashboard.png?fit=max&auto=format&n=4yOBzdSDvByji_-L&q=85&s=834a9b8be76421d103cd9343dba80bd0" alt="Open Task Dashboard" width="1200" height="700" data-path="webapps/cockpit/img/plugin-points/plugin-point-task-dashboard.png" />

### Report View

**Name:** `cockpit.report`

This plugin points properties contain the attribute `label`, which will be rendered in the navigation even when the plugin is not selected.

```Javascript theme={null}
properties: {
  label: "My Plugin"
}
```

### Batch Operation

**Name:** `cockpit.batch.operation`

<img src="https://mintcdn.com/aseeflow/dqqUjdK6iArE_QQL/webapps/cockpit/img/plugin-points/plugin-point-batch-operation.png?fit=max&auto=format&n=dqqUjdK6iArE_QQL&q=85&s=3d26b1ebf7315b1ad604ecea7e5b0fd0" alt="Custom Plugin" width="1200" height="700" data-path="webapps/cockpit/img/plugin-points/plugin-point-batch-operation.png" />

The render function can be used to create a form for custom payloads to your batch operation.

A simple batch operation without a payload could look like this:

```javascript theme={null}
export default {
  id: "my-batch-plugin",
  pluginPoint: "cockpit.batch.operation",
  priority: 0,
  render: () => {},

  properties: {
    // Defines which instances the search field will be showing
    searchType: "process" || "decision" || "batch",

    // A function which returns the endpoint and the payload of the batch operation. The argument contains either the search query or the selected IDs.
    // 'api' contains the engine API endpoints. See "Attributes in Detail" for more information.
    onSubmit: function({ query, ids, api }) {
      // The return value must contain the endpoint and the payload object.
      return {
        endpoint: "/my/custom/batch/endpoint",
        payload: {}
      };
    },

    // These labels are required
    labels: {
      dropdownLabel: "Title in the Dropdown menu",
      sentenceLabel: "e.g. 'modify'",
      passiveLabel: "e.g. 'modified'",
      searchHtml: "an <b>HTML</b> string to be displayed over the search bar"
    }
  }
};
```

### Incident Action

**Name:** `cockpit.incident.action`

<img src="https://mintcdn.com/aseeflow/dqqUjdK6iArE_QQL/webapps/cockpit/img/plugin-points/plugin-point-incident-action.png?fit=max&auto=format&n=dqqUjdK6iArE_QQL&q=85&s=012f05526cc0314dd837b950a82ebf98" alt="Incident Action" width="1200" height="700" data-path="webapps/cockpit/img/plugin-points/plugin-point-incident-action.png" />

This additional data is passed into the render function:

* `incidentId`
