@cxtms/cx-schema 1.9.67 → 1.9.241

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.
Files changed (81) hide show
  1. package/dist/cli.js +43 -9
  2. package/dist/cli.js.map +1 -1
  3. package/package.json +1 -1
  4. package/schemas/actions/all.json +5 -1
  5. package/schemas/actions/reload.json +17 -0
  6. package/schemas/actions/setSessionStorage.json +38 -0
  7. package/schemas/actions/sound.json +39 -0
  8. package/schemas/actions/vibrate.json +48 -0
  9. package/schemas/components/avatar.json +1 -0
  10. package/schemas/components/badge.json +79 -0
  11. package/schemas/components/barcodeScanner.json +28 -0
  12. package/schemas/components/camera.json +177 -0
  13. package/schemas/components/card.json +78 -0
  14. package/schemas/components/dashboard-widget.json +39 -0
  15. package/schemas/components/dashboard.json +46 -0
  16. package/schemas/components/dataGrid.json +15 -0
  17. package/schemas/components/field-collection.json +86 -2
  18. package/schemas/components/field.json +39 -4
  19. package/schemas/components/form.json +4 -0
  20. package/schemas/components/index.json +17 -1
  21. package/schemas/components/infoLine.json +1 -0
  22. package/schemas/components/map.json +167 -0
  23. package/schemas/components/module.json +32 -0
  24. package/schemas/components/planner.json +1 -0
  25. package/schemas/components/progressBar.json +1 -0
  26. package/schemas/components/timeline.json +216 -74
  27. package/schemas/components/timelineGrid.json +5 -1
  28. package/schemas/fields/autocomplete-googleplaces.json +2 -2
  29. package/schemas/fields/datetime.json +2 -2
  30. package/schemas/fields/index.json +4 -0
  31. package/schemas/fields/number-select.json +88 -0
  32. package/schemas/fields/rangedatetime.json +10 -2
  33. package/schemas/fields/select-async.json +2 -2
  34. package/schemas/fields/toggle.json +91 -0
  35. package/schemas/schema.graphql +11016 -12171
  36. package/schemas/schemas.json +131 -4
  37. package/schemas/workflows/flow/entity.json +3 -1
  38. package/schemas/workflows/input.json +1 -1
  39. package/schemas/workflows/output.json +1 -1
  40. package/schemas/workflows/tasks/all.json +9 -0
  41. package/schemas/workflows/tasks/commodity.json +8 -0
  42. package/schemas/workflows/tasks/contact-address.json +25 -0
  43. package/schemas/workflows/tasks/dispatch-routes.json +64 -0
  44. package/schemas/workflows/tasks/edi.json +15 -0
  45. package/schemas/workflows/tasks/export.json +21 -0
  46. package/schemas/workflows/tasks/httpRequest.json +4 -0
  47. package/schemas/workflows/tasks/import.json +5 -0
  48. package/schemas/workflows/tasks/order-move.json +38 -0
  49. package/schemas/workflows/tasks/order.json +6 -0
  50. package/schemas/workflows/tasks/organization-config.json +101 -0
  51. package/schemas/workflows/tasks/tracking-event.json +11 -3
  52. package/schemas/workflows/tasks/workflow-execute.json +4 -0
  53. package/schemas/workflows/variable.json +2 -2
  54. package/schemas/workflows/workflow.json +39 -2
  55. package/skills/cxtms-developer/SKILL.md +5 -2
  56. package/skills/cxtms-developer/ref-cli-auth.md +2 -0
  57. package/skills/cxtms-developer/ref-entity-commodity.md +41 -5
  58. package/skills/cxtms-developer/ref-entity-contact.md +46 -0
  59. package/skills/cxtms-developer/ref-entity-dispatch-routing.md +195 -0
  60. package/skills/cxtms-developer/ref-entity-geography.md +26 -1
  61. package/skills/cxtms-developer/ref-entity-job.md +6 -2
  62. package/skills/cxtms-developer/ref-entity-order-sub.md +1 -1
  63. package/skills/cxtms-developer/ref-entity-order.md +36 -3
  64. package/skills/cxtms-developer/ref-entity-organization.md +4 -2
  65. package/skills/cxtms-developer/ref-entity-shared.md +79 -3
  66. package/skills/cxtms-developer/ref-graphql-query.md +246 -4
  67. package/skills/cxtms-module-builder/SKILL.md +33 -6
  68. package/skills/cxtms-module-builder/ref-components-data.md +85 -0
  69. package/skills/cxtms-module-builder/ref-components-display.md +282 -8
  70. package/skills/cxtms-module-builder/ref-components-forms.md +386 -21
  71. package/skills/cxtms-module-builder/ref-components-interactive.md +2 -0
  72. package/skills/cxtms-module-builder/ref-components-layout.md +288 -29
  73. package/skills/cxtms-module-builder/ref-components-specialized.md +168 -20
  74. package/skills/cxtms-workflow-builder/SKILL.md +45 -6
  75. package/skills/cxtms-workflow-builder/ref-entity.md +100 -4
  76. package/skills/cxtms-workflow-builder/ref-expressions-ncalc.md +35 -2
  77. package/skills/cxtms-workflow-builder/ref-expressions-template.md +15 -1
  78. package/skills/cxtms-workflow-builder/ref-flow.md +6 -1
  79. package/skills/cxtms-workflow-builder/ref-query.md +16 -0
  80. package/skills/cxtms-workflow-builder/ref-utilities.md +32 -2
  81. package/templates/workflow-public-api.yaml +1 -0
