BulkResults
Usage
Inspection results
Selected IDs · 3 requested · 1 succeeded · 1 not reported
- Source
- equipment · r7
- Filters
- West site
| Equipment | Outcome | Details | Actions |
|---|---|---|---|
| Cooling pump AlphaEQ-1 | succeeded | — | |
| Ventilation fan BravoEQ-2 | failed | The application reported an unavailable record. | |
| EQ-3 | Not reported | — |
The third equipment ID stays Not reported until the application supplies its result.
<BulkResults
label="Inspection results"
selection={originalSelectionSnapshot}
items={suppliedResults}
pendingRetryIds={pendingIds}
onRetryRequest={reviewRetry}
/>
Complete result coverage
The named semantic table retains the original snapshot order and stable equipment IDs. Each BulkItemResult contains id, label, state, optional message, and optional retryable. States are queued, running, succeeded, failed, canceled, and skipped.
Source and Filters appear above the table using DescriptionList's shared details layout. These rows retain the original request's context, with muted labels and right-aligned, wrapping values.
Missing snapshot IDs appear as Not reported. Only explicit succeeded results count as successes. Skipped, canceled, running, queued, and missing outcomes never become successful by inference. The table does not derive a job lifecycle state; supply that separately to JobStatus.
A request with more than 100 IDs is shown a page at a time, in selection order, with the PREVIOUS PAGE and NEXT PAGE controls DataGrid uses; set pageSize to choose the page length. The summary above the table always counts every requested ID.
When the four columns cannot fit at a readable width, the table scrolls sideways inside its own box, and the page never widens. While it scrolls, the box is a keyboard tab stop named after the label ("Inspection results scroll viewport"). Names, IDs and messages wrap inside their cells.
Duplicate or unknown result IDs, invalid states, or malformed labels/messages produce a visible error. Outcomes are withheld until that coverage is corrected, while the original requested IDs remain visible as Not reported. Invalid selection IDs block result interpretation. Pending retry IDs must also be known and unique.
Explicit retries
Retry appears only when a failed item explicitly supplies retryable: true and the application supplies onRetryRequest. The callback receives that item's exact ID and leaves its supplied outcome unchanged. pendingRetryIds disables outstanding retry actions; disabled blocks all actions without hiding results.
The application reviews retries, rechecks current authority, creates a fresh request, and excludes prior successes. A request callback or resolved promise never proves a successful retry.
Props
| PROP | TYPE | DEFAULT | REQUIRED |
|---|---|---|---|
label | string | — | yes |
selectionBulkSelectionSnapshot for the exact original request. IDs must be unique and nonempty. | node | — | yes |
itemsBulkItemResult[]: {id,label,state:'queued'|'running'|'succeeded'|'failed'|'canceled'|'skipped',message?,retryable?}. Only snapshot IDs are accepted, once each. | array | — | yes |
pendingRetryIdsKnown unique IDs with a supplied pending retry request. Their actions remain disabled and previous results remain visible. | array | — | no |
onRetryRequest(id) => void. Offered only for explicitly retryable failed items. Calling it does not change supplied outcomes. | function | — | no |
disabled | boolean | false | no |
pageSizeRows per page. A request with more IDs than this is shown a page at a time, in selection order, with PREVIOUS PAGE and NEXT PAGE; the summary still counts every ID. Invalid or less-than-one values use 100; fractional values round down. | number | 100 | no |
headingLevelLabel heading level: 2, 3, 4, 5, or 6. Choose it for the hosting surface's heading hierarchy. | number | 3 | no |
className | string | — | no |
Accessibility
- The table is named, with equipment row headers and readable text statuses. Choose
headingLevel(2–6, default 3) to fit the label into the hosting surface's heading outline. - Source and filter metadata use native description-list relationships.
- The forwarded
HTMLDivElementref targets the named, focusable result region. - When a focused Retry becomes pending, or a supplied result removes it, focus moves to that row's equipment name (to the row now in its place if the row is gone, else to the result region), and only if it would otherwise be lost. A newly pending retry is announced: "Retry request pending for Ventilation fan Bravo. Awaiting an application update."
- Retry controls retain keyboard activation, visible focus, disabled semantics, and 24px targets.
Manifest entry
<BulkResults label="Inspection results" selection={snapshot} items={results} pendingRetryIds={pendingIds} onRetryRequest={reviewRetry} />View agent manifest
{
"description": "Named per-equipment result table in selection order. Missing IDs remain Not reported; malformed result coverage is visible and never counted as success.",
"props": {
"label": {
"type": "string",
"required": true
},
"selection": {
"type": "node",
"required": true,
"description": "BulkSelectionSnapshot for the exact original request. IDs must be unique and nonempty."
},
"items": {
"type": "array",
"required": true,
"description": "BulkItemResult[]: {id,label,state:'queued'|'running'|'succeeded'|'failed'|'canceled'|'skipped',message?,retryable?}. Only snapshot IDs are accepted, once each."
},
"pendingRetryIds": {
"type": "array",
"description": "Known unique IDs with a supplied pending retry request. Their actions remain disabled and previous results remain visible."
},
"onRetryRequest": {
"type": "function",
"description": "(id) => void. Offered only for explicitly retryable failed items. Calling it does not change supplied outcomes."
},
"disabled": {
"type": "boolean",
"default": false
},
"pageSize": {
"type": "number",
"default": 100,
"description": "Rows per page. A request with more IDs than this is shown a page at a time, in selection order, with PREVIOUS PAGE and NEXT PAGE; the summary still counts every ID. Invalid or less-than-one values use 100; fractional values round down."
},
"headingLevel": {
"type": "number",
"default": 3,
"description": "Label heading level: 2, 3, 4, 5, or 6. Choose it for the hosting surface's heading hierarchy."
},
"className": {
"type": "string"
}
},
"composable_with": [
"JobStatus",
"BulkActionBar",
"Badge",
"Button",
"DescriptionList"
],
"never_inside": [
"Button"
],
"example": "<BulkResults label=\"Inspection results\" selection={snapshot} items={results} pendingRetryIds={pendingIds} onRetryRequest={reviewRetry} />"
}