Add default sort option for collections (#337)

Adds a "default" sort option for collections/boxsets. This makes the app
request no sort at all and leaves it up to the server to order the
items.

Fixes #83
This commit is contained in:
damontecres 2025-11-28 15:33:03 -05:00 committed by GitHub
parent 8bc6fce0cb
commit 7f50cd83ee
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 51 additions and 25 deletions

View file

@ -88,7 +88,6 @@ import dagger.hilt.android.lifecycle.HiltViewModel
import dagger.hilt.android.qualifiers.ApplicationContext import dagger.hilt.android.qualifiers.ApplicationContext
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job import kotlinx.coroutines.Job
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
import org.jellyfin.sdk.api.client.ApiClient import org.jellyfin.sdk.api.client.ApiClient
@ -154,8 +153,8 @@ class CollectionFolderViewModel
} }
val sortAndDirection = val sortAndDirection =
initialSortAndDirection libraryDisplayInfo?.sortAndDirection
?: libraryDisplayInfo?.sortAndDirection ?: initialSortAndDirection
?: SortAndDirection.DEFAULT ?: SortAndDirection.DEFAULT
val filterToUse = val filterToUse =
@ -233,7 +232,6 @@ class CollectionFolderViewModel
this@CollectionFolderViewModel.sortAndDirection.value = sortAndDirection this@CollectionFolderViewModel.sortAndDirection.value = sortAndDirection
this@CollectionFolderViewModel.filter.value = filter this@CollectionFolderViewModel.filter.value = filter
} }
delay(1000)
val newPager = createPager(sortAndDirection, recursive, filter, useSeriesForPrimary) val newPager = createPager(sortAndDirection, recursive, filter, useSeriesForPrimary)
newPager.init() newPager.init()
if (newPager.isNotEmpty()) newPager.getBlocking(0) if (newPager.isNotEmpty()) newPager.getBlocking(0)
@ -270,22 +268,26 @@ class CollectionFolderViewModel
excludeItemIds = item?.let { listOf(item.id) }, excludeItemIds = item?.let { listOf(item.id) },
sortBy = sortBy =
buildList { buildList {
add(sortAndDirection.sort) if (sortAndDirection.sort != ItemSortBy.DEFAULT) {
if (sortAndDirection.sort != ItemSortBy.SORT_NAME) { add(sortAndDirection.sort)
add(ItemSortBy.SORT_NAME) if (sortAndDirection.sort != ItemSortBy.SORT_NAME) {
} add(ItemSortBy.SORT_NAME)
if (item?.data?.collectionType == CollectionType.MOVIES) { }
add(ItemSortBy.PRODUCTION_YEAR) if (item?.data?.collectionType == CollectionType.MOVIES) {
add(ItemSortBy.PRODUCTION_YEAR)
}
} }
}, },
sortOrder = sortOrder =
buildList { buildList {
add(sortAndDirection.direction) if (sortAndDirection.sort != ItemSortBy.DEFAULT) {
if (sortAndDirection.sort != ItemSortBy.SORT_NAME) { add(sortAndDirection.direction)
add(SortOrder.ASCENDING) if (sortAndDirection.sort != ItemSortBy.SORT_NAME) {
} add(SortOrder.ASCENDING)
if (item?.data?.collectionType == CollectionType.MOVIES) { }
add(SortOrder.ASCENDING) if (item?.data?.collectionType == CollectionType.MOVIES) {
add(SortOrder.ASCENDING)
}
} }
}, },
fields = SlimItemFields, fields = SlimItemFields,

View file

