From 1e62748d5e05d8e11e006e5c9a36339b4596a45b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bulot=20Fran=C3=A7ois?= Date: Thu, 12 Oct 2023 15:36:40 +0200 Subject: [PATCH] correct list of sources for BasedOn Used in loops and variable : - add dynamic arrays and pairing labels From referenced questionnaires : - remove linked loops - add dynamic arrays and pariring --- src/actions/metadata.js | 53 ++++++++++++++++++- .../components/component-new-edit.jsx | 27 +++------- .../components/variables/utils-loops.js | 27 ++++++---- 3 files changed, 77 insertions(+), 30 deletions(-) diff --git a/src/actions/metadata.js b/src/actions/metadata.js index 2dfe1641c..d48170ceb 100644 --- a/src/actions/metadata.js +++ b/src/actions/metadata.js @@ -204,6 +204,17 @@ export const loadExternalQuestionnairesVariables = // Metadata : loops from external elements +const isQuestionLoop = component => { + return ( + component.type === 'QuestionType' && + ((component.questionType === 'TABLE' && + component.ResponseStructure.Dimension.some( + dim => dim.dimensionType === 'PRIMARY' && dim.dynamic !== '0', + )) || + component.questionType === 'PAIRING') + ); +}; + export const loadExternalQuestionnairesLoops = (idExternalQuestionnaire, token) => async dispatch => { dispatch({ @@ -219,7 +230,47 @@ export const loadExternalQuestionnairesLoops = const externalQuestionnairesMetadata = [ { id: idExternalQuestionnaire, - loops: externalQuestionnaire.Iterations?.Iteration || [], + loops: + externalQuestionnaire.Child.reduce( + (accQuest, sequence) => { + const sequenceContent = Object.values(sequence.Child).reduce( + (acc, component) => { + if (isQuestionLoop(component)) + return [ + ...acc, + { id: component.id, name: component.Name }, + ]; + if ( + component.type === 'sequenceType' && + component.genericName === 'SUBMODULE' + ) { + Object.values(component.Child).reduce( + (subacc, subcomponent) => { + if (isQuestionLoop(subcomponent)) + return [ + ...subacc, + { + id: subcomponent.id, + name: subcomponent.Name, + }, + ]; + return subacc; + }, + [], + ); + } + return acc; + }, + [], + ); + return [...accQuest, ...sequenceContent]; + }, + [ + externalQuestionnaire.Iterations?.Iteration.filter( + loop => !loop.IterableReference, + ).map(loop => ({ id: loop.id, Name: loop.Name })), + ], + ).flat() || [], }, ]; return dispatch( diff --git a/src/widgets/component-new-edit/components/component-new-edit.jsx b/src/widgets/component-new-edit/components/component-new-edit.jsx index e4e7ddf37..ef9d1f87d 100644 --- a/src/widgets/component-new-edit/components/component-new-edit.jsx +++ b/src/widgets/component-new-edit/components/component-new-edit.jsx @@ -425,26 +425,13 @@ const ComponentNewEdit = props => { }; const scopes = [ - getQuestionnaireScope(componentsStore).map(questionnaireIteration => { - return ( - - {questionnaireIteration.nameLoop} + getQuestionnaireScope(componentsStore, externalLoopsStore).map( + iteration => ( + + {iteration.name} - ); - }), - externalLoopsStore.map(externalIteration => { - return ( - - {externalIteration.Name} - - ); - }), + ), + ), ]; const associatedFieldsProps = { @@ -540,7 +527,7 @@ const ComponentNewEdit = props => { {Dictionary.selectFinalMembre} - {getFinalOptions(componentsStore)} + {InitialMember && getFinalOptions(componentsStore)} )} diff --git a/src/widgets/component-new-edit/components/variables/utils-loops.js b/src/widgets/component-new-edit/components/variables/utils-loops.js index 5a538c08d..15c5a6e7b 100644 --- a/src/widgets/component-new-edit/components/variables/utils-loops.js +++ b/src/widgets/component-new-edit/components/variables/utils-loops.js @@ -16,13 +16,22 @@ const { LIST } = DIMENSION_FORMATS; * @param {object} components List of components * @return {array} list components for loop */ -export function getQuestionnaireScope(components) { - return Object.values(components).filter( - component => - (component.type === LOOP && !component.basedOn) || - (component.type === QUESTION && - (component.responseFormat.type === PAIRING || - (component.responseFormat.type === TABLE && - component.responseFormat.TABLE.PRIMARY.type === LIST))), - ); +export function getQuestionnaireScope(components, externalLoops) { + return [ + Object.values(components) + .filter(component => component.type === LOOP && !component.basedOn) + .map(loop => { + return { id: loop.id, name: loop.nameLoop }; + }), + Object.values(components) + .filter( + component => + component.type === QUESTION && + (component.responseFormat.type === PAIRING || + (component.responseFormat.type === TABLE && + component.responseFormat.TABLE.PRIMARY.type === LIST)), + ) + .map(question => ({ id: question.id, name: question.name })), + externalLoops, + ].flat(); }