22
22
<div class =" signup-form" >
23
23
24
24
<div class =" name-fields" >
25
+ <div class =" field-wrapper" >
26
+ <input
27
+ :class =" ['first-name form-field', { error: fieldError.firstName }]"
28
+ type =" text"
29
+ :placeholder =" firstNameField.placeholder"
30
+ required =" true"
31
+ @input =" updateInputValue($event.target.value, 'firstName')" />
32
+ <span v-if =" fieldError.firstName" class =" error-message" v-html =" errorMessage" />
33
+ </div >
34
+
35
+ <div class =" field-wrapper" >
36
+ <input
37
+ :class =" ['last-name form-field', { error: fieldError.lastName }]"
38
+ type =" text"
39
+ :placeholder =" lastNameField.placeholder"
40
+ required =" true"
41
+ @input =" updateInputValue($event.target.value, 'lastName')" />
42
+ <span v-if =" fieldError.lastName" class =" error-message" v-html =" errorMessage" />
43
+ </div >
44
+ </div >
45
+
46
+ <div class =" field-wrapper" >
25
47
<input
26
- class =" first-name form-field"
27
- type =" text "
28
- :placeholder =" firstNameField .placeholder"
48
+ : class =" ['email form-field', { error: fieldError.email }] "
49
+ type =" email "
50
+ :placeholder =" emailField .placeholder"
29
51
required =" true"
30
- @input =" updateInputValue($event.target.value, 'firstName')" />
52
+ @input =" updateInputValue($event.target.value, 'email')" />
53
+ <span v-if =" fieldError.email" class =" error-message" v-html =" errorMessage" />
54
+ </div >
55
+
56
+ <div class =" field-wrapper" >
31
57
<input
32
- class =" last-name form-field"
58
+ :class =" ['org form-field', { error: fieldError.organization }]"
59
+ :placeholder =" orgField.placeholder"
33
60
type =" text"
34
- :placeholder =" lastNameField.placeholder"
35
61
required =" true"
36
- @input =" updateInputValue($event.target.value, 'lastName')" />
62
+ @input =" updateInputValue($event.target.value, 'org')" />
63
+ <span v-if =" fieldError.organization" class =" error-message" v-html =" errorMessage" />
37
64
</div >
38
65
39
- <input
40
- class =" email form-field"
41
- type =" email"
42
- :placeholder =" emailField.placeholder"
43
- required =" true"
44
- @input =" updateInputValue($event.target.value, 'email')" />
45
-
46
-
47
- <input
48
- class =" org form-field"
49
- :placeholder =" orgField.placeholder"
50
- type =" text"
51
- required =" true"
52
- @input =" updateInputValue($event.target.value, 'org')" />
53
-
54
-
55
- <ZeroDropdown class =" country form-field" :display-selected =" true" >
66
+ <ZeroDropdown :class =" ['country form-field', { error: fieldError.country }]" :display-selected =" true" >
56
67
<template #toggle-button =" { togglePanel , selected } " >
57
68
<div class =" toggle-button" @click =" togglePanel" >
58
69
<p v-if =" selected" class =" toggle-button-label" >
76
87
</div >
77
88
</div >
78
89
</template >
90
+ <span v-if =" fieldError.country" class =" error-message" v-html =" errorMessage" />
79
91
</ZeroDropdown >
80
92
81
93
<ZeroDropdown class =" familiarity" :display-selected =" true" >
82
94
<template #toggle-button =" { togglePanel , selected } " >
83
95
<h3 class =" dropdown-label" v-html =" familiarityField.label" />
84
- <div class =" toggle-button form-field" @click =" togglePanel" >
96
+ <div : class =" [' toggle-button form-field', { error: fieldError.filecoinFamiliarity }] " @click =" togglePanel" >
85
97
<p v-if =" selected" class =" toggle-button-label" >
86
98
{{ selected }}
87
99
</p >
103
115
</div >
104
116
</div >
105
117
</template >
118
+ <span v-if =" fieldError.filecoinFamiliarity" class =" error-message" v-html =" errorMessage" />
106
119
</ZeroDropdown >
107
120
108
121
<ZeroButton
@@ -129,6 +142,15 @@ const props = defineProps({
129
142
})
130
143
131
144
// ======================================================================== Data
145
+ const errorMessage = ' [ Field is required ]'
146
+ const fieldError = ref ({
147
+ firstName: false ,
148
+ lastName: false ,
149
+ email: false ,
150
+ organization: false ,
151
+ country: false ,
152
+ filecoinFamiliarity: false
153
+ })
132
154
const firstName = ref (false )
133
155
const lastName = ref (false )
134
156
const email = ref (false )
@@ -202,6 +224,7 @@ const selectOption = (setSelected, closePanel, option, field) => {
202
224
* @method submitForm
203
225
*/
204
226
const submitForm = async () => {
227
+ console .log (' submitForm' )
205
228
if (firstName .value && lastName .value && email .value && organization .value && country .value && filecoinFamiliarity .value ) {
206
229
const body = {
207
230
records: [
@@ -226,6 +249,14 @@ const submitForm = async () => {
226
249
body,
227
250
headers
228
251
})
252
+ } else {
253
+ if (! firstName .value ) { fieldError .value .firstName = true }
254
+ if (! lastName .value ) { fieldError .value .lastName = true }
255
+ if (! email .value ) { fieldError .value .email = true }
256
+ if (! organization .value ) { fieldError .value .organization = true }
257
+ if (! organization .value ) { fieldError .value .organization = true }
258
+ if (! country .value ) { fieldError .value .country = true }
259
+ if (! filecoinFamiliarity .value ) { fieldError .value .filecoinFamiliarity = true }
229
260
}
230
261
}
231
262
</script >
@@ -257,17 +288,75 @@ const submitForm = async () => {
257
288
}
258
289
}
259
290
291
+ // ///////////////////////////////////////////////////////////////// Signup Card
292
+ .title-wrapper {
293
+ display : flex ;
294
+ flex-flow : row no- wrap;
295
+ }
260
296
// //////////////////////////////////////////////////////////////////////// Form
261
297
.form-field {
262
298
border : var (--brand-color ) 1px solid ;
263
299
border-radius : toRem (5 );
264
- & :is (:not(.first-name , .last-name , :last-child )) {
265
- margin-bottom : toRem (24 );
300
+ & :hover ,
301
+ & :focus {
302
+ border-color : var (--secondary-text-color );
303
+ }
304
+ & .error {
305
+ border-color : var (--error );
306
+ }
307
+ }
308
+
309
+ .error-message {
310
+ @include formFieldErrorMessage ;
311
+ color : var (--error );
312
+ }
313
+
314
+ .field-wrapper {
315
+ display : flex ;
316
+ flex-direction : column ;
317
+ align-items : flex-end ;
318
+ flex : 1 ;
319
+ margin-bottom : toRem (24 );
320
+ }
321
+
322
+ .name-fields {
323
+ display : flex ;
324
+ flex-flow : row nowrap ;
325
+ justify-content : space-between ;
326
+ // margin-bottom: toRem(24);
327
+ .field-wrapper :is (:first-child ) {
328
+ margin-right : toRem (20 );
266
329
}
267
330
}
268
331
332
+
333
+ .first-name ,
334
+ .last-name {
335
+ width : 100% ;
336
+ }
337
+
338
+ .first-name ,
339
+ .last-name ,
340
+ .email ,
341
+ .org {
342
+ @include formFieldText ;
343
+ padding : toRem (8 ) toRem (20 );
344
+ & ::placeholder {
345
+ @include formFieldPlaceholder ;
346
+ }
347
+ }
348
+ .email ,
349
+ .org {
350
+ width : 100% ;
351
+ }
352
+
353
+
269
354
.option-label {
270
355
cursor : pointer ;
271
356
}
272
357
358
+ .submit-button {
359
+
360
+ }
361
+
273
362
</style >
0 commit comments