@cxtms/cx-schema 1.9.256 → 1.9.258

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cxtms/cx-schema",
3
- "version": "1.9.256",
3
+ "version": "1.9.258",
4
4
  "description": "Schema validation package for CXTMS YAML modules",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -316,6 +316,25 @@
316
316
  ]
317
317
  }
318
318
  },
319
+ "itemGroups": {
320
+ "type": "object",
321
+ "required": ["key"],
322
+ "properties": {
323
+ "key": {
324
+ "type": "string",
325
+ "description": "Template resolved per visible row. Consecutive rows with the same non-empty key form a visual group."
326
+ },
327
+ "headerTemplate": {
328
+ "type": "object",
329
+ "description": "Component rendered once above the grouped accordion rows. Receives group and collection variables."
330
+ },
331
+ "accent": {
332
+ "description": "Templated group-frame color: CSS color, palette path, or palette name."
333
+ }
334
+ },
335
+ "additionalProperties": false,
336
+ "description": "Visually joins adjacent accordion rows with matching keys without reordering or bucketing them."
337
+ },
319
338
  "layout": {
320
339
  "type": "string",
321
340
  "enum": ["list", "grid", "accordion"],
@@ -1 +1 @@
1
- {"$schema":"http://json-schema.org/draft-07/schema#","title":"Planner Component","type":"object","required":["component","props"],"properties":{"component":{"const":"planner"},"name":{"type":"string"},"props":{"type":"object","required":["queries","rows","columns","itemTemplate"],"properties":{"height":{},"refreshHandler":{"type":"string"},"debug":{"type":"boolean"},"options":{"type":"object","properties":{"enableVirtualization":{"type":"boolean"},"virtualizeThreshold":{"type":"number"},"estimatedRowHeight":{"type":"number"}},"additionalProperties":true},"queries":{"type":"array","minItems":1,"items":{"type":"object","required":["name","query"],"properties":{"name":{"type":"string"},"query":{"type":"object"},"itemsPath":{"type":"string"},"parentAs":{"type":"string"},"mapping":{"type":"object"}},"additionalProperties":true}},"rows":{"type":"object","required":["groupBy","headerWidth"],"properties":{"groupBy":{"type":"string"},"fromQuery":{"type":"string"},"key":{"type":"string"},"label":{},"orderBy":{"type":"array"},"unassigned":{"type":"object"},"headerWidth":{"type":"number"}},"additionalProperties":true},"columns":{"type":"object","required":["width"],"properties":{"orderBy":{"type":"array"},"appendEmpty":{"type":"boolean","description":"Keep one trailing empty slot beyond the largest group."},"label":{},"width":{"type":"number"}},"additionalProperties":true},"rowHeaderTemplate":{"$ref":"../schemas.json#/definitions/component"},"itemTemplate":{"$ref":"../schemas.json#/definitions/component"},"emptyCellTemplate":{"$ref":"../schemas.json#/definitions/component"},"summaryComponent":{"$ref":"../schemas.json#/definitions/component"},"emptyStateTemplate":{"$ref":"../schemas.json#/definitions/component"},"itemAccent":{},"dragSource":{"type":"object","required":["type"],"properties":{"type":{"type":"string"},"data":{},"canDrag":{}},"additionalProperties":false},"events":{"type":"object","additionalProperties":{"$ref":"../schemas.json#/definitions/actionsList"}}},"additionalProperties":true}},"additionalProperties":true}
1
+ {"$schema":"http://json-schema.org/draft-07/schema#","title":"Planner Component","type":"object","required":["component","props"],"properties":{"component":{"const":"planner"},"name":{"type":"string"},"props":{"type":"object","required":["queries","rows","columns","itemTemplate"],"properties":{"height":{},"refreshHandler":{"type":"string"},"debug":{"type":"boolean"},"options":{"type":"object","properties":{"enableVirtualization":{"type":"boolean"},"virtualizeThreshold":{"type":"number"},"estimatedRowHeight":{"type":"number"}},"additionalProperties":true},"queries":{"type":"array","minItems":1,"items":{"type":"object","required":["name","query"],"properties":{"name":{"type":"string"},"query":{"type":"object"},"itemsPath":{"type":"string"},"parentAs":{"type":"string"},"mapping":{"type":"object"}},"additionalProperties":true}},"rows":{"type":"object","required":["groupBy","headerWidth"],"properties":{"groupBy":{"type":"string"},"fromQuery":{"type":"string"},"key":{"type":"string"},"label":{},"orderBy":{"type":"array"},"unassigned":{"type":"object"},"headerWidth":{"type":"number"}},"additionalProperties":true},"columns":{"type":"object","required":["width"],"properties":{"orderBy":{"type":"array"},"appendEmpty":{"type":"boolean","description":"Keep one trailing empty slot beyond the largest group."},"label":{},"width":{"type":"number"}},"additionalProperties":true},"rowHeaderTemplate":{"$ref":"../schemas.json#/definitions/component"},"itemTemplate":{"$ref":"../schemas.json#/definitions/component"},"emptyCellTemplate":{"$ref":"../schemas.json#/definitions/component"},"summaryComponent":{"$ref":"../schemas.json#/definitions/component"},"emptyStateTemplate":{"$ref":"../schemas.json#/definitions/component"},"itemAccent":{},"itemGroups":{"type":"object","required":["key"],"properties":{"key":{"type":"string"},"headerTemplate":{"$ref":"../schemas.json#/definitions/component"},"accent":{},"dotsMenu":{"type":"object"}},"additionalProperties":false},"dragSource":{"type":"object","required":["type"],"properties":{"type":{"type":"string"},"data":{},"canDrag":{}},"additionalProperties":false},"events":{"type":"object","additionalProperties":{"$ref":"../schemas.json#/definitions/actionsList"}}},"additionalProperties":true}},"additionalProperties":true}
@@ -11084,6 +11084,7 @@ type orderMoveLeg {
11084
11084
  orderMoveLegStatus: orderMoveLegStatus
11085
11085
  startDate: DateTime
11086
11086
  endDate: DateTime
11087
+ getAddress(idPropertyName: String!): contactAddress
11087
11088
  trackingEvents: [trackingEvent!]
11088
11089
  customValues: MapOfObject
11089
11090
  isDeleted: Boolean!
@@ -162,6 +162,7 @@ Vertical-specific routing details belong in `customValues`.
162
162
  | `startDate` | `DateTime?` | UTC start |
163
163
  | `endDate` | `DateTime?` | UTC end |
164
164
  | `customValues` | `Dictionary` | Location, event, appointment, and metric data |
165
+ | `getAddress(idPropertyName)` | `ContactAddress?` | Resolves a contact-address ID from the named `customValues` property; tenant-scoped through the parent move |
165
166
  | `trackingEvents` | `[TrackingEvent]` | Leg-level milestones |
166
167
 
167
168
  Entity-trigger payloads load the status navigation before mapping when necessary. This
@@ -184,6 +185,7 @@ are appended and omitted existing records are not deleted.
184
185
 
185
186
  - Queries: `dispatchRouteStatus`, `dispatchRouteStatuses`, `dispatchRouteStopStatus`, `dispatchRouteStopStatuses`, `dispatchRouteTemplate`, `dispatchRouteTemplates`, `dispatchRoute`, `dispatchRoutes`.
186
187
  - Order move queries: `orderMove`, `orderMoves`, `orderMoveStatus`, `orderMoveStatuses`, `orderMoveLegStatus`, and `orderMoveLegStatuses`.
188
+ - Order-move legs expose `getAddress(idPropertyName: String!)` to resolve an integer contact-address ID from the named `customValues` property. Missing or invalid values return `null`, and cross-organization addresses are never returned.
187
189
  - Nested order resolvers: `getOrderMoves(filter, orderBy)` returns pending or statusless moves (defaulted to sequence order), while `getOrderMove(filter, orderBy)` returns the first matching pending or statusless move. Moves whose status stage is no longer `Pending` are excluded.
188
190
  - Order move mutations create, sparse-update, and soft-delete moves; create/update accepts nested `orderMoveLegs`, reconciled by ID and array order. Omitted or `isDeleted: true` legs are soft-deleted, new already-deleted legs are ignored, and only active legs consume sequence positions.
189
191
  - `createOrderMoveLeg`, `updateOrderMoveLeg`, and `deleteOrderMoveLeg` manage one leg without resending the parent move. Create requires `orderMoveId`, appends after the last active leg when `sequence` is omitted, and accepts name, status, dates, and custom values. Update takes a sparse values map; delete is soft. Each operation is organization-scoped through the parent move.
@@ -605,6 +605,7 @@ When `options.allowRemove` is enabled and the item count is above `minItems`, re
605
605
  | `groupMode` | `boolean` | `false` | Enable grouping |
606
606
  | `groupBy` | `string` | — | Field path to group by |
607
607
  | `groups` | `{key, label, icon?}[]` | — | Group definitions |
608
+ | `itemGroups` | `{key, headerTemplate?, accent?}` | — | In accordion layout, join consecutive rows whose templated key is equal and non-empty |
608
609
  | `showIndex` | `boolean` | `false` | Show item index |
609
610
  | `showDragHandle` | `boolean` | `false` | Show drag handles |
610
611
  | `showMoveButtons` | `boolean` | `false` | Show up/down move buttons for accessible reordering; requires `options.allowReorder` |
@@ -685,6 +686,8 @@ Grouped collections can render groups in multiple columns. Use a fixed `groupCol
685
686
 
686
687
  Accordion collections support `itemHeaderFields` for interactive fields that remain visible while a row is collapsed. The header fields share `item`, `index`, `collection`, and field-name prefixing with `itemTemplate`; wrap them in a `layout` for grid sizing. Use `rowVariant: flat` and `nestedVariant: rail` or `none` to reduce card chrome in nested collections.
687
688
 
689
+ `itemGroups` is separate from `groupMode`: it preserves order and frames only adjacent runs of two or more matching keys. Its header and accent templates receive `group = { key, items, size, startIndex, endIndex }` and `collection`; grouped row templates additionally receive `groupPosition` and `groupOffset`.
690
+
688
691
  For `datetime`, `time`, and `select-async` fields, `displayMode: readEdit` renders the current value as text until clicked. Date/time fields stay in edit mode while their calendar popup is open and return to text when it closes; other fields return on blur.
689
692
 
690
693
  ```yaml
@@ -729,7 +732,9 @@ Headless barcode/keyboard scanner listener. Captures rapid keystrokes and fires
729
732
  | `maxBarcodes` | `number` | — | Mobile: maximum accepted scans in continuous mode |
730
733
  | `onScan` | `action[]` | — | **Required.** Action on scan detection |
731
734
 
732
- **Renders:** Nothing (empty fragment). Web listens on `document` keypress. Mobile supports
735
+ **Renders:** Nothing (empty fragment). Web listens on `document` keydown, ignores form controls
736
+ and non-printable keys, and derives letters, unshifted digits, minus, and period from physical
737
+ key codes to avoid keyboard-layout transformations. Other printable keys use `event.key`. Mobile supports
733
738
  native HID scanners with a hidden-input fallback and shares camera-scanner deduplication rules.
734
739
 
735
740
  **Scan data:** `result: { data: string, format: 'input' }`
@@ -473,6 +473,8 @@ Set `columns.appendEmpty: true` to render one trailing empty ordinal slot beyond
473
473
 
474
474
  Set `props.dragSource` to make planner cards draggable between lanes. It uses the shared `type`, optional `data`, and optional templated `canDrag` contract; target cells receive the payload through `dragItem` and `dragType`. Native dragging is desktop-only, so keep a click-driven equivalent.
475
475
 
476
+ Use `props.itemGroups` to join consecutive cards with the same non-empty templated `key` into one framed block. Optional `headerTemplate`, `accent`, and `dotsMenu` render at group level. Group templates receive `{ key, items, size, startIndex, endIndex }`; card templates receive `group`, `groupPosition`, and `groupOffset`. A grouped drag exposes the complete group to the drop action as `dragGroup` while preserving the individual `dragItem`.
477
+
476
478
  ## timeline-grid
477
479
 
478
480
  CSS Grid-based timeline with swim lanes, drill-down, and virtual scrolling.