fix: нижняя панель 1:1 с сайтом (Задачи + mobile-иконки); Deck открывается устойчиво

Нижняя панель (по layout.user.php сайта): средняя кнопка = ЗАДАЧИ
(была Карточки) — по решению владельца «как на сайте»; иконки из
набора mobile-*-icon (плоский конверт mobile-mail-icon вместо
конверта-с-@, mobile-tasks-icon, mobile-spreed-icon вебкамера,
mobile-burger-icon), локально/офлайн; размеры 25dp (app-link) как
на сайте, стрелка «назад» 18dp. Карточки остаются в шторке-меню.

Deck: loadBoardDetail больше не рушится, если GET /boards/{id}
(метки/права) не отвечает — стеки грузятся всё равно (вероятная
причина «доска не открывается» на устройстве). Заголовок/метки/права
подставляются best-effort.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
b-dev-mobile
2026-07-10 06:43:56 +00:00
parent b8a40afe3a
commit fd341cb22a
9 changed files with 77 additions and 30 deletions
@@ -50,9 +50,17 @@ class DeckRepository {
suspend fun loadBoardDetail(session: AuthSession, boardId: Int): DeckBoardDetail {
val c = client(session)
val board = getJson(c, "${apiBase(session)}/boards/$boardId") as JSONObject
val labels = parseLabels(board.optJSONArray("labels"))
val canEdit = board.optJSONObject("permissions")?.optBoolean("PERMISSION_EDIT", true) ?: true
// Доска-объект (метки/права) — НЕ критична: если запрос упадёт, доску всё равно
// открываем со стеками (раньше был баг — сбой board#read рушил всю загрузку).
var boardTitle = ""
var labels = emptyList<DeckLabel>()
var canEdit = true
runCatching { getJson(c, "${apiBase(session)}/boards/$boardId") as JSONObject }
.onSuccess { board ->
boardTitle = board.optString("title")
labels = parseLabels(board.optJSONArray("labels"))
canEdit = board.optJSONObject("permissions")?.optBoolean("PERMISSION_EDIT", true) ?: true
}
val stacksJson = getJson(c, "${apiBase(session)}/boards/$boardId/stacks") as? JSONArray ?: JSONArray()
val stacks = mutableListOf<DeckStack>()
for (i in 0 until stacksJson.length()) {
@@ -74,7 +82,7 @@ class DeckRepository {
}
return DeckBoardDetail(
boardId = boardId,
title = board.optString("title"),
title = boardTitle,
canEdit = canEdit,
labels = labels,
stacks = stacks.sortedBy { it.order },