From b0447586c51e8960b142bf7664dde8f1f3aff3ca Mon Sep 17 00:00:00 2001 From: Adam Caouette Date: Thu, 6 Oct 2022 15:12:03 -0400 Subject: [PATCH 01/21] CSR-803: remove obsolete code --- src/layouts/capability-questions/capability-questions.vue | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/layouts/capability-questions/capability-questions.vue b/src/layouts/capability-questions/capability-questions.vue index 39b96c361..2c132af9b 100644 --- a/src/layouts/capability-questions/capability-questions.vue +++ b/src/layouts/capability-questions/capability-questions.vue @@ -85,12 +85,6 @@ export default { AlertFewMoreQuestionsCopy() { return this.getCmsContent("AdditionalPartsQuestionsAlert", "BodyText"); }, - windshieldPart() { - return this.pageData.partsOrQuestions.find(x => x.glassLocation === damageLocationsSelected.WINDSHIELD); - }, - windshieldPartInfo() { - return this.windshieldPart.parts[0]; - }, pageData() { return this.$store.getters.pageData(fmgPageValues.CAPABILITY_QUESTIONS); } From e604bdb8e10b669e08357ff44c629a5a36c70643 Mon Sep 17 00:00:00 2001 From: Adam Caouette Date: Fri, 7 Oct 2022 16:04:43 -0400 Subject: [PATCH 02/21] CSR-803: move handleAnswerUpdates to shared mixin --- .../capability-questions.vue | 277 +----------------- .../molding-questions/molding-questions.vue | 268 +---------------- src/layouts/part-questions/part-questions.vue | 270 +---------------- src/mixins/vehicle-questions-mixin.js | 257 ++++++++++++++++ 4 files changed, 279 insertions(+), 793 deletions(-) diff --git a/src/layouts/capability-questions/capability-questions.vue b/src/layouts/capability-questions/capability-questions.vue index 2c132af9b..f9a15a6e8 100644 --- a/src/layouts/capability-questions/capability-questions.vue +++ b/src/layouts/capability-questions/capability-questions.vue @@ -9,7 +9,7 @@ -
+
x.capabilityQuestions).map((glass, i) => { + this.questionsData = this.pageData.partsOrQuestions.filter(x => x.capabilityQuestions).map((glass, i) => { // NOTE: questions for property "questions" can differ between layouts glass.questions = glass.capabilityQuestions; // reset selectedAnswers for this glass @@ -103,16 +101,16 @@ export default { }); }, methods: { - showThisQuestionChain(glass, i) { - if (!glass.capabilityQuestions || glass.capabilityQuestions?.length < 1 || glass.isSuppressedPart) { return false; } // return false if no capabilityQuestions or if suppressed - return this.currentQuestionChainIndex === i || glass.answerData?.answerResult?.length > 0; - }, arePagePrerequisitesValid() { const capabilityQuestionsPageData = store.getters.pageData(fmgPageValues.CAPABILITY_QUESTIONS); return capabilityQuestionsPageData && Object.keys(capabilityQuestionsPageData).length > 0; }, + showThisQuestionChain(glass, i) { + if (!glass.capabilityQuestions || glass.capabilityQuestions?.length < 1 || glass.isSuppressedPart) { return false; } // return false if no capabilityQuestions or if suppressed + return this.currentQuestionChainIndex === i || glass.answerData?.answerResult?.length > 0; + }, async forwardButtonAction() { - const capabilityQuestionsAnswersArray = this.capabilityQuestionsData.map((glass) => { + const capabilityQuestionsAnswersArray = this.questionsData.map((glass) => { const selectedAnswerResult2 = this.getCorrespondingAnswerResult2(glass.answerData.answerResult); return { @@ -127,7 +125,7 @@ export default { }); // clear out answerData for future page loads; must occur prior to store save - this.capabilityQuestionsData.forEach((glass) => { + this.questionsData.forEach((glass) => { glass.answerData = {}; }); @@ -138,270 +136,17 @@ export default { let partsOrQuestions = this.pageData.partsOrQuestions; for (let answer of capabilityQuestionsAnswersArray) { const correspondingPart = partsOrQuestions.find(partOrQuestion => partOrQuestion.glassLocation === answer.glassLocation); - const partFromCapabilityQuestionAnswer = (await this.dispatchStoreAction(storeActions.GET_PART_FROM_CAPABILITY_QUESTION_ANSWER, answer.glassLocation, false)).data; + const partFromCapabilityQuestionAnswer = (await this.dispatchStoreAction(this.storeActions.GET_PART_FROM_CAPABILITY_QUESTION_ANSWER, answer.glassLocation, false)).data; partsOrQuestions.find(partOrQuestion => partOrQuestion.glassLocation === answer.glassLocation).parts = partFromCapabilityQuestionAnswer; } this.navigateForward(partsOrQuestions); }, - handleAnswerUpdates(answer) { - // only runs when all questions in a question-chain have been answered - // when selectedAnswers updates, user has completed this part's question chain and has a final answer - // (does not get run for each invididual question's answer, only when - // all relevant questions for the current part have been answered) - - /* - answer example format: - { - "answerResult": "DD11132", - "answeredQuestions": [ - { - "questionText": "Is your Grand Cherokee the Laredo model?", - "selectedAnswerText": "Yes", - "questionNum": 1, - } - ], - "glassIndex": 0 - } - */ - - // collect a list of the answered questions' numbers, needed later below - const answeredQuestionIndexes = []; - const foundDuplicateQuestions = []; - - // if user has answered a question differently than anything that was preloaded, - // we need to clear out any preloaded answers - this.selectedAnswers = {}; - - // loop through every answered question on the currently answered glass part - answer.answeredQuestions?.forEach((aq) => { - - // keep track of this question number - answeredQuestionIndexes.push(aq.questionNum); - - const answeredQuestionText = aq.questionText.toUpperCase(); - const answeredQuestionAnswer = aq.selectedAnswerText.toUpperCase(); - - // HANDLE DUPLICATE QUESTIONS - - // loop through all glass parts data - this.capabilityQuestionsData.forEach((glass, gpIndex) => { - - // only look for duplicates forward... to parts that follow after the currently being answered part - if (gpIndex > answer.glass) { - - let suppressUntil; - // reset this glass part, in case user is changing their previous answers - glass.answerData = null; - glass.isSuppressedPart = null; - - // loop through this glass part's part questions, looking for a questionText match - glass.capabilityQuestions.forEach((pq, pqIndex) => { - - // clear out any previously set answers - pq.answerSelected = null; - - // clear or set suppressQuestion property for each question - if (suppressUntil) { - // if suppressUntil has been set, then suppress this question if before it - if (pqIndex + 1 < suppressUntil) { - pq.suppressQuestion = true; - } else { - pq.suppressQuestion = null; - } - } else { - pq.suppressQuestion = null; - } - - // if these match then we have a duplicate question - if (pq.questionText.toUpperCase() === answeredQuestionText) { - - const thisAnsweredCapabilityQuestion = glass.capabilityQuestions[pqIndex]; - let matchedAnswer; - let rejectedAnswers = []; // set as an array, in case we ever have questions with more than 2 answers... - - // which one of this capabilityQuestions' answers matches our answer? - pq.answers.forEach((ans) => { - if (ans.answerText.toUpperCase() === answeredQuestionAnswer) { - matchedAnswer = ans; - ans.selected = true; - } else { - rejectedAnswers.push(ans); - ans.selected = null; - } - }); - - // Update the key to re-render this part's question-chain component - this.capabilityQuestionsData[gpIndex].key = this.capabilityQuestionsData[gpIndex].glassLocation + this.capabilityQuestionsData[gpIndex].glassName + Date.now().toString(); - - // handle suppressing downstream in this question chain - - if (matchedAnswer.nextQuestionSequence) { - // ensure that the question that the accepted answer has set to be next is NOT suppressed - glass.capabilityQuestions[matchedAnswer.nextQuestionSequence - 1].suppressQuestion = null; - // if the duplicate is the 1ST question, then set suppressUntil var to lowest nextQuestion number - if (pqIndex === 0) { - if (!suppressUntil) { suppressUntil = matchedAnswer.nextQuestionSequence } - if (matchedAnswer.nextQuestionSequence < suppressUntil) { suppressUntil = matchedAnswer.nextQuestionSequence } - } - } - - // handle suppressing upstream in this question chain - glass.capabilityQuestions.forEach((q) => { - q.answers.forEach((thisAns) => { - // restore any of the answers that formerly led to the duplicated question - if (thisAns.originalNextQuestionSequence === pq.questionSequence) { - // restore original nextQuestionSequence - thisAns.nextQuestionSequence = thisAns.originalNextQuestionSequence; - this.originalNextQuestionSequence = null; - // restore original answerResult - if (thisAns.originalAnswerResult) { - thisAns.answerResult = thisAns.originalAnswerResult; - thisAns.originalAnswerResult = null; - } - } - // search for any answers that lead to the duplicated question - if (thisAns.nextQuestionSequence === pq.questionSequence) { - // update either the nextQuestionSequence or the answerResult - if (matchedAnswer.nextQuestionSequence) { - thisAns.originalNextQuestionSequence = thisAns.nextQuestionSequence; - thisAns.nextQuestionSequence = matchedAnswer.nextQuestionSequence; - } else { - thisAns.originalNextQuestionSequence = thisAns.nextQuestionSequence; - thisAns.nextQuestionSequence = null; - thisAns.originalAnswerResult = thisAns.originalAnswerResult || thisAns.answerResult; - thisAns.answerResult = matchedAnswer.answerResult; - } - } - }); - }); - - // suppress current question - thisAnsweredCapabilityQuestion.suppressQuestion = true; - - const thisGlassPart = "glass" + gpIndex; - if (foundDuplicateQuestions[thisGlassPart]) { - if (!foundDuplicateQuestions[thisGlassPart].includes(thisAnsweredCapabilityQuestion.questionSequence)) { - foundDuplicateQuestions[thisGlassPart].push(thisAnsweredCapabilityQuestion.questionSequence); - } - } else { - foundDuplicateQuestions[thisGlassPart] = [thisAnsweredCapabilityQuestion.questionSequence]; - } - - // are there any questions left that are not suppressed? - const remainingQuestions = glass.capabilityQuestions.filter((q) => { - return !q.suppressQuestion; - }); - - if (remainingQuestions.length < 1) { - // this is the final answer for this glass part - - // mark this part as completely answered by adding answerData - const answeredQuestionObj = { - questionText: pq.questionText, - selectedAnswerText: matchedAnswer.answerText, - questionNum: pq.questionSequence, - suppressQuestion: pq.suppressQuestion, - }; - // set the answerData as 'already answered' - glass.answerData = { - answerResult: matchedAnswer.nextQuestionSequence ? matchedAnswer.nextQuestionSequence : matchedAnswer.answerResult, - answeredQuestions: [answeredQuestionObj], - }; - - // suppress this glass because it has an answer - glass.isSuppressedPart = true; - } - - } - - }); - - // Update the key to re-render this part's question-chain component - this.capabilityQuestionsData[gpIndex].key = this.capabilityQuestionsData[gpIndex].glassLocation + this.capabilityQuestionsData[gpIndex].glassName + Date.now().toString(); - - } - }); - }); - - // DETERMINE ANSWERED QUESTIONS LIST FOR THIS GLASS PART - - // look through all (this part's) part questions for any duplicates that were suppressed; - // add them to the list of answered questions if found - - // EX answeredQuestionIndexes: [1,5,11,13] - - // EX foundDuplicateQuestions = { - // "glassPart1": [1], - // "glassPart2": [7, 10] - // }; - - const thisPartsDupes = foundDuplicateQuestions["glass" + answer.glassIndex]; - const completeAnsweredQuestions = answer.answeredQuestions ? [...answer.answeredQuestions] : []; - const glassPartAnswered = this.capabilityQuestionsData[answer.glassIndex]; - - thisPartsDupes?.forEach((dupe) => { - // dupe is a single integer - const dupeQuestion = glassPartAnswered.capabilityQuestions[dupe - 1]; - const dupeQuestionAnswer = dupeQuestion.answers.find((q) => q.selected === true); - - glassPartAnswered.capabilityQuestions.forEach((q) => { - let includeThisDupeInAnsweredQuestions = false; - - // did one of the answers of this question point to the duplicated question? - q.answers.forEach((a) => { - if ((dupe === a.originalNextQuestionSequence) && - (answeredQuestionIndexes.includes(q.questionSequence)) && - (a.answerText.toUpperCase() === dupeQuestionAnswer.answerText.toUpperCase())) { - includeThisDupeInAnsweredQuestions = true; - } - }); - - // is this q.questionSequence listed as the duplicated question's nextQuestionSequence? - if ((q.questionSequence === dupeQuestionAnswer.nextQuestionSequence) && (answeredQuestionIndexes.includes(q.questionSequence))) { - includeThisDupeInAnsweredQuestions = true; - } - - if (includeThisDupeInAnsweredQuestions) { - completeAnsweredQuestions.push({ - questionNum: dupeQuestion.questionSequence, - questionText: dupeQuestion.questionText, - selectedAnswerText: dupeQuestionAnswer.answerText, - suppressQuestion: dupeQuestion.suppressQuestion, - }); - } - }); - }); - - // make sure there are no duplicated dupes in the list... - const foundInCompleteAnsweredQuestions = new Set(); - let filteredCompleteAnsweredQuestions = completeAnsweredQuestions.filter(el => { - const duplicate = foundInCompleteAnsweredQuestions.has(el.questionText); - foundInCompleteAnsweredQuestions.add(el.questionText); - return !duplicate; - }); - filteredCompleteAnsweredQuestions = filteredCompleteAnsweredQuestions.sort((a, b) => a.questionNum - b.questionNum); - - // set final answer data for the current answered glass part - glassPartAnswered.answerData = { - answerResult: answer.answerResult, - answeredQuestions: filteredCompleteAnsweredQuestions, - } - - // this part has been fully answered, so advance to next part's question chain - for (let i = answer.glassIndex + 1; i < this.capabilityQuestionsData.length; i++) { - // if this part has not yet been fully answered, then make it the current part - if (!this.capabilityQuestionsData[i].answerData?.answerResult) { - this.currentQuestionChainIndex = i; - break; - } - } - }, // TODO I'm sure there's a better/simplier way to do this that I'm missing but my brain's fried // Find the part that has some answer that has an answerResult matching the selected answerResult, then get the corresponding answerResult2 getCorrespondingAnswerResult2(answerResult1) { - return this.capabilityQuestionsData + return this.questionsData .find(part => part.capabilityQuestions.some(question => question.answers.some(answer => answer.answerResult == answerResult1))) // found part .capabilityQuestions.find(question => question.answers.some(answer => answer.answerResult == answerResult1)) // found question .answers.find(answer => answer.answerResult == answerResult1) diff --git a/src/layouts/molding-questions/molding-questions.vue b/src/layouts/molding-questions/molding-questions.vue index 50cfe42c2..b60e4dd5f 100644 --- a/src/layouts/molding-questions/molding-questions.vue +++ b/src/layouts/molding-questions/molding-questions.vue @@ -20,7 +20,7 @@ :manualCopy="AlertFewMoreQuestionsCopy" v-bind:isDismissible="false" /> -
+
x.parts[0].childPartQuestions.length).map((glass, i) => { + this.questionsData = this.pageData.partsOrQuestions.filter(x => x.parts[0].childPartQuestions.length).map((glass, i) => { // NOTE: questions for property "questions" can differ between layouts glass.questions = glass.parts[0].childPartQuestions; // reset selectedAnswers for this glass @@ -130,7 +128,7 @@ export default { return this.currentGlassIndex === i || glass.answerData?.answerResult?.length > 0; }, async forwardButtonAction() { - const questionAnswersArray = this.moldingQuestionsData.map((glass) => { + const questionAnswersArray = this.questionsData.map((glass) => { return { glassLocation: glass.glassLocation, glassName: glass.glassName, @@ -141,7 +139,7 @@ export default { }); // clear out answerData for future page loads; must occur prior to store save - this.moldingQuestionsData.forEach((glass) => { + this.questionsData.forEach((glass) => { glass.answerData = {}; }); @@ -162,262 +160,6 @@ export default { this.navigateForward(partsOrQuestions); }, - handleAnswerUpdates(answer) { - // only runs when all questions in a question-chain have been answered - // when selectedAnswers updates, user has completed this part's question chain and has a final answer - // (does not get run for each invididual question's answer, only when - // all relevant questions for the current part have been answered) - - /* - answer example format: - { - "answerResult": "DD11132", - "answeredQuestions": [ - { - "questionText": "Is your Grand Cherokee the Laredo model?", - "selectedAnswerText": "Yes", - "questionNum": 1, - } - ], - "glassIndex": 0 - } - */ - - // collect a list of the answered questions' numbers, needed later below - const answeredQuestionIndexes = []; - const foundDuplicateQuestions = []; - - // if user has answered a question differently than anything that was preloaded, - // we need to clear out any preloaded answers - this.selectedAnswers = {}; - - // loop through every answered question on the currently answered glass part - answer.answeredQuestions?.forEach((aq) => { - - // keep track of this question number - answeredQuestionIndexes.push(aq.questionNum); - - const answeredQuestionText = aq.questionText.toUpperCase(); - const answeredQuestionAnswer = aq.selectedAnswerText.toUpperCase(); - - // HANDLE DUPLICATE QUESTIONS - - // loop through all glass parts data - this.moldingQuestionsData.forEach((glass, gpIndex) => { - - // only look for duplicates forward... to parts that follow after the currently being answered part - if (gpIndex > answer.glassIndex) { - - let suppressUntil; - // reset this glass part, in case user is changing their previous answers - glass.answerData = null; - glass.isSuppressedPart = null; - - // loop through this glass part's part questions, looking for a questionText match - glass.questions.forEach((pq, pqIndex) => { - - // clear out any previously set answers - pq.answerSelected = null; - - // clear or set suppressQuestion property for each question - if (suppressUntil) { - // if suppressUntil has been set, then suppress this question if before it - if (pqIndex + 1 < suppressUntil) { - pq.suppressQuestion = true; - } else { - pq.suppressQuestion = null; - } - } else { - pq.suppressQuestion = null; - } - - // if these match then we have a duplicate question - if (pq.questionText.toUpperCase() === answeredQuestionText) { - - const thisAnsweredPartQuestion = glass.questions[pqIndex]; - let matchedAnswer; - let rejectedAnswers = []; // set as an array, in case we ever have questions with more than 2 answers... - - // which one of this questions' answers matches our answer? - pq.answers.forEach((ans) => { - if (ans.answerText.toUpperCase() === answeredQuestionAnswer) { - matchedAnswer = ans; - ans.selected = true; - } else { - rejectedAnswers.push(ans); - ans.selected = null; - } - }); - - // Update the key to re-render this part's question-chain component - this.moldingQuestionsData[gpIndex].key = this.moldingQuestionsData[gpIndex].glassLocation + this.moldingQuestionsData[gpIndex].glassName + Date.now().toString(); - - // handle suppressing downstream in this question chain - - if (matchedAnswer.nextQuestionSequence) { - // ensure that the question that the accepted answer has set to be next is NOT suppressed - glass.questions[matchedAnswer.nextQuestionSequence - 1].suppressQuestion = null; - // if the duplicate is the 1ST question, then set suppressUntil var to lowest nextQuestion number - if (pqIndex === 0) { - if (!suppressUntil) { suppressUntil = matchedAnswer.nextQuestionSequence } - if (matchedAnswer.nextQuestionSequence < suppressUntil) { suppressUntil = matchedAnswer.nextQuestionSequence} - } - } - - // handle suppressing upstream in this question chain - glass.questions.forEach((q) => { - q.answers.forEach((thisAns) => { - // restore any of the answers that formerly led to the duplicated question - if (thisAns.originalNextQuestionSequence === pq.questionSequence) { - // restore original nextQuestionSequence - thisAns.nextQuestionSequence = thisAns.originalNextQuestionSequence; - this.originalNextQuestionSequence = null; - // restore original answerResult - if (thisAns.originalAnswerResult) { - thisAns.answerResult = thisAns.originalAnswerResult; - thisAns.originalAnswerResult = null; - } - } - // search for any answers that lead to the duplicated question - if (thisAns.nextQuestionSequence === pq.questionSequence) { - // update either the nextQuestionSequence or the answerResult - if (matchedAnswer.nextQuestionSequence) { - thisAns.originalNextQuestionSequence = thisAns.nextQuestionSequence; - thisAns.nextQuestionSequence = matchedAnswer.nextQuestionSequence; - } else { - thisAns.originalNextQuestionSequence = thisAns.nextQuestionSequence; - thisAns.nextQuestionSequence = null; - thisAns.originalAnswerResult = thisAns.originalAnswerResult || thisAns.answerResult; - thisAns.answerResult = matchedAnswer.answerResult; - } - } - }); - }); - - // suppress current question - thisAnsweredPartQuestion.suppressQuestion = true; - - const thisGlassPart = "glass" + gpIndex; - if (foundDuplicateQuestions[thisGlassPart]) { - if (!foundDuplicateQuestions[thisGlassPart].includes(thisAnsweredPartQuestion.questionSequence)) { - foundDuplicateQuestions[thisGlassPart].push(thisAnsweredPartQuestion.questionSequence); - } - } else { - foundDuplicateQuestions[thisGlassPart] = [thisAnsweredPartQuestion.questionSequence]; - } - - // are there any questions left that are not suppressed? - const remainingQuestions = glass.questions.filter((q) => { - return !q.suppressQuestion; - }); - - if (remainingQuestions.length < 1) { - // this is the final answer for this glass part - - // mark this part as completely answered by adding answerData - const answeredQuestionObj = { - questionText: pq.questionText, - selectedAnswerText: matchedAnswer.answerText, - questionNum: pq.questionSequence, - suppressQuestion: pq.suppressQuestion, - }; - // set the answerData as 'already answered' - glass.answerData = { - answerResult: matchedAnswer.nextQuestionSequence ? matchedAnswer.nextQuestionSequence : matchedAnswer.answerResult, - answeredQuestions: [answeredQuestionObj], - }; - - // suppress this glass because it has an answer - glass.isSuppressedPart = true; - } - - } - - }); - - // Update the key to re-render this part's question-chain component - this.moldingQuestionsData[gpIndex].key = this.moldingQuestionsData[gpIndex].glassLocation + this.moldingQuestionsData[gpIndex].glassName + Date.now().toString(); - - } - - }); - - }); - - // DETERMINE ANSWERED QUESTIONS LIST FOR THIS GLASS PART - - // look through all (this part's) part questions for any duplicates that were suppressed; - // add them to the list of answered questions if found - - // EX answeredQuestionIndexes: [1,5,11,13] - - // EX foundDuplicateQuestions = { - // "glassPart1": [1], - // "glassPart2": [7, 10] - // }; - - const thisPartsDupes = foundDuplicateQuestions["glass" + answer.glassIndex]; - const completeAnsweredQuestions = answer.answeredQuestions ? [...answer.answeredQuestions] : []; - const glassPartAnswered = this.moldingQuestionsData[answer.glassIndex]; - - thisPartsDupes?.forEach((dupe) => { - // dupe is a single integer - const dupeQuestion = glassPartAnswered.questions[dupe - 1]; - const dupeQuestionAnswer = dupeQuestion.answers.find((q) => q.selected === true); - - glassPartAnswered.questions.forEach((q) => { - let includeThisDupeInAnsweredQuestions = false; - - // did one of the answers of this question point to the duplicated question? - q.answers.forEach((a) => { - if ((dupe === a.originalNextQuestionSequence) && - (answeredQuestionIndexes.includes(q.questionSequence)) && - (a.answerText.toUpperCase() === dupeQuestionAnswer.answerText.toUpperCase())) { - includeThisDupeInAnsweredQuestions = true; - } - }); - - // is this q.questionSequence listed as the duplicated question's nextQuestionSequence? - if ((q.questionSequence === dupeQuestionAnswer.nextQuestionSequence) && (answeredQuestionIndexes.includes(q.questionSequence))) { - includeThisDupeInAnsweredQuestions = true; - } - - if (includeThisDupeInAnsweredQuestions) { - completeAnsweredQuestions.push({ - questionNum: dupeQuestion.questionSequence, - questionText: dupeQuestion.questionText, - selectedAnswerText: dupeQuestionAnswer.answerText, - suppressQuestion: dupeQuestion.suppressQuestion, - }); - } - }); - }); - - // make sure there are no duplicated dupes in the list... - const foundInCompleteAnsweredQuestions = new Set(); - let filteredCompleteAnsweredQuestions = completeAnsweredQuestions.filter(el => { - const duplicate = foundInCompleteAnsweredQuestions.has(el.questionText); - foundInCompleteAnsweredQuestions.add(el.questionText); - return !duplicate; - }); - filteredCompleteAnsweredQuestions = filteredCompleteAnsweredQuestions.sort((a,b) => a.questionNum - b.questionNum); - - // set final answer data for the current answered glass part - glassPartAnswered.answerData = { - answerResult: answer.answerResult, - answeredQuestions: filteredCompleteAnsweredQuestions, - } - - // this part has been fully answered, so advance to next molding question chain - for (let i = answer.glassIndex + 1; i < this.moldingQuestionsData.length; i++) { - // if this part has not yet been fully answered, then make it the current part - if (!this.moldingQuestionsData[i].answerData?.answerResult) { - this.currentGlassIndex = i; - break; - } - } - - }, }, components: { funnelHeader, diff --git a/src/layouts/part-questions/part-questions.vue b/src/layouts/part-questions/part-questions.vue index 131a70f44..d5e79540b 100644 --- a/src/layouts/part-questions/part-questions.vue +++ b/src/layouts/part-questions/part-questions.vue @@ -20,7 +20,7 @@ :manualCopy="AlertFewMoreQuestionsCopy" v-bind:isDismissible="false" /> -
+
x.partQuestions).map((glass, i) => { + this.questionsData = this.pageData.partsOrQuestions.filter(x => x.partQuestions).map((glass, i) => { // NOTE: questions for property "questions" can differ between layouts glass.questions = glass.partQuestions; // reset selectedAnswers for this glass @@ -130,7 +128,7 @@ export default { return this.currentGlassIndex === i || glass.answerData?.answerResult?.length > 0; }, async forwardButtonAction() { - const questionAnswersArray = this.partsQuestionsData.map((glass) => { + const questionAnswersArray = this.questionsData.map((glass) => { return { glassLocation: glass.glassLocation, glassName: glass.glassName, @@ -141,7 +139,7 @@ export default { }); // clear out answerData for future page loads; must occur prior to store save - this.partsQuestionsData.forEach((glass) => { + this.questionsData.forEach((glass) => { glass.answerData = {}; }); @@ -149,7 +147,7 @@ export default { await this.dispatchStoreAction(this.storeActions.SAVE_PART_QUESTION_ANSWERS, questionAnswersArray, false); // call API parts method - const partsLookup = await this.dispatchStoreAction(storeActions.GET_PARTS) + const partsLookup = await this.dispatchStoreAction(this.storeActions.GET_PARTS) .catch(() => { return this.$refs.funnelFooter.removeLoader(); }); @@ -158,262 +156,6 @@ export default { this.navigateForward(glassNameAndPartsForStore); }, - handleAnswerUpdates(answer) { - // only runs when all questions in a question-chain have been answered - // when selectedAnswers updates, user has completed this part's question chain and has a final answer - // (does not get run for each invididual question's answer, only when - // all relevant questions for the current part have been answered) - - /* - answer example format: - { - "answerResult": "DD11132", - "answeredQuestions": [ - { - "questionText": "Is your Grand Cherokee the Laredo model?", - "selectedAnswerText": "Yes", - "questionNum": 1, - } - ], - "glassIndex": 0 - } - */ - - // collect a list of the answered questions' numbers, needed later below - const answeredQuestionIndexes = []; - const foundDuplicateQuestions = []; - - // if user has answered a question differently than anything that was preloaded, - // we need to clear out any preloaded answers - this.selectedAnswers = {}; - - // loop through every answered question on the currently answered glass part - answer.answeredQuestions?.forEach((aq) => { - - // keep track of this question number - answeredQuestionIndexes.push(aq.questionNum); - - const answeredQuestionText = aq.questionText.toUpperCase(); - const answeredQuestionAnswer = aq.selectedAnswerText.toUpperCase(); - - // HANDLE DUPLICATE QUESTIONS - - // loop through all glass parts data - this.partsQuestionsData.forEach((glass, gpIndex) => { - - // only look for duplicates forward... to parts that follow after the currently being answered part - if (gpIndex > answer.glassIndex) { - - let suppressUntil; - // reset this glass part, in case user is changing their previous answers - glass.answerData = null; - glass.isSuppressedPart = null; - - // loop through this glass part's questions, looking for a questionText match - glass.questions.forEach((pq, pqIndex) => { - - // clear out any previously set answers - pq.answerSelected = null; - - // clear or set suppressQuestion property for each question - if (suppressUntil) { - // if suppressUntil has been set, then suppress this question if before it - if (pqIndex + 1 < suppressUntil) { - pq.suppressQuestion = true; - } else { - pq.suppressQuestion = null; - } - } else { - pq.suppressQuestion = null; - } - - // if these match then we have a duplicate question - if (pq.questionText.toUpperCase() === answeredQuestionText) { - - const thisAnsweredQuestion = glass.questions[pqIndex]; - let matchedAnswer; - let rejectedAnswers = []; // set as an array, in case we ever have questions with more than 2 answers... - - // which one of this questions' answers matches our answer? - pq.answers.forEach((ans) => { - if (ans.answerText.toUpperCase() === answeredQuestionAnswer) { - matchedAnswer = ans; - ans.selected = true; - } else { - rejectedAnswers.push(ans); - ans.selected = null; - } - }); - - // Update the key to re-render this part's question-chain component - this.partsQuestionsData[gpIndex].key = this.partsQuestionsData[gpIndex].glassLocation + this.partsQuestionsData[gpIndex].glassName + Date.now().toString(); - - // handle suppressing downstream in this question chain - - if (matchedAnswer.nextQuestionSequence) { - // ensure that the question that the accepted answer has set to be next is NOT suppressed - glass.questions[matchedAnswer.nextQuestionSequence - 1].suppressQuestion = null; - // if the duplicate is the 1ST question, then set suppressUntil var to lowest nextQuestion number - if (pqIndex === 0) { - if (!suppressUntil) { suppressUntil = matchedAnswer.nextQuestionSequence } - if (matchedAnswer.nextQuestionSequence < suppressUntil) { suppressUntil = matchedAnswer.nextQuestionSequence} - } - } - - // handle suppressing upstream in this question chain - glass.questions.forEach((q) => { - q.answers.forEach((thisAns) => { - // restore any of the answers that formerly led to the duplicated question - if (thisAns.originalNextQuestionSequence === pq.questionSequence) { - // restore original nextQuestionSequence - thisAns.nextQuestionSequence = thisAns.originalNextQuestionSequence; - this.originalNextQuestionSequence = null; - // restore original answerResult - if (thisAns.originalAnswerResult) { - thisAns.answerResult = thisAns.originalAnswerResult; - thisAns.originalAnswerResult = null; - } - } - // search for any answers that lead to the duplicated question - if (thisAns.nextQuestionSequence === pq.questionSequence) { - // update either the nextQuestionSequence or the answerResult - if (matchedAnswer.nextQuestionSequence) { - thisAns.originalNextQuestionSequence = thisAns.nextQuestionSequence; - thisAns.nextQuestionSequence = matchedAnswer.nextQuestionSequence; - } else { - thisAns.originalNextQuestionSequence = thisAns.nextQuestionSequence; - thisAns.nextQuestionSequence = null; - thisAns.originalAnswerResult = thisAns.originalAnswerResult || thisAns.answerResult; - thisAns.answerResult = matchedAnswer.answerResult; - } - } - }); - }); - - // suppress current question - thisAnsweredQuestion.suppressQuestion = true; - - const thisGlassPart = "glass" + gpIndex; - if (foundDuplicateQuestions[thisGlassPart]) { - if (!foundDuplicateQuestions[thisGlassPart].includes(thisAnsweredQuestion.questionSequence)) { - foundDuplicateQuestions[thisGlassPart].push(thisAnsweredQuestion.questionSequence); - } - } else { - foundDuplicateQuestions[thisGlassPart] = [thisAnsweredQuestion.questionSequence]; - } - - // are there any questions left that are not suppressed? - const remainingQuestions = glass.questions.filter((q) => { - return !q.suppressQuestion; - }); - - if (remainingQuestions.length < 1) { - // this is the final answer for this glass part - - // mark this part as completely answered by adding answerData - const answeredQuestionObj = { - questionText: pq.questionText, - selectedAnswerText: matchedAnswer.answerText, - questionNum: pq.questionSequence, - suppressQuestion: pq.suppressQuestion, - }; - // set the answerData as 'already answered' - glass.answerData = { - answerResult: matchedAnswer.nextQuestionSequence ? matchedAnswer.nextQuestionSequence : matchedAnswer.answerResult, - answeredQuestions: [answeredQuestionObj], - }; - - // suppress this glass because it has an answer - glass.isSuppressedPart = true; - } - - } - - }); - - // Update the key to re-render this part's question-chain component - this.partsQuestionsData[gpIndex].key = this.partsQuestionsData[gpIndex].glassLocation + this.partsQuestionsData[gpIndex].glassName + Date.now().toString(); - - } - - }); - - }); - - // DETERMINE ANSWERED QUESTIONS LIST FOR THIS GLASS PART - - // look through all (this part's) part questions for any duplicates that were suppressed; - // add them to the list of answered questions if found - - // EX answeredQuestionIndexes: [1,5,11,13] - - // EX foundDuplicateQuestions = { - // "glassPart1": [1], - // "glassPart2": [7, 10] - // }; - - const thisPartsDupes = foundDuplicateQuestions["glass" + answer.glassIndex]; - const completeAnsweredQuestions = answer.answeredQuestions ? [...answer.answeredQuestions] : []; - const glassPartAnswered = this.partsQuestionsData[answer.glassIndex]; - - thisPartsDupes?.forEach((dupe) => { - // dupe is a single integer - const dupeQuestion = glassPartAnswered.questions[dupe - 1]; - const dupeQuestionAnswer = dupeQuestion.answers.find((q) => q.selected === true); - - glassPartAnswered.questions.forEach((q) => { - let includeThisDupeInAnsweredQuestions = false; - - // did one of the answers of this question point to the duplicated question? - q.answers.forEach((a) => { - if ((dupe === a.originalNextQuestionSequence) && - (answeredQuestionIndexes.includes(q.questionSequence)) && - (a.answerText.toUpperCase() === dupeQuestionAnswer.answerText.toUpperCase())) { - includeThisDupeInAnsweredQuestions = true; - } - }); - - // is this q.questionSequence listed as the duplicated question's nextQuestionSequence? - if ((q.questionSequence === dupeQuestionAnswer.nextQuestionSequence) && (answeredQuestionIndexes.includes(q.questionSequence))) { - includeThisDupeInAnsweredQuestions = true; - } - - if (includeThisDupeInAnsweredQuestions) { - completeAnsweredQuestions.push({ - questionNum: dupeQuestion.questionSequence, - questionText: dupeQuestion.questionText, - selectedAnswerText: dupeQuestionAnswer.answerText, - suppressQuestion: dupeQuestion.suppressQuestion, - }); - } - }); - }); - - // make sure there are no duplicated dupes in the list... - const foundInCompleteAnsweredQuestions = new Set(); - let filteredCompleteAnsweredQuestions = completeAnsweredQuestions.filter(el => { - const duplicate = foundInCompleteAnsweredQuestions.has(el.questionText); - foundInCompleteAnsweredQuestions.add(el.questionText); - return !duplicate; - }); - filteredCompleteAnsweredQuestions = filteredCompleteAnsweredQuestions.sort((a,b) => a.questionNum - b.questionNum); - - // set final answer data for the current answered glass part - glassPartAnswered.answerData = { - answerResult: answer.answerResult, - answeredQuestions: filteredCompleteAnsweredQuestions, - } - - // this part has been fully answered, so advance to next part's question chain - for (let i = answer.glassIndex + 1; i < this.partsQuestionsData.length; i++) { - // if this part has not yet been fully answered, then make it the current part - if (!this.partsQuestionsData[i].answerData?.answerResult) { - this.currentGlassIndex = i; - break; - } - } - - }, }, components: { funnelHeader, diff --git a/src/mixins/vehicle-questions-mixin.js b/src/mixins/vehicle-questions-mixin.js index 415fa1e6d..a34107970 100644 --- a/src/mixins/vehicle-questions-mixin.js +++ b/src/mixins/vehicle-questions-mixin.js @@ -126,6 +126,263 @@ export default { return glass; }, + handleAnswerUpdates(answer, vm) { + // only runs when all questions in a question-chain have been answered + // when selectedAnswers updates, user has completed this part's question chain and has a final answer + // (does not get run for each invididual question's answer, only when + // all relevant questions for the current part have been answered) + + /* answer example format: + { + "answerResult": "DD11132", + "answeredQuestions": [ + { + "questionText": "Is your Grand Cherokee the Laredo model?", + "selectedAnswerText": "Yes", + "questionNum": 1, + } + ], + "glassIndex": 0 + } + */ + + const self = vm ?? this; + + // collect a list of the answered questions' numbers, needed later below + const answeredQuestionIndexes = []; + const foundDuplicateQuestions = []; + + // if user has answered a question differently than anything that was preloaded, + // we need to clear out any preloaded answers + self.selectedAnswers = {}; + + // loop through every answered question on the currently answered glass part + answer.answeredQuestions?.forEach((aq) => { + + // keep track of this question number + answeredQuestionIndexes.push(aq.questionNum); + + const answeredQuestionText = aq.questionText.toUpperCase(); + const answeredQuestionAnswer = aq.selectedAnswerText.toUpperCase(); + + // HANDLE DUPLICATE QUESTIONS + + // loop through all glass parts data + self.questionsData.forEach((glass, gpIndex) => { + + // only look for duplicates forward... to parts that follow after the currently being answered part + if (gpIndex > answer.glassIndex) { + + let suppressUntil; + // reset this glass part, in case user is changing their previous answers + glass.answerData = null; + glass.isSuppressedPart = null; + + // loop through this glass part's questions, looking for a questionText match + glass.questions.forEach((pq, pqIndex) => { + + // clear out any previously set answers + pq.answerSelected = null; + + // clear or set suppressQuestion property for each question + if (suppressUntil) { + // if suppressUntil has been set, then suppress this question if before it + if (pqIndex + 1 < suppressUntil) { + pq.suppressQuestion = true; + } else { + pq.suppressQuestion = null; + } + } else { + pq.suppressQuestion = null; + } + + // if these match then we have a duplicate question + if (pq.questionText.toUpperCase() === answeredQuestionText) { + + const thisAnsweredQuestion = glass.questions[pqIndex]; + let matchedAnswer; + let rejectedAnswers = []; // set as an array, in case we ever have questions with more than 2 answers... + + // which one of this questions' answers matches our answer? + pq.answers.forEach((ans) => { + if (ans.answerText.toUpperCase() === answeredQuestionAnswer) { + matchedAnswer = ans; + ans.selected = true; + } else { + rejectedAnswers.push(ans); + ans.selected = null; + } + }); + + // Update the key to re-render this part's question-chain component + self.questionsData[gpIndex].key = self.questionsData[gpIndex].glassLocation + self.questionsData[gpIndex].glassName + Date.now().toString(); + + // handle suppressing downstream in this question chain + + if (matchedAnswer.nextQuestionSequence) { + // ensure that the question that the accepted answer has set to be next is NOT suppressed + glass.questions[matchedAnswer.nextQuestionSequence - 1].suppressQuestion = null; + // if the duplicate is the 1ST question, then set suppressUntil var to lowest nextQuestion number + if (pqIndex === 0) { + if (!suppressUntil) { suppressUntil = matchedAnswer.nextQuestionSequence } + if (matchedAnswer.nextQuestionSequence < suppressUntil) { suppressUntil = matchedAnswer.nextQuestionSequence} + } + } + + // handle suppressing upstream in this question chain + glass.questions.forEach((q) => { + q.answers.forEach((thisAns) => { + // restore any of the answers that formerly led to the duplicated question + if (thisAns.originalNextQuestionSequence === pq.questionSequence) { + // restore original nextQuestionSequence + thisAns.nextQuestionSequence = thisAns.originalNextQuestionSequence; + self.originalNextQuestionSequence = null; + // restore original answerResult + if (thisAns.originalAnswerResult) { + thisAns.answerResult = thisAns.originalAnswerResult; + thisAns.originalAnswerResult = null; + } + } + // search for any answers that lead to the duplicated question + if (thisAns.nextQuestionSequence === pq.questionSequence) { + // update either the nextQuestionSequence or the answerResult + if (matchedAnswer.nextQuestionSequence) { + thisAns.originalNextQuestionSequence = thisAns.nextQuestionSequence; + thisAns.nextQuestionSequence = matchedAnswer.nextQuestionSequence; + } else { + thisAns.originalNextQuestionSequence = thisAns.nextQuestionSequence; + thisAns.nextQuestionSequence = null; + thisAns.originalAnswerResult = thisAns.originalAnswerResult || thisAns.answerResult; + thisAns.answerResult = matchedAnswer.answerResult; + } + } + }); + }); + + // suppress current question + thisAnsweredQuestion.suppressQuestion = true; + + const thisGlassPart = "glass" + gpIndex; + if (foundDuplicateQuestions[thisGlassPart]) { + if (!foundDuplicateQuestions[thisGlassPart].includes(thisAnsweredQuestion.questionSequence)) { + foundDuplicateQuestions[thisGlassPart].push(thisAnsweredQuestion.questionSequence); + } + } else { + foundDuplicateQuestions[thisGlassPart] = [thisAnsweredQuestion.questionSequence]; + } + + // are there any questions left that are not suppressed? + const remainingQuestions = glass.questions.filter((q) => { + return !q.suppressQuestion; + }); + + if (remainingQuestions.length < 1) { + // this is the final answer for this glass part + + // mark this part as completely answered by adding answerData + const answeredQuestionObj = { + questionText: pq.questionText, + selectedAnswerText: matchedAnswer.answerText, + questionNum: pq.questionSequence, + suppressQuestion: pq.suppressQuestion, + }; + // set the answerData as 'already answered' + glass.answerData = { + answerResult: matchedAnswer.nextQuestionSequence ? matchedAnswer.nextQuestionSequence : matchedAnswer.answerResult, + answeredQuestions: [answeredQuestionObj], + }; + + // suppress this glass because it has an answer + glass.isSuppressedPart = true; + } + + } + + }); + + // Update the key to re-render this part's question-chain component + self.questionsData[gpIndex].key = self.questionsData[gpIndex].glassLocation + self.questionsData[gpIndex].glassName + Date.now().toString(); + + } + + }); + + }); + + // DETERMINE ANSWERED QUESTIONS LIST FOR THIS GLASS PART + + // look through all (this part's) part questions for any duplicates that were suppressed; + // add them to the list of answered questions if found + + // EX answeredQuestionIndexes: [1,5,11,13] + + // EX foundDuplicateQuestions = { + // "glassPart1": [1], + // "glassPart2": [7, 10] + // }; + + const thisPartsDupes = foundDuplicateQuestions["glass" + answer.glassIndex]; + const completeAnsweredQuestions = answer.answeredQuestions ? [...answer.answeredQuestions] : []; + const glassPartAnswered = self.questionsData[answer.glassIndex]; + + thisPartsDupes?.forEach((dupe) => { + // dupe is a single integer + const dupeQuestion = glassPartAnswered.questions[dupe - 1]; + const dupeQuestionAnswer = dupeQuestion.answers.find((q) => q.selected === true); + + glassPartAnswered.questions.forEach((q) => { + let includeThisDupeInAnsweredQuestions = false; + + // did one of the answers of this question point to the duplicated question? + q.answers.forEach((a) => { + if ((dupe === a.originalNextQuestionSequence) && + (answeredQuestionIndexes.includes(q.questionSequence)) && + (a.answerText.toUpperCase() === dupeQuestionAnswer.answerText.toUpperCase())) { + includeThisDupeInAnsweredQuestions = true; + } + }); + + // is this q.questionSequence listed as the duplicated question's nextQuestionSequence? + if ((q.questionSequence === dupeQuestionAnswer.nextQuestionSequence) && (answeredQuestionIndexes.includes(q.questionSequence))) { + includeThisDupeInAnsweredQuestions = true; + } + + if (includeThisDupeInAnsweredQuestions) { + completeAnsweredQuestions.push({ + questionNum: dupeQuestion.questionSequence, + questionText: dupeQuestion.questionText, + selectedAnswerText: dupeQuestionAnswer.answerText, + suppressQuestion: dupeQuestion.suppressQuestion, + }); + } + }); + }); + + // make sure there are no duplicated dupes in the list... + const foundInCompleteAnsweredQuestions = new Set(); + let filteredCompleteAnsweredQuestions = completeAnsweredQuestions.filter(el => { + const duplicate = foundInCompleteAnsweredQuestions.has(el.questionText); + foundInCompleteAnsweredQuestions.add(el.questionText); + return !duplicate; + }); + filteredCompleteAnsweredQuestions = filteredCompleteAnsweredQuestions.sort((a,b) => a.questionNum - b.questionNum); + + // set final answer data for the current answered glass part + glassPartAnswered.answerData = { + answerResult: answer.answerResult, + answeredQuestions: filteredCompleteAnsweredQuestions, + } + + // this part has been fully answered, so advance to next part's question chain + for (let i = answer.glassIndex + 1; i < self.questionsData.length; i++) { + // if this part has not yet been fully answered, then make it the current part + if (!self.questionsData[i].answerData?.answerResult) { + self.currentGlassIndex = i; + break; + } + } + + }, // Can't use `this` because navigateForward is also called from vin-pages-mixin async navigateForward(partsOrQuestions, vm) { const self = vm ?? this; From fbbbf377beefb03ed69ae08c22bf2560c415f779 Mon Sep 17 00:00:00 2001 From: Adam Caouette Date: Mon, 10 Oct 2022 13:24:56 -0400 Subject: [PATCH 03/21] CSR-803 standardize naming across questions pages --- .../capability-questions/capability-questions.vue | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/layouts/capability-questions/capability-questions.vue b/src/layouts/capability-questions/capability-questions.vue index f9a15a6e8..cb0d0d656 100644 --- a/src/layouts/capability-questions/capability-questions.vue +++ b/src/layouts/capability-questions/capability-questions.vue @@ -12,7 +12,7 @@
@@ -106,11 +106,11 @@ export default { return capabilityQuestionsPageData && Object.keys(capabilityQuestionsPageData).length > 0; }, showThisQuestionChain(glass, i) { - if (!glass.capabilityQuestions || glass.capabilityQuestions?.length < 1 || glass.isSuppressedPart) { return false; } // return false if no capabilityQuestions or if suppressed + if (!glass.questions || glass.questions?.length < 1 || glass.isSuppressedPart) { return false; } // return false if no capabilityQuestions or if suppressed return this.currentQuestionChainIndex === i || glass.answerData?.answerResult?.length > 0; }, async forwardButtonAction() { - const capabilityQuestionsAnswersArray = this.questionsData.map((glass) => { + const questionAnswersArray = this.questionsData.map((glass) => { const selectedAnswerResult2 = this.getCorrespondingAnswerResult2(glass.answerData.answerResult); return { @@ -130,11 +130,11 @@ export default { }); // save to vuex store as order.damage.capabilityQuestionAnswers (array) - await this.dispatchStoreAction(this.storeActions.SAVE_CAPABILITY_QUESTION_ANSWERS, capabilityQuestionsAnswersArray, false); + await this.dispatchStoreAction(this.storeActions.SAVE_CAPABILITY_QUESTION_ANSWERS, questionAnswersArray, false); // get parts from the capabilityQuestionAnswers let partsOrQuestions = this.pageData.partsOrQuestions; - for (let answer of capabilityQuestionsAnswersArray) { + for (let answer of questionAnswersArray) { const correspondingPart = partsOrQuestions.find(partOrQuestion => partOrQuestion.glassLocation === answer.glassLocation); const partFromCapabilityQuestionAnswer = (await this.dispatchStoreAction(this.storeActions.GET_PART_FROM_CAPABILITY_QUESTION_ANSWER, answer.glassLocation, false)).data; From 4324f0ee5fba57eb084172290125ba1ed9b5420e Mon Sep 17 00:00:00 2001 From: Adam Caouette Date: Mon, 31 Oct 2022 14:25:13 -0400 Subject: [PATCH 04/21] CSR-803: merge --- src/global-methods.js | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/global-methods.js b/src/global-methods.js index 14e5cca0e..30eeffb65 100644 --- a/src/global-methods.js +++ b/src/global-methods.js @@ -7,6 +7,7 @@ import { GaCategories, GaActions, GaLabels } from "@/constants/analytics"; import { headerKeys } from "@/constants/header-keys"; export default { +<<<<<<< Updated upstream callHttpClient({ method, endpoint, payload, logApiCall = true }) { return new Promise((resolve, reject) => { const cfDistroUrl = applicationConfig.CONSUMER_CF_DISTRO; @@ -14,6 +15,21 @@ export default { const headers = { [headerKeys.EXPERIMENT]: JSON.stringify(store.getters.experimentSettings), }; +======= + callHttpClient({ method, endpoint, payload, logApiCall = true }) { + return new Promise((resolve, reject) => { + let cfDistroUrl = applicationConfig.CONSUMER_CF_DISTRO; + if (endpoint.includes("/order/")) { + cfDistroUrl = "https://localhost:5001"; + } + if (endpoint.includes("/parts/")) { + cfDistroUrl = "https://localhost:5003"; + } + const payloadAndAnalyticsData = Object.assign({}, payload, { AppName: "FixMyGlass" }); + const headers = { + [headerKeys.EXPERIMENT]: JSON.stringify(store.getters.experimentSettings) + } +>>>>>>> Stashed changes axios({ method: method, From 3399ab735d8f661a26bbaf635a7cf1fbfb8d6865 Mon Sep 17 00:00:00 2001 From: Bryan Mauger Date: Thu, 3 Nov 2022 14:35:17 -0400 Subject: [PATCH 05/21] CSR-920 replace generic button with button-main. --- src/common-components/modal/modal.vue | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/src/common-components/modal/modal.vue b/src/common-components/modal/modal.vue index 12055ed05..35c3fb9dc 100644 --- a/src/common-components/modal/modal.vue +++ b/src/common-components/modal/modal.vue @@ -22,10 +22,13 @@

@@ -33,6 +36,8 @@ @@ -104,7 +112,6 @@ export default { box-shadow: 0px -1px 0px rgba(179, 180, 181, 0.3); button { margin: 0; - height: 3rem; } } } From 4a6ed04c1eb31b175957e5003a67516696bbd97b Mon Sep 17 00:00:00 2001 From: Bryan Mauger Date: Thu, 3 Nov 2022 15:01:43 -0400 Subject: [PATCH 06/21] Remove unneeded ref --- src/common-components/modal/modal.vue | 1 - 1 file changed, 1 deletion(-) diff --git a/src/common-components/modal/modal.vue b/src/common-components/modal/modal.vue index 35c3fb9dc..5bcc22c28 100644 --- a/src/common-components/modal/modal.vue +++ b/src/common-components/modal/modal.vue @@ -23,7 +23,6 @@
From e78c9ee94fe4d5ba00cd256c73e8228f45de454b Mon Sep 17 00:00:00 2001 From: Bryan Mauger Date: Tue, 8 Nov 2022 14:18:16 -0500 Subject: [PATCH 18/21] Update copy for transition animation. --- src/common-components/loading-modal/loading-modal.vue | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/common-components/loading-modal/loading-modal.vue b/src/common-components/loading-modal/loading-modal.vue index 8e4d1d994..9622435cf 100644 --- a/src/common-components/loading-modal/loading-modal.vue +++ b/src/common-components/loading-modal/loading-modal.vue @@ -13,19 +13,19 @@

- Assessing your damage + Finding shops near you . . .

- Finding your glass + Looking for dates . . .

- Generating your quote + Searching for times . . . From 53810f8c9d2e4d3613b96a37734571b63e0ee88f Mon Sep 17 00:00:00 2001 From: Bryan Mauger Date: Wed, 9 Nov 2022 08:52:39 -0500 Subject: [PATCH 19/21] Add rounded corners and search icon for testing only. Remove includeSearchIcon, questionAlignment, placeholderText after testing. --- src/layouts/vin-lookup/vin-lookup.vue | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/layouts/vin-lookup/vin-lookup.vue b/src/layouts/vin-lookup/vin-lookup.vue index 429075a40..286ac7909 100644 --- a/src/layouts/vin-lookup/vin-lookup.vue +++ b/src/layouts/vin-lookup/vin-lookup.vue @@ -10,7 +10,11 @@

+ Date: Wed, 9 Nov 2022 10:00:23 -0500 Subject: [PATCH 20/21] Format code. --- src/layouts/vin-lookup/vin-lookup.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/layouts/vin-lookup/vin-lookup.vue b/src/layouts/vin-lookup/vin-lookup.vue index 286ac7909..e4e34f131 100644 --- a/src/layouts/vin-lookup/vin-lookup.vue +++ b/src/layouts/vin-lookup/vin-lookup.vue @@ -10,7 +10,7 @@
- + Date: Wed, 9 Nov 2022 14:58:22 -0500 Subject: [PATCH 21/21] CSR-803: PR refactoring --- .../question-chain/question-chain.vue | 6 +-- .../questions-page-layout.vue} | 6 +-- .../capability-questions.vue | 34 +++++++--------- .../molding-questions/molding-questions.vue | 34 +++++++--------- src/layouts/part-questions/part-questions.vue | 40 +++++++++---------- src/mixins/vehicle-questions-mixin.js | 36 ++++++++--------- src/mixins/vehicle-questions-mixin.spec.js | 4 +- 7 files changed, 75 insertions(+), 85 deletions(-) rename src/common-components/{questions-page/questions-page.vue => questions-page-layout/questions-page-layout.vue} (95%) diff --git a/src/common-components/question-chain/question-chain.vue b/src/common-components/question-chain/question-chain.vue index 3f77a87be..432fd2eca 100644 --- a/src/common-components/question-chain/question-chain.vue +++ b/src/common-components/question-chain/question-chain.vue @@ -7,7 +7,7 @@ :class="q.questionSequence === currentQuestionNum && 'current-question'" :questionText="q.questionText" :answers="q.answers" - :groupName="`question-${glassPieceIndex}-${q.questionSequence}`" + :groupName="`question-${index}-${q.questionSequence}`" :modelValue="q.answerSelected" @update:modelValue="handleAnswer(q, $event)" isRequired @@ -32,7 +32,7 @@ export default { questionData: Object, validationRules: String, modelValue: Object, - glassPieceIndex: Number, + index: Number, answerKey: String, }, async created() { @@ -155,7 +155,7 @@ export default { return { answerResult: questionAnswer, answeredQuestions: answeredQuestions, - index: this.glassPieceIndex, + index: this.index, }; } }, diff --git a/src/common-components/questions-page/questions-page.vue b/src/common-components/questions-page-layout/questions-page-layout.vue similarity index 95% rename from src/common-components/questions-page/questions-page.vue rename to src/common-components/questions-page-layout/questions-page-layout.vue index de58727f6..85ccd33ad 100644 --- a/src/common-components/questions-page/questions-page.vue +++ b/src/common-components/questions-page-layout/questions-page-layout.vue @@ -18,7 +18,7 @@ ref="questionChain" v-model="selectedAnswers[questionsDatum.answerKey]" :questionData="questionsDatum.questions" - :glassPieceIndex="i" + :index="i" v-if="showThisQuestionChain(questionsDatum, i)" :answerKey="questionsDatum.answerKey" :validationRules="validationRules" /> @@ -52,7 +52,7 @@ export default { questionsData: Array, validationRules: String, modelValue: Array, - currentGlassPieceIndex: Number, + index: Number, }, computed: { selectedAnswers: { @@ -69,7 +69,7 @@ export default { if (!glass.questions || glass.questions?.length < 1 || glass.isSuppressedPart) { return false; } // return false if no questions or if suppressed - return this.currentGlassPieceIndex === i || glass.answerData?.answerResult?.length > 0; + return this.index === i || glass.answerData?.answerResult?.length > 0; }, handleForwardButtonAction() { this.$emit("forwardButtonAction"); diff --git a/src/layouts/capability-questions/capability-questions.vue b/src/layouts/capability-questions/capability-questions.vue index 2f6fa4f74..67b95a707 100644 --- a/src/layouts/capability-questions/capability-questions.vue +++ b/src/layouts/capability-questions/capability-questions.vue @@ -1,7 +1,7 @@ diff --git a/src/layouts/molding-questions/molding-questions.vue b/src/layouts/molding-questions/molding-questions.vue index d0b7c93c4..cfae7af71 100644 --- a/src/layouts/molding-questions/molding-questions.vue +++ b/src/layouts/molding-questions/molding-questions.vue @@ -1,7 +1,7 @@ diff --git a/src/layouts/part-questions/part-questions.vue b/src/layouts/part-questions/part-questions.vue index 6be2e8028..9d1b54c66 100644 --- a/src/layouts/part-questions/part-questions.vue +++ b/src/layouts/part-questions/part-questions.vue @@ -1,7 +1,7 @@ diff --git a/src/mixins/vehicle-questions-mixin.js b/src/mixins/vehicle-questions-mixin.js index f54b462ee..a50a85755 100644 --- a/src/mixins/vehicle-questions-mixin.js +++ b/src/mixins/vehicle-questions-mixin.js @@ -66,7 +66,7 @@ export default { currentPageComesAfterPage(currentPage = this.$route.query.fmgPage, fmgPage) { return this.comparePageIndices(currentPage, fmgPage) > 0; }, - setupInitialData(glass, i, alreadyAnsweredQuestions, vm) { + setupInitialData(glass, index, alreadyAnsweredQuestions, vm) { const self = vm ?? this; // clear answerData if no questions are already answered @@ -124,8 +124,8 @@ export default { } }); - // advance the currentGlassPieceIndex - self.currentGlassPieceIndex = i; + // advance the currentGlassIndex + self.currentGlassIndex = index; const answerResult = answeredGlass.partNum ? answeredGlass.partNum @@ -182,9 +182,9 @@ export default { // HANDLE DUPLICATE QUESTIONS - // loop through all glass pieces data - self.questionsData.forEach((glassPiece, pieceIndex) => { - /* glassPiece example format: + // loop through all glass data + self.questionsData.forEach((glass, glassIndex) => { + /* glass example format: { "glassName": "Single", "glassLocation": "Windshield", @@ -213,14 +213,14 @@ export default { */ // limit duplicate search to glass pieces that follow after the currently being answered glass piece - if (pieceIndex > answer.index) { + if (glassIndex > answer.index) { let indexToSuppressTo; // reset this glass piece, in case user is changing their previous answers - glassPiece.answerData = null; - glassPiece.isSuppressedPart = null; + glass.answerData = null; + glass.isSuppressedPart = null; // loop through this glass piece's questions, looking for a questionText match - glassPiece.questions.forEach((question, questionIndex) => { + glass.questions.forEach((question, questionIndex) => { // clear out any previously set answers question.answerSelected = null; @@ -248,7 +248,7 @@ export default { // handle duplicate's nextQuestion logic on other related questions if (matchedAnswer.nextQuestionSequence) { // clear any suppression on the nextQuestion - glassPiece.questions[ + glass.questions[ matchedAnswer.nextQuestionSequence - 1 ].suppressThisQuestion = null; // if the duplicate is 1ST question in array, set indexToSuppressTo @@ -263,7 +263,7 @@ export default { } // update answers in this glass piece's questions with duplication logic modifications - glassPiece.questions.forEach((q) => { + glass.questions.forEach((q) => { q.answers.forEach((a) => { // revert any previously set nextQuestion logic modifications if ( @@ -305,7 +305,7 @@ export default { question.suppressThisQuestion = true; // are there any questions left that are not suppressed? - const remainingQuestions = glassPiece.questions.filter((q) => { + const remainingQuestions = glass.questions.filter((q) => { return !q.suppressThisQuestion; }); @@ -320,7 +320,7 @@ export default { suppressThisQuestion: question.suppressThisQuestion, }; // set the answerData (used as indicator that it has been already answered) - glassPiece.answerData = { + glass.answerData = { answerResult: matchedAnswer.nextQuestionSequence ? matchedAnswer.nextQuestionSequence : matchedAnswer.answerResult, @@ -328,14 +328,14 @@ export default { }; // suppress this glass piece because it has an answer - glassPiece.isSuppressedPart = true; + glass.isSuppressedPart = true; } } }); // Update key to force re-render of glass piece with duplicate question in case user changes previous related answer in the chain - self.questionsData[pieceIndex].key = - self.questionsData[pieceIndex].key + Date.now().toString(); + self.questionsData[glassIndex].key = + self.questionsData[glassIndex].key + Date.now().toString(); } }); }); @@ -350,7 +350,7 @@ export default { for (let i = answer.index + 1; i < this.questionsData.length; i++) { // if this part has not yet been fully answered, then make it the current part if (!this.questionsData[i].answerData?.answerResult) { - this.currentGlassPieceIndex = i; + this.currentGlassIndex = i; break; } } diff --git a/src/mixins/vehicle-questions-mixin.spec.js b/src/mixins/vehicle-questions-mixin.spec.js index 6fb8f33d8..873614fc4 100644 --- a/src/mixins/vehicle-questions-mixin.spec.js +++ b/src/mixins/vehicle-questions-mixin.spec.js @@ -664,10 +664,10 @@ describe("vehicle-questions-mixin", () => { // Act wrapper.vm.handleAnswerUpdates(answerNo, "", wrapper.vm); - const glassPieceWithDuplicate = wrapper.vm.questionsData[1]; + const glassWithDuplicate = wrapper.vm.questionsData[1]; // Assert - expect(glassPieceWithDuplicate.key).not.toBe("testkey2"); + expect(glassWithDuplicate.key).not.toBe("testkey2"); }); test("then that question should be supressed", () => {