diff --git a/src/components/AddNewItem.vue b/src/components/AddNewItem.vue new file mode 100644 index 0000000000000000000000000000000000000000..d2c6c64e342152308483a829e02c4cf0555b4297 --- /dev/null +++ b/src/components/AddNewItem.vue @@ -0,0 +1,152 @@ +<template> + <v-form ref="form" v-model="valid" lazy-validation> + <v-col align="center" justify="space-around"> + <p class="text-h5 ma-5">Utleie</p> + </v-col> + + <v-container fluid> + <p>Leie</p> + <v-radio-group + v-model="radios" + :rules="[(v) => !!v || 'Velg en utleietype']" + required + > + <v-radio label="Dags" value="rentForDays" v-model="radios"></v-radio> + <v-radio label="Time" value="rentForHours" v-model="radios"></v-radio> + <v-radio label="Begge" value="rentBothTypes" v-model="radios"></v-radio> + </v-radio-group> + + <v-text-field + v-model="item.title" + :rules="titleRules" + label="Overskrift" + required + ></v-text-field> + + <v-select + v-model="select" + :items="items" + label="Category" + :rules="[(v) => !!v || 'Kategori må velges']" + required + ></v-select> + + <v-textarea + v-model="item.description" + :rules="descriptionRules" + label="Beskrivelse" + ></v-textarea> + + <v-text-field + v-model="item.price" + :rules="priceRules" + label="Pris" + type="number" + required + ></v-text-field> + + <v-col class="mb-5"> + <p>Bilder</p> + </v-col> + + <input + type="file" + ref="file" + style="display: none" + @change="previewFiles" + multiple + /> + + <v-btn @click="$refs.file.click()">Nytt bilde</v-btn> + + <v-img + v-for="image in item.images" + :key="image" + :src="image" + width="40%" + height="100px" + class="ma-2" + > + </v-img> + </v-container> + + <v-col align="center" justify="space-around"> + <v-btn class="mr-4" @click="saveClicked"> Lagre </v-btn> + </v-col> + </v-form> +</template> + +<script> +export default { + name: "AddNewItem.vue", + + data() { + return { + valid: true, + item: { + title: "", + description: "", + price: "", + category: "", + type: "", + images: [], + }, + select: null, + items: ["Hage", "Kjøkken", "Musikk", "Annet"], + radios: null, + + titleRules: [ + (v) => !!v || "Overskrift mangler", + (v) => + (v && v.length <= 32) || "Overskrift må være mindre enn 32 bokstaver", + ], + descriptionRules: [ + (v) => !!v || "Beskrivelse mangler", + (v) => + (v && v.length <= 50) || + "Beskrivelse kan ikke vøre større enn 200 tegn", + ], + priceRules: [ + (v) => + !!v || + "Pris mangler, skriv inn 0 hvis produktet skal leies ut gratis", + (v) => + (v && v <= 50000) || "Du kan ikke leie ut noe for mer enn 10,000 kr", + ], + selectRules: [(v) => !!v || "Ingen kategori valgt"], + }; + }, + methods: { + async saveClicked() { + console.log("Attempting to save item"); + + await this.$refs.form.validate().then( + function (response) { + this.valid = response.valid; + console.log("valid " + this.valid); + }.bind(this) + ); + + if (this.valid === false) { + console.log("Alle felt er ikke valid"); + this.valid = true; + return; + } + console.log("videre"); + + console.log("Type leie: " + this.item.radios); + console.log("Tittel: " + this.item.title); + console.log("Kategori: " + this.select); + console.log("Beskrivelse: " + this.item.description); + console.log("Pris: " + this.item.price); + console.log("bilder: " + this.item.images); + }, + addNewImage: function () {}, + previewFiles: function (event) { + console.log(event.target.files); + //this.item.images.push(event.target.files[0]); + this.item.images.push(URL.createObjectURL(event.target.files[0])); + }, + }, +}; +</script> diff --git a/src/components/ItemCard.vue b/src/components/ItemCard.vue index 59aaf0f74874d33c0e92e7c7bfc25d22accee15f..e6609623991210c05b55e0d4dc08f471ad1f12fe 100644 --- a/src/components/ItemCard.vue +++ b/src/components/ItemCard.vue @@ -17,7 +17,6 @@ <script> export default { - name: "ItemCard.vue", data() { return { item: { diff --git a/src/components/LoginForm.vue b/src/components/LoginForm.vue index 81dc56efeafd0698560b5644aa32a7e240855af2..2c66de7f90eaca49c83d8f5e6bd357eef5c742ac 100644 --- a/src/components/LoginForm.vue +++ b/src/components/LoginForm.vue @@ -1,80 +1,123 @@ <template> - <div> - <v-col + <!--<div> + <v-col align="center" justify="space-around"> + <v-img + max-width="45%" + :src="require('../assets/logo3.svg')" align="center" - justify="space-around" - > - <v-img - max-width="45%" - :src="require('../assets/logo3.svg')" - align="center" - ></v-img> - </v-col> + ></v-img> + </v-col> - <v-form - ref="form" - v-model="valid" - lazy-validation - > + <v-form ref="form" v-model="valid" lazy-validation> <v-col> <v-text-field - v-model="user.email" - :rules="emailRules" - label="E-mail" - required + v-model="user.email" + :rules="emailRules" + label="E-mail" + required ></v-text-field> </v-col> - - <v-col - align="right" - > + <v-col align="right"> <v-text-field - v-model="user.password" - :append-icon="showPassword ? 'mdi-eye' : 'mdi-eye-off'" - :rules="[rules.required, rules.min]" - :type="showPassword ? 'text' : 'password'" - name="input-10-1" - label="Password" - counter - @click:append="showPassword = !showPassword" + v-model="user.password" + :append-icon="showPassword ? 'mdi-eye' : 'mdi-eye-off'" + :rules="[rules.required, rules.min]" + :type="showPassword ? 'text' : 'password'" + name="input-10-1" + label="Password" + counter + @click:append="showPassword = !showPassword" ></v-text-field> - <div class="text-decoration-underline mt-n4 mr-10"> - Glemt passord - </div> + <div class="text-decoration-underline mt-n4 mr-10">Glemt passord</div> </v-col> - - - <v-col - align="center" - justify="space-around" - > + <v-col align="center" justify="space-around"> <v-btn - :disabled="!valid" - color="success" - class="mb-4 mt-4" - width="50%" - height="40px" - @click="loginClicked" + :disabled="!valid" + color="success" + class="mb-4 mt-4" + width="50%" + height="40px" + @click="loginClicked" > Logg inn </v-btn> <div> - <a - href="/" - class="text-decoration-none" - >Ny bruker</a> + <a href="/" class="text-decoration-none">Ny bruker</a> </div> </v-col> + </v-form> + </div>--> + + <div class="m-6" :class="{ error: v$.user.email.$errors.length }"> + <div class="mb-6"> + <label + for="email" + class="block mb-2 text-sm font-medium text-gray-900 dark:text-gray-300" + >E-post</label + > + <input + type="email" + id="email" + class="bg-gray-50 border border-gray-300 text-gray-900 text-sm rounded-lg focus:ring-blue-500 focus:border-blue-500 block w-full p-2.5 dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 dark:text-white dark:focus:ring-blue-500 dark:focus:border-blue-500" + placeholder="eksempel@eksempel.com" + v-model="v$.user.email.$model" + required + /> + + <!-- error message --> + <div + v-for="(error, index) of v$.user.email.$errors" + :key="index" + > + <div class="text-red-600 text-sm" v-show="showError" id="emailErrorId"> + {{ error.$message }} + </div> + </div> + </div> + <div class="mb-6" :class="{ error: v$.user.password.$errors.length }"> + <label + for="password" + class="block mb-2 text-sm font-medium text-gray-900 dark:text-gray-300" + >Passord</label + > + <input + type="password" + id="password" + class="bg-gray-50 border border-gray-300 text-gray-900 text-sm rounded-lg focus:ring-blue-500 focus:border-blue-500 block w-full p-2.5 dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 dark:text-white dark:focus:ring-blue-500 dark:focus:border-blue-500" + v-model="v$.user.password.$model" + required + /> + + <!-- error message --> + <div + class="text-red" + v-for="(error, index) of v$.user.password.$errors" + :key="index" + > + <div class="text-red-600 text-sm" v-show="showError" id="passwordErrorId"> + {{ error.$message }} + </div> + </div> + <div class="align-items: flex-end; mb-6"> + <div class="ml-3 text-sm"> + <a href="/" class="text-blue-600">Glemt passord</a> + </div> + </div> + </div> - - </v-form> + <button + @click="loginClicked" + class="text-white bg-blue-700 hover:bg-blue-800 focus:ring-4 focus:outline-none focus:ring-blue-300 font-medium rounded-lg text-sm w-full sm:w-auto px-5 py-2.5 text-center dark:bg-blue-600 dark:hover:bg-blue-700 dark:focus:ring-blue-800" + :disabled="notValid" + > + Logg inn + </button> </div> - </template> <script> @@ -121,14 +164,15 @@ export default { }, showPassword: false, - valid : true, + valid: true, + showError: false, emailRules: [ - v => !!v || 'E-mail is required', - v => /.+@.+\..+/.test(v) || 'E-mail must be valid', + (v) => !!v || "E-mail is required", + (v) => /.+@.+\..+/.test(v) || "E-mail must be valid", ], rules: { - required: value => !!value || 'Required.', - min: v => v.length >= 8 || 'Min 8 characters', + required: (value) => !!value || "Required.", + min: (v) => v.length >= 8 || "Min 8 characters", }, }; }, @@ -145,7 +189,7 @@ export default { if (loginResponse === "Failed login") { this.message = "kunne ikke logge inn"; - this.$store.commit('logout'); + this.$store.commit("logout"); return; } @@ -153,9 +197,8 @@ export default { console.log(loginResponse); }, - - validate () { - this.$refs.form.validate() + validate() { + this.$refs.form.validate(); }, }, }; diff --git a/src/router/index.js b/src/router/index.js index 60092e1c5e803da4eabd0b318bfc3eb2460e25c9..6529bc29c9b04e5b87ec1a10fa05b5838410a221 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -2,7 +2,6 @@ import { createRouter, createWebHistory } from "vue-router"; import HomeView from "../views/HomeView.vue"; import LoginView from "../views/LoginView.vue"; - const routes = [ { path: "/endre", //Endre før push @@ -22,7 +21,17 @@ const routes = [ path: "/login", name: "login", component: LoginView, - } + }, + { + path: "/addNewItem", + name: "addNewItem", + component: () => import("../views/AddNewItemView.vue"), + }, + { + path: "/itemCard", + name: "itemCard", + component: () => import("../views/ItemCardView.vue"), + }, ]; const router = createRouter({ diff --git a/src/views/AddNewItemView.vue b/src/views/AddNewItemView.vue new file mode 100644 index 0000000000000000000000000000000000000000..2724eed8bff21b81d628b0b64715a22026e23568 --- /dev/null +++ b/src/views/AddNewItemView.vue @@ -0,0 +1,16 @@ +<template> + <AddNewItem></AddNewItem> +</template> + +<script> +import AddNewItem from "@/components/AddNewItem"; + +export default { + name: "AddNewItemView.vue", + components: { + AddNewItem, + }, +}; +</script> + +<style scoped></style>