@@ -18,26 +18,32 @@
18
18
  "props": {
19
19
  "type": "object",
20
20
  "properties": {
21
+ "mode": {
22
+ "type": "string",
23
+ "enum": ["normal", "tracking"],
24
+ "default": "normal",
25
+ "description": "Timeline behavior. Tracking mode joins events to milestone definitions and hides date-range navigation."
26
+ },
21
27
  "orientation": {
22
28
  "type": "string",
23
29
  "enum": ["horizontal", "vertical"],
24
30
  "default": "horizontal",
25
- "description": "Timeline axis direction"
31
+ "description": "Timeline axis direction. Tracking mode renders vertically."
26
32
  },
27
33
  "view": {
28
34
  "type": "string",
29
35
  "enum": ["day", "week", "month", "year"],
30
- "default": "day",
31
- "description": "Zoom level controlling granularity and visible window"
36
+ "default": "week",
37
+ "description": "Zoom level controlling granularity and visible window in normal mode"
32
38
  },
33
39
  "startDate": {
34
40
  "$ref": "../schemas.json#/definitions/templateExpression",
35
- "description": "Initial lower bound for the visible date range (ISO or expression)",
41
+ "description": "Initial lower bound for the visible date range in normal mode (ISO or expression)",
36
42
  "x-example": "{{ today() }}"
37
43
  },
38
44
  "endDate": {
39
45
  "$ref": "../schemas.json#/definitions/templateExpression",
40
- "description": "Initial upper bound for the visible date range",
46
+ "description": "Initial upper bound for the visible date range in normal mode",
41
47
  "x-example": "{{ addDays today 7 }}"
42
48
  },
43
49
  "defaultDate": {
@@ -52,87 +58,186 @@
52
58
  "height": {
53
59
  "oneOf": [
54
60
  { "type": "number", "description": "Height in pixels" },
55
- { "type": "string", "description": "CSS size (e.g., '400px', '50vh')" }
61
+ { "type": "string", "description": "CSS size (e.g., '400px', '50vh', 'auto')" }
56
62
  ],
57
- "default": "400px",
63
+ "default": 400,
58
64
  "description": "Timeline container height"
65
+ },
66
+ "showTodayMarker": {
67
+ "type": "boolean",
68
+ "default": true,
69
+ "description": "Show a marker for today's date in normal mode"
70
+ },
71
+ "enableZoom": {
72
+ "type": "boolean",
73
+ "default": true,
74
+ "description": "Show day/week/month/year view switcher in normal mode"
75
+ },
76
+ "enableNavigation": {
77
+ "type": "boolean",
78
+ "default": true,
79
+ "description": "Show previous/next/today navigation in normal mode"
80
+ },
81
+ "alternateSides": {
82
+ "type": "boolean",
83
+ "default": true,
84
+ "description": "Alternate events left/right in vertical mode"
85
+ },
86
+ "showTwoColumns": {
87
+ "type": "boolean",
88
+ "default": true,
89
+ "description": "Show date/status content opposite the main event content in vertical mode"
90
+ },
91
+ "dateFormat": {
92
+ "type": "string",
93
+ "default": "MMM DD",
94
+ "description": "Moment.js date format"
95
+ },
96
+ "timeFormat": {
97
+ "type": "string",
98
+ "default": "h:mm A",
99
+ "description": "Moment.js time format"
100
+ },
101
+ "extraEvents": {
102
+ "type": "string",
103
+ "enum": ["show", "hide"],
104
+ "default": "hide",
105
+ "description": "Whether tracking mode shows events whose mapped key does not match a milestone"
59
106
  }
60
- }
107
+ },
108
+ "additionalProperties": true
61
109
  },
