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

DROID-1821 Templates | Simplification of default type in collections (#445)

This commit is contained in:
Konstantin Ivanov 2023-10-17 19:01:36 +02:00 committed by GitHub
parent b304e3f77d
commit 60ab3a0872
Signed by: github
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 44 additions and 228 deletions

View file

@ -230,18 +230,7 @@ fun TypeTemplatesWidget(
)
}
}
val title = when (val s = currentState) {
is TypeTemplatesWidgetUI.Data.CreateObject -> stringResource(R.string.type_templates_widget_title)
is TypeTemplatesWidgetUI.Data.DefaultObject -> {
if (s.isPossibleToChangeType) {
stringResource(R.string.default_object)
} else {
stringResource(R.string.default_template)
}
}
is TypeTemplatesWidgetUI.Init -> ""
}
val title = stringResource(R.string.type_templates_widget_title)
Box(modifier = Modifier.align(Alignment.Center)) {
Text(
text = title,
@ -325,12 +314,10 @@ fun TypeTemplatesWidget(
menuClick = menuClick
)
is TemplateView.Template -> {
val withDefaultForView = currentState is TypeTemplatesWidgetUI.Data.DefaultObject
MoreMenu(
itemId = templateView.id,
currentCoordinates = currentClickedMoreButtonCoordinates,
menuClick = menuClick,
withDefaultForView = withDefaultForView
)
}
is TemplateView.New -> Unit
@ -343,8 +330,7 @@ fun TypeTemplatesWidget(
private fun MoreMenu(
itemId: Id,
currentCoordinates: IntOffset,
menuClick: (TemplateMenuClick) -> Unit,
withDefaultForView: Boolean
menuClick: (TemplateMenuClick) -> Unit
) {
val moreButtonXCoordinatesDp = with(LocalDensity.current) { currentCoordinates.x.toDp() }
val offsetX = if (moreButtonXCoordinatesDp > 244.dp) {
@ -365,13 +351,6 @@ private fun MoreMenu(
elevation = 30.dp
) {
Column {
if (withDefaultForView) {
MenuItem(
click = { menuClick(TemplateMenuClick.Default(itemId)) },
text = stringResource(id = R.string.templates_menu_default_for_view)
)
Divider(paddingStart = 0.dp, paddingEnd = 0.dp)
}
MenuItem(
click = { menuClick(TemplateMenuClick.Edit(itemId)) },
text = stringResource(id = R.string.templates_menu_edit)
@ -509,8 +488,7 @@ private fun TemplatesList(
TemplateItemContent(item)
}
val showMoreButton =
(item is TemplateView.Template && state.isEditing) || (state is TypeTemplatesWidgetUI.Data.DefaultObject && item is TemplateView.Blank && state.isEditing)
val showMoreButton = (item is TemplateView.Template && state.isEditing)
AnimatedVisibility(
visible = showMoreButton,
enter = fadeIn(),
@ -1062,7 +1040,7 @@ fun ComposablePreview() {
coverImage = null,
),
)
val state = TypeTemplatesWidgetUI.Data.CreateObject(
val state = TypeTemplatesWidgetUI.Data(
templates = items,
showWidget = true,
isEditing = true,

View file

@ -52,19 +52,16 @@ import androidx.compose.ui.unit.dp
import androidx.constraintlayout.compose.ConstraintLayout
import androidx.constraintlayout.compose.Dimension
import com.anytypeio.anytype.core_models.DVViewerType
import com.anytypeio.anytype.core_models.ObjectWrapper
import com.anytypeio.anytype.core_ui.R
import com.anytypeio.anytype.core_ui.foundation.Divider
import com.anytypeio.anytype.core_ui.foundation.Dragger
import com.anytypeio.anytype.core_ui.foundation.noRippleThrottledClickable
import com.anytypeio.anytype.core_ui.views.BodyCalloutRegular
import com.anytypeio.anytype.core_ui.views.BodyRegular
import com.anytypeio.anytype.core_ui.views.Caption1Medium
import com.anytypeio.anytype.core_ui.views.Title1
import com.anytypeio.anytype.core_ui.views.UXBody
import com.anytypeio.anytype.presentation.sets.ViewEditAction
import com.anytypeio.anytype.presentation.sets.ViewerEditWidgetUi
import com.anytypeio.anytype.presentation.templates.TemplateView.Companion.DEFAULT_TEMPLATE_ID_BLANK
@OptIn(ExperimentalMaterialApi::class)
@Composable
@ -191,30 +188,6 @@ fun ViewerEditWidgetContent(
}
NameTextField(state = currentState, action = action)
Spacer(modifier = Modifier.height(12.dp))
if (state.isDefaultObjectTypeEnabled) {
ColumnItem(
title = stringResource(id = R.string.default_object),
value = state.defaultObjectType?.name.orEmpty(),
isEnable = true
) {
action(ViewEditAction.DefaultObjectType(id = state.id))
}
Divider(paddingStart = 0.dp, paddingEnd = 0.dp)
} else {
val templateName = if (state.defaultTemplateId == DEFAULT_TEMPLATE_ID_BLANK) {
stringResource(id = R.string.blank)
} else {
state.defaultTemplateName.orEmpty()
}
ColumnItem(
title = stringResource(id = R.string.default_template),
value = templateName,
isEnable = true
) {
action(ViewEditAction.DefaultTemplate(id = state.id))
}
Divider(paddingStart = 0.dp, paddingEnd = 0.dp)
}
val layoutValue = when (state.layout) {
DVViewerType.LIST -> stringResource(id = R.string.view_list)
@ -393,15 +366,11 @@ fun PreviewViewerEditWidget() {
showMore = false,
isNewMode = true,
name = "Artist",
defaultObjectType = ObjectWrapper.Type(buildMap { put("name", "Name") }),
filters = listOf(),
sorts = emptyList(),
layout = DVViewerType.LIST,
relations = listOf(),
id = "1",
defaultTemplateId = "1",
isDefaultObjectTypeEnabled = false,
defaultTemplateName = null,
isActive = false
)
ViewerEditWidget(state = state, action = {})

View file

@ -300,9 +300,6 @@ class ObjectSetViewModel(
if (dataView != null && pair != null) {
viewerEditWidgetState.value = pair.first.toViewerEditWidgetState(
storeOfRelations = storeOfRelations,
storeOfObjectTypes = storeOfObjectTypes,
isDefaultObjectTypeEnabled = dataView.isChangingDefaultTypeAvailable(),
details = dataView.details,
index = pair.second,
session = session
)
@ -1543,22 +1540,7 @@ class ObjectSetViewModel(
showTypeTemplatesWidget(
getViewer = { it?.viewerByIdOrFirst(session.currentViewerId.value) },
createState = { viewer ->
TypeTemplatesWidgetUI.Data.CreateObject(
showWidget = true,
isEditing = false,
viewerId = viewer.id,
isPossibleToChangeType = isPossibleToChangeType == true
)
}
)
}
private fun showTypeTemplatesWidgetForViewerDefaultObject(viewerId: Id) {
val isPossibleToChangeType = stateReducer.state.value.dataViewState()?.isChangingDefaultTypeAvailable()
showTypeTemplatesWidget(
getViewer = { it?.viewerById(viewerId) },
createState = { viewer ->
TypeTemplatesWidgetUI.Data.DefaultObject(
TypeTemplatesWidgetUI.Data(
showWidget = true,
isEditing = false,
viewerId = viewer.id,
@ -1591,10 +1573,7 @@ class ObjectSetViewModel(
when (action) {
is TypeTemplatesWidgetUIAction.TypeClick.Item -> {
when (uiState) {
is TypeTemplatesWidgetUI.Data.CreateObject -> {
selectedTypeFlow.value = action.type
}
is TypeTemplatesWidgetUI.Data.DefaultObject -> {
is TypeTemplatesWidgetUI.Data -> {
selectedTypeFlow.value = action.type
proceedWithUpdateViewer(
viewerId = uiState.getWidgetViewerId()
@ -1617,10 +1596,7 @@ class ObjectSetViewModel(
}
is TypeTemplatesWidgetUIAction.TemplateClick -> {
when (uiState) {
is TypeTemplatesWidgetUI.Data.CreateObject ->
uiState.onTemplateClick(action.template)
is TypeTemplatesWidgetUI.Data.DefaultObject ->
uiState.onTemplateClick(action.template)
is TypeTemplatesWidgetUI.Data -> uiState.onTemplateClick(action.template)
is TypeTemplatesWidgetUI.Init -> Unit
}
}
@ -1628,7 +1604,7 @@ class ObjectSetViewModel(
}
}
private suspend fun TypeTemplatesWidgetUI.Data.CreateObject.onTemplateClick(
private suspend fun TypeTemplatesWidgetUI.Data.onTemplateClick(
templateView: TemplateView
) {
if (moreMenuItem != null) {
@ -1640,6 +1616,14 @@ class ObjectSetViewModel(
when (templateView) {
is TemplateView.Blank -> {
logEvent(ObjectStateAnalyticsEvent.SELECT_TEMPLATE)
proceedWithUpdateViewer(
viewerId = getWidgetViewerId()
) {
it.copy(
defaultTemplate = templateView.id,
defaultObjectType = templateView.typeId
)
}
proceedWithDataViewObjectCreate(
typeChosenBy = templateView.typeId,
templateId = templateView.id
@ -1647,6 +1631,14 @@ class ObjectSetViewModel(
}
is TemplateView.Template -> {
logEvent(ObjectStateAnalyticsEvent.SELECT_TEMPLATE)
proceedWithUpdateViewer(
viewerId = getWidgetViewerId()
) {
it.copy(
defaultTemplate = templateView.id,
defaultObjectType = templateView.typeId
)
}
proceedWithDataViewObjectCreate(
typeChosenBy = templateView.typeId,
templateId = templateView.id
@ -1660,42 +1652,6 @@ class ObjectSetViewModel(
}
}
private suspend fun TypeTemplatesWidgetUI.Data.DefaultObject.onTemplateClick(
templateView: TemplateView
) {
if (moreMenuItem != null) {
typeTemplatesWidgetState.value = hideMoreMenu()
return
}
when (templateView) {
is TemplateView.Blank -> {
proceedWithUpdateViewer(
viewerId = getWidgetViewerId()
) {
it.copy(
defaultTemplate = templateView.id,
defaultObjectType = templateView.typeId
)
}
}
is TemplateView.Template -> {
proceedWithUpdateViewer(
viewerId = getWidgetViewerId()
) {
it.copy(
defaultTemplate = templateView.id,
defaultObjectType = templateView.typeId
)
}
}
is TemplateView.New -> {
proceedWithCreatingTemplate(
targetObjectType = templateView.targetObjectType
)
}
}
}
private fun logEvent(event: ObjectStateAnalyticsEvent) {
viewModelScope.launch {
logEvent(
@ -1727,8 +1683,7 @@ class ObjectSetViewModel(
}.collectLatest { types ->
typeTemplatesWidgetState.value =
when (val uiState = typeTemplatesWidgetState.value) {
is TypeTemplatesWidgetUI.Data.CreateObject -> uiState.copy(objectTypes = types)
is TypeTemplatesWidgetUI.Data.DefaultObject -> uiState.copy(objectTypes = types)
is TypeTemplatesWidgetUI.Data -> uiState.copy(objectTypes = types)
is TypeTemplatesWidgetUI.Init -> uiState
}
}
@ -1753,22 +1708,7 @@ class ObjectSetViewModel(
val viewer = dataView.viewerById(viewerId) ?: return@map emptyList<TemplateView>()
val (type, template) = dataView.getActiveViewTypeAndTemplate(context, viewer, storeOfObjectTypes)
when (typeTemplatesWidgetState.value) {
is TypeTemplatesWidgetUI.Data.DefaultObject-> {
if (type?.id == selectedTypeFlow.value?.id) {
processTemplates(
results = templates,
viewerDefObjType = type ?: selectedTypeFlow.value,
viewerDefTemplateId = template ?: selectedTypeFlow.value?.defaultTemplateId
)
} else {
processTemplates(
results = templates,
viewerDefObjType = selectedTypeFlow.value,
viewerDefTemplateId = selectedTypeFlow.value?.defaultTemplateId
)
}
}
is TypeTemplatesWidgetUI.Data.CreateObject -> {
is TypeTemplatesWidgetUI.Data -> {
if (type?.id == selectedTypeFlow.value?.id) {
processTemplates(
results = templates,
@ -1787,8 +1727,7 @@ class ObjectSetViewModel(
}
}.collectLatest { templates ->
typeTemplatesWidgetState.value = when(val uistate = typeTemplatesWidgetState.value) {
is TypeTemplatesWidgetUI.Data.CreateObject -> uistate.copy(templates = templates)
is TypeTemplatesWidgetUI.Data.DefaultObject -> uistate.copy(templates = templates)
is TypeTemplatesWidgetUI.Data -> uistate.copy(templates = templates)
is TypeTemplatesWidgetUI.Init -> uistate
}
}
@ -1917,23 +1856,16 @@ class ObjectSetViewModel(
private fun proceedWithUpdatingViewDefaultTemplate() {
when (val uiState = typeTemplatesWidgetState.value) {
is TypeTemplatesWidgetUI.Data.CreateObject,
is TypeTemplatesWidgetUI.Data.DefaultObject -> {
val templateToSetAsDefault = when (uiState) {
is TypeTemplatesWidgetUI.Data.CreateObject -> uiState.moreMenuItem
is TypeTemplatesWidgetUI.Data.DefaultObject -> uiState.moreMenuItem
else -> null
}
when (templateToSetAsDefault) {
is TypeTemplatesWidgetUI.Data -> {
when (val templateToSetAsDefault = uiState.moreMenuItem) {
is TemplateView.Blank -> {
typeTemplatesWidgetState.value = (uiState as TypeTemplatesWidgetUI.Data).exitEditing()
typeTemplatesWidgetState.value = uiState.exitEditing()
proceedWithUpdateViewer(viewerId = uiState.viewerId) {
it.copy(defaultTemplate = templateToSetAsDefault.id)
}
}
is TemplateView.Template -> {
typeTemplatesWidgetState.value = (uiState as TypeTemplatesWidgetUI.Data).exitEditing()
typeTemplatesWidgetState.value = uiState.exitEditing()
proceedWithUpdateViewer(viewerId = uiState.viewerId) {
it.copy(defaultTemplate = templateToSetAsDefault.id)
}
@ -2185,11 +2117,6 @@ class ObjectSetViewModel(
Timber.d("onViewerEditWidgetAction, action:[$action]")
when (action) {
ViewEditAction.Dismiss -> { hideViewerEditWidget() }
is ViewEditAction.DefaultObjectType -> {
showTypeTemplatesWidgetForViewerDefaultObject(
viewerId = action.id
)
}
is ViewEditAction.Filters -> {
viewersWidgetState.value = viewersWidgetState.value.copy(showWidget = false)
hideViewerEditWidget()
@ -2283,12 +2210,6 @@ class ObjectSetViewModel(
)
}
}
is ViewEditAction.DefaultTemplate -> {
showTypeTemplatesWidgetForViewerDefaultObject(
viewerId = action.id
)
}
}
}

View file

@ -1,12 +1,8 @@
package com.anytypeio.anytype.presentation.sets
import com.anytypeio.anytype.core_models.Block
import com.anytypeio.anytype.core_models.DVViewer
import com.anytypeio.anytype.core_models.DVViewerType
import com.anytypeio.anytype.core_models.Id
import com.anytypeio.anytype.core_models.ObjectTypeIds
import com.anytypeio.anytype.core_models.ObjectWrapper
import com.anytypeio.anytype.domain.objects.StoreOfObjectTypes
import com.anytypeio.anytype.domain.objects.StoreOfRelations
@ -18,14 +14,10 @@ sealed class ViewerEditWidgetUi {
val isNewMode: Boolean = false,
val id: Id,
val name: String,
val defaultObjectType: ObjectWrapper.Type?,
val isDefaultObjectTypeEnabled: Boolean,
val layout: DVViewerType?,
val relations: List<Id> = emptyList(),
val filters: List<Id> = emptyList(),
val sorts: List<Id> = emptyList(),
val defaultTemplateId: Id?,
val defaultTemplateName: String?,
val isActive: Boolean
) : ViewerEditWidgetUi()
}
@ -33,8 +25,6 @@ sealed class ViewerEditWidgetUi {
sealed class ViewEditAction {
object Dismiss : ViewEditAction()
data class UpdateName(val id: Id, val name: String) : ViewEditAction()
data class DefaultObjectType(val id: Id) : ViewEditAction()
data class DefaultTemplate(val id: Id) : ViewEditAction()
data class Layout(val id: Id) : ViewEditAction()
data class Relations(val id: Id) : ViewEditAction()
data class Filters(val id: Id) : ViewEditAction()
@ -55,18 +45,11 @@ suspend fun <T> List<T>.toView(
suspend fun DVViewer.toViewerEditWidgetState(
storeOfRelations: StoreOfRelations,
storeOfObjectTypes: StoreOfObjectTypes,
isDefaultObjectTypeEnabled: Boolean,
details: Map<Id, Block.Fields>,
index: Int,
session: ObjectSetSession
): ViewerEditWidgetUi {
val dvViewer = this
val isActive = dvViewer.isActiveViewer(index, session)
val viewerDefaultObjectTypeId = dvViewer.defaultObjectType ?: ObjectTypeIds.PAGE
val viewerDefaultTemplateId = dvViewer.defaultTemplate
val defaultObjectType = storeOfObjectTypes.get(viewerDefaultObjectTypeId)
val defaultTemplateName = details[viewerDefaultTemplateId]?.name
return ViewerEditWidgetUi.Data(
showWidget = true,
id = dvViewer.id,
@ -75,10 +58,6 @@ suspend fun DVViewer.toViewerEditWidgetState(
filters = dvViewer.filters.toView(storeOfRelations) { it.relation },
relations = dvViewer.viewerRelations.toView(storeOfRelations) { it.key },
layout = dvViewer.type,
defaultObjectType = defaultObjectType,
isDefaultObjectTypeEnabled = isDefaultObjectTypeEnabled,
defaultTemplateId = viewerDefaultTemplateId,
defaultTemplateName = defaultTemplateName,
isActive = isActive
)
}

View file

@ -14,34 +14,15 @@ sealed class TypeTemplatesWidgetUI {
override val isEditing: Boolean = false
) : TypeTemplatesWidgetUI()
sealed class Data : TypeTemplatesWidgetUI() {
abstract val moreMenuItem: TemplateView?
abstract val templates: List<TemplateView>
abstract val objectTypes: List<TemplateObjectTypeView>
abstract val isPossibleToChangeType: Boolean
abstract val viewerId: Id
data class DefaultObject(
override val showWidget: Boolean,
override val isEditing: Boolean,
override val moreMenuItem: TemplateView? = null,
override val templates: List<TemplateView> = emptyList(),
override val objectTypes: List<TemplateObjectTypeView> = emptyList(),
override val viewerId: Id,
override val isPossibleToChangeType: Boolean
) : Data()
data class CreateObject(
override val showWidget: Boolean,
override val isEditing: Boolean,
override val moreMenuItem: TemplateView? = null,
override val templates: List<TemplateView> = emptyList(),
override val objectTypes: List<TemplateObjectTypeView> = emptyList(),
override val viewerId: Id,
override val isPossibleToChangeType: Boolean
) : Data()
}
data class Data(
override val showWidget: Boolean,
override val isEditing: Boolean,
val moreMenuItem: TemplateView? = null,
val templates: List<TemplateView> = emptyList(),
val objectTypes: List<TemplateObjectTypeView> = emptyList(),
val viewerId: Id,
val isPossibleToChangeType: Boolean
) : TypeTemplatesWidgetUI()
fun getWidgetViewerId(): Id? = if (this is Data) viewerId else null
}
@ -57,29 +38,17 @@ sealed class TypeTemplatesWidgetUIAction {
}
fun TypeTemplatesWidgetUI.Data.enterEditing(): TypeTemplatesWidgetUI.Data {
return when (this) {
is TypeTemplatesWidgetUI.Data.DefaultObject -> copy(isEditing = true)
is TypeTemplatesWidgetUI.Data.CreateObject -> copy(isEditing = true)
}
return this.copy(isEditing = true)
}
fun TypeTemplatesWidgetUI.Data.exitEditing(): TypeTemplatesWidgetUI.Data {
return when (this) {
is TypeTemplatesWidgetUI.Data.DefaultObject -> copy(isEditing = false, moreMenuItem = null)
is TypeTemplatesWidgetUI.Data.CreateObject -> copy(isEditing = false, moreMenuItem = null)
}
return this.copy(isEditing = false, moreMenuItem = null)
}
fun TypeTemplatesWidgetUI.Data.showMoreMenu(item: TemplateView): TypeTemplatesWidgetUI.Data {
return when (this) {
is TypeTemplatesWidgetUI.Data.DefaultObject -> copy(moreMenuItem = item)
is TypeTemplatesWidgetUI.Data.CreateObject -> copy(moreMenuItem = item)
}
return this.copy(moreMenuItem = item)
}
fun TypeTemplatesWidgetUI.Data.hideMoreMenu(): TypeTemplatesWidgetUI.Data {
return when (this) {
is TypeTemplatesWidgetUI.Data.DefaultObject -> copy(moreMenuItem = null)
is TypeTemplatesWidgetUI.Data.CreateObject -> copy(moreMenuItem = null)
}
return this.copy(moreMenuItem = null)
}