diff --git a/app/src/main/java/ru/forbion/f7cloud/mobile/ui/AppScaffold.kt b/app/src/main/java/ru/forbion/f7cloud/mobile/ui/AppScaffold.kt
index d123553..148b228 100644
--- a/app/src/main/java/ru/forbion/f7cloud/mobile/ui/AppScaffold.kt
+++ b/app/src/main/java/ru/forbion/f7cloud/mobile/ui/AppScaffold.kt
@@ -469,10 +469,10 @@ fun AppScaffold(
activeTab = AppTab.Mail
}
},
- onCardsClick = {
- if (activeTab != AppTab.Deck) {
+ onTasksClick = {
+ if (activeTab != AppTab.Tasks) {
pushTabHistory(activeTab)
- activeTab = AppTab.Deck
+ activeTab = AppTab.Tasks
}
},
onConferencesClick = {
diff --git a/core/designsystem/src/main/assets/menu/mobile-burger-icon.svg b/core/designsystem/src/main/assets/menu/mobile-burger-icon.svg
new file mode 100644
index 0000000..653853e
--- /dev/null
+++ b/core/designsystem/src/main/assets/menu/mobile-burger-icon.svg
@@ -0,0 +1,5 @@
+
diff --git a/core/designsystem/src/main/assets/menu/mobile-mail-icon.svg b/core/designsystem/src/main/assets/menu/mobile-mail-icon.svg
new file mode 100644
index 0000000..c889812
--- /dev/null
+++ b/core/designsystem/src/main/assets/menu/mobile-mail-icon.svg
@@ -0,0 +1,5 @@
+
diff --git a/core/designsystem/src/main/assets/menu/mobile-spreed-icon.svg b/core/designsystem/src/main/assets/menu/mobile-spreed-icon.svg
new file mode 100644
index 0000000..0429be7
--- /dev/null
+++ b/core/designsystem/src/main/assets/menu/mobile-spreed-icon.svg
@@ -0,0 +1,14 @@
+
diff --git a/core/designsystem/src/main/assets/menu/mobile-tasks-icon.svg b/core/designsystem/src/main/assets/menu/mobile-tasks-icon.svg
new file mode 100644
index 0000000..d9f4849
--- /dev/null
+++ b/core/designsystem/src/main/assets/menu/mobile-tasks-icon.svg
@@ -0,0 +1,12 @@
+
diff --git a/core/designsystem/src/main/assets/menu/sidebar-chevron-left.svg b/core/designsystem/src/main/assets/menu/sidebar-chevron-left.svg
new file mode 100644
index 0000000..61a0ea5
--- /dev/null
+++ b/core/designsystem/src/main/assets/menu/sidebar-chevron-left.svg
@@ -0,0 +1,3 @@
+
diff --git a/core/designsystem/src/main/java/ru/forbion/f7cloud/core/designsystem/F7BottomBarConfig.kt b/core/designsystem/src/main/java/ru/forbion/f7cloud/core/designsystem/F7BottomBarConfig.kt
index 42e51c3..5f1ed05 100644
--- a/core/designsystem/src/main/java/ru/forbion/f7cloud/core/designsystem/F7BottomBarConfig.kt
+++ b/core/designsystem/src/main/java/ru/forbion/f7cloud/core/designsystem/F7BottomBarConfig.kt
@@ -4,7 +4,7 @@ enum class F7BottomBarSlot {
Chats,
NavBack,
SectionMail,
- SectionCards,
+ SectionTasks,
SectionConferences,
Menu,
}
@@ -15,10 +15,8 @@ data class F7BottomBarConfig(
val buttonCount: Int get() = slots.size
companion object {
- // Единая навигационная панель по дизайну «Новое меню»:
- // слева «назад», затем ярлыки-разделы Почта · Карточки · Конференции,
- // справа — выдвижное меню. Кнопки «чаты» (по просьбе владельца убрана),
- // профиль/уведомления/настройки/создать в панели нет (меню и шапки экранов).
+ // Нижняя панель 1:1 с мобильным сайтом forbion (layout.user.php):
+ // «назад», затем ярлыки-разделы Почта · Задачи · Конференции, справа — меню.
@Suppress("UNUSED_PARAMETER")
fun forContext(
tabKey: String,
@@ -27,7 +25,7 @@ data class F7BottomBarConfig(
listOf(
F7BottomBarSlot.NavBack,
F7BottomBarSlot.SectionMail,
- F7BottomBarSlot.SectionCards,
+ F7BottomBarSlot.SectionTasks,
F7BottomBarSlot.SectionConferences,
F7BottomBarSlot.Menu,
),
diff --git a/core/designsystem/src/main/java/ru/forbion/f7cloud/core/designsystem/F7MobileBottomBar.kt b/core/designsystem/src/main/java/ru/forbion/f7cloud/core/designsystem/F7MobileBottomBar.kt
index 6075a7e..72d869c 100644
--- a/core/designsystem/src/main/java/ru/forbion/f7cloud/core/designsystem/F7MobileBottomBar.kt
+++ b/core/designsystem/src/main/java/ru/forbion/f7cloud/core/designsystem/F7MobileBottomBar.kt
@@ -30,19 +30,24 @@ data class F7BottomBarActions(
val onChatsClick: () -> Unit = {},
val onNavBackClick: () -> Unit = {},
val onMailClick: () -> Unit = {},
- val onCardsClick: () -> Unit = {},
+ val onTasksClick: () -> Unit = {},
val onConferencesClick: () -> Unit = {},
val onMenuClick: () -> Unit = {},
)
+// Иконки нижней панели — ЛОКАЛЬНЫЕ mobile-*-icon из живой темы (assets/menu/), 1:1 с сайтом.
+private fun barIcon(name: String): String = "file:///android_asset/menu/$name"
+
// Живой forbion (_header.css .header__mobile-bottom): пилюля 328×61, паддинг 3,
// фон #F5F5F5; кнопки 55, фон #FBFBFB, рамка #E6E6E6; активная кнопка-раздел и открытый
// бургер — полупрозрачный зелёный градиент 104°.
private val BottomBarWidth = 328.dp
private val BottomBarHeight = 61.dp
private val BottomBarButtonSize = 55.dp
-private val BottomBarIconSize = 34.dp
-private val BottomBarSectionIconSize = 46.dp
+// Живой сайт: app-link/бургер img = 25px; стрелка «назад» мельче.
+private val BottomBarIconSize = 25.dp
+private val BottomBarSectionIconSize = 25.dp
+private val BottomBarBackIconSize = 18.dp
private val BottomBarOuterPadding = 3.dp
private val BottomBarButtonShape = RoundedCornerShape(100.dp)
private val BottomBarButtonBg = Color(0xFFFBFBFB)
@@ -94,38 +99,35 @@ fun F7MobileBottomBar(
onClick = actions.onChatsClick,
)
F7BottomBarSlot.NavBack -> F7BottomBarIconSlot(
- iconUrl = "$base/themes/forbion/images/header/sidebar-chevron-left.svg",
- contentDescription = "Папки",
+ iconUrl = barIcon("sidebar-chevron-left.svg"),
+ contentDescription = "Назад",
+ iconSize = BottomBarBackIconSize,
iconRotation = if (navBackHighlighted) 180f else 0f,
onClick = actions.onNavBackClick,
)
F7BottomBarSlot.SectionMail -> F7BottomBarIconSlot(
- iconUrl = "$base/themes/forbion/images/header/mail-header-icon.svg",
+ iconUrl = barIcon("mobile-mail-icon.svg"),
contentDescription = "Почта",
iconSize = BottomBarSectionIconSize,
active = activeTabKey.equals("mail", ignoreCase = true),
onClick = actions.onMailClick,
)
- F7BottomBarSlot.SectionCards -> F7BottomBarIconSlot(
- iconUrl = "$base/themes/forbion/images/header/deck-header-icon.svg",
- contentDescription = "Карточки",
+ F7BottomBarSlot.SectionTasks -> F7BottomBarIconSlot(
+ iconUrl = barIcon("mobile-tasks-icon.svg"),
+ contentDescription = "Задачи",
iconSize = BottomBarSectionIconSize,
- active = activeTabKey.equals("deck", ignoreCase = true),
- onClick = actions.onCardsClick,
+ active = activeTabKey.equals("tasks", ignoreCase = true),
+ onClick = actions.onTasksClick,
)
F7BottomBarSlot.SectionConferences -> F7BottomBarIconSlot(
- iconUrl = "$base/themes/forbion/images/header/spreed-header-icon.svg",
+ iconUrl = barIcon("mobile-spreed-icon.svg"),
contentDescription = "Конференции",
iconSize = BottomBarSectionIconSize,
active = activeTabKey.equals("talk", ignoreCase = true),
onClick = actions.onConferencesClick,
)
F7BottomBarSlot.Menu -> F7BottomBarIconSlot(
- iconUrl = if (menuOpen) {
- "$base/themes/forbion/images/header/menu-burger-green.svg"
- } else {
- "$base/themes/forbion/images/header/menu-burger-gray.svg"
- },
+ iconUrl = barIcon("mobile-burger-icon.svg"),
contentDescription = "Меню",
active = menuOpen,
showBadge = showNotificationBadge,
diff --git a/feature/deck/src/main/java/ru/forbion/f7cloud/feature/deck/DeckRepository.kt b/feature/deck/src/main/java/ru/forbion/f7cloud/feature/deck/DeckRepository.kt
index 5ef1279..984900e 100644
--- a/feature/deck/src/main/java/ru/forbion/f7cloud/feature/deck/DeckRepository.kt
+++ b/feature/deck/src/main/java/ru/forbion/f7cloud/feature/deck/DeckRepository.kt
@@ -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()
+ 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()
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 },