@ -84,6 +84,21 @@ val PlaylistSortOptions =
ItemSortBy.RANDOM, ItemSortBy.RANDOM,
) )
val BoxSetSortOptions =
listOf(
ItemSortBy.DEFAULT,
ItemSortBy.SORT_NAME,
ItemSortBy.PREMIERE_DATE,
ItemSortBy.DATE_CREATED,
ItemSortBy.DATE_PLAYED,
ItemSortBy.COMMUNITY_RATING,
ItemSortBy.CRITIC_RATING,
ItemSortBy.OFFICIAL_RATING,
ItemSortBy.RUNTIME,
ItemSortBy.PLAY_COUNT,
ItemSortBy.RANDOM,
)
@StringRes @StringRes
fun getStringRes(sort: ItemSortBy): Int = fun getStringRes(sort: ItemSortBy): Int =
when (sort) { when (sort) {

View file

@ -14,8 +14,11 @@ import com.github.damontecres.wholphin.data.model.GetItemsFilter
import com.github.damontecres.wholphin.preferences.UserPreferences import com.github.damontecres.wholphin.preferences.UserPreferences
import com.github.damontecres.wholphin.ui.components.CollectionFolderGrid import com.github.damontecres.wholphin.ui.components.CollectionFolderGrid
import com.github.damontecres.wholphin.ui.components.CollectionFolderGridParameters import com.github.damontecres.wholphin.ui.components.CollectionFolderGridParameters
import com.github.damontecres.wholphin.ui.data.MovieSortOptions import com.github.damontecres.wholphin.ui.data.BoxSetSortOptions
import com.github.damontecres.wholphin.ui.data.SortAndDirection
import com.github.damontecres.wholphin.ui.preferences.PreferencesViewModel import com.github.damontecres.wholphin.ui.preferences.PreferencesViewModel
import org.jellyfin.sdk.model.api.ItemSortBy
import org.jellyfin.sdk.model.api.SortOrder
import java.util.UUID import java.util.UUID
@Composable @Composable
@ -37,7 +40,8 @@ fun CollectionFolderBoxSet(
initialFilter = filter, initialFilter = filter,
showTitle = showHeader, showTitle = showHeader,
recursive = recursive, recursive = recursive,
sortOptions = MovieSortOptions, sortOptions = BoxSetSortOptions,
initialSortAndDirection = SortAndDirection(ItemSortBy.DEFAULT, SortOrder.ASCENDING),
modifier = modifier =
modifier modifier
.padding(start = 16.dp), .padding(start = 16.dp),

View file

@ -17,6 +17,7 @@ import com.github.damontecres.wholphin.ui.components.CollectionFolderGrid
import com.github.damontecres.wholphin.ui.components.CollectionFolderGridParameters import com.github.damontecres.wholphin.ui.components.CollectionFolderGridParameters
import com.github.damontecres.wholphin.ui.data.VideoSortOptions import com.github.damontecres.wholphin.ui.data.VideoSortOptions
import com.github.damontecres.wholphin.ui.preferences.PreferencesViewModel import com.github.damontecres.wholphin.ui.preferences.PreferencesViewModel
import org.jellyfin.sdk.model.api.ItemSortBy
import java.util.UUID import java.util.UUID
@Composable @Composable
@ -29,6 +30,7 @@ fun CollectionFolderGeneric(
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
filter: GetItemsFilter = GetItemsFilter(), filter: GetItemsFilter = GetItemsFilter(),
filterOptions: List<ItemFilterBy<*>> = DefaultFilterOptions, filterOptions: List<ItemFilterBy<*>> = DefaultFilterOptions,
sortOptions: List<ItemSortBy> = VideoSortOptions,
preferencesViewModel: PreferencesViewModel = hiltViewModel(), preferencesViewModel: PreferencesViewModel = hiltViewModel(),
) { ) {
var showHeader by remember { mutableStateOf(true) } var showHeader by remember { mutableStateOf(true) }
@ -47,7 +49,7 @@ fun CollectionFolderGeneric(
initialFilter = filter, initialFilter = filter,
showTitle = showHeader, showTitle = showHeader,
recursive = recursive, recursive = recursive,
sortOptions = VideoSortOptions, sortOptions = sortOptions,
modifier = modifier =
modifier modifier
.padding(start = 16.dp), .padding(start = 16.dp),

View file

@ -7,6 +7,7 @@ import com.github.damontecres.wholphin.data.filter.DefaultForGenresFilterOptions
import com.github.damontecres.wholphin.preferences.UserPreferences import com.github.damontecres.wholphin.preferences.UserPreferences
import com.github.damontecres.wholphin.ui.components.ItemGrid import com.github.damontecres.wholphin.ui.components.ItemGrid
import com.github.damontecres.wholphin.ui.components.LicenseInfo import com.github.damontecres.wholphin.ui.components.LicenseInfo
import com.github.damontecres.wholphin.ui.data.MovieSortOptions
import com.github.damontecres.wholphin.ui.detail.CollectionFolderBoxSet import com.github.damontecres.wholphin.ui.detail.CollectionFolderBoxSet
import com.github.damontecres.wholphin.ui.detail.CollectionFolderGeneric import com.github.damontecres.wholphin.ui.detail.CollectionFolderGeneric
import com.github.damontecres.wholphin.ui.detail.CollectionFolderLiveTv import com.github.damontecres.wholphin.ui.detail.CollectionFolderLiveTv
@ -239,12 +240,14 @@ fun CollectionFolder(
) )
CollectionType.BOXSETS -> CollectionType.BOXSETS ->
CollectionFolderBoxSet( CollectionFolderGeneric(
preferences, preferences = preferences,
destination.itemId, itemId = destination.itemId,
destination.item, usePosters = true,
false, recursive = false,
modifier, playEnabled = false,
modifier = modifier,
sortOptions = MovieSortOptions,
) )
CollectionType.PLAYLISTS -> CollectionType.PLAYLISTS ->