6 lines
No EOL
16 KiB
JavaScript
6 lines
No EOL
16 KiB
JavaScript
import dom from"./../dom.js";import layoutManager from"./../layoutmanager.js";import backdrop from"./../backdrop/backdrop.js";import itemShortcuts from"./../shortcuts.js";import userSettings from"./../common/usersettings/usersettings.js";import itemManager from"./../common/itemmanager/itemmanager.js";import mediaInfo from"./../mediainfo/mediainfo.js";import cardBuilder from"./../cardbuilder/cardbuilder.js";import skinManager from"./../skinmanager.js";import connectionManager from"./../emby-apiclient/connectionmanager.js";import globalize from"./../common/globalize.js";import focusManager from"./../focusmanager.js";import mainTabsManager from"./../maintabsmanager.js";let supportsAsyncDecodedImages=dom.supportsAsyncDecodedImages(),decodingAttribute=supportsAsyncDecodedImages?' decoding="async"':"";function findScroller(instance){instance.scroller||(instance.scroller=(instance=instance.view).classList.contains("scrollFrameY")?instance:instance.querySelector(".scrollFrameY"))}function BaseTab(view,params,options){this.view=view,this.params=params,this.options=options,findScroller(this),this.requestedItemFields="BasicSyncInfo,CanDelete"}function onFocusPreviewItemFetched(instance,item,itemElement){instance.enableFocusPreview()&&instance.showFocusPreview(item,itemElement),item&&item.ServerId?instance._enableBackdrops&&backdrop.setBackdrop(item):backdrop.clear()}function fetchAndShowFocusPreview(instance,focused){var apiClient,item=instance.getFocusPreviewItem(focused);if(item&&instance.refetchItemForFocusPreview()&&instance.enableFocusPreview())return(apiClient=connectionManager.getApiClient(item)).getItem(apiClient.getCurrentUserId(),item.Id).then(function(item){onFocusPreviewItemFetched(instance,item,focused)});onFocusPreviewItemFetched(instance,item,focused)}function onSelectedInfoTimeout(){var focused;this.paused||((focused=this._focusedElement)?fetchAndShowFocusPreview(this,focused):onFocusPreviewItemFetched(this,null))}function clearSelectedInfoTimer(instance){var selectedItemInfoTimeout=instance.selectedItemInfoTimeout;selectedItemInfoTimeout&&(clearTimeout(selectedItemInfoTimeout),instance.selectedItemInfoTimeout=null)}function startSelectedInfoTimer(instance){clearSelectedInfoTimer(instance),instance.selectedItemInfoTimeout=setTimeout(onSelectedInfoTimeout.bind(instance),700)}function onItemsContainerFocusIn(e){e=e.target;this.onFocusIn(e)}function onItemsContainerFocusOut(e){this.onFocusOut()}let backgroundContainer=document.querySelector(".backgroundContainer"),backdropContainer=document.querySelector(".backdropContainer"),appHeader=document.querySelector(".skinHeader");function getFocusPreviewImageItems(){var item=this._focusPreviewImageItem,items=[];return item&&items.push(item),Promise.resolve({Items:items,TotalRecordCount:items.length})}function getFocusPreviewImageOptions(){return{renderer:cardBuilder,options:{shape:"auto",overlayText:!0,fields:[],action:"none",imageClass:"focusPreviewImageContainer",multiSelect:!1,contextMenu:!1,ratingButton:!1,playedButton:!1,cardClass:"focusPreviewImageCard",cardBoxClass:"focusPreviewImageCardBox",defaultIcon:!1,defaultBackground:!1,typeIndicator:!1,playedIndicator:!1,syncIndicator:!1,timerIndicator:!1,randomDefaultBackground:!1,staticElement:!0,progress:!1,enableUserData:!1,draggable:!1,moreButton:!1,programIndicators:!1,keepImageAnimation:!0,preferLogo:"x"===this.scrollDirection(),paddedImage:!1},virtualScrollLayout:"vertical-grid"}}function getLogoPlacement(item){return"TvChannel"===item.Type?null:("MusicAlbum"!==item.Type&&"Audio"!==item.Type&&"MusicVideo"!==item.Type||item.ImageTags&&item.ImageTags.Logo)&&userSettings.getEnableLogoAsTitle(globalize.getCurrentLocale())?"title":"float"}function fillFocusPreview(instance,elem,item,itemElement){item=item.CurrentProgram||item,backdrop.setBackdrop(item);var focusPreviewTitle=elem.querySelector(".focusPreviewTitle"),focusPreviewSecondaryTitle=elem.querySelector(".focusPreviewSecondaryTitle"),names=[],scrollDirection=instance.scrollDirection(),apiClient=connectionManager.getApiClient(item),itemForTitle="Timer"===item.Type&&item.ProgramInfo||item;let logoImage;if(apiClient&&(logoImage="x"===scrollDirection||"title"!==getLogoPlacement(itemForTitle)?null:apiClient.getLogoImageUrl(itemForTitle,{maxHeight:120},skinManager.getPreferredLogoImageTypes())),item.SeriesName){let name=item.SeriesName;logoImage&&(name='<img draggable="false" loading="lazy"'+decodingAttribute+' class="focusPreviewTitleImg" alt="'+name+'" src="'+logoImage+'" />',logoImage=null),names.push(name)}if(item.Name&&(item.EpisodeTitle||item.IsSeries)){let name=item.Name;logoImage&&(name='<img draggable="false" loading="lazy"'+decodingAttribute+' class="focusPreviewTitleImg" alt="'+name+'" src="'+logoImage+'" />',logoImage=null),names.push(name)}if(item.Name){let name=itemManager.getDisplayName(item,{});logoImage&&(name='<img draggable="false" loading="lazy"'+decodingAttribute+' class="focusPreviewTitleImg" alt="'+name+'" src="'+logoImage+'" />',logoImage=null),names.push(name)}focusPreviewTitle.innerHTML=names[0]||"",1<names.length?(focusPreviewSecondaryTitle.innerHTML=names[1]||"",focusPreviewSecondaryTitle.classList.remove("hide")):focusPreviewSecondaryTitle.classList.add("hide");var apiClient=elem.querySelector(".focusPreviewMediaInfo"),focusPreviewTitle="Program"===item.Type?mediaInfo.getSecondaryMediaInfoHtml(item,{timerIndicator:!0,channelName:!1,officialRating:!0,programIndicator:!0}):mediaInfo.getPrimaryMediaInfoHtml(item),names=(apiClient.innerHTML=focusPreviewTitle,"x"===scrollDirection?null:item.Overview);if(elem.querySelector(".focusPreviewOverview").innerHTML=names||"",names?elem.classList.remove("hide"):elem.classList.add("hide"),instance.enableFocusPreviewImage()){let focusPreviewImageElement=elem.querySelector(".focusPreviewImageElement");instance._focusPreviewImageItem=itemForTitle,focusPreviewImageElement.waitForCustomElementUpgrade().then(function(){focusPreviewImageElement.refreshItems()})}elem.classList.remove("hide"),itemElement&&"x"===scrollDirection&&(focusPreviewSecondaryTitle=itemElement.getBoundingClientRect(),apiClient=dom.getWindowSize().innerWidth,focusPreviewTitle=elem.style,focusPreviewSecondaryTitle.left<=.7*apiClient?(focusPreviewTitle.left=Math.min(focusPreviewSecondaryTitle.left,.6*apiClient)+"px",focusPreviewTitle.right=null):(focusPreviewTitle.right="3%",focusPreviewTitle.left="initial"))}function getBackdropItems(instance,apiClient,types,parentId){types={SortBy:"Random",Limit:1,Recursive:!0,IncludeItemTypes:types,ImageTypes:"Backdrop",ParentId:parentId,EnableTotalRecordCount:!1,ImageTypeLimit:1,Fields:instance.getRequestedItemFields(),EnableImageTypes:instance.getRequestedImageTypes()+",Backdrop"};return apiClient.getItems(apiClient.getCurrentUserId(),types)}function fillWithRandomItem(instance,elem,item,itemElement){var apiClient=connectionManager.getApiClient(item);let itemTypes="Movie,Series,Game,MusicAlbum,MusicArtist,Trailer";switch(item.CollectionType){case"movies":itemTypes="Movie";break;case"tvshows":itemTypes="Series";break;case"games":itemTypes="Game";break;case"musicvideos":itemTypes="MusicVideo";break;case"homevideos":itemTypes="Video";break;case"music":case"audiobooks":itemTypes="MusicAlbum,MusicArtist"}getBackdropItems(instance,apiClient,itemTypes,item.Id).then(function(result){fillFocusPreview(instance,elem,result.Items[0]||item,itemElement)})}function getScrollerNavOutDestination(direction){return direction===focusManager.directions.up?appHeader:null}BaseTab.prototype.scrollDirection=function(){return this.options?.scrollDirection||"y"},BaseTab.prototype.enablePushDownFocusPreview=function(){return!1},BaseTab.prototype.enableFocusPreview=function(){return!!layoutManager.tv&&("x"===this.scrollDirection()||this.enablePushDownFocusPreview())},BaseTab.prototype.createFocusPreviewElement=function(){let cssClass="focusPreviewContainer";"x"===this.scrollDirection()?cssClass+=" focusPreviewContainer-horizontal":cssClass+=" padded-left padded-right padded-top-page ";var html='<div class="hide '+cssClass+'"></div>',html=(this.view.insertAdjacentHTML("afterbegin",html),this.view.querySelector(".focusPreviewContainer"));return this.fillFocusPreviewContainer(html),html},BaseTab.prototype.getFocusPreviewElement=function(){var elem=this._focusPreviewElement;return elem||(this._focusPreviewElement=elem=this.createFocusPreviewElement()),elem},BaseTab.prototype.fillFocusPreviewContainer=function(elem){var scrollDirection=this.scrollDirection(),readOnlyContentStyle=this.enablePushDownFocusPreview()?' style="padding:0 .75em;width:40ch;"':"";elem.innerHTML='<div class="flex flex-direction-row align-items-center focusPreviewContainer-inner"><div is="emby-itemscontainer" class="itemsContainer focusPreviewImageElement align-items-center hide "></div><div class="readOnlyContent verticalFieldItems verticalFieldItems-condensed"'+readOnlyContentStyle+`>
|
|
<`+'h3 style="margin:0;" class="focusPreviewTitle verticalFieldItem-condensed"></h3'+`>
|
|
<`+'div class="focusPreviewSecondaryTitle hide verticalFieldItem-condensed"></div'+`>
|
|
<div class="secondaryText focusPreviewMediaInfo mediaInfoItems verticalFieldItem-condensed" style="font-size:92%;"></div>
|
|
<div class="secondaryText focusPreviewOverview verticalFieldItem-condensed `+("x"===scrollDirection?" focusPreviewOverview-horizontal":"")+`"></div>
|
|
</div></div>`;let itemsContainer=elem.querySelector(".itemsContainer");itemsContainer.fetchData=getFocusPreviewImageItems.bind(this),(itemsContainer.parentContainer=itemsContainer).getListOptions=getFocusPreviewImageOptions.bind(this),itemsContainer.waitForCustomElementUpgrade().then(function(){itemsContainer.resume({})})},BaseTab.prototype.autoFocus=function(options){options=Object.assign({skipIfNotEnabled:!0},options);let elem;var view=this.view;return view&&(elem=focusManager.autoFocus(view,options))?elem:(!options.skipIfNotEnabled||focusManager.isAutoFocusEnabled())&&(elem=mainTabsManager.focus())||null},BaseTab.prototype.showFocusPreview=function(item,itemElement){var elem=this.getFocusPreviewElement(item);if(!item||item.IsCategory)fillFocusPreview(this,elem,{}),this.hideFocusPreviewElementUsingDisplay()&&elem.classList.add("hide");else switch(item.Type){case"Channel":case"CollectionFolder":fillWithRandomItem(this,elem,item,itemElement);break;default:fillFocusPreview(this,elem,item,itemElement)}},BaseTab.prototype.hideFocusPreviewElementUsingDisplay=function(){return!0},BaseTab.prototype.refetchItemForFocusPreview=function(){return!1},BaseTab.prototype.getFocusPreviewItem=function(element){return itemShortcuts.getItemFromChildNode(element,!0)},BaseTab.prototype.enableFocusPreviewImage=function(){return"x"===this.scrollDirection()},BaseTab.prototype.onFocusIn=function(elem){this._focusedElement=elem,startSelectedInfoTimer(this)},BaseTab.prototype.onFocusOut=function(){this._focusedElement=null,startSelectedInfoTimer(this)},BaseTab.prototype.fillFocusPreviewIfNeeded=function(){if(this.enableFocusPreview()||this.enableBackdropsOnFocus()){let elem=document.activeElement||document.body;if(this.view.contains(elem)){var itemsContainer=elem.closest(".itemsContainer");if(itemsContainer&&elem.matches(itemsContainer.getItemSelector()))return}if(elem=this.view.querySelector(".card")){let itemsContainer=elem.closest(".itemsContainer");itemsContainer&&fetchAndShowFocusPreview(this,elem)}}},BaseTab.prototype.getRequestedItemFields=function(){let fields=this.requestedItemFields;return this.enableFocusPreview()&&(fields+=",Overview,CommunityRating,CriticRating,OfficialRating,PremiereDate,ProductionYear,Container"),fields},BaseTab.prototype.getRequestedImageTypes=function(){let fields="Primary,Backdrop,Thumb";return this.enableFocusPreview()&&(fields+=",Logo"),fields},BaseTab.prototype.enableBackdropsOnFocus=function(){return!!this.enableFocusPreview()||userSettings.enableBackdrops()},BaseTab.prototype.addFocusBehavior=function(element){this._enableBackdrops=layoutManager.tv&&this.enableBackdropsOnFocus(),(this._enableBackdrops||this.enableFocusPreview())&&(this.boundonItemsContainerFocusIn||(this.boundonItemsContainerFocusIn=onItemsContainerFocusIn.bind(this)),this.boundonItemsContainerFocusOut||(this.boundonItemsContainerFocusOut=onItemsContainerFocusOut.bind(this)),dom.addEventListener(element,"focus",this.boundonItemsContainerFocusIn,{capture:!0,passive:!0}),dom.addEventListener(element,"focusout",this.boundonItemsContainerFocusOut,{passive:!0}))},BaseTab.prototype.hasFocus=function(){var activeElement=document.activeElement,view=this.view;return activeElement&&view&&view.contains(activeElement)},BaseTab.prototype.scrollToBeginning=function(){var scroller=this.scroller;scroller&&scroller.scrollToBeginning()},BaseTab.prototype.loadTemplate=function(){return Promise.resolve()},BaseTab.prototype.onTemplateLoaded=function(){findScroller(this),this.view.classList.add("focuscontainer-x");var focusContainerElem=this.getFocusContainerElement();focusContainerElem&&(focusContainerElem.classList.add("focuscontainer-y","navout-up"),focusContainerElem.getNavOutDestination=getScrollerNavOutDestination)},BaseTab.prototype.getFocusContainerElement=function(){return this.scroller},BaseTab.prototype.getApiClient=function(){var serverId;return this.apiClient||((serverId=this.params.serverId||this.options?.serverId)?connectionManager.getApiClient(serverId):connectionManager.currentApiClient())},BaseTab.prototype.onBeginResume=function(options){this.paused=!1;var scroller=this.scroller;scroller&&scroller.beginResume&&scroller.beginResume(options)},BaseTab.prototype.onResume=function(options){this.paused=!1;var scroller=this.scroller,scroller=(scroller&&scroller.resume&&scroller.resume(options),this.enableFocusPreview());(scroller||this._focusPreviewElement)&&(this.enablePushDownFocusPreview()&&(this.scroller.setHeaderBindingEnabled(!scroller),options=this.scroller.querySelector(".scrollSlider.padded-top-page")||this.scroller.querySelector(".padded-top-page"),scroller?(this.scroller.classList.add("tab-scroller-withfocuspreview"),options&&options.classList.add("tab-scroller-withfocuspreview-padded-top-page"),backgroundContainer.classList.add("backgroundContainer-withfocuspreview"),backdropContainer.classList.add("backdropContainer-withfocuspreview"),"rtl"===document.dir?backdropContainer.classList.add("backdropContainer-withfocuspreview-rtl"):backdropContainer.classList.remove("backdropContainer-withfocuspreview-rtl"),appHeader.classList.add("appHeader-withfocuspreview"),this.scroller.setFocusScroll("center")):(this.scroller.classList.remove("tab-scroller-withfocuspreview"),options&&options.classList.remove("tab-scroller-withfocuspreview-padded-top-page"),backgroundContainer.classList.remove("backgroundContainer-withfocuspreview"),backdropContainer.classList.remove("backdropContainer-withfocuspreview","backdropContainer-withfocuspreview-rtl"),appHeader.classList.remove("appHeader-withfocuspreview"))),!scroller)&&this._focusPreviewElement&&this.showFocusPreview(null)},BaseTab.prototype.onPause=function(){this.paused=!0;var scroller=this.scroller,scroller=(scroller&&scroller.pause&&scroller.pause(),clearSelectedInfoTimer(this),this.enableFocusPreview());(scroller||this._focusPreviewElement)&&(this._focusPreviewElement&&this.showFocusPreview(null),this.enablePushDownFocusPreview())&&(backgroundContainer.classList.remove("backgroundContainer-withfocuspreview"),backdropContainer.classList.remove("backdropContainer-withfocuspreview","backdropContainer-withfocuspreview-rtl"),appHeader.classList.remove("appHeader-withfocuspreview"))},BaseTab.prototype.destroy=function(){this.paused=null,this.scroller=null,this.view=null,this.params=null,this.options=null,this.apiClient=null,this._focusedElement=null,this._enableBackdrops=null,this._focusPreviewElement=null,clearSelectedInfoTimer(this)};export default BaseTab; |