Sfoglia il codice sorgente

:recyle: adding transitions | emitting events up for preview

tags/0.0.1
toj 4 anni fa
parent
commit
a90237319a

+ 6
- 3
frontend/src/components/form/button-choice.vue Vedi File

3
     header
3
     header
4
         p selections {{selected}} {{opts}}
4
         p selections {{selected}} {{opts}}
5
     main(:class="{ 'f-row': opts.length > 2, 'f-col': opts.length <= 2 }")
5
     main(:class="{ 'f-row': opts.length > 2, 'f-col': opts.length <= 2 }")
6
-        button(v-for="op in opts" :class="isSelected(op)" @click="selectOption(op)") {{ op }}
6
+        button(v-for="op in opts" :class="isSelected(op)" @mouseover="hoverOption(op)" @click="selectOption(op)") {{ op }}
7
 </template>
7
 </template>
8
 
8
 
9
 <script setup>
9
 <script setup>
10
 import { defineProps, defineEmits, ref } from 'vue'
10
 import { defineProps, defineEmits, ref } from 'vue'
11
 
11
 
12
-const emit = defineEmits(['selected'])
12
+const emit = defineEmits(['selected', 'hovered'])
13
 
13
 
14
 const props = defineProps({
14
 const props = defineProps({
15
     opts: {
15
     opts: {
20
     },
20
     },
21
     prompt: {
21
     prompt: {
22
         required: true,
22
         required: true,
23
-        type: String
23
+        type: String,
24
     },
24
     },
25
 })
25
 })
26
 
26
 
40
     sel[props.prompt] = selected.value[0]
40
     sel[props.prompt] = selected.value[0]
41
     emit('selected', sel)
41
     emit('selected', sel)
42
 }
42
 }
43
+const hoverOption = optionVal => {
44
+    emit('hovered', props.prompt, optionVal)
45
+}
43
 </script>
46
 </script>
44
 
47
 
45
 <style lang="postcss">
48
 <style lang="postcss">

+ 9
- 3
frontend/src/components/form/input-string.vue Vedi File

9
 </template>
9
 </template>
10
 
10
 
11
 <script setup>
11
 <script setup>
12
-import { defineProps, defineEmits, ref } from 'vue'
12
+import { defineProps, defineEmits, ref, watch } from 'vue'
13
 
13
 
14
-const emit = defineEmits(['onButtonSelect'])
14
+const emit = defineEmits(['selected', 'input'])
15
 
15
 
16
 const props = defineProps({
16
 const props = defineProps({
17
     default: {
17
     default: {
26
     },
26
     },
27
     prompt: {
27
     prompt: {
28
         required: true,
28
         required: true,
29
-        type: String
29
+        type: String,
30
     },
30
     },
31
 })
31
 })
32
 
32
 
37
     sel[props.prompt] = input.value
37
     sel[props.prompt] = input.value
38
     emit('selected', sel)
38
     emit('selected', sel)
39
 }
39
 }
40
+watch(
41
+    () => input.value,
42
+    () => {
43
+        emit('input', props.prompt, input.value)
44
+    },
45
+)
40
 </script>
46
 </script>
41
 
47
 
42
 <style lang="postcss">
48
 <style lang="postcss">

+ 101
- 46
frontend/src/views/Survey.vue Vedi File

5
     //- ButtonChoice
5
     //- ButtonChoice
6
     //- InputString
6
     //- InputString
7
     header.w-full.f-col
7
     header.w-full.f-col
8
-        h3(v-if="!name") hello, what shall i call you?
9
-        h3(v-if="step == 1") What can i help you with, 
10
-            span {{ name }}?
11
-            br
12
-            span I am seeking a ___________.
13
-        h3(v-else-if="step == 2") A {{ seeking }} then. You're in the right place.
14
-            span How would you like to use siimee? 
15
-            br
16
-            span I am ________________.
17
-        h3(v-else-if="[3, 4, 5, 6].includes(step)")
18
-            span I am a
19
-            span(v-if="!role && !experience") _________ _________
20
-            span(v-else-if="role && !experience") _________ {{ role }}
21
-            span(v-else-if="!role && experience") {{ experience }} _________
22
-            span(v-else) {{ experience }} {{ role }}
23
-            span .&nbsp;
24
-            br
25
-            span Looking for a&nbsp;
26
-            span(v-if="!distance && !duration") ________ ________&nbsp;
27
-            span(v-else-if="!distance && duration") {{ duration }} ________&nbsp;
28
-            span(v-else-if="distance && !duration") _________ {{ distance }}&nbsp;
29
-            span(v-else) {{ duration }} {{ distance }}&nbsp;
30
-            span role.
31
-        h3(v-else)
32
-            p My name is {{ name }}.
33
-                span(v-if="pronouns") My pronouns are {{ pronouns }}.
34
-            p I am&nbsp;
35
-                span a {{ experience }}
36
-                span {{ role }}
37
-            p Looking for a {{ duration }},&nbsp;
38
-                span {{ distance }}&nbsp;
39
-                span {{ seeking }}.
40
-            p I am proficient in 
41
-                span(v-for="(lang, i) in language") {{ lang }} &nbsp;
42
-                    span(v-if="i > 1") , 
8
+        Transition(name="slide-up" :duration="1600")
9
+            h3(v-if="step == 0") hello, what shall i call you?
10
+                span(v-for="letter in name" class="fade") {{ letter }}
11
+
12
+            h3(v-else-if="step == 1") What can i help you with, 
13
+                span {{ name }}?
14
+                br
15
+                span I am seeking a 
16
+                    span(v-if="!seeking") ___________.
17
+                    span(v-else class="fade") {{ seeking }}.
18
+            
19
+            h3(v-else-if="step == 2") Looking for a {{ seeking }} then. 
20
+                span You're in the right place. 
21
+                br
22
+                span How would you like to use siimee? 
23
+                br
24
+                span I am 
25
+                    span(v-if="!urgency") ___________.
26
+                    span(v-else class="fade") {{ urgency }}.
27
+            
28
+            h3(v-else-if="[3, 4, 5, 6].includes(step)")
29
+                span I am a 
30
+                span(v-if="!role && !experience" class="fade") _________ _________
31
+                span(v-else-if="role && !experience" class="fade") _________ {{ role }}
32
+                span(v-else-if="!role && experience" class="fade") {{ experience }} _________
33
+                span(v-else class="fade") {{ experience }} {{ role }}
34
+                span .&nbsp;
35
+                br
36
+                span Looking for a&nbsp;
37
+                span(v-if="!distance && !duration" class="fade") ________ ________&nbsp;
38
+                span(v-else-if="!distance && duration" class="fade") {{ duration }} ________&nbsp;
39
+                span(v-else-if="distance && !duration" class="fade") _________ {{ distance }}&nbsp;
40
+                span(v-else class="fade") {{ duration }} {{ distance }}&nbsp;
41
+                span role.
42
+        
43
+            h3(v-else)
44
+                p My name is {{ name }}.
45
+                    span(v-if="pronouns") My pronouns are {{ pronouns }}.
46
+                p I am&nbsp;
47
+                    span a {{ experience }}
48
+                    span {{ role }}
49
+                p Looking for a {{ duration }},&nbsp;
50
+                    span {{ distance }}&nbsp;
51
+                    span {{ seeking }}.
52
+                p I am proficient in 
53
+                    span(v-for="(lang, i) in language") {{ lang }} &nbsp;
54
+                        span(v-if="i > 1") , 
43
 
55
 
44
     article.match.w-full
56
     article.match.w-full
45
         ul.w-full
57
         ul.w-full
52
                             :opts="q.responses"
64
                             :opts="q.responses"
53
                             :prompt="q.response_key_prompt"
65
                             :prompt="q.response_key_prompt"
54
                             @selected="onButtonSelect"
66
                             @selected="onButtonSelect"
67
+                            @hovered="onInputChange"
68
+                            @input="onInputChange"
55
                         )
69
                         )
56
                         div(v-else-if="step >= priorityQuestions.length")
70
                         div(v-else-if="step >= priorityQuestions.length")
57
                             button(@click="step = 0") save
71
                             button(@click="step = 0") save
58
                     footer.f-row
72
                     footer.f-row
59
-                        button(@click="step--").w-full back
73
+                        button(@click="back(q.response_key_prompt)").w-full back
60
         //- SurveyForm(v-if="validSurvey && validSurvey.steps" :form="validSurvey.steps" :pid="pid")
