Templates define the UI layout for each object type. Every object type requires two templates: main for the full page view and objectDetail for the side panel preview.
The main Template
The main template controls the full-page detail view. It has two layout zones.
centerArea
The primary content zone. Occupies the left ~70% of the page. Displays text attributes, child object tables, relation diagrams, relation tables, and comments.
Content in centerArea goes directly as an array of components — never wrapped in a panel. Panels in centerArea make their children invisible.
rightArea
The metadata sidebar. Occupies the right ~30% of the page. Displays ownership panels, classifications, tags, and metadata panels.
Content in rightArea is organized into collapsible panels. Each panel has a title and contains one or more components.
{
"templateType": "main",
"centerArea": [
{ "componentId": "term#attr#description", "type": "attributes", "values": ["core#description"] },
{ "componentId": "term#section#relations", "type": "section-title", "title": "Relations", "anchor": true },
{ "componentId": "term#rel#related", "type": "relations", "values": ["core#related_to"] }
],
"rightArea": [
{
"componentId": "term#panel#ownership",
"type": "panel",
"title": "Ownership",
"components": [
{ "componentId": "term#comp#ownership", "type": "component", "value": "core#ownership_generic" }
]
}
]
}
The objectDetail Template
The object detail template controls the side panel preview that appears when clicking an object in a table or search result. Its structure differs from main.
area
An array of tab groups. Each tab group contains an array of tabs, and each tab contains components. Most object types use a single tab group with two to four tabs.
settings
Object detail settings. Controls whether the side panel allows inline editing.
{
"templateType": "objectDetail",
"area": [
{
"tabs": [
{
"title": "Overview",
"components": [
{ "componentId": "term#od#description", "type": "attributes", "values": ["core#description"] },
{ "componentId": "term#od#ownership", "type": "component", "value": "core#ownership_generic" }
]
},
{
"title": "Relations",
"components": [
{ "componentId": "term#od#relations", "type": "relations", "values": ["core#related_to"] }
]
}
]
}
],
"settings": {
"editable": true
}
}
Creating a centerArea inside an objectDetail template causes an “Object reference not set” runtime error. No validation catches this during package installation. The error appears only when a user opens the side panel.
Component Types
| Type | Where it can appear | Purpose | Example |
|---|---|---|---|
attributes | centerArea, rightArea (in panel), objectDetail tabs | Display attribute values | {"type": "attributes", "values": ["core#description"]} |
panel | rightArea only | Collapsible grouping container with title | Wraps other components |
component | centerArea, rightArea | Reference to a shared component | {"type": "component", "value": "core#ownership_generic"} |
api-table | centerArea, objectDetail tabs | Dynamic table with filtering | Uses endpoints + columns definition |
relations | centerArea, objectDetail tabs | Relation lists | Shows linked objects |
tabs | objectDetail area only | Tabbed interface | Groups components into tabs |
section-title | centerArea | Header with optional anchor navigation | {"type": "section-title", "title": "...", "anchor": true} |
codetable-label | rightArea (in panel) | Display code table values as badges | References a codetable attribute |
script | centerArea | Code editor display | Renders syntax-highlighted code blocks |
knowledge_graph_generic | centerArea | ER/lineage diagram view | Interactive graph visualization |
ComponentId Rules
Every component must have a componentId. The system uses this ID for rendering, state management, and anchor navigation.
Format
{objectTypeKey}#{component_type}#{descriptive_name}
Examples
| ComponentId | Meaning |
|---|---|
business_term#attr#description | Attribute display for the description field on business_term |
business_term#panel#metadata | Metadata panel on business_term |
business_term#rel#glossary_links | Relation list for glossary links on business_term |
business_term#section#overview | Section title for the overview area on business_term |
Avoiding Duplicates
When two components of the same type exist on the same template (e.g., two attributes components), differentiate by context — not by numeric suffix.
- Correct:
term#attr#description,term#attr#technical_details - Incorrect:
term#attr#description_1,term#attr#description_2
Standard Ordering Recommendations
centerArea
- Text attributes (description, summary, notes)
- Child object tables (
api-tablecomponents) - Relation diagrams (
knowledge_graph_generic) - Relation tables (
relations) - Comments component
rightArea
- Ownership panel (
core#ownership_generic) - Classifications panel (domain, subdomain)
- Tags panel
- Metadata panels (status, dates, custom attributes)
Example: Business Object Templates
A minimal valid template pair for a business term with description, ownership, and relations.
Main Template
{
"templateType": "main",
"centerArea": [
{
"componentId": "business_term#attr#description",
"type": "attributes",
"values": ["core#description"]
},
{
"componentId": "business_term#section#relations",
"type": "section-title",
"title": "Relations",
"anchor": true
},
{
"componentId": "business_term#rel#related_terms",
"type": "relations",
"values": ["core#related_to"]
}
],
"rightArea": [
{
"componentId": "business_term#panel#ownership",
"type": "panel",
"title": "Ownership",
"components": [
{
"componentId": "business_term#comp#ownership",
"type": "component",
"value": "core#ownership_generic"
}
]
},
{
"componentId": "business_term#panel#classification",
"type": "panel",
"title": "Classification",
"components": [
{
"componentId": "business_term#codetable#domain",
"type": "codetable-label",
"values": ["core#domain"]
}
]
}
]
}
ObjectDetail Template
{
"templateType": "objectDetail",
"area": [
{
"tabs": [
{
"title": "Overview",
"components": [
{
"componentId": "business_term#od#description",
"type": "attributes",
"values": ["core#description"]
},
{
"componentId": "business_term#od#ownership",
"type": "component",
"value": "core#ownership_generic"
}
]
},
{
"title": "Relations",
"components": [
{
"componentId": "business_term#od#relations",
"type": "relations",
"values": ["core#related_to"]
}
]
}
]
}
],
"settings": {
"editable": true
}
}
Example: Folder with Child Object Table
A container object type that displays its children in a dynamic table.
Main Template (centerArea only)
{
"templateType": "main",
"centerArea": [
{
"componentId": "glossary_folder#attr#description",
"type": "attributes",
"values": ["core#description"]
},
{
"componentId": "glossary_folder#section#children",
"type": "section-title",
"title": "Business Terms",
"anchor": true
},
{
"componentId": "glossary_folder#table#children",
"type": "api-table",
"endpoints": {
"list": "/api/v1/objects/{objectId}/children",
"count": "/api/v1/objects/{objectId}/children/count"
},
"columns": [
{ "field": "name", "title": "Name", "sortable": true },
{ "field": "status", "title": "Status", "sortable": true },
{ "field": "owner", "title": "Owner" }
]
}
]
}
The {objectId} placeholder in the endpoint URL is resolved at runtime to the current object’s ID.
ObjectDetail Editable Setting
The settings property on objectDetail controls whether users can edit attributes directly in the side panel.
"settings": { "type": "object-detail-settings", "editable": true }
Always set editable to true — even for connector/scanned entities. Users need to edit owners, labels, and descriptions on all object types regardless of whether the structural metadata came from a scan.
Use editable: true on all objectDetail templates. The read_only_hierarchy application setting controls whether users can reorganize objects — the editable flag on objectDetail controls whether the detail panel itself allows editing.
Dashboard Components
Dashboard and analytics pages use additional component types not commonly found in standard object templates.
| Component | Purpose | Key properties |
|---|---|---|
time-selector | Date range picker for filtering chart data | defaultRange, ranges[] |
splitter | Split layout with left and right panels | left, right, sizes[] |
chart | Chart visualization with API data source | endpoint, chartType, options |
summary-card | KPI summary with title, value, and trend | endpoint, title, valueField |
These components are used in pages asset definitions, not in standard objectType templates. For standard templates, use the component types listed in the component types table above.
Gotchas
centerArea inside objectDetail causes runtime crash. Adding a centerArea property to an objectDetail template triggers an “Object reference not set” error when the side panel opens. The package installs without errors — this defect surfaces only at runtime. The objectDetail template supports only area and settings at the top level.
Wrapping centerArea attributes in a panel makes them invisible. Panels are designed for rightArea only. An attributes component inside a panel inside centerArea renders nothing. Move the attributes component directly into the centerArea array.
componentId is required on every component. Missing or duplicate componentIds cause unpredictable rendering, broken state management, and anchor navigation failures. Format: {objectTypeKey}#{type}#{descriptive_name} (e.g., term#attr#description, term#panel#ownership). Use descriptive names, not numeric suffixes like _1, _2.
Empty ownership panel from missing userRelationTypes. Adding core#ownership_generic to a template without declaring userRelationTypes in the object type definition renders an empty ownership panel. Declare user relation types on the object type before referencing ownership components.
Both main and objectDetail templates are required for every object type. A missing objectDetail template means the side panel preview does not render. Users clicking an object in a table or search result see an empty panel or an error.