Skip to content

Commit 84225cf

Browse files
committed
Enhances accessibility by letting clicks on labels focus corresponding inputs.
[README] Fix typo in readme Updated README code samples to match the label-input relationship
1 parent 527b1a6 commit 84225cf

File tree

3 files changed

+35
-22
lines changed

3 files changed

+35
-22
lines changed

README.md

+20-19
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ const EditOrderForm = React.createClass({
9191
<TextField name="name" defaultValue={this.props.customer.name} />
9292

9393
<Label htmlFor="email">Email</Label>
94-
<EmailField name="mail" defaultValue={this.props.customer.email} />
94+
<EmailField name="email" defaultValue={this.props.customer.email} />
9595
</HashFields>
9696

9797
<ArrayFields name="burgers">
@@ -142,16 +142,17 @@ The raw HTML output for this form (sanitized for legibility)
142142
<input name="authenticity_token" readonly type="hidden" value="csrf_token_from_head">
143143
<input name="utf8" readonly type="hidden" value="">
144144

145-
<label for="order[customer][name]">Name</label>
145+
<label for="order_customer_name">Name</label>
146146
<input name="order[customer][name]" type="text">
147+
<input name="order[customer][name]" id="order_customer_name" type="text">
147148

148-
<label for="order[customer][email]">Email</label>
149-
<input name="order[customer][mail]" type="email">
149+
<label for="order_customer_email">Email</label>
150+
<input name="order[customer][email]" id="order_customer_email" type="email">
150151

151-
<input name="order[burgers][0][id]" type="hidden" value="1">
152+
<input name="order[burgers][0][id]" id="order_burgers_0_id" type="hidden" value="1">
152153
<div>
153-
<label for="order[burgers][0][variety]">Variety</label>
154-
<select name="order[burgers][0][variety]">
154+
<label for="order_burgers_0_variety">Variety</label>
155+
<select name="order[burgers][0][variety]" id="order_burgers_0_variety">
155156
<option>
156157
Hamburger
157158
</option>
@@ -163,17 +164,17 @@ The raw HTML output for this form (sanitized for legibility)
163164
</option>
164165
</select>
165166

166-
<label for="order[burgers][0][add_fried_egg]">Add a fried egg?</label>
167+
<label for="order_burgers_0_add_fried_egg">Add a fried egg?</label>
167168
<input name="order[burgers][0][add_fried_egg]" readonly type="hidden" value="0">
168-
<input name="order[burgers][0][add_fried_egg]" type="checkbox" value="1">
169+
<input name="order[burgers][0][add_fried_egg]" id="order_burgers_0_add_fried_egg" type="checkbox" value="1">
169170

170171
<a>Remove from order</a></span>
171172
</div>
172173

173-
<input name="order[burgers][1][id]" type="hidden" value="2">
174+
<input name="order[burgers][1][id]" id="order_burgers_1_id" type="hidden" value="2">
174175
<div>
175-
<label for="order[burgers][1][variety]">Variety</label>
176-
<select name="order[burgers][1][variety]">
176+
<label for="order_burgers_1_variety">Variety</label>
177+
<select name="order[burgers][1][variety]" id="order_burgers_1_variety">
177178
<option>
178179
Hamburger
179180
</option>
@@ -185,21 +186,21 @@ The raw HTML output for this form (sanitized for legibility)
185186
</option>
186187
</select>
187188

188-
<label for="order[burgers][1][add_fried_egg]">Add a fried egg?</label>
189+
<label for="order_burgers_1_add_fried_egg">Add a fried egg?</label>
189190
<input name="order[burgers][1][add_fried_egg]" readonly type="hidden" value="0">
190-
<input name="order[burgers][1][add_fried_egg]" type="checkbox" value="1">
191+
<input name="order[burgers][1][add_fried_egg]" id="order_burgers_1_add_fried_egg" type="checkbox" value="1">
191192

192193
<a>Remove from order</a>
193194
</div>
194195

195-
<input name="order[burgers][2][id]" type="hidden" value="3">
196-
<input name="order[burgers][2][_destroy]" type="hidden" value="1">
196+
<input name="order[burgers][2][id]" id="order_burgers_2_id" type="hidden" value="3">
197+
<input name="order[burgers][2][_destroy]" id="order_burgers_2__destroy" type="hidden" value="1">
197198

198199
<a>Add a burger</a>
199200

200-
<label for="order[notes]">Notes</label>
201-
<textarea name="order[notes]"></textarea>
201+
<label for="order_notes">Notes</label>
202+
<textarea name="order[notes]" id="order_notes"></textarea>
202203

203-
<input name="order[commit]" type="submit" value="Update order">
204+
<input name="order[commit]" id="order_commit" type="submit" value="Update order">
204205
</form>
205206
```

src/fields.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ export const DatetimeField = nameWithContext(Tags.DatetimeFieldTag)
88
export const DatetimeLocalField = nameWithContext(Tags.DatetimeLocalFieldTag)
99
export const EmailField = nameWithContext(Tags.EmailFieldTag)
1010
export const HiddenField = nameWithContext(Tags.HiddenFieldTag)
11-
export const Label = nameWithContext(Tags.LabelTag, "htmlFor")
11+
export const Label = nameWithContext(Tags.LabelTag, "htmlFor", false)
1212
export const MonthField = nameWithContext(Tags.MonthFieldTag)
1313
export const NumberField = nameWithContext(Tags.NumberFieldTag)
1414
export const PasswordField = nameWithContext(Tags.PasswordFieldTag)

src/utils.js

+14-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import React from "react"
22
import PropTypes from "prop-types"
33

4-
export const nameWithContext = (Lower, prop = "name") => {
4+
export const nameWithContext = (Lower, prop = "name", isInput = true) => {
55
const getDisplayName = component =>
66
component.displayName || component.name || "Component"
77

@@ -10,12 +10,24 @@ export const nameWithContext = (Lower, prop = "name") => {
1010
.map((field, index) => (index === 0 ? field : `[${field}]`))
1111
.join("")
1212

13+
const buildInputId = (namespaces, name = "") =>
14+
[...namespaces, name].join("_")
15+
1316
const higher = (props, context) => {
1417
const replacedProp = buildInputName(
1518
context.railsFormNamespaces,
1619
props[prop]
1720
)
18-
const replacedProps = Object.assign({}, props, { [prop]: replacedProp })
21+
const inputId = buildInputId(context.railsFormNamespaces, props[prop])
22+
const additionalProps = isInput
23+
? {
24+
[prop]: replacedProp,
25+
id: buildInputId(context.railsFormNamespaces, props[prop])
26+
}
27+
: {
28+
[prop]: buildInputId(context.railsFormNamespaces, props[prop])
29+
}
30+
const replacedProps = Object.assign({}, props, additionalProps)
1931
return <Lower {...replacedProps} />
2032
}
2133

0 commit comments

Comments
 (0)