| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180 | <template lang='pug'>  v-container(fluid, grid-list-lg)    v-layout(row, wrap)      v-flex(xs12)        .admin-header          img.animated.fadeInUp(src='/svg/icon-browse-page.svg', alt='Dashboard', style='width: 80px;')          .admin-header-title            .headline.primary--text.animated.fadeInLeft {{ $t('admin:dashboard.title') }}            .subheading.grey--text.animated.fadeInLeft.wait-p2s {{ $t('admin:dashboard.subtitle') }}      v-flex(xs12 md6 lg4 xl3 d-flex)        v-card.primary.dashboard-card.animated.fadeInUp(dark)          v-card-text            v-icon.dashboard-icon insert_drive_file            .subheading Pages            animated-number.display-1(              :value='info.pagesTotal'              :duration='2000'              :formatValue='round'              easing='easeOutQuint'              )      v-flex(xs12 md6 lg4 xl3 d-flex)        v-card.indigo.lighten-1.dashboard-card.animated.fadeInUp.wait-p2s(dark)          v-card-text            v-icon.dashboard-icon person            .subheading Users            animated-number.display-1(              :value='info.usersTotal'              :duration='2000'              :formatValue='round'              easing='easeOutQuint'              )      v-flex(xs12 md6 lg4 xl3 d-flex)        v-card.indigo.lighten-2.dashboard-card.animated.fadeInUp.wait-p4s(dark)          v-card-text            v-icon.dashboard-icon people            .subheading Groups            animated-number.display-1(              :value='info.groupsTotal'              :duration='2000'              :formatValue='round'              easing='easeOutQuint'              )      v-flex(xs12 md6 lg12 xl3 d-flex)        v-card.dashboard-card.animated.fadeInUp.wait-p6s(          :class='isLatestVersion ? "teal lighten-2" : "red lighten-2"'          dark          )          v-btn.btn-animate-wrench(fab, absolute, right, top, small, light, to='system', v-if='hasPermission(`manage:system`)')            v-icon(:color='isLatestVersion ? `teal` : `red darken-4`') build          v-card-text            v-icon.dashboard-icon blur_on            .subheading Wiki.js {{info.currentVersion}}            .body-2(v-if='isLatestVersion') You are running the latest version.            .body-2(v-else) A new version is available: {{info.latestVersion}}      v-flex(xs12)        v-card.radius-7          v-card-title.subheading(:class='$vuetify.dark ? `grey darken-2` : `grey lighten-5`') Recent Pages          v-data-table.pb-2(            :items='recentPages'            hide-actions            hide-headers            )            template(slot='items' slot-scope='props')              td(width='20', style='padding-right: 0;'): v-icon insert_drive_file              td                .body-2.primary--text {{ props.item.title }}                .caption.grey--text.text--darken-2 {{ props.item.description }}              td.caption /{{ props.item.path }}              td.grey--text.text--darken-2(width='250')                .caption: strong Updated {{ props.item.updatedAt | moment('from') }}                .caption Created {{ props.item.createdAt | moment('calendar') }}      v-flex(xs12)        v-card.radius-7          v-card-title.subheading(:class='$vuetify.dark ? `grey darken-2` : `grey lighten-5`') Most Popular Pages          v-data-table.pb-2(            :items='popularPages'            hide-actions            hide-headers            )            template(slot='items' slot-scope='props')              td(width='20', style='padding-right: 0;'): v-icon insert_drive_file              td                .body-2.primary--text {{ props.item.title }}                .caption.grey--text.text--darken-2 {{ props.item.description }}              td.caption /{{ props.item.path }}              td.grey--text.text--darken-2(width='250')                .caption: strong Updated {{ props.item.updatedAt | moment('from') }}                .caption Created {{ props.item.createdAt | moment('calendar') }}      v-flex(xs12)        v-card.dashboard-contribute          v-card-text            img(src='/svg/icon-heart-health.svg', alt='Contribute', style='height: 80px;')            .pl-3              .subheading Contribute              .body-2.pt-2 Wiki.js is a free and open source project. There are several ways you can contribute to the project.              .body-1 We need your help!              v-btn.mx-0.mt-2(:color='$vuetify.dark ? `indigo lighten-3` : `indigo`', outline, small, to='/contribute') Learn More</template><script>import _ from 'lodash'import AnimatedNumber from 'animated-number-vue'import { get } from 'vuex-pathify'export default {  components: {    AnimatedNumber  },  data() {    return {      recentPages: [],      popularPages: []    }  },  computed: {    isLatestVersion() {      return this.info.currentVersion === this.info.latestVersion    },    info: get('admin/info'),    permissions: get('user/permissions')  },  methods: {    round(val) { return Math.round(val) },    hasPermission(prm) {      if (_.isArray(prm)) {        return _.some(prm, p => {          return _.includes(this.permissions, p)        })      } else {        return _.includes(this.permissions, prm)      }    }  }}</script><style lang='scss'>.dashboard-card {  display: flex;  border-radius: 7px;  .v-card__text {    overflow: hidden;    position: relative;  }}.dashboard-contribute {  background-color: #FFF;  background-image: linear-gradient(to bottom, #FFF 0%, lighten(mc('indigo', '50'), 3%) 100%);  border-radius: 7px;  @at-root .theme--dark & {    background-color: mc('grey', '800');    background-image: linear-gradient(to bottom, mc('grey', '800') 0%, darken(mc('grey', '800'), 6%) 100%);  }  .v-card__text {    display: flex;    align-items: center;    color: mc('indigo', '500');    @at-root .theme--dark & {      color: mc('grey', '300');    }  }}.dashboard-icon {  position: absolute;  right: 0;  top: 12px;  font-size: 120px;  opacity: .25;}</style>
 |