<template> <div class="app"> <main-header /> <div class="container"> <div v-for="(item, index) in news" :key="index" class="card is-fullwidth" > <header class="card-header"> <p class="card-header-title"> {{ item.title }} - {{ formatDate(item.createdAt) }} </p> </header> <div class="card-content"> <div class="content"> <p>{{ item.description }}</p> </div> <div v-show="item.features.length > 0" class="sect"> <div class="sect-head-features"> The features are so great </div> <ul class="sect-body"> <li v-for="(feature, index) in item.features" :key="index" > {{ feature }} </li> </ul> </div> <div v-show="item.improvements.length > 0" class="sect"> <div class="sect-head-improvements"> Improvements </div> <ul class="sect-body"> <li v-for="(improvement, index) in item.improvements" :key="index" > {{ improvement }} </li> </ul> </div> <div v-show="item.bugs.length > 0" class="sect"> <div class="sect-head-bugs"> Bugs Smashed </div> <ul class="sect-body"> <li v-for="(bug, index) in item.bugs" :key="index"> {{ bug }} </li> </ul> </div> <div v-show="item.upcoming.length > 0" class="sect"> <div class="sect-head-upcoming"> Coming Soon to a Musare near you </div> <ul class="sect-body"> <li v-for="(upcoming, index) in item.upcoming" :key="index" > {{ upcoming }} </li> </ul> </div> </div> </div> <h3 v-if="noFound" class="center"> No news items were found. </h3> </div> <main-footer /> </div> </template> <script> import MainHeader from "../MainHeader.vue"; import MainFooter from "../MainFooter.vue"; import io from "../../io"; export default { components: { MainHeader, MainFooter }, data() { return { news: [], noFound: false }; }, mounted() { io.getSocket(socket => { this.socket = socket; this.socket.emit("news.index", res => { this.news = res.data; if (this.news.length === 0) this.noFound = true; }); this.socket.on("event:admin.news.created", news => { this.news.unshift(news); this.noFound = false; }); this.socket.on("event:admin.news.updated", news => { for (let n = 0; n < this.news.length; n += 1) { if (this.news[n]._id === news._id) { this.news.$set(n, news); } } }); this.socket.on("event:admin.news.removed", news => { this.news = this.news.filter(item => item._id !== news._id); if (this.news.length === 0) this.noFound = true; }); }); }, methods: { formatDate: unix => { return moment(unix).format("DD-MM-YYYY"); } } }; </script> <style lang="scss" scoped> .card { margin-top: 50px; } .sect { div[class^="sect-head"], div[class*=" sect-head"] { padding: 12px; text-transform: uppercase; font-weight: bold; color: #fff; } .sect-head-features { background-color: dodgerblue; } .sect-head-improvements { background-color: seagreen; } .sect-head-bugs { background-color: brown; } .sect-head-upcoming { background-color: mediumpurple; } .sect-body { padding: 15px 25px; li { list-style-type: disc; } } } </style>