Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(core): add support for <optgroup> tag #4374

Open
wants to merge 5 commits into
base: main
Choose a base branch
from

Conversation

nagaozen
Copy link

@nagaozen nagaozen commented Nov 11, 2024

Reasons for making this change

HTML Select Element offers a native way to organize options in option groups. This update extends rjsf SelectWidget to support <optgroup> as well.

If this is related to existing tickets, include links to them as well. Use the syntax fixes #[issue number] (ex: fixes #123).

fixes #1813, #580

If your PR is non-trivial and you'd like to schedule a synchronous review, please add it to the weekly meeting agenda: https://docs.google.com/document/d/12PjTvv21k6LIky6bNQVnsplMLLnmEuypTLQF8a-8Wss/edit

Checklist

  • I'm updating documentation
  • I'm adding or updating code
    • I've added and/or updated tests. I've run npx nx run-many --target=build --exclude=@rjsf/docs && npm run test:update to update snapshots, if needed.
    • I've updated docs if needed
    • I've updated the changelog with a description of the PR
  • I'm adding a new feature
    • I've updated the playground with an example use of the feature

@heath-freenome
Copy link
Member

@nagaozen Thanks for the new feature... Can you update the CHANGELOG.md to add a new minor release with notes on this feature. Also please update the tests to validate these changes. Thanks

@nagaozen
Copy link
Author

@nagaozen Thanks for the new feature... Can you update the CHANGELOG.md to add a new minor release with notes on this feature. Also please update the tests to validate these changes. Thanks

Sure, must update the CHANGELOG and place some tests.

@nagaozen
Copy link
Author

Alright, checklist completed!

@heath-freenome
Copy link
Member

@nagaozen Consider doing a npm run cs-format to fix your lint errors and then making sure using npm run lint

Copy link
Member

@heath-freenome heath-freenome left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I still do not see any tests to verify that these changes work properly. You can update uiSchema.test.jsx to add them there

CHANGELOG.md Outdated Show resolved Hide resolved
Comment on lines +93 to +98
const disabled = enumDisabled && enumDisabled.indexOf(value) !== -1;
return (
<option key={i} value={String(i)} disabled={disabled}>
{label}
</option>
);
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is duplicate code to what is above. Consider creating a new component at the top of the file to render it and use it here and above

Copy link
Member

@heath-freenome heath-freenome Nov 15, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Something like a helper component in the file:

interface OptionProps {
  enumDisabled?: UIOptionsType['enumDisabled'];
  value: EnumOptionsType['value'];
  label: EnumOptionsType['label'];
  index: number;
}

function Option(props: OptionProps) {
  const { enumDisabled, index, label, value } = props;
  const disabled = enumDisabled && enumDisabled.indexOf(value) !== -1;
  return (
    <option value={String(index)} disabled={disabled}>
      {label}
    </option>
  );
}

Then this would look like:

Array.isArray(enumOptions) && enumOptions.map(({ value, label }, i) => {
      return <Option key={i} enumDisabled={enumDisabled} index={i} value={value} label={label} />;

Comment on lines +81 to +87
const disabled = enumDisabled && enumDisabled.indexOf(value) !== -1;
let [{ label }, i] = enumOptionFromValue.get(value)
return (
<option key={i} value={String(i)} disabled={disabled}>
{label}
</option>
);
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Duplicate code here, minus the let line, which really should be const since you don't change anything

Copy link
Member

@heath-freenome heath-freenome Nov 15, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Using the suggestion below, this would look like:

          if (!enumOptionFromValue.has(value)) {
            return null;
          }
          const [{ label }, i] = enumOptionFromValue.get(value);
          return <Option key={i} enumDisabled={enumDisabled} index={i} value={value} label={label} />;

@heath-freenome
Copy link
Member

@nagaozen Also, since the bootstrap-4 code has nearly the same implementation, can you also add this feature to it?

@nagaozen
Copy link
Author

@nagaozen Also, since the bootstrap-4 code has nearly the same implementation, can you also add this feature to it?

Mmm, its a core widget, shouldn't it work as is in bootstrap 4? I've never played with the bs4 version, but will take a look into it.

Co-authored-by: Heath C <51679588+heath-freenome@users.noreply.github.com>
@@ -16,6 +16,16 @@ should change the heading of the (upcoming) version to include a major version b

-->

# 5.23.0
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This will now be 5.24.0 since we just released 5.23.0

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Modify JSON Validation for Optgroup support
2 participants