Skip to content

Commit

Permalink
feat: partially working recursion
Browse files Browse the repository at this point in the history
  • Loading branch information
9sneha-n committed Oct 28, 2024
1 parent 222fed1 commit c127aa8
Showing 1 changed file with 100 additions and 32 deletions.
132 changes: 100 additions & 32 deletions src/domain/entities/Questionnaire/QuestionnaireQuestion.ts
Original file line number Diff line number Diff line change
Expand Up @@ -162,50 +162,51 @@ export class QuestionnaireQuestion {
const updatedQuestions = questions.map(question => {
if (question.id === updatedQuestion.id) {
return updatedQuestion;
} else if (
parentSectionHidden &&
question.text.includes("Add another") &&
question.type === "boolean"
) {
return {
...question,
value: false,
};
} else {
}
// else if (
// parentSectionHidden &&
// question.text.includes("Add another") &&
// question.type === "boolean"
// ) {
// return {
// ...question,
// value: false,
// };
// }
else {
return question;
}
});

//2. Now, apply all possible side effects of the updated value to the rest of the questionnaire.

//Get list question ids that require update
const allQuestionsRequiringUpdate = _(
const allSectionQuestionIdsRequiringUpdate = _(
rules.flatMap(rule => {
const actionUpdates = rule.actions.flatMap(
action => action?.dataElement?.id || action.trackedEntityAttribute?.id
);
const dataElementUpdates = rule.dataElementIds;
const teaUpdates = rule.teAttributeIds;
return [...actionUpdates, ...dataElementUpdates, ...teaUpdates];
// return actionUpdates;
})
)
.filter(id => id !== updatedQuestion.id)
.compact()
.uniq()
.value();

const parsedAndUpdatedQuestions = updatedQuestions.map(question => {
//Get the rules that are applicable for the current question
//this is done to take care of any "side-effects" of an updated question.
const rulesApplicableForCurrentQuestion =
question.id !== updatedQuestion.id
? getApplicableRules(question, questionnaire.rules, updatedQuestions)
: rules;
// const rulesApplicableForCurrentQuestion =
// question.id !== updatedQuestion.id
// ? getApplicableRules(question, questionnaire.rules, updatedQuestions)
// : rules;

//If the question is part of any of the rule actions, update the section
const parsedAndUpdatedQuestion =
allQuestionsRequiringUpdate.includes(question.id) ||
question.id === updatedQuestion.id
? this.updateQuestion(question, rulesApplicableForCurrentQuestion)
question.id === updatedQuestion.id ||
allSectionQuestionIdsRequiringUpdate.includes(question.id)
? this.updateQuestion(question, rules)
: question;

return parsedAndUpdatedQuestion;
Expand All @@ -218,23 +219,90 @@ export class QuestionnaireQuestion {
updatedQuestions.find(uq => uq.id === q.id)?.isVisible === true
);

if (hiddenQuestions.length === 0)
return _(parsedAndUpdatedQuestions)
.sortBy(question => question.sortOrder)
.value();
const sortedUpdatedQuestions = _(parsedAndUpdatedQuestions)
.sortBy(question => question.sortOrder)
.value();

// if (hiddenQuestions.length === 0) return sortedUpdatedQuestions;

const resetQuestions = hiddenQuestions.reduce((acc, hiddenQuestion) => {
return this.updateQuestions(
acc,
{ ...hiddenQuestion, value: undefined },
rules,
questionnaire
);
const resetQuestion =
hiddenQuestion.type === "boolean"
? { ...hiddenQuestion, value: false }
: { ...hiddenQuestion, value: undefined };
return this.updateQuestions(acc, resetQuestion, rules, questionnaire);
}, parsedAndUpdatedQuestions);

return _(resetQuestions)
const sortedResetUpdatedQuestions = _(resetQuestions)
.sortBy(question => question.sortOrder)
.value();

// return sortedResetUpdatedQuestions;

const finalUpdatedQuestions =
hiddenQuestions.length === 0 ? sortedUpdatedQuestions : sortedResetUpdatedQuestions;

//Get list question ids that require update

// const allQuestionIdsRequiringUpdate = _(
// rules.flatMap(rule => {
// const actionUpdates = rule.actions.flatMap(
// action => action?.dataElement?.id || action.trackedEntityAttribute?.id
// );
// // const dataElementUpdates = rule.dataElementIds;
// // const teaUpdates = rule.teAttributeIds;
// // return [...actionUpdates, ...dataElementUpdates, ...teaUpdates];
// return actionUpdates;
// })
// )
// .filter(id => id !== updatedQuestion.id)
// .compact()
// .uniq()
// .value();

const allQuestionIdsRequiringUpdate = _(
questionnaire.rules.flatMap(rule => {
if (
rule.dataElementIds.includes(updatedQuestion.id) ||
rule.teAttributeIds.includes(updatedQuestion.id)
//sneha : check that the rule is "applicable"also i.e. the condition is true
) {
const actionUpdates = rule.actions.flatMap(
action => action?.dataElement?.id || action.trackedEntityAttribute?.id
);

return actionUpdates;
}
})
)
.compact()
.uniq()
.value();

const allQuestionsRequiringUpdate = finalUpdatedQuestions.filter(question =>
allQuestionIdsRequiringUpdate.includes(question.id)
);
if (allQuestionsRequiringUpdate.length === 0) return finalUpdatedQuestions;

const finalUpdatesWithSideEffects = allQuestionsRequiringUpdate.reduce(
(acc, questionRequiringUpdate) => {
console.log("updatedQuestion", updatedQuestion);
console.log("questionRequiringUpdate", questionRequiringUpdate);
console.log("rules", rules);
console.log("acc", acc);
const updates = this.updateQuestions(
acc,
questionRequiringUpdate,
rules,
questionnaire
);
console.log("updates", updates);
return updates;
},
finalUpdatedQuestions
);

return finalUpdatesWithSideEffects;
}

private static updateQuestion(question: Question, rules: QuestionnaireRule[]): Question {
Expand Down

0 comments on commit c127aa8

Please sign in to comment.