Fix jumping to a letter for many grids (#687)

## Description
On any grid that wasn't showing movies, tv shows, or videos, the jump to
letter functionality did not work correctly.

This PR fixes jumping for other media types, eg collections or episodes.
Additionally, the jump now also takes filters into account, so if
filtering Movies, it will jump to the right place now within the
available movies.

### Related issues
Fixes #683
This commit is contained in:
Ray 2026-01-12 22:47:35 -05:00 committed by GitHub
parent 80670c3e0f
commit 5cb3662995
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -304,10 +304,51 @@ class CollectionFolderViewModel
recursive: Boolean, recursive: Boolean,
filter: GetItemsFilter, filter: GetItemsFilter,
useSeriesForPrimary: Boolean, useSeriesForPrimary: Boolean,
): ApiRequestPager<out Any> { ): ApiRequestPager<out Any> =
val item = item.value when (filter.override) {
return when (filter.override) {
GetItemsFilterOverride.NONE -> { GetItemsFilterOverride.NONE -> {
val request =
createGetItemsRequest(
sortAndDirection = sortAndDirection,
recursive = recursive,
filter = filter,
)
val newPager =
ApiRequestPager(
api,
request,
GetItemsRequestHandler,
viewModelScope,
useSeriesForPrimary = useSeriesForPrimary,
)
newPager
}
GetItemsFilterOverride.PERSON -> {
val request =
filter.applyTo(
GetPersonsRequest(
enableImageTypes = listOf(ImageType.PRIMARY, ImageType.THUMB),
),
)
val newPager =
ApiRequestPager(
api,
request,
GetPersonsHandler,
viewModelScope,
useSeriesForPrimary = useSeriesForPrimary,
)
newPager
}
}
private fun createGetItemsRequest(
sortAndDirection: SortAndDirection,
recursive: Boolean,
filter: GetItemsFilter,
): GetItemsRequest {
val item = item.value
val includeItemTypes = val includeItemTypes =
item item
?.data ?.data
@ -349,35 +390,7 @@ class CollectionFolderViewModel
fields = SlimItemFields, fields = SlimItemFields,
), ),
) )
val newPager = return request
ApiRequestPager(
api,
request,
GetItemsRequestHandler,
viewModelScope,
useSeriesForPrimary = useSeriesForPrimary,
)
newPager
}
GetItemsFilterOverride.PERSON -> {
val request =
filter.applyTo(
GetPersonsRequest(
enableImageTypes = listOf(ImageType.PRIMARY, ImageType.THUMB),
),
)
val newPager =
ApiRequestPager(
api,
request,
GetPersonsHandler,
viewModelScope,
useSeriesForPrimary = useSeriesForPrimary,
)
newPager
}
}
} }
suspend fun getFilterOptionValues(filterOption: ItemFilterBy<*>): List<FilterValueOption> = suspend fun getFilterOptionValues(filterOption: ItemFilterBy<*>): List<FilterValueOption> =
@ -457,27 +470,26 @@ class CollectionFolderViewModel
suspend fun positionOfLetter(letter: Char): Int? = suspend fun positionOfLetter(letter: Char): Int? =
withContext(Dispatchers.IO) { withContext(Dispatchers.IO) {
item.value?.let { item -> val sort = sortAndDirection.value
val includeItemTypes = val filter = filter.value
when (item.data.collectionType) { if (sort == null || filter == null) {
CollectionType.MOVIES -> listOf(BaseItemKind.MOVIE) return@withContext null
CollectionType.TVSHOWS -> listOf(BaseItemKind.SERIES)
CollectionType.HOMEVIDEOS -> listOf(BaseItemKind.VIDEO)
else -> listOf()
} }
val request = val request =
GetItemsRequest( createGetItemsRequest(
parentId = item.id, sortAndDirection = sort,
includeItemTypes = includeItemTypes, recursive = recursive,
filter = filter,
).copy(
enableImageTypes = null,
fields = null,
nameLessThan = letter.toString(), nameLessThan = letter.toString(),
limit = 0, limit = 0,
enableTotalRecordCount = true, enableTotalRecordCount = true,
recursive = true,
) )
val result by GetItemsRequestHandler.execute(api, request) val result by GetItemsRequestHandler.execute(api, request)
result.totalRecordCount result.totalRecordCount
} }
}
fun setWatched( fun setWatched(
position: Int, position: Int,