This repository has been archived on 2021-07-29. You can view files and clone it, but cannot push or open issues or pull requests.
find_coach/src/components/coaches/CoachForm.vue

211 lines
4.6 KiB
Vue

<template>
<form @submit.prevent="submitForm">
<div class="form-control" :class="{ invalid: !firstName.isValid }">
<label for="firstname">Firstname</label>
<input
type="text"
id="firstname"
v-model.trim="firstName.val"
@blur="clearValidity('firstName')"
/>
<p v-if="!firstName.isValid">Firstname must not be empty.</p>
</div>
<div class="form-control" :class="{ invalid: !lastName.isValid }">
<label for="lastname">Lastname</label>
<input
type="text"
id="lastname"
v-model.trim="lastName.val"
@blur="clearValidity('lastName')"
/>
<p v-if="!lastName.isValid">Lastname must not be empty.</p>
</div>
<div class="form-control" :class="{ invalid: !description.isValid }">
<label for="description">Description</label>
<textarea
id="description"
rows="5"
v-model.trim="description.val"
@blur="clearValidity('description')"
></textarea>
<p v-if="!description.isValid">Description must not be empty.</p>
</div>
<div class="form-control" :class="{ invalid: !rate.isValid }">
<label for="rate">Hourly Rate</label>
<input
type="number"
id="rate"
v-model.number="rate.val"
@blur="clearValidity('rate')"
/>
<p v-if="!description.isValid">Rate must be greater than 0.</p>
</div>
<div class="form-control" :class="{ invalid: !areas.isValid }">
<h3>Areas of Expertise</h3>
<div>
<input
type="checkbox"
id="backend"
value="backend"
v-model="areas.val"
@blur="clearValidity('areas')"
/>
<label for="backend">Backend Development</label>
</div>
<div>
<input
type="checkbox"
id="frontend"
value="frontend"
v-model="areas.val"
@blur="clearValidity('areas')"
/>
<label for="backend">Frontend Development</label>
</div>
<div>
<input
type="checkbox"
id="career"
value="career"
v-model="areas.val"
@blur="clearValidity('areas')"
/>
<label for="career">Career Advisory</label>
</div>
<p v-if="!areas.isValid">At least one expertise must be selected.</p>
</div>
<div v-if="!formIsValid" class="invalid">
<p>
Please fix the above errors and submit again.
</p>
</div>
<base-button>Register</base-button>
</form>
</template>
<script>
export default {
emits: ['save-data'],
data() {
return {
firstName: {
val: '',
isValid: true
},
lastName: {
val: '',
isValid: true
},
description: {
val: '',
isValid: true
},
rate: {
val: null,
isValid: true
},
areas: {
val: [],
isValid: true
},
formIsValid: true
};
},
methods: {
clearValidity(input) {
this[input].isValid = true;
},
validateForm() {
this.formIsValid = true;
if (this.firstName.val === '') {
this.firstName.isValid = false;
this.formIsValid = false;
}
if (this.lastName.val === '') {
this.lastName.isValid = false;
this.formIsValid = false;
}
if (this.description.val === '') {
this.description.isValid = false;
this.formIsValid = false;
}
if (!this.rate.val || this.rate.val < 0) {
this.rate.isValid = false;
this.formIsValid = false;
}
if (this.areas.val.length === 0) {
this.areas.isValid = false;
this.formIsValid = false;
}
},
submitForm() {
this.validateForm();
if (!this.formIsValid) {
return;
}
const formData = {
first: this.firstName,
last: this.lastName,
desc: this.description,
rate: this.rate,
areas: this.areas
};
this.$emit('save-data', formData);
}
}
};
</script>
<style scoped>
.form-control {
margin: 0.5rem 0;
}
label {
font-weight: bold;
display: block;
margin-bottom: 0.5rem;
}
input[type='checkbox'] + label {
font-weight: normal;
display: inline;
margin: 0 0 0 0.5rem;
}
input,
textarea {
display: block;
width: 100%;
border: 1px solid #ccc;
font: inherit;
}
input:focus,
textarea:focus {
background-color: #f0e6fd;
outline: none;
border-color: #3d008d;
}
input[type='checkbox'] {
display: inline;
width: auto;
border: none;
}
input[type='checkbox']:focus {
outline: #3d008d solid 1px;
}
h3 {
margin: 0.5rem 0;
font-size: 1rem;
}
.invalid p {
color: red;
}
</style>