diff options
Diffstat (limited to 'src/site/pages/dashboard/admin/file/_id.vue')
| -rw-r--r-- | src/site/pages/dashboard/admin/file/_id.vue | 176 |
1 files changed, 176 insertions, 0 deletions
diff --git a/src/site/pages/dashboard/admin/file/_id.vue b/src/site/pages/dashboard/admin/file/_id.vue new file mode 100644 index 0000000..135d066 --- /dev/null +++ b/src/site/pages/dashboard/admin/file/_id.vue @@ -0,0 +1,176 @@ +<style lang="scss" scoped> + .underline { text-decoration: underline; } +</style> +<template> + <section class="section is-fullheight dashboard"> + <div class="container"> + <div class="columns"> + <div class="column is-narrow"> + <Sidebar /> + </div> + <div class="column"> + <h2 class="subtitle"> + File details + </h2> + <hr> + + <div class="columns"> + <div class="column is-6"> + <b-field + label="ID" + horizontal> + <span>{{ admin.file.id }}</span> + </b-field> + + <b-field + label="Name" + horizontal> + <span>{{ admin.file.name }}</span> + </b-field> + + <b-field + label="Original Name" + horizontal> + <span>{{ admin.file.original }}</span> + </b-field> + + <b-field + label="IP" + horizontal> + <span class="underline">{{ admin.file.ip }}</span> + </b-field> + + <b-field + label="Link" + horizontal> + <a + :href="admin.file.url" + target="_blank">{{ admin.file.url }}</a> + </b-field> + + <b-field + label="Size" + horizontal> + <span>{{ formatBytes(admin.file.size) }}</span> + </b-field> + + <b-field + label="Hash" + horizontal> + <span>{{ admin.file.hash }}</span> + </b-field> + + <b-field + label="Uploaded" + horizontal> + <span><timeago :since="admin.file.createdAt" /></span> + </b-field> + </div> + <div class="column is-6"> + <b-field + label="User Id" + horizontal> + <span>{{ admin.user.id }}</span> + </b-field> + + <b-field + label="Username" + horizontal> + <span>{{ admin.user.username }}</span> + </b-field> + + <b-field + label="Enabled" + horizontal> + <span>{{ admin.user.enabled }}</span> + </b-field> + + <b-field + label="Registered" + horizontal> + <span><timeago :since="admin.user.createdAt" /></span> + </b-field> + + <b-field + label="Files" + horizontal> + <span> + <nuxt-link :to="`/dashboard/admin/user/${admin.user.id}`">{{ admin.user.fileCount }}</nuxt-link> + </span> + </b-field> + </div> + </div> + + <div class="mb2 mt2 text-center"> + <b-button + v-if="admin.user.id !== auth.user.id" + type="is-danger" + @click="promptBanIP"> + Ban IP + </b-button> + <b-button + v-if="admin.user.id !== auth.user.id" + type="is-danger" + @click="promptDisableUser"> + Disable user + </b-button> + </div> + </div> + </div> + </div> + </section> +</template> + +<script> +import { mapState } from 'vuex'; +import Sidebar from '~/components/sidebar/Sidebar.vue'; + +export default { + components: { + Sidebar + }, + middleware: ['auth', 'admin', ({ route, store }) => { + try { + store.dispatch('admin/fetchFile', route.params.id); + } catch (e) { + // eslint-disable-next-line no-console + console.error(e); + } + }], + computed: mapState(['admin', 'auth']), + methods: { + promptDisableUser() { + this.$buefy.dialog.confirm({ + type: 'is-danger', + message: 'Are you sure you want to disable the account of the user that uploaded this file?', + onConfirm: () => this.disableUser() + }); + }, + disableUser() { + this.$handler.executeAction('admin/disableUser', this.user.id); + }, + promptBanIP() { + this.$buefy.dialog.confirm({ + type: 'is-danger', + message: 'Are you sure you want to ban the IP this file was uploaded from?', + onConfirm: () => this.banIP() + }); + }, + banIP() { + this.$handler.executeAction('admin/banIP', this.file.ip); + }, + formatBytes(bytes, decimals = 2) { + if (bytes === 0) return '0 Bytes'; + + const k = 1024; + const dm = decimals < 0 ? 0 : decimals; + const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']; + + const i = Math.floor(Math.log(bytes) / Math.log(k)); + + // eslint-disable-next-line no-mixed-operators + return `${parseFloat((bytes / k ** i).toFixed(dm))} ${sizes[i]}`; + } + } +}; +</script> |