@verbb/plugin-kit-react 1.0.10 → 2.0.1
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/CHANGELOG.md +13 -0
- package/README.md +91 -16
- package/dist/app/PluginKitProvider.d.ts +28 -0
- package/dist/app/PluginKitProvider.d.ts.map +1 -0
- package/dist/app/PluginKitProvider.js +39 -0
- package/dist/app/PluginKitProvider.js.map +1 -0
- package/dist/app/configure.d.ts +29 -0
- package/dist/app/configure.d.ts.map +1 -0
- package/dist/app/configure.js +35 -0
- package/dist/app/configure.js.map +1 -0
- package/dist/app/index.d.ts +5 -0
- package/dist/app/index.d.ts.map +1 -0
- package/dist/app/index.js +5 -0
- package/dist/app/mountShadowApp.d.ts +6 -0
- package/dist/app/mountShadowApp.d.ts.map +1 -0
- package/dist/app/mountShadowApp.js +2 -0
- package/dist/components/Button.d.ts +26 -25
- package/dist/components/Button.d.ts.map +1 -1
- package/dist/components/Button.js +34 -141
- package/dist/components/Button.js.map +1 -1
- package/dist/components/ButtonGroup.d.ts +15 -10
- package/dist/components/ButtonGroup.d.ts.map +1 -1
- package/dist/components/ButtonGroup.js +24 -54
- package/dist/components/ButtonGroup.js.map +1 -1
- package/dist/components/Calendar.d.ts +17 -10
- package/dist/components/Calendar.d.ts.map +1 -1
- package/dist/components/Calendar.js +17 -129
- package/dist/components/Calendar.js.map +1 -1
- package/dist/components/Checkbox.d.ts +27 -4
- package/dist/components/Checkbox.d.ts.map +1 -1
- package/dist/components/Checkbox.js +37 -34
- package/dist/components/Checkbox.js.map +1 -1
- package/dist/components/CheckboxInput.d.ts +10 -10
- package/dist/components/CheckboxInput.d.ts.map +1 -1
- package/dist/components/CheckboxInput.js +30 -10
- package/dist/components/CheckboxInput.js.map +1 -1
- package/dist/components/CheckboxSelect.d.ts +18 -17
- package/dist/components/CheckboxSelect.d.ts.map +1 -1
- package/dist/components/CheckboxSelect.js +30 -58
- package/dist/components/CheckboxSelect.js.map +1 -1
- package/dist/components/CodeEditor.d.ts +16 -10
- package/dist/components/CodeEditor.d.ts.map +1 -1
- package/dist/components/CodeEditor.js +32 -71
- package/dist/components/CodeEditor.js.map +1 -1
- package/dist/components/ColorInput.d.ts +25 -12
- package/dist/components/ColorInput.d.ts.map +1 -1
- package/dist/components/ColorInput.js +42 -142
- package/dist/components/ColorInput.js.map +1 -1
- package/dist/components/Combobox.d.ts +31 -39
- package/dist/components/Combobox.d.ts.map +1 -1
- package/dist/components/Combobox.js +47 -385
- package/dist/components/Combobox.js.map +1 -1
- package/dist/components/ComboboxInput.d.ts +34 -17
- package/dist/components/ComboboxInput.d.ts.map +1 -1
- package/dist/components/ComboboxInput.js +81 -161
- package/dist/components/ComboboxInput.js.map +1 -1
- package/dist/components/CopyButton.d.ts +12 -8
- package/dist/components/CopyButton.d.ts.map +1 -1
- package/dist/components/CopyButton.js +15 -36
- package/dist/components/CopyButton.js.map +1 -1
- package/dist/components/DatePicker.d.ts +28 -7
- package/dist/components/DatePicker.d.ts.map +1 -1
- package/dist/components/DatePicker.js +82 -53
- package/dist/components/DatePicker.js.map +1 -1
- package/dist/components/Dialog.d.ts +20 -20
- package/dist/components/Dialog.d.ts.map +1 -1
- package/dist/components/Dialog.js +50 -175
- package/dist/components/Dialog.js.map +1 -1
- package/dist/components/DropdownMenu.d.ts +39 -46
- package/dist/components/DropdownMenu.d.ts.map +1 -1
- package/dist/components/DropdownMenu.js +40 -232
- package/dist/components/DropdownMenu.js.map +1 -1
- package/dist/components/EditableTable.d.ts +82 -27
- package/dist/components/EditableTable.d.ts.map +1 -1
- package/dist/components/EditableTable.js +183 -133
- package/dist/components/EditableTable.js.map +1 -1
- package/dist/components/Field.d.ts +13 -0
- package/dist/components/Field.d.ts.map +1 -0
- package/dist/components/Field.js +32 -0
- package/dist/components/Field.js.map +1 -0
- package/dist/components/Icon.d.ts +7 -0
- package/dist/components/Icon.d.ts.map +1 -0
- package/dist/components/Icon.js +15 -0
- package/dist/components/Icon.js.map +1 -0
- package/dist/components/Input.d.ts +20 -8
- package/dist/components/Input.d.ts.map +1 -1
- package/dist/components/Input.js +37 -34
- package/dist/components/Input.js.map +1 -1
- package/dist/components/InputGroup.d.ts +39 -19
- package/dist/components/InputGroup.d.ts.map +1 -1
- package/dist/components/InputGroup.js +83 -102
- package/dist/components/InputGroup.js.map +1 -1
- package/dist/components/Lightswitch.d.ts +15 -8
- package/dist/components/Lightswitch.d.ts.map +1 -1
- package/dist/components/Lightswitch.js +22 -47
- package/dist/components/Lightswitch.js.map +1 -1
- package/dist/components/Popover.d.ts +23 -11
- package/dist/components/Popover.d.ts.map +1 -1
- package/dist/components/Popover.js +46 -65
- package/dist/components/Popover.js.map +1 -1
- package/dist/components/Popup.d.ts +14 -0
- package/dist/components/Popup.d.ts.map +1 -0
- package/dist/components/Popup.js +19 -0
- package/dist/components/Popup.js.map +1 -0
- package/dist/components/RadioGroup.d.ts +26 -5
- package/dist/components/RadioGroup.d.ts.map +1 -1
- package/dist/components/RadioGroup.js +56 -26
- package/dist/components/RadioGroup.js.map +1 -1
- package/dist/components/RadioGroupInput.d.ts +19 -0
- package/dist/components/RadioGroupInput.d.ts.map +1 -0
- package/dist/components/RadioGroupInput.js +35 -0
- package/dist/components/RadioGroupInput.js.map +1 -0
- package/dist/components/ScrollArea.d.ts +11 -15
- package/dist/components/ScrollArea.d.ts.map +1 -1
- package/dist/components/ScrollArea.js +11 -42
- package/dist/components/ScrollArea.js.map +1 -1
- package/dist/components/Select.d.ts +46 -22
- package/dist/components/Select.d.ts.map +1 -1
- package/dist/components/Select.js +74 -196
- package/dist/components/Select.js.map +1 -1
- package/dist/components/SelectInput.d.ts +28 -21
- package/dist/components/SelectInput.d.ts.map +1 -1
- package/dist/components/SelectInput.js +62 -76
- package/dist/components/SelectInput.js.map +1 -1
- package/dist/components/Separator.d.ts +7 -3
- package/dist/components/Separator.d.ts.map +1 -1
- package/dist/components/Separator.js +11 -13
- package/dist/components/Separator.js.map +1 -1
- package/dist/components/Spinner.d.ts +12 -8
- package/dist/components/Spinner.d.ts.map +1 -1
- package/dist/components/Spinner.js +15 -34
- package/dist/components/Spinner.js.map +1 -1
- package/dist/components/Status.d.ts +7 -7
- package/dist/components/Status.d.ts.map +1 -1
- package/dist/components/Status.js +11 -51
- package/dist/components/Status.js.map +1 -1
- package/dist/components/Tabs.d.ts +31 -7
- package/dist/components/Tabs.d.ts.map +1 -1
- package/dist/components/Tabs.js +57 -30
- package/dist/components/Tabs.js.map +1 -1
- package/dist/components/Textarea.d.ts +18 -7
- package/dist/components/Textarea.d.ts.map +1 -1
- package/dist/components/Textarea.js +33 -18
- package/dist/components/Textarea.js.map +1 -1
- package/dist/components/TimePicker.d.ts +18 -8
- package/dist/components/TimePicker.d.ts.map +1 -1
- package/dist/components/TimePicker.js +38 -36
- package/dist/components/TimePicker.js.map +1 -1
- package/dist/components/Tiptap.d.ts +43 -0
- package/dist/components/Tiptap.d.ts.map +1 -0
- package/dist/components/Tiptap.js +96 -0
- package/dist/components/Tiptap.js.map +1 -0
- package/dist/components/Toggle.d.ts +13 -8
- package/dist/components/Toggle.d.ts.map +1 -1
- package/dist/components/Toggle.js +13 -42
- package/dist/components/Toggle.js.map +1 -1
- package/dist/components/ToggleGroup.d.ts +11 -10
- package/dist/components/ToggleGroup.d.ts.map +1 -1
- package/dist/components/ToggleGroup.js +11 -65
- package/dist/components/ToggleGroup.js.map +1 -1
- package/dist/components/Tooltip.d.ts +18 -8
- package/dist/components/Tooltip.d.ts.map +1 -1
- package/dist/components/Tooltip.js +18 -47
- package/dist/components/Tooltip.js.map +1 -1
- package/dist/components/index.d.ts +37 -45
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/index.js +35 -43
- package/dist/fault/AppFaultBoundary.d.ts +18 -0
- package/dist/fault/AppFaultBoundary.d.ts.map +1 -0
- package/dist/fault/AppFaultBoundary.js +24 -0
- package/dist/fault/AppFaultBoundary.js.map +1 -0
- package/dist/fault/AppFaultProvider.d.ts +43 -0
- package/dist/fault/AppFaultProvider.d.ts.map +1 -0
- package/dist/fault/AppFaultProvider.js +192 -0
- package/dist/fault/AppFaultProvider.js.map +1 -0
- package/dist/fault/FaultFallback.d.ts +16 -0
- package/dist/fault/FaultFallback.d.ts.map +1 -0
- package/dist/fault/FaultFallback.js +67 -0
- package/dist/fault/FaultFallback.js.map +1 -0
- package/dist/fault/buildSupportBundle.d.ts +3 -0
- package/dist/fault/buildSupportBundle.d.ts.map +1 -0
- package/dist/fault/buildSupportBundle.js +22 -0
- package/dist/fault/buildSupportBundle.js.map +1 -0
- package/dist/fault/index.d.ts +8 -0
- package/dist/fault/index.d.ts.map +1 -0
- package/dist/fault/index.js +7 -0
- package/dist/fault/isIgnorableGlobalError.d.ts +3 -0
- package/dist/fault/isIgnorableGlobalError.d.ts.map +1 -0
- package/dist/fault/isIgnorableGlobalError.js +14 -0
- package/dist/fault/isIgnorableGlobalError.js.map +1 -0
- package/dist/fault/types.d.ts +18 -0
- package/dist/fault/types.d.ts.map +1 -0
- package/dist/fault/useUiWatchdog.d.ts +13 -0
- package/dist/fault/useUiWatchdog.d.ts.map +1 -0
- package/dist/fault/useUiWatchdog.js +38 -0
- package/dist/fault/useUiWatchdog.js.map +1 -0
- package/dist/forms/Field.d.ts +19 -31
- package/dist/forms/Field.d.ts.map +1 -1
- package/dist/forms/Field.js +28 -164
- package/dist/forms/Field.js.map +1 -1
- package/dist/forms/SchemaFormEngine.d.ts +5 -4
- package/dist/forms/SchemaFormEngine.d.ts.map +1 -1
- package/dist/forms/SchemaFormEngine.js +36 -16
- package/dist/forms/SchemaFormEngine.js.map +1 -1
- package/dist/forms/SchemaFormFieldNode.d.ts +13 -0
- package/dist/forms/SchemaFormFieldNode.d.ts.map +1 -0
- package/dist/forms/SchemaFormFieldNode.js +48 -0
- package/dist/forms/SchemaFormFieldNode.js.map +1 -0
- package/dist/forms/assertSchemaRegistry.d.ts +18 -0
- package/dist/forms/assertSchemaRegistry.d.ts.map +1 -0
- package/dist/forms/assertSchemaRegistry.js +71 -0
- package/dist/forms/assertSchemaRegistry.js.map +1 -0
- package/dist/forms/builtin-field-loaders.d.ts +11 -0
- package/dist/forms/builtin-field-loaders.d.ts.map +1 -0
- package/dist/forms/builtin-field-loaders.js +31 -0
- package/dist/forms/builtin-field-loaders.js.map +1 -0
- package/dist/forms/components/FieldWrap.d.ts +7 -1
- package/dist/forms/components/FieldWrap.d.ts.map +1 -1
- package/dist/forms/components/FieldWrap.js +17 -23
- package/dist/forms/components/FieldWrap.js.map +1 -1
- package/dist/forms/components/ModalTabs.d.ts +28 -13
- package/dist/forms/components/ModalTabs.d.ts.map +1 -1
- package/dist/forms/components/ModalTabs.js +99 -30
- package/dist/forms/components/ModalTabs.js.map +1 -1
- package/dist/forms/components/index.d.ts +3 -2
- package/dist/forms/components/index.d.ts.map +1 -1
- package/dist/forms/components/schemaErrors.d.ts +5 -0
- package/dist/forms/components/schemaErrors.d.ts.map +1 -0
- package/dist/forms/components/schemaErrors.js +34 -0
- package/dist/forms/components/schemaErrors.js.map +1 -0
- package/dist/forms/datetime.d.ts +12 -0
- package/dist/forms/datetime.d.ts.map +1 -0
- package/dist/forms/datetime.js +34 -0
- package/dist/forms/datetime.js.map +1 -0
- package/dist/forms/engine/context.d.ts +4 -19
- package/dist/forms/engine/context.d.ts.map +1 -1
- package/dist/forms/engine/context.js.map +1 -1
- package/dist/forms/fields/CheckboxSelectField.d.ts +3 -3
- package/dist/forms/fields/CheckboxSelectField.d.ts.map +1 -1
- package/dist/forms/fields/CheckboxSelectField.js +1 -3
- package/dist/forms/fields/CheckboxSelectField.js.map +1 -1
- package/dist/forms/fields/CodeEditorField.d.ts +3 -3
- package/dist/forms/fields/CodeEditorField.d.ts.map +1 -1
- package/dist/forms/fields/CodeEditorField.js +7 -7
- package/dist/forms/fields/CodeEditorField.js.map +1 -1
- package/dist/forms/fields/ColorField.d.ts +1 -1
- package/dist/forms/fields/ColorField.d.ts.map +1 -1
- package/dist/forms/fields/ColorField.js +4 -5
- package/dist/forms/fields/ColorField.js.map +1 -1
- package/dist/forms/fields/ComboboxField.d.ts +4 -5
- package/dist/forms/fields/ComboboxField.d.ts.map +1 -1
- package/dist/forms/fields/ComboboxField.js +2 -5
- package/dist/forms/fields/ComboboxField.js.map +1 -1
- package/dist/forms/fields/DateTimeField.d.ts +1 -1
- package/dist/forms/fields/DateTimeField.d.ts.map +1 -1
- package/dist/forms/fields/DateTimeField.js +22 -18
- package/dist/forms/fields/DateTimeField.js.map +1 -1
- package/dist/forms/fields/GroupField.d.ts +2 -2
- package/dist/forms/fields/GroupField.d.ts.map +1 -1
- package/dist/forms/fields/GroupField.js +0 -1
- package/dist/forms/fields/GroupField.js.map +1 -1
- package/dist/forms/fields/LightswitchField.d.ts +1 -1
- package/dist/forms/fields/LightswitchField.d.ts.map +1 -1
- package/dist/forms/fields/LightswitchField.js +2 -6
- package/dist/forms/fields/LightswitchField.js.map +1 -1
- package/dist/forms/fields/NumberField.d.ts +1 -1
- package/dist/forms/fields/NumberField.d.ts.map +1 -1
- package/dist/forms/fields/NumberField.js +4 -5
- package/dist/forms/fields/NumberField.js.map +1 -1
- package/dist/forms/fields/RadioGroupField.d.ts +2 -2
- package/dist/forms/fields/RadioGroupField.d.ts.map +1 -1
- package/dist/forms/fields/RadioGroupField.js +14 -39
- package/dist/forms/fields/RadioGroupField.js.map +1 -1
- package/dist/forms/fields/SelectField.d.ts +2 -2
- package/dist/forms/fields/SelectField.d.ts.map +1 -1
- package/dist/forms/fields/SelectField.js +1 -2
- package/dist/forms/fields/SelectField.js.map +1 -1
- package/dist/forms/fields/TextField.d.ts +1 -1
- package/dist/forms/fields/TextField.d.ts.map +1 -1
- package/dist/forms/fields/TextField.js +3 -4
- package/dist/forms/fields/TextField.js.map +1 -1
- package/dist/forms/fields/TextareaField.d.ts +1 -1
- package/dist/forms/fields/TextareaField.d.ts.map +1 -1
- package/dist/forms/fields/TextareaField.js +3 -5
- package/dist/forms/fields/TextareaField.js.map +1 -1
- package/dist/forms/index.d.ts +12 -7
- package/dist/forms/index.d.ts.map +1 -1
- package/dist/forms/index.js +9 -7
- package/dist/forms/registry.d.ts +4 -1
- package/dist/forms/registry.d.ts.map +1 -1
- package/dist/forms/registry.js +18 -50
- package/dist/forms/registry.js.map +1 -1
- package/dist/forms/useEngineField.d.ts +1 -1
- package/dist/forms/useEngineField.d.ts.map +1 -1
- package/dist/forms/useEngineField.js.map +1 -1
- package/dist/forms/utils.d.ts +6 -0
- package/dist/forms/utils.d.ts.map +1 -0
- package/dist/forms/utils.js +14 -0
- package/dist/forms/utils.js.map +1 -0
- package/dist/hooks/index.d.ts +1 -2
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +1 -2
- package/dist/hooks/useTranslation.d.ts +2 -1
- package/dist/hooks/useTranslation.d.ts.map +1 -1
- package/dist/hooks/useTranslation.js +3 -5
- package/dist/hooks/useTranslation.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +42 -2
- package/dist/utils/cn.d.ts +4 -0
- package/dist/utils/cn.d.ts.map +1 -0
- package/dist/utils/cn.js +11 -0
- package/dist/utils/cn.js.map +1 -0
- package/dist/utils/craftHostBridge.d.ts +3 -2
- package/dist/utils/craftHostBridge.d.ts.map +1 -1
- package/dist/utils/craftHostBridge.js +1 -0
- package/dist/utils/craftHostBridge.js.map +1 -1
- package/dist/utils/create-plugin-kit-component.d.ts +16 -0
- package/dist/utils/create-plugin-kit-component.d.ts.map +1 -0
- package/dist/utils/create-plugin-kit-component.js +97 -0
- package/dist/utils/create-plugin-kit-component.js.map +1 -0
- package/dist/utils/index.d.ts +8 -19
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +7 -74
- package/dist/utils/isHostEvent.d.ts +7 -0
- package/dist/utils/isHostEvent.d.ts.map +1 -0
- package/dist/utils/isHostEvent.js +13 -0
- package/dist/utils/isHostEvent.js.map +1 -0
- package/dist/utils/lit-react-booleans.d.ts +9 -0
- package/dist/utils/lit-react-booleans.d.ts.map +1 -0
- package/dist/utils/lit-react-booleans.js +17 -0
- package/dist/utils/lit-react-booleans.js.map +1 -0
- package/dist/utils/pk-change.d.ts +5 -0
- package/dist/utils/pk-change.d.ts.map +1 -0
- package/dist/utils/pk-change.js +13 -0
- package/dist/utils/pk-change.js.map +1 -0
- package/package.json +34 -80
- package/style.css +16 -0
- package/tailwind-preflight-scope.css +28 -0
- package/tailwind-theme.css +245 -0
- package/vite-dev.mjs +22 -2
- package/dist/_virtual/_rolldown/runtime.js +0 -34
- package/dist/components/Command.d.ts +0 -26
- package/dist/components/Command.d.ts.map +0 -1
- package/dist/components/Command.js +0 -94
- package/dist/components/Command.js.map +0 -1
- package/dist/components/FadeIn.d.ts +0 -12
- package/dist/components/FadeIn.d.ts.map +0 -1
- package/dist/components/FadeIn.js +0 -24
- package/dist/components/FadeIn.js.map +0 -1
- package/dist/components/Label.d.ts +0 -4
- package/dist/components/Label.d.ts.map +0 -1
- package/dist/components/Label.js +0 -15
- package/dist/components/Label.js.map +0 -1
- package/dist/components/Markdown.d.ts +0 -11
- package/dist/components/Markdown.d.ts.map +0 -1
- package/dist/components/Markdown.js +0 -46
- package/dist/components/Markdown.js.map +0 -1
- package/dist/components/MenuButton.d.ts +0 -40
- package/dist/components/MenuButton.d.ts.map +0 -1
- package/dist/components/MenuButton.js +0 -122
- package/dist/components/MenuButton.js.map +0 -1
- package/dist/components/ModalTabs.d.ts +0 -8
- package/dist/components/ModalTabs.d.ts.map +0 -1
- package/dist/components/ModalTabs.js +0 -37
- package/dist/components/ModalTabs.js.map +0 -1
- package/dist/components/PaneTabs.d.ts +0 -8
- package/dist/components/PaneTabs.d.ts.map +0 -1
- package/dist/components/PaneTabs.js +0 -37
- package/dist/components/PaneTabs.js.map +0 -1
- package/dist/components/SlideUp.d.ts +0 -12
- package/dist/components/SlideUp.d.ts.map +0 -1
- package/dist/components/SlideUp.js +0 -36
- package/dist/components/SlideUp.js.map +0 -1
- package/dist/components/Slot.d.ts +0 -6
- package/dist/components/Slot.d.ts.map +0 -1
- package/dist/components/Slot.js +0 -52
- package/dist/components/Slot.js.map +0 -1
- package/dist/components/Table.d.ts +0 -10
- package/dist/components/Table.d.ts.map +0 -1
- package/dist/components/Table.js +0 -64
- package/dist/components/Table.js.map +0 -1
- package/dist/components/TiptapContent.d.ts +0 -9
- package/dist/components/TiptapContent.d.ts.map +0 -1
- package/dist/components/TiptapContent.js +0 -43
- package/dist/components/TiptapContent.js.map +0 -1
- package/dist/components/TiptapEditor.d.ts +0 -43
- package/dist/components/TiptapEditor.d.ts.map +0 -1
- package/dist/components/TiptapEditor.js +0 -573
- package/dist/components/TiptapEditor.js.map +0 -1
- package/dist/components/TiptapInput.d.ts +0 -20
- package/dist/components/TiptapInput.d.ts.map +0 -1
- package/dist/components/TiptapInput.js +0 -140
- package/dist/components/TiptapInput.js.map +0 -1
- package/dist/components/VirtualizedScrollArea.d.ts +0 -25
- package/dist/components/VirtualizedScrollArea.d.ts.map +0 -1
- package/dist/components/VirtualizedScrollArea.js +0 -80
- package/dist/components/VirtualizedScrollArea.js.map +0 -1
- package/dist/components/editable-table/RowDataCells.d.ts +0 -3
- package/dist/components/editable-table/RowDataCells.d.ts.map +0 -1
- package/dist/components/editable-table/RowDataCells.js +0 -33
- package/dist/components/editable-table/RowDataCells.js.map +0 -1
- package/dist/components/editable-table/TableCell.d.ts +0 -13
- package/dist/components/editable-table/TableCell.d.ts.map +0 -1
- package/dist/components/editable-table/TableCell.js +0 -415
- package/dist/components/editable-table/TableCell.js.map +0 -1
- package/dist/components/editable-table/TableRow.d.ts +0 -3
- package/dist/components/editable-table/TableRow.d.ts.map +0 -1
- package/dist/components/editable-table/TableRow.js +0 -166
- package/dist/components/editable-table/TableRow.js.map +0 -1
- package/dist/components/editable-table/helpers.d.ts +0 -12
- package/dist/components/editable-table/helpers.d.ts.map +0 -1
- package/dist/components/editable-table/helpers.js +0 -23
- package/dist/components/editable-table/helpers.js.map +0 -1
- package/dist/components/editable-table/index.d.ts +0 -4
- package/dist/components/editable-table/index.d.ts.map +0 -1
- package/dist/components/editable-table/index.js +0 -4
- package/dist/components/editable-table/types.d.ts +0 -55
- package/dist/components/editable-table/types.d.ts.map +0 -1
- package/dist/components/editable-table/types.js +0 -0
- package/dist/components/editable-table/useEditableTableCellChange.d.ts +0 -17
- package/dist/components/editable-table/useEditableTableCellChange.d.ts.map +0 -1
- package/dist/components/editable-table/useEditableTableCellChange.js +0 -152
- package/dist/components/editable-table/useEditableTableCellChange.js.map +0 -1
- package/dist/components/editable-table/useEditableTableDnd.d.ts +0 -18
- package/dist/components/editable-table/useEditableTableDnd.d.ts.map +0 -1
- package/dist/components/editable-table/useEditableTableDnd.js +0 -55
- package/dist/components/editable-table/useEditableTableDnd.js.map +0 -1
- package/dist/components/editable-table/useEditableTableRows.d.ts +0 -17
- package/dist/components/editable-table/useEditableTableRows.d.ts.map +0 -1
- package/dist/components/editable-table/useEditableTableRows.js +0 -108
- package/dist/components/editable-table/useEditableTableRows.js.map +0 -1
- package/dist/components/tiptap/InlineVariablePickerPopover.d.ts +0 -24
- package/dist/components/tiptap/InlineVariablePickerPopover.d.ts.map +0 -1
- package/dist/components/tiptap/InlineVariablePickerPopover.js +0 -63
- package/dist/components/tiptap/InlineVariablePickerPopover.js.map +0 -1
- package/dist/components/tiptap/InsertLinkDialog.d.ts +0 -14
- package/dist/components/tiptap/InsertLinkDialog.d.ts.map +0 -1
- package/dist/components/tiptap/InsertLinkDialog.js +0 -145
- package/dist/components/tiptap/InsertLinkDialog.js.map +0 -1
- package/dist/components/tiptap/LinkBubbleMenu.d.ts +0 -10
- package/dist/components/tiptap/LinkBubbleMenu.d.ts.map +0 -1
- package/dist/components/tiptap/LinkBubbleMenu.js +0 -106
- package/dist/components/tiptap/LinkBubbleMenu.js.map +0 -1
- package/dist/components/tiptap/LinkDropdown.d.ts +0 -53
- package/dist/components/tiptap/LinkDropdown.d.ts.map +0 -1
- package/dist/components/tiptap/LinkDropdown.js +0 -155
- package/dist/components/tiptap/LinkDropdown.js.map +0 -1
- package/dist/components/tiptap/VariableCommandList.d.ts +0 -37
- package/dist/components/tiptap/VariableCommandList.d.ts.map +0 -1
- package/dist/components/tiptap/VariableCommandList.js +0 -166
- package/dist/components/tiptap/VariableCommandList.js.map +0 -1
- package/dist/components/tiptap/VariableDropdown.d.ts +0 -40
- package/dist/components/tiptap/VariableDropdown.d.ts.map +0 -1
- package/dist/components/tiptap/VariableDropdown.js +0 -121
- package/dist/components/tiptap/VariableDropdown.js.map +0 -1
- package/dist/components/tiptap/VariablePickerContext.d.ts +0 -58
- package/dist/components/tiptap/VariablePickerContext.d.ts.map +0 -1
- package/dist/components/tiptap/VariablePickerContext.js +0 -34
- package/dist/components/tiptap/VariablePickerContext.js.map +0 -1
- package/dist/components/tiptap/VariableTag.d.ts +0 -6
- package/dist/components/tiptap/VariableTag.d.ts.map +0 -1
- package/dist/components/tiptap/VariableTag.js +0 -153
- package/dist/components/tiptap/VariableTag.js.map +0 -1
- package/dist/components/tiptap/VariableTagView.d.ts +0 -3
- package/dist/components/tiptap/VariableTagView.d.ts.map +0 -1
- package/dist/components/tiptap/VariableTagView.js +0 -584
- package/dist/components/tiptap/VariableTagView.js.map +0 -1
- package/dist/components/tiptap/VariableTransformControls.d.ts +0 -37
- package/dist/components/tiptap/VariableTransformControls.d.ts.map +0 -1
- package/dist/components/tiptap/VariableTransformControls.js +0 -157
- package/dist/components/tiptap/VariableTransformControls.js.map +0 -1
- package/dist/components/tiptap/editorConfig.d.ts +0 -15
- package/dist/components/tiptap/editorConfig.d.ts.map +0 -1
- package/dist/components/tiptap/editorConfig.js +0 -191
- package/dist/components/tiptap/editorConfig.js.map +0 -1
- package/dist/components/tiptap/useInlineVariablePicker.d.ts +0 -34
- package/dist/components/tiptap/useInlineVariablePicker.d.ts.map +0 -1
- package/dist/components/tiptap/useInlineVariablePicker.js +0 -240
- package/dist/components/tiptap/useInlineVariablePicker.js.map +0 -1
- package/dist/components/tiptap/useVariablePicker.d.ts +0 -28
- package/dist/components/tiptap/useVariablePicker.d.ts.map +0 -1
- package/dist/components/tiptap/useVariablePicker.js +0 -122
- package/dist/components/tiptap/useVariablePicker.js.map +0 -1
- package/dist/components/tiptap/variablePickerUtils.d.ts +0 -11
- package/dist/components/tiptap/variablePickerUtils.d.ts.map +0 -1
- package/dist/components/tiptap/variablePickerUtils.js +0 -63
- package/dist/components/tiptap/variablePickerUtils.js.map +0 -1
- package/dist/components/tiptap/variableSerialization.d.ts +0 -53
- package/dist/components/tiptap/variableSerialization.d.ts.map +0 -1
- package/dist/components/tiptap/variableSerialization.js +0 -291
- package/dist/components/tiptap/variableSerialization.js.map +0 -1
- package/dist/css/core.css +0 -288
- package/dist/css/style.css +0 -295
- package/dist/forms/TranslationIcon.d.ts +0 -5
- package/dist/forms/TranslationIcon.d.ts.map +0 -1
- package/dist/forms/TranslationIcon.js +0 -18
- package/dist/forms/TranslationIcon.js.map +0 -1
- package/dist/forms/components/index.js +0 -3
- package/dist/forms/contexts/VariableCategoriesContext.d.ts +0 -19
- package/dist/forms/contexts/VariableCategoriesContext.d.ts.map +0 -1
- package/dist/forms/contexts/VariableCategoriesContext.js +0 -20
- package/dist/forms/contexts/VariableCategoriesContext.js.map +0 -1
- package/dist/forms/engine/FormStateStore.d.ts +0 -24
- package/dist/forms/engine/FormStateStore.d.ts.map +0 -1
- package/dist/forms/engine/FormStateStore.js +0 -97
- package/dist/forms/engine/FormStateStore.js.map +0 -1
- package/dist/forms/engine/SchemaIndex.d.ts +0 -33
- package/dist/forms/engine/SchemaIndex.d.ts.map +0 -1
- package/dist/forms/engine/SchemaIndex.js +0 -21
- package/dist/forms/engine/SchemaIndex.js.map +0 -1
- package/dist/forms/engine/ValidationEngine.d.ts +0 -13
- package/dist/forms/engine/ValidationEngine.d.ts.map +0 -1
- package/dist/forms/engine/ValidationEngine.js +0 -156
- package/dist/forms/engine/ValidationEngine.js.map +0 -1
- package/dist/forms/engine/buildGroupedMessage.d.ts +0 -2
- package/dist/forms/engine/buildGroupedMessage.d.ts.map +0 -1
- package/dist/forms/engine/buildGroupedMessage.js +0 -20
- package/dist/forms/engine/buildGroupedMessage.js.map +0 -1
- package/dist/forms/engine/rules/email.d.ts +0 -2
- package/dist/forms/engine/rules/email.d.ts.map +0 -1
- package/dist/forms/engine/rules/email.js +0 -11
- package/dist/forms/engine/rules/email.js.map +0 -1
- package/dist/forms/engine/rules/emailOrVariable.d.ts +0 -2
- package/dist/forms/engine/rules/emailOrVariable.d.ts.map +0 -1
- package/dist/forms/engine/rules/emailOrVariable.js +0 -13
- package/dist/forms/engine/rules/emailOrVariable.js.map +0 -1
- package/dist/forms/engine/rules/handle.d.ts +0 -2
- package/dist/forms/engine/rules/handle.d.ts.map +0 -1
- package/dist/forms/engine/rules/handle.js +0 -12
- package/dist/forms/engine/rules/handle.js.map +0 -1
- package/dist/forms/engine/rules/index.d.ts +0 -9
- package/dist/forms/engine/rules/index.d.ts.map +0 -1
- package/dist/forms/engine/rules/index.js +0 -39
- package/dist/forms/engine/rules/index.js.map +0 -1
- package/dist/forms/engine/rules/max.d.ts +0 -2
- package/dist/forms/engine/rules/max.d.ts.map +0 -1
- package/dist/forms/engine/rules/max.js +0 -16
- package/dist/forms/engine/rules/max.js.map +0 -1
- package/dist/forms/engine/rules/min.d.ts +0 -2
- package/dist/forms/engine/rules/min.d.ts.map +0 -1
- package/dist/forms/engine/rules/min.js +0 -16
- package/dist/forms/engine/rules/min.js.map +0 -1
- package/dist/forms/engine/rules/required.d.ts +0 -2
- package/dist/forms/engine/rules/required.d.ts.map +0 -1
- package/dist/forms/engine/rules/required.js +0 -11
- package/dist/forms/engine/rules/required.js.map +0 -1
- package/dist/forms/engine/rules/requiredRichText.d.ts +0 -2
- package/dist/forms/engine/rules/requiredRichText.d.ts.map +0 -1
- package/dist/forms/engine/rules/requiredRichText.js +0 -11
- package/dist/forms/engine/rules/requiredRichText.js.map +0 -1
- package/dist/forms/engine/rules/requiredRules.d.ts +0 -3
- package/dist/forms/engine/rules/requiredRules.d.ts.map +0 -1
- package/dist/forms/engine/rules/requiredRules.js +0 -9
- package/dist/forms/engine/rules/requiredRules.js.map +0 -1
- package/dist/forms/engine/rules/uniqueHandle.d.ts +0 -9
- package/dist/forms/engine/rules/uniqueHandle.d.ts.map +0 -1
- package/dist/forms/engine/rules/uniqueHandle.js +0 -95
- package/dist/forms/engine/rules/uniqueHandle.js.map +0 -1
- package/dist/forms/engine/rules/utils.d.ts +0 -3
- package/dist/forms/engine/rules/utils.d.ts.map +0 -1
- package/dist/forms/engine/rules/utils.js +0 -21
- package/dist/forms/engine/rules/utils.js.map +0 -1
- package/dist/forms/fields/CalculationsField.d.ts +0 -24
- package/dist/forms/fields/CalculationsField.d.ts.map +0 -1
- package/dist/forms/fields/CalculationsField.js +0 -215
- package/dist/forms/fields/CalculationsField.js.map +0 -1
- package/dist/forms/fields/CalculationsToolbar.d.ts +0 -17
- package/dist/forms/fields/CalculationsToolbar.d.ts.map +0 -1
- package/dist/forms/fields/CalculationsToolbar.js +0 -130
- package/dist/forms/fields/CalculationsToolbar.js.map +0 -1
- package/dist/forms/fields/EditableTableField.d.ts +0 -22
- package/dist/forms/fields/EditableTableField.d.ts.map +0 -1
- package/dist/forms/fields/EditableTableField.js +0 -37
- package/dist/forms/fields/EditableTableField.js.map +0 -1
- package/dist/forms/fields/ElementSelectField.d.ts +0 -20
- package/dist/forms/fields/ElementSelectField.d.ts.map +0 -1
- package/dist/forms/fields/ElementSelectField.js +0 -215
- package/dist/forms/fields/ElementSelectField.js.map +0 -1
- package/dist/forms/fields/HandleField.d.ts +0 -20
- package/dist/forms/fields/HandleField.d.ts.map +0 -1
- package/dist/forms/fields/HandleField.js +0 -70
- package/dist/forms/fields/HandleField.js.map +0 -1
- package/dist/forms/fields/ListField.d.ts +0 -18
- package/dist/forms/fields/ListField.d.ts.map +0 -1
- package/dist/forms/fields/ListField.js +0 -52
- package/dist/forms/fields/ListField.js.map +0 -1
- package/dist/forms/fields/RichTextField.d.ts +0 -24
- package/dist/forms/fields/RichTextField.d.ts.map +0 -1
- package/dist/forms/fields/RichTextField.js +0 -53
- package/dist/forms/fields/RichTextField.js.map +0 -1
- package/dist/forms/fields/StaticTableField.d.ts +0 -34
- package/dist/forms/fields/StaticTableField.d.ts.map +0 -1
- package/dist/forms/fields/StaticTableField.js +0 -128
- package/dist/forms/fields/StaticTableField.js.map +0 -1
- package/dist/forms/fields/VariablePickerField.d.ts +0 -21
- package/dist/forms/fields/VariablePickerField.d.ts.map +0 -1
- package/dist/forms/fields/VariablePickerField.js +0 -51
- package/dist/forms/fields/VariablePickerField.js.map +0 -1
- package/dist/forms/store/element-store.d.ts +0 -11
- package/dist/forms/store/element-store.d.ts.map +0 -1
- package/dist/forms/store/element-store.js +0 -41
- package/dist/forms/store/element-store.js.map +0 -1
- package/dist/forms/useEditableTableFieldBinding.d.ts +0 -13
- package/dist/forms/useEditableTableFieldBinding.d.ts.map +0 -1
- package/dist/forms/useEditableTableFieldBinding.js +0 -91
- package/dist/forms/useEditableTableFieldBinding.js.map +0 -1
- package/dist/hooks/useKeyboardShortcuts.d.ts +0 -14
- package/dist/hooks/useKeyboardShortcuts.d.ts.map +0 -1
- package/dist/hooks/useKeyboardShortcuts.js +0 -67
- package/dist/hooks/useKeyboardShortcuts.js.map +0 -1
- package/dist/node_modules/@babel/runtime/helpers/arrayLikeToArray.js +0 -15
- package/dist/node_modules/@babel/runtime/helpers/arrayLikeToArray.js.map +0 -1
- package/dist/node_modules/@babel/runtime/helpers/arrayWithoutHoles.js +0 -15
- package/dist/node_modules/@babel/runtime/helpers/arrayWithoutHoles.js.map +0 -1
- package/dist/node_modules/@babel/runtime/helpers/classCallCheck.js +0 -13
- package/dist/node_modules/@babel/runtime/helpers/classCallCheck.js.map +0 -1
- package/dist/node_modules/@babel/runtime/helpers/createClass.js +0 -21
- package/dist/node_modules/@babel/runtime/helpers/createClass.js.map +0 -1
- package/dist/node_modules/@babel/runtime/helpers/defineProperty.js +0 -20
- package/dist/node_modules/@babel/runtime/helpers/defineProperty.js.map +0 -1
- package/dist/node_modules/@babel/runtime/helpers/interopRequireDefault.js +0 -13
- package/dist/node_modules/@babel/runtime/helpers/interopRequireDefault.js.map +0 -1
- package/dist/node_modules/@babel/runtime/helpers/iterableToArray.js +0 -13
- package/dist/node_modules/@babel/runtime/helpers/iterableToArray.js.map +0 -1
- package/dist/node_modules/@babel/runtime/helpers/nonIterableSpread.js +0 -13
- package/dist/node_modules/@babel/runtime/helpers/nonIterableSpread.js.map +0 -1
- package/dist/node_modules/@babel/runtime/helpers/toConsumableArray.js +0 -21
- package/dist/node_modules/@babel/runtime/helpers/toConsumableArray.js.map +0 -1
- package/dist/node_modules/@babel/runtime/helpers/toPrimitive.js +0 -22
- package/dist/node_modules/@babel/runtime/helpers/toPrimitive.js.map +0 -1
- package/dist/node_modules/@babel/runtime/helpers/toPropertyKey.js +0 -18
- package/dist/node_modules/@babel/runtime/helpers/toPropertyKey.js.map +0 -1
- package/dist/node_modules/@babel/runtime/helpers/typeof.js +0 -18
- package/dist/node_modules/@babel/runtime/helpers/typeof.js.map +0 -1
- package/dist/node_modules/@babel/runtime/helpers/unsupportedIterableToArray.js +0 -19
- package/dist/node_modules/@babel/runtime/helpers/unsupportedIterableToArray.js.map +0 -1
- package/dist/node_modules/jexl/dist/Expression.js +0 -84
- package/dist/node_modules/jexl/dist/Expression.js.map +0 -1
- package/dist/node_modules/jexl/dist/Jexl.js +0 -165
- package/dist/node_modules/jexl/dist/Jexl.js.map +0 -1
- package/dist/node_modules/jexl/dist/Lexer.js +0 -152
- package/dist/node_modules/jexl/dist/Lexer.js.map +0 -1
- package/dist/node_modules/jexl/dist/PromiseSync.js +0 -87
- package/dist/node_modules/jexl/dist/PromiseSync.js.map +0 -1
- package/dist/node_modules/jexl/dist/evaluator/Evaluator.js +0 -98
- package/dist/node_modules/jexl/dist/evaluator/Evaluator.js.map +0 -1
- package/dist/node_modules/jexl/dist/evaluator/handlers.js +0 -162
- package/dist/node_modules/jexl/dist/evaluator/handlers.js.map +0 -1
- package/dist/node_modules/jexl/dist/grammar.js +0 -195
- package/dist/node_modules/jexl/dist/grammar.js.map +0 -1
- package/dist/node_modules/jexl/dist/parser/Parser.js +0 -135
- package/dist/node_modules/jexl/dist/parser/Parser.js.map +0 -1
- package/dist/node_modules/jexl/dist/parser/handlers.js +0 -205
- package/dist/node_modules/jexl/dist/parser/handlers.js.map +0 -1
- package/dist/node_modules/jexl/dist/parser/states.js +0 -158
- package/dist/node_modules/jexl/dist/parser/states.js.map +0 -1
- package/dist/types/global.d.d.ts +0 -1
- package/dist/types/global.d.js +0 -0
- package/dist/utils/classes.d.ts +0 -18
- package/dist/utils/classes.d.ts.map +0 -1
- package/dist/utils/classes.js +0 -25
- package/dist/utils/classes.js.map +0 -1
- package/dist/utils/config.d.ts +0 -14
- package/dist/utils/config.d.ts.map +0 -1
- package/dist/utils/config.js +0 -20
- package/dist/utils/config.js.map +0 -1
- package/dist/utils/datetime.d.ts +0 -10
- package/dist/utils/datetime.d.ts.map +0 -1
- package/dist/utils/datetime.js +0 -60
- package/dist/utils/datetime.js.map +0 -1
- package/dist/utils/documentScrollStability.d.ts +0 -7
- package/dist/utils/documentScrollStability.d.ts.map +0 -1
- package/dist/utils/documentScrollStability.js +0 -19
- package/dist/utils/documentScrollStability.js.map +0 -1
- package/dist/utils/handle.d.ts +0 -10
- package/dist/utils/handle.d.ts.map +0 -1
- package/dist/utils/handle.js +0 -51
- package/dist/utils/handle.js.map +0 -1
- package/dist/utils/hostBridge.d.ts +0 -40
- package/dist/utils/hostBridge.d.ts.map +0 -1
- package/dist/utils/hostBridge.js +0 -35
- package/dist/utils/hostBridge.js.map +0 -1
- package/dist/utils/index.js.map +0 -1
- package/dist/utils/portal.d.ts +0 -17
- package/dist/utils/portal.d.ts.map +0 -1
- package/dist/utils/portal.js +0 -51
- package/dist/utils/portal.js.map +0 -1
- package/dist/utils/schema.d.ts +0 -17
- package/dist/utils/schema.d.ts.map +0 -1
- package/dist/utils/schema.js +0 -56
- package/dist/utils/schema.js.map +0 -1
- package/dist/utils/schemaFieldNames.d.ts +0 -2
- package/dist/utils/schemaFieldNames.d.ts.map +0 -1
- package/dist/utils/schemaFieldNames.js +0 -16
- package/dist/utils/schemaFieldNames.js.map +0 -1
- package/dist/utils/schemaIndex.d.ts +0 -6
- package/dist/utils/schemaIndex.d.ts.map +0 -1
- package/dist/utils/schemaIndex.js +0 -31
- package/dist/utils/schemaIndex.js.map +0 -1
- package/dist/utils/schemaIndexCache.d.ts +0 -6
- package/dist/utils/schemaIndexCache.d.ts.map +0 -1
- package/dist/utils/schemaIndexCache.js +0 -32
- package/dist/utils/schemaIndexCache.js.map +0 -1
- package/dist/utils/schemaNormalize.d.ts +0 -13
- package/dist/utils/schemaNormalize.d.ts.map +0 -1
- package/dist/utils/schemaNormalize.js +0 -17
- package/dist/utils/schemaNormalize.js.map +0 -1
- package/dist/utils/store.d.ts +0 -7
- package/dist/utils/store.d.ts.map +0 -1
- package/dist/utils/store.js +0 -6
- package/dist/utils/store.js.map +0 -1
- package/dist/utils/timeOptions.d.ts +0 -6
- package/dist/utils/timeOptions.d.ts.map +0 -1
- package/dist/utils/timeOptions.js +0 -42
- package/dist/utils/timeOptions.js.map +0 -1
- package/dist/utils/tiptap.d.ts +0 -19
- package/dist/utils/tiptap.d.ts.map +0 -1
- package/dist/utils/tiptap.js +0 -92
- package/dist/utils/tiptap.js.map +0 -1
- package/dist/utils/translation.d.ts +0 -5
- package/dist/utils/translation.d.ts.map +0 -1
- package/dist/utils/translation.js +0 -25
- package/dist/utils/translation.js.map +0 -1
- package/dist/utils/validation.d.ts +0 -4
- package/dist/utils/validation.d.ts.map +0 -1
- package/dist/utils/validation.js +0 -260
- package/dist/utils/validation.js.map +0 -1
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { getFormComponentRegistry, getFormFieldRegistry } from "./registry.js";
|
|
2
|
+
import { isBuiltinFormFieldType } from "./builtin-field-loaders.js";
|
|
3
|
+
//#region src/forms/assertSchemaRegistry.ts
|
|
4
|
+
var isRecord = (value) => {
|
|
5
|
+
return Boolean(value) && typeof value === "object" && !Array.isArray(value);
|
|
6
|
+
};
|
|
7
|
+
var walkSchema = (schema, path, visit) => {
|
|
8
|
+
if (typeof schema === "string") return;
|
|
9
|
+
if (Array.isArray(schema)) {
|
|
10
|
+
schema.forEach((item, index) => {
|
|
11
|
+
if (typeof item === "string" || !isRecord(item)) return;
|
|
12
|
+
const itemPath = `${path}[${index}]`;
|
|
13
|
+
visit(item, itemPath);
|
|
14
|
+
walkSchema(item, itemPath, visit);
|
|
15
|
+
});
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
if (!isRecord(schema)) return;
|
|
19
|
+
const node = schema;
|
|
20
|
+
visit(node, path);
|
|
21
|
+
if (node.children) walkSchema(node.children, `${path}.children`, visit);
|
|
22
|
+
if (node.schema) walkSchema(node.schema, `${path}.schema`, visit);
|
|
23
|
+
};
|
|
24
|
+
/**
|
|
25
|
+
* Walk a SchemaForm tree and verify every `$field` / `$cmp` key is registered.
|
|
26
|
+
* Use in dev/test bootstraps for large plugins (Formie-scale) before shipping CP screens.
|
|
27
|
+
*/
|
|
28
|
+
var assertSchemaRegistry = (schema, options = {}) => {
|
|
29
|
+
const { failFast = false } = options;
|
|
30
|
+
const fieldRegistry = getFormFieldRegistry();
|
|
31
|
+
const componentRegistry = getFormComponentRegistry();
|
|
32
|
+
const issues = [];
|
|
33
|
+
walkSchema(schema, "schema", (node, nodePath) => {
|
|
34
|
+
if (node.$field) {
|
|
35
|
+
const key = String(node.$field);
|
|
36
|
+
if (!fieldRegistry[key] && !isBuiltinFormFieldType(key)) {
|
|
37
|
+
const issue = {
|
|
38
|
+
path: nodePath,
|
|
39
|
+
kind: "field",
|
|
40
|
+
key
|
|
41
|
+
};
|
|
42
|
+
issues.push(issue);
|
|
43
|
+
if (failFast) throw new Error(`SchemaForm: unregistered field "${key}" at ${nodePath}`);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
if (node.$cmp) {
|
|
47
|
+
const key = String(node.$cmp);
|
|
48
|
+
if (!componentRegistry[key]) {
|
|
49
|
+
const issue = {
|
|
50
|
+
path: nodePath,
|
|
51
|
+
kind: "component",
|
|
52
|
+
key
|
|
53
|
+
};
|
|
54
|
+
issues.push(issue);
|
|
55
|
+
if (failFast) throw new Error(`SchemaForm: unregistered component "${key}" at ${nodePath}`);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
return issues;
|
|
60
|
+
};
|
|
61
|
+
/** Dev helper: log registry gaps for a schema index root tree. */
|
|
62
|
+
var debugSchemaRegistry = (schemaIndex, options) => {
|
|
63
|
+
if (!schemaIndex?.schema) return [];
|
|
64
|
+
const issues = assertSchemaRegistry(schemaIndex.schema, options);
|
|
65
|
+
if (issues.length) console.warn("[plugin-kit] SchemaForm registry gaps:", issues);
|
|
66
|
+
return issues;
|
|
67
|
+
};
|
|
68
|
+
//#endregion
|
|
69
|
+
export { assertSchemaRegistry, debugSchemaRegistry };
|
|
70
|
+
|
|
71
|
+
//# sourceMappingURL=assertSchemaRegistry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"assertSchemaRegistry.js","names":[],"sources":["../../src/forms/assertSchemaRegistry.ts"],"sourcesContent":["import type { SchemaIndex, SchemaNode, SchemaRenderable } from '@verbb/plugin-kit-forms';\n\nimport { isBuiltinFormFieldType } from './builtin-field-loaders.js';\nimport { getFormComponentRegistry, getFormFieldRegistry } from './registry.js';\n\nexport type AssertSchemaRegistryOptions = {\n /** When true, throw on the first missing registry key instead of collecting all. */\n failFast?: boolean;\n};\n\nexport type SchemaRegistryIssue = {\n path: string;\n kind: 'field' | 'component';\n key: string;\n};\n\nconst isRecord = (value: unknown): value is Record<string, unknown> => {\n return Boolean(value) && typeof value === 'object' && !Array.isArray(value);\n};\n\nconst walkSchema = (\n schema: SchemaRenderable,\n path: string,\n visit: (node: SchemaNode, path: string) => void,\n): void => {\n if (typeof schema === 'string') {\n return;\n }\n\n if (Array.isArray(schema)) {\n schema.forEach((item, index) => {\n if (typeof item === 'string' || !isRecord(item)) {\n return;\n }\n\n const itemPath = `${path}[${index}]`;\n visit(item as SchemaNode, itemPath);\n walkSchema(item as SchemaRenderable, itemPath, visit);\n });\n return;\n }\n\n if (!isRecord(schema)) {\n return;\n }\n\n const node = schema as SchemaNode;\n visit(node, path);\n\n if (node.children) {\n walkSchema(node.children as SchemaRenderable, `${path}.children`, visit);\n }\n\n if (node.schema) {\n walkSchema(node.schema as SchemaRenderable, `${path}.schema`, visit);\n }\n};\n\n/**\n * Walk a SchemaForm tree and verify every `$field` / `$cmp` key is registered.\n * Use in dev/test bootstraps for large plugins (Formie-scale) before shipping CP screens.\n */\nexport const assertSchemaRegistry = (\n schema: SchemaRenderable,\n options: AssertSchemaRegistryOptions = {},\n): SchemaRegistryIssue[] => {\n const { failFast = false } = options;\n\n const fieldRegistry = getFormFieldRegistry();\n const componentRegistry = getFormComponentRegistry();\n const issues: SchemaRegistryIssue[] = [];\n\n walkSchema(schema, 'schema', (node, nodePath) => {\n if (node.$field) {\n const key = String(node.$field);\n if (!fieldRegistry[key] && !isBuiltinFormFieldType(key)) {\n const issue: SchemaRegistryIssue = { path: nodePath, kind: 'field', key };\n issues.push(issue);\n if (failFast) {\n throw new Error(`SchemaForm: unregistered field \"${key}\" at ${nodePath}`);\n }\n }\n }\n\n if (node.$cmp) {\n const key = String(node.$cmp);\n if (!componentRegistry[key]) {\n const issue: SchemaRegistryIssue = { path: nodePath, kind: 'component', key };\n issues.push(issue);\n if (failFast) {\n throw new Error(`SchemaForm: unregistered component \"${key}\" at ${nodePath}`);\n }\n }\n }\n });\n\n return issues;\n};\n\n/** Dev helper: log registry gaps for a schema index root tree. */\nexport const debugSchemaRegistry = (\n schemaIndex: SchemaIndex | null | undefined,\n options?: AssertSchemaRegistryOptions,\n): SchemaRegistryIssue[] => {\n if (!schemaIndex?.schema) {\n return [];\n }\n\n const issues = assertSchemaRegistry(schemaIndex.schema, options);\n\n if (issues.length) {\n console.warn('[plugin-kit] SchemaForm registry gaps:', issues);\n }\n\n return issues;\n};\n"],"mappings":";;;AAgBA,IAAM,YAAY,UAAqD;AACnE,QAAO,QAAQ,MAAM,IAAI,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,MAAM;;AAG/E,IAAM,cACF,QACA,MACA,UACO;AACP,KAAI,OAAO,WAAW,SAClB;AAGJ,KAAI,MAAM,QAAQ,OAAO,EAAE;AACvB,SAAO,SAAS,MAAM,UAAU;AAC5B,OAAI,OAAO,SAAS,YAAY,CAAC,SAAS,KAAK,CAC3C;GAGJ,MAAM,WAAW,GAAG,KAAK,GAAG,MAAM;AAClC,SAAM,MAAoB,SAAS;AACnC,cAAW,MAA0B,UAAU,MAAM;IACvD;AACF;;AAGJ,KAAI,CAAC,SAAS,OAAO,CACjB;CAGJ,MAAM,OAAO;AACb,OAAM,MAAM,KAAK;AAEjB,KAAI,KAAK,SACL,YAAW,KAAK,UAA8B,GAAG,KAAK,YAAY,MAAM;AAG5E,KAAI,KAAK,OACL,YAAW,KAAK,QAA4B,GAAG,KAAK,UAAU,MAAM;;;;;;AAQ5E,IAAa,wBACT,QACA,UAAuC,EAAE,KACjB;CACxB,MAAM,EAAE,WAAW,UAAU;CAE7B,MAAM,gBAAgB,sBAAsB;CAC5C,MAAM,oBAAoB,0BAA0B;CACpD,MAAM,SAAgC,EAAE;AAExC,YAAW,QAAQ,WAAW,MAAM,aAAa;AAC7C,MAAI,KAAK,QAAQ;GACb,MAAM,MAAM,OAAO,KAAK,OAAO;AAC/B,OAAI,CAAC,cAAc,QAAQ,CAAC,uBAAuB,IAAI,EAAE;IACrD,MAAM,QAA6B;KAAE,MAAM;KAAU,MAAM;KAAS;KAAK;AACzE,WAAO,KAAK,MAAM;AAClB,QAAI,SACA,OAAM,IAAI,MAAM,mCAAmC,IAAI,OAAO,WAAW;;;AAKrF,MAAI,KAAK,MAAM;GACX,MAAM,MAAM,OAAO,KAAK,KAAK;AAC7B,OAAI,CAAC,kBAAkB,MAAM;IACzB,MAAM,QAA6B;KAAE,MAAM;KAAU,MAAM;KAAa;KAAK;AAC7E,WAAO,KAAK,MAAM;AAClB,QAAI,SACA,OAAM,IAAI,MAAM,uCAAuC,IAAI,OAAO,WAAW;;;GAI3F;AAEF,QAAO;;;AAIX,IAAa,uBACT,aACA,YACwB;AACxB,KAAI,CAAC,aAAa,OACd,QAAO,EAAE;CAGb,MAAM,SAAS,qBAAqB,YAAY,QAAQ,QAAQ;AAEhE,KAAI,OAAO,OACP,SAAQ,KAAK,0CAA0C,OAAO;AAGlE,QAAO"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { SchemaFormFieldComponent } from './engine/context.js';
|
|
2
|
+
type BuiltinFieldLoader = () => Promise<SchemaFormFieldComponent>;
|
|
3
|
+
/**
|
|
4
|
+
* Built-in SchemaForm `$field` types load on first render so CP bundles only pay for
|
|
5
|
+
* field modules that appear in the active schema (e.g. no CodeMirror until `codeEditor`).
|
|
6
|
+
*/
|
|
7
|
+
export declare const builtinFormFieldLoaders: Record<string, BuiltinFieldLoader>;
|
|
8
|
+
export declare const isBuiltinFormFieldType: (name: string) => boolean;
|
|
9
|
+
export declare const loadBuiltinFormField: (name: string) => Promise<SchemaFormFieldComponent | null>;
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=builtin-field-loaders.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"builtin-field-loaders.d.ts","sourceRoot":"","sources":["../../src/forms/builtin-field-loaders.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AAEpE,KAAK,kBAAkB,GAAG,MAAM,OAAO,CAAC,wBAAwB,CAAC,CAAC;AAElE;;;GAGG;AACH,eAAO,MAAM,uBAAuB,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAatE,CAAC;AAEF,eAAO,MAAM,sBAAsB,GAAI,MAAM,MAAM,KAAG,OAErD,CAAC;AAEF,eAAO,MAAM,oBAAoB,GAAU,MAAM,MAAM,KAAG,OAAO,CAAC,wBAAwB,GAAG,IAAI,CAQhG,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
//#region src/forms/builtin-field-loaders.ts
|
|
2
|
+
/**
|
|
3
|
+
* Built-in SchemaForm `$field` types load on first render so CP bundles only pay for
|
|
4
|
+
* field modules that appear in the active schema (e.g. no CodeMirror until `codeEditor`).
|
|
5
|
+
*/
|
|
6
|
+
var builtinFormFieldLoaders = {
|
|
7
|
+
text: async () => (await import("./fields/TextField.js")).TextField,
|
|
8
|
+
textarea: async () => (await import("./fields/TextareaField.js")).TextareaField,
|
|
9
|
+
number: async () => (await import("./fields/NumberField.js")).NumberField,
|
|
10
|
+
select: async () => (await import("./fields/SelectField.js")).SelectField,
|
|
11
|
+
lightswitch: async () => (await import("./fields/LightswitchField.js")).LightswitchField,
|
|
12
|
+
color: async () => (await import("./fields/ColorField.js")).ColorField,
|
|
13
|
+
radioGroup: async () => (await import("./fields/RadioGroupField.js")).RadioGroupField,
|
|
14
|
+
checkboxSelect: async () => (await import("./fields/CheckboxSelectField.js")).CheckboxSelectField,
|
|
15
|
+
combobox: async () => (await import("./fields/ComboboxField.js")).ComboboxField,
|
|
16
|
+
group: async () => (await import("./fields/GroupField.js")).GroupField,
|
|
17
|
+
date: async () => (await import("./fields/DateTimeField.js")).DateTimeField,
|
|
18
|
+
codeEditor: async () => (await import("./fields/CodeEditorField.js")).CodeEditorField
|
|
19
|
+
};
|
|
20
|
+
var isBuiltinFormFieldType = (name) => {
|
|
21
|
+
return Object.prototype.hasOwnProperty.call(builtinFormFieldLoaders, name);
|
|
22
|
+
};
|
|
23
|
+
var loadBuiltinFormField = async (name) => {
|
|
24
|
+
const loader = builtinFormFieldLoaders[name];
|
|
25
|
+
if (!loader) return null;
|
|
26
|
+
return loader();
|
|
27
|
+
};
|
|
28
|
+
//#endregion
|
|
29
|
+
export { isBuiltinFormFieldType, loadBuiltinFormField };
|
|
30
|
+
|
|
31
|
+
//# sourceMappingURL=builtin-field-loaders.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"builtin-field-loaders.js","names":[],"sources":["../../src/forms/builtin-field-loaders.ts"],"sourcesContent":["import type { SchemaFormFieldComponent } from './engine/context.js';\n\ntype BuiltinFieldLoader = () => Promise<SchemaFormFieldComponent>;\n\n/**\n * Built-in SchemaForm `$field` types load on first render so CP bundles only pay for\n * field modules that appear in the active schema (e.g. no CodeMirror until `codeEditor`).\n */\nexport const builtinFormFieldLoaders: Record<string, BuiltinFieldLoader> = {\n text: async () => (await import('./fields/TextField.js')).TextField as SchemaFormFieldComponent,\n textarea: async () => (await import('./fields/TextareaField.js')).TextareaField as SchemaFormFieldComponent,\n number: async () => (await import('./fields/NumberField.js')).NumberField as SchemaFormFieldComponent,\n select: async () => (await import('./fields/SelectField.js')).SelectField as SchemaFormFieldComponent,\n lightswitch: async () => (await import('./fields/LightswitchField.js')).LightswitchField as SchemaFormFieldComponent,\n color: async () => (await import('./fields/ColorField.js')).ColorField as SchemaFormFieldComponent,\n radioGroup: async () => (await import('./fields/RadioGroupField.js')).RadioGroupField as SchemaFormFieldComponent,\n checkboxSelect: async () => (await import('./fields/CheckboxSelectField.js')).CheckboxSelectField as SchemaFormFieldComponent,\n combobox: async () => (await import('./fields/ComboboxField.js')).ComboboxField as SchemaFormFieldComponent,\n group: async () => (await import('./fields/GroupField.js')).GroupField as SchemaFormFieldComponent,\n date: async () => (await import('./fields/DateTimeField.js')).DateTimeField as SchemaFormFieldComponent,\n codeEditor: async () => (await import('./fields/CodeEditorField.js')).CodeEditorField as SchemaFormFieldComponent,\n};\n\nexport const isBuiltinFormFieldType = (name: string): boolean => {\n return Object.prototype.hasOwnProperty.call(builtinFormFieldLoaders, name);\n};\n\nexport const loadBuiltinFormField = async (name: string): Promise<SchemaFormFieldComponent | null> => {\n const loader = builtinFormFieldLoaders[name];\n\n if (!loader) {\n return null;\n }\n\n return loader();\n};\n"],"mappings":";;;;;AAQA,IAAa,0BAA8D;CACvE,MAAM,aAAa,MAAM,OAAO,0BAA0B;CAC1D,UAAU,aAAa,MAAM,OAAO,8BAA8B;CAClE,QAAQ,aAAa,MAAM,OAAO,4BAA4B;CAC9D,QAAQ,aAAa,MAAM,OAAO,4BAA4B;CAC9D,aAAa,aAAa,MAAM,OAAO,iCAAiC;CACxE,OAAO,aAAa,MAAM,OAAO,2BAA2B;CAC5D,YAAY,aAAa,MAAM,OAAO,gCAAgC;CACtE,gBAAgB,aAAa,MAAM,OAAO,oCAAoC;CAC9E,UAAU,aAAa,MAAM,OAAO,8BAA8B;CAClE,OAAO,aAAa,MAAM,OAAO,2BAA2B;CAC5D,MAAM,aAAa,MAAM,OAAO,8BAA8B;CAC9D,YAAY,aAAa,MAAM,OAAO,gCAAgC;CACzE;AAED,IAAa,0BAA0B,SAA0B;AAC7D,QAAO,OAAO,UAAU,eAAe,KAAK,yBAAyB,KAAK;;AAG9E,IAAa,uBAAuB,OAAO,SAA2D;CAClG,MAAM,SAAS,wBAAwB;AAEvC,KAAI,CAAC,OACD,QAAO;AAGX,QAAO,QAAQ"}
|
|
@@ -1,10 +1,16 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { ReactNode } from 'react';
|
|
2
|
+
import { SchemaFormComponentProps } from '../engine/context.js';
|
|
3
|
+
/**
|
|
4
|
+
* Schema `$cmp: 'FieldWrap'` — labels a horizontal cluster of nested fields and
|
|
5
|
+
* surfaces grouped nested errors on the wrapper (kit v1 FieldWrap contract).
|
|
6
|
+
*/
|
|
2
7
|
export declare const FieldWrap: (({ name, label, instructions, required, warning, children, schemaNode, }: SchemaFormComponentProps & {
|
|
3
8
|
name?: string;
|
|
4
9
|
label?: string;
|
|
5
10
|
instructions?: string;
|
|
6
11
|
required?: boolean;
|
|
7
12
|
warning?: string;
|
|
13
|
+
children?: ReactNode;
|
|
8
14
|
}) => import("react/jsx-runtime").JSX.Element) & {
|
|
9
15
|
usesSchemaNode: true;
|
|
10
16
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FieldWrap.d.ts","sourceRoot":"","sources":["../../../src/forms/components/FieldWrap.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"FieldWrap.d.ts","sourceRoot":"","sources":["../../../src/forms/components/FieldWrap.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAiC,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAGtE,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AAsBrE;;;GAGG;AACH,eAAO,MAAM,SAAS,6EAQnB,wBAAwB,GAAG;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,SAAS,CAAC;CACxB;;CAyEoC,CAAC"}
|
|
@@ -1,20 +1,9 @@
|
|
|
1
|
-
import { FieldLayout
|
|
1
|
+
import { FieldLayout } from "../Field.js";
|
|
2
2
|
import { useSchemaEngineContext } from "../engine/context.js";
|
|
3
|
+
import { collectSchemaFieldNames } from "./schemaErrors.js";
|
|
3
4
|
import { useMemo, useSyncExternalStore } from "react";
|
|
4
5
|
import { jsx } from "react/jsx-runtime";
|
|
5
6
|
//#region src/forms/components/FieldWrap.tsx
|
|
6
|
-
var collectFieldNames = (schema, names) => {
|
|
7
|
-
if (Array.isArray(schema)) {
|
|
8
|
-
schema.forEach((entry) => {
|
|
9
|
-
collectFieldNames(entry, names);
|
|
10
|
-
});
|
|
11
|
-
return;
|
|
12
|
-
}
|
|
13
|
-
if (!schema || typeof schema !== "object") return;
|
|
14
|
-
if (schema.$field && typeof schema.name === "string" && schema.name) names.add(schema.name);
|
|
15
|
-
if (Array.isArray(schema.children)) collectFieldNames(schema.children, names);
|
|
16
|
-
if (Array.isArray(schema.schema)) collectFieldNames(schema.schema, names);
|
|
17
|
-
};
|
|
18
7
|
var ATTRIBUTE_MESSAGE_PATTERN = /^(.+?) (cannot be blank\.|must be .+)$/;
|
|
19
8
|
var formatWrapperMessage = (message, wrapperLabel) => {
|
|
20
9
|
if (!wrapperLabel) return message;
|
|
@@ -25,13 +14,15 @@ var formatWrapperMessage = (message, wrapperLabel) => {
|
|
|
25
14
|
}
|
|
26
15
|
return `${wrapperLabel} ${message}`;
|
|
27
16
|
};
|
|
17
|
+
/**
|
|
18
|
+
* Schema `$cmp: 'FieldWrap'` — labels a horizontal cluster of nested fields and
|
|
19
|
+
* surfaces grouped nested errors on the wrapper (kit v1 FieldWrap contract).
|
|
20
|
+
*/
|
|
28
21
|
var FieldWrap = Object.assign(({ name, label, instructions, required, warning, children, schemaNode }) => {
|
|
29
22
|
const form = useSchemaEngineContext();
|
|
30
23
|
const fieldName = name || label || "field";
|
|
31
24
|
const nestedFieldNames = useMemo(() => {
|
|
32
|
-
|
|
33
|
-
collectFieldNames(schemaNode?.children || [], names);
|
|
34
|
-
return Array.from(names);
|
|
25
|
+
return Array.from(collectSchemaFieldNames(schemaNode?.children || []));
|
|
35
26
|
}, [schemaNode]);
|
|
36
27
|
const errorMap = useSyncExternalStore(form.store.subscribe.bind(form.store), () => {
|
|
37
28
|
return form.getErrorMapFields() || {};
|
|
@@ -68,13 +59,16 @@ var FieldWrap = Object.assign(({ name, label, instructions, required, warning, c
|
|
|
68
59
|
name,
|
|
69
60
|
nestedFieldNames
|
|
70
61
|
]),
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
62
|
+
children: /* @__PURE__ */ jsx("div", {
|
|
63
|
+
"data-pk-field-wrap-controls": "",
|
|
64
|
+
style: {
|
|
65
|
+
display: "flex",
|
|
66
|
+
alignItems: "center",
|
|
67
|
+
flexDirection: "row",
|
|
68
|
+
flexWrap: "wrap",
|
|
69
|
+
gap: "0.5rem"
|
|
70
|
+
},
|
|
71
|
+
children
|
|
78
72
|
})
|
|
79
73
|
});
|
|
80
74
|
}, { usesSchemaNode: true });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FieldWrap.js","names":[],"sources":["../../../src/forms/components/FieldWrap.tsx"],"sourcesContent":["import { useMemo, useSyncExternalStore } from 'react';\n\nimport { FieldLayout
|
|
1
|
+
{"version":3,"file":"FieldWrap.js","names":[],"sources":["../../../src/forms/components/FieldWrap.tsx"],"sourcesContent":["import { useMemo, useSyncExternalStore, type ReactNode } from 'react';\n\nimport { FieldLayout } from '../Field.js';\nimport type { SchemaFormComponentProps } from '../engine/context.js';\nimport { useSchemaEngineContext } from '../engine/context.js';\nimport type { SchemaRenderable } from '@verbb/plugin-kit-forms';\n\nimport { collectSchemaFieldNames } from './schemaErrors.js';\n\nconst ATTRIBUTE_MESSAGE_PATTERN = /^(.+?) (cannot be blank\\.|must be .+)$/;\n\nconst formatWrapperMessage = (message: string, wrapperLabel?: string) => {\n if (!wrapperLabel) {\n return message;\n }\n\n const match = String(message).match(ATTRIBUTE_MESSAGE_PATTERN);\n if (match) {\n const [, , suffix] = match;\n return `${wrapperLabel} ${suffix}`;\n }\n\n return `${wrapperLabel} ${message}`;\n};\n\n/**\n * Schema `$cmp: 'FieldWrap'` — labels a horizontal cluster of nested fields and\n * surfaces grouped nested errors on the wrapper (kit v1 FieldWrap contract).\n */\nexport const FieldWrap = Object.assign(({\n name,\n label,\n instructions,\n required,\n warning,\n children,\n schemaNode,\n}: SchemaFormComponentProps & {\n name?: string;\n label?: string;\n instructions?: string;\n required?: boolean;\n warning?: string;\n children?: ReactNode;\n}) => {\n const form = useSchemaEngineContext();\n const fieldName = name || label || 'field';\n const nestedFieldNames = useMemo(() => {\n return Array.from(collectSchemaFieldNames(schemaNode?.children || [] as SchemaRenderable));\n }, [schemaNode]);\n const errorMap = useSyncExternalStore(\n form.store.subscribe.bind(form.store),\n () => {\n return (form.getErrorMapFields() || {}) as Record<string, string[]>;\n },\n () => {\n return {} as Record<string, string[]>;\n },\n );\n const errors = useMemo(() => {\n if (name && typeof form?.getGroupedErrorsForPath === 'function') {\n return form.getGroupedErrorsForPath(name) || [];\n }\n\n if (!nestedFieldNames.length) {\n return [];\n }\n\n const groupedErrors: string[] = [];\n\n nestedFieldNames.forEach((fieldPath) => {\n (errorMap[fieldPath] || []).forEach((message: string) => {\n groupedErrors.push(formatWrapperMessage(String(message), label || name || fieldName));\n });\n\n Object.entries(errorMap).forEach(([errorPath, messages]) => {\n if (!errorPath.startsWith(`${fieldPath}.`)) {\n return;\n }\n\n (messages || []).forEach((message: string) => {\n groupedErrors.push(formatWrapperMessage(String(message), label || name || fieldName));\n });\n });\n });\n\n return Array.from(new Set(groupedErrors));\n }, [errorMap, fieldName, form, label, name, nestedFieldNames]);\n\n return (\n <FieldLayout\n name={fieldName}\n label={label}\n instructions={instructions}\n required={required}\n warning={warning}\n errors={errors}\n >\n {/*\n Horizontal control cluster (v1 FieldWrap). Nested pk-fields shrink via\n `[data-pk-field-wrap-controls] pk-field` in kit-react style.css — not a\n global unlabeled FieldLayout rule (that broke full-width conditions tables).\n */}\n <div\n data-pk-field-wrap-controls=\"\"\n style={{\n display: 'flex',\n alignItems: 'center',\n flexDirection: 'row',\n flexWrap: 'wrap',\n gap: '0.5rem',\n }}\n >\n {children}\n </div>\n </FieldLayout>\n );\n}, { usesSchemaNode: true as const });\n"],"mappings":";;;;;;AASA,IAAM,4BAA4B;AAElC,IAAM,wBAAwB,SAAiB,iBAA0B;AACrE,KAAI,CAAC,aACD,QAAO;CAGX,MAAM,QAAQ,OAAO,QAAQ,CAAC,MAAM,0BAA0B;AAC9D,KAAI,OAAO;EACP,MAAM,KAAK,UAAU;AACrB,SAAO,GAAG,aAAa,GAAG;;AAG9B,QAAO,GAAG,aAAa,GAAG;;;;;;AAO9B,IAAa,YAAY,OAAO,QAAQ,EACpC,MACA,OACA,cACA,UACA,SACA,UACA,iBAQE;CACF,MAAM,OAAO,wBAAwB;CACrC,MAAM,YAAY,QAAQ,SAAS;CACnC,MAAM,mBAAmB,cAAc;AACnC,SAAO,MAAM,KAAK,wBAAwB,YAAY,YAAY,EAAE,CAAqB,CAAC;IAC3F,CAAC,WAAW,CAAC;CAChB,MAAM,WAAW,qBACb,KAAK,MAAM,UAAU,KAAK,KAAK,MAAM,QAC/B;AACF,SAAQ,KAAK,mBAAmB,IAAI,EAAE;UAEpC;AACF,SAAO,EAAE;GAEhB;AA+BD,QACI,oBAAC,aAAD;EACI,MAAM;EACC;EACO;EACJ;EACD;EACD,QArCD,cAAc;AACzB,OAAI,QAAQ,OAAO,MAAM,4BAA4B,WACjD,QAAO,KAAK,wBAAwB,KAAK,IAAI,EAAE;AAGnD,OAAI,CAAC,iBAAiB,OAClB,QAAO,EAAE;GAGb,MAAM,gBAA0B,EAAE;AAElC,oBAAiB,SAAS,cAAc;AACpC,KAAC,SAAS,cAAc,EAAE,EAAE,SAAS,YAAoB;AACrD,mBAAc,KAAK,qBAAqB,OAAO,QAAQ,EAAE,SAAS,QAAQ,UAAU,CAAC;MACvF;AAEF,WAAO,QAAQ,SAAS,CAAC,SAAS,CAAC,WAAW,cAAc;AACxD,SAAI,CAAC,UAAU,WAAW,GAAG,UAAU,GAAG,CACtC;AAGJ,MAAC,YAAY,EAAE,EAAE,SAAS,YAAoB;AAC1C,oBAAc,KAAK,qBAAqB,OAAO,QAAQ,EAAE,SAAS,QAAQ,UAAU,CAAC;OACvF;MACJ;KACJ;AAEF,UAAO,MAAM,KAAK,IAAI,IAAI,cAAc,CAAC;KAC1C;GAAC;GAAU;GAAW;GAAM;GAAO;GAAM;GAAiB,CAS7C;YAOR,oBAAC,OAAD;GACI,+BAA4B;GAC5B,OAAO;IACH,SAAS;IACT,YAAY;IACZ,eAAe;IACf,UAAU;IACV,KAAK;IACR;GAEA;GACC,CAAA;EACI,CAAA;GAEnB,EAAE,gBAAgB,MAAe,CAAC"}
|
|
@@ -1,21 +1,36 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { ReactNode } from 'react';
|
|
2
|
+
import { SchemaFormComponentProps } from '../engine/context.js';
|
|
3
|
+
import { SchemaNode } from '@verbb/plugin-kit-forms';
|
|
2
4
|
export declare const useModalTabsErrors: () => Record<string, boolean>;
|
|
3
|
-
|
|
5
|
+
type ModalTabsRootProps = SchemaFormComponentProps & {
|
|
6
|
+
children?: ReactNode;
|
|
7
|
+
className?: string;
|
|
8
|
+
value?: string;
|
|
9
|
+
defaultValue?: string;
|
|
10
|
+
};
|
|
11
|
+
/**
|
|
12
|
+
* Schema `$cmp: 'ModalTabs'` — wraps stock `Tabs` `variant="modal"`.
|
|
13
|
+
* Owns tab ↔ schema error mapping (same contract as kit v1 ModalTabs).
|
|
14
|
+
*/
|
|
15
|
+
declare const ModalTabs: (({ children, schemaNode, schema, _id: _schemaId, _data: _schemaData, className, value: controlledValue, defaultValue, ...props }: ModalTabsRootProps & {
|
|
16
|
+
schema?: SchemaNode;
|
|
17
|
+
_id?: string;
|
|
18
|
+
_data?: Record<string, unknown>;
|
|
19
|
+
}) => import("react/jsx-runtime").JSX.Element) & {
|
|
4
20
|
usesSchemaNode: true;
|
|
5
21
|
};
|
|
6
|
-
declare function ModalTabsList({ children
|
|
7
|
-
|
|
8
|
-
children: any;
|
|
22
|
+
declare function ModalTabsList({ children }: {
|
|
23
|
+
children?: ReactNode;
|
|
9
24
|
}): import("react/jsx-runtime").JSX.Element;
|
|
10
|
-
declare function ModalTabsTrigger({ children, value, ...props }: {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
25
|
+
declare function ModalTabsTrigger({ children, value, className, ...props }: {
|
|
26
|
+
children?: ReactNode;
|
|
27
|
+
value?: string;
|
|
28
|
+
className?: string;
|
|
14
29
|
}): import("react/jsx-runtime").JSX.Element;
|
|
15
|
-
declare function ModalTabsContent({ children,
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
value
|
|
30
|
+
declare function ModalTabsContent({ children, className, ...props }: {
|
|
31
|
+
children?: ReactNode;
|
|
32
|
+
className?: string;
|
|
33
|
+
value?: string;
|
|
19
34
|
}): import("react/jsx-runtime").JSX.Element;
|
|
20
35
|
export { ModalTabs, ModalTabsList, ModalTabsTrigger, ModalTabsContent, };
|
|
21
36
|
//# sourceMappingURL=ModalTabs.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ModalTabs.d.ts","sourceRoot":"","sources":["../../../src/forms/components/ModalTabs.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ModalTabs.d.ts","sourceRoot":"","sources":["../../../src/forms/components/ModalTabs.tsx"],"names":[],"mappings":"AAAA,OAAO,EAQH,KAAK,SAAS,EACjB,MAAM,OAAO,CAAC;AAKf,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AAErE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAM1D,eAAO,MAAM,kBAAkB,+BAE9B,CAAC;AAEF,KAAK,kBAAkB,GAAG,wBAAwB,GAAG;IACjD,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;CACzB,CAAC;AA8DF;;;GAGG;AACH,QAAA,MAAM,SAAS,qIAYZ,kBAAkB,GAAG;IACpB,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;;CAmIoC,CAAC;AAEtC,iBAAS,aAAa,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,CAAC,EAAE,SAAS,CAAA;CAAE,2CAG5D;AAED,iBAAS,gBAAgB,CAAC,EACtB,QAAQ,EACR,KAAK,EACL,SAAS,EACT,GAAG,KAAK,EACX,EAAE;IACC,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB,2CAsBA;AAED,iBAAS,gBAAgB,CAAC,EACtB,QAAQ,EACR,SAAS,EACT,GAAG,KAAK,EACX,EAAE;IACC,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB,2CAQA;AAED,OAAO,EACH,SAAS,EACT,aAAa,EACb,gBAAgB,EAChB,gBAAgB,GACnB,CAAC"}
|
|
@@ -1,22 +1,57 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import "../../utils/index.js";
|
|
4
|
-
import { ModalTabs as ModalTabs$1, ModalTabsContent as ModalTabsContent$1, ModalTabsList as ModalTabsList$1, ModalTabsTrigger as ModalTabsTrigger$1 } from "../../components/ModalTabs.js";
|
|
5
|
-
import "../../components/index.js";
|
|
1
|
+
import { Icon } from "../../components/Icon.js";
|
|
2
|
+
import { Tab, TabPanel, Tabs } from "../../components/Tabs.js";
|
|
6
3
|
import { SchemaEngineContext } from "../engine/context.js";
|
|
7
|
-
import {
|
|
4
|
+
import { schemaSubtreeHasErrors } from "./schemaErrors.js";
|
|
5
|
+
import { cn } from "../../utils/cn.js";
|
|
6
|
+
import { Fragment, createContext, useCallback, useContext, useEffect, useMemo, useState } from "react";
|
|
8
7
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
9
|
-
import {
|
|
10
|
-
import { faTriangleExclamation } from "@fortawesome/pro-solid-svg-icons";
|
|
8
|
+
import { evaluateCondition } from "@verbb/plugin-kit-forms";
|
|
11
9
|
//#region src/forms/components/ModalTabs.tsx
|
|
12
10
|
var ModalTabsErrorsContext = createContext({});
|
|
13
11
|
var useModalTabsErrors = () => {
|
|
14
12
|
return useContext(ModalTabsErrorsContext);
|
|
15
13
|
};
|
|
16
|
-
var
|
|
14
|
+
var isRecord = (value) => {
|
|
15
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* Collect ModalTabsTrigger handles + optional tab-level `if` from schema.
|
|
19
|
+
* O(schema nodes under this ModalTabs) once per schema identity — not nested field visibility.
|
|
20
|
+
*/
|
|
21
|
+
var collectTabHandles = (node) => {
|
|
22
|
+
if (!node?.children) return [];
|
|
23
|
+
const handles = [];
|
|
24
|
+
const visit = (items) => {
|
|
25
|
+
if (!Array.isArray(items)) return;
|
|
26
|
+
items.forEach((item) => {
|
|
27
|
+
if (!isRecord(item)) return;
|
|
28
|
+
const child = item;
|
|
29
|
+
if (child.$cmp === "ModalTabsTrigger") {
|
|
30
|
+
const value = typeof child.props?.value === "string" ? child.props.value : typeof child.value === "string" ? child.value : "";
|
|
31
|
+
if (value) handles.push({
|
|
32
|
+
value,
|
|
33
|
+
if: typeof child.if === "string" ? child.if : void 0
|
|
34
|
+
});
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
if (child.children) visit(child.children);
|
|
38
|
+
});
|
|
39
|
+
};
|
|
40
|
+
visit(node.children);
|
|
41
|
+
return handles;
|
|
42
|
+
};
|
|
43
|
+
/**
|
|
44
|
+
* Schema `$cmp: 'ModalTabs'` — wraps stock `Tabs` `variant="modal"`.
|
|
45
|
+
* Owns tab ↔ schema error mapping (same contract as kit v1 ModalTabs).
|
|
46
|
+
*/
|
|
47
|
+
var ModalTabs = Object.assign(({ children, schemaNode, schema, _id: _schemaId, _data: _schemaData, className, value: controlledValue, defaultValue = "", ...props }) => {
|
|
17
48
|
const form = useContext(SchemaEngineContext);
|
|
18
49
|
const node = schemaNode ?? schema;
|
|
19
50
|
const [tabErrors, setTabErrors] = useState({});
|
|
51
|
+
const [uncontrolledValue, setUncontrolledValue] = useState(() => controlledValue ?? defaultValue ?? "");
|
|
52
|
+
const isControlled = controlledValue !== void 0 && controlledValue !== null;
|
|
53
|
+
const resolvedValue = isControlled ? String(controlledValue) : uncontrolledValue;
|
|
54
|
+
const tabHandles = useMemo(() => collectTabHandles(node), [node]);
|
|
20
55
|
const getTabErrors = useCallback(() => {
|
|
21
56
|
const errors = {};
|
|
22
57
|
if (!node?.children || !form?.getErrorMapFields) return errors;
|
|
@@ -25,10 +60,21 @@ var ModalTabs = Object.assign(({ children, schema, schemaNode, ...props }) => {
|
|
|
25
60
|
if (typeof item !== "object" || item === null || Array.isArray(item)) return;
|
|
26
61
|
const childNode = item;
|
|
27
62
|
const value = typeof childNode.props?.value === "string" ? childNode.props.value : "";
|
|
28
|
-
if (childNode.$cmp === "ModalTabsContent" && value) errors[value] =
|
|
63
|
+
if (childNode.$cmp === "ModalTabsContent" && value) errors[value] = schemaSubtreeHasErrors(formErrors, childNode.children || []);
|
|
29
64
|
});
|
|
30
65
|
return errors;
|
|
31
66
|
}, [form, node]);
|
|
67
|
+
/** First tab whose tab-level `if` (if any) currently passes. */
|
|
68
|
+
const getFirstVisibleTabValue = useCallback((values) => {
|
|
69
|
+
for (const handle of tabHandles) if (!handle.if || evaluateCondition(handle.if, values)) return handle.value;
|
|
70
|
+
return tabHandles[0]?.value ?? "";
|
|
71
|
+
}, [tabHandles]);
|
|
72
|
+
const isTabVisible = useCallback((tabValue, values) => {
|
|
73
|
+
const handle = tabHandles.find((item) => item.value === tabValue);
|
|
74
|
+
if (!handle) return false;
|
|
75
|
+
if (!handle.if) return true;
|
|
76
|
+
return evaluateCondition(handle.if, values);
|
|
77
|
+
}, [tabHandles]);
|
|
32
78
|
useEffect(() => {
|
|
33
79
|
if (!form?.store?.subscribe) {
|
|
34
80
|
setTabErrors(getTabErrors());
|
|
@@ -36,44 +82,67 @@ var ModalTabs = Object.assign(({ children, schema, schemaNode, ...props }) => {
|
|
|
36
82
|
}
|
|
37
83
|
const update = () => {
|
|
38
84
|
setTabErrors(getTabErrors());
|
|
85
|
+
if (isControlled) return;
|
|
86
|
+
const { values } = form.store.state;
|
|
87
|
+
const formValues = values && typeof values === "object" ? values : {};
|
|
88
|
+
if (!resolvedValue || isTabVisible(resolvedValue, formValues)) return;
|
|
89
|
+
const next = getFirstVisibleTabValue(formValues);
|
|
90
|
+
if (next && next !== resolvedValue) setUncontrolledValue(next);
|
|
39
91
|
};
|
|
40
92
|
update();
|
|
41
93
|
return form.store.subscribe(update);
|
|
42
|
-
}, [
|
|
94
|
+
}, [
|
|
95
|
+
form,
|
|
96
|
+
getFirstVisibleTabValue,
|
|
97
|
+
getTabErrors,
|
|
98
|
+
isControlled,
|
|
99
|
+
isTabVisible,
|
|
100
|
+
resolvedValue
|
|
101
|
+
]);
|
|
43
102
|
return /* @__PURE__ */ jsx(ModalTabsErrorsContext.Provider, {
|
|
44
103
|
value: tabErrors,
|
|
45
|
-
children: /* @__PURE__ */ jsx(
|
|
104
|
+
children: /* @__PURE__ */ jsx(Tabs, {
|
|
105
|
+
variant: "modal",
|
|
106
|
+
value: resolvedValue,
|
|
107
|
+
className: cn("h-full min-h-0", className),
|
|
46
108
|
...props,
|
|
109
|
+
onPkChange: (event) => {
|
|
110
|
+
event.stopPropagation();
|
|
111
|
+
const next = event.detail?.value;
|
|
112
|
+
if (typeof next !== "string" || !next || isControlled) return;
|
|
113
|
+
setUncontrolledValue(next);
|
|
114
|
+
},
|
|
47
115
|
children
|
|
48
116
|
})
|
|
49
117
|
});
|
|
50
118
|
}, { usesSchemaNode: true });
|
|
51
|
-
function ModalTabsList({ children
|
|
52
|
-
return /* @__PURE__ */ jsx(
|
|
53
|
-
...props,
|
|
54
|
-
children
|
|
55
|
-
});
|
|
119
|
+
function ModalTabsList({ children }) {
|
|
120
|
+
return /* @__PURE__ */ jsx(Fragment, { children });
|
|
56
121
|
}
|
|
57
|
-
function ModalTabsTrigger({ children, value, ...props }) {
|
|
122
|
+
function ModalTabsTrigger({ children, value, className, ...props }) {
|
|
58
123
|
const tabErrors = useModalTabsErrors();
|
|
59
|
-
const hasErrors = Boolean(tabErrors[value]);
|
|
60
|
-
return /* @__PURE__ */
|
|
124
|
+
const hasErrors = Boolean(value && tabErrors[value]);
|
|
125
|
+
return /* @__PURE__ */ jsx(Tab, {
|
|
61
126
|
value,
|
|
62
|
-
"data-has-errors": hasErrors,
|
|
63
|
-
className
|
|
127
|
+
"data-has-errors": hasErrors ? "true" : void 0,
|
|
128
|
+
className,
|
|
64
129
|
...props,
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
className: "
|
|
68
|
-
|
|
130
|
+
slot: "nav",
|
|
131
|
+
children: /* @__PURE__ */ jsxs("span", {
|
|
132
|
+
className: "inline-flex items-center gap-1",
|
|
133
|
+
children: [children, hasErrors ? /* @__PURE__ */ jsx(Icon, {
|
|
134
|
+
icon: "triangle-exclamation",
|
|
135
|
+
className: "block size-3"
|
|
136
|
+
}) : null]
|
|
137
|
+
})
|
|
69
138
|
});
|
|
70
139
|
}
|
|
71
|
-
function ModalTabsContent({ children,
|
|
72
|
-
return /* @__PURE__ */ jsx(
|
|
73
|
-
|
|
140
|
+
function ModalTabsContent({ children, className, ...props }) {
|
|
141
|
+
return /* @__PURE__ */ jsx(TabPanel, {
|
|
142
|
+
className,
|
|
74
143
|
...props,
|
|
75
144
|
children: /* @__PURE__ */ jsx("div", {
|
|
76
|
-
className:
|
|
145
|
+
className: "grid grid-cols-1 gap-4",
|
|
77
146
|
children
|
|
78
147
|
})
|
|
79
148
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ModalTabs.js","names":[],"sources":["../../../src/forms/components/ModalTabs.tsx"],"sourcesContent":["import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { faTriangleExclamation } from '@fortawesome/pro-solid-svg-icons';\n\nimport {\n ModalTabs as BaseModalTabs,\n ModalTabsList as BaseModalTabsList,\n ModalTabsTrigger as BaseModalTabsTrigger,\n ModalTabsContent as BaseModalTabsContent,\n} from '../../components';\n\nimport { cn } from '../../utils';\nimport { hasSchemaErrorsCached } from '../../utils/schemaIndexCache';\n\nimport {\n createContext, useCallback, useContext, useEffect, useState,\n} from 'react';\n\nimport type { SchemaFormComponentProps } from '../engine/context';\nimport { SchemaEngineContext } from '../engine/context';\nimport type { SchemaNode } from '../engine/SchemaIndex';\n\n// Create a context to pass tab error information down\nconst ModalTabsErrorsContext = createContext<Record<string, boolean>>({});\n\nexport const useModalTabsErrors = () => {\n return useContext(ModalTabsErrorsContext);\n};\n\nconst ModalTabs = Object.assign(({\n children, schema, schemaNode, ...props\n}: SchemaFormComponentProps) => {\n const form = useContext(SchemaEngineContext);\n const node = schemaNode ?? schema;\n\n const [tabErrors, setTabErrors] = useState<Record<string, boolean>>({});\n\n const getTabErrors = useCallback(() => {\n const errors: Record<string, boolean> = {};\n\n if (!node?.children || !form?.getErrorMapFields) {\n return errors;\n }\n\n const formErrors = form.getErrorMapFields?.() || {};\n\n // Process schema children to find tab content\n Object.values(node.children as Record<string, unknown>).forEach((item) => {\n if (typeof item !== 'object' || item === null || Array.isArray(item)) {\n return;\n }\n\n const childNode = item as SchemaNode;\n const value = typeof childNode.props?.value === 'string' ? childNode.props.value : '';\n if (childNode.$cmp === 'ModalTabsContent' && value) {\n errors[value] = hasSchemaErrorsCached(formErrors, childNode.children || []);\n }\n });\n\n return errors;\n }, [form, node]);\n\n useEffect(() => {\n if (!form?.store?.subscribe) {\n setTabErrors(getTabErrors());\n return;\n }\n\n const update = () => {\n setTabErrors(getTabErrors());\n };\n\n update();\n const unsubscribe = form.store.subscribe(update);\n return unsubscribe;\n }, [form, getTabErrors]);\n\n return (\n <ModalTabsErrorsContext.Provider value={tabErrors}>\n <BaseModalTabs {...props}>{children}</BaseModalTabs>\n </ModalTabsErrorsContext.Provider>\n );\n}, { usesSchemaNode: true as const });\n\nfunction ModalTabsList({ children, ...props }) {\n return <BaseModalTabsList {...props}>{children}</BaseModalTabsList>;\n}\n\nfunction ModalTabsTrigger({ children, value, ...props }) {\n // Get tab errors from context\n const tabErrors = useModalTabsErrors();\n\n // Check if this specific tab has errors\n const hasErrors = Boolean(tabErrors[value]);\n\n return <BaseModalTabsTrigger\n value={value}\n data-has-errors={hasErrors}\n className={cn(\n 'flex items-center gap-1',\n hasErrors && 'text-error',\n )}\n {...props}\n >\n {children}\n\n {hasErrors && (\n <FontAwesomeIcon icon={faTriangleExclamation} className=\"block size-3\" />\n )}\n </BaseModalTabsTrigger>;\n}\n\nfunction ModalTabsContent({\n children, value, ...props\n}) {\n return (\n <BaseModalTabsContent value={value} {...props}>\n <div className={cn(\n 'grid grid-cols-1 gap-4',\n )}>{children}</div>\n </BaseModalTabsContent>\n );\n}\n\nexport {\n ModalTabs,\n ModalTabsList,\n ModalTabsTrigger,\n ModalTabsContent,\n};\n"],"mappings":";;;;;;;;;;;AAsBA,IAAM,yBAAyB,cAAuC,EAAE,CAAC;AAEzE,IAAa,2BAA2B;AACpC,QAAO,WAAW,uBAAuB;;AAG7C,IAAM,YAAY,OAAO,QAAQ,EAC7B,UAAU,QAAQ,YAAY,GAAG,YACL;CAC5B,MAAM,OAAO,WAAW,oBAAoB;CAC5C,MAAM,OAAO,cAAc;CAE3B,MAAM,CAAC,WAAW,gBAAgB,SAAkC,EAAE,CAAC;CAEvE,MAAM,eAAe,kBAAkB;EACnC,MAAM,SAAkC,EAAE;AAE1C,MAAI,CAAC,MAAM,YAAY,CAAC,MAAM,kBAC1B,QAAO;EAGX,MAAM,aAAa,KAAK,qBAAqB,IAAI,EAAE;AAGnD,SAAO,OAAO,KAAK,SAAoC,CAAC,SAAS,SAAS;AACtE,OAAI,OAAO,SAAS,YAAY,SAAS,QAAQ,MAAM,QAAQ,KAAK,CAChE;GAGJ,MAAM,YAAY;GAClB,MAAM,QAAQ,OAAO,UAAU,OAAO,UAAU,WAAW,UAAU,MAAM,QAAQ;AACnF,OAAI,UAAU,SAAS,sBAAsB,MACzC,QAAO,SAAS,sBAAsB,YAAY,UAAU,YAAY,EAAE,CAAC;IAEjF;AAEF,SAAO;IACR,CAAC,MAAM,KAAK,CAAC;AAEhB,iBAAgB;AACZ,MAAI,CAAC,MAAM,OAAO,WAAW;AACzB,gBAAa,cAAc,CAAC;AAC5B;;EAGJ,MAAM,eAAe;AACjB,gBAAa,cAAc,CAAC;;AAGhC,UAAQ;AAER,SADoB,KAAK,MAAM,UAAU,OAClC;IACR,CAAC,MAAM,aAAa,CAAC;AAExB,QACI,oBAAC,uBAAuB,UAAxB;EAAiC,OAAO;YACpC,oBAAC,aAAD;GAAe,GAAI;GAAQ;GAAyB,CAAA;EACtB,CAAA;GAEvC,EAAE,gBAAgB,MAAe,CAAC;AAErC,SAAS,cAAc,EAAE,UAAU,GAAG,SAAS;AAC3C,QAAO,oBAAC,iBAAD;EAAmB,GAAI;EAAQ;EAA6B,CAAA;;AAGvE,SAAS,iBAAiB,EAAE,UAAU,OAAO,GAAG,SAAS;CAErD,MAAM,YAAY,oBAAoB;CAGtC,MAAM,YAAY,QAAQ,UAAU,OAAO;AAE3C,QAAO,qBAAC,oBAAD;EACI;EACP,mBAAiB;EACjB,WAAW,GACP,2BACA,aAAa,aAChB;EACD,GAAI;YAPD,CASF,UAEA,aACG,oBAAC,iBAAD;GAAiB,MAAM;GAAuB,WAAU;GAAiB,CAAA,CAE1D;;;AAG3B,SAAS,iBAAiB,EACtB,UAAU,OAAO,GAAG,SACrB;AACC,QACI,oBAAC,oBAAD;EAA6B;EAAO,GAAI;YACpC,oBAAC,OAAD;GAAK,WAAW,GACZ,yBACH;GAAG;GAAe,CAAA;EACA,CAAA"}
|
|
1
|
+
{"version":3,"file":"ModalTabs.js","names":[],"sources":["../../../src/forms/components/ModalTabs.tsx"],"sourcesContent":["import {\n Fragment,\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useState,\n type ReactNode,\n} from 'react';\n\nimport { evaluateCondition } from '@verbb/plugin-kit-forms';\nimport { Icon, Tab, TabPanel, Tabs } from '../../components/index.js';\nimport { cn } from '../../utils/index.js';\nimport type { SchemaFormComponentProps } from '../engine/context.js';\nimport { SchemaEngineContext } from '../engine/context.js';\nimport type { SchemaNode } from '@verbb/plugin-kit-forms';\n\nimport { schemaSubtreeHasErrors } from './schemaErrors.js';\n\nconst ModalTabsErrorsContext = createContext<Record<string, boolean>>({});\n\nexport const useModalTabsErrors = () => {\n return useContext(ModalTabsErrorsContext);\n};\n\ntype ModalTabsRootProps = SchemaFormComponentProps & {\n children?: ReactNode;\n className?: string;\n value?: string;\n defaultValue?: string;\n};\n\ntype TabHandleMeta = {\n value: string;\n if?: string;\n};\n\nconst isRecord = (value: unknown): value is Record<string, unknown> => {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n};\n\n/**\n * Collect ModalTabsTrigger handles + optional tab-level `if` from schema.\n * O(schema nodes under this ModalTabs) once per schema identity — not nested field visibility.\n */\nconst collectTabHandles = (node: SchemaNode | undefined): TabHandleMeta[] => {\n if (!node?.children) {\n return [];\n }\n\n const handles: TabHandleMeta[] = [];\n\n const visit = (items: unknown): void => {\n if (!Array.isArray(items)) {\n return;\n }\n\n items.forEach((item) => {\n if (!isRecord(item)) {\n return;\n }\n\n const child = item as SchemaNode;\n\n if (child.$cmp === 'ModalTabsTrigger') {\n const value = typeof child.props?.value === 'string'\n ? child.props.value\n : (typeof (child as { value?: unknown }).value === 'string'\n ? (child as { value: string }).value\n : '');\n\n if (value) {\n handles.push({\n value,\n if: typeof child.if === 'string' ? child.if : undefined,\n });\n }\n\n return;\n }\n\n if (child.children) {\n visit(child.children);\n }\n });\n };\n\n visit(node.children);\n\n return handles;\n};\n\n/**\n * Schema `$cmp: 'ModalTabs'` — wraps stock `Tabs` `variant=\"modal\"`.\n * Owns tab ↔ schema error mapping (same contract as kit v1 ModalTabs).\n */\nconst ModalTabs = Object.assign(({\n children,\n schemaNode,\n // Pull schema bookkeeping off before Tabs — even if the renderer strips these,\n // keep the same contract as kit v1 (schemaNode ?? schema for error mapping).\n schema,\n _id: _schemaId,\n _data: _schemaData,\n className,\n value: controlledValue,\n defaultValue = '',\n ...props\n}: ModalTabsRootProps & {\n schema?: SchemaNode;\n _id?: string;\n _data?: Record<string, unknown>;\n}) => {\n void _schemaId;\n void _schemaData;\n\n const form = useContext(SchemaEngineContext);\n const node = schemaNode ?? schema;\n const [tabErrors, setTabErrors] = useState<Record<string, boolean>>({});\n const [uncontrolledValue, setUncontrolledValue] = useState(\n () => controlledValue ?? defaultValue ?? '',\n );\n\n const isControlled = controlledValue !== undefined && controlledValue !== null;\n const resolvedValue = isControlled ? String(controlledValue) : uncontrolledValue;\n\n // Tab handles + optional `if` — fixed for a given schema node (not recomputed per field).\n const tabHandles = useMemo(() => collectTabHandles(node), [node]);\n\n const getTabErrors = useCallback(() => {\n const errors: Record<string, boolean> = {};\n\n if (!node?.children || !form?.getErrorMapFields) {\n return errors;\n }\n\n const formErrors = form.getErrorMapFields?.() || {};\n\n Object.values(node.children as Record<string, unknown>).forEach((item) => {\n if (typeof item !== 'object' || item === null || Array.isArray(item)) {\n return;\n }\n\n const childNode = item as SchemaNode;\n const value = typeof childNode.props?.value === 'string' ? childNode.props.value : '';\n if (childNode.$cmp === 'ModalTabsContent' && value) {\n errors[value] = schemaSubtreeHasErrors(formErrors, childNode.children || []);\n }\n });\n\n return errors;\n }, [form, node]);\n\n /** First tab whose tab-level `if` (if any) currently passes. */\n const getFirstVisibleTabValue = useCallback((values: Record<string, unknown>) => {\n for (const handle of tabHandles) {\n if (!handle.if || evaluateCondition(handle.if, values)) {\n return handle.value;\n }\n }\n\n return tabHandles[0]?.value ?? '';\n }, [tabHandles]);\n\n const isTabVisible = useCallback((tabValue: string, values: Record<string, unknown>) => {\n const handle = tabHandles.find((item) => item.value === tabValue);\n\n if (!handle) {\n return false;\n }\n\n if (!handle.if) {\n return true;\n }\n\n return evaluateCondition(handle.if, values);\n }, [tabHandles]);\n\n useEffect(() => {\n if (!form?.store?.subscribe) {\n setTabErrors(getTabErrors());\n return undefined;\n }\n\n const update = () => {\n setTabErrors(getTabErrors());\n\n // Tab-level `if` can hide the active tab (e.g. Name → multi fields).\n // Cheap: only re-eval each tab's own `if` — never walk nested field visibility.\n if (isControlled) {\n return;\n }\n\n const { values } = form.store.state;\n const formValues = (values && typeof values === 'object')\n ? values as Record<string, unknown>\n : {};\n\n if (!resolvedValue || isTabVisible(resolvedValue, formValues)) {\n return;\n }\n\n const next = getFirstVisibleTabValue(formValues);\n\n if (next && next !== resolvedValue) {\n setUncontrolledValue(next);\n }\n };\n\n update();\n return form.store.subscribe(update);\n }, [\n form,\n getFirstVisibleTabValue,\n getTabErrors,\n isControlled,\n isTabVisible,\n resolvedValue,\n ]);\n\n return (\n <ModalTabsErrorsContext.Provider value={tabErrors}>\n <Tabs\n variant=\"modal\"\n value={resolvedValue}\n className={cn('h-full min-h-0', className)}\n {...props}\n onPkChange={(event) => {\n // Nested inside FormBuilderTabs — stop bubble so pane routing does not navigate away.\n event.stopPropagation();\n\n const detail = (event as CustomEvent<{ value?: string }>).detail;\n const next = detail?.value;\n if (typeof next !== 'string' || !next || isControlled) {\n return;\n }\n setUncontrolledValue(next);\n }}\n >\n {children}\n </Tabs>\n </ModalTabsErrorsContext.Provider>\n );\n}, { usesSchemaNode: true as const });\n\nfunction ModalTabsList({ children }: { children?: ReactNode }) {\n // pk-tabs only indexes `pk-tab` nodes on `slot=\"nav\"` — no list wrapper.\n return <Fragment>{children}</Fragment>;\n}\n\nfunction ModalTabsTrigger({\n children,\n value,\n className,\n ...props\n}: {\n children?: ReactNode;\n value?: string;\n className?: string;\n}) {\n const tabErrors = useModalTabsErrors();\n const hasErrors = Boolean(value && tabErrors[value]);\n\n return (\n <Tab\n value={value}\n data-has-errors={hasErrors ? 'true' : undefined}\n // Host text-* cannot pierce pk-tab — error color is :host([data-has-errors]) in kit.\n className={className}\n {...props}\n slot=\"nav\"\n >\n {/* Default slot (not status): :has(::slotted(*)) on .status is unreliable across browsers. */}\n <span className=\"inline-flex items-center gap-1\">\n {children}\n {hasErrors ? (\n <Icon icon=\"triangle-exclamation\" className=\"block size-3\" />\n ) : null}\n </span>\n </Tab>\n );\n}\n\nfunction ModalTabsContent({\n children,\n className,\n ...props\n}: {\n children?: ReactNode;\n className?: string;\n value?: string;\n}) {\n return (\n <TabPanel className={className} {...props}>\n <div className=\"grid grid-cols-1 gap-4\">\n {children}\n </div>\n </TabPanel>\n );\n}\n\nexport {\n ModalTabs,\n ModalTabsList,\n ModalTabsTrigger,\n ModalTabsContent,\n};\n"],"mappings":";;;;;;;;;AAoBA,IAAM,yBAAyB,cAAuC,EAAE,CAAC;AAEzE,IAAa,2BAA2B;AACpC,QAAO,WAAW,uBAAuB;;AAe7C,IAAM,YAAY,UAAqD;AACnE,QAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,MAAM;;;;;;AAO/E,IAAM,qBAAqB,SAAkD;AACzE,KAAI,CAAC,MAAM,SACP,QAAO,EAAE;CAGb,MAAM,UAA2B,EAAE;CAEnC,MAAM,SAAS,UAAyB;AACpC,MAAI,CAAC,MAAM,QAAQ,MAAM,CACrB;AAGJ,QAAM,SAAS,SAAS;AACpB,OAAI,CAAC,SAAS,KAAK,CACf;GAGJ,MAAM,QAAQ;AAEd,OAAI,MAAM,SAAS,oBAAoB;IACnC,MAAM,QAAQ,OAAO,MAAM,OAAO,UAAU,WACtC,MAAM,MAAM,QACX,OAAQ,MAA8B,UAAU,WAC5C,MAA4B,QAC7B;AAEV,QAAI,MACA,SAAQ,KAAK;KACT;KACA,IAAI,OAAO,MAAM,OAAO,WAAW,MAAM,KAAK,KAAA;KACjD,CAAC;AAGN;;AAGJ,OAAI,MAAM,SACN,OAAM,MAAM,SAAS;IAE3B;;AAGN,OAAM,KAAK,SAAS;AAEpB,QAAO;;;;;;AAOX,IAAM,YAAY,OAAO,QAAQ,EAC7B,UACA,YAGA,QACA,KAAK,WACL,OAAO,aACP,WACA,OAAO,iBACP,eAAe,IACf,GAAG,YAKD;CAIF,MAAM,OAAO,WAAW,oBAAoB;CAC5C,MAAM,OAAO,cAAc;CAC3B,MAAM,CAAC,WAAW,gBAAgB,SAAkC,EAAE,CAAC;CACvE,MAAM,CAAC,mBAAmB,wBAAwB,eACxC,mBAAmB,gBAAgB,GAC5C;CAED,MAAM,eAAe,oBAAoB,KAAA,KAAa,oBAAoB;CAC1E,MAAM,gBAAgB,eAAe,OAAO,gBAAgB,GAAG;CAG/D,MAAM,aAAa,cAAc,kBAAkB,KAAK,EAAE,CAAC,KAAK,CAAC;CAEjE,MAAM,eAAe,kBAAkB;EACnC,MAAM,SAAkC,EAAE;AAE1C,MAAI,CAAC,MAAM,YAAY,CAAC,MAAM,kBAC1B,QAAO;EAGX,MAAM,aAAa,KAAK,qBAAqB,IAAI,EAAE;AAEnD,SAAO,OAAO,KAAK,SAAoC,CAAC,SAAS,SAAS;AACtE,OAAI,OAAO,SAAS,YAAY,SAAS,QAAQ,MAAM,QAAQ,KAAK,CAChE;GAGJ,MAAM,YAAY;GAClB,MAAM,QAAQ,OAAO,UAAU,OAAO,UAAU,WAAW,UAAU,MAAM,QAAQ;AACnF,OAAI,UAAU,SAAS,sBAAsB,MACzC,QAAO,SAAS,uBAAuB,YAAY,UAAU,YAAY,EAAE,CAAC;IAElF;AAEF,SAAO;IACR,CAAC,MAAM,KAAK,CAAC;;CAGhB,MAAM,0BAA0B,aAAa,WAAoC;AAC7E,OAAK,MAAM,UAAU,WACjB,KAAI,CAAC,OAAO,MAAM,kBAAkB,OAAO,IAAI,OAAO,CAClD,QAAO,OAAO;AAItB,SAAO,WAAW,IAAI,SAAS;IAChC,CAAC,WAAW,CAAC;CAEhB,MAAM,eAAe,aAAa,UAAkB,WAAoC;EACpF,MAAM,SAAS,WAAW,MAAM,SAAS,KAAK,UAAU,SAAS;AAEjE,MAAI,CAAC,OACD,QAAO;AAGX,MAAI,CAAC,OAAO,GACR,QAAO;AAGX,SAAO,kBAAkB,OAAO,IAAI,OAAO;IAC5C,CAAC,WAAW,CAAC;AAEhB,iBAAgB;AACZ,MAAI,CAAC,MAAM,OAAO,WAAW;AACzB,gBAAa,cAAc,CAAC;AAC5B;;EAGJ,MAAM,eAAe;AACjB,gBAAa,cAAc,CAAC;AAI5B,OAAI,aACA;GAGJ,MAAM,EAAE,WAAW,KAAK,MAAM;GAC9B,MAAM,aAAc,UAAU,OAAO,WAAW,WAC1C,SACA,EAAE;AAER,OAAI,CAAC,iBAAiB,aAAa,eAAe,WAAW,CACzD;GAGJ,MAAM,OAAO,wBAAwB,WAAW;AAEhD,OAAI,QAAQ,SAAS,cACjB,sBAAqB,KAAK;;AAIlC,UAAQ;AACR,SAAO,KAAK,MAAM,UAAU,OAAO;IACpC;EACC;EACA;EACA;EACA;EACA;EACA;EACH,CAAC;AAEF,QACI,oBAAC,uBAAuB,UAAxB;EAAiC,OAAO;YACpC,oBAAC,MAAD;GACI,SAAQ;GACR,OAAO;GACP,WAAW,GAAG,kBAAkB,UAAU;GAC1C,GAAI;GACJ,aAAa,UAAU;AAEnB,UAAM,iBAAiB;IAGvB,MAAM,OADU,MAA0C,QACrC;AACrB,QAAI,OAAO,SAAS,YAAY,CAAC,QAAQ,aACrC;AAEJ,yBAAqB,KAAK;;GAG7B;GACE,CAAA;EACuB,CAAA;GAEvC,EAAE,gBAAgB,MAAe,CAAC;AAErC,SAAS,cAAc,EAAE,YAAsC;AAE3D,QAAO,oBAAC,UAAD,EAAW,UAAoB,CAAA;;AAG1C,SAAS,iBAAiB,EACtB,UACA,OACA,WACA,GAAG,SAKJ;CACC,MAAM,YAAY,oBAAoB;CACtC,MAAM,YAAY,QAAQ,SAAS,UAAU,OAAO;AAEpD,QACI,oBAAC,KAAD;EACW;EACP,mBAAiB,YAAY,SAAS,KAAA;EAE3B;EACX,GAAI;EACJ,MAAK;YAGL,qBAAC,QAAD;GAAM,WAAU;aAAhB,CACK,UACA,YACG,oBAAC,MAAD;IAAM,MAAK;IAAuB,WAAU;IAAiB,CAAA,GAC7D,KACD;;EACL,CAAA;;AAId,SAAS,iBAAiB,EACtB,UACA,WACA,GAAG,SAKJ;AACC,QACI,oBAAC,UAAD;EAAqB;EAAW,GAAI;YAChC,oBAAC,OAAD;GAAK,WAAU;GACV;GACC,CAAA;EACC,CAAA"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
-
export
|
|
2
|
-
export
|
|
1
|
+
export { FieldWrap } from './FieldWrap.js';
|
|
2
|
+
export { ModalTabs, ModalTabsList, ModalTabsTrigger, ModalTabsContent, useModalTabsErrors, } from './ModalTabs.js';
|
|
3
|
+
export { collectSchemaFieldNames, schemaSubtreeHasErrors, } from './schemaErrors.js';
|
|
3
4
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/forms/components/index.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/forms/components/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EACH,SAAS,EACT,aAAa,EACb,gBAAgB,EAChB,gBAAgB,EAChB,kBAAkB,GACrB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACH,uBAAuB,EACvB,sBAAsB,GACzB,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { SchemaRenderable } from '@verbb/plugin-kit-forms';
|
|
2
|
+
/** Collect `$field` names under a schema subtree for tab/wrapper error chrome. */
|
|
3
|
+
export declare const collectSchemaFieldNames: (schema: SchemaRenderable, names?: Set<string>) => Set<string>;
|
|
4
|
+
export declare const schemaSubtreeHasErrors: (errors: Record<string, unknown> | undefined, schema: SchemaRenderable) => boolean;
|
|
5
|
+
//# sourceMappingURL=schemaErrors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schemaErrors.d.ts","sourceRoot":"","sources":["../../../src/forms/components/schemaErrors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAc,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAqB5E,kFAAkF;AAClF,eAAO,MAAM,uBAAuB,GAAI,QAAQ,gBAAgB,EAAE,QAAO,GAAG,CAAC,MAAM,CAAa,KAAG,GAAG,CAAC,MAAM,CA2B5G,CAAC;AAEF,eAAO,MAAM,sBAAsB,GAC/B,QAAQ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,EAC3C,QAAQ,gBAAgB,KACzB,OAOF,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
//#region src/forms/components/schemaErrors.ts
|
|
2
|
+
var hasErrorValue = (value) => {
|
|
3
|
+
if (Array.isArray(value)) return value.length > 0;
|
|
4
|
+
if (!value) return false;
|
|
5
|
+
if (typeof value === "object") {
|
|
6
|
+
const entry = value;
|
|
7
|
+
if (Array.isArray(entry.errors)) return entry.errors.length > 0;
|
|
8
|
+
}
|
|
9
|
+
return Boolean(value);
|
|
10
|
+
};
|
|
11
|
+
/** Collect `$field` names under a schema subtree for tab/wrapper error chrome. */
|
|
12
|
+
var collectSchemaFieldNames = (schema, names = /* @__PURE__ */ new Set()) => {
|
|
13
|
+
if (Array.isArray(schema)) {
|
|
14
|
+
schema.forEach((entry) => {
|
|
15
|
+
collectSchemaFieldNames(entry, names);
|
|
16
|
+
});
|
|
17
|
+
return names;
|
|
18
|
+
}
|
|
19
|
+
if (!schema || typeof schema !== "object") return names;
|
|
20
|
+
const node = schema;
|
|
21
|
+
if (node.$field && typeof node.name === "string" && node.name) names.add(node.name);
|
|
22
|
+
if (node.children) collectSchemaFieldNames(node.children, names);
|
|
23
|
+
if (node.schema) collectSchemaFieldNames(node.schema, names);
|
|
24
|
+
return names;
|
|
25
|
+
};
|
|
26
|
+
var schemaSubtreeHasErrors = (errors, schema) => {
|
|
27
|
+
if (!errors || !schema) return false;
|
|
28
|
+
const fieldNames = collectSchemaFieldNames(schema);
|
|
29
|
+
return Array.from(fieldNames).some((fieldName) => hasErrorValue(errors[fieldName]));
|
|
30
|
+
};
|
|
31
|
+
//#endregion
|
|
32
|
+
export { collectSchemaFieldNames, schemaSubtreeHasErrors };
|
|
33
|
+
|
|
34
|
+
//# sourceMappingURL=schemaErrors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schemaErrors.js","names":[],"sources":["../../../src/forms/components/schemaErrors.ts"],"sourcesContent":["import type { SchemaNode, SchemaRenderable } from '@verbb/plugin-kit-forms';\n\nconst hasErrorValue = (value: unknown): boolean => {\n if (Array.isArray(value)) {\n return value.length > 0;\n }\n\n if (!value) {\n return false;\n }\n\n if (typeof value === 'object') {\n const entry = value as { errors?: unknown[] };\n if (Array.isArray(entry.errors)) {\n return entry.errors.length > 0;\n }\n }\n\n return Boolean(value);\n};\n\n/** Collect `$field` names under a schema subtree for tab/wrapper error chrome. */\nexport const collectSchemaFieldNames = (schema: SchemaRenderable, names: Set<string> = new Set()): Set<string> => {\n if (Array.isArray(schema)) {\n schema.forEach((entry) => {\n collectSchemaFieldNames(entry, names);\n });\n return names;\n }\n\n if (!schema || typeof schema !== 'object') {\n return names;\n }\n\n const node = schema as SchemaNode;\n\n if (node.$field && typeof node.name === 'string' && node.name) {\n names.add(node.name);\n }\n\n if (node.children) {\n collectSchemaFieldNames(node.children as SchemaRenderable, names);\n }\n\n if (node.schema) {\n collectSchemaFieldNames(node.schema as SchemaRenderable, names);\n }\n\n return names;\n};\n\nexport const schemaSubtreeHasErrors = (\n errors: Record<string, unknown> | undefined,\n schema: SchemaRenderable,\n): boolean => {\n if (!errors || !schema) {\n return false;\n }\n\n const fieldNames = collectSchemaFieldNames(schema);\n return Array.from(fieldNames).some((fieldName) => hasErrorValue(errors[fieldName]));\n};\n"],"mappings":";AAEA,IAAM,iBAAiB,UAA4B;AAC/C,KAAI,MAAM,QAAQ,MAAM,CACpB,QAAO,MAAM,SAAS;AAG1B,KAAI,CAAC,MACD,QAAO;AAGX,KAAI,OAAO,UAAU,UAAU;EAC3B,MAAM,QAAQ;AACd,MAAI,MAAM,QAAQ,MAAM,OAAO,CAC3B,QAAO,MAAM,OAAO,SAAS;;AAIrC,QAAO,QAAQ,MAAM;;;AAIzB,IAAa,2BAA2B,QAA0B,wBAAqB,IAAI,KAAK,KAAkB;AAC9G,KAAI,MAAM,QAAQ,OAAO,EAAE;AACvB,SAAO,SAAS,UAAU;AACtB,2BAAwB,OAAO,MAAM;IACvC;AACF,SAAO;;AAGX,KAAI,CAAC,UAAU,OAAO,WAAW,SAC7B,QAAO;CAGX,MAAM,OAAO;AAEb,KAAI,KAAK,UAAU,OAAO,KAAK,SAAS,YAAY,KAAK,KACrD,OAAM,IAAI,KAAK,KAAK;AAGxB,KAAI,KAAK,SACL,yBAAwB,KAAK,UAA8B,MAAM;AAGrE,KAAI,KAAK,OACL,yBAAwB,KAAK,QAA4B,MAAM;AAGnE,QAAO;;AAGX,IAAa,0BACT,QACA,WACU;AACV,KAAI,CAAC,UAAU,CAAC,OACZ,QAAO;CAGX,MAAM,aAAa,wBAAwB,OAAO;AAClD,QAAO,MAAM,KAAK,WAAW,CAAC,MAAM,cAAc,cAAc,OAAO,WAAW,CAAC"}
|