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
  }
}
Danger

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

TypeWhere it can appearPurposeExample
attributescenterArea, rightArea (in panel), objectDetail tabsDisplay attribute values{"type": "attributes", "values": ["core#description"]}
panelrightArea onlyCollapsible grouping container with titleWraps other components
componentcenterArea, rightAreaReference to a shared component{"type": "component", "value": "core#ownership_generic"}
api-tablecenterArea, objectDetail tabsDynamic table with filteringUses endpoints + columns definition
relationscenterArea, objectDetail tabsRelation listsShows linked objects
tabsobjectDetail area onlyTabbed interfaceGroups components into tabs
section-titlecenterAreaHeader with optional anchor navigation{"type": "section-title", "title": "...", "anchor": true}
codetable-labelrightArea (in panel)Display code table values as badgesReferences a codetable attribute
scriptcenterAreaCode editor displayRenders syntax-highlighted code blocks
knowledge_graph_genericcenterAreaER/lineage diagram viewInteractive 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

ComponentIdMeaning
business_term#attr#descriptionAttribute display for the description field on business_term
business_term#panel#metadataMetadata panel on business_term
business_term#rel#glossary_linksRelation list for glossary links on business_term
business_term#section#overviewSection 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

  1. Text attributes (description, summary, notes)
  2. Child object tables (api-table components)
  3. Relation diagrams (knowledge_graph_generic)
  4. Relation tables (relations)
  5. Comments component

rightArea

  1. Ownership panel (core#ownership_generic)
  2. Classifications panel (domain, subdomain)
  3. Tags panel
  4. 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.

Tip

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.

ComponentPurposeKey properties
time-selectorDate range picker for filtering chart datadefaultRange, ranges[]
splitterSplit layout with left and right panelsleft, right, sizes[]
chartChart visualization with API data sourceendpoint, chartType, options
summary-cardKPI summary with title, value, and trendendpoint, 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

Danger

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.

Warning

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.

Warning

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.

Warning

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.

Tip

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.