@gen-epix/ui-core-form 4.3.1 → 4.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/_chunks/Autocomplete.js.map +1 -1
- package/dist/_chunks/DatePicker.js +1 -1
- package/dist/_chunks/DatePicker.js.map +1 -1
- package/dist/_chunks/FileUpload.js.map +1 -1
- package/dist/_chunks/FormUtil.js +2 -2
- package/dist/_chunks/FormUtil.js.map +1 -1
- package/dist/_chunks/RichTextEditor.js +19672 -13307
- package/dist/_chunks/RichTextEditor.js.map +1 -1
- package/dist/_chunks/TransferList.js.map +1 -1
- package/dist/_chunks/classnames.js.map +1 -1
- package/dist/_chunks/isEqual.js.map +1 -1
- package/dist/_chunks/isObjectLike.js.map +1 -1
- package/dist/_chunks/isValid.js.map +1 -1
- package/dist/_chunks/sv.js.map +1 -1
- package/dist/components/fields/Autocomplete/Autocomplete.d.ts +1 -1
- package/dist/components/fields/Autocomplete/AutocompleteSelectAllContext.d.ts +1 -1
- package/dist/components/fields/Autocomplete/index.js +1 -2
- package/dist/components/fields/CheckboxGroup/CheckboxGroup.d.ts +1 -1
- package/dist/components/fields/CheckboxGroup/index.js.map +1 -1
- package/dist/components/fields/DatePicker/DatePicker.d.ts +1 -1
- package/dist/components/fields/DatePicker/index.js +1 -2
- package/dist/components/fields/DateRangePicker/DateRangePicker.d.ts +1 -1
- package/dist/components/fields/DateRangePicker/index.js +1 -1
- package/dist/components/fields/DateRangePicker/index.js.map +1 -1
- package/dist/components/fields/FileUpload/index.js +1 -2
- package/dist/components/fields/NumberField/index.js.map +1 -1
- package/dist/components/fields/NumberRangeInput/index.js.map +1 -1
- package/dist/components/fields/RadioGroup/RadioGroup.d.ts +1 -1
- package/dist/components/fields/RadioGroup/index.js.map +1 -1
- package/dist/components/fields/RichTextEditor/index.js +1 -2
- package/dist/components/fields/Select/Select.d.ts +1 -1
- package/dist/components/fields/Select/index.js.map +1 -1
- package/dist/components/fields/Switch/index.js.map +1 -1
- package/dist/components/fields/TextField/index.js.map +1 -1
- package/dist/components/fields/ToggleButtonGroup/ToggleButtonGroup.d.ts +1 -1
- package/dist/components/fields/ToggleButtonGroup/index.js.map +1 -1
- package/dist/components/fields/TransferList/TransferList.d.ts +1 -1
- package/dist/components/fields/TransferList/index.js +1 -2
- package/dist/components/helpers/FormFieldHelperText/index.js.map +1 -1
- package/dist/components/helpers/FormFieldLoadingIndicator/index.js.map +1 -1
- package/dist/components/helpers/GenericForm/GenericForm.d.ts +1 -1
- package/dist/components/helpers/GenericForm/index.js +1 -1
- package/dist/components/helpers/GenericForm/index.js.map +1 -1
- package/dist/hooks/useIsFormFieldRequiredFromSchema/index.js.map +1 -1
- package/dist/models/{form.js → form.models.js} +2 -2
- package/dist/models/form.models.js.map +1 -0
- package/dist/setup/setup.js.map +1 -1
- package/dist/utils/FormUtil/FormUtil.d.ts +1 -1
- package/dist/utils/FormUtil/index.js +1 -2
- package/dist/utils/SchemaUtil/index.js.map +1 -1
- package/package.json +60 -60
- package/dist/models/form.js.map +0 -1
- /package/dist/models/{form.d.ts → form.models.d.ts} +0 -0
|
@@ -1,2 +1 @@
|
|
|
1
|
-
|
|
2
|
-
export { e as FileUpload };
|
|
1
|
+
export { t as FileUpload } from "../../../_chunks/FileUpload.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../../../src/components/fields/NumberField/NumberField.tsx"],"sourcesContent":["import type { ReactElement } from 'react';\nimport {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport {\n Box,\n FormControl,\n FormHelperText,\n IconButton,\n InputAdornment,\n TextField as MuiTextField,\n Slider,\n} from '@mui/material';\nimport ClearIcon from '@mui/icons-material/Clear';\nimport type {\n FieldValues,\n Path,\n} from 'react-hook-form';\nimport { useFormContext } from 'react-hook-form';\nimport classnames from 'classnames';\nimport { useTranslation } from 'react-i18next';\nimport { TestIdUtil } from '@gen-epix/ui-core/utils/TestIdUtil';\nimport { NumberUtil } from '@gen-epix/ui-core/utils/NumberUtil';\n\nimport { FormUtil } from '../../../utils/FormUtil';\nimport { FormFieldHelperText } from '../../helpers/FormFieldHelperText';\nimport { FormFieldLoadingIndicator } from '../../helpers/FormFieldLoadingIndicator';\n\nexport type NumberFieldProps<TFieldValues extends FieldValues, TName extends Path<TFieldValues> = Path<TFieldValues>> = {\n readonly autocomplete?: string;\n readonly disabled?: boolean;\n readonly infoMessage?: string;\n readonly label: string;\n readonly loading?: boolean;\n readonly max?: number;\n readonly min?: number;\n readonly name: TName;\n readonly onChange?: (value: number) => void;\n readonly placeholder?: string;\n readonly required?: boolean;\n readonly showSlider?: boolean;\n readonly step?: number;\n readonly warningMessage?: string;\n};\n\nconst MAX_NUMBER_OF_SLIDER_STEPS = 250;\n\nexport const NumberField = <TFieldValues extends FieldValues, TName extends Path<TFieldValues> = Path<TFieldValues>>({\n autocomplete,\n disabled = false,\n label,\n loading = false,\n max,\n min,\n name,\n onChange: onChangeProp,\n placeholder,\n required = false,\n showSlider = false,\n step,\n warningMessage,\n}: NumberFieldProps<TFieldValues, TName>): ReactElement => {\n const { t } = useTranslation();\n const { formState: { errors }, register, subscribe } = useFormContext<TFieldValues>();\n const errorMessage = FormUtil.getFieldErrorMessage(errors, name);\n const hasError = !!errorMessage;\n const hasWarning = !!warningMessage && !hasError;\n const inputRef = useRef<HTMLInputElement>(null);\n const [internalValue, setInternalValue] = useState<number>(null);\n const [externalValue, setExternalValue] = useState<number>(null);\n const formControlRef = useRef<HTMLDivElement>(null);\n const [hasInputValue, setHasInputValue] = useState(false);\n\n const updateInputValue = useCallback((value: number) => {\n if (inputRef.current) {\n const inputValue = (value ?? '').toString().replace('.', ',');\n inputRef.current.value = inputValue;\n setHasInputValue(!!inputValue);\n }\n }, []);\n\n useEffect(() => {\n const unsubscribe = subscribe({\n callback: ({ name: changedName, values }) => {\n if (changedName !== name) {\n return;\n }\n setInternalValue(values[name]);\n setExternalValue(values[name]);\n updateInputValue(values[name]);\n },\n formState: {\n values: true,\n },\n name,\n });\n return () => {\n unsubscribe();\n };\n }, [name, subscribe, updateInputValue]);\n\n const registration = useMemo(() => register(name), [name, register]);\n\n const shouldShowSlider = useMemo(() => {\n if (!showSlider) {\n return false;\n }\n if (!isFinite(min) || !isFinite(max) || !isFinite(step) || min >= max) {\n return false;\n }\n if ((max - min) / step > MAX_NUMBER_OF_SLIDER_STEPS) {\n return false;\n }\n return true;\n }, [showSlider, min, max, step]);\n\n const emitValue = useCallback(async (parsedValue: number) => {\n let newValue: number;\n\n if (isNaN(parsedValue)) {\n newValue = null;\n } else {\n newValue = parsedValue;\n }\n\n updateInputValue(newValue);\n\n if (newValue !== externalValue) {\n await registration.onChange({\n target: {\n name,\n value: newValue,\n },\n });\n if (onChangeProp) {\n onChangeProp(newValue);\n }\n }\n }, [externalValue, name, onChangeProp, registration, updateInputValue]);\n\n const onResetButtonClick = useCallback(async () => {\n await emitValue(null);\n }, [emitValue]);\n\n\n const onMuiTextFieldBlur = useCallback(async () => {\n const parsedValue = NumberUtil.parse(inputRef.current.value);\n\n await emitValue(parsedValue);\n await registration.onBlur({\n target: {\n name,\n value: parsedValue,\n },\n type: 'blur',\n });\n }, [emitValue, name, registration]);\n\n const onMuiSliderBlur = useCallback(async () => {\n const parsedValue = NumberUtil.parse(inputRef.current.value);\n\n await emitValue(parsedValue);\n await registration.onBlur({\n target: {\n name,\n value: parsedValue,\n },\n type: 'blur',\n });\n }, [emitValue, name, registration]);\n\n const onMuiRangeSliderChange = useCallback((_event: unknown, sliderValue: number | number[]) => {\n const value = Array.isArray(sliderValue) ? sliderValue[0] : sliderValue;\n updateInputValue(value);\n setInternalValue(value);\n }, [updateInputValue]);\n\n let sliderValue = NumberUtil.parse(internalValue);\n if (isNaN(sliderValue)) {\n sliderValue = null;\n } else if (sliderValue < min) {\n sliderValue = min;\n } else if (sliderValue > max) {\n sliderValue = max;\n }\n\n const textField = useMemo(() => (\n <MuiTextField\n defaultValue={internalValue ?? ''}\n disabled={disabled || loading}\n error={hasError}\n inputRef={inputRef}\n label={label}\n onBlur={onMuiTextFieldBlur}\n placeholder={placeholder}\n slotProps={{\n formHelperText: {\n className: classnames({ 'Mui-warning': hasWarning }),\n },\n input: {\n className: classnames({ 'Mui-warning': hasWarning }),\n endAdornment: disabled ? undefined : (\n <InputAdornment position={'end'}>\n <IconButton\n {...TestIdUtil.createAttributes('TextField-reset')}\n aria-label={t`Clear text field`}\n onClick={onResetButtonClick}\n sx={{\n '& svg': {\n fontSize: '16px',\n },\n }}\n tabIndex={-1}\n >\n <ClearIcon />\n </IconButton>\n </InputAdornment>\n ),\n inputProps: {\n autoComplete: autocomplete ?? name,\n },\n },\n inputLabel: {\n className: classnames({ 'Mui-warning': hasWarning }),\n required: required && !disabled,\n shrink: hasInputValue,\n },\n }}\n variant={'outlined'}\n />\n ), [autocomplete, disabled, hasError, hasInputValue, hasWarning, internalValue, label, loading, name, onMuiTextFieldBlur, onResetButtonClick, placeholder, required, t]);\n\n return (\n <FormControl\n {...TestIdUtil.createAttributes('NumberField', { label, name })}\n fullWidth\n ref={formControlRef}\n sx={{\n '&:hover button, &:focus-within button': {\n display: 'initial',\n },\n button: {\n display: 'none',\n },\n }}\n >\n {!shouldShowSlider && textField}\n {shouldShowSlider && (\n <Box\n sx={{\n alignItems: 'center',\n display: 'grid',\n gap: 2,\n gridTemplateColumns: theme => `${theme.spacing(24)} auto`,\n }}\n >\n {textField}\n <Slider\n color={'primary'}\n marks\n max={max}\n min={min}\n onBlur={onMuiSliderBlur}\n onChange={onMuiRangeSliderChange}\n slotProps={{\n input: {\n 'aria-label': t`Value`,\n },\n }}\n step={step}\n value={sliderValue}\n valueLabelDisplay={'auto'}\n />\n </Box>\n )}\n { !!loading && <FormFieldLoadingIndicator />}\n <FormHelperText>\n <FormFieldHelperText\n errorMessage={errorMessage}\n warningMessage={warningMessage}\n />\n </FormHelperText>\n </FormControl>\n );\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["MuiTextField","classnames","__toESM","require_classnames","ClearIcon","import_classnames","MAX_NUMBER_OF_SLIDER_STEPS","NumberField","onChangeProp","useTranslation","useFormContext","errorMessage","FormUtil","errors","name","hasError","hasWarning","warningMessage","inputRef","useRef","internalValue","setInternalValue","useState","externalValue","setExternalValue","formControlRef","hasInputValue","setHasInputValue","updateInputValue","useCallback","inputValue","value","unsubscribe","subscribe","changedName","values","registration","useMemo","register","shouldShowSlider","showSlider","min","max","step","emitValue","newValue","parsedValue","onResetButtonClick","onMuiTextFieldBlur","NumberUtil","onMuiSliderBlur","onMuiRangeSliderChange","sliderValue","textField","TextField","disabled","loading","InputAdornment","IconButton","TestIdUtil","autocomplete","required","label","placeholder","t","FormControl","Box","theme","Slider","FormFieldLoadingIndicator","FormHelperText","FormFieldHelperText"],"sources":["../../../../src/components/fields/NumberField/NumberField.tsx"],"sourcesContent":["import type { ReactElement } from 'react';\nimport {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport {\n Box,\n FormControl,\n FormHelperText,\n IconButton,\n InputAdornment,\n TextField as MuiTextField,\n Slider,\n} from '@mui/material';\nimport ClearIcon from '@mui/icons-material/Clear';\nimport type {\n FieldValues,\n Path,\n} from 'react-hook-form';\nimport { useFormContext } from 'react-hook-form';\nimport classnames from 'classnames';\nimport { useTranslation } from 'react-i18next';\nimport { TestIdUtil } from '@gen-epix/ui-core/utils/TestIdUtil';\nimport { NumberUtil } from '@gen-epix/ui-core/utils/NumberUtil';\n\nimport { FormUtil } from '../../../utils/FormUtil';\nimport { FormFieldHelperText } from '../../helpers/FormFieldHelperText';\nimport { FormFieldLoadingIndicator } from '../../helpers/FormFieldLoadingIndicator';\n\nexport type NumberFieldProps<TFieldValues extends FieldValues, TName extends Path<TFieldValues> = Path<TFieldValues>> = {\n readonly autocomplete?: string;\n readonly disabled?: boolean;\n readonly infoMessage?: string;\n readonly label: string;\n readonly loading?: boolean;\n readonly max?: number;\n readonly min?: number;\n readonly name: TName;\n readonly onChange?: (value: number) => void;\n readonly placeholder?: string;\n readonly required?: boolean;\n readonly showSlider?: boolean;\n readonly step?: number;\n readonly warningMessage?: string;\n};\n\nconst MAX_NUMBER_OF_SLIDER_STEPS = 250;\n\nexport const NumberField = <TFieldValues extends FieldValues, TName extends Path<TFieldValues> = Path<TFieldValues>>({\n autocomplete,\n disabled = false,\n label,\n loading = false,\n max,\n min,\n name,\n onChange: onChangeProp,\n placeholder,\n required = false,\n showSlider = false,\n step,\n warningMessage,\n}: NumberFieldProps<TFieldValues, TName>): ReactElement => {\n const { t } = useTranslation();\n const { formState: { errors }, register, subscribe } = useFormContext<TFieldValues>();\n const errorMessage = FormUtil.getFieldErrorMessage(errors, name);\n const hasError = !!errorMessage;\n const hasWarning = !!warningMessage && !hasError;\n const inputRef = useRef<HTMLInputElement>(null);\n const [internalValue, setInternalValue] = useState<number>(null);\n const [externalValue, setExternalValue] = useState<number>(null);\n const formControlRef = useRef<HTMLDivElement>(null);\n const [hasInputValue, setHasInputValue] = useState(false);\n\n const updateInputValue = useCallback((value: number) => {\n if (inputRef.current) {\n const inputValue = (value ?? '').toString().replace('.', ',');\n inputRef.current.value = inputValue;\n setHasInputValue(!!inputValue);\n }\n }, []);\n\n useEffect(() => {\n const unsubscribe = subscribe({\n callback: ({ name: changedName, values }) => {\n if (changedName !== name) {\n return;\n }\n setInternalValue(values[name]);\n setExternalValue(values[name]);\n updateInputValue(values[name]);\n },\n formState: {\n values: true,\n },\n name,\n });\n return () => {\n unsubscribe();\n };\n }, [name, subscribe, updateInputValue]);\n\n const registration = useMemo(() => register(name), [name, register]);\n\n const shouldShowSlider = useMemo(() => {\n if (!showSlider) {\n return false;\n }\n if (!isFinite(min) || !isFinite(max) || !isFinite(step) || min >= max) {\n return false;\n }\n if ((max - min) / step > MAX_NUMBER_OF_SLIDER_STEPS) {\n return false;\n }\n return true;\n }, [showSlider, min, max, step]);\n\n const emitValue = useCallback(async (parsedValue: number) => {\n let newValue: number;\n\n if (isNaN(parsedValue)) {\n newValue = null;\n } else {\n newValue = parsedValue;\n }\n\n updateInputValue(newValue);\n\n if (newValue !== externalValue) {\n await registration.onChange({\n target: {\n name,\n value: newValue,\n },\n });\n if (onChangeProp) {\n onChangeProp(newValue);\n }\n }\n }, [externalValue, name, onChangeProp, registration, updateInputValue]);\n\n const onResetButtonClick = useCallback(async () => {\n await emitValue(null);\n }, [emitValue]);\n\n\n const onMuiTextFieldBlur = useCallback(async () => {\n const parsedValue = NumberUtil.parse(inputRef.current.value);\n\n await emitValue(parsedValue);\n await registration.onBlur({\n target: {\n name,\n value: parsedValue,\n },\n type: 'blur',\n });\n }, [emitValue, name, registration]);\n\n const onMuiSliderBlur = useCallback(async () => {\n const parsedValue = NumberUtil.parse(inputRef.current.value);\n\n await emitValue(parsedValue);\n await registration.onBlur({\n target: {\n name,\n value: parsedValue,\n },\n type: 'blur',\n });\n }, [emitValue, name, registration]);\n\n const onMuiRangeSliderChange = useCallback((_event: unknown, sliderValue: number | number[]) => {\n const value = Array.isArray(sliderValue) ? sliderValue[0] : sliderValue;\n updateInputValue(value);\n setInternalValue(value);\n }, [updateInputValue]);\n\n let sliderValue = NumberUtil.parse(internalValue);\n if (isNaN(sliderValue)) {\n sliderValue = null;\n } else if (sliderValue < min) {\n sliderValue = min;\n } else if (sliderValue > max) {\n sliderValue = max;\n }\n\n const textField = useMemo(() => (\n <MuiTextField\n defaultValue={internalValue ?? ''}\n disabled={disabled || loading}\n error={hasError}\n inputRef={inputRef}\n label={label}\n onBlur={onMuiTextFieldBlur}\n placeholder={placeholder}\n slotProps={{\n formHelperText: {\n className: classnames({ 'Mui-warning': hasWarning }),\n },\n input: {\n className: classnames({ 'Mui-warning': hasWarning }),\n endAdornment: disabled ? undefined : (\n <InputAdornment position={'end'}>\n <IconButton\n {...TestIdUtil.createAttributes('TextField-reset')}\n aria-label={t`Clear text field`}\n onClick={onResetButtonClick}\n sx={{\n '& svg': {\n fontSize: '16px',\n },\n }}\n tabIndex={-1}\n >\n <ClearIcon />\n </IconButton>\n </InputAdornment>\n ),\n inputProps: {\n autoComplete: autocomplete ?? name,\n },\n },\n inputLabel: {\n className: classnames({ 'Mui-warning': hasWarning }),\n required: required && !disabled,\n shrink: hasInputValue,\n },\n }}\n variant={'outlined'}\n />\n ), [autocomplete, disabled, hasError, hasInputValue, hasWarning, internalValue, label, loading, name, onMuiTextFieldBlur, onResetButtonClick, placeholder, required, t]);\n\n return (\n <FormControl\n {...TestIdUtil.createAttributes('NumberField', { label, name })}\n fullWidth\n ref={formControlRef}\n sx={{\n '&:hover button, &:focus-within button': {\n display: 'initial',\n },\n button: {\n display: 'none',\n },\n }}\n >\n {!shouldShowSlider && textField}\n {shouldShowSlider && (\n <Box\n sx={{\n alignItems: 'center',\n display: 'grid',\n gap: 2,\n gridTemplateColumns: theme => `${theme.spacing(24)} auto`,\n }}\n >\n {textField}\n <Slider\n color={'primary'}\n marks\n max={max}\n min={min}\n onBlur={onMuiSliderBlur}\n onChange={onMuiRangeSliderChange}\n slotProps={{\n input: {\n 'aria-label': t`Value`,\n },\n }}\n step={step}\n value={sliderValue}\n valueLabelDisplay={'auto'}\n />\n </Box>\n )}\n { !!loading && <FormFieldLoadingIndicator />}\n <FormHelperText>\n <FormFieldHelperText\n errorMessage={errorMessage}\n warningMessage={warningMessage}\n />\n </FormHelperText>\n </FormControl>\n );\n};\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../../../../../node_modules/.pnpm/lodash@4.18.1/node_modules/lodash/isNumber.js","../../../../../../node_modules/.pnpm/lodash@4.18.1/node_modules/lodash/isFinite.js","../../../../src/components/fields/NumberRangeInput/NumberRangeInput.tsx"],"sourcesContent":["var baseGetTag = require('./_baseGetTag'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar numberTag = '[object Number]';\n\n/**\n * Checks if `value` is classified as a `Number` primitive or object.\n *\n * **Note:** To exclude `Infinity`, `-Infinity`, and `NaN`, which are\n * classified as numbers, use the `_.isFinite` method.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a number, else `false`.\n * @example\n *\n * _.isNumber(3);\n * // => true\n *\n * _.isNumber(Number.MIN_VALUE);\n * // => true\n *\n * _.isNumber(Infinity);\n * // => true\n *\n * _.isNumber('3');\n * // => false\n */\nfunction isNumber(value) {\n return typeof value == 'number' ||\n (isObjectLike(value) && baseGetTag(value) == numberTag);\n}\n\nmodule.exports = isNumber;\n","var root = require('./_root');\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeIsFinite = root.isFinite;\n\n/**\n * Checks if `value` is a finite primitive number.\n *\n * **Note:** This method is based on\n * [`Number.isFinite`](https://mdn.io/Number/isFinite).\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a finite number, else `false`.\n * @example\n *\n * _.isFinite(3);\n * // => true\n *\n * _.isFinite(Number.MIN_VALUE);\n * // => true\n *\n * _.isFinite(Infinity);\n * // => false\n *\n * _.isFinite('3');\n * // => false\n */\nfunction isFinite(value) {\n return typeof value == 'number' && nativeIsFinite(value);\n}\n\nmodule.exports = isFinite;\n","import type {\n ChangeEvent,\n ReactElement,\n} from 'react';\nimport {\n useCallback,\n useId,\n useRef,\n} from 'react';\nimport {\n Box,\n FormControl,\n FormHelperText,\n FormLabel,\n IconButton,\n Input,\n Slider,\n useTheme,\n} from '@mui/material';\nimport ClearIcon from '@mui/icons-material/Clear';\nimport type {\n ControllerRenderProps,\n FieldValues,\n Path,\n UseControllerReturn,\n} from 'react-hook-form';\nimport {\n Controller,\n useFormContext,\n useWatch,\n} from 'react-hook-form';\nimport { useTranslation } from 'react-i18next';\nimport isEqual from 'lodash/isEqual';\nimport isNumber from 'lodash/isNumber';\nimport isFinite from 'lodash/isFinite';\nimport { TestIdUtil } from '@gen-epix/ui-core/utils/TestIdUtil';\n\nimport { FormUtil } from '../../../utils/FormUtil';\nimport { FormFieldHelperText } from '../../helpers/FormFieldHelperText';\nimport { FormFieldLoadingIndicator } from '../../helpers/FormFieldLoadingIndicator';\n\nexport type NumberRangeInputProps<TFieldValues extends FieldValues, TName extends Path<TFieldValues> = Path<TFieldValues>> = {\n readonly disabled?: boolean;\n readonly infoMessage?: string;\n readonly label: string;\n readonly loading?: boolean;\n readonly max: number;\n readonly min: number;\n readonly name: TName;\n readonly onChange?: (value: number | number[]) => void;\n readonly required?: boolean;\n readonly warningMessage?: string;\n};\n\nexport const NumberRangeInput = <TFieldValues extends FieldValues, TName extends Path<TFieldValues> = Path<TFieldValues>>({\n disabled = false,\n infoMessage,\n label,\n loading = false,\n max,\n min,\n name,\n onChange: onChangeProp,\n required = false,\n warningMessage,\n}: NumberRangeInputProps<TFieldValues, TName>): ReactElement => {\n const shouldShowSlider = isFinite(min) && isFinite(max);\n const theme = useTheme();\n\n const { t } = useTranslation();\n const { control, formState: { errors } } = useFormContext<TFieldValues>();\n const errorMessage = FormUtil.getFieldErrorMessage(errors, name);\n const hasError = !!errorMessage;\n const inputRef = useRef<HTMLInputElement>(null);\n const id = useId();\n\n const outerValue = useWatch({ control, name }) as number[];\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const handleChange = useCallback((newValue: number[], onChange: (...event: any[]) => void) => {\n if (isEqual(outerValue, newValue)) {\n return;\n }\n if (onChangeProp) {\n onChangeProp(newValue);\n }\n onChange(newValue);\n }, [onChangeProp, outerValue]);\n\n const onMuiRangeSliderChange = useCallback((onChange: ControllerRenderProps<TFieldValues, TName>['onChange']) =>\n (_event: Event, newValue: number | number[]) => {\n handleChange(newValue as number[], onChange);\n }\n , [handleChange]);\n\n const renderController = useCallback(({ field: { onBlur, onChange, ref, value } }: UseControllerReturn<TFieldValues, TName>) => {\n ref({\n focus: () => {\n inputRef?.current?.focus();\n },\n });\n\n const leftValue = (value as [number, number])?.[0];\n const rightValue = (value as [number, number])?.[1];\n\n const onLeftValueChange = (event: ChangeEvent<HTMLInputElement>) => {\n if (event.target.value === '') {\n handleChange([null, rightValue], onChange);\n } else if (isFinite(+event.target.value)) {\n handleChange([+event.target.value, rightValue], onChange);\n }\n };\n const onRightValueChange = (event: ChangeEvent<HTMLInputElement>) => {\n if (event.target.value === '') {\n handleChange([leftValue, null], onChange);\n } else if (isFinite(+event.target.value)) {\n handleChange([leftValue, +event.target.value], onChange);\n }\n };\n\n const onLeftValueBlur = () => {\n if (leftValue === null || !isFinite(leftValue)) {\n handleChange([null, rightValue], onChange);\n } else if (leftValue < min) {\n handleChange([min, rightValue], onChange);\n } else if (leftValue > max) {\n handleChange([max, max], onChange);\n } else if (isNumber(rightValue) && leftValue > rightValue) {\n handleChange([rightValue, leftValue], onChange);\n }\n\n onBlur();\n };\n const onRightValueBlur = () => {\n if (rightValue === null || !isFinite(rightValue)) {\n handleChange([leftValue, null], onChange);\n } else if (rightValue > max) {\n handleChange([leftValue, max], onChange);\n } else if (rightValue < min) {\n handleChange([min, min], onChange);\n } else if (isNumber(leftValue) && rightValue < leftValue) {\n handleChange([rightValue, leftValue], onChange);\n }\n\n onBlur();\n };\n\n const onResetButtonClick = () => {\n handleChange([null, null], onChange);\n };\n\n return (\n <Box\n {...TestIdUtil.createAttributes('RangeSlider', { label, name })}\n sx={{\n '&:hover legend button, &:focus-within legend button': {\n display: 'initial',\n },\n 'legend button': {\n display: 'none',\n },\n }}\n >\n { !loading && (\n <Box\n sx={{\n display: 'grid',\n gridTemplateColumns: 'max-content auto max-content',\n position: 'relative',\n }}\n >\n <Box\n sx={{\n marginTop: 4,\n width: theme.spacing(shouldShowSlider ? 6 : 16),\n }}\n >\n <Input\n fullWidth\n inputProps={{\n ...TestIdUtil.createAttributes('RangeSlider-from-input'),\n 'aria-labelledby': id,\n name: `${name}-from}`,\n variant: 'outlined',\n }}\n // eslint-disable-next-line @eslint-react/kit/jsx-no-bind\n onBlur={onLeftValueBlur}\n // eslint-disable-next-line @eslint-react/kit/jsx-no-bind\n onChange={onLeftValueChange}\n placeholder={t`From`}\n size={'small'}\n value={leftValue ?? ''}\n />\n </Box>\n <FormControl\n error={hasError}\n fullWidth\n sx={{\n position: 'initial',\n }}\n >\n <FormLabel\n component={'legend'}\n disabled={disabled || loading}\n id={id}\n required={required}\n sx={{\n left: 0,\n position: 'absolute',\n }}\n >\n {label}\n {!disabled && (\n <IconButton\n {...TestIdUtil.createAttributes('RangeSlider-reset')}\n aria-label={t`Clear number range`}\n // eslint-disable-next-line @eslint-react/kit/jsx-no-bind\n onClick={onResetButtonClick}\n sx={{\n '& svg': {\n fontSize: '16px',\n },\n position: 'absolute',\n top: '-10px',\n }}\n tabIndex={-1}\n >\n <ClearIcon />\n </IconButton>\n )}\n </FormLabel>\n <Box\n sx={{\n marginTop: 4,\n marginX: 3,\n }}\n >\n {shouldShowSlider && (\n <Slider\n color={'primary'}\n max={max}\n min={min}\n onBlur={onBlur}\n onChange={onMuiRangeSliderChange(onChange)}\n slotProps={{\n input: {\n 'aria-label': t`Value`,\n },\n }}\n value={value as [number, number]}\n valueLabelDisplay={'off'}\n />\n )}\n </Box>\n </FormControl>\n <Box\n sx={{\n marginTop: 4,\n width: theme.spacing(shouldShowSlider ? 6 : 16),\n }}\n >\n <Input\n fullWidth\n inputProps={{\n ...TestIdUtil.createAttributes('RangeSlider-to-input'),\n 'aria-labelledby': id,\n name: `${name}-to}`,\n variant: 'outlined',\n }}\n // eslint-disable-next-line @eslint-react/kit/jsx-no-bind\n onBlur={onRightValueBlur}\n // eslint-disable-next-line @eslint-react/kit/jsx-no-bind\n onChange={onRightValueChange}\n placeholder={t`To`}\n size={'small'}\n value={rightValue ?? ''}\n />\n </Box>\n </Box>\n )}\n { !!loading && <FormFieldLoadingIndicator inline />}\n <FormHelperText sx={{ ml: 0 }}>\n <FormFieldHelperText\n errorMessage={errorMessage}\n infoMessage={infoMessage}\n noIndent\n warningMessage={warningMessage}\n />\n </FormHelperText>\n </Box>\n );\n }, [disabled, errorMessage, handleChange, hasError, id, infoMessage, label, loading, max, min, name, onMuiRangeSliderChange, required, shouldShowSlider, t, warningMessage, theme]);\n\n return (\n <Controller\n control={control}\n defaultValue={null}\n name={name}\n render={renderController}\n />\n );\n};\n"],"x_google_ignoreList":[0,1],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["isFinite","isEqual","isNumber","__toESM","FormUtil","require__root","require__baseGetTag","require_isObjectLike","require_isEqual","ClearIcon","require_isNumber","baseGetTag","isObjectLike","numberTag","isNumber","value","require_isFinite","nativeIsFinite","isFinite","import_isEqual","import_isNumber","import_isFinite","NumberRangeInput","onChangeProp","shouldShowSlider","min","max","theme","useTheme","useTranslation","useFormContext","errorMessage","errors","name","hasError","inputRef","useRef","id","useId","outerValue","useWatch","handleChange","useCallback","newValue","onChange","onMuiRangeSliderChange","renderController","leftValue","rightValue","onLeftValueChange","event","onRightValueChange","onLeftValueBlur","onBlur","onRightValueBlur","onResetButtonClick","Box","TestIdUtil","loading","Input","FormControl","FormLabel","disabled","label","IconButton","Slider","FormFieldLoadingIndicator","FormHelperText","FormFieldHelperText","infoMessage","required","t","warningMessage","Controller"],"sources":["../../../../../../node_modules/.pnpm/lodash@4.18.1/node_modules/lodash/isNumber.js","../../../../../../node_modules/.pnpm/lodash@4.18.1/node_modules/lodash/isFinite.js","../../../../src/components/fields/NumberRangeInput/NumberRangeInput.tsx"],"sourcesContent":["var baseGetTag = require('./_baseGetTag'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar numberTag = '[object Number]';\n\n/**\n * Checks if `value` is classified as a `Number` primitive or object.\n *\n * **Note:** To exclude `Infinity`, `-Infinity`, and `NaN`, which are\n * classified as numbers, use the `_.isFinite` method.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a number, else `false`.\n * @example\n *\n * _.isNumber(3);\n * // => true\n *\n * _.isNumber(Number.MIN_VALUE);\n * // => true\n *\n * _.isNumber(Infinity);\n * // => true\n *\n * _.isNumber('3');\n * // => false\n */\nfunction isNumber(value) {\n return typeof value == 'number' ||\n (isObjectLike(value) && baseGetTag(value) == numberTag);\n}\n\nmodule.exports = isNumber;\n","var root = require('./_root');\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeIsFinite = root.isFinite;\n\n/**\n * Checks if `value` is a finite primitive number.\n *\n * **Note:** This method is based on\n * [`Number.isFinite`](https://mdn.io/Number/isFinite).\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a finite number, else `false`.\n * @example\n *\n * _.isFinite(3);\n * // => true\n *\n * _.isFinite(Number.MIN_VALUE);\n * // => true\n *\n * _.isFinite(Infinity);\n * // => false\n *\n * _.isFinite('3');\n * // => false\n */\nfunction isFinite(value) {\n return typeof value == 'number' && nativeIsFinite(value);\n}\n\nmodule.exports = isFinite;\n","import type {\n ChangeEvent,\n ReactElement,\n} from 'react';\nimport {\n useCallback,\n useId,\n useRef,\n} from 'react';\nimport {\n Box,\n FormControl,\n FormHelperText,\n FormLabel,\n IconButton,\n Input,\n Slider,\n useTheme,\n} from '@mui/material';\nimport ClearIcon from '@mui/icons-material/Clear';\nimport type {\n ControllerRenderProps,\n FieldValues,\n Path,\n UseControllerReturn,\n} from 'react-hook-form';\nimport {\n Controller,\n useFormContext,\n useWatch,\n} from 'react-hook-form';\nimport { useTranslation } from 'react-i18next';\nimport isEqual from 'lodash/isEqual';\nimport isNumber from 'lodash/isNumber';\nimport isFinite from 'lodash/isFinite';\nimport { TestIdUtil } from '@gen-epix/ui-core/utils/TestIdUtil';\n\nimport { FormUtil } from '../../../utils/FormUtil';\nimport { FormFieldHelperText } from '../../helpers/FormFieldHelperText';\nimport { FormFieldLoadingIndicator } from '../../helpers/FormFieldLoadingIndicator';\n\nexport type NumberRangeInputProps<TFieldValues extends FieldValues, TName extends Path<TFieldValues> = Path<TFieldValues>> = {\n readonly disabled?: boolean;\n readonly infoMessage?: string;\n readonly label: string;\n readonly loading?: boolean;\n readonly max: number;\n readonly min: number;\n readonly name: TName;\n readonly onChange?: (value: number | number[]) => void;\n readonly required?: boolean;\n readonly warningMessage?: string;\n};\n\nexport const NumberRangeInput = <TFieldValues extends FieldValues, TName extends Path<TFieldValues> = Path<TFieldValues>>({\n disabled = false,\n infoMessage,\n label,\n loading = false,\n max,\n min,\n name,\n onChange: onChangeProp,\n required = false,\n warningMessage,\n}: NumberRangeInputProps<TFieldValues, TName>): ReactElement => {\n const shouldShowSlider = isFinite(min) && isFinite(max);\n const theme = useTheme();\n\n const { t } = useTranslation();\n const { control, formState: { errors } } = useFormContext<TFieldValues>();\n const errorMessage = FormUtil.getFieldErrorMessage(errors, name);\n const hasError = !!errorMessage;\n const inputRef = useRef<HTMLInputElement>(null);\n const id = useId();\n\n const outerValue = useWatch({ control, name }) as number[];\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const handleChange = useCallback((newValue: number[], onChange: (...event: any[]) => void) => {\n if (isEqual(outerValue, newValue)) {\n return;\n }\n if (onChangeProp) {\n onChangeProp(newValue);\n }\n onChange(newValue);\n }, [onChangeProp, outerValue]);\n\n const onMuiRangeSliderChange = useCallback((onChange: ControllerRenderProps<TFieldValues, TName>['onChange']) =>\n (_event: Event, newValue: number | number[]) => {\n handleChange(newValue as number[], onChange);\n }\n , [handleChange]);\n\n const renderController = useCallback(({ field: { onBlur, onChange, ref, value } }: UseControllerReturn<TFieldValues, TName>) => {\n ref({\n focus: () => {\n inputRef?.current?.focus();\n },\n });\n\n const leftValue = (value as [number, number])?.[0];\n const rightValue = (value as [number, number])?.[1];\n\n const onLeftValueChange = (event: ChangeEvent<HTMLInputElement>) => {\n if (event.target.value === '') {\n handleChange([null, rightValue], onChange);\n } else if (isFinite(+event.target.value)) {\n handleChange([+event.target.value, rightValue], onChange);\n }\n };\n const onRightValueChange = (event: ChangeEvent<HTMLInputElement>) => {\n if (event.target.value === '') {\n handleChange([leftValue, null], onChange);\n } else if (isFinite(+event.target.value)) {\n handleChange([leftValue, +event.target.value], onChange);\n }\n };\n\n const onLeftValueBlur = () => {\n if (leftValue === null || !isFinite(leftValue)) {\n handleChange([null, rightValue], onChange);\n } else if (leftValue < min) {\n handleChange([min, rightValue], onChange);\n } else if (leftValue > max) {\n handleChange([max, max], onChange);\n } else if (isNumber(rightValue) && leftValue > rightValue) {\n handleChange([rightValue, leftValue], onChange);\n }\n\n onBlur();\n };\n const onRightValueBlur = () => {\n if (rightValue === null || !isFinite(rightValue)) {\n handleChange([leftValue, null], onChange);\n } else if (rightValue > max) {\n handleChange([leftValue, max], onChange);\n } else if (rightValue < min) {\n handleChange([min, min], onChange);\n } else if (isNumber(leftValue) && rightValue < leftValue) {\n handleChange([rightValue, leftValue], onChange);\n }\n\n onBlur();\n };\n\n const onResetButtonClick = () => {\n handleChange([null, null], onChange);\n };\n\n return (\n <Box\n {...TestIdUtil.createAttributes('RangeSlider', { label, name })}\n sx={{\n '&:hover legend button, &:focus-within legend button': {\n display: 'initial',\n },\n 'legend button': {\n display: 'none',\n },\n }}\n >\n { !loading && (\n <Box\n sx={{\n display: 'grid',\n gridTemplateColumns: 'max-content auto max-content',\n position: 'relative',\n }}\n >\n <Box\n sx={{\n marginTop: 4,\n width: theme.spacing(shouldShowSlider ? 6 : 16),\n }}\n >\n <Input\n fullWidth\n inputProps={{\n ...TestIdUtil.createAttributes('RangeSlider-from-input'),\n 'aria-labelledby': id,\n name: `${name}-from}`,\n variant: 'outlined',\n }}\n // eslint-disable-next-line @eslint-react/kit/jsx-no-bind\n onBlur={onLeftValueBlur}\n // eslint-disable-next-line @eslint-react/kit/jsx-no-bind\n onChange={onLeftValueChange}\n placeholder={t`From`}\n size={'small'}\n value={leftValue ?? ''}\n />\n </Box>\n <FormControl\n error={hasError}\n fullWidth\n sx={{\n position: 'initial',\n }}\n >\n <FormLabel\n component={'legend'}\n disabled={disabled || loading}\n id={id}\n required={required}\n sx={{\n left: 0,\n position: 'absolute',\n }}\n >\n {label}\n {!disabled && (\n <IconButton\n {...TestIdUtil.createAttributes('RangeSlider-reset')}\n aria-label={t`Clear number range`}\n // eslint-disable-next-line @eslint-react/kit/jsx-no-bind\n onClick={onResetButtonClick}\n sx={{\n '& svg': {\n fontSize: '16px',\n },\n position: 'absolute',\n top: '-10px',\n }}\n tabIndex={-1}\n >\n <ClearIcon />\n </IconButton>\n )}\n </FormLabel>\n <Box\n sx={{\n marginTop: 4,\n marginX: 3,\n }}\n >\n {shouldShowSlider && (\n <Slider\n color={'primary'}\n max={max}\n min={min}\n onBlur={onBlur}\n onChange={onMuiRangeSliderChange(onChange)}\n slotProps={{\n input: {\n 'aria-label': t`Value`,\n },\n }}\n value={value as [number, number]}\n valueLabelDisplay={'off'}\n />\n )}\n </Box>\n </FormControl>\n <Box\n sx={{\n marginTop: 4,\n width: theme.spacing(shouldShowSlider ? 6 : 16),\n }}\n >\n <Input\n fullWidth\n inputProps={{\n ...TestIdUtil.createAttributes('RangeSlider-to-input'),\n 'aria-labelledby': id,\n name: `${name}-to}`,\n variant: 'outlined',\n }}\n // eslint-disable-next-line @eslint-react/kit/jsx-no-bind\n onBlur={onRightValueBlur}\n // eslint-disable-next-line @eslint-react/kit/jsx-no-bind\n onChange={onRightValueChange}\n placeholder={t`To`}\n size={'small'}\n value={rightValue ?? ''}\n />\n </Box>\n </Box>\n )}\n { !!loading && <FormFieldLoadingIndicator inline />}\n <FormHelperText sx={{ ml: 0 }}>\n <FormFieldHelperText\n errorMessage={errorMessage}\n infoMessage={infoMessage}\n noIndent\n warningMessage={warningMessage}\n />\n </FormHelperText>\n </Box>\n );\n }, [disabled, errorMessage, handleChange, hasError, id, infoMessage, label, loading, max, min, name, onMuiRangeSliderChange, required, shouldShowSlider, t, warningMessage, theme]);\n\n return (\n <Controller\n control={control}\n defaultValue={null}\n name={name}\n render={renderController}\n />\n );\n};\n"],"ignoreList":[0,1],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { ReactElement } from 'react';
|
|
2
2
|
import { FieldValues, Path } from 'react-hook-form';
|
|
3
|
-
import { RadioButtonOption } from '../../../models/form';
|
|
3
|
+
import { RadioButtonOption } from '../../../models/form.models';
|
|
4
4
|
export type RadioGroupProps<TFieldValues extends FieldValues, TName extends Path<TFieldValues> = Path<TFieldValues>> = {
|
|
5
5
|
readonly disabled?: boolean;
|
|
6
6
|
readonly infoMessage?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../../../src/components/fields/RadioGroup/RadioGroup.tsx"],"sourcesContent":["import type {\n ChangeEvent,\n ReactElement,\n} from 'react';\nimport {\n useCallback,\n useId,\n useRef,\n} from 'react';\nimport {\n FormControl,\n FormControlLabel,\n FormHelperText,\n FormLabel,\n RadioGroup as MuiRadioGroup,\n Radio,\n} from '@mui/material';\nimport {\n Controller,\n useFormContext,\n} from 'react-hook-form';\nimport type {\n ControllerRenderProps,\n FieldValues,\n Path,\n UseControllerReturn,\n} from 'react-hook-form';\nimport { TestIdUtil } from '@gen-epix/ui-core/utils/TestIdUtil';\n\nimport type { RadioButtonOption } from '../../../models/form';\nimport { FormUtil } from '../../../utils/FormUtil';\nimport { FormFieldHelperText } from '../../helpers/FormFieldHelperText';\n\nexport type RadioGroupProps<TFieldValues extends FieldValues, TName extends Path<TFieldValues> = Path<TFieldValues>> = {\n readonly disabled?: boolean;\n readonly infoMessage?: string;\n readonly label: string;\n readonly loading?: boolean; // NOT USED YET\n readonly name: TName;\n readonly onChange?: (value: string) => void;\n readonly options: RadioButtonOption[];\n readonly required?: boolean;\n readonly row?: boolean;\n readonly warningMessage?: string;\n};\n\nexport const RadioGroup = <TFieldValues extends FieldValues, TName extends Path<TFieldValues> = Path<TFieldValues>>({\n disabled,\n infoMessage,\n label,\n name,\n onChange: onChangeProp,\n options,\n required,\n row,\n warningMessage,\n}: RadioGroupProps<TFieldValues, TName>): ReactElement => {\n const id = useId();\n const { control, formState: { errors } } = useFormContext<TFieldValues>();\n const errorMessage = FormUtil.getFieldErrorMessage(errors, name);\n\n const inputRef = useRef<HTMLInputElement>(null);\n const hasError = !!errorMessage;\n\n const onMuiRadioGroupChange = useCallback((onChange: ControllerRenderProps<TFieldValues, TName>['onChange']) =>\n (_event: ChangeEvent<unknown>, value: string) => {\n if (onChangeProp) {\n onChangeProp(value);\n }\n onChange(value);\n }\n , [onChangeProp]);\n\n const renderController = useCallback(({ field: { onBlur, onChange, ref, value } }: UseControllerReturn<TFieldValues, TName>) => {\n ref({\n focus: () => {\n inputRef?.current?.focus();\n },\n });\n return (\n <MuiRadioGroup\n aria-labelledby={id}\n onBlur={onBlur}\n onChange={onMuiRadioGroupChange(onChange)}\n row={row}\n value={value}\n >\n { options.map((option, index) => {\n return (\n <FormControlLabel\n key={option.value.toString()}\n {...TestIdUtil.createAttributes('RadioGroup-option', { code: option.value.toString(), description: option.label })}\n control={(\n <Radio\n slotProps={{\n input: {\n ref: index === 0 ? inputRef : undefined,\n },\n }}\n />\n )}\n disabled={disabled}\n label={option.label}\n value={option.value}\n />\n );\n })}\n </MuiRadioGroup>\n );\n }, [id, onMuiRadioGroupChange, row, options, disabled]);\n\n return (\n <FormControl\n error={hasError}\n {...TestIdUtil.createAttributes('RadioGroup', { label, name })}\n fullWidth\n >\n <FormLabel\n component={'legend'}\n id={id}\n required={required}\n >\n {label}\n </FormLabel>\n <Controller\n control={control}\n defaultValue={null}\n name={name}\n render={renderController}\n />\n <FormHelperText sx={{ ml: 0 }}>\n <FormFieldHelperText\n errorMessage={errorMessage}\n infoMessage={infoMessage}\n noIndent\n warningMessage={warningMessage}\n />\n </FormHelperText>\n </FormControl>\n );\n};\n"],"mappings":";;;;;;;;AA8CA,
|
|
1
|
+
{"version":3,"file":"index.js","names":["MuiRadioGroup","FormUtil","RadioGroup$1","RadioGroup","onChangeProp","id","useId","useFormContext","errorMessage","errors","name","inputRef","useRef","hasError","onMuiRadioGroupChange","useCallback","value","onChange","renderController","ref","options","FormControlLabel","TestIdUtil","option","Radio","index","row","disabled","FormControl","FormLabel","label","Controller","FormHelperText","FormFieldHelperText"],"sources":["../../../../src/components/fields/RadioGroup/RadioGroup.tsx"],"sourcesContent":["import type {\n ChangeEvent,\n ReactElement,\n} from 'react';\nimport {\n useCallback,\n useId,\n useRef,\n} from 'react';\nimport {\n FormControl,\n FormControlLabel,\n FormHelperText,\n FormLabel,\n RadioGroup as MuiRadioGroup,\n Radio,\n} from '@mui/material';\nimport {\n Controller,\n useFormContext,\n} from 'react-hook-form';\nimport type {\n ControllerRenderProps,\n FieldValues,\n Path,\n UseControllerReturn,\n} from 'react-hook-form';\nimport { TestIdUtil } from '@gen-epix/ui-core/utils/TestIdUtil';\n\nimport type { RadioButtonOption } from '../../../models/form.models';\nimport { FormUtil } from '../../../utils/FormUtil';\nimport { FormFieldHelperText } from '../../helpers/FormFieldHelperText';\n\nexport type RadioGroupProps<TFieldValues extends FieldValues, TName extends Path<TFieldValues> = Path<TFieldValues>> = {\n readonly disabled?: boolean;\n readonly infoMessage?: string;\n readonly label: string;\n readonly loading?: boolean; // NOT USED YET\n readonly name: TName;\n readonly onChange?: (value: string) => void;\n readonly options: RadioButtonOption[];\n readonly required?: boolean;\n readonly row?: boolean;\n readonly warningMessage?: string;\n};\n\nexport const RadioGroup = <TFieldValues extends FieldValues, TName extends Path<TFieldValues> = Path<TFieldValues>>({\n disabled,\n infoMessage,\n label,\n name,\n onChange: onChangeProp,\n options,\n required,\n row,\n warningMessage,\n}: RadioGroupProps<TFieldValues, TName>): ReactElement => {\n const id = useId();\n const { control, formState: { errors } } = useFormContext<TFieldValues>();\n const errorMessage = FormUtil.getFieldErrorMessage(errors, name);\n\n const inputRef = useRef<HTMLInputElement>(null);\n const hasError = !!errorMessage;\n\n const onMuiRadioGroupChange = useCallback((onChange: ControllerRenderProps<TFieldValues, TName>['onChange']) =>\n (_event: ChangeEvent<unknown>, value: string) => {\n if (onChangeProp) {\n onChangeProp(value);\n }\n onChange(value);\n }\n , [onChangeProp]);\n\n const renderController = useCallback(({ field: { onBlur, onChange, ref, value } }: UseControllerReturn<TFieldValues, TName>) => {\n ref({\n focus: () => {\n inputRef?.current?.focus();\n },\n });\n return (\n <MuiRadioGroup\n aria-labelledby={id}\n onBlur={onBlur}\n onChange={onMuiRadioGroupChange(onChange)}\n row={row}\n value={value}\n >\n { options.map((option, index) => {\n return (\n <FormControlLabel\n key={option.value.toString()}\n {...TestIdUtil.createAttributes('RadioGroup-option', { code: option.value.toString(), description: option.label })}\n control={(\n <Radio\n slotProps={{\n input: {\n ref: index === 0 ? inputRef : undefined,\n },\n }}\n />\n )}\n disabled={disabled}\n label={option.label}\n value={option.value}\n />\n );\n })}\n </MuiRadioGroup>\n );\n }, [id, onMuiRadioGroupChange, row, options, disabled]);\n\n return (\n <FormControl\n error={hasError}\n {...TestIdUtil.createAttributes('RadioGroup', { label, name })}\n fullWidth\n >\n <FormLabel\n component={'legend'}\n id={id}\n required={required}\n >\n {label}\n </FormLabel>\n <Controller\n control={control}\n defaultValue={null}\n name={name}\n render={renderController}\n />\n <FormHelperText sx={{ ml: 0 }}>\n <FormFieldHelperText\n errorMessage={errorMessage}\n infoMessage={infoMessage}\n noIndent\n warningMessage={warningMessage}\n />\n </FormHelperText>\n </FormControl>\n );\n};\n"],"mappings":";;;;;;;;AA8CA,IAAaG,KAAuG,EAClH,aACA,gBACA,UACA,SACA,UAAUC,GACV,YACA,aACA,QACA,wBACwD;CACxD,IAAMC,IAAKC,EAAM,GACX,EAAE,YAAS,WAAW,EAAE,gBAAaC,EAA6B,GAClEC,IAAeP,EAAS,qBAAqBQ,GAAQC,CAAI,GAEzDC,IAAWC,EAAyB,IAAI,GACxCC,IAAW,CAAC,CAACL,GAEbM,IAAwBC,GAAa,OACxC,GAA8B,MAAkB;EAI/C,AAHIX,KACFA,EAAaY,CAAK,GAEpBC,EAASD,CAAK;CAChB,GACA,CAACZ,CAAY,CAAC,GAEVc,IAAmBH,GAAa,EAAE,OAAO,EAAE,WAAQ,aAAU,QAAK,kBACtEI,EAAI,EACF,aAAa;EACX,GAAU,SAAS,MAAM;CAC3B,EACF,CAAC,GAEC,kBAACnB,GAAD;EACE,mBAAiBK;EACT;EACR,UAAUS,EAAsBG,CAAQ;EACnC;EACE;EAEL,UAAAG,EAAQ,KAAK,GAAQ,MAEnB,kBAACC,GAAD;GAEE,GAAIC,EAAW,iBAAiB,qBAAqB;IAAE,MAAMC,EAAO,MAAM,SAAS;IAAG,aAAaA,EAAO;GAAM,CAAC;GACjH,SACE,kBAACC,GAAD,EACE,WAAW,EACT,OAAO,EACL,KAAKC,MAAU,IAAId,IAAW,KAAA,EAChC,EACF,EACD,CAAA;GAEO;GACV,OAAOY,EAAO;GACd,OAAOA,EAAO;EACf,GAdMA,EAAO,MAAM,SAAS,CAc5B,CAEJ;CACY,CAAA,IAEhB;EAAClB;EAAIS;EAAuBY;EAAKN;EAASO;CAAQ,CAAC;CAEtD,OACE,kBAACC,GAAD;EACE,OAAOf;EACP,GAAIS,EAAW,iBAAiB,cAAc;GAAE;GAAO;EAAK,CAAC;EAC7D,WAAA;EAHF,UAAA;GAKE,kBAACO,GAAD;IACE,WAAW;IACP;IACM;IAET,UAAAC;GACQ,CAAA;GACX,kBAACC,GAAD;IACW;IACT,cAAc;IACR;IACN,QAAQb;GACT,CAAA;GACD,kBAACc,GAAD;IAAgB,IAAI,EAAE,IAAI,EAAE;IAC1B,UAAA,kBAACC,GAAD;KACgB;KACD;KACb,UAAA;KACgB;IACjB,CAAA;GACa,CAAA;EACL;;AAEjB"}
|
|
@@ -1,2 +1 @@
|
|
|
1
|
-
|
|
2
|
-
export { e as RichTextEditor, t as RichTextEditorContent };
|
|
1
|
+
export { n as RichTextEditor, t as RichTextEditorContent } from "../../../_chunks/RichTextEditor.js";
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { ReactElement } from 'react';
|
|
2
2
|
import { FieldValues, Path } from 'react-hook-form';
|
|
3
|
-
import { SelectOption } from '../../../models/form';
|
|
3
|
+
import { SelectOption } from '../../../models/form.models';
|
|
4
4
|
export type SelectProps<TFieldValues extends FieldValues, TName extends Path<TFieldValues>, TMultiple extends boolean> = {
|
|
5
5
|
readonly disabled?: boolean;
|
|
6
6
|
readonly infoMessage?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../../../src/components/fields/Select/Select.tsx"],"sourcesContent":["import type { ReactElement } from 'react';\nimport {\n useCallback,\n useId,\n useMemo,\n useRef,\n} from 'react';\nimport {\n Checkbox,\n FormControl,\n FormHelperText,\n IconButton,\n InputAdornment,\n InputLabel,\n ListItemText,\n MenuItem,\n Select as MuiSelect,\n OutlinedInput,\n} from '@mui/material';\nimport type { SelectChangeEvent } from '@mui/material';\nimport ClearIcon from '@mui/icons-material/Clear';\nimport type {\n ControllerRenderProps,\n FieldValues,\n Path,\n UseControllerReturn,\n} from 'react-hook-form';\nimport {\n Controller,\n useFormContext,\n} from 'react-hook-form';\nimport classnames from 'classnames';\nimport { useTranslation } from 'react-i18next';\nimport { TestIdUtil } from '@gen-epix/ui-core/utils/TestIdUtil';\n\nimport type { SelectOption } from '../../../models/form';\nimport { FormUtil } from '../../../utils/FormUtil';\nimport { FormFieldHelperText } from '../../helpers/FormFieldHelperText';\nimport { FormFieldLoadingIndicator } from '../../helpers/FormFieldLoadingIndicator';\n\nexport type SelectProps<TFieldValues extends FieldValues, TName extends Path<TFieldValues>, TMultiple extends boolean> = {\n readonly disabled?: boolean;\n readonly infoMessage?: string;\n readonly label: string;\n readonly loading?: boolean;\n readonly multiple?: TMultiple;\n readonly name: TName;\n readonly onChange?: (value: string) => void;\n readonly options: SelectOption[];\n readonly required?: boolean;\n readonly warningMessage?: string;\n};\n\ntype Value = boolean | number | string;\n\nexport const Select = <TFieldValues extends FieldValues, TName extends Path<TFieldValues> = Path<TFieldValues>, TMultiple extends boolean = false>({\n disabled = false,\n infoMessage,\n label,\n loading = false,\n multiple,\n name,\n onChange: onChangeProp,\n options,\n required = false,\n warningMessage,\n}: SelectProps<TFieldValues, TName, TMultiple>): ReactElement => {\n const { t } = useTranslation();\n const { control, formState: { errors } } = useFormContext<TFieldValues>();\n const errorMessage = FormUtil.getFieldErrorMessage(errors, name);\n const inputRef = useRef<HTMLInputElement>(null);\n const id = useId();\n const labelId = useId();\n const helperTextId = useId();\n\n const hasError = !!errorMessage;\n const hasWarning = !!warningMessage && !hasError;\n\n const mappedOptions = useMemo<Map<Value, SelectOption>>(() => {\n const mapped = new Map<Value, SelectOption>();\n options.forEach(option => {\n mapped.set(option.value, option);\n });\n return mapped;\n }, [options]);\n\n const getIsOptionDisabled = useCallback((value: SelectOption['value']): boolean => mappedOptions.get(value)?.disabled, [mappedOptions]);\n\n const renderValue = useCallback((value: string | string []) => {\n const values = Array.isArray(value) ? value : [value];\n return values.map(v => mappedOptions.get(v)?.label).join(', ');\n }, [mappedOptions]);\n\n const onMuiSelectChange = useCallback((onChange: ControllerRenderProps<TFieldValues, TName>['onChange']) =>\n (event: SelectChangeEvent<string>) => {\n if (onChangeProp) {\n onChangeProp(event.target.value);\n }\n onChange(event.target.value);\n }\n , [onChangeProp]);\n\n const renderController = useCallback(({ field: { onBlur, onChange, ref, value } }: UseControllerReturn<TFieldValues, TName>) => {\n ref({\n focus: () => {\n inputRef?.current?.focus();\n },\n });\n const onResetButtonClick = () => {\n onMuiSelectChange(onChange)({ target: { value: multiple ? [] : '' } } as SelectChangeEvent<string>);\n };\n\n return (\n <>\n <InputLabel\n className={classnames({ 'Mui-warning': hasWarning })}\n disabled={disabled}\n error={hasError}\n htmlFor={id}\n id={labelId}\n required={required && !disabled}\n >\n {label}\n </InputLabel>\n <MuiSelect<TFieldValues[TName]>\n disabled={disabled || loading}\n error={hasError}\n input={(\n <OutlinedInput\n endAdornment={disabled ? undefined : (\n <InputAdornment\n position={'start'}\n sx={{\n position: 'absolute',\n right: theme => theme.spacing(2),\n }}\n >\n <IconButton\n {...TestIdUtil.createAttributes('TextField-reset')}\n aria-label={t`Clear selection`}\n // eslint-disable-next-line @eslint-react/kit/jsx-no-bind\n onClick={onResetButtonClick}\n sx={{\n '& svg': {\n fontSize: '16px',\n },\n }}\n tabIndex={-1}\n >\n <ClearIcon />\n </IconButton>\n </InputAdornment>\n )}\n label={label}\n />\n )}\n inputProps={{\n 'aria-describedby': helperTextId,\n 'aria-label': label,\n 'aria-labelledby': labelId,\n className: classnames({\n 'Mui-warning': hasWarning,\n }),\n id,\n ref: inputRef,\n }}\n multiple={multiple}\n onBlur={onBlur}\n onChange={onMuiSelectChange(onChange)}\n renderValue={renderValue}\n value={value ?? (multiple ? [] : '') as TFieldValues[TName]}\n >\n { options.map((option) => {\n return (\n <MenuItem\n disabled={getIsOptionDisabled(option.value)}\n key={option.value.toString()}\n value={option.value as string}\n >\n\n {multiple && (\n <Checkbox\n checked={(value as string[]).includes(option.value as string)}\n />\n )}\n <ListItemText\n primary={option.label}\n secondary={option.secondaryLabel}\n slotProps={{\n secondary: { sx: { fontSize: '0.875rem', fontStyle: 'italic' } },\n }}\n sx={{\n alignItems: 'baseline',\n display: 'flex',\n gap: 2,\n justifyContent: 'space-between',\n }}\n />\n </MenuItem>\n );\n })}\n </MuiSelect>\n <FormHelperText\n className={classnames({ 'Mui-warning': hasWarning })}\n id={helperTextId}\n sx={{ ml: 0 }}\n >\n <FormFieldHelperText\n errorMessage={errorMessage}\n infoMessage={infoMessage}\n noIndent\n warningMessage={warningMessage}\n />\n </FormHelperText>\n </>\n );\n }, [disabled, infoMessage, errorMessage, getIsOptionDisabled, t, hasError, hasWarning, helperTextId, id, label, labelId, loading, multiple, onMuiSelectChange, options, renderValue, required, warningMessage]);\n\n return (\n <FormControl\n {...TestIdUtil.createAttributes('Select', { label, name })}\n fullWidth\n >\n <Controller\n control={control}\n defaultValue={null}\n name={name}\n render={renderController}\n />\n { !!loading && <FormFieldLoadingIndicator />}\n </FormControl>\n );\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["_Fragment","classnames","MuiSelect","__toESM","require_classnames","Select$1","ClearIcon","Fragment$1","import_classnames","Select","onChangeProp","useTranslation","useFormContext","errorMessage","FormUtil","errors","name","inputRef","useRef","id","useId","labelId","helperTextId","hasError","hasWarning","warningMessage","mappedOptions","useMemo","mapped","options","option","getIsOptionDisabled","useCallback","value","renderValue","v","onMuiSelectChange","event","onChange","renderController","onResetButtonClick","multiple","InputLabel","required","disabled","label","loading","OutlinedInput","InputAdornment","theme","IconButton","TestIdUtil","MenuItem","Checkbox","ListItemText","FormHelperText","FormFieldHelperText","infoMessage","t","FormControl","Controller","FormFieldLoadingIndicator"],"sources":["../../../../src/components/fields/Select/Select.tsx"],"sourcesContent":["import type { ReactElement } from 'react';\nimport {\n useCallback,\n useId,\n useMemo,\n useRef,\n} from 'react';\nimport {\n Checkbox,\n FormControl,\n FormHelperText,\n IconButton,\n InputAdornment,\n InputLabel,\n ListItemText,\n MenuItem,\n Select as MuiSelect,\n OutlinedInput,\n} from '@mui/material';\nimport type { SelectChangeEvent } from '@mui/material';\nimport ClearIcon from '@mui/icons-material/Clear';\nimport type {\n ControllerRenderProps,\n FieldValues,\n Path,\n UseControllerReturn,\n} from 'react-hook-form';\nimport {\n Controller,\n useFormContext,\n} from 'react-hook-form';\nimport classnames from 'classnames';\nimport { useTranslation } from 'react-i18next';\nimport { TestIdUtil } from '@gen-epix/ui-core/utils/TestIdUtil';\n\nimport type { SelectOption } from '../../../models/form.models';\nimport { FormUtil } from '../../../utils/FormUtil';\nimport { FormFieldHelperText } from '../../helpers/FormFieldHelperText';\nimport { FormFieldLoadingIndicator } from '../../helpers/FormFieldLoadingIndicator';\n\nexport type SelectProps<TFieldValues extends FieldValues, TName extends Path<TFieldValues>, TMultiple extends boolean> = {\n readonly disabled?: boolean;\n readonly infoMessage?: string;\n readonly label: string;\n readonly loading?: boolean;\n readonly multiple?: TMultiple;\n readonly name: TName;\n readonly onChange?: (value: string) => void;\n readonly options: SelectOption[];\n readonly required?: boolean;\n readonly warningMessage?: string;\n};\n\ntype Value = boolean | number | string;\n\nexport const Select = <TFieldValues extends FieldValues, TName extends Path<TFieldValues> = Path<TFieldValues>, TMultiple extends boolean = false>({\n disabled = false,\n infoMessage,\n label,\n loading = false,\n multiple,\n name,\n onChange: onChangeProp,\n options,\n required = false,\n warningMessage,\n}: SelectProps<TFieldValues, TName, TMultiple>): ReactElement => {\n const { t } = useTranslation();\n const { control, formState: { errors } } = useFormContext<TFieldValues>();\n const errorMessage = FormUtil.getFieldErrorMessage(errors, name);\n const inputRef = useRef<HTMLInputElement>(null);\n const id = useId();\n const labelId = useId();\n const helperTextId = useId();\n\n const hasError = !!errorMessage;\n const hasWarning = !!warningMessage && !hasError;\n\n const mappedOptions = useMemo<Map<Value, SelectOption>>(() => {\n const mapped = new Map<Value, SelectOption>();\n options.forEach(option => {\n mapped.set(option.value, option);\n });\n return mapped;\n }, [options]);\n\n const getIsOptionDisabled = useCallback((value: SelectOption['value']): boolean => mappedOptions.get(value)?.disabled, [mappedOptions]);\n\n const renderValue = useCallback((value: string | string []) => {\n const values = Array.isArray(value) ? value : [value];\n return values.map(v => mappedOptions.get(v)?.label).join(', ');\n }, [mappedOptions]);\n\n const onMuiSelectChange = useCallback((onChange: ControllerRenderProps<TFieldValues, TName>['onChange']) =>\n (event: SelectChangeEvent<string>) => {\n if (onChangeProp) {\n onChangeProp(event.target.value);\n }\n onChange(event.target.value);\n }\n , [onChangeProp]);\n\n const renderController = useCallback(({ field: { onBlur, onChange, ref, value } }: UseControllerReturn<TFieldValues, TName>) => {\n ref({\n focus: () => {\n inputRef?.current?.focus();\n },\n });\n const onResetButtonClick = () => {\n onMuiSelectChange(onChange)({ target: { value: multiple ? [] : '' } } as SelectChangeEvent<string>);\n };\n\n return (\n <>\n <InputLabel\n className={classnames({ 'Mui-warning': hasWarning })}\n disabled={disabled}\n error={hasError}\n htmlFor={id}\n id={labelId}\n required={required && !disabled}\n >\n {label}\n </InputLabel>\n <MuiSelect<TFieldValues[TName]>\n disabled={disabled || loading}\n error={hasError}\n input={(\n <OutlinedInput\n endAdornment={disabled ? undefined : (\n <InputAdornment\n position={'start'}\n sx={{\n position: 'absolute',\n right: theme => theme.spacing(2),\n }}\n >\n <IconButton\n {...TestIdUtil.createAttributes('TextField-reset')}\n aria-label={t`Clear selection`}\n // eslint-disable-next-line @eslint-react/kit/jsx-no-bind\n onClick={onResetButtonClick}\n sx={{\n '& svg': {\n fontSize: '16px',\n },\n }}\n tabIndex={-1}\n >\n <ClearIcon />\n </IconButton>\n </InputAdornment>\n )}\n label={label}\n />\n )}\n inputProps={{\n 'aria-describedby': helperTextId,\n 'aria-label': label,\n 'aria-labelledby': labelId,\n className: classnames({\n 'Mui-warning': hasWarning,\n }),\n id,\n ref: inputRef,\n }}\n multiple={multiple}\n onBlur={onBlur}\n onChange={onMuiSelectChange(onChange)}\n renderValue={renderValue}\n value={value ?? (multiple ? [] : '') as TFieldValues[TName]}\n >\n { options.map((option) => {\n return (\n <MenuItem\n disabled={getIsOptionDisabled(option.value)}\n key={option.value.toString()}\n value={option.value as string}\n >\n\n {multiple && (\n <Checkbox\n checked={(value as string[]).includes(option.value as string)}\n />\n )}\n <ListItemText\n primary={option.label}\n secondary={option.secondaryLabel}\n slotProps={{\n secondary: { sx: { fontSize: '0.875rem', fontStyle: 'italic' } },\n }}\n sx={{\n alignItems: 'baseline',\n display: 'flex',\n gap: 2,\n justifyContent: 'space-between',\n }}\n />\n </MenuItem>\n );\n })}\n </MuiSelect>\n <FormHelperText\n className={classnames({ 'Mui-warning': hasWarning })}\n id={helperTextId}\n sx={{ ml: 0 }}\n >\n <FormFieldHelperText\n errorMessage={errorMessage}\n infoMessage={infoMessage}\n noIndent\n warningMessage={warningMessage}\n />\n </FormHelperText>\n </>\n );\n }, [disabled, infoMessage, errorMessage, getIsOptionDisabled, t, hasError, hasWarning, helperTextId, id, label, labelId, loading, multiple, onMuiSelectChange, options, renderValue, required, warningMessage]);\n\n return (\n <FormControl\n {...TestIdUtil.createAttributes('Select', { label, name })}\n fullWidth\n >\n <Controller\n control={control}\n defaultValue={null}\n name={name}\n render={renderController}\n />\n { !!loading && <FormFieldLoadingIndicator />}\n </FormControl>\n );\n};\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../../../src/components/fields/Switch/Switch.tsx"],"sourcesContent":["import type {\n ReactElement,\n ReactNode,\n SyntheticEvent,\n} from 'react';\nimport {\n useCallback,\n useRef,\n} from 'react';\nimport {\n Box,\n FormControl,\n FormControlLabel,\n FormHelperText,\n Switch as MuiSwitch,\n} from '@mui/material';\nimport type {\n ControllerRenderProps,\n FieldValues,\n Path,\n UseControllerReturn,\n} from 'react-hook-form';\nimport {\n Controller,\n useFormContext,\n} from 'react-hook-form';\nimport classnames from 'classnames';\nimport { TestIdUtil } from '@gen-epix/ui-core/utils/TestIdUtil';\n\nimport { FormUtil } from '../../../utils/FormUtil';\nimport { FormFieldHelperText } from '../../helpers/FormFieldHelperText';\nimport { FormFieldLoadingIndicator } from '../../helpers/FormFieldLoadingIndicator';\n\nexport type SwitchProps<TFieldValues extends FieldValues, TName extends Path<TFieldValues>> = {\n readonly disabled?: boolean;\n readonly icon?: ReactNode;\n readonly infoMessage?: string;\n readonly label: string;\n readonly loading?: boolean;\n readonly name: TName;\n readonly onChange?: (value: boolean) => void;\n readonly required?: boolean;\n readonly warningMessage?: string;\n};\n\nexport const Switch = <TFieldValues extends FieldValues, TName extends Path<TFieldValues> = Path<TFieldValues>>({\n disabled = false,\n icon,\n infoMessage,\n label,\n loading = false,\n name,\n onChange: onChangeProp,\n warningMessage,\n}: SwitchProps<TFieldValues, TName>): ReactElement => {\n const { control, formState: { errors } } = useFormContext<TFieldValues>();\n const errorMessage = FormUtil.getFieldErrorMessage(errors, name);\n const inputRef = useRef<HTMLInputElement>(null);\n\n const hasError = !!errorMessage;\n const hasWarning = !!warningMessage && !hasError;\n\n const onMuiSwitchChange = useCallback((onChange: ControllerRenderProps<TFieldValues, TName>['onChange']) =>\n (_event: SyntheticEvent, checked: boolean) => {\n if (onChangeProp) {\n onChangeProp(checked);\n }\n onChange(checked);\n }\n , [onChangeProp]);\n\n const renderController = useCallback(({ field: { onBlur, onChange, ref, value } }: UseControllerReturn<TFieldValues, TName>) => {\n ref({\n focus: () => {\n inputRef?.current?.focus();\n },\n });\n return (\n <FormControl\n {...TestIdUtil.createAttributes('Select', { label, name })}\n fullWidth\n >\n <FormControlLabel\n control={(\n <MuiSwitch\n checked={!!value}\n color={'primary'}\n size={'small'}\n slotProps={{\n input: {\n ref: inputRef,\n },\n }}\n />\n )}\n disabled={disabled}\n label={icon ? (\n <Box\n component={'span'}\n sx={{ alignItems: 'center', display: 'flex', gap: 0.5 }}\n >\n {icon}\n {label}\n </Box>\n ) : label}\n onBlur={onBlur}\n onChange={onMuiSwitchChange(onChange)}\n />\n <FormHelperText\n className={classnames({ 'Mui-warning': hasWarning })}\n sx={{ ml: 0 }}\n >\n <FormFieldHelperText\n errorMessage={errorMessage}\n infoMessage={infoMessage}\n noIndent\n warningMessage={warningMessage}\n />\n </FormHelperText>\n { !!loading && <FormFieldLoadingIndicator />}\n </FormControl>\n\n );\n }, [disabled, infoMessage, errorMessage, hasWarning, icon, label, loading, name, onMuiSwitchChange, warningMessage]);\n\n return (\n\n <Controller\n control={control}\n defaultValue={null}\n name={name}\n render={renderController}\n />\n\n );\n};\n"],"mappings":";;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"index.js","names":["MuiSwitch","classnames","__toESM","require_classnames","Switch$1","import_classnames","Switch","onChangeProp","useFormContext","errorMessage","FormUtil","errors","name","inputRef","useRef","hasWarning","warningMessage","onMuiSwitchChange","useCallback","checked","onChange","renderController","ref","FormControl","TestIdUtil","FormControlLabel","value","icon","Box","label","FormHelperText","FormFieldHelperText","loading","FormFieldLoadingIndicator","disabled","infoMessage","Controller"],"sources":["../../../../src/components/fields/Switch/Switch.tsx"],"sourcesContent":["import type {\n ReactElement,\n ReactNode,\n SyntheticEvent,\n} from 'react';\nimport {\n useCallback,\n useRef,\n} from 'react';\nimport {\n Box,\n FormControl,\n FormControlLabel,\n FormHelperText,\n Switch as MuiSwitch,\n} from '@mui/material';\nimport type {\n ControllerRenderProps,\n FieldValues,\n Path,\n UseControllerReturn,\n} from 'react-hook-form';\nimport {\n Controller,\n useFormContext,\n} from 'react-hook-form';\nimport classnames from 'classnames';\nimport { TestIdUtil } from '@gen-epix/ui-core/utils/TestIdUtil';\n\nimport { FormUtil } from '../../../utils/FormUtil';\nimport { FormFieldHelperText } from '../../helpers/FormFieldHelperText';\nimport { FormFieldLoadingIndicator } from '../../helpers/FormFieldLoadingIndicator';\n\nexport type SwitchProps<TFieldValues extends FieldValues, TName extends Path<TFieldValues>> = {\n readonly disabled?: boolean;\n readonly icon?: ReactNode;\n readonly infoMessage?: string;\n readonly label: string;\n readonly loading?: boolean;\n readonly name: TName;\n readonly onChange?: (value: boolean) => void;\n readonly required?: boolean;\n readonly warningMessage?: string;\n};\n\nexport const Switch = <TFieldValues extends FieldValues, TName extends Path<TFieldValues> = Path<TFieldValues>>({\n disabled = false,\n icon,\n infoMessage,\n label,\n loading = false,\n name,\n onChange: onChangeProp,\n warningMessage,\n}: SwitchProps<TFieldValues, TName>): ReactElement => {\n const { control, formState: { errors } } = useFormContext<TFieldValues>();\n const errorMessage = FormUtil.getFieldErrorMessage(errors, name);\n const inputRef = useRef<HTMLInputElement>(null);\n\n const hasError = !!errorMessage;\n const hasWarning = !!warningMessage && !hasError;\n\n const onMuiSwitchChange = useCallback((onChange: ControllerRenderProps<TFieldValues, TName>['onChange']) =>\n (_event: SyntheticEvent, checked: boolean) => {\n if (onChangeProp) {\n onChangeProp(checked);\n }\n onChange(checked);\n }\n , [onChangeProp]);\n\n const renderController = useCallback(({ field: { onBlur, onChange, ref, value } }: UseControllerReturn<TFieldValues, TName>) => {\n ref({\n focus: () => {\n inputRef?.current?.focus();\n },\n });\n return (\n <FormControl\n {...TestIdUtil.createAttributes('Select', { label, name })}\n fullWidth\n >\n <FormControlLabel\n control={(\n <MuiSwitch\n checked={!!value}\n color={'primary'}\n size={'small'}\n slotProps={{\n input: {\n ref: inputRef,\n },\n }}\n />\n )}\n disabled={disabled}\n label={icon ? (\n <Box\n component={'span'}\n sx={{ alignItems: 'center', display: 'flex', gap: 0.5 }}\n >\n {icon}\n {label}\n </Box>\n ) : label}\n onBlur={onBlur}\n onChange={onMuiSwitchChange(onChange)}\n />\n <FormHelperText\n className={classnames({ 'Mui-warning': hasWarning })}\n sx={{ ml: 0 }}\n >\n <FormFieldHelperText\n errorMessage={errorMessage}\n infoMessage={infoMessage}\n noIndent\n warningMessage={warningMessage}\n />\n </FormHelperText>\n { !!loading && <FormFieldLoadingIndicator />}\n </FormControl>\n\n );\n }, [disabled, infoMessage, errorMessage, hasWarning, icon, label, loading, name, onMuiSwitchChange, warningMessage]);\n\n return (\n\n <Controller\n control={control}\n defaultValue={null}\n name={name}\n render={renderController}\n />\n\n );\n};\n"],"mappings":";;;;;;;;;;;mCA6CaM,KAAmG,EAC9G,cAAW,IACX,SACA,gBACA,UACA,aAAU,IACV,SACA,UAAUC,GACV,wBACoD;CACpD,IAAM,EAAE,YAAS,WAAW,EAAE,gBAAaC,EAA6B,GAClEC,IAAeC,EAAS,qBAAqBC,GAAQC,CAAI,GACzDC,IAAWC,EAAyB,IAAI,GAGxCC,IAAa,CAAC,CAACC,KAAkB,CADpBP,GAGbQ,IAAoBC,GAAa,OACpC,GAAwB,MAAqB;EAI5C,AAHIX,KACFA,EAAaY,CAAO,GAEtBC,EAASD,CAAO;CAClB,GACA,CAACZ,CAAY,CAAC,GAEVc,IAAmBH,GAAa,EAAE,OAAO,EAAE,WAAQ,aAAU,QAAK,kBACtEI,EAAI,EACF,aAAa;EACX,GAAU,SAAS,MAAM;CAC3B,EACF,CAAC,GAEC,kBAACC,GAAD;EACE,GAAIC,EAAW,iBAAiB,UAAU;GAAE;GAAO;EAAK,CAAC;EACzD,WAAA;EAFF,UAAA;GAIE,kBAACC,GAAD;IACE,SACE,kBAACzB,GAAD;KACE,SAAS,CAAC,CAAC0B;KACX,OAAO;KACP,MAAM;KACN,WAAW,EACT,OAAO,EACL,KAAKb,EACP,EACF;IACD,CAAA;IAEO;IACV,OAAOc,IACL,kBAACC,GAAD;KACE,WAAW;KACX,IAAI;MAAE,YAAY;MAAU,SAAS;MAAQ,KAAK;KAAI;KAFxD,UAAA,CAIGD,GACAE,CACE;IACH,CAAA,IAAAA;IACI;IACR,UAAUZ,EAAkBG,CAAQ;GACrC,CAAA;GACD,kBAACU,GAAD;IACE,YAAA,GAAW7B,EAAAA,QAAAA,CAAW,EAAE,eAAec,EAAW,CAAC;IACnD,IAAI,EAAE,IAAI,EAAE;IAEZ,UAAA,kBAACgB,GAAD;KACgB;KACD;KACb,UAAA;KACgB;IACjB,CAAA;GACa,CAAA;GACd,CAAC,CAACC,KAAW,kBAACC,GAAD,CAA4B,CAAA;EAChC;MAGd;EAACC;EAAUC;EAAa1B;EAAcM;EAAYY;EAAME;EAAOG;EAASpB;EAAMK;EAAmBD;CAAc,CAAC;CAEnH,OAEE,kBAACoB,GAAD;EACW;EACT,cAAc;EACR;EACN,QAAQf;CACT,CAAA;AAGL"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../../../src/components/fields/TextField/TextField.tsx"],"sourcesContent":["import type {\n ChangeEvent,\n InputHTMLAttributes,\n ReactElement,\n} from 'react';\nimport {\n useCallback,\n useRef,\n} from 'react';\nimport {\n FormControl,\n IconButton,\n InputAdornment,\n TextField as MuiTextField,\n} from '@mui/material';\nimport ClearIcon from '@mui/icons-material/Clear';\nimport type {\n ControllerRenderProps,\n FieldValues,\n Path,\n PathValue,\n UseControllerReturn,\n} from 'react-hook-form';\nimport {\n Controller,\n useFormContext,\n} from 'react-hook-form';\nimport classnames from 'classnames';\nimport { useTranslation } from 'react-i18next';\nimport { TestIdUtil } from '@gen-epix/ui-core/utils/TestIdUtil';\n\nimport { FormUtil } from '../../../utils/FormUtil';\nimport { FormFieldHelperText } from '../../helpers/FormFieldHelperText';\nimport { FormFieldLoadingIndicator } from '../../helpers/FormFieldLoadingIndicator';\n\nexport type TextFieldProps<TFieldValues extends FieldValues, TName extends Path<TFieldValues> = Path<TFieldValues>> = {\n readonly autocomplete?: string;\n readonly disabled?: boolean;\n readonly infoMessage?: string;\n readonly label: string;\n readonly loading?: boolean;\n readonly multiline?: boolean;\n readonly name: TName;\n readonly onChange?: (value: string) => void;\n readonly placeholder?: string;\n readonly required?: boolean;\n readonly rows?: number;\n readonly type?: InputHTMLAttributes<unknown>['type'];\n readonly warningMessage?: string;\n};\n\nexport const TextField = <TFieldValues extends FieldValues, TName extends Path<TFieldValues> = Path<TFieldValues>>({\n autocomplete,\n disabled = false,\n infoMessage,\n label,\n loading = false,\n multiline = false,\n name,\n onChange: onChangeProp,\n placeholder,\n required = false,\n rows = 3,\n type = 'text',\n warningMessage,\n}: TextFieldProps<TFieldValues, TName>): ReactElement => {\n const { t } = useTranslation();\n const { control, formState: { errors } } = useFormContext<TFieldValues>();\n const errorMessage = FormUtil.getFieldErrorMessage(errors, name);\n const hasError = !!errorMessage;\n const hasWarning = !!warningMessage && !hasError;\n const inputRef = useRef<HTMLInputElement>(null);\n\n const onMuiTextFieldChange = useCallback((onChange: ControllerRenderProps<TFieldValues, TName>['onChange']) =>\n (event: ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => {\n const value = event.target.value;\n if (onChangeProp) {\n onChangeProp(value);\n }\n onChange(value);\n }\n , [onChangeProp]);\n\n const renderController = useCallback(({ field: { onBlur, onChange, ref, value } }: UseControllerReturn<TFieldValues, TName>) => {\n ref({\n focus: () => {\n inputRef?.current?.focus();\n },\n });\n\n const onResetButtonClick = () => {\n onChange('');\n };\n\n return (\n <MuiTextField\n disabled={disabled || loading}\n error={hasError}\n helperText={(\n <FormFieldHelperText\n errorMessage={errorMessage}\n infoMessage={infoMessage}\n warningMessage={warningMessage}\n />\n )}\n inputRef={inputRef}\n label={label}\n multiline={multiline}\n onBlur={onBlur}\n onChange={onMuiTextFieldChange(onChange)}\n placeholder={placeholder}\n rows={rows}\n slotProps={{\n formHelperText: {\n className: classnames({ 'Mui-warning': hasWarning }),\n },\n input: {\n className: classnames({ 'Mui-warning': hasWarning }),\n endAdornment: disabled ? undefined : (\n <InputAdornment position={'end'}>\n <IconButton\n {...TestIdUtil.createAttributes('TextField-reset')}\n aria-label={t`Clear text field`}\n // eslint-disable-next-line @eslint-react/kit/jsx-no-bind\n onClick={onResetButtonClick}\n sx={{\n '& svg': {\n fontSize: '16px',\n },\n }}\n tabIndex={-1}\n >\n <ClearIcon />\n </IconButton>\n </InputAdornment>\n ),\n inputProps: {\n autoComplete: autocomplete ?? name,\n type,\n },\n },\n inputLabel: {\n className: classnames({ 'Mui-warning': hasWarning }),\n required: required && !disabled,\n },\n }}\n value={value ?? ''}\n variant={'outlined'}\n />\n );\n }, [disabled, loading, infoMessage, hasError, errorMessage, warningMessage, label, multiline, placeholder, rows, hasWarning, autocomplete, name, type, t, required, onMuiTextFieldChange]);\n\n return (\n <FormControl\n {...TestIdUtil.createAttributes('TextField', { label, name })}\n fullWidth\n sx={{\n '&:hover button, &:focus-within button': {\n display: 'initial',\n },\n button: {\n display: 'none',\n },\n }}\n >\n <Controller\n control={control}\n defaultValue={'' as PathValue<TFieldValues, TName>}\n name={name}\n render={renderController}\n />\n { !!loading && <FormFieldLoadingIndicator />}\n </FormControl>\n );\n};\n"],"mappings":";;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"index.js","names":["MuiTextField","classnames","__toESM","require_classnames","TextField$1","ClearIcon","import_classnames","TextField","onChangeProp","useTranslation","useFormContext","errorMessage","FormUtil","errors","name","hasError","hasWarning","warningMessage","inputRef","useRef","onMuiTextFieldChange","useCallback","value","event","onChange","renderController","onResetButtonClick","disabled","loading","FormFieldHelperText","InputAdornment","IconButton","TestIdUtil","autocomplete","required","infoMessage","label","multiline","placeholder","rows","type","t","FormControl","Controller","FormFieldLoadingIndicator"],"sources":["../../../../src/components/fields/TextField/TextField.tsx"],"sourcesContent":["import type {\n ChangeEvent,\n InputHTMLAttributes,\n ReactElement,\n} from 'react';\nimport {\n useCallback,\n useRef,\n} from 'react';\nimport {\n FormControl,\n IconButton,\n InputAdornment,\n TextField as MuiTextField,\n} from '@mui/material';\nimport ClearIcon from '@mui/icons-material/Clear';\nimport type {\n ControllerRenderProps,\n FieldValues,\n Path,\n PathValue,\n UseControllerReturn,\n} from 'react-hook-form';\nimport {\n Controller,\n useFormContext,\n} from 'react-hook-form';\nimport classnames from 'classnames';\nimport { useTranslation } from 'react-i18next';\nimport { TestIdUtil } from '@gen-epix/ui-core/utils/TestIdUtil';\n\nimport { FormUtil } from '../../../utils/FormUtil';\nimport { FormFieldHelperText } from '../../helpers/FormFieldHelperText';\nimport { FormFieldLoadingIndicator } from '../../helpers/FormFieldLoadingIndicator';\n\nexport type TextFieldProps<TFieldValues extends FieldValues, TName extends Path<TFieldValues> = Path<TFieldValues>> = {\n readonly autocomplete?: string;\n readonly disabled?: boolean;\n readonly infoMessage?: string;\n readonly label: string;\n readonly loading?: boolean;\n readonly multiline?: boolean;\n readonly name: TName;\n readonly onChange?: (value: string) => void;\n readonly placeholder?: string;\n readonly required?: boolean;\n readonly rows?: number;\n readonly type?: InputHTMLAttributes<unknown>['type'];\n readonly warningMessage?: string;\n};\n\nexport const TextField = <TFieldValues extends FieldValues, TName extends Path<TFieldValues> = Path<TFieldValues>>({\n autocomplete,\n disabled = false,\n infoMessage,\n label,\n loading = false,\n multiline = false,\n name,\n onChange: onChangeProp,\n placeholder,\n required = false,\n rows = 3,\n type = 'text',\n warningMessage,\n}: TextFieldProps<TFieldValues, TName>): ReactElement => {\n const { t } = useTranslation();\n const { control, formState: { errors } } = useFormContext<TFieldValues>();\n const errorMessage = FormUtil.getFieldErrorMessage(errors, name);\n const hasError = !!errorMessage;\n const hasWarning = !!warningMessage && !hasError;\n const inputRef = useRef<HTMLInputElement>(null);\n\n const onMuiTextFieldChange = useCallback((onChange: ControllerRenderProps<TFieldValues, TName>['onChange']) =>\n (event: ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => {\n const value = event.target.value;\n if (onChangeProp) {\n onChangeProp(value);\n }\n onChange(value);\n }\n , [onChangeProp]);\n\n const renderController = useCallback(({ field: { onBlur, onChange, ref, value } }: UseControllerReturn<TFieldValues, TName>) => {\n ref({\n focus: () => {\n inputRef?.current?.focus();\n },\n });\n\n const onResetButtonClick = () => {\n onChange('');\n };\n\n return (\n <MuiTextField\n disabled={disabled || loading}\n error={hasError}\n helperText={(\n <FormFieldHelperText\n errorMessage={errorMessage}\n infoMessage={infoMessage}\n warningMessage={warningMessage}\n />\n )}\n inputRef={inputRef}\n label={label}\n multiline={multiline}\n onBlur={onBlur}\n onChange={onMuiTextFieldChange(onChange)}\n placeholder={placeholder}\n rows={rows}\n slotProps={{\n formHelperText: {\n className: classnames({ 'Mui-warning': hasWarning }),\n },\n input: {\n className: classnames({ 'Mui-warning': hasWarning }),\n endAdornment: disabled ? undefined : (\n <InputAdornment position={'end'}>\n <IconButton\n {...TestIdUtil.createAttributes('TextField-reset')}\n aria-label={t`Clear text field`}\n // eslint-disable-next-line @eslint-react/kit/jsx-no-bind\n onClick={onResetButtonClick}\n sx={{\n '& svg': {\n fontSize: '16px',\n },\n }}\n tabIndex={-1}\n >\n <ClearIcon />\n </IconButton>\n </InputAdornment>\n ),\n inputProps: {\n autoComplete: autocomplete ?? name,\n type,\n },\n },\n inputLabel: {\n className: classnames({ 'Mui-warning': hasWarning }),\n required: required && !disabled,\n },\n }}\n value={value ?? ''}\n variant={'outlined'}\n />\n );\n }, [disabled, loading, infoMessage, hasError, errorMessage, warningMessage, label, multiline, placeholder, rows, hasWarning, autocomplete, name, type, t, required, onMuiTextFieldChange]);\n\n return (\n <FormControl\n {...TestIdUtil.createAttributes('TextField', { label, name })}\n fullWidth\n sx={{\n '&:hover button, &:focus-within button': {\n display: 'initial',\n },\n button: {\n display: 'none',\n },\n }}\n >\n <Controller\n control={control}\n defaultValue={'' as PathValue<TFieldValues, TName>}\n name={name}\n render={renderController}\n />\n { !!loading && <FormFieldLoadingIndicator />}\n </FormControl>\n );\n};\n"],"mappings":";;;;;;;;;;;;;mCAmDaO,KAAsG,EACjH,iBACA,cAAW,IACX,gBACA,UACA,aAAU,IACV,eAAY,IACZ,SACA,UAAUC,GACV,gBACA,cAAW,IACX,UAAO,GACP,UAAO,QACP,wBACuD;CACvD,IAAM,EAAE,SAAMC,EAAe,GACvB,EAAE,YAAS,WAAW,EAAE,gBAAaC,EAA6B,GAClEC,IAAeC,EAAS,qBAAqBC,GAAQC,CAAI,GACzDC,IAAW,CAAC,CAACJ,GACbK,IAAa,CAAC,CAACC,KAAkB,CAACF,GAClCG,IAAWC,EAAyB,IAAI,GAExCC,IAAuBC,GAAa,OACvC,MAA+D;EAC9D,IAAMC,IAAQC,EAAM,OAAO;EAI3B,AAHIf,KACFA,EAAac,CAAK,GAEpBE,EAASF,CAAK;CAChB,GACA,CAACd,CAAY,CAAC,GAEViB,IAAmBJ,GAAa,EAAE,OAAO,EAAE,WAAQ,aAAU,QAAK,iBAAwD;EAC9H,EAAI,EACF,aAAa;GACX,GAAU,SAAS,MAAM;EAC3B,EACF,CAAC;EAED,IAAMK,UAA2B;GAC/B,EAAS,EAAE;EACb;EAEA,OACE,kBAAC1B,GAAD;GACE,UAAU2B,KAAYC;GACtB,OAAOb;GACP,YACE,kBAACc,GAAD;IACgB;IACD;IACG;GACjB,CAAA;GAEO;GACH;GACI;GACH;GACR,UAAUT,EAAqBI,CAAQ;GAC1B;GACP;GACN,WAAW;IACT,gBAAgB,EACd,YAAA,GAAWvB,EAAAA,QAAAA,CAAW,EAAE,eAAee,EAAW,CAAC,EACrD;IACA,OAAO;KACL,YAAA,GAAWf,EAAAA,QAAAA,CAAW,EAAE,eAAee,EAAW,CAAC;KACnD,cAAcW,IAAW,KAAA,IACvB,kBAACG,GAAD;MAAgB,UAAU;MACxB,UAAA,kBAACC,GAAD;OACE,GAAIC,EAAW,iBAAiB,iBAAiB;OACjD,cAAY,CAAC;OAEb,SAASN;OACT,IAAI,EACF,SAAS,EACP,UAAU,OACZ,EACF;OACA,UAAU;OAEV,UAAA,kBAACrB,GAAD,CAAY,CAAA;MACF,CAAA;KACE,CAAA;KAElB,YAAY;MACV,cAAc4B,KAAgBnB;MAC9B;KACF;IACF;IACA,YAAY;KACV,YAAA,GAAWb,EAAAA,QAAAA,CAAW,EAAE,eAAee,EAAW,CAAC;KACnD,UAAUkB,KAAY,CAACP;IACzB;GACF;GACA,OAAOL,KAAS;GAChB,SAAS;EACV,CAAA;CAEL,GAAG;EAACK;EAAUC;EAASO;EAAapB;EAAUJ;EAAcM;EAAgBmB;EAAOC;EAAWC;EAAaC;EAAMvB;EAAYiB;EAAcnB;EAAM0B;EAAMC;EAAGP;EAAUd;CAAoB,CAAC;CAEzL,OACE,kBAACsB,GAAD;EACE,GAAIV,EAAW,iBAAiB,aAAa;GAAE;GAAO;EAAK,CAAC;EAC5D,WAAA;EACA,IAAI;GACF,yCAAyC,EACvC,SAAS,UACX;GACA,QAAQ,EACN,SAAS,OACX;EACF;EAVF,UAAA,CAYE,kBAACW,GAAD;GACW;GACT,cAAc;GACR;GACN,QAAQlB;EACT,CAAA,GACC,CAAC,CAACG,KAAW,kBAACgB,GAAD,CAA4B,CAAA,CAChC;;AAEjB"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { ReactElement } from 'react';
|
|
2
2
|
import { FieldValues, Path } from 'react-hook-form';
|
|
3
|
-
import { ToggleButtonOption } from '../../../models/form';
|
|
3
|
+
import { ToggleButtonOption } from '../../../models/form.models';
|
|
4
4
|
export type ToggleButtonProps<TFieldValues extends FieldValues, TName extends Path<TFieldValues> = Path<TFieldValues>> = {
|
|
5
5
|
readonly disabled?: boolean;
|
|
6
6
|
readonly infoMessage?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../../../src/components/fields/ToggleButtonGroup/ToggleButtonGroup.tsx"],"sourcesContent":["import type {\n ChangeEvent,\n ReactElement,\n} from 'react';\nimport {\n useCallback,\n useRef,\n} from 'react';\nimport {\n FormControl,\n FormHelperText,\n ToggleButtonGroup as MuiToggleButtonGroup,\n ToggleButton,\n} from '@mui/material';\nimport {\n Controller,\n useFormContext,\n} from 'react-hook-form';\nimport type {\n ControllerRenderProps,\n FieldValues,\n Path,\n UseControllerReturn,\n} from 'react-hook-form';\nimport { TestIdUtil } from '@gen-epix/ui-core/utils/TestIdUtil';\n\nimport type { ToggleButtonOption } from '../../../models/form';\nimport { FormUtil } from '../../../utils/FormUtil';\nimport { FormFieldHelperText } from '../../helpers/FormFieldHelperText';\n\nexport type ToggleButtonProps<TFieldValues extends FieldValues, TName extends Path<TFieldValues> = Path<TFieldValues>> = {\n readonly disabled?: boolean;\n readonly infoMessage?: string;\n readonly name: TName;\n readonly onChange?: (value: string) => void;\n readonly options: ToggleButtonOption[];\n readonly required?: boolean;\n readonly row?: boolean;\n readonly warningMessage?: string;\n};\n\nexport const ToggleButtonGroup = <TFieldValues extends FieldValues, TName extends Path<TFieldValues> = Path<TFieldValues>>({\n disabled,\n infoMessage,\n name,\n onChange: onChangeProp,\n options,\n required,\n warningMessage,\n}: ToggleButtonProps<TFieldValues, TName>): ReactElement => {\n const { control, formState: { errors } } = useFormContext<TFieldValues>();\n const errorMessage = FormUtil.getFieldErrorMessage(errors, name);\n\n const inputRef = useRef<HTMLInputElement>(null);\n const hasError = !!errorMessage;\n\n const onMuiToggleButtonChange = useCallback((onChange: ControllerRenderProps<TFieldValues, TName>['onChange']) =>\n (_event: ChangeEvent<unknown>, value: string) => {\n if (required && value === null) {\n return;\n }\n if (onChangeProp) {\n onChangeProp(value);\n }\n onChange(value);\n }\n , [onChangeProp, required]);\n\n const renderController = useCallback(({ field: { onBlur, onChange, ref, value } }: UseControllerReturn<TFieldValues, TName>) => {\n ref({\n focus: () => {\n inputRef?.current?.focus();\n },\n });\n return (\n <MuiToggleButtonGroup\n color={'primary'}\n exclusive\n onBlur={onBlur}\n onChange={onMuiToggleButtonChange(onChange)}\n value={value}\n >\n { options.map((option) => {\n return (\n <ToggleButton\n key={option.value.toString()}\n {...TestIdUtil.createAttributes('ToggleButton-option', { code: option.value.toString(), description: option.label })}\n disabled={disabled}\n value={option.value}\n >\n {option.label}\n </ToggleButton>\n );\n })}\n </MuiToggleButtonGroup>\n );\n }, [onMuiToggleButtonChange, options, disabled]);\n\n return (\n <FormControl\n error={hasError}\n {...TestIdUtil.createAttributes('ToggleButtonGroup', { name })}\n fullWidth\n >\n <Controller\n control={control}\n defaultValue={null}\n name={name}\n render={renderController}\n />\n <FormHelperText sx={{ ml: 0 }}>\n <FormFieldHelperText\n errorMessage={errorMessage}\n infoMessage={infoMessage}\n noIndent\n warningMessage={warningMessage}\n />\n </FormHelperText>\n </FormControl>\n );\n};\n"],"mappings":";;;;;;;;AAyCA,
|
|
1
|
+
{"version":3,"file":"index.js","names":["MuiToggleButtonGroup","FormUtil","ToggleButtonGroup$1","ToggleButtonGroup","onChangeProp","useFormContext","errorMessage","errors","name","inputRef","useRef","hasError","onMuiToggleButtonChange","useCallback","required","value","onChange","renderController","ref","options","ToggleButton","TestIdUtil","option","disabled","FormControl","Controller","FormHelperText","FormFieldHelperText"],"sources":["../../../../src/components/fields/ToggleButtonGroup/ToggleButtonGroup.tsx"],"sourcesContent":["import type {\n ChangeEvent,\n ReactElement,\n} from 'react';\nimport {\n useCallback,\n useRef,\n} from 'react';\nimport {\n FormControl,\n FormHelperText,\n ToggleButtonGroup as MuiToggleButtonGroup,\n ToggleButton,\n} from '@mui/material';\nimport {\n Controller,\n useFormContext,\n} from 'react-hook-form';\nimport type {\n ControllerRenderProps,\n FieldValues,\n Path,\n UseControllerReturn,\n} from 'react-hook-form';\nimport { TestIdUtil } from '@gen-epix/ui-core/utils/TestIdUtil';\n\nimport type { ToggleButtonOption } from '../../../models/form.models';\nimport { FormUtil } from '../../../utils/FormUtil';\nimport { FormFieldHelperText } from '../../helpers/FormFieldHelperText';\n\nexport type ToggleButtonProps<TFieldValues extends FieldValues, TName extends Path<TFieldValues> = Path<TFieldValues>> = {\n readonly disabled?: boolean;\n readonly infoMessage?: string;\n readonly name: TName;\n readonly onChange?: (value: string) => void;\n readonly options: ToggleButtonOption[];\n readonly required?: boolean;\n readonly row?: boolean;\n readonly warningMessage?: string;\n};\n\nexport const ToggleButtonGroup = <TFieldValues extends FieldValues, TName extends Path<TFieldValues> = Path<TFieldValues>>({\n disabled,\n infoMessage,\n name,\n onChange: onChangeProp,\n options,\n required,\n warningMessage,\n}: ToggleButtonProps<TFieldValues, TName>): ReactElement => {\n const { control, formState: { errors } } = useFormContext<TFieldValues>();\n const errorMessage = FormUtil.getFieldErrorMessage(errors, name);\n\n const inputRef = useRef<HTMLInputElement>(null);\n const hasError = !!errorMessage;\n\n const onMuiToggleButtonChange = useCallback((onChange: ControllerRenderProps<TFieldValues, TName>['onChange']) =>\n (_event: ChangeEvent<unknown>, value: string) => {\n if (required && value === null) {\n return;\n }\n if (onChangeProp) {\n onChangeProp(value);\n }\n onChange(value);\n }\n , [onChangeProp, required]);\n\n const renderController = useCallback(({ field: { onBlur, onChange, ref, value } }: UseControllerReturn<TFieldValues, TName>) => {\n ref({\n focus: () => {\n inputRef?.current?.focus();\n },\n });\n return (\n <MuiToggleButtonGroup\n color={'primary'}\n exclusive\n onBlur={onBlur}\n onChange={onMuiToggleButtonChange(onChange)}\n value={value}\n >\n { options.map((option) => {\n return (\n <ToggleButton\n key={option.value.toString()}\n {...TestIdUtil.createAttributes('ToggleButton-option', { code: option.value.toString(), description: option.label })}\n disabled={disabled}\n value={option.value}\n >\n {option.label}\n </ToggleButton>\n );\n })}\n </MuiToggleButtonGroup>\n );\n }, [onMuiToggleButtonChange, options, disabled]);\n\n return (\n <FormControl\n error={hasError}\n {...TestIdUtil.createAttributes('ToggleButtonGroup', { name })}\n fullWidth\n >\n <Controller\n control={control}\n defaultValue={null}\n name={name}\n render={renderController}\n />\n <FormHelperText sx={{ ml: 0 }}>\n <FormFieldHelperText\n errorMessage={errorMessage}\n infoMessage={infoMessage}\n noIndent\n warningMessage={warningMessage}\n />\n </FormHelperText>\n </FormControl>\n );\n};\n"],"mappings":";;;;;;;;AAyCA,IAAaG,KAA8G,EACzH,aACA,gBACA,SACA,UAAUC,GACV,YACA,aACA,wBAC0D;CAC1D,IAAM,EAAE,YAAS,WAAW,EAAE,gBAAaC,EAA6B,GAClEC,IAAeL,EAAS,qBAAqBM,GAAQC,CAAI,GAEzDC,IAAWC,EAAyB,IAAI,GACxCC,IAAW,CAAC,CAACL,GAEbM,IAA0BC,GAAa,OAC1C,GAA8B,MAAkB;EAC/C,AAAIC,KAAYC,MAAU,SAGtBX,KACFA,EAAaW,CAAK,GAEpBC,EAASD,CAAK;CAChB,GACA,CAACX,GAAcU,CAAQ,CAAC,GAEpBG,IAAmBJ,GAAa,EAAE,OAAO,EAAE,WAAQ,aAAU,QAAK,kBACtEK,EAAI,EACF,aAAa;EACX,GAAU,SAAS,MAAM;CAC3B,EACF,CAAC,GAEC,kBAAClB,GAAD;EACE,OAAO;EACP,WAAA;EACQ;EACR,UAAUY,EAAwBI,CAAQ;EACnC;EAEL,UAAAG,EAAQ,KAAK,MAEX,kBAACC,GAAD;GAEE,GAAIC,EAAW,iBAAiB,uBAAuB;IAAE,MAAMC,EAAO,MAAM,SAAS;IAAG,aAAaA,EAAO;GAAM,CAAC;GACzG;GACV,OAAOA,EAAO;GAEb,UAAAA,EAAO;EACI,GANPA,EAAO,MAAM,SAAS,CAMf,CAEjB;CACmB,CAAA,IAEvB;EAACV;EAAyBO;EAASI;CAAQ,CAAC;CAE/C,OACE,kBAACC,GAAD;EACE,OAAOb;EACP,GAAIU,EAAW,iBAAiB,qBAAqB,EAAE,QAAK,CAAC;EAC7D,WAAA;EAHF,UAAA,CAKE,kBAACI,GAAD;GACW;GACT,cAAc;GACR;GACN,QAAQR;EACT,CAAA,GACD,kBAACS,GAAD;GAAgB,IAAI,EAAE,IAAI,EAAE;GAC1B,UAAA,kBAACC,GAAD;IACgB;IACD;IACb,UAAA;IACgB;GACjB,CAAA;EACa,CAAA,CACL;;AAEjB"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { ReactElement } from 'react';
|
|
2
2
|
import { FieldValues, Path } from 'react-hook-form';
|
|
3
|
-
import { TransferListOption } from '../../../models/form';
|
|
3
|
+
import { TransferListOption } from '../../../models/form.models';
|
|
4
4
|
export type TransferListProps<TFieldValues extends FieldValues, TName extends Path<TFieldValues> = Path<TFieldValues>> = {
|
|
5
5
|
readonly disabled?: boolean;
|
|
6
6
|
readonly height?: number;
|
|
@@ -1,2 +1 @@
|
|
|
1
|
-
|
|
2
|
-
export { e as TransferList };
|
|
1
|
+
export { t as TransferList } from "../../../_chunks/TransferList.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../../../src/components/helpers/FormFieldHelperText/FormFieldHelperText.tsx"],"sourcesContent":["import type {\n SxProps,\n Theme,\n} from '@mui/material';\nimport {\n Box,\n FormHelperText,\n useTheme,\n} from '@mui/material';\nimport ErrorIcon from '@mui/icons-material/Error';\nimport WarningIcon from '@mui/icons-material/WarningAmber';\nimport InfoOutlinedIcon from '@mui/icons-material/InfoOutlined';\nimport type { ReactElement } from 'react';\nimport { TestIdUtil } from '@gen-epix/ui-core/utils/TestIdUtil';\n\nexport type FormFieldHelperTextProps = {\n readonly errorMessage?: string;\n readonly infoMessage?: string;\n readonly noIndent?: boolean;\n readonly warningMessage?: string;\n};\n\nconst iconStyle: SxProps<Theme> = {\n height: '13px',\n marginRight: '1px',\n position: 'relative',\n top: '3px',\n width: '13px',\n};\n\nexport const FormFieldHelperText = ({\n errorMessage,\n infoMessage,\n noIndent,\n warningMessage,\n}: FormFieldHelperTextProps): ReactElement => {\n const testIdAttributes = TestIdUtil.createAttributes('FormFieldHelperText');\n const theme = useTheme();\n\n if (errorMessage) {\n return (\n <FormHelperText\n {...testIdAttributes}\n component={'span'}\n error\n role={'alert'}\n sx={{\n marginLeft: noIndent ? 0 : theme.spacing(-2),\n position: 'relative',\n }}\n >\n <ErrorIcon sx={iconStyle} />\n {errorMessage}\n </FormHelperText>\n );\n } else if (warningMessage) {\n return (\n <Box\n {...testIdAttributes}\n className={'Mui-warning'}\n component={'span'}\n role={'alert'}\n sx={{\n marginLeft: noIndent ? 0 : theme.spacing(-2),\n position: 'relative',\n }}\n >\n <WarningIcon sx={iconStyle} />\n {warningMessage}\n </Box>\n );\n } else if (infoMessage) {\n return (\n <Box\n {...testIdAttributes}\n component={'span'}\n role={'alert'}\n sx={{\n marginLeft: noIndent ? 0 : theme.spacing(-2),\n position: 'relative',\n }}\n >\n <InfoOutlinedIcon sx={iconStyle} />\n {infoMessage}\n </Box>\n );\n }\n return null;\n};\n"],"mappings":";;;;;;;AAsBA,
|
|
1
|
+
{"version":3,"file":"index.js","names":["ErrorIcon","WarningIcon","InfoOutlinedIcon","iconStyle","FormFieldHelperText","testIdAttributes","TestIdUtil","theme","useTheme","errorMessage","FormHelperText","noIndent","warningMessage","Box","infoMessage"],"sources":["../../../../src/components/helpers/FormFieldHelperText/FormFieldHelperText.tsx"],"sourcesContent":["import type {\n SxProps,\n Theme,\n} from '@mui/material';\nimport {\n Box,\n FormHelperText,\n useTheme,\n} from '@mui/material';\nimport ErrorIcon from '@mui/icons-material/Error';\nimport WarningIcon from '@mui/icons-material/WarningAmber';\nimport InfoOutlinedIcon from '@mui/icons-material/InfoOutlined';\nimport type { ReactElement } from 'react';\nimport { TestIdUtil } from '@gen-epix/ui-core/utils/TestIdUtil';\n\nexport type FormFieldHelperTextProps = {\n readonly errorMessage?: string;\n readonly infoMessage?: string;\n readonly noIndent?: boolean;\n readonly warningMessage?: string;\n};\n\nconst iconStyle: SxProps<Theme> = {\n height: '13px',\n marginRight: '1px',\n position: 'relative',\n top: '3px',\n width: '13px',\n};\n\nexport const FormFieldHelperText = ({\n errorMessage,\n infoMessage,\n noIndent,\n warningMessage,\n}: FormFieldHelperTextProps): ReactElement => {\n const testIdAttributes = TestIdUtil.createAttributes('FormFieldHelperText');\n const theme = useTheme();\n\n if (errorMessage) {\n return (\n <FormHelperText\n {...testIdAttributes}\n component={'span'}\n error\n role={'alert'}\n sx={{\n marginLeft: noIndent ? 0 : theme.spacing(-2),\n position: 'relative',\n }}\n >\n <ErrorIcon sx={iconStyle} />\n {errorMessage}\n </FormHelperText>\n );\n } else if (warningMessage) {\n return (\n <Box\n {...testIdAttributes}\n className={'Mui-warning'}\n component={'span'}\n role={'alert'}\n sx={{\n marginLeft: noIndent ? 0 : theme.spacing(-2),\n position: 'relative',\n }}\n >\n <WarningIcon sx={iconStyle} />\n {warningMessage}\n </Box>\n );\n } else if (infoMessage) {\n return (\n <Box\n {...testIdAttributes}\n component={'span'}\n role={'alert'}\n sx={{\n marginLeft: noIndent ? 0 : theme.spacing(-2),\n position: 'relative',\n }}\n >\n <InfoOutlinedIcon sx={iconStyle} />\n {infoMessage}\n </Box>\n );\n }\n return null;\n};\n"],"mappings":";;;;;;;AAsBA,IAAMG,IAA4B;CAChC,QAAQ;CACR,aAAa;CACb,UAAU;CACV,KAAK;CACL,OAAO;AACT,GAEaC,KAAuB,EAClC,iBACA,gBACA,aACA,wBAC4C;CAC5C,IAAMC,IAAmBC,EAAW,iBAAiB,qBAAqB,GACpEC,IAAQC,EAAS;CAkDvB,OAhDIC,IAEA,kBAACC,GAAD;EACE,GAAIL;EACJ,WAAW;EACX,OAAA;EACA,MAAM;EACN,IAAI;GACF,YAAYM,IAAW,IAAIJ,EAAM,QAAQ,EAAE;GAC3C,UAAU;EACZ;EARF,UAAA,CAUE,kBAACP,GAAD,EAAW,IAAIG,EAAY,CAAA,GAC1BM,CACa;MAETG,IAEP,kBAACC,GAAD;EACE,GAAIR;EACJ,WAAW;EACX,WAAW;EACX,MAAM;EACN,IAAI;GACF,YAAYM,IAAW,IAAIJ,EAAM,QAAQ,EAAE;GAC3C,UAAU;EACZ;EARF,UAAA,CAUE,kBAACN,GAAD,EAAa,IAAIE,EAAY,CAAA,GAC5BS,CACE;MAEEE,IAEP,kBAACD,GAAD;EACE,GAAIR;EACJ,WAAW;EACX,MAAM;EACN,IAAI;GACF,YAAYM,IAAW,IAAIJ,EAAM,QAAQ,EAAE;GAC3C,UAAU;EACZ;EAPF,UAAA,CASE,kBAACL,GAAD,EAAkB,IAAIC,EAAY,CAAA,GACjCW,CACE;MAGF;AACT"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../../../src/components/helpers/FormFieldLoadingIndicator/FormFieldLoadingIndicator.tsx"],"sourcesContent":["import {\n LinearProgress,\n useTheme,\n} from '@mui/material';\n\nexport type FormFieldLoadingIndicatorProps = {\n readonly inline?: boolean;\n};\n\nexport const FormFieldLoadingIndicator = ({ inline }: FormFieldLoadingIndicatorProps) => {\n const theme = useTheme();\n return (\n <LinearProgress\n sx={{\n height: '1px',\n position: inline ? undefined : 'absolute',\n top: inline ? theme.spacing(1) : '47px',\n width: '100%',\n }}\n />\n );\n};\n"],"mappings":";;;AASA,
|
|
1
|
+
{"version":3,"file":"index.js","names":["FormFieldLoadingIndicator","theme","useTheme","LinearProgress","inline"],"sources":["../../../../src/components/helpers/FormFieldLoadingIndicator/FormFieldLoadingIndicator.tsx"],"sourcesContent":["import {\n LinearProgress,\n useTheme,\n} from '@mui/material';\n\nexport type FormFieldLoadingIndicatorProps = {\n readonly inline?: boolean;\n};\n\nexport const FormFieldLoadingIndicator = ({ inline }: FormFieldLoadingIndicatorProps) => {\n const theme = useTheme();\n return (\n <LinearProgress\n sx={{\n height: '1px',\n position: inline ? undefined : 'absolute',\n top: inline ? theme.spacing(1) : '47px',\n width: '100%',\n }}\n />\n );\n};\n"],"mappings":";;;AASA,IAAaA,KAA6B,EAAE,gBAA6C;CACvF,IAAMC,IAAQC,EAAS;CACvB,OACE,kBAACC,GAAD,EACE,IAAI;EACF,QAAQ;EACR,UAAUC,IAAS,KAAA,IAAY;EAC/B,KAAKA,IAASH,EAAM,QAAQ,CAAC,IAAI;EACjC,OAAO;CACT,EACD,CAAA;AAEL"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { ReactElement, SubmitEventHandler } from 'react';
|
|
2
2
|
import { FieldValues, UseFormReturn } from 'react-hook-form';
|
|
3
3
|
import { ObjectSchema } from 'yup';
|
|
4
|
-
import { FormFieldDefinition, FormGroupDefinition } from '../../../models/form';
|
|
4
|
+
import { FormFieldDefinition, FormGroupDefinition } from '../../../models/form.models';
|
|
5
5
|
export type GenericFormProps<TFormFields extends FieldValues> = {
|
|
6
6
|
readonly defaultFormValues?: Partial<TFormFields>;
|
|
7
7
|
readonly disableAll?: boolean;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { t as e } from "../../../_chunks/FormUtil.js";
|
|
2
|
-
import { FORM_FIELD_DEFINITION_TYPE as t } from "../../../models/form.js";
|
|
2
|
+
import { FORM_FIELD_DEFINITION_TYPE as t } from "../../../models/form.models.js";
|
|
3
3
|
import { useIsFormFieldRequiredFromSchema as n } from "../../../hooks/useIsFormFieldRequiredFromSchema/index.js";
|
|
4
4
|
import { n as r } from "../../../_chunks/RichTextEditor.js";
|
|
5
5
|
import { t as i } from "../../../_chunks/TransferList.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../../../src/components/helpers/GenericForm/GenericForm.tsx"],"sourcesContent":["import type {\n ReactElement,\n SubmitEventHandler,\n} from 'react';\nimport {\n Fragment,\n useCallback,\n useMemo,\n} from 'react';\nimport { useTranslation } from 'react-i18next';\nimport type {\n FieldValues,\n Path,\n UseFormReturn,\n} from 'react-hook-form';\nimport { FormProvider } from 'react-hook-form';\nimport {\n Alert,\n AlertTitle,\n Box,\n Button,\n Typography,\n} from '@mui/material';\nimport type { ObjectSchema } from 'yup';\n\nimport type {\n FormFieldDefinition,\n FormGroupDefinition,\n} from '../../../models/form';\nimport { FORM_FIELD_DEFINITION_TYPE } from '../../../models/form';\nimport { FormUtil } from '../../../utils/FormUtil';\nimport { RichTextEditor } from '../../fields/RichTextEditor';\nimport { TransferList } from '../../fields/TransferList';\nimport type { AutocompleteProps } from '../../fields/Autocomplete';\nimport { Autocomplete } from '../../fields/Autocomplete';\nimport type { SelectProps } from '../../fields/Select';\nimport { Select } from '../../fields/Select';\nimport { TextField } from '../../fields/TextField';\nimport { NumberField } from '../../fields/NumberField';\nimport { DatePicker } from '../../fields/DatePicker';\nimport { FileUpload } from '../../fields/FileUpload/FileUpload';\nimport { RadioGroup } from '../../fields/RadioGroup';\nimport { Switch } from '../../fields/Switch';\nimport { useIsFormFieldRequiredFromSchema } from '../../../hooks/useIsFormFieldRequiredFromSchema';\n\nexport type GenericFormProps<TFormFields extends FieldValues> = {\n readonly defaultFormValues?: Partial<TFormFields>;\n readonly disableAll?: boolean;\n readonly formFieldDefinitions: FormFieldDefinition<TFormFields>[];\n readonly formGroupDefinitions?: FormGroupDefinition[];\n readonly formId?: string;\n readonly formMethods: UseFormReturn<TFormFields>;\n readonly onSubmit?: SubmitEventHandler<HTMLFormElement>;\n readonly renderField?: (definition: FormFieldDefinition<TFormFields>, element: ReactElement) => ReactElement;\n readonly renderGroup?: (definition: FormGroupDefinition, children: ReactElement) => ReactElement;\n readonly schema?: ObjectSchema<TFormFields, TFormFields>;\n readonly wrapForm?: (children: ReactElement) => ReactElement;\n};\n\nexport const GenericForm = <TFormFields extends FieldValues>({\n disableAll,\n formFieldDefinitions,\n formGroupDefinitions,\n formId,\n formMethods,\n onSubmit,\n renderField,\n renderGroup,\n schema,\n wrapForm,\n}: GenericFormProps<TFormFields>) => {\n const { t } = useTranslation();\n\n const booleanOptions = useMemo(() => FormUtil.createBooleanOptions(t), [t]);\n\n const isFormFieldRequired = useIsFormFieldRequiredFromSchema(schema, formMethods.getValues);\n\n const renderFormFieldDefinition = useCallback((formFieldDefinition: FormFieldDefinition<TFormFields>) => {\n switch (formFieldDefinition.definition) {\n case FORM_FIELD_DEFINITION_TYPE.AUTOCOMPLETE:\n return (\n <Autocomplete\n {...formFieldDefinition as AutocompleteProps<TFormFields, Path<TFormFields>, false>}\n disabled={formFieldDefinition.disabled || disableAll}\n required={isFormFieldRequired(formFieldDefinition.name)}\n />\n );\n case FORM_FIELD_DEFINITION_TYPE.BOOLEAN:\n return (\n <Select\n {...formFieldDefinition}\n disabled={formFieldDefinition.disabled || disableAll}\n options={booleanOptions}\n required={isFormFieldRequired(formFieldDefinition.name)}\n />\n );\n case FORM_FIELD_DEFINITION_TYPE.BOOLEAN_SWITCH:\n return (\n <Switch\n {...formFieldDefinition}\n disabled={formFieldDefinition.disabled || disableAll}\n required={isFormFieldRequired(formFieldDefinition.name)}\n />\n );\n case FORM_FIELD_DEFINITION_TYPE.DATE:\n return (\n <DatePicker\n {...formFieldDefinition}\n disabled={formFieldDefinition.disabled || disableAll}\n required={isFormFieldRequired(formFieldDefinition.name)}\n />\n );\n case FORM_FIELD_DEFINITION_TYPE.FILE:\n return (\n <FileUpload\n {...formFieldDefinition}\n disabled={formFieldDefinition.disabled || disableAll}\n required={isFormFieldRequired(formFieldDefinition.name)}\n />\n );\n case FORM_FIELD_DEFINITION_TYPE.NUMBER:\n return (\n <NumberField\n {...formFieldDefinition}\n disabled={formFieldDefinition.disabled || disableAll}\n required={isFormFieldRequired(formFieldDefinition.name)}\n />\n );\n case FORM_FIELD_DEFINITION_TYPE.RADIO_GROUP:\n return (\n <RadioGroup\n {...formFieldDefinition}\n disabled={formFieldDefinition.disabled || disableAll}\n required={isFormFieldRequired(formFieldDefinition.name)}\n />\n );\n case FORM_FIELD_DEFINITION_TYPE.RICH_TEXT:\n return (\n <RichTextEditor\n {...formFieldDefinition}\n disabled={formFieldDefinition.disabled || disableAll}\n required={isFormFieldRequired(formFieldDefinition.name)}\n />\n );\n case FORM_FIELD_DEFINITION_TYPE.SELECT:\n return (\n <Select\n {...formFieldDefinition as SelectProps<TFormFields, Path<TFormFields>, false>}\n disabled={formFieldDefinition.disabled || disableAll}\n required={isFormFieldRequired(formFieldDefinition.name)}\n />\n );\n case FORM_FIELD_DEFINITION_TYPE.SWITCH:\n return (\n <Switch\n {...formFieldDefinition}\n disabled={formFieldDefinition.disabled || disableAll}\n required={isFormFieldRequired(formFieldDefinition.name)}\n />\n );\n case FORM_FIELD_DEFINITION_TYPE.TEXTFIELD:\n return (\n <TextField\n {...formFieldDefinition}\n disabled={formFieldDefinition.disabled || disableAll}\n required={isFormFieldRequired(formFieldDefinition.name)}\n />\n );\n case FORM_FIELD_DEFINITION_TYPE.TRANSFER_LIST:\n return (\n <TransferList\n {...formFieldDefinition}\n disabled={formFieldDefinition.disabled || disableAll}\n required={isFormFieldRequired(formFieldDefinition.name)}\n />\n );\n default:\n throw Error(`Unsupported form field definition: ${formFieldDefinition.definition}`);\n }\n }, [booleanOptions, disableAll, isFormFieldRequired]);\n\n\n const renderSingleField = useCallback((formFieldDefinition: FormFieldDefinition<TFormFields>) => {\n if (renderField) {\n return (\n <Fragment key={formFieldDefinition.name}>\n {formFieldDefinition.contentBefore}\n {renderField(formFieldDefinition, renderFormFieldDefinition(formFieldDefinition))}\n {formFieldDefinition.contentAfter}\n </Fragment>\n );\n }\n return (\n <Box\n key={formFieldDefinition.name}\n sx={{\n marginY: 1,\n }}\n >\n {formFieldDefinition.contentBefore}\n {renderFormFieldDefinition(formFieldDefinition)}\n {formFieldDefinition.contentAfter}\n </Box>\n );\n }, [renderField, renderFormFieldDefinition]);\n\n const formFieldsContent = useMemo(() => {\n if (!formGroupDefinitions?.length) {\n return (\n <>\n {formFieldDefinitions.map(renderSingleField)}\n </>\n );\n }\n\n const groupFieldsMap = new Map<string, FormFieldDefinition<TFormFields>[]>();\n for (const group of formGroupDefinitions) {\n groupFieldsMap.set(group.groupKey, []);\n }\n\n const ungroupedFields: FormFieldDefinition<TFormFields>[] = [];\n for (const field of formFieldDefinitions) {\n if (field.groupKey && groupFieldsMap.has(field.groupKey)) {\n groupFieldsMap.get(field.groupKey)?.push(field);\n } else {\n ungroupedFields.push(field);\n }\n }\n\n return (\n <>\n {formGroupDefinitions.map(group => {\n const groupFields = groupFieldsMap.get(group.groupKey) ?? [];\n if (!groupFields.length) {\n return null;\n }\n const groupContent = (\n <>\n {groupFields.map(renderSingleField)}\n </>\n );\n if (renderGroup) {\n return (\n <Fragment key={group.groupKey}>\n {renderGroup(group, groupContent)}\n </Fragment>\n );\n }\n return (\n <Box\n key={group.groupKey}\n sx={{ marginY: 2 }}\n >\n {group.contentBefore}\n <Typography variant={'subtitle1'}>\n {group.label}\n </Typography>\n {group.description && (\n <Typography\n color={'text.secondary'}\n variant={'body2'}\n >\n {group.description}\n </Typography>\n )}\n {group.messages?.map((msg) => (\n <Alert\n key={msg.message}\n severity={msg.severity}\n sx={{ '& .MuiAlert-message': { width: '100%' } }}\n >\n <AlertTitle>\n {msg.message}\n </AlertTitle>\n {msg.buttonLabel && msg.onButtonClick && (\n <Box sx={{ display: 'flex', justifyContent: 'flex-end' }}>\n <Button\n color={'inherit'}\n onClick={msg.onButtonClick}\n size={'small'}\n variant={'text'}\n >\n {msg.buttonLabel}\n </Button>\n </Box>\n )}\n </Alert>\n ))}\n {groupContent}\n {group.contentAfter}\n </Box>\n );\n })}\n {ungroupedFields.map(renderSingleField)}\n </>\n );\n }, [formFieldDefinitions, formGroupDefinitions, renderGroup, renderSingleField]);\n\n return (\n <FormProvider {...formMethods}>\n <Box\n autoComplete={'off'}\n component={'form'}\n id={formId}\n onSubmit={onSubmit}\n >\n {wrapForm ? wrapForm(formFieldsContent) : formFieldsContent}\n </Box>\n </FormProvider>\n );\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["Autocomplete","Select","Switch","RadioGroup","TextField","_Fragment","FormUtil","RichTextEditor","TransferList","Autocomplete$1","Select$1","TextField$1","DatePicker","FileUpload","RadioGroup$1","Switch$1","Fragment$1","GenericForm","useTranslation","booleanOptions","useMemo","t","isFormFieldRequired","useIsFormFieldRequiredFromSchema","schema","formMethods","renderFormFieldDefinition","useCallback","formFieldDefinition","FORM_FIELD_DEFINITION_TYPE","disableAll","NumberField","renderSingleField","renderField","Fragment","Box","formFieldsContent","formGroupDefinitions","formFieldDefinitions","groupFieldsMap","group","ungroupedFields","field","groupFields","groupContent","renderGroup","Typography","Alert","msg","AlertTitle","Button","FormProvider","formId","wrapForm"],"sources":["../../../../src/components/helpers/GenericForm/GenericForm.tsx"],"sourcesContent":["import type {\n ReactElement,\n SubmitEventHandler,\n} from 'react';\nimport {\n Fragment,\n useCallback,\n useMemo,\n} from 'react';\nimport { useTranslation } from 'react-i18next';\nimport type {\n FieldValues,\n Path,\n UseFormReturn,\n} from 'react-hook-form';\nimport { FormProvider } from 'react-hook-form';\nimport {\n Alert,\n AlertTitle,\n Box,\n Button,\n Typography,\n} from '@mui/material';\nimport type { ObjectSchema } from 'yup';\n\nimport type {\n FormFieldDefinition,\n FormGroupDefinition,\n} from '../../../models/form.models';\nimport { FORM_FIELD_DEFINITION_TYPE } from '../../../models/form.models';\nimport { FormUtil } from '../../../utils/FormUtil';\nimport { RichTextEditor } from '../../fields/RichTextEditor';\nimport { TransferList } from '../../fields/TransferList';\nimport type { AutocompleteProps } from '../../fields/Autocomplete';\nimport { Autocomplete } from '../../fields/Autocomplete';\nimport type { SelectProps } from '../../fields/Select';\nimport { Select } from '../../fields/Select';\nimport { TextField } from '../../fields/TextField';\nimport { NumberField } from '../../fields/NumberField';\nimport { DatePicker } from '../../fields/DatePicker';\nimport { FileUpload } from '../../fields/FileUpload/FileUpload';\nimport { RadioGroup } from '../../fields/RadioGroup';\nimport { Switch } from '../../fields/Switch';\nimport { useIsFormFieldRequiredFromSchema } from '../../../hooks/useIsFormFieldRequiredFromSchema';\n\nexport type GenericFormProps<TFormFields extends FieldValues> = {\n readonly defaultFormValues?: Partial<TFormFields>;\n readonly disableAll?: boolean;\n readonly formFieldDefinitions: FormFieldDefinition<TFormFields>[];\n readonly formGroupDefinitions?: FormGroupDefinition[];\n readonly formId?: string;\n readonly formMethods: UseFormReturn<TFormFields>;\n readonly onSubmit?: SubmitEventHandler<HTMLFormElement>;\n readonly renderField?: (definition: FormFieldDefinition<TFormFields>, element: ReactElement) => ReactElement;\n readonly renderGroup?: (definition: FormGroupDefinition, children: ReactElement) => ReactElement;\n readonly schema?: ObjectSchema<TFormFields, TFormFields>;\n readonly wrapForm?: (children: ReactElement) => ReactElement;\n};\n\nexport const GenericForm = <TFormFields extends FieldValues>({\n disableAll,\n formFieldDefinitions,\n formGroupDefinitions,\n formId,\n formMethods,\n onSubmit,\n renderField,\n renderGroup,\n schema,\n wrapForm,\n}: GenericFormProps<TFormFields>) => {\n const { t } = useTranslation();\n\n const booleanOptions = useMemo(() => FormUtil.createBooleanOptions(t), [t]);\n\n const isFormFieldRequired = useIsFormFieldRequiredFromSchema(schema, formMethods.getValues);\n\n const renderFormFieldDefinition = useCallback((formFieldDefinition: FormFieldDefinition<TFormFields>) => {\n switch (formFieldDefinition.definition) {\n case FORM_FIELD_DEFINITION_TYPE.AUTOCOMPLETE:\n return (\n <Autocomplete\n {...formFieldDefinition as AutocompleteProps<TFormFields, Path<TFormFields>, false>}\n disabled={formFieldDefinition.disabled || disableAll}\n required={isFormFieldRequired(formFieldDefinition.name)}\n />\n );\n case FORM_FIELD_DEFINITION_TYPE.BOOLEAN:\n return (\n <Select\n {...formFieldDefinition}\n disabled={formFieldDefinition.disabled || disableAll}\n options={booleanOptions}\n required={isFormFieldRequired(formFieldDefinition.name)}\n />\n );\n case FORM_FIELD_DEFINITION_TYPE.BOOLEAN_SWITCH:\n return (\n <Switch\n {...formFieldDefinition}\n disabled={formFieldDefinition.disabled || disableAll}\n required={isFormFieldRequired(formFieldDefinition.name)}\n />\n );\n case FORM_FIELD_DEFINITION_TYPE.DATE:\n return (\n <DatePicker\n {...formFieldDefinition}\n disabled={formFieldDefinition.disabled || disableAll}\n required={isFormFieldRequired(formFieldDefinition.name)}\n />\n );\n case FORM_FIELD_DEFINITION_TYPE.FILE:\n return (\n <FileUpload\n {...formFieldDefinition}\n disabled={formFieldDefinition.disabled || disableAll}\n required={isFormFieldRequired(formFieldDefinition.name)}\n />\n );\n case FORM_FIELD_DEFINITION_TYPE.NUMBER:\n return (\n <NumberField\n {...formFieldDefinition}\n disabled={formFieldDefinition.disabled || disableAll}\n required={isFormFieldRequired(formFieldDefinition.name)}\n />\n );\n case FORM_FIELD_DEFINITION_TYPE.RADIO_GROUP:\n return (\n <RadioGroup\n {...formFieldDefinition}\n disabled={formFieldDefinition.disabled || disableAll}\n required={isFormFieldRequired(formFieldDefinition.name)}\n />\n );\n case FORM_FIELD_DEFINITION_TYPE.RICH_TEXT:\n return (\n <RichTextEditor\n {...formFieldDefinition}\n disabled={formFieldDefinition.disabled || disableAll}\n required={isFormFieldRequired(formFieldDefinition.name)}\n />\n );\n case FORM_FIELD_DEFINITION_TYPE.SELECT:\n return (\n <Select\n {...formFieldDefinition as SelectProps<TFormFields, Path<TFormFields>, false>}\n disabled={formFieldDefinition.disabled || disableAll}\n required={isFormFieldRequired(formFieldDefinition.name)}\n />\n );\n case FORM_FIELD_DEFINITION_TYPE.SWITCH:\n return (\n <Switch\n {...formFieldDefinition}\n disabled={formFieldDefinition.disabled || disableAll}\n required={isFormFieldRequired(formFieldDefinition.name)}\n />\n );\n case FORM_FIELD_DEFINITION_TYPE.TEXTFIELD:\n return (\n <TextField\n {...formFieldDefinition}\n disabled={formFieldDefinition.disabled || disableAll}\n required={isFormFieldRequired(formFieldDefinition.name)}\n />\n );\n case FORM_FIELD_DEFINITION_TYPE.TRANSFER_LIST:\n return (\n <TransferList\n {...formFieldDefinition}\n disabled={formFieldDefinition.disabled || disableAll}\n required={isFormFieldRequired(formFieldDefinition.name)}\n />\n );\n default:\n throw Error(`Unsupported form field definition: ${formFieldDefinition.definition}`);\n }\n }, [booleanOptions, disableAll, isFormFieldRequired]);\n\n\n const renderSingleField = useCallback((formFieldDefinition: FormFieldDefinition<TFormFields>) => {\n if (renderField) {\n return (\n <Fragment key={formFieldDefinition.name}>\n {formFieldDefinition.contentBefore}\n {renderField(formFieldDefinition, renderFormFieldDefinition(formFieldDefinition))}\n {formFieldDefinition.contentAfter}\n </Fragment>\n );\n }\n return (\n <Box\n key={formFieldDefinition.name}\n sx={{\n marginY: 1,\n }}\n >\n {formFieldDefinition.contentBefore}\n {renderFormFieldDefinition(formFieldDefinition)}\n {formFieldDefinition.contentAfter}\n </Box>\n );\n }, [renderField, renderFormFieldDefinition]);\n\n const formFieldsContent = useMemo(() => {\n if (!formGroupDefinitions?.length) {\n return (\n <>\n {formFieldDefinitions.map(renderSingleField)}\n </>\n );\n }\n\n const groupFieldsMap = new Map<string, FormFieldDefinition<TFormFields>[]>();\n for (const group of formGroupDefinitions) {\n groupFieldsMap.set(group.groupKey, []);\n }\n\n const ungroupedFields: FormFieldDefinition<TFormFields>[] = [];\n for (const field of formFieldDefinitions) {\n if (field.groupKey && groupFieldsMap.has(field.groupKey)) {\n groupFieldsMap.get(field.groupKey)?.push(field);\n } else {\n ungroupedFields.push(field);\n }\n }\n\n return (\n <>\n {formGroupDefinitions.map(group => {\n const groupFields = groupFieldsMap.get(group.groupKey) ?? [];\n if (!groupFields.length) {\n return null;\n }\n const groupContent = (\n <>\n {groupFields.map(renderSingleField)}\n </>\n );\n if (renderGroup) {\n return (\n <Fragment key={group.groupKey}>\n {renderGroup(group, groupContent)}\n </Fragment>\n );\n }\n return (\n <Box\n key={group.groupKey}\n sx={{ marginY: 2 }}\n >\n {group.contentBefore}\n <Typography variant={'subtitle1'}>\n {group.label}\n </Typography>\n {group.description && (\n <Typography\n color={'text.secondary'}\n variant={'body2'}\n >\n {group.description}\n </Typography>\n )}\n {group.messages?.map((msg) => (\n <Alert\n key={msg.message}\n severity={msg.severity}\n sx={{ '& .MuiAlert-message': { width: '100%' } }}\n >\n <AlertTitle>\n {msg.message}\n </AlertTitle>\n {msg.buttonLabel && msg.onButtonClick && (\n <Box sx={{ display: 'flex', justifyContent: 'flex-end' }}>\n <Button\n color={'inherit'}\n onClick={msg.onButtonClick}\n size={'small'}\n variant={'text'}\n >\n {msg.buttonLabel}\n </Button>\n </Box>\n )}\n </Alert>\n ))}\n {groupContent}\n {group.contentAfter}\n </Box>\n );\n })}\n {ungroupedFields.map(renderSingleField)}\n </>\n );\n }, [formFieldDefinitions, formGroupDefinitions, renderGroup, renderSingleField]);\n\n return (\n <FormProvider {...formMethods}>\n <Box\n autoComplete={'off'}\n component={'form'}\n id={formId}\n onSubmit={onSubmit}\n >\n {wrapForm ? wrapForm(formFieldsContent) : formFieldsContent}\n </Box>\n </FormProvider>\n );\n};\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../../src/hooks/useIsFormFieldRequiredFromSchema/useIsFormFieldRequiredFromSchema.ts"],"sourcesContent":["import { useCallback } from 'react';\nimport { set } from 'react-hook-form';\nimport type {\n FieldValues,\n Path,\n UseFormGetValues,\n} from 'react-hook-form';\nimport type {\n ObjectSchema,\n ValidationError,\n} from 'yup';\n\nconst useIsFormFieldRequiredFromSchema = <TFormFields extends FieldValues, TName extends Path<TFormFields>>(schema: ObjectSchema<TFormFields, TFormFields>, getFormValues: UseFormGetValues<TFormFields>): (fieldName: TName) => boolean => {\n return useCallback((fieldName: TName) => {\n if (!schema) {\n return false;\n }\n\n try {\n const values = structuredClone(getFormValues());\n set(values, fieldName, undefined);\n\n schema.validateSyncAt(fieldName, values, {\n abortEarly: true,\n strict: false,\n });\n return false;\n } catch (error) {\n return (error as ValidationError)?.type === 'required' || (error as ValidationError)?.type === 'optionality';\n }\n }, [getFormValues, schema]);\n};\n\nexport {\n useIsFormFieldRequiredFromSchema,\n};\n"],"mappings":";;;AAYA,
|
|
1
|
+
{"version":3,"file":"index.js","names":["useIsFormFieldRequiredFromSchema","useCallback","schema","values","getFormValues","set","fieldName","error"],"sources":["../../../src/hooks/useIsFormFieldRequiredFromSchema/useIsFormFieldRequiredFromSchema.ts"],"sourcesContent":["import { useCallback } from 'react';\nimport { set } from 'react-hook-form';\nimport type {\n FieldValues,\n Path,\n UseFormGetValues,\n} from 'react-hook-form';\nimport type {\n ObjectSchema,\n ValidationError,\n} from 'yup';\n\nconst useIsFormFieldRequiredFromSchema = <TFormFields extends FieldValues, TName extends Path<TFormFields>>(schema: ObjectSchema<TFormFields, TFormFields>, getFormValues: UseFormGetValues<TFormFields>): (fieldName: TName) => boolean => {\n return useCallback((fieldName: TName) => {\n if (!schema) {\n return false;\n }\n\n try {\n const values = structuredClone(getFormValues());\n set(values, fieldName, undefined);\n\n schema.validateSyncAt(fieldName, values, {\n abortEarly: true,\n strict: false,\n });\n return false;\n } catch (error) {\n return (error as ValidationError)?.type === 'required' || (error as ValidationError)?.type === 'optionality';\n }\n }, [getFormValues, schema]);\n};\n\nexport {\n useIsFormFieldRequiredFromSchema,\n};\n"],"mappings":";;;AAYA,IAAMA,KAAsG,GAAgD,MACnJC,GAAa,MAAqB;CACvC,IAAI,CAACC,GACH,OAAO;CAGT,IAAI;EACF,IAAMC,IAAS,gBAAgBC,EAAc,CAAC;EAO9C,OANAC,EAAIF,GAAQG,GAAW,KAAA,CAAS,GAEhCJ,EAAO,eAAeI,GAAWH,GAAQ;GACvC,YAAY;GACZ,QAAQ;EACV,CAAC,GACM;CACT,SAASI,GAAO;EACd,OAAQA,GAA2B,SAAS,cAAeA,GAA2B,SAAS;CACjG;AACF,GAAG,CAACH,GAAeF,CAAM,CAAC"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
//#region src/models/form.ts
|
|
1
|
+
//#region src/models/form.models.ts
|
|
2
2
|
var e = /* @__PURE__ */ function(e) {
|
|
3
3
|
return e.AUTOCOMPLETE = "AUTOCOMPLETE", e.BOOLEAN = "BOOLEAN", e.BOOLEAN_SWITCH = "BOOLEAN_SWITCH", e.DATE = "DATE", e.FILE = "FILE", e.HIDDEN = "HIDDEN", e.NUMBER = "NUMBER", e.RADIO_GROUP = "RADIO_GROUP", e.RICH_TEXT = "RICH_TEXT", e.SELECT = "SELECT", e.SWITCH = "SWITCH", e.TEXTFIELD = "TEXTFIELD", e.TRANSFER_LIST = "TRANSFER_LIST", e;
|
|
4
4
|
}({});
|
|
5
5
|
//#endregion
|
|
6
6
|
export { e as FORM_FIELD_DEFINITION_TYPE };
|
|
7
7
|
|
|
8
|
-
//# sourceMappingURL=form.js.map
|
|
8
|
+
//# sourceMappingURL=form.models.js.map
|