Compare commits
2 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| b8e08d1a97 | |||
| fd341cb22a |
+2
-2
@@ -39,8 +39,8 @@ android {
|
||||
applicationId 'ru.forbion.f7cloud.mobile'
|
||||
minSdk 26
|
||||
targetSdk 36
|
||||
versionCode 136
|
||||
versionName '0.5.128'
|
||||
versionCode 137
|
||||
versionName '0.5.129'
|
||||
missingDimensionStrategy 'default', 'f7'
|
||||
multiDexEnabled true
|
||||
|
||||
|
||||
@@ -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 = {
|
||||
|
||||
@@ -0,0 +1,5 @@
|
||||
<svg width="25" height="25" viewBox="0 0 25 25" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M6 7.5H19.5341" stroke="#808080" stroke-width="1.15" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M6 12.5H19.5" stroke="#808080" stroke-width="1.15" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M6 17.5H19.5" stroke="#808080" stroke-width="1.15" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 432 B |
@@ -0,0 +1,5 @@
|
||||
<svg width="25" height="25" viewBox="0 0 25 25" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M21.0755 4.16406L3.39658 4.16406C2.71318 4.16406 2.15918 4.71777 2.15918 5.4008L2.15918 19.0967C2.15918 19.7797 2.71318 20.3335 3.39658 20.3335H21.0755C21.7589 20.3335 22.3129 19.7797 22.3129 19.0967V5.4008C22.3129 4.71777 21.7589 4.16406 21.0755 4.16406Z" stroke="#808080" stroke-width="1.15" stroke-miterlimit="10"/>
|
||||
<path d="M9.10286 12.375L2.60676 18.15C1.74915 18.9153 2.28822 20.3357 3.43986 20.3357H21.033C22.1846 20.3357 22.7237 18.9153 21.8661 18.15L15.37 12.375" stroke="#808080" stroke-width="1.15" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M12.6101 14.5783L21.8661 6.34978C22.7237 5.58447 22.1846 4.16406 21.033 4.16406L3.43986 4.16406C2.28822 4.16406 1.74915 5.58447 2.60676 6.34978L11.8628 14.5783C12.0772 14.7681 12.4018 14.7681 12.6101 14.5783Z" stroke="#808080" stroke-width="1.15" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 976 B |
@@ -0,0 +1,14 @@
|
||||
<svg width="25" height="25" viewBox="0 0 25 25" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<g clip-path="url(#clip0_mobile_spreed)">
|
||||
<path d="M11.1875 19.743V18.7995C11.1875 18.3126 11.5822 17.918 12.069 17.918H13.3336C13.8204 17.918 14.2151 18.3126 14.2151 18.7995V19.743C14.2151 20.2298 13.8204 20.6245 13.3336 20.6245H12.069C11.5822 20.6245 11.1875 20.2298 11.1875 19.743Z" fill="#FBFBFB" stroke="#808080" stroke-width="1.15"/>
|
||||
<path d="M7.09047 15.9141C8.56573 17.3894 10.4773 18.1623 12.4098 18.2329C14.5365 18.3106 16.6884 17.5376 18.3119 15.9141C21.4106 12.8154 21.4106 7.7915 18.3119 4.69274C15.2131 1.59398 10.1892 1.59398 7.09047 4.69274C3.99171 7.7915 3.99171 12.8154 7.09047 15.9141Z" fill="#FBFBFB" stroke="#808080" stroke-width="1.15" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M10.1764 12.8321C10.8403 13.496 11.7005 13.8438 12.5701 13.8755C13.527 13.9105 14.4954 13.5627 15.2259 12.8321C16.6203 11.4377 16.6203 9.17699 15.2259 7.78258C13.8315 6.38816 11.5708 6.38816 10.1764 7.78258C8.782 9.17699 8.782 11.4377 10.1764 12.8321Z" fill="#FBFBFB" stroke="#808080" stroke-width="1.15" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M12.1779 5.30035C12.3155 5.43795 12.4938 5.51003 12.674 5.51662C12.8723 5.52386 13.073 5.45177 13.2245 5.30035C13.5135 5.01134 13.5135 4.54278 13.2245 4.25376C12.9355 3.96475 12.4669 3.96475 12.1779 4.25376C11.8889 4.54278 11.8889 5.01134 12.1779 5.30035Z" fill="#808080"/>
|
||||
<path d="M7.47754 22.1609V21.2174C7.47754 20.7306 7.8722 20.3359 8.35905 20.3359H17.0433C17.5302 20.3359 17.9248 20.7306 17.9248 21.2174V22.1609C17.9248 22.6478 17.5302 23.0425 17.0433 23.0425H8.35905C7.87221 23.0425 7.47754 22.6478 7.47754 22.1609Z" fill="#FBFBFB" stroke="#808080" stroke-width="1.15"/>
|
||||
</g>
|
||||
<defs>
|
||||
<clipPath id="clip0_mobile_spreed">
|
||||
<rect width="22.0417" height="23" fill="white" transform="translate(1.47949 1)"/>
|
||||
</clipPath>
|
||||
</defs>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.9 KiB |
@@ -0,0 +1,12 @@
|
||||
<svg width="25" height="25" viewBox="0 0 25 25" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M3 20.0191V4.98038C3 3.88665 3.88665 3 4.98038 3H20.0196C21.1133 3 22 3.88665 22 4.98038V20.0191C22 21.1131 21.1131 22 20.0191 22H4.98087C3.88687 22 3 21.1131 3 20.0191Z" fill="#FBFBFB" stroke="#808080" stroke-width="1.15"/>
|
||||
<path d="M3 8.48077V4.98087C3 3.88687 3.88687 3 4.98087 3H20.0191C21.1131 3 22 3.88687 22 4.98087V8.48077H3Z" fill="#FBFBFB" stroke="#808080" stroke-width="1.15"/>
|
||||
<mask id="path-3-inside-1_mobile_tasks" fill="white">
|
||||
<rect x="5" y="10.6211" width="9.20801" height="4" rx="0.730769"/>
|
||||
</mask>
|
||||
<rect x="5" y="10.6211" width="9.20801" height="4" rx="0.730769" stroke="#808080" stroke-width="2.3" mask="url(#path-3-inside-1_mobile_tasks)"/>
|
||||
<mask id="path-4-inside-2_mobile_tasks" fill="white">
|
||||
<rect x="7" y="15.6211" width="13" height="4" rx="0.730769"/>
|
||||
</mask>
|
||||
<rect x="7" y="15.6211" width="13" height="4" rx="0.730769" stroke="#808080" stroke-width="2.3" mask="url(#path-4-inside-2_mobile_tasks)"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.0 KiB |
@@ -0,0 +1,3 @@
|
||||
<svg width="25" height="25" viewBox="0 0 25 25" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M14.9847 20L7.43923 13.1999C7.01817 12.8204 7.01861 12.1598 7.44019 11.7809L14.9847 5" stroke="#808080" stroke-width="1.73077" stroke-linecap="round"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 264 B |
+4
-6
@@ -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,
|
||||
),
|
||||
|
||||
+19
-17
@@ -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,
|
||||
|
||||
@@ -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 },
|
||||
|
||||
Reference in New Issue
Block a user