62
110
  "eventTemplate": {
63
111
  "$ref": "../schemas.json#/definitions/component",
64
- "description": "Component used to render each event; receives 'item' bound to mapped fields"
112
+ "description": "Component used to render each event in normal mode; receives 'item' bound to mapped fields"
113
+ },
114
+ "activeTemplate": {
115
+ "$ref": "../schemas.json#/definitions/component",
116
+ "description": "Mobile-only component used for normal-mode events whose mapped status is 'active'; receives 'item' bound to the event"
65
117
  },
66
118
  "eventSources": {
67
119
  "type": "array",
68
- "description": "Data providers executed for the current visible range",
69
- "items": {
70
- "type": "object",
71
- "properties": {
72
- "query": {
73
- "type": "object",
74
- "description": "GraphQL source executed when the visible range changes",
75
- "properties": {
76
- "command": {
77
- "type": "string",
78
- "description": "GraphQL document string"
79
- },
80
- "variables": {
81
- "type": "object",
82
- "description": "Variables for the GraphQL command (template expressions supported)",
83
- "additionalProperties": true
84
- }
85
- },
86
- "required": ["command"]
87
- },
88
- "path": {
89
- "type": "string",
90
- "description": "Dot path to the array of items in the result (e.g., 'orders.items')"
91
- },
92
- "mapping": {
93
- "type": "object",
94
- "description": "Maps source fields to timeline event fields",
95
- "properties": {
96
- "date": { "type": "string", "description": "ISO date/time for the event" },
97
- "title": { "type": "string", "description": "Display title" },
98
- "id": {
99
- "oneOf": [{ "type": "string" }, { "type": "number" }],
100
- "description": "Stable identifier"
101
- },
102
- "endDate": { "type": "string", "description": "ISO end date/time for ranged spans" },
103
- "description": { "type": "string" },
104
- "backgroundColor": { "type": "string" },
105
- "textColor": { "type": "string" },
106
- "icon": { "type": "string" },
107
- "iconColor": { "type": "string" },
108
- "iconSize": { "oneOf": [{ "type": "string" }, { "type": "number" }] }
109
- },
110
- "required": ["date", "title"],
111
- "additionalProperties": true,
112
- "x-example": {
113
- "id": "{{ item.orderId }}",
114
- "date": "{{ item.orderDate }}",
115
- "endDate": "{{ item.orderEnd }}",
116
- "title": "{{ item.orderNumber }}",
117
- "description": "Order created on {{ item.orderDate }}",
118
- "icon": "package"
119
- }
120
- }
121
- },
122
- "required": ["query", "path", "mapping"]
123
- }
120
+ "description": "Data providers executed for the current visible range or tracking milestone source",
121
+ "items": { "$ref": "#/definitions/eventSource" }
122
+ },
123
+ "milestones": {
124
+ "type": "array",
125
+ "description": "Tracking mode milestone definitions matched against mapped event key values",
126
+ "items": { "$ref": "#/definitions/milestone" }
124
127
  },
125
128
  "isHidden": {
126
129
  "$ref": "../schemas.json#/definitions/templateExpression",
127
130
  "description": "Boolean expression for conditional rendering"
128
131
  }
