EmbyCrackedClient/web/modules/tabbedview/tabbedview.js
2025-06-25 11:46:04 +08:00

1 line
No EOL
12 KiB
JavaScript

import backdrop from"./../backdrop/backdrop.js";import globalize from"./../common/globalize.js";import layoutManager from"./../layoutmanager.js";import mainTabsManager from"./../maintabsmanager.js";import appHeader from"./../appheader/appheader.js";import userSettings from"./../common/usersettings/usersettings.js";import connectionManager from"./../emby-apiclient/connectionmanager.js";import BaseView from"./../viewmanager/baseview.js";import"./../emby-elements/emby-tabs/emby-tabs.js";import appRouter from"./../approuter.js";import queryString from"./../common/querystring.js";import loading from"./../loading/loading.js";import focusManager from"../focusmanager.js";function getResponseHelper(){return Emby.importModule("./modules/common/responsehelper.js")}function allowTabAnimation(){var deviceMemory,platform,cores=navigator.hardwareConcurrency||4;return!(cores<4||(2400<=(screen.width||screen.availWidth||0)||1400<=(screen.height||screen.availHeight||0))&&cores<6||(deviceMemory=navigator.deviceMemory||2)<2||(platform=(navigator.platform||"").toLowerCase(),"android"===globalThis.appMode&&(cores<4||deviceMemory<2||platform.includes("armv7"))))}let enableTabAnimation=allowTabAnimation(),fadeSize="1.5%",fadeDuration=300;function fadeInLeft(elem){var keyframes=[{opacity:"0",transform:"translate3d(-"+fadeSize+", 0, 0)",offset:0},{opacity:"1",transform:"none",offset:1}],timing={duration:fadeDuration,iterations:1,easing:"ease-out"};elem.animate(keyframes,timing)}function fadeInRight(elem){var keyframes=[{opacity:"0",transform:"translate3d("+fadeSize+", 0, 0)",offset:0},{opacity:"1",transform:"none",offset:1}],timing={duration:fadeDuration,iterations:1,easing:"ease-out"};elem.animate(keyframes,timing)}function onDataFetchError(instance,controller,response){loading.hide(),getResponseHelper().then(function(responseHelper){return responseHelper.getErrorInfo(response).then(function(errorInfo){let errorElement=controller._errorElement;var html;return errorElement||((errorElement=document.createElement("div")).classList.add("padded-left","padded-right","padded-top"),html="",html=(html='<div class="readOnlyContent"><h2 class="errorMessage" style="margin:0 0 1em;font-weight:400"></h2>')+'<button is="emby-button" type="button" class="raised btnRetryData" style="margin:0;">'+globalize.translate("Retry")+"</button></div>",errorElement.innerHTML=html,(html=controller.scroller?.getScrollSlider()||controller.view).insertBefore(errorElement,html.firstChild),(controller._errorElement=errorElement).querySelector(".btnRetryData").addEventListener("click",retryControllerResume.bind(instance))),errorElement.querySelector(".errorMessage").innerHTML=errorInfo.html,errorElement.classList.remove("hide"),focusManager.focus(errorElement.querySelector(".btnRetryData")),Promise.reject(response)})})}function resumeController(instance,controller,options,showError){return controller._errorElement&&!controller._errorElement.classList.contains("hide")&&(controller._errorElement.classList.add("hide"),(options=options||{}).refresh=!0),(controller.onResume(options)||Promise.resolve()).catch(function(errorResponse){return showError&&503===errorResponse?.status?onDataFetchError(instance,controller,errorResponse):Promise.reject(errorResponse)})}function retryControllerResume(){var currentTabController=this.currentTabController;loading.show(),resumeController(this,currentTabController,{refresh:!0,autoFocus:!0},!0)}function loadTab(instance,index,previousIndex,previousTabController){instance.getTabController(index).then(function(controller){let autoFocus=null==previousIndex;!autoFocus&&layoutManager.tv&&previousTabController&&previousTabController.view&&!appHeader.hasFocus()&&(autoFocus=!0),resumeController(instance,controller,{autoFocus:autoFocus,refresh:!controller.refreshed},!0),controller.refreshed=!0,null!=previousIndex&&layoutManager.tv&&enableTabAnimation&&controller.view&&controller.view.animate&&(index<previousIndex?fadeInLeft(controller.view):previousIndex<index&&fadeInRight(controller.view)),instance.currentTabIndex=index,instance.currentTabController=controller})}function onTabChange(e){var tabInfo,params,newIndex=parseInt(e.detail.selectedTabIndex),e=e.detail.previousIndex,previousTabController=null==e?null:this.tabControllers[e];if(previousTabController&&previousTabController.onPause&&previousTabController.onPause(),null!=previousTabController){let path=appRouter.currentViewPath();path&&(tabInfo=this.getLoadedTabs()[newIndex],(params=Object.assign({},this.params)).tab=tabInfo.id,path.includes("?")||(path+="?"),path+=queryString.paramsToString(params),appRouter.replaceState(path,!1))}previousTabController&&this.onTabChange(previousTabController),loadTab(this,newIndex,e,previousTabController)}function getTabContainers(){return this.view.querySelectorAll(".tabContent")}function TabbedView(view,params){BaseView.apply(this,arguments),this.getTabContainersFn=getTabContainers.bind(this),this.onTabChangeFn=onTabChange.bind(this),this.getLoadedTabsFn=this.getLoadedTabs.bind(this),this.tabControllers=[]}function refreshItem(instance){return instance.item?Promise.resolve(instance.item):instance.fetchItem()}function onItemRefreshed(item){return this.isDestroyed()||(this.item=item,this.setTitle(),this.setTabs()),Promise.resolve()}function initTabController(controller,templateAlreadyLoaded){return templateAlreadyLoaded?(controller.onTemplateLoaded(),Promise.resolve(controller)):controller.loadTemplate().then(function(responses){return responses&&responses.length&&(controller.view.innerHTML=globalize.translateDocument(responses[0])),controller.onTemplateLoaded(),controller})}function returnFirstDependencyDefault(obj){return(obj=Array.isArray(obj)?obj[0]:obj).default||obj}function convertTemplateToHorizontal(html){return Emby.importModule("./modules/tabbedview/viewhelper.js").then(function(viewHelper){return viewHelper.convertTemplateToHorizontal(html)})}function getTemplateHtml(instance,templateToLoad){return require(["text!"+templateToLoad]).then(function(responses){responses=responses[0];return"x"===instance.tabScrollDirection()?convertTemplateToHorizontal(responses):responses})}function replaceTabContentIfNeeded(instance,tabContent){var swapNode=tabContent.getAttribute("data-swapnode");let templateToLoad;return(templateToLoad="itemstab"===swapNode?"modules/tabbedview/itemstab.template.html":templateToLoad)?getTemplateHtml(instance,templateToLoad).then(function(html){tabContent.insertAdjacentHTML("afterend",globalize.translateHtml(html));html=tabContent.nextElementSibling;return html.setAttribute("data-index",tabContent.getAttribute("data-index")),html.className+=" "+tabContent.className,tabContent.remove(),Promise.resolve({tabContent:html,contentLoaded:!0})}):Promise.resolve({tabContent:tabContent,contentLoaded:!1})}Object.assign(TabbedView.prototype,BaseView.prototype),TabbedView.prototype.onInputCommand=function(e){switch(e.detail.command){case"back":var currentTabController=this.currentTabController;if(layoutManager.tv&&currentTabController&&currentTabController.hasFocus()&&mainTabsManager.focus())return currentTabController.scrollToBeginning(),e.preventDefault(),void e.stopPropagation();break;case"refresh":{let currentTabController=this.currentTabController;return currentTabController&&currentTabController.refresh&&currentTabController.refresh({refresh:!0}),void e.preventDefault()}}BaseView.prototype.onInputCommand.apply(this,arguments)},TabbedView.prototype.onTabChange=function(previousTabController){},TabbedView.prototype.fetchItem=function(){var apiClient,params=this.params;return params.parentId?(apiClient=connectionManager.getApiClient(params.serverId)).getItem(apiClient.getCurrentUserId(),params.parentId):Promise.resolve(null)},TabbedView.prototype.getLoadedTabs=function(){let tabs=this._tabs;return tabs||(tabs=this.getTabs(),this._tabs=tabs),tabs},TabbedView.prototype.getDefaultTabUserSettingsValue=function(folderId){return userSettings.get("landing-"+folderId)},TabbedView.prototype.getDefaultTabIndex=function(folderId){var folderId=(folderId?this.getDefaultTabUserSettingsValue(folderId):null)||this.getDefaultTabId(),tabs=this.getLoadedTabs(),folderId=this.getTabIndex(folderId,tabs);if(null!=folderId)return folderId;for(let i=0,length=tabs.length;i<length;i++)if(!1!==tabs[i].enabled)return i},TabbedView.prototype.getDefaultTabId=function(){return null},TabbedView.prototype.getTabControllerOptions=function(id){var options={item:this.item};return"albumartists"===id?options.mode="albumartists":"composers"===id?options.mode="composers":"genres"===id&&(options.queryIncludeItemTypes=[]),options.scrollDirection=this.tabScrollDirection(),options},TabbedView.prototype.supportsHorizontalTabScroll=function(){return!1},TabbedView.prototype.tabScrollDirection=function(){return this.supportsHorizontalTabScroll()&&layoutManager.tv&&"horizontal"===userSettings.tvHome()?"x":"y"},TabbedView.prototype.getTabController=function(index){var controller=this.tabControllers[index];if(controller)return Promise.resolve(controller);let tabInfo=this.getLoadedTabs()[index],instance=this;return this.loadTabController(tabInfo.id).then(function(responses){let controllerFactory=returnFirstDependencyDefault(responses),controller=instance.tabControllers[index];if(controller)return controller;{let tabContent=instance.view.querySelector(".tabContent[data-index='"+index+"']");return replaceTabContentIfNeeded(instance,tabContent).then(function(tabContentInfo){tabContent=tabContentInfo.tabContent;tabContentInfo=tabContentInfo.contentLoaded;return controller=new controllerFactory(tabContent,instance.getTabControllerParams(tabInfo.id),instance.getTabControllerOptions(tabInfo.id)),instance.tabControllers[index]=controller,instance.onTabControllerCreated(controller),initTabController(controller,tabContentInfo)})}})},TabbedView.prototype.onTabControllerCreated=function(controller){},TabbedView.prototype.getTabControllerParams=function(id){return Object.assign({},this.params)},TabbedView.prototype.getTabIndex=function(id,tabs){tabs=tabs||this.getLoadedTabs();let i,length,tab;for(i=0,length=tabs.length;i<length;i++)if(!1!==(tab=tabs[i]).enabled&&tab.id===id)return i;return null},TabbedView.prototype.setTabs=function(options){null==this.currentTabIndex&&((params=this.params).tab&&(this.currentTabIndex=this.getTabIndex(params.tab)),null==this.currentTabIndex&&(this.currentTabIndex=this.getDefaultTabIndex(this.item?.Guid||params.parentId)),this.initialTabIndex=this.currentTabIndex);var params=this.currentTabController;mainTabsManager.setTabs(this.view,this.currentTabIndex,this.getLoadedTabsFn,this.getTabContainersFn,this.onTabChangeFn,null==params)},TabbedView.prototype.autoFocus=function(options){var currentTabController=this.currentTabController;return currentTabController?.autoFocus?currentTabController.autoFocus(options):BaseView.prototype.autoFocus.apply(this,arguments)},TabbedView.prototype.onBeginResume=function(options){BaseView.prototype.onBeginResume.apply(this,arguments),userSettings.enableBackdrops()||backdrop.clear(),this.refreshItemPromise=refreshItem(this);var currentTabController=this.currentTabController;currentTabController&&currentTabController.onBeginResume&&currentTabController.onBeginResume(options)},TabbedView.prototype.onResume=function(options){BaseView.prototype.onResume.apply(this,arguments);let instance=this,promise=this.refreshItemPromise;(promise=(promise=promise&&promise.then(onItemRefreshed.bind(this)))||Promise.resolve()).then(function(){var currentTabController=instance.currentTabController;if(currentTabController&&currentTabController.onResume)return resumeController(instance,currentTabController,options,!1)}).catch(function(errorResponse){var currentTabController=instance.currentTabController;return onDataFetchError(instance,currentTabController,errorResponse)})},TabbedView.prototype.onPause=function(){BaseView.prototype.onPause.apply(this,arguments);var currentTabController=this.currentTabController;currentTabController&&currentTabController.onPause&&currentTabController.onPause()},TabbedView.prototype.setTitle=function(){appHeader.setTitle(this.getTitle())},TabbedView.prototype.getTitle=function(){return!layoutManager.tv&&this.item||""},TabbedView.prototype.destroy=function(){BaseView.prototype.destroy.apply(this,arguments);var tabControllers=this.tabControllers;if(tabControllers){for(let i=0,length=tabControllers.length;i<length;i++){var tabController=tabControllers[i];tabController&&(tabController.onPause&&tabController.onPause(),tabController.destroy)&&tabController.destroy()}this.tabControllers=null}this.currentTabController=null,this.initialTabIndex=null,this.item=null,this.refreshItemPromise=null};export default TabbedView;