diff --git a/example/src/FormElementsPage.react.js b/example/src/FormElementsPage.react.js index 198856be..5102475d 100644 --- a/example/src/FormElementsPage.react.js +++ b/example/src/FormElementsPage.react.js @@ -141,7 +141,7 @@ function FormElements() { - + - + diff --git a/src/components/Button/Button.react.js b/src/components/Button/Button.react.js index 4dcdb90f..4b9da341 100644 --- a/src/components/Button/Button.react.js +++ b/src/components/Button/Button.react.js @@ -24,6 +24,7 @@ type PropsForAll = {| +to?: string, +isOption?: boolean, +rootRef?: (?HTMLElement) => void, + +onClick?: (event: SyntheticMouseEvent) => mixed, |}; type DefaultButtonComponent = {| @@ -70,6 +71,8 @@ const Button = (props: Props): React.Node => { isDropdownToggle, isOption, rootRef, + to, + onClick, } = props; const classes = cn( @@ -148,8 +151,6 @@ const Button = (props: Props): React.Node => { ); } else { - const { onClick, to } = props; - const Component: React.ElementType = props.RootComponent; return ( @@ -163,4 +164,6 @@ const Button = (props: Props): React.Node => { Button.List = ButtonList; Button.Dropdown = ButtonDropdown; +Button.displayName = "Button"; + export default Button; diff --git a/src/components/Form/Form.examples.md b/src/components/Form/Form.examples.md index 8b137891..09052fde 100644 --- a/src/components/Form/Form.examples.md +++ b/src/components/Form/Form.examples.md @@ -1 +1,7 @@ +```jsx +
console.log(event.target.name + 'clicked')}> + + }> + + +``` + +```jsx +Go! + } /> +``` + diff --git a/src/components/Form/FormInputGroup.react.js b/src/components/Form/FormInputGroup.react.js index 1d432d26..11b5d1c9 100644 --- a/src/components/Form/FormInputGroup.react.js +++ b/src/components/Form/FormInputGroup.react.js @@ -2,32 +2,46 @@ import * as React from "react"; import cn from "classnames"; +import Form from "./Form.react"; +import FormInputGroupAppend from "./FormInputGroupAppend.react"; +import FormInputGroupPrepend from "./FormInputGroupPrepend.react"; +import type { Props as InputProps } from "./FormInput.react"; type Props = {| +children?: React.Node, +className?: string, - +append?: boolean, - +prepend?: boolean, + +append?: React.Node, + +prepend?: React.Node, +RootComponent?: React.ElementType, + +inputProps?: InputProps, |}; -function FormInputGroup({ - className, - children, - append, - prepend, - RootComponent, -}: Props): React.Node { +function FormInputGroup(props: Props): React.Node { + const { className, append, prepend, RootComponent, inputProps } = props; const classes = cn( { - "input-group": !append && !prepend, - "input-group-append": append, - "input-group-prepend": prepend, + "input-group": true, }, className ); const Component = RootComponent || "div"; - return {children}; + const children = inputProps ? : props.children; + + if (prepend === true) { + return {children}; + } + + if (append === true) { + return {children}; + } + + return ( + + {prepend && {prepend}} + {children} + {append && {append}} + + ); } FormInputGroup.displayName = "Form.InputGroup"; diff --git a/src/components/Form/FormInputGroupAppend.examples.md b/src/components/Form/FormInputGroupAppend.examples.md new file mode 100644 index 00000000..eb7dcfbb --- /dev/null +++ b/src/components/Form/FormInputGroupAppend.examples.md @@ -0,0 +1,14 @@ +```jsx + + + + + + +``` \ No newline at end of file diff --git a/src/components/Form/FormInputGroupAppend.react.js b/src/components/Form/FormInputGroupAppend.react.js index de258b86..278be2cc 100644 --- a/src/components/Form/FormInputGroupAppend.react.js +++ b/src/components/Form/FormInputGroupAppend.react.js @@ -2,7 +2,6 @@ import * as React from "react"; import cn from "classnames"; -import FormInputGroup from "./FormInputGroup.react"; type Props = {| +children?: React.Node, @@ -10,12 +9,8 @@ type Props = {| |}; function FormInputGroupAppend({ className, children }: Props): React.Node { - const classes = cn(className); - return ( - - {children} - - ); + const classes = cn("input-group-append", className); + return {children}; } FormInputGroupAppend.displayName = "Form.InputGroupAppend"; diff --git a/src/components/Form/FormInputGroupPrepend.examples.md b/src/components/Form/FormInputGroupPrepend.examples.md new file mode 100644 index 00000000..8eb002a9 --- /dev/null +++ b/src/components/Form/FormInputGroupPrepend.examples.md @@ -0,0 +1,14 @@ +```jsx + + + + + + +``` \ No newline at end of file diff --git a/src/components/Form/FormInputGroupPrepend.react.js b/src/components/Form/FormInputGroupPrepend.react.js index be8f95d3..beec62bc 100644 --- a/src/components/Form/FormInputGroupPrepend.react.js +++ b/src/components/Form/FormInputGroupPrepend.react.js @@ -2,7 +2,6 @@ import * as React from "react"; import cn from "classnames"; -import FormInputGroup from "./FormInputGroup.react"; type Props = {| +children?: React.Node, @@ -10,12 +9,8 @@ type Props = {| |}; function FormInputGroupPrepend({ className, children }: Props): React.Node { - const classes = cn(className); - return ( - - {children} - - ); + const classes = cn("input-group-prepend", className); + return {children}; } FormInputGroupPrepend.displayName = "Form.InputGroupPrepend"; diff --git a/src/components/Form/FormRadio.react.js b/src/components/Form/FormRadio.react.js index 29bad02f..60605f7c 100644 --- a/src/components/Form/FormRadio.react.js +++ b/src/components/Form/FormRadio.react.js @@ -6,6 +6,9 @@ import Form from "./"; type Props = {| +className?: string, + /** + * Wrap the checkbox with a label + */ +label?: string, +value?: string | number | boolean, +name?: string, @@ -32,20 +35,26 @@ function FormRadio({ { "custom-control-inline": isInline }, className ); - return ( + const inputComponent = ( + + ); + + return label ? ( + ) : ( + inputComponent ); } diff --git a/src/components/Form/FormSelect.react.js b/src/components/Form/FormSelect.react.js index 45092f77..adf71685 100644 --- a/src/components/Form/FormSelect.react.js +++ b/src/components/Form/FormSelect.react.js @@ -2,25 +2,81 @@ import * as React from "react"; import cn from "classnames"; +import FormGroup from "./FormGroup.react"; type Props = {| +children?: React.Node, +className?: string, +onChange?: (SyntheticInputEvent) => mixed, + +onBlur?: (SyntheticInputEvent) => mixed, + +valid?: boolean, + +tick?: boolean, + +invalid?: boolean, + +cross?: boolean, + +feedback?: string, + +error?: string, + /** + * Wraps the select in Form.Group and adds a label + */ + +label?: string, + +name?: string, + +value?: string | number, + +disabled?: boolean, + +readOnly?: boolean, |}; -function FormSelect({ className, children, onChange }: Props): React.Node { +function FormSelect(props: Props): React.Node { + const { + className, + children, + onChange, + valid, + tick, + invalid, + cross, + error, + label, + onBlur, + disabled, + readOnly, + name, + value, + } = props; const classes = cn( - { "form-control": true, "custom-select": true }, + { + "form-control": true, + "custom-select": true, + "is-valid": valid, + "state-valid": tick, + "is-invalid": invalid || !!error, + "state-invalid": cross || !!error, + }, className ); - return ( - + + const feedback = error || props.feedback; + + const contents = ( + + + {feedback && {feedback}} + ); + + return label ? {contents} : contents; } FormSelect.displayName = "Form.Select"; +/** @component */ export default FormSelect; diff --git a/src/components/Form/FormTextarea.react.js b/src/components/Form/FormTextarea.react.js index e054289f..26896055 100644 --- a/src/components/Form/FormTextarea.react.js +++ b/src/components/Form/FormTextarea.react.js @@ -2,6 +2,7 @@ import * as React from "react"; import cn from "classnames"; +import FormGroup from "./FormGroup.react"; type Props = {| +className?: string, @@ -20,6 +21,7 @@ type Props = {| +children?: string, +onChange?: (event: SyntheticInputEvent) => void, +onBlur?: (event: SyntheticInputEvent) => void, + +label?: string, |}; function FormTextarea(props: Props): React.Node { @@ -38,6 +40,7 @@ function FormTextarea(props: Props): React.Node { rows, children, onChange, + label, } = props; const classes = cn( "form-control", @@ -51,7 +54,7 @@ function FormTextarea(props: Props): React.Node { ); const feedback = error || props.feedback; - return ( + const contents = (