From 8a6fd211594fb26f41a99eb24a979a5fe4098b5a Mon Sep 17 00:00:00 2001 From: petershale21 Date: Tue, 14 Jul 2026 12:42:34 +0200 Subject: [PATCH 1/4] Fix: Use short names instead of fully specified names in form builder --- .../components/ControlPropertiesContainer.jsx | 39 +++++++++++++++++-- src/form-builder/constants.js | 2 +- 2 files changed, 36 insertions(+), 5 deletions(-) diff --git a/src/form-builder/components/ControlPropertiesContainer.jsx b/src/form-builder/components/ControlPropertiesContainer.jsx index ca34983d..ae98cb62 100644 --- a/src/form-builder/components/ControlPropertiesContainer.jsx +++ b/src/form-builder/components/ControlPropertiesContainer.jsx @@ -19,16 +19,47 @@ export class ControlPropertiesContainer extends Component { onSelect(concept) { const conceptName = concept.name.name; + httpInterceptor .get(new UrlHelper().getFullConceptRepresentation(conceptName)) .then((data) => { const result = data.results[0]; - result.display = result.name.name; - this.props.dispatch(selectSource(result, this.props.selectedControl.id)); + + // Recursively replace fully specified names with short names + const setShortNames = (concept) => { + if (!concept) return concept; + + // Find and apply short name if it exists + const shortName = concept.names && + concept.names.find(name => name.conceptNameType === 'SHORT'); + if (shortName) { + concept.display = shortName.name; + if (concept.name) { + concept.name = Object.assign({}, concept.name, { + name: shortName.name, + display: shortName.name + }); + } + if (concept.displayString) { + concept.displayString = shortName.name; + } + } + + // Recursively process nested answers and set members + if (concept.answers && concept.answers.length) { + concept.answers = concept.answers.map(setShortNames); + } + if (concept.setMembers && concept.setMembers.length) { + concept.setMembers = concept.setMembers.map(setShortNames); + } + + return concept; + }; + + this.props.dispatch(selectSource(setShortNames(result), this.props.selectedControl.id)); }) .catch((error) => this.setErrorMessage(error)); - } - +} onPropertyUpdate(properties, id) { this.props.dispatch(setChangedProperty(properties, id)); } diff --git a/src/form-builder/constants.js b/src/form-builder/constants.js index e7570e5a..8650c268 100644 --- a/src/form-builder/constants.js +++ b/src/form-builder/constants.js @@ -1,6 +1,6 @@ export const formBuilderConstants = { conceptUrl: '/openmrs/ws/rest/v1/concept', - conceptRepresentation: 'custom:(uuid,set,display,allowDecimal,name:(uuid,name),' + + conceptRepresentation: 'custom:(uuid,set,display,allowDecimal,name:(uuid,name),names:(uuid,name,conceptNameType),' + 'conceptClass:(uuid,name),datatype:(uuid,name),answers,handler,hiNormal,lowNormal,' + 'hiAbsolute,lowAbsolute,units,setMembers:(uuid,set,display,allowDecimal,name:(uuid,name),' + 'conceptClass:(uuid,name),datatype:(uuid,name),' + From 6fdbfd5a58910690ff2ae2752413eeb2cca4ff89 Mon Sep 17 00:00:00 2001 From: petershale21 Date: Sat, 18 Jul 2026 10:34:54 +0200 Subject: [PATCH 2/4] preserve names for API lookup --- src/form-builder/components/ControlPropertiesContainer.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/form-builder/components/ControlPropertiesContainer.jsx b/src/form-builder/components/ControlPropertiesContainer.jsx index ae98cb62..9f569bdf 100644 --- a/src/form-builder/components/ControlPropertiesContainer.jsx +++ b/src/form-builder/components/ControlPropertiesContainer.jsx @@ -32,11 +32,11 @@ export class ControlPropertiesContainer extends Component { // Find and apply short name if it exists const shortName = concept.names && concept.names.find(name => name.conceptNameType === 'SHORT'); + if (shortName) { concept.display = shortName.name; if (concept.name) { concept.name = Object.assign({}, concept.name, { - name: shortName.name, display: shortName.name }); } From 80d804354c04591ea4f52f967f8022ebd589abbd Mon Sep 17 00:00:00 2001 From: petershale21 Date: Thu, 30 Jul 2026 02:05:06 +0200 Subject: [PATCH 3/4] Keep Fully Specified Name as control name --- .../components/ControlPropertiesContainer.jsx | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/src/form-builder/components/ControlPropertiesContainer.jsx b/src/form-builder/components/ControlPropertiesContainer.jsx index 9f569bdf..b565d14f 100644 --- a/src/form-builder/components/ControlPropertiesContainer.jsx +++ b/src/form-builder/components/ControlPropertiesContainer.jsx @@ -17,7 +17,7 @@ export class ControlPropertiesContainer extends Component { this.filterOptions = this.filterOptions.bind(this); } - onSelect(concept) { +onSelect(concept) { const conceptName = concept.name.name; httpInterceptor @@ -25,7 +25,7 @@ export class ControlPropertiesContainer extends Component { .then((data) => { const result = data.results[0]; - // Recursively replace fully specified names with short names + // Recursively replace fully specified names with short names for answers only const setShortNames = (concept) => { if (!concept) return concept; @@ -34,7 +34,9 @@ export class ControlPropertiesContainer extends Component { concept.names.find(name => name.conceptNameType === 'SHORT'); if (shortName) { - concept.display = shortName.name; + // Only modify display for answers, NOT the parent concept + // Check if this concept has a parent (is an answer or setMember) + // by checking if it has a 'parent' property or by checking if it's in the answers array if (concept.name) { concept.name = Object.assign({}, concept.name, { display: shortName.name @@ -43,6 +45,8 @@ export class ControlPropertiesContainer extends Component { if (concept.displayString) { concept.displayString = shortName.name; } + // DO NOT modify concept.display for the parent + // Only set it if this is NOT the top-level concept } // Recursively process nested answers and set members @@ -56,7 +60,12 @@ export class ControlPropertiesContainer extends Component { return concept; }; - this.props.dispatch(selectSource(setShortNames(result), this.props.selectedControl.id)); + // Process the result, but keep the parent's display as fully specified + const processedResult = setShortNames(result); + // Restore the parent's display to the fully specified name + processedResult.display = result.name.name; + + this.props.dispatch(selectSource(processedResult, this.props.selectedControl.id)); }) .catch((error) => this.setErrorMessage(error)); } From 0c2ccfc8faf97e3232c4728729a256b0b7a6649a Mon Sep 17 00:00:00 2001 From: petershale21 Date: Thu, 30 Jul 2026 02:16:16 +0200 Subject: [PATCH 4/4] keep fully specified name as control name --- src/form-builder/components/ControlPropertiesContainer.jsx | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/form-builder/components/ControlPropertiesContainer.jsx b/src/form-builder/components/ControlPropertiesContainer.jsx index b565d14f..2c97b410 100644 --- a/src/form-builder/components/ControlPropertiesContainer.jsx +++ b/src/form-builder/components/ControlPropertiesContainer.jsx @@ -34,9 +34,6 @@ onSelect(concept) { concept.names.find(name => name.conceptNameType === 'SHORT'); if (shortName) { - // Only modify display for answers, NOT the parent concept - // Check if this concept has a parent (is an answer or setMember) - // by checking if it has a 'parent' property or by checking if it's in the answers array if (concept.name) { concept.name = Object.assign({}, concept.name, { display: shortName.name @@ -45,8 +42,6 @@ onSelect(concept) { if (concept.displayString) { concept.displayString = shortName.name; } - // DO NOT modify concept.display for the parent - // Only set it if this is NOT the top-level concept } // Recursively process nested answers and set members