Skip to content

Commit

Permalink
[core] Generic props for FormControl, FormLabel, List (#15292)
Browse files Browse the repository at this point in the history
This PR adds v4 typings for FormControl, FormLabel, and List components. It also includes some small changes to clean up the TS demos for this components.

Co-authored-by: Sebastian Silbermann <[email protected]>
  • Loading branch information
sperry94 and eps1lon committed Apr 11, 2019
1 parent d1d56fc commit 1d6425d
Show file tree
Hide file tree
Showing 10 changed files with 59 additions and 74 deletions.
2 changes: 1 addition & 1 deletion docs/src/pages/demos/breadcrumbs/RouterBreadcrumbs.js
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,7 @@ class RouterBreadcrumbs extends React.Component {
<List component="nav">
<ListItemLink to="/inbox" open={this.state.open} onClick={this.handleClick} />
<Collapse in={this.state.open} timeout="auto" unmountOnExit>
<List component={'div'} disablePadding>
<List component="div" disablePadding>
<ListItemLink to="/inbox/important" className={classes.nested} />
</List>
</Collapse>
Expand Down
2 changes: 1 addition & 1 deletion docs/src/pages/demos/breadcrumbs/RouterBreadcrumbs.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -126,7 +126,7 @@ class RouterBreadcrumbs extends React.Component<RouterBreadcrumbsProp, RouterBre
<List component="nav">
<ListItemLink to="/inbox" open={this.state.open} onClick={this.handleClick} />
<Collapse in={this.state.open} timeout="auto" unmountOnExit>
<List component={'div' as 'ul'} disablePadding>
<List component="div" disablePadding>
<ListItemLink to="/inbox/important" className={classes.nested} />
</List>
</Collapse>
Expand Down
8 changes: 4 additions & 4 deletions docs/src/pages/demos/selection-controls/CheckboxesGroup.js
Original file line number Diff line number Diff line change
Expand Up @@ -33,8 +33,8 @@ function CheckboxesGroup() {

return (
<div className={classes.root}>
<FormControl component={'fieldset'} className={classes.formControl}>
<FormLabel component={'legend'}>Assign responsibility</FormLabel>
<FormControl component="fieldset" className={classes.formControl}>
<FormLabel component="legend">Assign responsibility</FormLabel>
<FormGroup>
<FormControlLabel
control={<Checkbox checked={gilad} onChange={handleChange('gilad')} value="gilad" />}
Expand All @@ -53,8 +53,8 @@ function CheckboxesGroup() {
</FormGroup>
<FormHelperText>Be careful</FormHelperText>
</FormControl>
<FormControl required error={error} component={'fieldset'} className={classes.formControl}>
<FormLabel component={'legend'}>Pick two</FormLabel>
<FormControl required error={error} component="fieldset" className={classes.formControl}>
<FormLabel component="legend">Pick two</FormLabel>
<FormGroup>
<FormControlLabel
control={<Checkbox checked={gilad} onChange={handleChange('gilad')} value="gilad" />}
Expand Down
13 changes: 4 additions & 9 deletions docs/src/pages/demos/selection-controls/CheckboxesGroup.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -33,8 +33,8 @@ function CheckboxesGroup() {

return (
<div className={classes.root}>
<FormControl component={'fieldset' as 'div'} className={classes.formControl}>
<FormLabel component={'legend' as 'label'}>Assign responsibility</FormLabel>
<FormControl component="fieldset" className={classes.formControl}>
<FormLabel component="legend">Assign responsibility</FormLabel>
<FormGroup>
<FormControlLabel
control={<Checkbox checked={gilad} onChange={handleChange('gilad')} value="gilad" />}
Expand All @@ -53,13 +53,8 @@ function CheckboxesGroup() {
</FormGroup>
<FormHelperText>Be careful</FormHelperText>
</FormControl>
<FormControl
required
error={error}
component={'fieldset' as 'div'}
className={classes.formControl}
>
<FormLabel component={'legend' as 'label'}>Pick two</FormLabel>
<FormControl required error={error} component="fieldset" className={classes.formControl}>
<FormLabel component="legend">Pick two</FormLabel>
<FormGroup>
<FormControlLabel
control={<Checkbox checked={gilad} onChange={handleChange('gilad')} value="gilad" />}
Expand Down
2 changes: 1 addition & 1 deletion docs/src/pages/demos/text-fields/ComposedTextField.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ interface State {
}

class ComposedTextField extends React.Component<Props, State> {
label = React.createRef<HTMLElement>();
label = React.createRef<HTMLLabelElement>();

state = {
labelWidth: 0,
Expand Down
31 changes: 17 additions & 14 deletions packages/material-ui/src/FormControl/FormControl.d.ts
Original file line number Diff line number Diff line change
@@ -1,21 +1,24 @@
import * as React from 'react';
import { StandardProps, PropTypes } from '..';
import { PropTypes } from '..';
import { OverridableComponent, SimplifiedPropsOf } from '../OverridableComponent';

export interface FormControlProps
extends StandardProps<React.HtmlHTMLAttributes<HTMLDivElement>, FormControlClassKey> {
component?: React.ElementType<React.HtmlHTMLAttributes<HTMLDivElement>>;
disabled?: boolean;
error?: boolean;
fullWidth?: boolean;
margin?: PropTypes.Margin;
onBlur?: React.EventHandler<any>;
onFocus?: React.EventHandler<any>;
required?: boolean;
variant?: 'standard' | 'outlined' | 'filled';
}
declare const FormControl: OverridableComponent<{
props: {
disabled?: boolean;
error?: boolean;
fullWidth?: boolean;
margin?: PropTypes.Margin;
onBlur?: React.EventHandler<any>;
onFocus?: React.EventHandler<any>;
required?: boolean;
variant?: 'standard' | 'outlined' | 'filled';
};
defaultComponent: 'div';
classKey: FormControlClassKey;
}>;

export type FormControlClassKey = 'root' | 'marginNormal' | 'marginDense' | 'fullWidth';

declare const FormControl: React.ComponentType<FormControlProps>;
export type FormControlProps = SimplifiedPropsOf<typeof FormControl>;

export default FormControl;
12 changes: 0 additions & 12 deletions packages/material-ui/src/FormControl/FormControl.spec.tsx

This file was deleted.

32 changes: 15 additions & 17 deletions packages/material-ui/src/FormLabel/FormLabel.d.ts
Original file line number Diff line number Diff line change
@@ -1,21 +1,17 @@
import * as React from 'react';
import { StandardProps } from '..';
import { OverridableComponent, SimplifiedPropsOf } from '../OverridableComponent';

export interface FormLabelProps extends StandardProps<FormLabelBaseProps, FormLabelClassKey> {
component?: React.ElementType<FormLabelBaseProps>;
disabled?: boolean;
error?: boolean;
filled?: boolean;
focused?: boolean;
/**
* Should only be used if ref forwarding `component` is used.
* This is imprecise if `<FormLabel component={SomeComponent} />` is used.
*/
ref?: React.Ref<HTMLElement>;
required?: boolean;
}

export type FormLabelBaseProps = React.LabelHTMLAttributes<HTMLLabelElement>;
declare const FormLabel: OverridableComponent<{
props: FormLabelBaseProps & {
disabled?: boolean;
error?: boolean;
filled?: boolean;
focused?: boolean;
required?: boolean;
};
defaultComponent: 'label';
classKey: FormLabelClassKey;
}>;

export type FormLabelClassKey =
| 'root'
Expand All @@ -26,6 +22,8 @@ export type FormLabelClassKey =
| 'required'
| 'asterisk';

declare const FormLabel: React.ComponentType<FormLabelProps>;
export type FormLabelBaseProps = React.LabelHTMLAttributes<HTMLLabelElement>;

export type FormLabelProps = SimplifiedPropsOf<typeof FormLabel>;

export default FormLabel;
20 changes: 11 additions & 9 deletions packages/material-ui/src/List/List.d.ts
Original file line number Diff line number Diff line change
@@ -1,16 +1,18 @@
import * as React from 'react';
import { StandardProps } from '..';
import { OverridableComponent, SimplifiedPropsOf } from '../OverridableComponent';

export interface ListProps
extends StandardProps<React.HTMLAttributes<HTMLUListElement>, ListClassKey> {
component?: React.ElementType<React.HTMLAttributes<HTMLUListElement>>;
dense?: boolean;
disablePadding?: boolean;
subheader?: React.ReactElement;
}
declare const List: OverridableComponent<{
props: {
dense?: boolean;
disablePadding?: boolean;
subheader?: React.ReactElement;
};
defaultComponent: 'ul';
classKey: ListClassKey;
}>;

export type ListClassKey = 'root' | 'padding' | 'dense' | 'subheader';

declare const List: React.ComponentType<ListProps>;
export type ListProps = SimplifiedPropsOf<typeof List>;

export default List;
11 changes: 5 additions & 6 deletions packages/material-ui/src/List/List.spec.tsx
Original file line number Diff line number Diff line change
@@ -1,15 +1,14 @@
import * as React from 'react';
import List from '@material-ui/core/List';

// use other components
// custom host
// https://github.com/mui-org/material-ui/issues/13746
{
// HTMLDivElement is not assignable to HTMLUlElement #v4-typings
<List component="div" />; // $ExpectError
<List component="div" />;
<List
component={'div' as 'ul'}
onChange={e => {
e.currentTarget; // $ExpectType EventTarget & HTMLUListElement
component="div"
onChange={(e: React.FormEvent<HTMLDivElement>) => {
e.currentTarget;
}}
/>;
}

0 comments on commit 1d6425d

Please sign in to comment.