@uipath/apollo-wind 2.60.1 → 2.61.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.
Files changed (152) hide show
  1. package/dist/components/forms/field-actions.cjs +181 -0
  2. package/dist/components/forms/field-actions.d.ts +131 -0
  3. package/dist/components/forms/field-actions.js +129 -0
  4. package/dist/components/forms/field-control.cjs +415 -0
  5. package/dist/components/forms/field-control.d.ts +52 -0
  6. package/dist/components/forms/field-control.js +372 -0
  7. package/dist/components/forms/field-renderer.cjs +77 -420
  8. package/dist/components/forms/field-renderer.d.ts +2 -3
  9. package/dist/components/forms/field-renderer.js +78 -421
  10. package/dist/components/forms/form-designer.cjs +7 -1
  11. package/dist/components/forms/form-designer.js +7 -1
  12. package/dist/components/forms/form-schema.d.ts +121 -2
  13. package/dist/components/forms/form-strings.cjs +67 -0
  14. package/dist/components/forms/form-strings.d.ts +30 -0
  15. package/dist/components/forms/form-strings.js +30 -0
  16. package/dist/components/forms/index.cjs +53 -9
  17. package/dist/components/forms/index.d.ts +6 -1
  18. package/dist/components/forms/index.js +6 -1
  19. package/dist/components/forms/literal-value-context.cjs +37 -0
  20. package/dist/components/forms/literal-value-context.d.ts +5 -0
  21. package/dist/components/forms/literal-value-context.js +3 -0
  22. package/dist/components/forms/metadata-form.cjs +100 -21
  23. package/dist/components/forms/metadata-form.d.ts +5 -0
  24. package/dist/components/forms/metadata-form.js +101 -22
  25. package/dist/components/forms/mode-aware-field.cjs +589 -0
  26. package/dist/components/forms/mode-aware-field.d.ts +15 -0
  27. package/dist/components/forms/mode-aware-field.js +555 -0
  28. package/dist/components/forms/opaque-value.cjs +44 -0
  29. package/dist/components/forms/opaque-value.d.ts +7 -0
  30. package/dist/components/forms/opaque-value.js +7 -0
  31. package/dist/components/forms/rules-engine.cjs +13 -0
  32. package/dist/components/forms/rules-engine.js +13 -0
  33. package/dist/components/forms/schema-serializer.cjs +8 -0
  34. package/dist/components/forms/schema-serializer.js +8 -0
  35. package/dist/components/forms/string-list-field.cjs +36 -18
  36. package/dist/components/forms/string-list-field.d.ts +6 -0
  37. package/dist/components/forms/string-list-field.js +35 -20
  38. package/dist/components/forms/validation-converter.cjs +32 -2
  39. package/dist/components/forms/validation-converter.d.ts +17 -1
  40. package/dist/components/forms/validation-converter.js +30 -3
  41. package/dist/components/forms/value-modes.cjs +253 -0
  42. package/dist/components/forms/value-modes.d.ts +236 -0
  43. package/dist/components/forms/value-modes.js +180 -0
  44. package/dist/components/ui/avatar.d.ts +1 -1
  45. package/dist/components/ui/badge.d.ts +1 -1
  46. package/dist/components/ui/boolean-radio-group.cjs +114 -0
  47. package/dist/components/ui/boolean-radio-group.d.ts +24 -0
  48. package/dist/components/ui/boolean-radio-group.js +77 -0
  49. package/dist/components/ui/button.d.ts +2 -2
  50. package/dist/components/ui/command.d.ts +7 -7
  51. package/dist/components/ui/field-addons/field-menu.cjs +1 -0
  52. package/dist/components/ui/field-addons/field-menu.d.ts +2 -0
  53. package/dist/components/ui/field-addons/field-menu.js +1 -0
  54. package/dist/components/ui/field-addons/index.cjs +4 -0
  55. package/dist/components/ui/field-addons/index.d.ts +1 -0
  56. package/dist/components/ui/field-addons/index.js +2 -1
  57. package/dist/components/ui/field-addons/value-mode-strings.cjs +7 -1
  58. package/dist/components/ui/field-addons/value-mode-strings.d.ts +9 -0
  59. package/dist/components/ui/field-addons/value-mode-strings.js +7 -1
  60. package/dist/components/ui/field-addons/value-mode-switch-dialog.cjs +73 -0
  61. package/dist/components/ui/field-addons/value-mode-switch-dialog.d.ts +16 -0
  62. package/dist/components/ui/field-addons/value-mode-switch-dialog.js +39 -0
  63. package/dist/components/ui/form-field.cjs +2 -1
  64. package/dist/components/ui/form-field.d.ts +2 -0
  65. package/dist/components/ui/form-field.js +2 -1
  66. package/dist/components/ui/index.cjs +230 -186
  67. package/dist/components/ui/index.d.ts +4 -0
  68. package/dist/components/ui/index.js +4 -0
  69. package/dist/components/ui/input-group.cjs +6 -3
  70. package/dist/components/ui/input-group.d.ts +6 -5
  71. package/dist/components/ui/input-group.js +6 -3
  72. package/dist/components/ui/json-tree-view/DecorationChip.cjs +81 -0
  73. package/dist/components/ui/json-tree-view/DecorationChip.d.ts +4 -0
  74. package/dist/components/ui/json-tree-view/DecorationChip.js +47 -0
  75. package/dist/components/ui/json-tree-view/EditorChrome.cjs +88 -0
  76. package/dist/components/ui/json-tree-view/EditorChrome.d.ts +21 -0
  77. package/dist/components/ui/json-tree-view/EditorChrome.js +51 -0
  78. package/dist/components/ui/json-tree-view/JsonContainerEditor.cjs +95 -0
  79. package/dist/components/ui/json-tree-view/JsonContainerEditor.d.ts +18 -0
  80. package/dist/components/ui/json-tree-view/JsonContainerEditor.js +61 -0
  81. package/dist/components/ui/json-tree-view/JsonLeafValueEditor.cjs +86 -0
  82. package/dist/components/ui/json-tree-view/JsonLeafValueEditor.d.ts +12 -0
  83. package/dist/components/ui/json-tree-view/JsonLeafValueEditor.js +52 -0
  84. package/dist/components/ui/json-tree-view/JsonMultilineLeafEditor.cjs +74 -0
  85. package/dist/components/ui/json-tree-view/JsonMultilineLeafEditor.d.ts +13 -0
  86. package/dist/components/ui/json-tree-view/JsonMultilineLeafEditor.js +40 -0
  87. package/dist/components/ui/json-tree-view/JsonTree.cjs +253 -0
  88. package/dist/components/ui/json-tree-view/JsonTree.d.ts +81 -0
  89. package/dist/components/ui/json-tree-view/JsonTree.js +219 -0
  90. package/dist/components/ui/json-tree-view/JsonTree.types.cjs +18 -0
  91. package/dist/components/ui/json-tree-view/JsonTree.types.d.ts +253 -0
  92. package/dist/components/ui/json-tree-view/JsonTree.types.js +0 -0
  93. package/dist/components/ui/json-tree-view/JsonTreeRow.cjs +284 -0
  94. package/dist/components/ui/json-tree-view/JsonTreeRow.d.ts +50 -0
  95. package/dist/components/ui/json-tree-view/JsonTreeRow.js +244 -0
  96. package/dist/components/ui/json-tree-view/JsonTreeToolbar.cjs +209 -0
  97. package/dist/components/ui/json-tree-view/JsonTreeToolbar.d.ts +35 -0
  98. package/dist/components/ui/json-tree-view/JsonTreeToolbar.js +175 -0
  99. package/dist/components/ui/json-tree-view/JsonTreeTooltip.cjs +84 -0
  100. package/dist/components/ui/json-tree-view/JsonTreeTooltip.d.ts +21 -0
  101. package/dist/components/ui/json-tree-view/JsonTreeTooltip.js +47 -0
  102. package/dist/components/ui/json-tree-view/JsonTypeBadge.cjs +70 -0
  103. package/dist/components/ui/json-tree-view/JsonTypeBadge.d.ts +17 -0
  104. package/dist/components/ui/json-tree-view/JsonTypeBadge.js +36 -0
  105. package/dist/components/ui/json-tree-view/NodeKey.cjs +77 -0
  106. package/dist/components/ui/json-tree-view/NodeKey.d.ts +16 -0
  107. package/dist/components/ui/json-tree-view/NodeKey.js +43 -0
  108. package/dist/components/ui/json-tree-view/RowActions.cjs +120 -0
  109. package/dist/components/ui/json-tree-view/RowActions.d.ts +15 -0
  110. package/dist/components/ui/json-tree-view/RowActions.js +86 -0
  111. package/dist/components/ui/json-tree-view/ScalarValueCell.cjs +112 -0
  112. package/dist/components/ui/json-tree-view/ScalarValueCell.d.ts +18 -0
  113. package/dist/components/ui/json-tree-view/ScalarValueCell.js +75 -0
  114. package/dist/components/ui/json-tree-view/buildJsonTree.cjs +324 -0
  115. package/dist/components/ui/json-tree-view/buildJsonTree.d.ts +75 -0
  116. package/dist/components/ui/json-tree-view/buildJsonTree.js +257 -0
  117. package/dist/components/ui/json-tree-view/clipboard.cjs +63 -0
  118. package/dist/components/ui/json-tree-view/clipboard.d.ts +6 -0
  119. package/dist/components/ui/json-tree-view/clipboard.js +29 -0
  120. package/dist/components/ui/json-tree-view/index.cjs +175 -0
  121. package/dist/components/ui/json-tree-view/index.d.ts +10 -0
  122. package/dist/components/ui/json-tree-view/index.js +11 -0
  123. package/dist/components/ui/json-tree-view/leafEditTypes.cjs +74 -0
  124. package/dist/components/ui/json-tree-view/leafEditTypes.d.ts +12 -0
  125. package/dist/components/ui/json-tree-view/leafEditTypes.js +34 -0
  126. package/dist/components/ui/json-tree-view/strings.cjs +122 -0
  127. package/dist/components/ui/json-tree-view/strings.d.ts +65 -0
  128. package/dist/components/ui/json-tree-view/strings.js +79 -0
  129. package/dist/components/ui/prompt-value-control.cjs +70 -0
  130. package/dist/components/ui/prompt-value-control.d.ts +28 -0
  131. package/dist/components/ui/prompt-value-control.js +36 -0
  132. package/dist/components/ui/sheet.d.ts +1 -1
  133. package/dist/components/ui/spinner.d.ts +1 -1
  134. package/dist/components/ui/switch.d.ts +2 -2
  135. package/dist/components/ui/textarea.cjs +1 -1
  136. package/dist/components/ui/textarea.js +1 -1
  137. package/dist/components/ui/toggle-group.d.ts +2 -2
  138. package/dist/components/ui/toggle.d.ts +2 -2
  139. package/dist/components/ui/variable-value-control.cjs +98 -0
  140. package/dist/components/ui/variable-value-control.d.ts +35 -0
  141. package/dist/components/ui/variable-value-control.js +64 -0
  142. package/dist/index.cjs +145 -16
  143. package/dist/index.d.ts +21 -3
  144. package/dist/index.js +11 -2
  145. package/dist/lib/index.cjs +4 -1
  146. package/dist/lib/index.d.ts +1 -1
  147. package/dist/lib/index.js +2 -2
  148. package/dist/lib/utils.cjs +21 -1
  149. package/dist/lib/utils.d.ts +8 -0
  150. package/dist/lib/utils.js +18 -1
  151. package/dist/styles.css +225 -0
  152. package/package.json +1 -1
