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.

SurveyView.vue 7.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230
  1. <template lang="pug">
  2. main.view--survey.f-col.start.w-full
  3. header.w-full.f-col
  4. Transition(name="slide-up" :duration="1600")
  5. h3(v-if="step == 0") hello, what shall i call you?
  6. span(v-for="letter in name" class="fade") {{ letter }}
  7. h3(v-else-if="step == 1") What can i help you with,
  8. span {{ name }}?
  9. br
  10. span I am seeking a
  11. span(v-if="!seeking") ___________.
  12. span(v-else class="fade") {{ seeking }}.
  13. h3(v-else-if="step == 2") Looking for a {{ seeking }} then.
  14. span You're in the right place.
  15. br
  16. span How would you like to use siimee?
  17. br
  18. span I am
  19. span(v-if="!urgency") ___________.
  20. span(v-else class="fade") {{ urgency }}.
  21. h3(v-else-if="[3, 4, 5, 6].includes(step)")
  22. span I am a
  23. span(v-if="!role && !experience" class="fade") _________ _________
  24. span(v-else-if="role && !experience" class="fade") _________ {{ role }}
  25. span(v-else-if="!role && experience" class="fade") {{ experience }} _________
  26. span(v-else class="fade") {{ experience }} {{ role }}
  27. span .&nbsp;
  28. br
  29. span Looking for a&nbsp;
  30. span(v-if="!distance && !duration" class="fade") ________ ________&nbsp;
  31. span(v-else-if="!distance && duration" class="fade") {{ duration }} ________&nbsp;
  32. span(v-else-if="distance && !duration" class="fade") _________ {{ distance }}&nbsp;
  33. span(v-else class="fade") {{ duration }} {{ distance }}&nbsp;
  34. span role.
  35. h3(v-else)
  36. p My name is {{ name }}.
  37. span(v-if="pronouns") My pronouns are {{ pronouns }}.
  38. p I am&nbsp;
  39. span a {{ experience }}
  40. span {{ role }}
  41. p Looking for a {{ duration }},&nbsp;
  42. span {{ distance }}&nbsp;
  43. span {{ seeking }}.
  44. p I am proficient in
  45. span(v-for="(lang, i) in language") {{ lang }} &nbsp;
  46. span(v-if="i > 1") ,
  47. article.match.w-full
  48. ul.w-full
  49. template(v-for="(q, i) in profileQuestions" :key="q.response_key_prompt")
  50. li(v-if="step == i").f-col
  51. p step: {{ i }}
  52. component(
  53. v-if="componentMap[q.response_key_prompt]"
  54. :is="componentMap[q.response_key_prompt]"
  55. :opts="q.responses"
  56. :prompt="q.response_key_prompt"
  57. @selected="onButtonSelect"
  58. @hovered="onInputChange"
  59. @input="onInputChange"
  60. )
  61. div(v-else-if="step >= priorityQuestions.length")
  62. button(@click="step = 0") save
  63. footer.f-row
  64. button(@click="back(q.response_key_prompt)").w-full back
  65. //- SurveyForm(v-if="validSurvey && validSurvey.steps" :form="validSurvey.steps" :pid="pid")
  66. MainNav(:pid="pid" @show-sidebar="$emit('show-sidebar')")
  67. </template>
  68. <script>
  69. import { checkLoginStatus } from '../router/guards'
  70. import { surveyFactory } from '../utils'
  71. import { allSteps, possible, stepToComponentMap } from '../utils/lang'
  72. import SurveyForm from '../components/form.vue'
  73. import ButtonMulti from '../components/form/button-multi.vue'
  74. import ButtonChoice from '../components/form/button-choice.vue'
  75. import InputString from '../components/form/input-string.vue'
  76. export default {
  77. components: { SurveyForm, ButtonMulti, ButtonChoice, InputString },
  78. props: {
  79. pid: {
  80. type: Number,
  81. required: true,
  82. },
  83. },
  84. data() {
  85. return {
  86. validSurvey: null,
  87. componentMap: stepToComponentMap,
  88. step: 0,
  89. name: '',
  90. seeking: '',
  91. urgency: '',
  92. role: '',
  93. duration: '',
  94. distance: '',
  95. experience: '',
  96. position: '',
  97. language: '',
  98. pronouns: '',
  99. zipcode: '',
  100. }
  101. },
  102. computed: {
  103. profileQuestions() {
  104. if (!this.validSurvey) return []
  105. return this.validSurvey.steps.filter(
  106. step => step.response_key_category == 'profile',
  107. )
  108. },
  109. priorityQuestions() {
  110. if (!this.validSurvey) return []
  111. return this.validSurvey.steps.filter(
  112. step => step.response_key_category != 'profile',
  113. )
  114. },
  115. },
  116. async created() {
  117. /**
  118. * Before this ever gets called, surveyFactory.questions
  119. * must be set by App.created()
  120. */
  121. this.validSurvey = await surveyFactory.createSurvey(
  122. allSteps['usa'],
  123. possible['usa']['roles'],
  124. )
  125. },
  126. methods: {
  127. /**
  128. * Set state from promptVal key:value object
  129. * from button-coice or button-multi
  130. */
  131. onButtonSelect(promptVal) {
  132. for (const [prompt, val] of Object.entries(promptVal)) {
  133. this[prompt] = val
  134. if (prompt == 'seeking') {
  135. this.validSurvey.setRoleResponses(val)
  136. }
  137. }
  138. this.step++
  139. },
  140. onInputChange(prompt, val) {
  141. this[prompt] = val
  142. },
  143. back(prompt) {
  144. this[prompt] = ''
  145. this.step--
  146. },
  147. },
  148. }
  149. </script>
  150. <style lang="postcss">
  151. .slide-up
  152. &-leave, &-enter
  153. &-active
  154. transition-delay: 500ms
  155. transition-property: opacity, background-color, font-size, transform, color
  156. transition-timing-function: cubic-bezier(1, 0.3, 0.5, 1)
  157. transition-duration: 300ms
  158. &-enter-from, &-leave-to
  159. opacity: 0
  160. .fade
  161. animation: fadeIn 300ms ease-in
  162. @keyframes fadeIn
  163. 0%
  164. opacity: 0
  165. 50%
  166. opacity: 0.5
  167. 100%
  168. opacity:1
  169. h1
  170. color: white
  171. main
  172. padding: 5vh
  173. display: flex
  174. header
  175. p
  176. color: #666
  177. line-height: 1.3em
  178. color: #ccc
  179. font-style: italic
  180. text-align: left
  181. article
  182. height: 100%
  183. width: 100%
  184. flex-direction: column
  185. ul
  186. height: 100%
  187. list-style: none
  188. button
  189. padding: 1em
  190. p
  191. padding: 1em
  192. color: white
  193. .form
  194. border: 1px solid #fff
  195. width: 100%
  196. header, footer, ul
  197. padding: 1vh
  198. ul
  199. display: flex
  200. /* color: blue */
  201. width: 100%
  202. li
  203. flex-direction: column
  204. border: 0px solid yellow
  205. width: 100%
  206. padding: 0
  207. text-align: left
  208. label
  209. margin-right: 1vh
  210. > h3
  211. text-transform: capitalize
  212. padding: 1vh 0
  213. > div > span
  214. display: block
  215. text-align: center
  216. </style>