This document outlines the structure and configuration details of the $.manifest.ui section. Make sure you have also read our article How to integrate with Carerix Marketplace
Section Structure
The following table describes the structure of the $.manifest.ui section:
Path:
$.componentsType: array
Description: List of component definitions
Example:
- id: 'my-feature.component-id'
type: 'left-menu-item'
config:
text: 'New Menu Item'
Path:
$.components[*].idType: string
Description: - REQUIRED - Unique identifier of the component. To prevent conflicts, prefix all IDs with a unique feature prefix.
Example:
'my-feature-id.my-compnent-id'
Path:
$.components[*].typeType: string
Description: - REQUIRED - The type of component being injected. See Component Types.
Example:
'left-menu-item'
Path:
$.components[*].parentIdType: string
Description: The ID of the parent component into which the new component will be injected.
Example:
'candidate-details.tabpanel'
Path:
$.components[*].configType: object
Description: Configuration settings specific to the component type (see Supported Component Types)
Example:
text: 'New Menu Group'
order: 2
Path:
$.components[*].filtersType: array
Description: List of filters that conditionally modify or remove the component. (see Supported Filter Types)
Example:
- action:
type: 'remove'
condition:
type: 'has-permission'
expectedValue: false
options:
resource: 'urn:cx/activities:data/tasks'
operation: 'access'
Path:
$.translationsType: array
Description: List of translation objects
Example:
- key: 'MY_FEATURE.NAME'
values:
en_US: 'My Feature Name'
nl_NL: 'Mijn Functienaam'
Path:
$.translations[*].keyType: string
Description: - REQUIRED - Translation key - To prevent conflicts with translations from other features it is advisable to prefix all translation keys with a unique feature prefix.
Example:
'MY_FEATURE.NAME'
Path:
$.translations[*].valuesType: object
Description: - REQUIRED -
[locale]: stringobjecten_USis always required.
If a user's language is not found in thevaluesobject, the system will default toen_US.Example:
en_US: 'My Feature'
nl_NL: 'Mijn Functienaam'
ℹ️Full list of supported locales:
en_US- English required (fallback locale)nl_NL- Dutchit_IT- Italiande_DE- Germanes_ES- Spanishfr_FR- Frenchpt_PT- Portuguese
Component Types
The list below shows all available component types.
Carerix determines which options are granted per partner.
Left Menu Group
Injects a new menu group into the application's left-side menu.
Type:
left-menu-groupConfig:
text- REQUIRED - The display name of the grouporder- The position of the group in the left menu
Parent ID: N/A
Example:
components:
- id: 'feature-id.new-menu-group'
type: 'left-menu-group'
config:
text: 'New Menu Group'
order: 0
Left Menu Item
Injects a new item into an existing or newly created left menu group.
Type:
left-menu-itemConfig:
text- REQUIRED - The display name of the menu itemorder- The position of the item in the menu groupicon- The SVG icon string for the menu itemcommand- REQUIRED - The command to be performed when clicked. See Supported Commands.type- The type of command to performdata- Execution data for that command type
Parent ID: The ID of the menu group. Can be an existing group or a new one.
Existing menu group IDs:
Activiteitenmenu- 'Activities' menuDossiersmenu- 'Files' menuFinancieelmenu- 'Financial' menuMarketingmenu- 'Marketing' menuBeheermenu- 'Management' menuOnderhoudmenu- 'Maintenance' menu
Example:
components:
- id: 'feature-id.new-menu-item'
type: 'left-menu-item'
parentId: 'Dossiersmenu'
config:
text: 'New Menu Item'
order: 0
icon: '<svg ...</svg>'
command:
type: 'open-iframe-view'
data: url: 'https://....'
Custom Tab
Injects a new tab (iframe).
Type:
tabConfig:
text- REQUIRED - The tab's display nameurl- REQUIRED - The tab's URLURL Variables: The URL supports variables for context information:
{{ _id }}- current record ID (e.g., 12345){{ _kind }}- current record type (e.g., CREmployee, CRVacancy){{ tenant }}- name of the tenantExample URL:
https://my-app.com/?entityKind={{_kind}}&entityId={{_id}}&tenant={{tenant}}
Parent ID: The ID of the details tab panel component.
ID patterns:
Entity details pages:
{entityName}-details.tabpanelEntity overview pages:
{entityName}-overview.tabpanelWhere
{entityName}is one of the following:
emailnote,event,task,systemactivity,match,candidate,vacancy,talentpool,lead,opportunity,contact,company,publication,placement,officeemployeeCalendar page:
calendar.tabpanelExample for Entity Details:
candidate-details.tabpanelExample for Entity Overviews:
candidate-overview.tabpanelExample for Calendar Page:
calendar.tabpanel
Example:
components:
- id: 'feature-id.new-tab-in-candidate-details'
type: 'entity-details-tab'
parentId: 'candidate-details.tabpanel'
config:
text: 'My new Iframe Tab in Candidate details'
url: 'https://my-app.com/?entityId={{_id}}&entityKind={{_kind}}&tenant={{tenant}}'
Background Agent
A background iframe that is loaded once at the app bootstrap stage.
Type:
background-agentConfig:
url- REQUIRED - The iframe'ssrcParent ID: N/A
Example:
components:
- id: 'feature-id.my-background-process'
type: 'background-agent'
config:
url: 'https://my-app.com/'
Commands
Structure
Field | Type | Description |
| string | Type of command |
| object | Command's data |
Command Types
Type:
open-iframe-viewData:
url- REQUIRED - Iframe URLThe URL supports variables, allowing you to include context information:
{{ tenant }}- name of the tenantExample:
url: 'https://my-app.com/?tenant={{tenant}}'
Description: Open
data.urlin the main viewportExample:
type: 'open-iframe-view'
data:
url: 'https://my-app.url/?tenant={{ tenant }}'
Type:
open-entity-detailsData:
entity- REQUIRED -_id- REQUIRED - Entity ID_kind- REQUIRED - Entity kind (e.g.,Candidate)
activeTab- ID of tab to activate (optional, defaults to first tab)
Description: Open
data.entitydetails page in the main viewportExample:
type: 'open-entity-details'
data:
enity:
_kind: 'Candidate'
_id: '1234'
activeTab: 'my-tab-id'
Type:
open-entity-previewData:
entity- REQUIRED -_id- REQUIRED - Entity ID_kind- REQUIRED) - Entity kind (e.g., Candidate)
activeTab- ID of tab to activate (optional, defaults to first tab)
Description: Open
data.entitypreview modalExample:
type: 'open-entity-preview'
data:
enity:
_kind: 'Candidate'
_id: '1234'
activeTab: 'my-tab-id'
Type:
open-entity-overviewData:
entity- REQUIRED - Entity name (e.g., Candidate)
Description: Opens
data.entityoverview(entity list) pageExample:
type: 'open-entity-overview'
data:
entity: 'Candidate'
Type: update-menu-item-info
Data:
menuItemId(REQUIRED) - ID of menu item to updatecounter- Counter value
Description: Updates a menu item
Example:
type: 'update-menu-item-info'
data:
menuItemId: 'feature-x-menu-item'
counter: 10
Component Filters
Filters are used to adjust a component's visibility or configuration based on specific conditions, like user permissions or system settings.
Structure
Field | Type | Description |
| object | Action for the filter to execute |
| string | Action type |
| object | Options for the action type |
| object | The condition under which the |
| string | Condition type |
| object | Options of the condition type |
| boolean / string / number | The expected value of a condition to be met |
Examples:
type: 'apply-config'
options:
config:
text: 'Conditional Text'
type: 'has-permission'
expectedValue: false
options:
resource: 'urn:cx/activities:data/tasks'
operation: 'access'
Action Types
Type:
removeOptions: none
Description: removes the component if the condition is met.
Example:
- id: 'my-menu-item'
config:
...
filters:
- action:
type: 'remove'
condition:
type: 'has-permission'
expectedValue: false
options:
resource: 'urn:my-resource'
operation: 'access'
Type:
remove-property-from-pathOptions:
path(REQUIRED) - Array<string | number> - Path to the property within the config object
Description: removes a specific property from the config object.
Example:
- id: 'my-menu-item'
config:
text: 'Text'
showCreateButton: true
filters:
- action:
type: 'remove-property-from-path'
options:
path:
- showCreateButton
- condition:
type: 'has-permission'
expectedValue: false
options:
resource: 'urn:my-resource'
operation: 'create'
Type:
apply-configDescription: Applies a config object to the existing one using PATCH merge strategy.
Options:
config- REQUIRED) - Config object to apply
Example:
- id: 'my-menu-item'
config:
text: 'Text'
filters:
- action:
type: 'apply-config'
options:
config:
showCreateButton: true
condition:
type: 'has-permission'
expectedValue: true
options:
resource: 'urn:my-resource'
operation: 'create'
Condition Types
Type:
has-permissionDescription: Checks if the user has a specific permission.
Options:
resource: string - REQUIRED - Resource nameoperation: string - REQUIRED - Operation name
Example:
condition:
type: 'has-permission'
expectedValue: true
options:
resource: 'urn:my-resource'
operation: 'create'
Type:
has-some-permissionsDescription: Checks if the user has any of the specified permissions.
Options:
Array of permission objects:
[*].resource: string - REQUIRED - Resource name[*].operation: string - REQUIRED - Operation name
Example:
condition:
type: 'has-some-permission'
expectedValue: true
options:
- resource: 'urn:my-resource'
operation: 'access'
- resource: 'urn:my-resource-2'
operation: 'access'
Type:
system-settingDescription: Checks a system setting value.
Options:
settingName: string - REQUIRED - Setting name
Example:
condition:
type: 'system-setting'
expectedValue: 'my-dev-system-name'
options:
settingName: 'customerName'
Recipes
Add a New Menu Item to the Activities Menu
Manifest
Manifest
ui:
components:
- id: 'feature-x.my-settings'
type: 'left-menu-item'
parentId: 'Activiteitenmenu'
config:
text: 'My Settings'
order: 0
icon: '<svg...</svg>',
command:
name: 'open-iframe-view'
data:
url: 'https://my-app.com/my-settings-page'
Add a New Menu Group and Menu Item
Manifest
Manifest
ui:
components:
- id: 'feature-x.new-menu-group'
type: 'left-menu-group'
config:
text: 'My Feature'
order: 0
- id: 'feature-x.my-settings-menu-item'
type: 'left-menu-item'
parentId: 'feature-x.new-menu-group'
config:
text: 'My Settings'
order: 0
icon: '<svg....</svg>'
command:
name: 'open-iframe-view'
data:
url: 'https://my-app.com/my-settings-page'
Add a Custom Tab to the Candidate Details Page
Manifest
Manifest
ui:
components:
- id: 'feature-x.my-new-tab-in-candidate-details'
type: 'tab'
parentId: 'candidate-details.tabpanel'
config:
text: 'My Tab In Candidate'
url: 'https://my-app.com/?entityId={{_id}}&entityKind={{_kind}}&tenant={{tenant}}'
Add a Custom Tab to the Calendar Page
Manifest
Manifest
id: 'feature-x'
name: 'MARKETPLACE.FEATURE-X.NAME'
description: 'MARKETPLACE.FEATURE-X.DESCRIPTION'
....
ui:
components:
- id: 'feature-x.custom-tab-in-calendar-id',
parentId: 'calendar.tabpanel',
type: 'tab',
config:
text: 'New Tab'
url: 'https://my-app.com/?tenant={{tenant}}'
Remove Component Based on User Permissions
Manifest
Manifest
ui:
components:
- id: 'feature-x.restricted-tab'
type: 'entity-details-tab'
parentId: 'candidate-details.tabpanel'
config:
text: 'Tab'
filters:
- action:
type: 'remove'
condition:
type: 'has-permission'
expectedValue: false
options:
resource: 'urn:my-feature:my-resource'
operation: 'access'
Add Component with Multi-Language Support
Manifest
Manifest
ui:
translations:
- key: 'MARKETPLACE.FEATURE-X.MENU_ITEM_TEXT' # This is the key you need to use in the component instead of actual text
values:
en_US: 'English text'
nl_NL: 'Nederlandse tekst'
components:
- id: 'feature-x.new-menu-item'
type: 'left-menu-item'
parentId: '...'
config:
text: 'MARKETPLACE.FEATURE-X.MENU_ITEM_TEXT' # Here you specify the translation key from translations[*].key
...
Add Translations for Feature Name and Description
Manifest
Manifest
id: 'feature-x'
name: 'MARKETPLACE.FEATURE-X.NAME'
description: 'MARKETPLACE.FEATURE-X.DESCRIPTION'
....
ui:
translations:
- key: 'MARKETPLACE.FEATURE-X.NAME'
values:
en_US: 'My awesome feature name'
nl_NL: 'Mijn geweldige featurenaam'
- key: 'MARKETPLACE.FEATURE-X.DESCRIPTION'
values:
en_US: 'My awesome feature description'
nl_NL: 'Mijn geweldige functiebeschrijving'
Add Item to Topbar Quick Access Panel
Manifest
Manifest
ui:
components:
- id: 'feature-x.new-topbar-item'
type: 'button'
parentId: 'quick-access-panel'
config:
icon: '<svg width="24px" height="24px".....'
order: 0
command:
name: 'open-iframe-view'
data:
url: 'https://my-app.com/my-settings-page'
Want to learn more about our partnerships? Send us an email - support@carerix.com





