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>
|