Skip to content

Commit b6673c8

Browse files
BarryPiccinniarmoj
authored andcommitted
Add getProgressArray && update theme sorting
1 parent 167dab7 commit b6673c8

File tree

7 files changed

+120
-61
lines changed

7 files changed

+120
-61
lines changed

questionnaire/questionnaire-service.js

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ const questionnaireResource = require('./resources/questionnaire-resource');
1313
const createQuestionnaireHelper = require('./questionnaire/questionnaire');
1414
const isQuestionnaireCompatible = require('./utils/isQuestionnaireVersionCompatible');
1515
const createTaskListService = require('./task-list/task-list-service');
16+
const getProgress = require('./utils/getProgressArray');
1617

1718
const defaults = {};
1819
defaults.createQuestionnaireDAL = require('./questionnaire-dal');
@@ -192,16 +193,6 @@ function createQuestionnaireService({
192193
return answerResource;
193194
}
194195

195-
function getProgress(questionnaire) {
196-
const progress = [];
197-
Object.keys(questionnaire.routes.states).forEach(task => {
198-
progress.push(...questionnaire.routes.states[task].progress);
199-
});
200-
201-
// Filter out unwanted states, e.g. "completed", "notApplicable", etc
202-
return progress.filter(sectionId => sectionId.startsWith('p-'));
203-
}
204-
205196
async function getAnswers(questionnaireId) {
206197
const questionnaire = await getQuestionnaire(questionnaireId);
207198
const progress = getProgress(questionnaire);

questionnaire/questionnaire/questionnaire.js

Lines changed: 7 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ defaults.deepClone = require('./utils/deepCloneJsonDerivedObject');
1313
defaults.getJsonExpressionEvaluator = require('./utils/getJsonExpressionEvaluator');
1414
defaults.qExpression = require('q-expressions');
1515
defaults.sortThemedAnswers = require('./utils/sortThemedAnswers');
16+
defaults.getProgressArray = require('../utils/getProgressArray');
1617

1718
function createQuestionnaire({
1819
questionnaireDefinition,
@@ -25,41 +26,17 @@ function createQuestionnaire({
2526
deepClone = defaults.deepClone,
2627
getJsonExpressionEvaluator = defaults.getJsonExpressionEvaluator,
2728
qExpression = defaults.qExpression,
28-
sortThemedAnswers = defaults.sortThemedAnswers
29+
sortThemedAnswers = defaults.sortThemedAnswers,
30+
getProgressArray = defaults.getProgressArray
2931
}) {
3032
function getId() {
3133
return questionnaireDefinition.id;
3234
}
3335

3436
function getProgress() {
35-
if (
36-
questionnaireDefinition.routes?.type &&
37-
questionnaireDefinition.routes.type === 'parallel'
38-
) {
39-
const progress = [];
40-
Object.keys(questionnaireDefinition.routes.states).forEach(task => {
41-
progress.push(...questionnaireDefinition.routes.states[task].progress);
42-
});
43-
44-
// Filter out unwanted states, e.g. "completed", "notApplicable", etc
45-
return progress.filter(sectionId => sectionId.startsWith('p-'));
46-
}
47-
48-
return questionnaireDefinition.progress;
37+
return getProgressArray(questionnaireDefinition);
4938
}
5039

51-
/* function getProgressUntil(sectionId) {
52-
const allProgress = getProgress();
53-
const endIndex = allProgress.indexOf(sectionId);
54-
55-
if (endIndex > -1) {
56-
const progressSubset = allProgress.slice(0, endIndex);
57-
return progressSubset;
58-
}
59-
60-
return allProgress;
61-
} */
62-
6340
function getRoles() {
6441
return questionnaireDefinition?.attributes?.q__roles || {};
6542
}
@@ -69,7 +46,7 @@ function createQuestionnaire({
6946
}
7047

7148
function getOrderedAnswers() {
72-
const progress = getProgress();
49+
const progress = getProgress(questionnaireDefinition);
7350
const answers = getAnswers();
7451
const orderedAnswers = {};
7552

@@ -169,7 +146,7 @@ function createQuestionnaire({
169146
if (fnName === 'summary') {
170147
// TODO: handle multiple summary pages e.g. summarise between last summary and this one
171148
// const progressSubset = getProgressUntil(sectionId);
172-
const progressSubset = getProgress();
149+
const progressSubset = getProgress(questionnaireDefinition);
173150
const summaryOptions = value[1];
174151

175152
// eslint-disable-next-line no-use-before-define
@@ -315,7 +292,7 @@ function createQuestionnaire({
315292
}
316293

317294
function getDataAttributes({
318-
progress = getProgress(),
295+
progress = getProgress(questionnaireDefinition),
319296
dataAttributeTransformer,
320297
includeMetadata = true
321298
} = {}) {

questionnaire/questionnaire/utils/sortThemedAnswers/index.js

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -42,13 +42,9 @@ function sortThemes(themeContent, sortingInstructions) {
4242
return themesWithAnswers;
4343
}
4444
const orderMap = new Map();
45-
let orderIndex = 0;
4645

47-
sortingInstructions.sections.forEach(obj => {
48-
// eslint-disable-next-line no-unused-vars
49-
const [key, ids] = Object.entries(obj)[0];
50-
// eslint-disable-next-line no-plusplus
51-
ids.forEach(id => orderMap.set(id, orderIndex++));
46+
sortingInstructions.sections.forEach((id, index) => {
47+
orderMap.set(id, index);
5248
});
5349

5450
return themesWithAnswers.sort((a, b) => {

questionnaire/questionnaire/utils/sortThemedAnswers/index.test.js

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -275,10 +275,7 @@ describe('sort-themed-answers', () => {
275275
'q-applicant-what-other-names-have-you-used'
276276
]
277277
},
278-
sections: [
279-
{'s-about-application': ['contact-details']},
280-
{s_applicant_details: ['default', 'applicant-details']}
281-
]
278+
sections: ['contact-details', 'default', 'applicant-details']
282279
};
283280
const themedAnswers = [
284281
{

questionnaire/submissions/submissions-service.js

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ const {
1111
} = require('../questionnaire/utils/taskRunner/tasks/generateCaseReference');
1212
const {sendSubmissionMessageToSQS} = require('../questionnaire/utils/taskRunner/tasks/postToSQS');
1313
const sendNotifyMessageToSQS = require('../questionnaire/utils/taskRunner/tasks/postToNotify');
14-
14+
const getProgress = require('../utils/getProgressArray');
1515
const {createAppError} = require('../../middleware/error-handler/createAppError');
1616

1717
function createSubmissionService({
@@ -34,16 +34,6 @@ function createSubmissionService({
3434
ownerId
3535
});
3636

37-
function getProgress(questionnaireDefinition) {
38-
const progress = [];
39-
Object.keys(questionnaireDefinition.routes.states).forEach(task => {
40-
progress.push(...questionnaireDefinition.routes.states[task].progress);
41-
});
42-
43-
// Filter out unwanted states, e.g. "completed", "notApplicable", etc
44-
return progress.filter(sectionId => sectionId.startsWith('p-'));
45-
}
46-
4737
function hasSummaryIdInProgressEntries(questionnaireDefinition) {
4838
// are we currently, or have we been on this questionnaire's summary page?
4939
// we infer a questionnaire is complete if the user has visited the summary page.
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
'use strict';
2+
3+
function getProgress(questionnaireDefinition) {
4+
if (
5+
questionnaireDefinition.routes?.type &&
6+
questionnaireDefinition.routes.type === 'parallel'
7+
) {
8+
const progress = [];
9+
Object.keys(questionnaireDefinition.routes.states).forEach(task => {
10+
progress.push(...questionnaireDefinition.routes.states[task].progress);
11+
});
12+
13+
// Filter out unwanted states, e.g. "completed", "notApplicable", etc
14+
return progress.filter(sectionId => sectionId.startsWith('p-'));
15+
}
16+
17+
return questionnaireDefinition.progress;
18+
}
19+
20+
module.exports = getProgress;
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
'use strict';
2+
3+
const getProgress = require('./index');
4+
5+
const singleTaskTemplate = {
6+
type: 'apply-for-compensation',
7+
version: 'foobar',
8+
sections: {},
9+
routes: {
10+
initial: 'old-routes',
11+
referrer: '',
12+
summary: ['old-routes'],
13+
confirmation: 'old-routes',
14+
states: {}
15+
},
16+
answers: {},
17+
onSubmit: {},
18+
progress: ['old-routes'],
19+
taxonomies: {},
20+
meta: {},
21+
attributes: {}
22+
};
23+
const multiTaskTemplate = {
24+
id: 'foobar',
25+
meta: {},
26+
type: 'apply-for-compensation',
27+
routes: {
28+
id: 'foobar',
29+
type: 'parallel',
30+
states: {
31+
A: {
32+
id: 'A',
33+
states: {
34+
'p-page-one': {}
35+
},
36+
initial: 'p-page-one',
37+
progress: ['p-page-one'],
38+
currentSectionId: 'p-page-one'
39+
},
40+
B: {
41+
id: 'B',
42+
states: {
43+
'p-page-two': {}
44+
},
45+
initial: 'p-page-two',
46+
progress: ['p-page-two'],
47+
currentSectionId: 'p-page-two'
48+
},
49+
C: {
50+
id: 'C',
51+
states: {
52+
'p-page-three': {}
53+
},
54+
initial: 'p-page-three',
55+
progress: ['p-page-three'],
56+
currentSectionId: 'p-page-three'
57+
}
58+
},
59+
summary: ['foobar'],
60+
referrer: 'foobar',
61+
confirmation: 'foobar'
62+
},
63+
answers: {},
64+
version: 'foobar',
65+
sections: {},
66+
attributes: {},
67+
taxonomies: {},
68+
currentSectionId: 'foobar'
69+
};
70+
71+
describe('getProgress', () => {
72+
it('should return a progress array when passed a single-task template', () => {
73+
expect(getProgress(singleTaskTemplate)).toEqual(['old-routes']);
74+
});
75+
76+
it('should return a progress array when passed a multi-task template', () => {
77+
expect(getProgress(multiTaskTemplate)).toEqual([
78+
'p-page-one',
79+
'p-page-two',
80+
'p-page-three'
81+
]);
82+
});
83+
84+
it('should filter states that are not valid page Ids', () => {
85+
multiTaskTemplate.routes.states.C.progress[0] = 'complete';
86+
expect(getProgress(multiTaskTemplate)).toEqual(['p-page-one', 'p-page-two']);
87+
});
88+
});

0 commit comments

Comments
 (0)