129
- }
132
+ },
133
+ "additionalProperties": true
130
134
  },
131
135
  "children": {
132
136
  "$ref": "../schemas.json#/definitions/componentChildren"
133
137
  }
134
138
  },
135
139
  "required": ["component", "props"],
140
+ "definitions": {
141
+ "eventSource": {
142
+ "type": "object",
143
+ "properties": {
144
+ "query": {
145
+ "type": "object",
146
+ "description": "GraphQL source executed for timeline events",
147
+ "properties": {
148
+ "command": {
149
+ "type": "string",
150
+ "description": "GraphQL document string"
151
+ },
152
+ "variables": {
153
+ "type": "object",
154
+ "description": "Variables for the GraphQL command (template expressions supported)",
155
+ "additionalProperties": true
156
+ },
157
+ "path": {
158
+ "type": "string",
159
+ "description": "Dot path to the array of items in the GraphQL result (e.g., 'data.events.items' or 'order.trackingEvents')"
160
+ },
161
+ "mapping": {
162
+ "$ref": "#/definitions/eventMapping"
163
+ }
164
+ },
165
+ "required": ["command"],
166
+ "additionalProperties": true
167
+ },
168
+ "events": {
169
+ "description": "Static event array or template expression fallback/primary source"
170
+ },
171
+ "color": { "type": "string", "description": "Legacy source color" },
172
+ "backgroundColor": { "type": "string", "description": "Default background color for events from this source" },
173
+ "textColor": { "type": "string", "description": "Default text color for events from this source" },
174
+ "borderColor": { "type": "string", "description": "Default border color for outlined dots" }
175
+ },
176
+ "anyOf": [
177
+ { "required": ["query"] },
178
+ { "required": ["events"] }
179
+ ],
180
+ "additionalProperties": true
181
+ },
182
+ "eventMapping": {
183
+ "type": "object",
184
+ "description": "Maps source fields to timeline event fields. Tracking mode uses key for milestone matching.",
185
+ "properties": {
186
+ "key": { "type": "string", "description": "Tracking milestone match key" },
187
+ "id": {
188
+ "oneOf": [{ "type": "string" }, { "type": "number" }],
189
+ "description": "Stable identifier"
190
+ },
191
+ "date": { "type": "string", "description": "ISO date/time for the event. Required for completed/extra events." },
192
+ "endDate": { "type": "string", "description": "ISO end date/time for ranged spans" },
193
+ "title": { "type": "string", "description": "Display title" },
194
+ "description": { "type": "string" },
195
+ "includeInTracking": { "description": "Source flag available to mapping/templates. The timeline component does not filter by this field." },
196
+ "isInactive": { "description": "Source flag available to mapping/templates. The timeline component does not filter by this field." },
197
+ "status": { "type": "string", "enum": ["active", "completed", "pending", "extra"] },
198
+ "backgroundColor": { "type": "string" },
199
+ "textColor": { "type": "string" },
200
+ "borderColor": { "type": "string" },
201
+ "icon": { "type": "string" },
202
+ "iconColor": { "type": "string" },
203
+ "iconSize": { "oneOf": [{ "type": "string" }, { "type": "number" }] }
204
+ },
205
+ "additionalProperties": true,
206
+ "x-example": {
207
+ "key": "{{ item.eventDefinition.eventName }}",
208
+ "id": "{{ item.trackingEventId }}",
209
+ "date": "{{ item.eventDate }}",
210
+ "title": "{{ item.eventDefinition.eventName }}",
211
+ "description": "{{ item.description }}"
212
+ }
213
+ },
214
+ "milestone": {
215
+ "type": "object",
216
+ "properties": {
217
+ "key": {
218
+ "type": "string",
219
+ "description": "Match key compared to mapped event key"
220
+ },
221
+ "label": {
222
+ "description": "Localized display label. Falls back to key.",
223
+ "oneOf": [
224
+ { "type": "string" },
225
+ { "type": "object", "additionalProperties": { "type": "string" } }
226
+ ]
227
+ },
228
+ "description": {
229
+ "type": "string",
230
+ "description": "Description shown for pending milestones or fallback for completed milestones"
231
+ },
232
+ "icon": {
233
+ "type": "string",
234
+ "description": "Icon name rendered inside the milestone dot"
235
+ }
236
+ },
237
+ "required": ["key"],
238
+ "additionalProperties": true
239
+ }
240
+ },
136
241
  "x-examples": [
137
242
  {
138
243
  "component": "timeline",
@@ -151,20 +256,57 @@
151
256
  "eventSources": [
152
257
  {
153
258
  "query": {
154
- "command": "query GetOrders($organizationId: Int!, $filter: String) { orders(organizationId: $organizationId, take: 500, filter: $filter) { items { orderId orderDate orderNumber } } }",
259
+ "command": "query GetOrders($organizationId: Int!, $filter: String) { orders(organizationId: $organizationId, take: 500, filter: $filter) { items { orderId orderDate orderNumber includeInTracking isInactive } } }",
155
260
  "variables": {
156
261
  "organizationId": "{{ number organizationId }}",
157
262
  "filter": "orderDate:[{{startDate}} TO {{endDate}}]"
263
+ },
264
+ "path": "data.orders.items",
265
+ "mapping": {
266
+ "id": "{{ item.orderId }}",
267
+ "date": "{{ item.orderDate }}",
268
+ "title": "{{ item.orderNumber }}",
269
+ "description": "Order created on {{ item.orderDate }}"
270
+ }
271
+ }
272
+ }
273
+ ]
274
+ }
275
+ },
276
+ {
277
+ "component": "timeline",
278
+ "name": "orderTracking",
279
+ "props": {
280
+ "mode": "tracking",
281
+ "orientation": "vertical",
282
+ "options": {
283
+ "showTwoColumns": true,
284
+ "alternateSides": false,
285
+ "extraEvents": "hide"
286
+ },
287
+ "eventSources": [
288
+ {
289
+ "query": {
290
+ "command": "query($organizationId: Int!, $orderId: Int!) { order(organizationId: $organizationId, orderId: $orderId) { trackingEvents { trackingEventId eventDate description includeInTracking isInactive eventDefinition { eventName } } } }",
291
+ "variables": {
292
+ "organizationId": "{{ number organizationId }}",
293
+ "orderId": "{{ number orderId }}"
294
+ },
295
+ "path": "order.trackingEvents",
296
+ "mapping": {
297
+ "key": "{{ item.eventDefinition.eventName }}",
298
+ "id": "{{ item.trackingEventId }}",
299
+ "date": "{{ item.eventDate }}",
300
+ "title": "{{ item.eventDefinition.eventName }}",
301
+ "description": "{{ item.description }}"
158
302
  }
159
- },
160
- "path": "orders.items",
161
- "mapping": {
162
- "id": "{{ item.orderId }}",
163
- "date": "{{ item.orderDate }}",
164
- "title": "{{ item.orderNumber }}",
165
- "description": "Order created on {{ item.orderDate }}"
166
303
  }
167
304
  }
305
+ ],
306
+ "milestones": [
307
+ { "key": "Shipment Created", "label": { "en-US": "Shipment Created" } },
308
+ { "key": "In Transit", "label": { "en-US": "In Transit" }, "icon": "truck" },
309
+ { "key": "Delivered", "label": { "en-US": "Delivered" }, "icon": "check-circle" }
168
310
  ]
169
311
  }
170
312
  }
