Skip to content

Commit 1c07381

Browse files
fix: add isReadOnly props and useRenderProps (#8818)
* add isReadOnly props and useRenderProps * update * update * fix lint, update stories for testing --------- Co-authored-by: Yihui Liao <[email protected]>
1 parent f74b9ad commit 1c07381

File tree

3 files changed

+62
-16
lines changed

3 files changed

+62
-16
lines changed

packages/react-aria-components/src/DateField.tsx

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,12 @@ export interface DateFieldRenderProps {
3838
* Whether the date field is disabled.
3939
* @selector [data-disabled]
4040
*/
41-
isDisabled: boolean
41+
isDisabled: boolean,
42+
/**
43+
* Whether the date field is read only.
44+
* @selector [data-readonly]
45+
*/
46+
isReadOnly: boolean
4247
}
4348
export interface DateFieldProps<T extends DateValue> extends Omit<AriaDateFieldProps<T>, 'label' | 'description' | 'errorMessage' | 'validationState' | 'validationBehavior'>, RACValidation, RenderProps<DateFieldRenderProps>, SlotProps, GlobalDOMAttributes<HTMLDivElement> {}
4449
export interface TimeFieldProps<T extends TimeValue> extends Omit<AriaTimeFieldProps<T>, 'label' | 'description' | 'errorMessage' | 'validationState' | 'validationBehavior'>, RACValidation, RenderProps<DateFieldRenderProps>, SlotProps, GlobalDOMAttributes<HTMLDivElement> {}
@@ -81,7 +86,8 @@ export const DateField = /*#__PURE__*/ (forwardRef as forwardRefType)(function D
8186
values: {
8287
state,
8388
isInvalid: state.isInvalid,
84-
isDisabled: state.isDisabled
89+
isDisabled: state.isDisabled,
90+
isReadOnly: state.isReadOnly
8591
},
8692
defaultClassName: 'react-aria-DateField'
8793
});
@@ -110,7 +116,8 @@ export const DateField = /*#__PURE__*/ (forwardRef as forwardRefType)(function D
110116
ref={ref}
111117
slot={props.slot || undefined}
112118
data-invalid={state.isInvalid || undefined}
113-
data-disabled={state.isDisabled || undefined} />
119+
data-disabled={state.isDisabled || undefined}
120+
data-readonly={state.isReadOnly || undefined} />
114121
<HiddenDateInput
115122
autoComplete={props.autoComplete}
116123
name={props.name}
@@ -152,7 +159,8 @@ export const TimeField = /*#__PURE__*/ (forwardRef as forwardRefType)(function T
152159
values: {
153160
state,
154161
isInvalid: state.isInvalid,
155-
isDisabled: state.isDisabled
162+
isDisabled: state.isDisabled,
163+
isReadOnly: state.isReadOnly
156164
},
157165
defaultClassName: 'react-aria-TimeField'
158166
});
@@ -181,7 +189,8 @@ export const TimeField = /*#__PURE__*/ (forwardRef as forwardRefType)(function T
181189
ref={ref}
182190
slot={props.slot || undefined}
183191
data-invalid={state.isInvalid || undefined}
184-
data-disabled={state.isDisabled || undefined} />
192+
data-disabled={state.isDisabled || undefined}
193+
data-readonly={state.isReadOnly || undefined} />
185194
</Provider>
186195
);
187196
});

packages/react-aria-components/src/DatePicker.tsx

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,11 @@ export interface DatePickerRenderProps {
4343
* @selector [data-disabled]
4444
*/
4545
isDisabled: boolean,
46+
/**
47+
* Whether the date picker is read only.
48+
* @selector [data-readonly]
49+
*/
50+
isReadOnly: boolean,
4651
/**
4752
* Whether the date picker is invalid.
4853
* @selector [data-invalid]
@@ -130,7 +135,8 @@ export const DatePicker = /*#__PURE__*/ (forwardRef as forwardRefType)(function
130135
isFocusVisible,
131136
isDisabled: props.isDisabled || false,
132137
isInvalid: state.isInvalid,
133-
isOpen: state.isOpen
138+
isOpen: state.isOpen,
139+
isReadOnly: props.isReadOnly || false
134140
},
135141
defaultClassName: 'react-aria-DatePicker'
136142
});
@@ -172,6 +178,7 @@ export const DatePicker = /*#__PURE__*/ (forwardRef as forwardRefType)(function
172178
data-invalid={state.isInvalid || undefined}
173179
data-focus-visible={isFocusVisible || undefined}
174180
data-disabled={props.isDisabled || undefined}
181+
data-readonly={props.isReadOnly || undefined}
175182
data-open={state.isOpen || undefined} />
176183
<HiddenDateInput
177184
autoComplete={props.autoComplete}
@@ -238,7 +245,8 @@ export const DateRangePicker = /*#__PURE__*/ (forwardRef as forwardRefType)(func
238245
isFocusVisible,
239246
isDisabled: props.isDisabled || false,
240247
isInvalid: state.isInvalid,
241-
isOpen: state.isOpen
248+
isOpen: state.isOpen,
249+
isReadOnly: props.isReadOnly || false
242250
},
243251
defaultClassName: 'react-aria-DateRangePicker'
244252
});
@@ -285,6 +293,7 @@ export const DateRangePicker = /*#__PURE__*/ (forwardRef as forwardRefType)(func
285293
data-invalid={state.isInvalid || undefined}
286294
data-focus-visible={isFocusVisible || undefined}
287295
data-disabled={props.isDisabled || undefined}
296+
data-readonly={props.isReadOnly || undefined}
288297
data-open={state.isOpen || undefined} />
289298
</Provider>
290299
);

