Кабинет: поиск клиентов с подсказками, чистая страница документов, ширина настроек

Поиск клиентов (режим сотрудника):
- поле поиска вынесено наверх страницы, рядом «Найти» и «Сбросить»;
- браузер сам подсказывает выпадающим списком по мере ввода — договоры
  депозитария отдаются страницей в <datalist> (скриптов в кабинете нет,
  CSP остаётся строгой), список кэшируется в ядре на 10 минут;
- по запросу фильтруются и учётки кабинета, и договоры депозитария,
  под формой показывается, сколько найдено;
- шаблон LIKE экранируется, чтобы % и _ в номере договора означали себя.

Документы: убраны пустое табло, «Мои заявки» и форма заказа документа —
остался список готовых документов депозитария и пояснение, куда обращаться.

Настройка: колонка сетки больше не растягивается широкой таблицей
(min-width:0), у страницы пропал горизонтальный ползунок.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q4YVo4UMopqT5DzicqpPjL
This commit is contained in:
zuevav
2026-09-18 18:45:54 +03:00
parent 4b80d030ab
commit 683f516d07
7 changed files with 184 additions and 50 deletions
+17 -3
View File
@@ -72,6 +72,18 @@ func New(cfg Config) (*Server, error) {
return strconv.FormatFloat(f, 'f', -1, 64)
},
"fmtmoney": fmtMoney,
// Русское число: 1 договор, 2 договора, 5 договоров.
"plural": func(n int, one, few, many string) string {
w := many
switch m100 := n % 100; {
case m100 >= 11 && m100 <= 14:
case n%10 == 1:
w = one
case n%10 >= 2 && n%10 <= 4:
w = few
}
return strconv.Itoa(n) + " " + w
},
"fmtpct": func(f float64) string {
s := strconv.FormatFloat(f, 'f', 2, 64)
if f > 0 {
@@ -911,7 +923,7 @@ func (s *Server) buildHandler() http.Handler {
return
}
s.render(w, r, "documents", map[string]any{"Nav": "d", "Ready": out.Ready, "Requests": out.Requests,
"Kinds": out.Kinds,
"Kinds": out.Kinds, // форма заказа в клиентском виде скрыта; данные оставлены для API
"From": time.Now().AddDate(0, -1, 0).Format("2006-01-02"), "To": time.Now().Format("2006-01-02")})
})
@@ -1043,7 +1055,8 @@ func (s *Server) buildHandler() http.Handler {
Name string `json:"name"`
Securities int `json:"securities"`
} `json:"depo"`
DepoError string `json:"depo_error"`
DepoError string `json:"depo_error"`
Suggest []string `json:"suggest"`
}
search := strings.TrimSpace(r.URL.Query().Get("search"))
path := "/api/lk/admin/clients"
@@ -1055,7 +1068,8 @@ func (s *Server) buildHandler() http.Handler {
return
}
s.render(w, r, "clients", map[string]any{"Nav": "a", "IsAdmin": true, "Clients": out.Clients,
"Depo": out.Depo, "DepoError": out.DepoError, "Search": search})
"Depo": out.Depo, "DepoError": out.DepoError, "Search": search,
"Suggest": out.Suggest, "Found": len(out.Clients) + len(out.Depo)})
})
// Администратор: войти в кабинет клиента