Веб-морда: поиск, фильтры, сортировка и пагинация клиентов; раскладка настроек
- список клиентов: поиск по домену и названию, фильтр по статусу (чипы со счётчиками), сортировка по любой колонке, пагинация 10/25/50/100; состояние в URL — отфильтрованный вид можно сохранить ссылкой - размеры последних бэкапов одним запросом вместо запроса на клиента - шапка выровнена по колонке контента; настройки на всю ширину: ntfy и Telegram двумя карточками, на узком экране — друг под другом Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
c6942605c1
commit
83832fc734
8 files changed
+626
-179
No files matched your search
@@ -325,6 +325,25 @@ func (s *Store) ListBackups(clientID int64, status string) ([]*Backup, error) {
|
||||
return out, nil
|
||||
}
|
||||
|
||||
// LastSizes возвращает размер последнего успешного бэкапа по каждому клиенту одним запросом.
|
||||
func (s *Store) LastSizes() (map[int64]int64, error) {
|
||||
rows, err := s.db.Query(`SELECT client_id, total_size FROM backups b WHERE status = ?1 AND id = (
|
||||
SELECT id FROM backups WHERE client_id = b.client_id AND status = ?1 ORDER BY created_at DESC, id DESC LIMIT 1)`, StatusComplete)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
defer rows.Close()
|
||||
out := map[int64]int64{}
|
||||
for rows.Next() {
|
||||
var id, size int64
|
||||
if err := rows.Scan(&id, &size); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
out[id] = size
|
||||
}
|
||||
return out, rows.Err()
|
||||
}
|
||||
|
||||
// LatestComplete возвращает последний успешный бэкап клиента.
|
||||
func (s *Store) LatestComplete(clientID int64) (*Backup, error) {
|
||||
var id int64
|
||||
|
||||
Reference in new issue
Block a user