From 1c051bb30cf56c9e92ff067c4a04a9714870ae82 Mon Sep 17 00:00:00 2001
From: Alf Eaton <eaton.alf@gmail.com>
Date: Thu, 24 Aug 2017 16:16:48 +0100
Subject: [PATCH] Fix onChange/state handling for radio groups

---
 src/atoms/Radio.js          |  5 ++--
 src/atoms/Radio.md          |  4 +--
 src/index.js                |  1 +
 src/molecules/RadioGroup.js | 50 +++++++++++++++++++++++++++----------
 src/molecules/RadioGroup.md |  7 ++----
 src/molecules/YesOrNo.js    |  6 +++--
 src/molecules/YesOrNo.md    | 15 ++++++++---
 7 files changed, 60 insertions(+), 28 deletions(-)

diff --git a/src/atoms/Radio.js b/src/atoms/Radio.js
index 17cdb80d4..034bb6ee2 100644
--- a/src/atoms/Radio.js
+++ b/src/atoms/Radio.js
@@ -1,7 +1,7 @@
 import React from 'react'
 import classes from './Radio.local.css'
 
-const Radio = ({ name, value, label, checked, required }) => (
+const Radio = ({ name, value, label, checked, required, onChange }) => (
   <label className={classes.root}>
     <input
       className={classes.input}
@@ -9,7 +9,8 @@ const Radio = ({ name, value, label, checked, required }) => (
       name={name}
       value={value}
       checked={checked}
-      required={required}/>
+      required={required}
+      onChange={onChange}/>
     {label}
   </label>
 )
diff --git a/src/atoms/Radio.md b/src/atoms/Radio.md
index 0304a7435..21bfdb8e3 100644
--- a/src/atoms/Radio.md
+++ b/src/atoms/Radio.md
@@ -10,7 +10,7 @@ A checked radio button.
 
 ```js
 <Radio 
-  name="bar" 
+  name="radio-bar" 
   checked 
   onChange={event => console.log(event.target.value)}/>
 ```
@@ -19,7 +19,7 @@ A radio button with a label.
 
 ```js
 <Radio 
-  name="foo" 
+  name="radio-foo" 
   label="Foo"
   onChange={event => console.log(event.target.value)}/>
 ```
diff --git a/src/index.js b/src/index.js
index 370bfa72d..9df53c438 100644
--- a/src/index.js
+++ b/src/index.js
@@ -1,4 +1,5 @@
 export { default as Menu } from './atoms/Menu'
+export { default as Radio } from './atoms/Radio'
 export { default as Tags } from './atoms/Tags'
 export { default as AppBar } from './molecules/AppBar'
 export { default as YesOrNo } from './molecules/YesOrNo'
diff --git a/src/molecules/RadioGroup.js b/src/molecules/RadioGroup.js
index b5e3fac3d..a3d7a7937 100644
--- a/src/molecules/RadioGroup.js
+++ b/src/molecules/RadioGroup.js
@@ -1,18 +1,42 @@
 import React from 'react'
 import Radio from '../atoms/Radio'
 
-const RadioGroup = ({ name, value, options, required }) => (
-  <div>
-    {options.map(option => (
-      <Radio
-        key={option.value}
-        name={name}
-        required={required}
-        value={option.value}
-        label={option.label}
-        checked={option.value === value}/>
-    ))}
-  </div>
-)
+class RadioGroup extends React.Component {
+  constructor (props) {
+    super(props)
+
+    this.state = {
+      value: props.value
+    }
+  }
+
+  handleChange = event => {
+    this.setState({
+      value: event.target.value
+    })
+
+    this.props.onChange(event)
+  }
+
+  render () {
+    const { name, options, required } = this.props
+    const { value } = this.state
+
+    return (
+      <div>
+        {options.map(option => (
+          <Radio
+            key={option.value}
+            name={name}
+            required={required}
+            value={option.value}
+            label={option.label}
+            checked={option.value === value}
+            onChange={this.handleChange}/>
+        ))}
+      </div>
+    )
+  }
+}
 
 export default RadioGroup
diff --git a/src/molecules/RadioGroup.md b/src/molecules/RadioGroup.md
index eab7df696..67acc7c45 100644
--- a/src/molecules/RadioGroup.md
+++ b/src/molecules/RadioGroup.md
@@ -1,8 +1,6 @@
 A group of radio buttons.
 
 ```js
-initialState = { foo: undefined };
-
 const options = [
   {
     value: 'one',
@@ -20,7 +18,6 @@ const options = [
 
 <RadioGroup 
   options={options} 
-  name="foo"
-  value={state.foo} 
-  handleChange={event => setState({ foo: event.target.value })}/>
+  name="radiogroup-foo"
+  onChange={event => console.log(event.target.value)}/>
 ```
diff --git a/src/molecules/YesOrNo.js b/src/molecules/YesOrNo.js
index 2ec0274ea..206f20fa0 100644
--- a/src/molecules/YesOrNo.js
+++ b/src/molecules/YesOrNo.js
@@ -13,12 +13,14 @@ const options = [
   }
 ]
 
-const YesOrNo = ({ name, value }) => (
+const YesOrNo = ({ name, value, required, onChange }) => (
   <RadioGroup
     className={classes.root}
     name={name}
     options={options}
-    value={value}/>
+    value={value}
+    required={required}
+    onChange={onChange}/>
 )
 
 export default YesOrNo
diff --git a/src/molecules/YesOrNo.md b/src/molecules/YesOrNo.md
index 4f6cb070e..1feb069fa 100644
--- a/src/molecules/YesOrNo.md
+++ b/src/molecules/YesOrNo.md
@@ -1,10 +1,17 @@
 A group of radio buttons that provides just two options: "Yes" or "No"
 
 ```js
-initialState = { foo: undefined };
+<YesOrNo
+  name="yesorno" 
+  onChange={event => console.log(event.target.value)}/>
+```
+
+If a value is set, one option is selected.
 
+```js
 <YesOrNo
-  name="foo" 
-  value={state.foo} 
-  onChange={event => setState({ foo: event.target.value })}/>
+  name="yesorno-value" 
+  value="yes"
+  onChange={event => console.log(event.target.value)}/>
 ```
+
-- 
GitLab