mirror of
https://github.com/anyproto/anytype-kotlin.git
synced 2025-06-08 05:47:05 +09:00
DROID-1620 Collection | Fix | Design + templates (#348)
This commit is contained in:
parent
65ce905cfd
commit
f1c9a681ea
6 changed files with 79 additions and 48 deletions
|
@ -295,13 +295,11 @@ private fun MoreMenu(
|
|||
shape = RoundedCornerShape(size = 10.dp)
|
||||
)
|
||||
) {
|
||||
if(currentState.isDefaultStateEnabled) {
|
||||
MenuItem(
|
||||
click = { menuClick(TemplateMenuClick.Default(templateView)) },
|
||||
text = stringResource(id = R.string.templates_menu_default_for_view)
|
||||
)
|
||||
Divider()
|
||||
}
|
||||
MenuItem(
|
||||
click = { menuClick(TemplateMenuClick.Default(templateView)) },
|
||||
text = stringResource(id = R.string.templates_menu_default_for_view)
|
||||
)
|
||||
Divider()
|
||||
MenuItem(
|
||||
click = { menuClick(TemplateMenuClick.Edit(templateView)) },
|
||||
text = stringResource(id = R.string.templates_menu_edit)
|
||||
|
@ -373,7 +371,7 @@ private fun TemplatesList(
|
|||
) {
|
||||
val borderWidth: Dp
|
||||
val borderColor: Color
|
||||
if (state.isDefaultStateEnabled && item.isDefault) {
|
||||
if (item.isDefault) {
|
||||
borderWidth = 2.dp
|
||||
borderColor = colorResource(id = R.color.palette_system_amber_50)
|
||||
} else {
|
||||
|
|
|
@ -11,6 +11,7 @@ android {
|
|||
buildConfigField "boolean", "ENABLE_LINK_APPERANCE_MENU", "true"
|
||||
buildConfigField "boolean", "USE_SIMPLE_TABLES_IN_EDITOR_EDDITING", "true"
|
||||
buildConfigField "boolean", "ENABLE_WIDGETS", "false"
|
||||
buildConfigField "boolean", "ENABLE_VIEWS_MENU", "false"
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -47,6 +47,7 @@ import com.anytypeio.anytype.presentation.sets.state.ObjectState.Companion.VIEW_
|
|||
import com.anytypeio.anytype.presentation.sets.state.ObjectState.Companion.VIEW_TYPE_UNSUPPORTED
|
||||
import com.anytypeio.anytype.presentation.sets.viewer.ViewerView
|
||||
import com.anytypeio.anytype.presentation.templates.TemplateView
|
||||
import com.anytypeio.anytype.presentation.templates.TemplateView.Companion.DEFAULT_TEMPLATE_ID_BLANK
|
||||
|
||||
fun ObjectState.DataView.featuredRelations(
|
||||
ctx: Id,
|
||||
|
@ -433,8 +434,14 @@ fun ObjectWrapper.Basic.toTemplateView(
|
|||
val coverContainer = if (coverType != CoverType.NONE) {
|
||||
BasicObjectCoverWrapper(this)
|
||||
.getCover(urlBuilder, coverImageHashProvider)
|
||||
} else null
|
||||
val isDefault = viewerDefaultTemplate == id || objectTypeDefaultTemplate == id
|
||||
} else {
|
||||
null
|
||||
}
|
||||
val isDefault = if (viewerDefaultTemplate != null) {
|
||||
viewerDefaultTemplate == id
|
||||
} else {
|
||||
false
|
||||
}
|
||||
return TemplateView.Template(
|
||||
id = id,
|
||||
name = name.orEmpty(),
|
||||
|
@ -449,10 +456,13 @@ fun ObjectWrapper.Basic.toTemplateView(
|
|||
)
|
||||
}
|
||||
|
||||
fun ObjectWrapper.Type.toTemplateViewBlank(): TemplateView.Blank {
|
||||
fun ObjectWrapper.Type.toTemplateViewBlank(
|
||||
viewerDefaultTemplate: Id? = null
|
||||
): TemplateView.Blank {
|
||||
return TemplateView.Blank(
|
||||
typeId = id,
|
||||
layout = recommendedLayout?.code ?: ObjectType.Layout.BASIC.code
|
||||
layout = recommendedLayout?.code ?: ObjectType.Layout.BASIC.code,
|
||||
isDefault = viewerDefaultTemplate == DEFAULT_TEMPLATE_ID_BLANK
|
||||
)
|
||||
}
|
||||
|
||||
|
|
|
@ -47,6 +47,7 @@ import com.anytypeio.anytype.domain.status.InterceptThreadStatus
|
|||
import com.anytypeio.anytype.domain.templates.CreateTemplate
|
||||
import com.anytypeio.anytype.domain.unsplash.DownloadUnsplashImage
|
||||
import com.anytypeio.anytype.domain.workspace.WorkspaceManager
|
||||
import com.anytypeio.anytype.presentation.BuildConfig
|
||||
import com.anytypeio.anytype.presentation.common.Action
|
||||
import com.anytypeio.anytype.presentation.common.Delegator
|
||||
import com.anytypeio.anytype.presentation.editor.cover.CoverImageHashProvider
|
||||
|
@ -82,6 +83,7 @@ import kotlinx.coroutines.ExperimentalCoroutinesApi
|
|||
import kotlinx.coroutines.Job
|
||||
import kotlinx.coroutines.channels.Channel
|
||||
import kotlinx.coroutines.delay
|
||||
import kotlinx.coroutines.flow.Flow
|
||||
import kotlinx.coroutines.flow.MutableSharedFlow
|
||||
import kotlinx.coroutines.flow.MutableStateFlow
|
||||
import kotlinx.coroutines.flow.SharedFlow
|
||||
|
@ -1044,13 +1046,21 @@ class ObjectSetViewModel(
|
|||
|
||||
fun onExpandViewerMenuClicked() {
|
||||
Timber.d("onExpandViewerMenuClicked, ")
|
||||
val state = stateReducer.state.value.dataViewState() ?: return
|
||||
if (isRestrictionPresent(DataViewRestriction.VIEWS)
|
||||
) {
|
||||
toast(NOT_ALLOWED)
|
||||
} else {
|
||||
viewersWidgetState.value = viewersWidgetState.value.copy(
|
||||
showWidget = true
|
||||
)
|
||||
if (BuildConfig.ENABLE_VIEWS_MENU) {
|
||||
viewersWidgetState.value = viewersWidgetState.value.copy(showWidget = true)
|
||||
} else {
|
||||
dispatch(
|
||||
ObjectSetCommand.Modal.ManageViewer(
|
||||
ctx = context,
|
||||
dataview = state.dataViewBlock.id
|
||||
)
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1058,6 +1068,14 @@ class ObjectSetViewModel(
|
|||
Timber.d("onViewerEditClicked, ")
|
||||
val state = stateReducer.state.value.dataViewState() ?: return
|
||||
val viewer = state.viewerById(session.currentViewerId.value) ?: return
|
||||
if (!BuildConfig.ENABLE_VIEWS_MENU) {
|
||||
dispatch(
|
||||
ObjectSetCommand.Modal.EditDataViewViewer(
|
||||
ctx = context,
|
||||
viewer = viewer.id
|
||||
)
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
fun onMenuClicked() {
|
||||
|
@ -1473,23 +1491,26 @@ class ObjectSetViewModel(
|
|||
}
|
||||
|
||||
// region TEMPLATES
|
||||
@OptIn(ExperimentalCoroutinesApi::class)
|
||||
private fun subscribeToViewerTypeTemplates() {
|
||||
viewModelScope.launch {
|
||||
combine(
|
||||
stateReducer.state.filterIsInstance<ObjectState.DataView>(),
|
||||
session.currentViewerId
|
||||
stateReducer.state.filterIsInstance<ObjectState.DataView>(), session.currentViewerId
|
||||
) { state, currentViewId ->
|
||||
|
||||
val viewer = state.dataViewState()?.viewerById(currentViewId)
|
||||
val viewerDefObjType = fetchViewerDefaultObjectType(viewer)
|
||||
|
||||
if (viewer != null && viewerDefObjType?.isTemplatesAllowed() == true) {
|
||||
fetchAndProcessTemplates(viewerDefObjType, viewer)
|
||||
} else {
|
||||
Timber.d("Templates are not allowed for type:[${viewerDefObjType?.id}]")
|
||||
_dvViews.value = emptyList()
|
||||
}
|
||||
}.collect()
|
||||
Pair(
|
||||
state,
|
||||
currentViewId
|
||||
)
|
||||
}.flatMapLatest { (state, currentViewId) ->
|
||||
val viewer = state.dataViewState()?.viewerById(currentViewId)
|
||||
val viewerDefObjType = fetchViewerDefaultObjectType(viewer)
|
||||
if (viewer != null && viewerDefObjType?.isTemplatesAllowed() == true) {
|
||||
fetchAndProcessTemplates(viewerDefObjType, viewer)
|
||||
} else {
|
||||
Timber.d("Templates are not allowed for type:[${viewerDefObjType?.id}]")
|
||||
emptyFlow()
|
||||
}
|
||||
}.onEach { _templateViews.value = it }.collect()
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1498,25 +1519,21 @@ class ObjectSetViewModel(
|
|||
return storeOfObjectTypes.get(viewerDefaultObjectTypeId)
|
||||
}
|
||||
|
||||
private suspend fun fetchAndProcessTemplates(viewerDefObjType: ObjectWrapper.Type, viewer: DVViewer) {
|
||||
private suspend fun fetchAndProcessTemplates(
|
||||
viewerDefObjType: ObjectWrapper.Type,
|
||||
viewer: DVViewer
|
||||
): Flow<List<TemplateView>> {
|
||||
Timber.d("Fetching templates for type ${viewerDefObjType.id}")
|
||||
|
||||
templatesContainer.subscribe(viewerDefObjType.id)
|
||||
return templatesContainer.subscribe(viewerDefObjType.id)
|
||||
.catch {
|
||||
handleTemplateFetchingError(it, viewerDefObjType.id)
|
||||
Timber.e(it, "Error while getting templates for type ${viewerDefObjType.id}")
|
||||
toast("Error while getting templates for type ${viewerDefObjType.name}")
|
||||
emptyFlow<List<TemplateView>>()
|
||||
}
|
||||
.map { results ->
|
||||
processTemplates(results, viewerDefObjType, viewer)
|
||||
}
|
||||
.collectLatest { templates ->
|
||||
_templateViews.value = templates
|
||||
}
|
||||
}
|
||||
|
||||
private fun handleTemplateFetchingError(exception: Throwable, typeId: String) {
|
||||
Timber.e(exception, "Error while getting templates for type $typeId")
|
||||
toast("Error while getting templates for type $typeId")
|
||||
_dvViews.value = emptyList()
|
||||
}
|
||||
|
||||
private fun processTemplates(
|
||||
|
@ -1524,7 +1541,11 @@ class ObjectSetViewModel(
|
|||
viewerDefObjType: ObjectWrapper.Type,
|
||||
viewer: DVViewer
|
||||
): List<TemplateView> {
|
||||
val blankTemplate = listOf(viewerDefObjType.toTemplateViewBlank())
|
||||
val blankTemplate = listOf(
|
||||
viewerDefObjType.toTemplateViewBlank(
|
||||
viewerDefaultTemplate = viewer.defaultTemplate
|
||||
)
|
||||
)
|
||||
return blankTemplate + results.map { objTemplate ->
|
||||
objTemplate.toTemplateView(
|
||||
typeId = viewerDefObjType.id,
|
||||
|
@ -1533,7 +1554,7 @@ class ObjectSetViewModel(
|
|||
objectTypeDefaultTemplate = viewerDefObjType.defaultTemplateId,
|
||||
viewerDefaultTemplate = viewer.defaultTemplate
|
||||
)
|
||||
} + listOf(TemplateView.New(viewerDefObjType.id))
|
||||
}.sortedByDescending { it.isDefault } + listOf(TemplateView.New(viewerDefObjType.id))
|
||||
}
|
||||
|
||||
fun onTemplateItemClicked(item: TemplateView) {
|
||||
|
|
|
@ -41,6 +41,10 @@ sealed class TemplateView {
|
|||
return image != null || emoji != null
|
||||
}
|
||||
}
|
||||
|
||||
companion object {
|
||||
const val DEFAULT_TEMPLATE_ID_BLANK = "blank"
|
||||
}
|
||||
}
|
||||
|
||||
sealed class TemplateMenuClick {
|
||||
|
|
|
@ -7,15 +7,13 @@ data class TemplatesWidgetUiState(
|
|||
val showWidget: Boolean,
|
||||
val isEditing: Boolean,
|
||||
val isMoreMenuVisible: Boolean,
|
||||
val moreMenuTemplate: TemplateView.Template?,
|
||||
val isDefaultStateEnabled: Boolean = false
|
||||
val moreMenuTemplate: TemplateView.Template?
|
||||
) {
|
||||
fun dismiss() = copy(
|
||||
showWidget = false,
|
||||
isEditing = false,
|
||||
isMoreMenuVisible = false,
|
||||
moreMenuTemplate = null,
|
||||
isDefaultStateEnabled = false
|
||||
moreMenuTemplate = null
|
||||
)
|
||||
|
||||
companion object {
|
||||
|
@ -24,8 +22,7 @@ data class TemplatesWidgetUiState(
|
|||
showWidget = false,
|
||||
isEditing = false,
|
||||
isMoreMenuVisible = false,
|
||||
moreMenuTemplate = null,
|
||||
isDefaultStateEnabled = false
|
||||
moreMenuTemplate = null
|
||||
)
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue