121 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
			
		
		
	
	
			121 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
| <template>
 | |
|   <div class="highscores" v-if="highscore.length > 0">
 | |
| 
 | |
|     <section class="heading">
 | |
|       <h3>
 | |
|         Topp 5 vinnere
 | |
|       </h3>
 | |
|       <router-link to="highscore" class="">
 | |
|         <span class="vin-link">Se alle vinnere</span>
 | |
|       </router-link>
 | |
|     </section>
 | |
|     <ol class="winner-list-container">
 | |
|       <li v-for="(person, index) in highscore" :key="person._id" class="single-winner">
 | |
|         <span class="placement">{{index + 1}}.</span>
 | |
|         <i class="icon icon--medal"></i>
 | |
|         <p class="winner-name">{{ person.name }}</p>
 | |
|       </li>
 | |
|     </ol>
 | |
|   </div>
 | |
| </template>
 | |
| 
 | |
| <script>
 | |
| 
 | |
| import { highscoreStatistics } from "@/api";
 | |
| 
 | |
| export default {
 | |
|   data() {
 | |
|     return { highscore: [] };
 | |
|   },
 | |
|   async mounted() {
 | |
|     let response = await highscoreStatistics();
 | |
|     response.sort((a, b) => a.wins.length < b.wins.length ? 1 : -1)
 | |
|     this.highscore = this.generateScoreBoard(response.slice(0, 5));
 | |
|   },
 | |
|   methods: {
 | |
|     generateScoreBoard(highscore=this.highscore) {
 | |
|       let place = 0;
 | |
|       let highestWinCount = -1;
 | |
| 
 | |
|       return highscore.map(win => {
 | |
|         const wins = win.wins.length
 | |
|         if (wins != highestWinCount) {
 | |
|           place += 1
 | |
|           highestWinCount = wins
 | |
|         }
 | |
| 
 | |
|         const placeString = place.toString().padStart(2, "0");
 | |
|         win.rank = placeString;
 | |
|         return win
 | |
|       })
 | |
|     }
 | |
|   }
 | |
| };
 | |
| </script>
 | |
| 
 | |
| <style lang="scss" scoped>
 | |
| @import "../styles/variables.scss";
 | |
| .heading {
 | |
|   display: flex;
 | |
|   justify-content: space-between;
 | |
|   align-items: center;
 | |
| }
 | |
| 
 | |
| a {
 | |
|   text-decoration: none;
 | |
|   color: #333333;
 | |
| 
 | |
|   &:focus,
 | |
|   &:active,
 | |
|   &:visited {
 | |
|     text-decoration: none;
 | |
|     color: #333333;
 | |
|   }
 | |
| }
 | |
| 
 | |
| ol {
 | |
|   list-style-type: none;
 | |
|   margin-left: 0;
 | |
|   padding: 0;
 | |
| }
 | |
| 
 | |
| .winner-list-container {
 | |
|   display: grid;
 | |
|   grid-template-columns: repeat(auto-fit, minmax(12.5em, 1fr));
 | |
|   gap: 5%;
 | |
| 
 | |
|   .single-winner {
 | |
|     box-sizing: border-box;
 | |
|     width: 100%;
 | |
|     background: $primary;
 | |
|     display: grid;
 | |
|     grid-template-columns: 1fr 1fr 1fr;
 | |
|     align-items: center;
 | |
|     padding: 1em; 
 | |
| 
 | |
|     i {
 | |
|       font-size: 3em;
 | |
|       width: max-content;
 | |
|       justify-self: end;
 | |
|     }
 | |
| 
 | |
|     .placement {
 | |
|       grid-row: 1;
 | |
|       grid-column: 1 / 3;
 | |
|       font-size: 3em;
 | |
|     }
 | |
| 
 | |
|     .winner-name {
 | |
|       grid-row: 2;
 | |
|       grid-column: 1 / -1;
 | |
|     }
 | |
| 
 | |
| 
 | |
|     .winner-icon {
 | |
|       grid-row: 1;
 | |
|       grid-column: 3;
 | |
|     }
 | |
|   }
 | |
| }
 | |
| </style>
 |