Skip to content

Commit 6ead3c7

Browse files
authored
Fix bug where dependencies override the element's title, used for the label, to the definition's title. (#161)
1 parent 7639578 commit 6ead3c7

File tree

2 files changed

+58
-5
lines changed

2 files changed

+58
-5
lines changed

src/formBuilder/utils.js

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -356,14 +356,15 @@ export function checkForUnsupportedFeatures(
356356
}
357357

358358
// make an element out of the corresponding properties and UI properties
359-
function generateElement(
359+
function generateDependencyElement(
360360
name: string,
361361
dataProps: any,
362362
uiProperties: any,
363363
requiredNames: any,
364364
definitionData?: { [string]: any },
365365
definitionUi?: { [string]: any },
366366
categoryHash: { [string]: string },
367+
useDefinitionDetails: boolean = true, // determines whether to use an element's definition details or not.
367368
) {
368369
let uiProps = {
369370
...uiProperties,
@@ -381,7 +382,8 @@ function generateElement(
381382
if (
382383
pathArr[0] === '#' &&
383384
pathArr[1] === 'definitions' &&
384-
definitionData[pathArr[2]]
385+
definitionData[pathArr[2]] &&
386+
useDefinitionDetails === true
385387
) {
386388
elementDetails = {
387389
...elementDetails,
@@ -480,7 +482,6 @@ export function generateElementPropsFromSchemas(parameters: {
480482
...uischema[parameter],
481483
};
482484
}
483-
484485
newElement.name = parameter;
485486
newElement.required = requiredNames.includes(parameter);
486487
newElement.$ref = elementDetails.$ref;
@@ -513,6 +514,7 @@ export function generateElementPropsFromSchemas(parameters: {
513514
});
514515
// read dependent elements from dependencies
515516
if (schema.dependencies) {
517+
const useDefinitionDetails = false;
516518
Object.keys(schema.dependencies).forEach((parent) => {
517519
const group = schema.dependencies[parent];
518520
if (group.oneOf) {
@@ -530,14 +532,15 @@ export function generateElementPropsFromSchemas(parameters: {
530532
([parameter, element]) => {
531533
// create a new element if not present in main properties
532534
if (!Object.keys(elementDict).includes(parameter)) {
533-
const newElement = generateElement(
535+
const newElement = generateDependencyElement(
534536
parameter,
535537
element,
536538
uischema[parameter],
537539
requiredNames,
538540
definitionData,
539541
definitionUi,
540542
categoryHash,
543+
useDefinitionDetails,
541544
);
542545
newElement.required = requiredValues.includes(newElement.name);
543546
elementDict[newElement.name] = newElement;
@@ -557,14 +560,15 @@ export function generateElementPropsFromSchemas(parameters: {
557560
} else if (group.properties) {
558561
const requiredValues = group.required || [];
559562
Object.entries(group.properties).forEach(([parameter, element]) => {
560-
const newElement = generateElement(
563+
const newElement = generateDependencyElement(
561564
parameter,
562565
element,
563566
uischema[parameter],
564567
requiredNames,
565568
definitionData,
566569
definitionUi,
567570
categoryHash,
571+
useDefinitionDetails,
568572
);
569573
newElement.required = requiredValues.includes(newElement.name);
570574
newElement.dependent = true;

src/formBuilder/utils.test.js

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -392,6 +392,55 @@ describe('generateElementPropsFromSchemas', () => {
392392
expect(cardObjArr[1].name).toEqual('obj3');
393393
expect(cardObjArr[2].name).toEqual('obj1');
394394
});
395+
396+
it('generates an array of card objects with titles that remain the same for dependency updates', () => {
397+
const dependencySchema = {
398+
type: 'object',
399+
properties: {
400+
parentFirstNames: {
401+
$ref: '#/definitions/firstNames',
402+
title: 'Parent First Names',
403+
description: '',
404+
},
405+
},
406+
dependencies: {
407+
parentFirstNames: {
408+
properties: {
409+
childFirstNames: {
410+
$ref: '#/definitions/firstNames',
411+
title: 'Child First Names',
412+
description: '',
413+
},
414+
},
415+
required: [],
416+
},
417+
},
418+
definitions: {
419+
first_names: {
420+
title: 'First Names',
421+
type: 'string',
422+
},
423+
},
424+
required: [],
425+
};
426+
427+
const dependencyUiSchema = {
428+
'ui:order': ['parentFirstNames', 'childFirstNames'],
429+
};
430+
431+
const cardObjArr = generateElementPropsFromSchemas({
432+
schema: dependencySchema,
433+
uischema: dependencyUiSchema,
434+
categoryHash: generateCategoryHash(DEFAULT_FORM_INPUTS),
435+
allFormInputs: DEFAULT_FORM_INPUTS,
436+
});
437+
expect(cardObjArr).toHaveLength(2);
438+
439+
//check that the dependency element's title remains the same.
440+
expect(cardObjArr[1].dataOptions.title).toEqual('Child First Names');
441+
//check that the dependency element's title is not the definition's title.
442+
expect(cardObjArr[1].dataOptions.title).not.toEqual('First Names');
443+
});
395444
});
396445

397446
describe('generateSchemaFromElementProps', () => {

0 commit comments

Comments
 (0)