229 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
			
		
		
	
	
			229 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
| <template>
 | |
|   <div>
 | |
|     <h3>Loddstatistikk</h3>
 | |
| 
 | |
|     <div class="total-raffles">
 | |
|       Totalt 
 | |
|       <span class="total">{{ total }}</span>
 | |
|        kjøpte, 
 | |
|       <span>{{ totalWin }} vinn og </span>
 | |
|       <span> {{ stolen }} stjålet </span>
 | |
|     </div>
 | |
| 
 | |
|     <div class="bought-container">
 | |
|       <div
 | |
|         v-for="color in colors"
 | |
|         :class="color.name + '-container ' + color.name + '-raffle raffle-element-local'"
 | |
|         :key="color.name"
 | |
|       >
 | |
|         <p class="winner-chance">{{ translate(color.name) }} vinnersjanse</p>
 | |
|         <span class="win-percentage">{{ color.totalPercentage }}% </span>
 | |
|         <p class="total-bought-color">{{ color.total }} kjøpte</p>
 | |
|         <p class="amount-of-wins">{{ color.win }} vinn</p>
 | |
|       </div>
 | |
|     </div>
 | |
|   </div>
 | |
| </template>
 | |
| 
 | |
| <script>
 | |
| import { colorStatistics } from "@/api";
 | |
| 
 | |
| export default {
 | |
|   data() {
 | |
|     return {
 | |
|       colors: [],
 | |
|       red: 0,
 | |
|       blue: 0,
 | |
|       yellow: 0,
 | |
|       green: 0,
 | |
|       total: 0,
 | |
|       totalWin: 0,
 | |
|       stolen: 0
 | |
|     };
 | |
|   },
 | |
|   async mounted() {
 | |
|     this.allLotteries().then(this.computeColors);
 | |
|   },
 | |
|   methods: {
 | |
|     allLotteries() {
 | |
|       return fetch("/api/lotteries?includeWinners=true")
 | |
|         .then(resp => resp.json())
 | |
|         .then(response => response.lotteries);
 | |
|     },
 | |
|     translate(color) {
 | |
|       switch (color) {
 | |
|         case "blue":
 | |
|           return "Blå";
 | |
|           break;
 | |
|         case "red":
 | |
|           return "Rød";
 | |
|           break;
 | |
|         case "green":
 | |
|           return "Grønn";
 | |
|           break;
 | |
|         case "yellow":
 | |
|           return "Gul";
 | |
|           break;
 | |
|           break;
 | |
|       }
 | |
|     },
 | |
|     getPercentage: function(win, total) {
 | |
|       return this.round(win == 0 ? 0 : (win / total) * 100);
 | |
|     },
 | |
|     round: function(number) {
 | |
|       //this can make the odds added together more than 100%, maybe rework?
 | |
|       let actualPercentage = Math.round(number * 100) / 100;
 | |
|       let rounded = actualPercentage.toFixed(0);
 | |
|       return rounded;
 | |
|     },
 | |
|     computeColors(lotteries) {
 | |
|       let totalRed = 0;
 | |
|       let totalGreen = 0;
 | |
|       let totalYellow = 0;
 | |
|       let totalBlue = 0;
 | |
|       let total = 0;
 | |
|       let stolen = 0;
 | |
| 
 | |
|       const colorAccumulatedWins = {
 | |
|         blue: 0,
 | |
|         green: 0,
 | |
|         red: 0,
 | |
|         yellow: 0
 | |
|       };
 | |
| 
 | |
|       const accumelatedColors = (winners, colorAccumulatedWins) => {
 | |
|         winners.forEach(winner => {
 | |
|           const winnerColor = winner.color;
 | |
|           colorAccumulatedWins[winnerColor] += 1;
 | |
|         });
 | |
|       };
 | |
| 
 | |
|       lotteries.forEach(lottery => {
 | |
|         totalRed += lottery.red;
 | |
|         totalGreen += lottery.green;
 | |
|         totalYellow += lottery.yellow;
 | |
|         totalBlue += lottery.blue;
 | |
|         total += lottery.bought;
 | |
|         stolen += lottery.stolen;
 | |
| 
 | |
|         accumelatedColors(lottery.winners, colorAccumulatedWins);
 | |
|       });
 | |
| 
 | |
|       this.red = totalRed;
 | |
|       this.yellow = totalYellow;
 | |
|       this.green = totalGreen;
 | |
|       this.blue = totalBlue;
 | |
|       this.total = total;
 | |
| 
 | |
|       this.totalWin =
 | |
|         colorAccumulatedWins.red + colorAccumulatedWins.yellow + colorAccumulatedWins.blue + colorAccumulatedWins.green;
 | |
|       this.stolen = stolen;
 | |
| 
 | |
|       this.colors.push({
 | |
|         name: "red",
 | |
|         total: totalRed,
 | |
|         win: colorAccumulatedWins.red,
 | |
|         totalPercentage: this.getPercentage(colorAccumulatedWins.red, this.totalWin),
 | |
|         percentage: this.getPercentage(colorAccumulatedWins.red, this.red.total)
 | |
|       });
 | |
|       this.colors.push({
 | |
|         name: "blue",
 | |
|         total: totalBlue,
 | |
|         win: colorAccumulatedWins.blue,
 | |
|         totalPercentage: this.getPercentage(colorAccumulatedWins.blue, this.totalWin),
 | |
|         percentage: this.getPercentage(colorAccumulatedWins.blue, this.blue.total)
 | |
|       });
 | |
|       this.colors.push({
 | |
|         name: "yellow",
 | |
|         total: totalYellow,
 | |
|         win: colorAccumulatedWins.yellow,
 | |
|         totalPercentage: this.getPercentage(colorAccumulatedWins.yellow, this.totalWin),
 | |
|         percentage: this.getPercentage(colorAccumulatedWins.yellow, this.yellow.total)
 | |
|       });
 | |
|       this.colors.push({
 | |
|         name: "green",
 | |
|         total: totalGreen,
 | |
|         win: colorAccumulatedWins.green,
 | |
|         totalPercentage: this.getPercentage(colorAccumulatedWins.green, this.totalWin),
 | |
|         percentage: this.getPercentage(colorAccumulatedWins.green, this.green.total)
 | |
|       });
 | |
| 
 | |
|       this.colors = this.colors.sort((a, b) => (a.win > b.win ? -1 : 1));
 | |
|     }
 | |
|   }
 | |
| };
 | |
