diff --git a/docs/src/prototypes/CopyToClipboard/CopyToClipboard.tsx b/docs/src/prototypes/CopyToClipboard/CopyToClipboard.tsx index 4fe076eca6..92f0f2a389 100644 --- a/docs/src/prototypes/CopyToClipboard/CopyToClipboard.tsx +++ b/docs/src/prototypes/CopyToClipboard/CopyToClipboard.tsx @@ -54,6 +54,7 @@ const CopyToClipboard: React.FC = props => { } return Tooltip.create(tooltip, { + generateKey: false, overrideProps: { trigger: renderedTrigger, children: undefined, // force-reset `children` defined for `Tooltip` as it collides with the `trigger diff --git a/docs/src/prototypes/employeeCard/AvatarEmployeeCard.tsx b/docs/src/prototypes/employeeCard/AvatarEmployeeCard.tsx index 9ae4022676..bcc34d8375 100644 --- a/docs/src/prototypes/employeeCard/AvatarEmployeeCard.tsx +++ b/docs/src/prototypes/employeeCard/AvatarEmployeeCard.tsx @@ -64,6 +64,7 @@ class AvatarEmployeeCard extends React.Component< this.setPopupOpen(false) }, }), + generateKey: false, })} content={{ styles: { marginLeft: '10px' }, diff --git a/docs/src/prototypes/employeeCard/EmployeeCard.tsx b/docs/src/prototypes/employeeCard/EmployeeCard.tsx index 82a8556fd5..5d4a82d75e 100644 --- a/docs/src/prototypes/employeeCard/EmployeeCard.tsx +++ b/docs/src/prototypes/employeeCard/EmployeeCard.tsx @@ -74,6 +74,7 @@ class EmployeeCard extends React.Component, any> { size: 'largest', name: `${firstName} ${lastName}`, }), + generateKey: false, })} ) diff --git a/docs/src/prototypes/meetingOptions/components/MSTeamsLogo.tsx b/docs/src/prototypes/meetingOptions/components/MSTeamsLogo.tsx index 5d09f9c96f..0a10c2a3aa 100644 --- a/docs/src/prototypes/meetingOptions/components/MSTeamsLogo.tsx +++ b/docs/src/prototypes/meetingOptions/components/MSTeamsLogo.tsx @@ -23,6 +23,7 @@ class MSTeamsLogo extends React.Component { xSpacing: 'after', styles: { verticalAlign: 'middle' }, }), + generateKey: false, })} { defaultProps: () => ({ variables: { dividerColor: 'transparent' }, }), + generateKey: false, }) } diff --git a/packages/react/src/components/Accordion/Accordion.tsx b/packages/react/src/components/Accordion/Accordion.tsx index 12b527b871..ee5288abf6 100644 --- a/packages/react/src/components/Accordion/Accordion.tsx +++ b/packages/react/src/components/Accordion/Accordion.tsx @@ -267,6 +267,7 @@ class Accordion extends AutoControlledComponent, Acco id: titleId, accordionContentId: contentId, }), + generateKey: true, overrideProps: this.handleTitleOverrides, render: renderPanelTitle, }), @@ -279,6 +280,7 @@ class Accordion extends AutoControlledComponent, Acco id: contentId, accordionTitleId: titleId, }), + generateKey: true, render: renderPanelContent, }), ) diff --git a/packages/react/src/components/Accordion/AccordionTitle.tsx b/packages/react/src/components/Accordion/AccordionTitle.tsx index c02647ca95..0be059ce65 100644 --- a/packages/react/src/components/Accordion/AccordionTitle.tsx +++ b/packages/react/src/components/Accordion/AccordionTitle.tsx @@ -122,6 +122,7 @@ class AccordionTitle extends UIComponent, any> { defaultProps: () => ({ styles: styles.indicator, }), + generateKey: false, })} main={rtlTextContainer.createFor({ element: content })} /> diff --git a/packages/react/src/components/Alert/Alert.tsx b/packages/react/src/components/Alert/Alert.tsx index 03df5c174c..832e01a758 100644 --- a/packages/react/src/components/Alert/Alert.tsx +++ b/packages/react/src/components/Alert/Alert.tsx @@ -185,6 +185,7 @@ class Alert extends AutoControlledComponent, AlertState> styles: styles.header, ...accessibility.attributes.header, }), + generateKey: false, })} {Box.create(content, { defaultProps: () => ({ @@ -192,6 +193,7 @@ class Alert extends AutoControlledComponent, AlertState> styles: styles.content, ...accessibility.attributes.content, }), + generateKey: false, })} ) @@ -203,6 +205,7 @@ class Alert extends AutoControlledComponent, AlertState> className: Alert.slotClassNames.icon, styles: styles.icon, }), + generateKey: false, })} {Box.create(body, { defaultProps: () => ({ @@ -211,6 +214,7 @@ class Alert extends AutoControlledComponent, AlertState> ...accessibility.attributes.body, styles: styles.body, }), + generateKey: false, overrideProps: { children: bodyContent, }, @@ -221,6 +225,7 @@ class Alert extends AutoControlledComponent, AlertState> className: Alert.slotClassNames.actions, styles: styles.actions, }), + generateKey: false, })} {dismissible && Button.create(dismissAction, { @@ -231,6 +236,7 @@ class Alert extends AutoControlledComponent, AlertState> styles: styles.dismissAction, ...accessibility.attributes.dismissAction, }), + generateKey: false, overrideProps: this.handleDismissOverrides, })} diff --git a/packages/react/src/components/Attachment/Attachment.tsx b/packages/react/src/components/Attachment/Attachment.tsx index 8b62267cec..3137f9097e 100644 --- a/packages/react/src/components/Attachment/Attachment.tsx +++ b/packages/react/src/components/Attachment/Attachment.tsx @@ -92,15 +92,18 @@ class Attachment extends UIComponent> { {icon && Icon.create(icon, { defaultProps: () => ({ size: 'larger', styles: styles.icon }), + generateKey: false, })} {(header || description) && (
{Text.create(header, { defaultProps: () => ({ styles: styles.header }), + generateKey: false, })} {Text.create(description, { defaultProps: () => ({ styles: styles.description }), + generateKey: false, })}
)} @@ -112,6 +115,7 @@ class Attachment extends UIComponent> { styles: styles.action, className: Attachment.slotClassNames.action, }), + generateKey: false, })} {!_.isNil(progress) &&
} diff --git a/packages/react/src/components/Avatar/Avatar.tsx b/packages/react/src/components/Avatar/Avatar.tsx index ec13bca42d..ed939808c7 100644 --- a/packages/react/src/components/Avatar/Avatar.tsx +++ b/packages/react/src/components/Avatar/Avatar.tsx @@ -97,6 +97,7 @@ class Avatar extends UIComponent, any> { title: name, styles: styles.image, }), + generateKey: false, })} {!image && Label.create(label || {}, { @@ -106,6 +107,7 @@ class Avatar extends UIComponent, any> { title: name, styles: styles.label, }), + generateKey: false, })} {Status.create(status, { defaultProps: () => ({ @@ -116,6 +118,7 @@ class Avatar extends UIComponent, any> { borderWidth: variables.statusBorderWidth, }, }), + generateKey: false, })} ) diff --git a/packages/react/src/components/Button/Button.tsx b/packages/react/src/components/Button/Button.tsx index d1633e3c05..53a912c6ca 100644 --- a/packages/react/src/components/Button/Button.tsx +++ b/packages/react/src/components/Button/Button.tsx @@ -153,6 +153,7 @@ class Button extends UIComponent> { {!hasChildren && iconPosition !== 'after' && this.renderIcon(variables, styles)} {Box.create(!hasChildren && content, { defaultProps: () => ({ as: 'span', styles: styles.content }), + generateKey: false, })} {!hasChildren && iconPosition === 'after' && this.renderIcon(variables, styles)} @@ -168,6 +169,7 @@ class Button extends UIComponent> { xSpacing: !content ? 'none' : iconPosition === 'after' ? 'before' : 'after', variables: variables.icon, }), + generateKey: false, }) } @@ -179,6 +181,7 @@ class Button extends UIComponent> { role: undefined, styles: styles.loader, }), + generateKey: false, }) } diff --git a/packages/react/src/components/Button/ButtonGroup.tsx b/packages/react/src/components/Button/ButtonGroup.tsx index ed27a0add5..91be33ad35 100644 --- a/packages/react/src/components/Button/ButtonGroup.tsx +++ b/packages/react/src/components/Button/ButtonGroup.tsx @@ -80,6 +80,7 @@ class ButtonGroup extends UIComponent, any> { circular, styles: this.getStyleForButtonIndex(styles, idx === 0, idx === buttons.length - 1), }), + generateKey: true, }), )} diff --git a/packages/react/src/components/Carousel/Carousel.tsx b/packages/react/src/components/Carousel/Carousel.tsx index 14d84d1d19..c4a22b5996 100644 --- a/packages/react/src/components/Carousel/Carousel.tsx +++ b/packages/react/src/components/Carousel/Carousel.tsx @@ -280,6 +280,7 @@ class Carousel extends AutoControlledComponent, Carous itemPositionText: getItemPositionText(index, items.length), }), }), + generateKey: false, })} ) @@ -337,6 +338,7 @@ class Carousel extends AutoControlledComponent, Carous paddlePrevious, ), }), + generateKey: false, overrideProps: (predefinedProps: ButtonProps) => this.handlePaddleOverrides(predefinedProps, 'paddlePrevious'), })} @@ -351,6 +353,7 @@ class Carousel extends AutoControlledComponent, Carous ...accessibility.attributes.paddleNext, ...applyAccessibilityKeyHandlers(accessibility.keyHandlers.paddleNext, paddleNext), }), + generateKey: false, overrideProps: (predefinedProps: ButtonProps) => this.handlePaddleOverrides(predefinedProps, 'paddleNext'), })} @@ -375,6 +378,7 @@ class Carousel extends AutoControlledComponent, Carous iconOnly: true, activeIndex, }), + generateKey: false, overrideProps: (predefinedProps: CarouselNavigationItemProps) => ({ onItemClick: (e: React.SyntheticEvent, itemProps: CarouselNavigationItemProps) => { const { index } = itemProps diff --git a/packages/react/src/components/Carousel/CarouselNavigation.tsx b/packages/react/src/components/Carousel/CarouselNavigation.tsx index 3c509f0c1b..4738eb8185 100644 --- a/packages/react/src/components/Carousel/CarouselNavigation.tsx +++ b/packages/react/src/components/Carousel/CarouselNavigation.tsx @@ -105,6 +105,7 @@ class CarouselNavigation extends UIComponent ? accessibility.childBehaviors.item : undefined, }), + generateKey: false, overrideProps: this.handleItemOverrides(variables), }), ) diff --git a/packages/react/src/components/Carousel/CarouselNavigationItem.tsx b/packages/react/src/components/Carousel/CarouselNavigationItem.tsx index f723156029..154943c8c1 100644 --- a/packages/react/src/components/Carousel/CarouselNavigationItem.tsx +++ b/packages/react/src/components/Carousel/CarouselNavigationItem.tsx @@ -105,9 +105,11 @@ class CarouselNavigationItem extends UIComponent ({ as: 'span', styles: styles.content }), + generateKey: false, })} ) diff --git a/packages/react/src/components/Chat/Chat.tsx b/packages/react/src/components/Chat/Chat.tsx index ee3c990b26..8830643dd9 100644 --- a/packages/react/src/components/Chat/Chat.tsx +++ b/packages/react/src/components/Chat/Chat.tsx @@ -68,6 +68,7 @@ class Chat extends UIComponent, any> { : _.map(items, item => ChatItem.create(item, { defaultProps: () => ({ className: Chat.slotClassNames.item }), + generateKey: true, }), )} diff --git a/packages/react/src/components/Chat/ChatItem.tsx b/packages/react/src/components/Chat/ChatItem.tsx index dfc5013f69..28c8511168 100644 --- a/packages/react/src/components/Chat/ChatItem.tsx +++ b/packages/react/src/components/Chat/ChatItem.tsx @@ -92,6 +92,7 @@ class ChatItem extends UIComponent, any> { gutter && Box.create(gutter, { defaultProps: () => ({ className: ChatItem.slotClassNames.gutter, styles: styles.gutter }), + generateKey: false, }) const messageElement = this.setAttachedPropValueForChatMessage(styles) @@ -112,6 +113,7 @@ class ChatItem extends UIComponent, any> { className: ChatItem.slotClassNames.message, styles: styles.message, }), + generateKey: false, }) // the element is ChatMessage diff --git a/packages/react/src/components/Chat/ChatMessage.tsx b/packages/react/src/components/Chat/ChatMessage.tsx index 160d05103e..f1a9fd7d55 100644 --- a/packages/react/src/components/Chat/ChatMessage.tsx +++ b/packages/react/src/components/Chat/ChatMessage.tsx @@ -224,6 +224,7 @@ class ChatMessage extends UIComponent, ChatMessageS className: ChatMessage.slotClassNames.actionMenu, styles: styles.actionMenu, }), + generateKey: false, }) if (!actionMenuElement) { @@ -299,6 +300,7 @@ class ChatMessage extends UIComponent, ChatMessageS className: ChatMessage.slotClassNames.badge, styles: styles.badge, }), + generateKey: false, }) const reactionGroupElement = Reaction.Group.create(reactionGroup, { @@ -306,6 +308,7 @@ class ChatMessage extends UIComponent, ChatMessageS className: ChatMessage.slotClassNames.reactionGroup, styles: styles.reactionGroup, }), + generateKey: false, }) const actionMenuElement = this.renderActionMenu(actionMenu, styles) @@ -316,6 +319,7 @@ class ChatMessage extends UIComponent, ChatMessageS styles: styles.author, className: ChatMessage.slotClassNames.author, }), + generateKey: false, }) const timestampElement = Text.create(timestamp, { @@ -325,6 +329,7 @@ class ChatMessage extends UIComponent, ChatMessageS timestamp: true, className: ChatMessage.slotClassNames.timestamp, }), + generateKey: false, }) const messageContent = Box.create(content, { @@ -332,6 +337,7 @@ class ChatMessage extends UIComponent, ChatMessageS className: ChatMessage.slotClassNames.content, styles: styles.content, }), + generateKey: false, }) return ( diff --git a/packages/react/src/components/Checkbox/Checkbox.tsx b/packages/react/src/components/Checkbox/Checkbox.tsx index 8ae819f263..86a37df930 100644 --- a/packages/react/src/components/Checkbox/Checkbox.tsx +++ b/packages/react/src/components/Checkbox/Checkbox.tsx @@ -146,6 +146,7 @@ class Checkbox extends AutoControlledComponent, Checkb styles: styles.label, className: Checkbox.slotClassNames.label, }), + generateKey: false, }) return ( @@ -167,6 +168,7 @@ class Checkbox extends AutoControlledComponent, Checkb name: toggle ? 'icon-circle' : 'icon-checkmark', styles: toggle ? styles.toggle : styles.checkbox, }), + generateKey: false, })} {labelPosition === 'end' && labelElement} diff --git a/packages/react/src/components/Dialog/Dialog.tsx b/packages/react/src/components/Dialog/Dialog.tsx index 0c20b1ceed..6993425edd 100644 --- a/packages/react/src/components/Dialog/Dialog.tsx +++ b/packages/react/src/components/Dialog/Dialog.tsx @@ -258,12 +258,14 @@ class Dialog extends AutoControlledComponent, DialogStat const { open } = this.state const cancelElement = Button.create(cancelButton, { + generateKey: false, overrideProps: this.handleCancelButtonOverrides, }) const confirmElement = Button.create(confirmButton, { defaultProps: () => ({ primary: true, }), + generateKey: false, overrideProps: this.handleConfirmButtonOverrides, }) @@ -273,6 +275,7 @@ class Dialog extends AutoControlledComponent, DialogStat defaultProps: () => ({ styles: styles.actions, }), + generateKey: false, overrideProps: { content: ( @@ -300,6 +303,7 @@ class Dialog extends AutoControlledComponent, DialogStat styles: styles.header, ...accessibility.attributes.header, }), + generateKey: false, })} {Button.create(headerAction, { defaultProps: () => ({ @@ -309,6 +313,7 @@ class Dialog extends AutoControlledComponent, DialogStat iconOnly: true, ...accessibility.attributes.headerAction, }), + generateKey: false, })} {Box.create(content, { @@ -317,6 +322,7 @@ class Dialog extends AutoControlledComponent, DialogStat className: Dialog.slotClassNames.content, ...accessibility.attributes.content, }), + generateKey: false, })} {DialogFooter.create(footer, { @@ -325,6 +331,7 @@ class Dialog extends AutoControlledComponent, DialogStat className: Dialog.slotClassNames.footer, styles: styles.footer, }, + generateKey: false, })} @@ -359,6 +366,7 @@ class Dialog extends AutoControlledComponent, DialogStat className: Dialog.slotClassNames.overlay, styles: styles.overlay, }), + generateKey: false, overrideProps: { content: dialogContent }, })} diff --git a/packages/react/src/components/Dropdown/Dropdown.tsx b/packages/react/src/components/Dropdown/Dropdown.tsx index 4730bb9014..a22c2af767 100644 --- a/packages/react/src/components/Dropdown/Dropdown.tsx +++ b/packages/react/src/components/Dropdown/Dropdown.tsx @@ -496,6 +496,7 @@ class Dropdown extends AutoControlledComponent, Dropdo styles: styles.clearIndicator, xSpacing: 'none', }), + generateKey: false, overrideProps: (predefinedProps: IconProps) => ({ onClick: (e: React.SyntheticEvent, iconProps: IconProps) => { _.invoke(predefinedProps, 'onClick', e, iconProps) @@ -511,6 +512,7 @@ class Dropdown extends AutoControlledComponent, Dropdo outline: true, size: 'small', }), + generateKey: false, overrideProps: (predefinedProps: IconProps) => ({ onClick: (e, indicatorProps: IconProps) => { _.invoke(predefinedProps, 'onClick', e, indicatorProps) @@ -584,6 +586,7 @@ class Dropdown extends AutoControlledComponent, Dropdo styles: styles.triggerButton, ...restTriggerButtonProps, }), + generateKey: false, overrideProps: (predefinedProps: IconProps) => ({ onClick: e => { onClick(e) @@ -633,6 +636,7 @@ class Dropdown extends AutoControlledComponent, Dropdo variables, inputRef: this.inputRef, }), + generateKey: false, overrideProps: this.handleSearchInputOverrides( highlightedIndex, rtl, @@ -746,6 +750,7 @@ class Dropdown extends AutoControlledComponent, Dropdo key: (item as any).header, }), }), + generateKey: true, overrideProps: this.handleItemOverrides(item, index, getItemProps, selected), render: renderItem, }) @@ -760,6 +765,7 @@ class Dropdown extends AutoControlledComponent, Dropdo key: 'loading-message', styles: styles.loadingMessage, }), + generateKey: false, }), !loading && items.length === 0 && @@ -768,6 +774,7 @@ class Dropdown extends AutoControlledComponent, Dropdo key: 'no-results-message', styles: styles.noResultsMessage, }), + generateKey: false, }), ] } @@ -792,6 +799,7 @@ class Dropdown extends AutoControlledComponent, Dropdo key: (item as any).header, }), }), + generateKey: true, overrideProps: this.handleSelectedItemOverrides(item, rtl), render: renderSelectedItem, }), diff --git a/packages/react/src/components/Dropdown/DropdownItem.tsx b/packages/react/src/components/Dropdown/DropdownItem.tsx index 9c5d02a181..6186793513 100644 --- a/packages/react/src/components/Dropdown/DropdownItem.tsx +++ b/packages/react/src/components/Dropdown/DropdownItem.tsx @@ -112,6 +112,7 @@ class DropdownItem extends UIComponent> { className: DropdownItem.slotClassNames.header, styles: styles.header, }), + generateKey: false, })} media={Image.create(image, { defaultProps: () => ({ @@ -119,12 +120,14 @@ class DropdownItem extends UIComponent> { className: DropdownItem.slotClassNames.image, styles: styles.image, }), + generateKey: false, })} content={Box.create(content, { defaultProps: () => ({ className: DropdownItem.slotClassNames.content, styles: styles.content, }), + generateKey: false, })} endMedia={ selected && @@ -134,6 +137,7 @@ class DropdownItem extends UIComponent> { className: DropdownItem.slotClassNames.checkableIndicator, styles: styles.checkableIndicator, }), + generateKey: false, }), styles: styles.endMedia, } diff --git a/packages/react/src/components/Dropdown/DropdownSelectedItem.tsx b/packages/react/src/components/Dropdown/DropdownSelectedItem.tsx index 1faac19891..172e738895 100644 --- a/packages/react/src/components/Dropdown/DropdownSelectedItem.tsx +++ b/packages/react/src/components/Dropdown/DropdownSelectedItem.tsx @@ -138,6 +138,7 @@ class DropdownSelectedItem extends UIComponent, EmbedState> height: variables.height, }, }), + generateKey: false, })} {iframe && ( @@ -187,6 +188,7 @@ class Embed extends AutoControlledComponent, EmbedState> as: 'iframe', styles: styles.iframe, }), + generateKey: false, overrideProps: this.handleFrameOverrides, })} @@ -204,6 +206,7 @@ class Embed extends AutoControlledComponent, EmbedState> size: 'largest', styles: styles.control, }), + generateKey: false, })} ) diff --git a/packages/react/src/components/Form/Form.tsx b/packages/react/src/components/Form/Form.tsx index 4babda7b52..279cc56292 100644 --- a/packages/react/src/components/Form/Form.tsx +++ b/packages/react/src/components/Form/Form.tsx @@ -99,7 +99,10 @@ class Form extends UIComponent, any> { renderFields = () => { const { fields } = this.props return _.map(fields, field => - FormField.create(field, { defaultProps: () => ({ className: Form.slotClassNames.field }) }), + FormField.create(field, { + defaultProps: () => ({ className: Form.slotClassNames.field }), + generateKey: true, + }), ) } } diff --git a/packages/react/src/components/Form/FormField.tsx b/packages/react/src/components/Form/FormField.tsx index bfbbbce270..68897c1a95 100644 --- a/packages/react/src/components/Form/FormField.tsx +++ b/packages/react/src/components/Form/FormField.tsx @@ -90,16 +90,19 @@ class FormField extends UIComponent, any> { htmlFor: id, styles: styles.label, }), + generateKey: false, }) const messageElement = Text.create(message, { defaultProps: () => ({ styles: styles.message, }), + generateKey: false, }) const controlElement = Box.create(control || {}, { defaultProps: () => ({ required, id, name, type, styles: styles.control }), + generateKey: false, }) const content = ( diff --git a/packages/react/src/components/Header/Header.tsx b/packages/react/src/components/Header/Header.tsx index aadc070c39..b47127e09f 100644 --- a/packages/react/src/components/Header/Header.tsx +++ b/packages/react/src/components/Header/Header.tsx @@ -90,6 +90,7 @@ class Header extends UIComponent, any> { ...(v.descriptionColor && { color: v.descriptionColor }), }, }), + generateKey: false, })} ) diff --git a/packages/react/src/components/HierarchicalTree/HierarchicalTree.tsx b/packages/react/src/components/HierarchicalTree/HierarchicalTree.tsx index 664907b74e..fc919babf8 100644 --- a/packages/react/src/components/HierarchicalTree/HierarchicalTree.tsx +++ b/packages/react/src/components/HierarchicalTree/HierarchicalTree.tsx @@ -180,6 +180,7 @@ class HierarchicalTree extends AutoControlledComponent< renderItemTitle, open: exclusive ? index === activeIndex : _.includes(activeIndexes, index), }), + generateKey: true, overrideProps: this.handleTreeItemOverrides, }), ) diff --git a/packages/react/src/components/HierarchicalTree/HierarchicalTreeItem.tsx b/packages/react/src/components/HierarchicalTree/HierarchicalTreeItem.tsx index bf2292df31..2026a3e8b1 100644 --- a/packages/react/src/components/HierarchicalTree/HierarchicalTreeItem.tsx +++ b/packages/react/src/components/HierarchicalTree/HierarchicalTreeItem.tsx @@ -173,6 +173,7 @@ class HierarchicalTreeItem extends UIComponent )} diff --git a/packages/react/src/components/Input/Input.tsx b/packages/react/src/components/Input/Input.tsx index 30a4945d0e..c6d92f71ba 100644 --- a/packages/react/src/components/Input/Input.tsx +++ b/packages/react/src/components/Input/Input.tsx @@ -163,6 +163,7 @@ class Input extends AutoControlledComponent, InputState> onChange: this.handleChange, ...applyAccessibilityKeyHandlers(accessibility.keyHandlers.input, htmlInputProps), }), + generateKey: false, })} {Icon.create(this.computeIcon(), { @@ -170,6 +171,7 @@ class Input extends AutoControlledComponent, InputState> styles: styles.icon, variables: variables.icon, }), + generateKey: false, overrideProps: this.handleIconOverrides, })} @@ -177,6 +179,7 @@ class Input extends AutoControlledComponent, InputState> styles: styles.root, ...restProps, }), + generateKey: false, overrideProps: { as: (wrapper && (wrapper as any).as) || ElementType, }, diff --git a/packages/react/src/components/Label/Label.tsx b/packages/react/src/components/Label/Label.tsx index 8c9174c0ab..c2bef702eb 100644 --- a/packages/react/src/components/Label/Label.tsx +++ b/packages/react/src/components/Label/Label.tsx @@ -104,12 +104,14 @@ class Label extends UIComponent, any> { styles: styles.image, variables: variables.image, }), + generateKey: false, }) const iconElement = Icon.create(icon, { defaultProps: () => ({ styles: styles.icon, variables: variables.icon, }), + generateKey: false, overrideProps: this.handleIconOverrides, }) diff --git a/packages/react/src/components/List/List.tsx b/packages/react/src/components/List/List.tsx index 305a9f0c58..9b30f88066 100644 --- a/packages/react/src/components/List/List.tsx +++ b/packages/react/src/components/List/List.tsx @@ -170,6 +170,7 @@ class List extends AutoControlledComponent, ListState> { return ListItem.create(item, { defaultProps: itemProps, + generateKey: true, overrideProps: this.handleItemOverrides, }) }) diff --git a/packages/react/src/components/List/ListItem.tsx b/packages/react/src/components/List/ListItem.tsx index 84824d4f0f..235fd4489b 100644 --- a/packages/react/src/components/List/ListItem.tsx +++ b/packages/react/src/components/List/ListItem.tsx @@ -123,36 +123,42 @@ class ListItem extends UIComponent> { className: ListItem.slotClassNames.content, styles: styles.content, }), + generateKey: false, }) const contentMediaElement = Box.create(contentMedia, { defaultProps: () => ({ className: ListItem.slotClassNames.contentMedia, styles: styles.contentMedia, }), + generateKey: false, }) const headerElement = Box.create(header, { defaultProps: () => ({ className: ListItem.slotClassNames.header, styles: styles.header, }), + generateKey: false, }) const headerMediaElement = Box.create(headerMedia, { defaultProps: () => ({ className: ListItem.slotClassNames.headerMedia, styles: styles.headerMedia, }), + generateKey: false, }) const endMediaElement = Box.create(endMedia, { defaultProps: () => ({ className: ListItem.slotClassNames.endMedia, styles: styles.endMedia, }), + generateKey: false, }) const mediaElement = Box.create(media, { defaultProps: () => ({ className: ListItem.slotClassNames.media, styles: styles.media, }), + generateKey: false, }) return ( diff --git a/packages/react/src/components/Loader/Loader.tsx b/packages/react/src/components/Loader/Loader.tsx index 127bd04bdb..8bec1e66cf 100644 --- a/packages/react/src/components/Loader/Loader.tsx +++ b/packages/react/src/components/Loader/Loader.tsx @@ -118,6 +118,7 @@ class Loader extends UIComponent, LoaderState> { const svgElement = Box.create(svg, { defaultProps: () => ({ className: Loader.slotClassNames.svg, styles: styles.svg }), + generateKey: false, }) return ( @@ -133,9 +134,11 @@ class Loader extends UIComponent, LoaderState> { className: Loader.slotClassNames.indicator, styles: styles.indicator, }), + generateKey: false, })} {Text.create(label, { defaultProps: () => ({ className: Loader.slotClassNames.label, styles: styles.label }), + generateKey: false, })} ) diff --git a/packages/react/src/components/Menu/Menu.tsx b/packages/react/src/components/Menu/Menu.tsx index 91fb0aa271..53f1ad63eb 100644 --- a/packages/react/src/components/Menu/Menu.tsx +++ b/packages/react/src/components/Menu/Menu.tsx @@ -208,6 +208,7 @@ class Menu extends AutoControlledComponent, MenuState> { ? accessibility.childBehaviors.divider : undefined, }), + generateKey: true, overrideProps: overrideDividerProps, }) } @@ -234,6 +235,7 @@ class Menu extends AutoControlledComponent, MenuState> { ? accessibility.childBehaviors.item : undefined, }), + generateKey: true, overrideProps: overrideItemProps, }) }) diff --git a/packages/react/src/components/Menu/MenuItem.tsx b/packages/react/src/components/Menu/MenuItem.tsx index 0ae3ee368e..76385ab29b 100644 --- a/packages/react/src/components/Menu/MenuItem.tsx +++ b/packages/react/src/components/Menu/MenuItem.tsx @@ -237,9 +237,11 @@ class MenuItem extends AutoControlledComponent, MenuIt xSpacing: !!content ? 'after' : 'none', styles: styles.icon, }), + generateKey: false, })} {Box.create(content, { defaultProps: () => ({ as: 'span', styles: styles.content }), + generateKey: false, })} {menu && Icon.create(indicatorWithDefaults, { @@ -247,6 +249,7 @@ class MenuItem extends AutoControlledComponent, MenuIt name: vertical ? 'icon-menu-arrow-end' : 'icon-menu-arrow-down', styles: styles.indicator, }), + generateKey: false, })} @@ -271,6 +274,7 @@ class MenuItem extends AutoControlledComponent, MenuIt submenu: true, indicator, }), + generateKey: false, })} @@ -295,6 +299,7 @@ class MenuItem extends AutoControlledComponent, MenuIt onClick: this.handleClick, onBlur: this.handleWrapperBlur, }), + generateKey: false, }) } return menuItemInner diff --git a/packages/react/src/components/MenuButton/MenuButton.tsx b/packages/react/src/components/MenuButton/MenuButton.tsx index 04d25d3b71..2070cfab51 100644 --- a/packages/react/src/components/MenuButton/MenuButton.tsx +++ b/packages/react/src/components/MenuButton/MenuButton.tsx @@ -259,6 +259,7 @@ export default class MenuButton extends AutoControlledComponent, an vertical, ...(index === 0 && isNoneValueSelected && { tabIndex: 0 }), }), + generateKey: true, overrideProps: this.handleItemOverrides, }), ) diff --git a/packages/react/src/components/RadioGroup/RadioGroupItem.tsx b/packages/react/src/components/RadioGroup/RadioGroupItem.tsx index ac9c24999f..76b6b11517 100644 --- a/packages/react/src/components/RadioGroup/RadioGroupItem.tsx +++ b/packages/react/src/components/RadioGroup/RadioGroupItem.tsx @@ -140,11 +140,13 @@ class RadioGroupItem extends AutoControlledComponent< size: 'small', styles: styles.icon, }), + generateKey: false, })} {Box.create(label, { defaultProps: () => ({ as: 'span', }), + generateKey: false, })} diff --git a/packages/react/src/components/Reaction/Reaction.tsx b/packages/react/src/components/Reaction/Reaction.tsx index b743b69dcb..5ece32a7d0 100644 --- a/packages/react/src/components/Reaction/Reaction.tsx +++ b/packages/react/src/components/Reaction/Reaction.tsx @@ -78,12 +78,14 @@ class Reaction extends UIComponent> { className: Reaction.slotClassNames.icon, styles: styles.icon, }), + generateKey: false, })} {Box.create(content, { defaultProps: () => ({ className: Reaction.slotClassNames.content, styles: styles.content, }), + generateKey: false, })} )} diff --git a/packages/react/src/components/Reaction/ReactionGroup.tsx b/packages/react/src/components/Reaction/ReactionGroup.tsx index 269b43dc6e..e504b3134c 100644 --- a/packages/react/src/components/Reaction/ReactionGroup.tsx +++ b/packages/react/src/components/Reaction/ReactionGroup.tsx @@ -70,6 +70,7 @@ class ReactionGroup extends UIComponent> { defaultProps: () => ({ styles: styles.reaction, }), + generateKey: true, }), )} diff --git a/packages/react/src/components/Slider/Slider.tsx b/packages/react/src/components/Slider/Slider.tsx index 51c3357bb2..72be9a3d5e 100644 --- a/packages/react/src/components/Slider/Slider.tsx +++ b/packages/react/src/components/Slider/Slider.tsx @@ -205,6 +205,7 @@ class Slider extends AutoControlledComponent, SliderStat styles: styles.input, ...applyAccessibilityKeyHandlers(accessibility.keyHandlers.input, htmlInputProps), }), + generateKey: false, overrideProps: this.handleInputOverrides, })} diff --git a/packages/react/src/components/SplitButton/SplitButton.tsx b/packages/react/src/components/SplitButton/SplitButton.tsx index b8f54fcaf6..8fe091e683 100644 --- a/packages/react/src/components/SplitButton/SplitButton.tsx +++ b/packages/react/src/components/SplitButton/SplitButton.tsx @@ -179,6 +179,7 @@ class SplitButton extends AutoControlledComponent, secondary, disabled, }), + generateKey: false, overrideProps: this.handleMenuButtonTriggerOverrides, }) @@ -197,6 +198,7 @@ class SplitButton extends AutoControlledComponent, open: this.state.open, trigger, }), + generateKey: false, overrideProps: this.handleMenuButtonOverrides, }, )} @@ -210,6 +212,7 @@ class SplitButton extends AutoControlledComponent, secondary, ...accessibility.attributes.toggleButton, }), + generateKey: false, overrideProps: (predefinedProps: ButtonProps) => ({ onClick: (e: React.SyntheticEvent, buttonProps: ButtonProps) => { _.invoke(predefinedProps, 'onClick', e, buttonProps) diff --git a/packages/react/src/components/Status/Status.tsx b/packages/react/src/components/Status/Status.tsx index b1635a00ee..3eb731afa0 100644 --- a/packages/react/src/components/Status/Status.tsx +++ b/packages/react/src/components/Status/Status.tsx @@ -67,6 +67,7 @@ class Status extends UIComponent, any> { variables: variables.icon, xSpacing: 'none', }), + generateKey: false, })} ) diff --git a/packages/react/src/components/Table/Table.tsx b/packages/react/src/components/Table/Table.tsx index 61e448a882..3b3abbc8c9 100644 --- a/packages/react/src/components/Table/Table.tsx +++ b/packages/react/src/components/Table/Table.tsx @@ -110,6 +110,7 @@ class Table extends UIComponent> { ? accessibility.childBehaviors.row : undefined, }), + generateKey: true, overrideProps, }) }) @@ -134,6 +135,7 @@ class Table extends UIComponent> { ...headerRowProps, accessibility: accessibility.childBehaviors ? accessibility.childBehaviors.row : undefined, }), + generateKey: false, overrideProps, }) } diff --git a/packages/react/src/components/Table/TableCell.tsx b/packages/react/src/components/Table/TableCell.tsx index 69061c31f6..95591b200d 100644 --- a/packages/react/src/components/Table/TableCell.tsx +++ b/packages/react/src/components/Table/TableCell.tsx @@ -103,6 +103,7 @@ class TableCell extends UIComponent, any> { ? children : Box.create(content, { defaultProps: () => ({ as: 'div', styles: styles.content }), + generateKey: false, })} diff --git a/packages/react/src/components/Table/TableRow.tsx b/packages/react/src/components/Table/TableRow.tsx index b467543080..e157857698 100644 --- a/packages/react/src/components/Table/TableRow.tsx +++ b/packages/react/src/components/Table/TableRow.tsx @@ -111,6 +111,7 @@ class TableRow extends UIComponent, any> { return TableCell.create(item, { defaultProps: () => cellProps, + generateKey: true, overrideProps, }) }) diff --git a/packages/react/src/components/Toolbar/Toolbar.tsx b/packages/react/src/components/Toolbar/Toolbar.tsx index dee7555ee0..fe341860b5 100644 --- a/packages/react/src/components/Toolbar/Toolbar.tsx +++ b/packages/react/src/components/Toolbar/Toolbar.tsx @@ -162,18 +162,28 @@ class Toolbar extends UIComponent> { switch (kind) { case 'divider': - return ToolbarDivider.create(item, { overrideProps: itemOverridesFn }) + return ToolbarDivider.create(item, { + generateKey: true, + overrideProps: itemOverridesFn, + }) case 'group': - return ToolbarRadioGroup.create(item, { overrideProps: itemOverridesFn }) + return ToolbarRadioGroup.create(item, { + generateKey: true, + overrideProps: itemOverridesFn, + }) case 'toggle': return ToolbarItem.create(item, { defaultProps: () => ({ accessibility: toggleButtonBehavior }), + generateKey: true, overrideProps: itemOverridesFn, }) case 'custom': - return ToolbarCustomItem.create(item, { overrideProps: itemOverridesFn }) + return ToolbarCustomItem.create(item, { + generateKey: true, + overrideProps: itemOverridesFn, + }) default: - return ToolbarItem.create(item, { overrideProps: itemOverridesFn }) + return ToolbarItem.create(item, { generateKey: true, overrideProps: itemOverridesFn }) } }, ) @@ -474,6 +484,7 @@ class Toolbar extends UIComponent> { defaultProps: () => ({ icon: { name: 'more', outline: true }, }), + generateKey: false, overrideProps: { menu: this.props.overflowOpen ? this.getOverflowItems() : [], menuOpen: this.props.overflowOpen, diff --git a/packages/react/src/components/Toolbar/ToolbarItem.tsx b/packages/react/src/components/Toolbar/ToolbarItem.tsx index b0b9f4239e..45bfafd9a9 100644 --- a/packages/react/src/components/Toolbar/ToolbarItem.tsx +++ b/packages/react/src/components/Toolbar/ToolbarItem.tsx @@ -236,6 +236,7 @@ class ToolbarItem extends UIComponent> { targetRef={this.itemRef} > {ToolbarMenu.create(menu, { + generateKey: false, overrideProps: this.handleMenuOverrides(getRefs, variables), })} @@ -256,6 +257,7 @@ class ToolbarItem extends UIComponent> { defaultProps: () => ({ trapFocus: true, }), + generateKey: false, overrideProps: { trigger: itemElement, children: undefined, // force-reset `children` defined for `Popup` as it collides with the `trigger` @@ -279,6 +281,7 @@ class ToolbarItem extends UIComponent> { ...accessibility.attributes.wrapper, ...applyAccessibilityKeyHandlers(accessibility.keyHandlers.wrapper, wrapper), }), + generateKey: false, overrideProps: predefinedProps => ({ children: contentElement, onClick: e => { diff --git a/packages/react/src/components/Toolbar/ToolbarMenu.tsx b/packages/react/src/components/Toolbar/ToolbarMenu.tsx index e54d66cd01..5147a52385 100644 --- a/packages/react/src/components/Toolbar/ToolbarMenu.tsx +++ b/packages/react/src/components/Toolbar/ToolbarMenu.tsx @@ -113,14 +113,21 @@ class ToolbarMenu extends UIComponent { switch (kind) { case 'divider': - return ToolbarMenuDivider.create(item, { overrideProps: dividerOverridesFn }) + return ToolbarMenuDivider.create(item, { + generateKey: true, + overrideProps: dividerOverridesFn, + }) case 'group': - return ToolbarMenuRadioGroup.create(item, { overrideProps: radioGroupOverrides }) + return ToolbarMenuRadioGroup.create(item, { + generateKey: true, + overrideProps: radioGroupOverrides, + }) case 'toggle': return ToolbarMenuItem.create(item, { defaultProps: () => ({ accessibility: toolbarMenuItemCheckboxBehavior }), + generateKey: true, overrideProps: itemOverridesFn, }) @@ -130,6 +137,7 @@ class ToolbarMenu extends UIComponent { submenuIndicator, inSubmenu: submenu, }), + generateKey: true, overrideProps: itemOverridesFn, }) } diff --git a/packages/react/src/components/Toolbar/ToolbarMenuItem.tsx b/packages/react/src/components/Toolbar/ToolbarMenuItem.tsx index 55b5a709f0..1dbf490a3e 100644 --- a/packages/react/src/components/Toolbar/ToolbarMenuItem.tsx +++ b/packages/react/src/components/Toolbar/ToolbarMenuItem.tsx @@ -298,6 +298,7 @@ class ToolbarMenuItem extends AutoControlledComponent< <> {Icon.create(icon, { defaultProps: () => ({ xSpacing: !!content ? 'after' : 'none' }), + generateKey: false, })} {content} {active && @@ -306,6 +307,7 @@ class ToolbarMenuItem extends AutoControlledComponent< className: ToolbarMenuItem.slotClassNames.activeIndicator, styles: styles.activeIndicator, }), + generateKey: false, })} {menu && Icon.create(submenuIndicator, { @@ -313,6 +315,7 @@ class ToolbarMenuItem extends AutoControlledComponent< name: 'icon-menu-arrow-end', styles: styles.submenuIndicator, }), + generateKey: false, })} )} @@ -329,6 +332,7 @@ class ToolbarMenuItem extends AutoControlledComponent< e.stopPropagation() }, }), + generateKey: false, overrideProps: { trigger: elementType, children: undefined, // force-reset `children` defined for `Popup` as it collides with the `trigger` @@ -357,6 +361,7 @@ class ToolbarMenuItem extends AutoControlledComponent< submenu: true, submenuIndicator, }), + generateKey: false, overrideProps: this.handleMenuOverrides(getRefs), })} @@ -381,6 +386,7 @@ class ToolbarMenuItem extends AutoControlledComponent< ...accessibility.attributes.wrapper, ...applyAccessibilityKeyHandlers(accessibility.keyHandlers.wrapper, wrapper), }), + generateKey: false, overrideProps: () => ({ children: ( <> diff --git a/packages/react/src/components/Toolbar/ToolbarMenuRadioGroup.tsx b/packages/react/src/components/Toolbar/ToolbarMenuRadioGroup.tsx index 088f98656b..5fe0af6240 100644 --- a/packages/react/src/components/Toolbar/ToolbarMenuRadioGroup.tsx +++ b/packages/react/src/components/Toolbar/ToolbarMenuRadioGroup.tsx @@ -114,6 +114,7 @@ class ToolbarMenuRadioGroup extends UIComponent> this.itemRefs[index] = ref if (kind === 'divider') { - return ToolbarDivider.create(item, { overrideProps: itemOverridesFn }) + return ToolbarDivider.create(item, { generateKey: true, overrideProps: itemOverridesFn }) } const toolbarItem = ToolbarItem.create(item, { @@ -133,6 +133,7 @@ class ToolbarRadioGroup extends UIComponent> accessibility: toolbarRadioGroupItemBehavior, active: activeIndex === index, }), + generateKey: true, overrideProps: itemOverridesFn, }) diff --git a/packages/react/src/components/Tooltip/Tooltip.tsx b/packages/react/src/components/Tooltip/Tooltip.tsx index 2762a27ac2..e1ecccd9bd 100644 --- a/packages/react/src/components/Tooltip/Tooltip.tsx +++ b/packages/react/src/components/Tooltip/Tooltip.tsx @@ -290,6 +290,7 @@ export default class Tooltip extends AutoControlledComponent, TreeState> { contentRef: elementRef, ...restItemForRender, }), + generateKey: true, overrideProps: this.handleTreeItemOverrides, }) diff --git a/packages/react/src/components/Tree/TreeItem.tsx b/packages/react/src/components/Tree/TreeItem.tsx index ee5b1847a1..73a5289155 100644 --- a/packages/react/src/components/Tree/TreeItem.tsx +++ b/packages/react/src/components/Tree/TreeItem.tsx @@ -208,6 +208,7 @@ class TreeItem extends UIComponent, TreeItemState> { ? accessibility.childBehaviors.title : undefined, }), + generateKey: false, render: renderItemTitle, overrideProps: this.handleTitleOverrides, }) diff --git a/packages/react/src/utils/factories.ts b/packages/react/src/utils/factories.ts index 8c0f4855c8..fa14b2b553 100644 --- a/packages/react/src/utils/factories.ts +++ b/packages/react/src/utils/factories.ts @@ -22,7 +22,7 @@ interface CreateShorthandOptions

