From a950092348ada28bff30c6ea996c5a3299476da6 Mon Sep 17 00:00:00 2001 From: Nick Grosenbacher Date: Fri, 24 May 2024 15:47:11 -0400 Subject: [PATCH 1/6] fix #4197 for antd, chakra-ui, fluentui-rc, material-ui, mui, semantic-ui --- CHANGELOG.md | 25 ++++++ .../antd/src/widgets/SelectWidget/index.tsx | 31 +++++--- .../test/__snapshots__/Form.test.tsx.snap | 4 +- .../src/SelectWidget/SelectWidget.tsx | 17 +++-- .../src/SelectWidget/SelectWidget.tsx | 3 + .../src/SelectWidget/SelectWidget.tsx | 1 + .../mui/src/SelectWidget/SelectWidget.tsx | 1 + .../src/SelectWidget/SelectWidget.tsx | 34 ++++++--- .../test/__snapshots__/Form.test.tsx.snap | 76 +++++++++++++++++-- 9 files changed, 160 insertions(+), 32 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 428e9c6809..2412e77dde 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,9 +18,34 @@ should change the heading of the (upcoming) version to include a major version b # 5.19.2 +## @rjsf/antd + +- SelectWidget now displays an empty option when appropriate, fixing [#4197](https://github.com/rjsf-team/react-jsonschema-form/issues/4197) + +## @rjsf/chakra-ui + +- SelectWidget now displays an empty option when appropriate, fixing [#4197](https://github.com/rjsf-team/react-jsonschema-form/issues/4197) + ## @rjsf/core - Removed `.only` on tests that was accidentally added in `5.19.0` +- Added support for `default` values in `additionalProperties` in [#4199](https://github.com/rjsf-team/react-jsonschema-form/issues/4199), fixing [#3195](https://github.com/rjsf-team/react-jsonschema-form/issues/3915) + +## @rjsf/fluentui-rc + +- SelectWidget now displays an empty option when appropriate, fixing [#4197](https://github.com/rjsf-team/react-jsonschema-form/issues/4197) + +## @rjsf/material-ui + +- SelectWidget now displays an empty option when appropriate, fixing [#4197](https://github.com/rjsf-team/react-jsonschema-form/issues/4197) + +## @rjsf/mui + +- SelectWidget now displays an empty option when appropriate, fixing [#4197](https://github.com/rjsf-team/react-jsonschema-form/issues/4197) + +## @rjsf/semantic-ui + +- SelectWidget now displays an empty option when appropriate, fixing [#4197](https://github.com/rjsf-team/react-jsonschema-form/issues/4197) # 5.19.1 diff --git a/packages/antd/src/widgets/SelectWidget/index.tsx b/packages/antd/src/widgets/SelectWidget/index.tsx index 2f6937b773..cfb7e5c85a 100644 --- a/packages/antd/src/widgets/SelectWidget/index.tsx +++ b/packages/antd/src/widgets/SelectWidget/index.tsx @@ -10,6 +10,8 @@ import { WidgetProps, } from '@rjsf/utils'; import isString from 'lodash/isString'; +import { DefaultOptionType } from 'antd/es/select'; +import { useMemo } from 'react'; const SELECT_STYLE = { width: '100%', @@ -37,6 +39,7 @@ export default function SelectWidget< placeholder, readonly, value, + schema, }: WidgetProps) { const { readonlyAsDisabled = true } = formContext as GenericObjectType; @@ -65,6 +68,23 @@ export default function SelectWidget< const extraProps = { name: id, }; + + const selectOptions: DefaultOptionType[] | undefined = useMemo(() => { + if (Array.isArray(enumOptions)) { + if (!multiple && schema.default === undefined) { + enumOptions.unshift({ value: '', label: placeholder || '' }); + } + + return enumOptions.map(({ value: optionValue, label: optionLabel }, index) => ({ + disabled: Array.isArray(enumDisabled) && enumDisabled.indexOf(optionValue) !== -1, + key: String(index), + value: String(index), + label: optionLabel, + })); + } + return undefined; + }, [enumDisabled, enumOptions, multiple, placeholder, schema.default]); + return ( (id)} > - {!multiple && schema.default === undefined && } + {showPlaceholderOption && } {Array.isArray(enumOptions) && enumOptions.map(({ value, label }, i) => { const disabled = enumDisabled && enumDisabled.indexOf(value) !== -1; diff --git a/packages/fluentui-rc/src/SelectWidget/SelectWidget.tsx b/packages/fluentui-rc/src/SelectWidget/SelectWidget.tsx index 4dcf2790ad..b0f88acd51 100644 --- a/packages/fluentui-rc/src/SelectWidget/SelectWidget.tsx +++ b/packages/fluentui-rc/src/SelectWidget/SelectWidget.tsx @@ -62,6 +62,7 @@ function SelectWidget(newValue, enumOptions, optEmptyVal)); }; + const showPlaceholderOption = !multiple && schema.default === undefined; return ( (id)} > - {!multiple && schema.default === undefined && } + {showPlaceholderOption && } {Array.isArray(enumOptions) && enumOptions.map(({ value, label }, i) => { const disabled = enumDisabled && enumDisabled.indexOf(value) !== -1; diff --git a/packages/material-ui/src/SelectWidget/SelectWidget.tsx b/packages/material-ui/src/SelectWidget/SelectWidget.tsx index b60540c6be..a053b374bb 100644 --- a/packages/material-ui/src/SelectWidget/SelectWidget.tsx +++ b/packages/material-ui/src/SelectWidget/SelectWidget.tsx @@ -59,6 +59,7 @@ export default function SelectWidget< const _onFocus = ({ target }: FocusEvent) => onFocus(id, enumOptionsValueForIndex(target && target.value, enumOptions, optEmptyVal)); const selectedIndexes = enumOptionsIndexForValue(value, enumOptions, multiple); + const showPlaceholderOption = !multiple && schema.default === undefined; return ( (id)} > - {!multiple && schema.default === undefined && {placeholder}} + {showPlaceholderOption && {placeholder}} {Array.isArray(enumOptions) && enumOptions.map(({ value, label }, i: number) => { const disabled: boolean = Array.isArray(enumDisabled) && enumDisabled.indexOf(value) !== -1; diff --git a/packages/mui/src/SelectWidget/SelectWidget.tsx b/packages/mui/src/SelectWidget/SelectWidget.tsx index d088dc2b22..49fe9fe7a9 100644 --- a/packages/mui/src/SelectWidget/SelectWidget.tsx +++ b/packages/mui/src/SelectWidget/SelectWidget.tsx @@ -61,6 +61,7 @@ export default function SelectWidget< onFocus(id, enumOptionsValueForIndex(target && target.value, enumOptions, optEmptyVal)); const selectedIndexes = enumOptionsIndexForValue(value, enumOptions, multiple); const { InputLabelProps, SelectProps, autocomplete, ...textFieldRemainingProps } = textFieldProps; + const showPlaceholderOption = !multiple && schema.default === undefined; return ( (id)} > - {!multiple && schema.default === undefined && {placeholder}} + {showPlaceholderOption && {placeholder}} {Array.isArray(enumOptions) && enumOptions.map(({ value, label }, i: number) => { const disabled: boolean = Array.isArray(enumDisabled) && enumDisabled.indexOf(value) !== -1; diff --git a/packages/semantic-ui/src/SelectWidget/SelectWidget.tsx b/packages/semantic-ui/src/SelectWidget/SelectWidget.tsx index a7af7f9e0e..1a6d4b83a8 100644 --- a/packages/semantic-ui/src/SelectWidget/SelectWidget.tsx +++ b/packages/semantic-ui/src/SelectWidget/SelectWidget.tsx @@ -17,20 +17,21 @@ import { getSemanticProps } from '../util'; /** * Returns and creates an array format required for semantic drop down - * @param {array} enumOptions- array of items for the dropdown + * @param {array} enumOptions - array of items for the dropdown * @param {array} enumDisabled - array of enum option values to disable + * @param {boolean} showPlaceholderOption - whether to show a placeholder option + * @param {string} placeholder - placeholder option label * @returns {*} */ function createDefaultValueOptionsForDropDown( - schema: S, enumOptions?: EnumOptionsType[], enumDisabled?: UIOptionsType['enumDisabled'], - multiple?: boolean, + showPlaceholderOption?: boolean, placeholder?: string ) { const disabledOptions = enumDisabled || []; const options: DropdownItemProps[] = []; - if (!multiple && schema.default === undefined) { + if (showPlaceholderOption) { options.push({ value: '', text: placeholder || '' }); } options.push( @@ -86,11 +87,11 @@ export default function SelectWidget( - schema, enumOptions, enumDisabled, - multiple, + showPlaceholderOption, placeholder ); const _onChange = (_: SyntheticEvent, { value }: DropdownProps) => From 0bca1a4de5258cfdfe5d5d395592106b2f031300 Mon Sep 17 00:00:00 2001 From: Nick Grosenbacher Date: Mon, 8 Jul 2024 07:32:32 -0400 Subject: [PATCH 4/6] Fix CHANGELOG --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2412e77dde..4aa03006de 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -29,7 +29,6 @@ should change the heading of the (upcoming) version to include a major version b ## @rjsf/core - Removed `.only` on tests that was accidentally added in `5.19.0` -- Added support for `default` values in `additionalProperties` in [#4199](https://github.com/rjsf-team/react-jsonschema-form/issues/4199), fixing [#3195](https://github.com/rjsf-team/react-jsonschema-form/issues/3915) ## @rjsf/fluentui-rc @@ -117,6 +116,7 @@ should change the heading of the (upcoming) version to include a major version b - Fix case where NumberField would not properly reset the field when using programmatic form reset (#4202)[https://github.com/rjsf-team/react-jsonschema-form/issues/4202] - Updated widgets to handle undefined `target` in `onFocus` and `onBlur` handlers - Fix field disable or readonly property can't cover globalOptions corresponding property (#4212)[https://github.com/rjsf-team/react-jsonschema-form/pull/4212] +- Added support for `default` values in `additionalProperties` in [#4199](https://github.com/rjsf-team/react-jsonschema-form/issues/4199), fixing [#3195](https://github.com/rjsf-team/react-jsonschema-form/issues/3915) ## @rjsf/fluent-ui From ab2120add03f0c07a1a879acc1d75aaeb47d9b19 Mon Sep 17 00:00:00 2001 From: Nick Grosenbacher Date: Mon, 8 Jul 2024 08:18:04 -0400 Subject: [PATCH 5/6] Fix cases where placeholder option was accidentally given an index --- .../antd/src/widgets/SelectWidget/index.tsx | 13 ++++----- .../test/__snapshots__/Form.test.tsx.snap | 4 +-- .../src/SelectWidget/SelectWidget.tsx | 27 ++++++++++--------- .../test/__snapshots__/Form.test.tsx.snap | 2 +- .../src/SelectWidget/SelectWidget.tsx | 17 +++++------- 5 files changed, 32 insertions(+), 31 deletions(-) diff --git a/packages/antd/src/widgets/SelectWidget/index.tsx b/packages/antd/src/widgets/SelectWidget/index.tsx index 13e5fa8262..645e0ebb4e 100644 --- a/packages/antd/src/widgets/SelectWidget/index.tsx +++ b/packages/antd/src/widgets/SelectWidget/index.tsx @@ -73,19 +73,20 @@ export default function SelectWidget< const selectOptions: DefaultOptionType[] | undefined = useMemo(() => { if (Array.isArray(enumOptions)) { - const options = [...enumOptions]; - if (showPlaceholderOption) { - options.unshift({ value: '', label: placeholder || '' }); - } - return options.map(({ value: optionValue, label: optionLabel }, index) => ({ + const options: DefaultOptionType[] = enumOptions.map(({ value: optionValue, label: optionLabel }, index) => ({ disabled: Array.isArray(enumDisabled) && enumDisabled.indexOf(optionValue) !== -1, key: String(index), value: String(index), label: optionLabel, })); + + if (showPlaceholderOption) { + options.unshift({ value: '', label: placeholder || '' }); + } + return options; } return undefined; - }, [enumDisabled, enumOptions, multiple, placeholder, schema.default]); + }, [enumDisabled, enumOptions, placeholder, showPlaceholderOption]); return (