Added missing file.
This commit is contained in:
parent
1905486d21
commit
ae97fa89e9
|
@ -0,0 +1,131 @@
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { AuthenticationAPIClient, type User, type UserUpdatePayload } from '@/api/auth';
|
||||||
|
import ConfirmDialog from '@/components/ConfirmDialog.vue';
|
||||||
|
import { useAuthStore } from '@/stores/auth';
|
||||||
|
import { onMounted, ref, useTemplateRef, watch, type Ref } from 'vue';
|
||||||
|
|
||||||
|
const authStore = useAuthStore()
|
||||||
|
const apiClient = new AuthenticationAPIClient(authStore)
|
||||||
|
|
||||||
|
interface CreateUserData {
|
||||||
|
username: string
|
||||||
|
password: string
|
||||||
|
}
|
||||||
|
const createUserFormData: Ref<CreateUserData> = ref({ username: '', password: '' })
|
||||||
|
|
||||||
|
const users: Ref<User[]> = ref([])
|
||||||
|
const usersPage: Ref<number> = ref(0)
|
||||||
|
const usersPageSize: Ref<number> = ref(50)
|
||||||
|
|
||||||
|
const deleteUserConfirmDialog = useTemplateRef('deleteUserConfirmDialog')
|
||||||
|
|
||||||
|
onMounted(() => {
|
||||||
|
watch([usersPage, usersPageSize], fetchUsers)
|
||||||
|
fetchUsers()
|
||||||
|
})
|
||||||
|
|
||||||
|
async function fetchUsers() {
|
||||||
|
const result = await apiClient.getUsers(usersPage.value, usersPageSize.value).handleErrorsWithAlert()
|
||||||
|
if (result !== null) {
|
||||||
|
users.value = result
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async function deleteUser(user: User) {
|
||||||
|
const confirm = await deleteUserConfirmDialog.value?.show()
|
||||||
|
if (!confirm) return
|
||||||
|
await apiClient.deleteUser(user.id).handleErrorsWithAlert()
|
||||||
|
fetchUsers() // Refresh the list of users.
|
||||||
|
}
|
||||||
|
|
||||||
|
async function toggleLocked(user: User) {
|
||||||
|
const payload: UserUpdatePayload = {
|
||||||
|
isLocked: !user.isLocked
|
||||||
|
}
|
||||||
|
await apiClient.updateUser(user.id, payload).handleErrorsWithAlert()
|
||||||
|
fetchUsers()
|
||||||
|
}
|
||||||
|
|
||||||
|
async function doCreateUser() {
|
||||||
|
const user = await apiClient.createUser(createUserFormData.value.username, createUserFormData.value.password)
|
||||||
|
.handleErrorsWithAlert()
|
||||||
|
if (user !== null) {
|
||||||
|
createUserFormData.value = {
|
||||||
|
username: '',
|
||||||
|
password: ''
|
||||||
|
}
|
||||||
|
fetchUsers();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
<template>
|
||||||
|
<main>
|
||||||
|
<h1>Administrator Dashboard</h1>
|
||||||
|
<p>
|
||||||
|
On this page, you'll find tools for managing users and checking audit information.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<h3>Users</h3>
|
||||||
|
<div class="button-bar">
|
||||||
|
<button type="button" :disabled="usersPage < 1" @click="usersPage -= 1">Previous Page</button>
|
||||||
|
<span>Page: {{ usersPage }}</span>
|
||||||
|
<button type="button" @click="usersPage += 1">Next Page</button>
|
||||||
|
<select v-model="usersPageSize">
|
||||||
|
<option value="5">5</option>
|
||||||
|
<option value="10">10</option>
|
||||||
|
<option value="50" selected>50</option>
|
||||||
|
<option value="100">100</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
<table>
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>ID</th>
|
||||||
|
<th>Username</th>
|
||||||
|
<th>Created At</th>
|
||||||
|
<th>Admin</th>
|
||||||
|
<th>Locked</th>
|
||||||
|
<th>Actions</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
<tr v-for="user in users" :key="user.id">
|
||||||
|
<td>{{ user.id }}</td>
|
||||||
|
<td>{{ user.username }}</td>
|
||||||
|
<td>{{ new Date(user.createdAt).toLocaleString() }}</td>
|
||||||
|
<td>{{ user.isAdmin }}</td>
|
||||||
|
<td>{{ user.isLocked }}</td>
|
||||||
|
<td>
|
||||||
|
<div>
|
||||||
|
<button type="button" @click="deleteUser(user)">Delete</button>
|
||||||
|
|
||||||
|
<button type="button" @click="toggleLocked(user)" v-text="user.isLocked ? 'Unlock' : 'Lock'"></button>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
<form @submit.prevent="doCreateUser">
|
||||||
|
<h3>Create User</h3>
|
||||||
|
<div>
|
||||||
|
<label for="create-user-username">Username</label>
|
||||||
|
<input id="create-user-username" v-model="createUserFormData.username" type="text" />
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<label for="create-user-password">Password</label>
|
||||||
|
<input id="create-user-password" v-model="createUserFormData.password" type="password" />
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<button type="submit">Create</button>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
|
||||||
|
<ConfirmDialog ref="deleteUserConfirmDialog">
|
||||||
|
<p>
|
||||||
|
Are you sure you want to delete this user?
|
||||||
|
</p>
|
||||||
|
</ConfirmDialog>
|
||||||
|
</main>
|
||||||
|
</template>
|
Loading…
Reference in New Issue