You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

survey.js 3.5KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. import { Survey } from '../entities/index.js'
  2. import { fetchQuestions } from '../services/index.js'
  3. import { splash, possible, surveyStages, allSteps } from './lang.js'
  4. class SurveyFactory {
  5. constructor() {
  6. this.questionsFromDb = []
  7. }
  8. _addResponses(responseKeys, responsesByCategory) {
  9. const validFormInputs = {}
  10. // Removes empty form drop down options from possible['usa']
  11. Object.keys(responsesByCategory).forEach(categoryKey => {
  12. if (responsesByCategory[categoryKey].length) {
  13. validFormInputs[categoryKey] = responsesByCategory[categoryKey]
  14. }
  15. })
  16. // Adds form drop down options to each responseKey
  17. Object.keys(validFormInputs).forEach(inputKey => {
  18. responseKeys.forEach(responseKey => {
  19. if (responseKey.survey_stage == inputKey) {
  20. responseKey.responses = validFormInputs[inputKey]
  21. }
  22. })
  23. })
  24. return responseKeys
  25. }
  26. _addComponents(responseKeys) {
  27. responseKeys.forEach(responseKey => {
  28. switch (responseKey.category) {
  29. case 'input':
  30. responseKey.component = 'FormInput'
  31. break
  32. case 'choice':
  33. responseKey.component = 'FormDropdown'
  34. break
  35. case 'aspect':
  36. responseKey.component = 'QuestionResponse'
  37. break
  38. }
  39. })
  40. return responseKeys
  41. }
  42. _addSurveySteps(responseKeys, surveyStages) {
  43. responseKeys.forEach(responseKey => {
  44. Object.keys(surveyStages).forEach((stage, i) => {
  45. if (responseKey.response_key_id == stage) {
  46. responseKey.survey_stage = surveyStages[i + 1]
  47. }
  48. })
  49. })
  50. return responseKeys
  51. }
  52. // TODO: Don't nest the for loop...
  53. _sortSurveySteps(mutatedResponseKeys, allSteps) {
  54. const reordered = []
  55. Object.values(allSteps).forEach(step => {
  56. Object.values(mutatedResponseKeys).forEach(response => {
  57. if (surveyStages[response.response_key_id] === step) {
  58. response.survey_stage = step
  59. reordered.push(response)
  60. }
  61. })
  62. })
  63. return reordered
  64. }
  65. _setSteps() {
  66. const responseKeys = this.questionsFromDb
  67. const responsesByCategory = possible['usa']
  68. let mutatedResponseKeys = this._addSurveySteps(responseKeys, surveyStages)
  69. mutatedResponseKeys = this._addResponses(mutatedResponseKeys, responsesByCategory)
  70. mutatedResponseKeys = this._addComponents(responseKeys)
  71. mutatedResponseKeys = this._sortSurveySteps(mutatedResponseKeys, allSteps['usa'])
  72. // Splash page is placed at beginning of survey
  73. mutatedResponseKeys.unshift(splash)
  74. return mutatedResponseKeys
  75. }
  76. async getQuestions() {
  77. try {
  78. this.questionsFromDb = await fetchQuestions()
  79. return this.questionsFromDb
  80. } catch (err) {
  81. console.error(err)
  82. }
  83. }
  84. async createSurvey(roleTree) {
  85. if (!this.questionsFromDb.length) {
  86. const res = await this.getQuestions()
  87. console.warn(
  88. `Attempted to create a survey before getting questions: retrieved ${res.length} questions`,
  89. )
  90. }
  91. const steps = this._setSteps()
  92. return new Survey(steps, roleTree)
  93. }
  94. }
  95. export { SurveyFactory }