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

feature: Reimplement and improve #1719 to Add array field copy #3508

Merged
merged 4 commits into from
Mar 16, 2023

Conversation

heath-freenome
Copy link
Member

Reasons for making this change

Fixes #1261 and #1712 by adding copy array item capability as well as global UiSchema options

  • In @rjsf/utils, updated types and functions to support array field copy AND global options in the UiSchema as follows:
  • Added a new TranslatableString enums CopyButton and InvalidObjectField that localizes the information extracted from ObjectField as markdown
  • Updated the ArrayFieldTemplateItemType to add support for copying array items
    • Refactored UIOptionsBaseType to extract the addable, orderable, removable, label and duplicateKeySuffixSeparator into a new GlobalUISchemaOptions type that adds copyable - Extended UIOptionsBaseType from GlobalUISchemaOptions - In UiSchema added a new optional ui:globalOptions prop of type GlobalUISchemaOptions and a new UI_GLOBAL_OPTIONS_KEY constant - Added a new optional prop globalUiOptions object of type GlobalUISchemaOptions in Registry as well as CopyButton in ButtonTemplates
    • Updated getUiOptions() and getDisplayLabel() (and its SchemaUtilsType counterpart) to take an optional GlobalUISchemaOptions parameter that is used to include global options into the returned uiOptions
  • In @rjsf/core, added support for array field copy and global options in the UiSchema as follows:
    • Updated ArrayField to handle global UI Options by passing in registry.globalUiOptions into getUiOptions() and by exposing the new hasCopy flag and onCopyIndexClick callback
    • Updated ObjectField to handle global UI Options for duplicateKeySuffixSeparator and also added support for the new TranslatableString.InvalidObjectField translation into a Markdown
    • Updated SchemaField to handle global UI Options for label
    • Added a new CopyButton implementation that was registered in the ButtonTemplates
    • Updated ArrayFieldItemTemplate to render the CopyButton when hasCopy is true, calling onCopyIndexClick on click
    • Updated Form to extract the ui:globalOptions from the uiSchema and set it into the registry as globalUiOptions
    • Updated tests to verify all the new functionality
  • In all the themes, added support for array field copy as follows:
    • Added a new CopyButton implementation that was registered in the ButtonTemplates
    • Updated ArrayFieldItemTemplate to render the CopyButton when hasCopy is true, calling onCopyIndexClick on click
    • Updated the Array tests to verify that copy shows up when copyable is true
  • In @rjsf/antd and @rjsf/semantic-ui updated the styles to support the additional button in ArrayFieldItemTemplate
  • In @rjsf/fluent-ui, fixed some bad style errors in the console by removing the ; at the end of the fontFamily custom styles
  • In @rjsf/semantic-ui, removed some bad property warnings by changing the inverted prop from false to 'false'
  • In @rjsf/docs, updated the documentation for all the copy feature and global UiSchema options type updates
    • Also replaced all js(x) code blocks with ts(x) code blocks to be complete
  • Updated the CHANGELOG.md accordingly

Checklist

  • I'm updating documentation
  • I'm adding or updating code
    • I've added and/or updated tests. I've run 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

Copy link
Contributor

@nickgros nickgros left a comment

Choose a reason for hiding this comment

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

Overall looks great, just want some clarification on a few things

