jellyfish-web/src/components/cardbuilder/chaptercardbuilder.js

137 lines
4.5 KiB
JavaScript
Raw Normal View History

2020-06-04 19:06:54 +03:00
/* eslint-disable indent */
2018-10-23 01:05:09 +03:00
2020-06-04 19:06:54 +03:00
/**
* Module for building cards from item data.
* @module components/cardBuilder/chaptercardbuilder
*/
2020-06-04 19:06:54 +03:00
import datetime from 'datetime';
import imageLoader from 'imageLoader';
import layoutManager from 'layoutManager';
import browser from 'browser';
const enableFocusTransform = !browser.slow && !browser.edge;
function buildChapterCardsHtml(item, chapters, options) {
// TODO move card creation code to Card component
2020-06-04 19:06:54 +03:00
let className = 'card itemAction chapterCard';
if (layoutManager.tv) {
className += ' show-focus';
if (enableFocusTransform) {
className += ' show-animation';
}
}
2020-06-04 19:06:54 +03:00
const mediaStreams = ((item.MediaSources || [])[0] || {}).MediaStreams || [];
const videoStream = mediaStreams.filter(({Type}) => {
return Type === 'Video';
})[0] || {};
2020-06-04 19:06:54 +03:00
let shape = (options.backdropShape || 'backdrop');
if (videoStream.Width && videoStream.Height) {
if ((videoStream.Width / videoStream.Height) <= 1.2) {
shape = (options.squareShape || 'square');
}
}
2020-06-04 19:06:54 +03:00
className += ` ${shape}Card`;
if (options.block || options.rows) {
className += ' block';
}
2020-06-04 19:06:54 +03:00
let html = '';
let itemsInRow = 0;
2020-08-30 06:06:47 +02:00
const apiClient = window.connectionManager.getApiClient(item.ServerId);
2020-06-04 19:06:54 +03:00
for (let i = 0, length = chapters.length; i < length; i++) {
if (options.rows && itemsInRow === 0) {
html += '<div class="cardColumn">';
}
2020-06-04 19:06:54 +03:00
const chapter = chapters[i];
html += buildChapterCard(item, apiClient, chapter, i, options, className, shape);
itemsInRow++;
if (options.rows && itemsInRow >= options.rows) {
itemsInRow = 0;
html += '</div>';
}
}
return html;
2018-10-23 01:05:09 +03:00
}
2020-06-04 19:06:54 +03:00
function getImgUrl({Id}, {ImageTag}, index, maxWidth, apiClient) {
if (ImageTag) {
return apiClient.getScaledImageUrl(Id, {
2020-07-31 15:18:32 +02:00
maxWidth: maxWidth,
2020-06-04 19:06:54 +03:00
tag: ImageTag,
2020-05-04 12:44:12 +02:00
type: 'Chapter',
2020-06-04 19:06:54 +03:00
index
});
}
return null;
2018-10-23 01:05:09 +03:00
}
2020-06-04 19:06:54 +03:00
function buildChapterCard(item, apiClient, chapter, index, {width, coverImage}, className, shape) {
const imgUrl = getImgUrl(item, chapter, index, width || 400, apiClient);
2020-06-04 19:06:54 +03:00
let cardImageContainerClass = 'cardContent cardContent-shadow cardImageContainer chapterCardImageContainer';
if (coverImage) {
cardImageContainerClass += ' coveredImage';
}
2020-06-04 19:06:54 +03:00
const dataAttributes = ` data-action="play" data-isfolder="${item.IsFolder}" data-id="${item.Id}" data-serverid="${item.ServerId}" data-type="${item.Type}" data-mediatype="${item.MediaType}" data-positionticks="${chapter.StartPositionTicks}"`;
let cardImageContainer = imgUrl ? (`<div class="${cardImageContainerClass} lazy" data-src="${imgUrl}">`) : (`<div class="${cardImageContainerClass}">`);
if (!imgUrl) {
2020-04-26 02:37:28 +03:00
cardImageContainer += '<span class="material-icons cardImageIcon local_movies"></span>';
}
2020-06-04 19:06:54 +03:00
let nameHtml = '';
nameHtml += `<div class="cardText">${chapter.Name}</div>`;
nameHtml += `<div class="cardText">${datetime.getDisplayRunningTime(chapter.StartPositionTicks)}</div>`;
2020-06-04 19:06:54 +03:00
const cardBoxCssClass = 'cardBox';
const cardScalableClass = 'cardScalable';
2020-07-30 19:42:30 +02:00
return `<button type="button" class="${className}"${dataAttributes}><div class="${cardBoxCssClass}"><div class="${cardScalableClass}"><div class="cardPadder-${shape}"></div>${cardImageContainer}</div><div class="innerCardFooter">${nameHtml}</div></div></div></button>`;
2018-10-23 01:05:09 +03:00
}
2020-06-04 19:06:54 +03:00
export function buildChapterCards(item, chapters, options) {
2018-10-23 01:05:09 +03:00
if (options.parentContainer) {
// Abort if the container has been disposed
if (!document.body.contains(options.parentContainer)) {
return;
}
if (chapters.length) {
options.parentContainer.classList.remove('hide');
} else {
options.parentContainer.classList.add('hide');
return;
}
2018-10-23 01:05:09 +03:00
}
2020-06-04 19:06:54 +03:00
const html = buildChapterCardsHtml(item, chapters, options);
options.itemsContainer.innerHTML = html;
imageLoader.lazyChildren(options.itemsContainer);
2018-10-23 01:05:09 +03:00
}
2020-06-04 19:06:54 +03:00
/* eslint-enable indent */
export default {
buildChapterCards: buildChapterCards
};