1
0
Fork 0
mirror of https://github.com/jellyfin/jellyfin-web synced 2025-03-30 19:56:21 +00:00
This commit is contained in:
Luke Pulverenti 2017-01-27 18:07:14 -05:00
parent 82bcca376f
commit 8a6884abef
494 changed files with 256 additions and 120180 deletions

View file

@ -1,69 +1 @@
.mainAnimatedPage {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
contain: layout style;
/* Can't use will-change because it causes the alpha picker to move when the page scrolls*/
/*will-change: transform;*/
}
@keyframes view-fadeout {
from {
opacity: 1;
}
to {
opacity: 0;
}
}
@keyframes view-fadein {
from {
opacity: 0;
}
to {
opacity: 1;
}
}
@keyframes view-slideleft {
from {
transform: translate3d(100%, 0, 0);
}
to {
transform: none;
}
}
@keyframes view-slideleft-r {
from {
transform: none;
}
to {
transform: translate3d(-100%, 0, 0);
}
}
@keyframes view-slideright {
from {
transform: translate3d(-100%, 0, 0);
}
to {
transform: none;
}
}
@keyframes view-slideright-r {
from {
transform: none;
}
to {
transform: translate3d(100%, 0, 0);
}
}
.mainAnimatedPage{position:absolute;top:0;left:0;right:0;bottom:0;contain:layout style}@-webkit-keyframes view-fadeout{from{opacity:1}to{opacity:0}}@keyframes view-fadeout{from{opacity:1}to{opacity:0}}@-webkit-keyframes view-fadein{from{opacity:0}to{opacity:1}}@keyframes view-fadein{from{opacity:0}to{opacity:1}}@-webkit-keyframes view-slideleft{from{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}to{-webkit-transform:none;transform:none}}@keyframes view-slideleft{from{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}to{-webkit-transform:none;transform:none}}@-webkit-keyframes view-slideleft-r{from{-webkit-transform:none;transform:none}to{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}}@keyframes view-slideleft-r{from{-webkit-transform:none;transform:none}to{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}}@-webkit-keyframes view-slideright{from{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}to{-webkit-transform:none;transform:none}}@keyframes view-slideright{from{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}to{-webkit-transform:none;transform:none}}@-webkit-keyframes view-slideright-r{from{-webkit-transform:none;transform:none}to{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}}@keyframes view-slideright-r{from{-webkit-transform:none;transform:none}to{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}}

View file