@@ -252,6 +252,10 @@
252
252
  "onItemResize": { "$ref": "../schemas.json#/definitions/actionsList" },
253
253
  "onItemReassign": { "$ref": "../schemas.json#/definitions/actionsList" },
254
254
  "onRangeChange": { "$ref": "../schemas.json#/definitions/actionsList" },
255
+ "onCellClick": {
256
+ "$ref": "../schemas.json#/definitions/actionsList",
257
+ "description": "Cell click handler. Context includes column, row, date, view; column exposes UTC startDate/endDate and local wall-clock startDateLocal/endDateLocal."
258
+ },
255
259
  "onEmptySlotClick": { "$ref": "../schemas.json#/definitions/actionsList" },
256
260
  "onLoading": { "$ref": "../schemas.json#/definitions/actionsList" }
257
261
  }
@@ -263,7 +267,7 @@
263
267
  "required": ["component", "props", "rowSources", "itemSources"],
264
268
  "x-examples": [
265
269
  {
266
- "component": "timelineGrid",
270
+ "component": "timeline-grid",
267
271
  "name": "vehicleScheduler",
268
272
  "props": {
269
273
  "view": "day",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "http://json-schema.org/draft-07/schema#",
3
3
  "title": "Autocomplete Google Places Field Type",
4
- "description": "Schema for autocomplete-googleplaces field type with Google Places API integration",
4
+ "description": "Schema for autocomplete-googleplaces field type with Google Places API integration. The Google Maps SDK API key is loaded from organization config (apps.google.googleMapsApiKey), not from module YAML.",
5
5
  "type": "object",
6
6
  "properties": {
7
7
  "type": {
@@ -127,4 +127,4 @@
127
127
  }
128
128
  },
129
129
  "required": ["type", "options"]
130
- }
130
+ }
@@ -37,12 +37,12 @@
37
37
  "useTimezone": { "type": "boolean", "description": "Enable timezone-aware date handling", "x-example": false },
38
38
  "storeAsUTC": {
39
39
  "type": "boolean",
40
- "description": "When useTimezone is true, store date/time in UTC",
40
+ "description": "When useTimezone is true, store date/time in UTC. With a fixed timezone, selected wall-clock values are interpreted in that timezone before UTC conversion.",
41
41
  "x-example": true
42
42
  },
43
43
  "timezone": {
44
44
  "type": "string",
45
- "description": "Fixed timezone for display (e.g., America/New_York)",
45
+ "description": "Fixed IANA timezone for display and wall-clock interpretation when storing as UTC (e.g., America/New_York)",
46
46
  "x-example": "America/New_York"
47
47
  },
48
48
  "format": { "type": "string", "description": "Custom storage format; if omitted, inferred by options" }
@@ -7,6 +7,7 @@
7
7
  "oneOf": [
8
8
  { "$ref": "./text.json" },
9
9
  { "$ref": "./number.json" },
10
+ { "$ref": "./number-select.json" },
10
11
  { "$ref": "./email.json" },
11
12
  { "$ref": "./password.json" },
12
13
  { "$ref": "./tel.json" },
@@ -20,6 +21,7 @@
20
21
  { "$ref": "./autocomplete-googleplaces.json" },
21
22
  { "$ref": "./checkbox.json" },
22
23
  { "$ref": "./radio.json" },
24
+ { "$ref": "./toggle.json" },
23
25
  { "$ref": "./textarea.json" },
24
26
  { "$ref": "./attachment.json" }
25
27
  ]
@@ -28,6 +30,7 @@
28
30
  "fieldTypes": {
29
31
  "text": { "description": "Basic text input field", "schema": "./text.json" },
30
32
  "number": { "description": "Numeric input field with validation", "schema": "./number.json" },
33
+ "number-select": { "description": "Numeric input field with increment/decrement controls", "schema": "./number-select.json" },
31
34
  "email": { "description": "Email input field with validation", "schema": "./email.json" },
32
35
  "password": { "description": "Password input field with security features", "schema": "./password.json" },
33
36
  "tel": { "description": "Telephone number input field", "schema": "./tel.json" },
@@ -47,6 +50,7 @@
47
50
  },
48
51
  "checkbox": { "description": "Checkbox input field", "schema": "./checkbox.json" },
49
52
  "radio": { "description": "Radio button group field", "schema": "./radio.json" },
53
+ "toggle": { "description": "Segmented toggle button group field", "schema": "./toggle.json" },
50
54
  "textarea": { "description": "Multi-line text input field", "schema": "./textarea.json" },
51
55
  "attachment": { "description": "Attachment picker/uploader field (images or files)", "schema": "./attachment.json" }
52
56
  }