packages/docs/docs/api-reference/uiSchema.md Outdated Show resolved Hide resolved
packages/docs/docs/api-reference/uiSchema.md Outdated Show resolved Hide resolved
packages/utils/src/getUiOptions.ts Outdated Show resolved Hide resolved
packages/utils/src/types.ts Outdated Show resolved Hide resolved
packages/utils/src/types.ts Outdated Show resolved Hide resolved
packages/utils/src/types.ts Outdated Show resolved Hide resolved
Fixes rjsf-team#1261 and rjsf-team#1712 by adding copy array item capability as well as global `UiSchema` options
- In `@rjsf/utils`, updated types and functions to support array field copy AND global options in the `UiSchema` as follows:
- Updated the `ArrayFieldTemplateItemType` to add support for copying array items
  - Added a new `TranslatableString` enums `CopyButton` and `InvalidObjectField` that localizes the information extracted from `ObjectField` as markdown
  - Refactored `UIOptionsBaseType` to extract the `addable`, `orderable`, `removable`, `label` and `duplicateKeySuffixSeparator` into a new `GlobalUISchemaOptions` type that adds `copyable`
    - Extended `UIOptionsBaseType` from `GlobalUISchemaOptions`
    - In `UiSchema` added a new optional `ui:globalOptions` prop of type `GlobalUISchemaOptions` and a new `UI_GLOBAL_OPTIONS_KEY` constant
    - Added a new optional prop `globalUiOptions` object of type `GlobalUISchemaOptions` in `Registry` as well as `CopyButton` in `ButtonTemplates`
  - Updated `getUiOptions()` and `getDisplayLabel()` (and its `SchemaUtilsType` counterpart) to take an optional `GlobalUISchemaOptions` parameter that is used to include global options into the returned `uiOptions`
- In `@rjsf/core`, added support for array field copy and global options in the `UiSchema` as follows:
  - Updated `ArrayField` to handle global UI Options by passing in `registry.globalUiOptions` into `getUiOptions()` and by exposing the new `hasCopy` flag and `onCopyIndexClick` callback
  - Updated `ObjectField` to handle global UI Options for `duplicateKeySuffixSeparator` and also added support for the new `TranslatableString.InvalidObjectField` translation into a `Markdown`
  - Updated `SchemaField` to handle global UI Options for `label`
  - Added a new `CopyButton` implementation that was registered in the `ButtonTemplates`
  - Updated `ArrayFieldItemTemplate` to render the `CopyButton` when `hasCopy` is true, calling `onCopyIndexClick` on click
  - Updated `Form` to extract the `ui:globalOptions` from the `uiSchema` and set it into the `registry` as `globalUiOptions`
  - Updated tests to verify all the new functionality
- In all the themes, added support for array field copy as follows:
  - Added a new `CopyButton` implementation that was registered in the `ButtonTemplates`
  - Updated `ArrayFieldItemTemplate` to render the `CopyButton` when `hasCopy` is true, calling `onCopyIndexClick` on click
  - Updated the Array tests to verify that copy shows up when `copyable` is true
- In `@rjsf/antd` and `@rjsf/semantic-ui` updated the styles to support the additional button in `ArrayFieldItemTemplate`
- In `@rjsf/fluent-ui`, fixed some bad style errors in the console by removing the `;` at the end of the `fontFamily` custom styles
- In `@rjsf/semantic-ui`, removed some bad property warnings by changing the `inverted` prop from `false` to `'false'`
- In `@rjsf/docs`, updated the documentation for all the copy feature and global `UiSchema` options type updates
  - Also replaced all `js(x)` code blocks with `ts(x)` code blocks to be complete
- Updated the `CHANGELOG.md` accordingly
- Responded to reviewer and self feedback

Co-authored-by: Nick Grosenbacher <[email protected]>
@heath-freenome heath-freenome merged commit 14f63a7 into rjsf-team:main Mar 16, 2023
@heath-freenome heath-freenome deleted the reimplement-1719 branch March 16, 2023 22:01
@jmarks-joshua
Copy link

Is it just me or is none of this documented? There is no onCopyIndexClick function documented in the ArrayFieldTemplate or in ArrayFieldItemTemplate.

hasCopy and copyable are both there, but how to actually implement it isn't anywhere in the docs.

@heath-freenome
Copy link
Member Author

@jmarks-joshua Thanks for pointing that out. Are you asking because you don't understand how to implement these features or are you just letting us know the docs are missing? If it is the latter, we'd love a PR with updates

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.

Add button for duplicating a row in an array
3 participants