@cube-dev/ui-kit 0.179.0 → 0.181.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/CHANGELOG.md +28 -0
- package/dist/_internal/hooks/use-debounced-value.js +1 -1
- package/dist/_internal/hooks/use-deprecation-warning.js +1 -1
- package/dist/_internal/hooks/use-event.js +1 -1
- package/dist/_internal/hooks/use-is-first-render.js +1 -1
- package/dist/_internal/hooks/use-sync-ref.js +1 -1
- package/dist/_internal/hooks/use-timer/timer.js +1 -1
- package/dist/_internal/hooks/use-timer/use-timer.js +1 -1
- package/dist/_internal/hooks/use-warn.js +1 -1
- package/dist/components/Block.js +1 -1
- package/dist/components/CollectionItem.js +1 -1
- package/dist/components/GlobalStyles.js +1 -1
- package/dist/components/GridProvider.js +1 -1
- package/dist/components/HiddenInput.js +1 -1
- package/dist/components/Root.js +1 -1
- package/dist/components/actions/Action/Action.js +1 -1
- package/dist/components/actions/Banner/Banner.js +1 -1
- package/dist/components/actions/Button/Button.d.ts +1 -0
- package/dist/components/actions/Button/Button.js +3 -3
- package/dist/components/actions/ButtonGroup/ButtonGroup.js +1 -1
- package/dist/components/actions/ButtonSplit/ButtonSplit.js +1 -1
- package/dist/components/actions/ButtonSplit/context.js +1 -1
- package/dist/components/actions/CommandMenu/CommandMenu.js +1 -1
- package/dist/components/actions/CommandMenu/styled.js +1 -1
- package/dist/components/actions/ItemAction/ItemAction.js +1 -1
- package/dist/components/actions/ItemActionContext.js +1 -1
- package/dist/components/actions/ItemActionsWrapper.js +1 -1
- package/dist/components/actions/ItemButton/ItemButton.js +1 -1
- package/dist/components/actions/Link/Link.js +1 -1
- package/dist/components/actions/Menu/Menu.js +1 -1
- package/dist/components/actions/Menu/MenuItem.js +1 -1
- package/dist/components/actions/Menu/MenuSection.js +1 -1
- package/dist/components/actions/Menu/MenuTrigger.js +1 -1
- package/dist/components/actions/Menu/SubMenuTrigger.js +1 -1
- package/dist/components/actions/Menu/SubmenuTriggerContext.js +1 -1
- package/dist/components/actions/Menu/context.js +1 -1
- package/dist/components/actions/Menu/styled.js +1 -1
- package/dist/components/actions/actions-run.js +1 -1
- package/dist/components/actions/index.js +1 -1
- package/dist/components/actions/use-action.js +1 -1
- package/dist/components/actions/use-anchored-menu.js +1 -1
- package/dist/components/actions/use-context-menu.js +1 -1
- package/dist/components/content/ActiveZone/ActiveZone.js +1 -1
- package/dist/components/content/Alert/Alert.js +1 -1
- package/dist/components/content/Alert/use-alert.js +1 -1
- package/dist/components/content/Avatar/Avatar.js +1 -1
- package/dist/components/content/Badge/Badge.js +1 -1
- package/dist/components/content/Card/Card.js +1 -1
- package/dist/components/content/Content.js +1 -1
- package/dist/components/content/CopyPasteBlock/CopyPasteBlock.js +1 -1
- package/dist/components/content/CopySnippet/CopySnippet.js +1 -1
- package/dist/components/content/Disclosure/Disclosure.js +1 -1
- package/dist/components/content/Divider.js +1 -1
- package/dist/components/content/Footer.js +1 -1
- package/dist/components/content/Header.js +1 -1
- package/dist/components/content/HotKeys/HotKeys.js +1 -1
- package/dist/components/content/InfoBadge/InfoBadge.js +1 -1
- package/dist/components/content/InlineInput/InlineInput.js +1 -1
- package/dist/components/content/Item/Item.js +2 -2
- package/dist/components/content/ItemBadge/ItemBadge.js +1 -1
- package/dist/components/content/ItemCard/ItemCard.js +1 -1
- package/dist/components/content/Layout/GridLayout.js +1 -1
- package/dist/components/content/Layout/Layout.js +1 -1
- package/dist/components/content/Layout/LayoutBlock.js +1 -1
- package/dist/components/content/Layout/LayoutCenter.js +1 -1
- package/dist/components/content/Layout/LayoutContainer.js +1 -1
- package/dist/components/content/Layout/LayoutContent.js +1 -1
- package/dist/components/content/Layout/LayoutContext.js +1 -1
- package/dist/components/content/Layout/LayoutFlex.js +1 -1
- package/dist/components/content/Layout/LayoutFooter.js +1 -1
- package/dist/components/content/Layout/LayoutGrid.js +1 -1
- package/dist/components/content/Layout/LayoutHeader.js +1 -1
- package/dist/components/content/Layout/LayoutPane.js +1 -1
- package/dist/components/content/Layout/LayoutPanel.js +2 -2
- package/dist/components/content/Layout/LayoutPanelHeader.js +1 -1
- package/dist/components/content/Layout/LayoutToolbar.js +1 -1
- package/dist/components/content/Layout/hooks/useTinyScrollbar.js +1 -1
- package/dist/components/content/Layout/index.js +1 -1
- package/dist/components/content/Layout/utils.js +1 -1
- package/dist/components/content/Paragraph.js +1 -1
- package/dist/components/content/Placeholder/Placeholder.js +1 -1
- package/dist/components/content/PrismCode/PrismCode.js +1 -1
- package/dist/components/content/PrismCode/prismSetup.js +1 -1
- package/dist/components/content/PrismDiffCode/PrismDiffCode.js +1 -1
- package/dist/components/content/Result/Result.js +1 -1
- package/dist/components/content/Skeleton/Skeleton.js +1 -1
- package/dist/components/content/Tag/Tag.js +1 -1
- package/dist/components/content/Text.js +1 -1
- package/dist/components/content/TextItem/TextItem.js +1 -1
- package/dist/components/content/Title.js +1 -1
- package/dist/components/content/Tree/Tree.js +1 -1
- package/dist/components/content/Tree/TreeNode.js +1 -1
- package/dist/components/content/Tree/styled.js +1 -1
- package/dist/components/content/Tree/tree-index.js +1 -1
- package/dist/components/content/Tree/use-checkbox-tree.js +1 -1
- package/dist/components/content/Tree/use-load-data.js +1 -1
- package/dist/components/content/highlightText.js +1 -1
- package/dist/components/content/use-auto-tooltip.js +1 -1
- package/dist/components/data/DataTable/DataTable.js +1 -1
- package/dist/components/data/ItemTable/ItemTable.js +1 -1
- package/dist/components/data/ItemTable/ItemTableBulkBar.js +1 -1
- package/dist/components/data/ItemTable/ItemTableDragPreview.js +1 -1
- package/dist/components/data/ItemTable/ItemTableFooter.js +1 -1
- package/dist/components/data/ItemTable/ItemTableToolbar.js +1 -1
- package/dist/components/data/TableBase/ColumnResizer.js +1 -1
- package/dist/components/data/TableBase/RowCollection.js +1 -1
- package/dist/components/data/TableBase/TableHeaderCell.js +1 -1
- package/dist/components/data/TableBase/TableRow.js +1 -1
- package/dist/components/data/TableBase/TableView.js +1 -1
- package/dist/components/data/TableBase/column-menu.js +1 -1
- package/dist/components/data/TableBase/column-tint.js +1 -1
- package/dist/components/data/TableBase/row-menu.js +1 -1
- package/dist/components/data/TableBase/styled.d.ts +2 -1
- package/dist/components/data/TableBase/styled.js +1 -1
- package/dist/components/data/TableBase/table-tree.js +1 -1
- package/dist/components/data/TableBase/types.js +1 -1
- package/dist/components/data/TableBase/use-cell-selection.d.ts +1 -0
- package/dist/components/data/TableBase/use-cell-selection.js +0 -0
- package/dist/components/data/TableBase/use-column-order.js +1 -1
- package/dist/components/data/TableBase/use-container-width.js +1 -1
- package/dist/components/data/TableBase/use-row-move-animation.js +1 -1
- package/dist/components/data/TableBase/use-scrollability.js +1 -1
- package/dist/components/data/TableBase/use-table-columns.js +1 -1
- package/dist/components/data/TableBase/use-table-search.js +1 -1
- package/dist/components/data/TableBase/use-table-selection.js +1 -1
- package/dist/components/data/TableBase/use-table-sort.js +1 -1
- package/dist/components/data/TableBase/use-table-sorts.js +1 -1
- package/dist/components/data/TableBase/use-table-storage.js +1 -1
- package/dist/components/data/TableBase/use-table-tree-state.js +1 -1
- package/dist/components/fields/Checkbox/Checkbox.d.ts +10 -1
- package/dist/components/fields/Checkbox/Checkbox.js +4 -5
- package/dist/components/fields/Checkbox/Checkbox.js.map +1 -1
- package/dist/components/fields/Checkbox/CheckboxGroup.d.ts +1 -1
- package/dist/components/fields/Checkbox/CheckboxGroup.js +3 -3
- package/dist/components/fields/Checkbox/CheckboxGroup.js.map +1 -1
- package/dist/components/fields/Checkbox/context.js +1 -1
- package/dist/components/fields/ColorInput/ColorInput.d.ts +1 -1
- package/dist/components/fields/ColorInput/ColorInput.js +1 -1
- package/dist/components/fields/ColorInput/ColorInput.js.map +1 -1
- package/dist/components/fields/ColorPicker/ColorPicker.d.ts +1 -1
- package/dist/components/fields/ColorPicker/ColorPicker.js +1 -1
- package/dist/components/fields/ColorPicker/ColorPicker.js.map +1 -1
- package/dist/components/fields/ColorSwatch/ColorSwatch.js +1 -1
- package/dist/components/fields/ColorSwatchGroup/ColorSwatchGroup.d.ts +1 -1
- package/dist/components/fields/ColorSwatchGroup/ColorSwatchGroup.js +1 -1
- package/dist/components/fields/ColorSwatchGroup/ColorSwatchGroup.js.map +1 -1
- package/dist/components/fields/ComboBox/ComboBox.d.ts +1 -1
- package/dist/components/fields/ComboBox/ComboBox.js +8 -2
- package/dist/components/fields/ComboBox/ComboBox.js.map +1 -1
- package/dist/components/fields/CommandTextArea/CommandTextArea.js +2 -2
- package/dist/components/fields/CommandTextArea/CommandTextArea.js.map +1 -1
- package/dist/components/fields/CommandTextArea/caretPosition.js +1 -1
- package/dist/components/fields/CommandTextArea/caretPosition.js.map +1 -1
- package/dist/components/fields/CommandTextArea/useCaretAnchor.js +1 -1
- package/dist/components/fields/DatePicker/DateInput.d.ts +1 -1
- package/dist/components/fields/DatePicker/DateInput.js +1 -1
- package/dist/components/fields/DatePicker/DateInput.js.map +1 -1
- package/dist/components/fields/DatePicker/DateInputBase.js +1 -1
- package/dist/components/fields/DatePicker/DatePicker.d.ts +1 -1
- package/dist/components/fields/DatePicker/DatePicker.js +1 -1
- package/dist/components/fields/DatePicker/DatePicker.js.map +1 -1
- package/dist/components/fields/DatePicker/DatePickerButton.js +1 -1
- package/dist/components/fields/DatePicker/DatePickerElement.js +1 -1
- package/dist/components/fields/DatePicker/DatePickerInput.js +1 -1
- package/dist/components/fields/DatePicker/DatePickerInput.js.map +1 -1
- package/dist/components/fields/DatePicker/DatePickerSegment.js +1 -1
- package/dist/components/fields/DatePicker/DateRangePicker.d.ts +4 -1
- package/dist/components/fields/DatePicker/DateRangePicker.js +1 -1
- package/dist/components/fields/DatePicker/DateRangePicker.js.map +1 -1
- package/dist/components/fields/DatePicker/DateRangeSeparatedPicker.d.ts +4 -1
- package/dist/components/fields/DatePicker/DateRangeSeparatedPicker.js +1 -1
- package/dist/components/fields/DatePicker/DateRangeSeparatedPicker.js.map +1 -1
- package/dist/components/fields/DatePicker/MonthPicker.js +1 -1
- package/dist/components/fields/DatePicker/PeriodPicker.d.ts +1 -1
- package/dist/components/fields/DatePicker/PeriodPicker.js +1 -1
- package/dist/components/fields/DatePicker/PeriodPicker.js.map +1 -1
- package/dist/components/fields/DatePicker/QuarterPicker.js +1 -1
- package/dist/components/fields/DatePicker/TimeInput.d.ts +1 -1
- package/dist/components/fields/DatePicker/TimeInput.js +1 -1
- package/dist/components/fields/DatePicker/TimeInput.js.map +1 -1
- package/dist/components/fields/DatePicker/WeekPicker.js +1 -1
- package/dist/components/fields/DatePicker/YearPicker.js +1 -1
- package/dist/components/fields/DatePicker/parseDate.js +1 -1
- package/dist/components/fields/DatePicker/period.js +1 -1
- package/dist/components/fields/DatePicker/props.js +1 -1
- package/dist/components/fields/DatePicker/utils.js +1 -1
- package/dist/components/fields/FileInput/FileInput.d.ts +6 -1
- package/dist/components/fields/FileInput/FileInput.js +38 -29
- package/dist/components/fields/FileInput/FileInput.js.map +1 -1
- package/dist/components/fields/FilterListBox/FilterListBox.d.ts +1 -1
- package/dist/components/fields/FilterListBox/FilterListBox.js +1 -1
- package/dist/components/fields/FilterListBox/FilterListBox.js.map +1 -1
- package/dist/components/fields/FilterPicker/FilterPicker.d.ts +1 -1
- package/dist/components/fields/FilterPicker/FilterPicker.js +8 -5
- package/dist/components/fields/FilterPicker/FilterPicker.js.map +1 -1
- package/dist/components/fields/Input/Input.js +1 -1
- package/dist/components/fields/ListBox/DraggableListBox.js +1 -1
- package/dist/components/fields/ListBox/ListBox.d.ts +1 -1
- package/dist/components/fields/ListBox/ListBox.js +5 -3
- package/dist/components/fields/ListBox/ListBox.js.map +1 -1
- package/dist/components/fields/ListBoxPopover/ListBoxPopover.js +1 -1
- package/dist/components/fields/ListBoxPopover/index.d.ts +1 -0
- package/dist/components/fields/ListBoxPopover/listNavigation.js +1 -1
- package/dist/components/fields/ListBoxPopover/useCompositeFocus.d.ts +2 -0
- package/dist/components/fields/ListBoxPopover/useCompositeFocus.js +1 -1
- package/dist/components/fields/NumberInput/NumberInput.d.ts +3 -1
- package/dist/components/fields/NumberInput/NumberInput.js +3 -3
- package/dist/components/fields/NumberInput/NumberInput.js.map +1 -1
- package/dist/components/fields/NumberInput/StepButton.js +1 -1
- package/dist/components/fields/PasswordInput/PasswordInput.js +1 -1
- package/dist/components/fields/Picker/Picker.d.ts +1 -1
- package/dist/components/fields/Picker/Picker.js +8 -5
- package/dist/components/fields/Picker/Picker.js.map +1 -1
- package/dist/components/fields/RadioGroup/Radio.js +1 -1
- package/dist/components/fields/RadioGroup/RadioGroup.d.ts +1 -1
- package/dist/components/fields/RadioGroup/RadioGroup.js +3 -3
- package/dist/components/fields/RadioGroup/RadioGroup.js.map +1 -1
- package/dist/components/fields/RadioGroup/context.js +1 -1
- package/dist/components/fields/SearchComboBox/SearchComboBox.js +1 -1
- package/dist/components/fields/SearchInput/SearchInput.js +1 -1
- package/dist/components/fields/Select/Select.d.ts +1 -1
- package/dist/components/fields/Select/Select.js +16 -2
- package/dist/components/fields/Select/Select.js.map +1 -1
- package/dist/components/fields/Slider/Gradation.js +1 -1
- package/dist/components/fields/Slider/HueSlider.js +1 -1
- package/dist/components/fields/Slider/RangeSlider.js +1 -1
- package/dist/components/fields/Slider/Slider.js +1 -1
- package/dist/components/fields/Slider/SliderBase.js +2 -2
- package/dist/components/fields/Slider/SliderBase.js.map +1 -1
- package/dist/components/fields/Slider/SliderThumb.js +1 -1
- package/dist/components/fields/Slider/SliderTrack.js +1 -1
- package/dist/components/fields/Slider/elements.js +1 -1
- package/dist/components/fields/Slider/index.js +1 -1
- package/dist/components/fields/Slider/types.d.ts +1 -1
- package/dist/components/fields/Switch/Switch.d.ts +5 -1
- package/dist/components/fields/Switch/Switch.js +1 -1
- package/dist/components/fields/Switch/Switch.js.map +1 -1
- package/dist/components/fields/TextArea/TextArea.d.ts +2 -0
- package/dist/components/fields/TextArea/TextArea.js +1 -1
- package/dist/components/fields/TextArea/TextArea.js.map +1 -1
- package/dist/components/fields/TextInput/TextInput.d.ts +4 -1
- package/dist/components/fields/TextInput/TextInput.js +1 -1
- package/dist/components/fields/TextInput/TextInput.js.map +1 -1
- package/dist/components/fields/TextInput/TextInputBase.d.ts +1 -1
- package/dist/components/fields/TextInput/TextInputBase.js +1 -1
- package/dist/components/fields/TextInput/TextInputBase.js.map +1 -1
- package/dist/components/fields/TextInput/useAutoSizeTextArea.js +1 -1
- package/dist/components/fields/TextInputMapper/TextInputMapper.d.ts +1 -1
- package/dist/components/fields/TextInputMapper/TextInputMapper.js +1 -1
- package/dist/components/fields/TextInputMapper/TextInputMapper.js.map +1 -1
- package/dist/components/fields/TriggerActions.js +1 -1
- package/dist/components/fields/color/ColorPanel.js +1 -1
- package/dist/components/fields/color/channels.js +1 -1
- package/dist/components/fields/color/color.js +1 -1
- package/dist/components/fields/color/context.js +1 -1
- package/dist/components/form/FieldWrapper/FieldWrapper.js +1 -1
- package/dist/components/form/Form/Field.d.ts +2 -0
- package/dist/components/form/Form/Field.js +1 -1
- package/dist/components/form/Form/Field.js.map +1 -1
- package/dist/components/form/Form/Form.d.ts +38 -2
- package/dist/components/form/Form/Form.js +86 -16
- package/dist/components/form/Form/Form.js.map +1 -1
- package/dist/components/form/Form/ModernFormRoot.d.ts +24 -0
- package/dist/components/form/Form/ModernFormRoot.js +115 -0
- package/dist/components/form/Form/ModernFormRoot.js.map +1 -0
- package/dist/components/form/Form/ResetButton/ResetButton.d.ts +2 -1
- package/dist/components/form/Form/ResetButton/ResetButton.js +17 -2
- package/dist/components/form/Form/ResetButton/ResetButton.js.map +1 -1
- package/dist/components/form/Form/SubmitButton/SubmitButton.d.ts +4 -1
- package/dist/components/form/Form/SubmitButton/SubmitButton.js +18 -3
- package/dist/components/form/Form/SubmitButton/SubmitButton.js.map +1 -1
- package/dist/components/form/Form/SubmitError.d.ts +8 -2
- package/dist/components/form/Form/SubmitError.js +33 -3
- package/dist/components/form/Form/SubmitError.js.map +1 -1
- package/dist/components/form/Form/backend.d.ts +25 -0
- package/dist/components/form/Form/backend.js +30 -0
- package/dist/components/form/Form/backend.js.map +1 -0
- package/dist/components/form/Form/index.d.ts +26 -8
- package/dist/components/form/Form/index.js +10 -2
- package/dist/components/form/Form/index.js.map +1 -1
- package/dist/components/form/Form/modern/actions.js +59 -0
- package/dist/components/form/Form/modern/actions.js.map +1 -0
- package/dist/components/form/Form/modern/context.d.ts +12 -0
- package/dist/components/form/Form/modern/context.js +14 -0
- package/dist/components/form/Form/modern/context.js.map +1 -0
- package/dist/components/form/Form/modern/controller.d.ts +34 -0
- package/dist/components/form/Form/modern/controller.js +59 -0
- package/dist/components/form/Form/modern/controller.js.map +1 -0
- package/dist/components/form/Form/modern/field-binding.js +59 -0
- package/dist/components/form/Form/modern/field-binding.js.map +1 -0
- package/dist/components/form/Form/modern/field.d.ts +30 -0
- package/dist/components/form/Form/modern/field.js +23 -0
- package/dist/components/form/Form/modern/field.js.map +1 -0
- package/dist/components/form/Form/modern/path-types.d.ts +16 -0
- package/dist/components/form/Form/modern/react.d.ts +26 -0
- package/dist/components/form/Form/modern/react.js +45 -0
- package/dist/components/form/Form/modern/react.js.map +1 -0
- package/dist/components/form/Form/modern/read-types.d.ts +11 -0
- package/dist/components/form/Form/modern/store.js +876 -0
- package/dist/components/form/Form/modern/store.js.map +1 -0
- package/dist/components/form/Form/modern/types.d.ts +189 -0
- package/dist/components/form/Form/modern/validation.d.ts +28 -0
- package/dist/components/form/Form/modern/validation.js +41 -0
- package/dist/components/form/Form/modern/validation.js.map +1 -0
- package/dist/components/form/Form/modern/values.d.ts +7 -0
- package/dist/components/form/Form/modern/values.js +158 -0
- package/dist/components/form/Form/modern/values.js.map +1 -0
- package/dist/components/form/Form/use-field/types.d.ts +4 -1
- package/dist/components/form/Form/use-field/use-field-binding.js +97 -0
- package/dist/components/form/Form/use-field/use-field-binding.js.map +1 -0
- package/dist/components/form/Form/use-field/use-field-props.d.ts +14 -1
- package/dist/components/form/Form/use-field/use-field-props.js +80 -52
- package/dist/components/form/Form/use-field/use-field-props.js.map +1 -1
- package/dist/components/form/Form/use-field/use-field.d.ts +9 -1
- package/dist/components/form/Form/use-field/use-field.js +47 -22
- package/dist/components/form/Form/use-field/use-field.js.map +1 -1
- package/dist/components/form/Form/use-form.d.ts +4 -1
- package/dist/components/form/Form/use-form.js +6 -2
- package/dist/components/form/Form/use-form.js.map +1 -1
- package/dist/components/form/Form/validation.js +2 -2
- package/dist/components/form/Label.js +1 -1
- package/dist/components/form/index.d.ts +11 -3
- package/dist/components/form/validation/ValidationIndicator.js +1 -1
- package/dist/components/form/validation/resolve-validation-props.js +1 -1
- package/dist/components/form/validation/use-validation-props.js +1 -1
- package/dist/components/form/wrapper.js +1 -1
- package/dist/components/helpers/DisplayTransition/DisplayTransition.js +1 -1
- package/dist/components/helpers/IconSwitch/IconSwitch.js +1 -1
- package/dist/components/layout/Board/Board.js +1 -1
- package/dist/components/layout/Board/BoardProvider.js +1 -1
- package/dist/components/layout/Board/BoardResponsive.js +1 -1
- package/dist/components/layout/Board/Widget.js +1 -1
- package/dist/components/layout/Board/WidgetHost.js +1 -1
- package/dist/components/layout/Board/board-context.js +1 -1
- package/dist/components/layout/Board/board-store.js +1 -1
- package/dist/components/layout/Board/grid-core/calculate.js +1 -1
- package/dist/components/layout/Board/grid-core/collision-modes.js +1 -1
- package/dist/components/layout/Board/grid-core/collision.js +1 -1
- package/dist/components/layout/Board/grid-core/compactors.js +1 -1
- package/dist/components/layout/Board/grid-core/constraints.js +1 -1
- package/dist/components/layout/Board/grid-core/group-move.js +1 -1
- package/dist/components/layout/Board/grid-core/layout.js +1 -1
- package/dist/components/layout/Board/grid-core/placement.js +1 -1
- package/dist/components/layout/Board/grid-core/sort.js +1 -1
- package/dist/components/layout/Board/index.js +1 -1
- package/dist/components/layout/Board/responsive-utils.js +1 -1
- package/dist/components/layout/Board/use-board-layout.js +1 -1
- package/dist/components/layout/Board/use-board-registry.js +1 -1
- package/dist/components/layout/Board/use-board-select-modifier-key.js +1 -1
- package/dist/components/layout/Board/use-board-selection.js +1 -1
- package/dist/components/layout/Flex.js +1 -1
- package/dist/components/layout/Flow.js +1 -1
- package/dist/components/layout/Grid.js +1 -1
- package/dist/components/layout/Panel.js +1 -1
- package/dist/components/layout/Prefix.js +1 -1
- package/dist/components/layout/ResizablePanel.js +1 -1
- package/dist/components/layout/Space.js +1 -1
- package/dist/components/layout/Suffix.js +1 -1
- package/dist/components/navigation/Pagination/Pagination.js +1 -1
- package/dist/components/navigation/Pagination/use-pagination.js +1 -1
- package/dist/components/navigation/Tabs/DraggableTabList.js +1 -1
- package/dist/components/navigation/Tabs/TabButton.js +1 -1
- package/dist/components/navigation/Tabs/TabDropIndicator.js +1 -1
- package/dist/components/navigation/Tabs/TabPanel.js +1 -1
- package/dist/components/navigation/Tabs/TabPicker.js +1 -1
- package/dist/components/navigation/Tabs/Tabs.js +1 -1
- package/dist/components/navigation/Tabs/TabsAction.js +1 -1
- package/dist/components/navigation/Tabs/TabsContext.js +1 -1
- package/dist/components/navigation/Tabs/popover-placement.js +1 -1
- package/dist/components/navigation/Tabs/styled.js +1 -1
- package/dist/components/navigation/Tabs/types.js +1 -1
- package/dist/components/navigation/Tabs/use-tab-editing.js +1 -1
- package/dist/components/navigation/Tabs/use-tab-indicator.js +1 -1
- package/dist/components/organisms/StatsCard/StatsCard.js +1 -1
- package/dist/components/other/Calendar/Calendar.js +1 -1
- package/dist/components/other/Calendar/CalendarCell.js +1 -1
- package/dist/components/other/Calendar/CalendarGrid.js +1 -1
- package/dist/components/other/Calendar/CalendarHeader.js +1 -1
- package/dist/components/other/Calendar/CalendarPanel.js +1 -1
- package/dist/components/other/Calendar/PeriodCalendar.js +1 -1
- package/dist/components/other/Calendar/PeriodGrid.js +1 -1
- package/dist/components/other/Calendar/RangeCalendar.js +1 -1
- package/dist/components/other/Calendar/styled.js +1 -1
- package/dist/components/other/CubeLogo/CubeLogo.js +1 -1
- package/dist/components/other/NoDataIcon/NoDataIcon.js +1 -1
- package/dist/components/overlays/AlertDialog/AlertDialog.js +1 -1
- package/dist/components/overlays/AlertDialog/AlertDialogApiProvider.js +1 -1
- package/dist/components/overlays/AlertDialog/AlertDialogZone.js +1 -1
- package/dist/components/overlays/Dialog/Dialog.js +1 -1
- package/dist/components/overlays/Dialog/DialogContainer.js +1 -1
- package/dist/components/overlays/Dialog/DialogForm.js +1 -1
- package/dist/components/overlays/Dialog/DialogTrigger.js +1 -1
- package/dist/components/overlays/Dialog/context.js +1 -1
- package/dist/components/overlays/Dialog/use-dialog-container.js +1 -1
- package/dist/components/overlays/Modal/Modal.d.ts +2 -1
- package/dist/components/overlays/Modal/Modal.js +1 -1
- package/dist/components/overlays/Modal/OpenTransitionContext.js +1 -1
- package/dist/components/overlays/Modal/Overlay.d.ts +1 -0
- package/dist/components/overlays/Modal/Overlay.js +8 -2
- package/dist/components/overlays/Modal/Overlay.js.map +1 -1
- package/dist/components/overlays/Modal/Popover.js +4 -2
- package/dist/components/overlays/Modal/Popover.js.map +1 -1
- package/dist/components/overlays/Modal/Tray.js +1 -1
- package/dist/components/overlays/Modal/Underlay.js +1 -1
- package/dist/components/overlays/Modal/types.d.ts +1 -0
- package/dist/components/overlays/Notifications/Notification.js +1 -1
- package/dist/components/overlays/Notifications/NotificationAction.js +1 -1
- package/dist/components/overlays/Notifications/NotificationCard.js +1 -1
- package/dist/components/overlays/Notifications/NotificationContext.d.ts +2 -0
- package/dist/components/overlays/Notifications/NotificationContext.js +1 -1
- package/dist/components/overlays/Notifications/NotificationItem.js +1 -1
- package/dist/components/overlays/Notifications/OverlayContainer.js +1 -1
- package/dist/components/overlays/Notifications/OverlayProvider.js +1 -1
- package/dist/components/overlays/Notifications/PersistentNotificationsList.js +1 -1
- package/dist/components/overlays/Notifications/dismissed-storage.js +1 -1
- package/dist/components/overlays/Notifications/format-relative-time.js +1 -1
- package/dist/components/overlays/Notifications/index.js +1 -1
- package/dist/components/overlays/Notifications/use-notification-state.js +1 -1
- package/dist/components/overlays/Notifications/use-notifications.js +1 -1
- package/dist/components/overlays/Notifications/use-overlay-timers.js +1 -1
- package/dist/components/overlays/Notifications/use-persistent-notifications.js +1 -1
- package/dist/components/overlays/Notifications/use-persistent-state.js +1 -1
- package/dist/components/overlays/Notifications/use-toast-state.js +1 -1
- package/dist/components/overlays/Toast/ToastItem.js +1 -1
- package/dist/components/overlays/Toast/index.js +1 -1
- package/dist/components/overlays/Toast/useProgressToast.js +1 -1
- package/dist/components/overlays/Toast/useToast.js +1 -1
- package/dist/components/overlays/Tooltip/Tooltip.js +1 -1
- package/dist/components/overlays/Tooltip/TooltipProvider.js +1 -1
- package/dist/components/overlays/Tooltip/TooltipTrigger.js +12 -2
- package/dist/components/overlays/Tooltip/TooltipTrigger.js.map +1 -1
- package/dist/components/overlays/Tooltip/context.js +1 -1
- package/dist/components/portal/Portal.js +1 -1
- package/dist/components/portal/PortalProvider.d.ts +2 -0
- package/dist/components/portal/PortalProvider.js +1 -1
- package/dist/components/portal/index.d.ts +1 -0
- package/dist/components/portal/usePortal.js +1 -1
- package/dist/components/shared/DraggableCollection.js +1 -1
- package/dist/components/shared/InvalidIcon.js +1 -1
- package/dist/components/shared/ValidIcon.js +1 -1
- package/dist/components/status/LoadingAnimation/LoadingAnimation.js +1 -1
- package/dist/components/status/Spin/Cube.js +1 -1
- package/dist/components/status/Spin/InternalSpinner.js +1 -1
- package/dist/components/status/Spin/Spin.js +1 -1
- package/dist/components/status/Spin/SpinsContainer.js +1 -1
- package/dist/data/item-themes.js +1 -1
- package/dist/data/themes.js +1 -1
- package/dist/eslint-plugin/defaults.generated.js +1 -1
- package/dist/eslint-plugin/index.js +1 -1
- package/dist/eslint-plugin/rules/no-redundant-default-prop.js +1 -1
- package/dist/i18n/I18nProvider.js +1 -1
- package/dist/i18n/createFormatter.js +1 -1
- package/dist/i18n/index.js +1 -1
- package/dist/i18n/instance.js +1 -1
- package/dist/i18n/locales/de-DE/uikit.js +1 -1
- package/dist/i18n/locales/en-US/uikit.js +1 -1
- package/dist/i18n/locales/es-ES/uikit.js +1 -1
- package/dist/i18n/locales/es-MX/uikit.js +1 -1
- package/dist/i18n/locales/fr-FR/uikit.js +1 -1
- package/dist/i18n/locales/it-IT/uikit.js +1 -1
- package/dist/i18n/locales/ja-JP/uikit.js +1 -1
- package/dist/i18n/locales/nb-NO/uikit.js +1 -1
- package/dist/i18n/locales/pt-BR/uikit.js +1 -1
- package/dist/i18n/locales/pt-PT/uikit.js +1 -1
- package/dist/i18n/locales/sv-SE/uikit.js +1 -1
- package/dist/i18n/locales/vi-VN/uikit.js +1 -1
- package/dist/i18n/locales.js +1 -1
- package/dist/i18n/useFormatter.js +1 -1
- package/dist/i18n/useI18n.js +1 -1
- package/dist/icons/AdjustmentsHorizontalIcon.js +1 -1
- package/dist/icons/AdjustmentsIcon.js +1 -1
- package/dist/icons/AiIcon.js +1 -1
- package/dist/icons/AreaChartIcon.js +1 -1
- package/dist/icons/ArrowNarrowDownIcon.js +1 -1
- package/dist/icons/ArrowNarrowUpIcon.js +1 -1
- package/dist/icons/BackwardIcon.js +1 -1
- package/dist/icons/BarChartIcon.js +1 -1
- package/dist/icons/BellFilledIcon.js +1 -1
- package/dist/icons/BellIcon.js +1 -1
- package/dist/icons/BooleanIcon.js +1 -1
- package/dist/icons/CalendarEditIcon.js +1 -1
- package/dist/icons/CalendarIcon.js +1 -1
- package/dist/icons/CaretDownIcon.js +1 -1
- package/dist/icons/CaretUpIcon.js +1 -1
- package/dist/icons/ChartAreaStackedIcon.js +1 -1
- package/dist/icons/ChartAreaStackedPercentageIcon.js +1 -1
- package/dist/icons/ChartBarGroupedHorizontalIcon.js +1 -1
- package/dist/icons/ChartBarGroupedIcon.js +1 -1
- package/dist/icons/ChartBarHorizontalIcon.js +1 -1
- package/dist/icons/ChartBarLineIcon.js +1 -1
- package/dist/icons/ChartBarStackedHorizontalIcon.js +1 -1
- package/dist/icons/ChartBarStackedIcon.js +1 -1
- package/dist/icons/ChartBarStackedPercentageHorizontalIcon.js +1 -1
- package/dist/icons/ChartBarStackedPercentageIcon.js +1 -1
- package/dist/icons/ChartBoxPlot2Icon.js +1 -1
- package/dist/icons/ChartBoxPlotIcon.js +1 -1
- package/dist/icons/ChartBubbleIcon.js +1 -1
- package/dist/icons/ChartDonut2Icon.js +1 -1
- package/dist/icons/ChartFunnelIcon.js +1 -1
- package/dist/icons/ChartHeatmapIcon.js +1 -1
- package/dist/icons/ChartKPIIcon.js +1 -1
- package/dist/icons/ChartPie2Icon.js +1 -1
- package/dist/icons/ChartScatterIcon.js +1 -1
- package/dist/icons/CheckCircleFilledIcon.js +1 -1
- package/dist/icons/CheckCircleIcon.js +1 -1
- package/dist/icons/CheckIcon.js +1 -1
- package/dist/icons/CircleFilledIcon.js +1 -1
- package/dist/icons/ClearIcon.js +1 -1
- package/dist/icons/CloseCircleFilledIcon.js +1 -1
- package/dist/icons/CloseCircleIcon.js +1 -1
- package/dist/icons/CloseIcon.js +1 -1
- package/dist/icons/CodeIcon.js +1 -1
- package/dist/icons/ColumnTotalIcon.js +1 -1
- package/dist/icons/CopyIcon.js +1 -1
- package/dist/icons/CountIcon.js +1 -1
- package/dist/icons/CubeIcon.js +1 -1
- package/dist/icons/CubePauseIcon.js +1 -1
- package/dist/icons/CubePlayIcon.js +1 -1
- package/dist/icons/CurrencyDollarIcon.js +1 -1
- package/dist/icons/DangerIcon.js +1 -1
- package/dist/icons/DashboardIcon.js +1 -1
- package/dist/icons/DatabaseIcon.js +1 -1
- package/dist/icons/DecimalDecreaseIcon.js +1 -1
- package/dist/icons/DecimalIncreaseIcon.js +1 -1
- package/dist/icons/DirectionIcon.js +1 -1
- package/dist/icons/DonutIcon.js +1 -1
- package/dist/icons/DownIcon.js +1 -1
- package/dist/icons/EditIcon.js +1 -1
- package/dist/icons/ExclamationCircleFilledIcon.js +1 -1
- package/dist/icons/ExclamationCircleIcon.js +1 -1
- package/dist/icons/ExclamationIcon.js +1 -1
- package/dist/icons/EyeIcon.js +1 -1
- package/dist/icons/EyeInvisibleIcon.js +1 -1
- package/dist/icons/FilterIcon.js +1 -1
- package/dist/icons/FolderFilledIcon.js +1 -1
- package/dist/icons/FolderIcon.js +1 -1
- package/dist/icons/FolderOpenFilledIcon.js +1 -1
- package/dist/icons/FolderOpenIcon.js +1 -1
- package/dist/icons/ForwardIcon.js +1 -1
- package/dist/icons/GripVerticalIcon.js +1 -1
- package/dist/icons/HierarchyIcon.js +1 -1
- package/dist/icons/HierarchyOpenIcon.js +1 -1
- package/dist/icons/Icon.js +1 -1
- package/dist/icons/InfoCircleIcon.js +1 -1
- package/dist/icons/InfoIcon.js +1 -1
- package/dist/icons/KeyIcon.js +1 -1
- package/dist/icons/LeftIcon.js +1 -1
- package/dist/icons/LineChartIcon.js +1 -1
- package/dist/icons/LoadingIcon.js +1 -1
- package/dist/icons/LockFilledIcon.js +1 -1
- package/dist/icons/LockIcon.js +1 -1
- package/dist/icons/MoreIcon.js +1 -1
- package/dist/icons/NotAllowedIcon.js +1 -1
- package/dist/icons/Number123Icon.js +1 -1
- package/dist/icons/NumberIcon.js +1 -1
- package/dist/icons/PauseCircleFilledIcon.js +1 -1
- package/dist/icons/PauseCircleIcon.js +1 -1
- package/dist/icons/PauseIcon.js +1 -1
- package/dist/icons/PercentageIcon.js +1 -1
- package/dist/icons/PieChartIcon.js +1 -1
- package/dist/icons/PipetteIcon.js +1 -1
- package/dist/icons/PlayCircleIcon.js +1 -1
- package/dist/icons/PlayIcon.js +1 -1
- package/dist/icons/PlusIcon.js +1 -1
- package/dist/icons/ProgressBarIcon.js +1 -1
- package/dist/icons/ReloadIcon.js +1 -1
- package/dist/icons/ReportIcon.js +1 -1
- package/dist/icons/ReturnIcon.js +1 -1
- package/dist/icons/RightIcon.js +1 -1
- package/dist/icons/RowTotalsIcon.js +1 -1
- package/dist/icons/SchemeIcon.js +1 -1
- package/dist/icons/SearchIcon.js +1 -1
- package/dist/icons/SemanticQueryIcon.js +1 -1
- package/dist/icons/SettingsIcon.js +1 -1
- package/dist/icons/ShieldFilledIcon.js +1 -1
- package/dist/icons/ShieldIcon.js +1 -1
- package/dist/icons/SlashIcon.js +1 -1
- package/dist/icons/SparklesIcon.js +1 -1
- package/dist/icons/SqlIcon.js +1 -1
- package/dist/icons/StatsIcon.js +1 -1
- package/dist/icons/StopIcon.js +1 -1
- package/dist/icons/StringIcon.js +1 -1
- package/dist/icons/SubtotalsIcon.js +1 -1
- package/dist/icons/SwitchIcon.js +1 -1
- package/dist/icons/TableIcon.js +1 -1
- package/dist/icons/ThumbsDownIcon.js +1 -1
- package/dist/icons/ThumbsUpIcon.js +1 -1
- package/dist/icons/ThunderboltCrossedIcon.js +1 -1
- package/dist/icons/ThunderboltFilledIcon.js +1 -1
- package/dist/icons/ThunderboltIcon.js +1 -1
- package/dist/icons/TimeIcon.js +1 -1
- package/dist/icons/TrashIcon.js +1 -1
- package/dist/icons/UnlockIcon.js +1 -1
- package/dist/icons/UpIcon.js +1 -1
- package/dist/icons/UserGroupIcon.js +1 -1
- package/dist/icons/UserIcon.js +1 -1
- package/dist/icons/UserLockIcon.js +1 -1
- package/dist/icons/ViewIcon.js +1 -1
- package/dist/icons/WarningFilledIcon.js +1 -1
- package/dist/icons/WarningIcon.js +1 -1
- package/dist/icons/wrap-icon.js +1 -1
- package/dist/index.d.ts +13 -4
- package/dist/index.js +4 -4
- package/dist/probe/canonicalize.js +1 -1
- package/dist/probe/css.js +1 -1
- package/dist/probe/index.js +1 -1
- package/dist/provider.js +1 -1
- package/dist/providers/TrackingProvider.js +1 -1
- package/dist/providers/navigationAdapter.default.js +1 -1
- package/dist/shared/form.d.ts +28 -6
- package/dist/shared/index.d.ts +1 -1
- package/dist/tokens/all-tokens.js +1 -1
- package/dist/tokens/base.js +1 -1
- package/dist/tokens/color-seed.js +1 -1
- package/dist/tokens/color-theme.js +1 -1
- package/dist/tokens/colors.js +1 -1
- package/dist/tokens/layout.js +1 -1
- package/dist/tokens/lazy-styles.js +1 -1
- package/dist/tokens/legacy-color.js +1 -1
- package/dist/tokens/palette-config.js +1 -1
- package/dist/tokens/palette.js +1 -1
- package/dist/tokens/resolve.js +1 -1
- package/dist/tokens/shadows.js +1 -1
- package/dist/tokens/sizes.js +1 -1
- package/dist/tokens/spacing.js +1 -1
- package/dist/tokens/typography.js +1 -1
- package/dist/utils/ResizeSensor.js +1 -1
- package/dist/utils/colors.js +1 -1
- package/dist/utils/dotize.js +1 -1
- package/dist/utils/is-dev-env.js +1 -1
- package/dist/utils/modules.js +1 -1
- package/dist/utils/promise.js +1 -1
- package/dist/utils/raf.js +1 -1
- package/dist/utils/random.js +1 -1
- package/dist/utils/range.js +1 -1
- package/dist/utils/react/RenderCache.js +1 -1
- package/dist/utils/react/Slots.js +1 -1
- package/dist/utils/react/chain.js +1 -1
- package/dist/utils/react/disabledProps.js +1 -1
- package/dist/utils/react/escapePropagation.js +39 -0
- package/dist/utils/react/escapePropagation.js.map +1 -0
- package/dist/utils/react/forwardRefWithGenerics.js +1 -1
- package/dist/utils/react/index.js +1 -1
- package/dist/utils/react/interactions.js +1 -1
- package/dist/utils/react/isTextOnly.js +1 -1
- package/dist/utils/react/mapProps.js +1 -1
- package/dist/utils/react/mergeProps.js +1 -1
- package/dist/utils/react/nullableValue.js +1 -1
- package/dist/utils/react/programmaticFocus.js +58 -0
- package/dist/utils/react/programmaticFocus.js.map +1 -0
- package/dist/utils/react/resolveIcon.js +1 -1
- package/dist/utils/react/sharedStore.js +1 -1
- package/dist/utils/react/useBufferedValue.js +1 -1
- package/dist/utils/react/useCombinedRefs.js +1 -1
- package/dist/utils/react/useControlledFocusVisible.js +1 -1
- package/dist/utils/react/useEventBus.js +1 -1
- package/dist/utils/react/useId.js +1 -1
- package/dist/utils/react/useIsDarwin.js +1 -1
- package/dist/utils/react/useKeySymbols.js +1 -1
- package/dist/utils/react/useLayoutEffect.js +1 -1
- package/dist/utils/react/useLocalStorage.js +1 -1
- package/dist/utils/react/useMergeStyles.js +1 -1
- package/dist/utils/react/useOverlayEscapeGuard.js +41 -0
- package/dist/utils/react/useOverlayEscapeGuard.js.map +1 -0
- package/dist/utils/react/usePopoverSync.js +1 -1
- package/dist/utils/react/useQaProps.js +1 -1
- package/dist/utils/react/useScheme.js +1 -1
- package/dist/utils/react/useViewportSize.js +1 -1
- package/dist/utils/react/wrapNodeIfPlain.js +1 -1
- package/dist/utils/selection.js +1 -1
- package/dist/utils/styles.js +1 -1
- package/dist/utils/tree.js +1 -1
- package/dist/utils/warnings.js +1 -1
- package/dist/version.js +3 -3
- package/docs/CreateComponent.md +4 -0
- package/docs/FieldProperties.md +25 -13
- package/docs/Usage.md +17 -29
- package/docs/components/fields/FileInput.md +4 -0
- package/docs/components/form/Field.md +2 -2
- package/docs/components/form/Form.md +26 -2
- package/docs/components/form/FormInstance.md +5 -9
- package/docs/components/form/ModernForm.md +269 -0
- package/docs/modern-form-guide.md +269 -0
- package/docs/modern-form-migration.md +65 -0
- package/docs/modern-form-typecheck.md +35 -0
- package/package.json +12 -3
|
@@ -1,15 +1,22 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.181.0 | Cube Dev Team */
|
|
2
2
|
import { useI18n } from "../../../i18n/useI18n.js";
|
|
3
|
+
import { ModernControllerContext } from "./modern/context.js";
|
|
3
4
|
import { FormContext } from "./Form.js";
|
|
5
|
+
import { useFormSelector } from "./modern/react.js";
|
|
4
6
|
import { Alert } from "../../content/Alert/Alert.js";
|
|
5
7
|
import { forwardRef, isValidElement, useContext } from "react";
|
|
6
8
|
import { jsx } from "react/jsx-runtime";
|
|
7
9
|
|
|
8
10
|
//#region src/components/form/Form/SubmitError.tsx
|
|
9
|
-
function
|
|
10
|
-
let { submitError } = useContext(FormContext);
|
|
11
|
+
function ErrorAlert({ submitError, renderError, ...props }, ref) {
|
|
11
12
|
const { t } = useI18n();
|
|
12
13
|
if (!submitError) return null;
|
|
14
|
+
if (renderError) return /* @__PURE__ */ jsx(Alert, {
|
|
15
|
+
ref,
|
|
16
|
+
theme: "danger",
|
|
17
|
+
...props,
|
|
18
|
+
children: renderError(submitError)
|
|
19
|
+
});
|
|
13
20
|
if (!isValidElement(submitError) && typeof submitError !== "string") submitError = t("form.internalError", "Internal error");
|
|
14
21
|
return /* @__PURE__ */ jsx(Alert, {
|
|
15
22
|
ref,
|
|
@@ -18,6 +25,29 @@ function SubmitError(props, ref) {
|
|
|
18
25
|
children: submitError
|
|
19
26
|
});
|
|
20
27
|
}
|
|
28
|
+
const ForwardedErrorAlert = forwardRef(ErrorAlert);
|
|
29
|
+
function ModernSubmitError({ form, alertRef, ...props }) {
|
|
30
|
+
const submitError = useFormSelector(form, (state) => state.submitError);
|
|
31
|
+
return /* @__PURE__ */ jsx(ForwardedErrorAlert, {
|
|
32
|
+
...props,
|
|
33
|
+
ref: alertRef,
|
|
34
|
+
submitError
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
function SubmitError({ form, ...props }, ref) {
|
|
38
|
+
const context = useContext(ModernControllerContext);
|
|
39
|
+
const modern = form ?? context;
|
|
40
|
+
const legacy = useContext(FormContext);
|
|
41
|
+
return modern ? /* @__PURE__ */ jsx(ModernSubmitError, {
|
|
42
|
+
...props,
|
|
43
|
+
form: modern,
|
|
44
|
+
alertRef: ref
|
|
45
|
+
}) : /* @__PURE__ */ jsx(ForwardedErrorAlert, {
|
|
46
|
+
...props,
|
|
47
|
+
ref,
|
|
48
|
+
submitError: legacy.submitError
|
|
49
|
+
});
|
|
50
|
+
}
|
|
21
51
|
/**
|
|
22
52
|
* An alert that shows a form error message received from the onSubmit callback.
|
|
23
53
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SubmitError.js","names":[],"sources":["../../../../src/components/form/Form/SubmitError.tsx"],"sourcesContent":["import {\n ForwardedRef,\n forwardRef,\n isValidElement,\n ReactNode,\n useContext,\n} from 'react';\n\nimport { useI18n } from '../../../i18n';\nimport { Alert, CubeAlertProps } from '../../content/Alert/index';\n\nimport { FormContext } from './Form';\n\ntype SubmitErrorContextProps = {\n submitError?: unknown;\n};\n\
|
|
1
|
+
{"version":3,"file":"SubmitError.js","names":[],"sources":["../../../../src/components/form/Form/SubmitError.tsx"],"sourcesContent":["import {\n ForwardedRef,\n forwardRef,\n isValidElement,\n ReactNode,\n useContext,\n} from 'react';\n\nimport { useI18n } from '../../../i18n';\nimport { Alert, CubeAlertProps } from '../../content/Alert/index';\n\nimport { FormContext } from './Form';\nimport { ModernControllerContext } from './modern/context';\nimport { useFormSelector } from './modern/react';\n\nimport type { FormController } from './modern/controller';\n\ntype SubmitErrorContextProps = {\n submitError?: unknown;\n};\n\nexport interface CubeSubmitErrorProps extends CubeAlertProps {\n form?: FormController<any>;\n renderError?: (error: unknown) => ReactNode;\n}\n\nfunction ErrorAlert(\n {\n submitError,\n renderError,\n ...props\n }: CubeSubmitErrorProps & SubmitErrorContextProps,\n ref: ForwardedRef<HTMLDivElement>,\n) {\n const { t } = useI18n();\n\n if (!submitError) {\n return null;\n }\n\n if (renderError)\n return (\n <Alert ref={ref} theme=\"danger\" {...props}>\n {renderError(submitError)}\n </Alert>\n );\n\n if (\n !isValidElement(submitError as ReactNode) &&\n typeof submitError !== 'string'\n ) {\n submitError = t('form.internalError', 'Internal error');\n }\n\n return (\n <Alert ref={ref} theme=\"danger\" {...props}>\n {submitError as ReactNode}\n </Alert>\n );\n}\n\nconst ForwardedErrorAlert = forwardRef(ErrorAlert);\n\nfunction ModernSubmitError({\n form,\n alertRef,\n ...props\n}: CubeSubmitErrorProps & {\n form: FormController<any>;\n alertRef: ForwardedRef<HTMLDivElement>;\n}) {\n const submitError = useFormSelector(form, (state) => state.submitError);\n return (\n <ForwardedErrorAlert {...props} ref={alertRef} submitError={submitError} />\n );\n}\n\nfunction SubmitError(\n { form, ...props }: CubeSubmitErrorProps,\n ref: ForwardedRef<HTMLDivElement>,\n) {\n const context = useContext(ModernControllerContext);\n const modern = form ?? context;\n const legacy = useContext(FormContext) as SubmitErrorContextProps;\n return modern ? (\n <ModernSubmitError {...props} form={modern} alertRef={ref} />\n ) : (\n <ForwardedErrorAlert\n {...props}\n ref={ref}\n submitError={legacy.submitError}\n />\n );\n}\n\n/**\n * An alert that shows a form error message received from the onSubmit callback.\n */\nconst _SubmitError = forwardRef(SubmitError);\n\n_SubmitError.displayName = 'SubmitError';\n\nexport { _SubmitError as SubmitError };\n"],"mappings":";;;;;;;;;;AA0BA,SAAS,WACP,EACE,aACA,aACA,GAAG,SAEL,KACA;CACA,MAAM,EAAE,MAAM,SAAS;AAEvB,KAAI,CAAC,YACH,QAAO;AAGT,KAAI,YACF,QACE,oBAAC;EAAW;EAAK,OAAM;EAAS,GAAI;YACjC,YAAY,YAAY;GACnB;AAGZ,KACE,CAAC,eAAe,YAAyB,IACzC,OAAO,gBAAgB,SAEvB,eAAc,EAAE,sBAAsB,iBAAiB;AAGzD,QACE,oBAAC;EAAW;EAAK,OAAM;EAAS,GAAI;YACjC;GACK;;AAIZ,MAAM,sBAAsB,WAAW,WAAW;AAElD,SAAS,kBAAkB,EACzB,MACA,UACA,GAAG,SAIF;CACD,MAAM,cAAc,gBAAgB,OAAO,UAAU,MAAM,YAAY;AACvE,QACE,oBAAC;EAAoB,GAAI;EAAO,KAAK;EAAuB;GAAe;;AAI/E,SAAS,YACP,EAAE,MAAM,GAAG,SACX,KACA;CACA,MAAM,UAAU,WAAW,wBAAwB;CACnD,MAAM,SAAS,QAAQ;CACvB,MAAM,SAAS,WAAW,YAAY;AACtC,QAAO,SACL,oBAAC;EAAkB,GAAI;EAAO,MAAM;EAAQ,UAAU;GAAO,GAE7D,oBAAC;EACC,GAAI;EACC;EACL,aAAa,OAAO;GACpB;;;;;AAON,MAAM,eAAe,WAAW,YAAY;AAE5C,aAAa,cAAc"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
|
|
2
|
+
import { FormController } from "./modern/controller.js";
|
|
3
|
+
|
|
4
|
+
//#region src/components/form/Form/backend.d.ts
|
|
5
|
+
/**
|
|
6
|
+
* Nominal branding for the two Form backends (modernization plan §5.1).
|
|
7
|
+
*
|
|
8
|
+
* The legacy engine (`CubeFormInstance`) and the modern controller are not
|
|
9
|
+
* structurally interchangeable: each carries this symbol with its backend
|
|
10
|
+
* kind, the `<Form>` facade dispatches on it before any backend hook runs, and
|
|
11
|
+
* the legacy field adapter refuses a controller it cannot bind.
|
|
12
|
+
*
|
|
13
|
+
* Modern controllers support creation, selectors, fields, validation, and submission.
|
|
14
|
+
* Legacy-only APIs reject them explicitly.
|
|
15
|
+
*/
|
|
16
|
+
declare const FORM_BACKEND: unique symbol;
|
|
17
|
+
interface LegacyFormBrand {
|
|
18
|
+
readonly [FORM_BACKEND]: 'legacy';
|
|
19
|
+
}
|
|
20
|
+
interface ModernFormBrand {
|
|
21
|
+
readonly [FORM_BACKEND]: 'modern';
|
|
22
|
+
}
|
|
23
|
+
//#endregion
|
|
24
|
+
export { FORM_BACKEND, LegacyFormBrand, ModernFormBrand };
|
|
25
|
+
//# sourceMappingURL=backend.d.ts.map
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.181.0 | Cube Dev Team */
|
|
2
|
+
//#region src/components/form/Form/backend.ts
|
|
3
|
+
/**
|
|
4
|
+
* Nominal branding for the two Form backends (modernization plan §5.1).
|
|
5
|
+
*
|
|
6
|
+
* The legacy engine (`CubeFormInstance`) and the modern controller are not
|
|
7
|
+
* structurally interchangeable: each carries this symbol with its backend
|
|
8
|
+
* kind, the `<Form>` facade dispatches on it before any backend hook runs, and
|
|
9
|
+
* the legacy field adapter refuses a controller it cannot bind.
|
|
10
|
+
*
|
|
11
|
+
* Modern controllers support creation, selectors, fields, validation, and submission.
|
|
12
|
+
* Legacy-only APIs reject them explicitly.
|
|
13
|
+
*/
|
|
14
|
+
const FORM_BACKEND = Symbol.for("@cube-dev/ui-kit/form-backend");
|
|
15
|
+
/**
|
|
16
|
+
* Only a modern brand is ever checked. Anything else — a branded legacy
|
|
17
|
+
* instance, but also an unbranded object — counts as legacy on purpose: Cloud
|
|
18
|
+
* narrows form props to structural types and its tests pass plain mocks, and
|
|
19
|
+
* the legacy engine has always accepted them.
|
|
20
|
+
*/
|
|
21
|
+
function isModernFormController(value) {
|
|
22
|
+
return !!value && typeof value === "object" && value[FORM_BACKEND] === "modern";
|
|
23
|
+
}
|
|
24
|
+
function modernBackendUnavailableError(receiver) {
|
|
25
|
+
return /* @__PURE__ */ new Error(`${receiver} received a modern form controller, but this legacy API does not support modern controllers. Use named inputs or useFieldProps with a modern controller; Form.Item and Form.useForm() remain legacy-only.`);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
//#endregion
|
|
29
|
+
export { FORM_BACKEND, isModernFormController, modernBackendUnavailableError };
|
|
30
|
+
//# sourceMappingURL=backend.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backend.js","names":[],"sources":["../../../../src/components/form/Form/backend.ts"],"sourcesContent":["/**\n * Nominal branding for the two Form backends (modernization plan §5.1).\n *\n * The legacy engine (`CubeFormInstance`) and the modern controller are not\n * structurally interchangeable: each carries this symbol with its backend\n * kind, the `<Form>` facade dispatches on it before any backend hook runs, and\n * the legacy field adapter refuses a controller it cannot bind.\n *\n * Modern controllers support creation, selectors, fields, validation, and submission.\n * Legacy-only APIs reject them explicitly.\n */\nexport const FORM_BACKEND: unique symbol = Symbol.for(\n '@cube-dev/ui-kit/form-backend',\n);\n\nexport interface LegacyFormBrand {\n readonly [FORM_BACKEND]: 'legacy';\n}\n\nexport interface ModernFormBrand {\n readonly [FORM_BACKEND]: 'modern';\n}\n\nexport type { FormController } from './modern/controller';\n\n/**\n * Only a modern brand is ever checked. Anything else — a branded legacy\n * instance, but also an unbranded object — counts as legacy on purpose: Cloud\n * narrows form props to structural types and its tests pass plain mocks, and\n * the legacy engine has always accepted them.\n */\nexport function isModernFormController(\n value: unknown,\n): value is ModernFormBrand {\n return (\n !!value &&\n typeof value === 'object' &&\n (value as Record<PropertyKey, unknown>)[FORM_BACKEND] === 'modern'\n );\n}\n\nexport function modernBackendUnavailableError(receiver: string): Error {\n return new Error(\n `${receiver} received a modern form controller, but this legacy API does not support modern controllers. Use named inputs or useFieldProps with a modern controller; Form.Item and Form.useForm() remain legacy-only.`,\n );\n}\n"],"mappings":";;;;;;;;;;;;;AAWA,MAAa,eAA8B,OAAO,IAChD,gCACD;;;;;;;AAkBD,SAAgB,uBACd,OAC0B;AAC1B,QACE,CAAC,CAAC,SACF,OAAO,UAAU,YAChB,MAAuC,kBAAkB;;AAI9D,SAAgB,8BAA8B,UAAyB;AACrE,wBAAO,IAAI,MACT,GAAG,SAAS,2MACb"}
|
|
@@ -1,15 +1,23 @@
|
|
|
1
1
|
|
|
2
|
+
import { FormPath } from "./modern/values.js";
|
|
3
|
+
import { FormValueAtPath } from "./modern/path-types.js";
|
|
4
|
+
import { FormReadValue, FormValues } from "./modern/read-types.js";
|
|
5
|
+
import { ModernValidationContext } from "./modern/validation.js";
|
|
6
|
+
import { FormChange, ModernSubmitContext, SetValueOptions } from "./modern/types.js";
|
|
7
|
+
import { FormController, ModernFieldState, ModernFieldValidationResult, ModernFormState, ModernSubmitFailure, ModernSubmitResult, ModernValidationResult, ModernValidationRule, UseFormControllerOptions } from "./modern/controller.js";
|
|
8
|
+
import { FormField, FormFieldContext, FormFieldOptions } from "./modern/field.js";
|
|
2
9
|
import { FieldTypes, Fields } from "./types.js";
|
|
3
10
|
import { CubeFormInstance, useForm } from "./use-form.js";
|
|
4
|
-
import {
|
|
11
|
+
import { ModernFormProps } from "./ModernFormRoot.js";
|
|
12
|
+
import { CubeFormProps, FormContext, FormRootComponent, FormScopeMask, useFormProps } from "./Form.js";
|
|
5
13
|
import { CubeSubmitButtonProps, _SubmitButton } from "./SubmitButton/SubmitButton.js";
|
|
6
14
|
import "./SubmitButton/index.js";
|
|
7
15
|
import { CubeResetButtonProps, _ResetButton } from "./ResetButton/ResetButton.js";
|
|
8
16
|
import "./ResetButton/index.js";
|
|
9
|
-
import {
|
|
10
|
-
import "../../content/Alert/index.js";
|
|
17
|
+
import { CubeSubmitErrorProps, _SubmitError } from "./SubmitError.js";
|
|
11
18
|
import { Field } from "./Field.js";
|
|
12
|
-
import {
|
|
19
|
+
import { useFormControllerContext } from "./modern/context.js";
|
|
20
|
+
import { FormSelectorOptions, FormSubscribe, FormSubscribeProps, useFormController, useFormFieldState, useFormSelector, useFormValue } from "./modern/react.js";
|
|
13
21
|
import { FieldReturnValue, UseFieldProps } from "./use-field/types.js";
|
|
14
22
|
import { UseFieldParams, useField } from "./use-field/use-field.js";
|
|
15
23
|
import { UseFieldPropsParams, useFieldProps } from "./use-field/use-field-props.js";
|
|
@@ -18,20 +26,30 @@ import * as react from "react";
|
|
|
18
26
|
import * as _react_types_shared0 from "@react-types/shared";
|
|
19
27
|
|
|
20
28
|
//#region src/components/form/Form/index.d.ts
|
|
21
|
-
declare const Form:
|
|
22
|
-
ref?: react.Ref<HTMLFormElement>;
|
|
23
|
-
}) => react.ReactElement) & {
|
|
29
|
+
declare const Form: FormRootComponent & {
|
|
24
30
|
Item: typeof Field;
|
|
25
31
|
SubmitError: typeof _SubmitError;
|
|
26
32
|
Submit: typeof _SubmitButton;
|
|
27
33
|
Reset: typeof _ResetButton;
|
|
28
34
|
useForm: typeof useForm;
|
|
35
|
+
useController: typeof useFormController;
|
|
36
|
+
useSelector: typeof useFormSelector;
|
|
37
|
+
useValue: typeof useFormValue;
|
|
38
|
+
useFieldState: typeof useFormFieldState;
|
|
39
|
+
Subscribe: typeof FormSubscribe;
|
|
40
|
+
useControllerContext: typeof useFormControllerContext;
|
|
29
41
|
} & {
|
|
30
42
|
Item: typeof Field;
|
|
31
43
|
useForm: typeof useForm;
|
|
44
|
+
useController: typeof useFormController;
|
|
45
|
+
useSelector: typeof useFormSelector;
|
|
46
|
+
useValue: typeof useFormValue;
|
|
47
|
+
useFieldState: typeof useFormFieldState;
|
|
48
|
+
Subscribe: typeof FormSubscribe;
|
|
49
|
+
useControllerContext: typeof useFormControllerContext;
|
|
32
50
|
Submit: react.ForwardRefExoticComponent<Omit<CubeSubmitButtonProps<FieldTypes>, "ref"> & react.RefAttributes<_react_types_shared0.FocusableRefValue<HTMLElement, HTMLElement>>>;
|
|
33
51
|
Reset: react.ForwardRefExoticComponent<Omit<CubeResetButtonProps<FieldTypes>, "ref"> & react.RefAttributes<_react_types_shared0.FocusableRefValue<HTMLElement, HTMLElement>>>;
|
|
34
|
-
SubmitError: react.ForwardRefExoticComponent<
|
|
52
|
+
SubmitError: react.ForwardRefExoticComponent<CubeSubmitErrorProps & react.RefAttributes<HTMLDivElement>>;
|
|
35
53
|
};
|
|
36
54
|
//#endregion
|
|
37
55
|
export { Form };
|
|
@@ -1,9 +1,11 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.181.0 | Cube Dev Team */
|
|
2
|
+
import { useFormControllerContext } from "./modern/context.js";
|
|
2
3
|
import { useForm } from "./use-form.js";
|
|
3
|
-
import { FormContext, _Form, useFormProps } from "./Form.js";
|
|
4
|
+
import { FormContext, FormScopeMask, _Form, useFormProps } from "./Form.js";
|
|
4
5
|
import { useField } from "./use-field/use-field.js";
|
|
5
6
|
import { useFieldProps } from "./use-field/use-field-props.js";
|
|
6
7
|
import { Field } from "./Field.js";
|
|
8
|
+
import { FormSubscribe, useFormController, useFormFieldState, useFormSelector, useFormValue } from "./modern/react.js";
|
|
7
9
|
import { _ResetButton } from "./ResetButton/ResetButton.js";
|
|
8
10
|
import { _SubmitButton } from "./SubmitButton/SubmitButton.js";
|
|
9
11
|
import { _SubmitError } from "./SubmitError.js";
|
|
@@ -12,6 +14,12 @@ import { _SubmitError } from "./SubmitError.js";
|
|
|
12
14
|
const Form = Object.assign(_Form, {
|
|
13
15
|
Item: Field,
|
|
14
16
|
useForm,
|
|
17
|
+
useController: useFormController,
|
|
18
|
+
useSelector: useFormSelector,
|
|
19
|
+
useValue: useFormValue,
|
|
20
|
+
useFieldState: useFormFieldState,
|
|
21
|
+
Subscribe: FormSubscribe,
|
|
22
|
+
useControllerContext: useFormControllerContext,
|
|
15
23
|
Submit: _SubmitButton,
|
|
16
24
|
Reset: _ResetButton,
|
|
17
25
|
SubmitError: _SubmitError
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["SubmitButton","ResetButton"],"sources":["../../../../src/components/form/Form/index.ts"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"file":"index.js","names":["SubmitButton","ResetButton"],"sources":["../../../../src/components/form/Form/index.ts"],"sourcesContent":["import { Field } from './Field';\nimport {\n Form as _Form,\n FormContext,\n FormScopeMask,\n useFormProps,\n} from './Form';\nimport { useFormControllerContext } from './modern/context';\nimport {\n FormSubscribe,\n useFormController,\n useFormFieldState,\n useFormSelector,\n useFormValue,\n} from './modern/react';\nimport { ResetButton } from './ResetButton';\nimport { SubmitButton } from './SubmitButton';\nimport { SubmitError } from './SubmitError';\nimport { useForm } from './use-form';\n\nconst Form = Object.assign(\n _Form as typeof _Form & {\n Item: typeof Field;\n SubmitError: typeof SubmitError;\n Submit: typeof SubmitButton;\n Reset: typeof ResetButton;\n useForm: typeof useForm;\n useController: typeof useFormController;\n useSelector: typeof useFormSelector;\n useValue: typeof useFormValue;\n useFieldState: typeof useFormFieldState;\n Subscribe: typeof FormSubscribe;\n useControllerContext: typeof useFormControllerContext;\n },\n {\n Item: Field,\n useForm,\n useController: useFormController,\n useSelector: useFormSelector,\n useValue: useFormValue,\n useFieldState: useFormFieldState,\n Subscribe: FormSubscribe,\n useControllerContext: useFormControllerContext,\n Submit: SubmitButton,\n Reset: ResetButton,\n SubmitError,\n },\n);\n\nexport * from './SubmitError';\nexport * from './SubmitButton';\nexport * from './ResetButton';\nexport * from './use-field';\nexport { useFormProps, Form, Field, useForm, FormContext, FormScopeMask };\nexport type { CubeFormProps } from './Form';\nexport type { ModernFormProps } from './ModernFormRoot';\nexport type {\n FormController,\n ModernFormState,\n ModernFieldState,\n ModernSubmitFailure,\n UseFormControllerOptions,\n ModernValidationRule,\n ModernValidationResult,\n ModernFieldValidationResult,\n ModernSubmitResult,\n} from './modern/controller';\nexport type { FormSelectorOptions, FormSubscribeProps } from './modern/react';\nexport type {\n FormChange,\n SetValueOptions,\n ModernSubmitContext,\n} from './modern/types';\nexport type { ModernValidationContext } from './modern/validation';\nexport type { FormPath } from './modern/values';\nexport type { FormValueAtPath } from './modern/path-types';\nexport type { CubeFormInstance } from './use-form';\nexport type { FieldTypes, Fields } from './types';\n\nexport type {\n FormField,\n FormFieldOptions,\n FormFieldContext,\n} from './modern/field';\nexport type { FormReadValue, FormValues } from './modern/read-types';\n"],"mappings":";;;;;;;;;;;;;AAoBA,MAAM,OAAO,OAAO,OAClB,OAaA;CACE,MAAM;CACN;CACA,eAAe;CACf,aAAa;CACb,UAAU;CACV,eAAe;CACf,WAAW;CACX,sBAAsB;CACtB,QAAQA;CACR,OAAOC;CACP;CACD,CACF"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.181.0 | Cube Dev Team */
|
|
2
|
+
import { useEvent } from "../../../../_internal/hooks/use-event.js";
|
|
3
|
+
import { useProviderProps } from "../../../../provider.js";
|
|
4
|
+
import { Button } from "../../../actions/Button/Button.js";
|
|
5
|
+
import { getControllerInternals } from "./controller.js";
|
|
6
|
+
import { useFormSelector } from "./react.js";
|
|
7
|
+
import { jsx } from "react/jsx-runtime";
|
|
8
|
+
|
|
9
|
+
//#region src/components/form/Form/modern/actions.tsx
|
|
10
|
+
function ModernSubmitButton({ form, buttonRef, onClick, disableOnInvalid = false, ...props }) {
|
|
11
|
+
const { isDisabled: contextDisabled } = useProviderProps({});
|
|
12
|
+
const submitting = useFormSelector(form, (state) => state.isSubmitting);
|
|
13
|
+
const invalid = useFormSelector(form, (state) => state.isInvalid);
|
|
14
|
+
const click = useEvent((event) => {
|
|
15
|
+
onClick?.(event);
|
|
16
|
+
if (event.defaultPrevented) return;
|
|
17
|
+
const root = getControllerInternals(form, "<Form.Submit>").getRootElement();
|
|
18
|
+
const button = event.currentTarget;
|
|
19
|
+
if (root && button.form === root && button.type === "submit") return;
|
|
20
|
+
event.preventDefault();
|
|
21
|
+
if (root?.isConnected) root.requestSubmit();
|
|
22
|
+
else form.submit();
|
|
23
|
+
});
|
|
24
|
+
return /* @__PURE__ */ jsx(Button, {
|
|
25
|
+
ref: buttonRef,
|
|
26
|
+
type: "primary",
|
|
27
|
+
htmlType: "submit",
|
|
28
|
+
isLoading: submitting,
|
|
29
|
+
...props,
|
|
30
|
+
onClick: click,
|
|
31
|
+
isDisabled: contextDisabled || props.isDisabled || submitting || disableOnInvalid && invalid
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
function ModernResetButton({ form, buttonRef, onClick, ...props }) {
|
|
35
|
+
const { isDisabled: contextDisabled } = useProviderProps({});
|
|
36
|
+
const canReset = useFormSelector(form, (state) => state.canReset);
|
|
37
|
+
const reset = useEvent((event) => {
|
|
38
|
+
onClick?.(event);
|
|
39
|
+
if (event.defaultPrevented) return;
|
|
40
|
+
const root = getControllerInternals(form, "<Form.Reset>").getRootElement();
|
|
41
|
+
const button = event.currentTarget;
|
|
42
|
+
if (root && button.form === root && button.type === "reset") return;
|
|
43
|
+
event.preventDefault();
|
|
44
|
+
if (root?.isConnected) root.reset();
|
|
45
|
+
else form.reset();
|
|
46
|
+
});
|
|
47
|
+
return /* @__PURE__ */ jsx(Button, {
|
|
48
|
+
ref: buttonRef,
|
|
49
|
+
type: "primary",
|
|
50
|
+
htmlType: "button",
|
|
51
|
+
...props,
|
|
52
|
+
onClick: reset,
|
|
53
|
+
isDisabled: contextDisabled || props.isDisabled || !canReset
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
//#endregion
|
|
58
|
+
export { ModernResetButton, ModernSubmitButton };
|
|
59
|
+
//# sourceMappingURL=actions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"actions.js","names":[],"sources":["../../../../../src/components/form/Form/modern/actions.tsx"],"sourcesContent":["import { useEvent } from '../../../../_internal/hooks/use-event';\nimport { useProviderProps } from '../../../../provider';\nimport { Button } from '../../../actions/Button/Button';\n\nimport { getControllerInternals } from './controller';\nimport { useFormSelector } from './react';\n\nimport type { FocusableRef } from '@react-types/shared';\nimport type { MouseEvent } from 'react';\nimport type { CubeButtonProps } from '../../../actions/Button/Button';\nimport type { FormController } from './controller';\n\nexport function ModernSubmitButton({\n form,\n buttonRef,\n onClick,\n disableOnInvalid = false,\n ...props\n}: CubeButtonProps & {\n form: FormController<any>;\n buttonRef: FocusableRef<HTMLElement>;\n disableOnInvalid?: boolean;\n}) {\n const { isDisabled: contextDisabled } = useProviderProps(\n {} as CubeButtonProps,\n );\n const submitting = useFormSelector(form, (state) => state.isSubmitting);\n const invalid = useFormSelector(form, (state) => state.isInvalid);\n const click = useEvent((event: MouseEvent<HTMLElement>) => {\n onClick?.(event);\n if (event.defaultPrevented) return;\n const root = getControllerInternals(form, '<Form.Submit>').getRootElement();\n const button = event.currentTarget as HTMLButtonElement;\n if (root && button.form === root && button.type === 'submit') return;\n event.preventDefault();\n if (root?.isConnected) root.requestSubmit();\n else void form.submit();\n });\n return (\n <Button\n ref={buttonRef}\n type=\"primary\"\n htmlType=\"submit\"\n isLoading={submitting}\n {...props}\n onClick={click}\n isDisabled={\n contextDisabled ||\n props.isDisabled ||\n submitting ||\n (disableOnInvalid && invalid)\n }\n />\n );\n}\n\nexport function ModernResetButton({\n form,\n buttonRef,\n onClick,\n ...props\n}: CubeButtonProps & {\n form: FormController<any>;\n buttonRef: FocusableRef<HTMLElement>;\n}) {\n const { isDisabled: contextDisabled } = useProviderProps(\n {} as CubeButtonProps,\n );\n const canReset = useFormSelector(form, (state) => state.canReset);\n const reset = useEvent((event: MouseEvent<HTMLElement>) => {\n onClick?.(event);\n if (event.defaultPrevented) return;\n const root = getControllerInternals(form, '<Form.Reset>').getRootElement();\n const button = event.currentTarget as HTMLButtonElement;\n if (root && button.form === root && button.type === 'reset') return;\n event.preventDefault();\n if (root?.isConnected) root.reset();\n else form.reset();\n });\n return (\n <Button\n ref={buttonRef}\n type=\"primary\"\n htmlType=\"button\"\n {...props}\n onClick={reset}\n isDisabled={contextDisabled || props.isDisabled || !canReset}\n />\n );\n}\n"],"mappings":";;;;;;;;;AAYA,SAAgB,mBAAmB,EACjC,MACA,WACA,SACA,mBAAmB,OACnB,GAAG,SAKF;CACD,MAAM,EAAE,YAAY,oBAAoB,iBACtC,EAAE,CACH;CACD,MAAM,aAAa,gBAAgB,OAAO,UAAU,MAAM,aAAa;CACvE,MAAM,UAAU,gBAAgB,OAAO,UAAU,MAAM,UAAU;CACjE,MAAM,QAAQ,UAAU,UAAmC;AACzD,YAAU,MAAM;AAChB,MAAI,MAAM,iBAAkB;EAC5B,MAAM,OAAO,uBAAuB,MAAM,gBAAgB,CAAC,gBAAgB;EAC3E,MAAM,SAAS,MAAM;AACrB,MAAI,QAAQ,OAAO,SAAS,QAAQ,OAAO,SAAS,SAAU;AAC9D,QAAM,gBAAgB;AACtB,MAAI,MAAM,YAAa,MAAK,eAAe;MACtC,CAAK,KAAK,QAAQ;GACvB;AACF,QACE,oBAAC;EACC,KAAK;EACL,MAAK;EACL,UAAS;EACT,WAAW;EACX,GAAI;EACJ,SAAS;EACT,YACE,mBACA,MAAM,cACN,cACC,oBAAoB;GAEvB;;AAIN,SAAgB,kBAAkB,EAChC,MACA,WACA,SACA,GAAG,SAIF;CACD,MAAM,EAAE,YAAY,oBAAoB,iBACtC,EAAE,CACH;CACD,MAAM,WAAW,gBAAgB,OAAO,UAAU,MAAM,SAAS;CACjE,MAAM,QAAQ,UAAU,UAAmC;AACzD,YAAU,MAAM;AAChB,MAAI,MAAM,iBAAkB;EAC5B,MAAM,OAAO,uBAAuB,MAAM,eAAe,CAAC,gBAAgB;EAC1E,MAAM,SAAS,MAAM;AACrB,MAAI,QAAQ,OAAO,SAAS,QAAQ,OAAO,SAAS,QAAS;AAC7D,QAAM,gBAAgB;AACtB,MAAI,MAAM,YAAa,MAAK,OAAO;MAC9B,MAAK,OAAO;GACjB;AACF,QACE,oBAAC;EACC,KAAK;EACL,MAAK;EACL,UAAS;EACT,GAAI;EACJ,SAAS;EACT,YAAY,mBAAmB,MAAM,cAAc,CAAC;GACpD"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
|
|
2
|
+
import "./read-types.js";
|
|
3
|
+
import "./types.js";
|
|
4
|
+
import { FormController } from "./controller.js";
|
|
5
|
+
import "./field.js";
|
|
6
|
+
import "react";
|
|
7
|
+
|
|
8
|
+
//#region src/components/form/Form/modern/context.d.ts
|
|
9
|
+
declare function useFormControllerContext<T extends object = Record<string, unknown>>(): FormController<T>;
|
|
10
|
+
//#endregion
|
|
11
|
+
export { useFormControllerContext };
|
|
12
|
+
//# sourceMappingURL=context.d.ts.map
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.181.0 | Cube Dev Team */
|
|
2
|
+
import { createContext, useContext } from "react";
|
|
3
|
+
|
|
4
|
+
//#region src/components/form/Form/modern/context.ts
|
|
5
|
+
const ModernControllerContext = createContext(null);
|
|
6
|
+
function useFormControllerContext() {
|
|
7
|
+
const controller = useContext(ModernControllerContext);
|
|
8
|
+
if (!controller) throw new Error("Form.useControllerContext() requires a modern <Form> root. Legacy forms and FormScopeMask do not provide a modern controller.");
|
|
9
|
+
return controller;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
//#endregion
|
|
13
|
+
export { ModernControllerContext, useFormControllerContext };
|
|
14
|
+
//# sourceMappingURL=context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.js","names":[],"sources":["../../../../../src/components/form/Form/modern/context.ts"],"sourcesContent":["import { createContext, useContext } from 'react';\n\nimport type { FormController } from './controller';\n\nexport const ModernControllerContext =\n createContext<FormController<any> | null>(null);\n\nexport function useFormControllerContext<\n T extends object = Record<string, unknown>,\n>(): FormController<T> {\n const controller = useContext(ModernControllerContext);\n if (!controller) {\n throw new Error(\n 'Form.useControllerContext() requires a modern <Form> root. Legacy forms and FormScopeMask do not provide a modern controller.',\n );\n }\n return controller;\n}\n"],"mappings":";;;;AAIA,MAAa,0BACX,cAA0C,KAAK;AAEjD,SAAgB,2BAEO;CACrB,MAAM,aAAa,WAAW,wBAAwB;AACtD,KAAI,CAAC,WACH,OAAM,IAAI,MACR,gIACD;AAEH,QAAO"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
|
|
2
|
+
import { FORM_BACKEND } from "../backend.js";
|
|
3
|
+
import { FormPath } from "./values.js";
|
|
4
|
+
import { CheckedFormDependencies, CheckedFormPath, FormValueAtPath } from "./path-types.js";
|
|
5
|
+
import { FormReadValue } from "./read-types.js";
|
|
6
|
+
import { ModernValidationRule as ModernValidationRule$1 } from "./validation.js";
|
|
7
|
+
import { FieldState, FormState, FormStore, FormStoreOptions, ModernFieldValidationResult as ModernFieldValidationResult$1, ModernSubmitFailure as ModernSubmitFailure$1, ModernSubmitResult as ModernSubmitResult$1, ModernValidationResult as ModernValidationResult$1, SetValueOptions } from "./types.js";
|
|
8
|
+
import { FormField, FormFieldOptions } from "./field.js";
|
|
9
|
+
import { ReactNode } from "react";
|
|
10
|
+
|
|
11
|
+
//#region src/components/form/Form/modern/controller.d.ts
|
|
12
|
+
type ModernValidationRule = ModernValidationRule$1<ReactNode>;
|
|
13
|
+
type ModernValidationResult = ModernValidationResult$1<ReactNode>;
|
|
14
|
+
type ModernFieldValidationResult = ModernFieldValidationResult$1<ReactNode>;
|
|
15
|
+
type ModernSubmitFailure = ModernSubmitFailure$1<ReactNode>;
|
|
16
|
+
type ModernFieldState<Value = unknown> = Omit<FieldState<ReactNode>, 'value' | 'defaultValue'> & {
|
|
17
|
+
readonly value: FormReadValue<Value> | undefined;
|
|
18
|
+
readonly defaultValue: FormReadValue<Value> | undefined;
|
|
19
|
+
};
|
|
20
|
+
type ModernSubmitResult = ModernSubmitResult$1<ReactNode>;
|
|
21
|
+
type ModernFormState<T extends object = Record<string, unknown>> = FormState<T, ReactNode>;
|
|
22
|
+
type UseFormControllerOptions<T extends object = Record<string, unknown>> = FormStoreOptions<T, ReactNode>;
|
|
23
|
+
/** Public commands; registration and pipeline state tokens stay internal. */
|
|
24
|
+
type FormController<T extends object = Record<string, unknown>> = Readonly<Pick<FormStore<T, ReactNode>, typeof FORM_BACKEND | 'validate' | 'submit' | 'blur' | 'getSnapshot' | 'getValues' | 'getActiveValues' | 'subscribe' | 'setValues' | 'batch' | 'setDefaultValues' | 'adoptDefaultValues' | 'reset' | 'touch' | 'setFieldErrors' | 'clearFieldErrors' | 'setSubmitError' | 'clearSubmitError'> & {
|
|
25
|
+
getFieldSnapshot<const Path extends FormPath>(path: CheckedFormPath<T, Path>): ModernFieldState<FormValueAtPath<T, Path>> | undefined;
|
|
26
|
+
getValue<const Path extends FormPath>(path: CheckedFormPath<T, Path>): FormReadValue<FormValueAtPath<T, Path>> | undefined;
|
|
27
|
+
setValue<const Path extends FormPath>(path: CheckedFormPath<T, Path>, value: FormValueAtPath<T, NoInfer<Path>> | undefined, options?: SetValueOptions): void;
|
|
28
|
+
field<const Path extends FormPath, const Dependencies extends readonly FormPath[] = readonly FormPath[]>(path: CheckedFormPath<T, Path>, options?: FormFieldOptions<T, FormValueAtPath<T, NoInfer<Path>>> & {
|
|
29
|
+
dependsOn?: Dependencies & CheckedFormDependencies<T, Dependencies>;
|
|
30
|
+
}): FormField<FormValueAtPath<T, Path>>;
|
|
31
|
+
}>;
|
|
32
|
+
//#endregion
|
|
33
|
+
export { FormController, ModernFieldState, ModernFieldValidationResult, ModernFormState, ModernSubmitFailure, ModernSubmitResult, ModernValidationResult, ModernValidationRule, UseFormControllerOptions };
|
|
34
|
+
//# sourceMappingURL=controller.d.ts.map
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.181.0 | Cube Dev Team */
|
|
2
|
+
import { FORM_BACKEND, isModernFormController } from "../backend.js";
|
|
3
|
+
import { createFormField } from "./field.js";
|
|
4
|
+
import { createFormStore } from "./store.js";
|
|
5
|
+
|
|
6
|
+
//#region src/components/form/Form/modern/controller.ts
|
|
7
|
+
const CONTROLLER_STORE = Symbol.for("@cube-dev/ui-kit/form-controller-store");
|
|
8
|
+
/** Pure allocation for the creation hook; no listeners or external effects. */
|
|
9
|
+
function createFormController(options) {
|
|
10
|
+
const store = createFormStore(options);
|
|
11
|
+
const serverSnapshot = store.getSnapshot();
|
|
12
|
+
let rootElement;
|
|
13
|
+
const internals = {
|
|
14
|
+
store,
|
|
15
|
+
getServerSnapshot: () => serverSnapshot,
|
|
16
|
+
getRootElement: () => rootElement,
|
|
17
|
+
bindRootElement(element) {
|
|
18
|
+
rootElement = element ?? void 0;
|
|
19
|
+
return () => {
|
|
20
|
+
if (rootElement === element) rootElement = void 0;
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
const controller = Object.freeze({
|
|
25
|
+
[FORM_BACKEND]: "modern",
|
|
26
|
+
[CONTROLLER_STORE]: internals,
|
|
27
|
+
validate: store.validate,
|
|
28
|
+
submit: store.submit,
|
|
29
|
+
blur: store.blur,
|
|
30
|
+
getSnapshot: store.getSnapshot,
|
|
31
|
+
getFieldSnapshot: store.getFieldSnapshot,
|
|
32
|
+
getValue: store.getValue,
|
|
33
|
+
getValues: store.getValues,
|
|
34
|
+
getActiveValues: store.getActiveValues,
|
|
35
|
+
subscribe: store.subscribe,
|
|
36
|
+
setValue: store.setValue,
|
|
37
|
+
setValues: store.setValues,
|
|
38
|
+
batch: store.batch,
|
|
39
|
+
setDefaultValues: store.setDefaultValues,
|
|
40
|
+
adoptDefaultValues: store.adoptDefaultValues,
|
|
41
|
+
reset: store.reset,
|
|
42
|
+
touch: store.touch,
|
|
43
|
+
setFieldErrors: store.setFieldErrors,
|
|
44
|
+
clearFieldErrors: store.clearFieldErrors,
|
|
45
|
+
setSubmitError: store.setSubmitError,
|
|
46
|
+
clearSubmitError: store.clearSubmitError,
|
|
47
|
+
field: (path, config) => createFormField(controller, path, config)
|
|
48
|
+
});
|
|
49
|
+
return controller;
|
|
50
|
+
}
|
|
51
|
+
function getControllerInternals(controller, receiver) {
|
|
52
|
+
const internals = isModernFormController(controller) ? controller[CONTROLLER_STORE] : void 0;
|
|
53
|
+
if (!internals) throw new Error(`${receiver} requires a modern form controller created by Form.useController(). Legacy Form instances and bare backend brands are not supported.`);
|
|
54
|
+
return internals;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
//#endregion
|
|
58
|
+
export { createFormController, getControllerInternals };
|
|
59
|
+
//# sourceMappingURL=controller.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"controller.js","names":[],"sources":["../../../../../src/components/form/Form/modern/controller.ts"],"sourcesContent":["import { FORM_BACKEND, isModernFormController } from '../backend';\n\nimport { createFormField } from './field';\nimport { createFormStore } from './store';\n\nimport type { ReactNode } from 'react';\nimport type { FormField, FormFieldOptions } from './field';\nimport type {\n CheckedFormDependencies,\n CheckedFormPath,\n FormValueAtPath,\n} from './path-types';\nimport type { FormReadValue } from './read-types';\nimport type {\n FieldState,\n FormState,\n FormStore,\n FormStoreOptions,\n SetValueOptions,\n ModernFieldValidationResult as StoreFieldValidationResult,\n ModernSubmitFailure as StoreSubmitFailure,\n ModernSubmitResult as StoreSubmitResult,\n ModernValidationResult as StoreValidationResult,\n} from './types';\nimport type { ModernValidationRule as StoreValidationRule } from './validation';\nimport type { FormPath } from './values';\n\nexport type ModernValidationRule = StoreValidationRule<ReactNode>;\nexport type ModernValidationResult = StoreValidationResult<ReactNode>;\nexport type ModernFieldValidationResult = StoreFieldValidationResult<ReactNode>;\nexport type ModernSubmitFailure = StoreSubmitFailure<ReactNode>;\nexport type ModernFieldState<Value = unknown> = Omit<\n FieldState<ReactNode>,\n 'value' | 'defaultValue'\n> & {\n readonly value: FormReadValue<Value> | undefined;\n readonly defaultValue: FormReadValue<Value> | undefined;\n};\n\nexport type ModernSubmitResult = StoreSubmitResult<ReactNode>;\n\nexport type ModernFormState<T extends object = Record<string, unknown>> =\n FormState<T, ReactNode>;\n\nexport type UseFormControllerOptions<\n T extends object = Record<string, unknown>,\n> = FormStoreOptions<T, ReactNode>;\n\n/** Public commands; registration and pipeline state tokens stay internal. */\nexport type FormController<T extends object = Record<string, unknown>> =\n Readonly<\n Pick<\n FormStore<T, ReactNode>,\n | typeof FORM_BACKEND\n | 'validate'\n | 'submit'\n | 'blur'\n | 'getSnapshot'\n | 'getValues'\n | 'getActiveValues'\n | 'subscribe'\n | 'setValues'\n | 'batch'\n | 'setDefaultValues'\n | 'adoptDefaultValues'\n | 'reset'\n | 'touch'\n | 'setFieldErrors'\n | 'clearFieldErrors'\n | 'setSubmitError'\n | 'clearSubmitError'\n > & {\n getFieldSnapshot<const Path extends FormPath>(\n path: CheckedFormPath<T, Path>,\n ): ModernFieldState<FormValueAtPath<T, Path>> | undefined;\n getValue<const Path extends FormPath>(\n path: CheckedFormPath<T, Path>,\n ): FormReadValue<FormValueAtPath<T, Path>> | undefined;\n setValue<const Path extends FormPath>(\n path: CheckedFormPath<T, Path>,\n value: FormValueAtPath<T, NoInfer<Path>> | undefined,\n options?: SetValueOptions,\n ): void;\n field<\n const Path extends FormPath,\n const Dependencies extends readonly FormPath[] = readonly FormPath[],\n >(\n path: CheckedFormPath<T, Path>,\n options?: FormFieldOptions<T, FormValueAtPath<T, NoInfer<Path>>> & {\n dependsOn?: Dependencies & CheckedFormDependencies<T, Dependencies>;\n },\n ): FormField<FormValueAtPath<T, Path>>;\n }\n >;\n\n// Symbol.for also lets two copies of the kit share a controller, just as the\n// backend brand does. This symbol and the store are not package exports.\nconst CONTROLLER_STORE = Symbol.for('@cube-dev/ui-kit/form-controller-store');\n\ninterface ControllerInternals<T extends object> {\n store: FormStore<T, ReactNode>;\n getServerSnapshot(): ModernFormState<T>;\n getRootElement(): HTMLFormElement | undefined;\n bindRootElement(element: HTMLFormElement | null): () => void;\n}\n\n/** Pure allocation for the creation hook; no listeners or external effects. */\nexport function createFormController<T extends object>(\n options?: UseFormControllerOptions<T>,\n): FormController<T> {\n const store = createFormStore<T, ReactNode>(options);\n const serverSnapshot = store.getSnapshot();\n let rootElement: HTMLFormElement | undefined;\n const internals: ControllerInternals<T> = {\n store,\n getServerSnapshot: () => serverSnapshot,\n getRootElement: () => rootElement,\n bindRootElement(element) {\n rootElement = element ?? undefined;\n return () => {\n if (rootElement === element) rootElement = undefined;\n };\n },\n };\n const controller = Object.freeze({\n [FORM_BACKEND]: 'modern' as const,\n [CONTROLLER_STORE]: internals,\n validate: store.validate,\n submit: store.submit,\n blur: store.blur,\n getSnapshot: store.getSnapshot,\n getFieldSnapshot: store.getFieldSnapshot,\n getValue: store.getValue,\n getValues: store.getValues,\n getActiveValues: store.getActiveValues,\n subscribe: store.subscribe,\n setValue: store.setValue,\n setValues: store.setValues,\n batch: store.batch,\n setDefaultValues: store.setDefaultValues,\n adoptDefaultValues: store.adoptDefaultValues,\n reset: store.reset,\n touch: store.touch,\n setFieldErrors: store.setFieldErrors,\n clearFieldErrors: store.clearFieldErrors,\n setSubmitError: store.setSubmitError,\n clearSubmitError: store.clearSubmitError,\n field: (path: FormPath, config?: FormFieldOptions<T, unknown>) =>\n createFormField(controller, path, config),\n }) as FormController<T>;\n return controller;\n}\n\nexport function getControllerInternals<T extends object>(\n controller: FormController<T>,\n receiver: string,\n): ControllerInternals<T> {\n const internals = isModernFormController(controller)\n ? (controller as unknown as Record<symbol, ControllerInternals<T>>)[\n CONTROLLER_STORE\n ]\n : undefined;\n if (!internals) {\n throw new Error(\n `${receiver} requires a modern form controller created by Form.useController(). Legacy Form instances and bare backend brands are not supported.`,\n );\n }\n return internals;\n}\n"],"mappings":";;;;;;AAiGA,MAAM,mBAAmB,OAAO,IAAI,yCAAyC;;AAU7E,SAAgB,qBACd,SACmB;CACnB,MAAM,QAAQ,gBAA8B,QAAQ;CACpD,MAAM,iBAAiB,MAAM,aAAa;CAC1C,IAAI;CACJ,MAAM,YAAoC;EACxC;EACA,yBAAyB;EACzB,sBAAsB;EACtB,gBAAgB,SAAS;AACvB,iBAAc,WAAW;AACzB,gBAAa;AACX,QAAI,gBAAgB,QAAS,eAAc;;;EAGhD;CACD,MAAM,aAAa,OAAO,OAAO;GAC9B,eAAe;GACf,mBAAmB;EACpB,UAAU,MAAM;EAChB,QAAQ,MAAM;EACd,MAAM,MAAM;EACZ,aAAa,MAAM;EACnB,kBAAkB,MAAM;EACxB,UAAU,MAAM;EAChB,WAAW,MAAM;EACjB,iBAAiB,MAAM;EACvB,WAAW,MAAM;EACjB,UAAU,MAAM;EAChB,WAAW,MAAM;EACjB,OAAO,MAAM;EACb,kBAAkB,MAAM;EACxB,oBAAoB,MAAM;EAC1B,OAAO,MAAM;EACb,OAAO,MAAM;EACb,gBAAgB,MAAM;EACtB,kBAAkB,MAAM;EACxB,gBAAgB,MAAM;EACtB,kBAAkB,MAAM;EACxB,QAAQ,MAAgB,WACtB,gBAAgB,YAAY,MAAM,OAAO;EAC5C,CAAC;AACF,QAAO;;AAGT,SAAgB,uBACd,YACA,UACwB;CACxB,MAAM,YAAY,uBAAuB,WAAW,GAC/C,WACC,oBAEF;AACJ,KAAI,CAAC,UACH,OAAM,IAAI,MACR,GAAG,SAAS,sIACb;AAEH,QAAO"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.181.0 | Cube Dev Team */
|
|
2
|
+
import { getFieldKey, hasPath, normalizePath, readPath } from "./values.js";
|
|
3
|
+
import { getControllerInternals } from "./controller.js";
|
|
4
|
+
|
|
5
|
+
//#region src/components/form/Form/modern/field-binding.ts
|
|
6
|
+
function sameFieldView(a, b) {
|
|
7
|
+
return Object.is(a?.value, b?.value) && a?.errors === b?.errors && a?.status === b?.status;
|
|
8
|
+
}
|
|
9
|
+
function createModernFieldBackend(form, name) {
|
|
10
|
+
const { store, getServerSnapshot } = getControllerInternals(form, `The "${name}" field`);
|
|
11
|
+
const key = getFieldKey(name);
|
|
12
|
+
const path = normalizePath(name);
|
|
13
|
+
const views = /* @__PURE__ */ new WeakMap();
|
|
14
|
+
const view = (state) => {
|
|
15
|
+
if (state.fields[key]) return state.fields[key];
|
|
16
|
+
if (!hasPath(state.values, path)) return void 0;
|
|
17
|
+
let cached = views.get(state);
|
|
18
|
+
if (!cached) {
|
|
19
|
+
cached = Object.freeze({
|
|
20
|
+
value: readPath(state.values, path),
|
|
21
|
+
errors: Object.freeze([]),
|
|
22
|
+
status: "unvalidated"
|
|
23
|
+
});
|
|
24
|
+
views.set(state, cached);
|
|
25
|
+
}
|
|
26
|
+
return cached;
|
|
27
|
+
};
|
|
28
|
+
return {
|
|
29
|
+
subscribe: store.subscribe,
|
|
30
|
+
getSnapshot: () => view(store.getSnapshot()),
|
|
31
|
+
getServerSnapshot: () => view(getServerSnapshot()),
|
|
32
|
+
register: () => store.register(name),
|
|
33
|
+
change: (value, dontTouch) => store.setValue(name, value, {
|
|
34
|
+
source: "user",
|
|
35
|
+
touch: !dontTouch,
|
|
36
|
+
validate: dontTouch ? "never" : "auto"
|
|
37
|
+
}),
|
|
38
|
+
blur: () => store.blur(name)
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
function fieldRegistrationOptions(props, defaultTrigger) {
|
|
42
|
+
const rules = props.rules?.flat(Infinity);
|
|
43
|
+
return {
|
|
44
|
+
...Object.hasOwn(props, "defaultValue") ? { defaultValue: props.defaultValue } : {},
|
|
45
|
+
preserve: props.preserve,
|
|
46
|
+
dependsOn: props.dependsOn,
|
|
47
|
+
deps: props.deps,
|
|
48
|
+
isEqual: props.isEqual,
|
|
49
|
+
rules: props.isRequired && !rules?.some((rule) => rule.required) ? [{ required: true }, ...rules ?? []] : rules,
|
|
50
|
+
rulesKey: props.rulesKey,
|
|
51
|
+
validationDelay: props.validationDelay,
|
|
52
|
+
validateTrigger: props.validateTrigger ?? defaultTrigger ?? "onBlur",
|
|
53
|
+
errorPolicy: props.errorPolicy
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
//#endregion
|
|
58
|
+
export { createModernFieldBackend, fieldRegistrationOptions, sameFieldView };
|
|
59
|
+
//# sourceMappingURL=field-binding.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"field-binding.js","names":[],"sources":["../../../../../src/components/form/Form/modern/field-binding.ts"],"sourcesContent":["import { getControllerInternals } from './controller';\nimport { getFieldKey, hasPath, normalizePath, readPath } from './values';\n\nimport type { ReactNode } from 'react';\nimport type { FieldCoreProps, ValidateTrigger } from '../../../../shared/form';\nimport type { FormController, ModernFormState } from './controller';\nimport type {\n FieldState,\n RegistrationOptions,\n RegistrationToken,\n} from './types';\nimport type { FormPath } from './values';\n\n/** The only state a bound input renders; metadata stays in selector subscribers. */\nexport type FieldView = Pick<\n FieldState<ReactNode>,\n 'value' | 'errors' | 'status'\n>;\n\nexport interface FieldBackendHandle {\n subscribe(listener: () => void): () => void;\n getSnapshot(): FieldView | undefined;\n getServerSnapshot(): FieldView | undefined;\n register(): RegistrationToken<ReactNode> | undefined;\n change(value: unknown, dontTouch: boolean, trigger: ValidateTrigger): void;\n blur(): void;\n}\n\nexport function sameFieldView(a?: FieldView, b?: FieldView) {\n return (\n Object.is(a?.value, b?.value) &&\n a?.errors === b?.errors &&\n a?.status === b?.status\n );\n}\n\nexport function createModernFieldBackend(\n form: FormController<any>,\n name: FormPath,\n): FieldBackendHandle {\n const { store, getServerSnapshot } = getControllerInternals(\n form,\n `The \"${name}\" field`,\n );\n const key = getFieldKey(name);\n const path = normalizePath(name);\n const views = new WeakMap<object, FieldView>();\n const view = (state: ModernFormState): FieldView | undefined => {\n if (state.fields[key]) return state.fields[key];\n if (!hasPath(state.values, path)) return undefined;\n let cached = views.get(state);\n if (!cached) {\n cached = Object.freeze({\n value: readPath(state.values, path),\n errors: Object.freeze([]),\n status: 'unvalidated',\n });\n views.set(state, cached);\n }\n return cached;\n };\n return {\n subscribe: store.subscribe,\n getSnapshot: () => view(store.getSnapshot()),\n getServerSnapshot: () => view(getServerSnapshot()),\n register: () => store.register(name),\n change: (value, dontTouch) =>\n store.setValue(name, value, {\n source: 'user',\n touch: !dontTouch,\n validate: dontTouch ? 'never' : 'auto',\n }),\n blur: () => store.blur(name),\n };\n}\n\nexport function fieldRegistrationOptions(\n props: FieldCoreProps & {\n defaultValue?: unknown;\n validateTrigger?: ValidateTrigger;\n },\n defaultTrigger?: ValidateTrigger,\n): RegistrationOptions<ReactNode> {\n const rules = props.rules?.flat(Infinity);\n return {\n ...(Object.hasOwn(props, 'defaultValue')\n ? { defaultValue: props.defaultValue }\n : {}),\n preserve: props.preserve,\n dependsOn: props.dependsOn,\n deps: props.deps,\n isEqual: props.isEqual,\n rules:\n props.isRequired && !rules?.some((rule) => rule.required)\n ? [{ required: true }, ...(rules ?? [])]\n : rules,\n rulesKey: props.rulesKey,\n validationDelay: props.validationDelay,\n validateTrigger: props.validateTrigger ?? defaultTrigger ?? 'onBlur',\n errorPolicy: props.errorPolicy,\n };\n}\n"],"mappings":";;;;;AA4BA,SAAgB,cAAc,GAAe,GAAe;AAC1D,QACE,OAAO,GAAG,GAAG,OAAO,GAAG,MAAM,IAC7B,GAAG,WAAW,GAAG,UACjB,GAAG,WAAW,GAAG;;AAIrB,SAAgB,yBACd,MACA,MACoB;CACpB,MAAM,EAAE,OAAO,sBAAsB,uBACnC,MACA,QAAQ,KAAK,SACd;CACD,MAAM,MAAM,YAAY,KAAK;CAC7B,MAAM,OAAO,cAAc,KAAK;CAChC,MAAM,wBAAQ,IAAI,SAA4B;CAC9C,MAAM,QAAQ,UAAkD;AAC9D,MAAI,MAAM,OAAO,KAAM,QAAO,MAAM,OAAO;AAC3C,MAAI,CAAC,QAAQ,MAAM,QAAQ,KAAK,CAAE,QAAO;EACzC,IAAI,SAAS,MAAM,IAAI,MAAM;AAC7B,MAAI,CAAC,QAAQ;AACX,YAAS,OAAO,OAAO;IACrB,OAAO,SAAS,MAAM,QAAQ,KAAK;IACnC,QAAQ,OAAO,OAAO,EAAE,CAAC;IACzB,QAAQ;IACT,CAAC;AACF,SAAM,IAAI,OAAO,OAAO;;AAE1B,SAAO;;AAET,QAAO;EACL,WAAW,MAAM;EACjB,mBAAmB,KAAK,MAAM,aAAa,CAAC;EAC5C,yBAAyB,KAAK,mBAAmB,CAAC;EAClD,gBAAgB,MAAM,SAAS,KAAK;EACpC,SAAS,OAAO,cACd,MAAM,SAAS,MAAM,OAAO;GAC1B,QAAQ;GACR,OAAO,CAAC;GACR,UAAU,YAAY,UAAU;GACjC,CAAC;EACJ,YAAY,MAAM,KAAK,KAAK;EAC7B;;AAGH,SAAgB,yBACd,OAIA,gBACgC;CAChC,MAAM,QAAQ,MAAM,OAAO,KAAK,SAAS;AACzC,QAAO;EACL,GAAI,OAAO,OAAO,OAAO,eAAe,GACpC,EAAE,cAAc,MAAM,cAAc,GACpC,EAAE;EACN,UAAU,MAAM;EAChB,WAAW,MAAM;EACjB,MAAM,MAAM;EACZ,SAAS,MAAM;EACf,OACE,MAAM,cAAc,CAAC,OAAO,MAAM,SAAS,KAAK,SAAS,GACrD,CAAC,EAAE,UAAU,MAAM,EAAE,GAAI,SAAS,EAAE,CAAE,GACtC;EACN,UAAU,MAAM;EAChB,iBAAiB,MAAM;EACvB,iBAAiB,MAAM,mBAAmB,kBAAkB;EAC5D,aAAa,MAAM;EACpB"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
|
|
2
|
+
import { FormPath } from "./values.js";
|
|
3
|
+
import { CheckedFormPath, FormValueAtPath } from "./path-types.js";
|
|
4
|
+
import { FormReadValue, FormValues } from "./read-types.js";
|
|
5
|
+
import { RegistrationOptions } from "./types.js";
|
|
6
|
+
import { FormController } from "./controller.js";
|
|
7
|
+
import { ReactNode } from "react";
|
|
8
|
+
|
|
9
|
+
//#region src/components/form/Form/modern/field.d.ts
|
|
10
|
+
declare const FIELD_VALUE: unique symbol;
|
|
11
|
+
/** Pure configuration, never a mutable/reactive field instance. */
|
|
12
|
+
interface FormField<Value = unknown> {
|
|
13
|
+
readonly [FIELD_VALUE]: Value;
|
|
14
|
+
readonly form: FormController<any>;
|
|
15
|
+
readonly path: FormPath;
|
|
16
|
+
readonly options: RegistrationOptions<ReactNode>;
|
|
17
|
+
}
|
|
18
|
+
interface FormFieldContext<T extends object> {
|
|
19
|
+
readonly signal: AbortSignal;
|
|
20
|
+
getValue<const Path extends FormPath>(path: CheckedFormPath<T, Path>): FormReadValue<FormValueAtPath<T, Path>> | undefined;
|
|
21
|
+
getValues(): FormValues<T>;
|
|
22
|
+
}
|
|
23
|
+
interface FormFieldOptions<T extends object, Value> extends Omit<RegistrationOptions<ReactNode>, 'defaultValue' | 'isEqual'> {
|
|
24
|
+
readonly validate?: (value: FormReadValue<Value> | undefined, context: FormFieldContext<T>) => ReactNode | void | Promise<ReactNode | void>;
|
|
25
|
+
readonly defaultValue?: Value;
|
|
26
|
+
readonly isEqual?: (previous: FormReadValue<Value> | undefined, next: FormReadValue<Value> | undefined) => boolean;
|
|
27
|
+
}
|
|
28
|
+
//#endregion
|
|
29
|
+
export { FormField, FormFieldContext, FormFieldOptions };
|
|
30
|
+
//# sourceMappingURL=field.d.ts.map
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.181.0 | Cube Dev Team */
|
|
2
|
+
import { normalizePath } from "./values.js";
|
|
3
|
+
|
|
4
|
+
//#region src/components/form/Form/modern/field.ts
|
|
5
|
+
function createFormField(form, path, options = {}) {
|
|
6
|
+
const { validate, ...registration } = options;
|
|
7
|
+
const normalized = normalizePath(path);
|
|
8
|
+
return Object.freeze({
|
|
9
|
+
form,
|
|
10
|
+
path: typeof path === "string" ? path : normalized,
|
|
11
|
+
options: Object.freeze({
|
|
12
|
+
...registration,
|
|
13
|
+
...validate && { rules: [...registration.rules ?? [], {
|
|
14
|
+
authored: validate,
|
|
15
|
+
validator: (_rule, value, context) => validate(value, context)
|
|
16
|
+
}] }
|
|
17
|
+
})
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
//#endregion
|
|
22
|
+
export { createFormField };
|
|
23
|
+
//# sourceMappingURL=field.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"field.js","names":[],"sources":["../../../../../src/components/form/Form/modern/field.ts"],"sourcesContent":["import { normalizePath } from './values';\n\nimport type { ReactNode } from 'react';\nimport type { FormController } from './controller';\nimport type { CheckedFormPath, FormValueAtPath } from './path-types';\nimport type { FormReadValue, FormValues } from './read-types';\nimport type { RegistrationOptions } from './types';\nimport type { FormPath } from './values';\n\ndeclare const FIELD_VALUE: unique symbol;\n\n/** Pure configuration, never a mutable/reactive field instance. */\nexport interface FormField<Value = unknown> {\n readonly [FIELD_VALUE]: Value;\n readonly form: FormController<any>;\n readonly path: FormPath;\n readonly options: RegistrationOptions<ReactNode>;\n}\n\nexport interface FormFieldContext<T extends object> {\n readonly signal: AbortSignal;\n getValue<const Path extends FormPath>(\n path: CheckedFormPath<T, Path>,\n ): FormReadValue<FormValueAtPath<T, Path>> | undefined;\n getValues(): FormValues<T>;\n}\n\nexport interface FormFieldOptions<T extends object, Value>\n extends Omit<RegistrationOptions<ReactNode>, 'defaultValue' | 'isEqual'> {\n readonly validate?: (\n value: FormReadValue<Value> | undefined,\n context: FormFieldContext<T>,\n ) => ReactNode | void | Promise<ReactNode | void>;\n readonly defaultValue?: Value;\n readonly isEqual?: (\n previous: FormReadValue<Value> | undefined,\n next: FormReadValue<Value> | undefined,\n ) => boolean;\n}\n\nexport function createFormField<T extends object, Value>(\n form: FormController<T>,\n path: FormPath,\n options: FormFieldOptions<T, Value> = {},\n): FormField<Value> {\n const { validate, ...registration } = options;\n const normalized = normalizePath(path);\n return Object.freeze({\n form,\n path: typeof path === 'string' ? path : normalized,\n options: Object.freeze({\n ...registration,\n ...(validate && {\n rules: [\n ...(registration.rules ?? []),\n {\n // The adapter has fixed source. Retain the authored function for\n // lazy rule comparison, without changing the consumer's deps.\n authored: validate,\n validator: (_rule, value, context) =>\n validate(value, context as FormFieldContext<T>),\n },\n ],\n }),\n }),\n }) as FormField<Value>;\n}\n"],"mappings":";;;;AAwCA,SAAgB,gBACd,MACA,MACA,UAAsC,EAAE,EACtB;CAClB,MAAM,EAAE,UAAU,GAAG,iBAAiB;CACtC,MAAM,aAAa,cAAc,KAAK;AACtC,QAAO,OAAO,OAAO;EACnB;EACA,MAAM,OAAO,SAAS,WAAW,OAAO;EACxC,SAAS,OAAO,OAAO;GACrB,GAAG;GACH,GAAI,YAAY,EACd,OAAO,CACL,GAAI,aAAa,SAAS,EAAE,EAC5B;IAGE,UAAU;IACV,YAAY,OAAO,OAAO,YACxB,SAAS,OAAO,QAA+B;IAClD,CACF,EACF;GACF,CAAC;EACH,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
|
|
2
|
+
import { FormPath } from "./values.js";
|
|
3
|
+
|
|
4
|
+
//#region src/components/form/Form/modern/path-types.d.ts
|
|
5
|
+
type ValidPath<Value, Path extends readonly (string | number)[]> = unknown extends Value ? true : Path extends readonly [infer Key extends string | number, ...infer Rest extends readonly (string | number)[]] ? Key extends keyof NonNullable<Value> ? Rest extends readonly [] ? true : ValidPath<NonNullable<Value>[Key], Rest> : NonNullable<Value> extends readonly (infer Item)[] ? Key extends `${number}` ? ValidPath<Item, Rest> : false : false : true;
|
|
6
|
+
/** Check only the supplied literal path. Widened strings support dynamic models. */
|
|
7
|
+
type CheckedFormPath<T extends object, Path extends FormPath> = Path & (Path extends string ? string extends Path ? unknown : Path extends keyof T ? unknown : never : Path extends readonly (string | number)[] ? ValidPath<T, Path> extends false ? never : unknown : never);
|
|
8
|
+
/** Resolve only the supplied path; never enumerate a model's possible paths. */
|
|
9
|
+
type SegmentValue<Value, Key extends string | number> = Value extends null | undefined ? undefined : Key extends keyof Value ? Value[Key] : Value extends readonly (infer Item)[] ? Key extends `${number}` ? Item : unknown : unknown;
|
|
10
|
+
type TupleValue<Value, Path extends readonly (string | number)[]> = Path extends readonly [infer Key extends string | number, ...infer Rest extends readonly (string | number)[]] ? Rest extends readonly [] ? SegmentValue<Value, Key> : TupleValue<SegmentValue<Value, Key>, Rest> : unknown;
|
|
11
|
+
/** Strings are literal keys; unknown/dynamic names and paths return unknown. */
|
|
12
|
+
type FormValueAtPath<Values extends object, Path extends FormPath> = Path extends string ? Path extends keyof Values ? Values[Path] : unknown : Path extends readonly (string | number)[] ? TupleValue<Values, Path> : unknown;
|
|
13
|
+
type CheckedFormDependencies<T extends object, Dependencies extends readonly FormPath[]> = { readonly [I in keyof Dependencies]: CheckedFormPath<T, Dependencies[I]> };
|
|
14
|
+
//#endregion
|
|
15
|
+
export { CheckedFormDependencies, CheckedFormPath, FormValueAtPath };
|
|
16
|
+
//# sourceMappingURL=path-types.d.ts.map
|