Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  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. _addSurveyStages(responseKeys, surveyStages) {
  9. responseKeys.forEach((key, i) => {
  10. key.survey_stage = surveyStages[i]
  11. })
  12. return responseKeys
  13. }
  14. _addResponses(responseKeys, responsesByCategory) {
  15. Object.keys(responsesByCategory).forEach(k => {
  16. responseKeys.forEach(key => {
  17. if (key.survey_stage === k) {
  18. key.responses = responsesByCategory[k]
  19. }
  20. })
  21. })
  22. return responseKeys
  23. }
  24. _addComponents(responseKeys) {
  25. responseKeys.forEach(key => {
  26. switch (key.category) {
  27. case 'input':
  28. key.component = 'FormInput'
  29. break
  30. case 'choice':
  31. key.component = 'FormDropdown'
  32. break
  33. case 'aspect':
  34. key.component = 'QuestionResponse'
  35. break
  36. }
  37. })
  38. return responseKeys
  39. }
  40. _sortSurveySteps(mutatedResponseKeys, allSteps) {
  41. const reordered = []
  42. Object.values(allSteps).forEach((step, i) => {
  43. Object.values(mutatedResponseKeys).forEach(val => {
  44. if (val.survey_stage === step) {
  45. reordered[i] = val
  46. }
  47. })
  48. })
  49. return reordered
  50. }
  51. _setSteps() {
  52. const responseKeys = this.questionsFromDb
  53. const responsesByCategory = possible['usa']
  54. let mutatedResponseKeys = this._addSurveyStages(responseKeys, surveyStages)
  55. mutatedResponseKeys = this._addResponses(responseKeys, responsesByCategory)
  56. mutatedResponseKeys = this._addComponents(responseKeys)
  57. mutatedResponseKeys = this._sortSurveySteps(mutatedResponseKeys, allSteps['usa'])
  58. // Splash page is placed at beginning of survey
  59. mutatedResponseKeys.unshift(splash)
  60. return mutatedResponseKeys
  61. }
  62. async getQuestions() {
  63. try {
  64. this.questionsFromDb = await fetchQuestions()
  65. return this.questionsFromDb
  66. } catch (err) {
  67. console.error(err)
  68. }
  69. }
  70. async createSurvey(roleTree) {
  71. if (!this.questionsFromDb.length) {
  72. const res = await this.getQuestions()
  73. console.warn(
  74. `Attempted to create a survey before getting questions: retrieved ${res.length} questions`,
  75. )
  76. }
  77. const steps = this._setSteps()
  78. return new Survey(steps, roleTree)
  79. }
  80. }
  81. export { SurveyFactory }