- выбор → поимённое подтверждение → отчёт: пачка до 20 загрузок, гарды входа на обеих границах, потолок времени и остановка после трёх подряд отказов внешнего сервиса - допуск полного удаления сведён в единую точку store.State.CanDelete() — worker, страница загрузки и Telegram больше не держат своих перечней
55 lines
2.5 KiB
HTML
55 lines
2.5 KiB
HTML
<!doctype html>
|
|
<html lang="ru">
|
|
<head>
|
|
<meta charset="utf-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
<title>jellybit — подтверждение удаления</title>
|
|
<link rel="icon" href="{{asset "favicon.svg"}}" type="image/svg+xml">
|
|
<link rel="stylesheet" href="{{asset "css/jellybit.css"}}">
|
|
</head>
|
|
<body>
|
|
|
|
{{template "header" "delete"}}
|
|
|
|
<main class="main">
|
|
<h1 class="page-title">Подтверждение удаления</h1>
|
|
|
|
<div class="del-warn">
|
|
<h2>Будут снесены раздачи с файлами и сняты библиотечные хардлинки</h2>
|
|
<p class="muted" style="margin:0">
|
|
Действие необратимо: восстановить снесённые файлы нечем. Проверь список
|
|
ниже — удалено будет ровно то, что в нём названо.
|
|
</p>
|
|
</div>
|
|
|
|
<div class="del-list">
|
|
{{range .Rows}}
|
|
<div class="del-row" style="cursor:default">
|
|
<span class="body">
|
|
<span class="name">{{.Title}}</span>
|
|
<span class="meta">
|
|
{{if .Missing}}<span class="last-copy">записи нет — удалять нечего</span>
|
|
{{else if .Unread}}<span class="last-copy">⚠ состояние прочитать не удалось — что именно будет снесено, неизвестно</span>
|
|
{{else}}{{template "status_badge" .State}}{{end}}
|
|
<span class="id">{{.ID}}</span>
|
|
{{if .LastCopy}}<span class="last-copy">⚠ источник пропал: библиотечная ссылка — последняя копия данных</span>{{end}}
|
|
</span>
|
|
</span>
|
|
</div>
|
|
{{end}}
|
|
</div>
|
|
|
|
<!-- Признак подтверждения едет полем формы и проверяется сервером до единого
|
|
вызова удаления. Идентификаторы отправляются заново: исполняющий запрос —
|
|
самостоятельная входная граница, состояний между шагами сервис не хранит. -->
|
|
<form method="post" action="/ui/delete" class="del-bar">
|
|
{{range .Rows}}<input type="hidden" name="id" value="{{.ID}}">{{end}}
|
|
<input type="hidden" name="confirm" value="1">
|
|
<button class="btn btn-danger btn-lg" type="submit">Да, удалить</button>
|
|
<a class="btn" href="/delete">Отмена</a>
|
|
</form>
|
|
|
|
</main>
|
|
</body>
|
|
</html>
|