74
         //- SurveyForm(v-if="validSurvey && validSurvey.steps" :form="validSurvey.steps" :pid="pid")
61
     MainNav(:pid="pid" @show-sidebar="$emit('show-sidebar')")
75
     MainNav(:pid="pid" @show-sidebar="$emit('show-sidebar')")
62
 </template>
76
 </template>
84
             step: 0,
98
             step: 0,
85
             name: '',
99
             name: '',
86
             seeking: '',
100
             seeking: '',
101
+            urgency: '',
87
             role: '',
102
             role: '',
103
+            duration: '',
104
+            distance: '',
88
             experience: '',
105
             experience: '',
89
             position: '',
106
             position: '',
90
             language: '',
107
             language: '',
91
-            location: '',
108
+            pronouns: '',
92
             zipcode: '',
109
             zipcode: '',
93
         }
110
         }
94
     },
111
     },
95
     computed: {
112
     computed: {
96
         profileQuestions() {
113
         profileQuestions() {
97
-            if(!this.validSurvey) return []
98
-            return this.validSurvey.steps.filter(step => step.response_key_category == 'profile')
114
+            if (!this.validSurvey) return []
115
+            return this.validSurvey.steps.filter(
116
+                step => step.response_key_category == 'profile',
117
+            )
99
         },
118
         },
100
         priorityQuestions() {
119
         priorityQuestions() {
101
-            if(!this.validSurvey) return []
102
-            return this.validSurvey.steps.filter(step => step.response_key_category != 'profile')
103
-        }
120
+            if (!this.validSurvey) return []
121
+            return this.validSurvey.steps.filter(
122
+                step => step.response_key_category != 'profile',
123
+            )
124
+        },
104
     },
125
     },
105
     async created() {
126
     async created() {
106
-        this.validSurvey = await surveyFactory.createSurvey(allSteps['usa'], possible['usa']['roles'])
127
+        this.validSurvey = await surveyFactory.createSurvey(
128
+            allSteps['usa'],
129
+            possible['usa']['roles'],
130
+        )
107
     },
131
     },
108
     methods: {
132
     methods: {
109
         /**
133
         /**
110
          * Set state from promptVal key:value object
134
          * Set state from promptVal key:value object
111
          * from button-coice or button-multi
135
          * from button-coice or button-multi
112
          */
136
          */
113
-        onButtonSelect(promptVal){
137
+        onButtonSelect(promptVal) {
114
             console.log('promptVal :', promptVal)
138
             console.log('promptVal :', promptVal)
115
-            for(const [prompt, val] of Object.entries(promptVal)) {
139
+            for (const [prompt, val] of Object.entries(promptVal)) {
116
                 this[prompt] = val
140
                 this[prompt] = val
117
-                if(prompt == 'seeking') {
141
+                if (prompt == 'seeking') {
118
                     this.validSurvey.setRoleResponses(val)
142
                     this.validSurvey.setRoleResponses(val)
119
                 }
143
                 }
120
             }
144
             }
121
             this.step++
145
             this.step++
122
         },
146
         },
147
+        onInputChange(prompt, val) {
148
+            console.log('prompt :>> ', prompt)
149
+            console.log('val :>> ', val)
150
+            this[prompt] = val
151
+        },
152
+        back(prompt) {
153
+            console.log('prompt :>> ', prompt)
154
+            this[prompt] = ''
155
+            this.step--
156
+        },
123
     },
157
     },
124
 }
158
 }
125
 </script>
159
 </script>
126
 
160
 
127
 <style lang="postcss">
161
 <style lang="postcss">
162
+.slide-up
163
+    &-leave, &-enter
164
+        &-active
165
+            transition-delay: 500ms
166
+            transition-property: opacity, background-color, font-size, transform, color
167
+            transition-timing-function: cubic-bezier(1, 0.3, 0.5, 1)
168
+            transition-duration: 300ms
169
+    &-enter-from, &-leave-to
170
+        opacity: 0
171
+
172
+.fade
173
+    animation: fadeIn 300ms ease-in
174
+
175
+@keyframes fadeIn
176
+    0%
177
+        opacity: 0
178
+    50%
179
+        opacity: 0.5
180
+    100%
181
+        opacity:1
182
+
128
 h1
183
 h1
129
     color: white
184
     color: white
130
 
185
 

Loading…
Annulla
Salva