diff --git a/src/api.js b/src/api.js index 7d02836eb18dc9bd91fe3de0ea10a7551cd5ec79..2b324942ccc5b643b84ed1df7036cefda26217cb 100644 --- a/src/api.js +++ b/src/api.js @@ -288,5 +288,19 @@ export const api = { } catch (error) { return null } + }, + async setVerified (id) { + const url = serverurl + 'models/setVerified' + '?id=' + id + const token = await localStorage.getItem('token') + const response = await fetch(url, { + headers: { + Authorization: 'Bearer ' + token + } + }) + try { + return await response.json() + } catch (error) { + return null + } } } diff --git a/src/components/Filters.vue b/src/components/Filters.vue index 4e771972de03da52b935aa101769ca88fc0fdbce..dd404d4a9207ff8f4a0a7feec4fc3f5d5c6a0f9c 100644 --- a/src/components/Filters.vue +++ b/src/components/Filters.vue @@ -1,13 +1,16 @@ <template> <b-menu> <div> + <b-menu-list label="Verified"> + <b-checkbox v-model="verifiedOnly" @input="changeTag">Verified models only</b-checkbox> + </b-menu-list> <b-menu-list v-for="category in tags" v-bind:key="category.name" :label="category.name"> - <div v-for="tag in category.tags" v-bind:key="tag.name" class="field"> + <b-field v-for="tag in category.tags" v-bind:key="tag.name"> <b-checkbox :native-value="tag.name" v-model="checkboxGroup" @input="changeTag">{{tag.name}}</b-checkbox> - </div> + </b-field> </b-menu-list> </div> </b-menu> @@ -20,20 +23,12 @@ export default { data () { return { checkboxGroup: [], - perfValue: 0 + verifiedOnly: false } }, methods: { changeTag () { - this.$emit('setTags', this.checkboxGroup, this.convertPerf()) - }, - convertPerf () { - switch (this.perfValue) { - case 0 : return 10 - case 1 : return 100 - case 2 : return 1000 - case 3 : return 10000 - } + this.$emit('setTags', this.checkboxGroup, this.verifiedOnly) } } } diff --git a/src/components/ModelCard.vue b/src/components/ModelCard.vue index 6cd31f9567e6ae0b842178cfec61e9c58304f342..b060b6762e347d3db765fd82a0dc33c494269bed 100644 --- a/src/components/ModelCard.vue +++ b/src/components/ModelCard.vue @@ -5,7 +5,7 @@ <div class="media-content"> <div class="content"> <p> - <strong>{{model.name}}</strong> + <strong>{{model.name}}</strong> <b-icon v-if="model.isVerified" type="is-success" icon="check"/> <br> <small>{{model.author.username}}</small> - <small>{{new Date(model.lastModified).toLocaleDateString()}}</small> <br> diff --git a/src/components/ModelTable.vue b/src/components/ModelTable.vue index 40f4ae081e628d89ae76cf4e1403f88d05cb1ffc..325a331e450894b1733b947afaa114d7733279c2 100644 --- a/src/components/ModelTable.vue +++ b/src/components/ModelTable.vue @@ -2,7 +2,7 @@ <b-table :data="models" :loading="isLoading" striped hoverable> <template slot-scope="props"> <b-table-column field="name" label="Model name" searchable sortable> - {{ props.row.name }} + {{ props.row.name }} <b-icon v-if="props.row.isVerified" icon="check"/> </b-table-column> <b-table-column field="vote" label="Votes" sortable> diff --git a/src/views/Admin.vue b/src/views/Admin.vue index faffdeffc47d39c7260e566531adb54f84eb12ef..505e8ce6b5ed99937d973ca52ab6d441e670e3cc 100644 --- a/src/views/Admin.vue +++ b/src/views/Admin.vue @@ -10,20 +10,26 @@ {{ props.row.name }} </b-table-column> + <b-table-column field="verified" label="Verified status" sortable> + <b-icon v-if="props.row.isVerified" icon="check"/> + <b-icon v-else icon="close"/> + </b-table-column> + <b-table-column field="vote" label="Votes" sortable> {{ props.row.votes }} </b-table-column> <b-table-column field="date" label="Last modification" centered sortable> - {{ new Date(props.row.modificationDate).toLocaleDateString() }} + {{ new Date(props.row.lastModified).toLocaleDateString() }} </b-table-column> <b-table-column field="date" label="Added" centered sortable> - {{ new Date(props.row.addedDate).toLocaleDateString() }} + {{ new Date(props.row.added).toLocaleDateString() }} </b-table-column> <b-table-column label="" centered> <b-button class="actionButton" icon-left="eye" type="is-info" tag="router-link" :to="{ name: 'Model', query: { id: props.row.id } }" outlined/> + <b-button class="actionButton" icon-left="check" type="is-success" @click="setVerifiedPrompt(props.row.id, props.row.name)" outlined/> <b-button class="actionButton" icon-left="delete" type="is-danger" @click="removePrompt(props.row.id, props.row.name, 'model')" outlined/> </b-table-column> </template> @@ -136,11 +142,11 @@ export default { hasIcon: true, onConfirm: async () => { switch (mode) { - case 'user' : api.removeUser(id); break - case 'model' : api.removeModel(id); break - case 'tag' : api.removeTag(id); break - case 'category' : api.removeCategory(id); break - case 'comment' : api.removeComment(id); break + case 'user' : await api.removeUser(id); break + case 'model' : await api.removeModel(id); break + case 'tag' : await api.removeTag(id); break + case 'category' : await api.removeCategory(id); break + case 'comment' : await api.removeComment(id); break } this.$buefy.toast.open(name + ' deleted') this.modelList = await api.getModelList() @@ -175,6 +181,20 @@ export default { this.tagList = await api.getTags() } }) + }, + setVerifiedPrompt (id, name) { + this.$buefy.dialog.confirm({ + message: 'Set verified status for ' + name + ' ?', + cancelText: 'Abort', + confirmText: 'Set', + type: 'is-success', + hasIcon: true, + onConfirm: async () => { + await api.setVerified(id) + this.$buefy.toast.open(name + ' verified status has been changed') + this.modelList = await api.getModelList() + } + }) } } } diff --git a/src/views/Model.vue b/src/views/Model.vue index 1969ae6b0489f13a5b259ed5e11251bd59648d6a..bee31850496dae3eb98445aec406f368d7d192dc 100644 --- a/src/views/Model.vue +++ b/src/views/Model.vue @@ -7,7 +7,7 @@ <div v-else> <div class="columns box"> <div class="column is-two-thirds"> - <h1 class="title is-1">{{model.name}}</h1> + <h1 class="title is-1">{{model.name}} <b-tag v-if="model.isVerified" type="is-success" size="is-large">Verified</b-tag></h1> <h2 class="subtitle">{{model.shortDescription}}</h2> <b-taglist> <b-tag v-for="tag in model.tags" v-bind:key="tag.name" type="is-info">{{tag.name}}</b-tag> diff --git a/src/views/Search.vue b/src/views/Search.vue index 217c53f02d53db65515309a9702573130e3c7043..61995af5df23da5cdee31972d350311440e7e6f6 100644 --- a/src/views/Search.vue +++ b/src/views/Search.vue @@ -54,6 +54,7 @@ export default { paramTags: '', paramSearch: '', paramOrder: '', + paramVerified: false, resultSize: 10, page: 1, isLoading: true @@ -78,9 +79,9 @@ export default { this.paramOrder = order this.result = await api.search(this.paramSearch, this.paramTags, null, this.paramOrder, this.resultSize, this.page) }, - async setTags (tags, perfValue) { + async setTags (tags, verifiedOnly) { this.paramTags = tags - this.paramPerf = perfValue + this.paramVerified = verifiedOnly this.result = await api.search(this.paramSearch, this.paramTags, null, this.paramOrder, this.resultSize, this.page) } }