1
0
Fork 0
mirror of https://github.com/anyproto/anytype-kotlin.git synced 2025-06-08 05:47:05 +09:00

DROID-3571 Primitives | Space types and properties, sections ui (#2319)

This commit is contained in:
Konstantin Ivanov 2025-04-15 18:42:51 +02:00 committed by GitHub
parent d0c3412e8c
commit f69d922791
Signed by: github
GPG key ID: B5690EEEBB952194
12 changed files with 425 additions and 86 deletions

View file

@ -20,6 +20,7 @@ import androidx.compose.ui.unit.dp
import com.anytypeio.anytype.core_ui.R
import com.anytypeio.anytype.core_ui.common.DefaultPreviews
import com.anytypeio.anytype.core_ui.views.BodyCalloutRegular
import com.anytypeio.anytype.core_ui.views.ButtonPrimary
import com.anytypeio.anytype.core_ui.views.ButtonSecondary
import com.anytypeio.anytype.core_ui.views.ButtonSize
import com.anytypeio.anytype.core_ui.views.HeadlineHeading
@ -91,12 +92,12 @@ fun LocalInfoScreen(
text = stringResource(description)
)
Spacer(modifier = Modifier.height(30.dp))
ButtonSecondary(
ButtonPrimary(
modifier = Modifier
.fillMaxWidth()
.padding(horizontal = 20.dp),
text = stringResource(R.string.object_type_fields_local_info_button),
size = ButtonSize.LargeSecondary,
size = ButtonSize.Large,
onClick = {
onDismiss()
}

View file

@ -1,9 +1,10 @@
package com.anytypeio.anytype.feature_object_type.ui.space
import android.os.Build
import androidx.compose.foundation.ExperimentalFoundationApi
import androidx.compose.foundation.Image
import androidx.compose.foundation.background
import androidx.compose.foundation.clickable
import androidx.compose.foundation.combinedClickable
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
@ -21,10 +22,14 @@ import androidx.compose.foundation.layout.windowInsetsPadding
import androidx.compose.foundation.layout.wrapContentSize
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.rememberLazyListState
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material3.DropdownMenu
import androidx.compose.material3.DropdownMenuItem
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.mutableStateListOf
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment
import androidx.compose.ui.Alignment.Companion.CenterVertically
@ -34,14 +39,17 @@ import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.DpOffset
import androidx.compose.ui.unit.dp
import com.anytypeio.anytype.core_ui.R
import com.anytypeio.anytype.core_ui.common.DefaultPreviews
import com.anytypeio.anytype.core_ui.extensions.swapList
import com.anytypeio.anytype.core_ui.foundation.Divider
import com.anytypeio.anytype.core_ui.foundation.noRippleThrottledClickable
import com.anytypeio.anytype.core_ui.views.Caption1Medium
import com.anytypeio.anytype.core_ui.views.PreviewTitle1Regular
import com.anytypeio.anytype.core_ui.views.Title1
import com.anytypeio.anytype.core_ui.views.UxSmallTextRegular
import com.anytypeio.anytype.core_ui.widgets.ListWidgetObjectIcon
import com.anytypeio.anytype.core_utils.insets.EDGE_TO_EDGE_MIN_SDK
import com.anytypeio.anytype.presentation.objects.ObjectIcon
@ -52,9 +60,10 @@ import com.anytypeio.anytype.presentation.types.UiSpaceTypesScreenState
@Composable
fun SpaceTypesListScreen(
uiState: UiSpaceTypesScreenState,
onTypeClicked: (UiSpaceTypeItem) -> Unit,
onTypeClicked: (UiSpaceTypeItem.Type) -> Unit,
onBackPressed: () -> Unit,
onAddIconClicked: () -> Unit
onAddIconClicked: () -> Unit,
onMoveToBin: (UiSpaceTypeItem.Type) -> Unit
) {
Column(
modifier = Modifier
@ -91,17 +100,24 @@ fun SpaceTypesListScreen(
key = { index -> items[index].id },
itemContent = {
val item = items[it]
Type(
modifier = Modifier
.fillMaxWidth()
.height(52.dp)
.padding(start = 12.dp, end = 20.dp)
.clickable {
onTypeClicked(item)
},
item = item
)
Divider()
when (item) {
is UiSpaceTypeItem.Section -> {
Section(item)
}
is UiSpaceTypeItem.Type -> {
Type(
modifier = Modifier
.fillMaxWidth()
.height(52.dp)
.padding(start = 12.dp, end = 20.dp),
item = item,
onTypeClicked = onTypeClicked,
onMoveToBin = onMoveToBin
)
Divider()
}
}
}
)
item {
@ -115,13 +131,48 @@ fun SpaceTypesListScreen(
}
}
@Composable
private fun Section(section: UiSpaceTypeItem.Section) {
val text = when (section) {
is UiSpaceTypeItem.Section.MyTypes ->
stringResource(R.string.space_types_screen_section_my_types)
is UiSpaceTypeItem.Section.System ->
stringResource(R.string.space_types_screen_section_system_types)
}
Column {
Box(
modifier = Modifier
.fillMaxWidth()
.height(52.dp)
) {
Text(
modifier = Modifier
.padding(bottom = 8.dp, start = 20.dp)
.align(Alignment.BottomStart),
text = text,
style = Caption1Medium,
color = colorResource(R.color.text_secondary),
)
}
}
}
@OptIn(ExperimentalFoundationApi::class)
@Composable
private fun Type(
modifier: Modifier,
item: UiSpaceTypeItem
item: UiSpaceTypeItem.Type,
onTypeClicked: (UiSpaceTypeItem.Type) -> Unit,
onMoveToBin: (UiSpaceTypeItem.Type) -> Unit
) {
val isMenuExpanded = remember { mutableStateOf(false) }
Row(
modifier = modifier.fillMaxWidth(),
modifier = modifier.fillMaxWidth()
.combinedClickable(
onClick = { onTypeClicked(item) },
onLongClick = { isMenuExpanded.value = true }
),
verticalAlignment = CenterVertically
) {
ListWidgetObjectIcon(
@ -141,6 +192,51 @@ private fun Type(
maxLines = 1,
overflow = TextOverflow.Ellipsis
)
if (item.isPossibleMoveToBin) {
ItemDropDownMenu(
item = item,
showMenu = isMenuExpanded.value,
onDismissRequest = { isMenuExpanded.value = false },
onMoveToBin = {
isMenuExpanded.value = false
onMoveToBin(it)
}
)
}
}
}
@Composable
fun ItemDropDownMenu(
item: UiSpaceTypeItem.Type,
showMenu: Boolean,
onDismissRequest: () -> Unit,
onMoveToBin: (UiSpaceTypeItem.Type) -> Unit
) {
DropdownMenu(
modifier = Modifier
.width(244.dp),
expanded = showMenu,
offset = DpOffset(x = 0.dp, y = 0.dp),
onDismissRequest = {
onDismissRequest()
},
shape = RoundedCornerShape(10.dp),
containerColor = colorResource(id = R.color.background_secondary),
) {
DropdownMenuItem(
text = {
Text(
text = stringResource(R.string.space_properties_screen_menu_move_to_bin),
style = UxSmallTextRegular,
color = colorResource(id = R.color.text_primary)
)
},
onClick = {
onMoveToBin(item)
},
)
}
}
@ -208,7 +304,8 @@ fun SpaceTypesListScreenPreview() {
SpaceTypesListScreen(
uiState = UiSpaceTypesScreenState(
items = listOf(
UiSpaceTypeItem(
UiSpaceTypeItem.Section.MyTypes(),
UiSpaceTypeItem.Type(
id = "1",
name = "Type 1",
icon = ObjectIcon.TypeIcon.Default(
@ -216,7 +313,8 @@ fun SpaceTypesListScreenPreview() {
color = CustomIconColor.Teal
)
),
UiSpaceTypeItem(
UiSpaceTypeItem.Section.System(),
UiSpaceTypeItem.Type(
id = "2",
name = "Type 2",
icon = ObjectIcon.TypeIcon.Default(
@ -228,6 +326,7 @@ fun SpaceTypesListScreenPreview() {
),
onBackPressed = {},
onTypeClicked = {},
onAddIconClicked = {}
onAddIconClicked = {},
onMoveToBin = {}
)
}

View file

@ -351,9 +351,10 @@ class ObjectTypeViewModel(
(uiTitleAndIconUpdateState.value as? UiTypeSetupTitleAndIconState.Visible.EditType)?.let {
uiTitleAndIconUpdateState.value = it.copy(icon = newIcon)
}
if (objectPermissions.canDelete) {
uiEditButtonState.value = UiEditButton.Visible
}
//turn off button, we give Move to Bin logic in Library now
// if (objectPermissions.canDelete) {
// uiEditButtonState.value = UiEditButton.Visible
// }
objType.recommendedLayout?.let { layout ->
if (_objectTypePermissionsState.value?.canChangeRecommendedLayoutForThisType == true) {
uiHorizontalButtonsState.value =