Skip to content

Commit fdd426e

Browse files
committed
Fixes rjsf-team#186: Array and Object field TitleField ids. (rjsf-team#187)
1 parent a6e58ed commit fdd426e

File tree

6 files changed

+48
-13
lines changed

6 files changed

+48
-13
lines changed

src/components/fields/ArrayField.js

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,14 @@ import {
1515
import SelectWidget from "./../widgets/SelectWidget";
1616

1717

18+
function ArrayFieldTitle({TitleField, idSchema, title, required}) {
19+
if (!title) {
20+
return null;
21+
}
22+
const id = `${idSchema.id}__title`;
23+
return <TitleField id={id} title={title} required={required} />;
24+
}
25+
1826
class ArrayField extends Component {
1927
static defaultProps = {
2028
uiSchema: {},
@@ -131,7 +139,11 @@ class ArrayField extends Component {
131139
return (
132140
<fieldset
133141
className={`field field-array field-array-of-${itemsSchema.type}`}>
134-
{title ? <TitleField title={title} required={required} /> : null}
142+
<ArrayFieldTitle
143+
TitleField={TitleField}
144+
idSchema={idSchema}
145+
title={title}
146+
required={required} />
135147
{schema.description ?
136148
<div className="field-description">{schema.description}</div> : null}
137149
<div className="row array-item-list">{
@@ -204,7 +216,11 @@ class ArrayField extends Component {
204216

205217
return (
206218
<fieldset className="field field-array field-array-fixed-items">
207-
{title ? <TitleField title={title} required={required} /> : null}
219+
<ArrayFieldTitle
220+
TitleField={TitleField}
221+
idSchema={idSchema}
222+
title={title}
223+
required={required} />
208224
{schema.description ?
209225
<div className="field-description">{schema.description}</div> : null}
210226
<div className="row array-item-list">{

src/components/fields/ObjectField.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,10 @@ class ObjectField extends Component {
8686
}
8787
return (
8888
<fieldset>
89-
{title ? <TitleField title={title} required={required} /> : null}
89+
{title ? <TitleField
90+
id={`${idSchema.id}__title`}
91+
title={title}
92+
required={required} /> : null}
9093
{schema.description ?
9194
<p className="field-description">{schema.description}</p> : null}
9295
{

src/components/fields/TitleField.js

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,16 @@ import React, {PropTypes} from "react";
33
const REQUIRED_FIELD_SYMBOL = "*";
44

55
function TitleField(props) {
6-
const {title, required} = props;
6+
const {id, title, required} = props;
77
const legend = required ? title + REQUIRED_FIELD_SYMBOL : title;
8-
return <legend>{legend}</legend>;
8+
return <legend id={id}>{legend}</legend>;
99
}
1010

1111
if (process.env.NODE_ENV !== "production") {
1212
TitleField.propTypes = {
13+
id: PropTypes.string,
1314
title: PropTypes.string,
14-
required: PropTypes.bool
15+
required: PropTypes.bool,
1516
};
1617
}
1718

test/ArrayField_test.js

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,10 @@ describe("ArrayField", () => {
3232
it("should render a fieldset legend", () => {
3333
const {node} = createFormComponent({schema});
3434

35-
expect(node.querySelector("fieldset > legend").textContent)
36-
.eql("my list");
35+
const legend = node.querySelector("fieldset > legend");
36+
37+
expect(legend.textContent).eql("my list");
38+
expect(legend.id).eql("root__title");
3739
});
3840

3941
it("should contain no field in the list by default", () => {
@@ -261,9 +263,9 @@ describe("ArrayField", () => {
261263

262264
it("should render a fieldset legend", () => {
263265
const {node} = createFormComponent({schema});
264-
265-
expect(node.querySelector("fieldset > legend").textContent)
266-
.eql("List of fixed items");
266+
const legend = node.querySelector("fieldset > legend");
267+
expect(legend.textContent).eql("List of fixed items");
268+
expect(legend.id).eql("root__title");
267269
});
268270

269271
it("should render field widgets", () => {

test/ObjectField_test.js

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,10 @@ describe("ObjectField", () => {
4646
it("should render a fieldset legend", () => {
4747
const {node} = createFormComponent({schema});
4848

49-
expect(node.querySelector("fieldset > legend").textContent)
50-
.eql("my object");
49+
const legend = node.querySelector("fieldset > legend");
50+
51+
expect(legend.textContent).eql("my object");
52+
expect(legend.id).eql("root__title");
5153
});
5254

5355
it("should render a customized title", () => {

test/TitleField_test.js

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,17 @@ describe("TitleField", () => {
3636
expect(node.tagName).to.equal("LEGEND");
3737
});
3838

39+
it("should have the expected id", () => {
40+
const props = {
41+
title: "Field title",
42+
required: true,
43+
id: "sample_id"
44+
};
45+
const {node} = createComponent(TitleFieldWrapper, props);
46+
47+
expect(node.id).to.equal("sample_id");
48+
});
49+
3950
it("should include only title, when field is not required", () => {
4051
const props = {
4152
title: "Field title",

0 commit comments

Comments
 (0)