All wines page
This commit is contained in:
@@ -109,4 +109,46 @@ router.route("/wines/statistics").get(async (req, res) => {
|
||||
res.json(wines);
|
||||
});
|
||||
|
||||
router.route("/wines/statistics/overall").get(async (req, res) => {
|
||||
const highscore = await Highscore.find().populate("wins.wine");
|
||||
let wines = {};
|
||||
|
||||
for (let i = 0; i < highscore.length; i++) {
|
||||
let person = highscore[i];
|
||||
for (let y = 0; y < person.wins.length; y++) {
|
||||
let wine = person.wins[y].wine;
|
||||
let date = person.wins[y].date;
|
||||
let color = person.wins[y].color;
|
||||
|
||||
if (wines[wine._id] == undefined) {
|
||||
wines[wine._id] = {
|
||||
name: wine.name,
|
||||
occurences: wine.occurences,
|
||||
rating: wine.rating,
|
||||
image: wine.image,
|
||||
id: wine.id,
|
||||
_id: wine._id,
|
||||
dates: [date],
|
||||
winners: [person.name],
|
||||
red: 0,
|
||||
blue: 0,
|
||||
green: 0,
|
||||
yellow: 0
|
||||
};
|
||||
wines[wine._id][color] += 1;
|
||||
} else {
|
||||
wines[wine._id].dates.push(date);
|
||||
wines[wine._id].winners.push(person.name);
|
||||
if (wines[wine._id][color] == undefined) {
|
||||
wines[wine._id][color] = 1;
|
||||
} else {
|
||||
wines[wine._id][color] += 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
res.json(Object.values(wines));
|
||||
});
|
||||
|
||||
module.exports = router;
|
||||
|
||||
187
src/components/AllWinesPage.vue
Normal file
187
src/components/AllWinesPage.vue
Normal file
@@ -0,0 +1,187 @@
|
||||
<template>
|
||||
<div class="outer">
|
||||
<div class="container">
|
||||
<h1 class="title">Alle viner</h1>
|
||||
<div class="wines-container">
|
||||
<a :href="wine.vivinoLink" v-for="wine in wines">
|
||||
<div class="inner-wine-container">
|
||||
<div class="left">
|
||||
<!-- <img :src="wine.image" class="wine-image" /> -->
|
||||
<img
|
||||
src="https://images.vivino.com/thumbs/Mzt8QNxpSfa4W6Sgf02Ruw_pb_x960.png"
|
||||
class="wine-image"
|
||||
/>
|
||||
</div>
|
||||
<div class="right">
|
||||
<h2>{{ wine.name }}</h2>
|
||||
<span v-if="wine.rating">{{ wine.rating }} rating</span>
|
||||
|
||||
<a :herf="wine.vivinoLink" class="wine-link">Les mer</a>
|
||||
<span class="name-wins">
|
||||
Vunnet av:
|
||||
{{wine.winners.join(", ")}}
|
||||
</span>
|
||||
<div class="color-wins">
|
||||
<span class="color-win blue">{{wine.blue == undefined ? 0 : wine.blue}}</span>
|
||||
<span class="color-win red">{{wine.red == undefined ? 0 : wine.red}}</span>
|
||||
<span class="color-win green">{{wine.green == undefined ? 0 : wine.green}}</span>
|
||||
<span class="color-win yellow">{{wine.yellow == undefined ? 0 : wine.yellow}}</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { page, event } from "vue-analytics";
|
||||
import Banner from "@/ui/Banner";
|
||||
|
||||
export default {
|
||||
components: {
|
||||
Banner
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
wines: []
|
||||
};
|
||||
},
|
||||
async mounted() {
|
||||
const _wines = await fetch("/api/wines/statistics/overall");
|
||||
this.wines = await _wines.json();
|
||||
}
|
||||
};
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
@import "./src/styles/media-queries";
|
||||
|
||||
.wine-image {
|
||||
height: 250px;
|
||||
}
|
||||
|
||||
h1 {
|
||||
font-family: knowit, Arial;
|
||||
margin-bottom: 25px;
|
||||
}
|
||||
|
||||
.wines-container {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
justify-content: space-evenly;
|
||||
margin: 0 2rem;
|
||||
|
||||
@media (min-width: 1500px) {
|
||||
max-width: 1000px;
|
||||
margin: 0 auto;
|
||||
}
|
||||
|
||||
@include mobile {
|
||||
flex-direction: column;
|
||||
}
|
||||
}
|
||||
|
||||
.name-wins,
|
||||
.color-wins {
|
||||
display: flex;
|
||||
width: 60%;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
|
||||
span.color-win {
|
||||
border: 2px solid transparent;
|
||||
color: #333;
|
||||
display: block;
|
||||
padding: 30px;
|
||||
font-size: 1.3rem;
|
||||
display: inline-flex;
|
||||
flex-wrap: wrap;
|
||||
flex-direction: row;
|
||||
/* max-height: calc(3rem + 18px); */
|
||||
/* max-width: calc(3rem + 18px); */
|
||||
width: 1rem;
|
||||
margin: 10px;
|
||||
touch-action: manipulation;
|
||||
height: 1rem;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
|
||||
@include mobile {
|
||||
margin: 2px;
|
||||
padding: 10px;
|
||||
font-size: 1rem;
|
||||
}
|
||||
|
||||
&.green {
|
||||
background: #c8f9df;
|
||||
}
|
||||
&.blue {
|
||||
background: #d4f2fe;
|
||||
}
|
||||
&.red {
|
||||
background: #fbd7de;
|
||||
}
|
||||
&.yellow {
|
||||
background: #fff6d6;
|
||||
}
|
||||
}
|
||||
|
||||
h3 {
|
||||
max-width: 30vw;
|
||||
|
||||
@include mobile {
|
||||
max-width: 50vw;
|
||||
}
|
||||
}
|
||||
|
||||
.inner-wine-container {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
margin: auto;
|
||||
width: 500px;
|
||||
font-family: Arial;
|
||||
margin-bottom: 30px;
|
||||
|
||||
@include desktop {
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
@include mobile {
|
||||
width: auto;
|
||||
}
|
||||
}
|
||||
|
||||
.right {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
margin-bottom: 150px;
|
||||
margin-left: 50px;
|
||||
|
||||
@include mobile {
|
||||
margin-left: 2rem;
|
||||
margin-bottom: 50px;
|
||||
}
|
||||
}
|
||||
|
||||
a,
|
||||
a:focus,
|
||||
a:hover,
|
||||
a:visited {
|
||||
color: #333333;
|
||||
font-family: Arial;
|
||||
text-decoration: none;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.wine-link {
|
||||
color: #333333;
|
||||
font-family: Arial;
|
||||
text-decoration: none;
|
||||
font-weight: bold;
|
||||
border-bottom: 1px solid #ff5fff;
|
||||
width: fit-content;
|
||||
}
|
||||
</style>
|
||||
@@ -41,7 +41,7 @@ export default {
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
@import './src/styles/media-queries';
|
||||
@import "./src/styles/media-queries";
|
||||
|
||||
.wine-image {
|
||||
height: 250px;
|
||||
@@ -87,6 +87,10 @@ h3 {
|
||||
@include desktop {
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
@include mobile {
|
||||
width: auto;
|
||||
}
|
||||
}
|
||||
|
||||
.right {
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
import VinlottisPage from "@/components/VinlottisPage";
|
||||
import GeneratePage from "@/components/GeneratePage";
|
||||
import TodaysPage from "@/components/TodaysPage";
|
||||
import AllWinesPage from "@/components/AllWinesPage";
|
||||
|
||||
const routes = [
|
||||
{
|
||||
@@ -15,6 +16,10 @@ const routes = [
|
||||
path: "/dagens",
|
||||
component: TodaysPage
|
||||
},
|
||||
{
|
||||
path: "/viner",
|
||||
component: AllWinesPage
|
||||
},
|
||||
{
|
||||
path: "/login",
|
||||
component: resolve => require(["@/components/LoginPage"], resolve)
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
<template>
|
||||
<div v-if="wines.length > 0">
|
||||
<h3>Topp 5 viner</h3>
|
||||
<h3>
|
||||
<router-link to="viner">Topp 5 viner</router-link>
|
||||
</h3>
|
||||
<ol>
|
||||
<li v-for="wine in wines">
|
||||
<span v-if="wine.vivinoLink == '' || wine.vivinoLink == null">
|
||||
@@ -16,8 +18,7 @@
|
||||
:href="wine.vivinoLink"
|
||||
v-if="wine.vivinoLink != '' && wine.vivinoLink != null"
|
||||
@click="wineClick(wine)"
|
||||
>Les mer</a
|
||||
>
|
||||
>Les mer</a>
|
||||
</li>
|
||||
</ol>
|
||||
</div>
|
||||
@@ -130,6 +131,18 @@ export default {
|
||||
@import "../styles/media-queries.scss";
|
||||
h3 {
|
||||
text-align: left;
|
||||
|
||||
& a {
|
||||
text-decoration: none;
|
||||
color: #333333;
|
||||
|
||||
&:focus,
|
||||
&:active,
|
||||
&:visited {
|
||||
text-decoration: none;
|
||||
color: #333333;
|
||||
}
|
||||
}
|
||||
}
|
||||
div {
|
||||
margin: 0;
|
||||
|
||||
Reference in New Issue
Block a user