@@ -0,0 +1,88 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "title": "Number Select Field Type",
4
+ "description": "Schema for number input field with increment/decrement controls",
5
+ "type": "object",
6
+ "properties": {
7
+ "type": {
8
+ "type": "string",
9
+ "const": "number-select"
10
+ },
11
+ "label": {
12
+ "oneOf": [
13
+ { "type": "string" },
14
+ { "$ref": "../schemas.json#/definitions/localized" }
15
+ ],
16
+ "description": "Field label",
17
+ "x-example": {
18
+ "en-US": "Pieces"
19
+ }
20
+ },
21
+ "placeholder": {
22
+ "oneOf": [
23
+ { "type": "string" },
24
+ { "$ref": "../schemas.json#/definitions/localized" }
25
+ ],
26
+ "description": "Field placeholder text",
27
+ "x-example": "Enter pieces"
28
+ },
29
+ "required": {
30
+ "type": "boolean",
31
+ "description": "Whether field is required",
32
+ "x-example": true
33
+ },
34
+ "disabled": {
35
+ "type": "boolean",
36
+ "description": "Whether field is disabled",
37
+ "x-example": false
38
+ },
39
+ "min": {
40
+ "type": "number",
41
+ "description": "Minimum allowed value. Defaults to 0.",
42
+ "x-example": 0
43
+ },
44
+ "max": {
45
+ "type": "number",
46
+ "description": "Maximum allowed value. Defaults to Number.MAX_VALUE in the UI.",
47
+ "x-example": 9999
48
+ },
49
+ "step": {
50
+ "type": "number",
51
+ "description": "Amount added or subtracted by each arrow click/long-press tick. Defaults to 1.",
52
+ "x-example": 1
53
+ },
54
+ "options": {
55
+ "type": "object",
56
+ "description": "Numeric formatting options passed to react-number-format",
57
+ "properties": {
58
+ "fixedDecimalScale": {
59
+ "type": "boolean",
60
+ "description": "Always show decimal places up to decimalScale"
61
+ },
62
+ "allowNegative": {
63
+ "type": "boolean",
64
+ "description": "Allow negative values. Defaults to true when min is below 0."
65
+ },
66
+ "decimalScale": {
67
+ "type": "number",
68
+ "description": "Maximum number of decimal places. Defaults to 2.",
69
+ "x-example": 2
70
+ }
71
+ },
72
+ "additionalProperties": true
73
+ },
74
+ "onChange": {
75
+ "$ref": "../schemas.json#/definitions/actionsList",
76
+ "description": "Actions to execute when field value changes"
77
+ },
78
+ "onBlur": {
79
+ "$ref": "../schemas.json#/definitions/actionsList",
80
+ "description": "Actions to execute when field loses focus"
81
+ },
82
+ "onFocus": {
83
+ "$ref": "../schemas.json#/definitions/actionsList",
84
+ "description": "Actions to execute when field gains focus"
85
+ }
86
+ },
87
+ "required": ["type"]
88
+ }
@@ -23,8 +23,16 @@
23
23
  "timeIntervals": { "type": "number", "description": "Time intervals in minutes", "x-example": 60 },
