mirror of
https://github.com/jellyfin/jellyfin-web
synced 2025-03-30 19:56:21 +00:00
143 lines
4.4 KiB
JavaScript
143 lines
4.4 KiB
JavaScript
import cardBuilder from '../../components/cardbuilder/cardBuilder';
|
|
import imageLoader from '../../components/images/imageLoader';
|
|
import libraryBrowser from '../../scripts/libraryBrowser';
|
|
import loading from '../../components/loading/loading';
|
|
import * as userSettings from '../../scripts/settings/userSettings';
|
|
import Events from '../../utils/events.ts';
|
|
|
|
import '../../elements/emby-itemscontainer/emby-itemscontainer';
|
|
|
|
export default function (view, params, tabContent) {
|
|
function getPageData() {
|
|
if (!pageData) {
|
|
pageData = {
|
|
query: {
|
|
StartIndex: 0,
|
|
Fields: 'PrimaryImageAspectRatio'
|
|
}
|
|
};
|
|
}
|
|
|
|
if (userSettings.libraryPageSize() > 0) {
|
|
pageData.query['Limit'] = userSettings.libraryPageSize();
|
|
}
|
|
|
|
return pageData;
|
|
}
|
|
|
|
function getQuery() {
|
|
return getPageData().query;
|
|
}
|
|
|
|
function getChannelsHtml(channels) {
|
|
return cardBuilder.getCardsHtml({
|
|
items: channels,
|
|
shape: 'square',
|
|
showTitle: true,
|
|
lazy: true,
|
|
cardLayout: true,
|
|
showDetailsMenu: true,
|
|
showCurrentProgram: true,
|
|
showCurrentProgramTime: true
|
|
});
|
|
}
|
|
|
|
function renderChannels(context, result) {
|
|
function onNextPageClick() {
|
|
if (isLoading) {
|
|
return;
|
|
}
|
|
|
|
if (userSettings.libraryPageSize() > 0) {
|
|
query.StartIndex += query.Limit;
|
|
}
|
|
reloadItems(context).then(() => {
|
|
window.scrollTo(0, 0);
|
|
});
|
|
}
|
|
|
|
function onPreviousPageClick() {
|
|
if (isLoading) {
|
|
return;
|
|
}
|
|
|
|
if (userSettings.libraryPageSize() > 0) {
|
|
query.StartIndex = Math.max(0, query.StartIndex - query.Limit);
|
|
}
|
|
reloadItems(context).then(() => {
|
|
window.scrollTo(0, 0);
|
|
});
|
|
}
|
|
|
|
const query = getQuery();
|
|
|
|
for (const elem of context.querySelectorAll('.paging')) {
|
|
elem.innerHTML = libraryBrowser.getQueryPagingHtml({
|
|
startIndex: query.StartIndex,
|
|
limit: query.Limit,
|
|
totalRecordCount: result.TotalRecordCount,
|
|
showLimit: false,
|
|
updatePageSizeSetting: false,
|
|
filterButton: false
|
|
});
|
|
}
|
|
|
|
const html = getChannelsHtml(result.Items);
|
|
const elem = context.querySelector('#items');
|
|
elem.innerHTML = html;
|
|
imageLoader.lazyChildren(elem);
|
|
let i;
|
|
let length;
|
|
let elems;
|
|
|
|
for (elems = context.querySelectorAll('.btnNextPage'), i = 0, length = elems.length; i < length; i++) {
|
|
elems[i].addEventListener('click', onNextPageClick);
|
|
}
|
|
|
|
for (elems = context.querySelectorAll('.btnPreviousPage'), i = 0, length = elems.length; i < length; i++) {
|
|
elems[i].addEventListener('click', onPreviousPageClick);
|
|
}
|
|
}
|
|
|
|
function showFilterMenu(context) {
|
|
import('../../components/filterdialog/filterdialog').then(({ default: FilterDialog }) => {
|
|
const filterDialog = new FilterDialog({
|
|
query: getQuery(),
|
|
mode: 'livetvchannels',
|
|
serverId: ApiClient.serverId()
|
|
});
|
|
Events.on(filterDialog, 'filterchange', function () {
|
|
reloadItems(context);
|
|
});
|
|
filterDialog.show();
|
|
});
|
|
}
|
|
|
|
function reloadItems(context) {
|
|
loading.show();
|
|
isLoading = true;
|
|
const query = getQuery();
|
|
const apiClient = ApiClient;
|
|
query.UserId = apiClient.getCurrentUserId();
|
|
return apiClient.getLiveTvChannels(query).then(function (result) {
|
|
renderChannels(context, result);
|
|
loading.hide();
|
|
isLoading = false;
|
|
|
|
import('../../components/autoFocuser').then(({ default: autoFocuser }) => {
|
|
autoFocuser.autoFocus(context);
|
|
});
|
|
});
|
|
}
|
|
|
|
let pageData;
|
|
const self = this;
|
|
let isLoading = false;
|
|
tabContent.querySelector('.btnFilter').addEventListener('click', function () {
|
|
showFilterMenu(tabContent);
|
|
});
|
|
|
|
self.renderTab = function () {
|
|
reloadItems(tabContent);
|
|
};
|
|
}
|