Skip to content

Commit 8ff0b98

Browse files
authored
feat: Allow collection items to be values other than objects (#10047)
* feat: Allow collection items to be values other than objects * review comments
1 parent 2acd443 commit 8ff0b98

63 files changed

Lines changed: 359 additions & 275 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

packages/@react-spectrum/s2/src/ActionMenu.tsx

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -51,9 +51,10 @@ export const ActionMenuContext =
5151
/**
5252
* ActionMenu combines an ActionButton with a Menu for simple "more actions" use cases.
5353
*/
54-
export const ActionMenu = /*#__PURE__*/ (forwardRef as forwardRefType)(function ActionMenu<
55-
T extends object
56-
>(props: ActionMenuProps<T>, ref: FocusableRef<HTMLButtonElement>) {
54+
export const ActionMenu = /*#__PURE__*/ (forwardRef as forwardRefType)(function ActionMenu<T>(
55+
props: ActionMenuProps<T>,
56+
ref: FocusableRef<HTMLButtonElement>
57+
) {
5758
let stringFormatter = useLocalizedStringFormatter(intlMessages, '@react-spectrum/s2');
5859
[props, ref] = useSpectrumContextProps(props, ref, ActionMenuContext);
5960
let buttonProps = filterDOMProps(props, {labelable: true});

packages/@react-spectrum/s2/src/Breadcrumbs.tsx

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -140,9 +140,10 @@ const wrapper = style<BreadcrumbsStyleProps>(
140140
const InternalBreadcrumbsContext = createContext<Partial<BreadcrumbsProps<any>>>({});
141141

142142
/** Breadcrumbs show hierarchy and navigational context for a user's location within an application. */
143-
export const Breadcrumbs = /*#__PURE__*/ (forwardRef as forwardRefType)(function Breadcrumbs<
144-
T extends object
145-
>(props: BreadcrumbsProps<T>, ref: DOMRef<HTMLOListElement>) {
143+
export const Breadcrumbs = /*#__PURE__*/ (forwardRef as forwardRefType)(function Breadcrumbs<T>(
144+
props: BreadcrumbsProps<T>,
145+
ref: DOMRef<HTMLOListElement>
146+
) {
146147
[props, ref] = useSpectrumContextProps(props, ref, BreadcrumbsContext);
147148
let domRef = useDOMRef(ref);
148149
let {

packages/@react-spectrum/s2/src/CardView.tsx

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -239,9 +239,10 @@ export const CardViewContext =
239239
/**
240240
* A CardView displays a group of related objects, with support for selection and bulk actions.
241241
*/
242-
export const CardView = /*#__PURE__*/ (forwardRef as forwardRefType)(function CardView<
243-
T extends object
244-
>(props: CardViewProps<T>, ref: DOMRef<HTMLDivElement>) {
242+
export const CardView = /*#__PURE__*/ (forwardRef as forwardRefType)(function CardView<T>(
243+
props: CardViewProps<T>,
244+
ref: DOMRef<HTMLDivElement>
245+
) {
245246
[props, ref] = useSpectrumContextProps(props, ref, CardViewContext);
246247
let {
247248
children,

packages/@react-spectrum/s2/src/ComboBox.tsx

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ export interface ComboboxStyleProps {
104104
*/
105105
prefix?: ReactNode;
106106
}
107-
export interface ComboBoxProps<T extends object>
107+
export interface ComboBoxProps<T>
108108
extends
109109
Omit<
110110
AriaComboBoxProps<T>,
@@ -390,9 +390,10 @@ let InternalComboboxContext = createContext<{size: 'S' | 'M' | 'L' | 'XL'}>({siz
390390
* ComboBox allow users to choose a single option from a collapsible list of options when space is
391391
* limited.
392392
*/
393-
export const ComboBox = /*#__PURE__*/ (forwardRef as forwardRefType)(function ComboBox<
394-
T extends object
395-
>(props: ComboBoxProps<T>, ref: Ref<TextFieldRef>) {
393+
export const ComboBox = /*#__PURE__*/ (forwardRef as forwardRefType)(function ComboBox<T>(
394+
props: ComboBoxProps<T>,
395+
ref: Ref<TextFieldRef>
396+
) {
396397
[props, ref] = useSpectrumContextProps(props, ref, ComboBoxContext);
397398

398399
let formContext = useContext(FormContext);
@@ -532,11 +533,11 @@ export function ComboBoxItem(props: ComboBoxItemProps): ReactNode {
532533
);
533534
}
534535

535-
export interface ComboBoxSectionProps<T extends object> extends Omit<
536+
export interface ComboBoxSectionProps<T> extends Omit<
536537
ListBoxSectionProps<T>,
537538
'style' | 'className' | 'render' | keyof GlobalDOMAttributes
538539
> {}
539-
export function ComboBoxSection<T extends object>(props: ComboBoxSectionProps<T>): ReactNode {
540+
export function ComboBoxSection<T>(props: ComboBoxSectionProps<T>): ReactNode {
540541
let {size} = useContext(InternalComboboxContext);
541542
return (
542543
<>

packages/@react-spectrum/s2/src/ListBox.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ import {
1818
} from 'react-aria-components/ListBox';
1919
import {ReactNode} from 'react';
2020

21-
export function ListBox<T extends object>({children, ...props}: ListBoxProps<T>): ReactNode {
21+
export function ListBox<T>({children, ...props}: ListBoxProps<T>): ReactNode {
2222
return <AriaListBox {...props}>{children}</AriaListBox>;
2323
}
2424

packages/@react-spectrum/s2/src/ListView.tsx

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -256,9 +256,10 @@ export class S2ListLayout<T> extends ListLayout<T> {
256256
* A ListView displays a list of interactive items, and allows a user to navigate, select, or
257257
* perform an action.
258258
*/
259-
export const ListView = /*#__PURE__*/ (forwardRef as forwardRefType)(function ListView<
260-
T extends object
261-
>(props: ListViewProps<T>, ref: DOMRef<HTMLDivElement>) {
259+
export const ListView = /*#__PURE__*/ (forwardRef as forwardRefType)(function ListView<T>(
260+
props: ListViewProps<T>,
261+
ref: DOMRef<HTMLDivElement>
262+
) {
262263
[props, ref] = useSpectrumContextProps(props, ref, ListViewContext);
263264
let {
264265
children,

packages/@react-spectrum/s2/src/Menu.tsx

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -423,7 +423,7 @@ let wrappingDiv = style({
423423
/**
424424
* Menus display a list of actions or options that a user can choose.
425425
*/
426-
export const Menu = /*#__PURE__*/ (forwardRef as forwardRefType)(function Menu<T extends object>(
426+
export const Menu = /*#__PURE__*/ (forwardRef as forwardRefType)(function Menu<T>(
427427
props: MenuProps<T>,
428428
ref: DOMRef<HTMLDivElement>
429429
) {
@@ -510,12 +510,12 @@ export function Divider(props: SeparatorProps): ReactNode {
510510
);
511511
}
512512

513-
export interface MenuSectionProps<T extends object> extends Omit<
513+
export interface MenuSectionProps<T> extends Omit<
514514
AriaMenuSectionProps<T>,
515515
'style' | 'className' | 'render' | keyof GlobalDOMAttributes
516516
> {}
517517

518-
export function MenuSection<T extends object>(props: MenuSectionProps<T>): ReactNode {
518+
export function MenuSection<T>(props: MenuSectionProps<T>): ReactNode {
519519
// remember, context doesn't work if it's around Section nor inside
520520
let {size} = useContext(InternalMenuContext);
521521
return (
@@ -833,8 +833,8 @@ function UnavailableMenuItemTrigger(props: UnavailableMenuItemTriggerProps): JSX
833833
export {MenuTrigger, SubmenuTrigger, UnavailableMenuItemTrigger};
834834

835835
// This is purely so that storybook generates the types for both Menu and MenuTrigger
836-
interface ICombined<T extends object> extends MenuProps<T>, Omit<MenuTriggerProps, 'children'> {}
836+
interface ICombined<T> extends MenuProps<T>, Omit<MenuTriggerProps, 'children'> {}
837837
// eslint-disable-next-line @typescript-eslint/no-unused-vars
838-
export function CombinedMenu<T extends object>(props: ICombined<T>): ReactNode {
838+
export function CombinedMenu<T>(props: ICombined<T>): ReactNode {
839839
return <div />;
840840
}

packages/@react-spectrum/s2/src/Picker.tsx

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ export interface PickerStyleProps {
119119
}
120120

121121
type SelectionMode = 'single' | 'multiple';
122-
export interface PickerProps<T extends object, M extends SelectionMode = 'single'>
122+
export interface PickerProps<T, M extends SelectionMode = 'single'>
123123
extends
124124
Omit<
125125
AriaSelectProps<T, M>,
@@ -320,7 +320,7 @@ let InsideSelectValueContext = createContext(false);
320320
* limited.
321321
*/
322322
export const Picker = /*#__PURE__*/ (forwardRef as forwardRefType)(function Picker<
323-
T extends object,
323+
T,
324324
M extends SelectionMode = 'single'
325325
>(props: PickerProps<T, M>, ref: FocusableRef<HTMLButtonElement>) {
326326
let stringFormatter = useLocalizedStringFormatter(intlMessages, '@react-spectrum/s2');
@@ -570,7 +570,7 @@ let INTERACTIVE_ARIA_ROLES = new Set([
570570
'treeitem'
571571
]);
572572

573-
interface PickerButtonInnerProps<T extends object>
573+
interface PickerButtonInnerProps<T>
574574
extends
575575
PickerStyleProps,
576576
Omit<AriaSelectRenderProps, 'isRequired' | 'isFocused'>,
@@ -580,7 +580,7 @@ interface PickerButtonInnerProps<T extends object>
580580
}
581581

582582
// Needs to be hidable component or otherwise the PressResponder throws a warning when rendered in the fake DOM and tries to register
583-
const PickerButton = createHideableComponent(function PickerButton<T extends object>(
583+
const PickerButton = createHideableComponent(function PickerButton<T>(
584584
props: PickerButtonInnerProps<T>
585585
) {
586586
let {
@@ -880,11 +880,11 @@ function DefaultProvider({
880880
return <context.Provider value={value}>{children}</context.Provider>;
881881
}
882882

883-
export interface PickerSectionProps<T extends object> extends Omit<
883+
export interface PickerSectionProps<T> extends Omit<
884884
ListBoxSectionProps<T>,
885885
'style' | 'className' | 'render' | keyof GlobalDOMAttributes
886886
> {}
887-
export function PickerSection<T extends object>(props: PickerSectionProps<T>): ReactNode {
887+
export function PickerSection<T>(props: PickerSectionProps<T>): ReactNode {
888888
let {size} = useContext(InternalPickerContext);
889889
return (
890890
<>

packages/@react-spectrum/s2/src/SelectBoxGroup.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -415,7 +415,7 @@ export function SelectBox(props: SelectBoxProps): ReactNode {
415415
* SelectBoxGroup allows users to select one or more options from a list.
416416
*/
417417
export const SelectBoxGroup = /*#__PURE__*/ (forwardRef as forwardRefType)(function SelectBoxGroup<
418-
T extends object
418+
T
419419
>(props: SelectBoxGroupProps<T>, ref: DOMRef<HTMLDivElement>) {
420420
[props, ref] = useSpectrumContextProps(props, ref, SelectBoxGroupContext);
421421

packages/@react-spectrum/s2/src/TableView.tsx

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -580,9 +580,10 @@ export interface TableBodyProps<T> extends Omit<
580580
/**
581581
* The body of a `<Table>`, containing the table rows.
582582
*/
583-
export const TableBody = /*#__PURE__*/ (forwardRef as forwardRefType)(function TableBody<
584-
T extends object
585-
>(props: TableBodyProps<T>, ref: DOMRef<HTMLDivElement>) {
583+
export const TableBody = /*#__PURE__*/ (forwardRef as forwardRefType)(function TableBody<T>(
584+
props: TableBodyProps<T>,
585+
ref: DOMRef<HTMLDivElement>
586+
) {
586587
let {items, renderEmptyState, children, dependencies = []} = props;
587588
let domRef = useDOMRef(ref);
588589
let {loadingState, onLoadMore} = useContext(InternalTableContext);
@@ -1151,9 +1152,10 @@ export interface TableHeaderProps<T> extends Omit<
11511152
/**
11521153
* A header within a `<Table>`, containing the table columns.
11531154
*/
1154-
export const TableHeader = /*#__PURE__*/ (forwardRef as forwardRefType)(function TableHeader<
1155-
T extends object
1156-
>({columns, dependencies, children}: TableHeaderProps<T>, ref: DOMRef<HTMLDivElement>) {
1155+
export const TableHeader = /*#__PURE__*/ (forwardRef as forwardRefType)(function TableHeader<T>(
1156+
{columns, dependencies, children}: TableHeaderProps<T>,
1157+
ref: DOMRef<HTMLDivElement>
1158+
) {
11571159
let scale = useScale();
11581160
let {selectionBehavior, selectionMode, allowsDragging} = useTableOptions();
11591161
let {isQuiet, selectionStyle} = useContext(InternalTableContext);
@@ -2191,7 +2193,7 @@ export interface RowProps<T>
21912193
/**
21922194
* A row within a `<Table>`.
21932195
*/
2194-
export const Row = /*#__PURE__*/ (forwardRef as forwardRefType)(function Row<T extends object>(
2196+
export const Row = /*#__PURE__*/ (forwardRef as forwardRefType)(function Row<T>(
21952197
{id, columns, children, dependencies = [], ...otherProps}: RowProps<T>,
21962198
ref: DOMRef<HTMLDivElement>
21972199
) {
@@ -2264,9 +2266,10 @@ const FooterContext = createContext(false);
22642266
/**
22652267
* A footer within a `<Table>`, containing summary rows.
22662268
*/
2267-
export const TableFooter = /*#__PURE__*/ (forwardRef as forwardRefType)(function TableFooter<
2268-
T extends object
2269-
>(props: TableFooterProps<T>, ref: DOMRef<HTMLDivElement>) {
2269+
export const TableFooter = /*#__PURE__*/ (forwardRef as forwardRefType)(function TableFooter<T>(
2270+
props: TableFooterProps<T>,
2271+
ref: DOMRef<HTMLDivElement>
2272+
) {
22702273
let domRef = useDOMRef(ref);
22712274

22722275
return (

0 commit comments

Comments
 (0)