aboutsummaryrefslogtreecommitdiffstats
path: root/src/pages/UploadList.vue
blob: da297ba96cb80e2cfb8f03700afba82cf8296356 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
<template>
  <div>
    <transition :enter="showList ? 'fadeInLeft' : 'fadeInRight'" :leave="showList ? 'fadeOutRight' : 'fadeOutLeft'" mode="out-in" duration="500">
      <div v-if="showList">
        <h4>Available Mods</h4>
        <q-table
          no-data-label="No mods available"
          row-key="name"
          :data="uploads"
          :config="tableConfig"
          :columns="tableColumns"
          @refresh="refresh">
          <q-td slot='body-cell-action' slot-scope="props" :props='props'>
            <q-btn color="primary"
                   small
                   outline
                   icon="fa-info-circle"
                   @click="$router.push({name: 'upload-detail', params: {uploadId: props.row._id}})">
              Details</q-btn>
            <q-btn color="negative"
                   outline
                   small
                   icon="fa-trash-o"
                   v-if="props.row.author.username === $store.state.user.decodedToken.username"
                   @click="deleteUpload(cell.row)">
              Delete</q-btn>
          </q-td>
          <q-td slot='body-cell-voting' slot-scope="props" :props='props'>
            {{ props.value.sum }} <i class="fa" :class="{'fa-caret-up text-positive': props.value.sum > 0, 'fa-caret-down text-negative': props.value.sum < 0, 'fa-sort text-dark': props.value.sum === 0}"></i>
          </q-td>
        </q-table>
      </div>
      <router-view></router-view>
    </transition>
  </div>
</template>

<script>
  import {
    Dialog,
  } from 'quasar'
  import moment from 'moment'

  export default {
    computed: {
      showList () {
        return this.$route.name === 'upload-list'
      }
    },
    watch: {
      showList: {
        handler (val, oldVal) {
          if (val && val !== oldVal) {
            this.refresh()
          }
        },
        immediate: true,
      }
    },
    data () {
      return {
        response: {},
        uploads: [],
        tableConfig: {
          refresh: true,
          leftStickyColumns: 1,
          rightStickyColumns: 3,
          rowHeight: '60px',
        },
        tableColumns: [
          {name: 'title', label: 'Title', field: 'title'},
          {
            name: 'description',
            label: 'Description',
            field: 'description',
            format: el => typeof el === 'string' && el.length > 150 ? el.slice(0, 150) + '...' : el,
          },
          {name: 'author', label: 'Author', field: row => row.author.username},
          {name: 'voting', label: 'Voting', field: 'voting'},
          {
            name: 'updatedAt',
            label: 'Last update',
            field: 'updatedAt',
            format: el => moment(el).from(),
          },
          {name: 'action', label: 'Actions', field: 'action'},
        ],
      }
    },
    methods: {
      refresh (done) {
        let that = this
        this.$http.get('/uploads').then((response) => {
          that.response = response
          that.uploads = response.data.uploads
          if (done) {
            done()
          }
        })
      },
      deleteUpload (upload) {
        let that = this
        Dialog.create({
          title: 'Delete mod?',
          message: `Do you really want to delete the mod ${upload.title}?<br>This cannot be undone!`,
          buttons: [
            'Cancel',
            {
              label: '<i class="fa fa-trash-o"></i> Yes, delete!',
              color: 'negative',
              outline: true,
              handler () {
                that.$http.delete(`/uploads/${upload._id}`).then(response => that.refresh())
              }
            }
          ]
        })
      },
    },
  }
</script>

<style lang="styl" type="text/stylus" scoped>
  .description
    max-width: 400px
</style>