@cube-dev/ui-kit 0.0.0-canary-6b8d34d → 0.0.0-canary-9fd458b
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/_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 +0 -1
- package/dist/components/actions/Button/Button.js +1 -1
- 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/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 +1 -1
- 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 +1 -1
- 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 +1 -2
- 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 +0 -1
- 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.js +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.js +1 -1
- package/dist/components/fields/ColorPicker/ColorPicker.js +1 -1
- package/dist/components/fields/ColorSwatch/ColorSwatch.js +1 -1
- package/dist/components/fields/ColorSwatchGroup/ColorSwatchGroup.js +1 -1
- package/dist/components/fields/ComboBox/ComboBox.js +1 -1
- package/dist/components/fields/CommandTextArea/CommandTextArea.js +1 -1
- package/dist/components/fields/CommandTextArea/caretPosition.js +1 -1
- package/dist/components/fields/CommandTextArea/useCaretAnchor.js +1 -1
- package/dist/components/fields/DatePicker/DateInput.js +1 -1
- package/dist/components/fields/DatePicker/DateInputBase.js +1 -1
- package/dist/components/fields/DatePicker/DatePicker.js +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/DatePickerSegment.js +1 -1
- package/dist/components/fields/DatePicker/DateRangePicker.js +1 -1
- package/dist/components/fields/DatePicker/DateRangeSeparatedPicker.js +1 -1
- package/dist/components/fields/DatePicker/MonthPicker.js +1 -1
- package/dist/components/fields/DatePicker/PeriodPicker.js +1 -1
- package/dist/components/fields/DatePicker/QuarterPicker.js +1 -1
- package/dist/components/fields/DatePicker/TimeInput.js +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.js +1 -1
- package/dist/components/fields/FilterListBox/FilterListBox.js +1 -1
- package/dist/components/fields/FilterPicker/FilterPicker.js +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.js +1 -1
- package/dist/components/fields/ListBoxPopover/ListBoxPopover.js +1 -1
- package/dist/components/fields/ListBoxPopover/index.d.ts +0 -1
- package/dist/components/fields/ListBoxPopover/listNavigation.js +1 -1
- package/dist/components/fields/ListBoxPopover/useCompositeFocus.js +1 -1
- package/dist/components/fields/NumberInput/NumberInput.js +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.js +1 -1
- package/dist/components/fields/RadioGroup/Radio.js +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.js +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 +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/Switch/Switch.js +1 -1
- package/dist/components/fields/TextArea/TextArea.js +1 -1
- package/dist/components/fields/TextInput/TextInput.js +1 -1
- package/dist/components/fields/TextInput/TextInputBase.js +1 -1
- package/dist/components/fields/TextInput/useAutoSizeTextArea.js +1 -1
- package/dist/components/fields/TextInputMapper/TextInputMapper.js +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.js +1 -1
- package/dist/components/form/Form/Form.d.ts +12 -1
- package/dist/components/form/Form/Form.js +83 -16
- package/dist/components/form/Form/Form.js.map +1 -1
- package/dist/components/form/Form/ModernFormRoot.js +20 -0
- package/dist/components/form/Form/ModernFormRoot.js.map +1 -0
- package/dist/components/form/Form/ResetButton/ResetButton.js +1 -1
- package/dist/components/form/Form/SubmitButton/SubmitButton.js +1 -1
- package/dist/components/form/Form/SubmitError.js +1 -1
- package/dist/components/form/Form/backend.d.ts +9 -0
- package/dist/components/form/Form/backend.js +32 -0
- package/dist/components/form/Form/backend.js.map +1 -0
- package/dist/components/form/Form/index.js +1 -1
- package/dist/components/form/Form/use-field/use-field-props.d.ts +12 -1
- package/dist/components/form/Form/use-field/use-field-props.js +61 -44
- package/dist/components/form/Form/use-field/use-field-props.js.map +1 -1
- package/dist/components/form/Form/use-field/use-field.js +2 -2
- 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 +5 -1
- package/dist/components/form/Form/use-form.js.map +1 -1
- package/dist/components/form/Form/validation.js +1 -1
- package/dist/components/form/Label.js +1 -1
- 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 +1 -2
- 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 +0 -1
- package/dist/components/overlays/Modal/Overlay.js +1 -1
- package/dist/components/overlays/Modal/Popover.js +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 +0 -1
- 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 +0 -2
- 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 +1 -1
- package/dist/components/overlays/Tooltip/context.js +1 -1
- package/dist/components/portal/Portal.js +1 -1
- package/dist/components/portal/PortalProvider.js +1 -1
- package/dist/components/portal/index.d.ts +0 -1
- 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.js +1 -1
- 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/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/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/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/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 +2 -2
- package/package.json +1 -1
- package/dist/components/fields/ListBoxPopover/useCompositeFocus.d.ts +0 -2
- package/dist/components/portal/PortalProvider.d.ts +0 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Form.js","names":[],"sources":["../../../../src/components/form/Form/Form.tsx"],"sourcesContent":["import { useObjectRef } from '@react-aria/utils';\nimport {\n BaseProps,\n CONTAINER_STYLES,\n ContainerStyleProps,\n filterBaseProps,\n Styles,\n tasty,\n} from '@tenphi/tasty';\nimport {\n createContext,\n FormHTMLAttributes,\n forwardRef,\n ReactElement,\n ReactNode,\n Ref,\n useContext,\n useRef,\n} from 'react';\n\nimport { Provider, useProviderProps } from '../../../provider';\nimport { FormBaseProps } from '../../../shared/index';\nimport { timeout } from '../../../utils/promise';\nimport { useCombinedRefs } from '../../../utils/react/index';\nimport { extractStyles } from '../../../utils/styles';\nimport { useValidationProps } from '../validation/index';\n\nimport { FieldTypes } from './types';\nimport { CubeFormData, CubeFormInstance, useForm } from './use-form';\n\nexport const FormContext = createContext({});\n\nconst FormElement = tasty({\n as: 'form',\n qa: 'Form',\n styles: {\n display: {\n '': 'block',\n horizontal: 'flex',\n },\n flow: {\n '': 'column',\n horizontal: 'row',\n },\n placeItems: {\n '': 'initial',\n horizontal: 'center',\n },\n gap: '2x',\n '$label-width': '25x',\n },\n});\n\nexport function useFormProps(props) {\n const ctx = useContext(FormContext);\n\n return { ...ctx, ...props };\n}\n\nconst formPropNames = new Set([\n 'action',\n 'autoComplete',\n 'encType',\n 'method',\n 'target',\n]);\n\nexport interface CubeFormProps<T extends FieldTypes = FieldTypes>\n extends FormBaseProps,\n BaseProps,\n ContainerStyleProps,\n Pick<\n FormHTMLAttributes<HTMLFormElement>,\n 'action' | 'autoComplete' | 'encType' | 'method' | 'target'\n > {\n /** Form name */\n name?: string;\n /** Default field values */\n defaultValues?: Partial<T>;\n /** Trigger when any value of the Field is changed */\n onValuesChange?: CubeFormInstance<T>['onValuesChange'];\n /** Trigger on form submit and success */\n onSubmit?: CubeFormInstance<T>['onSubmit'];\n /** Trigger on form submit and failed */\n onSubmitFailed?: (any?) => void | Promise<any>;\n /** Set form instance created by useForm */\n form?: CubeFormInstance<T, CubeFormData<T>>;\n /** The size of the side area with labels. Only for `labelPosition=\"side\"` */\n labelWidth?: Styles['width'];\n orientation?: 'vertical' | 'horizontal';\n}\n\nfunction Form<T extends FieldTypes>(\n props: CubeFormProps<T>,\n ref: Ref<HTMLFormElement>,\n) {\n props = useValidationProps(useProviderProps(props));\n let {\n qa,\n name,\n children,\n labelPosition,\n orientation,\n necessityIndicator,\n isDisabled,\n isReadOnly,\n isInvalid,\n isValid,\n labelStyles,\n validateTrigger,\n showValid,\n defaultValues,\n onValuesChange,\n requiredMark = true,\n form,\n labelWidth,\n onSubmit,\n onSubmitFailed,\n ...otherProps\n } = props;\n const defaultValuesRef = useRef(defaultValues);\n const firstRunRef = useRef(true);\n const isHorizontal = orientation === 'horizontal';\n\n if (!orientation) {\n orientation = 'vertical';\n }\n\n if (!labelPosition) {\n labelPosition = isHorizontal ? 'side' : 'top';\n }\n\n if (!labelWidth) {\n labelWidth = isHorizontal ? 'auto' : undefined;\n }\n\n ref = useCombinedRefs(ref);\n\n let onSubmitCallback;\n\n if ((onSubmit || onSubmitFailed) && !otherProps.action) {\n onSubmitCallback = async (e) => {\n if (e && e?.preventDefault) {\n e && e?.preventDefault && e?.preventDefault();\n e && e?.stopPropagation && e?.stopPropagation();\n\n if (e.nativeEvent) {\n const evt = e.nativeEvent;\n\n if (\n evt.submitter &&\n evt.submitter.getAttribute('type') !== 'submit'\n ) {\n return;\n }\n }\n }\n\n if (!form || form.isSubmitting) return;\n\n form.submitError = null;\n form.setSubmitting(true);\n\n try {\n try {\n await form.validateFields();\n } catch (e) {\n form?.setSubmitting(false);\n\n return;\n }\n\n await timeout();\n await onSubmit?.(form.getFormData());\n } catch (e) {\n await timeout();\n\n // errors are shown\n form.submitError = e as ReactNode;\n // transfer errors to the callback\n onSubmitFailed?.(e);\n\n if (e instanceof Error) {\n throw e;\n }\n } finally {\n form?.setSubmitting(false);\n }\n\n // output data from form directly\n // onSubmit(Object.fromEntries(new FormData(e.target).entries()));\n };\n }\n\n [form] = useForm<T>(form, ref && ref.current, {\n onSubmit: onSubmitCallback,\n onValuesChange,\n });\n\n let styles = extractStyles(otherProps, CONTAINER_STYLES);\n\n if (labelWidth) {\n styles['$label-width'] = labelWidth;\n }\n\n let domRef = useObjectRef(ref);\n\n let ctx = {\n labelPosition,\n labelStyles,\n orientation,\n necessityIndicator,\n validateTrigger,\n requiredMark,\n showValid,\n form,\n submitError: form.submitError,\n idPrefix: name,\n };\n\n if (firstRunRef.current && form) {\n if (defaultValues) {\n form.setInitialFieldsValue(defaultValues);\n form.resetFields(undefined, true);\n firstRunRef.current = false;\n }\n }\n\n if (defaultValuesRef.current !== defaultValues) {\n form?.setInitialFieldsValue(defaultValues ?? {});\n defaultValuesRef.current = defaultValues;\n }\n\n return (\n <FormElement\n {...filterBaseProps(otherProps, { propNames: formPropNames })}\n ref={domRef}\n noValidate\n qa={qa}\n styles={styles}\n mods={{\n 'has-sider': labelPosition === 'side',\n 'has-split': labelPosition === 'split',\n horizontal: isHorizontal,\n }}\n onSubmit={onSubmitCallback}\n >\n <FormContext.Provider value={ctx}>\n <Provider\n insideForm={true}\n isDisabled={isDisabled}\n isReadOnly={isReadOnly}\n isInvalid={isInvalid}\n isValid={isValid}\n >\n {children}\n </Provider>\n </FormContext.Provider>\n </FormElement>\n );\n}\n\n/**\n * Forms allow users to enter data that can be submitted while providing alignment and styling for form fields.\n */\nconst _Form = forwardRef(Form) as unknown as <T extends FieldTypes>(\n props: CubeFormProps<T> & { ref?: Ref<HTMLFormElement> },\n) => ReactElement;\n\n(_Form as any).displayName = 'Form';\n\nexport { _Form as Form };\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Form.js","names":["ModernFormRoot"],"sources":["../../../../src/components/form/Form/Form.tsx"],"sourcesContent":["import { useObjectRef } from '@react-aria/utils';\nimport {\n BaseProps,\n CONTAINER_STYLES,\n ContainerStyleProps,\n filterBaseProps,\n Styles,\n tasty,\n} from '@tenphi/tasty';\nimport {\n createContext,\n FormHTMLAttributes,\n forwardRef,\n ReactElement,\n ReactNode,\n Ref,\n useContext,\n useRef,\n} from 'react';\n\nimport { Provider, useProviderProps } from '../../../provider';\nimport { FormBaseProps } from '../../../shared/index';\nimport { timeout } from '../../../utils/promise';\nimport { useCombinedRefs } from '../../../utils/react/index';\nimport { extractStyles } from '../../../utils/styles';\nimport { useValidationProps } from '../validation/index';\n\nimport { isModernFormController } from './backend';\nimport { ModernFormRoot } from './ModernFormRoot';\nimport { FieldTypes } from './types';\nimport { CubeFormData, CubeFormInstance, useForm } from './use-form';\n\n/**\n * Public legacy context. Its value is the full legacy scope (presentation\n * props, the instance, `submitError`, `idPrefix`) and is part of the exported\n * contract: wrappers outside the kit read it and Radio/Checkbox groups mask it.\n */\nexport const FormContext = createContext({});\n\n/**\n * Presentation and configuration that any root — legacy or modern — hands to\n * the fields below it. Backend-neutral by construction: no instance in here.\n */\nexport interface FormPresentationContextValue {\n labelPosition?: FormBaseProps['labelPosition'];\n labelStyles?: FormBaseProps['labelStyles'];\n orientation?: 'vertical' | 'horizontal';\n necessityIndicator?: FormBaseProps['necessityIndicator'];\n validateTrigger?: FormBaseProps['validateTrigger'];\n requiredMark?: boolean;\n showValid?: boolean;\n idPrefix?: string;\n}\n\nconst EMPTY_PRESENTATION: FormPresentationContextValue = {};\n\nexport const FormPresentationContext =\n createContext<FormPresentationContextValue>(EMPTY_PRESENTATION);\n\n/** The legacy instance of the nearest legacy root, `null` elsewhere. */\nexport const LegacyFormBackendContext =\n createContext<CubeFormInstance<any> | null>(null);\n\n/**\n * Radio/Checkbox groups scope their options: the options see the group's\n * validation state but neither the surrounding form's presentation props nor\n * its backend, so a nested `name` never registers as an independent field.\n */\nexport function FormScopeMask({\n value,\n children,\n}: {\n value: Record<string, unknown>;\n children?: ReactNode;\n}) {\n return (\n <FormPresentationContext.Provider value={EMPTY_PRESENTATION}>\n <LegacyFormBackendContext.Provider value={null}>\n <FormContext.Provider value={value}>{children}</FormContext.Provider>\n </LegacyFormBackendContext.Provider>\n </FormPresentationContext.Provider>\n );\n}\n\nconst FormElement = tasty({\n as: 'form',\n qa: 'Form',\n styles: {\n display: {\n '': 'block',\n horizontal: 'flex',\n },\n flow: {\n '': 'column',\n horizontal: 'row',\n },\n placeItems: {\n '': 'initial',\n horizontal: 'center',\n },\n gap: '2x',\n '$label-width': '25x',\n },\n});\n\n/**\n * Merge order: presentation context, then the legacy `FormContext`, then the\n * props. Under a legacy root the two contexts carry the same presentation\n * values, so the result is exactly `{ ...FormContext, ...props }` as before.\n */\nexport function useFormProps(props) {\n const presentation = useContext(FormPresentationContext);\n const ctx = useContext(FormContext);\n\n return { ...presentation, ...ctx, ...props };\n}\n\nconst formPropNames = new Set([\n 'action',\n 'autoComplete',\n 'encType',\n 'method',\n 'target',\n]);\n\nexport interface CubeFormProps<T extends FieldTypes = FieldTypes>\n extends FormBaseProps,\n BaseProps,\n ContainerStyleProps,\n Pick<\n FormHTMLAttributes<HTMLFormElement>,\n 'action' | 'autoComplete' | 'encType' | 'method' | 'target'\n > {\n /** Form name */\n name?: string;\n /** Default field values */\n defaultValues?: Partial<T>;\n /** Trigger when any value of the Field is changed */\n onValuesChange?: CubeFormInstance<T>['onValuesChange'];\n /** Trigger on form submit and success */\n onSubmit?: CubeFormInstance<T>['onSubmit'];\n /** Trigger on form submit and failed */\n onSubmitFailed?: (any?) => void | Promise<any>;\n /** Set form instance created by useForm */\n form?: CubeFormInstance<T, CubeFormData<T>>;\n /** The size of the side area with labels. Only for `labelPosition=\"side\"` */\n labelWidth?: Styles['width'];\n orientation?: 'vertical' | 'horizontal';\n}\n\n/**\n * The legacy backend's root: the current engine under an internal name. Its\n * role is compatibility; see `legacy-contract/README.md` for what is frozen.\n */\nfunction LegacyFormRoot<T extends FieldTypes>(\n props: CubeFormProps<T>,\n ref: Ref<HTMLFormElement>,\n) {\n props = useValidationProps(useProviderProps(props));\n let {\n qa,\n name,\n children,\n labelPosition,\n orientation,\n necessityIndicator,\n isDisabled,\n isReadOnly,\n isInvalid,\n isValid,\n labelStyles,\n validateTrigger,\n showValid,\n defaultValues,\n onValuesChange,\n requiredMark = true,\n form,\n labelWidth,\n onSubmit,\n onSubmitFailed,\n ...otherProps\n } = props;\n const defaultValuesRef = useRef(defaultValues);\n const firstRunRef = useRef(true);\n const isHorizontal = orientation === 'horizontal';\n\n if (!orientation) {\n orientation = 'vertical';\n }\n\n if (!labelPosition) {\n labelPosition = isHorizontal ? 'side' : 'top';\n }\n\n if (!labelWidth) {\n labelWidth = isHorizontal ? 'auto' : undefined;\n }\n\n ref = useCombinedRefs(ref);\n\n let onSubmitCallback;\n\n if ((onSubmit || onSubmitFailed) && !otherProps.action) {\n onSubmitCallback = async (e) => {\n if (e && e?.preventDefault) {\n e && e?.preventDefault && e?.preventDefault();\n e && e?.stopPropagation && e?.stopPropagation();\n\n if (e.nativeEvent) {\n const evt = e.nativeEvent;\n\n if (\n evt.submitter &&\n evt.submitter.getAttribute('type') !== 'submit'\n ) {\n return;\n }\n }\n }\n\n if (!form || form.isSubmitting) return;\n\n form.submitError = null;\n form.setSubmitting(true);\n\n try {\n try {\n await form.validateFields();\n } catch (e) {\n form?.setSubmitting(false);\n\n return;\n }\n\n await timeout();\n await onSubmit?.(form.getFormData());\n } catch (e) {\n await timeout();\n\n // errors are shown\n form.submitError = e as ReactNode;\n // transfer errors to the callback\n onSubmitFailed?.(e);\n\n if (e instanceof Error) {\n throw e;\n }\n } finally {\n form?.setSubmitting(false);\n }\n\n // output data from form directly\n // onSubmit(Object.fromEntries(new FormData(e.target).entries()));\n };\n }\n\n [form] = useForm<T>(form, ref && ref.current, {\n onSubmit: onSubmitCallback,\n onValuesChange,\n });\n\n let styles = extractStyles(otherProps, CONTAINER_STYLES);\n\n if (labelWidth) {\n styles['$label-width'] = labelWidth;\n }\n\n let domRef = useObjectRef(ref);\n\n const presentation: FormPresentationContextValue = {\n labelPosition,\n labelStyles,\n orientation,\n necessityIndicator,\n validateTrigger,\n requiredMark,\n showValid,\n idPrefix: name,\n };\n\n let ctx = {\n ...presentation,\n form,\n submitError: form.submitError,\n };\n\n if (firstRunRef.current && form) {\n if (defaultValues) {\n form.setInitialFieldsValue(defaultValues);\n form.resetFields(undefined, true);\n firstRunRef.current = false;\n }\n }\n\n if (defaultValuesRef.current !== defaultValues) {\n form?.setInitialFieldsValue(defaultValues ?? {});\n defaultValuesRef.current = defaultValues;\n }\n\n return (\n <FormElement\n {...filterBaseProps(otherProps, { propNames: formPropNames })}\n ref={domRef}\n noValidate\n qa={qa}\n styles={styles}\n mods={{\n 'has-sider': labelPosition === 'side',\n 'has-split': labelPosition === 'split',\n horizontal: isHorizontal,\n }}\n onSubmit={onSubmitCallback}\n >\n <FormPresentationContext.Provider value={presentation}>\n <LegacyFormBackendContext.Provider value={form}>\n <FormContext.Provider value={ctx}>\n <Provider\n insideForm={true}\n isDisabled={isDisabled}\n isReadOnly={isReadOnly}\n isInvalid={isInvalid}\n isValid={isValid}\n >\n {children}\n </Provider>\n </FormContext.Provider>\n </LegacyFormBackendContext.Provider>\n </FormPresentationContext.Provider>\n </FormElement>\n );\n}\n\nconst _LegacyFormRoot = forwardRef(LegacyFormRoot) as unknown as <\n T extends FieldTypes,\n>(\n props: CubeFormProps<T> & { ref?: Ref<HTMLFormElement> },\n) => ReactElement;\n\n(_LegacyFormRoot as any).displayName = 'LegacyFormRoot';\n\n/**\n * The `<Form>` facade. It chooses the root by the brand of the `form` prop\n * before any backend hook runs; without a modern controller — which is every\n * form today — it is the legacy root, so `<Form>` and `Form.useForm()` keep\n * their behaviour.\n */\nfunction Form<T extends FieldTypes>(\n props: CubeFormProps<T>,\n ref: Ref<HTMLFormElement>,\n) {\n if (isModernFormController(props.form as unknown)) {\n return <ModernFormRoot {...props} ref={ref} />;\n }\n\n return <_LegacyFormRoot {...props} ref={ref} />;\n}\n\n/**\n * Forms allow users to enter data that can be submitted while providing alignment and styling for form fields.\n */\nconst _Form = forwardRef(Form) as unknown as <T extends FieldTypes>(\n props: CubeFormProps<T> & { ref?: Ref<HTMLFormElement> },\n) => ReactElement;\n\n(_Form as any).displayName = 'Form';\n\nexport { _Form as Form, _LegacyFormRoot as LegacyFormRoot };\n"],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.0.0-canary-9fd458b | Cube Dev Team */
|
|
2
|
+
import { modernBackendUnavailableError } from "./backend.js";
|
|
3
|
+
import { forwardRef } from "react";
|
|
4
|
+
|
|
5
|
+
//#region src/components/form/Form/ModernFormRoot.tsx
|
|
6
|
+
/**
|
|
7
|
+
* The `<Form>` facade renders this root for a branded modern controller. It is
|
|
8
|
+
* a boundary, not an implementation: the modern backend is not in this version,
|
|
9
|
+
* so reaching it is an error rather than silent legacy behaviour (plan §9,
|
|
10
|
+
* Phase 3 gate: "no modern behavior is reachable accidentally").
|
|
11
|
+
*/
|
|
12
|
+
function ModernFormRoot(_props, _ref) {
|
|
13
|
+
throw modernBackendUnavailableError("<Form>");
|
|
14
|
+
}
|
|
15
|
+
const _ModernFormRoot = forwardRef(ModernFormRoot);
|
|
16
|
+
_ModernFormRoot.displayName = "ModernFormRoot";
|
|
17
|
+
|
|
18
|
+
//#endregion
|
|
19
|
+
export { _ModernFormRoot };
|
|
20
|
+
//# sourceMappingURL=ModernFormRoot.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ModernFormRoot.js","names":[],"sources":["../../../../src/components/form/Form/ModernFormRoot.tsx"],"sourcesContent":["import { forwardRef, ReactElement, Ref } from 'react';\n\nimport { modernBackendUnavailableError } from './backend';\n\nimport type { CubeFormProps } from './Form';\nimport type { FieldTypes } from './types';\n\n/**\n * The `<Form>` facade renders this root for a branded modern controller. It is\n * a boundary, not an implementation: the modern backend is not in this version,\n * so reaching it is an error rather than silent legacy behaviour (plan §9,\n * Phase 3 gate: \"no modern behavior is reachable accidentally\").\n */\nfunction ModernFormRoot<T extends FieldTypes>(\n _props: CubeFormProps<T>,\n _ref: Ref<HTMLFormElement>,\n): ReactElement {\n throw modernBackendUnavailableError('<Form>');\n}\n\nconst _ModernFormRoot = forwardRef(ModernFormRoot) as unknown as <\n T extends FieldTypes,\n>(\n props: CubeFormProps<T> & { ref?: Ref<HTMLFormElement> },\n) => ReactElement;\n\n(_ModernFormRoot as any).displayName = 'ModernFormRoot';\n\nexport { _ModernFormRoot as ModernFormRoot };\n"],"mappings":";;;;;;;;;;;AAaA,SAAS,eACP,QACA,MACc;AACd,OAAM,8BAA8B,SAAS;;AAG/C,MAAM,kBAAkB,WAAW,eAAe;AAMlD,AAAC,gBAAwB,cAAc"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.0.0-canary-
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.0.0-canary-9fd458b | Cube Dev Team */
|
|
2
2
|
import { mergeProps } from "../../../../utils/react/mergeProps.js";
|
|
3
3
|
import { useEvent } from "../../../../_internal/hooks/use-event.js";
|
|
4
4
|
import { useProviderProps } from "../../../../provider.js";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.0.0-canary-
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.0.0-canary-9fd458b | Cube Dev Team */
|
|
2
2
|
import { useProviderProps } from "../../../../provider.js";
|
|
3
3
|
import { Button } from "../../../actions/Button/Button.js";
|
|
4
4
|
import { useFormProps } from "../Form.js";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.0.0-canary-
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.0.0-canary-9fd458b | Cube Dev Team */
|
|
2
2
|
import { useI18n } from "../../../i18n/useI18n.js";
|
|
3
3
|
import { FormContext } from "./Form.js";
|
|
4
4
|
import { Alert } from "../../content/Alert/Alert.js";
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
|
|
2
|
+
//#region src/components/form/Form/backend.d.ts
|
|
3
|
+
declare const FORM_BACKEND: unique symbol;
|
|
4
|
+
interface LegacyFormBrand {
|
|
5
|
+
readonly [FORM_BACKEND]: 'legacy';
|
|
6
|
+
}
|
|
7
|
+
//#endregion
|
|
8
|
+
export { FORM_BACKEND, LegacyFormBrand };
|
|
9
|
+
//# sourceMappingURL=backend.d.ts.map
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.0.0-canary-9fd458b | Cube Dev Team */
|
|
2
|
+
//#region src/components/form/Form/backend.ts
|
|
3
|
+
const FORM_BACKEND = Symbol.for("@cube-dev/ui-kit/form-backend");
|
|
4
|
+
function isModernFormController(value) {
|
|
5
|
+
return !!value && typeof value === "object" && value[FORM_BACKEND] === "modern";
|
|
6
|
+
}
|
|
7
|
+
const NONE = { kind: "none" };
|
|
8
|
+
/**
|
|
9
|
+
* Classify whatever arrived through a `form` prop or the form context.
|
|
10
|
+
*
|
|
11
|
+
* An unbranded object counts as legacy on purpose: Cloud narrows form props to
|
|
12
|
+
* structural types and its tests pass plain mocks, and the legacy engine has
|
|
13
|
+
* always accepted them.
|
|
14
|
+
*/
|
|
15
|
+
function resolveFormBackend(candidate) {
|
|
16
|
+
if (candidate == null) return NONE;
|
|
17
|
+
if (isModernFormController(candidate)) return {
|
|
18
|
+
kind: "modern",
|
|
19
|
+
controller: candidate
|
|
20
|
+
};
|
|
21
|
+
return {
|
|
22
|
+
kind: "legacy",
|
|
23
|
+
instance: candidate
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
function modernBackendUnavailableError(receiver) {
|
|
27
|
+
return /* @__PURE__ */ new Error(`${receiver} received a modern form controller, but the modern Form backend is not available in this version of @cube-dev/ui-kit. Create forms with Form.useForm() for now.`);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
//#endregion
|
|
31
|
+
export { FORM_BACKEND, isModernFormController, modernBackendUnavailableError, resolveFormBackend };
|
|
32
|
+
//# 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 shared field hook refuses a backend that does not match its root.\n *\n * Phase 3 ships the shell only. No modern creator is exported, so a modern\n * controller cannot be constructed by consumers yet; every modern branch ends\n * in `modernBackendUnavailableError` until the modern backend lands.\n */\nimport type { CubeFormInstance } from './use-form';\n\nexport const FORM_BACKEND: unique symbol = Symbol.for(\n '@cube-dev/ui-kit/form-backend',\n);\n\nexport type FormBackendKind = 'legacy' | 'modern';\n\nexport interface LegacyFormBrand {\n readonly [FORM_BACKEND]: 'legacy';\n}\n\nexport interface ModernFormBrand {\n readonly [FORM_BACKEND]: 'modern';\n}\n\n/**\n * The modern controller as the shell knows it: the brand and nothing else.\n * The store, selectors and commands arrive with the modern backend; `T` is\n * carried so consumers can already be typed against it.\n */\nexport interface FormController<T extends object = Record<string, unknown>>\n extends ModernFormBrand {\n readonly '~values'?: (values: T) => void;\n}\n\nexport function isLegacyFormInstance(\n value: unknown,\n): value is CubeFormInstance<any> {\n return (\n !!value &&\n typeof value === 'object' &&\n (value as Record<PropertyKey, unknown>)[FORM_BACKEND] === 'legacy'\n );\n}\n\nexport function isModernFormController(\n value: unknown,\n): value is FormController<any> {\n return (\n !!value &&\n typeof value === 'object' &&\n (value as Record<PropertyKey, unknown>)[FORM_BACKEND] === 'modern'\n );\n}\n\nexport type ResolvedFormBackend =\n | { kind: 'none' }\n | { kind: 'legacy'; instance: CubeFormInstance<any> }\n | { kind: 'modern'; controller: FormController<any> };\n\nconst NONE: ResolvedFormBackend = { kind: 'none' };\n\n/**\n * Classify whatever arrived through a `form` prop or the form context.\n *\n * An unbranded object counts as legacy on purpose: Cloud narrows form props to\n * structural types and its tests pass plain mocks, and the legacy engine has\n * always accepted them.\n */\nexport function resolveFormBackend(candidate: unknown): ResolvedFormBackend {\n if (candidate == null) return NONE;\n\n if (isModernFormController(candidate)) {\n return { kind: 'modern', controller: candidate };\n }\n\n return { kind: 'legacy', instance: candidate as CubeFormInstance<any> };\n}\n\nexport function modernBackendUnavailableError(receiver: string): Error {\n return new Error(\n `${receiver} received a modern form controller, but the modern Form backend is not available in this version of @cube-dev/ui-kit. Create forms with Form.useForm() for now.`,\n );\n}\n"],"mappings":";;AAcA,MAAa,eAA8B,OAAO,IAChD,gCACD;AAgCD,SAAgB,uBACd,OAC8B;AAC9B,QACE,CAAC,CAAC,SACF,OAAO,UAAU,YAChB,MAAuC,kBAAkB;;AAS9D,MAAM,OAA4B,EAAE,MAAM,QAAQ;;;;;;;;AASlD,SAAgB,mBAAmB,WAAyC;AAC1E,KAAI,aAAa,KAAM,QAAO;AAE9B,KAAI,uBAAuB,UAAU,CACnC,QAAO;EAAE,MAAM;EAAU,YAAY;EAAW;AAGlD,QAAO;EAAE,MAAM;EAAU,UAAU;EAAoC;;AAGzE,SAAgB,8BAA8B,UAAyB;AACrE,wBAAO,IAAI,MACT,GAAG,SAAS,iKACb"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.0.0-canary-
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.0.0-canary-9fd458b | Cube Dev Team */
|
|
2
2
|
import { useForm } from "./use-form.js";
|
|
3
3
|
import { FormContext, _Form, useFormProps } from "./Form.js";
|
|
4
4
|
import { useField } from "./use-field/use-field.js";
|
|
@@ -23,7 +23,18 @@ type UseFieldPropsParams = {
|
|
|
23
23
|
*/
|
|
24
24
|
unsafe__isDisabled?: boolean;
|
|
25
25
|
};
|
|
26
|
-
|
|
26
|
+
/**
|
|
27
|
+
* The single entry point for input components (see
|
|
28
|
+
* `docs/rules/input-components.md`).
|
|
29
|
+
*
|
|
30
|
+
* Every hook below runs on every render, whatever the mode: standalone (no
|
|
31
|
+
* `name`), inside the deprecated `<Field>`, disabled through
|
|
32
|
+
* `unsafe__isDisabled`, or bound to a form. The mode only decides which props
|
|
33
|
+
* come back, so an input can gain or lose a `name`, or move between forms,
|
|
34
|
+
* without changing its hook order. The legacy binding (`useField`) is the
|
|
35
|
+
* legacy backend's adapter and is inert when the field is not bound to it.
|
|
36
|
+
*/
|
|
37
|
+
declare function useFieldProps<T extends FieldTypes, Props extends UseFieldProps<T>>(inputProps: Props, params?: UseFieldPropsParams): Props;
|
|
27
38
|
//#endregion
|
|
28
39
|
export { UseFieldPropsParams, useFieldProps };
|
|
29
40
|
//# sourceMappingURL=use-field-props.d.ts.map
|
|
@@ -1,20 +1,30 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.0.0-canary-
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.0.0-canary-9fd458b | Cube Dev Team */
|
|
2
2
|
import { mergeProps } from "../../../../utils/react/mergeProps.js";
|
|
3
3
|
import { useEvent } from "../../../../_internal/hooks/use-event.js";
|
|
4
4
|
import { warn } from "../../../../utils/warnings.js";
|
|
5
5
|
import { useProviderProps } from "../../../../provider.js";
|
|
6
6
|
import { useValidationProps } from "../../validation/use-validation-props.js";
|
|
7
|
+
import { modernBackendUnavailableError, resolveFormBackend } from "../backend.js";
|
|
7
8
|
import { useFormProps } from "../Form.js";
|
|
8
9
|
import { useField } from "./use-field.js";
|
|
9
10
|
import { useInsideLegacyField } from "../Field.js";
|
|
10
|
-
import { useDebugValue, useId,
|
|
11
|
+
import { useDebugValue, useId, useState } from "react";
|
|
11
12
|
|
|
12
13
|
//#region src/components/form/Form/use-field/use-field-props.tsx
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
14
|
+
/**
|
|
15
|
+
* The single entry point for input components (see
|
|
16
|
+
* `docs/rules/input-components.md`).
|
|
17
|
+
*
|
|
18
|
+
* Every hook below runs on every render, whatever the mode: standalone (no
|
|
19
|
+
* `name`), inside the deprecated `<Field>`, disabled through
|
|
20
|
+
* `unsafe__isDisabled`, or bound to a form. The mode only decides which props
|
|
21
|
+
* come back, so an input can gain or lose a `name`, or move between forms,
|
|
22
|
+
* without changing its hook order. The legacy binding (`useField`) is the
|
|
23
|
+
* legacy backend's adapter and is inert when the field is not bound to it.
|
|
24
|
+
*/
|
|
25
|
+
function useFieldProps(inputProps, params = {}) {
|
|
26
|
+
const props = useValidationProps(useFormProps(useProviderProps(inputProps)));
|
|
27
|
+
const [isDisabled] = useState(params.unsafe__isDisabled ?? false);
|
|
18
28
|
const { valuePropsMapper = ({ value, onChange }) => {
|
|
19
29
|
return {
|
|
20
30
|
value: value ?? null,
|
|
@@ -23,51 +33,58 @@ function useFieldProps(props, params = {}) {
|
|
|
23
33
|
}, defaultValidationTrigger = "onBlur" } = params;
|
|
24
34
|
const isInsideLegacyField = useInsideLegacyField();
|
|
25
35
|
if (props.rules && !props.name) warn(`The "rules" prop is not suitable for fields that are not part of a form. Use "name" prop to link the field to a form.`);
|
|
26
|
-
if (isInsideLegacyField || isDisabledRef.current === true) return props;
|
|
27
36
|
const hasName = props.name != null;
|
|
28
37
|
const generatedId = useId();
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
...result.labelProps,
|
|
38
|
-
for: result.id
|
|
39
|
-
};
|
|
40
|
-
return result;
|
|
41
|
-
}
|
|
42
|
-
return props;
|
|
43
|
-
}
|
|
44
|
-
const field = useField(props, { defaultValidationTrigger: params.defaultValidationTrigger });
|
|
38
|
+
const isBound = hasName && !isInsideLegacyField && !isDisabled;
|
|
39
|
+
const backend = resolveFormBackend(props.form);
|
|
40
|
+
if (isBound && backend.kind === "modern") throw modernBackendUnavailableError(`The "${props.name}" field`);
|
|
41
|
+
const field = useField(isBound ? props : {
|
|
42
|
+
...props,
|
|
43
|
+
name: void 0,
|
|
44
|
+
form: void 0
|
|
45
|
+
}, { defaultValidationTrigger: params.defaultValidationTrigger });
|
|
45
46
|
const isOutsideOfForm = field?.form == null;
|
|
46
|
-
if (props.rules && isOutsideOfForm) warn(`The "rules" prop is not supported for fields that are not part of a form. The "${props.name}" field is placed outside the form.`);
|
|
47
47
|
const onChangeEvent = useEvent((value, dontTouch) => {
|
|
48
48
|
field?.onChange?.(value, dontTouch, field?.validateTrigger ?? defaultValidationTrigger);
|
|
49
49
|
});
|
|
50
|
-
const
|
|
51
|
-
value: field.value,
|
|
52
|
-
onChange: onChangeEvent
|
|
53
|
-
}) : {};
|
|
54
|
-
if (isInsideLegacyField && !isOutsideOfForm) {
|
|
55
|
-
const valuePropEventNames = !isOutsideOfForm ? Object.keys(valueProps).filter((name) => name.startsWith("on")) : [];
|
|
56
|
-
for (const valuePropName of valuePropEventNames) if (valuePropName in props) warn(`The "${valuePropName}" listener is not supported for input "${props.name}" that is linked to a form via a <Field> component. Remove the <Field> component and move its properties to the input itself.`);
|
|
57
|
-
}
|
|
58
|
-
const compiledErrorMessage = props.errorMessage !== void 0 ? props.errorMessage : field?.field?.status === "invalid" && field?.field?.errors?.length ? field.field.errors[0] : void 0;
|
|
59
|
-
const { form: _form, onChange: _fieldOnChange, onBlur: _fieldOnBlur, ...fieldRest } = field ?? {};
|
|
60
|
-
const result = isOutsideOfForm ? props : mergeProps(props, fieldRest, valueProps, {
|
|
61
|
-
validateTrigger: field.validateTrigger ?? defaultValidationTrigger,
|
|
62
|
-
onBlur: field.onBlur,
|
|
63
|
-
errorMessage: compiledErrorMessage
|
|
64
|
-
});
|
|
65
|
-
if (result.id) {
|
|
66
|
-
if (!result.labelProps) result.labelProps = {};
|
|
67
|
-
result.labelProps.for = result.id;
|
|
68
|
-
}
|
|
50
|
+
const result = resolveResult();
|
|
69
51
|
useDebugValue(result);
|
|
70
52
|
return result;
|
|
53
|
+
function resolveResult() {
|
|
54
|
+
if (isInsideLegacyField || isDisabled) return props;
|
|
55
|
+
if (!hasName) {
|
|
56
|
+
if (!props.id) {
|
|
57
|
+
const result = {
|
|
58
|
+
...props,
|
|
59
|
+
id: generatedId
|
|
60
|
+
};
|
|
61
|
+
if (result.id && !result.labelProps) result.labelProps = { for: result.id };
|
|
62
|
+
else if (result.id && result.labelProps && !result.labelProps.for) result.labelProps = {
|
|
63
|
+
...result.labelProps,
|
|
64
|
+
for: result.id
|
|
65
|
+
};
|
|
66
|
+
return result;
|
|
67
|
+
}
|
|
68
|
+
return props;
|
|
69
|
+
}
|
|
70
|
+
if (props.rules && isOutsideOfForm) warn(`The "rules" prop is not supported for fields that are not part of a form. The "${props.name}" field is placed outside the form.`);
|
|
71
|
+
const valueProps = !isOutsideOfForm ? valuePropsMapper({
|
|
72
|
+
value: field.value,
|
|
73
|
+
onChange: onChangeEvent
|
|
74
|
+
}) : {};
|
|
75
|
+
const compiledErrorMessage = props.errorMessage !== void 0 ? props.errorMessage : field?.field?.status === "invalid" && field?.field?.errors?.length ? field.field.errors[0] : void 0;
|
|
76
|
+
const { form: _form, onChange: _fieldOnChange, onBlur: _fieldOnBlur, ...fieldRest } = field ?? {};
|
|
77
|
+
const result = isOutsideOfForm ? props : mergeProps(props, fieldRest, valueProps, {
|
|
78
|
+
validateTrigger: field.validateTrigger ?? defaultValidationTrigger,
|
|
79
|
+
onBlur: field.onBlur,
|
|
80
|
+
errorMessage: compiledErrorMessage
|
|
81
|
+
});
|
|
82
|
+
if (result.id) {
|
|
83
|
+
if (!result.labelProps) result.labelProps = {};
|
|
84
|
+
result.labelProps.for = result.id;
|
|
85
|
+
}
|
|
86
|
+
return result;
|
|
87
|
+
}
|
|
71
88
|
}
|
|
72
89
|
|
|
73
90
|
//#endregion
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-field-props.js","names":[],"sources":["../../../../../src/components/form/Form/use-field/use-field-props.tsx"],"sourcesContent":["import { useDebugValue, useId,
|
|
1
|
+
{"version":3,"file":"use-field-props.js","names":[],"sources":["../../../../../src/components/form/Form/use-field/use-field-props.tsx"],"sourcesContent":["import { useDebugValue, useId, useState } from 'react';\n\nimport { useEvent } from '../../../../_internal/index';\nimport { useProviderProps } from '../../../../provider';\nimport { mergeProps } from '../../../../utils/react/index';\nimport { warn } from '../../../../utils/warnings';\nimport { useValidationProps } from '../../validation/index';\nimport { modernBackendUnavailableError, resolveFormBackend } from '../backend';\nimport { useInsideLegacyField } from '../Field';\nimport { useFormProps } from '../Form';\n\nimport { useField } from './use-field';\n\nimport type { ValidateTrigger } from '../../../../shared/index';\nimport type { FieldTypes } from '../types';\nimport type { UseFieldProps } from './types';\n\nexport type UseFieldPropsParams = {\n valuePropsMapper?: ({ value, onChange }) => any;\n /**\n * @default 'onBlur'\n */\n defaultValidationTrigger?: ValidateTrigger;\n /**\n * prop helps to prevent calling hook conditionally, but changing this prop during render is unsafe and forbidden\n * If you want to change this prop after mount, remount the component with a new value.\n */\n unsafe__isDisabled?: boolean;\n};\n\n/**\n * The single entry point for input components (see\n * `docs/rules/input-components.md`).\n *\n * Every hook below runs on every render, whatever the mode: standalone (no\n * `name`), inside the deprecated `<Field>`, disabled through\n * `unsafe__isDisabled`, or bound to a form. The mode only decides which props\n * come back, so an input can gain or lose a `name`, or move between forms,\n * without changing its hook order. The legacy binding (`useField`) is the\n * legacy backend's adapter and is inert when the field is not bound to it.\n */\nexport function useFieldProps<\n T extends FieldTypes,\n Props extends UseFieldProps<T>,\n>(inputProps: Props, params: UseFieldPropsParams = {}): Props {\n // Provider defaults, then form context, then the normalization of the\n // deprecated `validationState` prop into `isInvalid`/`isValid`.\n const props: Props = useValidationProps(\n useFormProps(useProviderProps(inputProps)),\n );\n\n // The initial value is what counts: changing it after mount is unsupported.\n const [isDisabled] = useState(params.unsafe__isDisabled ?? false);\n\n const {\n valuePropsMapper = ({ value, onChange }) => {\n return {\n value: value ?? null,\n onChange,\n };\n },\n defaultValidationTrigger = 'onBlur',\n } = params;\n\n const isInsideLegacyField = useInsideLegacyField();\n\n if (props.rules && !props.name) {\n warn(\n `The \"rules\" prop is not suitable for fields that are not part of a form. Use \"name\" prop to link the field to a form.`,\n );\n }\n\n const hasName = props.name != null;\n const generatedId = useId();\n const isBound = hasName && !isInsideLegacyField && !isDisabled;\n\n // `props.form` is the explicit prop or the surrounding legacy root by now.\n const backend = resolveFormBackend(props.form);\n\n if (isBound && backend.kind === 'modern') {\n throw modernBackendUnavailableError(`The \"${props.name}\" field`);\n }\n\n // Legacy binding, always called; with neither name nor form it registers\n // nothing, generates no id and returns an inert value.\n const field = useField<T, Props>(\n isBound ? props : ({ ...props, name: undefined, form: undefined } as Props),\n { defaultValidationTrigger: params.defaultValidationTrigger },\n );\n\n const isOutsideOfForm = field?.form == null;\n\n const onChangeEvent = useEvent((value, dontTouch: boolean) => {\n field?.onChange?.(\n value,\n dontTouch,\n field?.validateTrigger ?? defaultValidationTrigger,\n );\n });\n\n const result = resolveResult();\n\n useDebugValue(result);\n\n return result;\n\n function resolveResult(): Props {\n if (isInsideLegacyField || isDisabled) {\n return props;\n }\n\n if (!hasName) {\n // Standalone field - just add generated ID if not provided\n if (!props.id) {\n const result = { ...props, id: generatedId };\n\n if (result.id && !result.labelProps) {\n result.labelProps = { for: result.id };\n } else if (result.id && result.labelProps && !result.labelProps.for) {\n result.labelProps = { ...result.labelProps, for: result.id };\n }\n\n return result as Props;\n }\n return props;\n }\n\n if (props.rules && isOutsideOfForm) {\n warn(\n `The \"rules\" prop is not supported for fields that are not part of a form. The \"${props.name}\" field is placed outside the form.`,\n );\n }\n\n const valueProps = !isOutsideOfForm\n ? valuePropsMapper({\n value: field.value,\n onChange: onChangeEvent,\n })\n : {};\n\n // Use errorMessage directly or fall back to validation errors\n const compiledErrorMessage =\n props.errorMessage !== undefined\n ? props.errorMessage\n : field?.field?.status === 'invalid' && field?.field?.errors?.length\n ? field.field.errors[0]\n : undefined;\n\n // Exclude `form` (it must never reach a DOM node) and the field's own\n // handlers: `valueProps` already routes the component's change event into\n // `field.onChange` under the name the component listens to, and `onBlur` is\n // added once below. `mergeProps` chains same-named handlers, so merging them\n // here as well made every user change and every blur run the field handler\n // twice — and onChange/onBlur-triggered validation validate twice.\n const {\n form: _form,\n onChange: _fieldOnChange,\n onBlur: _fieldOnBlur,\n ...fieldRest\n } = field ?? {};\n\n const result: Props = isOutsideOfForm\n ? props\n : mergeProps(props, fieldRest, valueProps, {\n validateTrigger: field.validateTrigger ?? defaultValidationTrigger,\n // Chained after the caller's own `onBlur` by `mergeProps`.\n onBlur: field.onBlur,\n errorMessage: compiledErrorMessage,\n });\n\n if (result.id) {\n if (!result.labelProps) {\n result.labelProps = {};\n }\n\n result.labelProps.for = result.id;\n }\n\n return result;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAyCA,SAAgB,cAGd,YAAmB,SAA8B,EAAE,EAAS;CAG5D,MAAM,QAAe,mBACnB,aAAa,iBAAiB,WAAW,CAAC,CAC3C;CAGD,MAAM,CAAC,cAAc,SAAS,OAAO,sBAAsB,MAAM;CAEjE,MAAM,EACJ,oBAAoB,EAAE,OAAO,eAAe;AAC1C,SAAO;GACL,OAAO,SAAS;GAChB;GACD;IAEH,2BAA2B,aACzB;CAEJ,MAAM,sBAAsB,sBAAsB;AAElD,KAAI,MAAM,SAAS,CAAC,MAAM,KACxB,MACE,wHACD;CAGH,MAAM,UAAU,MAAM,QAAQ;CAC9B,MAAM,cAAc,OAAO;CAC3B,MAAM,UAAU,WAAW,CAAC,uBAAuB,CAAC;CAGpD,MAAM,UAAU,mBAAmB,MAAM,KAAK;AAE9C,KAAI,WAAW,QAAQ,SAAS,SAC9B,OAAM,8BAA8B,QAAQ,MAAM,KAAK,SAAS;CAKlE,MAAM,QAAQ,SACZ,UAAU,QAAS;EAAE,GAAG;EAAO,MAAM;EAAW,MAAM;EAAW,EACjE,EAAE,0BAA0B,OAAO,0BAA0B,CAC9D;CAED,MAAM,kBAAkB,OAAO,QAAQ;CAEvC,MAAM,gBAAgB,UAAU,OAAO,cAAuB;AAC5D,SAAO,WACL,OACA,WACA,OAAO,mBAAmB,yBAC3B;GACD;CAEF,MAAM,SAAS,eAAe;AAE9B,eAAc,OAAO;AAErB,QAAO;CAEP,SAAS,gBAAuB;AAC9B,MAAI,uBAAuB,WACzB,QAAO;AAGT,MAAI,CAAC,SAAS;AAEZ,OAAI,CAAC,MAAM,IAAI;IACb,MAAM,SAAS;KAAE,GAAG;KAAO,IAAI;KAAa;AAE5C,QAAI,OAAO,MAAM,CAAC,OAAO,WACvB,QAAO,aAAa,EAAE,KAAK,OAAO,IAAI;aAC7B,OAAO,MAAM,OAAO,cAAc,CAAC,OAAO,WAAW,IAC9D,QAAO,aAAa;KAAE,GAAG,OAAO;KAAY,KAAK,OAAO;KAAI;AAG9D,WAAO;;AAET,UAAO;;AAGT,MAAI,MAAM,SAAS,gBACjB,MACE,kFAAkF,MAAM,KAAK,qCAC9F;EAGH,MAAM,aAAa,CAAC,kBAChB,iBAAiB;GACf,OAAO,MAAM;GACb,UAAU;GACX,CAAC,GACF,EAAE;EAGN,MAAM,uBACJ,MAAM,iBAAiB,SACnB,MAAM,eACN,OAAO,OAAO,WAAW,aAAa,OAAO,OAAO,QAAQ,SAC1D,MAAM,MAAM,OAAO,KACnB;EAQR,MAAM,EACJ,MAAM,OACN,UAAU,gBACV,QAAQ,cACR,GAAG,cACD,SAAS,EAAE;EAEf,MAAM,SAAgB,kBAClB,QACA,WAAW,OAAO,WAAW,YAAY;GACvC,iBAAiB,MAAM,mBAAmB;GAE1C,QAAQ,MAAM;GACd,cAAc;GACf,CAAC;AAEN,MAAI,OAAO,IAAI;AACb,OAAI,CAAC,OAAO,WACV,QAAO,aAAa,EAAE;AAGxB,UAAO,WAAW,MAAM,OAAO;;AAGjC,SAAO"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.0.0-canary-
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.0.0-canary-9fd458b | Cube Dev Team */
|
|
2
2
|
import { useEvent } from "../../../../_internal/hooks/use-event.js";
|
|
3
3
|
import { useIsFirstRender } from "../../../../_internal/hooks/use-is-first-render.js";
|
|
4
4
|
import { resolveValidationProps } from "../../validation/resolve-validation-props.js";
|
|
@@ -63,7 +63,7 @@ function useField(props, params) {
|
|
|
63
63
|
if (!form) return;
|
|
64
64
|
if (field) form.forceReRender();
|
|
65
65
|
else field = form.createField(fieldName);
|
|
66
|
-
}, [field]);
|
|
66
|
+
}, [field, fieldName]);
|
|
67
67
|
if (form) {
|
|
68
68
|
if (isFirstRender) {
|
|
69
69
|
if (!field) field = form.createField(fieldName, true);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-field.js","names":[],"sources":["../../../../../src/components/form/Form/use-field/use-field.ts"],"sourcesContent":["import { useEffect, useMemo, useState } from 'react';\n\nimport { useEvent, useIsFirstRender } from '../../../../_internal/index';\nimport { ValidateTrigger } from '../../../../shared/index';\nimport { resolveValidationProps } from '../../validation/index';\nimport { useFormProps } from '../Form';\nimport { FieldTypes } from '../types';\nimport { delayValidationRule } from '../validation';\n\nimport { FieldReturnValue, UseFieldProps } from './types';\n\nconst ID_MAP = {};\n\nfunction createId(name) {\n if (!name) return;\n\n if (!ID_MAP[name]) {\n ID_MAP[name] = [];\n }\n\n let i = 0;\n let id;\n\n do {\n id = i ? `${name}_${i}` : name;\n i++;\n } while (ID_MAP[name].includes(id));\n\n ID_MAP[name].push(id);\n\n return id;\n}\n\nfunction removeId(name, id) {\n if (!ID_MAP[name]) return;\n\n ID_MAP[name] = ID_MAP[name].filter((_id) => _id !== id);\n}\n\nexport type UseFieldParams = {\n defaultValidationTrigger?: ValidateTrigger;\n};\n\nexport function useField<T extends FieldTypes, Props extends UseFieldProps<T>>(\n props: Props,\n params: UseFieldParams,\n): FieldReturnValue<T> {\n props = useFormProps(props);\n\n let {\n defaultValue,\n id,\n idPrefix,\n name,\n form,\n rules,\n message,\n description,\n errorMessage,\n validateTrigger = params.defaultValidationTrigger,\n validationDelay,\n showValid,\n shouldUpdate,\n isRequired: isRequiredProp,\n necessityIndicator: necessityIndicatorProp,\n } = props;\n\n const { isInvalid: isInvalidProp, isValid: isValidProp } =\n resolveValidationProps(props);\n\n const processedRules = useMemo(() => {\n let finalRules = rules;\n\n // If isRequired prop is set, ensure there's a required rule\n if (isRequiredProp) {\n const hasRequiredRule = finalRules?.some(\n (rule) => 'required' in rule && rule.required === true,\n );\n\n if (!hasRequiredRule) {\n finalRules = finalRules\n ? [{ required: true }, ...finalRules]\n : [{ required: true }];\n }\n }\n\n // Add delay rule if needed\n if (finalRules && finalRules.length && validationDelay) {\n return [delayValidationRule(validationDelay), ...finalRules];\n }\n\n return finalRules;\n }, [rules, validationDelay, isRequiredProp]);\n\n const nonInput = !name;\n const fieldName: string = name != null ? name : '';\n\n const isFirstRender = useIsFirstRender();\n let [fieldId, setFieldId] = useState(\n id || (idPrefix ? `${idPrefix}_${fieldName}` : fieldName),\n );\n\n useEffect(() => {\n let newId;\n\n if (!id && !nonInput) {\n newId = createId(fieldId);\n\n setFieldId(newId);\n }\n\n return () => {\n if (!id) {\n removeId(idPrefix ? `${idPrefix}_${fieldName}` : fieldName, newId);\n }\n\n if (fieldName && form) {\n form.removeField(fieldName);\n }\n };\n }, [fieldName]);\n\n let field = form?.getFieldInstance(fieldName);\n\n if (field) {\n field.rules = processedRules;\n }\n\n let isRequired = !!processedRules?.find(\n (rule) => 'required' in rule && rule.required === true,\n );\n\n // `isRequired` has two sources with different intent. A `required` rule states\n // how the field behaves: it is what validation runs, and `aria-required` is\n // its programmatic mirror, so the flag has to reach the input either way. The\n // `isRequired` prop additionally states what the label should say. So unless\n // the prop itself asked for the marker, suppress it — an absent prop and an\n // explicit `isRequired={false}` both mean \"do not mark this\", the latter\n // rather more loudly. An explicit `necessityIndicator` overrides either way,\n // being a request for the marker in its own right.\n const suppressNecessityIndicator =\n isRequired && !isRequiredProp && necessityIndicatorProp === undefined;\n\n useEffect(() => {\n if (!form) return;\n\n if (field) {\n form.forceReRender();\n } else {\n field = form.createField(fieldName);\n }\n }, [field]);\n\n if (form) {\n if (isFirstRender) {\n if (!field) {\n field = form.createField(fieldName, true);\n }\n\n if (field?.value == null && defaultValue != null) {\n form.setFieldValue(fieldName, defaultValue, false, true);\n form.updateInitialFieldsValue({ [fieldName]: defaultValue });\n\n field = form?.getFieldInstance(fieldName);\n }\n }\n\n if (!field?.touched && defaultValue != null) {\n form.setFieldValue(fieldName, defaultValue, false, true);\n }\n }\n\n const onChangeHandler = useEvent((val: any, dontTouch: boolean) => {\n if (!form) return;\n\n const field = form.getFieldInstance(fieldName);\n\n if (shouldUpdate) {\n const fieldsValue = form.getFieldsValue();\n\n // check if we should update the value of the field\n const shouldNotBeUpdated =\n typeof shouldUpdate === 'boolean'\n ? !shouldUpdate\n : !shouldUpdate(fieldsValue, {\n ...fieldsValue,\n [fieldName]: val,\n });\n\n if (shouldNotBeUpdated) {\n return;\n }\n }\n\n form.setFieldValue(fieldName, val, !dontTouch);\n\n if (\n !dontTouch &&\n (validateTrigger === 'onChange' ||\n (field && field.errors && field.errors.length))\n ) {\n form.validateField(fieldName).catch(() => {}); // do nothing on fail\n }\n });\n\n const onBlurHandler = useEvent(() => {\n if (validateTrigger === 'onBlur') {\n // We need a timeout so the change event can be done.\n setTimeout(() => {\n form?.validateField(fieldName).catch(() => {}); // do nothing on fail\n });\n }\n });\n\n let value = field?.value;\n\n return useMemo(\n () => ({\n id: fieldId,\n name: fieldName,\n value,\n validateTrigger,\n form,\n field,\n nonInput,\n\n // Explicit validation props always win over the state derived from the form\n isInvalid: isInvalidProp ?? !!field?.errors?.length,\n isValid: isValidProp ?? !!(showValid && field?.status === 'valid'),\n ...(isRequired && { isRequired }),\n ...(suppressNecessityIndicator && { necessityIndicator: null }),\n message:\n message !== undefined\n ? message\n : field?.status === 'invalid' && field?.errors?.[0],\n description,\n errorMessage:\n errorMessage !== undefined\n ? errorMessage\n : field?.status === 'invalid' && field?.errors?.length\n ? field.errors[0]\n : undefined,\n onBlur: onBlurHandler,\n onChange: onChangeHandler,\n }),\n [\n form,\n field,\n field?.value,\n field?.errors?.length,\n field?.status,\n fieldId,\n fieldName,\n isRequired,\n suppressNecessityIndicator,\n message,\n description,\n errorMessage,\n onBlurHandler,\n onChangeHandler,\n validateTrigger,\n isInvalidProp,\n isValidProp,\n showValid,\n nonInput,\n ],\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"use-field.js","names":[],"sources":["../../../../../src/components/form/Form/use-field/use-field.ts"],"sourcesContent":["import { useEffect, useMemo, useState } from 'react';\n\nimport { useEvent, useIsFirstRender } from '../../../../_internal/index';\nimport { ValidateTrigger } from '../../../../shared/index';\nimport { resolveValidationProps } from '../../validation/index';\nimport { useFormProps } from '../Form';\nimport { FieldTypes } from '../types';\nimport { delayValidationRule } from '../validation';\n\nimport { FieldReturnValue, UseFieldProps } from './types';\n\nconst ID_MAP = {};\n\nfunction createId(name) {\n if (!name) return;\n\n if (!ID_MAP[name]) {\n ID_MAP[name] = [];\n }\n\n let i = 0;\n let id;\n\n do {\n id = i ? `${name}_${i}` : name;\n i++;\n } while (ID_MAP[name].includes(id));\n\n ID_MAP[name].push(id);\n\n return id;\n}\n\nfunction removeId(name, id) {\n if (!ID_MAP[name]) return;\n\n ID_MAP[name] = ID_MAP[name].filter((_id) => _id !== id);\n}\n\nexport type UseFieldParams = {\n defaultValidationTrigger?: ValidateTrigger;\n};\n\nexport function useField<T extends FieldTypes, Props extends UseFieldProps<T>>(\n props: Props,\n params: UseFieldParams,\n): FieldReturnValue<T> {\n props = useFormProps(props);\n\n let {\n defaultValue,\n id,\n idPrefix,\n name,\n form,\n rules,\n message,\n description,\n errorMessage,\n validateTrigger = params.defaultValidationTrigger,\n validationDelay,\n showValid,\n shouldUpdate,\n isRequired: isRequiredProp,\n necessityIndicator: necessityIndicatorProp,\n } = props;\n\n const { isInvalid: isInvalidProp, isValid: isValidProp } =\n resolveValidationProps(props);\n\n const processedRules = useMemo(() => {\n let finalRules = rules;\n\n // If isRequired prop is set, ensure there's a required rule\n if (isRequiredProp) {\n const hasRequiredRule = finalRules?.some(\n (rule) => 'required' in rule && rule.required === true,\n );\n\n if (!hasRequiredRule) {\n finalRules = finalRules\n ? [{ required: true }, ...finalRules]\n : [{ required: true }];\n }\n }\n\n // Add delay rule if needed\n if (finalRules && finalRules.length && validationDelay) {\n return [delayValidationRule(validationDelay), ...finalRules];\n }\n\n return finalRules;\n }, [rules, validationDelay, isRequiredProp]);\n\n const nonInput = !name;\n const fieldName: string = name != null ? name : '';\n\n const isFirstRender = useIsFirstRender();\n let [fieldId, setFieldId] = useState(\n id || (idPrefix ? `${idPrefix}_${fieldName}` : fieldName),\n );\n\n useEffect(() => {\n let newId;\n\n if (!id && !nonInput) {\n newId = createId(fieldId);\n\n setFieldId(newId);\n }\n\n return () => {\n if (!id) {\n removeId(idPrefix ? `${idPrefix}_${fieldName}` : fieldName, newId);\n }\n\n if (fieldName && form) {\n form.removeField(fieldName);\n }\n };\n }, [fieldName]);\n\n let field = form?.getFieldInstance(fieldName);\n\n if (field) {\n field.rules = processedRules;\n }\n\n let isRequired = !!processedRules?.find(\n (rule) => 'required' in rule && rule.required === true,\n );\n\n // `isRequired` has two sources with different intent. A `required` rule states\n // how the field behaves: it is what validation runs, and `aria-required` is\n // its programmatic mirror, so the flag has to reach the input either way. The\n // `isRequired` prop additionally states what the label should say. So unless\n // the prop itself asked for the marker, suppress it — an absent prop and an\n // explicit `isRequired={false}` both mean \"do not mark this\", the latter\n // rather more loudly. An explicit `necessityIndicator` overrides either way,\n // being a request for the marker in its own right.\n const suppressNecessityIndicator =\n isRequired && !isRequiredProp && necessityIndicatorProp === undefined;\n\n // `fieldName` is a dependency so an input that gains a name after mount\n // registers: since the dual-backend shell keeps this hook mounted in every\n // mode, `field` is `undefined` both before and after such a switch.\n useEffect(() => {\n if (!form) return;\n\n if (field) {\n form.forceReRender();\n } else {\n field = form.createField(fieldName);\n }\n }, [field, fieldName]);\n\n if (form) {\n if (isFirstRender) {\n if (!field) {\n field = form.createField(fieldName, true);\n }\n\n if (field?.value == null && defaultValue != null) {\n form.setFieldValue(fieldName, defaultValue, false, true);\n form.updateInitialFieldsValue({ [fieldName]: defaultValue });\n\n field = form?.getFieldInstance(fieldName);\n }\n }\n\n if (!field?.touched && defaultValue != null) {\n form.setFieldValue(fieldName, defaultValue, false, true);\n }\n }\n\n const onChangeHandler = useEvent((val: any, dontTouch: boolean) => {\n if (!form) return;\n\n const field = form.getFieldInstance(fieldName);\n\n if (shouldUpdate) {\n const fieldsValue = form.getFieldsValue();\n\n // check if we should update the value of the field\n const shouldNotBeUpdated =\n typeof shouldUpdate === 'boolean'\n ? !shouldUpdate\n : !shouldUpdate(fieldsValue, {\n ...fieldsValue,\n [fieldName]: val,\n });\n\n if (shouldNotBeUpdated) {\n return;\n }\n }\n\n form.setFieldValue(fieldName, val, !dontTouch);\n\n if (\n !dontTouch &&\n (validateTrigger === 'onChange' ||\n (field && field.errors && field.errors.length))\n ) {\n form.validateField(fieldName).catch(() => {}); // do nothing on fail\n }\n });\n\n const onBlurHandler = useEvent(() => {\n if (validateTrigger === 'onBlur') {\n // We need a timeout so the change event can be done.\n setTimeout(() => {\n form?.validateField(fieldName).catch(() => {}); // do nothing on fail\n });\n }\n });\n\n let value = field?.value;\n\n return useMemo(\n () => ({\n id: fieldId,\n name: fieldName,\n value,\n validateTrigger,\n form,\n field,\n nonInput,\n\n // Explicit validation props always win over the state derived from the form\n isInvalid: isInvalidProp ?? !!field?.errors?.length,\n isValid: isValidProp ?? !!(showValid && field?.status === 'valid'),\n ...(isRequired && { isRequired }),\n ...(suppressNecessityIndicator && { necessityIndicator: null }),\n message:\n message !== undefined\n ? message\n : field?.status === 'invalid' && field?.errors?.[0],\n description,\n errorMessage:\n errorMessage !== undefined\n ? errorMessage\n : field?.status === 'invalid' && field?.errors?.length\n ? field.errors[0]\n : undefined,\n onBlur: onBlurHandler,\n onChange: onChangeHandler,\n }),\n [\n form,\n field,\n field?.value,\n field?.errors?.length,\n field?.status,\n fieldId,\n fieldName,\n isRequired,\n suppressNecessityIndicator,\n message,\n description,\n errorMessage,\n onBlurHandler,\n onChangeHandler,\n validateTrigger,\n isInvalidProp,\n isValidProp,\n showValid,\n nonInput,\n ],\n );\n}\n"],"mappings":";;;;;;;;;AAWA,MAAM,SAAS,EAAE;AAEjB,SAAS,SAAS,MAAM;AACtB,KAAI,CAAC,KAAM;AAEX,KAAI,CAAC,OAAO,MACV,QAAO,QAAQ,EAAE;CAGnB,IAAI,IAAI;CACR,IAAI;AAEJ,IAAG;AACD,OAAK,IAAI,GAAG,KAAK,GAAG,MAAM;AAC1B;UACO,OAAO,MAAM,SAAS,GAAG;AAElC,QAAO,MAAM,KAAK,GAAG;AAErB,QAAO;;AAGT,SAAS,SAAS,MAAM,IAAI;AAC1B,KAAI,CAAC,OAAO,MAAO;AAEnB,QAAO,QAAQ,OAAO,MAAM,QAAQ,QAAQ,QAAQ,GAAG;;AAOzD,SAAgB,SACd,OACA,QACqB;AACrB,SAAQ,aAAa,MAAM;CAE3B,IAAI,EACF,cACA,IACA,UACA,MACA,MACA,OACA,SACA,aACA,cACA,kBAAkB,OAAO,0BACzB,iBACA,WACA,cACA,YAAY,gBACZ,oBAAoB,2BAClB;CAEJ,MAAM,EAAE,WAAW,eAAe,SAAS,gBACzC,uBAAuB,MAAM;CAE/B,MAAM,iBAAiB,cAAc;EACnC,IAAI,aAAa;AAGjB,MAAI,gBAKF;OAAI,CAJoB,YAAY,MACjC,SAAS,cAAc,QAAQ,KAAK,aAAa,KACnD,CAGC,cAAa,aACT,CAAC,EAAE,UAAU,MAAM,EAAE,GAAG,WAAW,GACnC,CAAC,EAAE,UAAU,MAAM,CAAC;;AAK5B,MAAI,cAAc,WAAW,UAAU,gBACrC,QAAO,CAAC,oBAAoB,gBAAgB,EAAE,GAAG,WAAW;AAG9D,SAAO;IACN;EAAC;EAAO;EAAiB;EAAe,CAAC;CAE5C,MAAM,WAAW,CAAC;CAClB,MAAM,YAAoB,QAAQ,OAAO,OAAO;CAEhD,MAAM,gBAAgB,kBAAkB;CACxC,IAAI,CAAC,SAAS,cAAc,SAC1B,OAAO,WAAW,GAAG,SAAS,GAAG,cAAc,WAChD;AAED,iBAAgB;EACd,IAAI;AAEJ,MAAI,CAAC,MAAM,CAAC,UAAU;AACpB,WAAQ,SAAS,QAAQ;AAEzB,cAAW,MAAM;;AAGnB,eAAa;AACX,OAAI,CAAC,GACH,UAAS,WAAW,GAAG,SAAS,GAAG,cAAc,WAAW,MAAM;AAGpE,OAAI,aAAa,KACf,MAAK,YAAY,UAAU;;IAG9B,CAAC,UAAU,CAAC;CAEf,IAAI,QAAQ,MAAM,iBAAiB,UAAU;AAE7C,KAAI,MACF,OAAM,QAAQ;CAGhB,IAAI,aAAa,CAAC,CAAC,gBAAgB,MAChC,SAAS,cAAc,QAAQ,KAAK,aAAa,KACnD;CAUD,MAAM,6BACJ,cAAc,CAAC,kBAAkB,2BAA2B;AAK9D,iBAAgB;AACd,MAAI,CAAC,KAAM;AAEX,MAAI,MACF,MAAK,eAAe;MAEpB,SAAQ,KAAK,YAAY,UAAU;IAEpC,CAAC,OAAO,UAAU,CAAC;AAEtB,KAAI,MAAM;AACR,MAAI,eAAe;AACjB,OAAI,CAAC,MACH,SAAQ,KAAK,YAAY,WAAW,KAAK;AAG3C,OAAI,OAAO,SAAS,QAAQ,gBAAgB,MAAM;AAChD,SAAK,cAAc,WAAW,cAAc,OAAO,KAAK;AACxD,SAAK,yBAAyB,GAAG,YAAY,cAAc,CAAC;AAE5D,YAAQ,MAAM,iBAAiB,UAAU;;;AAI7C,MAAI,CAAC,OAAO,WAAW,gBAAgB,KACrC,MAAK,cAAc,WAAW,cAAc,OAAO,KAAK;;CAI5D,MAAM,kBAAkB,UAAU,KAAU,cAAuB;AACjE,MAAI,CAAC,KAAM;EAEX,MAAM,QAAQ,KAAK,iBAAiB,UAAU;AAE9C,MAAI,cAAc;GAChB,MAAM,cAAc,KAAK,gBAAgB;AAWzC,OAPE,OAAO,iBAAiB,YACpB,CAAC,eACD,CAAC,aAAa,aAAa;IACzB,GAAG;KACF,YAAY;IACd,CAAC,CAGN;;AAIJ,OAAK,cAAc,WAAW,KAAK,CAAC,UAAU;AAE9C,MACE,CAAC,cACA,oBAAoB,cAClB,SAAS,MAAM,UAAU,MAAM,OAAO,QAEzC,MAAK,cAAc,UAAU,CAAC,YAAY,GAAG;GAE/C;CAEF,MAAM,gBAAgB,eAAe;AACnC,MAAI,oBAAoB,SAEtB,kBAAiB;AACf,SAAM,cAAc,UAAU,CAAC,YAAY,GAAG;IAC9C;GAEJ;CAEF,IAAI,QAAQ,OAAO;AAEnB,QAAO,eACE;EACL,IAAI;EACJ,MAAM;EACN;EACA;EACA;EACA;EACA;EAGA,WAAW,iBAAiB,CAAC,CAAC,OAAO,QAAQ;EAC7C,SAAS,eAAe,CAAC,EAAE,aAAa,OAAO,WAAW;EAC1D,GAAI,cAAc,EAAE,YAAY;EAChC,GAAI,8BAA8B,EAAE,oBAAoB,MAAM;EAC9D,SACE,YAAY,SACR,UACA,OAAO,WAAW,aAAa,OAAO,SAAS;EACrD;EACA,cACE,iBAAiB,SACb,eACA,OAAO,WAAW,aAAa,OAAO,QAAQ,SAC5C,MAAM,OAAO,KACb;EACR,QAAQ;EACR,UAAU;EACX,GACD;EACE;EACA;EACA,OAAO;EACP,OAAO,QAAQ;EACf,OAAO;EACP;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CACF"}
|
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
|
|
2
2
|
import { CubeFieldData, FieldTypes, SetFieldsArrType } from "./types.js";
|
|
3
|
+
import { FORM_BACKEND, LegacyFormBrand } from "./backend.js";
|
|
3
4
|
import { ReactNode } from "react";
|
|
4
5
|
|
|
5
6
|
//#region src/components/form/Form/use-form.d.ts
|
|
6
7
|
type PartialString<T> = { [P in keyof T & string]?: T[P] };
|
|
7
8
|
type CubeFormData<T extends FieldTypes> = { [K in keyof T & string]?: CubeFieldData<K, T[K]> };
|
|
8
|
-
declare class CubeFormInstance<T extends FieldTypes, TFormData extends CubeFormData<T> = CubeFormData<T>> {
|
|
9
|
+
declare class CubeFormInstance<T extends FieldTypes, TFormData extends CubeFormData<T> = CubeFormData<T>> implements LegacyFormBrand {
|
|
10
|
+
/** Backend brand: the `<Form>` facade and the field hook dispatch on it. */
|
|
11
|
+
readonly [FORM_BACKEND]: "legacy";
|
|
9
12
|
forceReRender: () => void;
|
|
10
13
|
private defaultValues;
|
|
11
14
|
private fields;
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.0.0-canary-
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.0.0-canary-9fd458b | Cube Dev Team */
|
|
2
|
+
import { FORM_BACKEND, isModernFormController, modernBackendUnavailableError } from "./backend.js";
|
|
2
3
|
import { dotizeConvert } from "../../../utils/dotize.js";
|
|
3
4
|
import { applyRules } from "./validation.js";
|
|
4
5
|
import { useRef, useState } from "react";
|
|
@@ -18,6 +19,8 @@ function isEqual(v1, v2) {
|
|
|
18
19
|
return JSON.stringify(v1) === JSON.stringify(v2);
|
|
19
20
|
}
|
|
20
21
|
var CubeFormInstance = class {
|
|
22
|
+
/** Backend brand: the `<Form>` facade and the field hook dispatch on it. */
|
|
23
|
+
[FORM_BACKEND] = "legacy";
|
|
21
24
|
forceReRender = () => {};
|
|
22
25
|
defaultValues = {};
|
|
23
26
|
fields = {};
|
|
@@ -318,6 +321,7 @@ var CubeFormInstance = class {
|
|
|
318
321
|
};
|
|
319
322
|
function useForm(form, ref, options = {}) {
|
|
320
323
|
const { onSubmit, onValuesChange } = options;
|
|
324
|
+
if (isModernFormController(form)) throw modernBackendUnavailableError("Form.useForm()");
|
|
321
325
|
const formRef = useRef(null);
|
|
322
326
|
const [, forceUpdate] = useState({});
|
|
323
327
|
if (!formRef.current) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-form.js","names":[],"sources":["../../../../src/components/form/Form/use-form.tsx"],"sourcesContent":["import { ReactNode, useRef, useState } from 'react';\n\nimport { dotizeConvert } from '../../../utils/dotize';\n\nimport { CubeFieldData, FieldTypes, SetFieldsArrType } from './types';\nimport { applyRules } from './validation';\n\ntype PartialString<T> = {\n [P in keyof T & string]?: T[P];\n};\n\nexport type CubeFormData<T extends FieldTypes> = {\n [K in keyof T & string]?: CubeFieldData<K, T[K]>;\n};\n\nfunction setValue(obj, path, value) {\n let a = path.split('.');\n let o = obj;\n\n while (a.length - 1) {\n let n = a.shift();\n if (!(n in o)) o[n] = {};\n o = o[n];\n }\n o[a[0]] = value;\n}\n\nfunction isEqual(v1, v2) {\n return JSON.stringify(v1) === JSON.stringify(v2);\n}\n\nexport class CubeFormInstance<\n T extends FieldTypes,\n TFormData extends CubeFormData<T> = CubeFormData<T>,\n> {\n public forceReRender: () => void = () => {};\n private defaultValues: PartialString<T> = {};\n private fields: TFormData = {} as TFormData;\n public ref = {};\n public isSubmitting = false;\n public submitError: unknown = null;\n\n public onValuesChange: (data: T) => void | Promise<void> = () => {};\n public onSubmit: (data: T) => void | Promise<void> = () => {};\n\n constructor(forceReRender: () => void = () => {}) {\n this.forceReRender = forceReRender;\n\n this.getFieldValue = this.getFieldValue.bind(this);\n this.getFieldsValue = this.getFieldsValue.bind(this);\n this.setFieldValue = this.setFieldValue.bind(this);\n this.getFieldError = this.getFieldError.bind(this);\n this.getFieldInstance = this.getFieldInstance.bind(this);\n this.setInitialFieldsValue = this.setInitialFieldsValue.bind(this);\n this.resetFields = this.resetFields.bind(this);\n this.validateField = this.validateField.bind(this);\n this.validateFields = this.validateFields.bind(this);\n this.isFieldValid = this.isFieldValid.bind(this);\n this.createField = this.createField.bind(this);\n this.isFieldInvalid = this.isFieldInvalid.bind(this);\n this.isFieldTouched = this.isFieldTouched.bind(this);\n this.isFieldDirty = this.isFieldDirty.bind(this);\n this.getFieldNames = this.getFieldNames.bind(this);\n this.getDirtyFieldNames = this.getDirtyFieldNames.bind(this);\n this.getValidFieldNames = this.getValidFieldNames.bind(this);\n this.getInvalidFieldNames = this.getInvalidFieldNames.bind(this);\n this.setFields = this.setFields.bind(this);\n }\n\n async submit() {\n return this.onSubmit?.(this.getFormData());\n }\n\n setFieldsValue = (\n newData: PartialString<T>,\n touched?: boolean,\n skipRender?: boolean,\n ) => {\n let flag = false;\n\n newData = { ...newData, ...dotizeConvert(newData) };\n\n Object.keys(newData).forEach((name: keyof T & string) => {\n let field = this.fields[name];\n\n if (!field) {\n return;\n }\n\n if (!field || isEqual(field.value, newData[name])) {\n if (field) {\n field.errors = [];\n field.status = undefined;\n }\n\n return;\n }\n\n flag = true;\n\n field.value = newData[name];\n // Same as `setFieldValue`: a pending validation ran against the old value.\n field.validationId = (field.validationId ?? 0) + 1;\n\n field.errors = [];\n field.status = undefined;\n\n if (touched === true) {\n field.touched = touched;\n } else if (touched === false) {\n field.touched = false;\n }\n });\n\n if (flag && !skipRender) {\n if (touched) {\n this.onValuesChange && this.onValuesChange(this.getFormData());\n this.submitError = null;\n }\n\n this.forceReRender();\n }\n };\n\n getFieldValue<Name extends keyof T & string>(\n name: Name,\n ): T[Name] | undefined {\n return this.fields[name]?.value;\n }\n\n getFieldsValue(): PartialString<T> {\n return Object.values(this.fields).reduce((map, field) => {\n if (field && map) {\n map[field.name as keyof T & string] = field.value;\n }\n\n return map;\n }, {} as PartialString<T>);\n }\n\n /**\n * Similar to getFieldsValue() but respects '.' notation and creates nested objects.\n */\n getFormData(): T {\n const fieldsValue = this.getFieldsValue();\n\n return Object.keys(fieldsValue)\n .sort()\n .reduce((map, field) => {\n setValue(map, field, fieldsValue[field]);\n\n if (field.includes('.')) {\n delete map[field];\n }\n\n return map;\n }, {} as T);\n }\n\n setFieldValue<Name extends keyof T & string>(\n name: Name,\n value: T[Name],\n isTouched = false,\n skipRender = false,\n ) {\n const field = this.fields[name];\n\n if (!field || isEqual(value, field.value)) {\n return;\n }\n\n field.value = value;\n // A validation that is still running belongs to the previous value. Bump\n // the revision so its result cannot publish against this one (the caller's\n // promise still settles) — legacy contract §7.1 #22.\n field.validationId = (field.validationId ?? 0) + 1;\n\n if (typeof value === 'object' && !Array.isArray(value)) {\n Object.keys(this.fields)\n .filter((key) => key.startsWith(`${name}.`))\n .forEach((key) => {\n const objKey = key.replace(`${name}.`, '');\n\n this.setFieldValue(key, value[objKey] ?? null, isTouched, false);\n });\n }\n\n field.errors = [];\n field.status = undefined; // reset validation status\n\n if (isTouched) {\n field.touched = isTouched;\n }\n\n if (isTouched) {\n this.onValuesChange && this.onValuesChange(this.getFormData());\n this.submitError = null;\n }\n\n if (!skipRender) {\n this.forceReRender();\n }\n }\n\n getFieldInstance<Name extends keyof T & string>(name: Name): TFormData[Name] {\n return this.fields[name];\n }\n\n setInitialFieldsValue(values: PartialString<T>): void {\n this.defaultValues = { ...values, ...dotizeConvert(values) };\n }\n\n updateInitialFieldsValue(values: FieldTypes): void {\n this.defaultValues = {\n ...this.defaultValues,\n ...values,\n ...dotizeConvert(values),\n };\n }\n\n resetFields(names?: (keyof T & string)[], skipRender?: boolean): void {\n names = names ?? Object.keys(this.fields);\n\n names.forEach((fieldName) => {\n const field = this.fields[fieldName];\n\n if (!field) {\n return;\n }\n\n const defaultValue = this.defaultValues[fieldName] ?? undefined;\n\n field.value = defaultValue;\n field.touched = false;\n field.errors = [];\n field.status = undefined;\n field.validationId = (field.validationId ?? 0) + 1;\n });\n\n if (!skipRender) {\n this.forceReRender();\n }\n }\n\n async validateField<Name extends keyof T & string>(name: Name): Promise<any> {\n const field = this.getFieldInstance(name);\n\n if (\n // if there are no rules for such field\n !field ||\n !field.rules ||\n // or field is already validated and valid\n field.status === 'valid'\n ) {\n return Promise.resolve();\n // or field is already validated and invalid\n } else if (field.status === 'invalid') {\n return Promise.reject(field.errors[0]);\n }\n\n field.validating = true;\n field.status = undefined;\n\n field.validationId = (field.validationId ?? 0) + 1;\n\n const validationId = field.validationId;\n\n // store validation to make sure there is no race condition.\n return applyRules(field, this, validationId)\n .then(() => {\n if (field.validationId !== validationId) return;\n\n field.validating = false;\n\n if (!field.errors || field.errors.length) {\n field.errors = [];\n }\n\n field.status = 'valid';\n\n this.forceReRender();\n })\n .catch((err) => {\n if (field.validationId === validationId) {\n field.errors = [err];\n field.validating = false;\n field.status = 'invalid';\n\n this.forceReRender();\n }\n\n return Promise.reject([err]);\n });\n }\n\n validateFields<Names extends (keyof T)[]>(names?: Names): Promise<any> {\n const fieldsList = names || Object.keys(this.fields);\n const errorList: { name: string; errors: ReactNode[] }[] = [];\n\n return Promise.allSettled(\n fieldsList.map((name) => {\n return this.validateField(name).catch((errors) => {\n errorList.push({ name, errors });\n\n return Promise.reject();\n });\n }),\n ).then(() => {\n if (errorList.length) {\n return Promise.reject(errorList);\n }\n\n return this.getFormData();\n });\n }\n\n isFieldValid<Name extends keyof T & string>(name: Name): boolean {\n const field = this.getFieldInstance(name);\n\n if (!field) return true;\n\n return !field.errors.length;\n }\n\n isFieldInvalid<Name extends keyof T & string>(name: Name): boolean {\n const field = this.getFieldInstance(name);\n\n if (!field) return false;\n\n return !!field.errors.length;\n }\n\n isFieldTouched<Name extends keyof T & string>(name: Name): boolean {\n const field = this.getFieldInstance(name);\n\n if (!field) return false;\n\n return !!field.touched;\n }\n\n isFieldDirty<Name extends keyof T & string>(name: Name): boolean {\n const field = this.getFieldInstance(name);\n\n if (!field) return false;\n\n return !isEqual(field.value, this.defaultValues[name]);\n }\n\n getFieldNames(): (keyof T & string)[] {\n return Object.keys(this.fields) as (keyof T & string)[];\n }\n\n getDirtyFieldNames(): (keyof T & string)[] {\n return this.getFieldNames().filter((name) => this.isFieldDirty(name));\n }\n\n getValidFieldNames(): (keyof T & string)[] {\n return this.getFieldNames().filter((name) => this.isFieldValid(name));\n }\n\n getInvalidFieldNames(): (keyof T & string)[] {\n return this.getFieldNames().filter((name) => this.isFieldInvalid(name));\n }\n\n get isTouched(): boolean {\n return Object.values(this.fields).some((field) => field?.touched);\n }\n\n get isDirty(): boolean {\n return this.getDirtyFieldNames().length > 0;\n }\n\n /**\n * True if all fields are verified and valid\n * IMPORTANT: This is not the same as `!isInvalid`, because it also checks if all fields are verified.\n */\n get isValid(): boolean {\n return Object.values(this.fields).every(\n (field) => field?.status === 'valid',\n );\n }\n\n /**\n * True if at least one field is verified and invalid.\n * IMPORTANT: This is not the same as `!isValid`, because it only checks that at least\n * one field is verified and invalid.\n */\n get isInvalid(): boolean {\n return Object.values(this.fields).some(\n (field) => field?.status === 'invalid',\n );\n }\n\n getFieldError<Name extends keyof T & string>(name: Name): ReactNode[] {\n const field = this.getFieldInstance(name);\n\n if (!field) return [];\n\n return field.errors || [];\n }\n\n /**\n * @deprecated This field is not supposed to be used directly.\n */\n createField<Name extends keyof T & string>(name: Name, skipRender?: boolean) {\n // passing an empty name is incorrect, but we have to return a valid object to avoid inconsistency\n if (!name) {\n return this._createField(name);\n }\n\n if (!this.fields[name]) {\n this.fields[name] = this._createField(name);\n }\n\n if (!skipRender) {\n this.forceReRender();\n }\n\n return this.fields[name];\n }\n\n /**\n * @deprecated This field is not supposed to be used directly.\n */\n removeField<Name extends keyof T & string>(name: Name, skipRender?: boolean) {\n if (this.fields[name]) {\n delete this.fields[name];\n }\n\n if (!skipRender) {\n this.forceReRender();\n }\n }\n\n /**\n * @deprecated This method is not recommended. Use other ways to alter fields.\n * Use `setFieldValue` to change the value of a field.\n * Use `verifyField` to validate a field.\n * Use `setFieldError` to set an error for a field.\n * Use `clearFieldsValidation` to clear all errors for a field.\n */\n setFields<Names extends keyof T & string>(\n newFields: SetFieldsArrType<T, Names>[],\n ) {\n newFields.forEach(({ name, value, errors }) => {\n this.fields[name] = this._createField(name, {\n value,\n errors,\n } as TFormData[Names]);\n });\n\n this.forceReRender();\n }\n\n resetFieldsValidation(names?: (keyof T & string)[], skipRender?: boolean) {\n (names || Object.keys(this.fields)).forEach((name) => {\n const field = this.getFieldInstance(name);\n\n if (!field) return;\n\n field.errors = [];\n field.status = undefined;\n field.validationId = (field.validationId ?? 0) + 1;\n });\n\n if (!skipRender) {\n this.forceReRender();\n }\n }\n\n setFieldError(\n name: keyof T & string,\n error: ReactNode,\n skipRender?: boolean,\n ) {\n const field = this.getFieldInstance(name);\n\n if (!field || !error) return;\n\n field.errors = [error];\n field.status = 'invalid';\n field.validationId = (field.validationId ?? 0) + 1;\n\n if (!skipRender) {\n this.forceReRender();\n }\n }\n\n setSubmitting(isSubmitting: boolean) {\n if (this.isSubmitting === isSubmitting) return;\n\n this.isSubmitting = isSubmitting;\n this.forceReRender();\n }\n\n _createField<Name extends keyof T & string, Data extends TFormData[Name]>(\n name: Name,\n data?: Data,\n ): Data {\n let obj = {\n name,\n validating: false,\n touched: false,\n errors: [],\n validationId: 0,\n value: this.defaultValues[name],\n ...data,\n // it should be impossible to define or override status value\n status: data?.errors?.length ? 'invalid' : undefined,\n } as unknown as Data;\n\n return obj;\n }\n}\n\nexport function useForm<TSourceType extends FieldTypes>(\n form?: CubeFormInstance<TSourceType, CubeFormData<TSourceType>>,\n ref?,\n options: {\n onSubmit?: CubeFormInstance<TSourceType>['onSubmit'];\n onValuesChange?: CubeFormInstance<TSourceType>['onValuesChange'];\n } = {},\n): [CubeFormInstance<TSourceType>] {\n const { onSubmit, onValuesChange } = options;\n const formRef = useRef<CubeFormInstance<TSourceType>>(null);\n const [, forceUpdate] = useState({});\n\n if (!formRef.current) {\n if (form) {\n formRef.current = form;\n } else {\n // Create a new FormInstance if not provided\n const forceReRender = () => {\n forceUpdate({});\n };\n\n form = formRef.current = new CubeFormInstance<TSourceType>(forceReRender);\n }\n\n form.ref = ref;\n }\n\n if (onSubmit) {\n formRef.current.onSubmit = onSubmit;\n }\n\n if (onValuesChange) {\n formRef.current.onValuesChange = onValuesChange;\n }\n\n return [formRef.current];\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"use-form.js","names":[],"sources":["../../../../src/components/form/Form/use-form.tsx"],"sourcesContent":["import { ReactNode, useRef, useState } from 'react';\n\nimport { dotizeConvert } from '../../../utils/dotize';\n\nimport {\n FORM_BACKEND,\n isModernFormController,\n LegacyFormBrand,\n modernBackendUnavailableError,\n} from './backend';\nimport { CubeFieldData, FieldTypes, SetFieldsArrType } from './types';\nimport { applyRules } from './validation';\n\ntype PartialString<T> = {\n [P in keyof T & string]?: T[P];\n};\n\nexport type CubeFormData<T extends FieldTypes> = {\n [K in keyof T & string]?: CubeFieldData<K, T[K]>;\n};\n\nfunction setValue(obj, path, value) {\n let a = path.split('.');\n let o = obj;\n\n while (a.length - 1) {\n let n = a.shift();\n if (!(n in o)) o[n] = {};\n o = o[n];\n }\n o[a[0]] = value;\n}\n\nfunction isEqual(v1, v2) {\n return JSON.stringify(v1) === JSON.stringify(v2);\n}\n\nexport class CubeFormInstance<\n T extends FieldTypes,\n TFormData extends CubeFormData<T> = CubeFormData<T>,\n> implements LegacyFormBrand\n{\n /** Backend brand: the `<Form>` facade and the field hook dispatch on it. */\n public readonly [FORM_BACKEND] = 'legacy' as const;\n public forceReRender: () => void = () => {};\n private defaultValues: PartialString<T> = {};\n private fields: TFormData = {} as TFormData;\n public ref = {};\n public isSubmitting = false;\n public submitError: unknown = null;\n\n public onValuesChange: (data: T) => void | Promise<void> = () => {};\n public onSubmit: (data: T) => void | Promise<void> = () => {};\n\n constructor(forceReRender: () => void = () => {}) {\n this.forceReRender = forceReRender;\n\n this.getFieldValue = this.getFieldValue.bind(this);\n this.getFieldsValue = this.getFieldsValue.bind(this);\n this.setFieldValue = this.setFieldValue.bind(this);\n this.getFieldError = this.getFieldError.bind(this);\n this.getFieldInstance = this.getFieldInstance.bind(this);\n this.setInitialFieldsValue = this.setInitialFieldsValue.bind(this);\n this.resetFields = this.resetFields.bind(this);\n this.validateField = this.validateField.bind(this);\n this.validateFields = this.validateFields.bind(this);\n this.isFieldValid = this.isFieldValid.bind(this);\n this.createField = this.createField.bind(this);\n this.isFieldInvalid = this.isFieldInvalid.bind(this);\n this.isFieldTouched = this.isFieldTouched.bind(this);\n this.isFieldDirty = this.isFieldDirty.bind(this);\n this.getFieldNames = this.getFieldNames.bind(this);\n this.getDirtyFieldNames = this.getDirtyFieldNames.bind(this);\n this.getValidFieldNames = this.getValidFieldNames.bind(this);\n this.getInvalidFieldNames = this.getInvalidFieldNames.bind(this);\n this.setFields = this.setFields.bind(this);\n }\n\n async submit() {\n return this.onSubmit?.(this.getFormData());\n }\n\n setFieldsValue = (\n newData: PartialString<T>,\n touched?: boolean,\n skipRender?: boolean,\n ) => {\n let flag = false;\n\n newData = { ...newData, ...dotizeConvert(newData) };\n\n Object.keys(newData).forEach((name: keyof T & string) => {\n let field = this.fields[name];\n\n if (!field) {\n return;\n }\n\n if (!field || isEqual(field.value, newData[name])) {\n if (field) {\n field.errors = [];\n field.status = undefined;\n }\n\n return;\n }\n\n flag = true;\n\n field.value = newData[name];\n // Same as `setFieldValue`: a pending validation ran against the old value.\n field.validationId = (field.validationId ?? 0) + 1;\n\n field.errors = [];\n field.status = undefined;\n\n if (touched === true) {\n field.touched = touched;\n } else if (touched === false) {\n field.touched = false;\n }\n });\n\n if (flag && !skipRender) {\n if (touched) {\n this.onValuesChange && this.onValuesChange(this.getFormData());\n this.submitError = null;\n }\n\n this.forceReRender();\n }\n };\n\n getFieldValue<Name extends keyof T & string>(\n name: Name,\n ): T[Name] | undefined {\n return this.fields[name]?.value;\n }\n\n getFieldsValue(): PartialString<T> {\n return Object.values(this.fields).reduce((map, field) => {\n if (field && map) {\n map[field.name as keyof T & string] = field.value;\n }\n\n return map;\n }, {} as PartialString<T>);\n }\n\n /**\n * Similar to getFieldsValue() but respects '.' notation and creates nested objects.\n */\n getFormData(): T {\n const fieldsValue = this.getFieldsValue();\n\n return Object.keys(fieldsValue)\n .sort()\n .reduce((map, field) => {\n setValue(map, field, fieldsValue[field]);\n\n if (field.includes('.')) {\n delete map[field];\n }\n\n return map;\n }, {} as T);\n }\n\n setFieldValue<Name extends keyof T & string>(\n name: Name,\n value: T[Name],\n isTouched = false,\n skipRender = false,\n ) {\n const field = this.fields[name];\n\n if (!field || isEqual(value, field.value)) {\n return;\n }\n\n field.value = value;\n // A validation that is still running belongs to the previous value. Bump\n // the revision so its result cannot publish against this one (the caller's\n // promise still settles) — legacy contract §7.1 #22.\n field.validationId = (field.validationId ?? 0) + 1;\n\n if (typeof value === 'object' && !Array.isArray(value)) {\n Object.keys(this.fields)\n .filter((key) => key.startsWith(`${name}.`))\n .forEach((key) => {\n const objKey = key.replace(`${name}.`, '');\n\n this.setFieldValue(key, value[objKey] ?? null, isTouched, false);\n });\n }\n\n field.errors = [];\n field.status = undefined; // reset validation status\n\n if (isTouched) {\n field.touched = isTouched;\n }\n\n if (isTouched) {\n this.onValuesChange && this.onValuesChange(this.getFormData());\n this.submitError = null;\n }\n\n if (!skipRender) {\n this.forceReRender();\n }\n }\n\n getFieldInstance<Name extends keyof T & string>(name: Name): TFormData[Name] {\n return this.fields[name];\n }\n\n setInitialFieldsValue(values: PartialString<T>): void {\n this.defaultValues = { ...values, ...dotizeConvert(values) };\n }\n\n updateInitialFieldsValue(values: FieldTypes): void {\n this.defaultValues = {\n ...this.defaultValues,\n ...values,\n ...dotizeConvert(values),\n };\n }\n\n resetFields(names?: (keyof T & string)[], skipRender?: boolean): void {\n names = names ?? Object.keys(this.fields);\n\n names.forEach((fieldName) => {\n const field = this.fields[fieldName];\n\n if (!field) {\n return;\n }\n\n const defaultValue = this.defaultValues[fieldName] ?? undefined;\n\n field.value = defaultValue;\n field.touched = false;\n field.errors = [];\n field.status = undefined;\n field.validationId = (field.validationId ?? 0) + 1;\n });\n\n if (!skipRender) {\n this.forceReRender();\n }\n }\n\n async validateField<Name extends keyof T & string>(name: Name): Promise<any> {\n const field = this.getFieldInstance(name);\n\n if (\n // if there are no rules for such field\n !field ||\n !field.rules ||\n // or field is already validated and valid\n field.status === 'valid'\n ) {\n return Promise.resolve();\n // or field is already validated and invalid\n } else if (field.status === 'invalid') {\n return Promise.reject(field.errors[0]);\n }\n\n field.validating = true;\n field.status = undefined;\n\n field.validationId = (field.validationId ?? 0) + 1;\n\n const validationId = field.validationId;\n\n // store validation to make sure there is no race condition.\n return applyRules(field, this, validationId)\n .then(() => {\n if (field.validationId !== validationId) return;\n\n field.validating = false;\n\n if (!field.errors || field.errors.length) {\n field.errors = [];\n }\n\n field.status = 'valid';\n\n this.forceReRender();\n })\n .catch((err) => {\n if (field.validationId === validationId) {\n field.errors = [err];\n field.validating = false;\n field.status = 'invalid';\n\n this.forceReRender();\n }\n\n return Promise.reject([err]);\n });\n }\n\n validateFields<Names extends (keyof T)[]>(names?: Names): Promise<any> {\n const fieldsList = names || Object.keys(this.fields);\n const errorList: { name: string; errors: ReactNode[] }[] = [];\n\n return Promise.allSettled(\n fieldsList.map((name) => {\n return this.validateField(name).catch((errors) => {\n errorList.push({ name, errors });\n\n return Promise.reject();\n });\n }),\n ).then(() => {\n if (errorList.length) {\n return Promise.reject(errorList);\n }\n\n return this.getFormData();\n });\n }\n\n isFieldValid<Name extends keyof T & string>(name: Name): boolean {\n const field = this.getFieldInstance(name);\n\n if (!field) return true;\n\n return !field.errors.length;\n }\n\n isFieldInvalid<Name extends keyof T & string>(name: Name): boolean {\n const field = this.getFieldInstance(name);\n\n if (!field) return false;\n\n return !!field.errors.length;\n }\n\n isFieldTouched<Name extends keyof T & string>(name: Name): boolean {\n const field = this.getFieldInstance(name);\n\n if (!field) return false;\n\n return !!field.touched;\n }\n\n isFieldDirty<Name extends keyof T & string>(name: Name): boolean {\n const field = this.getFieldInstance(name);\n\n if (!field) return false;\n\n return !isEqual(field.value, this.defaultValues[name]);\n }\n\n getFieldNames(): (keyof T & string)[] {\n return Object.keys(this.fields) as (keyof T & string)[];\n }\n\n getDirtyFieldNames(): (keyof T & string)[] {\n return this.getFieldNames().filter((name) => this.isFieldDirty(name));\n }\n\n getValidFieldNames(): (keyof T & string)[] {\n return this.getFieldNames().filter((name) => this.isFieldValid(name));\n }\n\n getInvalidFieldNames(): (keyof T & string)[] {\n return this.getFieldNames().filter((name) => this.isFieldInvalid(name));\n }\n\n get isTouched(): boolean {\n return Object.values(this.fields).some((field) => field?.touched);\n }\n\n get isDirty(): boolean {\n return this.getDirtyFieldNames().length > 0;\n }\n\n /**\n * True if all fields are verified and valid\n * IMPORTANT: This is not the same as `!isInvalid`, because it also checks if all fields are verified.\n */\n get isValid(): boolean {\n return Object.values(this.fields).every(\n (field) => field?.status === 'valid',\n );\n }\n\n /**\n * True if at least one field is verified and invalid.\n * IMPORTANT: This is not the same as `!isValid`, because it only checks that at least\n * one field is verified and invalid.\n */\n get isInvalid(): boolean {\n return Object.values(this.fields).some(\n (field) => field?.status === 'invalid',\n );\n }\n\n getFieldError<Name extends keyof T & string>(name: Name): ReactNode[] {\n const field = this.getFieldInstance(name);\n\n if (!field) return [];\n\n return field.errors || [];\n }\n\n /**\n * @deprecated This field is not supposed to be used directly.\n */\n createField<Name extends keyof T & string>(name: Name, skipRender?: boolean) {\n // passing an empty name is incorrect, but we have to return a valid object to avoid inconsistency\n if (!name) {\n return this._createField(name);\n }\n\n if (!this.fields[name]) {\n this.fields[name] = this._createField(name);\n }\n\n if (!skipRender) {\n this.forceReRender();\n }\n\n return this.fields[name];\n }\n\n /**\n * @deprecated This field is not supposed to be used directly.\n */\n removeField<Name extends keyof T & string>(name: Name, skipRender?: boolean) {\n if (this.fields[name]) {\n delete this.fields[name];\n }\n\n if (!skipRender) {\n this.forceReRender();\n }\n }\n\n /**\n * @deprecated This method is not recommended. Use other ways to alter fields.\n * Use `setFieldValue` to change the value of a field.\n * Use `verifyField` to validate a field.\n * Use `setFieldError` to set an error for a field.\n * Use `clearFieldsValidation` to clear all errors for a field.\n */\n setFields<Names extends keyof T & string>(\n newFields: SetFieldsArrType<T, Names>[],\n ) {\n newFields.forEach(({ name, value, errors }) => {\n this.fields[name] = this._createField(name, {\n value,\n errors,\n } as TFormData[Names]);\n });\n\n this.forceReRender();\n }\n\n resetFieldsValidation(names?: (keyof T & string)[], skipRender?: boolean) {\n (names || Object.keys(this.fields)).forEach((name) => {\n const field = this.getFieldInstance(name);\n\n if (!field) return;\n\n field.errors = [];\n field.status = undefined;\n field.validationId = (field.validationId ?? 0) + 1;\n });\n\n if (!skipRender) {\n this.forceReRender();\n }\n }\n\n setFieldError(\n name: keyof T & string,\n error: ReactNode,\n skipRender?: boolean,\n ) {\n const field = this.getFieldInstance(name);\n\n if (!field || !error) return;\n\n field.errors = [error];\n field.status = 'invalid';\n field.validationId = (field.validationId ?? 0) + 1;\n\n if (!skipRender) {\n this.forceReRender();\n }\n }\n\n setSubmitting(isSubmitting: boolean) {\n if (this.isSubmitting === isSubmitting) return;\n\n this.isSubmitting = isSubmitting;\n this.forceReRender();\n }\n\n _createField<Name extends keyof T & string, Data extends TFormData[Name]>(\n name: Name,\n data?: Data,\n ): Data {\n let obj = {\n name,\n validating: false,\n touched: false,\n errors: [],\n validationId: 0,\n value: this.defaultValues[name],\n ...data,\n // it should be impossible to define or override status value\n status: data?.errors?.length ? 'invalid' : undefined,\n } as unknown as Data;\n\n return obj;\n }\n}\n\nexport function useForm<TSourceType extends FieldTypes>(\n form?: CubeFormInstance<TSourceType, CubeFormData<TSourceType>>,\n ref?,\n options: {\n onSubmit?: CubeFormInstance<TSourceType>['onSubmit'];\n onValuesChange?: CubeFormInstance<TSourceType>['onValuesChange'];\n } = {},\n): [CubeFormInstance<TSourceType>] {\n const { onSubmit, onValuesChange } = options;\n\n if (isModernFormController(form)) {\n throw modernBackendUnavailableError('Form.useForm()');\n }\n\n const formRef = useRef<CubeFormInstance<TSourceType>>(null);\n const [, forceUpdate] = useState({});\n\n if (!formRef.current) {\n if (form) {\n formRef.current = form;\n } else {\n // Create a new FormInstance if not provided\n const forceReRender = () => {\n forceUpdate({});\n };\n\n form = formRef.current = new CubeFormInstance<TSourceType>(forceReRender);\n }\n\n form.ref = ref;\n }\n\n if (onSubmit) {\n formRef.current.onSubmit = onSubmit;\n }\n\n if (onValuesChange) {\n formRef.current.onValuesChange = onValuesChange;\n }\n\n return [formRef.current];\n}\n"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.0.0-canary-
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.0.0-canary-9fd458b | Cube Dev Team */
|
|
2
2
|
import { extractStyles } from "../../utils/styles.js";
|
|
3
3
|
import { useProviderProps } from "../../provider.js";
|
|
4
4
|
import { useI18n } from "../../i18n/useI18n.js";
|