Attribute types define the fields displayed on object types. Features are flags that control how attributes render, index, and behave. Choosing the right attribute types and features determines whether your package works as expected.
Core Attribute Types
The core package ships 50+ attribute types covering common metadata fields. Reuse these before creating custom attribute types.
| Key | Purpose |
|---|---|
core#name | Object name |
core#description | Rich text description (is_html enabled) |
core#abbreviation | Short code or acronym |
core#note | Plain text note |
core#url | External URL (is_url_link enabled) |
core#date_created | Creation timestamp |
core#date_modified | Last modification timestamp |
core#external_id | Identifier from an external system |
core#classification | Classification tag reference |
core#count | Numeric count value |
core#status | Status label |
These cover URLs, dates, counts, IDs, classifications, and general-purpose text. The full set spans 50+ attribute types.
Create a custom attribute type only when no core attribute fits the need. Custom attributes increase maintenance cost and reduce interoperability between packages.
Feature Catalog
Features are key-value flags attached to attribute types. They control rendering, search indexing, and data constraints.
Rendering Features
| Feature | Type | Effect |
|---|---|---|
is_html | bool | Enables the rich text editor for this attribute |
is_url_link | bool | Renders the value as a clickable hyperlink |
is_yes_no | bool | Renders a checkbox toggle |
is_yes_no_icon | bool | Renders a boolean with an icon indicator |
is_date | bool | Renders a date picker |
is_number | bool | Renders a numeric input field |
sort_by_number | bool | Sorts values as integers instead of lexicographic strings |
is_markdown | bool | Renders a Markdown editor |
Use sort_by_number together with is_number. Without it, numeric values sort lexicographically (“10” appears before “2”).
Search Features
Search features control how Elasticsearch indexes the attribute values.
| Feature | Type | Effect |
|---|---|---|
is_search_type_text | bool | Full-text search with analysis and stemming |
is_search_type_term | bool | Exact matching and facet filtering |
is_search_type_bool | bool | Boolean facet in search filters |
is_token_text | bool | Keyword tokenization for tags and labels |
is_search_default_result_text | bool | Includes this attribute in search result snippets |
An attribute without any is_search_type_* feature is not indexed. It will not appear in search results or facet filters, regardless of its content.
Data Features
| Feature | Type | Effect |
|---|---|---|
is_translatable | bool | Supports values in multiple languages |
has_multiple_values | bool | Allows multiple values (default is single value) |
is_mandatory | bool | Requires a value before the object can be saved |
is_parent_inheritable | bool | Inherits value from parent object |
The property acceptableCodetableValues (top-level on attribute type, not a feature) links to a codetable object type key for dropdown options.
Concept Features
Concept features apply to business glossary attributes where attributes map to semantic concepts.
| Feature | Pattern | Purpose |
|---|---|---|
is_attribute_type_concept_* | bool | Maps the attribute to a specific concept role (definition, example, scope) |
These features are relevant for glossary and data catalog packages. Most custom packages do not need them.
For the complete list of all feature keys, see the package schema (package-schema-attributeTypes.json). The features listed above cover the most common use cases — the schema defines 60+ feature keys including script language variants (is_script_javascript, is_script_python, etc.) and specialized search variants.
Feature Type Safety
Features have explicit value types: boolean, integer, or string. The system does not coerce types.
{
"key": "is_html",
"value": true
}
Silent type mismatch. Setting is_html with the string "true" instead of boolean true causes silent failure. The feature stores without error, but the rich text editor never renders. Always match the expected type exactly.
Codetable Attributes
A codetable attribute creates a dropdown selector linked to a codetable object type. Each entry in the codetable has two fields:
| Field | Purpose |
|---|---|
label | Display text shown in the UI dropdown |
value | Internal identifier used in filters and automations |
Configure the link by setting the acceptableCodetableValues feature on the attribute type:
{
"key": "acceptableCodetableValues",
"value": "my_package#country_list"
}
The referenced codetable object type must exist and contain entries before the dropdown renders options.
Label vs. value in automation filters. Automation filters match against value, not label. A filter condition using the display label matches nothing. Always use the internal value field in filter expressions and API queries.
Conditions on Attributes
Conditions restrict attribute visibility or editability based on the user’s relation to the object and the current workflow state.
{
"conditions": [
{
"userRelationTypeKey": "core_business_owner",
"workflowStateKey": "draft",
"editable": true,
"visible": true
}
]
}
Both userRelationTypeKey and workflowStateKey must reference valid entities declared in the package or its dependencies. An invalid key causes the condition to silently fail, making the attribute invisible to all users in that state.
Condition Evaluation
- Multiple conditions combine with OR logic. If any condition matches, the attribute is visible/editable.
- A condition with only
userRelationTypeKey(noworkflowStateKey) applies in all workflow states. - A condition with only
workflowStateKey(nouserRelationTypeKey) applies to all users. - An attribute with no conditions is visible and editable by default.
Decision Tree: Choosing Features
| Need | Feature | Notes |
|---|---|---|
| Rich text editing | is_html | Enables WYSIWYG editor |
| Clickable link | is_url_link | Renders as <a> element |
| Yes/No toggle | is_yes_no | Checkbox control |
| Yes/No with icon | is_yes_no_icon | Visual indicator instead of checkbox |
| Dropdown selection | acceptableCodetableValues | Reference a codetable objectType |
| Full-text searchable | is_search_type_text | Analyzed, stemmed, ranked by relevance |
| Exact-match filter | is_search_type_term | Facet filtering, exact value matching |
| Boolean filter | is_search_type_bool | Boolean facet in search sidebar |
| Tag-style keywords | is_token_text | Tokenized keyword matching |
| Date input | is_date | Calendar date picker |
| Numeric input | is_number + sort_by_number | Numeric field with correct sort order |
| Markdown editor | is_markdown | Markdown rendering and editing |
| Multi-language | is_translatable | One value per configured language |
| Multiple values | has_multiple_values | Allows adding more than one value |
| Required field | is_mandatory | Object cannot be saved without this value |
Combining Features
Multiple features can apply to the same attribute type. Common combinations:
is_number+sort_by_number+is_search_type_term— numeric field, sorted correctly, filterable as a facetis_html+is_search_type_text+is_search_default_result_text— rich text, full-text searchable, shown in search snippetsis_translatable+is_search_type_text— multi-language text, each language indexed separatelyis_yes_no+is_search_type_bool— boolean toggle with a boolean facet filter
Conflicting features. Do not combine is_html with is_number or is_date. The rendering engine uses the first recognized feature and ignores the rest. No error is raised.
Gotchas
Missing sort_by_number. A numeric attribute without sort_by_number sorts values as strings. The sequence “1, 2, 10, 20” sorts as “1, 10, 2, 20”. Add sort_by_number to every is_number attribute.
No search features = invisible to search. An attribute type without any is_search_type_* feature is excluded from the Elasticsearch index entirely. The data exists in the database but is not discoverable through search. This is the most common cause of “missing” attribute values in search results.
Codetable must exist before reference. The acceptableCodetableValues feature references a codetable object type by key. If that object type does not exist at installation time, the attribute installs without error, but the dropdown renders empty.
Condition keys must be valid. A condition referencing a nonexistent userRelationTypeKey or workflowStateKey does not raise an error. The condition evaluates to false for all users in all states, effectively hiding the attribute.
Complete Attribute Type Example
An attribute type with rendering, search, and data features:
{
"key": "business_definition",
"name": "Business Definition",
"features": [
{ "key": "is_html", "value": true },
{ "key": "is_translatable", "value": true },
{ "key": "is_mandatory", "value": true },
{ "key": "is_search_type_text", "value": true },
{ "key": "is_search_default_result_text", "value": true }
],
"conditions": [
{
"userRelationTypeKey": "core_business_owner",
"workflowStateKey": "draft",
"editable": true,
"visible": true
},
{
"userRelationTypeKey": "core_steward",
"editable": true,
"visible": true
}
]
}
This attribute renders as a rich text editor, supports translations, is required, full-text searchable, and appears in search result snippets. Business owners can edit it only in draft state. Stewards can edit it in any state.
For a complete guide on conditions — including standalone condition assets, evaluation logic, and when to use inline vs standalone conditions — see Conditional Visibility.