@ -1,278 +1 @@
define(['browser', 'dom', 'css!./viewcontainer-lite'], function (browser, dom) {
'use strict';
var mainAnimatedPages = document.querySelector('.mainAnimatedPages');
var allPages = [];
var currentUrls = [];
var pageContainerCount = 3;
var selectedPageIndex = -1;
var forceDisableAnimation = navigator.userAgent.toLowerCase().indexOf('embytheaterpi') !== -1;
function enableAnimation() {
// too slow
if (browser.tv) {
return false;
}
if (forceDisableAnimation) {
return false;
}
return browser.supportsCssAnimation();
}
function loadView(options) {
if (options.cancel) {
return;
}
cancelActiveAnimations();
var selected = selectedPageIndex;
var previousAnimatable = selected === -1 ? null : allPages[selected];
var pageIndex = selected + 1;
if (pageIndex >= pageContainerCount) {
pageIndex = 0;
}
var view = document.createElement('div');
if (options.type) {
view.setAttribute('data-type', options.type);
}
var properties = [];
if (options.fullscreen) {
properties.push('fullscreen');
}
if (properties.length) {
view.setAttribute('data-properties', properties.join(','));
}
view.innerHTML = options.view;
var currentPage = allPages[pageIndex];
var animatable = view;
view.classList.add('mainAnimatedPage');
if (currentPage) {
triggerDestroy(currentPage);
mainAnimatedPages.replaceChild(view, currentPage);
} else {
mainAnimatedPages.appendChild(view);
}
allPages[pageIndex] = view;
if (onBeforeChange) {
onBeforeChange(view, false, options);
}
beforeAnimate(allPages, pageIndex, selected);
// animate here
return animate(animatable, previousAnimatable, options.transition, options.isBack).then(function () {
selectedPageIndex = pageIndex;
currentUrls[pageIndex] = options.url;
if (!options.cancel && previousAnimatable) {
afterAnimate(allPages, pageIndex);
}
return view;
});
}
function beforeAnimate(allPages, newPageIndex, oldPageIndex) {
for (var i = 0, length = allPages.length; i < length; i++) {
if (newPageIndex === i || oldPageIndex === i) {
//allPages[i].classList.remove('hide');
} else {
allPages[i].classList.add('hide');
}
}
}
function afterAnimate(allPages, newPageIndex) {
for (var i = 0, length = allPages.length; i < length; i++) {
if (newPageIndex === i) {
//allPages[i].classList.remove('hide');
} else {
allPages[i].classList.add('hide');
}
}
}
function animate(newAnimatedPage, oldAnimatedPage, transition, isBack) {
if (enableAnimation() && oldAnimatedPage) {
if (transition === 'slide') {
return slide(newAnimatedPage, oldAnimatedPage, transition, isBack);
} else if (transition === 'fade') {
return fade(newAnimatedPage, oldAnimatedPage, transition, isBack);
}
}
return Promise.resolve();
}
function slide(newAnimatedPage, oldAnimatedPage, transition, isBack) {
return new Promise(function (resolve, reject) {
var duration = 450;
var animations = [];
if (oldAnimatedPage) {
if (isBack) {
setAnimation(oldAnimatedPage, 'view-slideright-r ' + duration + 'ms ease-out normal both');
} else {
setAnimation(oldAnimatedPage, 'view-slideleft-r ' + duration + 'ms ease-out normal both');
}
animations.push(oldAnimatedPage);
}
if (isBack) {
setAnimation(newAnimatedPage, 'view-slideright ' + duration + 'ms ease-out normal both');
} else {
setAnimation(newAnimatedPage, 'view-slideleft ' + duration + 'ms ease-out normal both');
}
animations.push(newAnimatedPage);
currentAnimations = animations;
var onAnimationComplete = function () {
dom.removeEventListener(newAnimatedPage, dom.whichAnimationEvent(), onAnimationComplete, {
once: true
});
resolve();
};
dom.addEventListener(newAnimatedPage, dom.whichAnimationEvent(), onAnimationComplete, {
once: true
});
});
}
function fade(newAnimatedPage, oldAnimatedPage, transition, isBack) {
return new Promise(function (resolve, reject) {
var duration = 400;
var animations = [];
if (oldAnimatedPage) {
setAnimation(oldAnimatedPage, 'view-fadeout ' + duration + 'ms ease-out normal both');
animations.push(oldAnimatedPage);
}
setAnimation(newAnimatedPage, 'view-fadein ' + duration + 'ms ease-in normal both');
animations.push(newAnimatedPage);
currentAnimations = animations;
var onAnimationComplete = function () {
dom.removeEventListener(newAnimatedPage, dom.whichAnimationEvent(), onAnimationComplete, {
once: true
});
resolve();
};
dom.addEventListener(newAnimatedPage, dom.whichAnimationEvent(), onAnimationComplete, {
once: true
});
});
}
function setAnimation(elem, value) {
requestAnimationFrame(function () {
elem.style.animation = value;
});
}
var currentAnimations = [];
function cancelActiveAnimations() {
var animations = currentAnimations;
for (var i = 0, length = animations.length; i < length; i++) {
animations[i].animation = 'none';
}
}
var onBeforeChange;
function setOnBeforeChange(fn) {
onBeforeChange = fn;
}
function tryRestoreView(options) {
var url = options.url;
var index = currentUrls.indexOf(url);
if (index !== -1) {
var animatable = allPages[index];
var view = animatable;
if (view) {
if (options.cancel) {
return;
}
cancelActiveAnimations();
var selected = selectedPageIndex;
var previousAnimatable = selected === -1 ? null : allPages[selected];
if (onBeforeChange) {
onBeforeChange(view, true, options);
}
beforeAnimate(allPages, index, selected);
animatable.classList.remove('hide');
return animate(animatable, previousAnimatable, options.transition, options.isBack).then(function () {
selectedPageIndex = index;
if (!options.cancel && previousAnimatable) {
afterAnimate(allPages, index);
}
return view;
});
}
}
return Promise.reject();
}
function triggerDestroy(view) {
view.dispatchEvent(new CustomEvent('viewdestroy', {
cancelable: false
}));
}
function reset() {
allPages = [];
currentUrls = [];
mainAnimatedPages.innerHTML = '';
selectedPageIndex = -1;
}
return {
loadView: loadView,
tryRestoreView: tryRestoreView,
reset: reset,
setOnBeforeChange: setOnBeforeChange
};
});
define(["browser","dom","css!./viewcontainer-lite"],function(browser,dom){"use strict";function enableAnimation(){return!browser.tv&&(!forceDisableAnimation&&browser.supportsCssAnimation())}function loadView(options){if(!options.cancel){cancelActiveAnimations();var selected=selectedPageIndex,previousAnimatable=selected===-1?null:allPages[selected],pageIndex=selected+1;pageIndex>=pageContainerCount&&(pageIndex=0);var view=document.createElement("div");options.type&&view.setAttribute("data-type",options.type);var properties=[];options.fullscreen&&properties.push("fullscreen"),properties.length&&view.setAttribute("data-properties",properties.join(",")),view.innerHTML=options.view;var currentPage=allPages[pageIndex],animatable=view;return view.classList.add("mainAnimatedPage"),currentPage?(triggerDestroy(currentPage),mainAnimatedPages.replaceChild(view,currentPage)):mainAnimatedPages.appendChild(view),allPages[pageIndex]=view,onBeforeChange&&onBeforeChange(view,!1,options),beforeAnimate(allPages,pageIndex,selected),animate(animatable,previousAnimatable,options.transition,options.isBack).then(function(){return selectedPageIndex=pageIndex,currentUrls[pageIndex]=options.url,!options.cancel&&previousAnimatable&&afterAnimate(allPages,pageIndex),view})}}function beforeAnimate(allPages,newPageIndex,oldPageIndex){for(var i=0,length=allPages.length;i<length;i++)newPageIndex===i||oldPageIndex===i||allPages[i].classList.add("hide")}function afterAnimate(allPages,newPageIndex){for(var i=0,length=allPages.length;i<length;i++)newPageIndex===i||allPages[i].classList.add("hide")}function animate(newAnimatedPage,oldAnimatedPage,transition,isBack){if(enableAnimation()&&oldAnimatedPage){if("slide"===transition)return slide(newAnimatedPage,oldAnimatedPage,transition,isBack);if("fade"===transition)return fade(newAnimatedPage,oldAnimatedPage,transition,isBack)}return Promise.resolve()}function slide(newAnimatedPage,oldAnimatedPage,transition,isBack){return new Promise(function(resolve,reject){var duration=450,animations=[];oldAnimatedPage&&(isBack?setAnimation(oldAnimatedPage,"view-slideright-r "+duration+"ms ease-out normal both"):setAnimation(oldAnimatedPage,"view-slideleft-r "+duration+"ms ease-out normal both"),animations.push(oldAnimatedPage)),isBack?setAnimation(newAnimatedPage,"view-slideright "+duration+"ms ease-out normal both"):setAnimation(newAnimatedPage,"view-slideleft "+duration+"ms ease-out normal both"),animations.push(newAnimatedPage),currentAnimations=animations;var onAnimationComplete=function(){dom.removeEventListener(newAnimatedPage,dom.whichAnimationEvent(),onAnimationComplete,{once:!0}),resolve()};dom.addEventListener(newAnimatedPage,dom.whichAnimationEvent(),onAnimationComplete,{once:!0})})}function fade(newAnimatedPage,oldAnimatedPage,transition,isBack){return new Promise(function(resolve,reject){var duration=400,animations=[];oldAnimatedPage&&(setAnimation(oldAnimatedPage,"view-fadeout "+duration+"ms ease-out normal both"),animations.push(oldAnimatedPage)),setAnimation(newAnimatedPage,"view-fadein "+duration+"ms ease-in normal both"),animations.push(newAnimatedPage),currentAnimations=animations;var onAnimationComplete=function(){dom.removeEventListener(newAnimatedPage,dom.whichAnimationEvent(),onAnimationComplete,{once:!0}),resolve()};dom.addEventListener(newAnimatedPage,dom.whichAnimationEvent(),onAnimationComplete,{once:!0})})}function setAnimation(elem,value){requestAnimationFrame(function(){elem.style.animation=value})}function cancelActiveAnimations(){for(var animations=currentAnimations,i=0,length=animations.length;i<length;i++)animations[i].animation="none"}function setOnBeforeChange(fn){onBeforeChange=fn}function tryRestoreView(options){var url=options.url,index=currentUrls.indexOf(url);if(index!==-1){var animatable=allPages[index],view=animatable;if(view){if(options.cancel)return;cancelActiveAnimations();var selected=selectedPageIndex,previousAnimatable=selected===-1?null:allPages[selected];return onBeforeChange&&onBeforeChange(view,!0,options),beforeAnimate(allPages,index,selected),animatable.classList.remove("hide"),animate(animatable,previousAnimatable,options.transition,options.isBack).then(function(){return selectedPageIndex=index,!options.cancel&&previousAnimatable&&afterAnimate(allPages,index),view})}}return Promise.reject()}function triggerDestroy(view){view.dispatchEvent(new CustomEvent("viewdestroy",{cancelable:!1}))}function reset(){allPages=[],currentUrls=[],mainAnimatedPages.innerHTML="",selectedPageIndex=-1}var onBeforeChange,mainAnimatedPages=document.querySelector(".mainAnimatedPages"),allPages=[],currentUrls=[],pageContainerCount=3,selectedPageIndex=-1,forceDisableAnimation=navigator.userAgent.toLowerCase().indexOf("embytheaterpi")!==-1,currentAnimations=[];return{loadView:loadView,tryRestoreView:tryRestoreView,reset:reset,setOnBeforeChange:setOnBeforeChange}});

