artable/src/pages/users.astro
2023-05-19 21:15:28 +07:00

141 lines
5.7 KiB
Text
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
import Layout from "../layouts/Layout.astro";
import { getUserSession, searchUsers, getSessionUser } from "../db";
import Navbar from "../components/Navbar.astro";
if (Astro.cookies.has("session")) {
const sessId = Astro.cookies.get("session").value!;
const dbSess = await getUserSession(sessId);
if (dbSess === null) {
Astro.cookies.delete("session");
return Astro.redirect("/login");
}
} else {
return Astro.redirect("/login");
}
const sessId = Astro.cookies.get("session").value!;
const user = (await getSessionUser(sessId))!;
const sLogin = Astro.url.searchParams.get("login");
const sFullName = Astro.url.searchParams.get("fullName");
const sIsAdmin = Astro.url.searchParams.get("isAdmin");
const users = await searchUsers({
login: sLogin ? sLogin : undefined,
fullName: sFullName ? sFullName : undefined,
isAdmin: sIsAdmin ? sIsAdmin === "isAdmin" : undefined,
});
---
<Layout title="Пользователи">
<main>
<Navbar is_user_admin={user.is_admin} />
<div class="container mt-4 d-flex flex-column gap-4">
<form class="mb-4" method="GET" action="/users">
<div class="mb-2">
<label for="login" class="form-label">Логин</label>
<input type="text" class="form-control form-control-sm" name="login" id="login" value={Astro.url.searchParams.get("login")} />
</div>
<div class="mb-2">
<label for="fullName" class="form-label">Ф.И.О.</label>
<input type="text" class="form-control form-control-sm" name="fullName" id="fullName" value={Astro.url.searchParams.get("fullName")} />
</div>
<div class="mb-2">
{
sIsAdmin === "isAdmin" ? (
<input class="form-check-input" type="checkbox" value="isAdmin" name="isAdmin" id="isAdmin" checked />
) : (
<input class="form-check-input" type="checkbox" value="isAdmin" name="isAdmin" id="isAdmin" />
)
}
<label class="form-check-label" for="isAdmin">Администратор</label>
</div>
<button type="submit" class="btn btn-sm btn-warning w-100">Найти</button>
</form>
{
users.map((e) => (
<div class="card flex-grow-1">
<div class="card-body">
<h5 class="card-title">{e.fullName}</h5>
<h6 class="card-subtitle mb-2 text-muted">{e.login}</h6>
<div class="d-flex flex-row gap-1">
<a href={`/user/${e.login}`} class="btn btn-primary btn-sm">
Открыть профиль
</a>
{user.is_admin ? (
<button type="button" class="btn btn-primary btn-sm" onclick={`doChangePassword("${e.login}")`}>
Изменить пароль
</button>
<a href={`/timetable?userId=${e.id}`} class="btn btn-primary btn-sm">
Редактировать расписание
</a>
<button type="button" class="btn btn-danger btn-sm" onclick={`doDeleteUser("${e.login}")`}>
Удалить пользователя
</button>
) : null}
</div>
</div>
</div>
))
}
</div>
</main>
</Layout>
<script is:inline>
async function doChangePassword(login) {
const newPassword = prompt("Введите новый пароль пользователя");
if (newPassword === null) return;
try {
const fd = new FormData();
fd.append("login", login);
fd.append("password", newPassword);
const resp = await fetch("/userapi/updatePassword", {
method: "POST",
body: fd,
});
const json = await resp.json();
if (json.ok) {
alert("Успех");
} else {
throw new Error(json.reason);
}
} catch (e) {
console.error(e);
if (e instanceof Error) {
alert(e.message);
} else {
alert("Неизвестная ошибка");
}
}
}
async function doDeleteUser(login) {
const confirmLogin = prompt(`Это действие невозможно отменить. \nВведите логин пользователя '${login}' для подтверждения`);
if (confirmLogin !== login) return;
try {
const fd = new FormData();
fd.append("login", login);
const resp = await fetch("/userapi/deleteUser", {
method: "POST",
body: fd,
});
const json = await resp.json();
if (json.ok) {
location.reload();
} else {
throw new Error(json.reason);
}
} catch (e) {
console.error(e);
if (e instanceof Error) {
alert(e.message);
} else {
alert("Неизвестная ошибка");
}
}
}
</script>