141 lines
5.7 KiB
Text
141 lines
5.7 KiB
Text
---
|
||
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>
|