@almadar/std 16.235.0 → 16.237.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/behaviors/behaviors-registry.json +5621 -1993
- package/behaviors/lolo/infra/atoms/std-approval-gate.lolo +32 -41
- package/behaviors/lolo/infra/atoms/std-audit-capture.lolo +0 -5
- package/behaviors/lolo/infra/atoms/std-cache-aside.lolo +0 -24
- package/behaviors/lolo/infra/atoms/std-circuit-breaker.lolo +1 -17
- package/behaviors/lolo/infra/atoms/std-data-erasure.lolo +17 -24
- package/behaviors/lolo/infra/atoms/std-data-import.lolo +8 -11
- package/behaviors/lolo/infra/atoms/std-game-clock.lolo +2 -0
- package/behaviors/lolo/infra/atoms/std-knowledge-loop.lolo +0 -5
- package/behaviors/lolo/infra/atoms/std-lifecycle.lolo +3 -1
- package/behaviors/lolo/infra/atoms/std-migration-job.lolo +2 -2
- package/behaviors/lolo/infra/atoms/std-mod-queue.lolo +40 -18
- package/behaviors/lolo/infra/atoms/std-notification-preferences.lolo +25 -11
- package/behaviors/lolo/infra/atoms/std-notify-on-event.lolo +0 -5
- package/behaviors/lolo/infra/atoms/std-permission-matrix.lolo +28 -11
- package/behaviors/lolo/infra/atoms/std-rate-limiter.lolo +84 -22
- package/behaviors/lolo/infra/atoms/std-status-lifecycle.lolo +1 -6
- package/behaviors/lolo/ml/atoms/std-graph-builder.lolo +3 -1
- package/behaviors/lolo/ml/atoms/std-ml-classify.lolo +0 -4
- package/behaviors/lolo/ml/atoms/std-ml-similarity.lolo +0 -4
- package/behaviors/lolo/ui/avl/atoms/ui-avl-state-machine.lolo +12 -0
- package/behaviors/lolo/ui/core/atoms/std-app-layout.lolo +55 -9
- package/behaviors/lolo/ui/core/atoms/std-app-search.lolo +6 -2
- package/behaviors/lolo/ui/core/atoms/std-billable-hour.lolo +19 -14
- package/behaviors/lolo/ui/core/atoms/std-board.lolo +77 -27
- package/behaviors/lolo/ui/core/atoms/std-browse.lolo +76 -33
- package/behaviors/lolo/ui/core/atoms/std-calendar.lolo +7 -3
- package/behaviors/lolo/ui/core/atoms/std-esign-flow.lolo +25 -13
- package/behaviors/lolo/ui/core/atoms/std-esign-request.lolo +5 -0
- package/behaviors/lolo/ui/core/atoms/std-event-log.lolo +32 -5
- package/behaviors/lolo/ui/core/atoms/std-export.lolo +0 -10
- package/behaviors/lolo/ui/core/atoms/std-file-store.lolo +15 -4
- package/behaviors/lolo/ui/core/atoms/std-form-advanced.lolo +1 -6
- package/behaviors/lolo/ui/core/atoms/std-gantt-schedule.lolo +8 -1
- package/behaviors/lolo/ui/core/atoms/std-geosearch.lolo +1 -0
- package/behaviors/lolo/ui/core/atoms/std-graphs.lolo +20 -4
- package/behaviors/lolo/ui/core/atoms/std-image-upload-multi.lolo +2 -2
- package/behaviors/lolo/ui/core/atoms/std-import.lolo +0 -5
- package/behaviors/lolo/ui/core/atoms/std-list.lolo +53 -32
- package/behaviors/lolo/ui/core/atoms/std-modal-editor.lolo +2 -2
- package/behaviors/lolo/ui/core/atoms/std-multi-party-flow.lolo +24 -0
- package/behaviors/lolo/ui/core/atoms/std-rating-review.lolo +12 -13
- package/behaviors/lolo/ui/core/atoms/std-record-detail.lolo +29 -13
- package/behaviors/lolo/ui/core/atoms/std-recurrence.lolo +14 -1
- package/behaviors/lolo/ui/core/atoms/std-role-gate.lolo +39 -0
- package/behaviors/lolo/ui/core/atoms/std-saved-search.lolo +84 -16
- package/behaviors/lolo/ui/core/atoms/std-selection.lolo +22 -10
- package/behaviors/lolo/ui/core/atoms/std-stats.lolo +5 -5
- package/behaviors/lolo/ui/core/atoms/std-tag-taxonomy.lolo +3 -0
- package/behaviors/lolo/ui/core/atoms/std-thread.lolo +41 -73
- package/behaviors/lolo/ui/core/atoms/std-version-history.lolo +27 -12
- package/behaviors/lolo/ui/core/atoms/std-vote.lolo +0 -4
- package/behaviors/lolo/ui/core/atoms/std-wizard.lolo +3 -3
- package/behaviors/lolo/ui/core/atoms/ui-presence.lolo +21 -0
- package/behaviors/lolo/ui/core/atoms/ui-time-slot-cell.lolo +36 -0
- package/behaviors/lolo/ui/core/atoms/ui-typography.lolo +5 -0
- package/behaviors/lolo/ui/core/molecules/ui-alert.lolo +5 -0
- package/behaviors/lolo/ui/core/molecules/ui-animated-counter.lolo +1 -1
- package/behaviors/lolo/ui/core/molecules/ui-breadcrumb.lolo +6 -1
- package/behaviors/lolo/ui/core/molecules/ui-chart.lolo +11 -1
- package/behaviors/lolo/ui/core/molecules/ui-code-block.lolo +13 -8
- package/behaviors/lolo/ui/core/molecules/ui-command-palette.lolo +11 -6
- package/behaviors/lolo/ui/core/molecules/ui-commit-row.lolo +2 -2
- package/behaviors/lolo/ui/core/molecules/ui-confirm-dialog.lolo +8 -0
- package/behaviors/lolo/ui/core/molecules/ui-data-grid.lolo +60 -5
- package/behaviors/lolo/ui/core/molecules/ui-data-list.lolo +47 -3
- package/behaviors/lolo/ui/core/molecules/ui-date-range-picker.lolo +3 -3
- package/behaviors/lolo/ui/core/molecules/ui-document-details.lolo +31 -9
- package/behaviors/lolo/ui/core/molecules/ui-document-panel.lolo +8 -3
- package/behaviors/lolo/ui/core/molecules/ui-document-viewer.lolo +6 -1
- package/behaviors/lolo/ui/core/molecules/ui-drawer.lolo +13 -0
- package/behaviors/lolo/ui/core/molecules/ui-emoji-picker.lolo +1 -1
- package/behaviors/lolo/ui/core/molecules/ui-feature-card.lolo +1 -1
- package/behaviors/lolo/ui/core/molecules/ui-floating-action-button.lolo +6 -1
- package/behaviors/lolo/ui/core/molecules/ui-floating-toolbar.lolo +6 -1
- package/behaviors/lolo/ui/core/molecules/ui-form-actions.lolo +6 -1
- package/behaviors/lolo/ui/core/molecules/ui-gantt.lolo +9 -1
- package/behaviors/lolo/ui/core/molecules/ui-graph-canvas.lolo +6 -1
- package/behaviors/lolo/ui/core/molecules/ui-import-preview-tree.lolo +3 -2
- package/behaviors/lolo/ui/core/molecules/ui-likert-scale.lolo +1 -1
- package/behaviors/lolo/ui/core/molecules/ui-menu.lolo +7 -1
- package/behaviors/lolo/ui/core/molecules/ui-meter.lolo +6 -1
- package/behaviors/lolo/ui/core/molecules/ui-modal.lolo +5 -0
- package/behaviors/lolo/ui/core/molecules/ui-page-header.lolo +11 -1
- package/behaviors/lolo/ui/core/molecules/ui-page-transition.lolo +1 -1
- package/behaviors/lolo/ui/core/molecules/ui-swipeable-row.lolo +44 -15
- package/behaviors/lolo/ui/core/molecules/ui-table-view.lolo +57 -5
- package/behaviors/lolo/ui/core/molecules/ui-tabs.lolo +8 -2
- package/behaviors/lolo/ui/core/organisms/ui-detail-panel.lolo +87 -16
- package/behaviors/lolo/ui/core/organisms/ui-entity-cards.lolo +37 -10
- package/behaviors/lolo/ui/core/organisms/ui-entity-list.lolo +46 -8
- package/behaviors/lolo/ui/core/organisms/ui-entity-table.lolo +36 -10
- package/behaviors/lolo/ui/core/organisms/ui-form-section.lolo +57 -10
- package/behaviors/lolo/ui/core/organisms/ui-form.lolo +57 -10
- package/behaviors/lolo/ui/core/organisms/ui-media-gallery.lolo +22 -3
- package/behaviors/lolo/ui/core/organisms/ui-stat-card.lolo +6 -0
- package/behaviors/lolo/ui/core/organisms/ui-state-machine-view.lolo +12 -0
- package/behaviors/lolo/ui/core/organisms/ui-timeline.lolo +38 -5
- package/behaviors/lolo/ui/core/templates/ui-auth-layout.lolo +1 -1
- package/behaviors/lolo/ui/core/templates/ui-counter-template.lolo +3 -45
- package/behaviors/lolo/ui/core/templates/ui-dashboard-layout.lolo +7 -2
- package/behaviors/lolo/ui/core/templates/ui-generic-app-template.lolo +2 -37
- package/behaviors/lolo/ui/game/.hand-authored.json +2 -2
- package/behaviors/lolo/ui/game/atoms/ui-choice-button.lolo +1 -1
- package/behaviors/lolo/ui/game/atoms/ui-dialogue-bubble.lolo +2 -2
- package/behaviors/lolo/ui/game/atoms/ui-game-menu.lolo +9 -3
- package/behaviors/lolo/ui/game/atoms/ui-score-display.lolo +1 -1
- package/behaviors/lolo/ui/game/organisms/std-arcade-board-3d.lolo +2 -2
- package/behaviors/lolo/ui/game/organisms/std-crew-board-2d.lolo +0 -4
- package/behaviors/lolo/ui/game/organisms/std-platformer-puzzle.lolo +2 -66
- package/behaviors/lolo/ui/game/organisms/std-tactics-board-2d.lolo +0 -4
- package/behaviors/lolo/ui/game/organisms/std-worldmap-board-2d.lolo +0 -4
- package/behaviors/lolo/ui/learning/atoms/std-learn-stepper.lolo +6 -6
- package/behaviors/lolo-behavior-contracts.json +1 -1
- package/behaviors/registry/factory-signatures.json +1 -1
- package/behaviors/registry/infra/atoms/std-approval-gate.orb +194 -67
- package/behaviors/registry/infra/atoms/std-audit-capture.orb +0 -8
- package/behaviors/registry/infra/atoms/std-cache-aside.orb +0 -84
- package/behaviors/registry/infra/atoms/std-circuit-breaker.orb +1 -44
- package/behaviors/registry/infra/atoms/std-data-erasure.orb +124 -55
- package/behaviors/registry/infra/atoms/std-data-import.orb +12 -11
- package/behaviors/registry/infra/atoms/std-game-clock.orb +31 -0
- package/behaviors/registry/infra/atoms/std-knowledge-loop.orb +0 -57
- package/behaviors/registry/infra/atoms/std-lifecycle.orb +43 -0
- package/behaviors/registry/infra/atoms/std-migration-job.orb +26 -1
- package/behaviors/registry/infra/atoms/std-mod-queue.orb +379 -103
- package/behaviors/registry/infra/atoms/std-notification-preferences.orb +135 -12
- package/behaviors/registry/infra/atoms/std-notify-on-event.orb +0 -11
- package/behaviors/registry/infra/atoms/std-permission-matrix.orb +137 -12
- package/behaviors/registry/infra/atoms/std-rate-limiter.orb +287 -72
- package/behaviors/registry/infra/atoms/std-status-lifecycle.orb +5 -8
- package/behaviors/registry/ml/atoms/std-graph-builder.orb +11 -0
- package/behaviors/registry/ml/atoms/std-ml-classify.orb +0 -7
- package/behaviors/registry/ml/atoms/std-ml-similarity.orb +0 -7
- package/behaviors/registry/ui/avl/atoms/ui-avl-state-machine.orb +82 -0
- package/behaviors/registry/ui/core/atoms/std-app-layout.orb +417 -9
- package/behaviors/registry/ui/core/atoms/std-app-search.orb +53 -1
- package/behaviors/registry/ui/core/atoms/std-billable-hour.orb +209 -19
- package/behaviors/registry/ui/core/atoms/std-board.orb +242 -61
- package/behaviors/registry/ui/core/atoms/std-browse.orb +499 -49
- package/behaviors/registry/ui/core/atoms/std-calendar.orb +96 -2
- package/behaviors/registry/ui/core/atoms/std-esign-flow.orb +122 -15
- package/behaviors/registry/ui/core/atoms/std-esign-request.orb +11 -0
- package/behaviors/registry/ui/core/atoms/std-event-log.orb +42 -6
- package/behaviors/registry/ui/core/atoms/std-export.orb +0 -16
- package/behaviors/registry/ui/core/atoms/std-file-store.orb +121 -3
- package/behaviors/registry/ui/core/atoms/std-form-advanced.orb +1 -43
- package/behaviors/registry/ui/core/atoms/std-gantt-schedule.orb +25 -1
- package/behaviors/registry/ui/core/atoms/std-geosearch.orb +5 -0
- package/behaviors/registry/ui/core/atoms/std-graphs.orb +173 -66
- package/behaviors/registry/ui/core/atoms/std-image-upload-multi.orb +4 -0
- package/behaviors/registry/ui/core/atoms/std-import.orb +0 -8
- package/behaviors/registry/ui/core/atoms/std-list.orb +237 -34
- package/behaviors/registry/ui/core/atoms/std-modal-editor.orb +10 -1
- package/behaviors/registry/ui/core/atoms/std-multi-party-flow.orb +24 -0
- package/behaviors/registry/ui/core/atoms/std-rating-review.orb +37 -19
- package/behaviors/registry/ui/core/atoms/std-record-detail.orb +275 -14
- package/behaviors/registry/ui/core/atoms/std-recurrence.orb +93 -4
- package/behaviors/registry/ui/core/atoms/std-role-gate.orb +217 -0
- package/behaviors/registry/ui/core/atoms/std-saved-search.orb +473 -19
- package/behaviors/registry/ui/core/atoms/std-selection.orb +179 -10
- package/behaviors/registry/ui/core/atoms/std-stats.orb +73 -1
- package/behaviors/registry/ui/core/atoms/std-tag-taxonomy.orb +3 -0
- package/behaviors/registry/ui/core/atoms/std-thread.orb +190 -115
- package/behaviors/registry/ui/core/atoms/std-version-history.orb +138 -14
- package/behaviors/registry/ui/core/atoms/std-vote.orb +0 -9
- package/behaviors/registry/ui/core/atoms/std-wizard.orb +33 -3
- package/behaviors/registry/ui/core/atoms/ui-presence.orb +59 -0
- package/behaviors/registry/ui/core/atoms/ui-time-slot-cell.orb +132 -0
- package/behaviors/registry/ui/core/atoms/ui-typography.orb +7 -0
- package/behaviors/registry/ui/core/molecules/ui-alert.orb +7 -0
- package/behaviors/registry/ui/core/molecules/ui-animated-counter.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-breadcrumb.orb +53 -1
- package/behaviors/registry/ui/core/molecules/ui-chart.orb +68 -1
- package/behaviors/registry/ui/core/molecules/ui-code-block.orb +291 -8
- package/behaviors/registry/ui/core/molecules/ui-command-palette.orb +89 -6
- package/behaviors/registry/ui/core/molecules/ui-commit-row.orb +3 -2
- package/behaviors/registry/ui/core/molecules/ui-confirm-dialog.orb +32 -0
- package/behaviors/registry/ui/core/molecules/ui-data-grid.orb +297 -5
- package/behaviors/registry/ui/core/molecules/ui-data-list.orb +261 -3
- package/behaviors/registry/ui/core/molecules/ui-date-range-picker.orb +1 -3
- package/behaviors/registry/ui/core/molecules/ui-document-details.orb +93 -24
- package/behaviors/registry/ui/core/molecules/ui-document-panel.orb +121 -3
- package/behaviors/registry/ui/core/molecules/ui-document-viewer.orb +53 -1
- package/behaviors/registry/ui/core/molecules/ui-drawer.orb +40 -0
- package/behaviors/registry/ui/core/molecules/ui-emoji-picker.orb +0 -1
- package/behaviors/registry/ui/core/molecules/ui-feature-card.orb +0 -1
- package/behaviors/registry/ui/core/molecules/ui-floating-action-button.orb +53 -1
- package/behaviors/registry/ui/core/molecules/ui-floating-toolbar.orb +53 -1
- package/behaviors/registry/ui/core/molecules/ui-form-actions.orb +53 -1
- package/behaviors/registry/ui/core/molecules/ui-gantt.orb +28 -1
- package/behaviors/registry/ui/core/molecules/ui-graph-canvas.orb +53 -1
- package/behaviors/registry/ui/core/molecules/ui-import-preview-tree.orb +9 -2
- package/behaviors/registry/ui/core/molecules/ui-likert-scale.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-menu.orb +74 -1
- package/behaviors/registry/ui/core/molecules/ui-meter.orb +53 -1
- package/behaviors/registry/ui/core/molecules/ui-modal.orb +8 -0
- package/behaviors/registry/ui/core/molecules/ui-page-header.orb +60 -1
- package/behaviors/registry/ui/core/molecules/ui-page-transition.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-swipeable-row.orb +393 -23
- package/behaviors/registry/ui/core/molecules/ui-table-view.orb +337 -5
- package/behaviors/registry/ui/core/molecules/ui-tabs.orb +99 -2
- package/behaviors/registry/ui/core/organisms/ui-detail-panel.orb +415 -33
- package/behaviors/registry/ui/core/organisms/ui-entity-cards.orb +340 -29
- package/behaviors/registry/ui/core/organisms/ui-entity-list.orb +296 -20
- package/behaviors/registry/ui/core/organisms/ui-entity-table.orb +489 -9
- package/behaviors/registry/ui/core/organisms/ui-form-section.orb +132 -13
- package/behaviors/registry/ui/core/organisms/ui-form.orb +132 -13
- package/behaviors/registry/ui/core/organisms/ui-media-gallery.orb +141 -3
- package/behaviors/registry/ui/core/organisms/ui-stat-card.orb +58 -0
- package/behaviors/registry/ui/core/organisms/ui-state-machine-view.orb +82 -0
- package/behaviors/registry/ui/core/organisms/ui-timeline.orb +159 -8
- package/behaviors/registry/ui/core/templates/ui-auth-layout.orb +0 -1
- package/behaviors/registry/ui/core/templates/ui-counter-template.orb +1 -173
- package/behaviors/registry/ui/core/templates/ui-dashboard-layout.orb +53 -2
- package/behaviors/registry/ui/core/templates/ui-generic-app-template.orb +1 -116
- package/behaviors/registry/ui/game/atoms/ui-choice-button.orb +1 -1
- package/behaviors/registry/ui/game/atoms/ui-dialogue-bubble.orb +1 -2
- package/behaviors/registry/ui/game/atoms/ui-game-menu.orb +100 -3
- package/behaviors/registry/ui/game/atoms/ui-score-display.orb +0 -1
- package/behaviors/registry/ui/game/organisms/std-arcade-board-3d.orb +10 -0
- package/behaviors/registry/ui/game/organisms/std-crew-board-2d.orb +0 -7
- package/behaviors/registry/ui/game/organisms/std-platformer-puzzle.orb +1 -807
- package/behaviors/registry/ui/game/organisms/std-tactics-board-2d.orb +0 -7
- package/behaviors/registry/ui/game/organisms/std-worldmap-board-2d.orb +0 -7
- package/behaviors/registry/ui/learning/atoms/std-learn-stepper.orb +6 -0
- package/canonical-operators.json +18 -1
- package/dist/behaviors/exports-reader.js +8942 -3946
- package/dist/behaviors/functions/index.d.ts +419 -132
- package/dist/behaviors/functions/index.js +8931 -3946
- package/dist/behaviors/index.d.ts +1 -1
- package/dist/behaviors/index.js +8943 -3947
- package/dist/behaviors/query.js +8942 -3946
- package/dist/behaviors-embeddings.hash.json +3 -3
- package/dist/behaviors-embeddings.json +49 -41
- package/dist/behaviors-registry.json +5621 -1993
- package/dist/index.d.ts +3 -3
- package/dist/index.js +8960 -3947
- package/dist/knob-embeddings.hash.json +3 -3
- package/dist/knob-embeddings.json +774 -374
- package/dist/modules/anim.d.ts +1 -1
- package/dist/modules/array.d.ts +1 -1
- package/dist/modules/array.js +15 -0
- package/dist/modules/async.d.ts +1 -1
- package/dist/modules/behavior.d.ts +1 -1
- package/dist/modules/browser.d.ts +1 -1
- package/dist/modules/composition.d.ts +1 -1
- package/dist/modules/contract.d.ts +1 -1
- package/dist/modules/core.d.ts +1 -1
- package/dist/modules/core.js +2 -0
- package/dist/modules/data.d.ts +1 -1
- package/dist/modules/ease.d.ts +1 -1
- package/dist/modules/format.d.ts +1 -1
- package/dist/modules/geo.d.ts +1 -1
- package/dist/modules/graph.d.ts +1 -1
- package/dist/modules/grid.d.ts +1 -1
- package/dist/modules/index.d.ts +1 -1
- package/dist/modules/index.js +17 -0
- package/dist/modules/integration.d.ts +1 -1
- package/dist/modules/json.d.ts +1 -1
- package/dist/modules/llm.d.ts +1 -1
- package/dist/modules/math.d.ts +1 -1
- package/dist/modules/memory.d.ts +1 -1
- package/dist/modules/nn.d.ts +1 -1
- package/dist/modules/noise.d.ts +1 -1
- package/dist/modules/object.d.ts +1 -1
- package/dist/modules/os.d.ts +1 -1
- package/dist/modules/path.d.ts +1 -1
- package/dist/modules/prob.d.ts +1 -1
- package/dist/modules/session.d.ts +1 -1
- package/dist/modules/str.d.ts +1 -1
- package/dist/modules/tensor.d.ts +1 -1
- package/dist/modules/time.d.ts +1 -1
- package/dist/modules/trace.d.ts +1 -1
- package/dist/modules/train.d.ts +1 -1
- package/dist/modules/validate.d.ts +1 -1
- package/dist/modules/vector.d.ts +1 -1
- package/dist/modules/workspace.d.ts +1 -1
- package/dist/registry/factory-signatures.json +1 -1
- package/dist/registry.d.ts +2 -2
- package/dist/registry.js +17 -0
- package/dist/{types-Ggla7OK7.d.ts → types-DLx38UFZ.d.ts} +23 -3
- package/package.json +3 -3
|
@@ -2,6 +2,7 @@ app std-board "1.3.0"
|
|
|
2
2
|
"std-board — generic N-column board primitive. `config.columns` is an array of column definitions ({ key, label, icon, variant }); the trait `array/map`s them on `BoardItemsLoaded` into `@entity.boards` where each board carries its filtered items + a count. The render is a `data-grid` over `@entity.boards` (one card per column) whose `renderItem` lambda nests a `data-list` over `@col.items` (the cards in that stage). N is config-driven — pass any number of columns; the outer `data-grid`'s `cols` is bound to `@config.gridCols` so the grid wraps if you exceed it. Topology = loading / viewing_board / viewing_card / adding / error — distinct from the cookie-cutter `loading/browsing/viewing_single/error` CRUD shape. App-level atoms (e.g. std-pipeline) compose std-board via `uses` and add a sibling persistor + extended source entity. `config.boardLook` switches the board body between the default N-column grid ('columns') and a Trello-style wide-column kanban ('kanban-classic'). `viewing_board` listens for REFETCH_QUERY/REFETCH_FILTER/REFETCH_PAGE (the std-search/std-filter/std-pagination wiring targets, no render on refetch — @entity.boards is bound reactively) and can optionally render its own search box (config.bodySearch, default false) and filter bar (config.filters, default []); no pagination control is rendered — a board's columns are not a paged list."
|
|
3
3
|
type ObjectSpec = { id : string, label : string, value : string }
|
|
4
4
|
type ColumnSpec = { key : string!, label : string!, icon : string, variant : string }
|
|
5
|
+
type ItemAction = { label : string!, event : event, variant : primary | secondary | ghost | danger, icon : string, roles : [string] }
|
|
5
6
|
type FilterSpec = { field : string!, label : string, options : [string] }
|
|
6
7
|
orbital BoardOrbital {
|
|
7
8
|
type BoardItem = { id : string!, title : string, description : string, stage : string, notes : string, position : number }
|
|
@@ -42,6 +43,7 @@ orbital BoardOrbital {
|
|
|
42
43
|
INIT -> loading
|
|
43
44
|
(fetch BoardView {
|
|
44
45
|
emit: { failure: BoardItemsLoadFailed, success: BoardItemsLoaded }
|
|
46
|
+
include: @config.include
|
|
45
47
|
})
|
|
46
48
|
(render-ui main {
|
|
47
49
|
title: "Loading board…"
|
|
@@ -72,6 +74,7 @@ orbital BoardOrbital {
|
|
|
72
74
|
BoardItemsSaved -> loading
|
|
73
75
|
(fetch BoardView {
|
|
74
76
|
emit: { failure: BoardItemsLoadFailed, success: BoardItemsLoaded }
|
|
77
|
+
include: @config.include
|
|
75
78
|
})
|
|
76
79
|
(render-ui main {
|
|
77
80
|
title: "Refreshing board…"
|
|
@@ -82,6 +85,7 @@ orbital BoardOrbital {
|
|
|
82
85
|
BoardItemDeleted -> loading
|
|
83
86
|
(fetch BoardView {
|
|
84
87
|
emit: { failure: BoardItemsLoadFailed, success: BoardItemsLoaded }
|
|
88
|
+
include: @config.include
|
|
85
89
|
})
|
|
86
90
|
(render-ui main {
|
|
87
91
|
title: "Refreshing board…"
|
|
@@ -100,6 +104,7 @@ orbital BoardOrbital {
|
|
|
100
104
|
INIT -> loading
|
|
101
105
|
(fetch BoardView {
|
|
102
106
|
emit: { failure: BoardItemsLoadFailed, success: BoardItemsLoaded }
|
|
107
|
+
include: @config.include
|
|
103
108
|
})
|
|
104
109
|
(render-ui main {
|
|
105
110
|
title: "Loading board…"
|
|
@@ -231,6 +236,7 @@ orbital BoardOrbital {
|
|
|
231
236
|
BoardItemsSaved -> viewing_board
|
|
232
237
|
(fetch BoardView {
|
|
233
238
|
emit: { failure: BoardItemsLoadFailed, success: BoardItemsLoaded }
|
|
239
|
+
include: @config.include
|
|
234
240
|
})
|
|
235
241
|
;; REFETCH_* stay in viewing_board and issue no render-ui, matching
|
|
236
242
|
;; std-browse's REFETCH_QUERY/REFETCH_FILTER/REFETCH_PAGE: a render here
|
|
@@ -241,11 +247,13 @@ orbital BoardOrbital {
|
|
|
241
247
|
REFETCH_QUERY -> viewing_board
|
|
242
248
|
(fetch BoardView {
|
|
243
249
|
emit: { failure: BoardItemsLoadFailed, success: BoardItemsLoaded }
|
|
250
|
+
include: @config.include
|
|
244
251
|
filter: (or ["=", ?searchTerm, ""] (str/includes (object/get @entity @config.searchField) ?searchTerm))
|
|
245
252
|
})
|
|
246
253
|
REFETCH_FILTER -> viewing_board
|
|
247
254
|
(fetch BoardView {
|
|
248
255
|
emit: { failure: BoardItemsLoadFailed, success: BoardItemsLoaded }
|
|
256
|
+
include: @config.include
|
|
249
257
|
filter: (or ["=", ?value, ""] ["=", (object/get @entity ?field), ?value])
|
|
250
258
|
})
|
|
251
259
|
;; A board's columns are not a paged list — paging the underlying fetch
|
|
@@ -256,6 +264,7 @@ orbital BoardOrbital {
|
|
|
256
264
|
REFETCH_PAGE -> viewing_board
|
|
257
265
|
(fetch BoardView {
|
|
258
266
|
emit: { failure: BoardItemsLoadFailed, success: BoardItemsLoaded }
|
|
267
|
+
include: @config.include
|
|
259
268
|
limit: @config.pageSize
|
|
260
269
|
offset: ["*", ["-", ?page, 1], @config.pageSize]
|
|
261
270
|
})
|
|
@@ -280,6 +289,7 @@ orbital BoardOrbital {
|
|
|
280
289
|
CLOSE_CARD -> loading
|
|
281
290
|
(fetch BoardView {
|
|
282
291
|
emit: { failure: BoardItemsLoadFailed, success: BoardItemsLoaded }
|
|
292
|
+
include: @config.include
|
|
283
293
|
})
|
|
284
294
|
(render-ui main {
|
|
285
295
|
title: "Refreshing board…"
|
|
@@ -531,6 +541,10 @@ orbital BoardOrbital {
|
|
|
531
541
|
}
|
|
532
542
|
|
|
533
543
|
config {
|
|
544
|
+
showHeader : boolean = true
|
|
545
|
+
@label "Show the board's own title row?"
|
|
546
|
+
@description "Off when the page already carries a page header naming the same thing, so the page shows one title."
|
|
547
|
+
@tier "presentation"
|
|
534
548
|
title : string = Board
|
|
535
549
|
@label "Board title"
|
|
536
550
|
@description "Heading shown above the column board"
|
|
@@ -575,6 +589,11 @@ orbital BoardOrbital {
|
|
|
575
589
|
@label "Card title binding"
|
|
576
590
|
@description "Per-card binding for the title slot."
|
|
577
591
|
@tier "presentation"
|
|
592
|
+
include : [string] = []
|
|
593
|
+
@label "Which relation fields to hydrate?"
|
|
594
|
+
@description "Entity relation field names to hydrate on fetch (e.g. an `assignee : TeamMember` field named `assignee`), so card bindings can use dot-paths like @item.assignee.name. Empty = no hydration, the default."
|
|
595
|
+
@synonyms "relation hydration, populate relations, joined fields, hydrate relations"
|
|
596
|
+
@tier "domain"
|
|
578
597
|
cardDescriptionBinding : string = @item.description
|
|
579
598
|
@label "Card description binding"
|
|
580
599
|
@description "Per-card binding for the description slot."
|
|
@@ -624,16 +643,29 @@ orbital BoardOrbital {
|
|
|
624
643
|
@description "Records fetched per REFETCH_PAGE request. std-board renders no pagination control itself — this only feeds the fetch limit/offset when a consumer wires a composed std-pagination to REFETCH_PAGE."
|
|
625
644
|
@synonyms "fetch limit, records per page, batch size, page limit"
|
|
626
645
|
@tier "presentation"
|
|
646
|
+
cardActions : [ItemAction] = [{
|
|
647
|
+
event: DELETE_CARD
|
|
648
|
+
icon: trash-2
|
|
649
|
+
label: Delete
|
|
650
|
+
variant: danger
|
|
651
|
+
}]
|
|
652
|
+
@label "Card panel action list"
|
|
653
|
+
@description "Buttons on the open-card panel's actions row, built by the default cardActionsContent. Give an item `roles` to show it only to those viewer roles."
|
|
654
|
+
@tier "presentation"
|
|
655
|
+
viewerRole : string = ""
|
|
656
|
+
@label "Viewer's role"
|
|
657
|
+
@description "The signed-in viewer's role that each card action's `roles` is checked against. Bind it explicitly at the call site (e.g. `viewerRole: @user.role`) in an app whose identity carries a role; left empty, only actions with no `roles` show."
|
|
658
|
+
@tier "policy"
|
|
627
659
|
cardActionsContent : render-ui = {
|
|
628
660
|
align: center
|
|
629
|
-
children: [{
|
|
630
|
-
action:
|
|
661
|
+
children: (array/map (array/filter @config.cardActions (fn action (or (= (array/len (object/get @action roles [])) 0) (array/includes (object/get @action roles []) @config.viewerRole)))) (fn a {
|
|
662
|
+
action: @a.event
|
|
631
663
|
actionPayload: { id: @entity.currentId }
|
|
632
|
-
icon:
|
|
633
|
-
label:
|
|
664
|
+
icon: @a.icon
|
|
665
|
+
label: @a.label
|
|
634
666
|
type: button
|
|
635
|
-
variant:
|
|
636
|
-
}
|
|
667
|
+
variant: @a.variant
|
|
668
|
+
}))
|
|
637
669
|
direction: horizontal
|
|
638
670
|
gap: sm
|
|
639
671
|
type: stack
|
|
@@ -642,17 +674,26 @@ orbital BoardOrbital {
|
|
|
642
674
|
@description "Actions row of the open-card panel. Default is the Delete button only. Override to add consumer-wired actions — e.g. an Edit button with action: EDIT_CARD and actionPayload: { id: @entity.currentId, row: @entity.currentRow }, listened to by the organism's edit modal. Never leave a button here without a listener."
|
|
643
675
|
@tier "presentation"
|
|
644
676
|
bodyContent : render-ui = {
|
|
645
|
-
children: [{
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
677
|
+
children: [(if @config.showHeader {
|
|
678
|
+
children: [{
|
|
679
|
+
align: center
|
|
680
|
+
children: [{ name: kanban-square, size: lg, type: icon }, {
|
|
681
|
+
content: @config.title
|
|
682
|
+
type: typography
|
|
683
|
+
variant: h3
|
|
684
|
+
}]
|
|
685
|
+
direction: horizontal
|
|
686
|
+
gap: sm
|
|
687
|
+
type: stack
|
|
688
|
+
}, { type: divider }]
|
|
689
|
+
direction: vertical
|
|
690
|
+
gap: md
|
|
691
|
+
type: stack
|
|
692
|
+
} {
|
|
693
|
+
children: []
|
|
694
|
+
gap: none
|
|
654
695
|
type: stack
|
|
655
|
-
},
|
|
696
|
+
}), (if @config.bodySearch {
|
|
656
697
|
children: [{
|
|
657
698
|
className: "w-full max-w-md"
|
|
658
699
|
clearable: true
|
|
@@ -771,18 +812,27 @@ orbital BoardOrbital {
|
|
|
771
812
|
@description "Render-ui SExpr rendered after the board loads for boardLook='columns' — the canonical column data-grid with nested per-column data-lists. boardLook='kanban-classic' renders kanbanClassicBodyContent instead; both share this trait's state machine, emits, and listens."
|
|
772
813
|
@tier "internal"
|
|
773
814
|
kanbanClassicBodyContent : render-ui = {
|
|
774
|
-
children: [{
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
|
|
779
|
-
|
|
780
|
-
|
|
781
|
-
|
|
782
|
-
|
|
783
|
-
|
|
815
|
+
children: [(if @config.showHeader {
|
|
816
|
+
children: [{
|
|
817
|
+
align: center
|
|
818
|
+
children: [{ name: kanban-square, size: xl, type: icon }, {
|
|
819
|
+
content: @config.title
|
|
820
|
+
type: typography
|
|
821
|
+
variant: h2
|
|
822
|
+
}]
|
|
823
|
+
className: px-card-md
|
|
824
|
+
direction: horizontal
|
|
825
|
+
gap: sm
|
|
826
|
+
type: stack
|
|
827
|
+
}, { type: divider }]
|
|
828
|
+
direction: vertical
|
|
829
|
+
gap: md
|
|
830
|
+
type: stack
|
|
831
|
+
} {
|
|
832
|
+
children: []
|
|
833
|
+
gap: none
|
|
784
834
|
type: stack
|
|
785
|
-
},
|
|
835
|
+
}), (if @config.bodySearch {
|
|
786
836
|
children: [{
|
|
787
837
|
className: "w-full max-w-md"
|
|
788
838
|
clearable: true
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
app std-browse "2.5.0"
|
|
2
2
|
"std-browse as a Function — single primitive: data-grid. Owns the fetch + REFETCH (query/filter/page) state machine. Consumers configure fields/imageField/itemActions/cols/gap/variant; the atom renders the grid. Each `fields[]` entry accepts `{ name, label, variant }` plus optional `referenceEntity` + `displayField` to render a foreign-key column as the joined entity's display value (data-grid resolves @list[referenceEntity] at render time when both keys are present). `browseLook` (table default / dense / feed / gallery / master-detail / triage) selects one of six render bodies; dense/feed/gallery were folded in from std-browse-dense/-feed/-gallery (Phase 5.B); master-detail (split record view driven by the guarded VIEW/CLOSE self-transitions) and triage (inbox rows) were folded in 2026-07-26. Consumers retarget by setting browseLook."
|
|
3
|
-
type
|
|
4
|
-
type
|
|
5
|
-
type
|
|
3
|
+
type BadgeColor = "default" | "primary" | "secondary" | "success" | "warning" | "danger" | "error" | "info" | "neutral" | "destructive"
|
|
4
|
+
type FieldSpec = { name : string!, label : string, variant : h3 | h4 | body | caption | badge | small | progress, icon : string, format : date | currency | number | boolean | percent, key : string, header : string, colorMap : Map string BadgeColor, labels : Map string string }
|
|
5
|
+
type ItemAction = { label : string!, event : event, navigatesTo : string, variant : primary | secondary | ghost | danger, icon : string, roles : [string], when : SExpr }
|
|
6
|
+
type ColumnSpec = { key : string!, field : string, header : string, width : string, align : left | center | right, className : string, weight : normal | medium | semibold, format : badge | date | currency | number | percent | boolean, icon : string, colorMap : Map string BadgeColor, labels : Map string string, variant : h3 | h4 }
|
|
6
7
|
type FilterSpec = { field : string!, label : string, options : [string] }
|
|
7
8
|
orbital BrowseItemOrbital {
|
|
8
9
|
type BrowseDetailAction = {
|
|
@@ -10,6 +11,8 @@ orbital BrowseItemOrbital {
|
|
|
10
11
|
event : event!
|
|
11
12
|
icon : string
|
|
12
13
|
variant : string
|
|
14
|
+
roles : [string]
|
|
15
|
+
when : SExpr
|
|
13
16
|
}
|
|
14
17
|
|
|
15
18
|
type BrowseItemLoaded = Event { data : [BrowseItem], totalCount : number } "Fired when the BrowseItem collection finishes loading; payload.data holds the (possibly paginated) slice and totalCount holds the unsliced filter total. totalCount is optional so compiled-path emitters that haven't been migrated yet still validate"
|
|
@@ -43,6 +46,7 @@ orbital BrowseItemOrbital {
|
|
|
43
46
|
config {
|
|
44
47
|
fields: @config.fields
|
|
45
48
|
itemActions: @config.itemActions
|
|
49
|
+
viewerRole: @config.viewerRole
|
|
46
50
|
itemClickEvent: @config.itemClickEvent
|
|
47
51
|
maxInlineActions: @config.maxInlineActions
|
|
48
52
|
variant: compact
|
|
@@ -283,14 +287,6 @@ orbital BrowseItemOrbital {
|
|
|
283
287
|
@label "Badge field binding"
|
|
284
288
|
@description "Binding path for the status/badge slot."
|
|
285
289
|
@tier "internal"
|
|
286
|
-
imageLabelBinding : string = @item.thumbnailLabel
|
|
287
|
-
@label "Image label binding"
|
|
288
|
-
@description "Binding path for the image-area label slot."
|
|
289
|
-
@tier "internal"
|
|
290
|
-
priceBinding : string = @item.price
|
|
291
|
-
@label "Price field binding"
|
|
292
|
-
@description "Binding path for the price/amount overlay slot."
|
|
293
|
-
@tier "internal"
|
|
294
290
|
metaBinding : string = @item.createdAt
|
|
295
291
|
@label "Meta field binding"
|
|
296
292
|
@description "Binding path for the secondary meta slot (timestamp / category). Hosts binding a count or other non-date value should label it in the binding itself (e.g. (str/concat \"Vehicles: \" @item.vehicleCount)) and set metaFormat: none."
|
|
@@ -303,14 +299,6 @@ orbital BrowseItemOrbital {
|
|
|
303
299
|
@label "Category field binding"
|
|
304
300
|
@description "Binding path for the category/tag slot."
|
|
305
301
|
@tier "internal"
|
|
306
|
-
priorityBinding : string = @item.priority
|
|
307
|
-
@label "Priority field binding"
|
|
308
|
-
@description "Binding path for the priority slot."
|
|
309
|
-
@tier "internal"
|
|
310
|
-
assigneeBinding : string = @item.assignee
|
|
311
|
-
@label "Assignee field binding"
|
|
312
|
-
@description "Binding path for the assignee/owner slot."
|
|
313
|
-
@tier "internal"
|
|
314
302
|
itemActions : [ItemAction] = []
|
|
315
303
|
@label "What actions can users take on each row?"
|
|
316
304
|
@description "Buttons rendered on each row (e.g. Edit, Delete, View)."
|
|
@@ -361,6 +349,10 @@ orbital BrowseItemOrbital {
|
|
|
361
349
|
@description "Name the field on this entity that holds the viewer's id (e.g. memberId, patientId, assignee). When set, the list loads ONLY rows whose that field equals @user.id — the 'my bookings' / 'my appointments' shape. Left blank the list loads every row, which is the default. Declared, never inferred: guessing the column from its name would silently scope the wrong one."
|
|
362
350
|
@synonyms "owner field, my records, only mine, only my own, scope to user, per-user list, mine only, owned by me"
|
|
363
351
|
@tier "policy"
|
|
352
|
+
viewerRole : string = ""
|
|
353
|
+
@label "Viewer's role"
|
|
354
|
+
@description "The signed-in viewer's role that each row action's `roles` is checked against. Bind it explicitly at the call site (e.g. `viewerRole: @user.role`) in an app whose identity carries a role; left empty, only actions with no `roles` show."
|
|
355
|
+
@tier "policy"
|
|
364
356
|
initialFilterField : string = ""
|
|
365
357
|
@label "Which field does the first load filter on?"
|
|
366
358
|
@description "Name the field the INITIAL load filters on, paired with initialFilterValue. This is the detail half of a list-detail pair: a thread that must wait for a conversation to be picked sets the field to its parent key and leaves the value blank, so the first load matches nothing and the empty state shows instead of every record in the table. REFETCH_FILTER then supplies the real selection. Left blank the first load is unfiltered, which is the default."
|
|
@@ -396,19 +388,51 @@ orbital BrowseItemOrbital {
|
|
|
396
388
|
@description "Visual treatment for the embedded filter bar, mirroring std-filter's own enum. Only applies when `filters` is non-empty."
|
|
397
389
|
@synonyms "filter bar style, facet style, chips, pills"
|
|
398
390
|
@tier "presentation"
|
|
399
|
-
|
|
400
|
-
@label "
|
|
401
|
-
@description "
|
|
402
|
-
@
|
|
391
|
+
emptyTitle : string = ""
|
|
392
|
+
@label "Empty-state title"
|
|
393
|
+
@description "Specific title shown when there are no rows (\"No orders yet\"). Left blank, a generic line shows."
|
|
394
|
+
@synonyms "empty title, no data title, empty heading"
|
|
395
|
+
@tier "presentation"
|
|
396
|
+
emptyDescription : string = ""
|
|
397
|
+
@label "Empty-state description"
|
|
398
|
+
@description "What will appear here once rows exist."
|
|
399
|
+
@synonyms "empty text, no data message, empty hint"
|
|
400
|
+
@tier "presentation"
|
|
401
|
+
emptyIcon : icon = inbox
|
|
402
|
+
@label "Empty-state icon"
|
|
403
|
+
@description "Domain icon shown when there are no rows."
|
|
404
|
+
@synonyms "empty icon, no data icon"
|
|
405
|
+
@tier "presentation"
|
|
403
406
|
browseLook : "table" | "dense" | "feed" | "gallery" | "master-detail" | "triage" = table
|
|
404
407
|
@label "Browse look"
|
|
405
408
|
@description "Layer 2 visual treatment for the whole browse surface. table = the default data-grid (bodyContent); dense = spreadsheet-style table with toolbar search (denseBodyContent); feed = chronological card stream (feedBodyContent); gallery = image-first responsive card grid (galleryBodyContent); master-detail = record-work split view — dense list left, clicked record's detail right (masterDetailBodyContent); triage = inbox-register compact rows for queue work (triageBodyContent). Selecting a non-table look swaps which body tree renders after rows load; any body may still be overridden directly at the call site for a one-off layout."
|
|
406
409
|
@tier "presentation"
|
|
407
|
-
detailFields : [
|
|
410
|
+
detailFields : [FieldSpec] = [{
|
|
411
|
+
label: Name
|
|
412
|
+
name: name
|
|
413
|
+
variant: h4
|
|
414
|
+
}, {
|
|
415
|
+
label: Description
|
|
416
|
+
name: description
|
|
417
|
+
variant: body
|
|
418
|
+
}, {
|
|
419
|
+
label: Status
|
|
420
|
+
name: status
|
|
421
|
+
variant: badge
|
|
422
|
+
}, {
|
|
423
|
+
format: date
|
|
424
|
+
label: Created
|
|
425
|
+
name: createdAt
|
|
426
|
+
}]
|
|
408
427
|
@label "Which fields appear in the master-detail record pane?"
|
|
409
|
-
@description "
|
|
428
|
+
@description "Fields shown in the detail panel when browseLook = master-detail; the field declared variant h3/h4 is the pane title. Consumers overriding columns/fields should override this list to match their entity."
|
|
410
429
|
@synonyms "detail columns, record fields, detail pane fields"
|
|
411
430
|
@tier "presentation"
|
|
431
|
+
detailCloseEvent : event = CLOSE
|
|
432
|
+
@label "Which pane action closes the record?"
|
|
433
|
+
@description "The detailActions entry whose event matches renders as the pane's close (×) button."
|
|
434
|
+
@synonyms "close event, dismiss event, pane close"
|
|
435
|
+
@tier "presentation"
|
|
412
436
|
detailActions : [BrowseDetailAction] = [{ event: CLOSE, label: Close }]
|
|
413
437
|
@label "Master-detail record pane actions"
|
|
414
438
|
@description "Action buttons on the master-detail record pane (detail-panel `actions` descriptors: label/event/icon/variant). Consumers add their own record actions (Edit/Delete/…) alongside or instead of Close."
|
|
@@ -451,9 +475,13 @@ orbital BrowseItemOrbital {
|
|
|
451
475
|
fields: @config.fields
|
|
452
476
|
gap: @config.gap
|
|
453
477
|
imageField: @config.imageField
|
|
454
|
-
|
|
478
|
+
itemClickEvent: @config.itemClickEvent
|
|
479
|
+
itemActions: (array/filter @config.itemActions (fn item (or (= (array/len (object/get @item roles [])) 0) (array/includes (object/get @item roles []) @config.viewerRole))))
|
|
455
480
|
maxInlineActions: @config.maxInlineActions
|
|
456
481
|
pageSize: @config.displayPageSize
|
|
482
|
+
emptyDescription: @config.emptyDescription
|
|
483
|
+
emptyIcon: @config.emptyIcon
|
|
484
|
+
emptyTitle: @config.emptyTitle
|
|
457
485
|
type: data-grid
|
|
458
486
|
}]
|
|
459
487
|
direction: vertical
|
|
@@ -498,14 +526,16 @@ orbital BrowseItemOrbital {
|
|
|
498
526
|
}), {
|
|
499
527
|
children: [{
|
|
500
528
|
columns: @config.columns
|
|
501
|
-
emptyMessage: "No records"
|
|
502
529
|
entity: ?data
|
|
503
|
-
itemActions: @config.itemActions
|
|
530
|
+
itemActions: (array/filter @config.itemActions (fn item (or (= (array/len (object/get @item roles [])) 0) (array/includes (object/get @item roles []) @config.viewerRole))))
|
|
504
531
|
itemClickEvent: @config.itemClickEvent
|
|
505
532
|
look: dense
|
|
506
533
|
maxInlineActions: @config.maxInlineActions
|
|
507
534
|
pageSize: @config.displayPageSize
|
|
508
535
|
selectable: @config.selectable
|
|
536
|
+
emptyDescription: @config.emptyDescription
|
|
537
|
+
emptyIcon: @config.emptyIcon
|
|
538
|
+
emptyTitle: @config.emptyTitle
|
|
509
539
|
type: table-view
|
|
510
540
|
}]
|
|
511
541
|
className: overflow-x-auto
|
|
@@ -559,7 +589,8 @@ orbital BrowseItemOrbital {
|
|
|
559
589
|
entity: ?data
|
|
560
590
|
fields: []
|
|
561
591
|
gap: md
|
|
562
|
-
|
|
592
|
+
itemClickEvent: @config.itemClickEvent
|
|
593
|
+
itemActions: (array/filter @config.itemActions (fn item (or (= (array/len (object/get @item roles [])) 0) (array/includes (object/get @item roles []) @config.viewerRole))))
|
|
563
594
|
renderItem: (fn item {
|
|
564
595
|
children: [{
|
|
565
596
|
align: start
|
|
@@ -627,6 +658,9 @@ orbital BrowseItemOrbital {
|
|
|
627
658
|
padding: none
|
|
628
659
|
type: card
|
|
629
660
|
})
|
|
661
|
+
emptyDescription: @config.emptyDescription
|
|
662
|
+
emptyIcon: @config.emptyIcon
|
|
663
|
+
emptyTitle: @config.emptyTitle
|
|
630
664
|
type: data-list
|
|
631
665
|
variant: card
|
|
632
666
|
}]
|
|
@@ -678,9 +712,13 @@ orbital BrowseItemOrbital {
|
|
|
678
712
|
fields: @config.fields
|
|
679
713
|
gap: lg
|
|
680
714
|
imageField: @config.imageField
|
|
681
|
-
|
|
715
|
+
itemClickEvent: @config.itemClickEvent
|
|
716
|
+
itemActions: (array/filter @config.itemActions (fn item (or (= (array/len (object/get @item roles [])) 0) (array/includes (object/get @item roles []) @config.viewerRole))))
|
|
682
717
|
maxInlineActions: @config.maxInlineActions
|
|
683
718
|
minCardWidth: 260
|
|
719
|
+
emptyDescription: @config.emptyDescription
|
|
720
|
+
emptyIcon: @config.emptyIcon
|
|
721
|
+
emptyTitle: @config.emptyTitle
|
|
684
722
|
type: data-grid
|
|
685
723
|
}]
|
|
686
724
|
className: w-full
|
|
@@ -728,8 +766,12 @@ orbital BrowseItemOrbital {
|
|
|
728
766
|
children: [{
|
|
729
767
|
entity: ?data
|
|
730
768
|
fields: @config.fields
|
|
731
|
-
|
|
769
|
+
itemClickEvent: @config.itemClickEvent
|
|
770
|
+
itemActions: (array/filter @config.itemActions (fn item (or (= (array/len (object/get @item roles [])) 0) (array/includes (object/get @item roles []) @config.viewerRole))))
|
|
732
771
|
maxInlineActions: @config.maxInlineActions
|
|
772
|
+
emptyDescription: @config.emptyDescription
|
|
773
|
+
emptyIcon: @config.emptyIcon
|
|
774
|
+
emptyTitle: @config.emptyTitle
|
|
733
775
|
type: data-list
|
|
734
776
|
variant: compact
|
|
735
777
|
}]
|
|
@@ -844,8 +886,9 @@ orbital BrowseItemOrbital {
|
|
|
844
886
|
type: stack
|
|
845
887
|
}), {
|
|
846
888
|
detail: {
|
|
847
|
-
actions: @config.detailActions
|
|
848
|
-
|
|
889
|
+
actions: (array/filter @config.detailActions (fn action (or (= (array/len (object/get @action roles [])) 0) (array/includes (object/get @action roles []) @config.viewerRole))))
|
|
890
|
+
fields: @config.detailFields
|
|
891
|
+
closeEvent: @config.detailCloseEvent
|
|
849
892
|
initialData: ?row
|
|
850
893
|
showActions: true
|
|
851
894
|
type: detail-panel
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
app std-calendar "1.4.0"
|
|
2
2
|
"std-calendar as a Function — owns the fetch + SELECT_DAY state machine; default bodyContent renders the month-grid + upcoming-events tree. `config.calendarLook` switches the body between the default month-grid ('month'), a day-grouped agenda list ('agenda-list'), and a 7-column week timeline ('week-timeline') while inheriting the same trait, state machine, emits, and listens."
|
|
3
|
-
type ItemAction = { label : string!, event : event, navigatesTo : string, variant : primary | secondary | ghost | danger, icon : string }
|
|
3
|
+
type ItemAction = { label : string!, event : event, navigatesTo : string, variant : primary | secondary | ghost | danger, icon : string, roles : [string], when : SExpr }
|
|
4
4
|
type FilterSpec = { field : string!, label : string, options : [string] }
|
|
5
5
|
type FieldSpec = { name : string!, label : string, variant : h3 | h4 | body | caption | badge | small | progress, icon : string, format : date | currency | number | boolean | percent }
|
|
6
6
|
orbital CalendarEventOrbital {
|
|
@@ -279,6 +279,10 @@ orbital CalendarEventOrbital {
|
|
|
279
279
|
@description "Per-item action buttons on agenda-list rows — data-list itemActions descriptors (label/event/icon/variant). Consumers override to wire their own row actions (View/Edit/Delete) so agenda hosts never need a second table for actions."
|
|
280
280
|
@synonyms "agenda actions, row actions, event actions, list actions"
|
|
281
281
|
@tier "presentation"
|
|
282
|
+
viewerRole : string = ""
|
|
283
|
+
@label "Viewer's role"
|
|
284
|
+
@description "The signed-in viewer's role that each action's `roles` is checked against. Bind it explicitly at the call site (e.g. `viewerRole: @user.role`) in an app whose identity carries a role; left empty, only actions with no `roles` show."
|
|
285
|
+
@tier "policy"
|
|
282
286
|
agendaGroupBy : string = date
|
|
283
287
|
@label "Agenda group-by field"
|
|
284
288
|
@description "Row field the agenda list groups its day sections by. Rebound hosts point this at their own timestamp column (e.g. startTime, scheduledAt)."
|
|
@@ -378,7 +382,7 @@ orbital CalendarEventOrbital {
|
|
|
378
382
|
}, {
|
|
379
383
|
entity: ?data
|
|
380
384
|
fields: @config.fields
|
|
381
|
-
itemActions: @config.agendaItemActions
|
|
385
|
+
itemActions: (array/filter @config.agendaItemActions (fn action (or (= (array/len (object/get @action roles [])) 0) (array/includes (object/get @action roles []) @config.viewerRole))))
|
|
382
386
|
look: @config.tableLook
|
|
383
387
|
type: data-list
|
|
384
388
|
}]
|
|
@@ -446,7 +450,7 @@ orbital CalendarEventOrbital {
|
|
|
446
450
|
fields: []
|
|
447
451
|
gap: md
|
|
448
452
|
groupBy: @config.agendaGroupBy
|
|
449
|
-
itemActions: @config.agendaItemActions
|
|
453
|
+
itemActions: (array/filter @config.agendaItemActions (fn action (or (= (array/len (object/get @action roles [])) 0) (array/includes (object/get @action roles []) @config.viewerRole))))
|
|
450
454
|
renderItem: (fn item {
|
|
451
455
|
children: [{
|
|
452
456
|
align: start
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
app std-esign-flow "1.2.0"
|
|
2
2
|
"std-esign-flow — the send-for-signature flow: list signature requests, create one (pick document + recipient), resend or cancel, track status. Composes std-file-store + std-esign-request; no document-rendering or code-preview chrome. v1.2 (W5): EnvelopeDispatcher wires sessions to the real `esign` service — SEND_ENVELOPE dispatches a DocuSign envelope (the document rides the event as an UploadDropZone-shaped file payload, since StoredFile rows are metadata-only) and stamps `envelopeId`/`sentAt`/status=sent; the browse grid's per-row \"Refresh status\" pulls getEnvelopeStatus and maps completed/delivered/declined onto signed/viewed/declined."
|
|
3
|
+
type ItemAction = { label : string!, event : event, variant : string, roles : [string], when : SExpr }
|
|
3
4
|
orbital SignatureSessionOrbital {
|
|
4
5
|
uses StoredFile from "std/behaviors/std-file-store"
|
|
5
6
|
|
|
@@ -95,19 +96,7 @@ orbital SignatureSessionOrbital {
|
|
|
95
96
|
name: sentAt
|
|
96
97
|
variant: caption
|
|
97
98
|
}]
|
|
98
|
-
itemActions: [
|
|
99
|
-
event: RESEND_REQUEST
|
|
100
|
-
label: Resend
|
|
101
|
-
variant: primary
|
|
102
|
-
}, {
|
|
103
|
-
event: REQUEST_DELETE
|
|
104
|
-
label: Cancel
|
|
105
|
-
variant: danger
|
|
106
|
-
}, {
|
|
107
|
-
event: CHECK_ENVELOPE_STATUS
|
|
108
|
-
label: "Refresh status"
|
|
109
|
-
variant: secondary
|
|
110
|
-
}]
|
|
99
|
+
itemActions: (array/filter @config.itemActions (fn action (or (= (array/len (object/get @action roles [])) 0) (array/includes (object/get @action roles []) @config.viewerRole))))
|
|
111
100
|
type: data-grid
|
|
112
101
|
}]
|
|
113
102
|
direction: vertical
|
|
@@ -216,6 +205,29 @@ orbital SignatureSessionOrbital {
|
|
|
216
205
|
SignatureSessionPersistor.SESSION_RESENT -> INIT
|
|
217
206
|
SignatureSessionPersistor.SESSION_DELETED -> INIT
|
|
218
207
|
}
|
|
208
|
+
|
|
209
|
+
config {
|
|
210
|
+
itemActions : [ItemAction] = [{
|
|
211
|
+
event: RESEND_REQUEST
|
|
212
|
+
label: Resend
|
|
213
|
+
variant: primary
|
|
214
|
+
}, {
|
|
215
|
+
event: REQUEST_DELETE
|
|
216
|
+
label: Cancel
|
|
217
|
+
variant: danger
|
|
218
|
+
}, {
|
|
219
|
+
event: CHECK_ENVELOPE_STATUS
|
|
220
|
+
label: "Refresh status"
|
|
221
|
+
variant: secondary
|
|
222
|
+
}]
|
|
223
|
+
@label "Row actions"
|
|
224
|
+
@description "Actions offered on each row; give an item `roles` to show it only to those viewer roles."
|
|
225
|
+
@tier "presentation"
|
|
226
|
+
viewerRole : string = ""
|
|
227
|
+
@label "Viewer's role"
|
|
228
|
+
@description "The signed-in viewer's role that each action's `roles` is checked against. Bind it explicitly at the call site (e.g. `viewerRole: @user.role`) in an app whose identity carries a role; left empty, only actions with no `roles` show."
|
|
229
|
+
@tier "policy"
|
|
230
|
+
}
|
|
219
231
|
}
|
|
220
232
|
|
|
221
233
|
trait SignatureSessionCreate = Modal.traits.ModalRecordModal -> SignatureSession {
|
|
@@ -61,6 +61,7 @@ orbital ESignRequestOrbital {
|
|
|
61
61
|
label: Revoke
|
|
62
62
|
variant: danger
|
|
63
63
|
}]
|
|
64
|
+
viewerRole: @config.viewerRole
|
|
64
65
|
look: @config.tableLook
|
|
65
66
|
}
|
|
66
67
|
}
|
|
@@ -178,6 +179,10 @@ orbital ESignRequestOrbital {
|
|
|
178
179
|
@label "Table look"
|
|
179
180
|
@description "Layer 2 visual treatment for the data table rendered by this atom."
|
|
180
181
|
@tier "presentation"
|
|
182
|
+
viewerRole : string = ""
|
|
183
|
+
@label "Viewer's role"
|
|
184
|
+
@description "The signed-in viewer's role that each action's `roles` is checked against. Bind it explicitly at the call site (e.g. `viewerRole: @user.role`) in an app whose identity carries a role; left empty, only actions with no `roles` show."
|
|
185
|
+
@tier "policy"
|
|
181
186
|
}
|
|
182
187
|
}
|
|
183
188
|
|
|
@@ -128,6 +128,10 @@ orbital EventLogOrbital {
|
|
|
128
128
|
}, {
|
|
129
129
|
entity: @entity.entries
|
|
130
130
|
fields: (title description date status)
|
|
131
|
+
titleField: @config.titleField
|
|
132
|
+
descriptionField: @config.descriptionField
|
|
133
|
+
dateField: @config.dateField
|
|
134
|
+
statusField: @config.statusField
|
|
131
135
|
look: @config.timelineLook
|
|
132
136
|
type: timeline
|
|
133
137
|
}]
|
|
@@ -224,6 +228,10 @@ orbital EventLogOrbital {
|
|
|
224
228
|
}, {
|
|
225
229
|
entity: @entity.entries
|
|
226
230
|
fields: (title description date status)
|
|
231
|
+
titleField: @config.titleField
|
|
232
|
+
descriptionField: @config.descriptionField
|
|
233
|
+
dateField: @config.dateField
|
|
234
|
+
statusField: @config.statusField
|
|
227
235
|
look: @config.timelineLook
|
|
228
236
|
type: timeline
|
|
229
237
|
}]
|
|
@@ -339,6 +347,10 @@ orbital EventLogOrbital {
|
|
|
339
347
|
}, {
|
|
340
348
|
entity: @entity.entries
|
|
341
349
|
fields: (title description date status)
|
|
350
|
+
titleField: @config.titleField
|
|
351
|
+
descriptionField: @config.descriptionField
|
|
352
|
+
dateField: @config.dateField
|
|
353
|
+
statusField: @config.statusField
|
|
342
354
|
look: @config.timelineLook
|
|
343
355
|
type: timeline
|
|
344
356
|
}]
|
|
@@ -451,6 +463,10 @@ orbital EventLogOrbital {
|
|
|
451
463
|
}, {
|
|
452
464
|
entity: @entity.entries
|
|
453
465
|
fields: (title description date status)
|
|
466
|
+
titleField: @config.titleField
|
|
467
|
+
descriptionField: @config.descriptionField
|
|
468
|
+
dateField: @config.dateField
|
|
469
|
+
statusField: @config.statusField
|
|
454
470
|
look: @config.timelineLook
|
|
455
471
|
type: timeline
|
|
456
472
|
}]
|
|
@@ -630,6 +646,22 @@ orbital EventLogOrbital {
|
|
|
630
646
|
@label "Card look"
|
|
631
647
|
@description "Layer 2 visual treatment for cards rendered by this atom."
|
|
632
648
|
@tier "presentation"
|
|
649
|
+
titleField : string = "title"
|
|
650
|
+
@label "Title field"
|
|
651
|
+
@description "Entity field holding each event's title."
|
|
652
|
+
@tier "presentation"
|
|
653
|
+
descriptionField : string = "description"
|
|
654
|
+
@label "Description field"
|
|
655
|
+
@description "Entity field holding each event's description."
|
|
656
|
+
@tier "presentation"
|
|
657
|
+
dateField : string = "date"
|
|
658
|
+
@label "Date field"
|
|
659
|
+
@description "Entity field holding each event's date."
|
|
660
|
+
@tier "presentation"
|
|
661
|
+
statusField : string = "status"
|
|
662
|
+
@label "Status field"
|
|
663
|
+
@description "Entity field holding each event's status (complete | active | pending | error)."
|
|
664
|
+
@tier "presentation"
|
|
633
665
|
timelineLook : "vertical-compact" | "vertical-spacious" | "horizontal" | "swimlane" = vertical-spacious
|
|
634
666
|
@label "Timeline look"
|
|
635
667
|
@description "Layer 2 visual treatment for the timeline."
|
|
@@ -659,11 +691,6 @@ orbital EventLogOrbital {
|
|
|
659
691
|
@description "Records fetched from the server per REFETCH_PAGE request. The initial load and every search/kind/filter refetch stay unpaginated (load everything that matches) so the default unlimited activity feed is unchanged; only an explicit REFETCH_PAGE from a composed std-pagination control applies this limit."
|
|
660
692
|
@synonyms "fetch limit, records per page, page limit"
|
|
661
693
|
@tier "presentation"
|
|
662
|
-
displayPageSize : number = 20
|
|
663
|
-
@label "How many entries per page should a pager show?"
|
|
664
|
-
@description "Page size a consumer-composed std-pagination control should use to compute total pages (e.g. from totalCount). This atom's own timeline pattern has no built-in pager UI, so this knob is informational for the composed control, not consumed by the timeline itself."
|
|
665
|
-
@synonyms "visible rows, items per page, display limit"
|
|
666
|
-
@tier "presentation"
|
|
667
694
|
}
|
|
668
695
|
}
|
|
669
696
|
|
|
@@ -59,16 +59,6 @@ orbital ExportOrbital {
|
|
|
59
59
|
}
|
|
60
60
|
|
|
61
61
|
config {
|
|
62
|
-
tileId : string = ""
|
|
63
|
-
@label "Tile id"
|
|
64
|
-
@description "Identifier of the dashboard tile being exported"
|
|
65
|
-
@synonyms "internal identifier — host orbital wires this; users rarely set it directly"
|
|
66
|
-
@tier "internal"
|
|
67
|
-
event : string = EXPORT_REQUESTED
|
|
68
|
-
@label "Export event"
|
|
69
|
-
@description "Event emitted when the user picks a format. Each entry in formats[] carries its own literal event field (no per-item templating in .lolo) — overriding this alone does not retarget the click; also set formats[].event to match."
|
|
70
|
-
@synonyms "bus event name. internal wiring; users rarely target directly"
|
|
71
|
-
@tier "internal"
|
|
72
62
|
formats : [FormatOption] = [{
|
|
73
63
|
event: EXPORT_REQUESTED
|
|
74
64
|
format: csv
|