fileserver/frontend/src/views/AdminView.vue

105 lines
2.9 KiB
Vue
Raw Normal View History

2022-08-25 21:27:39 +02:00
<script setup lang="ts">
2022-08-31 14:28:35 +02:00
import type { TokenInjectType } from "@/api";
import { inject, onBeforeMount, ref } from "vue";
import { Responses, check_token, Admin, isErrorResponse } from "@/api";
import { onBeforeRouteUpdate } from "vue-router";
import router from "@/router";
2022-08-25 21:27:39 +02:00
2022-08-31 14:28:35 +02:00
const jwt = inject<TokenInjectType>("jwt") as TokenInjectType;
2022-08-25 21:27:39 +02:00
const users = ref<Responses.Admin.GetUsersEntry[]>([]);
onBeforeRouteUpdate(async () => {
2022-08-31 14:28:35 +02:00
await updatePanel();
2022-08-25 21:27:39 +02:00
});
onBeforeMount(async () => {
2022-08-31 14:28:35 +02:00
await updatePanel();
2022-08-25 21:27:39 +02:00
});
async function updatePanel() {
2022-08-31 14:28:35 +02:00
const token = await check_token(jwt);
if (!token) return;
2022-08-25 21:27:39 +02:00
2022-08-31 14:28:35 +02:00
const res = await Admin.get_users(token);
if (isErrorResponse(res)) return router.replace({ path: "/" });
users.value = res.users;
2022-08-25 21:27:39 +02:00
}
async function setRole(user: number, roleStr: string) {
2022-08-31 14:28:35 +02:00
const token = await check_token(jwt);
if (!token) return;
2022-08-25 21:27:39 +02:00
2022-08-31 14:28:35 +02:00
const res = await Admin.set_role(user, parseInt(roleStr, 10), token);
if (isErrorResponse(res)) console.error(res.message);
await updatePanel();
2022-08-25 21:27:39 +02:00
}
async function disableTfa(user: number) {
2022-08-31 14:28:35 +02:00
const token = await check_token(jwt);
if (!token) return;
2022-08-25 21:27:39 +02:00
2022-08-31 14:28:35 +02:00
const res = await Admin.disable_tfa(user, token);
if (isErrorResponse(res)) console.error(res.message);
await updatePanel();
2022-08-25 21:27:39 +02:00
}
async function logoutUser(user: number) {
2022-08-31 14:28:35 +02:00
const token = await check_token(jwt);
if (!token) return;
2022-08-25 21:27:39 +02:00
2022-08-31 14:28:35 +02:00
const res = await Admin.logout(user, token);
if (isErrorResponse(res)) console.error(res.message);
await updatePanel();
2022-08-25 21:27:39 +02:00
}
async function deleteUser(user: number) {
2022-08-31 14:28:35 +02:00
const token = await check_token(jwt);
if (!token) return;
2022-08-25 21:27:39 +02:00
2022-08-31 14:28:35 +02:00
const res = await Admin.delete_user(user, token);
if (isErrorResponse(res)) console.error(res.message);
await updatePanel();
2022-08-25 21:27:39 +02:00
}
</script>
<template>
2022-08-31 14:28:35 +02:00
<table>
<tr>
<th>Name</th>
<th>Type</th>
<th>Role</th>
<th>Tfa Status</th>
<th>Actions</th>
</tr>
<tr v-for="user in users" :key="user.id">
<td>{{ user.name }}</td>
<td>{{ user.gitlab ? "Gitlab" : "Password" }}</td>
<td>
<select @change="setRole(user.id, ($event.target as HTMLSelectElement).value)">
<option value="0" :selected="user.role === 0 ? true : undefined">
Disabled
</option>
<option value="1" :selected="user.role === 1 ? true : undefined">
User
</option>
<option value="2" :selected="user.role === 2 ? true : undefined">
Admin
</option>
</select>
</td>
<td v-if="user.gitlab"></td>
<td v-else>
{{ user.tfaEnabled ? "Enabled" : "Disabled" }}
</td>
<td>
<button v-if="user.tfaEnabled" @click="disableTfa(user.id)">
Disable Tfa
</button>
<button @click="logoutUser(user.id)">Logout all</button>
<button @click="deleteUser(user.id)">Delete</button>
</td>
</tr>
</table>
2022-08-25 21:27:39 +02:00
</template>
<style scoped></style>