From 5df1f1769e8c7483ba32f9cb8c0362badb598011 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?No=C3=A9=20Viricel?= Date: Mon, 21 Dec 2020 23:45:00 +0100 Subject: [PATCH] Create Vehicle page layout --- layouts/default.vue | 5 ++++ pages/vehicles/_id.spec.js | 16 +++++++++--- pages/vehicles/_id.vue | 51 +++++++++++++++++++++++++++++++++++--- store/vehicles/index.js | 14 ++++++++++- 4 files changed, 78 insertions(+), 8 deletions(-) diff --git a/layouts/default.vue b/layouts/default.vue index 038e97d..d21da90 100644 --- a/layouts/default.vue +++ b/layouts/default.vue @@ -14,6 +14,7 @@ export default { fetchOnServer: false, async fetch() { const { store } = this.$nuxt.context; + if (!store.state.films.list.length) await store.dispatch("films/getList"); if (!store.state.people.list.length) await store.dispatch("people/getList"); if (!store.state.vehicles.list.length) await store.dispatch("vehicles/getList"); @@ -42,4 +43,8 @@ html { box-sizing: border-box; margin: 0; } + +main { + min-height: calc(100vh - 64px * 2); +} diff --git a/pages/vehicles/_id.spec.js b/pages/vehicles/_id.spec.js index c26e049..2e540fc 100644 --- a/pages/vehicles/_id.spec.js +++ b/pages/vehicles/_id.spec.js @@ -2,6 +2,8 @@ import { mount, createLocalVue } from "@vue/test-utils"; import Vuex from "vuex"; import Vehicle from "./_id"; import mockVehicles from "@/test/fake-vehicles.json"; +import mockPeople from "@/test/fake-people.json"; +import mockFilms from "@/test/fake-films.json"; let $route = { path: "/vehicles", @@ -39,8 +41,11 @@ describe("Vehicle page", () => { localVue, store, computed: { - vehicle: () => mockVehicles[0] - } + vehicle: () => mockVehicles[0], + pilot: () => mockPeople[0], + film: () => mockFilms[0] + }, + stubs: ["nuxt-link"] }); expect(wrapper.exists()).toBe(true); }); @@ -64,8 +69,11 @@ describe("Vehicle page", () => { localVue, store, computed: { - vehicle: () => mockVehicles[0] - } + vehicle: () => mockVehicles[0], + pilot: () => jest.fn(), + film: () => jest.fn() + }, + stubs: ["nuxt-link"] }); await wrapper.vm.$options.asyncData({ store, params: $route.params }); diff --git a/pages/vehicles/_id.vue b/pages/vehicles/_id.vue index 43dce7a..81a3679 100644 --- a/pages/vehicles/_id.vue +++ b/pages/vehicles/_id.vue @@ -1,6 +1,40 @@ @@ -25,6 +59,12 @@ export default { await store.dispatch("vehicles/getVehicle", params.id); }, computed: { + pilot: function() { + return this.$store.getters["vehicles/getPilot"]; + }, + film: function() { + return this.$store.getters["vehicles/getFilm"]; + }, ...mapGetters({ vehicle: "vehicles/vehicle" }) @@ -32,4 +72,9 @@ export default { }; - + diff --git a/store/vehicles/index.js b/store/vehicles/index.js index 72baf7c..812d8df 100644 --- a/store/vehicles/index.js +++ b/store/vehicles/index.js @@ -25,7 +25,9 @@ export const actions = { }, async getVehicle({ commit }, id) { try { - const vehicle = await this.$axios.$get(`/api/vehicles/${id}`); + const vehicle = await this.$axios.$get( + `/api/vehicles/${id}?fields=id,name,description,vehicle_class,length,pilot,films` + ); commit("setVehicle", vehicle); } catch (e) { throw Error(`API Error occurred: ${e.message}`); @@ -38,5 +40,15 @@ export const getters = { vehicle: state => state.vehicle, getVehiclesByFilmId: state => id => { return state.list.filter(vehicle => vehicle.films.split("/")[4] === id); + }, + getPilot: (state, getters, rootState) => { + return rootState.people.list.find( + people => people.id === state.vehicle.pilot.split("/")[4] + ); + }, + getFilm: (state, getters, rootState) => { + return rootState.films.list.find( + film => film.id === state.vehicle.films.split("/")[4] + ); } };