{ overrideProps?: Partial> | ((props: P) => Partial>) /** Whether or not automatic key generation is allowed */ - generateKey?: boolean + generateKey: boolean /** Override the default render implementation. */ render?: ShorthandRenderFunction

@@ -46,7 +46,7 @@ export function createShorthand

({ mappedProp, mappedArrayProp, valueOrRenderCallback, - options = {}, + options = { generateKey: false }, }: { Component: React.ElementType allowsJSX?: boolean @@ -258,12 +258,9 @@ function createShorthandFromValue

({ } // ---------------------------------------- - // Get key - // ---------------------------------------- - const { generateKey = true } = options - // Use key or generate key - if (generateKey && _.isNil(props.key)) { + // ---------------------------------------- + if (options.generateKey && _.isNil(props.key)) { if (valIsPrimitive) { // use string/number shorthand values as the key ;(props as any).key = value diff --git a/packages/react/test/specs/utils/factories-test.tsx b/packages/react/test/specs/utils/factories-test.tsx index bcee29f62e..0e1e462ae3 100644 --- a/packages/react/test/specs/utils/factories-test.tsx +++ b/packages/react/test/specs/utils/factories-test.tsx @@ -30,7 +30,7 @@ const getShorthand = ({ mappedProp = '', mappedArrayProp = '', overrideProps, - generateKey, + generateKey = true, valueOrRenderCallback, render, }: ShorthandConfig) =>