@@ -0,0 +1,555 @@
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ import { Fragment, useCallback, useMemo, useRef, useState } from "react";
3
+ import { Controller, useFormContext } from "react-hook-form";
4
+ import { Badge } from "../ui/badge.js";
5
+ import { FieldMenu } from "../ui/field-addons/field-menu.js";
6
+ import { ValueModeIndicator } from "../ui/field-addons/value-mode-indicator.js";
7
+ import { ValueModeSwitchDialog } from "../ui/field-addons/value-mode-switch-dialog.js";
8
+ import { FormField, FormFieldDescription, FormFieldHeader } from "../ui/form-field.js";
9
+ import { Input } from "../ui/input.js";
10
+ import { InputGroup, InputGroupAddon } from "../ui/input-group.js";
11
+ import { PromptValueControl } from "../ui/prompt-value-control.js";
12
+ import { VariableValueControl } from "../ui/variable-value-control.js";
13
+ import { DEFAULT_FIELD_ACTION_REGISTRY, resolveFieldActions, resolveVariables } from "./field-actions.js";
14
+ import { FIELD_CONTROL_GEOMETRY, FieldControl } from "./field-control.js";
15
+ import { DEFAULT_METADATA_FORM_STRINGS } from "./form-strings.js";
16
+ import { isEmptyFieldValue } from "./validation-converter.js";
17
+ import { DEFAULT_VALUE_MODE_REGISTRY, codecContext, convertValue, isDecodedEmpty, isFieldControlRegistration, resolveCodec, resolveModeOptions } from "./value-modes.js";
18
+ function ModeAwareField(props) {
19
+ const { control } = useFormContext();
20
+ return /*#__PURE__*/ jsx(Controller, {
21
+ name: props.field.name,
22
+ control: control,
23
+ defaultValue: props.field.defaultValue,
24
+ render: ({ field: formField, fieldState: { error } })=>/*#__PURE__*/ jsx(FieldAnatomy, {
25
+ ...props,
26
+ formField: formField,
27
+ error: error?.message
28
+ })
29
+ });
30
+ }
31
+ const BUILT_IN_MODE_CONTROLS = {
32
+ variable: {
33
+ component: VariableValueControl
34
+ },
35
+ prompt: {
36
+ component: PromptValueControl,
37
+ layout: 'grow',
38
+ variant: 'agent',
39
+ insertable: true
40
+ }
41
+ };
42
+ function unfittedGeometry(field) {
43
+ const labelledBy = [
44
+ 'radio',
45
+ 'slider',
46
+ 'datetime',
47
+ 'string-list'
48
+ ].includes(field.type);
49
+ return {
50
+ layout: 'row',
51
+ variant: 'outline',
52
+ labelTarget: labelledBy ? 'labelledby' : 'control',
53
+ insertable: false
54
+ };
55
+ }
56
+ function registrationGeometry(registration) {
57
+ return {
58
+ layout: registration.layout ?? 'row',
59
+ variant: registration.variant ?? 'default',
60
+ labelTarget: registration.labelTarget ?? 'control',
61
+ insertable: registration.insertable ?? false
62
+ };
63
+ }
64
+ const TEXT_GEOMETRY = {
65
+ layout: 'row',
66
+ variant: 'default',
67
+ labelTarget: 'control',
68
+ insertable: true
69
+ };
70
+ function FieldAnatomy({ field, context, customComponents, disabled, required, options, formField, error }) {
71
+ const form = useFormContext();
72
+ const registry = context.valueModes ?? DEFAULT_VALUE_MODE_REGISTRY;
73
+ const actionRegistry = context.fieldActions ?? DEFAULT_FIELD_ACTION_REGISTRY;
74
+ const strings = context.strings ?? DEFAULT_METADATA_FORM_STRINGS;
75
+ const config = field.valueModes;
76
+ const { name } = field;
77
+ const errorId = `${name}-error`;
78
+ const labelId = `${name}-label`;
79
+ const formVariables = context.variables;
80
+ const variables = useCallback(()=>resolveVariables(formVariables, field), [
81
+ formVariables,
82
+ field
83
+ ]);
84
+ const { value } = formField;
85
+ const codec = config ? resolveCodec(registry.codecs, config) : void 0;
86
+ const codecCtx = useMemo(()=>config && codecContext(field, config), [
87
+ field,
88
+ config
89
+ ]);
90
+ const decoded = codec && codecCtx ? codec.decode(value, codecCtx) : void 0;
91
+ const empty = codec && codecCtx && decoded ? isDecodedEmpty(codec, decoded, codecCtx) : isEmptyFieldValue(value);
92
+ const [held, setHeld] = useState();
93
+ const heldMode = held && empty && Object.is(held.stored, value) ? held.mode : void 0;
94
+ const activeMode = config && decoded ? activeModeOf(config, decoded.mode, empty && isEmptyFieldValue(value), heldMode) : 'literal';
95
+ const inner = decoded ? decoded.mode === activeMode ? decoded.value : void 0 : value;
96
+ const [pending, setPending] = useState();
97
+ const groupRef = useRef(null);
98
+ const controlRef = useRef(null);
99
+ const latest = useRef({
100
+ value,
101
+ inner,
102
+ empty,
103
+ activeMode,
104
+ decoded,
105
+ disabled,
106
+ formField,
107
+ insertable: false
108
+ });
109
+ latest.current = {
110
+ ...latest.current,
111
+ value,
112
+ inner,
113
+ empty,
114
+ activeMode,
115
+ decoded,
116
+ disabled,
117
+ formField
118
+ };
119
+ const encode = (mode, value)=>codec && codecCtx ? codec.encode(mode, value, codecCtx, latest.current.value) : value;
120
+ const write = (next, via)=>{
121
+ if ('change' === via) latest.current.formField.onChange(next);
122
+ else {
123
+ const liveMode = 'onChange' === context.schema.mode || 'all' === context.schema.mode;
124
+ form.setValue(name, next, {
125
+ shouldDirty: true,
126
+ shouldValidate: liveMode || form.formState.isSubmitted
127
+ });
128
+ }
129
+ return next;
130
+ };
131
+ const commit = (mode, value, via)=>{
132
+ const stored = write(value, via);
133
+ if (codec && codecCtx) {
134
+ const written = codec.decode(stored, codecCtx);
135
+ setHeld(isDecodedEmpty(codec, written, codecCtx) ? {
136
+ mode,
137
+ stored
138
+ } : void 0);
139
+ }
140
+ };
141
+ const writeInner = (next, via = 'change')=>{
142
+ const mode = latest.current.activeMode;
143
+ if (config) commit(mode, encode(mode, next), via);
144
+ else write(next, via);
145
+ };
146
+ const setModeValue = (mode, value, options)=>{
147
+ if (options?.confirm && !latest.current.empty) setPending({
148
+ ...options.confirm,
149
+ to: mode,
150
+ value
151
+ });
152
+ else commit(mode, encode(mode, value), 'set');
153
+ };
154
+ const handleSelect = (to)=>{
155
+ const current = latest.current;
156
+ if (!codec || !codecCtx || !current.decoded || to === current.activeMode) return;
157
+ const result = convertValue(codec, {
158
+ ...current.decoded,
159
+ mode: current.activeMode
160
+ }, to, codecCtx);
161
+ if ('ok' === result.kind) commit(to, encode(to, result.value), 'set');
162
+ else setPending({
163
+ to,
164
+ value: result.value,
165
+ title: result.title,
166
+ description: result.description
167
+ });
168
+ };
169
+ const writeInnerRef = useRef(writeInner);
170
+ writeInnerRef.current = writeInner;
171
+ const domHandle = useMemo(()=>({
172
+ focus: ()=>controlElement(groupRef.current, name)?.focus(),
173
+ insertText: (text)=>{
174
+ const element = controlElement(groupRef.current, name);
175
+ if (!(element instanceof HTMLInputElement || element instanceof HTMLTextAreaElement)) {
176
+ const current = latest.current.inner;
177
+ writeInnerRef.current(`${'string' == typeof current ? current : ''}${text}`, 'set');
178
+ return;
179
+ }
180
+ const selectable = null !== element.selectionStart;
181
+ const start = element.selectionStart ?? element.value.length;
182
+ const end = element.selectionEnd ?? start;
183
+ writeInnerRef.current(element.value.slice(0, start) + text + element.value.slice(end), 'set');
184
+ const caret = start + text.length;
185
+ setTimeout(()=>{
186
+ element.focus();
187
+ if (selectable) element.setSelectionRange(caret, caret);
188
+ });
189
+ }
190
+ }), [
191
+ name
192
+ ]);
193
+ const ctx = useActionContext({
194
+ field,
195
+ name,
196
+ form,
197
+ modeAware: !!config,
198
+ latest,
199
+ strings,
200
+ variables,
201
+ control: ()=>{
202
+ const own = controlRef.current;
203
+ if (!own) return domHandle;
204
+ return own.insertText ? own : {
205
+ ...own,
206
+ insertText: domHandle.insertText
207
+ };
208
+ },
209
+ commit,
210
+ write,
211
+ encode,
212
+ setModeValue,
213
+ codec,
214
+ codecCtx
215
+ });
216
+ const binding = {
217
+ value: controlValue(field, inner),
218
+ onChange: (next)=>writeInner(next),
219
+ onBlur: formField.onBlur,
220
+ name: formField.name,
221
+ ref: formField.ref
222
+ };
223
+ const resolved = resolveControl({
224
+ field,
225
+ config,
226
+ mode: activeMode,
227
+ registry,
228
+ strings,
229
+ customComponents,
230
+ binding,
231
+ controlRef,
232
+ labelId,
233
+ options,
234
+ disabled,
235
+ required,
236
+ error,
237
+ errorId,
238
+ valueModeProps: ()=>({
239
+ value: inner,
240
+ onChange: (next)=>writeInner(next),
241
+ onBlur: formField.onBlur,
242
+ name,
243
+ field,
244
+ disabled,
245
+ required,
246
+ error,
247
+ mode: activeMode,
248
+ onModeValueChange: setModeValue,
249
+ requestModeSwitch: handleSelect,
250
+ controlRef,
251
+ inputRef: formField.ref,
252
+ id: name,
253
+ labelId,
254
+ invalid: !!error,
255
+ placeholder: field.placeholder,
256
+ variables,
257
+ strings: strings.valueModes,
258
+ controlProps: {
259
+ 'data-slot': 'input-group-control',
260
+ 'aria-invalid': error ? true : void 0,
261
+ 'aria-describedby': error ? errorId : void 0,
262
+ 'aria-errormessage': error ? errorId : void 0
263
+ }
264
+ })
265
+ });
266
+ latest.current.insertable = resolved.geometry.insertable;
267
+ const { header, menu } = resolveFieldActions(field, actionRegistry);
268
+ const modeOptions = config ? resolveModeOptions(field, config, registry, strings.valueModes) : [];
269
+ const switchable = !!config && (config.switchable ?? config.modes.length > 1);
270
+ const menuItems = menu.map((action)=>({
271
+ id: action.id,
272
+ label: 'function' == typeof action.label ? action.label(ctx) : action.label,
273
+ icon: action.icon,
274
+ destructive: action.destructive,
275
+ disabled: action.disabled?.(ctx) ?? false,
276
+ onSelect: ()=>action.onSelect(ctx)
277
+ }));
278
+ const indicator = config && false !== config.indicator && 'literal' !== activeMode ? registry.definitions[activeMode]?.indicator ?? ('expression' === activeMode ? /*#__PURE__*/ jsx(ValueModeIndicator, {
279
+ mode: "expression",
280
+ disabled: disabled,
281
+ strings: strings.valueModes
282
+ }) : null) : null;
283
+ const headerActions = header.map((action)=>/*#__PURE__*/ jsx(Fragment, {
284
+ children: action.render(ctx)
285
+ }, action.id));
286
+ return /*#__PURE__*/ jsxs(FormField, {
287
+ children: [
288
+ /*#__PURE__*/ jsx(FormFieldHeader, {
289
+ label: field.label,
290
+ labelId: labelId,
291
+ htmlFor: 'control' === resolved.geometry.labelTarget ? name : void 0,
292
+ required: required,
293
+ tooltip: field.tooltip,
294
+ tooltipAriaLabel: field.tooltipAriaLabel,
295
+ badge: field.badge ? /*#__PURE__*/ jsx(Badge, {
296
+ variant: "secondary",
297
+ children: field.badge
298
+ }) : void 0,
299
+ actions: headerActions.length > 0 ? headerActions : void 0
300
+ }),
301
+ /*#__PURE__*/ jsxs(InputGroup, {
302
+ ref: groupRef,
303
+ layout: resolved.geometry.layout,
304
+ variant: resolved.geometry.variant,
305
+ disabled: disabled,
306
+ error: error,
307
+ errorId: errorId,
308
+ "data-value-mode-control": 'production' === process.env.NODE_ENV ? void 0 : resolved.source,
309
+ children: [
310
+ indicator && /*#__PURE__*/ jsx(InputGroupAddon, {
311
+ align: "inline-start",
312
+ children: indicator
313
+ }),
314
+ resolved.node,
315
+ (switchable || menuItems.length > 0) && /*#__PURE__*/ jsx(InputGroupAddon, {
316
+ align: "inline-end",
317
+ children: /*#__PURE__*/ jsx(FieldMenu, {
318
+ mode: activeMode,
319
+ onSelect: handleSelect,
320
+ modes: modeOptions,
321
+ actions: menuItems,
322
+ modesDisabled: !switchable,
323
+ disabled: disabled,
324
+ strings: strings.valueModes
325
+ })
326
+ })
327
+ ]
328
+ }),
329
+ /*#__PURE__*/ jsx(FormFieldDescription, {
330
+ children: field.description
331
+ }),
332
+ /*#__PURE__*/ jsx(ValueModeSwitchDialog, {
333
+ open: !!pending,
334
+ title: pending?.title,
335
+ description: pending?.description,
336
+ confirmLabel: pending?.confirmLabel,
337
+ strings: strings.valueModes,
338
+ onCancel: ()=>setPending(void 0),
339
+ onConfirm: ()=>{
340
+ if (pending && !latest.current.disabled) commit(pending.to, encode(pending.to, pending.value), 'set');
341
+ setPending(void 0);
342
+ }
343
+ })
344
+ ]
345
+ });
346
+ }
347
+ function controlValue(field, value) {
348
+ if (null != value) return value;
349
+ switch(field.type){
350
+ case 'text':
351
+ case 'email':
352
+ case 'textarea':
353
+ case 'number':
354
+ case 'select':
355
+ case 'radio':
356
+ return '';
357
+ case 'multiselect':
358
+ case 'string-list':
359
+ return [];
360
+ default:
361
+ return;
362
+ }
363
+ }
364
+ function activeModeOf(config, decodedMode, unset, heldMode) {
365
+ if (heldMode) return heldMode;
366
+ if (unset) return config.defaultMode ?? config.modes[0] ?? 'literal';
367
+ return decodedMode;
368
+ }
369
+ function controlElement(group, id) {
370
+ if (!group) return null;
371
+ for (const element of group.querySelectorAll('[id]'))if (element.id === id) return element;
372
+ return null;
373
+ }
374
+ function useActionContext(input) {
375
+ const inputRef = useRef(input);
376
+ inputRef.current = input;
377
+ const { field, name, form, modeAware } = input;
378
+ return useMemo(()=>{
379
+ const current = ()=>inputRef.current;
380
+ const setStored = (stored)=>{
381
+ const { codec, codecCtx, commit, write } = current();
382
+ if (codec && codecCtx) commit(codec.decode(stored, codecCtx).mode, stored, 'set');
383
+ else write(stored, 'set');
384
+ };
385
+ const ctx = {
386
+ field,
387
+ name,
388
+ form,
389
+ get value () {
390
+ return current().latest.current.value;
391
+ },
392
+ setValue: setStored,
393
+ clear: ()=>{
394
+ const { latest, encode, commit, write } = current();
395
+ const mode = latest.current.activeMode;
396
+ if (modeAware) commit(mode, encode(mode, null), 'set');
397
+ else write(null, 'set');
398
+ },
399
+ get empty () {
400
+ return current().latest.current.empty;
401
+ },
402
+ get disabled () {
403
+ return current().latest.current.disabled;
404
+ },
405
+ get strings () {
406
+ return current().strings;
407
+ },
408
+ get control () {
409
+ return current().control();
410
+ },
411
+ get insertable () {
412
+ return current().latest.current.insertable;
413
+ },
414
+ variables: ()=>current().variables()
415
+ };
416
+ if (modeAware) {
417
+ Object.defineProperty(ctx, 'mode', {
418
+ enumerable: true,
419
+ get: ()=>{
420
+ const { decoded, activeMode } = current().latest.current;
421
+ return decoded && {
422
+ ...decoded,
423
+ mode: activeMode
424
+ };
425
+ }
426
+ });
427
+ ctx.setModeValue = (mode, value, options)=>current().setModeValue(mode, value, options);
428
+ }
429
+ return ctx;
430
+ }, [
431
+ field,
432
+ name,
433
+ form,
434
+ modeAware
435
+ ]);
436
+ }
437
+ function resolveControl(input) {
438
+ const { field, config, mode, registry } = input;
439
+ const named = config?.controls?.[mode];
440
+ let registration;
441
+ let source;
442
+ let componentProps;
443
+ if (named) {
444
+ const controlName = 'string' == typeof named ? named : named.component;
445
+ registration = registry.controlRegistry[controlName];
446
+ source = 'field';
447
+ componentProps = 'string' == typeof named ? void 0 : named.componentProps;
448
+ }
449
+ if (!registration && 'literal' === mode && registry.literalControls[field.type]) {
450
+ registration = registry.literalControls[field.type];
451
+ source = 'literal-controls';
452
+ }
453
+ if (!registration && registry.definitions[mode]?.control) {
454
+ registration = registry.definitions[mode]?.control;
455
+ source = 'definition';
456
+ }
457
+ if (registration && source) {
458
+ const Control = registration.component;
459
+ return {
460
+ node: /*#__PURE__*/ jsx(Control, {
461
+ ...componentProps,
462
+ ...input.valueModeProps()
463
+ }),
464
+ geometry: registrationGeometry(registration),
465
+ source
466
+ };
467
+ }
468
+ if ('literal' === mode) return builtInLiteral(input);
469
+ const builtIn = BUILT_IN_MODE_CONTROLS[mode];
470
+ if (builtIn) {
471
+ const Control = builtIn.component;
472
+ return {
473
+ node: /*#__PURE__*/ jsx(Control, {
474
+ ...input.valueModeProps()
475
+ }),
476
+ geometry: registrationGeometry(builtIn),
477
+ source: 'built-in'
478
+ };
479
+ }
480
+ if ('expression' === mode) return {
481
+ node: /*#__PURE__*/ jsx(FallbackControl, {
482
+ ...input
483
+ }),
484
+ geometry: TEXT_GEOMETRY,
485
+ source: 'built-in'
486
+ };
487
+ return {
488
+ node: /*#__PURE__*/ jsx(FallbackControl, {
489
+ ...input
490
+ }),
491
+ geometry: TEXT_GEOMETRY,
492
+ source: 'fallback'
493
+ };
494
+ }
495
+ function FallbackControl({ field, binding, disabled, error, errorId }) {
496
+ const { value } = binding;
497
+ return /*#__PURE__*/ jsx(Input, {
498
+ id: field.name,
499
+ name: binding.name,
500
+ ref: binding.ref,
501
+ value: 'string' == typeof value ? value : null == value ? '' : String(value),
502
+ onChange: (event)=>binding.onChange(event.target.value),
503
+ onBlur: binding.onBlur,
504
+ placeholder: field.placeholder,
505
+ disabled: disabled,
506
+ "aria-invalid": error ? true : void 0,
507
+ "aria-describedby": error ? errorId : void 0,
508
+ "aria-errormessage": error ? errorId : void 0
509
+ });
510
+ }
511
+ function builtInLiteral(input) {
512
+ const { field, binding, options, disabled, required, error, strings, customComponents } = input;
513
+ if ('custom' === field.type) {
514
+ const entry = customComponents[field.component];
515
+ if (!entry) return {
516
+ node: /*#__PURE__*/ jsx(FallbackControl, {
517
+ ...input
518
+ }),
519
+ geometry: TEXT_GEOMETRY,
520
+ source: 'fallback'
521
+ };
522
+ const registration = isFieldControlRegistration(entry) ? entry : {
523
+ component: entry
524
+ };
525
+ const Component = registration.component;
526
+ const { ref: _ref, ...bindingProps } = binding;
527
+ return {
528
+ node: /*#__PURE__*/ jsx(Component, {
529
+ ...bindingProps,
530
+ ...field.componentProps,
531
+ field: field,
532
+ disabled: disabled,
533
+ required: required,
534
+ error: error,
535
+ controlRef: input.controlRef,
536
+ labelId: input.labelId
537
+ }),
538
+ geometry: registrationGeometry(registration),
539
+ source: 'custom'
540
+ };
541
+ }
542
+ return {
543
+ node: /*#__PURE__*/ jsx(FieldControl, {
544
+ field: field,
545
+ formField: binding,
546
+ options: options,
547
+ disabled: disabled,
548
+ invalid: !!error,
549
+ strings: strings.boolean
550
+ }),
551
+ geometry: FIELD_CONTROL_GEOMETRY[field.type] ?? unfittedGeometry(field),
552
+ source: 'field-type'
553
+ };
554
+ }
555
+ export { ModeAwareField };
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+ var __webpack_require__ = {};
3
+ (()=>{
4
+ __webpack_require__.d = (exports1, definition)=>{
5
+ for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
6
+ enumerable: true,
7
+ get: definition[key]
8
+ });
9
+ };
10
+ })();
11
+ (()=>{
12
+ __webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
13
+ })();
14
+ (()=>{
15
+ __webpack_require__.r = (exports1)=>{
16
+ if ("u" > typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
17
+ value: 'Module'
18
+ });
19
+ Object.defineProperty(exports1, '__esModule', {
20
+ value: true
21
+ });
22
+ };
23
+ })();
24
+ var __webpack_exports__ = {};
25
+ __webpack_require__.r(__webpack_exports__);
26
+ __webpack_require__.d(__webpack_exports__, {
27
+ VALUE_MODE_OPAQUE: ()=>VALUE_MODE_OPAQUE,
28
+ isValueModeOpaque: ()=>isValueModeOpaque
29
+ });
30
+ const VALUE_MODE_OPAQUE = Object.freeze({
31
+ [Symbol.toStringTag]: 'ValueModeOpaque'
32
+ });
33
+ function isValueModeOpaque(value) {
34
+ return value === VALUE_MODE_OPAQUE;
35
+ }
36
+ exports.VALUE_MODE_OPAQUE = __webpack_exports__.VALUE_MODE_OPAQUE;
37
+ exports.isValueModeOpaque = __webpack_exports__.isValueModeOpaque;
38
+ for(var __rspack_i in __webpack_exports__)if (-1 === [
39
+ "VALUE_MODE_OPAQUE",
40
+ "isValueModeOpaque"
41
+ ].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
42
+ Object.defineProperty(exports, '__esModule', {
43
+ value: true
44
+ });
@@ -0,0 +1,7 @@
1
+ /**
2
+ * What rules, conditions and data sources read for a value in a mode other than `literal`: set,
3
+ * but equal to nothing, whatever shape the codec stores it in. Apart from `value-modes.ts` so the
4
+ * rules engine can recognize it without importing the codec layer.
5
+ */
6
+ export declare const VALUE_MODE_OPAQUE: Readonly<object>;
7
+ export declare function isValueModeOpaque(value: unknown): boolean;
@@ -0,0 +1,7 @@
1
+ const VALUE_MODE_OPAQUE = Object.freeze({
2
+ [Symbol.toStringTag]: 'ValueModeOpaque'
3
+ });
4
+ function isValueModeOpaque(value) {
5
+ return value === VALUE_MODE_OPAQUE;
6
+ }
7
+ export { VALUE_MODE_OPAQUE, isValueModeOpaque };
@@ -40,6 +40,7 @@ __webpack_require__.d(__webpack_exports__, {
40
40
  const external_jsep_namespaceObject = require("jsep");
41
41
  var external_jsep_default = /*#__PURE__*/ __webpack_require__.n(external_jsep_namespaceObject);
42
42
  const index_cjs_namespaceObject = require("../../lib/index.cjs");
43
+ const external_opaque_value_cjs_namespaceObject = require("./opaque-value.cjs");
43
44
  class RulesEngine {
44
45
  static evaluateConditions(conditions, values, operator = 'AND') {
45
46
  if (0 === conditions.length) return true;
@@ -57,6 +58,7 @@ class RulesEngine {
57
58
  if (void 0 !== condition.in) return condition.in.includes(fieldValue);
58
59
  if (void 0 !== condition.notIn) return !condition.notIn.includes(fieldValue);
59
60
  if (void 0 !== condition.matches) {
61
+ if ((0, external_opaque_value_cjs_namespaceObject.isValueModeOpaque)(fieldValue)) return false;
60
62
  const regex = new RegExp(condition.matches);
61
63
  return regex.test(String(fieldValue));
62
64
  }
@@ -106,6 +108,17 @@ class RulesEngine {
106
108
  const binary = node;
107
109
  const left = RulesEngine.evaluateNode(binary.left, values);
108
110
  const right = RulesEngine.evaluateNode(binary.right, values);
111
+ if ((0, external_opaque_value_cjs_namespaceObject.isValueModeOpaque)(left) || (0, external_opaque_value_cjs_namespaceObject.isValueModeOpaque)(right)) {
112
+ if ('!=' === binary.operator || '!==' === binary.operator) return true;
113
+ if ([
114
+ '==',
115
+ '===',
116
+ '<',
117
+ '>',
118
+ '<=',
119
+ '>='
120
+ ].includes(binary.operator)) return false;
121
+ }
109
122
  switch(binary.operator){
110
123
  case '==':
111
124
  return left == right;
@@ -1,5 +1,6 @@
1
1
  import jsep from "jsep";
2
2
  import { get } from "../../lib/index.js";
3
+ import { isValueModeOpaque } from "./opaque-value.js";
3
4
  class RulesEngine {
4
5
  static evaluateConditions(conditions, values, operator = 'AND') {
5
6
  if (0 === conditions.length) return true;
@@ -17,6 +18,7 @@ class RulesEngine {
17
18
  if (void 0 !== condition.in) return condition.in.includes(fieldValue);
18
19
  if (void 0 !== condition.notIn) return !condition.notIn.includes(fieldValue);
19
20
  if (void 0 !== condition.matches) {
21
+ if (isValueModeOpaque(fieldValue)) return false;
20
22
  const regex = new RegExp(condition.matches);
21
23
  return regex.test(String(fieldValue));
22
24
  }
@@ -66,6 +68,17 @@ class RulesEngine {
66
68
  const binary = node;
67
69
  const left = RulesEngine.evaluateNode(binary.left, values);
68
70
  const right = RulesEngine.evaluateNode(binary.right, values);
71
+ if (isValueModeOpaque(left) || isValueModeOpaque(right)) {
72
+ if ('!=' === binary.operator || '!==' === binary.operator) return true;
73
+ if ([
74
+ '==',
75
+ '===',
76
+ '<',
77
+ '>',
78
+ '<=',
79
+ '>='
80
+ ].includes(binary.operator)) return false;
81
+ }
69
82
  switch(binary.operator){
70
83
  case '==':
71
84
  return left == right;