From d6819ba14d7ab38aee67181b86dbdba6d436ae0b Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Sat, 31 May 2025 02:15:44 +0000 Subject: [PATCH] Add form input components with field wrapper for Medusa UI --- .../medusa-forms/src/ui/CurrencyInput.tsx | 14 +++++ packages/medusa-forms/src/ui/DatePicker.tsx | 14 +++++ .../medusa-forms/src/ui/FieldCheckbox.tsx | 59 +++++++++++++++++++ packages/medusa-forms/src/ui/Input.tsx | 13 ++++ packages/medusa-forms/src/ui/Select.tsx | 31 ++++++++++ packages/medusa-forms/src/ui/TextArea.tsx | 13 ++++ 6 files changed, 144 insertions(+) create mode 100644 packages/medusa-forms/src/ui/CurrencyInput.tsx create mode 100644 packages/medusa-forms/src/ui/DatePicker.tsx create mode 100644 packages/medusa-forms/src/ui/FieldCheckbox.tsx create mode 100644 packages/medusa-forms/src/ui/Input.tsx create mode 100644 packages/medusa-forms/src/ui/Select.tsx create mode 100644 packages/medusa-forms/src/ui/TextArea.tsx diff --git a/packages/medusa-forms/src/ui/CurrencyInput.tsx b/packages/medusa-forms/src/ui/CurrencyInput.tsx new file mode 100644 index 00000000..5f80e5ff --- /dev/null +++ b/packages/medusa-forms/src/ui/CurrencyInput.tsx @@ -0,0 +1,14 @@ +import { CurrencyInput as MedusaCurrencyInput } from '@medusajs/ui'; +import { type FC } from 'react'; +import { FieldWrapper } from './FieldWrapper'; +import type { BasicFieldProps, MedusaCurrencyInputProps } from './types'; + +export type Props = MedusaCurrencyInputProps & BasicFieldProps & { + ref?: React.Ref; +}; + +const Wrapper = FieldWrapper; + +export const CurrencyInput: FC = ({ ref, ...props }) => ( + {(inputProps) => } +); \ No newline at end of file diff --git a/packages/medusa-forms/src/ui/DatePicker.tsx b/packages/medusa-forms/src/ui/DatePicker.tsx new file mode 100644 index 00000000..c40a70b4 --- /dev/null +++ b/packages/medusa-forms/src/ui/DatePicker.tsx @@ -0,0 +1,14 @@ +import { DatePicker } from '@medusajs/ui'; +import { type FC } from 'react'; +import { FieldWrapper } from './FieldWrapper'; +import type { BasicFieldProps, DatePickerProps } from './types'; + +export type Props = DatePickerProps & BasicFieldProps & { + ref?: React.Ref; +}; + +const Wrapper = FieldWrapper; + +export const DatePickerInput: FC = ({ ref, ...props }) => { + return {(inputProps) => }; +}; \ No newline at end of file diff --git a/packages/medusa-forms/src/ui/FieldCheckbox.tsx b/packages/medusa-forms/src/ui/FieldCheckbox.tsx new file mode 100644 index 00000000..ea1e985e --- /dev/null +++ b/packages/medusa-forms/src/ui/FieldCheckbox.tsx @@ -0,0 +1,59 @@ +import { Checkbox as MedusaCheckbox } from '@medusajs/ui'; +import clsx from 'clsx'; +import { FieldWrapper } from './FieldWrapper'; +import { Label } from './Label'; +import type { BasicFieldProps } from './types'; + +export type CheckedState = boolean | 'indeterminate'; +export type FieldCheckboxProps = BasicFieldProps & { + checked?: CheckedState; + onChange?: (checked: CheckedState) => void; + ref?: React.Ref; +}; + +export const FieldCheckbox: React.FC = ({ + label, + labelClassName, + labelTooltip, + wrapperClassName, + errorClassName, + formErrors, + onChange, + ref, + ...props +}) => { + return ( + + wrapperClassName={wrapperClassName} + errorClassName={errorClassName} + formErrors={formErrors} + {...props} + > + {(fieldProps) => ( +
+ {}} + onCheckedChange={(checked) => { + onChange?.(checked); + }} + /> + + {label && ( + + )} +
+ )} + + ); +}; \ No newline at end of file diff --git a/packages/medusa-forms/src/ui/Input.tsx b/packages/medusa-forms/src/ui/Input.tsx new file mode 100644 index 00000000..8f9e8c38 --- /dev/null +++ b/packages/medusa-forms/src/ui/Input.tsx @@ -0,0 +1,13 @@ +import { Input as MedusaInput } from '@medusajs/ui'; +import { FieldWrapper } from './FieldWrapper'; +import type { BasicFieldProps, MedusaInputProps } from './types'; + +export type Props = MedusaInputProps & BasicFieldProps & { + ref?: React.Ref; +}; + +const Wrapper = FieldWrapper; + +export const Input: React.FC = ({ ref, ...props }) => ( + {(inputProps) => } +); \ No newline at end of file diff --git a/packages/medusa-forms/src/ui/Select.tsx b/packages/medusa-forms/src/ui/Select.tsx new file mode 100644 index 00000000..b7b9940c --- /dev/null +++ b/packages/medusa-forms/src/ui/Select.tsx @@ -0,0 +1,31 @@ +import { Select as MedusaSelect } from '@medusajs/ui'; +import { FieldWrapper } from './FieldWrapper'; +import type { BasicFieldProps, SelectProps } from './types'; + +export type Props = SelectProps & BasicFieldProps & { + ref?: React.Ref; +}; + +const Wrapper = FieldWrapper; + +const SelectComponent: React.FC = ({ ref, ...props }) => { + return ( + + {(inputProps) => {props.children}} + + ); +}; + +type SelectComponent = typeof SelectComponent & { + Trigger: typeof MedusaSelect.Trigger; + Value: typeof MedusaSelect.Value; + Content: typeof MedusaSelect.Content; + Item: typeof MedusaSelect.Item; +}; + +export const Select: SelectComponent = Object.assign(SelectComponent, { + Trigger: MedusaSelect.Trigger, + Value: MedusaSelect.Value, + Content: MedusaSelect.Content, + Item: MedusaSelect.Item, +}); \ No newline at end of file diff --git a/packages/medusa-forms/src/ui/TextArea.tsx b/packages/medusa-forms/src/ui/TextArea.tsx new file mode 100644 index 00000000..ee924d74 --- /dev/null +++ b/packages/medusa-forms/src/ui/TextArea.tsx @@ -0,0 +1,13 @@ +import { Textarea } from '@medusajs/ui'; +import { FieldWrapper } from './FieldWrapper'; +import type { BasicFieldProps, TextAreaProps } from './types'; + +export type Props = TextAreaProps & BasicFieldProps & { + ref?: React.Ref; +}; + +const Wrapper = FieldWrapper; + +export const TextArea: React.FC = ({ ref, ...props }) => ( + {(inputProps) =>