Sidebar plugins
You can develop sidebar plugins and display them in custom sidebars alongside grids and in the details view.
Sidebar plugins overview
A sidebar plugin is a web page embedded in a sidebar pane that can interact with a single or multiple items in the grid view, or with a single item in the details view.
The sidebar plugin receives runtime context from OpenText Core Software Delivery Platform through URL parameters, such as selected entity IDs, workspace, and user info.
The plugin can use OpenText Core Software Delivery Platform's REST API to read and update data, and trigger UI behavior in OpenText Core Software Delivery Platform using a set of supported events.
All main entity types are supported, including requirements, features, and tests.
You can add them to all grid and details views that already include pane sidebars, such as Filter and Preview. For example, you can develop a plugin that contains a link to a Teams channel related to the selected feature, or a sketch board whose contents are added as attachments to the feature.
Sidebar plugins are a type of external action. For general external action guidelines, see External actions.
Top-level workflow
-
Build the sidebar plugin
Implement the plugin as a web page suitable for iframe embedding.
-
Integrate with the REST API
To interact with OpenText Core Software Delivery Platform data, include REST API calls in the plugin code. See REST API integration.
-
Handle supported events
If posting events back to OpenText Core Software Delivery Platform, implement message posting logic using
window.parent. See Supported events. -
Create the sidebar plugin JSON configuration object
Add required and optional properties, including the URL that loads the plugin web page. See JSON object.
-
Add runtime URL parameters
Optionally include URL tokens for runtime context, such as selected entity IDs, workspace, and user info. See Runtime URL parameters.
-
Deploy the sidebar plugin
Register the plugin as an external action, either by uploading a bundle or defining it in the external action editor. See External actions.
The external app
The sidebar plugin is a web page loaded in the sidebar pane.
Architecture context
-
To interact with data from OpenText Core Software Delivery Platform, the plugin code can include REST API requests.
-
If the plugin is hosted on an external server, trust must be established between OpenText Core Software Delivery Platform and the external server using the CORS mechanism. For details, see CORS for external actions.
-
If the plugin has a backend and needs to verify the identity of the invoking user, see User verification for external actions.
Supported events
The sidebar plugin can send instructions back to OpenText Core Software Delivery Platform using a set of supported events.
In practice, this means:
-
The sidebar plugin loads alongside a grid or details view.
-
The plugin performs an action, such as reading or updating entity data via REST API.
-
The plugin posts an event message so that OpenText Core Software Delivery Platform refreshes the UI or navigates to an entity.
Preconditions and transport
-
Since sidebar plugins always run inside an iframe, post messages using
window.parent. -
Include the expected context values in each message (
shared_space,workspace, andpanel_idwhere relevant), so the host can accept and route the message.
Supported events for sidebar plugins
| Event | Purpose |
|---|---|
octane_refresh_entity
|
Instruct OpenText Core Software Delivery Platform to refresh specified entities after they were updated in the plugin. |
octane_display_entity
|
Instruct OpenText Core Software Delivery Platform to open/display the details of a specified entity. |
octane_entity_was_added
|
Notify OpenText Core Software Delivery Platform that a new entity was created so it is displayed where relevant (as if it were created in OpenText Core Software Delivery Platform). |
octane_refresh_list
|
Instruct OpenText Core Software Delivery Platform to refresh the full grid/list after updates made in the plugin. |
octane_select_entity
|
Instruct OpenText Core Software Delivery Platform to select specified entities in the grid/list. |
octane_read_settings
|
Query the current user's settings for the application or a specified module. Results are returned in JSON. |
octane_update_settings
|
Add/update a value in settings (stored in the text key). |
octane_report_error
|
Instruct OpenText Core Software Delivery Platform to add an entry to its errors log. |
Note: If an entity is currently being edited with unsaved changes, some refresh operations may be intentionally suppressed to prevent data loss.
Code examples
Use these examples as implementation starters. Replace hardcoded values with runtime values in your app.
Refresh specific entities
The plugin updates specific entities and reflects those changes in the grid or details view.
var message = {
event_name: 'octane_refresh_entity',
shared_space: params.shared_space,
workspace: params.workspace,
data: {
entity_type: 'work_item',
entity_ids: ['1003', '4005'],
},
};
window.parent.postMessage(message, '*');
Refresh the full list
The plugin makes bulk changes and reloads the entire grid.
var message = {
event_name: 'octane_refresh_list',
shared_space: params.shared_space,
workspace: params.workspace,
data: {
entity_type: 'work_item',
},
};
window.parent.postMessage(message, '*');
Select entities in the grid
The plugin identifies entities that should be highlighted in the host grid.
var message = {
event_name: 'octane_select_entity',
shared_space: params.shared_space,
workspace: params.workspace,
data: {
entity_type: 'work_item',
entity_id: '1050',
},
};
window.parent.postMessage(message, '*');
Display an entity's details
The plugin triggers navigation to an entity's details view.
var message = {
event_name: 'octane_display_entity',
shared_space: params.shared_space,
workspace: params.workspace,
data: {
entity_type: 'work_item',
entity_id: '1050',
},
};
window.parent.postMessage(message, '*');
JSON object
The JSON object is the action definition that tells OpenText Core Software Delivery Platform how a sidebar plugin should be exposed and loaded. It defines the modules where the sidebar appears, the plugin URL, and how runtime context is passed to the plugin.
The JSON object can either be part of the external application's locally hosted bundle, or added to the external action editor. For details, see External actions.
Sidebar plugin JSON example
{
"name": "pipeline-details",
"title": "Pipeline Preview",
"entity_type": ["run_history"],
"views": ["list"],
"icon": "details",
"url": "{bundle_url}/external-details/external-details.html?shared_space={shared_space}&workspace={workspace}&user_login={user_login}&email={user_email}&octane_url={octane_url}#entity_ids={entity_ids}&entity_type={entity_type}&query={query}",
"mode": {
"name": "side_panel",
"modules": ["pipelines"]
}
}
JSON property reference
| Property | Purpose | Notes |
|---|---|---|
name
|
Required. Unique action name for identification/logging. | Keep stable once used. |
title
|
Required. Label displayed for the sidebar tab. | |
entity_type
|
Required. Entity types the sidebar applies to. | REST entity names; aggregated types like work_item supported. |
views
|
Required. Where the sidebar appears. | Allowed: list, details. |
url
|
Required. URL of the web page loaded in the sidebar iframe. Can include URL tokens for runtime context. The executable entry file should be referenced from |
|
mode.name
|
Required. Must be set to "side_panel". |
|
mode.modules
|
Required. Modules in which the sidebar is made available. | Available values: defects, vulnerabilities, requirements, model_based_testing, backlog, team_backlog, quality, pipelines, releases, milestones, processes, my_work_entityType. |
icon
|
Icon shown for the sidebar tab. | Choose from supported icon set. |
single_entity
|
Selection constraint. | true = one selected item only, false = one or many, null = even none selected. |
workspaces
|
Allow-list of workspace IDs. | Cannot be used with exclude_workspaces. |
exclude_workspaces
|
Deny-list of workspace IDs. | Cannot be used with workspaces. |
Runtime URL parameters
The parameterized URL is the handoff contract between the sidebar plugin definition and the loaded web page.
You write the parameterized url once in the plugin JSON. At runtime, OpenText Core Software Delivery Platform replaces these placeholders with actual context values before loading the plugin. The sidebar page then receives a regular URL with concrete parameter values.
Example parameterized url value (with selection-related parameters passed as hash parameters to avoid reloads on selection change — see Advanced guidelines):
{bundle_url}/external-details/external-details.html?shared_space={shared_space}&workspace={workspace}&user_login={user_login}&email={user_email}&octane_url={octane_url}#entity_ids={entity_ids}&entity_type={entity_type}&query={query}
Supported URL parameters
| Parameter | Purpose |
|---|---|
{entity_ids}
|
Comma-delimited list of selected entity IDs. Limited to first 500 items when all items are selected in a grid or board view or when no items are selected. |
{entity_type}
|
Aggregated type of the selected entity (for example, defect becomes work_item). |
{query}
|
REST filter representing the current grid/board view. Particularly useful when Select all is active or when >500 items are selected, as it retrieves all matching items rather than being capped at 500. |
{all_selected}
|
Boolean value (true or false) indicating whether all items in the current view are selected. Helps determine if entity_ids is limited to the first 500 items. |
{shared_space}
|
ID of the space in which the action was triggered. |
{workspace}
|
ID of the workspace in which the action was triggered. |
{user_login}
|
Login name with which the invoking user connected to OpenText Core Software Delivery Platform. |
{user_email}
|
Email address of the invoking user as recorded in OpenText Core Software Delivery Platform. |
{octane_url}
|
Base URL of the OpenText Core Software Delivery Platform site from which the action is invoked. |
{xsrf_token}
|
Security token for PUT, POST, and DELETE REST requests. For details, see CORS for external actions. |
{user_identity_token}
|
JWT token that lets the plugin verify the identity of the invoking OpenText Core Software Delivery Platform user. For details, see User verification for external actions. |
Advanced guidelines
React to selection changes without reloading
There are two ways to pass parameters to the sidebar plugin: as query parameters or as hash parameters.
-
Query parameters::
...index.html?entity_ids={entity_ids}Using query parameters each time
entity_idschanges causes the plugin to reload. This can negatively affect the user experience if loading and rendering the plugin UI takes time.
-
Hash parameters:
...index.html#entity_ids={entity_ids}Using hash parameters does not reload when
entity_idschanges. Instead, subscribe to theonhashchangeevent to react to parameter updates:Copy codewindow.onhashchange = function () {
const hashParams = document.location.hash.substring(1).split('&');
for (let pair of hashParams) {
const [name, value] = pair.split('=').map(value => decodeURIComponent(value));
console.log(`parameter name: ${name} parameter value: ${value}`);
}
}
Recommendation: Pass stable, session-scoped parameters (such as shared_space, workspace, user_login) as query parameters, and pass selection-specific parameters (such as entity_ids, entity_type, query) as hash parameters.
Use Chrome local overrides for development
Chrome's local overrides feature lets you serve local files in place of live network requests. This allows you to edit your plugin files from your IDE and see changes applied instantly in the browser, without re-uploading the bundle to OpenText Core Software Delivery Platform.
To use local overrides:
-
Open Chrome DevTools > Sources > Overrides.
-
Select a local folder to store overrides.
-
In the Network tab, right-click the plugin's HTML response and select Override content.
-
Edit the local file; Chrome applies changes immediately on reload.
REST API integration
Sidebar plugins can use OpenText Core Software Delivery Platform's REST API to read and update entity data directly from the plugin's JavaScript code. The interactive API client allows you to experiment with the API on your shared space data and make API calls from within the UI. For details, see Interactive API client. For full details on the REST API, see REST API.
Read a field value
async function getFeature(entityId) {
const response = await fetch(
`/api/shared_spaces/${params.shared_space}/workspaces/${params.workspace}/work_items/${entityId}?fields=name,wsjf_cod,rroe,job_size`
);
const entity = await response.json();
return entity;
}
Update a field value
Include the XSRF-HEADER in mutating requests. The XSRF token is passed to the plugin via the {xsrf_token} URL parameter.
const entity = {
fieldName: fieldValue,
};
const xsrf = new URL(document.location.href).searchParams.get('xsrf_token');
fetch(
'/api/shared_spaces/' + sharedSpaceId +
'/workspaces/' + workspaceId +
'/work_items/' + entityId,
{
headers: {
'content-type': 'application/json',
'XSRF-HEADER': xsrf,
},
body: JSON.stringify(entityData),
method: 'PUT',
credentials: 'include',
}
);
Note: XSRF-HEADER is required when the plugin is hosted in OpenText Core Software Delivery Platform itself, or when it is hosted on a separate server and communicates using CORS. For details, see CORS for external actions.
Templates and examples
The following examples are available for download. Each example includes a zip bundle and a JSON configuration file to copy into the external action editor.
| Example | Description |
|---|---|
| feature_work_items.zip |
Lists work items belonging to the selected feature. Use feature_work_items.json for the configuration in the external action editor. |
| external_details.zip |
Showcases all plugin APIs. Recommended as a template for starting a new plugin project. Use external-details.json for the configuration in the external action editor. |
| external_panel_template.zip |
Empty plugin with no content. Use as a starting point for a new plugin. Use external-details.json for the configuration in the external action editor. |
| external_panel_wsjf.zip |
Plugin with an example of updating a field via REST API. Use external_panel_wsjf.json for the configuration in the external action editor. |
The index.html files in the examples reference a stylesheet that aligns the plugin's look and feel with OpenText Core Software Delivery Platform's own styles:
<link rel="stylesheet" type="text/css" href="/ui/external-actions/style/alm-octane-style.css" />

