diff --git a/src/assets/default-product.png b/src/assets/default-product.png new file mode 100644 index 0000000000000000000000000000000000000000..249ee6900c829ba4c718841bc0aa48f62d34f5b8 Binary files /dev/null and b/src/assets/default-product.png differ diff --git a/src/components/ItemCard.vue b/src/components/ItemCard.vue new file mode 100644 index 0000000000000000000000000000000000000000..c7b866eefac807e242c8108a5b9323eb7159040d --- /dev/null +++ b/src/components/ItemCard.vue @@ -0,0 +1,31 @@ +<template> + <div class="mt-5"> + <div class="w-4/5 rounded bg-gray-200"> + <img + class="w-full" + :src="item.img || require('../assets/default-product.png')" + alt="Item image" + /> + <div class="p-1 m-1"> + <p class="text-gray-700 text-xs font-bold" id="adress"> + {{ item.adresse }} + </p> + <p class="font-bold text-sm" id="title">{{ item.title }}</p> + <p class="text-gray-700 text-xs" id="price">{{ item.price }} kr</p> + </div> + </div> + </div> +</template> + +<script> +export default { + props: { + item: { + img: String, + adresse: String, + title: String, + price: Number, + }, + }, +}; +</script> diff --git a/src/components/SearchItemListComponent.vue b/src/components/SearchItemListComponent.vue new file mode 100644 index 0000000000000000000000000000000000000000..69950032651b044300e126f2c828d41ae5d950d1 --- /dev/null +++ b/src/components/SearchItemListComponent.vue @@ -0,0 +1,82 @@ +<template> + <section class="relative w-full max-w-md px-5 py-4 mx-auto rounded-md"> + <div class="relative" id="searchComponent"> + <span class="absolute inset-y-0 left-0 flex items-center pl-3"> + <svg class="w-5 h-5 text-gray-400" viewBox="0 0 24 24" fill="none"> + <path + d="M21 21L15 15M17 10C17 13.866 13.866 17 10 17C6.13401 17 3 13.866 3 10C3 6.13401 6.13401 3 10 3C13.866 3 17 6.13401 17 10Z" + stroke="currentColor" + stroke-width="2" + stroke-linecap="round" + stroke-linejoin="round" + ></path> + </svg> + </span> + + <input + type="text" + id="searchInput" + class="w-full py-3 pl-10 pr-4 text-gray-700 bg-white border rounded-md dark:bg-gray-800 dark:text-gray-300 dark:border-gray-600 focus:border-blue-500 dark:focus:border-blue-500 focus:outline-none focus:ring" + placeholder="Search" + v-model="search" + /> + </div> + + <div class="absolute inset-x-0 px-6 py-3 mt-4 border-2 border-slate-500"> + <div class="grid grid-cols-2"> + <ItemCard v-for="item in searchedItems" :key="item" :item="item" /> + </div> + </div> + </section> +</template> + +<script> +import ItemCard from "@/components/ItemCard"; +export default { + name: "SearchItemListComponent", + + components: { + ItemCard, + }, + + computed: { + searchedItems() { + let filteredItems = []; + + filteredItems = this.items.filter( + (p) => + p.title.toLowerCase().includes(this.search.toLowerCase()) || + p.adresse.toLowerCase().includes(this.search.toLowerCase()) || + p.price === Number(this.search) + ); + + return filteredItems; + }, + }, + + /** + * Her må det lages en metode som henter alle items (i en gruppe) fra databasen. + * De kan deretter bli pusha inn i items array, og da burde de bli displayet i lista. + * Når denne metoden er på plass kan items[] i data tømmes. Da vil alt dataen komme fra db. + */ + + data() { + return { + items: [ + { img: "", adresse: "Oslo", title: "Dyson", price: 1000 }, + + { img: "", adresse: "Trondheim", title: "Gressklipper", price: 500 }, + + { img: "", adresse: "Bergen", title: "Bil", price: 500 }, + ], + item: { + img: "", + adresse: "", + title: "", + price: 0, + }, + search: "", + }; + }, +}; +</script> diff --git a/src/router/index.js b/src/router/index.js index 63c352f01601c004be23eca91277b9d0bc39f716..cb3eca7e5476af3a0d4f8889ac6e31f4d5f5eb5a 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -42,10 +42,17 @@ const routes = [ name: "newPassword", component: NewPasswordView, }, + { + + path: "/searchItemList", + name: "searchItemList", + component: () => import("../views/SearchItemListView.vue"), + }, { path: "/createNewGroup", name: "createNewGroup", component: () => import("../views/CreateNewGroupView.vue"), + }, ]; diff --git a/src/views/SearchItemListView.vue b/src/views/SearchItemListView.vue new file mode 100644 index 0000000000000000000000000000000000000000..288fa367f2da5f0df7f164f4538a35ecfca62db1 --- /dev/null +++ b/src/views/SearchItemListView.vue @@ -0,0 +1,15 @@ +<template> + <SearchItemListComponent></SearchItemListComponent> +</template> + +<script> +import SearchItemListComponent from "@/components/SearchItemListComponent"; +export default { + name: "SearchItemListView", + components: { + SearchItemListComponent, + }, +}; +</script> + +<style scoped></style> diff --git a/tests/unit/search-item-list.spec.js b/tests/unit/search-item-list.spec.js new file mode 100644 index 0000000000000000000000000000000000000000..6a01bbbdbe83b35b070e3fc9bf8ac9ed061ab6af --- /dev/null +++ b/tests/unit/search-item-list.spec.js @@ -0,0 +1,15 @@ +import { shallowMount } from "@vue/test-utils"; +import SearchItemListComponent from "@/components/SearchItemListComponent.vue"; + +describe("CreateNewGroup elements rendering", () => { + + it("Tests setting values of input field", async() => { + + const wrapper = shallowMount(SearchItemListComponent); + + const searchInput = wrapper.find('#searchInput'); + await searchInput.setValue("Dyson"); + expect(searchInput.element.value).toBe("Dyson"); + + }); +});