Methods

(static) SetUpOptions() → {void}

Returns:
Type: 
void

(static) configureBackdrop() → {void}

Returns:
Type: 
void

(static) configureGrid() → {void}

Returns:
Type: 
void

(static) deliverFilters(filters, errorMsg) → {void}

Hand the filter result back to the presenter, which owns m.apiFilters + the toast. This is needed because Roku promise callbacks run at component scope, not on the presenter class instance.

Parameters:
NameTypeDescription
filtersobject
errorMsgstring
Returns:
Type: 
void

(static) getCollectionType() → {string}

Returns:
Type: 
string

(static) getDefaultView() → {string}

Returns:
Type: 
string

(static) getItemFlatIndex(itemId) → {integer}

Returns the flat index of an item within the grid's content root. Called by GridItem via callFunc for O(1) index lookup (avoids O(N) child scan).

Parameters:
NameTypeDescription
itemIdstring

the Jellyfin item ID to look up

Returns:

flat index, or -1 if not found

Type: 
integer

(static) getItemFocused() → {dynamic}

Returns:
Type: 
dynamic

(static) hideTVGuide() → {void}

Hide TV Guide and return to grid

Returns:
Type: 
void

(static) init() → {void}

Returns:
Type: 
void

(static) loadFilters(params) → {void}

Render-thread filter load, collapsed from GetFiltersTask (Phase-4 pure-fetch Task collapse; see docs/dev/promises.md). Invoked by the presenter via callFunc so the body runs in component-m context, where fetchAsync + auto-abandon work — the presenter is a class, and the auto-abandon plugin only injects into components with onDestroy (which BaseGridView has). The presenter still owns m.apiFilters + the toast; this just fetches and hands the result back via deliverFilters().

Parameters:
NameTypeDescription
paramsobject
Returns:
Type: 
void

(static) loadInitialItems() → {void}

Returns:
Type: 
void

(static) loadLibraryFromRoute(route) → {void}

Configure the library view from its route. Both in-app navigation and a deep link / cast supply the rich library node as route.context.item (the resolver passes the node it already validated), so there is no fetch here. A missing context node is therefore an unexpected route shape, not a deferred feature — warn rather than silently render nothing.

Parameters:
NameTypeDescription
routeobject
Returns:
Type: 
void

(static) loadMoreData() → {void}

Returns:
Type: 
void

(static) onAlphaActiveChanged() → {void}

Returns:
Type: 
void

(static) onAlphaSelectedChanged() → {void}

Returns:
Type: 
void

(static) onDestroy() → {void}

onDestroy: Full teardown releasing all resources before component removal Called automatically via JRScreen.beforeViewClose when sgRouter permanently closes this view.

Returns:
Type: 
void

(static) onGenreItemFocused() → {void}

Returns:
Type: 
void

(static) onGenreItemSelected() → {void}

Returns:
Type: 
void

(static) onGenreSkeletonsReady(msg) → {void}

Draw the Genres view's rows before their artwork exists.

The task knows every genre's name as soon as the genre LIST query returns, which is one request rather than one-per-genre — so the list can be on screen long before the samples land. Each row gets its title and a single skeleton placeholder cell: a RowList does not lay out a childless row at all, and that one cell is also what gives the row its slot height.

genreSkeletons carries ids and titles, NOT nodes. Building the rows here rather than shipping them from the task keeps the payload of that cross-thread write small — the rendezvous is priced by what it carries. Same split of work as HomeRows.createSkeletonRows().

Nothing here is authoritative: content still arrives later with the real rows and replaces these wholesale. If it never arrives, the skeletons are what the failure looks like, which beats an empty screen.

Parameters:
NameTypeDescription
msgdynamic
Returns:
Type: 
void

(static) onItemDataLoaded(msg) → {void}

Parameters:
NameTypeDescription
msgdynamic
Returns:
Type: 
void

(static) onItemFocused() → {void}

Returns:
Type: 
void

(static) onItemSelected() → {void}

Returns:
Type: 
void

(static) onKeyEvent(key, press) → {boolean}

Parameters:
NameTypeDescription
keystring
pressboolean
Returns:
Type: 
boolean

(static) onLibrarySelection(msg) → {void}

A grid / genre / channel item was selected — navigate to its route (rich node as context). Non-navigable selections fall through to playback.

Parameters:
NameTypeDescription
msgdynamic
Returns:
Type: 
void

(static) onPresenterLogoLoaded(event) → {void}

Bridge callback for presenter logo loading - forwards to presenter.onLogoLoaded() This is needed because Roku observers look for functions at component scope, not on class instances. Presenters should observe with "onPresenterLogoLoaded".

Parameters:
NameTypeDescription
eventobject
Returns:
Type: 
void

(static) onPresenterTypeChanged() → {void}

Called when presenterType field changes - creates the appropriate presenter

Returns:
Type: 
void

(static) onQuickPlayLaunch(msg) → {void}

Forward a non-navigable selection to the playback launcher.

Parameters:
NameTypeDescription
msgdynamic
Returns:
Type: 
void

(static) onScreenHidden() → {void}

Returns:
Type: 
void

(static) onScreenShown() → {void}

Returns:
Type: 
void

(static) onTVGuideFocusedChannel() → {void}

Handle channel focus from TV Guide

Returns:
Type: 
void

(static) onTVGuideWatchChannel() → {void}

Handle channel selection from TV Guide

Returns:
Type: 
void

(static) onVoiceFilter() → {void}

Returns:
Type: 
void

(static) optionsClosed() → {void}

Returns:
Type: 
void

(static) prepareDataLoad(disableRemoteopt) → {void}

Prepare for data loading by stopping any active task, showing spinner, and hiding empty text

Parameters:
NameTypeAttributesDefaultDescription
disableRemoteboolean<optional>
false

Whether to disable remote input during loading

Returns:
Type: 
void

(static) reloadGridItems() → {void}

Full reset + reload of the grid. Used by optionsClosed (sort/filter/view change) and by the resume-time content-freshness check in onScreenShown (a delete elsewhere invalidated our cached content).

Returns:
Type: 
void

(static) revealGenreList(rowsRoot) → {void}

Swaps the genre RowList to a new set of rows and reveals it, preserving the user's position. ONE owner for both delivery stages — the skeleton rows and the real rows — so the opacity/focus/spinner sequence cannot drift between them.

rowsRoot is a DETACHED ContentNode root: building rows off-tree and assigning content once is a single change notification instead of one per row (the same shape onAlphaSelectedChanged already uses).

Focus/scroll: the view is interactive from the moment skeletons draw, so the user may have scrolled before the real rows land. Skeleton and real rows are 1:1 in server order, so the previous [row, item] position is index-stable — restore it rather than letting the content swap snap the list back to the top. The item index is clamped: a skeleton row holds one cell, the filled row up to 7.

Parameters:
NameTypeDescription
rowsRootobject
Returns:
Type: 
void

(static) setupNodes() → {void}

Returns:
Type: 
void

(static) showTVGuide() → {void}

Show TV Guide (EPG) for LiveTV

Returns:
Type: 
void

(static) updateBackdropForFocusedItem() → {void}

Returns:
Type: 
void

(static) updateTitle() → {void}

Returns:
Type: 
void