This guide covers how to customize Dawiso Knowledge Applications: add an attribute, change a template, modify layout, add a workflow, add a relation, configure search, and configure permissions. All customizations use either a patch package (to modify an existing application) or a bridge package (to connect two applications). They require package development expertise or assistance from the Dawiso support team.
Applications and package keys
| Application | Package Key | Typical Object Types |
|---|---|---|
| Business Glossary | business_glossary | Business Domain, Business Term, Business Indicator, Business Rule, Diagram |
| Code List | code_list | Code List (parent), Code List Item (child) |
| Data Dictionary | data_dictionary | Attribute Domain |
| Data Model | data_model | Model Folder, Data Model, Data Entity, Data Attribute, Processing Unit |
| Data Product Catalog | data_product_catalog | Product Domain, Data Product, Data Contract |
| Logical Model | logical_model | Model, Logical Diagram, Entity, Attribute |
| Documentation | documentation | Document Set, Document |
| Report Catalog | report_catalog | Folder, Report |
| Diagrams | diagrams | Diagrams Folder, Diagram |
| KPI | kpi | Domain, KPI |
Add a custom attribute
Use this procedure to add attribute fields (such as “Data Sensitivity”, “Review Date”, or “Target Value”) to any object type in any application. This is the most common customization.
-
Create a patch package targeting the application’s base package:
{ "type": "patch", "key": "my_patch_add_sensitivity", "name": "Add Data Sensitivity to Business Term", "basePackageKey": "business_glossary", "runAfter": "business_glossary", "dependsOn": ["business_glossary"] } -
Define the new attribute type with an asset-level
addaction. Choose features that match the field type:Feature Renders as is_htmlRich text editor is_datetime/is_dateDate picker is_number+sort_by_numberNumeric input is_yes_noCheckbox toggle is_url_linkClickable hyperlink acceptableCodetableValuesDropdown from a Code List "attributeTypes": [ { "action": "add", "key": "cust_data_sensitivity", "name": "Data Sensitivity", "features": [ { "key": "is_html", "value": true } ] } ]WarningFeature values have strict type safety: use boolean
true/false, never the string"true". Strings cause silent failure. -
Assign the attribute to the target object type using a property-level
addaction:"objectTypes": [ { "action": "update", "key": "business_term", "attributeTypes": [ { "action": "add", "key": "cust_data_sensitivity" } ] } ] -
Update the template to display the attribute (see Modify the template layout below).
-
Optionally add search features to make the attribute findable (see Configure search below).
Check existing attributes before creating duplicates. Business Glossary ships with Description, Definition, Calculation, and Synonym. The core package provides 50+ reusable attribute types (core#description, core#url, core#date_created, and others) — reuse these before creating custom ones. For the full catalog, see Attribute Types & Features.
If the attribute type must exist before it can be referenced, use runAfter in your patch to control installation order.
Modify the template layout
Use this procedure to change how attributes, panels, and components appear on an object’s page. Every object type has two templates: main (full page view) and objectDetail (side panel preview). For the full template reference, see ObjectType Templates.
Layout zones
| Zone | Width | Contains | Rules |
|---|---|---|---|
centerArea | ~70% | Text attributes, child tables, relations, diagrams | Components go directly as array items. Never wrap in a panel — panels in centerArea hide children. |
rightArea | ~30% | Collapsible metadata panels (Ownership, Properties, Classifications) | Components must be wrapped in a panel with a title. |
Steps
-
Create a patch package (or extend one you already have) targeting the application.
-
Add a component to the
centerArea— for example, displaying a custom attribute:"objectTypes": [ { "action": "update", "key": "business_term", "templates": { "main": { "centerArea": [ { "action": "add", "addToEnd": true, "componentId": "cust#attr#data_sensitivity", "type": "attributes", "values": ["cust_data_sensitivity"] } ] } } } ] -
Or add a new panel to the
rightArea— for example, a “Compliance” panel on a Data Entity page:"rightArea": [ { "action": "add", "addToEnd": true, "componentId": "cust#panel#compliance", "type": "panel", "title": "Compliance", "components": [ { "componentId": "cust#attr#data_sensitivity", "type": "attributes", "values": ["cust_data_sensitivity"] } ] } ] -
Update the
objectDetailtemplate as well so the side panel preview stays consistent.
Available component types
| Type | Where | Purpose |
|---|---|---|
attributes | centerArea, rightArea (in panel) | Display attribute values |
panel | rightArea only | Collapsible grouping container with title |
component | Both | Reference a shared component (such as core#ownership_generic) |
relations | centerArea | Relation lists showing linked objects |
api-table | centerArea | Dynamic table with filtering |
section-title | centerArea | Header with optional anchor: true for navigation |
codetable-label | rightArea (in panel) | Display Code List values as badges |
Add or modify a workflow
Use this procedure to add workflow states (such as Draft, In Review, Approved, Deprecated) and define the allowed transitions between them. You can also change an existing workflow by patching individual states or transitions. For the full workflow reference, see Workflows & Automation.
Steps
-
Define workflow states in your package with a key, display name, color, and
positionvalue. States are ordered byposition, not by their array position in JSON."workflowStates": [ { "key": "draft", "name": "Draft", "color": "#6B7280", "position": 1 }, { "key": "in_review", "name": "In Review", "color": "#F59E0B", "position": 2 }, { "key": "approved", "name": "Approved", "color": "#10B981", "position": 3 }, { "key": "deprecated", "name": "Deprecated", "color": "#EF4444", "position": 4 } ] -
Define workflow transition triggers specifying allowed state changes. Only explicitly defined transitions are permitted:
"workflowTransitionTriggers": [ { "fromStateKey": "draft", "toStateKey": "in_review" }, { "fromStateKey": "in_review", "toStateKey": "approved" }, { "fromStateKey": "in_review", "toStateKey": "draft" }, { "fromStateKey": "approved", "toStateKey": "deprecated" } ] -
To modify an existing workflow, use a patch package with
updateactions on specific workflow states or transition triggers, oraddactions for new states and transitions.
Additional options
- Mandatory attributes: Mark attributes with
Is_Mandatoryto require them before a transition is allowed (for example, Definition must be filled before moving to In Review). - Multi-approver thresholds: Use
changeThresholdTypeKeyon a transition to require multiple users to approve. - Automation triggers: Fire actions on state changes — send notifications, set attribute values (for example, using
{currentUtcDate}for a review date).
For Data Product Catalog, the Data Market search form filters by workflowState. If you add new states, update the searchForm facet configuration to include them — otherwise products in the new state return zero results in the Data Market.
Add a custom relation to another application
Use this procedure to add relation links between applications — for example, connecting Business Terms to Data Dictionary attribute domains, or KPIs to Data Products. For common relation patterns, see Package Patterns.
-
Create a bridge package — a third intermediary package that depends on both applications. This avoids circular package dependencies:
PKG_BusinessGlossary <-- PKG_Bridge --> PKG_DataDictionary{ "type": "package", "key": "cust_bridge_glossary_dictionary", "name": "Bridge: Business Glossary - Data Dictionary", "dependsOn": ["business_glossary", "data_dictionary"] } -
Define a relation type in the bridge package with forward and reverse names:
"relationTypes": [ { "key": "cust_has_domain", "name": "Has Domain", "reverseName": "Is Domain For", "fromObjectTypeKey": "business_term", "toObjectTypeKey": "attribute_domain" } ] -
Assign the relation to both object types using property-level
addactions. -
Update templates on both sides to include a
relationscomponent referencing the new relation type key so users can see and manage the links:{ "componentId": "cust#rel#has_domain", "type": "relations", "values": ["cust_has_domain"] }
Check existing relations before creating new ones. Many applications ship with built-in relations:
- Business Glossary: Related, Mentions
- Data Model: Implemented As, Has Domain, Foreign Keys
- Data Product Catalog: Contains, Has Input/Output Contract
- Logical Model: Specialization, Association, Implements
- Report Catalog: Implements, Business Objects
- KPI: Is KPI In, Related, Is Described By
Configure search
Use this procedure to make attributes discoverable through Dawiso’s Elasticsearch-powered search. For the full search configuration reference, see Search Configuration.
-
Add search features to the attribute type definition. An attribute without any
is_search_type_*feature is invisible to Elasticsearch — it does not appear in search results or facet filters.Feature Elasticsearch Behavior Best For is_search_type_textFull-text analysis with stemming Description, Definition, Calculation, Notes is_search_type_termExact-match keyword, supports facets Classifications, labels, status fields is_search_type_boolBoolean facet Yes/no flags is_token_textKeyword tokenization Tags is_search_default_result_textIncluded in search result snippets Any field you want visible in results Common combinations:
is_search_type_text+is_search_default_result_text— full-text searchable and shown in result snippetsis_search_type_term+is_search_default_result_text— exact-match filterable and shown in resultsis_search_type_text+is_search_type_term— full-text searchable and available as a facet filter
-
Ensure a search index exists that maps the object types and their attributes to Elasticsearch fields:
"searchIndexes": [ { "key": "cust_glossary_index", "objectTypeKey": "business_term", "attributes": [ { "key": "core#name" }, { "key": "core#description" }, { "key": "cust_data_sensitivity" } ] } ] -
Ensure a search query references the index to define how searches execute.
-
Ensure a search form exists to define the user-facing filter panels and result columns.
-
Run a targeted reindex after adding or changing search features. Prefer a targeted index refresh per index key — avoid running a global RefreshIndex as it rebuilds all indexes and can take hours on large deployments.
Configure permissions per workflow state
Use this procedure to control who can edit or view objects based on the combination of workflow state and user relation.
Steps
-
Define conditions in your package configuration. Each condition specifies:
Property Purpose userRelationTypeKeyWho — such as core_business_owner,core_stewardworkflowStateKeyWhen — such as draft,in_review,approvededitableCan modify the object ( true/false)visibleCan see the object ( true/false) -
Combine conditions to build your access matrix. For example, to let only the Owner edit during Draft and only the Steward edit during Review:
"conditions": [ { "userRelationTypeKey": "core_business_owner", "workflowStateKey": "draft", "editable": true, "visible": true }, { "userRelationTypeKey": "core_steward", "workflowStateKey": "in_review", "editable": true, "visible": true } ]All other users see the object as read-only in these states.
Evaluation rules
- Multiple conditions combine with OR logic — any matching condition grants access.
- A condition with only a
userRelationTypeKey(no state) applies across all workflow states. - A condition with only a
workflowStateKey(no relation) applies to all users in that state. - No conditions at all means the default access applies (visible and editable by all).
A condition referencing an invalid userRelationTypeKey or workflowStateKey silently evaluates to false — it denies permission without any error message. Verify that both keys reference valid, existing entities.
Best practices
- One change per patch. Name patches descriptively (such as
cust_glossary_patch_add_sensitivity). This makes debugging straightforward and rollback granular. For advanced patch techniques, see Patch Packages — Advanced Guide. - Update both
mainandobjectDetailtemplates for consistency between full-page and side-panel views. - Reuse core attributes. The
corepackage ships 50+ attribute types. Checkcore#description,core#url,core#date_created, and others before creating custom ones. - Declare implicit dependencies. Adding
core#ownership_genericto a template requires declaringcore_business_ownerandcore_stewardin the object type’suserRelationTypes[]array — otherwise the Ownership panel renders empty with no error. - Reindex after schema changes. A full Elasticsearch reindex is required for search features to take effect.
- These customizations apply identically across all Knowledge Applications. Only the specific
basePackageKey, object type keys, and existing attributes differ.