Appearance
Data blocks
Show and work with records and structured data: grids, lists, trees, boards, calendars, timelines, search and business widgets.
This page is generated from the block registry, so it lists exactly what the Page Designer accepts. 82 blocks.
| Block | What it is for |
|---|---|
core.ai-chat | Chat panel connected to an AI agent by agentCode; shows the reply and fires messageSent. |
core.ai-classification | AI block that classifies the input by running a library prompt (promptCode) with inputValues; shows the result and a loading state, can run automatically, and fires generateRequested. |
core.ai-form-assistant | AI assistant for a form: asks for suggestions for the fields of an entity (suggestRequested) and applies the ones the person accepts (suggestionApplied). |
core.ai-insights | AI block that produces insights from data by running a library prompt (promptCode) with inputValues; shows the result and a loading state, can run automatically, and fires generateRequested. |
core.ai-prediction | AI block that predicts an outcome by running a library prompt (promptCode) with inputValues; shows the result and a loading state, can run automatically, and fires generateRequested. |
core.ai-recommendation | AI block that recommends a next step by running a library prompt (promptCode) with inputValues; shows the result and a loading state, can run automatically, and fires generateRequested. |
core.ai-record-search | Natural-language search over an entity; the question is sent on querySubmitted and results summarised in resultSummary. |
core.ai-summary | AI block that summarises text by running a library prompt (promptCode) with inputValues; shows the result and a loading state, can run automatically, and fires generateRequested. |
core.ai-translation | AI block that translates text by running a library prompt (promptCode) with inputValues; shows the result and a loading state, can run automatically, and fires generateRequested. |
core.alert-card | Card that shows an alert from a record, with a title, selected fields and an icon; fires clicked when pressed. |
core.announcement-card | Card that shows an announcement from a record, with a title, selected fields and an icon; fires clicked when pressed. |
core.app-tile-grid | A SaaS-style application launcher grid — colored icon tiles, e.g. |
core.appointment-calendar | Resource calendar for appointments: rows are resources, events sit on a time axis between the first and last visible hour; fires selected. |
core.article-feedback | Helpful or not-helpful feedback control for a help article. |
core.attachment-list | Displays a list of file attachments (name, size, type) with per-item open — and optionally remove — actions, for showing multiple documents attached to a record (e.g. |
core.attendance-card | Displays one day's attendance summary for an employee — date, check-in time, check-out time, and status (e.g. |
core.availability | Resource calendar for showing who or what is free: rows are resources, events sit on a time axis between the first and last visible hour; fires selected. |
core.booking-calendar | Resource calendar for bookings: rows are resources, events sit on a time axis between the first and last visible hour; fires selected. |
core.business-unit-card | Card that shows a business unit from a record, with a title, selected fields and an icon; fires clicked when pressed. |
core.calendar-card | Card that shows upcoming calendar items from a record, with a title, selected fields and an icon; fires clicked when pressed. |
core.chat-window | Message thread with an input; fires messageSent. |
core.company-card | Card that shows a company from a record, with a title, selected fields and an icon; fires clicked when pressed. |
core.conversation-list | List of conversations, optionally with avatars with a primary line, a secondary line, a badge and a date taken from fields of each item; fires selected when one is chosen. |
core.custom-fields-panel | Renders and edits a record's tenant-authored custom fields (Custom Field Engine v1) — one input per active field definition for a given entity type/instance, with a single all-or-nothing Save. |
core.customer-card | Card that shows a customer from a record, with a title, selected fields and an icon; fires clicked when pressed. |
core.data-card | A generic, author-configurable field-list card for showing one bound record's title plus a handful of labeled fields — unlike the fixed-shape ERP business cards (employee-card, etc.), both titlePath and the entire fields list are authored, not fixed. |
core.department-card | Card that shows a department from a record, with a title, selected fields and an icon; fires clicked when pressed. |
core.document-viewer | Displays a summary of one document (name, size, type) with an "open" action — for showing a single linked document (e.g. |
core.dynamic-table | Simple table whose columns and rows are supplied as data; fires rowClicked. Use core.grid when you need paging, filters or editing. |
core.employee-calendar | Resource calendar for employees: rows are resources, events sit on a time axis between the first and last visible hour; fires selected. |
core.employee-card | Displays a compact summary of one employee record (name, job title, department, photo) as a clickable card — the canonical HCM "who is this" tile for directories, org charts, and dashboards. |
core.file-browser | Tree browser of folders and files; fires expand and selected. |
core.file-version-history | List of the versions of a file; fires download and restore for a version. |
core.financial-summary-card | Card that shows a financial summary from a record, with a title, selected fields and an icon; fires clicked when pressed. |
core.gantt-chart | Displays a set of tasks as horizontal bars positioned along a shared timeline, with an optional in-bar progress indicator — the standard project/task-schedule visualization. |
core.goods-receipt-card | Card that shows a goods receipt from a record, with a title, selected fields and an icon; fires clicked when pressed. |
core.grid | A full-featured, license-free server-side data grid — sorting, filtering, paging, grouping with per-group aggregates, column visibility/order/pin/width/density, inline cell editing, row selection, and CSV export — the primary widget for tabular record lists (e.g. |
core.invoice-card | Card that shows an invoice from a record, with a title, selected fields and an icon; fires clicked when pressed. |
core.journal-entry-card | Card that shows a journal entry from a record, with a title, selected fields and an icon; fires clicked when pressed. |
core.kanban | A drag-and-drop kanban board. |
core.lead-card | Card that shows a lead from a record, with a title, selected fields and an icon; fires clicked when pressed. |
core.leave-balance | Displays an employee's leave balance for one leave type — used, total, and a computed remaining amount. |
core.list | A simple, unmapped-columns repeated row list for showing a compact array of records as primary/secondary text rows (contrast with core.grid, which is the tabular/sortable/filterable data component). |
core.meeting-calendar | Resource calendar for meeting rooms or attendees: rows are resources, events sit on a time axis between the first and last visible hour; fires selected. |
core.my-approvals | List of approvals waiting for the person with a primary line, a secondary line, a badge and a date taken from fields of each item; fires selected when one is chosen. |
core.my-notifications | List of the person's notifications with a primary line, a secondary line, a badge and a date taken from fields of each item; fires selected when one is chosen. |
core.my-tasks | List of the person's tasks with a primary line, a secondary line, a badge and a date taken from fields of each item; fires selected when one is chosen. |
core.nav-menu | An iPad-style icon-grid menu of a single app's own navigation sections (e.g. |
core.news-card | Card that shows news items from a record, with a title, selected fields and an icon; fires clicked when pressed. |
core.opportunity-card | Card that shows an opportunity from a record, with a title, selected fields and an icon; fires clicked when pressed. |
core.payment-card | Card that shows a payment from a record, with a title, selected fields and an icon; fires clicked when pressed. |
core.payroll-summary | Displays a payroll period summary for an employee — period, gross pay, deductions, and net pay — formatted as localized currency. |
core.pending-actions | List of actions waiting for the person with a primary line, a secondary line, a badge and a date taken from fields of each item; fires selected when one is chosen. |
core.pivot-table | Aggregates tabular data by a row field (and optional column field). |
core.portal-api-tokens | Portal block that shows the member's personal read-only API tokens, with create and revoke for the signed-in portal member, scoped by the portal's access policies. |
core.portal-approvals | Portal block that shows records waiting for the member's approval, with approve and decline for the signed-in portal member, scoped by the portal's access policies. |
core.portal-catalog | Portal block that shows a catalog of items the member can request, with a request form for the signed-in portal member, scoped by the portal's access policies. |
core.portal-delegates | Portal block that shows the people the member has let act for them, with add and remove for the signed-in portal member, scoped by the portal's access policies. |
core.portal-library | Portal block that shows the document library folders configured for the portal for the signed-in portal member, scoped by the portal's access policies. |
core.portal-messages | Portal block that shows the member's conversations with your team for the signed-in portal member, scoped by the portal's access policies. |
core.portal-notifications | Portal block that shows the member's notifications for the signed-in portal member, scoped by the portal's access policies. |
core.portal-records | Portal block that shows a table of records from a data service, with paging and an optional detail view for the signed-in portal member, scoped by the portal's access policies. |
core.portal-search | Portal block that shows a search over the portal's content for the signed-in portal member, scoped by the portal's access policies. |
core.portal-summary | Portal block that shows summary tiles computed by a data service for the signed-in portal member, scoped by the portal's access policies. |
core.portal-team | Portal block that shows the colleagues of the member's company for the signed-in portal member, scoped by the portal's access policies. |
core.product-card | Card that shows a product from a record, with a title, selected fields and an icon; fires clicked when pressed. |
core.purchase-order-card | Card that shows a purchase order from a record, with a title, selected fields and an icon; fires clicked when pressed. |
core.quotation-card | Card that shows a quotation from a record, with a title, selected fields and an icon; fires clicked when pressed. |
core.recent-records | List of recently opened records with a primary line, a secondary line, a badge and a date taken from fields of each item; fires selected when one is chosen. |
core.role-card | Card that shows a role from a record, with a title, selected fields and an icon; fires clicked when pressed. |
core.sales-order-card | Card that shows a sales order from a record, with a title, selected fields and an icon; fires clicked when pressed. |
core.scheduler | Displays a set of resources (rooms, staff, machines, ...) as rows against a fixed daily time range, with each resource's events drawn as bars within that range — a day-view resource scheduler/calendar grid. |
core.stock-movement-card | Card that shows a stock movement from a record, with a title, selected fields and an icon; fires clicked when pressed. |
core.stock-transfer-card | Card that shows a stock transfer from a record, with a title, selected fields and an icon; fires clicked when pressed. |
core.supplier-card | Card that shows a supplier from a record, with a title, selected fields and an icon; fires clicked when pressed. |
core.survey | Survey with questions and a rating scale; answers are sent to the portal. |
core.task-card | Displays a summary of one task/to-do item — title, due date, assignee, status, and priority — as a clickable card, for task lists, My Tasks inboxes, and workflow queues. |
core.timeline-calendar | Resource calendar for scheduling across resources: rows are resources, events sit on a time axis between the first and last visible hour; fires selected. |
core.tree-grid | Displays hierarchical data as a table — one row per node, with multiple columns per row instead of a single label — for structures like an org chart-as-table or a nested category/BOM listing. |
core.user-list | List of users, optionally with avatars with a primary line, a secondary line, a badge and a date taken from fields of each item; fires selected when one is chosen. |
core.user-profile | Displays a compact summary of one system user (name, role, email, avatar, status) — the generic "who is logged in / who owns this" tile, distinct from core.employee-card which is HR-domain-specific. |
core.warehouse-card | Card that shows a warehouse from a record, with a title, selected fields and an icon; fires clicked when pressed. |
core.ai-chat
| Property | Type | Set from | Default |
|---|---|---|---|
agentCode | string | static | |
assistantReply | json | static, expression, binding | |
loading | boolean | static, expression, binding | false |
placeholder | string | static | Type your question... |
Events: messageSent
core.ai-classification
| Property | Type | Set from | Default |
|---|---|---|---|
title | string | static, expression | AI Classification |
promptCode | string | static | ai-classification |
inputValues | json | static, expression, binding | {} |
result | json | static, expression, binding | |
loading | boolean | static, expression, binding | false |
placeholder | string | static | Unclassified |
autoRun | boolean | static | true |
regenerateLabel | string | static | Regenerate |
Events: generateRequested
core.ai-form-assistant
| Property | Type | Set from | Default |
|---|---|---|---|
entityName | string | static, expression | |
inputValues | json | static, expression, binding | {} |
suggestions | json | static, expression, binding | |
loading | boolean | static, expression, binding | false |
suggestLabel | string | static | Suggest values |
Events: suggestRequested, suggestionApplied
core.ai-insights
| Property | Type | Set from | Default |
|---|---|---|---|
title | string | static, expression | AI Insights |
promptCode | string | static | ai-insights |
inputValues | json | static, expression, binding | {} |
result | json | static, expression, binding | |
loading | boolean | static, expression, binding | false |
placeholder | string | static | No insights yet. |
autoRun | boolean | static | true |
regenerateLabel | string | static | Regenerate |
Events: generateRequested
core.ai-prediction
| Property | Type | Set from | Default |
|---|---|---|---|
title | string | static, expression | AI Prediction |
promptCode | string | static | ai-prediction |
inputValues | json | static, expression, binding | {} |
result | json | static, expression, binding | |
loading | boolean | static, expression, binding | false |
placeholder | string | static | No prediction yet. |
autoRun | boolean | static | true |
regenerateLabel | string | static | Regenerate |
Events: generateRequested
core.ai-recommendation
| Property | Type | Set from | Default |
|---|---|---|---|
title | string | static, expression | AI Recommendation |
promptCode | string | static | ai-recommendation |
inputValues | json | static, expression, binding | {} |
result | json | static, expression, binding | |
loading | boolean | static, expression, binding | false |
placeholder | string | static | No recommendation yet. |
autoRun | boolean | static | true |
regenerateLabel | string | static | Regenerate |
Events: generateRequested
core.ai-record-search
| Property | Type | Set from | Default |
|---|---|---|---|
entityName | string | static, expression | |
placeholder | string | static | Ask in plain language... |
resultSummary | json | static, expression, binding | |
loading | boolean | static, expression, binding | false |
Events: querySubmitted
core.ai-summary
| Property | Type | Set from | Default |
|---|---|---|---|
title | string | static, expression | AI Summary |
promptCode | string | static | ai-summary |
inputValues | json | static, expression, binding | {} |
result | json | static, expression, binding | |
loading | boolean | static, expression, binding | false |
placeholder | string | static | No summary yet. |
autoRun | boolean | static | true |
regenerateLabel | string | static | Regenerate |
Events: generateRequested
core.ai-translation
| Property | Type | Set from | Default |
|---|---|---|---|
title | string | static, expression | AI Translation |
promptCode | string | static | ai-translation |
inputValues | json | static, expression, binding | {} |
result | json | static, expression, binding | |
loading | boolean | static, expression, binding | false |
placeholder | string | static | No translation yet. |
autoRun | boolean | static | false |
regenerateLabel | string | static | Regenerate |
Events: generateRequested
core.alert-card
| Property | Type | Set from | Default |
|---|---|---|---|
record | json | static, binding | {"title":"Approval overdue","message":"3 leave ... |
titlePath | string | static | title |
fields | json | static | [{"label":"","valuePath":"message"}] |
items | json | static, expression, binding | [] |
icon | string | static, expression, binding | warning |
tone | string | static, expression, binding | warning |
Events: clicked
core.announcement-card
| Property | Type | Set from | Default |
|---|---|---|---|
record | json | static, binding | {"title":"Company holiday schedule published","... |
titlePath | string | static | title |
fields | json | static | [{"label":"","valuePath":"message"}] |
items | json | static, expression, binding | [] |
icon | string | static, expression, binding | campaign |
tone | string | static, expression, binding | info |
Events: clicked
core.app-tile-grid
A SaaS-style application launcher grid — colored icon tiles, e.g. Microsoft 365's own app launcher — for surfacing a tenant's applications/modules as clickable tiles.
| Property | Type | Set from | Default |
|---|---|---|---|
items | json | static, expression, binding | [{"label":"First app","icon":"grid","color":"#4... |
primaryPath | string | static | label |
iconPath | string | static | icon |
colorPath | string | static | color |
badgePath | string | static | badge |
subtitlePath | string | static | subtitle |
cardVariant | string | static | flat |
Events: selected
json
{
"instanceId": "tiles-app-launcher",
"blockType": "core.app-tile-grid",
"blockVersion": "1.0.0",
"contractVersion": 1,
"properties": {
"items": { "source": "binding", "value": { "scope": "page", "key": "myApplications" } },
"primaryPath": { "source": "static", "value": "displayName" },
"iconPath": { "source": "static", "value": "iconKey" },
"colorPath": { "source": "static", "value": "accentColor" }
}
}- Use for a top-level "launcher" surface (e.g. an Application Launcher page), not as a substitute for in-app navigation (
core.nav-menu/core.sidebar). - Set
colorPathper tile for visual differentiation; omitted/invalid colors all fall back to the same default tint. - Use
badgePathonly for literal author-typed labels — it is not a live count (seecore.menu-nav'sbadgeCountfor that).
core.appointment-calendar
| Property | Type | Set from | Default |
|---|---|---|---|
resources | json | static, expression, binding | [{"id":"provider1","label":"Dr. Nair"}] |
events | json | static, expression, binding | [{"id":"e1","resourceId":"provider1","label":"A... |
slotStartHour | number | static | 9 |
slotEndHour | number | static | 17 |
Events: selected
core.article-feedback
| Property | Type | Set from | Default |
|---|---|---|---|
title | string | static | Was this helpful? |
portal | string | static | |
item | string | static, binding |
core.attachment-list
Displays a list of file attachments (name, size, type) with per-item open — and optionally remove — actions, for showing multiple documents attached to a record (e.g. all files on an employee's HR case).
| Property | Type | Set from | Default |
|---|---|---|---|
items | json | static, expression, binding | [{"name":"Contract.pdf","url":"","size":"340 KB... |
removable | boolean | static | false |
Events: opened, removed
json
{
"blockType": "core.attachment-list",
"properties": {
"items": { "source": "binding", "binding": { "scope": "block", "key": "caseAttachments" } },
"removable": { "source": "static", "value": true }
}
}- Set
removable: trueonly where the caller actually wires aremovedhandler that deletes the underlying file — otherwise the button is misleading. - Bind
itemsto a Data Source query filtered to the current record's attachments, not a global file list. - Use
core.document-viewerinstead when there is exactly one document to surface with richer per-document context.
core.attendance-card
Displays one day's attendance summary for an employee — date, check-in time, check-out time, and status (e.g. Present/Absent/Late).
| Property | Type | Set from | Default |
|---|---|---|---|
record | json | static, binding | {"date":"2026-07-21","checkIn":"09:02","checkOu... |
datePath | string | static | date |
checkInPath | string | static | checkIn |
checkOutPath | string | static | checkOut |
statusPath | string | static | status |
json
{
"blockType": "core.attendance-card",
"properties": {
"record": { "source": "binding", "binding": { "scope": "block", "key": "todaysAttendance" } }
}
}- Bind
recordto a per-day attendance query result, not a list — for multiple days usecore.gridalongside this card, or repeat this card inside a list/loop container. - Keep
datePath/checkInPath/checkOutPath/statusPathin sync with the actual attendance entity's field names rather than reshaping upstream data. - Pair with
core.leave-balanceon an Employee Self-Service dashboard for a combined attendance/leave overview.
core.availability
| Property | Type | Set from | Default |
|---|---|---|---|
resources | json | static, expression, binding | [{"id":"r1","label":"Availability"}] |
events | json | static, expression, binding | [{"id":"e1","resourceId":"r1","label":"Busy","s... |
slotStartHour | number | static | 0 |
slotEndHour | number | static | 24 |
Events: selected
core.booking-calendar
| Property | Type | Set from | Default |
|---|---|---|---|
resources | json | static, expression, binding | [{"id":"venue1","label":"Main Hall"},{"id":"ven... |
events | json | static, expression, binding | [{"id":"e1","resourceId":"venue1","label":"Book... |
slotStartHour | number | static | 0 |
slotEndHour | number | static | 24 |
Events: selected
core.business-unit-card
| Property | Type | Set from | Default |
|---|---|---|---|
record | json | static, binding | {"name":"North America Sales","code":"NA-SALES"... |
titlePath | string | static | name |
fields | json | static | [{"label":"Code","valuePath":"code"},{"label":"... |
items | json | static, expression, binding | [] |
icon | string | static, expression, binding | domain |
Events: clicked
core.calendar-card
| Property | Type | Set from | Default |
|---|---|---|---|
record | json | static, binding | |
titlePath | string | static | title |
fields | json | static | [] |
items | json | static, expression, binding | [{"primary":"All-hands meeting","secondary":"10... |
icon | string | static, expression, binding | event |
Events: itemClicked
core.chat-window
| Property | Type | Set from | Default |
|---|---|---|---|
messages | json | static, expression, binding | [{"id":"1","authorId":"u2","authorName":"Jane D... |
currentUserId | string | static, expression, binding | |
placeholder | string | static | Type a message... |
loading | boolean | static, expression, binding | false |
Events: messageSent
core.company-card
| Property | Type | Set from | Default |
|---|---|---|---|
record | json | static, binding | {"name":"Spark ERP Inc.","legalName":"Spark ERP... |
titlePath | string | static | name |
fields | json | static | [{"label":"Legal Name","valuePath":"legalName"}... |
items | json | static, expression, binding | [] |
icon | string | static, expression, binding | business |
Events: clicked
core.conversation-list
| Property | Type | Set from | Default |
|---|---|---|---|
items | json | static, expression, binding | [{"title":"Jane Doe","lastMessage":"Sure, what'... |
primaryPath | string | static | title |
secondaryPath | string | static | lastMessage |
showAvatar | boolean | static, expression, binding | true |
badgePath | string | static | unreadCount |
badgeColorPath | string | static | badgeColor |
Events: selected
core.custom-fields-panel
Renders and edits a record's tenant-authored custom fields (Custom Field Engine v1) — one input per active field definition for a given entity type/instance, with a single all-or-nothing Save.
| Property | Type | Set from | Default |
|---|---|---|---|
entityType | string | static, expression, binding | |
entityId | string | static, expression, binding | |
readOnly | boolean | static | false |
Events: saved
json
{
"instanceId": "custom-fields-employee-profile",
"blockType": "core.custom-fields-panel",
"blockVersion": "1.0.0",
"contractVersion": 1,
"properties": {
"entityType": { "source": "static", "value": "employee" },
"entityId": { "source": "binding", "binding": { "scope": "page", "key": "selectedEmployeeId" } },
"readOnly": { "source": "static", "value": false }
}
}- Always inject a real
CustomFieldDataSourcein production — the un-wired default renders no fields at all. - Set
readOnly: truefor display-only contexts (e.g. an audit/history view) rather than hiding the panel entirely. - Treat
lookup-type fields as display-only in v1 — they render read-only regardless ofreadOnly, since no nested lookup data source exists yet.
core.customer-card
| Property | Type | Set from | Default |
|---|---|---|---|
record | json | static, binding | {"name":"Acme Corp","accountManager":"Jane Doe"... |
titlePath | string | static | name |
fields | json | static | [{"label":"Account Manager","valuePath":"accoun... |
items | json | static, expression, binding | [] |
icon | string | static, expression, binding | storefront |
Events: clicked
core.data-card
A generic, author-configurable field-list card for showing one bound record's title plus a handful of labeled fields — unlike the fixed-shape ERP business cards (employee-card, etc.), both titlePath and the entire fields list are authored, not fixed.
| Property | Type | Set from | Default |
|---|---|---|---|
record | json | static, binding | {"title":"Sample Record","region":"West","owner... |
titlePath | string | static | title |
fields | json | static | [{"label":"Region","valuePath":"region"},{"labe... |
icon | string | static, expression, binding | |
tone | string | static, expression, binding | default |
items | json | static, expression, binding | [] |
Events: clicked, itemClicked
json
{
"instanceId": "card-selected-employee",
"blockType": "core.data-card",
"blockVersion": "1.0.0",
"contractVersion": 1,
"properties": {
"record": { "source": "binding", "value": { "scope": "page", "key": "selectedEmployee" } },
"titlePath": { "source": "static", "value": "fullName" },
"fields": {
"source": "static",
"value": [
{ "label": "Department", "valuePath": "department.name" },
{ "label": "Manager", "valuePath": "manager.fullName" }
]
}
}
}- Keep
fieldsshort (a handful of entries) — this is a summary card, not a full record view; use a Form for full editing. - Prefer the
childrenslot only when the built-in title/field layout genuinely can't express the needed design — it fully overrides the built-in layout when non-empty. - Wire
clickedto anavigateaction reading${event.record.<idField>}for drill-down.
core.department-card
| Property | Type | Set from | Default |
|---|---|---|---|
record | json | static, binding | {"name":"Engineering","code":"ENG","head":"Alex... |
titlePath | string | static | name |
fields | json | static | [{"label":"Code","valuePath":"code"},{"label":"... |
items | json | static, expression, binding | [] |
icon | string | static, expression, binding | groups |
Events: clicked
core.document-viewer
Displays a summary of one document (name, size, type) with an "open" action — for showing a single linked document (e.g. an employee's offer letter) on a Page or Form.
| Property | Type | Set from | Default |
|---|---|---|---|
record | json | static, binding | {"name":"Employee Handbook.pdf","url":"","size"... |
namePath | string | static | name |
urlPath | string | static | url |
sizePath | string | static | size |
typePath | string | static | type |
Events: opened
json
{
"blockType": "core.document-viewer",
"properties": {
"record": { "source": "binding", "binding": { "scope": "block", "key": "offerLetterDoc" } }
}
}- Bind
recordto a single document metadata query result; usecore.attachment-listwhen there are multiple documents to show. - Wire
openedto anopenUrl/navigate action pointing at the document's real URL rather than embedding preview logic in this widget. - Keep
urlPathpointing at a signed/authorized URL when documents are access-controlled (File Management module concern, not this widget's).
core.dynamic-table
| Property | Type | Set from | Default |
|---|---|---|---|
items | json | static, expression, binding | [{"category":"North","amount":1200},{"category"... |
columns | json | static, expression, binding | [] |
Events: rowClicked
core.employee-calendar
| Property | Type | Set from | Default |
|---|---|---|---|
resources | json | static, expression, binding | [{"id":"emp1","label":"Sam Patel"},{"id":"emp2"... |
events | json | static, expression, binding | [{"id":"e1","resourceId":"emp1","label":"Mornin... |
slotStartHour | number | static | 8 |
slotEndHour | number | static | 20 |
Events: selected
core.employee-card
Displays a compact summary of one employee record (name, job title, department, photo) as a clickable card — the canonical HCM "who is this" tile for directories, org charts, and dashboards.
| Property | Type | Set from | Default |
|---|---|---|---|
record | json | static, binding | {"fullName":"Jane Doe","jobTitle":"Product Mana... |
namePath | string | static | fullName |
titlePath | string | static | jobTitle |
departmentPath | string | static | department.name |
photoPath | string | static | photo |
Events: opened
json
{
"blockType": "core.employee-card",
"properties": {
"record": { "source": "binding", "binding": { "scope": "page", "key": "selectedEmployee" } },
"namePath": { "source": "static", "value": "fullName" },
"titlePath": { "source": "static", "value": "jobTitle" },
"departmentPath": { "source": "static", "value": "department.name" },
"photoPath": { "source": "static", "value": "photoUrl" }
}
}- Bind
recordto a single-row Data Source result (e.g. "Get Employee by Id"), not a full list. - Adjust the
*Pathproperties instead of reshaping the upstream entity to match the widget's default field names. - Use the
childrenslot when the built-in card layout doesn't match a tenant's branding, rather than forking the widget.
core.file-browser
| Property | Type | Set from | Default |
|---|---|---|---|
nodes | json | static, expression, binding | [{"id":"cab-1","name":"HR Documents","type":"ca... |
Events: expand, selected
core.file-version-history
| Property | Type | Set from | Default |
|---|---|---|---|
fileId | string | static, expression, binding | |
versions | json | static, expression, binding | [{"versionNumber":2,"sizeBytes":348160,"created... |
currentVersion | number | static, expression, binding |
Events: download, restore
core.financial-summary-card
| Property | Type | Set from | Default |
|---|---|---|---|
record | json | static, binding | {"period":"Q2 2026","revenue":1250000,"expenses... |
titlePath | string | static | period |
fields | json | static | [{"label":"Revenue","valuePath":"revenue"},{"la... |
items | json | static, expression, binding | [] |
icon | string | static, expression, binding | insights |
Events: clicked
core.gantt-chart
Displays a set of tasks as horizontal bars positioned along a shared timeline, with an optional in-bar progress indicator — the standard project/task-schedule visualization.
| Property | Type | Set from | Default |
|---|---|---|---|
tasks | json | static, expression, binding | [{"id":"1","label":"Design","start":"2026-07-01... |
json
{
"contractVersion": 1,
"instanceId": "onboarding-gantt",
"blockType": "core.gantt-chart",
"blockVersion": "1.0.0",
"properties": {
"tasks": {
"source": "static",
"value": [
{ "id": "t1", "label": "Offer & Paperwork", "start": "2026-08-01", "end": "2026-08-03", "progress": 100 },
{ "id": "t2", "label": "IT Provisioning", "start": "2026-08-03", "end": "2026-08-05", "progress": 50 },
{ "id": "t3", "label": "Orientation", "start": "2026-08-05", "end": "2026-08-06", "progress": 0 }
]
}
}
}- Keep
labelshort — long labels compete with the category-axis width - Use
progress(0–100) to reflect real completion so the two-tone bar is - Prefer a
bindingsource fortaskswhen the data comes from a live
core.goods-receipt-card
| Property | Type | Set from | Default |
|---|---|---|---|
record | json | static, binding | {"grNumber":"GR-3390","poNumber":"PO-5521","rec... |
titlePath | string | static | grNumber |
fields | json | static | [{"label":"PO Number","valuePath":"poNumber"},{... |
items | json | static, expression, binding | [] |
icon | string | static, expression, binding | inventory |
Events: clicked
core.grid
A full-featured, license-free server-side data grid — sorting, filtering, paging, grouping with per-group aggregates, column visibility/order/pin/width/density, inline cell editing, row selection, and CSV export — the primary widget for tabular record lists (e.g. Employee Directory, Payroll Runs, Leave Requests).
| Property | Type | Set from | Default |
|---|---|---|---|
columns | json | static, expression, binding | [{"name":"name"},{"name":"status"}] |
pageSize | number | static | 25 |
externalFilter | json | static, expression, binding | |
search | string | static, expression, binding | |
showColumnFilters | boolean | static | true |
bulkActions | json | static | [] |
hiddenActionKeys | json | static, expression, binding | [] |
dataSource | string | static | |
refreshTrigger | string | static, expression, binding | |
reorderableRows | boolean | static | false |
loadMode | string | static | paged |
rowAccent | json | static, expression, binding | [] |
detailField | string | static | |
sharedViewsApi | json | static, expression, binding |
Events: selectionChanged, rowClicked, rowEdited, rowAction, bulkAction, rowReordered
Outputs: rows (json), total (number), pageIndex (number), sort (json), filter (json), groups (json), aggregates (json), expandedGroups (json), error (string), circuitOpen (boolean), selectedIds (json), density (string), groupBy (string)
json
{
"blockType": "core.grid",
"properties": {
"columns": {
"source": "static",
"value": [
{ "name": "employeeName", "type": "string", "headerKey": "Employee" },
{ "name": "department", "type": "string", "headerKey": "Department", "groupable": true },
{ "name": "status", "type": "string", "headerKey": "Status" },
{ "name": "salary", "type": "number", "headerKey": "Salary", "aggregate": "sum" }
]
},
"pageSize": { "source": "static", "value": 50 }
}
}- Always inject a real
GridDataSource(viacoreBlockTypes(gridDataSource, ...)) backed by an actual Query Engine/Data Source in production — never ship the grid pointed atHarnessGridDataSourceoutside tests/dev. - Use
refreshTrigger(bound to page-scope state) to re-query in response to a sibling filter control, rather than trying to force a re-render another way — a bound-property change is the block's only real re-render trigger. - Set
aggregate/groupableper column incolumnsrather than trying to compute aggregates client-side.
core.invoice-card
| Property | Type | Set from | Default |
|---|---|---|---|
record | json | static, binding | {"invoiceNumber":"INV-1042","customerName":"Acm... |
titlePath | string | static | invoiceNumber |
fields | json | static | [{"label":"Customer","valuePath":"customerName"... |
items | json | static, expression, binding | [] |
icon | string | static, expression, binding | receipt-long |
Events: clicked
core.journal-entry-card
| Property | Type | Set from | Default |
|---|---|---|---|
record | json | static, binding | {"entryNumber":"JE-2026-0456","date":"2026-07-3... |
titlePath | string | static | entryNumber |
fields | json | static | [{"label":"Date","valuePath":"date"},{"label":"... |
items | json | static, expression, binding | [] |
icon | string | static, expression, binding | menu-book |
Events: clicked
core.kanban
A drag-and-drop kanban board.
| Property | Type | Set from | Default |
|---|---|---|---|
columns | json | static, expression, binding | [{"id":"todo","title":"To Do","cardIds":["card-... |
cards | json | static, expression, binding | [{"id":"card-1","title":"Design review","tags":... |
Events: cardMoved
json
{ "blockType": "core.kanban", "instanceId": "leave-board", "blockVersion": "1.0.0", "contractVersion": 1,
"properties": { "columns": {"source":"binding","binding":{"scope":"page","key":"leaveColumns"}}, "cards": {"source":"binding","binding":{"scope":"page","key":"leaveCards"}} } }- Wire
cardMovedto acallApiaction to persist the new column placement server-side — the widget never persists on its own.
core.lead-card
| Property | Type | Set from | Default |
|---|---|---|---|
record | json | static, binding | {"name":"Riya Shah","company":"Nimbus Retail","... |
titlePath | string | static | name |
fields | json | static | [{"label":"Company","valuePath":"company"},{"la... |
items | json | static, expression, binding | [] |
icon | string | static, expression, binding | person-search |
Events: clicked
core.leave-balance
Displays an employee's leave balance for one leave type — used, total, and a computed remaining amount.
| Property | Type | Set from | Default |
|---|---|---|---|
record | json | static, binding | |
leaveTypePath | string | static | leaveType |
usedPath | string | static | used |
totalPath | string | static | total |
json
{
"blockType": "core.leave-balance",
"properties": {
"record": { "source": "binding", "binding": { "scope": "block", "key": "annualLeaveBalance" } }
}
}- Bind
recordto one leave-type balance at a time; repeat the widget (one per leave type) inside a list/container for a multi-type leave summary. - Rely on the widget's own
remainingcomputation instead of pre-computing it upstream — it keepsused/totalas the single source of truth. - Pair with
core.attendance-cardon Employee Self-Service pages.
core.list
A simple, unmapped-columns repeated row list for showing a compact array of records as primary/secondary text rows (contrast with core.grid, which is the tabular/sortable/filterable data component).
| Property | Type | Set from | Default |
|---|---|---|---|
items | json | static, expression, binding | [{"label":"First item","description":"Sample de... |
primaryPath | string | static | label |
secondaryPath | string | static | description |
showAvatar | boolean | static, expression, binding | false |
layout | string | static | rows |
showConnectors | boolean | static | false |
badgePath | string | static | badge |
badgeColorPath | string | static | badgeColor |
datePath | string | static | date |
Events: selected
json
{
"instanceId": "list-open-tickets",
"blockType": "core.list",
"blockVersion": "1.0.0",
"contractVersion": 1,
"properties": {
"items": { "source": "binding", "binding": { "scope": "page", "key": "openTickets" } },
"primaryPath": { "source": "static", "value": "subject" },
"secondaryPath": { "source": "static", "value": "status" }
}
}- Use
core.listfor a simple repeated row projection; usecore.gridwhen you need sortable/filterable tabular columns. - Keep
primaryPath/secondaryPathpointed at scalar fields — non-scalar values are stringified viaString(...). - Wire
selectedto anavigateaction reading${event.item.<field>}rather than trying to read page state directly.
core.meeting-calendar
| Property | Type | Set from | Default |
|---|---|---|---|
resources | json | static, expression, binding | [{"id":"room-a","label":"Room A"},{"id":"room-b... |
events | json | static, expression, binding | [{"id":"e1","resourceId":"room-a","label":"Stan... |
slotStartHour | number | static | 9 |
slotEndHour | number | static | 17 |
Events: selected
core.my-approvals
| Property | Type | Set from | Default |
|---|---|---|---|
items | json | static, expression, binding | [{"title":"Leave request — Sam Patel","subtitle... |
primaryPath | string | static | title |
secondaryPath | string | static | subtitle |
badgePath | string | static | badge |
badgeColorPath | string | static | badgeColor |
datePath | string | static | date |
Events: selected
core.my-notifications
| Property | Type | Set from | Default |
|---|---|---|---|
items | json | static, expression, binding | [{"title":"Your leave request was approved","su... |
primaryPath | string | static | title |
secondaryPath | string | static | subtitle |
badgePath | string | static | badge |
badgeColorPath | string | static | badgeColor |
datePath | string | static | date |
Events: selected
core.my-tasks
| Property | Type | Set from | Default |
|---|---|---|---|
items | json | static, expression, binding | [{"title":"Prepare Q3 report","subtitle":"Due A... |
primaryPath | string | static | title |
secondaryPath | string | static | subtitle |
badgePath | string | static | badge |
badgeColorPath | string | static | badgeColor |
datePath | string | static | date |
Events: selected
core.nav-menu
An iPad-style icon-grid menu of a single app's own navigation sections (e.g. a Dashboard/Settings tile grid within one application), distinct from core.app-tile-grid's cross-application launcher role even though both share the same tile-grid render code.
| Property | Type | Set from | Default |
|---|---|---|---|
items | json | static, expression, binding | [{"label":"Dashboard","icon":"home","color":"#4... |
primaryPath | string | static | label |
iconPath | string | static | icon |
colorPath | string | static | color |
Events: selected
json
{
"instanceId": "navmenu-hcm-sections",
"blockType": "core.nav-menu",
"blockVersion": "1.0.0",
"contractVersion": 1,
"properties": {
"items": {
"source": "static",
"value": [
{ "label": "Employees", "icon": "people", "color": "#4F46E5" },
{ "label": "Payroll", "icon": "wallet", "color": "#16A34A" },
{ "label": "Attendance", "icon": "schedule", "color": "#F59E0B" }
]
}
}
}- Use
core.nav-menufor a single application's own sub-navigation; usecore.app-tile-gridfor a cross-application launcher. - Keep tile counts small (a handful to a dozen) — this is a landing/home surface, not a dense data list.
- Wire
selectedto anavigateaction reading${event.item.route}(or equivalent field) rather than hardcoding routes per tile.
core.news-card
| Property | Type | Set from | Default |
|---|---|---|---|
record | json | static, binding | |
titlePath | string | static | title |
fields | json | static | [] |
items | json | static, expression, binding | [{"primary":"New benefits partner announced","s... |
icon | string | static, expression, binding | article |
Events: itemClicked
core.opportunity-card
| Property | Type | Set from | Default |
|---|---|---|---|
record | json | static, binding | {"name":"Nimbus Retail — Platform Upgrade","sta... |
titlePath | string | static | name |
fields | json | static | [{"label":"Stage","valuePath":"stage"},{"label"... |
items | json | static, expression, binding | [] |
icon | string | static, expression, binding | trending-up |
Events: clicked
core.payment-card
| Property | Type | Set from | Default |
|---|---|---|---|
record | json | static, binding | {"reference":"PMT-3081","payerName":"Acme Corp"... |
titlePath | string | static | reference |
fields | json | static | [{"label":"Payer / Payee","valuePath":"payerNam... |
items | json | static, expression, binding | [] |
icon | string | static, expression, binding | payments |
Events: clicked
core.payroll-summary
Displays a payroll period summary for an employee — period, gross pay, deductions, and net pay — formatted as localized currency.
| Property | Type | Set from | Default |
|---|---|---|---|
record | json | static, binding | {"period":"July 2026","gross":5000,"deductions"... |
periodPath | string | static | period |
grossPath | string | static | gross |
deductionsPath | string | static | deductions |
netPath | string | static | net |
currencyCode | string | static | USD |
json
{
"blockType": "core.payroll-summary",
"properties": {
"record": { "source": "binding", "binding": { "scope": "block", "key": "julyPayrollRun" } },
"currencyCode": { "source": "static", "value": "INR" }
}
}- Set
currencyCodeexplicitly per tenant/country rather than relying on the"USD"default, especially for multi-country HCM deployments. - Bind
recordto one payroll period at a time; usecore.gridfor a payroll history list. - Keep numeric fields (
gross/deductions/net) as raw numbers upstream — let the widget handle currency formatting rather than pre-formatting strings.
core.pending-actions
| Property | Type | Set from | Default |
|---|---|---|---|
items | json | static, expression, binding | [{"title":"Complete your profile","subtitle":"M... |
primaryPath | string | static | title |
secondaryPath | string | static | subtitle |
badgePath | string | static | badge |
badgeColorPath | string | static | badgeColor |
datePath | string | static | date |
Events: selected
core.pivot-table
Aggregates tabular data by a row field (and optional column field).
| Property | Type | Set from | Default |
|---|---|---|---|
data | json | static, expression, binding | [{"category":"North","amount":1200},{"category"... |
rowFieldPath | string | static | category |
columnFieldPath | string | static | |
valueFieldPath | string | static | amount |
aggregation | string | static | sum |
json
{ "blockType": "core.pivot-table", "instanceId": "expense-pivot", "blockVersion": "1.0.0", "contractVersion": 1,
"properties": { "data": {"source":"binding","binding":{"scope":"page","key":"expenseRows"}}, "rowFieldPath": {"source":"static","value":"department"}, "valueFieldPath": {"source":"static","value":"amount"}, "aggregation": {"source":"static","value":"sum"} } }- Use
core.gridinstead for row-level data browsing; use this widget specifically for grouped/aggregated summaries.
core.portal-api-tokens
| Property | Type | Set from | Default |
|---|---|---|---|
title | string | static | API tokens |
portal | string | static |
core.portal-approvals
| Property | Type | Set from | Default |
|---|---|---|---|
title | string | static | Needs your approval |
portal | string | static | |
columns | json | static | [] |
core.portal-catalog
| Property | Type | Set from | Default |
|---|---|---|---|
title | string | static | How can we help? |
portal | string | static | |
entity | string | static | |
items | json | static | [] |
formFields | json | static | [] |
core.portal-delegates
| Property | Type | Set from | Default |
|---|---|---|---|
title | string | static | People who act for me |
portal | string | static | |
roles | string | static |
core.portal-library
| Property | Type | Set from | Default |
|---|---|---|---|
title | string | static | Documents |
portal | string | static |
core.portal-messages
| Property | Type | Set from | Default |
|---|---|---|---|
title | string | static | Messages |
portal | string | static |
core.portal-notifications
| Property | Type | Set from | Default |
|---|---|---|---|
title | string | static | Notifications |
portal | string | static |
core.portal-records
| Property | Type | Set from | Default |
|---|---|---|---|
title | string | static | My records |
portal | string | static | |
dataService | string | static | |
columns | json | static | [] |
pageSize | number | static | 10 |
showDetail | boolean | static | true |
emptyText | string | static | Nothing here yet. |
entity | string | static | |
formFields | json | static | [] |
allowCreate | boolean | static | false |
allowEdit | boolean | static | false |
idField | string | static | id |
showFiles | boolean | static | false |
showTimeline | boolean | static | false |
parameters | json | static | {} |
core.portal-search
| Property | Type | Set from | Default |
|---|---|---|---|
title | string | static | Search |
portal | string | static |
core.portal-summary
| Property | Type | Set from | Default |
|---|---|---|---|
title | string | static | Summary |
portal | string | static | |
dataService | string | static | |
tiles | json | static | [] |
parameters | json | static | {} |
core.portal-team
| Property | Type | Set from | Default |
|---|---|---|---|
title | string | static | Our team |
portal | string | static |
core.product-card
| Property | Type | Set from | Default |
|---|---|---|---|
record | json | static, binding | {"name":"Wireless Mouse","sku":"WM-2200","categ... |
titlePath | string | static | name |
fields | json | static | [{"label":"SKU","valuePath":"sku"},{"label":"Ca... |
items | json | static, expression, binding | [] |
icon | string | static, expression, binding | inventory-2 |
Events: clicked
core.purchase-order-card
| Property | Type | Set from | Default |
|---|---|---|---|
record | json | static, binding | {"poNumber":"PO-5521","supplierName":"BluePeak ... |
titlePath | string | static | poNumber |
fields | json | static | [{"label":"Supplier","valuePath":"supplierName"... |
items | json | static, expression, binding | [] |
icon | string | static, expression, binding | assignment |
Events: clicked
core.quotation-card
| Property | Type | Set from | Default |
|---|---|---|---|
record | json | static, binding | {"quoteNumber":"QUO-2216","customerName":"Acme ... |
titlePath | string | static | quoteNumber |
fields | json | static | [{"label":"Customer","valuePath":"customerName"... |
items | json | static, expression, binding | [] |
icon | string | static, expression, binding | request-quote |
Events: clicked
core.recent-records
| Property | Type | Set from | Default |
|---|---|---|---|
items | json | static, expression, binding | [{"title":"Acme Corp — Renewal Quote","subtitle... |
primaryPath | string | static | title |
secondaryPath | string | static | subtitle |
badgePath | string | static | badge |
badgeColorPath | string | static | badgeColor |
datePath | string | static | date |
Events: selected
core.role-card
| Property | Type | Set from | Default |
|---|---|---|---|
record | json | static, binding | {"name":"HR Manager","permissionCount":38,"user... |
titlePath | string | static | name |
fields | json | static | [{"label":"Permission Count","valuePath":"permi... |
items | json | static, expression, binding | [] |
icon | string | static, expression, binding | admin-panel-settings |
Events: clicked
core.sales-order-card
| Property | Type | Set from | Default |
|---|---|---|---|
record | json | static, binding | {"orderNumber":"SO-7781","customerName":"Acme C... |
titlePath | string | static | orderNumber |
fields | json | static | [{"label":"Customer","valuePath":"customerName"... |
items | json | static, expression, binding | [] |
icon | string | static, expression, binding | shopping-cart |
Events: clicked
core.scheduler
Displays a set of resources (rooms, staff, machines, ...) as rows against a fixed daily time range, with each resource's events drawn as bars within that range — a day-view resource scheduler/calendar grid.
| Property | Type | Set from | Default |
|---|---|---|---|
resources | json | static, expression, binding | [{"id":"r1","label":"Room A"},{"id":"r2","label... |
events | json | static, expression, binding | [{"id":"e1","resourceId":"r1","label":"Standup"... |
slotStartHour | number | static | 8 |
slotEndHour | number | static | 18 |
Events: selected
json
{
"contractVersion": 1,
"instanceId": "room-scheduler",
"blockType": "core.scheduler",
"blockVersion": "1.0.0",
"properties": {
"resources": {
"source": "static",
"value": [
{ "id": "conf-a", "label": "Conference Room A" },
{ "id": "conf-b", "label": "Conference Room B" }
]
},
"events": {
"source": "binding",
"binding": "page.roomBookingsToday"
},
"slotStartHour": { "source": "static", "value": 8 },
"slotEndHour": { "source": "static", "value": 19 }
},
"events": {
"selected": {
"source": "action-chain",
"actions": []
}
}
}- Keep
slotStartHour/slotEndHourmatched to real business hours so - Bind
eventsto a live query (bookings/interviews/shifts) rather than - Wire the
selectedevent to an action chain (e.g. open a detail dialog)
core.stock-movement-card
| Property | Type | Set from | Default |
|---|---|---|---|
record | json | static, binding | {"movementNumber":"SM-8842","product":"Wireless... |
titlePath | string | static | movementNumber |
fields | json | static | [{"label":"Product","valuePath":"product"},{"la... |
items | json | static, expression, binding | [] |
icon | string | static, expression, binding | sync-alt |
Events: clicked
core.stock-transfer-card
| Property | Type | Set from | Default |
|---|---|---|---|
record | json | static, binding | {"transferNumber":"ST-1190","product":"Wireless... |
titlePath | string | static | transferNumber |
fields | json | static | [{"label":"Product","valuePath":"product"},{"la... |
items | json | static, expression, binding | [] |
icon | string | static, expression, binding | compare-arrows |
Events: clicked
core.supplier-card
| Property | Type | Set from | Default |
|---|---|---|---|
record | json | static, binding | {"name":"BluePeak Materials","category":"Raw Ma... |
titlePath | string | static | name |
fields | json | static | [{"label":"Category","valuePath":"category"},{"... |
items | json | static, expression, binding | [] |
icon | string | static, expression, binding | local-shipping |
Events: clicked
core.survey
| Property | Type | Set from | Default |
|---|---|---|---|
title | string | static | How likely are you to recommend us to a friend? |
portal | string | static | |
survey | string | static | nps |
scale | string | static | nps |
questions | json | static | [] |
core.task-card
Displays a summary of one task/to-do item — title, due date, assignee, status, and priority — as a clickable card, for task lists, My Tasks inboxes, and workflow queues.
| Property | Type | Set from | Default |
|---|---|---|---|
record | json | static, binding | {"title":"Prepare Q3 report","dueDate":"2026-08... |
titlePath | string | static | title |
duePath | string | static | dueDate |
assigneePath | string | static | assignee |
statusPath | string | static | status |
priorityPath | string | static | priority |
Events: clicked
json
{
"blockType": "core.task-card",
"properties": {
"record": { "source": "binding", "binding": { "scope": "block", "key": "myTask" } }
}
}- Bind
recordto one task at a time; combine with a list/loop container orcore.gridfor a full task inbox. - Wire
clickedto a navigate action toward a task detail Page or Form. - Use
priorityPath/statusPathconsistently with the tenant's task/workflow entity so status/priority values render as expected by the render adapter's styling (e.g. color-coded chips).
core.timeline-calendar
| Property | Type | Set from | Default |
|---|---|---|---|
resources | json | static, expression, binding | [{"id":"r1","label":"Timeline"}] |
events | json | static, expression, binding | [{"id":"e1","resourceId":"r1","label":"Design R... |
slotStartHour | number | static | 8 |
slotEndHour | number | static | 18 |
Events: selected
core.tree-grid
Displays hierarchical data as a table — one row per node, with multiple columns per row instead of a single label — for structures like an org chart-as-table or a nested category/BOM listing.
| Property | Type | Set from | Default |
|---|---|---|---|
columns | json | static | [{"key":"name","label":"Name"},{"key":"status",... |
nodes | json | static, expression, binding | [{"id":"root","cells":{"name":"Engineering","st... |
Events: select
json
{
"blockType": "core.tree-grid",
"properties": {
"columns": { "source": "static", "value": [{ "key": "name", "label": "Department" }, { "key": "headcount", "label": "Headcount" }] },
"nodes": { "source": "binding", "binding": { "scope": "page", "key": "orgUnitTree" } }
}
}- Use
core.tree-gridfor hierarchical data that needs multiple columns per node; use plaincore.tree-viewwhen a single label per node is enough. - Keep
columns[].keyin sync with the keys present in each node'scellsrecord. - Bind
nodesto a Data Source result already shaped as a nested tree — this widget does not build hierarchy from a flat list itself.
core.user-list
| Property | Type | Set from | Default |
|---|---|---|---|
items | json | static, expression, binding | [{"name":"Jane Doe","title":"Engineering Manage... |
primaryPath | string | static | name |
secondaryPath | string | static | title |
showAvatar | boolean | static, expression, binding | true |
badgePath | string | static | badge |
badgeColorPath | string | static | badgeColor |
Events: selected
core.user-profile
Displays a compact summary of one system user (name, role, email, avatar, status) — the generic "who is logged in / who owns this" tile, distinct from core.employee-card which is HR-domain-specific.
| Property | Type | Set from | Default |
|---|---|---|---|
record | json | static, binding | {"name":"Jane Doe","role":"Administrator","emai... |
namePath | string | static | name |
rolePath | string | static | role |
emailPath | string | static | |
photoPath | string | static | avatar |
statusPath | string | static | status |
json
{
"blockType": "core.user-profile",
"properties": {
"record": { "source": "binding", "binding": { "scope": "session", "key": "currentUser" } }
}
}- Bind
recordto the current-user/session context for header/profile-menu placement, or to a queried user row for an admin "user detail" view. - Reserve
core.employee-cardfor HR-specific employee records (job title/department); usecore.user-profilefor identity/account-facing contexts (role/email/status). - Use the
childrenslot rather than forking the widget when a tenant needs a different visual layout.
core.warehouse-card
| Property | Type | Set from | Default |
|---|---|---|---|
record | json | static, binding | {"name":"Main Warehouse","code":"WH-01","locati... |
titlePath | string | static | name |
fields | json | static | [{"label":"Code","valuePath":"code"},{"label":"... |
items | json | static, expression, binding | [] |
icon | string | static, expression, binding | warehouse |
Events: clicked