packages/react-aria-components/stories/DatePicker.stories.tsx

Lines changed: 37 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,41 @@ import './styles.css';
2020

2121
export default {
2222
title: 'React Aria Components/DatePicker',
23-
component: DatePicker
23+
component: DatePicker,
24+
argTypes: {
25+
onChange: {
26+
table: {
27+
disable: true
28+
}
29+
},
30+
granularity: {
31+
control: 'select',
32+
options: ['day', 'hour', 'minute', 'second']
33+
},
34+
isRequired: {
35+
control: 'boolean'
36+
},
37+
isInvalid: {
38+
control: 'boolean'
39+
},
40+
isDisabled: {
41+
control: 'boolean'
42+
},
43+
isReadOnly: {
44+
control: 'boolean'
45+
},
46+
validationBehavior: {
47+
control: 'select',
48+
options: ['native', 'aria']
49+
}
50+
}
2451
} as Meta<typeof DatePicker>;
2552

2653
export type DatePickerStory = StoryFn<typeof DatePicker>;
54+
export type DateRangePickerStory = StoryFn<typeof DateRangePicker>;
2755

28-
export const DatePickerExample: DatePickerStory = () => (
29-
<DatePicker data-testid="date-picker-example">
56+
export const DatePickerExample: DatePickerStory = (args) => (
57+
<DatePicker data-testid="date-picker-example" {...args}>
3058
<Label style={{display: 'block'}}>Date</Label>
3159
<Group style={{display: 'inline-flex'}}>
3260
<DateInput className={styles.field}>
@@ -58,8 +86,8 @@ export const DatePickerExample: DatePickerStory = () => (
5886
</DatePicker>
5987
);
6088

61-
export const DatePickerTriggerWidthExample: DatePickerStory = () => (
62-
<DatePicker data-testid="date-picker-example">
89+
export const DatePickerTriggerWidthExample: DatePickerStory = (args) => (
90+
<DatePicker data-testid="date-picker-example" {...args}>
6391
<Label style={{display: 'block'}}>Date</Label>
6492
<Group style={{display: 'inline-flex', width: 300}}>
6593
<DateInput className={styles.field} style={{flex: 1}}>
@@ -93,8 +121,8 @@ export const DatePickerTriggerWidthExample: DatePickerStory = () => (
93121
</DatePicker>
94122
);
95123

96-
export const DateRangePickerExample: DatePickerStory = () => (
97-
<DateRangePicker data-testid="date-range-picker-example">
124+
export const DateRangePickerExample: DateRangePickerStory = (args) => (
125+
<DateRangePicker data-testid="date-range-picker-example" {...args}>
98126
<Label style={{display: 'block'}}>Date</Label>
99127
<Group style={{display: 'inline-flex'}}>
100128
<div className={styles.field}>
@@ -132,8 +160,8 @@ export const DateRangePickerExample: DatePickerStory = () => (
132160
</DateRangePicker>
133161
);
134162

135-
export const DateRangePickerTriggerWidthExample: DatePickerStory = () => (
136-
<DateRangePicker data-testid="date-range-picker-example">
163+
export const DateRangePickerTriggerWidthExample: DateRangePickerStory = (args) => (
164+
<DateRangePicker data-testid="date-range-picker-example" {...args}>
137165
<Label style={{display: 'block'}}>Date</Label>
138166
<Group style={{display: 'inline-flex', width: 300}}>
139167
<div className={styles.field} style={{flex: 1}}>

0 commit comments

Comments
 (0)