24
24
  "timeCaption": { "type": "string", "description": "Time caption label", "x-example": "Time" },
25
25
  "useTimezone": { "type": "boolean", "description": "Enable timezone-aware handling", "x-example": false },
26
- "storeAsUTC": { "type": "boolean", "description": "When useTimezone is true, store in UTC", "x-example": true },
27
- "timezone": { "type": "string", "description": "Fixed timezone for display", "x-example": "America/New_York" },
26
+ "storeAsUTC": {
27
+ "type": "boolean",
28
+ "description": "When useTimezone is true, store in UTC. With a fixed timezone, selected wall-clock values are interpreted in that timezone before UTC conversion.",
29
+ "x-example": true
30
+ },
31
+ "timezone": {
32
+ "type": "string",
33
+ "description": "Fixed IANA timezone for display and wall-clock interpretation when storing as UTC",
34
+ "x-example": "America/New_York"
35
+ },
28
36
  "format": { "type": "string", "description": "Custom storage format" },
29
37
  "isClearable": { "type": "boolean", "description": "Show clear button", "x-example": true }
30
38
  },
@@ -84,7 +84,7 @@
84
84
  },
85
85
  "valueQuery": {
86
86
  "type": "object",
87
- "description": "Query configuration for fetching selected value details",
87
+ "description": "Optional query configuration for fetching selected value details. Omit for inline-create-only fields; with allowCreate enabled, stored primitive values are rendered directly, including as chips in multiple mode.",
88
88
  "properties": {
89
89
  "name": {
90
90
  "type": "string",
@@ -141,7 +141,7 @@
141
141
  },
142
142
  "allowCreate": {
143
143
  "type": "boolean",
144
- "description": "Allow creating new items inline",
144
+ "description": "Allow creating new items inline. When valueQuery is omitted, existing primitive values are mapped directly to options and rendered without a lookup.",
145
145
  "x-example": true
146
146
  },
147
147
  "transformValue": {
@@ -0,0 +1,91 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "title": "Toggle Field Type",
4
+ "description": "Schema for toggle button group field type",
5
+ "type": "object",
6
+ "properties": {
7
+ "type": {
8
+ "type": "string",
9
+ "const": "toggle"
10
+ },
11
+ "label": {
12
+ "oneOf": [
13
+ { "type": "string" },
14
+ { "$ref": "../schemas.json#/definitions/localized" }
15
+ ],
16
+ "description": "Field label"
17
+ },
18
+ "required": {
19
+ "type": "boolean",
20
+ "description": "Whether field is required"
21
+ },
22
+ "disabled": {
23
+ "oneOf": [{ "type": "boolean" }, { "type": "string" }],
24
+ "description": "Whether field is disabled"
25
+ },
26
+ "allowMultiple": {
27
+ "type": "boolean",
28
+ "default": false,
29
+ "description": "Enable multi-select mode. When true the value is an array."
30
+ },
31
+ "exclusive": {
32
+ "type": "boolean",
33
+ "description": "Legacy single-select flag. Prefer allowMultiple; allowMultiple takes precedence."
34
+ },
35
+ "enforceValue": {
36
+ "type": "boolean",
37
+ "default": false,
38
+ "description": "In single-select mode, prevent deselecting the current value."
39
+ },
40
+ "defaultValue": {
41
+ "oneOf": [{ "type": "string" }, { "type": "number" }, { "type": "boolean" }],
42
+ "description": "Initial selected value."
43
+ },
44
+ "items": {
45
+ "type": "array",
46
+ "description": "Toggle button options",
47
+ "items": {
48
+ "type": "object",
49
+ "properties": {
50
+ "label": {
51
+ "oneOf": [
52
+ { "type": "string" },
53
+ { "$ref": "../schemas.json#/definitions/localized" }
54
+ ]
55
+ },
56
+ "value": {
57
+ "oneOf": [{ "type": "string" }, { "type": "number" }, { "type": "boolean" }]
58
+ },
59
+ "icon": { "type": "string" },
60
+ "disabled": { "type": "boolean" }
61
+ },
62
+ "required": ["label", "value"],
63
+ "additionalProperties": true
64
+ }
65
+ },
66
+ "options": {
67
+ "type": "object",
68
+ "description": "Props passed to the underlying MUI ToggleButtonGroup",
69
+ "properties": {
70
+ "size": { "type": "string", "enum": ["small", "medium", "large"] },
71
+ "color": { "type": "string", "enum": ["standard", "primary", "secondary", "error", "info", "success", "warning"] },
72
+ "orientation": { "type": "string", "enum": ["horizontal", "vertical"] }
73
+ },
74
+ "additionalProperties": true
75
+ },
76
+ "onChange": {
77
+ "$ref": "../schemas.json#/definitions/actionsList",
78
+ "description": "Actions to execute when field value changes"
79
+ },
80
+ "onBlur": {
81
+ "$ref": "../schemas.json#/definitions/actionsList",
82
+ "description": "Actions to execute when field loses focus"
83
+ },
84
+ "onFocus": {
85
+ "$ref": "../schemas.json#/definitions/actionsList",
86
+ "description": "Actions to execute when field gains focus"
87
+ }
88
+ },
89
+ "required": ["type", "items"],
90
+ "additionalProperties": true
91
+ }