View file

@ -1,185 +1 @@
define(['viewcontainer', 'focusManager', 'queryString', 'layoutManager'], function (viewcontainer, focusManager, queryString, layoutManager) {
'use strict';
var currentView;
var dispatchPageEvents;
viewcontainer.setOnBeforeChange(function (newView, isRestored, options) {
var lastView = currentView;
if (lastView) {
var beforeHideResult = dispatchViewEvent(lastView, 'viewbeforehide', null, true);
if (!beforeHideResult) {
// todo: cancel
}
}
if (!newView.initComplete) {
newView.initComplete = true;
var eventDetail = getViewEventDetail(newView, options, false);
if (options.controllerFactory) {
// Use controller method
var controller = new options.controllerFactory(newView, eventDetail.detail.params);
}
if (!options.controllerFactory || dispatchPageEvents) {
dispatchViewEvent(newView, 'viewinit');
}
}
dispatchViewEvent(newView, 'viewbeforeshow', isRestored);
});
function onViewChange(view, options, isRestore) {
var lastView = currentView;
if (lastView) {
dispatchViewEvent(lastView, 'viewhide');
}
currentView = view;
var eventDetail = getViewEventDetail(view, options, isRestore);
if (!isRestore) {
if (options.autoFocus !== false) {
focusManager.autoFocus(view);
}
}
else if (!layoutManager.mobile) {
if (view.activeElement && document.body.contains(view.activeElement) && focusManager.isCurrentlyFocusable(view.activeElement)) {
focusManager.focus(view.activeElement);
} else {
focusManager.autoFocus(view);
}
}
view.dispatchEvent(new CustomEvent('viewshow', eventDetail));
if (dispatchPageEvents) {
view.dispatchEvent(new CustomEvent('pageshow', eventDetail));
}
}
function getProperties(view) {
var props = view.getAttribute('data-properties');
if (props) {
return props.split(',');
}
return [];
}
function dispatchViewEvent(view, eventName, isRestored, isCancellable) {
var eventDetail = {
type: view.getAttribute('data-type'),
isRestored: isRestored,
properties: getProperties(view)
};
var eventResult = view.dispatchEvent(new CustomEvent(eventName, {
detail: eventDetail,
bubbles: true,
cancelable: isCancellable || false
}));
if (dispatchPageEvents) {
view.dispatchEvent(new CustomEvent(eventName.replace('view', 'page'), {
detail: eventDetail,
bubbles: true,
cancelable: false
}));
}
return eventResult;
}
function getViewEventDetail(view, options, isRestore) {
var url = options.url;
var index = url.indexOf('?');
var params = index === -1 ? {} : queryString.parse(url.substring(index + 1));
return {
detail: {
type: view.getAttribute('data-type'),
properties: getProperties(view),
params: params,
isRestored: isRestore,
state: options.state,
// The route options
options: options.options || {}
},
bubbles: true,
cancelable: false
};
}
function resetCachedViews() {
// Reset all cached views whenever the skin changes
viewcontainer.reset();
}
document.addEventListener('skinunload', resetCachedViews);
//events.on(connectionManager, 'localusersignedin', resetCachedViews);
//events.on(connectionManager, 'localusersignedout', resetCachedViews);
function ViewManager() {
}
ViewManager.prototype.loadView = function (options) {
var lastView = currentView;
// Record the element that has focus
if (lastView) {
lastView.activeElement = document.activeElement;
}
if (options.cancel) {
return;
}
viewcontainer.loadView(options).then(function (view) {
onViewChange(view, options);
});
};
ViewManager.prototype.tryRestoreView = function (options, onViewChanging) {
if (options.cancel) {
return Promise.reject({ cancelled: true });
}
// Record the element that has focus
if (currentView) {
currentView.activeElement = document.activeElement;
}
return viewcontainer.tryRestoreView(options).then(function (view) {
onViewChanging();
onViewChange(view, options, true);
});
};
ViewManager.prototype.currentView = function () {
return currentView;
};
ViewManager.prototype.dispatchPageEvents = function (value) {
dispatchPageEvents = value;
};
return new ViewManager();
});
define(["viewcontainer","focusManager","queryString","layoutManager"],function(viewcontainer,focusManager,queryString,layoutManager){"use strict";function onViewChange(view,options,isRestore){var lastView=currentView;lastView&&dispatchViewEvent(lastView,"viewhide"),currentView=view;var eventDetail=getViewEventDetail(view,options,isRestore);isRestore?layoutManager.mobile||(view.activeElement&&document.body.contains(view.activeElement)&&focusManager.isCurrentlyFocusable(view.activeElement)?focusManager.focus(view.activeElement):focusManager.autoFocus(view)):options.autoFocus!==!1&&focusManager.autoFocus(view),view.dispatchEvent(new CustomEvent("viewshow",eventDetail)),dispatchPageEvents&&view.dispatchEvent(new CustomEvent("pageshow",eventDetail))}function getProperties(view){var props=view.getAttribute("data-properties");return props?props.split(","):[]}function dispatchViewEvent(view,eventName,isRestored,isCancellable){var eventDetail={type:view.getAttribute("data-type"),isRestored:isRestored,properties:getProperties(view)},eventResult=view.dispatchEvent(new CustomEvent(eventName,{detail:eventDetail,bubbles:!0,cancelable:isCancellable||!1}));return dispatchPageEvents&&view.dispatchEvent(new CustomEvent(eventName.replace("view","page"),{detail:eventDetail,bubbles:!0,cancelable:!1})),eventResult}function getViewEventDetail(view,options,isRestore){var url=options.url,index=url.indexOf("?"),params=index===-1?{}:queryString.parse(url.substring(index+1));return{detail:{type:view.getAttribute("data-type"),properties:getProperties(view),params:params,isRestored:isRestore,state:options.state,options:options.options||{}},bubbles:!0,cancelable:!1}}function resetCachedViews(){viewcontainer.reset()}function ViewManager(){}var currentView,dispatchPageEvents;return viewcontainer.setOnBeforeChange(function(newView,isRestored,options){var lastView=currentView;if(lastView){dispatchViewEvent(lastView,"viewbeforehide",null,!0)}if(!newView.initComplete){newView.initComplete=!0;var eventDetail=getViewEventDetail(newView,options,!1);if(options.controllerFactory){new options.controllerFactory(newView,eventDetail.detail.params)}options.controllerFactory&&!dispatchPageEvents||dispatchViewEvent(newView,"viewinit")}dispatchViewEvent(newView,"viewbeforeshow",isRestored)}),document.addEventListener("skinunload",resetCachedViews),ViewManager.prototype.loadView=function(options){var lastView=currentView;lastView&&(lastView.activeElement=document.activeElement),options.cancel||viewcontainer.loadView(options).then(function(view){onViewChange(view,options)})},ViewManager.prototype.tryRestoreView=function(options,onViewChanging){return options.cancel?Promise.reject({cancelled:!0}):(currentView&&(currentView.activeElement=document.activeElement),viewcontainer.tryRestoreView(options).then(function(view){onViewChanging(),onViewChange(view,options,!0)}))},ViewManager.prototype.currentView=function(){return currentView},ViewManager.prototype.dispatchPageEvents=function(value){dispatchPageEvents=value},new ViewManager});