| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697 |
- import { Survey } from '../entities/index.js'
- import { fetchQuestions } from '../services/index.js'
- import { splash, possible, surveyStages, allSteps } from './lang.js'
-
- class SurveyFactory {
- constructor() {
- this.questionsFromDb = []
- }
- _addResponses(responseKeys, responsesByCategory) {
- const validFormInputs = {}
- // Removes empty form drop down options from possible['usa']
- Object.keys(responsesByCategory).forEach(categoryKey => {
- if (responsesByCategory[categoryKey].length) {
- validFormInputs[categoryKey] = responsesByCategory[categoryKey]
- }
- })
- // Adds form drop down options to each responseKey
- Object.keys(validFormInputs).forEach(inputKey => {
- responseKeys.forEach(responseKey => {
- if (responseKey.survey_stage == inputKey) {
- responseKey.responses = validFormInputs[inputKey]
- }
- })
- })
- return responseKeys
- }
- _addComponents(responseKeys) {
- responseKeys.forEach(responseKey => {
- switch (responseKey.category) {
- case 'input':
- responseKey.component = 'FormInput'
- break
- case 'choice':
- responseKey.component = 'FormDropdown'
- break
- case 'aspect':
- responseKey.component = 'QuestionResponse'
- break
- }
- })
- return responseKeys
- }
- _addSurveySteps(responseKeys, surveyStages) {
- responseKeys.forEach(responseKey => {
- Object.keys(surveyStages).forEach((stage, i) => {
- if (responseKey.response_key_id == stage) {
- responseKey.survey_stage = surveyStages[i + 1]
- }
- })
- })
- return responseKeys
- }
- // TODO: Don't nest the for loop...
- _sortSurveySteps(mutatedResponseKeys, allSteps) {
- const reordered = []
- Object.values(allSteps).forEach(step => {
- Object.values(mutatedResponseKeys).forEach(response => {
- if (surveyStages[response.response_key_id] === step) {
- response.survey_stage = step
- reordered.push(response)
- }
- })
- })
- return reordered
- }
- _setSteps() {
- const responseKeys = this.questionsFromDb
- const responsesByCategory = possible['usa']
- let mutatedResponseKeys = this._addSurveySteps(responseKeys, surveyStages)
- mutatedResponseKeys = this._addResponses(mutatedResponseKeys, responsesByCategory)
- mutatedResponseKeys = this._addComponents(responseKeys)
- mutatedResponseKeys = this._sortSurveySteps(mutatedResponseKeys, allSteps['usa'])
- // Splash page is placed at beginning of survey
- mutatedResponseKeys.unshift(splash)
- return mutatedResponseKeys
- }
- async getQuestions() {
- try {
- this.questionsFromDb = await fetchQuestions()
- return this.questionsFromDb
- } catch (err) {
- console.error(err)
- }
- }
- async createSurvey(roleTree) {
- if (!this.questionsFromDb.length) {
- const res = await this.getQuestions()
- console.warn(
- `Attempted to create a survey before getting questions: retrieved ${res.length} questions`,
- )
- }
- const steps = this._setSteps()
- return new Survey(steps, roleTree)
- }
- }
-
- export { SurveyFactory }
|