@burgantech/pseudo-ui 0.1.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/README.md +336 -0
- package/dist/_virtual/_plugin-vue_export-helper.js +9 -0
- package/dist/adapters/vue/DynamicRenderer.vue.d.ts +8 -0
- package/dist/adapters/vue/DynamicRenderer.vue.js +7 -0
- package/dist/adapters/vue/DynamicRenderer.vue2.js +1302 -0
- package/dist/adapters/vue/ErrorBoundary.vue.d.ts +16 -0
- package/dist/adapters/vue/ErrorBoundary.vue.js +7 -0
- package/dist/adapters/vue/ErrorBoundary.vue2.js +27 -0
- package/dist/adapters/vue/NestedComponentWrapper.vue.d.ts +15 -0
- package/dist/adapters/vue/NestedComponentWrapper.vue.js +96 -0
- package/dist/adapters/vue/NestedComponentWrapper.vue2.js +4 -0
- package/dist/adapters/vue/PseudoView.vue.d.ts +18 -0
- package/dist/adapters/vue/PseudoView.vue.js +59 -0
- package/dist/adapters/vue/PseudoView.vue2.js +4 -0
- package/dist/adapters/vue/index.d.ts +6 -0
- package/dist/adapters/vue/index.js +17 -0
- package/dist/adapters/vue/injection.d.ts +3 -0
- package/dist/adapters/vue/injection.js +14 -0
- package/dist/adapters/vue/useFormContext.d.ts +4 -0
- package/dist/adapters/vue/useFormContext.js +35 -0
- package/dist/adapters/vue/useLookups.d.ts +4 -0
- package/dist/adapters/vue/useLookups.js +38 -0
- package/dist/engine/conditionalEngine.d.ts +6 -0
- package/dist/engine/conditionalEngine.js +56 -0
- package/dist/engine/dataClient.d.ts +5 -0
- package/dist/engine/dataClient.js +39 -0
- package/dist/engine/expressionResolver.d.ts +13 -0
- package/dist/engine/expressionResolver.js +136 -0
- package/dist/engine/index.d.ts +7 -0
- package/dist/engine/schemaResolver.d.ts +14 -0
- package/dist/engine/schemaResolver.js +97 -0
- package/dist/engine/types.d.ts +155 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +23 -0
- package/dist/pseudo-ui.css +1 -0
- package/package.json +57 -0
- package/vocabularies/view-model-vocabulary.json +474 -0
- package/vocabularies/view-vocabulary.json +1104 -0
|
@@ -0,0 +1,474 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://amorphie.io/meta/view-model-vocabulary",
|
|
4
|
+
"$vocabulary": {
|
|
5
|
+
"https://json-schema.org/draft/2020-12/vocab/core": true,
|
|
6
|
+
"https://json-schema.org/draft/2020-12/vocab/applicator": true,
|
|
7
|
+
"https://json-schema.org/draft/2020-12/vocab/unevaluated": true,
|
|
8
|
+
"https://json-schema.org/draft/2020-12/vocab/validation": true,
|
|
9
|
+
"https://json-schema.org/draft/2020-12/vocab/meta-data": true,
|
|
10
|
+
"https://json-schema.org/draft/2020-12/vocab/format-annotation": true,
|
|
11
|
+
"https://json-schema.org/draft/2020-12/vocab/content": true,
|
|
12
|
+
"https://amorphie.io/meta/view-model-vocabulary": true
|
|
13
|
+
},
|
|
14
|
+
"title": "Amorphie View-Model Vocabulary",
|
|
15
|
+
"description": "JSON Schema vocabulary for SDUI data contracts - defines x-labels, x-lov, x-lookup, x-conditional, x-validation, x-binding extensions for multi-language support, dynamic data, and validation rules",
|
|
16
|
+
"type": "object",
|
|
17
|
+
"properties": {
|
|
18
|
+
"x-labels": {
|
|
19
|
+
"type": "object",
|
|
20
|
+
"description": "Multi-language labels for fields, properties, or schema elements",
|
|
21
|
+
"additionalProperties": {
|
|
22
|
+
"type": "string",
|
|
23
|
+
"minLength": 1,
|
|
24
|
+
"description": "Label text in the specified language code"
|
|
25
|
+
},
|
|
26
|
+
"patternProperties": {
|
|
27
|
+
"^[a-z]{2}(-[A-Z]{2})?$": {
|
|
28
|
+
"type": "string",
|
|
29
|
+
"minLength": 1
|
|
30
|
+
}
|
|
31
|
+
},
|
|
32
|
+
"examples": [
|
|
33
|
+
{
|
|
34
|
+
"tr": "Kredi Tutarı",
|
|
35
|
+
"en": "Loan Amount",
|
|
36
|
+
"ar": "مبلغ القرض"
|
|
37
|
+
}
|
|
38
|
+
]
|
|
39
|
+
},
|
|
40
|
+
"x-errorMessages": {
|
|
41
|
+
"type": "object",
|
|
42
|
+
"description": "Multi-language error messages for validation errors",
|
|
43
|
+
"additionalProperties": {
|
|
44
|
+
"type": "object",
|
|
45
|
+
"description": "Error messages for a specific validation error type",
|
|
46
|
+
"additionalProperties": {
|
|
47
|
+
"type": "string",
|
|
48
|
+
"minLength": 1,
|
|
49
|
+
"description": "Error message in the specified language code"
|
|
50
|
+
},
|
|
51
|
+
"patternProperties": {
|
|
52
|
+
"^[a-z]{2}(-[A-Z]{2})?$": {
|
|
53
|
+
"type": "string",
|
|
54
|
+
"minLength": 1
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
},
|
|
58
|
+
"examples": [
|
|
59
|
+
{
|
|
60
|
+
"required": {
|
|
61
|
+
"tr": "Tutar alanı zorunludur",
|
|
62
|
+
"en": "Amount field is required"
|
|
63
|
+
},
|
|
64
|
+
"minimum": {
|
|
65
|
+
"tr": "Minimum tutar 1,000 TL olmalıdır",
|
|
66
|
+
"en": "Minimum amount should be 1,000 TL"
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
]
|
|
70
|
+
},
|
|
71
|
+
"x-lov": {
|
|
72
|
+
"type": "object",
|
|
73
|
+
"description": "List of Values (LOV) integration for dynamic dropdown/select options",
|
|
74
|
+
"required": [
|
|
75
|
+
"source"
|
|
76
|
+
],
|
|
77
|
+
"properties": {
|
|
78
|
+
"source": {
|
|
79
|
+
"type": "string",
|
|
80
|
+
"description": "Opaque reference to the data endpoint. Can be a URN (e.g. urn:amorphie:func:domain:shared:get-cities), a URL, or any short code. The SDK passes this string to the delegate's requestData function without interpretation.",
|
|
81
|
+
"examples": [
|
|
82
|
+
"urn:amorphie:func:domain:shared:get-cities",
|
|
83
|
+
"urn:amorphie:func:domain:shared:get-districts",
|
|
84
|
+
"https://api.example.com/cities",
|
|
85
|
+
"get-cities"
|
|
86
|
+
]
|
|
87
|
+
},
|
|
88
|
+
"valueField": {
|
|
89
|
+
"type": "string",
|
|
90
|
+
"description": "JSONPath expression to extract the value field from the LOV response",
|
|
91
|
+
"pattern": "^\\$\\.",
|
|
92
|
+
"examples": [
|
|
93
|
+
"$.response.data.code",
|
|
94
|
+
"$.data.id"
|
|
95
|
+
]
|
|
96
|
+
},
|
|
97
|
+
"displayField": {
|
|
98
|
+
"type": "string",
|
|
99
|
+
"description": "JSONPath expression to extract the display label from the LOV response",
|
|
100
|
+
"pattern": "^\\$\\.",
|
|
101
|
+
"examples": [
|
|
102
|
+
"$.response.data.name",
|
|
103
|
+
"$.data.label"
|
|
104
|
+
]
|
|
105
|
+
},
|
|
106
|
+
"filter": {
|
|
107
|
+
"type": "array",
|
|
108
|
+
"description": "Query parameters to pass to the LOV source endpoint (always GET). Each item defines a query param name and its value. Values starting with $ are runtime expressions resolved from form data; other values are static constants. Expression-based filters trigger reactive cascade (e.g. district reloads when city changes).",
|
|
109
|
+
"items": {
|
|
110
|
+
"type": "object",
|
|
111
|
+
"required": ["param", "value"],
|
|
112
|
+
"properties": {
|
|
113
|
+
"param": {
|
|
114
|
+
"type": "string",
|
|
115
|
+
"description": "Query parameter name sent to the BFF endpoint",
|
|
116
|
+
"minLength": 1,
|
|
117
|
+
"examples": ["cityCode", "channel", "status"]
|
|
118
|
+
},
|
|
119
|
+
"value": {
|
|
120
|
+
"type": "string",
|
|
121
|
+
"description": "Parameter value. Starts with $form. for user input, $instance. for persisted data, $param. for parent-bound data (inside sub-components), otherwise treated as a static constant.",
|
|
122
|
+
"minLength": 1,
|
|
123
|
+
"examples": ["$form.city", "$form.cityCode", "$instance.selectedBranchCode", "$param.cityCode", "digital", "active"]
|
|
124
|
+
},
|
|
125
|
+
"required": {
|
|
126
|
+
"type": "boolean",
|
|
127
|
+
"default": false,
|
|
128
|
+
"description": "When true, the LOV endpoint will NOT be called until this parameter has a non-empty value. Use for mandatory cascade dependencies (e.g. don't load districts until city is selected). When false (default), the LOV loads immediately; if the param is available it is included, otherwise omitted."
|
|
129
|
+
}
|
|
130
|
+
},
|
|
131
|
+
"additionalProperties": false
|
|
132
|
+
},
|
|
133
|
+
"examples": [
|
|
134
|
+
[
|
|
135
|
+
{ "param": "cityCode", "value": "$form.city", "required": true }
|
|
136
|
+
],
|
|
137
|
+
[
|
|
138
|
+
{ "param": "channel", "value": "digital" },
|
|
139
|
+
{ "param": "status", "value": "active" }
|
|
140
|
+
],
|
|
141
|
+
[
|
|
142
|
+
{ "param": "cityCode", "value": "$form.city", "required": true },
|
|
143
|
+
{ "param": "channel", "value": "digital" }
|
|
144
|
+
]
|
|
145
|
+
]
|
|
146
|
+
}
|
|
147
|
+
},
|
|
148
|
+
"additionalProperties": false,
|
|
149
|
+
"examples": [
|
|
150
|
+
{
|
|
151
|
+
"source": "urn:amorphie:func:domain:shared:get-cities",
|
|
152
|
+
"valueField": "$.response.data.code",
|
|
153
|
+
"displayField": "$.response.data.name"
|
|
154
|
+
},
|
|
155
|
+
{
|
|
156
|
+
"source": "urn:amorphie:func:domain:shared:get-districts",
|
|
157
|
+
"valueField": "$.response.data.code",
|
|
158
|
+
"displayField": "$.response.data.name",
|
|
159
|
+
"filter": [
|
|
160
|
+
{ "param": "cityCode", "value": "$form.city" }
|
|
161
|
+
]
|
|
162
|
+
}
|
|
163
|
+
]
|
|
164
|
+
},
|
|
165
|
+
"x-lookup": {
|
|
166
|
+
"type": "object",
|
|
167
|
+
"description": "Single-record data enrichment. Fetches one record from a backend endpoint based on filter parameters. Unlike x-lov (which returns a list for dropdowns), x-lookup returns a single object for display enrichment (e.g. branch details, account info). Definition lives in the schema for discoverability; activation is controlled by the view's 'lookups' array. Results are accessible via $lookup.{propertyName}.{field} in view expressions.",
|
|
168
|
+
"required": ["source", "resultField"],
|
|
169
|
+
"properties": {
|
|
170
|
+
"source": {
|
|
171
|
+
"$ref": "#/properties/x-lov/properties/source"
|
|
172
|
+
},
|
|
173
|
+
"resultField": {
|
|
174
|
+
"type": "string",
|
|
175
|
+
"description": "JSONPath expression to extract the result object from the response",
|
|
176
|
+
"pattern": "^\\$\\.",
|
|
177
|
+
"examples": [
|
|
178
|
+
"$.response.data",
|
|
179
|
+
"$.data"
|
|
180
|
+
]
|
|
181
|
+
},
|
|
182
|
+
"filter": {
|
|
183
|
+
"$ref": "#/properties/x-lov/properties/filter"
|
|
184
|
+
}
|
|
185
|
+
},
|
|
186
|
+
"additionalProperties": false,
|
|
187
|
+
"examples": [
|
|
188
|
+
{
|
|
189
|
+
"source": "urn:amorphie:func:domain:shared:get-branch-detail",
|
|
190
|
+
"resultField": "$.response.data",
|
|
191
|
+
"filter": [
|
|
192
|
+
{ "param": "branchCode", "value": "$instance.selectedBranchCode", "required": true }
|
|
193
|
+
]
|
|
194
|
+
}
|
|
195
|
+
]
|
|
196
|
+
},
|
|
197
|
+
"x-enum": {
|
|
198
|
+
"type": "object",
|
|
199
|
+
"description": "Localized display names for enum values",
|
|
200
|
+
"additionalProperties": {
|
|
201
|
+
"type": "object",
|
|
202
|
+
"description": "Localized labels for a specific enum value",
|
|
203
|
+
"additionalProperties": {
|
|
204
|
+
"type": "string",
|
|
205
|
+
"minLength": 1,
|
|
206
|
+
"description": "Display label in the specified language code"
|
|
207
|
+
},
|
|
208
|
+
"patternProperties": {
|
|
209
|
+
"^[a-z]{2}(-[A-Z]{2})?$": {
|
|
210
|
+
"type": "string",
|
|
211
|
+
"minLength": 1
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
},
|
|
215
|
+
"examples": [
|
|
216
|
+
{
|
|
217
|
+
"individual": {
|
|
218
|
+
"tr": "Bireysel",
|
|
219
|
+
"en": "Individual"
|
|
220
|
+
},
|
|
221
|
+
"corporate": {
|
|
222
|
+
"tr": "Kurumsal",
|
|
223
|
+
"en": "Corporate"
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
]
|
|
227
|
+
},
|
|
228
|
+
"x-validation": {
|
|
229
|
+
"type": "object",
|
|
230
|
+
"description": "Custom business validation rules. NOTE: Descoped from current PoC -- not processed by client-side renderers.",
|
|
231
|
+
"required": [
|
|
232
|
+
"rule"
|
|
233
|
+
],
|
|
234
|
+
"properties": {
|
|
235
|
+
"rule": {
|
|
236
|
+
"type": "string",
|
|
237
|
+
"description": "Name of the validation rule function",
|
|
238
|
+
"minLength": 1,
|
|
239
|
+
"examples": [
|
|
240
|
+
"validateTurkishTaxId",
|
|
241
|
+
"validateIBAN",
|
|
242
|
+
"validateEmailDomain"
|
|
243
|
+
]
|
|
244
|
+
},
|
|
245
|
+
"parameters": {
|
|
246
|
+
"type": "object",
|
|
247
|
+
"description": "Parameters to pass to the validation rule function",
|
|
248
|
+
"additionalProperties": true,
|
|
249
|
+
"examples": [
|
|
250
|
+
{
|
|
251
|
+
"country": "TR"
|
|
252
|
+
}
|
|
253
|
+
]
|
|
254
|
+
},
|
|
255
|
+
"errorMessages": {
|
|
256
|
+
"type": "object",
|
|
257
|
+
"description": "Multi-language error messages for validation failures",
|
|
258
|
+
"additionalProperties": {
|
|
259
|
+
"type": "string",
|
|
260
|
+
"minLength": 1,
|
|
261
|
+
"description": "Error message in the specified language code"
|
|
262
|
+
},
|
|
263
|
+
"patternProperties": {
|
|
264
|
+
"^[a-z]{2}(-[A-Z]{2})?$": {
|
|
265
|
+
"type": "string",
|
|
266
|
+
"minLength": 1
|
|
267
|
+
}
|
|
268
|
+
},
|
|
269
|
+
"examples": [
|
|
270
|
+
{
|
|
271
|
+
"tr": "Geçerli bir vergi numarası giriniz",
|
|
272
|
+
"en": "Please enter a valid tax ID"
|
|
273
|
+
}
|
|
274
|
+
]
|
|
275
|
+
}
|
|
276
|
+
},
|
|
277
|
+
"additionalProperties": false,
|
|
278
|
+
"examples": [
|
|
279
|
+
{
|
|
280
|
+
"rule": "validateTurkishTaxId",
|
|
281
|
+
"parameters": {
|
|
282
|
+
"country": "TR"
|
|
283
|
+
},
|
|
284
|
+
"errorMessages": {
|
|
285
|
+
"tr": "Geçerli bir vergi numarası giriniz",
|
|
286
|
+
"en": "Please enter a valid tax ID"
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
]
|
|
290
|
+
},
|
|
291
|
+
"x-encryption": {
|
|
292
|
+
"type": "object",
|
|
293
|
+
"description": "Encryption configuration for sensitive data fields. Defines encryption level and optional parameters for data protection. NOTE: Descoped from current PoC -- not processed by client-side UI renderers.",
|
|
294
|
+
"required": [
|
|
295
|
+
"type"
|
|
296
|
+
],
|
|
297
|
+
"properties": {
|
|
298
|
+
"type": {
|
|
299
|
+
"type": "string",
|
|
300
|
+
"description": "Encryption level/type. 'none': No encryption - data is stored and transmitted in plain text. 'transport': Transport-level encryption - data is encrypted in logs and intermediate layers, but stored in plain text in database. 'persisted': Persistent encryption - data is encrypted at database level and remains encrypted at rest.",
|
|
301
|
+
"enum": [
|
|
302
|
+
"none",
|
|
303
|
+
"transport",
|
|
304
|
+
"persisted"
|
|
305
|
+
]
|
|
306
|
+
}
|
|
307
|
+
},
|
|
308
|
+
"additionalProperties": false,
|
|
309
|
+
"examples": [
|
|
310
|
+
{
|
|
311
|
+
"type": "none"
|
|
312
|
+
},
|
|
313
|
+
{
|
|
314
|
+
"type": "transport"
|
|
315
|
+
},
|
|
316
|
+
{
|
|
317
|
+
"type": "persisted"
|
|
318
|
+
}
|
|
319
|
+
]
|
|
320
|
+
},
|
|
321
|
+
"x-autoBind": {
|
|
322
|
+
"type": "object",
|
|
323
|
+
"description": "Automatic data population from client's DataManager. Field value is auto-populated from specified data source without user input. Storage is automatically determined by context: device=Local Persistent, user/scope=Secure Persistent, workflowInstance/workflowTransition=In-Memory, artifact=Local Persistent with TTL. NOTE: Descoped from current PoC -- not processed by client-side UI renderers.",
|
|
324
|
+
"required": [
|
|
325
|
+
"context",
|
|
326
|
+
"key"
|
|
327
|
+
],
|
|
328
|
+
"properties": {
|
|
329
|
+
"context": {
|
|
330
|
+
"type": "string",
|
|
331
|
+
"description": "DataManager context - determines both data ownership and automatic storage type. device: Secure Storage (NO encryption - bootstrap). user: Secure Storage + Encrypted. scope: Secure Storage + Encrypted. workflowInstance: In-Memory. workflowTransition: In-Memory. artifact: Local Storage (cache, TTL). secureMemory: In-Memory ONLY (never persisted, for encryption keys).",
|
|
332
|
+
"enum": [
|
|
333
|
+
"device",
|
|
334
|
+
"user",
|
|
335
|
+
"scope",
|
|
336
|
+
"workflowInstance",
|
|
337
|
+
"workflowTransition",
|
|
338
|
+
"artifact",
|
|
339
|
+
"secureMemory"
|
|
340
|
+
],
|
|
341
|
+
"examples": [
|
|
342
|
+
"device",
|
|
343
|
+
"user",
|
|
344
|
+
"scope",
|
|
345
|
+
"workflowInstance",
|
|
346
|
+
"secureMemory"
|
|
347
|
+
]
|
|
348
|
+
},
|
|
349
|
+
"key": {
|
|
350
|
+
"type": "string",
|
|
351
|
+
"description": "Data entry key in DataManager. Supports dynamic variables: $ActiveUser (logged-in user), $ActiveScope (active customer/scope for backoffice scenarios).",
|
|
352
|
+
"minLength": 1,
|
|
353
|
+
"examples": [
|
|
354
|
+
"info",
|
|
355
|
+
"auth/session",
|
|
356
|
+
"preferences",
|
|
357
|
+
"customer/$ActiveScope/profile",
|
|
358
|
+
"loan-application/317749d0-cfff-428d-8a11-20c2d2eff9e3"
|
|
359
|
+
]
|
|
360
|
+
},
|
|
361
|
+
"dataPath": {
|
|
362
|
+
"type": "string",
|
|
363
|
+
"description": "Optional path to specific property within the data entry (dot notation for nested properties)",
|
|
364
|
+
"examples": [
|
|
365
|
+
"deviceId",
|
|
366
|
+
"installationId",
|
|
367
|
+
"userId",
|
|
368
|
+
"applicant.firstName",
|
|
369
|
+
"firstName"
|
|
370
|
+
]
|
|
371
|
+
}
|
|
372
|
+
},
|
|
373
|
+
"additionalProperties": false,
|
|
374
|
+
"examples": [
|
|
375
|
+
{
|
|
376
|
+
"context": "device",
|
|
377
|
+
"key": "info",
|
|
378
|
+
"dataPath": "deviceId"
|
|
379
|
+
},
|
|
380
|
+
{
|
|
381
|
+
"context": "device",
|
|
382
|
+
"key": "info",
|
|
383
|
+
"dataPath": "installationId"
|
|
384
|
+
},
|
|
385
|
+
{
|
|
386
|
+
"context": "user",
|
|
387
|
+
"key": "auth/session",
|
|
388
|
+
"dataPath": "userId"
|
|
389
|
+
},
|
|
390
|
+
{
|
|
391
|
+
"context": "scope",
|
|
392
|
+
"key": "customer/$ActiveScope/profile",
|
|
393
|
+
"dataPath": "customerId"
|
|
394
|
+
},
|
|
395
|
+
{
|
|
396
|
+
"context": "workflowInstance",
|
|
397
|
+
"key": "loan-application/317749d0-cfff-428d-8a11-20c2d2eff9e3",
|
|
398
|
+
"dataPath": "applicant.tckn"
|
|
399
|
+
}
|
|
400
|
+
]
|
|
401
|
+
},
|
|
402
|
+
"x-conditional": {
|
|
403
|
+
"type": "object",
|
|
404
|
+
"description": "Conditional field visibility or behavior based on other field values. The condition field path is resolved against a merged view of params, instanceData and formData (formData takes precedence). Inside sub-components, parent-bound values are available through the params layer.",
|
|
405
|
+
"properties": {
|
|
406
|
+
"showIf": { "$ref": "#/$defs/conditionRule", "description": "Conditions for showing this field" },
|
|
407
|
+
"hideIf": { "$ref": "#/$defs/conditionRule", "description": "Conditions for hiding this field" },
|
|
408
|
+
"enableIf": { "$ref": "#/$defs/conditionRule", "description": "Conditions for enabling this field" },
|
|
409
|
+
"disableIf": { "$ref": "#/$defs/conditionRule", "description": "Conditions for disabling this field" }
|
|
410
|
+
},
|
|
411
|
+
"additionalProperties": false
|
|
412
|
+
},
|
|
413
|
+
"x-validation": {
|
|
414
|
+
"type": "boolean",
|
|
415
|
+
"description": "When true, the SDK calls delegate.onValidationRequest(field, value, formData) after built-in validation passes. The delegate returns an error string or null."
|
|
416
|
+
},
|
|
417
|
+
"x-binding": {
|
|
418
|
+
"type": "string",
|
|
419
|
+
"enum": ["required", "optional"],
|
|
420
|
+
"description": "Marks a property as an input expected from the parent component via bind. 'required' means the parent MUST bind this property; the renderer warns if missing. 'optional' means the parent CAN bind it but the component works without it. Absence of x-binding means the property is not an input (filled by user interaction or LOV)."
|
|
421
|
+
}
|
|
422
|
+
},
|
|
423
|
+
"additionalProperties": true,
|
|
424
|
+
"$defs": {
|
|
425
|
+
"languageCode": {
|
|
426
|
+
"type": "string",
|
|
427
|
+
"pattern": "^[a-z]{2}(-[A-Z]{2})?$",
|
|
428
|
+
"description": "ISO 639-1 language code with optional ISO 3166-1 country code",
|
|
429
|
+
"examples": ["en", "tr", "ar"]
|
|
430
|
+
},
|
|
431
|
+
"conditionRule": {
|
|
432
|
+
"type": "object",
|
|
433
|
+
"description": "A condition rule that can be a simple field comparison or a compound rule using allOf/anyOf/not. Compound rules are recursive.",
|
|
434
|
+
"properties": {
|
|
435
|
+
"field": {
|
|
436
|
+
"type": "string",
|
|
437
|
+
"description": "Path to the field to check (supports dot notation)",
|
|
438
|
+
"examples": ["customerType", "address.country"]
|
|
439
|
+
},
|
|
440
|
+
"operator": {
|
|
441
|
+
"type": "string",
|
|
442
|
+
"enum": [
|
|
443
|
+
"equals", "notEquals",
|
|
444
|
+
"in", "notIn",
|
|
445
|
+
"greaterThan", "lessThan",
|
|
446
|
+
"greaterThanOrEquals", "lessThanOrEquals",
|
|
447
|
+
"contains", "startsWith", "endsWith",
|
|
448
|
+
"isEmpty", "isNotEmpty"
|
|
449
|
+
],
|
|
450
|
+
"description": "Comparison operator (default: equals)",
|
|
451
|
+
"default": "equals"
|
|
452
|
+
},
|
|
453
|
+
"value": {
|
|
454
|
+
"description": "Value(s) to compare against"
|
|
455
|
+
},
|
|
456
|
+
"allOf": {
|
|
457
|
+
"type": "array",
|
|
458
|
+
"items": { "$ref": "#/$defs/conditionRule" },
|
|
459
|
+
"description": "All sub-rules must be true (logical AND)"
|
|
460
|
+
},
|
|
461
|
+
"anyOf": {
|
|
462
|
+
"type": "array",
|
|
463
|
+
"items": { "$ref": "#/$defs/conditionRule" },
|
|
464
|
+
"description": "At least one sub-rule must be true (logical OR)"
|
|
465
|
+
},
|
|
466
|
+
"not": {
|
|
467
|
+
"$ref": "#/$defs/conditionRule",
|
|
468
|
+
"description": "Negates the sub-rule (logical NOT)"
|
|
469
|
+
}
|
|
470
|
+
},
|
|
471
|
+
"additionalProperties": false
|
|
472
|
+
}
|
|
473
|
+
}
|
|
474
|
+
}
|