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,50 +304,14 @@ 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 includeItemTypes =
item
?.data
?.collectionType
?.baseItemKinds
.orEmpty()
val request = val request =
filter.applyTo( createGetItemsRequest(
GetItemsRequest( sortAndDirection = sortAndDirection,
parentId = item?.id, recursive = recursive,
enableImageTypes = listOf(ImageType.PRIMARY, ImageType.THUMB), filter = filter,
includeItemTypes = includeItemTypes,
recursive = recursive,
excludeItemIds = item?.let { listOf(item.id) },
sortBy =
buildList {
if (sortAndDirection.sort != ItemSortBy.DEFAULT) {
add(sortAndDirection.sort)
if (sortAndDirection.sort != ItemSortBy.SORT_NAME) {
add(ItemSortBy.SORT_NAME)
}
if (item?.data?.collectionType == CollectionType.MOVIES) {
add(ItemSortBy.PRODUCTION_YEAR)
}
}
},
sortOrder =
buildList {
if (sortAndDirection.sort != ItemSortBy.DEFAULT) {
add(sortAndDirection.direction)
if (sortAndDirection.sort != ItemSortBy.SORT_NAME) {
add(SortOrder.ASCENDING)
}
if (item?.data?.collectionType == CollectionType.MOVIES) {
add(SortOrder.ASCENDING)
}
}
},
fields = SlimItemFields,
),
) )
val newPager = val newPager =
ApiRequestPager( ApiRequestPager(
@ -378,6 +342,55 @@ class CollectionFolderViewModel
newPager newPager
} }
} }
private fun createGetItemsRequest(
sortAndDirection: SortAndDirection,
recursive: Boolean,
filter: GetItemsFilter,
): GetItemsRequest {
val item = item.value
val includeItemTypes =
item
?.data
?.collectionType
?.baseItemKinds
.orEmpty()
val request =
filter.applyTo(
GetItemsRequest(
parentId = item?.id,
enableImageTypes = listOf(ImageType.PRIMARY, ImageType.THUMB),
includeItemTypes = includeItemTypes,
recursive = recursive,
excludeItemIds = item?.let { listOf(item.id) },
sortBy =
buildList {
if (sortAndDirection.sort != ItemSortBy.DEFAULT) {
add(sortAndDirection.sort)
if (sortAndDirection.sort != ItemSortBy.SORT_NAME) {
add(ItemSortBy.SORT_NAME)
}
if (item?.data?.collectionType == CollectionType.MOVIES) {
add(ItemSortBy.PRODUCTION_YEAR)
}
}
},
sortOrder =
buildList {
if (sortAndDirection.sort != ItemSortBy.DEFAULT) {
add(sortAndDirection.direction)
if (sortAndDirection.sort != ItemSortBy.SORT_NAME) {
add(SortOrder.ASCENDING)
}
if (item?.data?.collectionType == CollectionType.MOVIES) {
add(SortOrder.ASCENDING)
}
}
},
fields = SlimItemFields,
),
)
return request
} }
suspend fun getFilterOptionValues(filterOption: ItemFilterBy<*>): List<FilterValueOption> = suspend fun getFilterOptionValues(filterOption: ItemFilterBy<*>): List<FilterValueOption> =
@ -457,26 +470,25 @@ 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 =
GetItemsRequest(
parentId = item.id,
includeItemTypes = includeItemTypes,
nameLessThan = letter.toString(),
limit = 0,
enableTotalRecordCount = true,
recursive = true,
)
val result by GetItemsRequestHandler.execute(api, request)
result.totalRecordCount
} }
val request =
createGetItemsRequest(
sortAndDirection = sort,
recursive = recursive,
filter = filter,
).copy(
enableImageTypes = null,
fields = null,
nameLessThan = letter.toString(),
limit = 0,
enableTotalRecordCount = true,
)
val result by GetItemsRequestHandler.execute(api, request)
result.totalRecordCount
} }
fun setWatched( fun setWatched(