| </script>
 | |
| 
 | |
| <style lang="scss" scoped>
 | |
| @import "@/styles/variables.scss";
 | |
| @import "@/styles/media-queries.scss";
 | |
| @import "@/styles/global.scss";
 | |
| 
 | |
| @include mobile {
 | |
|   section {
 | |
|     margin-top: 5em;
 | |
|   }
 | |
| }
 | |
| 
 | |
| .total-raffles {
 | |
|   display: flex;
 | |
| }
 | |
| 
 | |
| .bought-container {
 | |
|   margin-top: 2em;
 | |
|   display: grid;
 | |
|   grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
 | |
|   grid-gap: 50px;
 | |
| 
 | |
|   .raffle-element-local {
 | |
|     height: 250px;
 | |
|     width: 100%;
 | |
|     display: flex;
 | |
|     flex-direction: column;
 | |
|     position: relative;
 | |
|     @include raffle;
 | |
| 
 | |
|     .win-percentage {
 | |
|       margin-left: 30px;
 | |
|       font-size: 50px;
 | |
|     }
 | |
| 
 | |
|     p {
 | |
|       margin-left: 30px;
 | |
|       &.winner-chance {
 | |
|         margin-top: 40px;
 | |
|       }
 | |
| 
 | |
|       &.total-bought-color {
 | |
|         font-weight: bold;
 | |
|         margin-top: 25px;
 | |
|       }
 | |
| 
 | |
|       &.amount-of-wins {
 | |
|         font-weight: bold;
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     h3 {
 | |
|       margin-left: 15px;
 | |
|     }
 | |
| 
 | |
|     &.green-raffle {
 | |
|       background-color: $light-green;
 | |
|     }
 | |
| 
 | |
|     &.blue-raffle {
 | |
|       background-color: $light-blue;
 | |
|     }
 | |
| 
 | |
|     &.yellow-raffle {
 | |
|       background-color: $light-yellow;
 | |
|     }
 | |
| 
 | |
|     &.red-raffle {
 | |
|       background-color: $light-red;
 | |
|     }
 | |
|   }
 | |
| }
 | |
| </style>
 |