1
0
Fork 0
mirror of https://github.com/jellyfin/jellyfin-web synced 2025-03-30 19:56:21 +00:00

Merge remote-tracking branch 'origin/master' into suboctopus

This commit is contained in:
Andrew Mahone 2019-11-08 08:54:12 -05:00
commit 33f016bb09
83 changed files with 9213 additions and 6006 deletions

1
.github/stale.yml vendored
View file

@ -8,6 +8,7 @@ exemptLabels:
- future
- feature
- enhancement
- confirmed
# Label to use when marking an issue as stale
staleLabel: stale
# Comment to post when marking an issue as stale. Set to `false` to disable

View file

@ -5,6 +5,7 @@
"repository": "https://github.com/jellyfin/jellyfin-web",
"license": "GPL-2.0-or-later",
"devDependencies": {
"clean-webpack-plugin": "^3.0.0",
"copy-webpack-plugin": "^5.0.3",
"css-loader": "^2.1.0",
"eslint": "^5.16.0",
@ -16,12 +17,14 @@
"webpack-merge": "^4.2.2"
},
"dependencies": {
"alameda": "^1.3.0",
"flv.js": "^1.5.0",
"hls.js": "^0.12.4",
"howler": "^2.1.2",
"jquery": "^3.4.1",
"jstree": "^3.3.7",
"libjass": "^0.11.0",
"requirejs": "^2.3.5",
"shaka-player": "^2.5.5",
"sortablejs": "^1.9.0",
"swiper": "^3.4.2",

View file

@ -1,419 +0,0 @@
var requirejs, require, define;
! function(global, Promise, undef) {
function commentReplace(match, singlePrefix) {
return singlePrefix || ""
}
function hasProp(obj, prop) {
return hasOwn.call(obj, prop)
}
function getOwn(obj, prop) {
return obj && hasProp(obj, prop) && obj[prop]
}
function obj() {
return Object.create(null)
}
function eachProp(obj, func) {
var prop;
for (prop in obj)
if (hasProp(obj, prop) && func(obj[prop], prop)) break
}
function mixin(target, source, force, deepStringMixin) {
return source && eachProp(source, function(value, prop) {
!force && hasProp(target, prop) || (!deepStringMixin || "object" != typeof value || !value || Array.isArray(value) || "function" == typeof value || value instanceof RegExp ? target[prop] = value : (target[prop] || (target[prop] = {}), mixin(target[prop], value, force, deepStringMixin)))
}), target
}
function getGlobal(value) {
if (!value) return value;
var g = global;
return value.split(".").forEach(function(part) {
g = g[part]
}), g
}
function newContext(contextName) {
function trimDots(ary) {
var i, part, length = ary.length;
for (i = 0; i < length; i++)
if ("." === (part = ary[i])) ary.splice(i, 1), i -= 1;
else if (".." === part) {
if (0 === i || 1 === i && ".." === ary[2] || ".." === ary[i - 1]) continue;
i > 0 && (ary.splice(i - 1, 2), i -= 2)
}
}
function normalize(name, baseName, applyMap) {
var mapValue, nameParts, i, j, nameSegment, lastIndex, foundMap, foundI, foundStarMap, starI, baseParts = baseName && baseName.split("/"),
normalizedBaseParts = baseParts,
map = config.map,
starMap = map && map["*"];
if (name && (name = name.split("/"), lastIndex = name.length - 1, config.nodeIdCompat && jsSuffixRegExp.test(name[lastIndex]) && (name[lastIndex] = name[lastIndex].replace(jsSuffixRegExp, "")), "." === name[0].charAt(0) && baseParts && (normalizedBaseParts = baseParts.slice(0, baseParts.length - 1), name = normalizedBaseParts.concat(name)), trimDots(name), name = name.join("/")), applyMap && map && (baseParts || starMap)) {
nameParts = name.split("/");
outerLoop: for (i = nameParts.length; i > 0; i -= 1) {
if (nameSegment = nameParts.slice(0, i).join("/"), baseParts)
for (j = baseParts.length; j > 0; j -= 1)
if ((mapValue = getOwn(map, baseParts.slice(0, j).join("/"))) && (mapValue = getOwn(mapValue, nameSegment))) {
foundMap = mapValue, foundI = i;
break outerLoop
}! foundStarMap && starMap && getOwn(starMap, nameSegment) && (foundStarMap = getOwn(starMap, nameSegment), starI = i)
}!foundMap && foundStarMap && (foundMap = foundStarMap, foundI = starI), foundMap && (nameParts.splice(0, foundI, foundMap), name = nameParts.join("/"))
}
return getOwn(config.pkgs, name) || name
}
function makeShimExports(value) {
function fn() {
var ret;
return value.init && (ret = value.init.apply(global, arguments)), ret || value.exports && getGlobal(value.exports)
}
return fn
}
function takeQueue(anonId) {
var i, id, args, shim;
for (i = 0; i < queue.length; i += 1) {
if ("string" != typeof queue[i][0]) {
if (!anonId) break;
queue[i].unshift(anonId), anonId = undef
}
args = queue.shift(), id = args[0], i -= 1, id in defined || id in waiting || (id in deferreds ? main.apply(undef, args) : waiting[id] = args)
}
anonId && (shim = getOwn(config.shim, anonId) || {}, main(anonId, shim.deps || [], shim.exportsFn))
}
function makeRequire(relName, topLevel) {
var req = function(deps, callback, errback, alt) {
var name, cfg;
if (topLevel && takeQueue(), "string" == typeof deps) {
if (handlers[deps]) return handlers[deps](relName);
if (!((name = makeMap(deps, relName, !0).id) in defined)) throw new Error("Not loaded: " + name);
return defined[name]
}
return deps && !Array.isArray(deps) && (cfg = deps, deps = undef, Array.isArray(callback) && (deps = callback, callback = errback, errback = alt), topLevel) ? req.config(cfg)(deps, callback, errback) : (callback = callback || function() {
return slice.call(arguments, 0)
}, asyncResolve.then(function() {
return takeQueue(), main(undef, deps || [], callback, errback, relName)
}))
};
return req.isBrowser = "undefined" != typeof document && "undefined" != typeof navigator, req.nameToUrl = function(moduleName, ext, skipExt) {
var paths, syms, i, parentModule, url, parentPath, bundleId, pkgMain = getOwn(config.pkgs, moduleName);
if (pkgMain && (moduleName = pkgMain), bundleId = getOwn(bundlesMap, moduleName)) return req.nameToUrl(bundleId, ext, skipExt);
if (urlRegExp.test(moduleName)) url = moduleName + (ext || "");
else {
for (paths = config.paths, syms = moduleName.split("/"), i = syms.length; i > 0; i -= 1)
if (parentModule = syms.slice(0, i).join("/"), parentPath = getOwn(paths, parentModule)) {
Array.isArray(parentPath) && (parentPath = parentPath[0]), syms.splice(0, i, parentPath);
break
} url = syms.join("/"), url += ext || (/^data\:|^blob\:|\?/.test(url) || skipExt ? "" : ".js"), url = ("/" === url.charAt(0) || url.match(/^[\w\+\.\-]+:/) ? "" : config.baseUrl) + url
}
return config.urlArgs && !/^blob\:/.test(url) ? url + config.urlArgs(moduleName, url) : url
}, req.toUrl = function(moduleNamePlusExt) {
var ext, index = moduleNamePlusExt.lastIndexOf("."),
segment = moduleNamePlusExt.split("/")[0],
isRelative = "." === segment || ".." === segment;
return -1 !== index && (!isRelative || index > 1) && (ext = moduleNamePlusExt.substring(index, moduleNamePlusExt.length), moduleNamePlusExt = moduleNamePlusExt.substring(0, index)), req.nameToUrl(normalize(moduleNamePlusExt, relName), ext, !0)
}, req.defined = function(id) {
return makeMap(id, relName, !0).id in defined
}, req.specified = function(id) {
return (id = makeMap(id, relName, !0).id) in defined || id in deferreds
}, req
}
function resolve(name, d, value) {
name && (defined[name] = value, requirejs.onResourceLoad && requirejs.onResourceLoad(context, d.map, d.deps)), d.finished = !0, d.resolve(value)
}
function reject(d, err) {
d.finished = !0, d.rejected = !0, d.reject(err)
}
function makeNormalize(relName) {
return function(name) {
return normalize(name, relName, !0)
}
}
function defineModule(d) {
d.factoryCalled = !0;
var ret, name = d.map.id;
try {
ret = context.execCb(name, d.factory, d.values, defined[name])
} catch (err) {
return reject(d, err)
}
name ? ret === undef && (d.cjsModule ? ret = d.cjsModule.exports : d.usingExports && (ret = defined[name])) : requireDeferreds.splice(requireDeferreds.indexOf(d), 1), resolve(name, d, ret)
}
function depFinished(val, i) {
this.rejected || this.depDefined[i] || (this.depDefined[i] = !0, this.depCount += 1, this.values[i] = val, this.depending || this.depCount !== this.depMax || defineModule(this))
}
function makeDefer(name, calculatedMap) {
var d = {};
return d.promise = new Promise(function(resolve, reject) {
d.resolve = resolve, d.reject = function(err) {
name || requireDeferreds.splice(requireDeferreds.indexOf(d), 1), reject(err)
}
}), d.map = name ? calculatedMap || makeMap(name) : {}, d.depCount = 0, d.depMax = 0, d.values = [], d.depDefined = [], d.depFinished = depFinished, d.map.pr && (d.deps = [makeMap(d.map.pr)]), d
}
function getDefer(name, calculatedMap) {
var d;
return name ? (d = name in deferreds && deferreds[name]) || (d = deferreds[name] = makeDefer(name, calculatedMap)) : (d = makeDefer(), requireDeferreds.push(d)), d
}
function makeErrback(d, name) {
return function(err) {
d.rejected || (err.dynaId || (err.dynaId = "id" + (errCount += 1), err.requireModules = [name]), reject(d, err))
}
}
function waitForDep(depMap, relName, d, i) {
d.depMax += 1, callDep(depMap, relName).then(function(val) {
d.depFinished(val, i)
}, makeErrback(d, depMap.id)).catch(makeErrback(d, d.map.id))
}
function makeLoad(id) {
function load(value) {
fromTextCalled || resolve(id, getDefer(id), value)
}
var fromTextCalled;
return load.error = function(err) {
reject(getDefer(id), err)
}, load.fromText = function(text, textAlt) {
var execError, d = getDefer(id),
map = makeMap(makeMap(id).n),
plainId = map.id;
fromTextCalled = !0, d.factory = function(p, val) {
return val
}, textAlt && (text = textAlt), hasProp(config.config, id) && (config.config[plainId] = config.config[id]);
try {
req.exec(text)
} catch (e) {
execError = new Error("fromText eval for " + plainId + " failed: " + e), execError.requireType = "fromtexteval", reject(d, execError)
}
takeQueue(plainId), d.deps = [map], waitForDep(map, null, d, d.deps.length)
}, load
}
function callPlugin(plugin, map, relName) {
plugin.load(map.n, makeRequire(relName), makeLoad(map.id), config)
}
function splitPrefix(name) {
var prefix, index = name ? name.indexOf("!") : -1;
return index > -1 && (prefix = name.substring(0, index), name = name.substring(index + 1, name.length)), [prefix, name]
}
function breakCycle(d, traced, processed) {
var id = d.map.id;
traced[id] = !0, !d.finished && d.deps && d.deps.forEach(function(depMap) {
var depId = depMap.id,
dep = !hasProp(handlers, depId) && getDefer(depId, depMap);
!dep || dep.finished || processed[depId] || (hasProp(traced, depId) ? d.deps.forEach(function(depMap, i) {
depMap.id === depId && d.depFinished(defined[depId], i)
}) : breakCycle(dep, traced, processed))
}), processed[id] = !0
}
function check(d) {
var err, mid, dfd, notFinished = [],
waitInterval = 1e3 * config.waitSeconds,
expired = waitInterval && startTime + waitInterval < (new Date).getTime();
if (0 === loadCount && (d ? d.finished || breakCycle(d, {}, {}) : requireDeferreds.length && requireDeferreds.forEach(function(d) {
breakCycle(d, {}, {})
})), expired) {
for (mid in deferreds) dfd = deferreds[mid], dfd.finished || notFinished.push(dfd.map.id);
err = new Error("Timeout for modules: " + notFinished), err.requireModules = notFinished, err.requireType = "timeout", notFinished.forEach(function(id) {
reject(getDefer(id), err)
})
} else(loadCount || requireDeferreds.length) && (checkingLater || (checkingLater = !0, setTimeout(function() {
checkingLater = !1, check()
}, 70)))
}
function delayedError(e) {
console.log(e.stack);
return setTimeout(function() {
e.dynaId && trackedErrors[e.dynaId] || (trackedErrors[e.dynaId] = !0, req.onError(e))
}), e
}
var req, main, makeMap, callDep, handlers, checkingLater, load, context, defined = obj(),
waiting = obj(),
config = {
waitSeconds: 7,
baseUrl: "./",
paths: {},
bundles: {},
pkgs: {},
shim: {},
config: {}
},
mapCache = obj(),
requireDeferreds = [],
deferreds = obj(),
calledDefine = obj(),
calledPlugin = obj(),
loadCount = 0,
startTime = (new Date).getTime(),
errCount = 0,
trackedErrors = obj(),
urlFetched = obj(),
bundlesMap = obj(),
asyncResolve = Promise.resolve(undefined);
return load = "function" == typeof importScripts ? function(map) {
var url = map.url;
urlFetched[url] || (urlFetched[url] = !0, getDefer(map.id), importScripts(url), takeQueue(map.id))
} : function(map) {
var script, id = map.id,
url = map.url;
urlFetched[url] || (urlFetched[url] = !0, script = document.createElement("script"), script.setAttribute("data-requiremodule", id), script.type = config.scriptType || "text/javascript", script.charset = "utf-8", script.async = !0, loadCount += 1, script.addEventListener("load", function() {
loadCount -= 1, takeQueue(id)
}, !1), script.addEventListener("error", function() {
loadCount -= 1;
var err, pathConfig = getOwn(config.paths, id);
if (pathConfig && Array.isArray(pathConfig) && pathConfig.length > 1) {
script.parentNode.removeChild(script), pathConfig.shift();
var d = getDefer(id);
d.map = makeMap(id), d.map.url = req.nameToUrl(id), load(d.map)
} else err = new Error("Load failed: " + id + ": " + script.src), err.requireModules = [id], err.requireType = "scripterror", reject(getDefer(id), err)
}, !1), script.src = url, 10 === document.documentMode ? asap.then(function() {
document.head.appendChild(script)
}) : document.head.appendChild(script))
}, callDep = function(map, relName) {
var args, bundleId, name = map.id,
shim = config.shim[name];
if (name in waiting) args = waiting[name], delete waiting[name], main.apply(undef, args);
else if (!(name in deferreds))
if (map.pr) {
if (!(bundleId = getOwn(bundlesMap, name))) return callDep(makeMap(map.pr)).then(function(plugin) {
var newMap = map.prn ? map : makeMap(name, relName, !0),
newId = newMap.id,
shim = getOwn(config.shim, newId);
return newId in calledPlugin || (calledPlugin[newId] = !0, shim && shim.deps ? req(shim.deps, function() {
callPlugin(plugin, newMap, relName)
}) : callPlugin(plugin, newMap, relName)), getDefer(newId).promise
});
map.url = req.nameToUrl(bundleId), load(map)
} else shim && shim.deps ? req(shim.deps, function() {
load(map)
}) : load(map);
return getDefer(name).promise
}, makeMap = function(name, relName, applyMap) {
if ("string" != typeof name) return name;
var plugin, url, parts, prefix, result, prefixNormalized, cacheKey = name + " & " + (relName || "") + " & " + !!applyMap;
return parts = splitPrefix(name), prefix = parts[0], name = parts[1], !prefix && cacheKey in mapCache ? mapCache[cacheKey] : (prefix && (prefix = normalize(prefix, relName, applyMap), plugin = prefix in defined && defined[prefix]), prefix ? plugin && plugin.normalize ? (name = plugin.normalize(name, makeNormalize(relName)), prefixNormalized = !0) : name = -1 === name.indexOf("!") ? normalize(name, relName, applyMap) : name : (name = normalize(name, relName, applyMap), parts = splitPrefix(name), prefix = parts[0], name = parts[1], url = req.nameToUrl(name)), result = {
id: prefix ? prefix + "!" + name : name,
n: name,
pr: prefix,
url: url,
prn: prefix && prefixNormalized
}, prefix || (mapCache[cacheKey] = result), result)
}, handlers = {
require: function(name) {
return makeRequire(name)
},
exports: function(name) {
var e = defined[name];
return void 0 !== e ? e : defined[name] = {}
},
module: function(name) {
return {
id: name,
uri: "",
exports: handlers.exports(name),
config: function() {
return getOwn(config.config, name) || {}
}
}
}
}, main = function(name, deps, factory, errback, relName) {
if (name) {
if (name in calledDefine) return;
calledDefine[name] = !0
}
var d = getDefer(name);
return deps && !Array.isArray(deps) && (factory = deps, deps = []), deps = deps ? slice.call(deps, 0) : null, errback || (hasProp(config, "defaultErrback") ? config.defaultErrback && (errback = config.defaultErrback) : errback = delayedError), errback && d.promise.catch(errback), relName = relName || name, "function" == typeof factory ? (!deps.length && factory.length && (factory.toString().replace(commentRegExp, commentReplace).replace(cjsRequireRegExp, function(match, dep) {
deps.push(dep)
}), deps = (1 === factory.length ? ["require"] : ["require", "exports", "module"]).concat(deps)), d.factory = factory, d.deps = deps, d.depending = !0, deps.forEach(function(depName, i) {
var depMap;
deps[i] = depMap = makeMap(depName, relName, !0), depName = depMap.id, "require" === depName ? d.values[i] = handlers.require(name) : "exports" === depName ? (d.values[i] = handlers.exports(name), d.usingExports = !0) : "module" === depName ? d.values[i] = d.cjsModule = handlers.module(name) : void 0 === depName ? d.values[i] = void 0 : waitForDep(depMap, relName, d, i)
}), d.depending = !1, d.depCount === d.depMax && defineModule(d)) : name && resolve(name, d, factory), startTime = (new Date).getTime(), name || check(d), d.promise
}, req = makeRequire(null, !0), req.config = function(cfg) {
if (cfg.context && cfg.context !== contextName) {
var existingContext = getOwn(contexts, cfg.context);
return existingContext ? existingContext.req.config(cfg) : newContext(cfg.context).config(cfg)
}
if (mapCache = obj(), cfg.baseUrl && "/" !== cfg.baseUrl.charAt(cfg.baseUrl.length - 1) && (cfg.baseUrl += "/"), "string" == typeof cfg.urlArgs) {
var urlArgs = cfg.urlArgs;
cfg.urlArgs = function(id, url) {
return (-1 === url.indexOf("?") ? "?" : "&") + urlArgs
}
}
var shim = config.shim,
objs = {
paths: !0,
bundles: !0,
config: !0,
map: !0
};
return eachProp(cfg, function(value, prop) {
objs[prop] ? (config[prop] || (config[prop] = {}), mixin(config[prop], value, !0, !0)) : config[prop] = value
}), cfg.bundles && eachProp(cfg.bundles, function(value, prop) {
value.forEach(function(v) {
v !== prop && (bundlesMap[v] = prop)
})
}), cfg.shim && (eachProp(cfg.shim, function(value, id) {
Array.isArray(value) && (value = {
deps: value
}), !value.exports && !value.init || value.exportsFn || (value.exportsFn = makeShimExports(value)), shim[id] = value
}), config.shim = shim), cfg.packages && cfg.packages.forEach(function(pkgObj) {
var location, name;
pkgObj = "string" == typeof pkgObj ? {
name: pkgObj
} : pkgObj, name = pkgObj.name, location = pkgObj.location, location && (config.paths[name] = pkgObj.location), config.pkgs[name] = pkgObj.name + "/" + (pkgObj.main || "main").replace(currDirRegExp, "").replace(jsSuffixRegExp, "")
}), (cfg.deps || cfg.callback) && req(cfg.deps, cfg.callback), req
}, req.onError = function(err) {
throw err
}, context = {
id: contextName,
defined: defined,
waiting: waiting,
config: config,
deferreds: deferreds,
req: req,
execCb: function(name, callback, args, exports) {
return callback.apply(exports, args)
}
}, contexts[contextName] = context, req
}
if (!Promise) throw new Error("No Promise implementation available");
var topReq, dataMain, src, subPath, bootstrapConfig = requirejs || require,
hasOwn = Object.prototype.hasOwnProperty,
contexts = {},
queue = [],
currDirRegExp = /^\.\//,
urlRegExp = /^\/|\:|\?|\.js$/,
commentRegExp = /\/\*[\s\S]*?\*\/|([^:"'=]|^)\/\/.*$/gm,
cjsRequireRegExp = /[^.]\s*require\s*\(\s*["']([^'"\s]+)["']\s*\)/g,
jsSuffixRegExp = /\.js$/,
slice = Array.prototype.slice;
if ("function" != typeof requirejs) {
var asap = Promise.resolve(void 0);
requirejs = topReq = newContext("_"), "function" != typeof require && (require = topReq), topReq.exec = function(text) {
return eval(text)
}, topReq.contexts = contexts, define = function() {
queue.push(slice.call(arguments, 0))
}, define.amd = {
jQuery: !0
}, bootstrapConfig && topReq.config(bootstrapConfig), topReq.isBrowser && !contexts._.config.skipDataMain && (dataMain = document.querySelectorAll("script[data-main]")[0], (dataMain = dataMain && dataMain.getAttribute("data-main")) && (dataMain = dataMain.replace(jsSuffixRegExp, ""), bootstrapConfig && bootstrapConfig.baseUrl || -1 !== dataMain.indexOf("!") || (src = dataMain.split("/"), dataMain = src.pop(), subPath = src.length ? src.join("/") + "/" : "./", topReq.config({
baseUrl: subPath
})), topReq([dataMain])))
}
}(this, "undefined" != typeof Promise ? Promise : void 0);

File diff suppressed because it is too large Load diff

View file

@ -1,607 +0,0 @@
var requirejs, require, define;
! function(global, setTimeout) {
function commentReplace(match, singlePrefix) {
return singlePrefix || ""
}
function isFunction(it) {
return "[object Function]" === ostring.call(it)
}
function isArray(it) {
return "[object Array]" === ostring.call(it)
}
function each(ary, func) {
if (ary) {
var i;
for (i = 0; i < ary.length && (!ary[i] || !func(ary[i], i, ary)); i += 1);
}
}
function eachReverse(ary, func) {
if (ary) {
var i;
for (i = ary.length - 1; i > -1 && (!ary[i] || !func(ary[i], i, ary)); i -= 1);
}
}
function hasProp(obj, prop) {
return hasOwn.call(obj, prop)
}
function getOwn(obj, prop) {
return hasProp(obj, prop) && obj[prop]
}
function eachProp(obj, func) {
var prop;
for (prop in obj)
if (hasProp(obj, prop) && func(obj[prop], prop)) break
}
function mixin(target, source, force, deepStringMixin) {
return source && eachProp(source, function(value, prop) {
!force && hasProp(target, prop) || (!deepStringMixin || "object" != typeof value || !value || isArray(value) || isFunction(value) || value instanceof RegExp ? target[prop] = value : (target[prop] || (target[prop] = {}), mixin(target[prop], value, force, deepStringMixin)))
}), target
}
function bind(obj, fn) {
return function() {
return fn.apply(obj, arguments)
}
}
function scripts() {
return document.getElementsByTagName("script")
}
function defaultOnError(err) {
throw err
}
function getGlobal(value) {
if (!value) return value;
var g = global;
return each(value.split("."), function(part) {
g = g[part]
}), g
}
function makeError(id, msg, err, requireModules) {
var e = new Error(msg + "\nhttp://requirejs.org/docs/errors.html#" + id);
return e.requireType = id, e.requireModules = requireModules, err && (e.originalError = err), e
}
function newContext(contextName) {
function trimDots(ary) {
var i, part;
for (i = 0; i < ary.length; i++)
if ("." === (part = ary[i])) ary.splice(i, 1), i -= 1;
else if (".." === part) {
if (0 === i || 1 === i && ".." === ary[2] || ".." === ary[i - 1]) continue;
i > 0 && (ary.splice(i - 1, 2), i -= 2)
}
}
function normalize(name, baseName, applyMap) {
var mapValue, nameParts, i, j, nameSegment, lastIndex, foundMap, foundI, foundStarMap, starI, normalizedBaseParts, baseParts = baseName && baseName.split("/"),
map = config.map,
starMap = map && map["*"];
if (name && (name = name.split("/"), lastIndex = name.length - 1, config.nodeIdCompat && jsSuffixRegExp.test(name[lastIndex]) && (name[lastIndex] = name[lastIndex].replace(jsSuffixRegExp, "")), "." === name[0].charAt(0) && baseParts && (normalizedBaseParts = baseParts.slice(0, baseParts.length - 1), name = normalizedBaseParts.concat(name)), trimDots(name), name = name.join("/")), applyMap && map && (baseParts || starMap)) {
nameParts = name.split("/");
outerLoop: for (i = nameParts.length; i > 0; i -= 1) {
if (nameSegment = nameParts.slice(0, i).join("/"), baseParts)
for (j = baseParts.length; j > 0; j -= 1)
if ((mapValue = getOwn(map, baseParts.slice(0, j).join("/"))) && (mapValue = getOwn(mapValue, nameSegment))) {
foundMap = mapValue, foundI = i;
break outerLoop
}! foundStarMap && starMap && getOwn(starMap, nameSegment) && (foundStarMap = getOwn(starMap, nameSegment), starI = i)
}!foundMap && foundStarMap && (foundMap = foundStarMap, foundI = starI), foundMap && (nameParts.splice(0, foundI, foundMap), name = nameParts.join("/"))
}
return getOwn(config.pkgs, name) || name
}
function removeScript(name) {
isBrowser && each(scripts(), function(scriptNode) {
if (scriptNode.getAttribute("data-requiremodule") === name && scriptNode.getAttribute("data-requirecontext") === context.contextName) return scriptNode.parentNode.removeChild(scriptNode), !0
})
}
function hasPathFallback(id) {
var pathConfig = getOwn(config.paths, id);
if (pathConfig && isArray(pathConfig) && pathConfig.length > 1) return pathConfig.shift(), context.require.undef(id), context.makeRequire(null, {
skipMap: !0
})([id]), !0
}
function splitPrefix(name) {
var prefix, index = name ? name.indexOf("!") : -1;
return index > -1 && (prefix = name.substring(0, index), name = name.substring(index + 1, name.length)), [prefix, name]
}
function makeModuleMap(name, parentModuleMap, isNormalized, applyMap) {
var url, pluginModule, suffix, nameParts, prefix = null,
parentName = parentModuleMap ? parentModuleMap.name : null,
originalName = name,
isDefine = !0,
normalizedName = "";
return name || (isDefine = !1, name = "_@r" + (requireCounter += 1)), nameParts = splitPrefix(name), prefix = nameParts[0], name = nameParts[1], prefix && (prefix = normalize(prefix, parentName, applyMap), pluginModule = getOwn(defined, prefix)), name && (prefix ? normalizedName = isNormalized ? name : pluginModule && pluginModule.normalize ? pluginModule.normalize(name, function(name) {
return normalize(name, parentName, applyMap)
}) : -1 === name.indexOf("!") ? normalize(name, parentName, applyMap) : name : (normalizedName = normalize(name, parentName, applyMap), nameParts = splitPrefix(normalizedName), prefix = nameParts[0], normalizedName = nameParts[1], isNormalized = !0, url = context.nameToUrl(normalizedName))), suffix = !prefix || pluginModule || isNormalized ? "" : "_unnormalized" + (unnormalizedCounter += 1), {
prefix: prefix,
name: normalizedName,
parentMap: parentModuleMap,
unnormalized: !!suffix,
url: url,
originalName: originalName,
isDefine: isDefine,
id: (prefix ? prefix + "!" + normalizedName : normalizedName) + suffix
}
}
function getModule(depMap) {
var id = depMap.id,
mod = getOwn(registry, id);
return mod || (mod = registry[id] = new context.Module(depMap)), mod
}
function on(depMap, name, fn) {
var id = depMap.id,
mod = getOwn(registry, id);
!hasProp(defined, id) || mod && !mod.defineEmitComplete ? (mod = getModule(depMap), mod.error && "error" === name ? fn(mod.error) : mod.on(name, fn)) : "defined" === name && fn(defined[id])
}
function onError(err, errback) {
var ids = err.requireModules,
notified = !1;
errback ? errback(err) : (each(ids, function(id) {
var mod = getOwn(registry, id);
mod && (mod.error = err, mod.events.error && (notified = !0, mod.emit("error", err)))
}), notified || req.onError(err))
}
function takeGlobalQueue() {
globalDefQueue.length && (each(globalDefQueue, function(queueItem) {
var id = queueItem[0];
"string" == typeof id && (context.defQueueMap[id] = !0), defQueue.push(queueItem)
}), globalDefQueue = [])
}
function cleanRegistry(id) {
delete registry[id], delete enabledRegistry[id]
}
function breakCycle(mod, traced, processed) {
var id = mod.map.id;
mod.error ? mod.emit("error", mod.error) : (traced[id] = !0, each(mod.depMaps, function(depMap, i) {
var depId = depMap.id,
dep = getOwn(registry, depId);
!dep || mod.depMatched[i] || processed[depId] || (getOwn(traced, depId) ? (mod.defineDep(i, defined[depId]), mod.check()) : breakCycle(dep, traced, processed))
}), processed[id] = !0)
}
function checkLoaded() {
var err, usingPathFallback, waitInterval = 1e3 * config.waitSeconds,
expired = waitInterval && context.startTime + waitInterval < (new Date).getTime(),
noLoads = [],
reqCalls = [],
stillLoading = !1,
needCycleCheck = !0;
if (!inCheckLoaded) {
if (inCheckLoaded = !0, eachProp(enabledRegistry, function(mod) {
var map = mod.map,
modId = map.id;
if (mod.enabled && (map.isDefine || reqCalls.push(mod), !mod.error))
if (!mod.inited && expired) hasPathFallback(modId) ? (usingPathFallback = !0, stillLoading = !0) : (noLoads.push(modId), removeScript(modId));
else if (!mod.inited && mod.fetched && map.isDefine && (stillLoading = !0, !map.prefix)) return needCycleCheck = !1
}), expired && noLoads.length) return err = makeError("timeout", "Load timeout for modules: " + noLoads, null, noLoads), err.contextName = context.contextName, onError(err);
needCycleCheck && each(reqCalls, function(mod) {
breakCycle(mod, {}, {})
}), expired && !usingPathFallback || !stillLoading || !isBrowser && !isWebWorker || checkLoadedTimeoutId || (checkLoadedTimeoutId = setTimeout(function() {
checkLoadedTimeoutId = 0, checkLoaded()
}, 50)), inCheckLoaded = !1
}
}
function callGetModule(args) {
hasProp(defined, args[0]) || getModule(makeModuleMap(args[0], null, !0)).init(args[1], args[2])
}
function removeListener(node, func, name, ieName) {
node.detachEvent && !isOpera ? ieName && node.detachEvent(ieName, func) : node.removeEventListener(name, func, !1)
}
function getScriptData(evt) {
var node = evt.currentTarget || evt.srcElement;
return removeListener(node, context.onScriptLoad, "load", "onreadystatechange"), removeListener(node, context.onScriptError, "error"), {
node: node,
id: node && node.getAttribute("data-requiremodule")
}
}
function intakeDefines() {
var args;
for (takeGlobalQueue(); defQueue.length;) {
if (args = defQueue.shift(), null === args[0]) return onError(makeError("mismatch", "Mismatched anonymous define() module: " + args[args.length - 1]));
callGetModule(args)
}
context.defQueueMap = {}
}
var inCheckLoaded, Module, context, handlers, checkLoadedTimeoutId, config = {
waitSeconds: 7,
baseUrl: "./",
paths: {},
bundles: {},
pkgs: {},
shim: {},
config: {}
},
registry = {},
enabledRegistry = {},
undefEvents = {},
defQueue = [],
defined = {},
urlFetched = {},
bundlesMap = {},
requireCounter = 1,
unnormalizedCounter = 1;
return handlers = {
require: function(mod) {
return mod.require ? mod.require : mod.require = context.makeRequire(mod.map)
},
exports: function(mod) {
if (mod.usingExports = !0, mod.map.isDefine) return mod.exports ? defined[mod.map.id] = mod.exports : mod.exports = defined[mod.map.id] = {}
},
module: function(mod) {
return mod.module ? mod.module : mod.module = {
id: mod.map.id,
uri: mod.map.url,
config: function() {
return getOwn(config.config, mod.map.id) || {}
},
exports: mod.exports || (mod.exports = {})
}
}
}, Module = function(map) {
this.events = getOwn(undefEvents, map.id) || {}, this.map = map, this.shim = getOwn(config.shim, map.id), this.depExports = [], this.depMaps = [], this.depMatched = [], this.pluginMaps = {}, this.depCount = 0
}, Module.prototype = {
init: function(depMaps, factory, errback, options) {
options = options || {}, this.inited || (this.factory = factory, errback ? this.on("error", errback) : this.events.error && (errback = bind(this, function(err) {
this.emit("error", err)
})), this.depMaps = depMaps && depMaps.slice(0), this.errback = errback, this.inited = !0, this.ignore = options.ignore, options.enabled || this.enabled ? this.enable() : this.check())
},
defineDep: function(i, depExports) {
this.depMatched[i] || (this.depMatched[i] = !0, this.depCount -= 1, this.depExports[i] = depExports)
},
fetch: function() {
if (!this.fetched) {
this.fetched = !0, context.startTime = (new Date).getTime();
var map = this.map;
if (!this.shim) return map.prefix ? this.callPlugin() : this.load();
context.makeRequire(this.map, {
enableBuildCallback: !0
})(this.shim.deps || [], bind(this, function() {
return map.prefix ? this.callPlugin() : this.load()
}))
}
},
load: function() {
var url = this.map.url;
urlFetched[url] || (urlFetched[url] = !0, context.load(this.map.id, url))
},
check: function() {
if (this.enabled && !this.enabling) {
var err, cjsModule, id = this.map.id,
depExports = this.depExports,
exports = this.exports,
factory = this.factory;
if (this.inited) {
if (this.error) this.emit("error", this.error);
else if (!this.defining) {
if (this.defining = !0, this.depCount < 1 && !this.defined) {
if (isFunction(factory)) {
if (this.events.error && this.map.isDefine || req.onError !== defaultOnError) try {
exports = context.execCb(id, factory, depExports, exports)
} catch (e) {
err = e
} else exports = context.execCb(id, factory, depExports, exports);
if (this.map.isDefine && void 0 === exports && (cjsModule = this.module, cjsModule ? exports = cjsModule.exports : this.usingExports && (exports = this.exports)), err) return err.requireMap = this.map, err.requireModules = this.map.isDefine ? [this.map.id] : null, err.requireType = this.map.isDefine ? "define" : "require", onError(this.error = err)
} else exports = factory;
if (this.exports = exports, this.map.isDefine && !this.ignore && (defined[id] = exports, req.onResourceLoad)) {
var resLoadMaps = [];
each(this.depMaps, function(depMap) {
resLoadMaps.push(depMap.normalizedMap || depMap)
}), req.onResourceLoad(context, this.map, resLoadMaps)
}
cleanRegistry(id), this.defined = !0
}
this.defining = !1, this.defined && !this.defineEmitted && (this.defineEmitted = !0, this.emit("defined", this.exports), this.defineEmitComplete = !0)
}
} else hasProp(context.defQueueMap, id) || this.fetch()
}
},
callPlugin: function() {
var map = this.map,
id = map.id,
pluginMap = makeModuleMap(map.prefix);
this.depMaps.push(pluginMap), on(pluginMap, "defined", bind(this, function(plugin) {
var load, normalizedMap, normalizedMod, bundleId = getOwn(bundlesMap, this.map.id),
name = this.map.name,
parentName = this.map.parentMap ? this.map.parentMap.name : null,
localRequire = context.makeRequire(map.parentMap, {
enableBuildCallback: !0
});
return this.map.unnormalized ? (plugin.normalize && (name = plugin.normalize(name, function(name) {
return normalize(name, parentName, !0)
}) || ""), normalizedMap = makeModuleMap(map.prefix + "!" + name, this.map.parentMap, !0), on(normalizedMap, "defined", bind(this, function(value) {
this.map.normalizedMap = normalizedMap, this.init([], function() {
return value
}, null, {
enabled: !0,
ignore: !0
})
})), void((normalizedMod = getOwn(registry, normalizedMap.id)) && (this.depMaps.push(normalizedMap), this.events.error && normalizedMod.on("error", bind(this, function(err) {
this.emit("error", err)
})), normalizedMod.enable()))) : bundleId ? (this.map.url = context.nameToUrl(bundleId), void this.load()) : (load = bind(this, function(value) {
this.init([], function() {
return value
}, null, {
enabled: !0
})
}), load.error = bind(this, function(err) {
this.inited = !0, this.error = err, err.requireModules = [id], eachProp(registry, function(mod) {
0 === mod.map.id.indexOf(id + "_unnormalized") && cleanRegistry(mod.map.id)
}), onError(err)
}), load.fromText = bind(this, function(text, textAlt) {
var moduleName = map.name,
moduleMap = makeModuleMap(moduleName),
hasInteractive = useInteractive;
textAlt && (text = textAlt), hasInteractive && (useInteractive = !1), getModule(moduleMap), hasProp(config.config, id) && (config.config[moduleName] = config.config[id]);
try {
req.exec(text)
} catch (e) {
return onError(makeError("fromtexteval", "fromText eval for " + id + " failed: " + e, e, [id]))
}
hasInteractive && (useInteractive = !0), this.depMaps.push(moduleMap), context.completeLoad(moduleName), localRequire([moduleName], load)
}), void plugin.load(map.name, localRequire, load, config))
})), context.enable(pluginMap, this), this.pluginMaps[pluginMap.id] = pluginMap
},
enable: function() {
enabledRegistry[this.map.id] = this, this.enabled = !0, this.enabling = !0, each(this.depMaps, bind(this, function(depMap, i) {
var id, mod, handler;
if ("string" == typeof depMap) {
if (depMap = makeModuleMap(depMap, this.map.isDefine ? this.map : this.map.parentMap, !1, !this.skipMap), this.depMaps[i] = depMap, handler = getOwn(handlers, depMap.id)) return void(this.depExports[i] = handler(this));
this.depCount += 1, on(depMap, "defined", bind(this, function(depExports) {
this.undefed || (this.defineDep(i, depExports), this.check())
})), this.errback ? on(depMap, "error", bind(this, this.errback)) : this.events.error && on(depMap, "error", bind(this, function(err) {
this.emit("error", err)
}))
}
id = depMap.id, mod = registry[id], hasProp(handlers, id) || !mod || mod.enabled || context.enable(depMap, this)
})), eachProp(this.pluginMaps, bind(this, function(pluginMap) {
var mod = getOwn(registry, pluginMap.id);
mod && !mod.enabled && context.enable(pluginMap, this)
})), this.enabling = !1, this.check()
},
on: function(name, cb) {
var cbs = this.events[name];
cbs || (cbs = this.events[name] = []), cbs.push(cb)
},
emit: function(name, evt) {
each(this.events[name], function(cb) {
cb(evt)
}), "error" === name && delete this.events[name]
}
}, context = {
config: config,
contextName: contextName,
registry: registry,
defined: defined,
urlFetched: urlFetched,
defQueue: defQueue,
defQueueMap: {},
Module: Module,
makeModuleMap: makeModuleMap,
nextTick: req.nextTick,
onError: onError,
configure: function(cfg) {
if (cfg.baseUrl && "/" !== cfg.baseUrl.charAt(cfg.baseUrl.length - 1) && (cfg.baseUrl += "/"), "string" == typeof cfg.urlArgs) {
var urlArgs = cfg.urlArgs;
cfg.urlArgs = function(id, url) {
return (-1 === url.indexOf("?") ? "?" : "&") + urlArgs
}
}
var shim = config.shim,
objs = {
paths: !0,
bundles: !0,
config: !0,
map: !0
};
eachProp(cfg, function(value, prop) {
objs[prop] ? (config[prop] || (config[prop] = {}), mixin(config[prop], value, !0, !0)) : config[prop] = value
}), cfg.bundles && eachProp(cfg.bundles, function(value, prop) {
each(value, function(v) {
v !== prop && (bundlesMap[v] = prop)
})
}), cfg.shim && (eachProp(cfg.shim, function(value, id) {
isArray(value) && (value = {
deps: value
}), !value.exports && !value.init || value.exportsFn || (value.exportsFn = context.makeShimExports(value)), shim[id] = value
}), config.shim = shim), cfg.packages && each(cfg.packages, function(pkgObj) {
var location, name;
pkgObj = "string" == typeof pkgObj ? {
name: pkgObj
} : pkgObj, name = pkgObj.name, location = pkgObj.location, location && (config.paths[name] = pkgObj.location), config.pkgs[name] = pkgObj.name + "/" + (pkgObj.main || "main").replace(currDirRegExp, "").replace(jsSuffixRegExp, "")
}), eachProp(registry, function(mod, id) {
mod.inited || mod.map.unnormalized || (mod.map = makeModuleMap(id, null, !0))
}), (cfg.deps || cfg.callback) && context.require(cfg.deps || [], cfg.callback)
},
makeShimExports: function(value) {
function fn() {
var ret;
return value.init && (ret = value.init.apply(global, arguments)), ret || value.exports && getGlobal(value.exports)
}
return fn
},
makeRequire: function(relMap, options) {
function localRequire(deps, callback, errback) {
var id, map, requireMod;
return options.enableBuildCallback && callback && isFunction(callback) && (callback.__requireJsBuild = !0), "string" == typeof deps ? isFunction(callback) ? onError(makeError("requireargs", "Invalid require call"), errback) : relMap && hasProp(handlers, deps) ? handlers[deps](registry[relMap.id]) : req.get ? req.get(context, deps, relMap, localRequire) : (map = makeModuleMap(deps, relMap, !1, !0), id = map.id, hasProp(defined, id) ? defined[id] : onError(makeError("notloaded", 'Module name "' + id + '" has not been loaded yet for context: ' + contextName + (relMap ? "" : ". Use require([])")))) : (intakeDefines(), context.nextTick(function() {
intakeDefines(), requireMod = getModule(makeModuleMap(null, relMap)), requireMod.skipMap = options.skipMap, requireMod.init(deps, callback, errback, {
enabled: !0
}), checkLoaded()
}), localRequire)
}
return options = options || {}, mixin(localRequire, {
isBrowser: isBrowser,
toUrl: function(moduleNamePlusExt) {
var ext, index = moduleNamePlusExt.lastIndexOf("."),
segment = moduleNamePlusExt.split("/")[0],
isRelative = "." === segment || ".." === segment;
return -1 !== index && (!isRelative || index > 1) && (ext = moduleNamePlusExt.substring(index, moduleNamePlusExt.length), moduleNamePlusExt = moduleNamePlusExt.substring(0, index)), context.nameToUrl(normalize(moduleNamePlusExt, relMap && relMap.id, !0), ext, !0)
},
defined: function(id) {
return hasProp(defined, makeModuleMap(id, relMap, !1, !0).id)
},
specified: function(id) {
return id = makeModuleMap(id, relMap, !1, !0).id, hasProp(defined, id) || hasProp(registry, id)
}
}), relMap || (localRequire.undef = function(id) {
takeGlobalQueue();
var map = makeModuleMap(id, relMap, !0),
mod = getOwn(registry, id);
mod.undefed = !0, removeScript(id), delete defined[id], delete urlFetched[map.url], delete undefEvents[id], eachReverse(defQueue, function(args, i) {
args[0] === id && defQueue.splice(i, 1)
}), delete context.defQueueMap[id], mod && (mod.events.defined && (undefEvents[id] = mod.events), cleanRegistry(id))
}), localRequire
},
enable: function(depMap) {
getOwn(registry, depMap.id) && getModule(depMap).enable()
},
completeLoad: function(moduleName) {
var found, args, mod, shim = getOwn(config.shim, moduleName) || {},
shExports = shim.exports;
for (takeGlobalQueue(); defQueue.length;) {
if (args = defQueue.shift(), null === args[0]) {
if (args[0] = moduleName, found) break;
found = !0
} else args[0] === moduleName && (found = !0);
callGetModule(args)
}
if (context.defQueueMap = {}, mod = getOwn(registry, moduleName), !found && !hasProp(defined, moduleName) && mod && !mod.inited) {
if (!(!config.enforceDefine || shExports && getGlobal(shExports))) return hasPathFallback(moduleName) ? void 0 : onError(makeError("nodefine", "No define call for " + moduleName, null, [moduleName]));
callGetModule([moduleName, shim.deps || [], shim.exportsFn])
}
checkLoaded()
},
nameToUrl: function(moduleName, ext, skipExt) {
var paths, syms, i, parentModule, url, parentPath, bundleId, pkgMain = getOwn(config.pkgs, moduleName);
if (pkgMain && (moduleName = pkgMain), bundleId = getOwn(bundlesMap, moduleName)) return context.nameToUrl(bundleId, ext, skipExt);
if (req.jsExtRegExp.test(moduleName)) url = moduleName + (ext || "");
else {
for (paths = config.paths, syms = moduleName.split("/"), i = syms.length; i > 0; i -= 1)
if (parentModule = syms.slice(0, i).join("/"), parentPath = getOwn(paths, parentModule)) {
isArray(parentPath) && (parentPath = parentPath[0]), syms.splice(0, i, parentPath);
break
} url = syms.join("/"), url += ext || (/^data\:|^blob\:|\?/.test(url) || skipExt ? "" : ".js"), url = ("/" === url.charAt(0) || url.match(/^[\w\+\.\-]+:/) ? "" : config.baseUrl) + url
}
return config.urlArgs && !/^blob\:/.test(url) ? url + config.urlArgs(moduleName, url) : url
},
load: function(id, url) {
req.load(context, id, url)
},
execCb: function(name, callback, args, exports) {
return callback.apply(exports, args)
},
onScriptLoad: function(evt) {
if ("load" === evt.type || readyRegExp.test((evt.currentTarget || evt.srcElement).readyState)) {
interactiveScript = null;
var data = getScriptData(evt);
context.completeLoad(data.id)
}
},
onScriptError: function(evt) {
var data = getScriptData(evt);
if (!hasPathFallback(data.id)) {
var parents = [];
return eachProp(registry, function(value, key) {
0 !== key.indexOf("_@r") && each(value.depMaps, function(depMap) {
if (depMap.id === data.id) return parents.push(key), !0
})
}), onError(makeError("scripterror", 'Script error for "' + data.id + (parents.length ? '", needed by: ' + parents.join(", ") : '"'), evt, [data.id]))
}
}
}, context.require = context.makeRequire(), context
}
function getInteractiveScript() {
return interactiveScript && "interactive" === interactiveScript.readyState ? interactiveScript : (eachReverse(scripts(), function(script) {
if ("interactive" === script.readyState) return interactiveScript = script
}), interactiveScript)
}
var req, s, head, baseElement, dataMain, src, interactiveScript, currentlyAddingScript, mainScript, subPath, version = "2.3.5",
commentRegExp = /\/\*[\s\S]*?\*\/|([^:"'=]|^)\/\/.*$/gm,
cjsRequireRegExp = /[^.]\s*require\s*\(\s*["']([^'"\s]+)["']\s*\)/g,
jsSuffixRegExp = /\.js$/,
currDirRegExp = /^\.\//,
op = Object.prototype,
ostring = op.toString,
hasOwn = op.hasOwnProperty,
isBrowser = !("undefined" == typeof window || "undefined" == typeof navigator || !window.document),
isWebWorker = !isBrowser && "undefined" != typeof importScripts,
readyRegExp = isBrowser && "PLAYSTATION 3" === navigator.platform ? /^complete$/ : /^(complete|loaded)$/,
defContextName = "_",
isOpera = "undefined" != typeof opera && "[object Opera]" === opera.toString(),
contexts = {},
cfg = {},
globalDefQueue = [],
useInteractive = !1;
if (void 0 === define) {
if (void 0 !== requirejs) {
if (isFunction(requirejs)) return;
cfg = requirejs, requirejs = void 0
}
void 0 === require || isFunction(require) || (cfg = require, require = void 0), req = requirejs = function(deps, callback, errback, optional) {
var context, config, contextName = defContextName;
return isArray(deps) || "string" == typeof deps || (config = deps, isArray(callback) ? (deps = callback, callback = errback, errback = optional) : deps = []), config && config.context && (contextName = config.context), context = getOwn(contexts, contextName), context || (context = contexts[contextName] = req.s.newContext(contextName)), config && context.configure(config), context.require(deps, callback, errback)
}, req.config = function(config) {
return req(config)
}, req.nextTick = void 0 !== setTimeout ? function(fn) {
setTimeout(fn, 4)
} : function(fn) {
fn()
}, require || (require = req), req.version = version, req.jsExtRegExp = /^\/|:|\?|\.js$/, req.isBrowser = isBrowser, s = req.s = {
contexts: contexts,
newContext: newContext
}, req({}), each(["toUrl", "undef", "defined", "specified"], function(prop) {
req[prop] = function() {
var ctx = contexts[defContextName];
return ctx.require[prop].apply(ctx, arguments)
}
}), isBrowser && (head = s.head = document.getElementsByTagName("head")[0], (baseElement = document.getElementsByTagName("base")[0]) && (head = s.head = baseElement.parentNode)), req.onError = defaultOnError, req.createNode = function(config, moduleName, url) {
var node = config.xhtml ? document.createElementNS("http://www.w3.org/1999/xhtml", "html:script") : document.createElement("script");
return node.type = config.scriptType || "text/javascript", node.charset = "utf-8", node.async = !0, node
}, req.load = function(context, moduleName, url) {
var node, config = context && context.config || {};
if (isBrowser) return node = req.createNode(config, moduleName, url), node.setAttribute("data-requirecontext", context.contextName), node.setAttribute("data-requiremodule", moduleName), !node.attachEvent || node.attachEvent.toString && node.attachEvent.toString().indexOf("[native code") < 0 || isOpera ? (node.addEventListener("load", context.onScriptLoad, !1), node.addEventListener("error", context.onScriptError, !1)) : (useInteractive = !0, node.attachEvent("onreadystatechange", context.onScriptLoad)), node.src = url, config.onNodeCreated && config.onNodeCreated(node, config, moduleName, url), currentlyAddingScript = node, baseElement ? head.insertBefore(node, baseElement) : head.appendChild(node), currentlyAddingScript = null, node;
if (isWebWorker) try {
setTimeout(function() {}, 0), importScripts(url), context.completeLoad(moduleName)
} catch (e) {
context.onError(makeError("importscripts", "importScripts failed for " + moduleName + " at " + url, e, [moduleName]))
}
}, isBrowser && !cfg.skipDataMain && eachReverse(scripts(), function(script) {
if (head || (head = script.parentNode), dataMain = script.getAttribute("data-main")) return mainScript = dataMain, cfg.baseUrl || -1 !== mainScript.indexOf("!") || (src = mainScript.split("/"), mainScript = src.pop(), subPath = src.length ? src.join("/") + "/" : "./", cfg.baseUrl = subPath), mainScript = mainScript.replace(jsSuffixRegExp, ""), req.jsExtRegExp.test(mainScript) && (mainScript = dataMain), cfg.deps = cfg.deps ? cfg.deps.concat(mainScript) : [mainScript], !0
}), define = function(name, deps, callback) {
var node, context;
"string" != typeof name && (callback = deps, deps = name, name = null), isArray(deps) || (callback = deps, deps = null), !deps && isFunction(callback) && (deps = [], callback.length && (callback.toString().replace(commentRegExp, commentReplace).replace(cjsRequireRegExp, function(match, dep) {
deps.push(dep)
}), deps = (1 === callback.length ? ["require"] : ["require", "exports", "module"]).concat(deps))), useInteractive && (node = currentlyAddingScript || getInteractiveScript()) && (name || (name = node.getAttribute("data-requiremodule")), context = contexts[node.getAttribute("data-requirecontext")]), context ? (context.defQueue.push([name, deps, callback]), context.defQueueMap[name] = !0) : globalDefQueue.push([name, deps, callback])
}, define.amd = {
jQuery: !0
}, req.exec = function(text) {
return eval(text)
}, req(cfg)
}
}(this, "undefined" == typeof setTimeout ? void 0 : setTimeout);

View file

@ -10,23 +10,6 @@ define(['dom', 'scroller', 'browser', 'layoutManager', 'focusManager', 'register
newButton.classList.add(activeButtonClass);
}
function getFocusCallback(tabs, e) {
return function () {
onClick.call(tabs, e);
};
}
function onFocus(e) {
if (layoutManager.tv) {
if (this.focusTimeout) {
clearTimeout(this.focusTimeout);
}
this.focusTimeout = setTimeout(getFocusCallback(this, e), 700);
}
}
function getTabPanel(tabs, index) {
return null;
@ -87,10 +70,6 @@ define(['dom', 'scroller', 'browser', 'layoutManager', 'focusManager', 'register
function onClick(e) {
if (this.focusTimeout) {
clearTimeout(this.focusTimeout);
}
var tabs = this;
var current = tabs.querySelector('.' + activeButtonClass);
@ -177,10 +156,6 @@ define(['dom', 'scroller', 'browser', 'layoutManager', 'focusManager', 'register
dom.addEventListener(this, 'click', onClick, {
passive: true
});
dom.addEventListener(this, 'focus', onFocus, {
passive: true,
capture: true
});
};
EmbyTabs.focus = function () {
@ -237,10 +212,6 @@ define(['dom', 'scroller', 'browser', 'layoutManager', 'focusManager', 'register
dom.removeEventListener(this, 'click', onClick, {
passive: true
});
dom.removeEventListener(this, 'focus', onFocus, {
passive: true,
capture: true
});
};
function getSelectedTabButton(elem) {

View file

@ -330,6 +330,7 @@ define(['require', 'apphost', 'layoutManager', 'focusManager', 'globalize', 'loa
if (next) {
viewItem.parentNode.removeChild(viewItem);
next.parentNode.insertBefore(viewItem, next.nextSibling);
focusManager.focus(e.target);
}
} else {
@ -339,6 +340,7 @@ define(['require', 'apphost', 'layoutManager', 'focusManager', 'globalize', 'loa
if (prev) {
viewItem.parentNode.removeChild(viewItem);
prev.parentNode.insertBefore(viewItem, prev);
focusManager.focus(e.target);
}
}
}

View file

@ -1043,7 +1043,7 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa
video: videoElement,
subUrl: getTextTrackUrl(track, item),
fonts: attachments.map(i => i.DeliveryUrl),
workerUrl: appRouter.baseUrl() + "/node_modules/libass-wasm/dist/subtitles-octopus-worker.js",
workerUrl: appRouter.baseUrl() + "/libraries/subtitles-octopus-worker.js",
onError: function() {
htmlMediaHelper.onErrorInternal(self, 'mediadecodeerror')
}

View file

@ -1,31 +1,37 @@
define(["jQuery", "loading", "libraryMenu", "globalize", "connectionManager", "emby-button"], function($, loading, libraryMenu, globalize, connectionManager) {
define(["jQuery", "loading", "libraryMenu", "globalize", "connectionManager", "emby-button"], function ($, loading, libraryMenu, globalize, connectionManager) {
"use strict";
function populateHistory(packageInfo, page) {
var html = "";
var length = Math.min(packageInfo.versions.length, 10);
for (var i = 0; i < length; i++) {
var version = packageInfo.versions[i];
html += '<h2 style="margin:.5em 0;">' + version.versionStr + " (" + version.classification + ")</h2>";
html += '<div style="margin-bottom:1.5em;">' + version.description + "</div>";
}
$("#revisionHistory", page).html(html);
}
function populateVersions(packageInfo, page, installedPlugin) {
var html = "";
for (var i = 0; i < packageInfo.versions.length; i++) {
var version = packageInfo.versions[i];
html += '<option value="' + version.versionStr + "|" + version.classification + '">' + version.versionStr + " (" + version.classification + ")</option>";
}
var selectmenu = $("#selectVersion", page).html(html);
if (!installedPlugin) {
$("#pCurrentVersion", page).hide().html("");
}
var packageVersion = packageInfo.versions.filter(function(current) {
var packageVersion = packageInfo.versions.filter(function (current) {
return "Release" == current.classification;
})[0];
packageVersion = packageVersion || packageInfo.versions.filter(function(current) {
packageVersion = packageVersion || packageInfo.versions.filter(function (current) {
return "Beta" == current.classification;
})[0];
@ -36,12 +42,13 @@ define(["jQuery", "loading", "libraryMenu", "globalize", "connectionManager", "e
}
function renderPackage(pkg, installedPlugins, page) {
var installedPlugin = installedPlugins.filter(function(ip) {
return ip.Name == pkg.name
var installedPlugin = installedPlugins.filter(function (ip) {
return ip.Name == pkg.name;
})[0];
populateVersions(pkg, page, installedPlugin);
populateHistory(pkg, page);
$(".pluginName", page).html(pkg.name);
if ("Server" == pkg.targetSystem) {
$("#btnInstallDiv", page).removeClass("hide");
$("#nonServerMsg", page).hide();
@ -52,60 +59,69 @@ define(["jQuery", "loading", "libraryMenu", "globalize", "connectionManager", "e
var msg = globalize.translate("MessageInstallPluginFromApp");
$("#nonServerMsg", page).html(msg).show();
}
if (pkg.shortDescription) {
$("#tagline", page).show().html(pkg.shortDescription);
} else {
$("#tagline", page).hide();
}
$("#overview", page).html(pkg.overview || "");
$("#developer", page).html(pkg.owner);
if (pkg.richDescUrl) {
$("#pViewWebsite", page).show();
$("#pViewWebsite a", page).attr("href", pkg.richDescUrl);
} else {
$("#pViewWebsite", page).hide();
}
if (pkg.previewImage || pkg.thumbImage) {
var img = pkg.previewImage ? pkg.previewImage : pkg.thumbImage;
$("#pPreviewImage", page).show().html("<img class='pluginPreviewImg' src='" + img + "' style='max-width: 100%;' />");
} else {
$("#pPreviewImage", page).hide().html("");
}
if (installedPlugin) {
var currentVersionText = globalize.translate("MessageYouHaveVersionInstalled").replace("{0}", "<strong>" + installedPlugin.Version + "</strong>");
$("#pCurrentVersion", page).show().html(currentVersionText);
} else {
$("#pCurrentVersion", page).hide().html("");
}
loading.hide();
}
function alertText(options) {
require(["alert"], function(alert) {
alert(options)
})
require(["alert"], function (alert) {
alert(options);
});
}
function performInstallation(page, packageName, guid, updateClass, version) {
var developer = $("#developer", page).html().toLowerCase();
var alertCallback = function() {
var alertCallback = function () {
loading.show();
page.querySelector("#btnInstall").disabled = true;
ApiClient.installPlugin(packageName, guid, updateClass, version).then(function() {
ApiClient.installPlugin(packageName, guid, updateClass, version).then(function () {
loading.hide();
alertText(globalize.translate("PluginInstalledMessage"));
});
};
if (developer !== 'jellyfin') {
loading.hide();
var msg = globalize.translate("MessagePluginInstallDisclaimer");
msg += "<br/>";
msg += "<br/>";
msg += globalize.translate("PleaseConfirmPluginInstallation");
require(["confirm"], function(confirm) {
confirm(msg, globalize.translate("HeaderConfirmPluginInstallation")).then(function() {
require(["confirm"], function (confirm) {
confirm(msg, globalize.translate("HeaderConfirmPluginInstallation")).then(function () {
alertCallback();
}, function() {
}, function () {
console.log('plugin not installed');
});
});
@ -114,18 +130,19 @@ define(["jQuery", "loading", "libraryMenu", "globalize", "connectionManager", "e
}
}
return function(view, params) {
$(".addPluginForm", view).on("submit", function() {
return function (view, params) {
$(".addPluginForm", view).on("submit", function () {
loading.show();
var page = $(this).parents("#addPluginPage")[0];
var name = params.name;
var guid = params.guid;
ApiClient.getInstalledPlugins().then(function(plugins) {
var installedPlugin = plugins.filter(function(plugin) {
ApiClient.getInstalledPlugins().then(function (plugins) {
var installedPlugin = plugins.filter(function (plugin) {
return plugin.Name == name;
})[0];
var vals = $("#selectVersion", page).val().split("|");
var version = vals[0];
if (installedPlugin) {
if (installedPlugin.Version === version) {
loading.hide();
@ -140,16 +157,16 @@ define(["jQuery", "loading", "libraryMenu", "globalize", "connectionManager", "e
});
return false;
});
view.addEventListener("viewshow", function() {
view.addEventListener("viewshow", function () {
var page = this;
loading.show();
var name = params.name;
var guid = params.guid;
var promise1 = ApiClient.getPackageInfo(name, guid);
var promise2 = ApiClient.getInstalledPlugins();
Promise.all([promise1, promise2]).then(function(responses) {
Promise.all([promise1, promise2]).then(function (responses) {
renderPackage(responses[0], responses[1], page);
});
})
}
});
};
});

View file

@ -57,5 +57,5 @@ define(["appSettings", "loading", "browser", "emby-button"], function(appSetting
appRouter.back();
});
}
}
};
});

View file

@ -1,14 +1,14 @@
define(["datetime", "loading", "libraryMenu", "dom", "globalize", "emby-button"], function(datetime, loading, libraryMenu, dom, globalize) {
define(["datetime", "loading", "libraryMenu", "dom", "globalize", "emby-button"], function (datetime, loading, libraryMenu, dom, globalize) {
"use strict";
function revoke(page, key) {
require(["confirm"], function(confirm) {
confirm(globalize.translate("MessageConfirmRevokeApiKey"), globalize.translate("HeaderConfirmRevokeApiKey")).then(function() {
require(["confirm"], function (confirm) {
confirm(globalize.translate("MessageConfirmRevokeApiKey"), globalize.translate("HeaderConfirmRevokeApiKey")).then(function () {
loading.show();
ApiClient.ajax({
type: "DELETE",
url: ApiClient.getUrl("Auth/Keys/" + key)
}).then(function() {
}).then(function () {
loadData(page);
});
});
@ -16,11 +16,23 @@ define(["datetime", "loading", "libraryMenu", "dom", "globalize", "emby-button"]
}
function renderKeys(page, keys) {
var rows = keys.map(function(item) {
var rows = keys.map(function (item) {
var html = "";
html += '<tr class="detailTableBodyRow detailTableBodyRow-shaded">', html += '<td class="detailTableBodyCell">', html += '<button type="button" is="emby-button" data-token="' + item.AccessToken + '" class="raised raised-mini btnRevoke" data-mini="true" title="' + globalize.translate("ButtonRevoke") + '" style="margin:0;">' + globalize.translate("ButtonRevoke") + "</button>", html += "</td>", html += '<td class="detailTableBodyCell" style="vertical-align:middle;">', html += item.AccessToken, html += "</td>", html += '<td class="detailTableBodyCell" style="vertical-align:middle;">', html += item.AppName || "", html += "</td>", html += '<td class="detailTableBodyCell" style="vertical-align:middle;">';
var date = datetime.parseISO8601Date(item.DateCreated, !0);
return html += datetime.toLocaleDateString(date) + " " + datetime.getDisplayTime(date), html += "</td>", html += "</tr>"
html += '<tr class="detailTableBodyRow detailTableBodyRow-shaded">';
html += '<td class="detailTableBodyCell">';
html += '<button type="button" is="emby-button" data-token="' + item.AccessToken + '" class="raised raised-mini btnRevoke" data-mini="true" title="' + globalize.translate("ButtonRevoke") + '" style="margin:0;">' + globalize.translate("ButtonRevoke") + "</button>";
html += "</td>";
html += '<td class="detailTableBodyCell" style="vertical-align:middle;">';
html += item.AccessToken;
html += "</td>";
html += '<td class="detailTableBodyCell" style="vertical-align:middle;">';
html += item.AppName || "";
html += "</td>";
html += '<td class="detailTableBodyCell" style="vertical-align:middle;">';
var date = datetime.parseISO8601Date(item.DateCreated, true);
html += datetime.toLocaleDateString(date) + " " + datetime.getDisplayTime(date);
html += "</td>";
return html += "</tr>";
}).join("");
page.querySelector(".resultBody").innerHTML = rows;
loading.hide();
@ -28,42 +40,44 @@ define(["datetime", "loading", "libraryMenu", "dom", "globalize", "emby-button"]
function loadData(page) {
loading.show();
ApiClient.getJSON(ApiClient.getUrl("Auth/Keys")).then(function(result) {
ApiClient.getJSON(ApiClient.getUrl("Auth/Keys")).then(function (result) {
renderKeys(page, result.Items);
});
}
function showNewKeyPrompt(page) {
require(["prompt"], function(prompt) {
require(["prompt"], function (prompt) {
prompt({
title: globalize.translate("HeaderNewApiKey"),
label: globalize.translate("LabelAppName"),
description: globalize.translate("LabelAppNameExample")
}).then(function(value) {
}).then(function (value) {
ApiClient.ajax({
type: "POST",
url: ApiClient.getUrl("Auth/Keys", {
App: value
})
}).then(function() {
loadData(page)
})
})
})
}).then(function () {
loadData(page);
});
});
});
}
pageIdOn("pageinit", "apiKeysPage", function() {
pageIdOn("pageinit", "apiKeysPage", function () {
var page = this;
page.querySelector(".btnNewKey").addEventListener("click", function() {
showNewKeyPrompt(page)
page.querySelector(".btnNewKey").addEventListener("click", function () {
showNewKeyPrompt(page);
});
page.querySelector(".tblApiKeys").addEventListener("click", function(e) {
page.querySelector(".tblApiKeys").addEventListener("click", function (e) {
var btnRevoke = dom.parentWithClass(e.target, "btnRevoke");
btnRevoke && revoke(page, btnRevoke.getAttribute("data-token"))
if (btnRevoke) {
revoke(page, btnRevoke.getAttribute("data-token"));
}
});
});
pageIdOn("pagebeforeshow", "apiKeysPage", function() {
pageIdOn("pagebeforeshow", "apiKeysPage", function () {
loadData(this);
})
});
});
});

View file

@ -5,8 +5,8 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa
require(["alert"], function (alert) {
var title;
var text = [];
var displayPlayMethod = playMethodHelper.getDisplayPlayMethod(session);
if (displayPlayMethod === "DirectStream") {
title = globalize.translate("DirectStreaming");
text.push(globalize.translate("DirectStreamHelp1"));
@ -15,6 +15,7 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa
} else if (displayPlayMethod === "Transcode") {
title = globalize.translate("Transcoding");
text.push(globalize.translate("MediaIsBeingConverted"));
if (session.TranscodingInfo && session.TranscodingInfo.TranscodeReasons && session.TranscodingInfo.TranscodeReasons.length) {
text.push("<br/>");
text.push(globalize.translate("LabelReasonForTranscoding"));
@ -23,6 +24,7 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa
});
}
}
alert({
text: text.join("<br/>"),
title: title
@ -73,6 +75,7 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa
case "sendmessage":
showSendMessageForm(btn, session);
break;
case "transcodinginfo":
showPlaybackInfo(btn, session);
}
@ -124,6 +127,7 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa
list.push(session);
}
}
return list;
}
@ -139,7 +143,7 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa
if (!result.Items.length) {
view.querySelector(".activeRecordingsSection").classList.add("hide");
return void (itemsContainer.innerHTML = "");
return void(itemsContainer.innerHTML = "");
}
view.querySelector(".activeRecordingsSection").classList.remove("hide");
@ -165,13 +169,13 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa
function reloadSystemInfo(view, apiClient) {
apiClient.getSystemInfo().then(function (systemInfo) {
view.querySelector("#serverName").innerHTML = globalize.translate("DashboardServerName", systemInfo.ServerName);
var localizedVersion = globalize.translate("DashboardVersionNumber", systemInfo.Version);
if (systemInfo.SystemUpdateLevel !== "Release") {
localizedVersion += " " + systemInfo.SystemUpdateLevel;
}
view.querySelector("#versionNumber").innerHTML = localizedVersion;
view.querySelector("#versionNumber").innerHTML = localizedVersion;
view.querySelector("#operatingSystem").innerHTML = globalize.translate("DashboardOperatingSystem", systemInfo.OperatingSystem);
view.querySelector("#architecture").innerHTML = globalize.translate("DashboardArchitecture", systemInfo.SystemArchitecture);
@ -226,14 +230,13 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa
} else {
var nowPlayingItem = session.NowPlayingItem;
var className = "scalableCard card activeSession backdropCard backdropCard-scalable";
html += '<div class="' + className + '" id="' + rowId + '">';
html += '<div class="cardBox visualCardBox">';
html += '<div class="cardScalable visualCardBox-cardScalable">';
html += '<div class="cardPadder cardPadder-backdrop"></div>';
html += '<div class="cardContent">';
var imgUrl = DashboardPage.getNowPlayingImageUrl(nowPlayingItem);
if (imgUrl) {
html += '<div class="sessionNowPlayingContent sessionNowPlayingContent-withbackground"';
html += ' data-src="' + imgUrl + '" style="display:inline-block;background-image:url(\'' + imgUrl + "');\"></div>";
@ -243,8 +246,8 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa
html += '<div class="sessionNowPlayingInnerContent">';
html += '<div class="sessionAppInfo">';
var clientImage = DashboardPage.getClientImage(session);
if (clientImage) {
html += clientImage;
}
@ -261,28 +264,36 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa
html += '<div class="sessionTranscodingFramerate"></div>';
}
html += '<div class="sessionNowPlayingDetails">'
html += '<div class="sessionNowPlayingDetails">';
var nowPlayingName = DashboardPage.getNowPlayingName(session);
html += '<div class="sessionNowPlayingInfo" data-imgsrc="' + nowPlayingName.image + '">';
html += nowPlayingName.html;
html += "</div>";
html += '<div class="sessionNowPlayingTime">' + DashboardPage.getSessionNowPlayingTime(session) + "</div>";
html += '</div>'
html += '</div>';
if (nowPlayingItem && nowPlayingItem.RunTimeTicks) {
var percent = 100 * (session.PlayState.PositionTicks || 0) / nowPlayingItem.RunTimeTicks;
html += indicators.getProgressHtml(percent, { containerClass: "playbackProgress" });
html += indicators.getProgressHtml(percent, {
containerClass: "playbackProgress"
});
} else {
// need to leave the element in just in case the device starts playback
html += indicators.getProgressHtml(0, { containerClass: "playbackProgress hide" });
html += indicators.getProgressHtml(0, {
containerClass: "playbackProgress hide"
});
}
if (session.TranscodingInfo && session.TranscodingInfo.CompletionPercentage) {
var percent = session.TranscodingInfo.CompletionPercentage.toFixed(1);
html += indicators.getProgressHtml(percent, { containerClass: "transcodingProgress" });
html += indicators.getProgressHtml(percent, {
containerClass: "transcodingProgress"
});
} else {
// same issue as playbackProgress element above
html += indicators.getProgressHtml(0, { containerClass: "transcodingProgress hide" });
html += indicators.getProgressHtml(0, {
containerClass: "transcodingProgress hide"
});
}
html += "</div>";
@ -317,6 +328,7 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa
parentElement.insertAdjacentHTML("beforeend", html);
var deadSessionElem = parentElement.querySelector(".deadSession");
if (deadSessionElem) {
deadSessionElem.parentNode.removeChild(deadSessionElem);
}
@ -340,9 +352,9 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa
for (var i = 0, length = tasks.length; i < length; i++) {
var task = tasks[i];
html += "<p>";
html += task.Name + "<br/>";
if (task.State === "Running") {
var progress = (task.CurrentProgressPercentage || 0).toFixed(1);
html += '<progress max="100" value="' + progress + '" title="' + progress + '%">';
@ -373,19 +385,24 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa
var html = "";
var showTranscodingInfo = false;
var displayPlayMethod = playMethodHelper.getDisplayPlayMethod(session);
if (displayPlayMethod === "DirectStream") {
html += globalize.translate("DirectStreaming");
} else if (displayPlayMethod === "Transcode") {
html += globalize.translate("Transcoding");
if (session.TranscodingInfo && session.TranscodingInfo.Framerate) {
html += " (" + session.TranscodingInfo.Framerate + " fps)";
}
showTranscodingInfo = true;
} else if (displayPlayMethod === "DirectPlay") {
html += globalize.translate("DirectPlaying");
}
if (showTranscodingInfo) {
var line = [];
if (session.TranscodingInfo) {
if (session.TranscodingInfo.Bitrate) {
if (session.TranscodingInfo.Bitrate > 1e6) {
@ -493,6 +510,7 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa
},
getUsersHtml: function (session) {
var html = [];
if (session.UserId) {
html.push(session.UserName);
}
@ -516,8 +534,8 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa
},
updateSession: function (row, session) {
row.classList.remove("deadSession");
var nowPlayingItem = session.NowPlayingItem;
if (nowPlayingItem) {
row.classList.add("playingSession");
} else {
@ -537,6 +555,7 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa
}
var btnSessionPlayPause = row.querySelector(".btnSessionPlayPause");
if (session.ServerId && nowPlayingItem && session.SupportsRemoteControl && session.DeviceId !== connectionManager.deviceId()) {
btnSessionPlayPause.classList.remove("hide");
row.querySelector(".btnSessionStop").classList.remove("hide");
@ -565,19 +584,29 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa
}
var playbackProgressElem = row.querySelector(".playbackProgress");
if (nowPlayingItem && nowPlayingItem.RunTimeTicks) {
var percent = 100 * (session.PlayState.PositionTicks || 0) / nowPlayingItem.RunTimeTicks;
playbackProgressElem.outerHTML = indicators.getProgressHtml(percent, { containerClass: "playbackProgress" });
playbackProgressElem.outerHTML = indicators.getProgressHtml(percent, {
containerClass: "playbackProgress"
});
} else {
playbackProgressElem.outerHTML = indicators.getProgressHtml(0, { containerClass: "playbackProgress hide" });
playbackProgressElem.outerHTML = indicators.getProgressHtml(0, {
containerClass: "playbackProgress hide"
});
}
var transcodingProgress = row.querySelector(".transcodingProgress");
if (session.TranscodingInfo && session.TranscodingInfo.CompletionPercentage) {
var percent = session.TranscodingInfo.CompletionPercentage.toFixed(1);
transcodingProgress.outerHTML = indicators.getProgressHtml(percent, { containerClass: "transcodingProgress" });
transcodingProgress.outerHTML = indicators.getProgressHtml(percent, {
containerClass: "transcodingProgress"
});
} else {
transcodingProgress.outerHTML = indicators.getProgressHtml(0, { containerClass: "transcodingProgress hide" });
transcodingProgress.outerHTML = indicators.getProgressHtml(0, {
containerClass: "transcodingProgress hide"
});
}
var imgUrl = DashboardPage.getNowPlayingImageUrl(nowPlayingItem) || "";
@ -815,10 +844,13 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa
view.addEventListener("viewdestroy", function () {
var page = this;
var userActivityLog = page.userActivityLog;
if (userActivityLog) {
userActivityLog.destroy();
}
var serverActivityLog = page.serverActivityLog;
if (serverActivityLog) {
serverActivityLog.destroy();
}

View file

@ -1,23 +1,25 @@
define(["loading", "libraryMenu", "dom", "emby-input", "emby-button"], function(loading, libraryMenu, dom) {
define(["loading", "libraryMenu", "dom", "emby-input", "emby-button"], function (loading, libraryMenu, dom) {
"use strict";
function load(page, device, deviceOptions) {
page.querySelector("#txtCustomName", page).value = deviceOptions.CustomName || "", page.querySelector(".reportedName", page).innerHTML = device.Name || ""
page.querySelector("#txtCustomName", page).value = deviceOptions.CustomName || "";
page.querySelector(".reportedName", page).innerHTML = device.Name || "";
}
function loadData() {
var page = this;
loading.show();
var id = getParameterByName("id"),
promise1 = ApiClient.getJSON(ApiClient.getUrl("Devices/Info", {
Id: id
})),
promise2 = ApiClient.getJSON(ApiClient.getUrl("Devices/Options", {
Id: id
}));
Promise.all([promise1, promise2]).then(function(responses) {
load(page, responses[0], responses[1]), loading.hide()
})
var id = getParameterByName("id");
var promise1 = ApiClient.getJSON(ApiClient.getUrl("Devices/Info", {
Id: id
}));
var promise2 = ApiClient.getJSON(ApiClient.getUrl("Devices/Options", {
Id: id
}));
Promise.all([promise1, promise2]).then(function (responses) {
load(page, responses[0], responses[1]);
loading.hide();
});
}
function save(page) {
@ -31,14 +33,18 @@ define(["loading", "libraryMenu", "dom", "emby-input", "emby-button"], function(
CustomName: page.querySelector("#txtCustomName").value
}),
contentType: "application/json"
}).then(Dashboard.processServerConfigurationUpdateResult)
}).then(Dashboard.processServerConfigurationUpdateResult);
}
function onSubmit(e) {
var form = this;
return save(dom.parentWithClass(form, "page")), e.preventDefault(), !1
save(dom.parentWithClass(form, "page"));
e.preventDefault();
return false;
}
return function(view, params) {
view.querySelector("form").addEventListener("submit", onSubmit), view.addEventListener("viewshow", loadData)
}
});
return function (view, params) {
view.querySelector("form").addEventListener("submit", onSubmit);
view.addEventListener("viewshow", loadData);
};
});

View file

@ -1,61 +1,73 @@
define(["loading", "dom", "libraryMenu", "globalize", "scripts/imagehelper", "humanedate", "emby-button", "emby-itemscontainer", "cardStyle"], function(loading, dom, libraryMenu, globalize, imageHelper) {
define(["loading", "dom", "libraryMenu", "globalize", "scripts/imagehelper", "humanedate", "emby-button", "emby-itemscontainer", "cardStyle"], function (loading, dom, libraryMenu, globalize, imageHelper) {
"use strict";
function canDelete(deviceId) {
return deviceId !== ApiClient.deviceId()
return deviceId !== ApiClient.deviceId();
}
function deleteDevice(page, id) {
var msg = globalize.translate("DeleteDeviceConfirmation");
require(["confirm"], function(confirm) {
require(["confirm"], function (confirm) {
confirm({
text: msg,
title: globalize.translate("HeaderDeleteDevice"),
confirmText: globalize.translate("ButtonDelete"),
primary: "delete"
}).then(function() {
loading.show(), ApiClient.ajax({
}).then(function () {
loading.show();
ApiClient.ajax({
type: "DELETE",
url: ApiClient.getUrl("Devices", {
Id: id
})
}).then(function() {
loadData(page)
})
})
})
}).then(function () {
loadData(page);
});
});
});
}
function showDeviceMenu(view, btn, deviceId) {
var menuItems = [];
canEdit && menuItems.push({
name: globalize.translate("Edit"),
id: "open",
ironIcon: "mode-edit"
}), canDelete(deviceId) && menuItems.push({
name: globalize.translate("Delete"),
id: "delete",
ironIcon: "delete"
}), require(["actionsheet"], function(actionsheet) {
if (canEdit) {
menuItems.push({
name: globalize.translate("Edit"),
id: "open",
ironIcon: "mode-edit"
});
}
if (canDelete(deviceId)) {
menuItems.push({
name: globalize.translate("Delete"),
id: "delete",
ironIcon: "delete"
});
}
require(["actionsheet"], function (actionsheet) {
actionsheet.show({
items: menuItems,
positionTo: btn,
callback: function(id) {
callback: function (id) {
switch (id) {
case "open":
Dashboard.navigate("device.html?id=" + deviceId);
break;
case "delete":
deleteDevice(view, deviceId)
deleteDevice(view, deviceId);
}
}
})
})
});
});
}
function load(page, devices) {
var html = "";
html += devices.map(function(device) {
html += devices.map(function (device) {
var deviceHtml = "";
deviceHtml += "<div data-id='" + device.Id + "' class='card backdropCard'>";
deviceHtml += '<div class="cardBox visualCardBox">';
@ -63,20 +75,24 @@ define(["loading", "dom", "libraryMenu", "globalize", "scripts/imagehelper", "hu
deviceHtml += '<div class="cardPadder cardPadder-backdrop"></div>';
deviceHtml += '<a is="emby-linkbutton" href="' + (canEdit ? "device.html?id=" + device.Id : "#") + '" class="cardContent cardImageContainer">';
var iconUrl = imageHelper.getDeviceIcon(device.Name);
if (iconUrl) {
deviceHtml += '<div class="cardImage" style="background-image:url(\'' + iconUrl + "');background-size: auto 64%;background-position:center center;\">";
deviceHtml += "</div>";
} else {
deviceHtml += '<i class="cardImageIcon md-icon">tablet_android</i>';
}
deviceHtml += "</a>";
deviceHtml += "</div>";
deviceHtml += '<div class="cardFooter">';
if (canEdit || canDelete(device.Id)) {
deviceHtml += '<div style="text-align:right; float:right;padding-top:5px;">';
deviceHtml += '<button type="button" is="paper-icon-button-light" data-id="' + device.Id + '" title="' + globalize.translate("Menu") + '" class="btnDeviceMenu"><i class="md-icon">&#xE5D3;</i></button>';
deviceHtml += "</div>";
}
deviceHtml += "<div class='cardText'>";
deviceHtml += device.Name;
deviceHtml += "</div>";
@ -84,10 +100,12 @@ define(["loading", "dom", "libraryMenu", "globalize", "scripts/imagehelper", "hu
deviceHtml += device.AppName + " " + device.AppVersion;
deviceHtml += "</div>";
deviceHtml += "<div class='cardText cardText-secondary'>";
if (device.LastUserName) {
deviceHtml += device.LastUserName;
deviceHtml += ", " + humaneDate(device.DateLastActivity);
}
deviceHtml += "&nbsp;";
deviceHtml += "</div>";
deviceHtml += "</div>";
@ -99,17 +117,24 @@ define(["loading", "dom", "libraryMenu", "globalize", "scripts/imagehelper", "hu
}
function loadData(page) {
loading.show(), ApiClient.getJSON(ApiClient.getUrl("Devices")).then(function(result) {
load(page, result.Items), loading.hide()
})
loading.show();
ApiClient.getJSON(ApiClient.getUrl("Devices")).then(function (result) {
load(page, result.Items);
loading.hide();
});
}
var canEdit = ApiClient.isMinServerVersion("3.4.1.31");
return function(view, params) {
view.querySelector(".devicesList").addEventListener("click", function(e) {
return function (view, params) {
view.querySelector(".devicesList").addEventListener("click", function (e) {
var btnDeviceMenu = dom.parentWithClass(e.target, "btnDeviceMenu");
btnDeviceMenu && showDeviceMenu(view, btnDeviceMenu, btnDeviceMenu.getAttribute("data-id"))
}), view.addEventListener("viewshow", function() {
loadData(this)
})
}
if (btnDeviceMenu) {
showDeviceMenu(view, btnDeviceMenu, btnDeviceMenu.getAttribute("data-id"));
}
});
view.addEventListener("viewshow", function () {
loadData(this);
});
};
});

View file

@ -65,8 +65,8 @@ define(["jQuery", "loading", "fnchecked", "emby-select", "emby-button", "emby-in
profile.ContainerProfiles = profile.ContainerProfiles || [];
profile.CodecProfiles = profile.CodecProfiles || [];
profile.ResponseProfiles = profile.ResponseProfiles || [];
var usersHtml = "<option></option>" + users.map(function (u__w) {
return '<option value="' + u__w.Id + '">' + u__w.Name + "</option>";
var usersHtml = "<option></option>" + users.map(function (u) {
return '<option value="' + u.Id + '">' + u.Name + "</option>";
}).join("");
$("#selectUser", page).html(usersHtml).val(profile.UserId || "");
renderSubProfiles(page, profile);
@ -74,12 +74,12 @@ define(["jQuery", "loading", "fnchecked", "emby-select", "emby-button", "emby-in
function renderIdentificationHeaders(page, headers) {
var index = 0;
var html = '<div class="paperList">' + headers.map(function (h__e) {
var html = '<div class="paperList">' + headers.map(function (h) {
var li = '<div class="listItem">';
li += '<i class="md-icon listItemIcon">info</i>';
li += '<div class="listItemBody">';
li += '<h3 class="listItemBodyText">' + h__e.Name + ": " + (h__e.Value || "") + "</h3>";
li += '<div class="listItemBodyText secondary">' + (h__e.Match || "") + "</div>";
li += '<h3 class="listItemBodyText">' + h.Name + ": " + (h.Value || "") + "</h3>";
li += '<div class="listItemBodyText secondary">' + (h.Match || "") + "</div>";
li += "</div>";
li += '<button type="button" is="paper-icon-button-light" class="btnDeleteIdentificationHeader listItemButton" data-index="' + index + '"><i class="md-icon">delete</i></button>';
li += "</div>";
@ -130,11 +130,11 @@ define(["jQuery", "loading", "fnchecked", "emby-select", "emby-button", "emby-in
}
function renderXmlDocumentAttributes(page, attribute) {
var html = '<div class="paperList">' + attribute.map(function (h__r) {
var html = '<div class="paperList">' + attribute.map(function (h) {
var li = '<div class="listItem">';
li += '<i class="md-icon listItemIcon">info</i>';
li += '<div class="listItemBody">';
li += '<h3 class="listItemBodyText">' + h__r.Name + " = " + (h__r.Value || "") + "</h3>";
li += '<h3 class="listItemBodyText">' + h.Name + " = " + (h.Value || "") + "</h3>";
li += "</div>";
li += '<button type="button" is="paper-icon-button-light" class="btnDeleteXmlAttribute listItemButton" data-index="0"><i class="md-icon">delete</i></button>';
return li += "</div>";
@ -172,11 +172,11 @@ define(["jQuery", "loading", "fnchecked", "emby-select", "emby-button", "emby-in
function renderSubtitleProfiles(page, profiles) {
var index = 0;
var html = '<div class="paperList">' + profiles.map(function (h__t) {
var html = '<div class="paperList">' + profiles.map(function (h) {
var li = '<div class="listItem lnkEditSubProfile" data-index="' + index + '">';
li += '<i class="md-icon listItemIcon">info</i>';
li += '<div class="listItemBody">';
li += '<h3 class="listItemBodyText">' + (h__t.Format || "") + "</h3>";
li += '<h3 class="listItemBodyText">' + (h.Format || "") + "</h3>";
li += "</div>";
li += '<button type="button" is="paper-icon-button-light" class="btnDeleteProfile listItemButton" data-index="' + index + '"><i class="md-icon">delete</i></button>';
li += "</div>";
@ -248,8 +248,8 @@ define(["jQuery", "loading", "fnchecked", "emby-select", "emby-button", "emby-in
html += '<ul data-role="listview" data-inset="true" data-split-icon="delete">';
var currentType;
for (var i__y = 0, length = profiles.length; i__y < length; i__y++) {
var profile = profiles[i__y];
for (var i = 0, length = profiles.length; i < length; i++) {
var profile = profiles[i];
if (profile.Type !== currentType) {
html += '<li data-role="list-divider">' + profile.Type + "</li>";
@ -257,7 +257,7 @@ define(["jQuery", "loading", "fnchecked", "emby-select", "emby-button", "emby-in
}
html += "<div>";
html += '<a is="emby-linkbutton" href="#" class="lnkEditSubProfile" data-profileindex="' + i__y + '">';
html += '<a is="emby-linkbutton" href="#" class="lnkEditSubProfile" data-profileindex="' + i + '">';
html += "<p>" + Globalize.translate("ValueContainer").replace("{0}", profile.Container || allText) + "</p>";
if ("Video" == profile.Type) {
@ -270,7 +270,7 @@ define(["jQuery", "loading", "fnchecked", "emby-select", "emby-button", "emby-in
}
html += "</a>";
html += '<button type="button" is="paper-icon-button-light" class="btnDeleteProfile listItemButton" data-profileindex="' + i__y + '"><i class="md-icon">delete</i></button>';
html += '<button type="button" is="paper-icon-button-light" class="btnDeleteProfile listItemButton" data-profileindex="' + i + '"><i class="md-icon">delete</i></button>';
html += "</div>";
}
@ -308,8 +308,8 @@ define(["jQuery", "loading", "fnchecked", "emby-select", "emby-button", "emby-in
html += '<ul data-role="listview" data-inset="true" data-split-icon="delete">';
var currentType;
for (var i__u = 0, length = profiles.length; i__u < length; i__u++) {
var profile = profiles[i__u];
for (var i = 0, length = profiles.length; i < length; i++) {
var profile = profiles[i];
if (profile.Type !== currentType) {
html += '<li data-role="list-divider">' + profile.Type + "</li>";
@ -317,7 +317,7 @@ define(["jQuery", "loading", "fnchecked", "emby-select", "emby-button", "emby-in
}
html += "<div>";
html += '<a is="emby-linkbutton" href="#" class="lnkEditSubProfile" data-profileindex="' + i__u + '">';
html += '<a is="emby-linkbutton" href="#" class="lnkEditSubProfile" data-profileindex="' + i + '">';
html += "<p>Protocol: " + (profile.Protocol || "Http") + "</p>";
html += "<p>" + Globalize.translate("ValueContainer").replace("{0}", profile.Container || allText) + "</p>";
@ -331,7 +331,7 @@ define(["jQuery", "loading", "fnchecked", "emby-select", "emby-button", "emby-in
}
html += "</a>";
html += '<button type="button" is="paper-icon-button-light" class="btnDeleteProfile listItemButton" data-profileindex="' + i__u + '"><i class="md-icon">delete</i></button>';
html += '<button type="button" is="paper-icon-button-light" class="btnDeleteProfile listItemButton" data-profileindex="' + i + '"><i class="md-icon">delete</i></button>';
html += "</div>";
}
@ -394,8 +394,8 @@ define(["jQuery", "loading", "fnchecked", "emby-select", "emby-button", "emby-in
html += '<ul data-role="listview" data-inset="true" data-split-icon="delete">';
var currentType;
for (var i__i = 0, length = profiles.length; i__i < length; i__i++) {
var profile = profiles[i__i];
for (var i = 0, length = profiles.length; i < length; i++) {
var profile = profiles[i];
if (profile.Type !== currentType) {
html += '<li data-role="list-divider">' + profile.Type + "</li>";
@ -403,19 +403,19 @@ define(["jQuery", "loading", "fnchecked", "emby-select", "emby-button", "emby-in
}
html += "<div>";
html += '<a is="emby-linkbutton" href="#" class="lnkEditSubProfile" data-profileindex="' + i__i + '">';
html += '<a is="emby-linkbutton" href="#" class="lnkEditSubProfile" data-profileindex="' + i + '">';
html += "<p>" + Globalize.translate("ValueContainer").replace("{0}", profile.Container || allText) + "</p>";
if (profile.Conditions && profile.Conditions.length) {
html += "<p>";
html += Globalize.translate("ValueConditions").replace("{0}", profile.Conditions.map(function (c__o) {
return c__o.Property;
html += Globalize.translate("ValueConditions").replace("{0}", profile.Conditions.map(function (c) {
return c.Property;
}).join(", "));
html += "</p>";
}
html += "</a>";
html += '<button type="button" is="paper-icon-button-light" class="btnDeleteProfile listItemButton" data-profileindex="' + i__i + '"><i class="md-icon">delete</i></button>';
html += '<button type="button" is="paper-icon-button-light" class="btnDeleteProfile listItemButton" data-profileindex="' + i + '"><i class="md-icon">delete</i></button>';
html += "</div>";
}
@ -465,8 +465,8 @@ define(["jQuery", "loading", "fnchecked", "emby-select", "emby-button", "emby-in
html += '<ul data-role="listview" data-inset="true" data-split-icon="delete">';
var currentType;
for (var i__p = 0, length = profiles.length; i__p < length; i__p++) {
var profile = profiles[i__p];
for (var i = 0, length = profiles.length; i < length; i++) {
var profile = profiles[i];
var type = profile.Type.replace("VideoAudio", "Video Audio");
if (type !== currentType) {
@ -475,19 +475,19 @@ define(["jQuery", "loading", "fnchecked", "emby-select", "emby-button", "emby-in
}
html += "<div>";
html += '<a is="emby-linkbutton" href="#" class="lnkEditSubProfile" data-profileindex="' + i__p + '">';
html += '<a is="emby-linkbutton" href="#" class="lnkEditSubProfile" data-profileindex="' + i + '">';
html += "<p>" + Globalize.translate("ValueCodec").replace("{0}", profile.Codec || allText) + "</p>";
if (profile.Conditions && profile.Conditions.length) {
html += "<p>";
html += Globalize.translate("ValueConditions").replace("{0}", profile.Conditions.map(function (c__a) {
return c__a.Property;
html += Globalize.translate("ValueConditions").replace("{0}", profile.Conditions.map(function (c) {
return c.Property;
}).join(", "));
html += "</p>";
}
html += "</a>";
html += '<button type="button" is="paper-icon-button-light" class="btnDeleteProfile listItemButton" data-profileindex="' + i__p + '"><i class="md-icon">delete</i></button>';
html += '<button type="button" is="paper-icon-button-light" class="btnDeleteProfile listItemButton" data-profileindex="' + i + '"><i class="md-icon">delete</i></button>';
html += "</div>";
}
@ -537,8 +537,8 @@ define(["jQuery", "loading", "fnchecked", "emby-select", "emby-button", "emby-in
html += '<ul data-role="listview" data-inset="true" data-split-icon="delete">';
var currentType;
for (var i__s = 0, length = profiles.length; i__s < length; i__s++) {
var profile = profiles[i__s];
for (var i = 0, length = profiles.length; i < length; i++) {
var profile = profiles[i];
if (profile.Type !== currentType) {
html += '<li data-role="list-divider">' + profile.Type + "</li>";
@ -546,7 +546,7 @@ define(["jQuery", "loading", "fnchecked", "emby-select", "emby-button", "emby-in
}
html += "<div>";
html += '<a is="emby-linkbutton" href="#" class="lnkEditSubProfile" data-profileindex="' + i__s + '">';
html += '<a is="emby-linkbutton" href="#" class="lnkEditSubProfile" data-profileindex="' + i + '">';
html += "<p>" + Globalize.translate("ValueContainer").replace("{0}", profile.Container || allText) + "</p>";
if ("Video" == profile.Type) {
@ -560,14 +560,14 @@ define(["jQuery", "loading", "fnchecked", "emby-select", "emby-button", "emby-in
if (profile.Conditions && profile.Conditions.length) {
html += "<p>";
html += Globalize.translate("ValueConditions").replace("{0}", profile.Conditions.map(function (c__d) {
return c__d.Property;
html += Globalize.translate("ValueConditions").replace("{0}", profile.Conditions.map(function (c) {
return c.Property;
}).join(", "));
html += "</p>";
}
html += "</a>";
html += '<button type="button" is="paper-icon-button-light" class="btnDeleteProfile listItemButton" data-profileindex="' + i__s + '"><i class="md-icon">delete</i></button>';
html += '<button type="button" is="paper-icon-button-light" class="btnDeleteProfile listItemButton" data-profileindex="' + i + '"><i class="md-icon">delete</i></button>';
html += "</div>";
}
@ -649,8 +649,8 @@ define(["jQuery", "loading", "fnchecked", "emby-select", "emby-button", "emby-in
profile.Name = $("#txtName", page).val();
profile.EnableAlbumArtInDidl = $("#chkEnableAlbumArtInDidl", page).checked();
profile.EnableSingleAlbumArtLimit = $("#chkEnableSingleImageLimit", page).checked();
profile.SupportedMediaTypes = $(".chkMediaType:checked", page).get().map(function (c__f) {
return c__f.getAttribute("data-value");
profile.SupportedMediaTypes = $(".chkMediaType:checked", page).get().map(function (c) {
return c.getAttribute("data-value");
}).join(",");
profile.Identification = profile.Identification || {};
profile.FriendlyName = $("#txtInfoFriendlyName", page).val();

View file

@ -1,48 +1,75 @@
define(["jQuery", "globalize", "loading", "libraryMenu", "listViewStyle", "emby-button"], function($, globalize, loading, libraryMenu) {
define(["jQuery", "globalize", "loading", "libraryMenu", "listViewStyle", "emby-button"], function ($, globalize, loading, libraryMenu) {
"use strict";
function loadProfiles(page) {
loading.show(), ApiClient.getJSON(ApiClient.getUrl("Dlna/ProfileInfos")).then(function(result) {
renderUserProfiles(page, result), renderSystemProfiles(page, result), loading.hide()
})
loading.show();
ApiClient.getJSON(ApiClient.getUrl("Dlna/ProfileInfos")).then(function (result) {
renderUserProfiles(page, result);
renderSystemProfiles(page, result);
loading.hide();
});
}
function renderUserProfiles(page, profiles) {
renderProfiles(page, page.querySelector(".customProfiles"), profiles.filter(function(p) {
return "User" == p.Type
}))
renderProfiles(page, page.querySelector(".customProfiles"), profiles.filter(function (p) {
return "User" == p.Type;
}));
}
function renderSystemProfiles(page, profiles) {
renderProfiles(page, page.querySelector(".systemProfiles"), profiles.filter(function(p) {
return "System" == p.Type
}))
renderProfiles(page, page.querySelector(".systemProfiles"), profiles.filter(function (p) {
return "System" == p.Type;
}));
}
function renderProfiles(page, element, profiles) {
var html = "";
profiles.length && (html += '<div class="paperList">');
if (profiles.length) {
html += '<div class="paperList">';
}
for (var i = 0, length = profiles.length; i < length; i++) {
var profile = profiles[i];
html += '<div class="listItem listItem-border">', html += '<i class="listItemIcon md-icon">live_tv</i>', html += '<div class="listItemBody two-line">', html += "<a is='emby-linkbutton' style='padding:0;margin:0;' data-ripple='false' class='clearLink' href='dlnaprofile.html?id=" + profile.Id + "'>", html += "<div>" + profile.Name + "</div>", html += "</a>", html += "</div>", "User" == profile.Type && (html += '<button type="button" is="paper-icon-button-light" class="btnDeleteProfile" data-profileid="' + profile.Id + '" title="' + globalize.translate("ButtonDelete") + '"><i class="md-icon">delete</i></button>'), html += "</div>"
html += '<div class="listItem listItem-border">';
html += '<i class="listItemIcon md-icon">live_tv</i>';
html += '<div class="listItemBody two-line">';
html += "<a is='emby-linkbutton' style='padding:0;margin:0;' data-ripple='false' class='clearLink' href='dlnaprofile.html?id=" + profile.Id + "'>";
html += "<div>" + profile.Name + "</div>";
html += "</a>";
html += "</div>";
if ("User" == profile.Type) {
html += '<button type="button" is="paper-icon-button-light" class="btnDeleteProfile" data-profileid="' + profile.Id + '" title="' + globalize.translate("ButtonDelete") + '"><i class="md-icon">delete</i></button>';
}
html += "</div>";
}
profiles.length && (html += "</div>"), element.innerHTML = html, $(".btnDeleteProfile", element).on("click", function() {
if (profiles.length) {
html += "</div>";
}
element.innerHTML = html;
$(".btnDeleteProfile", element).on("click", function () {
var id = this.getAttribute("data-profileid");
deleteProfile(page, id)
})
deleteProfile(page, id);
});
}
function deleteProfile(page, id) {
require(["confirm"], function(confirm) {
confirm(globalize.translate("MessageConfirmProfileDeletion"), globalize.translate("HeaderConfirmProfileDeletion")).then(function() {
loading.show(), ApiClient.ajax({
require(["confirm"], function (confirm) {
confirm(globalize.translate("MessageConfirmProfileDeletion"), globalize.translate("HeaderConfirmProfileDeletion")).then(function () {
loading.show();
ApiClient.ajax({
type: "DELETE",
url: ApiClient.getUrl("Dlna/Profiles/" + id)
}).then(function() {
loading.hide(), loadProfiles(page)
})
})
})
}).then(function () {
loading.hide();
loadProfiles(page);
});
});
});
}
function getTabs() {
@ -52,10 +79,11 @@ define(["jQuery", "globalize", "loading", "libraryMenu", "listViewStyle", "emby-
}, {
href: "dlnaprofiles.html",
name: globalize.translate("TabProfiles")
}]
}];
}
$(document).on("pageshow", "#dlnaProfilesPage", function() {
libraryMenu.setTabs("dlna", 1, getTabs), loadProfiles(this)
})
});
$(document).on("pageshow", "#dlnaProfilesPage", function () {
libraryMenu.setTabs("dlna", 1, getTabs);
loadProfiles(this);
});
});

View file

@ -1,20 +1,34 @@
define(["jQuery", "loading", "libraryMenu", "fnchecked"], function($, loading, libraryMenu) {
define(["jQuery", "loading", "libraryMenu", "fnchecked"], function ($, loading, libraryMenu) {
"use strict";
function loadPage(page, config, users) {
page.querySelector("#chkEnablePlayTo").checked = config.EnablePlayTo, page.querySelector("#chkEnableDlnaDebugLogging").checked = config.EnableDebugLog, $("#txtClientDiscoveryInterval", page).val(config.ClientDiscoveryIntervalSeconds), $("#chkEnableServer", page).checked(config.EnableServer), $("#chkBlastAliveMessages", page).checked(config.BlastAliveMessages), $("#txtBlastInterval", page).val(config.BlastAliveMessageIntervalSeconds);
var usersHtml = users.map(function(u) {
return '<option value="' + u.Id + '">' + u.Name + "</option>"
page.querySelector("#chkEnablePlayTo").checked = config.EnablePlayTo;
page.querySelector("#chkEnableDlnaDebugLogging").checked = config.EnableDebugLog;
$("#txtClientDiscoveryInterval", page).val(config.ClientDiscoveryIntervalSeconds);
$("#chkEnableServer", page).checked(config.EnableServer);
$("#chkBlastAliveMessages", page).checked(config.BlastAliveMessages);
$("#txtBlastInterval", page).val(config.BlastAliveMessageIntervalSeconds);
var usersHtml = users.map(function (u) {
return '<option value="' + u.Id + '">' + u.Name + "</option>";
}).join("");
$("#selectUser", page).html(usersHtml).val(config.DefaultUserId || ""), loading.hide()
$("#selectUser", page).html(usersHtml).val(config.DefaultUserId || "");
loading.hide();
}
function onSubmit() {
loading.show();
var form = this;
return ApiClient.getNamedConfiguration("dlna").then(function(config) {
config.EnablePlayTo = form.querySelector("#chkEnablePlayTo").checked, config.EnableDebugLog = form.querySelector("#chkEnableDlnaDebugLogging").checked, config.ClientDiscoveryIntervalSeconds = $("#txtClientDiscoveryInterval", form).val(), config.EnableServer = $("#chkEnableServer", form).checked(), config.BlastAliveMessages = $("#chkBlastAliveMessages", form).checked(), config.BlastAliveMessageIntervalSeconds = $("#txtBlastInterval", form).val(), config.DefaultUserId = $("#selectUser", form).val(), ApiClient.updateNamedConfiguration("dlna", config).then(Dashboard.processServerConfigurationUpdateResult)
}), !1
ApiClient.getNamedConfiguration("dlna").then(function (config) {
config.EnablePlayTo = form.querySelector("#chkEnablePlayTo").checked;
config.EnableDebugLog = form.querySelector("#chkEnableDlnaDebugLogging").checked;
config.ClientDiscoveryIntervalSeconds = $("#txtClientDiscoveryInterval", form).val();
config.EnableServer = $("#chkEnableServer", form).checked();
config.BlastAliveMessages = $("#chkBlastAliveMessages", form).checked();
config.BlastAliveMessageIntervalSeconds = $("#txtBlastInterval", form).val();
config.DefaultUserId = $("#selectUser", form).val();
ApiClient.updateNamedConfiguration("dlna", config).then(Dashboard.processServerConfigurationUpdateResult);
});
return false;
}
function getTabs() {
@ -24,17 +38,19 @@ define(["jQuery", "loading", "libraryMenu", "fnchecked"], function($, loading, l
}, {
href: "dlnaprofiles.html",
name: Globalize.translate("TabProfiles")
}]
}];
}
$(document).on("pageinit", "#dlnaSettingsPage", function() {
$(".dlnaSettingsForm").off("submit", onSubmit).on("submit", onSubmit)
}).on("pageshow", "#dlnaSettingsPage", function() {
libraryMenu.setTabs("dlna", 0, getTabs), loading.show();
var page = this,
promise1 = ApiClient.getNamedConfiguration("dlna"),
promise2 = ApiClient.getUsers();
Promise.all([promise1, promise2]).then(function(responses) {
loadPage(page, responses[0], responses[1])
})
})
});
$(document).on("pageinit", "#dlnaSettingsPage", function () {
$(".dlnaSettingsForm").off("submit", onSubmit).on("submit", onSubmit);
}).on("pageshow", "#dlnaSettingsPage", function () {
libraryMenu.setTabs("dlna", 0, getTabs);
loading.show();
var page = this;
var promise1 = ApiClient.getNamedConfiguration("dlna");
var promise2 = ApiClient.getUsers();
Promise.all([promise1, promise2]).then(function (responses) {
loadPage(page, responses[0], responses[1]);
});
});
});

View file

@ -1,17 +1,31 @@
define(["loading", "scripts/editorsidebar"], function(loading) {
define(["loading", "scripts/editorsidebar"], function (loading) {
"use strict";
function reload(context, itemId) {
loading.show(), itemId ? require(["metadataEditor"], function(metadataEditor) {
metadataEditor.embed(context.querySelector(".editPageInnerContent"), itemId, ApiClient.serverInfo().Id)
}) : (context.querySelector(".editPageInnerContent").innerHTML = "", loading.hide())
loading.show();
if (itemId) {
require(["metadataEditor"], function (metadataEditor) {
metadataEditor.embed(context.querySelector(".editPageInnerContent"), itemId, ApiClient.serverInfo().Id);
});
} else {
context.querySelector(".editPageInnerContent").innerHTML = "";
loading.hide();
}
}
return function(view, params) {
view.addEventListener("viewshow", function() {
reload(this, MetadataEditor.getCurrentItemId())
}), MetadataEditor.setCurrentItemId(null), view.querySelector(".libraryTree").addEventListener("itemclicked", function(event) {
return function (view, params) {
view.addEventListener("viewshow", function () {
reload(this, MetadataEditor.getCurrentItemId());
});
MetadataEditor.setCurrentItemId(null);
view.querySelector(".libraryTree").addEventListener("itemclicked", function (event) {
var data = event.detail;
data.id != MetadataEditor.getCurrentItemId() && (MetadataEditor.setCurrentItemId(data.id), reload(view, data.id))
})
}
});
if (data.id != MetadataEditor.getCurrentItemId()) {
MetadataEditor.setCurrentItemId(data.id);
reload(view, data.id);
}
});
};
});

View file

@ -1,9 +1,9 @@
define(["jQuery", "loading", "globalize", "dom", "libraryMenu"], function($, loading, globalize, dom, libraryMenu) {
define(["jQuery", "loading", "globalize", "dom", "libraryMenu"], function ($, loading, globalize, dom, libraryMenu) {
"use strict";
function loadPage(page, config, systemInfo) {
Array.prototype.forEach.call(page.querySelectorAll(".chkDecodeCodec"), function(c) {
c.checked = -1 !== (config.HardwareDecodingCodecs || []).indexOf(c.getAttribute("data-codec"))
Array.prototype.forEach.call(page.querySelectorAll(".chkDecodeCodec"), function (c) {
c.checked = -1 !== (config.HardwareDecodingCodecs || []).indexOf(c.getAttribute("data-codec"));
});
page.querySelector("#chkHardwareEncoding").checked = config.EnableHardwareEncoding;
$("#selectVideoDecoder", page).val(config.HardwareAccelerationType);
@ -17,19 +17,22 @@ define(["jQuery", "loading", "globalize", "dom", "libraryMenu"], function($, loa
page.querySelector("#chkEnableSubtitleExtraction").checked = config.EnableSubtitleExtraction || false;
page.querySelector("#selectVideoDecoder").dispatchEvent(new CustomEvent("change", {
bubbles: true
})), loading.hide()
}));
loading.hide();
}
function onSaveEncodingPathFailure(response) {
loading.hide();
var msg = "";
msg = globalize.translate("FFmpegSavePathNotFound"), require(["alert"], function(alert) {
alert(msg)
})
msg = globalize.translate("FFmpegSavePathNotFound");
require(["alert"], function (alert) {
alert(msg);
});
}
function updateEncoder(form) {
return ApiClient.getSystemInfo().then(function(systemInfo) {
return ApiClient.getSystemInfo().then(function (systemInfo) {
return ApiClient.ajax({
url: ApiClient.getUrl("System/MediaEncoder/Path"),
type: "POST",
@ -37,37 +40,67 @@ define(["jQuery", "loading", "globalize", "dom", "libraryMenu"], function($, loa
Path: form.querySelector(".txtEncoderPath").value,
PathType: "Custom"
}
}).then(Dashboard.processServerConfigurationUpdateResult, onSaveEncodingPathFailure)
})
}).then(Dashboard.processServerConfigurationUpdateResult, onSaveEncodingPathFailure);
});
}
function onSubmit() {
var form = this,
onDecoderConfirmed = function() {
loading.show(), ApiClient.getNamedConfiguration("encoding").then(function(config) {
config.DownMixAudioBoost = $("#txtDownMixAudioBoost", form).val(), config.TranscodingTempPath = $("#txtTranscodingTempPath", form).val(), config.EncodingThreadCount = $("#selectThreadCount", form).val(), config.HardwareAccelerationType = $("#selectVideoDecoder", form).val(), config.VaapiDevice = $("#txtVaapiDevice", form).val(), config.H264Preset = form.querySelector("#selectH264Preset").value, config.H264Crf = parseInt(form.querySelector("#txtH264Crf").value || "0"), config.EnableSubtitleExtraction = form.querySelector("#chkEnableSubtitleExtraction").checked, config.HardwareDecodingCodecs = Array.prototype.map.call(Array.prototype.filter.call(form.querySelectorAll(".chkDecodeCodec"), function(c) {
return c.checked
}), function(c) {
return c.getAttribute("data-codec")
}), config.EnableHardwareEncoding = form.querySelector("#chkHardwareEncoding").checked, ApiClient.updateNamedConfiguration("encoding", config).then(function() {
updateEncoder(form)
})
})
};
return $("#selectVideoDecoder", form).val() ? require(["alert"], function(alert) {
alert({
title: globalize.translate("TitleHardwareAcceleration"),
text: globalize.translate("HardwareAccelerationWarning")
}).then(onDecoderConfirmed)
}) : onDecoderConfirmed(), !1
var form = this;
var onDecoderConfirmed = function () {
loading.show();
ApiClient.getNamedConfiguration("encoding").then(function (config) {
config.DownMixAudioBoost = $("#txtDownMixAudioBoost", form).val();
config.TranscodingTempPath = $("#txtTranscodingTempPath", form).val();
config.EncodingThreadCount = $("#selectThreadCount", form).val();
config.HardwareAccelerationType = $("#selectVideoDecoder", form).val();
config.VaapiDevice = $("#txtVaapiDevice", form).val();
config.H264Preset = form.querySelector("#selectH264Preset").value;
config.H264Crf = parseInt(form.querySelector("#txtH264Crf").value || "0");
config.EnableSubtitleExtraction = form.querySelector("#chkEnableSubtitleExtraction").checked;
config.HardwareDecodingCodecs = Array.prototype.map.call(Array.prototype.filter.call(form.querySelectorAll(".chkDecodeCodec"), function (c) {
return c.checked;
}), function (c) {
return c.getAttribute("data-codec");
});
config.EnableHardwareEncoding = form.querySelector("#chkHardwareEncoding").checked;
ApiClient.updateNamedConfiguration("encoding", config).then(function () {
updateEncoder(form);
});
});
};
if ($("#selectVideoDecoder", form).val()) {
require(["alert"], function (alert) {
alert({
title: globalize.translate("TitleHardwareAcceleration"),
text: globalize.translate("HardwareAccelerationWarning")
}).then(onDecoderConfirmed);
});
} else {
onDecoderConfirmed();
}
return false;
}
function setDecodingCodecsVisible(context, value) {
value = value || "";
var any;
Array.prototype.forEach.call(context.querySelectorAll(".chkDecodeCodec"), function(c) {
-1 === c.getAttribute("data-types").split(",").indexOf(value) ? dom.parentWithTag(c, "LABEL").classList.add("hide") : (dom.parentWithTag(c, "LABEL").classList.remove("hide"), any = !0)
}), any ? context.querySelector(".decodingCodecsList").classList.remove("hide") : context.querySelector(".decodingCodecsList").classList.add("hide")
Array.prototype.forEach.call(context.querySelectorAll(".chkDecodeCodec"), function (c) {
if (-1 === c.getAttribute("data-types").split(",").indexOf(value)) {
dom.parentWithTag(c, "LABEL").classList.add("hide");
} else {
dom.parentWithTag(c, "LABEL").classList.remove("hide");
any = true;
}
});
if (any) {
context.querySelector(".decodingCodecsList").classList.remove("hide");
} else {
context.querySelector(".decodingCodecsList").classList.add("hide");
}
}
function getTabs() {
@ -80,44 +113,69 @@ define(["jQuery", "loading", "globalize", "dom", "libraryMenu"], function($, loa
}, {
href: "streamingsettings.html",
name: Globalize.translate("TabStreaming")
}]
}];
}
$(document).on("pageinit", "#encodingSettingsPage", function() {
$(document).on("pageinit", "#encodingSettingsPage", function () {
var page = this;
page.querySelector("#selectVideoDecoder").addEventListener("change", function() {
"vaapi" == this.value ? (page.querySelector(".fldVaapiDevice").classList.remove("hide"), page.querySelector("#txtVaapiDevice").setAttribute("required", "required")) : (page.querySelector(".fldVaapiDevice").classList.add("hide"), page.querySelector("#txtVaapiDevice").removeAttribute("required")), this.value ? page.querySelector(".hardwareAccelerationOptions").classList.remove("hide") : page.querySelector(".hardwareAccelerationOptions").classList.add("hide"), setDecodingCodecsVisible(page, this.value)
}), $("#btnSelectEncoderPath", page).on("click.selectDirectory", function() {
require(["directorybrowser"], function(directoryBrowser) {
var picker = new directoryBrowser;
page.querySelector("#selectVideoDecoder").addEventListener("change", function () {
if ("vaapi" == this.value) {
page.querySelector(".fldVaapiDevice").classList.remove("hide");
page.querySelector("#txtVaapiDevice").setAttribute("required", "required");
} else {
page.querySelector(".fldVaapiDevice").classList.add("hide");
page.querySelector("#txtVaapiDevice").removeAttribute("required");
}
if (this.value) {
page.querySelector(".hardwareAccelerationOptions").classList.remove("hide");
} else {
page.querySelector(".hardwareAccelerationOptions").classList.add("hide");
}
setDecodingCodecsVisible(page, this.value);
});
$("#btnSelectEncoderPath", page).on("click.selectDirectory", function () {
require(["directorybrowser"], function (directoryBrowser) {
var picker = new directoryBrowser();
picker.show({
includeFiles: !0,
callback: function(path) {
path && $(".txtEncoderPath", page).val(path), picker.close()
includeFiles: true,
callback: function (path) {
if (path) {
$(".txtEncoderPath", page).val(path);
}
picker.close();
}
})
})
}), $("#btnSelectTranscodingTempPath", page).on("click.selectDirectory", function() {
require(["directorybrowser"], function(directoryBrowser) {
var picker = new directoryBrowser;
});
});
});
$("#btnSelectTranscodingTempPath", page).on("click.selectDirectory", function () {
require(["directorybrowser"], function (directoryBrowser) {
var picker = new directoryBrowser();
picker.show({
callback: function(path) {
path && $("#txtTranscodingTempPath", page).val(path), picker.close()
callback: function (path) {
if (path) {
$("#txtTranscodingTempPath", page).val(path);
}
picker.close();
},
validateWriteable: !0,
validateWriteable: true,
header: globalize.translate("HeaderSelectTranscodingPath"),
instruction: globalize.translate("HeaderSelectTranscodingPathHelp")
})
})
}), $(".encodingSettingsForm").off("submit", onSubmit).on("submit", onSubmit)
}).on("pageshow", "#encodingSettingsPage", function() {
});
});
});
$(".encodingSettingsForm").off("submit", onSubmit).on("submit", onSubmit);
}).on("pageshow", "#encodingSettingsPage", function () {
loading.show();
libraryMenu.setTabs("playback", 0, getTabs);
var page = this;
ApiClient.getNamedConfiguration("encoding").then(function(config) {
ApiClient.getSystemInfo().then(function(systemInfo) {
ApiClient.getNamedConfiguration("encoding").then(function (config) {
ApiClient.getSystemInfo().then(function (systemInfo) {
loadPage(page, config, systemInfo);
})
})
})
});
});
});
});

View file

@ -1,37 +1,53 @@
define([], function() {
define([], function () {
"use strict";
function processForgotPasswordResult(result) {
if ("ContactAdmin" == result.Action) return void Dashboard.alert({
message: Globalize.translate("MessageContactAdminToResetPassword"),
title: Globalize.translate("HeaderForgotPassword")
});
if ("InNetworkRequired" == result.Action) return void Dashboard.alert({
message: Globalize.translate("MessageForgotPasswordInNetworkRequired"),
title: Globalize.translate("HeaderForgotPassword")
});
if ("ContactAdmin" == result.Action) {
return void Dashboard.alert({
message: Globalize.translate("MessageContactAdminToResetPassword"),
title: Globalize.translate("HeaderForgotPassword")
});
}
if ("InNetworkRequired" == result.Action) {
return void Dashboard.alert({
message: Globalize.translate("MessageForgotPasswordInNetworkRequired"),
title: Globalize.translate("HeaderForgotPassword")
});
}
if ("PinCode" == result.Action) {
var msg = Globalize.translate("MessageForgotPasswordFileCreated");
return msg += "<br/>", msg += "<br/>", msg += "Enter PIN here to finish Password Reset<br/>" ,msg += "<br/>",msg += result.PinFile, msg += "<br/>", void Dashboard.alert({
msg += "<br/>";
msg += "<br/>";
msg += "Enter PIN here to finish Password Reset<br/>";
msg += "<br/>";
msg += result.PinFile;
msg += "<br/>";
return void Dashboard.alert({
message: msg,
title: Globalize.translate("HeaderForgotPassword"),
callback: function() {
Dashboard.navigate("forgotpasswordpin.html")
callback: function () {
Dashboard.navigate("forgotpasswordpin.html");
}
})
});
}
}
return function(view, params) {
return function (view, params) {
function onSubmit(e) {
return ApiClient.ajax({
ApiClient.ajax({
type: "POST",
url: ApiClient.getUrl("Users/ForgotPassword"),
dataType: "json",
data: {
EnteredUsername: view.querySelector("#txtName").value
}
}).then(processForgotPasswordResult), e.preventDefault(), !1
}).then(processForgotPasswordResult);
e.preventDefault();
return false;
}
view.querySelector("form").addEventListener("submit", onSubmit)
}
view.querySelector("form").addEventListener("submit", onSubmit);
};
});

View file

@ -1,33 +1,41 @@
define([], function() {
define([], function () {
"use strict";
function processForgotPasswordResult(result) {
if (result.Success) {
var msg = Globalize.translate("MessagePasswordResetForUsers");
return msg += "<br/>", msg += "<br/>", msg += result.UsersReset.join("<br/>"), void Dashboard.alert({
msg += "<br/>";
msg += "<br/>";
msg += result.UsersReset.join("<br/>");
return void Dashboard.alert({
message: msg,
title: Globalize.translate("HeaderPasswordReset"),
callback: function() {
window.location.href = "index.html"
callback: function () {
window.location.href = "index.html";
}
})
});
}
Dashboard.alert({
message: Globalize.translate("MessageInvalidForgotPasswordPin"),
title: Globalize.translate("HeaderPasswordReset")
})
});
}
return function(view, params) {
return function (view, params) {
function onSubmit(e) {
return ApiClient.ajax({
ApiClient.ajax({
type: "POST",
url: ApiClient.getUrl("Users/ForgotPassword/Pin"),
dataType: "json",
data: {
Pin: view.querySelector("#txtPin").value
}
}).then(processForgotPasswordResult), e.preventDefault(), !1
}).then(processForgotPasswordResult);
e.preventDefault();
return false;
}
view.querySelector("form").addEventListener("submit", onSubmit)
}
});
view.querySelector("form").addEventListener("submit", onSubmit);
};
});

View file

@ -1,4 +1,4 @@
define(["tabbedView", "globalize", "require", "emby-tabs", "emby-button", "emby-scroller"], function(TabbedView, globalize, require) {
define(["tabbedView", "globalize", "require", "emby-tabs", "emby-button", "emby-scroller"], function (TabbedView, globalize, require) {
"use strict";
function getTabs() {
@ -6,47 +6,70 @@ define(["tabbedView", "globalize", "require", "emby-tabs", "emby-button", "emby-
name: globalize.translate("Home")
}, {
name: globalize.translate("Favorites")
}]
}];
}
function getDefaultTabIndex() {
return 0
return 0;
}
function getRequirePromise(deps) {
return new Promise(function(resolve, reject) {
require(deps, resolve)
})
return new Promise(function (resolve, reject) {
require(deps, resolve);
});
}
function getTabController(index) {
if (null == index) throw new Error("index cannot be null");
if (null == index) {
throw new Error("index cannot be null");
}
var depends = [];
switch (index) {
case 0:
depends.push("controllers/hometab");
break;
case 1:
depends.push("controllers/favorites")
depends.push("controllers/favorites");
}
var instance = this;
return getRequirePromise(depends).then(function(controllerFactory) {
return getRequirePromise(depends).then(function (controllerFactory) {
var controller = instance.tabControllers[index];
if (!controller) {
controller = new controllerFactory(instance.view.querySelector(".tabContent[data-index='" + index + "']"), instance.params), instance.tabControllers[index] = controller
controller = new controllerFactory(instance.view.querySelector(".tabContent[data-index='" + index + "']"), instance.params);
instance.tabControllers[index] = controller;
}
return controller
})
return controller;
});
}
function HomeView(view, params) {
TabbedView.call(this, view, params)
TabbedView.call(this, view, params);
}
return Object.assign(HomeView.prototype, TabbedView.prototype), HomeView.prototype.getTabs = getTabs, HomeView.prototype.getDefaultTabIndex = getDefaultTabIndex, HomeView.prototype.getTabController = getTabController, HomeView.prototype.setTitle = function() {
Emby.Page.setTitle(null)
}, HomeView.prototype.onPause = function() {
TabbedView.prototype.onPause.call(this), document.querySelector(".skinHeader").classList.remove("noHomeButtonHeader")
}, HomeView.prototype.onResume = function(options) {
TabbedView.prototype.onResume.call(this, options), document.querySelector(".skinHeader").classList.add("noHomeButtonHeader")
}, HomeView
});
Object.assign(HomeView.prototype, TabbedView.prototype);
HomeView.prototype.getTabs = getTabs;
HomeView.prototype.getDefaultTabIndex = getDefaultTabIndex;
HomeView.prototype.getTabController = getTabController;
HomeView.prototype.setTitle = function () {
Emby.Page.setTitle(null);
};
HomeView.prototype.onPause = function () {
TabbedView.prototype.onPause.call(this);
document.querySelector(".skinHeader").classList.remove("noHomeButtonHeader");
};
HomeView.prototype.onResume = function (options) {
TabbedView.prototype.onResume.call(this, options);
document.querySelector(".skinHeader").classList.add("noHomeButtonHeader");
};
return HomeView;
});

View file

@ -1,35 +1,74 @@
define(["userSettings", "loading", "connectionManager", "apphost", "layoutManager", "focusManager", "homeSections", "emby-itemscontainer"], function(userSettings, loading, connectionManager, appHost, layoutManager, focusManager, homeSections) {
define(["userSettings", "loading", "connectionManager", "apphost", "layoutManager", "focusManager", "homeSections", "emby-itemscontainer"], function (userSettings, loading, connectionManager, appHost, layoutManager, focusManager, homeSections) {
"use strict";
function HomeTab(view, params) {
this.view = view, this.params = params, this.apiClient = connectionManager.currentApiClient(), this.sectionsContainer = view.querySelector(".sections"), view.querySelector(".sections").addEventListener("settingschange", onHomeScreenSettingsChanged.bind(this))
this.view = view;
this.params = params;
this.apiClient = connectionManager.currentApiClient();
this.sectionsContainer = view.querySelector(".sections");
view.querySelector(".sections").addEventListener("settingschange", onHomeScreenSettingsChanged.bind(this));
}
function onHomeScreenSettingsChanged() {
this.sectionsRendered = !1, this.paused || this.onResume({
refresh: !0
})
this.sectionsRendered = false;
if (!this.paused) {
this.onResume({
refresh: true
});
}
}
return HomeTab.prototype.onResume = function(options) {
HomeTab.prototype.onResume = function (options) {
if (this.sectionsRendered) {
var sectionsContainer = this.sectionsContainer;
return sectionsContainer ? homeSections.resume(sectionsContainer, options) : Promise.resolve()
if (sectionsContainer) {
return homeSections.resume(sectionsContainer, options);
}
return Promise.resolve();
}
loading.show();
var view = this.view,
apiClient = this.apiClient;
return this.destroyHomeSections(), this.sectionsRendered = !0, apiClient.getCurrentUser().then(function(user) {
return homeSections.loadSections(view.querySelector(".sections"), apiClient, user, userSettings).then(function() {
options.autoFocus && focusManager.autoFocus(view), loading.hide()
})
})
}, HomeTab.prototype.onPause = function() {
var view = this.view;
var apiClient = this.apiClient;
this.destroyHomeSections();
this.sectionsRendered = true;
return apiClient.getCurrentUser().then(function (user) {
return homeSections.loadSections(view.querySelector(".sections"), apiClient, user, userSettings).then(function () {
if (options.autoFocus) {
focusManager.autoFocus(view);
}
loading.hide();
});
});
};
HomeTab.prototype.onPause = function () {
var sectionsContainer = this.sectionsContainer;
sectionsContainer && homeSections.pause(sectionsContainer)
}, HomeTab.prototype.destroy = function() {
this.view = null, this.params = null, this.apiClient = null, this.destroyHomeSections(), this.sectionsContainer = null
}, HomeTab.prototype.destroyHomeSections = function() {
if (sectionsContainer) {
homeSections.pause(sectionsContainer);
}
};
HomeTab.prototype.destroy = function () {
this.view = null;
this.params = null;
this.apiClient = null;
this.destroyHomeSections();
this.sectionsContainer = null;
};
HomeTab.prototype.destroyHomeSections = function () {
var sectionsContainer = this.sectionsContainer;
sectionsContainer && homeSections.destroySections(sectionsContainer)
}, HomeTab
});
if (sectionsContainer) {
homeSections.destroySections(sectionsContainer);
}
};
return HomeTab;
});

View file

@ -1,21 +1,22 @@
define(["loading", "libraryMenu", "dom", "globalize", "cardStyle", "emby-button"], function(loading, libraryMenu, dom, globalize) {
define(["loading", "libraryMenu", "dom", "globalize", "cardStyle", "emby-button"], function (loading, libraryMenu, dom, globalize) {
"use strict";
function deletePlugin(page, uniqueid, name) {
var msg = globalize.translate("UninstallPluginConfirmation").replace("{0}", name);
require(["confirm"], function(confirm) {
require(["confirm"], function (confirm) {
confirm({
title: globalize.translate("UninstallPluginHeader"),
text: msg,
primary: "delete",
confirmText: globalize.translate("UninstallPluginHeader")
}).then(function() {
}).then(function () {
loading.show();
ApiClient.uninstallPlugin(uniqueid).then(function() {
ApiClient.uninstallPlugin(uniqueid).then(function () {
reloadList(page);
});
})
})
});
});
}
function showNoConfigurationMessage() {
@ -31,23 +32,24 @@ define(["loading", "libraryMenu", "dom", "globalize", "cardStyle", "emby-button"
}
function getPluginCardHtml(plugin, pluginConfigurationPages) {
var configPage = pluginConfigurationPages.filter(function(pluginConfigurationPage) {
return pluginConfigurationPage.PluginId == plugin.Id;
var configPage = pluginConfigurationPages.filter(function (pluginConfigurationPage) {
return pluginConfigurationPage.PluginId == plugin.Id;
})[0];
var configPageUrl = configPage ? Dashboard.getConfigurationPageUrl(configPage.Name) : null;
var html = "";
html += "<div data-id='" + plugin.Id + "' data-name='" + plugin.Name + "' class='card backdropCard'>";
html += '<div class="cardBox visualCardBox">';
html += '<div class="cardScalable">';
html += '<div class="cardPadder cardPadder-backdrop"></div>';
html += configPageUrl ? '<a class="cardContent cardImageContainer" is="emby-linkbutton" href="' + configPageUrl + '">' : '<div class="cardContent noConfigPluginCard noHoverEffect cardImageContainer">';
if (plugin.ImageUrl) {
html += '<div class="cardImage coveredImage" style="background-image:url(\'' + plugin.ImageUrl + "');\">";
html += "</div>";
} else {
html += '<i class="cardImageIcon md-icon">&#xE2C7;</i>';
}
html += configPageUrl ? "</a>" : "</div>";
html += "</div>";
html += '<div class="cardFooter">';
@ -67,21 +69,26 @@ define(["loading", "libraryMenu", "dom", "globalize", "cardStyle", "emby-button"
}
function renderPlugins(page, plugins) {
ApiClient.getJSON(ApiClient.getUrl("web/configurationpages") + "?pageType=PluginConfiguration").then(function(configPages) {
ApiClient.getJSON(ApiClient.getUrl("web/configurationpages") + "?pageType=PluginConfiguration").then(function (configPages) {
populateList(page, plugins, configPages);
});
}
function populateList(page, plugins, pluginConfigurationPages) {
plugins = plugins.sort(function(plugin1, plugin2) {
return plugin1.Name > plugin2.Name ? 1 : -1
plugins = plugins.sort(function (plugin1, plugin2) {
if (plugin1.Name > plugin2.Name) {
return 1;
}
return -1;
});
var html = plugins.map(function(p) {
return getPluginCardHtml(p, pluginConfigurationPages)
var html = plugins.map(function (p) {
return getPluginCardHtml(p, pluginConfigurationPages);
}).join("");
var installedPluginsElement = page.querySelector(".installedPlugins");
installedPluginsElement.removeEventListener("click", onInstalledPluginsClick);
installedPluginsElement.addEventListener("click", onInstalledPluginsClick);
if (plugins.length) {
installedPluginsElement.classList.add("itemsContainer");
installedPluginsElement.classList.add("vertical-wrap");
@ -93,6 +100,7 @@ define(["loading", "libraryMenu", "dom", "globalize", "cardStyle", "emby-button"
html += "</a></p>";
html += "</div>";
}
installedPluginsElement.innerHTML = html;
loading.hide();
}
@ -103,6 +111,7 @@ define(["loading", "libraryMenu", "dom", "globalize", "cardStyle", "emby-button"
var name = card.getAttribute("data-name");
var configHref = card.querySelector(".cardContent").getAttribute("href");
var menuItems = [];
if (configHref) {
menuItems.push({
name: globalize.translate("ButtonSettings"),
@ -110,22 +119,25 @@ define(["loading", "libraryMenu", "dom", "globalize", "cardStyle", "emby-button"
ironIcon: "mode-edit"
});
}
menuItems.push({
name: globalize.translate("ButtonUninstall"),
id: "delete",
ironIcon: "delete"
});
require(["actionsheet"], function(actionsheet) {
require(["actionsheet"], function (actionsheet) {
actionsheet.show({
items: menuItems,
positionTo: elem,
callback: function(resultId) {
callback: function (resultId) {
switch (resultId) {
case "open":
Dashboard.navigate(configHref);
break;
case "delete":
deletePlugin(page, id, name)
deletePlugin(page, id, name);
}
}
});
@ -134,7 +146,7 @@ define(["loading", "libraryMenu", "dom", "globalize", "cardStyle", "emby-button"
function reloadList(page) {
loading.show();
ApiClient.getInstalledPlugins().then(function(plugins) {
ApiClient.getInstalledPlugins().then(function (plugins) {
renderPlugins(page, plugins);
});
}
@ -146,7 +158,7 @@ define(["loading", "libraryMenu", "dom", "globalize", "cardStyle", "emby-button"
}, {
href: "availableplugins.html",
name: globalize.translate("TabCatalog")
}]
}];
}
function onInstalledPluginsClick(e) {
@ -156,16 +168,18 @@ define(["loading", "libraryMenu", "dom", "globalize", "cardStyle", "emby-button"
showConnectMessage();
} else {
var btnCardMenu = dom.parentWithClass(e.target, "btnCardMenu");
btnCardMenu && showPluginMenu(dom.parentWithClass(btnCardMenu, "page"), btnCardMenu);
if (btnCardMenu) {
showPluginMenu(dom.parentWithClass(btnCardMenu, "page"), btnCardMenu);
}
}
}
pageIdOn("pageshow", "pluginsPage", function() {
pageIdOn("pageshow", "pluginsPage", function () {
libraryMenu.setTabs("plugins", 0, getTabs);
reloadList(this);
});
window.PluginsPage = {
renderPlugins: renderPlugins
}
};
});

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -1,89 +1,119 @@
define(["cardBuilder", "imageLoader", "libraryBrowser", "loading", "events", "emby-itemscontainer"], function(cardBuilder, imageLoader, libraryBrowser, loading, events) {
define(["cardBuilder", "imageLoader", "libraryBrowser", "loading", "events", "emby-itemscontainer"], function (cardBuilder, imageLoader, libraryBrowser, loading, events) {
"use strict";
return function(view, params, tabContent) {
return function (view, params, tabContent) {
function getPageData() {
return pageData || (pageData = {
query: {
StartIndex: 0,
Limit: 100,
Fields: "PrimaryImageAspectRatio"
}
}), pageData
if (!pageData) {
pageData = {
query: {
StartIndex: 0,
Limit: 100,
Fields: "PrimaryImageAspectRatio"
}
};
}
return pageData;
}
function getQuery() {
return getPageData().query
return getPageData().query;
}
function getChannelsHtml(channels) {
return cardBuilder.getCardsHtml({
items: channels,
shape: "square",
showTitle: !0,
lazy: !0,
cardLayout: !0,
showDetailsMenu: !0,
showCurrentProgram: !0,
showCurrentProgramTime: !0
})
showTitle: true,
lazy: true,
cardLayout: true,
showDetailsMenu: true,
showCurrentProgram: true,
showCurrentProgramTime: true
});
}
function renderChannels(context, result) {
function onNextPageClick() {
if (isLoading) return;
query.StartIndex += query.Limit, reloadItems(context)
if (isLoading) {
return;
}
query.StartIndex += query.Limit;
reloadItems(context);
}
function onPreviousPageClick() {
if (isLoading) return;
query.StartIndex -= query.Limit, reloadItems(context)
if (isLoading) {
return;
}
query.StartIndex -= query.Limit;
reloadItems(context);
}
var query = getQuery();
context.querySelector(".paging").innerHTML = libraryBrowser.getQueryPagingHtml({
startIndex: query.StartIndex,
limit: query.Limit,
totalRecordCount: result.TotalRecordCount,
showLimit: !1,
updatePageSizeSetting: !1,
filterButton: !1
showLimit: false,
updatePageSizeSetting: false,
filterButton: false
});
var html = getChannelsHtml(result.Items),
elem = context.querySelector("#items");
elem.innerHTML = html, imageLoader.lazyChildren(elem);
var i, length, 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)
var html = getChannelsHtml(result.Items);
var elem = context.querySelector("#items");
elem.innerHTML = html;
imageLoader.lazyChildren(elem);
var i;
var length;
var 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) {
require(["components/filterdialog/filterdialog"], function(filterDialogFactory) {
require(["components/filterdialog/filterdialog"], function (filterDialogFactory) {
var filterDialog = new filterDialogFactory({
query: getQuery(),
mode: "livetvchannels",
serverId: ApiClient.serverId()
});
events.on(filterDialog, "filterchange", function() {
reloadItems(context)
}), filterDialog.show()
})
events.on(filterDialog, "filterchange", function () {
reloadItems(context);
});
filterDialog.show();
});
}
function reloadItems(context, save) {
loading.show();
isLoading = true;
var query = getQuery(),
apiClient = ApiClient;
query.UserId = apiClient.getCurrentUserId(), apiClient.getLiveTvChannels(query).then(function(result) {
var query = getQuery();
var apiClient = ApiClient;
query.UserId = apiClient.getCurrentUserId();
apiClient.getLiveTvChannels(query).then(function (result) {
renderChannels(context, result);
loading.hide();
isLoading = false;
})
});
}
var pageData, self = this, isLoading = false;
tabContent.querySelector(".btnFilter").addEventListener("click", function() {
showFilterMenu(tabContent)
}), self.renderTab = function() {
reloadItems(tabContent)
}
}
var pageData;
var self = this;
var isLoading = false;
tabContent.querySelector(".btnFilter").addEventListener("click", function () {
showFilterMenu(tabContent);
});
self.renderTab = function () {
reloadItems(tabContent);
};
};
});

View file

@ -1,16 +1,29 @@
define(["tvguide"], function(tvguide) {
define(["tvguide"], function (tvguide) {
"use strict";
return function(view, params, tabContent) {
var guideInstance, self = this;
self.renderTab = function() {
guideInstance || (guideInstance = new tvguide({
element: tabContent,
serverId: ApiClient.serverId()
}))
}, self.onShow = function() {
guideInstance && guideInstance.resume()
}, self.onHide = function() {
guideInstance && guideInstance.pause()
}
}
});
return function (view, params, tabContent) {
var guideInstance;
var self = this;
self.renderTab = function () {
if (!guideInstance) {
guideInstance = new tvguide({
element: tabContent,
serverId: ApiClient.serverId()
});
}
};
self.onShow = function () {
if (guideInstance) {
guideInstance.resume();
}
};
self.onHide = function () {
if (guideInstance) {
guideInstance.pause();
}
};
};
});

View file

@ -1,69 +1,106 @@
define(["layoutManager", "loading", "cardBuilder", "apphost", "imageLoader", "scripts/livetvcomponents", "listViewStyle", "emby-itemscontainer"], function(layoutManager, loading, cardBuilder, appHost, imageLoader) {
define(["layoutManager", "loading", "cardBuilder", "apphost", "imageLoader", "scripts/livetvcomponents", "listViewStyle", "emby-itemscontainer"], function (layoutManager, loading, cardBuilder, appHost, imageLoader) {
"use strict";
function renderRecordings(elem, recordings, cardOptions, scrollX) {
recordings.length ? elem.classList.remove("hide") : elem.classList.add("hide");
if (recordings.length) {
elem.classList.remove("hide");
} else {
elem.classList.add("hide");
}
var recordingItems = elem.querySelector(".recordingItems");
scrollX ? (recordingItems.classList.add("scrollX"), recordingItems.classList.add("hiddenScrollX"), recordingItems.classList.remove("vertical-wrap")) : (recordingItems.classList.remove("scrollX"), recordingItems.classList.remove("hiddenScrollX"), recordingItems.classList.add("vertical-wrap"));
if (scrollX) {
recordingItems.classList.add("scrollX");
recordingItems.classList.add("hiddenScrollX");
recordingItems.classList.remove("vertical-wrap");
} else {
recordingItems.classList.remove("scrollX");
recordingItems.classList.remove("hiddenScrollX");
recordingItems.classList.add("vertical-wrap");
}
appHost.supports("imageanalysis");
recordingItems.innerHTML = cardBuilder.getCardsHtml(Object.assign({
items: recordings,
shape: scrollX ? "autooverflow" : "auto",
defaultShape: scrollX ? "overflowBackdrop" : "backdrop",
showTitle: !0,
showParentTitle: !0,
coverImage: !0,
cardLayout: !1,
centerText: !0,
showTitle: true,
showParentTitle: true,
coverImage: true,
cardLayout: false,
centerText: true,
allowBottomPadding: !scrollX,
preferThumb: "auto",
overlayText: !1
}, cardOptions || {})), imageLoader.lazyChildren(recordingItems)
overlayText: false
}, cardOptions || {}));
imageLoader.lazyChildren(recordingItems);
}
function renderLatestRecordings(context, promise) {
promise.then(function(result) {
promise.then(function (result) {
renderRecordings(context.querySelector("#latestRecordings"), result.Items, {
showYear: !0,
showYear: true,
lines: 2
}, !1), loading.hide()
})
}, false);
loading.hide();
});
}
function renderRecordingFolders(context, promise) {
promise.then(function(result) {
promise.then(function (result) {
renderRecordings(context.querySelector("#recordingFolders"), result.Items, {
showYear: !1,
showParentTitle: !1
}, !1)
})
showYear: false,
showParentTitle: false
}, false);
});
}
function onMoreClick(e) {
var type = this.getAttribute("data-type"),
serverId = ApiClient.serverId();
var type = this.getAttribute("data-type");
var serverId = ApiClient.serverId();
switch (type) {
case "latest":
Dashboard.navigate("list.html?type=Recordings&serverId=" + serverId)
Dashboard.navigate("list.html?type=Recordings&serverId=" + serverId);
}
}
return function(view, params, tabContent) {
return function (view, params, tabContent) {
function enableFullRender() {
return (new Date).getTime() - lastFullRender > 3e5
return new Date().getTime() - lastFullRender > 300000;
}
var foldersPromise, latestPromise, self = this,
lastFullRender = 0;
for (var moreButtons = tabContent.querySelectorAll(".more"), i = 0, length = moreButtons.length; i < length; i++) moreButtons[i].addEventListener("click", onMoreClick);
self.preRender = function() {
enableFullRender() && (latestPromise = ApiClient.getLiveTvRecordings({
UserId: Dashboard.getCurrentUserId(),
Limit: 12,
Fields: "CanDelete,PrimaryImageAspectRatio,BasicSyncInfo",
EnableTotalRecordCount: !1,
EnableImageTypes: "Primary,Thumb,Backdrop"
}), foldersPromise = ApiClient.getRecordingFolders(Dashboard.getCurrentUserId()))
}, self.renderTab = function() {
enableFullRender() && (loading.show(), renderLatestRecordings(tabContent, latestPromise), renderRecordingFolders(tabContent, foldersPromise), lastFullRender = (new Date).getTime())
var foldersPromise;
var latestPromise;
var self = this;
var lastFullRender = 0;
var moreButtons = tabContent.querySelectorAll(".more");
for (var i = 0, length = moreButtons.length; i < length; i++) {
moreButtons[i].addEventListener("click", onMoreClick);
}
}
});
self.preRender = function () {
if (enableFullRender()) {
latestPromise = ApiClient.getLiveTvRecordings({
UserId: Dashboard.getCurrentUserId(),
Limit: 12,
Fields: "CanDelete,PrimaryImageAspectRatio,BasicSyncInfo",
EnableTotalRecordCount: false,
EnableImageTypes: "Primary,Thumb,Backdrop"
});
foldersPromise = ApiClient.getRecordingFolders(Dashboard.getCurrentUserId());
}
};
self.renderTab = function () {
if (enableFullRender()) {
loading.show();
renderLatestRecordings(tabContent, latestPromise);
renderRecordingFolders(tabContent, foldersPromise);
lastFullRender = new Date().getTime();
}
};
};
});

View file

@ -1,27 +1,50 @@
define(["layoutManager", "cardBuilder", "apphost", "imageLoader", "loading", "scripts/livetvcomponents", "emby-button", "emby-itemscontainer"], function(layoutManager, cardBuilder, appHost, imageLoader, loading) {
define(["layoutManager", "cardBuilder", "apphost", "imageLoader", "loading", "scripts/livetvcomponents", "emby-button", "emby-itemscontainer"], function (layoutManager, cardBuilder, appHost, imageLoader, loading) {
"use strict";
function enableScrollX() {
return !layoutManager.desktop
return !layoutManager.desktop;
}
function renderRecordings(elem, recordings, cardOptions) {
recordings.length ? elem.classList.remove("hide") : elem.classList.add("hide");
if (recordings.length) {
elem.classList.remove("hide");
} else {
elem.classList.add("hide");
}
var recordingItems = elem.querySelector(".recordingItems");
enableScrollX() ? (recordingItems.classList.add("scrollX"), layoutManager.tv && recordingItems.classList.add("smoothScrollX"), recordingItems.classList.add("hiddenScrollX"), recordingItems.classList.remove("vertical-wrap")) : (recordingItems.classList.remove("scrollX"), recordingItems.classList.remove("smoothScrollX"), recordingItems.classList.remove("hiddenScrollX"), recordingItems.classList.add("vertical-wrap"));
var supportsImageAnalysis = appHost.supports("imageanalysis"),
cardLayout = appHost.preferVisualCards || supportsImageAnalysis;
cardLayout = !1, recordingItems.innerHTML = cardBuilder.getCardsHtml(Object.assign({
if (enableScrollX()) {
recordingItems.classList.add("scrollX");
if (layoutManager.tv) {
recordingItems.classList.add("smoothScrollX");
}
recordingItems.classList.add("hiddenScrollX");
recordingItems.classList.remove("vertical-wrap");
} else {
recordingItems.classList.remove("scrollX");
recordingItems.classList.remove("smoothScrollX");
recordingItems.classList.remove("hiddenScrollX");
recordingItems.classList.add("vertical-wrap");
}
var supportsImageAnalysis = appHost.supports("imageanalysis");
var cardLayout = appHost.preferVisualCards || supportsImageAnalysis;
cardLayout = false;
recordingItems.innerHTML = cardBuilder.getCardsHtml(Object.assign({
items: recordings,
shape: enableScrollX() ? "autooverflow" : "auto",
showTitle: !0,
showParentTitle: !0,
coverImage: !0,
showTitle: true,
showParentTitle: true,
coverImage: true,
cardLayout: cardLayout,
centerText: !cardLayout,
allowBottomPadding: !enableScrollX(),
preferThumb: "auto"
}, cardOptions || {})), imageLoader.lazyChildren(recordingItems)
}, cardOptions || {}));
imageLoader.lazyChildren(recordingItems);
}
function getBackdropShape() {
@ -29,52 +52,72 @@ define(["layoutManager", "cardBuilder", "apphost", "imageLoader", "loading", "sc
}
function renderActiveRecordings(context, promise) {
promise.then(function(result) {
promise.then(function (result) {
renderRecordings(context.querySelector("#activeRecordings"), result.Items, {
shape: enableScrollX() ? "autooverflow" : "auto",
defaultShape: getBackdropShape(),
showParentTitle: !1,
showParentTitleOrTitle: !0,
showTitle: !1,
showAirTime: !0,
showAirEndTime: !0,
showChannelName: !0,
coverImage: !0,
overlayText: !1,
overlayMoreButton: !0
})
})
showParentTitle: false,
showParentTitleOrTitle: true,
showTitle: false,
showAirTime: true,
showAirEndTime: true,
showChannelName: true,
coverImage: true,
overlayText: false,
overlayMoreButton: true
});
});
}
function renderTimers(context, timers, options) {
LiveTvHelpers.getTimersHtml(timers, options).then(function(html) {
LiveTvHelpers.getTimersHtml(timers, options).then(function (html) {
var elem = context;
html ? elem.classList.remove("hide") : elem.classList.add("hide"), elem.querySelector(".recordingItems").innerHTML = html, imageLoader.lazyChildren(elem)
})
if (html) {
elem.classList.remove("hide");
} else {
elem.classList.add("hide");
}
elem.querySelector(".recordingItems").innerHTML = html;
imageLoader.lazyChildren(elem);
});
}
function renderUpcomingRecordings(context, promise) {
promise.then(function(result) {
renderTimers(context.querySelector("#upcomingRecordings"), result.Items), loading.hide()
})
promise.then(function (result) {
renderTimers(context.querySelector("#upcomingRecordings"), result.Items);
loading.hide();
});
}
return function(view, params, tabContent) {
var activeRecordingsPromise, upcomingRecordingsPromise, self = this;
tabContent.querySelector("#upcomingRecordings .recordingItems").addEventListener("timercancelled", function() {
self.preRender(), self.renderTab()
}), self.preRender = function() {
return function (view, params, tabContent) {
var activeRecordingsPromise;
var upcomingRecordingsPromise;
var self = this;
tabContent.querySelector("#upcomingRecordings .recordingItems").addEventListener("timercancelled", function () {
self.preRender();
self.renderTab();
});
self.preRender = function () {
activeRecordingsPromise = ApiClient.getLiveTvRecordings({
UserId: Dashboard.getCurrentUserId(),
IsInProgress: !0,
IsInProgress: true,
Fields: "CanDelete,PrimaryImageAspectRatio,BasicSyncInfo",
EnableTotalRecordCount: !1,
EnableTotalRecordCount: false,
EnableImageTypes: "Primary,Thumb,Backdrop"
}), upcomingRecordingsPromise = ApiClient.getLiveTvTimers({
IsActive: !1,
IsScheduled: !0
})
}, self.renderTab = function() {
loading.show(), renderActiveRecordings(tabContent, activeRecordingsPromise), renderUpcomingRecordings(tabContent, upcomingRecordingsPromise)
}
}
});
});
upcomingRecordingsPromise = ApiClient.getLiveTvTimers({
IsActive: false,
IsScheduled: true
});
};
self.renderTab = function () {
loading.show();
renderActiveRecordings(tabContent, activeRecordingsPromise);
renderUpcomingRecordings(tabContent, upcomingRecordingsPromise);
};
};
});

View file

@ -1,4 +1,4 @@
define(["datetime", "cardBuilder", "imageLoader", "apphost", "loading", "paper-icon-button-light", "emby-button"], function(datetime, cardBuilder, imageLoader, appHost, loading) {
define(["datetime", "cardBuilder", "imageLoader", "apphost", "loading", "paper-icon-button-light", "emby-button"], function (datetime, cardBuilder, imageLoader, appHost, loading) {
"use strict";
function renderTimers(context, timers) {
@ -8,36 +8,44 @@ define(["datetime", "cardBuilder", "imageLoader", "apphost", "loading", "paper-i
items: timers,
shape: "auto",
defaultShape: "portrait",
showTitle: !0,
cardLayout: !1,
showTitle: true,
cardLayout: false,
preferThumb: "auto",
coverImage: !0,
overlayText: !1,
showSeriesTimerTime: !0,
showSeriesTimerChannel: !0,
centerText: !0,
overlayMoreButton: !0,
coverImage: true,
overlayText: false,
showSeriesTimerTime: true,
showSeriesTimerChannel: true,
centerText: true,
overlayMoreButton: true,
lines: 3
});
var elem = context.querySelector("#items");
elem.innerHTML = html, imageLoader.lazyChildren(elem), loading.hide()
elem.innerHTML = html;
imageLoader.lazyChildren(elem);
loading.hide();
}
function reload(context, promise) {
loading.show(), promise.then(function(result) {
renderTimers(context, result.Items)
})
loading.show();
promise.then(function (result) {
renderTimers(context, result.Items);
});
}
var query = {
SortBy: "SortName",
SortOrder: "Ascending"
};
return function(view, params, tabContent) {
var timersPromise, self = this;
self.preRender = function() {
timersPromise = ApiClient.getLiveTvSeriesTimers(query)
}, self.renderTab = function() {
reload(tabContent, timersPromise)
}
}
});
return function (view, params, tabContent) {
var timersPromise;
var self = this;
self.preRender = function () {
timersPromise = ApiClient.getLiveTvSeriesTimers(query);
};
self.renderTab = function () {
reload(tabContent, timersPromise);
};
};
});

View file

@ -23,6 +23,7 @@ define(["layoutManager", "userSettings", "inputManager", "loading", "globalize",
if (enableScrollX()) {
return 12;
}
return 9;
}
@ -150,15 +151,22 @@ define(["layoutManager", "userSettings", "inputManager", "loading", "globalize",
}
function getTabs() {
return [
{ name: globalize.translate("Programs") },
{ name: globalize.translate("TabGuide") },
{ name: globalize.translate("TabChannels") },
{ name: globalize.translate("TabRecordings") },
{ name: globalize.translate("HeaderSchedule") },
{ name: globalize.translate("TabSeries") },
{ name: globalize.translate("ButtonSearch"), cssClass: "searchTabButton" }
];
return [{
name: globalize.translate("Programs")
}, {
name: globalize.translate("TabGuide")
}, {
name: globalize.translate("TabChannels")
}, {
name: globalize.translate("TabRecordings")
}, {
name: globalize.translate("HeaderSchedule")
}, {
name: globalize.translate("TabSeries")
}, {
name: globalize.translate("ButtonSearch"),
cssClass: "searchTabButton"
}];
}
function setScrollClasses(elem, scrollX) {
@ -183,6 +191,7 @@ define(["layoutManager", "userSettings", "inputManager", "loading", "globalize",
if (userSettings.get("landing-" + folderId) === "guide") {
return 1;
}
return 0;
}
@ -220,21 +229,27 @@ define(["layoutManager", "userSettings", "inputManager", "loading", "globalize",
switch (index) {
case 0:
break;
case 1:
depends.push("controllers/livetv/livetvguide");
break;
case 2:
depends.push("controllers/livetv/livetvchannels");
break;
case 3:
depends.push("controllers/livetv/livetvrecordings");
break;
case 4:
depends.push("controllers/livetv/livetvschedule");
break;
case 5:
depends.push("controllers/livetv/livetvseriestimers");
break;
case 6:
depends.push("scripts/searchtab");
}
@ -251,6 +266,7 @@ define(["layoutManager", "userSettings", "inputManager", "loading", "globalize",
if (!controller) {
tabContent = view.querySelector(".pageTabContent[data-index='" + index + "']");
if (0 === index) {
controller = self;
} else if (6 === index) {
@ -260,6 +276,7 @@ define(["layoutManager", "userSettings", "inputManager", "loading", "globalize",
} else {
controller = new controllerFactory(view, params, tabContent);
}
tabControllers[index] = controller;
if (controller.initTab) {
@ -347,15 +364,18 @@ define(["layoutManager", "userSettings", "inputManager", "loading", "globalize",
});
view.addEventListener("viewshow", function (evt) {
isViewRestored = evt.detail.isRestored;
if (!isViewRestored) {
mainTabsManager.selectedTabIndex(initialTabIndex);
}
inputManager.on(window, onInputCommand);
});
view.addEventListener("viewbeforehide", function (e__u) {
view.addEventListener("viewbeforehide", function (e) {
if (currentTabController && currentTabController.onHide) {
currentTabController.onHide();
}
inputManager.off(window, onInputCommand);
});
view.addEventListener("viewdestroy", function (evt) {

View file

@ -1,26 +1,30 @@
define(["events", "loading"], function(events, loading) {
define(["events", "loading"], function (events, loading) {
"use strict";
function onListingsSubmitted() {
Dashboard.navigate("livetvstatus.html")
Dashboard.navigate("livetvstatus.html");
}
function init(page, type, providerId) {
var url = "components/tvproviders/" + type + ".js";
require([url], function(factory) {
require([url], function (factory) {
var instance = new factory(page, providerId, {});
events.on(instance, "submitted", onListingsSubmitted), instance.init()
})
events.on(instance, "submitted", onListingsSubmitted);
instance.init();
});
}
function loadTemplate(page, type, providerId) {
require(["text!./components/tvproviders/" + type + ".template.html"], function(html) {
page.querySelector(".providerTemplate").innerHTML = Globalize.translateDocument(html), init(page, type, providerId)
})
require(["text!./components/tvproviders/" + type + ".template.html"], function (html) {
page.querySelector(".providerTemplate").innerHTML = Globalize.translateDocument(html);
init(page, type, providerId);
});
}
pageIdOn("pageshow", "liveTvGuideProviderPage", function() {
pageIdOn("pageshow", "liveTvGuideProviderPage", function () {
loading.show();
var providerId = getParameterByName("id");
loadTemplate(this, getParameterByName("type"), providerId)
})
});
loadTemplate(this, getParameterByName("type"), providerId);
});
});

View file

@ -1,79 +1,127 @@
define(["jQuery", "loading", "fnchecked", "emby-button"], function($, loading) {
define(["jQuery", "loading", "fnchecked", "emby-button"], function ($, loading) {
"use strict";
function loadPage(page, config) {
$(".liveTvSettingsForm", page).show(), $(".noLiveTvServices", page).hide(), $("#selectGuideDays", page).val(config.GuideDays || ""), $("#txtPrePaddingMinutes", page).val(config.PrePaddingSeconds / 60), $("#txtPostPaddingMinutes", page).val(config.PostPaddingSeconds / 60), page.querySelector("#txtRecordingPath").value = config.RecordingPath || "", page.querySelector("#txtMovieRecordingPath").value = config.MovieRecordingPath || "", page.querySelector("#txtSeriesRecordingPath").value = config.SeriesRecordingPath || "", page.querySelector("#txtPostProcessor").value = config.RecordingPostProcessor || "", page.querySelector("#txtPostProcessorArguments").value = config.RecordingPostProcessorArguments || "", loading.hide()
$(".liveTvSettingsForm", page).show();
$(".noLiveTvServices", page).hide();
$("#selectGuideDays", page).val(config.GuideDays || "");
$("#txtPrePaddingMinutes", page).val(config.PrePaddingSeconds / 60);
$("#txtPostPaddingMinutes", page).val(config.PostPaddingSeconds / 60);
page.querySelector("#txtRecordingPath").value = config.RecordingPath || "";
page.querySelector("#txtMovieRecordingPath").value = config.MovieRecordingPath || "";
page.querySelector("#txtSeriesRecordingPath").value = config.SeriesRecordingPath || "";
page.querySelector("#txtPostProcessor").value = config.RecordingPostProcessor || "";
page.querySelector("#txtPostProcessorArguments").value = config.RecordingPostProcessorArguments || "";
loading.hide();
}
function onSubmit() {
loading.show();
var form = this;
return ApiClient.getNamedConfiguration("livetv").then(function(config) {
ApiClient.getNamedConfiguration("livetv").then(function (config) {
config.GuideDays = $("#selectGuideDays", form).val() || null;
var recordingPath = form.querySelector("#txtRecordingPath").value || null,
movieRecordingPath = form.querySelector("#txtMovieRecordingPath").value || null,
seriesRecordingPath = form.querySelector("#txtSeriesRecordingPath").value || null,
recordingPathChanged = recordingPath != config.RecordingPath || movieRecordingPath != config.MovieRecordingPath || seriesRecordingPath != config.SeriesRecordingPath;
config.RecordingPath = recordingPath, config.MovieRecordingPath = movieRecordingPath, config.SeriesRecordingPath = seriesRecordingPath, config.RecordingEncodingFormat = "mkv", config.PrePaddingSeconds = 60 * $("#txtPrePaddingMinutes", form).val(), config.PostPaddingSeconds = 60 * $("#txtPostPaddingMinutes", form).val(), config.RecordingPostProcessor = $("#txtPostProcessor", form).val(), config.RecordingPostProcessorArguments = $("#txtPostProcessorArguments", form).val(), ApiClient.updateNamedConfiguration("livetv", config).then(function() {
Dashboard.processServerConfigurationUpdateResult(), showSaveMessage(recordingPathChanged)
})
}), !1
var recordingPath = form.querySelector("#txtRecordingPath").value || null;
var movieRecordingPath = form.querySelector("#txtMovieRecordingPath").value || null;
var seriesRecordingPath = form.querySelector("#txtSeriesRecordingPath").value || null;
var recordingPathChanged = recordingPath != config.RecordingPath || movieRecordingPath != config.MovieRecordingPath || seriesRecordingPath != config.SeriesRecordingPath;
config.RecordingPath = recordingPath;
config.MovieRecordingPath = movieRecordingPath;
config.SeriesRecordingPath = seriesRecordingPath;
config.RecordingEncodingFormat = "mkv";
config.PrePaddingSeconds = 60 * $("#txtPrePaddingMinutes", form).val();
config.PostPaddingSeconds = 60 * $("#txtPostPaddingMinutes", form).val();
config.RecordingPostProcessor = $("#txtPostProcessor", form).val();
config.RecordingPostProcessorArguments = $("#txtPostProcessorArguments", form).val();
ApiClient.updateNamedConfiguration("livetv", config).then(function () {
Dashboard.processServerConfigurationUpdateResult();
showSaveMessage(recordingPathChanged);
});
});
return false;
}
function showSaveMessage(recordingPathChanged) {
var msg = "";
recordingPathChanged && (msg += Globalize.translate("RecordingPathChangeMessage")), msg && require(["alert"], function(alert) {
alert(msg)
})
if (recordingPathChanged) {
msg += Globalize.translate("RecordingPathChangeMessage");
}
if (msg) {
require(["alert"], function (alert) {
alert(msg);
});
}
}
$(document).on("pageinit", "#liveTvSettingsPage", function() {
$(document).on("pageinit", "#liveTvSettingsPage", function () {
var page = this;
$(".liveTvSettingsForm").off("submit", onSubmit).on("submit", onSubmit), $("#btnSelectRecordingPath", page).on("click.selectDirectory", function() {
require(["directorybrowser"], function(directoryBrowser) {
var picker = new directoryBrowser;
$(".liveTvSettingsForm").off("submit", onSubmit).on("submit", onSubmit);
$("#btnSelectRecordingPath", page).on("click.selectDirectory", function () {
require(["directorybrowser"], function (directoryBrowser) {
var picker = new directoryBrowser();
picker.show({
callback: function(path) {
path && $("#txtRecordingPath", page).val(path), picker.close()
callback: function (path) {
if (path) {
$("#txtRecordingPath", page).val(path);
}
picker.close();
},
validateWriteable: !0
})
})
}), $("#btnSelectMovieRecordingPath", page).on("click.selectDirectory", function() {
require(["directorybrowser"], function(directoryBrowser) {
var picker = new directoryBrowser;
validateWriteable: true
});
});
});
$("#btnSelectMovieRecordingPath", page).on("click.selectDirectory", function () {
require(["directorybrowser"], function (directoryBrowser) {
var picker = new directoryBrowser();
picker.show({
callback: function(path) {
path && $("#txtMovieRecordingPath", page).val(path), picker.close()
callback: function (path) {
if (path) {
$("#txtMovieRecordingPath", page).val(path);
}
picker.close();
},
validateWriteable: !0
})
})
}), $("#btnSelectSeriesRecordingPath", page).on("click.selectDirectory", function() {
require(["directorybrowser"], function(directoryBrowser) {
var picker = new directoryBrowser;
validateWriteable: true
});
});
});
$("#btnSelectSeriesRecordingPath", page).on("click.selectDirectory", function () {
require(["directorybrowser"], function (directoryBrowser) {
var picker = new directoryBrowser();
picker.show({
callback: function(path) {
path && $("#txtSeriesRecordingPath", page).val(path), picker.close()
callback: function (path) {
if (path) {
$("#txtSeriesRecordingPath", page).val(path);
}
picker.close();
},
validateWriteable: !0
})
})
}), $("#btnSelectPostProcessorPath", page).on("click.selectDirectory", function() {
require(["directorybrowser"], function(directoryBrowser) {
var picker = new directoryBrowser;
validateWriteable: true
});
});
});
$("#btnSelectPostProcessorPath", page).on("click.selectDirectory", function () {
require(["directorybrowser"], function (directoryBrowser) {
var picker = new directoryBrowser();
picker.show({
includeFiles: !0,
callback: function(path) {
path && $("#txtPostProcessor", page).val(path), picker.close()
includeFiles: true,
callback: function (path) {
if (path) {
$("#txtPostProcessor", page).val(path);
}
picker.close();
}
})
})
})
}).on("pageshow", "#liveTvSettingsPage", function() {
});
});
});
}).on("pageshow", "#liveTvSettingsPage", function () {
loading.show();
var page = this;
ApiClient.getNamedConfiguration("livetv").then(function(config) {
loadPage(page, config)
})
})
});
ApiClient.getNamedConfiguration("livetv").then(function (config) {
loadPage(page, config);
});
});
});

View file

@ -1,42 +1,75 @@
define(["jQuery", "globalize", "scripts/taskbutton", "dom", "libraryMenu", "layoutManager", "loading", "listViewStyle", "flexStyles", "emby-itemscontainer", "cardStyle", "material-icons", "emby-button"], function($, globalize, taskButton, dom, libraryMenu, layoutManager, loading) {
define(["jQuery", "globalize", "scripts/taskbutton", "dom", "libraryMenu", "layoutManager", "loading", "listViewStyle", "flexStyles", "emby-itemscontainer", "cardStyle", "material-icons", "emby-button"], function ($, globalize, taskButton, dom, libraryMenu, layoutManager, loading) {
"use strict";
function getDeviceHtml(device) {
var padderClass, html = "",
cssClass = "card scalableCard",
cardBoxCssClass = "cardBox visualCardBox";
return cssClass += " backdropCard backdropCard-scalable", padderClass = "cardPadder-backdrop", layoutManager.tv && (cssClass += " card-focusscale", cardBoxCssClass += " cardBox-focustransform"), cardBoxCssClass += " card-focuscontent", html += '<div type="button" class="' + cssClass + '" data-id="' + device.Id + '">', html += '<div class="' + cardBoxCssClass + '">', html += '<div class="cardScalable visualCardBox-cardScalable">', html += '<div class="' + padderClass + '"></div>', html += '<div class="cardContent searchImage">', html += '<div class="cardImageContainer coveredImage"><i class="cardImageIcon md-icon">dvr</i></div>', html += "</div>", html += "</div>", html += '<div class="cardFooter visualCardBox-cardFooter">', html += '<button is="paper-icon-button-light" class="itemAction btnCardOptions autoSize" data-action="menu"><i class="md-icon">more_horiz</i></button>', html += '<div class="cardText">' + (device.FriendlyName || getTunerName(device.Type)) + "</div>", html += '<div class="cardText cardText-secondary">', html += device.Url || "&nbsp;", html += "</div>", html += "</div>", html += "</div>", html += "</div>"
var padderClass;
var html = "";
var cssClass = "card scalableCard";
var cardBoxCssClass = "cardBox visualCardBox";
cssClass += " backdropCard backdropCard-scalable";
padderClass = "cardPadder-backdrop";
if (layoutManager.tv) {
cssClass += " card-focusscale";
cardBoxCssClass += " cardBox-focustransform";
}
cardBoxCssClass += " card-focuscontent";
html += '<div type="button" class="' + cssClass + '" data-id="' + device.Id + '">';
html += '<div class="' + cardBoxCssClass + '">';
html += '<div class="cardScalable visualCardBox-cardScalable">';
html += '<div class="' + padderClass + '"></div>';
html += '<div class="cardContent searchImage">';
html += '<div class="cardImageContainer coveredImage"><i class="cardImageIcon md-icon">dvr</i></div>';
html += "</div>";
html += "</div>";
html += '<div class="cardFooter visualCardBox-cardFooter">';
html += '<button is="paper-icon-button-light" class="itemAction btnCardOptions autoSize" data-action="menu"><i class="md-icon">more_horiz</i></button>';
html += '<div class="cardText">' + (device.FriendlyName || getTunerName(device.Type)) + "</div>";
html += '<div class="cardText cardText-secondary">';
html += device.Url || "&nbsp;";
html += "</div>";
html += "</div>";
html += "</div>";
return html += "</div>";
}
function renderDevices(page, devices) {
var html = devices.map(getDeviceHtml).join("");
page.querySelector(".devicesList").innerHTML = html
page.querySelector(".devicesList").innerHTML = html;
}
function deleteDevice(page, id) {
var message = globalize.translate("MessageConfirmDeleteTunerDevice");
require(["confirm"], function(confirm) {
confirm(message, globalize.translate("HeaderDeleteDevice")).then(function() {
loading.show(), ApiClient.ajax({
require(["confirm"], function (confirm) {
confirm(message, globalize.translate("HeaderDeleteDevice")).then(function () {
loading.show();
ApiClient.ajax({
type: "DELETE",
url: ApiClient.getUrl("LiveTv/TunerHosts", {
Id: id
})
}).then(function() {
reload(page)
})
})
})
}).then(function () {
reload(page);
});
});
});
}
function reload(page) {
loading.show(), ApiClient.getNamedConfiguration("livetv").then(function(config) {
renderDevices(page, config.TunerHosts), renderProviders(page, config.ListingProviders)
}), loading.hide()
loading.show();
ApiClient.getNamedConfiguration("livetv").then(function (config) {
renderDevices(page, config.TunerHosts);
renderProviders(page, config.ListingProviders);
});
loading.hide();
}
function submitAddDeviceForm(page) {
page.querySelector(".dlgAddDevice").close(), loading.show(), ApiClient.ajax({
page.querySelector(".dlgAddDevice").close();
loading.show();
ApiClient.ajax({
type: "POST",
url: ApiClient.getUrl("LiveTv/TunerHosts"),
data: JSON.stringify({
@ -44,30 +77,47 @@ define(["jQuery", "globalize", "scripts/taskbutton", "dom", "libraryMenu", "layo
Url: $("#txtDevicePath", page).val()
}),
contentType: "application/json"
}).then(function() {
reload(page)
}, function() {
}).then(function () {
reload(page);
}, function () {
Dashboard.alert({
message: globalize.translate("ErrorAddingTunerDevice")
})
})
});
});
}
function renderProviders(page, providers) {
var html = "";
if (providers.length) {
html += '<div class="paperList">';
for (var i = 0, length = providers.length; i < length; i++) {
var provider = providers[i];
html += '<div class="listItem">', html += '<i class="listItemIcon md-icon">dvr</i>', html += '<div class="listItemBody two-line">', html += '<a is="emby-linkbutton" style="display:block;padding:0;margin:0;text-align:left;" class="clearLink" href="' + getProviderConfigurationUrl(provider.Type) + "&id=" + provider.Id + '">', html += '<h3 class="listItemBodyText">', html += getProviderName(provider.Type), html += "</h3>", html += '<div class="listItemBodyText secondary">', html += provider.Path || provider.ListingsId || "", html += "</div>", html += "</a>", html += "</div>", html += '<button type="button" is="paper-icon-button-light" class="btnOptions" data-id="' + provider.Id + '"><i class="md-icon listItemAside">more_horiz</i></button>', html += "</div>"
html += '<div class="listItem">';
html += '<i class="listItemIcon md-icon">dvr</i>';
html += '<div class="listItemBody two-line">';
html += '<a is="emby-linkbutton" style="display:block;padding:0;margin:0;text-align:left;" class="clearLink" href="' + getProviderConfigurationUrl(provider.Type) + "&id=" + provider.Id + '">';
html += '<h3 class="listItemBodyText">';
html += getProviderName(provider.Type);
html += "</h3>";
html += '<div class="listItemBodyText secondary">';
html += provider.Path || provider.ListingsId || "";
html += "</div>";
html += "</a>";
html += "</div>";
html += '<button type="button" is="paper-icon-button-light" class="btnOptions" data-id="' + provider.Id + '"><i class="md-icon listItemAside">more_horiz</i></button>';
html += "</div>";
}
html += "</div>"
html += "</div>";
}
var elem = $(".providerList", page).html(html);
$(".btnOptions", elem).on("click", function() {
$(".btnOptions", elem).on("click", function () {
var id = this.getAttribute("data-id");
showProviderOptions(page, id, this)
})
showProviderOptions(page, id, this);
});
}
function showProviderOptions(page, providerId, button) {
@ -75,64 +125,74 @@ define(["jQuery", "globalize", "scripts/taskbutton", "dom", "libraryMenu", "layo
items.push({
name: globalize.translate("ButtonDelete"),
id: "delete"
}), items.push({
});
items.push({
name: globalize.translate("MapChannels"),
id: "map"
}), require(["actionsheet"], function(actionsheet) {
});
require(["actionsheet"], function (actionsheet) {
actionsheet.show({
items: items,
positionTo: button
}).then(function(id) {
}).then(function (id) {
switch (id) {
case "delete":
deleteProvider(page, providerId);
break;
case "map":
mapChannels(page, providerId)
mapChannels(page, providerId);
}
})
})
});
});
}
function mapChannels(page, providerId) {
require(["components/channelmapper/channelmapper"], function(channelmapper) {
require(["components/channelmapper/channelmapper"], function (channelmapper) {
new channelmapper({
serverId: ApiClient.serverInfo().Id,
providerId: providerId
}).show()
})
}).show();
});
}
function deleteProvider(page, id) {
var message = globalize.translate("MessageConfirmDeleteGuideProvider");
require(["confirm"], function(confirm) {
confirm(message, globalize.translate("HeaderDeleteProvider")).then(function() {
loading.show(), ApiClient.ajax({
require(["confirm"], function (confirm) {
confirm(message, globalize.translate("HeaderDeleteProvider")).then(function () {
loading.show();
ApiClient.ajax({
type: "DELETE",
url: ApiClient.getUrl("LiveTv/ListingProviders", {
Id: id
})
}).then(function() {
reload(page)
}, function() {
reload(page)
})
})
})
}).then(function () {
reload(page);
}, function () {
reload(page);
});
});
});
}
function getTunerName(providerId) {
switch (providerId = providerId.toLowerCase()) {
case "m3u":
return "M3U";
case "hdhomerun":
return "HDHomerun";
case "hauppauge":
return "Hauppauge";
case "satip":
return "DVB";
default:
return "Unknown"
return "Unknown";
}
}
@ -140,12 +200,15 @@ define(["jQuery", "globalize", "scripts/taskbutton", "dom", "libraryMenu", "layo
switch (providerId = providerId.toLowerCase()) {
case "schedulesdirect":
return "Schedules Direct";
case "xmltv":
return "Xml TV";
case "emby":
return "Emby Guide";
default:
return "Unknown"
return "Unknown";
}
}
@ -153,10 +216,12 @@ define(["jQuery", "globalize", "scripts/taskbutton", "dom", "libraryMenu", "layo
switch (providerId = providerId.toLowerCase()) {
case "xmltv":
return "livetvguideprovider.html?type=xmltv";
case "schedulesdirect":
return "livetvguideprovider.html?type=schedulesdirect";
case "emby":
return "livetvguideprovider.html?type=emby"
return "livetvguideprovider.html?type=emby";
}
}
@ -165,22 +230,25 @@ define(["jQuery", "globalize", "scripts/taskbutton", "dom", "libraryMenu", "layo
menuItems.push({
name: "Schedules Direct",
id: "SchedulesDirect"
}), menuItems.push({
});
menuItems.push({
name: "Xml TV",
id: "xmltv"
}), require(["actionsheet"], function(actionsheet) {
});
require(["actionsheet"], function (actionsheet) {
actionsheet.show({
items: menuItems,
positionTo: button,
callback: function(id) {
Dashboard.navigate(getProviderConfigurationUrl(id))
callback: function (id) {
Dashboard.navigate(getProviderConfigurationUrl(id));
}
})
})
});
});
}
function addDevice(button) {
Dashboard.navigate("livetvtuner.html")
Dashboard.navigate("livetvtuner.html");
}
function showDeviceMenu(button, tunerDeviceId) {
@ -188,57 +256,73 @@ define(["jQuery", "globalize", "scripts/taskbutton", "dom", "libraryMenu", "layo
items.push({
name: globalize.translate("ButtonDelete"),
id: "delete"
}), items.push({
});
items.push({
name: globalize.translate("ButtonEdit"),
id: "edit"
}), require(["actionsheet"], function(actionsheet) {
});
require(["actionsheet"], function (actionsheet) {
actionsheet.show({
items: items,
positionTo: button
}).then(function(id) {
}).then(function (id) {
switch (id) {
case "delete":
deleteDevice(dom.parentWithClass(button, "page"), tunerDeviceId);
break;
case "edit":
Dashboard.navigate("livetvtuner.html?id=" + tunerDeviceId)
Dashboard.navigate("livetvtuner.html?id=" + tunerDeviceId);
}
})
})
});
});
}
function onDevicesListClick(e) {
var card = dom.parentWithClass(e.target, "card");
if (card) {
var id = card.getAttribute("data-id"),
btnCardOptions = dom.parentWithClass(e.target, "btnCardOptions");
btnCardOptions ? showDeviceMenu(btnCardOptions, id) : Dashboard.navigate("livetvtuner.html?id=" + id)
var id = card.getAttribute("data-id");
var btnCardOptions = dom.parentWithClass(e.target, "btnCardOptions");
if (btnCardOptions) {
showDeviceMenu(btnCardOptions, id);
} else {
Dashboard.navigate("livetvtuner.html?id=" + id);
}
}
}
$(document).on("pageinit", "#liveTvStatusPage", function() {
$(document).on("pageinit", "#liveTvStatusPage", function () {
var page = this;
$(".btnAddDevice", page).on("click", function() {
addDevice(this)
}), $(".formAddDevice", page).on("submit", function() {
return submitAddDeviceForm(page), !1
}), $(".btnAddProvider", page).on("click", function() {
addProvider(this)
}), page.querySelector(".devicesList").addEventListener("click", onDevicesListClick)
}).on("pageshow", "#liveTvStatusPage", function() {
$(".btnAddDevice", page).on("click", function () {
addDevice(this);
});
$(".formAddDevice", page).on("submit", function () {
submitAddDeviceForm(page);
return false;
});
$(".btnAddProvider", page).on("click", function () {
addProvider(this);
});
page.querySelector(".devicesList").addEventListener("click", onDevicesListClick);
}).on("pageshow", "#liveTvStatusPage", function () {
var page = this;
reload(page), taskButton({
reload(page);
taskButton({
mode: "on",
progressElem: page.querySelector(".refreshGuideProgress"),
taskKey: "RefreshGuide",
button: page.querySelector(".btnRefresh")
})
}).on("pagehide", "#liveTvStatusPage", function() {
});
}).on("pagehide", "#liveTvStatusPage", function () {
var page = this;
taskButton({
mode: "off",
progressElem: page.querySelector(".refreshGuideProgress"),
taskKey: "RefreshGuide",
button: page.querySelector(".btnRefresh")
})
})
});
});
});

View file

@ -1,4 +1,4 @@
define(["globalize", "loading", "libraryMenu", "dom", "emby-input", "emby-button", "emby-checkbox", "emby-select"], function(globalize, loading, libraryMenu, dom) {
define(["globalize", "loading", "libraryMenu", "dom", "emby-input", "emby-button", "emby-checkbox", "emby-select"], function (globalize, loading, libraryMenu, dom) {
"use strict";
function isM3uVariant(type) {
@ -6,17 +6,16 @@ define(["globalize", "loading", "libraryMenu", "dom", "emby-input", "emby-button
}
function fillTypes(view, currentId) {
return ApiClient.getJSON(ApiClient.getUrl("LiveTv/TunerHosts/Types")).then(function(types) {
return ApiClient.getJSON(ApiClient.getUrl("LiveTv/TunerHosts/Types")).then(function (types) {
var selectType = view.querySelector(".selectType");
var html = "";
html += types.map(function(tuner) {
html += types.map(function (tuner) {
return '<option value="' + tuner.Id + '">' + tuner.Name + "</option>";
}).join("");
html += '<option value="other">';
html += globalize.translate("TabOther");
html += "</option>";
selectType.innerHTML = html;
selectType.disabled = null != currentId;
selectType.value = "";
onTypeChange.call(selectType);
@ -27,9 +26,10 @@ define(["globalize", "loading", "libraryMenu", "dom", "emby-input", "emby-button
view.querySelector(".txtDevicePath").value = "";
view.querySelector(".chkFavorite").checked = false;
view.querySelector(".txtDevicePath").value = "";
if (providerId) {
ApiClient.getNamedConfiguration("livetv").then(function(config) {
var info = config.TunerHosts.filter(function(i) {
ApiClient.getNamedConfiguration("livetv").then(function (config) {
var info = config.TunerHosts.filter(function (i) {
return i.Id === providerId;
})[0];
fillTunerHostInfo(view, info);
@ -40,9 +40,11 @@ define(["globalize", "loading", "libraryMenu", "dom", "emby-input", "emby-button
function fillTunerHostInfo(view, info) {
var selectType = view.querySelector(".selectType");
var type = info.Type || "";
if (info.Source && isM3uVariant(info.Source)) {
type = info.Source;
}
selectType.value = type;
onTypeChange.call(selectType);
view.querySelector(".txtDevicePath").value = info.Url || "";
@ -68,76 +70,164 @@ define(["globalize", "loading", "libraryMenu", "dom", "emby-input", "emby-button
AllowHWTranscoding: page.querySelector(".chkTranscode").checked,
EnableStreamLooping: page.querySelector(".chkStreamLoop").checked
};
isM3uVariant(info.Type) && (info.Source = info.Type, info.Type = "m3u");
if (isM3uVariant(info.Type)) {
info.Source = info.Type;
info.Type = "m3u";
}
var id = getParameterByName("id");
id && (info.Id = id);
if (id) {
info.Id = id;
}
info.Id;
ApiClient.ajax({
type: "POST",
url: ApiClient.getUrl("LiveTv/TunerHosts"),
data: JSON.stringify(info),
contentType: "application/json"
}).then(function(result) {
Dashboard.processServerConfigurationUpdateResult(), Dashboard.navigate("livetvstatus.html")
}, function() {
loading.hide(), Dashboard.alert({
}).then(function (result) {
Dashboard.processServerConfigurationUpdateResult();
Dashboard.navigate("livetvstatus.html");
}, function () {
loading.hide();
Dashboard.alert({
message: globalize.translate("ErrorSavingTvProvider")
})
})
});
});
}
function getRequirePromise(deps) {
return new Promise(function(resolve, reject) {
require(deps, resolve)
})
return new Promise(function (resolve, reject) {
require(deps, resolve);
});
}
function getDetectedDevice() {
return getRequirePromise(["tunerPicker"]).then(function(tunerPicker) {
return (new tunerPicker).show({
return getRequirePromise(["tunerPicker"]).then(function (tunerPicker) {
return new tunerPicker().show({
serverId: ApiClient.serverId()
})
})
});
});
}
function onTypeChange() {
var value = this.value,
view = dom.parentWithClass(this, "page"),
mayIncludeUnsupportedDrmChannels = "hdhomerun" === value,
supportsTranscoding = "hdhomerun" === value,
supportsFavorites = "hdhomerun" === value,
supportsTunerIpAddress = "hdhomerun" === value,
supportsTunerFileOrUrl = "m3u" === value,
supportsStreamLooping = "m3u" === value,
supportsTunerCount = "m3u" === value,
supportsUserAgent = "m3u" === value,
suppportsSubmit = "other" !== value,
supportsSelectablePath = supportsTunerFileOrUrl,
txtDevicePath = view.querySelector(".txtDevicePath");
supportsTunerIpAddress ? (txtDevicePath.label(globalize.translate("LabelTunerIpAddress")), view.querySelector(".fldPath").classList.remove("hide")) : supportsTunerFileOrUrl ? (txtDevicePath.label(globalize.translate("LabelFileOrUrl")), view.querySelector(".fldPath").classList.remove("hide")) : view.querySelector(".fldPath").classList.add("hide"), supportsSelectablePath ? (view.querySelector(".btnSelectPath").classList.remove("hide"), view.querySelector(".txtDevicePath").setAttribute("required", "required")) : (view.querySelector(".btnSelectPath").classList.add("hide"), view.querySelector(".txtDevicePath").removeAttribute("required")), supportsUserAgent ? view.querySelector(".fldUserAgent").classList.remove("hide") : view.querySelector(".fldUserAgent").classList.add("hide"), supportsFavorites ? view.querySelector(".fldFavorites").classList.remove("hide") : view.querySelector(".fldFavorites").classList.add("hide"), supportsTranscoding ? view.querySelector(".fldTranscode").classList.remove("hide") : view.querySelector(".fldTranscode").classList.add("hide"), supportsStreamLooping ? view.querySelector(".fldStreamLoop").classList.remove("hide") : view.querySelector(".fldStreamLoop").classList.add("hide"), supportsTunerCount ? (view.querySelector(".fldTunerCount").classList.remove("hide"), view.querySelector(".txtTunerCount").setAttribute("required", "required")) : (view.querySelector(".fldTunerCount").classList.add("hide"), view.querySelector(".txtTunerCount").removeAttribute("required")), mayIncludeUnsupportedDrmChannels ? view.querySelector(".drmMessage").classList.remove("hide") : view.querySelector(".drmMessage").classList.add("hide"), suppportsSubmit ? view.querySelector(".button-submit").classList.remove("hide") : view.querySelector(".button-submit").classList.add("hide")
var value = this.value;
var view = dom.parentWithClass(this, "page");
var mayIncludeUnsupportedDrmChannels = "hdhomerun" === value;
var supportsTranscoding = "hdhomerun" === value;
var supportsFavorites = "hdhomerun" === value;
var supportsTunerIpAddress = "hdhomerun" === value;
var supportsTunerFileOrUrl = "m3u" === value;
var supportsStreamLooping = "m3u" === value;
var supportsTunerCount = "m3u" === value;
var supportsUserAgent = "m3u" === value;
var suppportsSubmit = "other" !== value;
var supportsSelectablePath = supportsTunerFileOrUrl;
var txtDevicePath = view.querySelector(".txtDevicePath");
if (supportsTunerIpAddress) {
txtDevicePath.label(globalize.translate("LabelTunerIpAddress"));
view.querySelector(".fldPath").classList.remove("hide");
} else if (supportsTunerFileOrUrl) {
txtDevicePath.label(globalize.translate("LabelFileOrUrl"));
view.querySelector(".fldPath").classList.remove("hide");
} else {
view.querySelector(".fldPath").classList.add("hide");
}
if (supportsSelectablePath) {
view.querySelector(".btnSelectPath").classList.remove("hide");
view.querySelector(".txtDevicePath").setAttribute("required", "required");
} else {
view.querySelector(".btnSelectPath").classList.add("hide");
view.querySelector(".txtDevicePath").removeAttribute("required");
}
if (supportsUserAgent) {
view.querySelector(".fldUserAgent").classList.remove("hide");
} else {
view.querySelector(".fldUserAgent").classList.add("hide");
}
if (supportsFavorites) {
view.querySelector(".fldFavorites").classList.remove("hide");
} else {
view.querySelector(".fldFavorites").classList.add("hide");
}
if (supportsTranscoding) {
view.querySelector(".fldTranscode").classList.remove("hide");
} else {
view.querySelector(".fldTranscode").classList.add("hide");
}
if (supportsStreamLooping) {
view.querySelector(".fldStreamLoop").classList.remove("hide");
} else {
view.querySelector(".fldStreamLoop").classList.add("hide");
}
if (supportsTunerCount) {
view.querySelector(".fldTunerCount").classList.remove("hide");
view.querySelector(".txtTunerCount").setAttribute("required", "required");
} else {
view.querySelector(".fldTunerCount").classList.add("hide");
view.querySelector(".txtTunerCount").removeAttribute("required");
}
if (mayIncludeUnsupportedDrmChannels) {
view.querySelector(".drmMessage").classList.remove("hide");
} else {
view.querySelector(".drmMessage").classList.add("hide");
}
if (suppportsSubmit) {
view.querySelector(".button-submit").classList.remove("hide");
} else {
view.querySelector(".button-submit").classList.add("hide");
}
}
return function(view, params) {
params.id || view.querySelector(".btnDetect").classList.remove("hide"), view.addEventListener("viewshow", function() {
return function (view, params) {
if (!params.id) {
view.querySelector(".btnDetect").classList.remove("hide");
}
view.addEventListener("viewshow", function () {
var currentId = params.id;
fillTypes(view, currentId).then(function() {
reload(view, currentId)
})
}), view.querySelector("form").addEventListener("submit", function(e) {
return submitForm(view), e.preventDefault(), e.stopPropagation(), !1
}), view.querySelector(".selectType").addEventListener("change", onTypeChange), view.querySelector(".btnDetect").addEventListener("click", function() {
getDetectedDevice().then(function(info) {
fillTunerHostInfo(view, info)
})
}), view.querySelector(".btnSelectPath").addEventListener("click", function() {
require(["directorybrowser"], function(directoryBrowser) {
var picker = new directoryBrowser;
fillTypes(view, currentId).then(function () {
reload(view, currentId);
});
});
view.querySelector("form").addEventListener("submit", function (e) {
submitForm(view);
e.preventDefault();
e.stopPropagation();
return false;
});
view.querySelector(".selectType").addEventListener("change", onTypeChange);
view.querySelector(".btnDetect").addEventListener("click", function () {
getDetectedDevice().then(function (info) {
fillTunerHostInfo(view, info);
});
});
view.querySelector(".btnSelectPath").addEventListener("click", function () {
require(["directorybrowser"], function (directoryBrowser) {
var picker = new directoryBrowser();
picker.show({
includeFiles: !0,
callback: function(path) {
path && (view.querySelector(".txtDevicePath").value = path), picker.close()
includeFiles: true,
callback: function (path) {
if (path) {
view.querySelector(".txtDevicePath").value = path;
}
picker.close();
}
})
})
})
}
});
});
});
});
};
});

View file

@ -1,30 +1,45 @@
define(["jQuery", "loading", "libraryMenu"], function($, loading, libraryMenu) {
define(["jQuery", "loading", "libraryMenu"], function ($, loading, libraryMenu) {
"use strict";
function loadPage(page, config, users) {
var html = '<option value="" selected="selected">' + Globalize.translate("OptionNone") + "</option>";
html += users.map(function(user) {
return '<option value="' + user.Id + '">' + user.Name + "</option>"
}).join(""), $("#selectUser", page).html(html).val(config.UserId || ""), $("#selectReleaseDateFormat", page).val(config.ReleaseDateFormat), page.querySelector("#chkSaveImagePaths").checked = config.SaveImagePathsInNfo, page.querySelector("#chkEnablePathSubstitution").checked = config.EnablePathSubstitution, page.querySelector("#chkEnableExtraThumbs").checked = config.EnableExtraThumbsDuplication, loading.hide()
html += users.map(function (user) {
return '<option value="' + user.Id + '">' + user.Name + "</option>";
}).join("");
$("#selectUser", page).html(html).val(config.UserId || "");
$("#selectReleaseDateFormat", page).val(config.ReleaseDateFormat);
page.querySelector("#chkSaveImagePaths").checked = config.SaveImagePathsInNfo;
page.querySelector("#chkEnablePathSubstitution").checked = config.EnablePathSubstitution;
page.querySelector("#chkEnableExtraThumbs").checked = config.EnableExtraThumbsDuplication;
loading.hide();
}
function onSubmit() {
loading.show();
var form = this;
return ApiClient.getNamedConfiguration(metadataKey).then(function(config) {
config.UserId = $("#selectUser", form).val() || null, config.ReleaseDateFormat = $("#selectReleaseDateFormat", form).val(), config.SaveImagePathsInNfo = form.querySelector("#chkSaveImagePaths").checked, config.EnablePathSubstitution = form.querySelector("#chkEnablePathSubstitution").checked, config.EnableExtraThumbsDuplication = form.querySelector("#chkEnableExtraThumbs").checked, ApiClient.updateNamedConfiguration(metadataKey, config).then(function() {
Dashboard.processServerConfigurationUpdateResult(), showConfirmMessage(config)
})
}), !1
ApiClient.getNamedConfiguration(metadataKey).then(function (config) {
config.UserId = $("#selectUser", form).val() || null;
config.ReleaseDateFormat = $("#selectReleaseDateFormat", form).val();
config.SaveImagePathsInNfo = form.querySelector("#chkSaveImagePaths").checked;
config.EnablePathSubstitution = form.querySelector("#chkEnablePathSubstitution").checked;
config.EnableExtraThumbsDuplication = form.querySelector("#chkEnableExtraThumbs").checked;
ApiClient.updateNamedConfiguration(metadataKey, config).then(function () {
Dashboard.processServerConfigurationUpdateResult();
showConfirmMessage(config);
});
});
return false;
}
function showConfirmMessage(config) {
var msg = [];
msg.push(Globalize.translate("MetadataSettingChangeHelp")), require(["alert"], function(alert) {
msg.push(Globalize.translate("MetadataSettingChangeHelp"));
require(["alert"], function (alert) {
alert({
text: msg.join("<br/><br/>")
})
})
});
});
}
function getTabs() {
@ -40,19 +55,20 @@ define(["jQuery", "loading", "libraryMenu"], function($, loading, libraryMenu) {
}, {
href: "metadatanfo.html",
name: Globalize.translate("TabNfoSettings")
}]
}];
}
var metadataKey = "xbmcmetadata";
$(document).on("pageinit", "#metadataNfoPage", function() {
$(".metadataNfoForm").off("submit", onSubmit).on("submit", onSubmit)
}).on("pageshow", "#metadataNfoPage", function() {
libraryMenu.setTabs("metadata", 3, getTabs), loading.show();
var page = this,
promise1 = ApiClient.getUsers(),
promise2 = ApiClient.getNamedConfiguration(metadataKey);
Promise.all([promise1, promise2]).then(function(responses) {
loadPage(page, responses[1], responses[0])
})
})
});
$(document).on("pageinit", "#metadataNfoPage", function () {
$(".metadataNfoForm").off("submit", onSubmit).on("submit", onSubmit);
}).on("pageshow", "#metadataNfoPage", function () {
libraryMenu.setTabs("metadata", 3, getTabs);
loading.show();
var page = this;
var promise1 = ApiClient.getUsers();
var promise2 = ApiClient.getNamedConfiguration(metadataKey);
Promise.all([promise1, promise2]).then(function (responses) {
loadPage(page, responses[1], responses[0]);
});
});
});

View file

@ -1,9 +1,11 @@
define(["loading", "events", "libraryBrowser", "imageLoader", "listView", "cardBuilder", "apphost", "emby-itemscontainer"], function(loading, events, libraryBrowser, imageLoader, listView, cardBuilder, appHost) {
define(["loading", "events", "libraryBrowser", "imageLoader", "listView", "cardBuilder", "apphost", "emby-itemscontainer"], function (loading, events, libraryBrowser, imageLoader, listView, cardBuilder, appHost) {
"use strict";
return function(view, params, tabContent) {
return function (view, params, tabContent) {
function getPageData(context) {
var key = getSavedQueryKey(context),
pageData = data[key];
var key = getSavedQueryKey(context);
var pageData = data[key];
if (!pageData) {
pageData = data[key] = {
query: {
@ -22,153 +24,223 @@ define(["loading", "events", "libraryBrowser", "imageLoader", "listView", "cardB
pageData.query.ParentId = params.topParentId;
libraryBrowser.loadSavedQueryValues(key, pageData.query);
}
return pageData;
}
function getQuery(context) {
return getPageData(context).query
return getPageData(context).query;
}
function getSavedQueryKey(context) {
return context.savedQueryKey || (context.savedQueryKey = libraryBrowser.getSavedQueryKey("moviecollections")), context.savedQueryKey
if (!context.savedQueryKey) {
context.savedQueryKey = libraryBrowser.getSavedQueryKey("moviecollections");
}
return context.savedQueryKey;
}
function onViewStyleChange() {
var viewStyle = self.getCurrentViewStyle(),
itemsContainer = tabContent.querySelector(".itemsContainer");
"List" == viewStyle ? (itemsContainer.classList.add("vertical-list"), itemsContainer.classList.remove("vertical-wrap")) : (itemsContainer.classList.remove("vertical-list"), itemsContainer.classList.add("vertical-wrap")), itemsContainer.innerHTML = ""
var viewStyle = self.getCurrentViewStyle();
var itemsContainer = tabContent.querySelector(".itemsContainer");
if ("List" == viewStyle) {
itemsContainer.classList.add("vertical-list");
itemsContainer.classList.remove("vertical-wrap");
} else {
itemsContainer.classList.remove("vertical-list");
itemsContainer.classList.add("vertical-wrap");
}
itemsContainer.innerHTML = "";
}
function reloadItems(page) {
loading.show();
isLoading = true;
var query = getQuery(page);
ApiClient.getItems(ApiClient.getCurrentUserId(), query).then(function(result) {
ApiClient.getItems(ApiClient.getCurrentUserId(), query).then(function (result) {
function onNextPageClick() {
if (isLoading) return;
query.StartIndex += query.Limit, reloadItems(tabContent)
if (isLoading) {
return;
}
query.StartIndex += query.Limit;
reloadItems(tabContent);
}
function onPreviousPageClick() {
if (isLoading) return;
query.StartIndex -= query.Limit, reloadItems(tabContent)
if (isLoading) {
return;
}
query.StartIndex -= query.Limit;
reloadItems(tabContent);
}
window.scrollTo(0, 0);
var html, pagingHtml = libraryBrowser.getQueryPagingHtml({
startIndex: query.StartIndex,
limit: query.Limit,
totalRecordCount: result.TotalRecordCount,
showLimit: !1,
updatePageSizeSetting: !1,
addLayoutButton: !1,
sortButton: !1,
filterButton: !1
}),
viewStyle = self.getCurrentViewStyle();
html = "Thumb" == viewStyle ? cardBuilder.getCardsHtml({
items: result.Items,
shape: "backdrop",
preferThumb: !0,
context: "movies",
overlayPlayButton: !0,
centerText: !0,
showTitle: !0
}) : "ThumbCard" == viewStyle ? cardBuilder.getCardsHtml({
items: result.Items,
shape: "backdrop",
preferThumb: !0,
context: "movies",
lazy: !0,
cardLayout: !0,
showTitle: !0
}) : "Banner" == viewStyle ? cardBuilder.getCardsHtml({
items: result.Items,
shape: "banner",
preferBanner: !0,
context: "movies",
lazy: !0
}) : "List" == viewStyle ? listView.getListViewHtml({
items: result.Items,
context: "movies",
sortBy: query.SortBy
}) : "PosterCard" == viewStyle ? cardBuilder.getCardsHtml({
items: result.Items,
shape: "auto",
context: "movies",
showTitle: !0,
centerText: !1,
cardLayout: !0
}) : cardBuilder.getCardsHtml({
items: result.Items,
shape: "auto",
context: "movies",
centerText: !0,
overlayPlayButton: !0,
showTitle: !0
var html;
var pagingHtml = libraryBrowser.getQueryPagingHtml({
startIndex: query.StartIndex,
limit: query.Limit,
totalRecordCount: result.TotalRecordCount,
showLimit: false,
updatePageSizeSetting: false,
addLayoutButton: false,
sortButton: false,
filterButton: false
});
var i, length, elems = tabContent.querySelectorAll(".paging");
for (i = 0, length = elems.length; i < length; i++) elems[i].innerHTML = pagingHtml;
for (elems = tabContent.querySelectorAll(".btnNextPage"), i = 0, length = elems.length; i < length; i++) elems[i].addEventListener("click", onNextPageClick);
for (elems = tabContent.querySelectorAll(".btnPreviousPage"), i = 0, length = elems.length; i < length; i++) elems[i].addEventListener("click", onPreviousPageClick);
result.Items.length || (html = '<p style="text-align:center;">' + Globalize.translate("MessageNoCollectionsAvailable") + "</p>");
var viewStyle = self.getCurrentViewStyle();
if (viewStyle == "Thumb") {
html = cardBuilder.getCardsHtml({
items: result.Items,
shape: "backdrop",
preferThumb: true,
context: "movies",
overlayPlayButton: true,
centerText: true,
showTitle: true
});
} else if (viewStyle == "ThumbCard") {
html = cardBuilder.getCardsHtml({
items: result.Items,
shape: "backdrop",
preferThumb: true,
context: "movies",
lazy: true,
cardLayout: true,
showTitle: true
});
} else if (viewStyle == "Banner") {
html = cardBuilder.getCardsHtml({
items: result.Items,
shape: "banner",
preferBanner: true,
context: "movies",
lazy: true
});
} else if (viewStyle == "List") {
html = listView.getListViewHtml({
items: result.Items,
context: "movies",
sortBy: query.SortBy
});
} else if (viewStyle == "PosterCard") {
html = cardBuilder.getCardsHtml({
items: result.Items,
shape: "auto",
context: "movies",
showTitle: true,
centerText: false,
cardLayout: true
});
} else {
html = cardBuilder.getCardsHtml({
items: result.Items,
shape: "auto",
context: "movies",
centerText: true,
overlayPlayButton: true,
showTitle: true
});
}
var i;
var length;
var elems = tabContent.querySelectorAll(".paging");
for (i = 0, length = elems.length; i < length; i++) {
elems[i].innerHTML = pagingHtml;
}
elems = tabContent.querySelectorAll(".btnNextPage");
for (i = 0, length = elems.length; i < length; i++) {
elems[i].addEventListener("click", onNextPageClick);
}
elems = tabContent.querySelectorAll(".btnPreviousPage");
for (i = 0, length = elems.length; i < length; i++) {
elems[i].addEventListener("click", onPreviousPageClick);
}
if (!result.Items.length) {
html = '<p style="text-align:center;">' + Globalize.translate("MessageNoCollectionsAvailable") + "</p>";
}
var itemsContainer = tabContent.querySelector(".itemsContainer");
itemsContainer.innerHTML = html;
imageLoader.lazyChildren(itemsContainer);
libraryBrowser.saveQueryValues(getSavedQueryKey(page), query);
loading.hide();
isLoading = false;
})
});
}
var self = this,
pageSize = 100,
data = {},
isLoading = false;
self.getCurrentViewStyle = function() {
return getPageData(tabContent).view
},
function(tabContent) {
tabContent.querySelector(".btnSort").addEventListener("click", function(e) {
libraryBrowser.showSortMenu({
items: [{
name: Globalize.translate("OptionNameSort"),
id: "SortName"
}, {
name: Globalize.translate("OptionImdbRating"),
id: "CommunityRating,SortName"
}, {
name: Globalize.translate("OptionDateAdded"),
id: "DateCreated,SortName"
}, {
name: Globalize.translate("OptionParentalRating"),
id: "OfficialRating,SortName"
}, {
name: Globalize.translate("OptionReleaseDate"),
id: "PremiereDate,SortName"
}],
callback: function() {
getQuery(tabContent).StartIndex = 0, reloadItems(tabContent)
},
query: getQuery(tabContent),
button: e.target
})
var self = this;
var pageSize = 100;
var data = {};
var isLoading = false;
self.getCurrentViewStyle = function () {
return getPageData(tabContent).view;
};
function initPage(tabContent) {
tabContent.querySelector(".btnSort").addEventListener("click", function (e) {
libraryBrowser.showSortMenu({
items: [{
name: Globalize.translate("OptionNameSort"),
id: "SortName"
}, {
name: Globalize.translate("OptionImdbRating"),
id: "CommunityRating,SortName"
}, {
name: Globalize.translate("OptionDateAdded"),
id: "DateCreated,SortName"
}, {
name: Globalize.translate("OptionParentalRating"),
id: "OfficialRating,SortName"
}, {
name: Globalize.translate("OptionReleaseDate"),
id: "PremiereDate,SortName"
}],
callback: function () {
getQuery(tabContent).StartIndex = 0;
reloadItems(tabContent);
},
query: getQuery(tabContent),
button: e.target
});
var btnSelectView = tabContent.querySelector(".btnSelectView");
btnSelectView.addEventListener("click", function(e) {
libraryBrowser.showLayoutMenu(e.target, self.getCurrentViewStyle(), "List,Poster,PosterCard,Thumb,ThumbCard".split(","))
}), btnSelectView.addEventListener("layoutchange", function(e) {
var viewStyle = e.detail.viewStyle;
getPageData(tabContent).view = viewStyle, libraryBrowser.saveViewSetting(getSavedQueryKey(tabContent), viewStyle), getQuery(tabContent).StartIndex = 0, onViewStyleChange(), reloadItems(tabContent)
}), tabContent.querySelector(".btnNewCollection").addEventListener("click", function() {
require(["collectionEditor"], function(collectionEditor) {
var serverId = ApiClient.serverInfo().Id;
(new collectionEditor).show({
items: [],
serverId: serverId
})
})
})
}(tabContent), onViewStyleChange(), self.renderTab = function() {
reloadItems(tabContent)
}, self.destroy = function() {}
}
});
var btnSelectView = tabContent.querySelector(".btnSelectView");
btnSelectView.addEventListener("click", function (e) {
libraryBrowser.showLayoutMenu(e.target, self.getCurrentViewStyle(), "List,Poster,PosterCard,Thumb,ThumbCard".split(","));
});
btnSelectView.addEventListener("layoutchange", function (e) {
var viewStyle = e.detail.viewStyle;
getPageData(tabContent).view = viewStyle;
libraryBrowser.saveViewSetting(getSavedQueryKey(tabContent), viewStyle);
getQuery(tabContent).StartIndex = 0;
onViewStyleChange();
reloadItems(tabContent);
});
tabContent.querySelector(".btnNewCollection").addEventListener("click", function () {
require(["collectionEditor"], function (collectionEditor) {
var serverId = ApiClient.serverInfo().Id;
new collectionEditor().show({
items: [],
serverId: serverId
});
});
});
}
initPage(tabContent);
onViewStyleChange();
self.renderTab = function () {
reloadItems(tabContent);
};
self.destroy = function () {};
};
});

View file

@ -1,139 +1,204 @@
define(["layoutManager", "loading", "libraryBrowser", "cardBuilder", "lazyLoader", "apphost", "globalize", "appRouter", "dom", "emby-button"], function(layoutManager, loading, libraryBrowser, cardBuilder, lazyLoader, appHost, globalize, appRouter, dom) {
define(["layoutManager", "loading", "libraryBrowser", "cardBuilder", "lazyLoader", "apphost", "globalize", "appRouter", "dom", "emby-button"], function (layoutManager, loading, libraryBrowser, cardBuilder, lazyLoader, appHost, globalize, appRouter, dom) {
"use strict";
return function(view, params, tabContent) {
return function (view, params, tabContent) {
function getPageData() {
var key = getSavedQueryKey(),
pageData = data[key];
return pageData || (pageData = data[key] = {
query: {
SortBy: "SortName",
SortOrder: "Ascending",
IncludeItemTypes: "Movie",
Recursive: !0,
EnableTotalRecordCount: !1
},
view: "Poster"
}, pageData.query.ParentId = params.topParentId, libraryBrowser.loadSavedQueryValues(key, pageData.query)), pageData
var key = getSavedQueryKey();
var pageData = data[key];
if (!pageData) {
pageData = data[key] = {
query: {
SortBy: "SortName",
SortOrder: "Ascending",
IncludeItemTypes: "Movie",
Recursive: true,
EnableTotalRecordCount: false
},
view: "Poster"
};
pageData.query.ParentId = params.topParentId;
libraryBrowser.loadSavedQueryValues(key, pageData.query);
}
return pageData;
}
function getQuery() {
return getPageData().query
return getPageData().query;
}
function getSavedQueryKey() {
return libraryBrowser.getSavedQueryKey("moviegenres")
return libraryBrowser.getSavedQueryKey("moviegenres");
}
function getPromise() {
loading.show();
var query = getQuery();
return ApiClient.getGenres(ApiClient.getCurrentUserId(), query)
return ApiClient.getGenres(ApiClient.getCurrentUserId(), query);
}
function enableScrollX() {
return !layoutManager.desktop
return !layoutManager.desktop;
}
function getThumbShape() {
return enableScrollX() ? "overflowBackdrop" : "backdrop"
return enableScrollX() ? "overflowBackdrop" : "backdrop";
}
function getPortraitShape() {
return enableScrollX() ? "overflowPortrait" : "portrait"
return enableScrollX() ? "overflowPortrait" : "portrait";
}
function fillItemsContainer(elem) {
var id = elem.getAttribute("data-id"),
viewStyle = self.getCurrentViewStyle(),
limit = "Thumb" == viewStyle || "ThumbCard" == viewStyle ? 5 : 9;
enableScrollX() && (limit = 10);
var enableImageTypes = "Thumb" == viewStyle || "ThumbCard" == viewStyle ? "Primary,Backdrop,Thumb" : "Primary",
query = {
SortBy: "SortName",
SortOrder: "Ascending",
IncludeItemTypes: "Movie",
Recursive: !0,
Fields: "PrimaryImageAspectRatio,MediaSourceCount,BasicSyncInfo",
ImageTypeLimit: 1,
EnableImageTypes: enableImageTypes,
Limit: limit,
GenreIds: id,
EnableTotalRecordCount: !1,
ParentId: params.topParentId
};
ApiClient.getItems(ApiClient.getCurrentUserId(), query).then(function(result) {
var id = elem.getAttribute("data-id");
var viewStyle = self.getCurrentViewStyle();
var limit = "Thumb" == viewStyle || "ThumbCard" == viewStyle ? 5 : 9;
if (enableScrollX()) {
limit = 10;
}
var enableImageTypes = "Thumb" == viewStyle || "ThumbCard" == viewStyle ? "Primary,Backdrop,Thumb" : "Primary";
var query = {
SortBy: "SortName",
SortOrder: "Ascending",
IncludeItemTypes: "Movie",
Recursive: true,
Fields: "PrimaryImageAspectRatio,MediaSourceCount,BasicSyncInfo",
ImageTypeLimit: 1,
EnableImageTypes: enableImageTypes,
Limit: limit,
GenreIds: id,
EnableTotalRecordCount: false,
ParentId: params.topParentId
};
ApiClient.getItems(ApiClient.getCurrentUserId(), query).then(function (result) {
var supportsImageAnalysis = appHost.supports("imageanalysis");
"Thumb" == viewStyle ? cardBuilder.buildCards(result.Items, {
itemsContainer: elem,
shape: getThumbShape(),
preferThumb: !0,
showTitle: !0,
scalable: !0,
centerText: !0,
overlayMoreButton: !0,
allowBottomPadding: !1
}) : "ThumbCard" == viewStyle ? cardBuilder.buildCards(result.Items, {
itemsContainer: elem,
shape: getThumbShape(),
preferThumb: !0,
showTitle: !0,
scalable: !0,
centerText: !1,
cardLayout: !0,
showYear: !0
}) : "PosterCard" == viewStyle ? cardBuilder.buildCards(result.Items, {
itemsContainer: elem,
shape: getPortraitShape(),
showTitle: !0,
scalable: !0,
centerText: !1,
cardLayout: !0,
showYear: !0
}) : "Poster" == viewStyle && cardBuilder.buildCards(result.Items, {
itemsContainer: elem,
shape: getPortraitShape(),
scalable: !0,
overlayMoreButton: !0,
allowBottomPadding: !1
}), result.Items.length >= query.Limit && tabContent.querySelector(".btnMoreFromGenre" + id + " i").classList.remove("hide")
})
if (viewStyle == "Thumb") {
cardBuilder.buildCards(result.Items, {
itemsContainer: elem,
shape: getThumbShape(),
preferThumb: true,
showTitle: true,
scalable: true,
centerText: true,
overlayMoreButton: true,
allowBottomPadding: false
});
} else if (viewStyle == "ThumbCard") {
cardBuilder.buildCards(result.Items, {
itemsContainer: elem,
shape: getThumbShape(),
preferThumb: true,
showTitle: true,
scalable: true,
centerText: false,
cardLayout: true,
showYear: true
});
} else if (viewStyle == "PosterCard") {
cardBuilder.buildCards(result.Items, {
itemsContainer: elem,
shape: getPortraitShape(),
showTitle: true,
scalable: true,
centerText: false,
cardLayout: true,
showYear: true
});
} else if (viewStyle == "Poster") {
cardBuilder.buildCards(result.Items, {
itemsContainer: elem,
shape: getPortraitShape(),
scalable: true,
overlayMoreButton: true,
allowBottomPadding: false
});
}
if (result.Items.length >= query.Limit) {
tabContent.querySelector(".btnMoreFromGenre" + id + " i").classList.remove("hide");
}
});
}
function reloadItems(context, promise) {
var query = getQuery();
promise.then(function(result) {
for (var elem = context.querySelector("#items"), html = "", items = result.Items, i = 0, length = items.length; i < length; i++) {
promise.then(function (result) {
var elem = context.querySelector("#items");
var html = "";
var items = result.Items;
for (var i = 0, length = items.length; i < length; i++) {
var item = items[i];
if (html += '<div class="verticalSection">', html += '<div class="sectionTitleContainer sectionTitleContainer-cards padded-left">', html += '<a is="emby-linkbutton" href="' + appRouter.getRouteUrl(item, {
context: "movies",
parentId: params.topParentId
}) + '" class="more button-flat button-flat-mini sectionTitleTextButton btnMoreFromGenre' + item.Id + '">', html += '<h2 class="sectionTitle sectionTitle-cards">', html += item.Name, html += "</h2>", html += '<i class="md-icon hide">&#xE5CC;</i>', html += "</a>", html += "</div>", enableScrollX()) {
html += '<div class="verticalSection">';
html += '<div class="sectionTitleContainer sectionTitleContainer-cards padded-left">';
html += '<a is="emby-linkbutton" href="' + appRouter.getRouteUrl(item, {
context: "movies",
parentId: params.topParentId
}) + '" class="more button-flat button-flat-mini sectionTitleTextButton btnMoreFromGenre' + item.Id + '">';
html += '<h2 class="sectionTitle sectionTitle-cards">';
html += item.Name;
html += "</h2>";
html += '<i class="md-icon hide">&#xE5CC;</i>';
html += "</a>";
html += "</div>";
if (enableScrollX()) {
var scrollXClass = "scrollX hiddenScrollX";
layoutManager.tv && (scrollXClass += " smoothScrollX"), html += '<div is="emby-itemscontainer" class="itemsContainer ' + scrollXClass + ' lazy padded-left padded-right" data-id="' + item.Id + '">'
} else html += '<div is="emby-itemscontainer" class="itemsContainer vertical-wrap lazy padded-left padded-right" data-id="' + item.Id + '">';
html += "</div>", html += "</div>"
if (layoutManager.tv) {
scrollXClass += "smoothScrollX";
}
html += '<div is="emby-itemscontainer" class="itemsContainer ' + scrollXClass + ' lazy padded-left padded-right" data-id="' + item.Id + '">';
} else {
html += '<div is="emby-itemscontainer" class="itemsContainer vertical-wrap lazy padded-left padded-right" data-id="' + item.Id + '">';
}
html += "</div>";
html += "</div>";
}
elem.innerHTML = html, lazyLoader.lazyChildren(elem, fillItemsContainer), libraryBrowser.saveQueryValues(getSavedQueryKey(), query), loading.hide()
})
elem.innerHTML = html;
lazyLoader.lazyChildren(elem, fillItemsContainer);
libraryBrowser.saveQueryValues(getSavedQueryKey(), query);
loading.hide();
});
}
function fullyReload() {
self.preRender(), self.renderTab()
self.preRender();
self.renderTab();
}
var self = this,
data = {};
self.getViewStyles = function() {
return "Poster,PosterCard,Thumb,ThumbCard".split(",")
}, self.getCurrentViewStyle = function() {
return getPageData(tabContent).view
}, self.setCurrentViewStyle = function(viewStyle) {
getPageData(tabContent).view = viewStyle, libraryBrowser.saveViewSetting(getSavedQueryKey(tabContent), viewStyle), fullyReload()
}, self.enableViewSelection = !0;
var self = this;
var data = {};
self.getViewStyles = function () {
return "Poster,PosterCard,Thumb,ThumbCard".split(",");
};
self.getCurrentViewStyle = function () {
return getPageData(tabContent).view;
};
self.setCurrentViewStyle = function (viewStyle) {
getPageData(tabContent).view = viewStyle;
libraryBrowser.saveViewSetting(getSavedQueryKey(tabContent), viewStyle);
fullyReload();
};
self.enableViewSelection = true;
var promise;
self.preRender = function() {
promise = getPromise()
}, self.renderTab = function() {
reloadItems(tabContent, promise)
}
}
});
self.preRender = function () {
promise = getPromise();
};
self.renderTab = function () {
reloadItems(tabContent, promise);
};
};
});

View file

@ -1,7 +1,7 @@
define(["loading", "layoutManager", "userSettings", "events", "libraryBrowser", "alphaPicker", "listView", "cardBuilder", "emby-itemscontainer"],
function(loading, layoutManager, userSettings, events, libraryBrowser, alphaPicker, listView, cardBuilder) {
define(["loading", "layoutManager", "userSettings", "events", "libraryBrowser", "alphaPicker", "listView", "cardBuilder", "emby-itemscontainer"], function (loading, layoutManager, userSettings, events, libraryBrowser, alphaPicker, listView, cardBuilder) {
"use strict";
return function(view, params, tabContent, options) {
return function (view, params, tabContent, options) {
function onViewStyleChange() {
if (self.getCurrentViewStyle() == "List") {
itemsContainer.classList.add("vertical-list");
@ -10,103 +10,141 @@ define(["loading", "layoutManager", "userSettings", "events", "libraryBrowser",
itemsContainer.classList.remove("vertical-list");
itemsContainer.classList.add("vertical-wrap");
}
itemsContainer.innerHTML = "";
}
function updateFilterControls() {
self.alphaPicker && self.alphaPicker.value(query.NameStartsWithOrGreater)
if (self.alphaPicker) {
self.alphaPicker.value(query.NameStartsWithOrGreater);
}
}
function fetchData() {
isLoading = true;
loading.show();
return ApiClient.getItems(ApiClient.getCurrentUserId(), query)
return ApiClient.getItems(ApiClient.getCurrentUserId(), query);
}
function afterRefresh(result) {
function onNextPageClick() {
if (isLoading) return;
if (isLoading) {
return;
}
query.StartIndex += query.Limit;
itemsContainer.refreshItems();
}
function onPreviousPageClick() {
if (isLoading) return;
if (isLoading) {
return;
}
query.StartIndex -= query.Limit;
itemsContainer.refreshItems();
}
window.scrollTo(0, 0);
updateFilterControls();
var i, length, elems, pagingHtml = libraryBrowser.getQueryPagingHtml({
startIndex: query.StartIndex,
limit: query.Limit,
totalRecordCount: result.TotalRecordCount,
showLimit: !1,
updatePageSizeSetting: !1,
addLayoutButton: !1,
sortButton: !1,
filterButton: !1
});
for (elems = tabContent.querySelectorAll(".paging"), i = 0, length = elems.length; i < length; i++)
var pagingHtml = libraryBrowser.getQueryPagingHtml({
startIndex: query.StartIndex,
limit: query.Limit,
totalRecordCount: result.TotalRecordCount,
showLimit: false,
updatePageSizeSetting: false,
addLayoutButton: false,
sortButton: false,
filterButton: false
});
var i;
var length;
var elems = tabContent.querySelectorAll(".paging");
for (i = 0, length = elems.length; i < length; i++) {
elems[i].innerHTML = pagingHtml;
for (elems = tabContent.querySelectorAll(".btnNextPage"), i = 0, length = elems.length; i < length; i++)
}
elems = tabContent.querySelectorAll(".btnNextPage");
for (i = 0, length = elems.length; i < length; i++) {
elems[i].addEventListener("click", onNextPageClick);
for (elems = tabContent.querySelectorAll(".btnPreviousPage"), i = 0, length = elems.length; i < length; i++)
elems[i].addEventListener("click", onPreviousPageClick)
}
elems = tabContent.querySelectorAll(".btnPreviousPage");
for (i = 0, length = elems.length; i < length; i++) {
elems[i].addEventListener("click", onPreviousPageClick);
}
isLoading = false;
loading.hide();
}
function getItemsHtml(items) {
var html;
var viewStyle = self.getCurrentViewStyle();
return "Thumb" == viewStyle ? cardBuilder.getCardsHtml({
items: items,
shape: "backdrop",
preferThumb: !0,
context: "movies",
lazy: !0,
overlayPlayButton: !0,
showTitle: !0,
showYear: !0,
centerText: !0
}) : "ThumbCard" == viewStyle ? cardBuilder.getCardsHtml({
items: items,
shape: "backdrop",
preferThumb: !0,
context: "movies",
lazy: !0,
cardLayout: !0,
showTitle: !0,
showYear: !0,
centerText: !0
}) : "Banner" == viewStyle ? cardBuilder.getCardsHtml({
items: items,
shape: "banner",
preferBanner: !0,
context: "movies",
lazy: !0
}) : "List" == viewStyle ? listView.getListViewHtml({
items: items,
context: "movies",
sortBy: query.SortBy
}) : "PosterCard" == viewStyle ? cardBuilder.getCardsHtml({
items: items,
shape: "portrait",
context: "movies",
showTitle: !0,
showYear: !0,
centerText: !0,
lazy: !0,
cardLayout: !0
}) : cardBuilder.getCardsHtml({
items: items,
shape: "portrait",
context: "movies",
overlayPlayButton: !0,
showTitle: !0,
showYear: !0,
centerText: !0
})
if (viewStyle == "Thumb") {
html = cardBuilder.getCardsHtml({
items: items,
shape: "backdrop",
preferThumb: true,
context: "movies",
lazy: true,
overlayPlayButton: true,
showTitle: true,
showYear: true,
centerText: true
});
} else if (viewStyle == "ThumbCard") {
html = cardBuilder.getCardsHtml({
items: items,
shape: "backdrop",
preferThumb: true,
context: "movies",
lazy: true,
cardLayout: true,
showTitle: true,
showYear: true,
centerText: true
});
} else if (viewStyle == "Banner") {
html = cardBuilder.getCardsHtml({
items: items,
shape: "banner",
preferBanner: true,
context: "movies",
lazy: true
});
} else if (viewStyle == "List") {
html = listView.getListViewHtml({
items: items,
context: "movies",
sortBy: query.SortBy
});
} else if (viewStyle == "PosterCard") {
html = cardBuilder.getCardsHtml({
items: items,
shape: "portrait",
context: "movies",
showTitle: true,
showYear: true,
centerText: true,
lazy: true,
cardLayout: true
});
} else {
html = cardBuilder.getCardsHtml({
items: items,
shape: "portrait",
context: "movies",
overlayPlayButton: true,
showTitle: true,
showYear: true,
centerText: true
});
}
return html;
}
function initPage(tabContent) {
@ -114,8 +152,9 @@ define(["loading", "layoutManager", "userSettings", "events", "libraryBrowser",
itemsContainer.getItemsHtml = getItemsHtml;
itemsContainer.afterRefresh = afterRefresh;
var alphaPickerElement = tabContent.querySelector(".alphaPicker");
if (alphaPickerElement) {
alphaPickerElement.addEventListener("alphavaluechanged", function(e) {
alphaPickerElement.addEventListener("alphavaluechanged", function (e) {
var newValue = e.detail.value;
query.NameStartsWithOrGreater = newValue;
query.StartIndex = 0;
@ -125,109 +164,132 @@ define(["loading", "layoutManager", "userSettings", "events", "libraryBrowser",
element: alphaPickerElement,
valueChangeEvent: "click"
});
if (layoutManager.desktop || layoutManager.mobile) {
alphaPickerElement.classList.add("alphabetPicker-right");
itemsContainer.classList.remove("padded-left-withalphapicker");
itemsContainer.classList.add("padded-right-withalphapicker");
}
}
var btnFilter = tabContent.querySelector(".btnFilter");
btnFilter && btnFilter.addEventListener("click", function() {
self.showFilterMenu()
});
if (btnFilter) {
btnFilter.addEventListener("click", function () {
self.showFilterMenu();
});
}
var btnSort = tabContent.querySelector(".btnSort");
btnSort && btnSort.addEventListener("click", function(e) {
libraryBrowser.showSortMenu({
items: [{
name: Globalize.translate("OptionNameSort"),
id: "SortName,ProductionYear"
}, {
name: Globalize.translate("OptionImdbRating"),
id: "CommunityRating,SortName,ProductionYear"
}, {
name: Globalize.translate("OptionCriticRating"),
id: "CriticRating,SortName,ProductionYear"
}, {
name: Globalize.translate("OptionDateAdded"),
id: "DateCreated,SortName,ProductionYear"
}, {
name: Globalize.translate("OptionDatePlayed"),
id: "DatePlayed,SortName,ProductionYear"
}, {
name: Globalize.translate("OptionParentalRating"),
id: "OfficialRating,SortName,ProductionYear"
}, {
name: Globalize.translate("OptionPlayCount"),
id: "PlayCount,SortName,ProductionYear"
}, {
name: Globalize.translate("OptionReleaseDate"),
id: "PremiereDate,SortName,ProductionYear"
}, {
name: Globalize.translate("OptionRuntime"),
id: "Runtime,SortName,ProductionYear"
}],
callback: function() {
query.StartIndex = 0, userSettings.saveQuerySettings(savedQueryKey, query), itemsContainer.refreshItems()
},
query: query,
button: e.target
})
});
if (btnSort) {
btnSort.addEventListener("click", function (e) {
libraryBrowser.showSortMenu({
items: [{
name: Globalize.translate("OptionNameSort"),
id: "SortName,ProductionYear"
}, {
name: Globalize.translate("OptionImdbRating"),
id: "CommunityRating,SortName,ProductionYear"
}, {
name: Globalize.translate("OptionCriticRating"),
id: "CriticRating,SortName,ProductionYear"
}, {
name: Globalize.translate("OptionDateAdded"),
id: "DateCreated,SortName,ProductionYear"
}, {
name: Globalize.translate("OptionDatePlayed"),
id: "DatePlayed,SortName,ProductionYear"
}, {
name: Globalize.translate("OptionParentalRating"),
id: "OfficialRating,SortName,ProductionYear"
}, {
name: Globalize.translate("OptionPlayCount"),
id: "PlayCount,SortName,ProductionYear"
}, {
name: Globalize.translate("OptionReleaseDate"),
id: "PremiereDate,SortName,ProductionYear"
}, {
name: Globalize.translate("OptionRuntime"),
id: "Runtime,SortName,ProductionYear"
}],
callback: function () {
query.StartIndex = 0;
userSettings.saveQuerySettings(savedQueryKey, query);
itemsContainer.refreshItems();
},
query: query,
button: e.target
});
});
}
var btnSelectView = tabContent.querySelector(".btnSelectView");
btnSelectView.addEventListener("click", function(e) {
libraryBrowser.showLayoutMenu(e.target, self.getCurrentViewStyle(), "Banner,List,Poster,PosterCard,Thumb,ThumbCard".split(","))
}), btnSelectView.addEventListener("layoutchange", function(e) {
btnSelectView.addEventListener("click", function (e) {
libraryBrowser.showLayoutMenu(e.target, self.getCurrentViewStyle(), "Banner,List,Poster,PosterCard,Thumb,ThumbCard".split(","));
});
btnSelectView.addEventListener("layoutchange", function (e) {
var viewStyle = e.detail.viewStyle;
userSettings.set(savedViewKey, viewStyle);
query.StartIndex = 0;
onViewStyleChange();
itemsContainer.refreshItems();
})
});
}
var self = this,
itemsContainer = tabContent.querySelector(".itemsContainer"),
savedQueryKey = params.topParentId + "-" + options.mode,
savedViewKey = savedQueryKey + "-view",
query = {
SortBy: "SortName,ProductionYear",
SortOrder: "Ascending",
IncludeItemTypes: "Movie",
Recursive: !0,
Fields: "PrimaryImageAspectRatio,MediaSourceCount,BasicSyncInfo",
ImageTypeLimit: 1,
EnableImageTypes: "Primary,Backdrop,Banner,Thumb",
StartIndex: 0,
Limit: 100,
ParentId: params.topParentId
},
isLoading = false;
if (options.mode === "favorites") query.IsFavorite = true;
var self = this;
var itemsContainer = tabContent.querySelector(".itemsContainer");
var savedQueryKey = params.topParentId + "-" + options.mode;
var savedViewKey = savedQueryKey + "-view";
var query = {
SortBy: "SortName,ProductionYear",
SortOrder: "Ascending",
IncludeItemTypes: "Movie",
Recursive: true,
Fields: "PrimaryImageAspectRatio,MediaSourceCount,BasicSyncInfo",
ImageTypeLimit: 1,
EnableImageTypes: "Primary,Backdrop,Banner,Thumb",
StartIndex: 0,
Limit: 100,
ParentId: params.topParentId
};
var isLoading = false;
if (options.mode === "favorites") {
query.IsFavorite = true;
}
query = userSettings.loadQuerySettings(savedQueryKey, query);
self.showFilterMenu = function() {
require(["components/filterdialog/filterdialog"], function(filterDialogFactory) {
self.showFilterMenu = function () {
require(["components/filterdialog/filterdialog"], function (filterDialogFactory) {
var filterDialog = new filterDialogFactory({
query: query,
mode: "movies",
serverId: ApiClient.serverId()
});
events.on(filterDialog, "filterchange", function() {
query.StartIndex = 0, itemsContainer.refreshItems()
}), filterDialog.show()
})
events.on(filterDialog, "filterchange", function () {
query.StartIndex = 0;
itemsContainer.refreshItems();
});
filterDialog.show();
});
};
self.getCurrentViewStyle = function() {
return userSettings.get(savedViewKey) || "Poster"
self.getCurrentViewStyle = function () {
return userSettings.get(savedViewKey) || "Poster";
};
self.initTab = function() {
self.initTab = function () {
initPage(tabContent);
onViewStyleChange();
};
self.renderTab = function() {
self.renderTab = function () {
itemsContainer.refreshItems();
updateFilterControls();
};
self.destroy = function() {
itemsContainer = null
}
}
self.destroy = function () {
itemsContainer = null;
};
};
});

View file

@ -1,16 +1,16 @@
define(["events", "layoutManager", "inputManager", "userSettings", "libraryMenu", "mainTabsManager", "cardBuilder", "dom", "imageLoader", "playbackManager", "emby-itemscontainer", "emby-tabs", "emby-button"], function(events, layoutManager, inputManager, userSettings, libraryMenu, mainTabsManager, cardBuilder, dom, imageLoader, playbackManager) {
define(["events", "layoutManager", "inputManager", "userSettings", "libraryMenu", "mainTabsManager", "cardBuilder", "dom", "imageLoader", "playbackManager", "emby-itemscontainer", "emby-tabs", "emby-button"], function (events, layoutManager, inputManager, userSettings, libraryMenu, mainTabsManager, cardBuilder, dom, imageLoader, playbackManager) {
"use strict";
function enableScrollX() {
return !layoutManager.desktop
return !layoutManager.desktop;
}
function getPortraitShape() {
return enableScrollX() ? "overflowPortrait" : "portrait"
return enableScrollX() ? "overflowPortrait" : "portrait";
}
function getThumbShape() {
return enableScrollX() ? "overflowBackdrop" : "backdrop"
return enableScrollX() ? "overflowBackdrop" : "backdrop";
}
function loadLatest(page, userId, parentId) {
@ -21,118 +21,168 @@ define(["events", "layoutManager", "inputManager", "userSettings", "libraryMenu"
ParentId: parentId,
ImageTypeLimit: 1,
EnableImageTypes: "Primary,Backdrop,Banner,Thumb",
EnableTotalRecordCount: !1
EnableTotalRecordCount: false
};
ApiClient.getJSON(ApiClient.getUrl("Users/" + userId + "/Items/Latest", options)).then(function(items) {
var allowBottomPadding = !enableScrollX(),
container = page.querySelector("#recentlyAddedItems");
ApiClient.getJSON(ApiClient.getUrl("Users/" + userId + "/Items/Latest", options)).then(function (items) {
var allowBottomPadding = !enableScrollX();
var container = page.querySelector("#recentlyAddedItems");
cardBuilder.buildCards(items, {
itemsContainer: container,
shape: getPortraitShape(),
scalable: !0,
overlayPlayButton: !0,
scalable: true,
overlayPlayButton: true,
allowBottomPadding: allowBottomPadding,
showTitle: !0,
showYear: !0,
centerText: !0
})
})
showTitle: true,
showYear: true,
centerText: true
});
});
}
function loadResume(page, userId, parentId) {
var screenWidth = dom.getWindowSize().innerWidth,
options = {
SortBy: "DatePlayed",
SortOrder: "Descending",
IncludeItemTypes: "Movie",
Filters: "IsResumable",
Limit: screenWidth >= 1920 ? 5 : screenWidth >= 1600 ? 5 : 3,
Recursive: !0,
Fields: "PrimaryImageAspectRatio,MediaSourceCount,BasicSyncInfo",
CollapseBoxSetItems: !1,
ParentId: parentId,
ImageTypeLimit: 1,
EnableImageTypes: "Primary,Backdrop,Banner,Thumb",
EnableTotalRecordCount: !1
};
ApiClient.getItems(userId, options).then(function(result) {
result.Items.length ? page.querySelector("#resumableSection").classList.remove("hide") : page.querySelector("#resumableSection").classList.add("hide");
var allowBottomPadding = !enableScrollX(),
container = page.querySelector("#resumableItems");
var screenWidth = dom.getWindowSize().innerWidth;
var options = {
SortBy: "DatePlayed",
SortOrder: "Descending",
IncludeItemTypes: "Movie",
Filters: "IsResumable",
Limit: screenWidth >= 1920 ? 5 : screenWidth >= 1600 ? 5 : 3,
Recursive: true,
Fields: "PrimaryImageAspectRatio,MediaSourceCount,BasicSyncInfo",
CollapseBoxSetItems: false,
ParentId: parentId,
ImageTypeLimit: 1,
EnableImageTypes: "Primary,Backdrop,Banner,Thumb",
EnableTotalRecordCount: false
};
ApiClient.getItems(userId, options).then(function (result) {
if (result.Items.length) {
page.querySelector("#resumableSection").classList.remove("hide");
} else {
page.querySelector("#resumableSection").classList.add("hide");
}
var allowBottomPadding = !enableScrollX();
var container = page.querySelector("#resumableItems");
cardBuilder.buildCards(result.Items, {
itemsContainer: container,
preferThumb: !0,
preferThumb: true,
shape: getThumbShape(),
scalable: !0,
overlayPlayButton: !0,
scalable: true,
overlayPlayButton: true,
allowBottomPadding: allowBottomPadding,
cardLayout: !1,
showTitle: !0,
showYear: !0,
centerText: !0
})
})
cardLayout: false,
showTitle: true,
showYear: true,
centerText: true
});
});
}
function getRecommendationHtml(recommendation) {
var html = "",
title = "";
var html = "";
var title = "";
switch (recommendation.RecommendationType) {
case "SimilarToRecentlyPlayed":
title = Globalize.translate("RecommendationBecauseYouWatched").replace("{0}", recommendation.BaselineItemName);
break;
case "SimilarToLikedItem":
title = Globalize.translate("RecommendationBecauseYouLike").replace("{0}", recommendation.BaselineItemName);
break;
case "HasDirectorFromRecentlyPlayed":
case "HasLikedDirector":
title = Globalize.translate("RecommendationDirectedBy").replace("{0}", recommendation.BaselineItemName);
break;
case "HasActorFromRecentlyPlayed":
case "HasLikedActor":
title = Globalize.translate("RecommendationStarring").replace("{0}", recommendation.BaselineItemName)
title = Globalize.translate("RecommendationStarring").replace("{0}", recommendation.BaselineItemName);
break;
}
html += '<div class="verticalSection">', html += '<h2 class="sectionTitle sectionTitle-cards padded-left">' + title + "</h2>";
var allowBottomPadding = !0;
return enableScrollX() ? (allowBottomPadding = !1, html += '<div is="emby-itemscontainer" class="itemsContainer scrollX hiddenScrollX padded-left padded-right">') : html += '<div is="emby-itemscontainer" class="itemsContainer vertical-wrap padded-left padded-right">', html += cardBuilder.getCardsHtml(recommendation.Items, {
html += '<div class="verticalSection">';
html += '<h2 class="sectionTitle sectionTitle-cards padded-left">' + title + "</h2>";
var allowBottomPadding = true;
if (enableScrollX()) {
allowBottomPadding = false;
html += '<div is="emby-itemscontainer" class="itemsContainer hiddenScrollX padded-left padded-right">';
} else {
html += '<div is="emby-itemscontainer" class="itemsContainer vertical-wrap padded-left padded-right">';
}
html += cardBuilder.getCardsHtml(recommendation.Items, {
shape: getPortraitShape(),
scalable: !0,
overlayPlayButton: !0,
scalable: true,
overlayPlayButton: true,
allowBottomPadding: allowBottomPadding
}), html += "</div>", html += "</div>"
});
html += "</div>";
html += "</div>";
return html;
}
function loadSuggestions(page, userId, parentId) {
var screenWidth = dom.getWindowSize().innerWidth,
url = ApiClient.getUrl("Movies/Recommendations", {
userId: userId,
categoryLimit: 6,
ItemLimit: screenWidth >= 1920 ? 8 : screenWidth >= 1600 ? 8 : screenWidth >= 1200 ? 6 : 5,
Fields: "PrimaryImageAspectRatio,MediaSourceCount,BasicSyncInfo",
ImageTypeLimit: 1,
EnableImageTypes: "Primary,Backdrop,Banner,Thumb"
});
ApiClient.getJSON(url).then(function(recommendations) {
if (!recommendations.length) return page.querySelector(".noItemsMessage").classList.remove("hide"), void(page.querySelector(".recommendations").innerHTML = "");
var screenWidth = dom.getWindowSize().innerWidth;
var url = ApiClient.getUrl("Movies/Recommendations", {
userId: userId,
categoryLimit: 6,
ItemLimit: screenWidth >= 1920 ? 8 : screenWidth >= 1600 ? 8 : screenWidth >= 1200 ? 6 : 5,
Fields: "PrimaryImageAspectRatio,MediaSourceCount,BasicSyncInfo",
ImageTypeLimit: 1,
EnableImageTypes: "Primary,Backdrop,Banner,Thumb"
});
ApiClient.getJSON(url).then(function (recommendations) {
if (!recommendations.length) {
page.querySelector(".noItemsMessage").classList.remove("hide");
page.querySelector(".recommendations").innerHTML = "";
return;
}
var html = recommendations.map(getRecommendationHtml).join("");
page.querySelector(".noItemsMessage").classList.add("hide");
var recs = page.querySelector(".recommendations");
recs.innerHTML = html, imageLoader.lazyChildren(recs)
})
recs.innerHTML = html;
imageLoader.lazyChildren(recs);
});
}
function setScrollClasses(elem, scrollX) {
scrollX ? (elem.classList.add("hiddenScrollX"), layoutManager.tv && elem.classList.add("smoothScrollX"), elem.classList.add("scrollX"), elem.classList.remove("vertical-wrap")) : (elem.classList.remove("hiddenScrollX"), elem.classList.remove("smoothScrollX"), elem.classList.remove("scrollX"), elem.classList.add("vertical-wrap"))
if (scrollX) {
elem.classList.add("hiddenScrollX");
if (layoutManager.tv) {
elem.classList.add("smoothScrollX");
}
elem.classList.add("scrollX");
elem.classList.remove("vertical-wrap");
} else {
elem.classList.remove("hiddenScrollX");
elem.classList.remove("smoothScrollX");
elem.classList.remove("scrollX");
elem.classList.add("vertical-wrap");
}
}
function initSuggestedTab(page, tabContent) {
for (var containers = tabContent.querySelectorAll(".itemsContainer"), i = 0, length = containers.length; i < length; i++) setScrollClasses(containers[i], enableScrollX())
var containers = tabContent.querySelectorAll(".itemsContainer");
for (var i = 0, length = containers.length; i < length; i++) {
setScrollClasses(containers[i], enableScrollX());
}
}
function loadSuggestionsTab(view, params, tabContent) {
var parentId = params.topParentId,
userId = ApiClient.getCurrentUserId();
console.log("loadSuggestionsTab"), loadResume(tabContent, userId, parentId), loadLatest(tabContent, userId, parentId), loadSuggestions(tabContent, userId, parentId)
var parentId = params.topParentId;
var userId = ApiClient.getCurrentUserId();
console.log("loadSuggestionsTab");
loadResume(tabContent, userId, parentId);
loadLatest(tabContent, userId, parentId);
loadSuggestions(tabContent, userId, parentId);
}
function getTabs() {
@ -151,126 +201,196 @@ define(["events", "layoutManager", "inputManager", "userSettings", "libraryMenu"
}, {
name: Globalize.translate("ButtonSearch"),
cssClass: "searchTabButton"
}]
}];
}
function getDefaultTabIndex(folderId) {
switch (userSettings.get("landing-" + folderId)) {
case "suggestions":
return 1;
case "favorites":
return 3;
case "collections":
return 4;
case "genres":
return 5;
default:
return 0
return 0;
}
}
return function(view, params) {
return function (view, params) {
function onBeforeTabChange(e) {
preLoadTab(view, parseInt(e.detail.selectedTabIndex))
preLoadTab(view, parseInt(e.detail.selectedTabIndex));
}
function onTabChange(e) {
var newIndex = parseInt(e.detail.selectedTabIndex);
loadTab(view, newIndex)
loadTab(view, newIndex);
}
function getTabContainers() {
return view.querySelectorAll(".pageTabContent")
return view.querySelectorAll(".pageTabContent");
}
function initTabs() {
mainTabsManager.setTabs(view, currentTabIndex, getTabs, getTabContainers, onBeforeTabChange, onTabChange)
mainTabsManager.setTabs(view, currentTabIndex, getTabs, getTabContainers, onBeforeTabChange, onTabChange);
}
function getTabController(page, index, callback) {
var depends = [];
switch (index) {
case 0:
depends.push("controllers/movies/movies");
break;
case 1:
break;
case 2:
depends.push("controllers/movies/movietrailers");
break;
case 3:
depends.push("controllers/movies/movies");
break;
case 4:
depends.push("controllers/movies/moviecollections");
break;
case 5:
depends.push("controllers/movies/moviegenres");
break;
case 6:
depends.push("scripts/searchtab")
depends.push("scripts/searchtab");
}
require(depends, function(controllerFactory) {
require(depends, function (controllerFactory) {
var tabContent;
index === suggestionsTabIndex && (tabContent = view.querySelector(".pageTabContent[data-index='" + index + "']"), self.tabContent = tabContent);
if (index === suggestionsTabIndex) {
tabContent = view.querySelector(".pageTabContent[data-index='" + index + "']");
self.tabContent = tabContent;
}
var controller = tabControllers[index];
controller || (tabContent = view.querySelector(".pageTabContent[data-index='" + index + "']"), controller = index === suggestionsTabIndex ? self : 6 === index ? new controllerFactory(view, tabContent, {
collectionType: "movies",
parentId: params.topParentId
}) : 0 === index || 3 === index ? new controllerFactory(view, params, tabContent, {
mode: index ? "favorites" : "movies"
}) : new controllerFactory(view, params, tabContent), tabControllers[index] = controller, controller.initTab && controller.initTab()), callback(controller)
})
if (!controller) {
tabContent = view.querySelector(".pageTabContent[data-index='" + index + "']");
if (index === suggestionsTabIndex) {
controller = self;
} else if (index === 6) {
controller = new controllerFactory(view, tabContent, {
collectionType: "movies",
parentId: params.topParentId
});
} else if (index == 0 || index == 3) {
controller = new controllerFactory(view, params, tabContent, {
mode: index ? "favorites" : "movies"
});
} else {
controller = new controllerFactory(view, params, tabContent);
}
tabControllers[index] = controller;
if (controller.initTab) {
controller.initTab();
}
}
callback(controller);
});
}
function preLoadTab(page, index) {
getTabController(page, index, function(controller) {
-1 == renderedTabs.indexOf(index) && controller.preRender && controller.preRender()
})
getTabController(page, index, function (controller) {
if (renderedTabs.indexOf(index) == -1 && controller.preRender) {
controller.preRender();
}
});
}
function loadTab(page, index) {
currentTabIndex = index, getTabController(page, index, function(controller) {
initialTabIndex = null, -1 == renderedTabs.indexOf(index) && (renderedTabs.push(index), controller.renderTab())
})
currentTabIndex = index;
getTabController(page, index, function (controller) {
initialTabIndex = null;
if (renderedTabs.indexOf(index) == -1) {
renderedTabs.push(index);
controller.renderTab();
}
});
}
function onPlaybackStop(e, state) {
state.NowPlayingItem && "Video" == state.NowPlayingItem.MediaType && (renderedTabs = [], mainTabsManager.getTabsElement().triggerTabChange())
if (state.NowPlayingItem && state.NowPlayingItem.MediaType == "Video") {
renderedTabs = [];
mainTabsManager.getTabsElement().triggerTabChange();
}
}
function onInputCommand(e) {
switch (e.detail.command) {
case "search":
e.preventDefault(), Dashboard.navigate("search.html?collectionType=movies&parentId=" + params.topParentId)
e.preventDefault();
Dashboard.navigate("search.html?collectionType=movies&parentId=" + params.topParentId);
}
}
var isViewRestored, self = this,
currentTabIndex = parseInt(params.tab || getDefaultTabIndex(params.topParentId)),
initialTabIndex = currentTabIndex,
suggestionsTabIndex = 1;
self.initTab = function() {
var isViewRestored;
var self = this;
var currentTabIndex = parseInt(params.tab || getDefaultTabIndex(params.topParentId));
var initialTabIndex = currentTabIndex;
var suggestionsTabIndex = 1;
self.initTab = function () {
var tabContent = view.querySelector(".pageTabContent[data-index='" + suggestionsTabIndex + "']");
initSuggestedTab(view, tabContent);
}, self.renderTab = function() {
var tabContent = view.querySelector(".pageTabContent[data-index='" + suggestionsTabIndex + "']");
loadSuggestionsTab(view, params, tabContent)
};
var tabControllers = [],
renderedTabs = [];
view.addEventListener("viewshow", function(e) {
self.renderTab = function () {
var tabContent = view.querySelector(".pageTabContent[data-index='" + suggestionsTabIndex + "']");
loadSuggestionsTab(view, params, tabContent);
};
var tabControllers = [];
var renderedTabs = [];
view.addEventListener("viewshow", function (e) {
if (isViewRestored = e.detail.isRestored, initTabs(), !view.getAttribute("data-title")) {
var parentId = params.topParentId;
parentId ? ApiClient.getItem(ApiClient.getCurrentUserId(), parentId).then(function(item) {
view.setAttribute("data-title", item.Name), libraryMenu.setTitle(item.Name)
}) : (view.setAttribute("data-title", Globalize.translate("TabMovies")), libraryMenu.setTitle(Globalize.translate("TabMovies")))
if (parentId) {
ApiClient.getItem(ApiClient.getCurrentUserId(), parentId).then(function (item) {
view.setAttribute("data-title", item.Name);
libraryMenu.setTitle(item.Name);
});
} else {
view.setAttribute("data-title", Globalize.translate("TabMovies"));
libraryMenu.setTitle(Globalize.translate("TabMovies"));
}
}
events.on(playbackManager, "playbackstop", onPlaybackStop), inputManager.on(window, onInputCommand)
}), view.addEventListener("viewbeforehide", function(e) {
inputManager.off(window, onInputCommand)
}), view.addEventListener("viewdestroy", function(e) {
tabControllers.forEach(function(t) {
t.destroy && t.destroy()
})
})
}
});
events.on(playbackManager, "playbackstop", onPlaybackStop);
inputManager.on(window, onInputCommand);
});
view.addEventListener("viewbeforehide", function (e) {
inputManager.off(window, onInputCommand);
});
view.addEventListener("viewdestroy", function (e) {
tabControllers.forEach(function (t) {
if (t.destroy) {
t.destroy();
}
});
});
};
});

View file

@ -1,185 +1,261 @@
define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", "alphaPicker", "listView", "cardBuilder", "apphost", "emby-itemscontainer"], function(layoutManager, loading, events, libraryBrowser, imageLoader, alphaPicker, listView, cardBuilder, appHost) {
define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", "alphaPicker", "listView", "cardBuilder", "apphost", "emby-itemscontainer"], function (layoutManager, loading, events, libraryBrowser, imageLoader, alphaPicker, listView, cardBuilder, appHost) {
"use strict";
return function(view, params, tabContent) {
return function (view, params, tabContent) {
function getPageData(context) {
var key = getSavedQueryKey(context),
pageData = data[key];
return pageData || (pageData = data[key] = {
query: {
SortBy: "SortName",
SortOrder: "Ascending",
IncludeItemTypes: "Trailer",
Recursive: !0,
Fields: "PrimaryImageAspectRatio,SortName,BasicSyncInfo",
ImageTypeLimit: 1,
EnableImageTypes: "Primary,Backdrop,Banner,Thumb",
StartIndex: 0,
Limit: pageSize
},
view: libraryBrowser.getSavedView(key) || "Poster"
}, libraryBrowser.loadSavedQueryValues(key, pageData.query)), pageData
var key = getSavedQueryKey(context);
var pageData = data[key];
if (!pageData) {
pageData = data[key] = {
query: {
SortBy: "SortName",
SortOrder: "Ascending",
IncludeItemTypes: "Trailer",
Recursive: true,
Fields: "PrimaryImageAspectRatio,SortName,BasicSyncInfo",
ImageTypeLimit: 1,
EnableImageTypes: "Primary,Backdrop,Banner,Thumb",
StartIndex: 0,
Limit: pageSize
},
view: libraryBrowser.getSavedView(key) || "Poster"
};
libraryBrowser.loadSavedQueryValues(key, pageData.query);
}
return pageData;
}
function getQuery(context) {
return getPageData(context).query
return getPageData(context).query;
}
function getSavedQueryKey(context) {
return context.savedQueryKey || (context.savedQueryKey = libraryBrowser.getSavedQueryKey("trailers")), context.savedQueryKey
if (!context.savedQueryKey) {
context.savedQueryKey = libraryBrowser.getSavedQueryKey("trailers");
}
return context.savedQueryKey;
}
function reloadItems() {
loading.show();
isLoading = true;
var query = getQuery(tabContent);
ApiClient.getItems(ApiClient.getCurrentUserId(), query).then(function(result) {
ApiClient.getItems(ApiClient.getCurrentUserId(), query).then(function (result) {
function onNextPageClick() {
if (isLoading) return;
query.StartIndex += query.Limit, reloadItems()
if (isLoading) {
return;
}
query.StartIndex += query.Limit;
reloadItems();
}
function onPreviousPageClick() {
if (isLoading) return;
query.StartIndex -= query.Limit, reloadItems()
if (isLoading) {
return;
}
query.StartIndex -= query.Limit;
reloadItems();
}
window.scrollTo(0, 0), updateFilterControls(tabContent);
var html, pagingHtml = libraryBrowser.getQueryPagingHtml({
startIndex: query.StartIndex,
limit: query.Limit,
totalRecordCount: result.TotalRecordCount,
showLimit: !1,
updatePageSizeSetting: !1,
addLayoutButton: !1,
sortButton: !1,
filterButton: !1
}),
viewStyle = self.getCurrentViewStyle();
html = "Thumb" == viewStyle ? cardBuilder.getCardsHtml({
items: result.Items,
shape: "backdrop",
preferThumb: !0,
context: "movies",
overlayPlayButton: !0
}) : "ThumbCard" == viewStyle ? cardBuilder.getCardsHtml({
items: result.Items,
shape: "backdrop",
preferThumb: !0,
context: "movies",
cardLayout: !0,
showTitle: !0,
showYear: !0,
centerText: !0
}) : "Banner" == viewStyle ? cardBuilder.getCardsHtml({
items: result.Items,
shape: "banner",
preferBanner: !0,
context: "movies"
}) : "List" == viewStyle ? listView.getListViewHtml({
items: result.Items,
context: "movies",
sortBy: query.SortBy
}) : "PosterCard" == viewStyle ? cardBuilder.getCardsHtml({
items: result.Items,
shape: "portrait",
context: "movies",
showTitle: !0,
showYear: !0,
centerText: !0,
cardLayout: !0
}) : cardBuilder.getCardsHtml({
items: result.Items,
shape: "portrait",
context: "movies",
centerText: !0,
overlayPlayButton: !0,
showTitle: !0,
showYear: !0
window.scrollTo(0, 0);
updateFilterControls(tabContent);
var pagingHtml = libraryBrowser.getQueryPagingHtml({
startIndex: query.StartIndex,
limit: query.Limit,
totalRecordCount: result.TotalRecordCount,
showLimit: false,
updatePageSizeSetting: false,
addLayoutButton: false,
sortButton: false,
filterButton: false
});
var i, length, elems = tabContent.querySelectorAll(".paging");
for (i = 0, length = elems.length; i < length; i++) elems[i].innerHTML = pagingHtml;
for (elems = tabContent.querySelectorAll(".btnNextPage"), i = 0, length = elems.length; i < length; i++) elems[i].addEventListener("click", onNextPageClick);
for (elems = tabContent.querySelectorAll(".btnPreviousPage"), i = 0, length = elems.length; i < length; i++) elems[i].addEventListener("click", onPreviousPageClick);
result.Items.length || (html = '<p style="text-align:center;">' + Globalize.translate("MessageNoTrailersFound") + "</p>");
var html;
var viewStyle = self.getCurrentViewStyle();
if (viewStyle == "Thumb") {
html = cardBuilder.getCardsHtml({
items: result.Items,
shape: "backdrop",
preferThumb: true,
context: "movies",
overlayPlayButton: true
});
} else if (viewStyle == "ThumbCard") {
html = cardBuilder.getCardsHtml({
items: result.Items,
shape: "backdrop",
preferThumb: true,
context: "movies",
cardLayout: true,
showTitle: true,
showYear: true,
centerText: true
});
} else if (viewStyle == "Banner") {
html = cardBuilder.getCardsHtml({
items: result.Items,
shape: "banner",
preferBanner: true,
context: "movies"
});
} else if (viewStyle == "List") {
html = listView.getListViewHtml({
items: result.Items,
context: "movies",
sortBy: query.SortBy
});
} else if (viewStyle == "PosterCard") {
html = cardBuilder.getCardsHtml({
items: result.Items,
shape: "portrait",
context: "movies",
showTitle: true,
showYear: true,
cardLayout: true,
centerText: true
});
} else {
html = cardBuilder.getCardsHtml({
items: result.Items,
shape: "portrait",
context: "movies",
centerText: true,
overlayPlayButton: true,
showTitle: true,
showYear: true
});
}
var i;
var length;
var elems = tabContent.querySelectorAll(".paging");
for (i = 0, length = elems.length; i < length; i++) {
elems[i].innerHTML = pagingHtml;
}
elems = tabContent.querySelectorAll(".btnNextPage");
for (i = 0, length = elems.length; i < length; i++) {
elems[i].addEventListener("click", onNextPageClick);
}
elems = tabContent.querySelectorAll(".btnPreviousPage");
for (i = 0, length = elems.length; i < length; i++) {
elems[i].addEventListener("click", onPreviousPageClick);
}
if (!result.Items.length) {
html = '<p style="text-align:center;">' + Globalize.translate("MessageNoTrailersFound") + "</p>";
}
var itemsContainer = tabContent.querySelector(".itemsContainer");
itemsContainer.innerHTML = html;
imageLoader.lazyChildren(itemsContainer);
libraryBrowser.saveQueryValues(getSavedQueryKey(tabContent), query);
loading.hide();
isLoading = false;
})
});
}
function updateFilterControls(tabContent) {
var query = getQuery(tabContent);
self.alphaPicker.value(query.NameStartsWithOrGreater)
self.alphaPicker.value(query.NameStartsWithOrGreater);
}
var self = this,
pageSize = 100,
data = {},
isLoading = false;
self.showFilterMenu = function() {
require(["components/filterdialog/filterdialog"], function(filterDialogFactory) {
var filterDialog = new filterDialogFactory({
query: getQuery(tabContent),
mode: "movies",
serverId: ApiClient.serverId()
});
events.on(filterDialog, "filterchange", function() {
getQuery(tabContent).StartIndex = 0, reloadItems()
}), filterDialog.show()
})
}, self.getCurrentViewStyle = function() {
return getPageData(tabContent).view
},
function(tabContent) {
var alphaPickerElement = tabContent.querySelector(".alphaPicker");
if (alphaPickerElement.addEventListener("alphavaluechanged", function(e) {
var newValue = e.detail.value,
query = getQuery(tabContent);
query.NameStartsWithOrGreater = newValue, query.StartIndex = 0, reloadItems()
}), self.alphaPicker = new alphaPicker({
element: alphaPickerElement,
valueChangeEvent: "click"
}), layoutManager.desktop || layoutManager.mobile) {
tabContent.querySelector(".alphaPicker").classList.add("alphabetPicker-right");
var itemsContainer = tabContent.querySelector(".itemsContainer");
itemsContainer.classList.remove("padded-left-withalphapicker"), itemsContainer.classList.add("padded-right-withalphapicker")
}
tabContent.querySelector(".btnFilter").addEventListener("click", function() {
self.showFilterMenu()
}), tabContent.querySelector(".btnSort").addEventListener("click", function(e) {
libraryBrowser.showSortMenu({
items: [{
name: Globalize.translate("OptionNameSort"),
id: "SortName"
}, {
name: Globalize.translate("OptionImdbRating"),
id: "CommunityRating,SortName"
}, {
name: Globalize.translate("OptionDateAdded"),
id: "DateCreated,SortName"
}, {
name: Globalize.translate("OptionDatePlayed"),
id: "DatePlayed,SortName"
}, {
name: Globalize.translate("OptionParentalRating"),
id: "OfficialRating,SortName"
}, {
name: Globalize.translate("OptionPlayCount"),
id: "PlayCount,SortName"
}, {
name: Globalize.translate("OptionReleaseDate"),
id: "PremiereDate,SortName"
}],
callback: function() {
getQuery(tabContent).StartIndex = 0, reloadItems()
},
query: getQuery(tabContent),
button: e.target
})
})
}(tabContent), self.renderTab = function() {
reloadItems(), updateFilterControls(tabContent)
}, self.destroy = function() {}
}
var self = this;
var pageSize = 100;
var data = {};
var isLoading = false;
self.showFilterMenu = function () {
require(["components/filterdialog/filterdialog"], function (filterDialogFactory) {
var filterDialog = new filterDialogFactory({
query: getQuery(tabContent),
mode: "movies",
serverId: ApiClient.serverId()
});
events.on(filterDialog, "filterchange", function () {
getQuery(tabContent).StartIndex = 0;
reloadItems();
});
filterDialog.show();
});
};
self.getCurrentViewStyle = function () {
return getPageData(tabContent).view;
};
function initPage(tabContent) {
var alphaPickerElement = tabContent.querySelector(".alphaPicker");
alphaPickerElement.addEventListener("alphavaluechanged", function (e) {
var newValue = e.detail.value;
var query = getQuery(tabContent);
query.NameStartsWithOrGreater = newValue;
query.StartIndex = 0;
reloadItems();
});
self.alphaPicker = new alphaPicker({
element: alphaPickerElement,
valueChangeEvent: "click"
});
if (layoutManager.desktop || layoutManager.mobile) {
tabContent.querySelector(".alphaPicker").classList.add("alphabetPicker-right");
var itemsContainer = tabContent.querySelector(".itemsContainer");
itemsContainer.classList.remove("padded-left-withalphapicker");
itemsContainer.classList.add("padded-right-withalphapicker");
}
tabContent.querySelector(".btnFilter").addEventListener("click", function () {
self.showFilterMenu();
});
tabContent.querySelector(".btnSort").addEventListener("click", function (e) {
libraryBrowser.showSortMenu({
items: [{
name: Globalize.translate("OptionNameSort"),
id: "SortName"
}, {
name: Globalize.translate("OptionImdbRating"),
id: "CommunityRating,SortName"
}, {
name: Globalize.translate("OptionDateAdded"),
id: "DateCreated,SortName"
}, {
name: Globalize.translate("OptionDatePlayed"),
id: "DatePlayed,SortName"
}, {
name: Globalize.translate("OptionParentalRating"),
id: "OfficialRating,SortName"
}, {
name: Globalize.translate("OptionPlayCount"),
id: "PlayCount,SortName"
}, {
name: Globalize.translate("OptionReleaseDate"),
id: "PremiereDate,SortName"
}],
callback: function () {
getQuery(tabContent).StartIndex = 0;
reloadItems();
},
query: getQuery(tabContent),
button: e.target
});
});
}
initPage(tabContent);
self.renderTab = function () {
reloadItems();
updateFilterControls(tabContent);
};
self.destroy = function () {};
};
});

View file

@ -1,190 +1,275 @@
define(["layoutManager", "playbackManager", "loading", "events", "libraryBrowser", "imageLoader", "alphaPicker", "listView", "cardBuilder", "apphost", "emby-itemscontainer"], function(layoutManager, playbackManager, loading, events, libraryBrowser, imageLoader, alphaPicker, listView, cardBuilder, appHost) {
define(["layoutManager", "playbackManager", "loading", "events", "libraryBrowser", "imageLoader", "alphaPicker", "listView", "cardBuilder", "apphost", "emby-itemscontainer"], function (layoutManager, playbackManager, loading, events, libraryBrowser, imageLoader, alphaPicker, listView, cardBuilder, appHost) {
"use strict";
return function(view, params, tabContent) {
return function (view, params, tabContent) {
function playAll() {
ApiClient.getItem(ApiClient.getCurrentUserId(), params.topParentId).then(function(item) {
ApiClient.getItem(ApiClient.getCurrentUserId(), params.topParentId).then(function (item) {
playbackManager.play({
items: [item]
})
})
});
});
}
function shuffle() {
ApiClient.getItem(ApiClient.getCurrentUserId(), params.topParentId).then(function(item) {
ApiClient.getItem(ApiClient.getCurrentUserId(), params.topParentId).then(function (item) {
getQuery();
playbackManager.shuffle(item, null)
})
playbackManager.shuffle(item, null);
});
}
function getPageData() {
var key = getSavedQueryKey();
return pageData || (pageData = {
query: {
SortBy: "SortName",
SortOrder: "Ascending",
IncludeItemTypes: "MusicAlbum",
Recursive: !0,
Fields: "PrimaryImageAspectRatio,SortName,BasicSyncInfo",
ImageTypeLimit: 1,
EnableImageTypes: "Primary,Backdrop,Banner,Thumb",
StartIndex: 0,
Limit: pageSize
},
view: libraryBrowser.getSavedView(key) || "Poster"
}, pageData.query.ParentId = params.topParentId, libraryBrowser.loadSavedQueryValues(key, pageData.query)), pageData
if (!pageData) {
pageData = {
query: {
SortBy: "SortName",
SortOrder: "Ascending",
IncludeItemTypes: "MusicAlbum",
Recursive: true,
Fields: "PrimaryImageAspectRatio,SortName,BasicSyncInfo",
ImageTypeLimit: 1,
EnableImageTypes: "Primary,Backdrop,Banner,Thumb",
StartIndex: 0,
Limit: pageSize
},
view: libraryBrowser.getSavedView(key) || "Poster"
};
pageData.query.ParentId = params.topParentId;
libraryBrowser.loadSavedQueryValues(key, pageData.query);
}
return pageData;
}
function getQuery() {
return getPageData().query
return getPageData().query;
}
function getSavedQueryKey() {
return savedQueryKey || (savedQueryKey = libraryBrowser.getSavedQueryKey("musicalbums")), savedQueryKey
if (!savedQueryKey) {
savedQueryKey = libraryBrowser.getSavedQueryKey("musicalbums");
}
return savedQueryKey;
}
function onViewStyleChange() {
var viewStyle = self.getCurrentViewStyle(),
itemsContainer = tabContent.querySelector(".itemsContainer");
"List" == viewStyle ? (itemsContainer.classList.add("vertical-list"), itemsContainer.classList.remove("vertical-wrap")) : (itemsContainer.classList.remove("vertical-list"), itemsContainer.classList.add("vertical-wrap")), itemsContainer.innerHTML = ""
var viewStyle = self.getCurrentViewStyle();
var itemsContainer = tabContent.querySelector(".itemsContainer");
if ("List" == viewStyle) {
itemsContainer.classList.add("vertical-list");
itemsContainer.classList.remove("vertical-wrap");
} else {
itemsContainer.classList.remove("vertical-list");
itemsContainer.classList.add("vertical-wrap");
}
itemsContainer.innerHTML = "";
}
function reloadItems(page) {
loading.show();
isLoading = true;
var query = getQuery();
ApiClient.getItems(ApiClient.getCurrentUserId(), query).then(function(result) {
ApiClient.getItems(ApiClient.getCurrentUserId(), query).then(function (result) {
function onNextPageClick() {
if (isLoading) return;
query.StartIndex += query.Limit, reloadItems(tabContent)
if (isLoading) {
return;
}
query.StartIndex += query.Limit;
reloadItems(tabContent);
}
function onPreviousPageClick() {
if (isLoading) return;
query.StartIndex -= query.Limit, reloadItems(tabContent)
if (isLoading) {
return;
}
query.StartIndex -= query.Limit;
reloadItems(tabContent);
}
window.scrollTo(0, 0), updateFilterControls(page);
var html, pagingHtml = libraryBrowser.getQueryPagingHtml({
startIndex: query.StartIndex,
limit: query.Limit,
totalRecordCount: result.TotalRecordCount,
showLimit: !1,
updatePageSizeSetting: !1,
addLayoutButton: !1,
sortButton: !1,
filterButton: !1
}),
viewStyle = self.getCurrentViewStyle();
html = "List" == viewStyle ? listView.getListViewHtml({
items: result.Items,
context: "music",
sortBy: query.SortBy,
addToListButton: !0
}) : "PosterCard" == viewStyle ? cardBuilder.getCardsHtml({
items: result.Items,
shape: "square",
context: "music",
showTitle: !0,
coverImage: !0,
showParentTitle: !0,
lazy: !0,
cardLayout: !0
}) : cardBuilder.getCardsHtml({
items: result.Items,
shape: "square",
context: "music",
showTitle: !0,
showParentTitle: !0,
lazy: !0,
centerText: !0,
overlayPlayButton: !0
window.scrollTo(0, 0);
updateFilterControls(page);
var html;
var pagingHtml = libraryBrowser.getQueryPagingHtml({
startIndex: query.StartIndex,
limit: query.Limit,
totalRecordCount: result.TotalRecordCount,
showLimit: false,
updatePageSizeSetting: false,
addLayoutButton: false,
sortButton: false,
filterButton: false
});
var i, length, elems = tabContent.querySelectorAll(".paging");
for (i = 0, length = elems.length; i < length; i++) elems[i].innerHTML = pagingHtml;
for (elems = tabContent.querySelectorAll(".btnNextPage"), i = 0, length = elems.length; i < length; i++) elems[i].addEventListener("click", onNextPageClick);
for (elems = tabContent.querySelectorAll(".btnPreviousPage"), i = 0, length = elems.length; i < length; i++) elems[i].addEventListener("click", onPreviousPageClick);
var viewStyle = self.getCurrentViewStyle();
if (viewStyle == "List") {
html = listView.getListViewHtml({
items: result.Items,
context: "music",
sortBy: query.SortBy,
addToListButton: true
});
} else if (viewStyle == "PosterCard") {
html = cardBuilder.getCardsHtml({
items: result.Items,
shape: "square",
context: "music",
showTitle: true,
coverImage: true,
showParentTitle: true,
lazy: true,
cardLayout: true
});
} else {
html = cardBuilder.getCardsHtml({
items: result.Items,
shape: "square",
context: "music",
showTitle: true,
showParentTitle: true,
lazy: true,
centerText: true,
overlayPlayButton: true
});
}
var i;
var length;
var elems = tabContent.querySelectorAll(".paging");
for (i = 0, length = elems.length; i < length; i++) {
elems[i].innerHTML = pagingHtml;
}
elems = tabContent.querySelectorAll(".btnNextPage");
for (i = 0, length = elems.length; i < length; i++) {
elems[i].addEventListener("click", onNextPageClick);
}
elems = tabContent.querySelectorAll(".btnPreviousPage");
for (i = 0, length = elems.length; i < length; i++) {
elems[i].addEventListener("click", onPreviousPageClick);
}
var itemsContainer = tabContent.querySelector(".itemsContainer");
itemsContainer.innerHTML = html;
imageLoader.lazyChildren(itemsContainer);
libraryBrowser.saveQueryValues(getSavedQueryKey(), query);
loading.hide();
isLoading = false;
})
});
}
function updateFilterControls(tabContent) {
var query = getQuery();
self.alphaPicker.value(query.NameStartsWithOrGreater)
self.alphaPicker.value(query.NameStartsWithOrGreater);
}
var savedQueryKey, pageData, self = this,
pageSize = 100,
isLoading = false;
self.showFilterMenu = function() {
require(["components/filterdialog/filterdialog"], function(filterDialogFactory) {
var filterDialog = new filterDialogFactory({
query: getQuery(),
mode: "albums",
serverId: ApiClient.serverId()
});
events.on(filterDialog, "filterchange", function() {
getQuery().StartIndex = 0, reloadItems(tabContent)
}), filterDialog.show()
})
}, self.getCurrentViewStyle = function() {
return getPageData().view
},
function(tabContent) {
var alphaPickerElement = tabContent.querySelector(".alphaPicker");
if (alphaPickerElement.addEventListener("alphavaluechanged", function(e) {
var newValue = e.detail.value,
query = getQuery();
query.NameStartsWithOrGreater = newValue, query.StartIndex = 0, reloadItems(tabContent)
}), self.alphaPicker = new alphaPicker({
element: alphaPickerElement,
valueChangeEvent: "click"
}), layoutManager.desktop || layoutManager.mobile) {
tabContent.querySelector(".alphaPicker").classList.add("alphabetPicker-right");
var itemsContainer = tabContent.querySelector(".itemsContainer");
itemsContainer.classList.remove("padded-left-withalphapicker"), itemsContainer.classList.add("padded-right-withalphapicker")
}
tabContent.querySelector(".btnFilter").addEventListener("click", function() {
self.showFilterMenu()
}), tabContent.querySelector(".btnSort").addEventListener("click", function(e) {
libraryBrowser.showSortMenu({
items: [{
name: Globalize.translate("OptionNameSort"),
id: "SortName"
}, {
name: Globalize.translate("OptionAlbumArtist"),
id: "AlbumArtist,SortName"
}, {
name: Globalize.translate("OptionCommunityRating"),
id: "CommunityRating,SortName"
}, {
name: Globalize.translate("OptionCriticRating"),
id: "CriticRating,SortName"
}, {
name: Globalize.translate("OptionDateAdded"),
id: "DateCreated,SortName"
}, {
name: Globalize.translate("OptionReleaseDate"),
id: "ProductionYear,PremiereDate,SortName"
}],
callback: function() {
getQuery().StartIndex = 0, reloadItems(tabContent)
},
query: getQuery(),
button: e.target
})
var savedQueryKey;
var pageData;
var self = this;
var pageSize = 100;
var isLoading = false;
self.showFilterMenu = function () {
require(["components/filterdialog/filterdialog"], function (filterDialogFactory) {
var filterDialog = new filterDialogFactory({
query: getQuery(),
mode: "albums",
serverId: ApiClient.serverId()
});
var btnSelectView = tabContent.querySelector(".btnSelectView");
btnSelectView.addEventListener("click", function(e) {
libraryBrowser.showLayoutMenu(e.target, self.getCurrentViewStyle(), "List,Poster,PosterCard".split(","))
}), btnSelectView.addEventListener("layoutchange", function(e) {
var viewStyle = e.detail.viewStyle;
getPageData().view = viewStyle, libraryBrowser.saveViewSetting(getSavedQueryKey(), viewStyle), getQuery().StartIndex = 0, onViewStyleChange(), reloadItems(tabContent)
}), tabContent.querySelector(".btnPlayAll").addEventListener("click", playAll), tabContent.querySelector(".btnShuffle").addEventListener("click", shuffle)
}(tabContent), onViewStyleChange(), self.renderTab = function() {
reloadItems(tabContent), updateFilterControls(tabContent)
}, self.destroy = function() {}
}
events.on(filterDialog, "filterchange", function () {
getQuery().StartIndex = 0;
reloadItems(tabContent);
});
filterDialog.show();
});
};
self.getCurrentViewStyle = function () {
return getPageData().view;
};
function initPage(tabContent) {
var alphaPickerElement = tabContent.querySelector(".alphaPicker");
alphaPickerElement.addEventListener("alphavaluechanged", function (e) {
var newValue = e.detail.value;
var query = getQuery();
query.NameStartsWithOrGreater = newValue;
query.StartIndex = 0;
reloadItems(tabContent);
});
self.alphaPicker = new alphaPicker({
element: alphaPickerElement,
valueChangeEvent: "click"
});
if (layoutManager.desktop || layoutManager.mobile) {
tabContent.querySelector(".alphaPicker").classList.add("alphabetPicker-right");
var itemsContainer = tabContent.querySelector(".itemsContainer");
itemsContainer.classList.remove("padded-left-withalphapicker");
itemsContainer.classList.add("padded-right-withalphapicker");
}
tabContent.querySelector(".btnFilter").addEventListener("click", function () {
self.showFilterMenu();
});
tabContent.querySelector(".btnSort").addEventListener("click", function (e) {
libraryBrowser.showSortMenu({
items: [{
name: Globalize.translate("OptionNameSort"),
id: "SortName"
}, {
name: Globalize.translate("OptionAlbumArtist"),
id: "AlbumArtist,SortName"
}, {
name: Globalize.translate("OptionCommunityRating"),
id: "CommunityRating,SortName"
}, {
name: Globalize.translate("OptionCriticRating"),
id: "CriticRating,SortName"
}, {
name: Globalize.translate("OptionDateAdded"),
id: "DateCreated,SortName"
}, {
name: Globalize.translate("OptionReleaseDate"),
id: "ProductionYear,PremiereDate,SortName"
}],
callback: function () {
getQuery().StartIndex = 0;
reloadItems(tabContent);
},
query: getQuery(),
button: e.target
});
});
var btnSelectView = tabContent.querySelector(".btnSelectView");
btnSelectView.addEventListener("click", function (e) {
libraryBrowser.showLayoutMenu(e.target, self.getCurrentViewStyle(), "List,Poster,PosterCard".split(","));
});
btnSelectView.addEventListener("layoutchange", function (e) {
var viewStyle = e.detail.viewStyle;
getPageData().view = viewStyle;
libraryBrowser.saveViewSetting(getSavedQueryKey(), viewStyle);
getQuery().StartIndex = 0;
onViewStyleChange();
reloadItems(tabContent);
});
tabContent.querySelector(".btnPlayAll").addEventListener("click", playAll);
tabContent.querySelector(".btnShuffle").addEventListener("click", shuffle);
}
initPage(tabContent);
onViewStyleChange();
self.renderTab = function () {
reloadItems(tabContent);
updateFilterControls(tabContent);
};
self.destroy = function () {};
};
});

View file

@ -1,144 +1,226 @@
define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", "alphaPicker", "listView", "cardBuilder", "apphost", "emby-itemscontainer"], function(layoutManager, loading, events, libraryBrowser, imageLoader, alphaPicker, listView, cardBuilder, appHost) {
define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", "alphaPicker", "listView", "cardBuilder", "apphost", "emby-itemscontainer"], function (layoutManager, loading, events, libraryBrowser, imageLoader, alphaPicker, listView, cardBuilder, appHost) {
"use strict";
return function(view, params, tabContent) {
return function (view, params, tabContent) {
function getPageData(context) {
var key = getSavedQueryKey(context),
pageData = data[key];
return pageData || (pageData = data[key] = {
query: {
SortBy: "SortName",
SortOrder: "Ascending",
Recursive: !0,
Fields: "PrimaryImageAspectRatio,SortName,BasicSyncInfo",
StartIndex: 0,
ImageTypeLimit: 1,
EnableImageTypes: "Primary,Backdrop,Banner,Thumb",
Limit: 100
},
view: libraryBrowser.getSavedView(key) || "Poster"
}, pageData.query.ParentId = params.topParentId, libraryBrowser.loadSavedQueryValues(key, pageData.query)), pageData
var key = getSavedQueryKey(context);
var pageData = data[key];
if (!pageData) {
pageData = data[key] = {
query: {
SortBy: "SortName",
SortOrder: "Ascending",
Recursive: true,
Fields: "PrimaryImageAspectRatio,SortName,BasicSyncInfo",
StartIndex: 0,
ImageTypeLimit: 1,
EnableImageTypes: "Primary,Backdrop,Banner,Thumb",
Limit: 100
},
view: libraryBrowser.getSavedView(key) || "Poster"
};
pageData.query.ParentId = params.topParentId;
libraryBrowser.loadSavedQueryValues(key, pageData.query);
}
return pageData;
}
function getQuery(context) {
return getPageData(context).query
return getPageData(context).query;
}
function getSavedQueryKey(context) {
return context.savedQueryKey || (context.savedQueryKey = libraryBrowser.getSavedQueryKey(self.mode)), context.savedQueryKey
if (!context.savedQueryKey) {
context.savedQueryKey = libraryBrowser.getSavedQueryKey(self.mode);
}
return context.savedQueryKey;
}
function onViewStyleChange() {
var viewStyle = self.getCurrentViewStyle(),
itemsContainer = tabContent.querySelector(".itemsContainer");
"List" == viewStyle ? (itemsContainer.classList.add("vertical-list"), itemsContainer.classList.remove("vertical-wrap")) : (itemsContainer.classList.remove("vertical-list"), itemsContainer.classList.add("vertical-wrap")), itemsContainer.innerHTML = ""
var viewStyle = self.getCurrentViewStyle();
var itemsContainer = tabContent.querySelector(".itemsContainer");
if ("List" == viewStyle) {
itemsContainer.classList.add("vertical-list");
itemsContainer.classList.remove("vertical-wrap");
} else {
itemsContainer.classList.remove("vertical-list");
itemsContainer.classList.add("vertical-wrap");
}
itemsContainer.innerHTML = "";
}
function reloadItems(page) {
loading.show();
isLoading = true;
var query = getQuery(page);
("albumartists" == self.mode ? ApiClient.getAlbumArtists(ApiClient.getCurrentUserId(), query) : ApiClient.getArtists(ApiClient.getCurrentUserId(), query)).then(function(result) {
var promise = self.mode == 'albumartists' ?
ApiClient.getAlbumArtists(ApiClient.getCurrentUserId(), query) :
ApiClient.getArtists(ApiClient.getCurrentUserId(), query);
promise.then(function (result) {
function onNextPageClick() {
if (isLoading) return;
query.StartIndex += query.Limit, reloadItems(tabContent)
if (isLoading) {
return;
}
query.StartIndex += query.Limit;
reloadItems(tabContent);
}
function onPreviousPageClick() {
if (isLoading) return;
query.StartIndex -= query.Limit, reloadItems(tabContent)
if (isLoading) {
return;
}
query.StartIndex -= query.Limit;
reloadItems(tabContent);
}
window.scrollTo(0, 0), updateFilterControls(page);
var html, pagingHtml = libraryBrowser.getQueryPagingHtml({
startIndex: query.StartIndex,
limit: query.Limit,
totalRecordCount: result.TotalRecordCount,
showLimit: !1,
updatePageSizeSetting: !1,
addLayoutButton: !1,
sortButton: !1,
filterButton: !1
}),
viewStyle = self.getCurrentViewStyle();
html = "List" == viewStyle ? listView.getListViewHtml({
items: result.Items,
sortBy: query.SortBy
}) : "PosterCard" == viewStyle ? cardBuilder.getCardsHtml({
items: result.Items,
shape: "square",
context: "music",
showTitle: !0,
coverImage: !0,
cardLayout: !0
}) : cardBuilder.getCardsHtml({
items: result.Items,
shape: "square",
context: "music",
showTitle: !0,
coverImage: !0,
lazy: !0,
centerText: !0,
overlayPlayButton: !0
window.scrollTo(0, 0);
updateFilterControls(page);
var html;
var pagingHtml = libraryBrowser.getQueryPagingHtml({
startIndex: query.StartIndex,
limit: query.Limit,
totalRecordCount: result.TotalRecordCount,
showLimit: false,
updatePageSizeSetting: false,
addLayoutButton: false,
sortButton: false,
filterButton: false
});
var i, length, elems = tabContent.querySelectorAll(".paging");
for (i = 0, length = elems.length; i < length; i++) elems[i].innerHTML = pagingHtml;
for (elems = tabContent.querySelectorAll(".btnNextPage"), i = 0, length = elems.length; i < length; i++) elems[i].addEventListener("click", onNextPageClick);
for (elems = tabContent.querySelectorAll(".btnPreviousPage"), i = 0, length = elems.length; i < length; i++) elems[i].addEventListener("click", onPreviousPageClick);
var viewStyle = self.getCurrentViewStyle();
if (viewStyle == "List") {
html = listView.getListViewHtml({
items: result.Items,
sortBy: query.SortBy
});
} else if (viewStyle == "PosterCard") {
html = cardBuilder.getCardsHtml({
items: result.Items,
shape: "square",
context: "music",
showTitle: true,
coverImage: true,
cardLayout: true
});
} else {
html = cardBuilder.getCardsHtml({
items: result.Items,
shape: "square",
context: "music",
showTitle: true,
coverImage: true,
lazy: true,
centerText: true,
overlayPlayButton: true
});
}
var i;
var length;
var elems = tabContent.querySelectorAll(".paging");
for (i = 0, length = elems.length; i < length; i++) {
elems[i].innerHTML = pagingHtml;
}
elems = tabContent.querySelectorAll(".btnNextPage");
for (i = 0, length = elems.length; i < length; i++) {
elems[i].addEventListener("click", onNextPageClick);
}
elems = tabContent.querySelectorAll(".btnPreviousPage");
for (i = 0, length = elems.length; i < length; i++) {
elems[i].addEventListener("click", onPreviousPageClick);
}
var itemsContainer = tabContent.querySelector(".itemsContainer");
itemsContainer.innerHTML = html;
imageLoader.lazyChildren(itemsContainer);
libraryBrowser.saveQueryValues(getSavedQueryKey(page), query);
loading.hide();
isLoading = false;
})
});
}
function updateFilterControls(tabContent) {
var query = getQuery(tabContent);
self.alphaPicker.value(query.NameStartsWithOrGreater)
self.alphaPicker.value(query.NameStartsWithOrGreater);
}
var self = this,
data = {},
isLoading = false;
self.showFilterMenu = function() {
require(["components/filterdialog/filterdialog"], function(filterDialogFactory) {
var filterDialog = new filterDialogFactory({
query: getQuery(tabContent),
mode: self.mode,
serverId: ApiClient.serverId()
});
events.on(filterDialog, "filterchange", function() {
getQuery(tabContent).StartIndex = 0, reloadItems(tabContent)
}), filterDialog.show()
})
}, self.getCurrentViewStyle = function() {
return getPageData(tabContent).view
},
function(tabContent) {
var alphaPickerElement = tabContent.querySelector(".alphaPicker");
if (alphaPickerElement.addEventListener("alphavaluechanged", function(e) {
var newValue = e.detail.value,
query = getQuery(tabContent);
query.NameStartsWithOrGreater = newValue, query.StartIndex = 0, reloadItems(tabContent)
}), self.alphaPicker = new alphaPicker({
element: alphaPickerElement,
valueChangeEvent: "click"
}), layoutManager.desktop || layoutManager.mobile) {
tabContent.querySelector(".alphaPicker").classList.add("alphabetPicker-right");
var itemsContainer = tabContent.querySelector(".itemsContainer");
itemsContainer.classList.remove("padded-left-withalphapicker"), itemsContainer.classList.add("padded-right-withalphapicker")
}
tabContent.querySelector(".btnFilter").addEventListener("click", function() {
self.showFilterMenu()
var self = this;
var data = {};
var isLoading = false;
self.showFilterMenu = function () {
require(["components/filterdialog/filterdialog"], function (filterDialogFactory) {
var filterDialog = new filterDialogFactory({
query: getQuery(tabContent),
mode: self.mode,
serverId: ApiClient.serverId()
});
var btnSelectView = tabContent.querySelector(".btnSelectView");
btnSelectView.addEventListener("click", function(e) {
libraryBrowser.showLayoutMenu(e.target, self.getCurrentViewStyle(), "List,Poster,PosterCard".split(","))
}), btnSelectView.addEventListener("layoutchange", function(e) {
var viewStyle = e.detail.viewStyle;
getPageData(tabContent).view = viewStyle, libraryBrowser.saveViewSetting(getSavedQueryKey(tabContent), viewStyle), getQuery(tabContent).StartIndex = 0, onViewStyleChange(), reloadItems(tabContent)
})
}(tabContent), onViewStyleChange(), self.renderTab = function() {
reloadItems(tabContent), updateFilterControls(tabContent)
}, self.destroy = function() {}
}
events.on(filterDialog, "filterchange", function () {
getQuery(tabContent).StartIndex = 0;
reloadItems(tabContent);
});
filterDialog.show();
});
};
self.getCurrentViewStyle = function () {
return getPageData(tabContent).view;
};
function initPage(tabContent) {
var alphaPickerElement = tabContent.querySelector(".alphaPicker");
alphaPickerElement.addEventListener("alphavaluechanged", function (e) {
var newValue = e.detail.value;
var query = getQuery(tabContent);
query.NameStartsWithOrGreater = newValue;
query.StartIndex = 0;
reloadItems(tabContent);
});
self.alphaPicker = new alphaPicker({
element: alphaPickerElement,
valueChangeEvent: "click"
});
if (layoutManager.desktop || layoutManager.mobile) {
tabContent.querySelector(".alphaPicker").classList.add("alphabetPicker-right");
var itemsContainer = tabContent.querySelector(".itemsContainer");
itemsContainer.classList.remove("padded-left-withalphapicker");
itemsContainer.classList.add("padded-right-withalphapicker");
}
tabContent.querySelector(".btnFilter").addEventListener("click", function () {
self.showFilterMenu();
});
var btnSelectView = tabContent.querySelector(".btnSelectView");
btnSelectView.addEventListener("click", function (e) {
libraryBrowser.showLayoutMenu(e.target, self.getCurrentViewStyle(), "List,Poster,PosterCard".split(","));
});
btnSelectView.addEventListener("layoutchange", function (e) {
var viewStyle = e.detail.viewStyle;
getPageData(tabContent).view = viewStyle;
libraryBrowser.saveViewSetting(getSavedQueryKey(tabContent), viewStyle);
getQuery(tabContent).StartIndex = 0;
onViewStyleChange();
reloadItems(tabContent);
});
}
initPage(tabContent);
onViewStyleChange();
self.renderTab = function () {
reloadItems(tabContent);
updateFilterControls(tabContent);
};
self.destroy = function () {};
};
});

View file

@ -1,91 +1,126 @@
define(["libraryBrowser", "cardBuilder", "apphost", "imageLoader", "loading"], function(libraryBrowser, cardBuilder, appHost, imageLoader, loading) {
define(["libraryBrowser", "cardBuilder", "apphost", "imageLoader", "loading"], function (libraryBrowser, cardBuilder, appHost, imageLoader, loading) {
"use strict";
return function(view, params, tabContent) {
return function (view, params, tabContent) {
function getPageData() {
var key = getSavedQueryKey(),
pageData = data[key];
return pageData || (pageData = data[key] = {
query: {
SortBy: "SortName",
SortOrder: "Ascending",
Recursive: !0,
Fields: "PrimaryImageAspectRatio,ItemCounts",
StartIndex: 0
},
view: libraryBrowser.getSavedView(key) || "Poster"
}, pageData.query.ParentId = params.topParentId, libraryBrowser.loadSavedQueryValues(key, pageData.query)), pageData
var key = getSavedQueryKey();
var pageData = data[key];
if (!pageData) {
pageData = data[key] = {
query: {
SortBy: "SortName",
SortOrder: "Ascending",
Recursive: true,
Fields: "PrimaryImageAspectRatio,ItemCounts",
StartIndex: 0
},
view: libraryBrowser.getSavedView(key) || "Poster"
};
pageData.query.ParentId = params.topParentId;
libraryBrowser.loadSavedQueryValues(key, pageData.query);
}
return pageData;
}
function getQuery() {
return getPageData().query
return getPageData().query;
}
function getSavedQueryKey() {
return libraryBrowser.getSavedQueryKey("genres")
return libraryBrowser.getSavedQueryKey("genres");
}
function getPromise() {
loading.show();
var query = getQuery();
return ApiClient.getGenres(ApiClient.getCurrentUserId(), query)
return ApiClient.getGenres(ApiClient.getCurrentUserId(), query);
}
function reloadItems(context, promise) {
var query = getQuery();
promise.then(function(result) {
var html = "",
viewStyle = self.getCurrentViewStyle();
"Thumb" == viewStyle ? html = cardBuilder.getCardsHtml({
items: result.Items,
shape: "backdrop",
preferThumb: !0,
context: "music",
centerText: !0,
overlayMoreButton: !0,
showTitle: !0
}) : "ThumbCard" == viewStyle ? html = cardBuilder.getCardsHtml({
items: result.Items,
shape: "backdrop",
preferThumb: !0,
context: "music",
cardLayout: !0,
showTitle: !0
}) : "PosterCard" == viewStyle ? html = cardBuilder.getCardsHtml({
items: result.Items,
shape: "auto",
context: "music",
cardLayout: !0,
showTitle: !0
}) : "Poster" == viewStyle && (html = cardBuilder.getCardsHtml({
items: result.Items,
shape: "auto",
context: "music",
centerText: !0,
overlayMoreButton: !0,
showTitle: !0
}));
promise.then(function (result) {
var html = "";
var viewStyle = self.getCurrentViewStyle();
if (viewStyle == "Thumb") {
html = cardBuilder.getCardsHtml({
items: result.Items,
shape: "backdrop",
preferThumb: true,
context: 'music',
centerText: true,
overlayMoreButton: true,
showTitle: true
});
} else if (viewStyle == "ThumbCard") {
html = cardBuilder.getCardsHtml({
items: result.Items,
shape: "backdrop",
preferThumb: true,
context: 'music',
cardLayout: true,
showTitle: true,
});
} else if (viewStyle == "PosterCard") {
html = cardBuilder.getCardsHtml({
items: result.Items,
shape: "auto",
context: 'music',
cardLayout: true,
showTitle: true,
});
} else if (viewStyle == "Poster") {
html = cardBuilder.getCardsHtml({
items: result.Items,
shape: "auto",
context: 'music',
centerText: true,
overlayMoreButton: true,
showTitle: true
});
}
var elem = context.querySelector("#items");
elem.innerHTML = html, imageLoader.lazyChildren(elem), libraryBrowser.saveQueryValues(getSavedQueryKey(), query), loading.hide()
})
elem.innerHTML = html;
imageLoader.lazyChildren(elem);
libraryBrowser.saveQueryValues(getSavedQueryKey(), query);
loading.hide();
});
}
function fullyReload() {
self.preRender(), self.renderTab()
self.preRender();
self.renderTab();
}
var self = this,
data = {};
self.getViewStyles = function() {
return "Poster,PosterCard,Thumb,ThumbCard".split(",")
}, self.getCurrentViewStyle = function() {
return getPageData(tabContent).view
}, self.setCurrentViewStyle = function(viewStyle) {
getPageData(tabContent).view = viewStyle, libraryBrowser.saveViewSetting(getSavedQueryKey(tabContent), viewStyle), fullyReload()
}, self.enableViewSelection = !0;
var self = this;
var data = {};
self.getViewStyles = function () {
return "Poster,PosterCard,Thumb,ThumbCard".split(",");
};
self.getCurrentViewStyle = function () {
return getPageData(tabContent).view;
};
self.setCurrentViewStyle = function (viewStyle) {
getPageData(tabContent).view = viewStyle;
libraryBrowser.saveViewSetting(getSavedQueryKey(tabContent), viewStyle);
fullyReload();
};
self.enableViewSelection = true;
var promise;
self.preRender = function() {
promise = getPromise()
}, self.renderTab = function() {
reloadItems(tabContent, promise)
}
}
});
self.preRender = function () {
promise = getPromise();
};
self.renderTab = function () {
reloadItems(tabContent, promise);
};
};
});

View file

@ -1,64 +1,81 @@
define(["libraryBrowser", "cardBuilder", "apphost", "imageLoader", "loading"], function(libraryBrowser, cardBuilder, appHost, imageLoader, loading) {
define(["libraryBrowser", "cardBuilder", "apphost", "imageLoader", "loading"], function (libraryBrowser, cardBuilder, appHost, imageLoader, loading) {
"use strict";
return function(view, params, tabContent) {
return function (view, params, tabContent) {
function getPageData() {
var key = getSavedQueryKey(),
pageData = data[key];
return pageData || (pageData = data[key] = {
query: {
SortBy: "SortName",
SortOrder: "Ascending",
IncludeItemTypes: "Playlist",
Recursive: !0,
Fields: "PrimaryImageAspectRatio,SortName,CanDelete",
StartIndex: 0
},
view: libraryBrowser.getSavedView(key) || "Poster"
}, pageData.query.ParentId = params.topParentId, libraryBrowser.loadSavedQueryValues(key, pageData.query)), pageData
var key = getSavedQueryKey();
var pageData = data[key];
if (!pageData) {
pageData = data[key] = {
query: {
SortBy: "SortName",
SortOrder: "Ascending",
IncludeItemTypes: "Playlist",
Recursive: true,
Fields: "PrimaryImageAspectRatio,SortName,CanDelete",
StartIndex: 0
},
view: libraryBrowser.getSavedView(key) || "Poster"
};
pageData.query.ParentId = params.topParentId;
libraryBrowser.loadSavedQueryValues(key, pageData.query);
}
return pageData;
}
function getQuery() {
return getPageData().query
return getPageData().query;
}
function getSavedQueryKey() {
return libraryBrowser.getSavedQueryKey("genres")
return libraryBrowser.getSavedQueryKey("genres");
}
function getPromise() {
loading.show();
var query = getQuery();
return ApiClient.getItems(ApiClient.getCurrentUserId(), query)
return ApiClient.getItems(ApiClient.getCurrentUserId(), query);
}
function reloadItems(context, promise) {
var query = getQuery();
promise.then(function(result) {
promise.then(function (result) {
var html = "";
html = cardBuilder.getCardsHtml({
items: result.Items,
shape: "square",
showTitle: !0,
coverImage: !0,
centerText: !0,
overlayPlayButton: !0,
allowBottomPadding: !0,
cardLayout: !1
showTitle: true,
coverImage: true,
centerText: true,
overlayPlayButton: true,
allowBottomPadding: true,
cardLayout: false
});
var elem = context.querySelector("#items");
elem.innerHTML = html, imageLoader.lazyChildren(elem), libraryBrowser.saveQueryValues(getSavedQueryKey(), query), loading.hide()
})
elem.innerHTML = html;
imageLoader.lazyChildren(elem);
libraryBrowser.saveQueryValues(getSavedQueryKey(), query);
loading.hide();
});
}
var self = this,
data = {};
self.getCurrentViewStyle = function() {
return getPageData(tabContent).view
var self = this;
var data = {};
self.getCurrentViewStyle = function () {
return getPageData(tabContent).view;
};
var promise;
self.preRender = function() {
promise = getPromise()
}, self.renderTab = function() {
reloadItems(tabContent, promise)
}
}
});
self.preRender = function () {
promise = getPromise();
};
self.renderTab = function () {
reloadItems(tabContent, promise);
};
};
});

View file

@ -1,49 +1,65 @@
define(["browser", "layoutManager", "userSettings", "inputManager", "loading", "cardBuilder", "dom", "apphost", "imageLoader", "libraryMenu", "playbackManager", "mainTabsManager", "scrollStyles", "emby-itemscontainer", "emby-tabs", "emby-button", "flexStyles"], function(browser, layoutManager, userSettings, inputManager, loading, cardBuilder, dom, appHost, imageLoader, libraryMenu, playbackManager, mainTabsManager) {
define(["browser", "layoutManager", "userSettings", "inputManager", "loading", "cardBuilder", "dom", "apphost", "imageLoader", "libraryMenu", "playbackManager", "mainTabsManager", "scrollStyles", "emby-itemscontainer", "emby-tabs", "emby-button", "flexStyles"], function (browser, layoutManager, userSettings, inputManager, loading, cardBuilder, dom, appHost, imageLoader, libraryMenu, playbackManager, mainTabsManager) {
"use strict";
function itemsPerRow() {
var screenWidth = dom.getWindowSize().innerWidth;
return screenWidth >= 1920 ? 9 : screenWidth >= 1200 ? 12 : screenWidth >= 1e3 ? 10 : 8
if (screenWidth >= 1920) {
return 9;
}
if (screenWidth >= 1200) {
return 12;
}
if (screenWidth >= 1000) {
return 10;
}
return 8;
}
function enableScrollX() {
return !layoutManager.desktop
return !layoutManager.desktop;
}
function getSquareShape() {
return enableScrollX() ? "overflowSquare" : "square"
return enableScrollX() ? "overflowSquare" : "square";
}
function loadLatest(page, parentId) {
loading.show();
var userId = ApiClient.getCurrentUserId(),
options = {
IncludeItemTypes: "Audio",
Limit: enableScrollX() ? 3 * itemsPerRow() : 2 * itemsPerRow(),
Fields: "PrimaryImageAspectRatio,BasicSyncInfo",
ParentId: parentId,
ImageTypeLimit: 1,
EnableImageTypes: "Primary,Backdrop,Banner,Thumb",
EnableTotalRecordCount: !1
};
ApiClient.getJSON(ApiClient.getUrl("Users/" + userId + "/Items/Latest", options)).then(function(items) {
var elem = page.querySelector("#recentlyAddedSongs"),
supportsImageAnalysis = appHost.supports("imageanalysis");
supportsImageAnalysis = !1, elem.innerHTML = cardBuilder.getCardsHtml({
var userId = ApiClient.getCurrentUserId();
var options = {
IncludeItemTypes: "Audio",
Limit: enableScrollX() ? 3 * itemsPerRow() : 2 * itemsPerRow(),
Fields: "PrimaryImageAspectRatio,BasicSyncInfo",
ParentId: parentId,
ImageTypeLimit: 1,
EnableImageTypes: "Primary,Backdrop,Banner,Thumb",
EnableTotalRecordCount: false
};
ApiClient.getJSON(ApiClient.getUrl("Users/" + userId + "/Items/Latest", options)).then(function (items) {
var elem = page.querySelector("#recentlyAddedSongs");
var supportsImageAnalysis = appHost.supports("imageanalysis");
supportsImageAnalysis = false;
elem.innerHTML = cardBuilder.getCardsHtml({
items: items,
showUnplayedIndicator: !1,
showLatestItemsPopup: !1,
showUnplayedIndicator: false,
showLatestItemsPopup: false,
shape: getSquareShape(),
showTitle: !0,
showParentTitle: !0,
lazy: !0,
showTitle: true,
showParentTitle: true,
lazy: true,
centerText: !supportsImageAnalysis,
overlayPlayButton: !supportsImageAnalysis,
allowBottomPadding: !enableScrollX(),
cardLayout: supportsImageAnalysis,
coverImage: !0
}), imageLoader.lazyChildren(elem), loading.hide()
})
coverImage: true
});
imageLoader.lazyChildren(elem);
loading.hide();
});
}
function loadRecentlyPlayed(page, parentId) {
@ -52,34 +68,42 @@ define(["browser", "layoutManager", "userSettings", "inputManager", "loading", "
SortOrder: "Descending",
IncludeItemTypes: "Audio",
Limit: itemsPerRow(),
Recursive: !0,
Recursive: true,
Fields: "PrimaryImageAspectRatio,AudioInfo",
Filters: "IsPlayed",
ParentId: parentId,
ImageTypeLimit: 1,
EnableImageTypes: "Primary,Backdrop,Banner,Thumb",
EnableTotalRecordCount: !1
EnableTotalRecordCount: false
};
ApiClient.getItems(ApiClient.getCurrentUserId(), options).then(function(result) {
ApiClient.getItems(ApiClient.getCurrentUserId(), options).then(function (result) {
var elem = page.querySelector("#recentlyPlayed");
result.Items.length ? elem.classList.remove("hide") : elem.classList.add("hide");
var itemsContainer = elem.querySelector(".itemsContainer"),
supportsImageAnalysis = appHost.supports("imageanalysis");
supportsImageAnalysis = !1, itemsContainer.innerHTML = cardBuilder.getCardsHtml({
if (result.Items.length) {
elem.classList.remove("hide");
} else {
elem.classList.add("hide");
}
var itemsContainer = elem.querySelector(".itemsContainer");
var supportsImageAnalysis = appHost.supports("imageanalysis");
supportsImageAnalysis = false;
itemsContainer.innerHTML = cardBuilder.getCardsHtml({
items: result.Items,
showUnplayedIndicator: !1,
showUnplayedIndicator: false,
shape: getSquareShape(),
showTitle: !0,
showParentTitle: !0,
showTitle: true,
showParentTitle: true,
action: "instantmix",
lazy: !0,
lazy: true,
centerText: !supportsImageAnalysis,
overlayMoreButton: !supportsImageAnalysis,
allowBottomPadding: !enableScrollX(),
cardLayout: supportsImageAnalysis,
coverImage: !0
}), imageLoader.lazyChildren(itemsContainer)
})
coverImage: true
});
imageLoader.lazyChildren(itemsContainer);
});
}
function loadFrequentlyPlayed(page, parentId) {
@ -88,40 +112,53 @@ define(["browser", "layoutManager", "userSettings", "inputManager", "loading", "
SortOrder: "Descending",
IncludeItemTypes: "Audio",
Limit: itemsPerRow(),
Recursive: !0,
Recursive: true,
Fields: "PrimaryImageAspectRatio,AudioInfo",
Filters: "IsPlayed",
ParentId: parentId,
ImageTypeLimit: 1,
EnableImageTypes: "Primary,Backdrop,Banner,Thumb",
EnableTotalRecordCount: !1
EnableTotalRecordCount: false
};
ApiClient.getItems(ApiClient.getCurrentUserId(), options).then(function(result) {
ApiClient.getItems(ApiClient.getCurrentUserId(), options).then(function (result) {
var elem = page.querySelector("#topPlayed");
result.Items.length ? elem.classList.remove("hide") : elem.classList.add("hide");
var itemsContainer = elem.querySelector(".itemsContainer"),
supportsImageAnalysis = appHost.supports("imageanalysis");
supportsImageAnalysis = !1, itemsContainer.innerHTML = cardBuilder.getCardsHtml({
if (result.Items.length) {
elem.classList.remove("hide");
} else {
elem.classList.add("hide");
}
var itemsContainer = elem.querySelector(".itemsContainer");
var supportsImageAnalysis = appHost.supports("imageanalysis");
supportsImageAnalysis = false;
itemsContainer.innerHTML = cardBuilder.getCardsHtml({
items: result.Items,
showUnplayedIndicator: !1,
showUnplayedIndicator: false,
shape: getSquareShape(),
showTitle: !0,
showParentTitle: !0,
showTitle: true,
showParentTitle: true,
action: "instantmix",
lazy: !0,
lazy: true,
centerText: !supportsImageAnalysis,
overlayMoreButton: !supportsImageAnalysis,
allowBottomPadding: !enableScrollX(),
cardLayout: supportsImageAnalysis,
coverImage: !0
}), imageLoader.lazyChildren(itemsContainer)
})
coverImage: true
});
imageLoader.lazyChildren(itemsContainer);
});
}
function loadSuggestionsTab(page, tabContent, parentId) {
console.log("loadSuggestionsTab"), loadLatest(tabContent, parentId), loadRecentlyPlayed(tabContent, parentId), loadFrequentlyPlayed(tabContent, parentId), require(["components/favoriteitems"], function(favoriteItems) {
favoriteItems.render(tabContent, ApiClient.getCurrentUserId(), parentId, ["favoriteArtists", "favoriteAlbums", "favoriteSongs"])
})
console.log("loadSuggestionsTab");
loadLatest(tabContent, parentId);
loadRecentlyPlayed(tabContent, parentId);
loadFrequentlyPlayed(tabContent, parentId);
require(["components/favoriteitems"], function (favoriteItems) {
favoriteItems.render(tabContent, ApiClient.getCurrentUserId(), parentId, ["favoriteArtists", "favoriteAlbums", "favoriteSongs"]);
});
}
function getTabs() {
@ -142,135 +179,227 @@ define(["browser", "layoutManager", "userSettings", "inputManager", "loading", "
}, {
name: Globalize.translate("ButtonSearch"),
cssClass: "searchTabButton"
}]
}];
}
function getDefaultTabIndex(folderId) {
switch (userSettings.get("landing-" + folderId)) {
case "albums":
return 1;
case "albumartists":
return 2;
case "artists":
return 3;
case "playlists":
return 4;
case "songs":
return 5;
case "genres":
return 6;
default:
return 0
return 0;
}
}
return function(view, params) {
return function (view, params) {
function reload() {
loading.show();
var tabContent = view.querySelector(".pageTabContent[data-index='0']");
loadSuggestionsTab(view, tabContent, params.topParentId)
loadSuggestionsTab(view, tabContent, params.topParentId);
}
function enableScrollX() {
return browser.mobile
return browser.mobile;
}
function setScrollClasses(elem, scrollX) {
scrollX ? (elem.classList.add("hiddenScrollX"), layoutManager.tv && elem.classList.add("smoothScrollX"), elem.classList.add("scrollX"), elem.classList.remove("vertical-wrap")) : (elem.classList.remove("hiddenScrollX"), elem.classList.remove("smoothScrollX"), elem.classList.remove("scrollX"), elem.classList.add("vertical-wrap"))
if (scrollX) {
elem.classList.add("hiddenScrollX");
if (layoutManager.tv) {
elem.classList.add("smoothScrollX");
}
elem.classList.add("scrollX");
elem.classList.remove("vertical-wrap");
} else {
elem.classList.remove("hiddenScrollX");
elem.classList.remove("smoothScrollX");
elem.classList.remove("scrollX");
elem.classList.add("vertical-wrap");
}
}
function onBeforeTabChange(e) {
preLoadTab(view, parseInt(e.detail.selectedTabIndex))
preLoadTab(view, parseInt(e.detail.selectedTabIndex));
}
function onTabChange(e) {
loadTab(view, parseInt(e.detail.selectedTabIndex))
loadTab(view, parseInt(e.detail.selectedTabIndex));
}
function getTabContainers() {
return view.querySelectorAll(".pageTabContent")
return view.querySelectorAll(".pageTabContent");
}
function initTabs() {
mainTabsManager.setTabs(view, currentTabIndex, getTabs, getTabContainers, onBeforeTabChange, onTabChange)
mainTabsManager.setTabs(view, currentTabIndex, getTabs, getTabContainers, onBeforeTabChange, onTabChange);
}
function getTabController(page, index, callback) {
var depends = [];
switch (index) {
case 0:
break;
case 1:
depends.push("controllers/music/musicalbums");
break;
case 2:
case 3:
depends.push("controllers/music/musicartists");
break;
case 4:
depends.push("controllers/music/musicplaylists");
break;
case 5:
depends.push("controllers/music/songs");
break;
case 6:
depends.push("controllers/music/musicgenres");
break;
case 7:
depends.push("scripts/searchtab")
depends.push("scripts/searchtab");
}
require(depends, function(controllerFactory) {
require(depends, function (controllerFactory) {
var tabContent;
0 == index && (tabContent = view.querySelector(".pageTabContent[data-index='" + index + "']"), self.tabContent = tabContent);
if (0 == index) {
tabContent = view.querySelector(".pageTabContent[data-index='" + index + "']");
self.tabContent = tabContent;
}
var controller = tabControllers[index];
controller || (tabContent = view.querySelector(".pageTabContent[data-index='" + index + "']"), controller = 0 === index ? self : 7 === index ? new controllerFactory(view, tabContent, {
collectionType: "music",
parentId: params.topParentId
}) : new controllerFactory(view, params, tabContent), 2 == index ? controller.mode = "albumartists" : 3 == index && (controller.mode = "artists"), tabControllers[index] = controller, controller.initTab && controller.initTab()), callback(controller)
})
if (!controller) {
tabContent = view.querySelector(".pageTabContent[data-index='" + index + "']");
if (index === 0) {
controller = self;
} else if (index === 7) {
controller = new controllerFactory(view, tabContent, {
collectionType: "music",
parentId: params.topParentId
});
} else {
controller = new controllerFactory(view, params, tabContent);
}
if (index == 2) {
controller.mode = "albumartists";
} else if (index == 3) {
controller.mode = "artists";
}
tabControllers[index] = controller;
if (controller.initTab) {
controller.initTab();
}
}
callback(controller);
});
}
function preLoadTab(page, index) {
getTabController(page, index, function(controller) {
-1 == renderedTabs.indexOf(index) && controller.preRender && controller.preRender()
})
getTabController(page, index, function (controller) {
if (renderedTabs.indexOf(index) == -1 && controller.preRender) {
controller.preRender();
}
});
}
function loadTab(page, index) {
currentTabIndex = index, getTabController(page, index, function(controller) {
initialTabIndex = null, -1 == renderedTabs.indexOf(index) && (renderedTabs.push(index), controller.renderTab())
})
currentTabIndex = index;
getTabController(page, index, function (controller) {
initialTabIndex = null;
if (renderedTabs.indexOf(index) == -1) {
renderedTabs.push(index);
controller.renderTab();
}
});
}
function onInputCommand(e) {
switch (e.detail.command) {
case "search":
e.preventDefault(), Dashboard.navigate("search.html?collectionType=music&parentId=" + params.topParentId)
e.preventDefault();
Dashboard.navigate("search.html?collectionType=music&parentId=" + params.topParentId);
}
}
var isViewRestored, self = this,
currentTabIndex = parseInt(params.tab || getDefaultTabIndex(params.topParentId)),
initialTabIndex = currentTabIndex;
self.initTab = function() {
for (var tabContent = view.querySelector(".pageTabContent[data-index='0']"), containers = tabContent.querySelectorAll(".itemsContainer"), i = 0, length = containers.length; i < length; i++) setScrollClasses(containers[i], enableScrollX())
}, self.renderTab = function() {
reload()
};
var tabControllers = [],
renderedTabs = [];
view.addEventListener("viewshow", function(e) {
if (isViewRestored = e.detail.isRestored, initTabs(), !view.getAttribute("data-title")) {
var parentId = params.topParentId;
parentId ? ApiClient.getItem(ApiClient.getCurrentUserId(), parentId).then(function(item) {
view.setAttribute("data-title", item.Name), libraryMenu.setTitle(item.Name)
}) : (view.setAttribute("data-title", Globalize.translate("TabMusic")), libraryMenu.setTitle(Globalize.translate("TabMusic")))
var isViewRestored;
var self = this;
var currentTabIndex = parseInt(params.tab || getDefaultTabIndex(params.topParentId));
var initialTabIndex = currentTabIndex;
self.initTab = function () {
var tabContent = view.querySelector(".pageTabContent[data-index='0']");
var containers = tabContent.querySelectorAll(".itemsContainer");
for (var i = 0, length = containers.length; i < length; i++) {
setScrollClasses(containers[i], enableScrollX());
}
inputManager.on(window, onInputCommand)
}), view.addEventListener("viewbeforehide", function(e) {
inputManager.off(window, onInputCommand)
}), view.addEventListener("viewdestroy", function(e) {
tabControllers.forEach(function(t) {
t.destroy && t.destroy()
})
})
}
});
};
self.renderTab = function () {
reload();
};
var tabControllers = [];
var renderedTabs = [];
view.addEventListener("viewshow", function (e) {
isViewRestored = e.detail.isRestored;
initTabs();
if (!view.getAttribute("data-title")) {
var parentId = params.topParentId;
if (parentId) {
ApiClient.getItem(ApiClient.getCurrentUserId(), parentId).then(function (item) {
view.setAttribute("data-title", item.Name);
libraryMenu.setTitle(item.Name);
});
} else {
view.setAttribute("data-title", Globalize.translate("TabMusic"));
libraryMenu.setTitle(Globalize.translate("TabMusic"));
}
}
inputManager.on(window, onInputCommand);
});
view.addEventListener("viewbeforehide", function (e) {
inputManager.off(window, onInputCommand);
});
view.addEventListener("viewdestroy", function (e) {
tabControllers.forEach(function (t) {
if (t.destroy) {
t.destroy();
}
});
});
};
});

View file

@ -1,135 +1,185 @@
define(["events", "libraryBrowser", "imageLoader", "listView", "loading", "emby-itemscontainer"], function(events, libraryBrowser, imageLoader, listView, loading) {
define(["events", "libraryBrowser", "imageLoader", "listView", "loading", "emby-itemscontainer"], function (events, libraryBrowser, imageLoader, listView, loading) {
"use strict";
return function(view, params, tabContent) {
return function (view, params, tabContent) {
function getPageData(context) {
var key = getSavedQueryKey(context),
pageData = data[key];
return pageData || (pageData = data[key] = {
query: {
SortBy: "Album,SortName",
SortOrder: "Ascending",
IncludeItemTypes: "Audio",
Recursive: !0,
Fields: "AudioInfo,ParentId",
Limit: 100,
StartIndex: 0,
ImageTypeLimit: 1,
EnableImageTypes: "Primary"
}
}, pageData.query.ParentId = params.topParentId, libraryBrowser.loadSavedQueryValues(key, pageData.query)), pageData
var key = getSavedQueryKey(context);
var pageData = data[key];
if (!pageData) {
pageData = data[key] = {
query: {
SortBy: "Album,SortName",
SortOrder: "Ascending",
IncludeItemTypes: "Audio",
Recursive: true,
Fields: "AudioInfo,ParentId",
Limit: 100,
StartIndex: 0,
ImageTypeLimit: 1,
EnableImageTypes: "Primary"
}
};
pageData.query.ParentId = params.topParentId;
libraryBrowser.loadSavedQueryValues(key, pageData.query);
}
return pageData;
}
function getQuery(context) {
return getPageData(context).query
return getPageData(context).query;
}
function getSavedQueryKey(context) {
return context.savedQueryKey || (context.savedQueryKey = libraryBrowser.getSavedQueryKey("songs")), context.savedQueryKey
if (!context.savedQueryKey) {
context.savedQueryKey = libraryBrowser.getSavedQueryKey("songs");
}
return context.savedQueryKey;
}
function reloadItems(page) {
loading.show();
isLoading = true;
var query = getQuery(page);
ApiClient.getItems(Dashboard.getCurrentUserId(), query).then(function(result) {
ApiClient.getItems(Dashboard.getCurrentUserId(), query).then(function (result) {
function onNextPageClick() {
if (isLoading) return;
query.StartIndex += query.Limit, reloadItems(tabContent)
if (isLoading) {
return;
}
query.StartIndex += query.Limit;
reloadItems(tabContent);
}
function onPreviousPageClick() {
if (isLoading) return;
query.StartIndex -= query.Limit, reloadItems(tabContent)
if (isLoading) {
return;
}
query.StartIndex -= query.Limit;
reloadItems(tabContent);
}
window.scrollTo(0, 0);
var i, length, pagingHtml = libraryBrowser.getQueryPagingHtml({
startIndex: query.StartIndex,
limit: query.Limit,
totalRecordCount: result.TotalRecordCount,
showLimit: !1,
updatePageSizeSetting: !1,
addLayoutButton: !1,
sortButton: !1,
filterButton: !1
}),
html = listView.getListViewHtml({
items: result.Items,
action: "playallfromhere",
smallIcon: !0,
artist: !0,
addToListButton: !0
}),
elems = tabContent.querySelectorAll(".paging");
for (i = 0, length = elems.length; i < length; i++) elems[i].innerHTML = pagingHtml;
for (elems = tabContent.querySelectorAll(".btnNextPage"), i = 0, length = elems.length; i < length; i++) elems[i].addEventListener("click", onNextPageClick);
for (elems = tabContent.querySelectorAll(".btnPreviousPage"), i = 0, length = elems.length; i < length; i++) elems[i].addEventListener("click", onPreviousPageClick);
var i;
var length;
var pagingHtml = libraryBrowser.getQueryPagingHtml({
startIndex: query.StartIndex,
limit: query.Limit,
totalRecordCount: result.TotalRecordCount,
showLimit: false,
updatePageSizeSetting: false,
addLayoutButton: false,
sortButton: false,
filterButton: false
});
var html = listView.getListViewHtml({
items: result.Items,
action: "playallfromhere",
smallIcon: true,
artist: true,
addToListButton: true
});
var elems = tabContent.querySelectorAll(".paging");
for (i = 0, length = elems.length; i < length; i++) {
elems[i].innerHTML = pagingHtml;
}
elems = tabContent.querySelectorAll(".btnNextPage");
for (i = 0, length = elems.length; i < length; i++) {
elems[i].addEventListener("click", onNextPageClick);
}
elems = tabContent.querySelectorAll(".btnPreviousPage");
for (i = 0, length = elems.length; i < length; i++) {
elems[i].addEventListener("click", onPreviousPageClick);
}
var itemsContainer = tabContent.querySelector(".itemsContainer");
itemsContainer.innerHTML = html;
imageLoader.lazyChildren(itemsContainer);
libraryBrowser.saveQueryValues(getSavedQueryKey(page), query);
loading.hide();
isLoading = false;
})
});
}
var self = this,
data = {},
isLoading = false;
self.showFilterMenu = function() {
require(["components/filterdialog/filterdialog"], function(filterDialogFactory) {
var filterDialog = new filterDialogFactory({
query: getQuery(tabContent),
mode: "songs",
serverId: ApiClient.serverId()
});
events.on(filterDialog, "filterchange", function() {
getQuery(tabContent).StartIndex = 0, reloadItems(tabContent)
}), filterDialog.show()
})
}, self.getCurrentViewStyle = function() {
return getPageData(tabContent).view
},
function(tabContent) {
tabContent.querySelector(".btnFilter").addEventListener("click", function() {
self.showFilterMenu()
}), tabContent.querySelector(".btnSort").addEventListener("click", function(e) {
libraryBrowser.showSortMenu({
items: [{
name: Globalize.translate("OptionTrackName"),
id: "Name"
}, {
name: Globalize.translate("OptionAlbum"),
id: "Album,SortName"
}, {
name: Globalize.translate("OptionAlbumArtist"),
id: "AlbumArtist,Album,SortName"
}, {
name: Globalize.translate("OptionArtist"),
id: "Artist,Album,SortName"
}, {
name: Globalize.translate("OptionDateAdded"),
id: "DateCreated,SortName"
}, {
name: Globalize.translate("OptionDatePlayed"),
id: "DatePlayed,SortName"
}, {
name: Globalize.translate("OptionPlayCount"),
id: "PlayCount,SortName"
}, {
name: Globalize.translate("OptionReleaseDate"),
id: "PremiereDate,AlbumArtist,Album,SortName"
}, {
name: Globalize.translate("OptionRuntime"),
id: "Runtime,AlbumArtist,Album,SortName"
}],
callback: function() {
getQuery(tabContent).StartIndex = 0, reloadItems(tabContent)
},
query: getQuery(tabContent),
button: e.target
})
})
}(tabContent), self.renderTab = function() {
reloadItems(tabContent)
}, self.destroy = function() {}
}
var self = this;
var data = {};
var isLoading = false;
self.showFilterMenu = function () {
require(["components/filterdialog/filterdialog"], function (filterDialogFactory) {
var filterDialog = new filterDialogFactory({
query: getQuery(tabContent),
mode: "songs",
serverId: ApiClient.serverId()
});
events.on(filterDialog, "filterchange", function () {
getQuery(tabContent).StartIndex = 0;
reloadItems(tabContent);
});
filterDialog.show();
});
};
self.getCurrentViewStyle = function () {
return getPageData(tabContent).view;
};
function initPage(tabContent) {
tabContent.querySelector(".btnFilter").addEventListener("click", function () {
self.showFilterMenu();
});
tabContent.querySelector(".btnSort").addEventListener("click", function (e) {
libraryBrowser.showSortMenu({
items: [{
name: Globalize.translate("OptionTrackName"),
id: "Name"
}, {
name: Globalize.translate("OptionAlbum"),
id: "Album,SortName"
}, {
name: Globalize.translate("OptionAlbumArtist"),
id: "AlbumArtist,Album,SortName"
}, {
name: Globalize.translate("OptionArtist"),
id: "Artist,Album,SortName"
}, {
name: Globalize.translate("OptionDateAdded"),
id: "DateCreated,SortName"
}, {
name: Globalize.translate("OptionDatePlayed"),
id: "DatePlayed,SortName"
}, {
name: Globalize.translate("OptionPlayCount"),
id: "PlayCount,SortName"
}, {
name: Globalize.translate("OptionReleaseDate"),
id: "PremiereDate,AlbumArtist,Album,SortName"
}, {
name: Globalize.translate("OptionRuntime"),
id: "Runtime,AlbumArtist,Album,SortName"
}],
callback: function () {
getQuery(tabContent).StartIndex = 0;
reloadItems(tabContent);
},
query: getQuery(tabContent),
button: e.target
});
});
}
initPage(tabContent);
self.renderTab = function () {
reloadItems(tabContent);
};
self.destroy = function () {};
};
});

View file

@ -1,85 +1,122 @@
define(["jQuery", "emby-checkbox", "fnchecked"], function($) {
define(["jQuery", "emby-checkbox", "fnchecked"], function ($) {
"use strict";
function fillItems(elem, items, cssClass, idPrefix, currentList, isEnabledList) {
var html = '<div class="checkboxList paperList" style="padding: .5em 1em;">';
html += items.map(function(u) {
var isChecked = isEnabledList ? -1 != currentList.indexOf(u.Id) : -1 == currentList.indexOf(u.Id),
checkedHtml = isChecked ? ' checked="checked"' : "";
return '<label><input is="emby-checkbox" class="' + cssClass + '" type="checkbox" data-itemid="' + u.Id + '"' + checkedHtml + "/><span>" + u.Name + "</span></label>"
}).join(""), html += "</div>", elem.html(html).trigger("create")
html += items.map(function (u) {
var isChecked = isEnabledList ? currentList.indexOf(u.Id) != -1 : currentList.indexOf(u.Id) == -1;
var checkedHtml = isChecked ? ' checked="checked"' : "";
return '<label><input is="emby-checkbox" class="' + cssClass + '" type="checkbox" data-itemid="' + u.Id + '"' + checkedHtml + "/><span>" + u.Name + "</span></label>";
}).join("");
html += "</div>";
elem.html(html).trigger("create");
}
function reload(page) {
var type = getParameterByName("type"),
promise1 = ApiClient.getUsers(),
promise2 = ApiClient.getNamedConfiguration(notificationsConfigurationKey),
promise3 = ApiClient.getJSON(ApiClient.getUrl("Notifications/Types")),
promise4 = ApiClient.getJSON(ApiClient.getUrl("Notifications/Services"));
Promise.all([promise1, promise2, promise3, promise4]).then(function(responses) {
var users = responses[0],
notificationOptions = responses[1],
types = responses[2],
services = responses[3],
notificationConfig = notificationOptions.Options.filter(function(n) {
return n.Type == type
})[0],
typeInfo = types.filter(function(n) {
return n.Type == type
})[0] || {};
typeInfo.IsBasedOnUserEvent ? $(".monitorUsers", page).show() : $(".monitorUsers", page).hide(), $(".notificationType", page).html(typeInfo.Name || "Unknown Notification"), notificationConfig || (notificationConfig = {
DisabledMonitorUsers: [],
SendToUsers: [],
DisabledServices: [],
SendToUserMode: "Admins"
}), fillItems($(".monitorUsersList", page), users, "chkMonitor", "chkMonitor", notificationConfig.DisabledMonitorUsers), fillItems($(".sendToUsersList", page), users, "chkSendTo", "chkSendTo", notificationConfig.SendToUsers, !0), fillItems($(".servicesList", page), services, "chkService", "chkService", notificationConfig.DisabledServices), $("#chkEnabled", page).checked(notificationConfig.Enabled || !1), $("#selectUsers", page).val(notificationConfig.SendToUserMode).trigger("change")
})
var type = getParameterByName("type");
var promise1 = ApiClient.getUsers();
var promise2 = ApiClient.getNamedConfiguration(notificationsConfigurationKey);
var promise3 = ApiClient.getJSON(ApiClient.getUrl("Notifications/Types"));
var promise4 = ApiClient.getJSON(ApiClient.getUrl("Notifications/Services"));
Promise.all([promise1, promise2, promise3, promise4]).then(function (responses) {
var users = responses[0];
var notificationOptions = responses[1];
var types = responses[2];
var services = responses[3];
var notificationConfig = notificationOptions.Options.filter(function (n) {
return n.Type == type;
})[0];
var typeInfo = types.filter(function (n) {
return n.Type == type;
})[0] || {};
if (typeInfo.IsBasedOnUserEvent) {
$(".monitorUsers", page).show();
} else {
$(".monitorUsers", page).hide();
}
$(".notificationType", page).html(typeInfo.Name || "Unknown Notification");
if (!notificationConfig) {
notificationConfig = {
DisabledMonitorUsers: [],
SendToUsers: [],
DisabledServices: [],
SendToUserMode: "Admins"
};
}
fillItems($(".monitorUsersList", page), users, "chkMonitor", "chkMonitor", notificationConfig.DisabledMonitorUsers);
fillItems($(".sendToUsersList", page), users, "chkSendTo", "chkSendTo", notificationConfig.SendToUsers, true);
fillItems($(".servicesList", page), services, "chkService", "chkService", notificationConfig.DisabledServices);
$("#chkEnabled", page).checked(notificationConfig.Enabled || false);
$("#selectUsers", page).val(notificationConfig.SendToUserMode).trigger("change");
});
}
function save(page) {
var type = getParameterByName("type"),
promise1 = ApiClient.getNamedConfiguration(notificationsConfigurationKey),
promise2 = ApiClient.getJSON(ApiClient.getUrl("Notifications/Types"));
Promise.all([promise1, promise2]).then(function(responses) {
var notificationOptions = responses[0],
types = responses[1],
notificationConfig = notificationOptions.Options.filter(function(n) {
return n.Type == type
})[0];
notificationConfig || (notificationConfig = {
Type: type
}, notificationOptions.Options.push(notificationConfig));
types.filter(function(n) {
return n.Type == type
var type = getParameterByName("type");
var promise1 = ApiClient.getNamedConfiguration(notificationsConfigurationKey);
var promise2 = ApiClient.getJSON(ApiClient.getUrl("Notifications/Types"));
Promise.all([promise1, promise2]).then(function (responses) {
var notificationOptions = responses[0];
var types = responses[1];
var notificationConfig = notificationOptions.Options.filter(function (n) {
return n.Type == type;
})[0];
notificationConfig.Enabled = $("#chkEnabled", page).checked(), notificationConfig.SendToUserMode = $("#selectUsers", page).val(), notificationConfig.DisabledMonitorUsers = $(".chkMonitor", page).get().filter(function(c) {
return !c.checked
}).map(function(c) {
return c.getAttribute("data-itemid")
}), notificationConfig.SendToUsers = $(".chkSendTo", page).get().filter(function(c) {
return c.checked
}).map(function(c) {
return c.getAttribute("data-itemid")
}), notificationConfig.DisabledServices = $(".chkService", page).get().filter(function(c) {
return !c.checked
}).map(function(c) {
return c.getAttribute("data-itemid")
}), ApiClient.updateNamedConfiguration(notificationsConfigurationKey, notificationOptions).then(function(r) {
Dashboard.processServerConfigurationUpdateResult(), Dashboard.navigate("notificationsettings.html")
})
})
if (!notificationConfig) {
notificationConfig = {
Type: type
};
notificationOptions.Options.push(notificationConfig);
}
types.filter(function (n) {
return n.Type == type;
})[0];
notificationConfig.Enabled = $("#chkEnabled", page).checked();
notificationConfig.SendToUserMode = $("#selectUsers", page).val();
notificationConfig.DisabledMonitorUsers = $(".chkMonitor", page).get().filter(function (c) {
return !c.checked;
}).map(function (c) {
return c.getAttribute("data-itemid");
});
notificationConfig.SendToUsers = $(".chkSendTo", page).get().filter(function (c) {
return c.checked;
}).map(function (c) {
return c.getAttribute("data-itemid");
});
notificationConfig.DisabledServices = $(".chkService", page).get().filter(function (c) {
return !c.checked;
}).map(function (c) {
return c.getAttribute("data-itemid");
});
ApiClient.updateNamedConfiguration(notificationsConfigurationKey, notificationOptions).then(function (r) {
Dashboard.processServerConfigurationUpdateResult();
Dashboard.navigate("notificationsettings.html");
});
});
}
function onSubmit() {
return save($(this).parents(".page")), !1
save($(this).parents(".page"));
return false;
}
var notificationsConfigurationKey = "notifications";
$(document).on("pageinit", "#notificationSettingPage", function() {
$(document).on("pageinit", "#notificationSettingPage", function () {
var page = this;
$("#selectUsers", page).on("change", function() {
"Custom" == this.value ? $(".selectCustomUsers", page).show() : $(".selectCustomUsers", page).hide()
}), $(".notificationSettingForm").off("submit", onSubmit).on("submit", onSubmit)
}).on("pageshow", "#notificationSettingPage", function() {
reload(this)
})
});
$("#selectUsers", page).on("change", function () {
if ("Custom" == this.value) {
$(".selectCustomUsers", page).show();
} else {
$(".selectCustomUsers", page).hide();
}
});
$(".notificationSettingForm").off("submit", onSubmit).on("submit", onSubmit);
}).on("pageshow", "#notificationSettingPage", function () {
reload(this);
});
});

View file

@ -1,11 +1,22 @@
define(["components/remotecontrol/remotecontrol", "libraryMenu", "emby-button"], function(remotecontrolFactory, libraryMenu) {
define(["components/remotecontrol/remotecontrol", "libraryMenu", "emby-button"], function (remotecontrolFactory, libraryMenu) {
"use strict";
return function(view, params) {
var remoteControl = new remotecontrolFactory;
remoteControl.init(view, view.querySelector(".remoteControlContent")), view.addEventListener("viewshow", function(e) {
libraryMenu.setTransparentMenu(!0), remoteControl && remoteControl.onShow()
}), view.addEventListener("viewbeforehide", function(e) {
libraryMenu.setTransparentMenu(!1), remoteControl && remoteControl.destroy()
})
}
});
return function (view, params) {
var remoteControl = new remotecontrolFactory();
remoteControl.init(view, view.querySelector(".remoteControlContent"));
view.addEventListener("viewshow", function (e) {
libraryMenu.setTransparentMenu(true);
if (remoteControl) {
remoteControl.onShow();
}
});
view.addEventListener("viewbeforehide", function (e) {
libraryMenu.setTransparentMenu(false);
if (remoteControl) {
remoteControl.destroy();
}
});
};
});

View file

@ -1,16 +1,25 @@
define(["jQuery", "loading", "libraryMenu"], function($, loading, libraryMenu) {
define(["jQuery", "loading", "libraryMenu"], function ($, loading, libraryMenu) {
"use strict";
function loadPage(page, config) {
$("#txtMinResumePct", page).val(config.MinResumePct), $("#txtMaxResumePct", page).val(config.MaxResumePct), $("#txtMinResumeDuration", page).val(config.MinResumeDurationSeconds), loading.hide()
$("#txtMinResumePct", page).val(config.MinResumePct);
$("#txtMaxResumePct", page).val(config.MaxResumePct);
$("#txtMinResumeDuration", page).val(config.MinResumeDurationSeconds);
loading.hide();
}
function onSubmit() {
loading.show();
var form = this;
return ApiClient.getServerConfiguration().then(function(config) {
config.MinResumePct = $("#txtMinResumePct", form).val(), config.MaxResumePct = $("#txtMaxResumePct", form).val(), config.MinResumeDurationSeconds = $("#txtMinResumeDuration", form).val(), ApiClient.updateServerConfiguration(config).then(Dashboard.processServerConfigurationUpdateResult)
}), !1
ApiClient.getServerConfiguration().then(function (config) {
config.MinResumePct = $('#txtMinResumePct', form).val();
config.MaxResumePct = $('#txtMaxResumePct', form).val();
config.MinResumeDurationSeconds = $('#txtMinResumeDuration', form).val();
ApiClient.updateServerConfiguration(config).then(Dashboard.processServerConfigurationUpdateResult);
});
return false;
}
function getTabs() {
@ -23,17 +32,17 @@ define(["jQuery", "loading", "libraryMenu"], function($, loading, libraryMenu) {
}, {
href: "streamingsettings.html",
name: Globalize.translate("TabStreaming")
}]
}];
}
$(document).on("pageinit", "#playbackConfigurationPage", function() {
$(document).on("pageinit", "#playbackConfigurationPage", function () {
$(".playbackConfigurationForm").off("submit", onSubmit).on("submit", onSubmit)
}).on("pageshow", "#playbackConfigurationPage", function() {
}).on("pageshow", "#playbackConfigurationPage", function () {
loading.show();
libraryMenu.setTabs("playback", 1, getTabs);
var page = this;
ApiClient.getServerConfiguration().then(function(config) {
loadPage(page, config)
})
})
});
ApiClient.getServerConfiguration().then(function (config) {
loadPage(page, config);
});
});
});

View file

@ -1,111 +1,237 @@
define(["jQuery", "loading", "datetime", "dom", "globalize", "emby-input", "emby-button", "emby-select"], function($, loading, datetime, dom, globalize) {
define(["jQuery", "loading", "datetime", "dom", "globalize", "emby-input", "emby-button", "emby-select"], function ($, loading, datetime, dom, globalize) {
"use strict";
function fillTimeOfDay(select) {
for (var options = [], i = 0; i < 864e5; i += 9e5) options.push({
name: ScheduledTaskPage.getDisplayTime(1e4 * i),
value: 1e4 * i
});
select.innerHTML = options.map(function(o) {
return '<option value="' + o.value + '">' + o.name + "</option>"
}).join("")
var options = [];
for (var i = 0; i < 86400000; i += 900000) {
options.push({
name: ScheduledTaskPage.getDisplayTime(i * 10000),
value: i * 10000
});
}
select.innerHTML = options.map(function (o) {
return '<option value="' + o.value + '">' + o.name + '</option>';
}).join("");
}
Array.prototype.remove = function(from, to) {
Array.prototype.remove = function (from, to) {
var rest = this.slice((to || from) + 1 || this.length);
return this.length = from < 0 ? this.length + from : from, this.push.apply(this, rest)
this.length = from < 0 ? this.length + from : from;
return this.push.apply(this, rest);
};
var ScheduledTaskPage = {
refreshScheduledTask: function(view) {
refreshScheduledTask: function (view) {
loading.show();
var id = getParameterByName("id");
ApiClient.getScheduledTask(id).then(function(task) {
ScheduledTaskPage.loadScheduledTask(view, task)
})
ApiClient.getScheduledTask(id).then(function (task) {
ScheduledTaskPage.loadScheduledTask(view, task);
});
},
loadScheduledTask: function(view, task) {
$(".taskName", view).html(task.Name), $("#pTaskDescription", view).html(task.Description), require(["listViewStyle"], function() {
ScheduledTaskPage.loadTaskTriggers(view, task)
}), loading.hide()
loadScheduledTask: function (view, task) {
$(".taskName", view).html(task.Name);
$("#pTaskDescription", view).html(task.Description);
require(["listViewStyle"], function () {
ScheduledTaskPage.loadTaskTriggers(view, task);
});
loading.hide();
},
loadTaskTriggers: function(context, task) {
loadTaskTriggers: function (context, task) {
var html = "";
html += '<div class="paperList">';
for (var i = 0, length = task.Triggers.length; i < length; i++) {
var trigger = task.Triggers[i];
if (html += '<div class="listItem listItem-border">', html += '<i class="md-icon listItemIcon">schedule</i>', trigger.MaxRuntimeTicks ? html += '<div class="listItemBody two-line">' : html += '<div class="listItemBody">', html += "<div class='listItemBodyText'>" + ScheduledTaskPage.getTriggerFriendlyName(trigger) + "</div>", trigger.MaxRuntimeTicks) {
html += '<div class="listItem listItem-border">';
html += '<i class="md-icon listItemIcon">schedule</i>';
if (trigger.MaxRuntimeMs) {
html += '<div class="listItemBody two-line">';
} else {
html += '<div class="listItemBody">';
}
html += "<div class='listItemBodyText'>" + ScheduledTaskPage.getTriggerFriendlyName(trigger) + "</div>";
if (trigger.MaxRuntimeMs) {
html += '<div class="listItemBodyText secondary">';
var hours = trigger.MaxRuntimeTicks / 36e9;
html += 1 == hours ? globalize.translate("ValueTimeLimitSingleHour") : globalize.translate("ValueTimeLimitMultiHour", hours), html += "</div>"
if (hours == 1) {
html += globalize.translate("ValueTimeLimitSingleHour");
} else {
html += globalize.translate("ValueTimeLimitMultiHour", hours);
}
html += "</div>";
}
html += "</div>", html += '<button class="btnDeleteTrigger" data-index="' + i + '" type="button" is="paper-icon-button-light" title="' + globalize.translate("ButtonDelete") + '"><i class="md-icon">delete</i></button>', html += "</div>"
html += "</div>";
html += '<button class="btnDeleteTrigger" data-index="' + i + '" type="button" is="paper-icon-button-light" title="' + globalize.translate("ButtonDelete") + '"><i class="md-icon">delete</i></button>';
html += "</div>";
}
html += "</div>", context.querySelector(".taskTriggers").innerHTML = html
html += "</div>";
context.querySelector(".taskTriggers").innerHTML = html;
},
getTriggerFriendlyName: function(trigger) {
if ("DailyTrigger" == trigger.Type) return "Daily at " + ScheduledTaskPage.getDisplayTime(trigger.TimeOfDayTicks);
if ("WeeklyTrigger" == trigger.Type) return trigger.DayOfWeek + "s at " + ScheduledTaskPage.getDisplayTime(trigger.TimeOfDayTicks);
if ("SystemEventTrigger" == trigger.Type && "WakeFromSleep" == trigger.SystemEvent) return "On wake from sleep";
if ("IntervalTrigger" == trigger.Type) {
getTriggerFriendlyName: function (trigger) {
if ("DailyTrigger" == trigger.Type) {
return "Daily at " + ScheduledTaskPage.getDisplayTime(trigger.TimeOfDayTicks);
}
if ("WeeklyTrigger" == trigger.Type) {
return trigger.DayOfWeek + "s at " + ScheduledTaskPage.getDisplayTime(trigger.TimeOfDayTicks);
}
if ("SystemEventTrigger" == trigger.Type && "WakeFromSleep" == trigger.SystemEvent) {
return "On wake from sleep";
}
if (trigger.Type == "IntervalTrigger") {
var hours = trigger.IntervalTicks / 36e9;
return .25 == hours ? "Every 15 minutes" : .5 == hours ? "Every 30 minutes" : .75 == hours ? "Every 45 minutes" : 1 == hours ? "Every hour" : "Every " + hours + " hours"
if (hours == .25) {
return "Every 15 minutes";
}
if (hours == .5) {
return "Every 30 minutes";
}
if (hours == .75) {
return "Every 45 minutes";
}
if (hours == 1) {
return "Every hour";
}
return "Every " + hours + " hours";
}
return "StartupTrigger" == trigger.Type ? "On application startup" : trigger.Type
if (trigger.Type == "StartupTrigger") {
return "On application startup";
}
return trigger.Type;
},
getDisplayTime: function(ticks) {
var ms = ticks / 1e4,
now = new Date;
return now.setHours(0, 0, 0, 0), now.setTime(now.getTime() + ms), datetime.getDisplayTime(now)
getDisplayTime: function (ticks) {
var ms = ticks / 1e4;
var now = new Date();
now.setHours(0, 0, 0, 0);
now.setTime(now.getTime() + ms);
return datetime.getDisplayTime(now);
},
showAddTriggerPopup: function(view) {
$("#selectTriggerType", view).val("DailyTrigger"), view.querySelector("#selectTriggerType").dispatchEvent(new CustomEvent("change", {})), $("#popupAddTrigger", view).removeClass("hide")
showAddTriggerPopup: function (view) {
$("#selectTriggerType", view).val("DailyTrigger");
view.querySelector("#selectTriggerType").dispatchEvent(new CustomEvent("change", {}));
$("#popupAddTrigger", view).removeClass("hide");
},
confirmDeleteTrigger: function(view, index) {
require(["confirm"], function(confirm) {
confirm(globalize.translate("MessageDeleteTaskTrigger"), globalize.translate("HeaderDeleteTaskTrigger")).then(function() {
ScheduledTaskPage.deleteTrigger(view, index)
})
})
confirmDeleteTrigger: function (view, index) {
require(["confirm"], function (confirm) {
confirm(globalize.translate("MessageDeleteTaskTrigger"), globalize.translate("HeaderDeleteTaskTrigger")).then(function () {
ScheduledTaskPage.deleteTrigger(view, index);
});
});
},
deleteTrigger: function(view, index) {
deleteTrigger: function (view, index) {
loading.show();
var id = getParameterByName("id");
ApiClient.getScheduledTask(id).then(function(task) {
task.Triggers.remove(index), ApiClient.updateScheduledTaskTriggers(task.Id, task.Triggers).then(function() {
ScheduledTaskPage.refreshScheduledTask(view)
})
})
ApiClient.getScheduledTask(id).then(function (task) {
task.Triggers.remove(index);
ApiClient.updateScheduledTaskTriggers(task.Id, task.Triggers).then(function () {
ScheduledTaskPage.refreshScheduledTask(view);
});
});
},
refreshTriggerFields: function(page, triggerType) {
"DailyTrigger" == triggerType ? ($("#fldTimeOfDay", page).show(), $("#fldDayOfWeek", page).hide(), $("#fldSelectSystemEvent", page).hide(), $("#fldSelectInterval", page).hide(), $("#selectTimeOfDay", page).attr("required", "required")) : "WeeklyTrigger" == triggerType ? ($("#fldTimeOfDay", page).show(), $("#fldDayOfWeek", page).show(), $("#fldSelectSystemEvent", page).hide(), $("#fldSelectInterval", page).hide(), $("#selectTimeOfDay", page).attr("required", "required")) : "SystemEventTrigger" == triggerType ? ($("#fldTimeOfDay", page).hide(), $("#fldDayOfWeek", page).hide(), $("#fldSelectSystemEvent", page).show(), $("#fldSelectInterval", page).hide(), $("#selectTimeOfDay", page).removeAttr("required")) : "IntervalTrigger" == triggerType ? ($("#fldTimeOfDay", page).hide(), $("#fldDayOfWeek", page).hide(), $("#fldSelectSystemEvent", page).hide(), $("#fldSelectInterval", page).show(), $("#selectTimeOfDay", page).removeAttr("required")) : "StartupTrigger" == triggerType && ($("#fldTimeOfDay", page).hide(), $("#fldDayOfWeek", page).hide(), $("#fldSelectSystemEvent", page).hide(), $("#fldSelectInterval", page).hide(), $("#selectTimeOfDay", page).removeAttr("required"))
refreshTriggerFields: function (page, triggerType) {
if (triggerType == "DailyTrigger") {
$("#fldTimeOfDay", page).show();
$("#fldDayOfWeek", page).hide();
$("#fldSelectSystemEvent", page).hide();
$("#fldSelectInterval", page).hide();
$("#selectTimeOfDay", page).attr("required", "required");
} else if (triggerType == "WeeklyTrigger") {
$("#fldTimeOfDay", page).show();
$("#fldDayOfWeek", page).show();
$("#fldSelectSystemEvent", page).hide();
$("#fldSelectInterval", page).hide();
$("#selectTimeOfDay", page).attr("required", "required");
} else if (triggerType == "SystemEventTrigger") {
$("#fldTimeOfDay", page).hide();
$("#fldDayOfWeek", page).hide();
$("#fldSelectSystemEvent", page).show();
$("#fldSelectInterval", page).hide();
$("#selectTimeOfDay", page).removeAttr("required");
} else if (triggerType == "IntervalTrigger") {
$("#fldTimeOfDay", page).hide();
$("#fldDayOfWeek", page).hide();
$("#fldSelectSystemEvent", page).hide();
$("#fldSelectInterval", page).show();
$("#selectTimeOfDay", page).removeAttr("required");
} else if (triggerType == "StartupTrigger") {
$("#fldTimeOfDay", page).hide();
$("#fldDayOfWeek", page).hide();
$("#fldSelectSystemEvent", page).hide();
$("#fldSelectInterval", page).hide();
$("#selectTimeOfDay", page).removeAttr("required");
}
},
getTriggerToAdd: function(page) {
getTriggerToAdd: function (page) {
var trigger = {
Type: $("#selectTriggerType", page).val()
};
"DailyTrigger" == trigger.Type ? trigger.TimeOfDayTicks = $("#selectTimeOfDay", page).val() : "WeeklyTrigger" == trigger.Type ? (trigger.DayOfWeek = $("#selectDayOfWeek", page).val(), trigger.TimeOfDayTicks = $("#selectTimeOfDay", page).val()) : "SystemEventTrigger" == trigger.Type ? trigger.SystemEvent = $("#selectSystemEvent", page).val() : "IntervalTrigger" == trigger.Type && (trigger.IntervalTicks = $("#selectInterval", page).val());
if (trigger.Type == "DailyTrigger") {
trigger.TimeOfDayTicks = $("#selectTimeOfDay", page).val();
} else if (trigger.Type == "WeeklyTrigger") {
trigger.DayOfWeek = $("#selectDayOfWeek", page).val();
trigger.TimeOfDayTicks = $("#selectTimeOfDay", page).val();
} else if (trigger.Type == "SystemEventTrigger") {
trigger.SystemEvent = $("#selectSystemEvent", page).val();
} else if (trigger.Type == "IntervalTrigger") {
trigger.IntervalTicks = $("#selectInterval", page).val();
}
var timeLimit = $("#txtTimeLimit", page).val() || "0";
return timeLimit = 36e5 * parseFloat(timeLimit), trigger.MaxRuntimeMs = timeLimit || null, trigger
timeLimit = parseFloat(timeLimit) * 3600000;
trigger.MaxRuntimeMs = timeLimit || null;
return trigger;
}
};
return function(view, params) {
return function (view, params) {
function onSubmit(e) {
loading.show();
var id = getParameterByName("id");
ApiClient.getScheduledTask(id).then(function(task) {
task.Triggers.push(ScheduledTaskPage.getTriggerToAdd(view)), ApiClient.updateScheduledTaskTriggers(task.Id, task.Triggers).then(function() {
$("#popupAddTrigger").addClass("hide"), ScheduledTaskPage.refreshScheduledTask(view)
})
}), e.preventDefault()
ApiClient.getScheduledTask(id).then(function (task) {
task.Triggers.push(ScheduledTaskPage.getTriggerToAdd(view));
ApiClient.updateScheduledTaskTriggers(task.Id, task.Triggers).then(function () {
$("#popupAddTrigger").addClass("hide");
ScheduledTaskPage.refreshScheduledTask(view);
});
});
e.preventDefault();
}
view.querySelector(".addTriggerForm").addEventListener("submit", onSubmit), fillTimeOfDay(view.querySelector("#selectTimeOfDay")), $(view.querySelector("#popupAddTrigger").parentNode).trigger("create"), view.querySelector(".selectTriggerType").addEventListener("change", function() {
ScheduledTaskPage.refreshTriggerFields(view, this.value)
}), view.querySelector(".btnAddTrigger").addEventListener("click", function() {
ScheduledTaskPage.showAddTriggerPopup(view)
}), view.addEventListener("click", function(e) {
view.querySelector(".addTriggerForm").addEventListener("submit", onSubmit);
fillTimeOfDay(view.querySelector("#selectTimeOfDay"));
$(view.querySelector("#popupAddTrigger").parentNode).trigger("create");
view.querySelector(".selectTriggerType").addEventListener("change", function () {
ScheduledTaskPage.refreshTriggerFields(view, this.value);
});
view.querySelector(".btnAddTrigger").addEventListener("click", function () {
ScheduledTaskPage.showAddTriggerPopup(view);
});
view.addEventListener("click", function (e) {
var btnDeleteTrigger = dom.parentWithClass(e.target, "btnDeleteTrigger");
btnDeleteTrigger && ScheduledTaskPage.confirmDeleteTrigger(view, parseInt(btnDeleteTrigger.getAttribute("data-index")))
}), view.addEventListener("viewshow", function() {
ScheduledTaskPage.refreshScheduledTask(view)
})
}
});
if (btnDeleteTrigger) {
ScheduledTaskPage.confirmDeleteTrigger(view, parseInt(btnDeleteTrigger.getAttribute("data-index")));
}
});
view.addEventListener("viewshow", function () {
ScheduledTaskPage.refreshScheduledTask(view);
});
};
});

View file

@ -1,21 +1,36 @@
define(["focusManager", "searchFields", "searchResults", "events"], function(focusManager, SearchFields, SearchResults, events) {
define(["focusManager", "searchFields", "searchResults", "events"], function (focusManager, SearchFields, SearchResults, events) {
"use strict";
return function(view, params) {
return function (view, params) {
function onSearch(e, value) {
self.searchResults.search(value)
self.searchResults.search(value);
}
var self = this;
view.addEventListener("viewshow", function() {
self.searchFields || (self.searchFields = new SearchFields({
element: view.querySelector(".searchFields")
}), self.searchResults = new SearchResults({
element: view.querySelector(".searchResults"),
serverId: params.serverId || ApiClient.serverId(),
parentId: params.parentId,
collectionType: params.collectionType
}), events.on(self.searchFields, "search", onSearch))
}), view.addEventListener("viewdestroy", function() {
self.searchFields && (self.searchFields.destroy(), self.searchFields = null), self.searchResults && (self.searchResults.destroy(), self.searchResults = null)
})
}
});
view.addEventListener("viewshow", function () {
if (!self.searchFields) {
self.searchFields = new SearchFields({
element: view.querySelector(".searchFields")
});
self.searchResults = new SearchResults({
element: view.querySelector(".searchResults"),
serverId: params.serverId || ApiClient.serverId(),
parentId: params.parentId,
collectionType: params.collectionType
});
events.on(self.searchFields, "search", onSearch);
}
});
view.addEventListener("viewdestroy", function () {
if (self.searchFields) {
self.searchFields.destroy();
self.searchFields = null;
}
if (self.searchResults) {
self.searchResults.destroy();
self.searchResults = null;
}
});
};
});

View file

@ -1,50 +1,56 @@
define(["loading", "appRouter", "layoutManager", "appSettings", "apphost", "focusManager", "connectionManager", "globalize", "actionsheet", "dom", "material-icons", "flexStyles", "emby-scroller", "emby-itemscontainer", "cardStyle", "emby-button"], function(loading, appRouter, layoutManager, appSettings, appHost, focusManager, connectionManager, globalize, actionSheet, dom) {
define(["loading", "appRouter", "layoutManager", "appSettings", "apphost", "focusManager", "connectionManager", "globalize", "actionsheet", "dom", "material-icons", "flexStyles", "emby-scroller", "emby-itemscontainer", "cardStyle", "emby-button"], function (loading, appRouter, layoutManager, appSettings, appHost, focusManager, connectionManager, globalize, actionSheet, dom) {
"use strict";
function renderSelectServerItems(view, servers) {
var items = servers.map(function(server) {
return {
name: server.Name,
showIcon: !0,
icon: "&#xE307;",
cardType: "",
id: server.Id,
server: server
}
var items = servers.map(function (server) {
return {
name: server.Name,
showIcon: true,
icon: "&#xE307;",
cardType: "",
id: server.Id,
server: server
};
});
var html = items.map(function(item) {
var cardImageContainer;
if (item.showIcon) {
cardImageContainer = '<i class="cardImageIcon md-icon">' + item.icon + "</i>";
} else {
cardImageContainer = '<div class="cardImage" style="' + item.cardImageStyle + '"></div>';
}
var cardBoxCssClass = "cardBox";
if (layoutManager.tv) {
cardBoxCssClass += " cardBox-focustransform";
}
var innerOpening = '<div class="' + cardBoxCssClass + '">';
var cardContainer = '';
cardContainer += '<button raised class="card overflowSquareCard loginSquareCard scalableCard overflowSquareCard-scalable" style="display:inline-block;" data-id="' + item.id + '" data-url="' + (item.url || "") + '" data-cardtype="' + item.cardType + '">';
cardContainer += innerOpening;
cardContainer += '<div class="cardScalable card-focuscontent">';
cardContainer += '<div class="cardPadder cardPadder-square">';
cardContainer += '</div>';
cardContainer += '<div class="cardContent">';
cardContainer += '<div class="cardImageContainer coveredImage" style="background:#0288D1;border-radius:.15em;">';
cardContainer += cardImageContainer;
cardContainer += '</div>';
cardContainer += '</div>';
cardContainer += '</div>';
cardContainer += '<div class="cardFooter">';
cardContainer += '<div class="cardText cardTextCentered">' + item.name + '</div>';
cardContainer += '</div></div></button>';
return cardContainer;
var html = items.map(function (item) {
var cardImageContainer;
if (item.showIcon) {
cardImageContainer = '<i class="cardImageIcon md-icon">' + item.icon + "</i>";
} else {
cardImageContainer = '<div class="cardImage" style="' + item.cardImageStyle + '"></div>';
}
var cardBoxCssClass = "cardBox";
if (layoutManager.tv) {
cardBoxCssClass += " cardBox-focustransform";
}
var innerOpening = '<div class="' + cardBoxCssClass + '">';
var cardContainer = '';
cardContainer += '<button raised class="card overflowSquareCard loginSquareCard scalableCard overflowSquareCard-scalable" style="display:inline-block;" data-id="' + item.id + '" data-url="' + (item.url || "") + '" data-cardtype="' + item.cardType + '">';
cardContainer += innerOpening;
cardContainer += '<div class="cardScalable card-focuscontent">';
cardContainer += '<div class="cardPadder cardPadder-square">';
cardContainer += '</div>';
cardContainer += '<div class="cardContent">';
cardContainer += '<div class="cardImageContainer coveredImage" style="background:#0288D1;border-radius:.15em;">';
cardContainer += cardImageContainer;
cardContainer += '</div>';
cardContainer += '</div>';
cardContainer += '</div>';
cardContainer += '<div class="cardFooter">';
cardContainer += '<div class="cardText cardTextCentered">' + item.name + '</div>';
cardContainer += '</div></div></button>';
return cardContainer;
}).join("");
var itemsContainer = view.querySelector(".servers");
if (!items.length) {
html = '<p>' + globalize.translate("MessageNoServersAvailable") + "</p>";
}
itemsContainer.innerHTML = html;
loading.hide();
}
@ -73,7 +79,7 @@ define(["loading", "appRouter", "layoutManager", "appSettings", "apphost", "focu
}
function alertTextWithOptions(options) {
require(["alert"], function(alert) {
require(["alert"], function (alert) {
alert(options);
});
}
@ -82,38 +88,42 @@ define(["loading", "appRouter", "layoutManager", "appSettings", "apphost", "focu
alertText(globalize.translate("MessageUnableToConnectToServer"), globalize.translate("HeaderConnectionFailure"));
}
return function(view, params) {
return function (view, params) {
function connectToServer(server) {
loading.show();
connectionManager.connectToServer(server, {
enableAutoLogin: appSettings.enableAutoLogin()
}).then(function(result) {
}).then(function (result) {
loading.hide();
var apiClient = result.ApiClient;
switch (result.State) {
case "SignedIn":
Dashboard.onServerChanged(apiClient.getCurrentUserId(), apiClient.accessToken(), apiClient);
Dashboard.navigate("home.html");
break;
case "ServerSignIn":
Dashboard.onServerChanged(null, null, apiClient);
Dashboard.navigate("login.html?serverid=" + result.Servers[0].Id);
break;
case "ServerUpdateNeeded":
alertTextWithOptions({
text: globalize.translate("core#ServerUpdateNeeded", "https://github.com/jellyfin/jellyfin"),
html: globalize.translate("core#ServerUpdateNeeded", '<a href="https://github.com/jellyfin/jellyfin">https://github.com/jellyfin/jellyfin</a>')
});
break;
default:
showServerConnectionFailure();
}
})
});
}
function deleteServer(server) {
loading.show();
connectionManager.deleteServer(server.Id).then(function() {
connectionManager.deleteServer(server.Id).then(function () {
loading.hide();
loadServers();
});
@ -132,20 +142,22 @@ define(["loading", "appRouter", "layoutManager", "appSettings", "apphost", "focu
actionSheet.show({
items: menuItems,
title: server.Name
}).then(function(id) {
}).then(function (id) {
switch (id) {
case "connect":
connectToServer(server);
break;
case "delete":
deleteServer(server);
}
})
});
}
function onServersRetrieved(result) {
servers = result;
renderSelectServerItems(view, result);
if (layoutManager.tv) {
focusManager.autoFocus(view);
}
@ -158,25 +170,29 @@ define(["loading", "appRouter", "layoutManager", "appSettings", "apphost", "focu
var servers;
updatePageStyle(view, params);
view.addEventListener("viewshow", function(e) {
view.addEventListener("viewshow", function (e) {
var isRestored = e.detail.isRestored;
appRouter.setTitle(null);
if (!isRestored) loadServers();
if (!isRestored) {
loadServers();
}
});
view.querySelector(".servers").addEventListener("click", function(e) {
view.querySelector(".servers").addEventListener("click", function (e) {
var card = dom.parentWithClass(e.target, "card");
if (card) {
var url = card.getAttribute("data-url");
if (url) {
appRouter.show(url);
} else {
var id = card.getAttribute("data-id");
onServerClick(servers.filter(function(s) {
onServerClick(servers.filter(function (s) {
return s.Id === id;
})[0]);
}
}
})
}
});
};
});

View file

@ -1,14 +1,31 @@
define(["components/activitylog", "globalize"], function(ActivityLog, globalize) {
define(["components/activitylog", "globalize"], function (ActivityLog, globalize) {
"use strict";
return function(view, params) {
return function (view, params) {
var activityLog;
"false" !== params.useractivity ? (view.querySelector(".activityItems").setAttribute("data-useractivity", "true"), view.querySelector(".sectionTitle").innerHTML = globalize.translate("HeaderActivity")) : (view.querySelector(".activityItems").setAttribute("data-useractivity", "false"), view.querySelector(".sectionTitle").innerHTML = globalize.translate("Alerts")), view.addEventListener("viewshow", function() {
activityLog || (activityLog = new ActivityLog({
serverId: ApiClient.serverId(),
element: view.querySelector(".activityItems")
}))
}), view.addEventListener("viewdestroy", function() {
activityLog && activityLog.destroy(), activityLog = null
})
}
});
if (params.useractivity !== "false") {
view.querySelector(".activityItems").setAttribute("data-useractivity", "true");
view.querySelector(".sectionTitle").innerHTML = globalize.translate("HeaderActivity");
} else {
view.querySelector(".activityItems").setAttribute("data-useractivity", "false");
view.querySelector(".sectionTitle").innerHTML = globalize.translate("Alerts");
}
view.addEventListener("viewshow", function () {
if (!activityLog) {
activityLog = new ActivityLog({
serverId: ApiClient.serverId(),
element: view.querySelector(".activityItems")
});
}
});
view.addEventListener("viewdestroy", function () {
if (activityLog) {
activityLog.destroy();
}
activityLog = null;
});
};
});

View file

@ -1,169 +1,233 @@
define(["loading", "events", "libraryBrowser", "imageLoader", "listView", "cardBuilder", "emby-itemscontainer"], function(loading, events, libraryBrowser, imageLoader, listView, cardBuilder) {
define(["loading", "events", "libraryBrowser", "imageLoader", "listView", "cardBuilder", "emby-itemscontainer"], function (loading, events, libraryBrowser, imageLoader, listView, cardBuilder) {
"use strict";
return function(view, params, tabContent) {
return function (view, params, tabContent) {
function getPageData(context) {
var key = getSavedQueryKey(context),
pageData = data[key];
return pageData || (pageData = data[key] = {
query: {
SortBy: "SeriesSortName,SortName",
SortOrder: "Ascending",
IncludeItemTypes: "Episode",
Recursive: !0,
Fields: "PrimaryImageAspectRatio,MediaSourceCount,UserData",
IsMissing: !1,
ImageTypeLimit: 1,
EnableImageTypes: "Primary,Backdrop,Thumb",
StartIndex: 0,
Limit: pageSize
},
view: libraryBrowser.getSavedView(key) || "Poster"
}, pageData.query.ParentId = params.topParentId, libraryBrowser.loadSavedQueryValues(key, pageData.query)), pageData
var key = getSavedQueryKey(context);
var pageData = data[key];
if (!pageData) {
pageData = data[key] = {
query: {
SortBy: "SeriesSortName,SortName",
SortOrder: "Ascending",
IncludeItemTypes: "Episode",
Recursive: true,
Fields: "PrimaryImageAspectRatio,MediaSourceCount,UserData",
IsMissing: false,
ImageTypeLimit: 1,
EnableImageTypes: "Primary,Backdrop,Thumb",
StartIndex: 0,
Limit: pageSize
},
view: libraryBrowser.getSavedView(key) || "Poster"
};
pageData.query.ParentId = params.topParentId;
libraryBrowser.loadSavedQueryValues(key, pageData.query);
}
return pageData;
}
function getQuery(context) {
return getPageData(context).query
return getPageData(context).query;
}
function getSavedQueryKey(context) {
return context.savedQueryKey || (context.savedQueryKey = libraryBrowser.getSavedQueryKey("episodes")), context.savedQueryKey
if (!context.savedQueryKey) {
context.savedQueryKey = libraryBrowser.getSavedQueryKey("episodes");
}
return context.savedQueryKey;
}
function onViewStyleChange() {
var viewStyle = self.getCurrentViewStyle(),
itemsContainer = tabContent.querySelector(".itemsContainer");
"List" == viewStyle ? (itemsContainer.classList.add("vertical-list"), itemsContainer.classList.remove("vertical-wrap")) : (itemsContainer.classList.remove("vertical-list"), itemsContainer.classList.add("vertical-wrap")), itemsContainer.innerHTML = ""
var viewStyle = self.getCurrentViewStyle();
var itemsContainer = tabContent.querySelector(".itemsContainer");
if ("List" == viewStyle) {
itemsContainer.classList.add("vertical-list");
itemsContainer.classList.remove("vertical-wrap");
} else {
itemsContainer.classList.remove("vertical-list");
itemsContainer.classList.add("vertical-wrap");
}
itemsContainer.innerHTML = "";
}
function reloadItems(page) {
loading.show();
isLoading = true;
var query = getQuery(page);
ApiClient.getItems(Dashboard.getCurrentUserId(), query).then(function(result) {
ApiClient.getItems(Dashboard.getCurrentUserId(), query).then(function (result) {
function onNextPageClick() {
if (isLoading) return;
if (isLoading) {
return;
}
query.StartIndex += query.Limit;
reloadItems(tabContent)
reloadItems(tabContent);
}
function onPreviousPageClick() {
if (isLoading) return;
if (isLoading) {
return;
}
query.StartIndex -= query.Limit;
reloadItems(tabContent)
reloadItems(tabContent);
}
window.scrollTo(0, 0);
var html, pagingHtml = libraryBrowser.getQueryPagingHtml({
startIndex: query.StartIndex,
limit: query.Limit,
totalRecordCount: result.TotalRecordCount,
showLimit: !1,
updatePageSizeSetting: !1,
addLayoutButton: !1,
sortButton: !1,
filterButton: !1
}),
viewStyle = self.getCurrentViewStyle(),
itemsContainer = tabContent.querySelector(".itemsContainer");
html = "List" == viewStyle ? listView.getListViewHtml({
items: result.Items,
sortBy: query.SortBy,
showParentTitle: !0
}) : "PosterCard" == viewStyle ? cardBuilder.getCardsHtml({
items: result.Items,
shape: "backdrop",
showTitle: !0,
showParentTitle: !0,
scalable: !0,
cardLayout: !0
}) : cardBuilder.getCardsHtml({
items: result.Items,
shape: "backdrop",
showTitle: !0,
showParentTitle: !0,
overlayText: !1,
centerText: !0,
scalable: !0,
overlayPlayButton: !0
var html;
var pagingHtml = libraryBrowser.getQueryPagingHtml({
startIndex: query.StartIndex,
limit: query.Limit,
totalRecordCount: result.TotalRecordCount,
showLimit: false,
updatePageSizeSetting: false,
addLayoutButton: false,
sortButton: false,
filterButton: false
});
var i, length, elems;
for (elems = tabContent.querySelectorAll(".paging"), i = 0, length = elems.length; i < length; i++)
var viewStyle = self.getCurrentViewStyle();
var itemsContainer = tabContent.querySelector(".itemsContainer");
if (viewStyle == "List") {
html = listView.getListViewHtml({
items: result.Items,
sortBy: query.SortBy,
showParentTitle: true
});
} else if (viewStyle == "PosterCard") {
html = cardBuilder.getCardsHtml({
items: result.Items,
shape: "backdrop",
showTitle: true,
showParentTitle: true,
scalable: true,
cardLayout: true
});
} else {
html = cardBuilder.getCardsHtml({
items: result.Items,
shape: "backdrop",
showTitle: true,
showParentTitle: true,
overlayText: false,
centerText: true,
scalable: true,
overlayPlayButton: true
});
}
var i;
var length;
var elems;
elems = tabContent.querySelectorAll(".paging");
for (i = 0, length = elems.length; i < length; i++) {
elems[i].innerHTML = pagingHtml;
for (elems = tabContent.querySelectorAll(".btnNextPage"), i = 0, length = elems.length; i < length; i++)
}
elems = tabContent.querySelectorAll(".btnNextPage");
for (i = 0, length = elems.length; i < length; i++) {
elems[i].addEventListener("click", onNextPageClick);
for (elems = tabContent.querySelectorAll(".btnPreviousPage"), i = 0, length = elems.length; i < length; i++)
}
elems = tabContent.querySelectorAll(".btnPreviousPage");
for (i = 0, length = elems.length; i < length; i++) {
elems[i].addEventListener("click", onPreviousPageClick);
}
itemsContainer.innerHTML = html;
imageLoader.lazyChildren(itemsContainer);
libraryBrowser.saveQueryValues(getSavedQueryKey(page), query);
loading.hide();
isLoading = false;
})
});
}
var self = this,
pageSize = 100,
data = {},
isLoading = false;
self.showFilterMenu = function() {
require(["components/filterdialog/filterdialog"], function(filterDialogFactory) {
var filterDialog = new filterDialogFactory({
query: getQuery(tabContent),
mode: "episodes",
serverId: ApiClient.serverId()
});
events.on(filterDialog, "filterchange", function() {
reloadItems(tabContent)
}), filterDialog.show()
})
}, self.getCurrentViewStyle = function() {
return getPageData(tabContent).view
},
function(tabContent) {
tabContent.querySelector(".btnFilter").addEventListener("click", function() {
self.showFilterMenu()
}), tabContent.querySelector(".btnSort").addEventListener("click", function(e) {
libraryBrowser.showSortMenu({
items: [{
name: Globalize.translate("OptionNameSort"),
id: "SeriesSortName,SortName"
}, {
name: Globalize.translate("OptionTvdbRating"),
id: "CommunityRating,SeriesSortName,SortName"
}, {
name: Globalize.translate("OptionDateAdded"),
id: "DateCreated,SeriesSortName,SortName"
}, {
name: Globalize.translate("OptionPremiereDate"),
id: "PremiereDate,SeriesSortName,SortName"
}, {
name: Globalize.translate("OptionDatePlayed"),
id: "DatePlayed,SeriesSortName,SortName"
}, {
name: Globalize.translate("OptionParentalRating"),
id: "OfficialRating,SeriesSortName,SortName"
}, {
name: Globalize.translate("OptionPlayCount"),
id: "PlayCount,SeriesSortName,SortName"
}, {
name: Globalize.translate("OptionRuntime"),
id: "Runtime,SeriesSortName,SortName"
}],
callback: function() {
reloadItems(tabContent)
},
query: getQuery(tabContent),
button: e.target
})
var self = this;
var pageSize = 100;
var data = {};
var isLoading = false;
self.showFilterMenu = function () {
require(["components/filterdialog/filterdialog"], function (filterDialogFactory) {
var filterDialog = new filterDialogFactory({
query: getQuery(tabContent),
mode: "episodes",
serverId: ApiClient.serverId()
});
var btnSelectView = tabContent.querySelector(".btnSelectView");
btnSelectView.addEventListener("click", function(e) {
libraryBrowser.showLayoutMenu(e.target, self.getCurrentViewStyle(), "List,Poster,PosterCard".split(","))
}), btnSelectView.addEventListener("layoutchange", function(e) {
var viewStyle = e.detail.viewStyle;
getPageData(tabContent).view = viewStyle, libraryBrowser.saveViewSetting(getSavedQueryKey(tabContent), viewStyle), onViewStyleChange(), reloadItems(tabContent)
})
}(tabContent), onViewStyleChange(), self.renderTab = function() {
reloadItems(tabContent)
}, self.destroy = function() {}
}
events.on(filterDialog, "filterchange", function () {
reloadItems(tabContent);
});
filterDialog.show();
});
};
self.getCurrentViewStyle = function () {
return getPageData(tabContent).view;
};
function initPage(tabContent) {
tabContent.querySelector(".btnFilter").addEventListener("click", function () {
self.showFilterMenu();
});
tabContent.querySelector(".btnSort").addEventListener("click", function (e) {
libraryBrowser.showSortMenu({
items: [{
name: Globalize.translate("OptionNameSort"),
id: "SeriesSortName,SortName"
}, {
name: Globalize.translate("OptionTvdbRating"),
id: "CommunityRating,SeriesSortName,SortName"
}, {
name: Globalize.translate("OptionDateAdded"),
id: "DateCreated,SeriesSortName,SortName"
}, {
name: Globalize.translate("OptionPremiereDate"),
id: "PremiereDate,SeriesSortName,SortName"
}, {
name: Globalize.translate("OptionDatePlayed"),
id: "DatePlayed,SeriesSortName,SortName"
}, {
name: Globalize.translate("OptionParentalRating"),
id: "OfficialRating,SeriesSortName,SortName"
}, {
name: Globalize.translate("OptionPlayCount"),
id: "PlayCount,SeriesSortName,SortName"
}, {
name: Globalize.translate("OptionRuntime"),
id: "Runtime,SeriesSortName,SortName"
}],
callback: function () {
reloadItems(tabContent);
},
query: getQuery(tabContent),
button: e.target
});
});
var btnSelectView = tabContent.querySelector(".btnSelectView");
btnSelectView.addEventListener("click", function (e) {
libraryBrowser.showLayoutMenu(e.target, self.getCurrentViewStyle(), "List,Poster,PosterCard".split(","));
});
btnSelectView.addEventListener("layoutchange", function (e) {
var viewStyle = e.detail.viewStyle;
getPageData(tabContent).view = viewStyle;
libraryBrowser.saveViewSetting(getSavedQueryKey(tabContent), viewStyle);
onViewStyleChange();
reloadItems(tabContent);
});
}
initPage(tabContent);
onViewStyleChange();
self.renderTab = function () {
reloadItems(tabContent);
};
self.destroy = function () {};
};
});

View file

@ -1,139 +1,200 @@
define(["layoutManager", "loading", "libraryBrowser", "cardBuilder", "lazyLoader", "apphost", "globalize", "appRouter", "dom", "emby-button"], function(layoutManager, loading, libraryBrowser, cardBuilder, lazyLoader, appHost, globalize, appRouter, dom) {
define(["layoutManager", "loading", "libraryBrowser", "cardBuilder", "lazyLoader", "apphost", "globalize", "appRouter", "dom", "emby-button"], function (layoutManager, loading, libraryBrowser, cardBuilder, lazyLoader, appHost, globalize, appRouter, dom) {
"use strict";
return function(view, params, tabContent) {
return function (view, params, tabContent) {
function getPageData() {
var key = getSavedQueryKey(),
pageData = data[key];
return pageData || (pageData = data[key] = {
query: {
SortBy: "SortName",
SortOrder: "Ascending",
IncludeItemTypes: "Series",
Recursive: !0,
EnableTotalRecordCount: !1
},
view: "Poster"
}, pageData.query.ParentId = params.topParentId, libraryBrowser.loadSavedQueryValues(key, pageData.query)), pageData
var key = getSavedQueryKey();
var pageData = data[key];
if (!pageData) {
pageData = data[key] = {
query: {
SortBy: "SortName",
SortOrder: "Ascending",
IncludeItemTypes: "Series",
Recursive: true,
EnableTotalRecordCount: false
},
view: "Poster"
};
pageData.query.ParentId = params.topParentId;
libraryBrowser.loadSavedQueryValues(key, pageData.query);
}
return pageData;
}
function getQuery() {
return getPageData().query
return getPageData().query;
}
function getSavedQueryKey() {
return libraryBrowser.getSavedQueryKey("seriesgenres")
return libraryBrowser.getSavedQueryKey("seriesgenres");
}
function getPromise() {
loading.show();
var query = getQuery();
return ApiClient.getGenres(ApiClient.getCurrentUserId(), query)
return ApiClient.getGenres(ApiClient.getCurrentUserId(), query);
}
function enableScrollX() {
return !layoutManager.desktop
return !layoutManager.desktop;
}
function getThumbShape() {
return enableScrollX() ? "overflowBackdrop" : "backdrop"
return enableScrollX() ? "overflowBackdrop" : "backdrop";
}
function getPortraitShape() {
return enableScrollX() ? "overflowPortrait" : "portrait"
return enableScrollX() ? "overflowPortrait" : "portrait";
}
function fillItemsContainer(elem) {
var id = elem.getAttribute("data-id"),
viewStyle = self.getCurrentViewStyle(),
limit = "Thumb" == viewStyle || "ThumbCard" == viewStyle ? 5 : 9;
enableScrollX() && (limit = 10);
var enableImageTypes = "Thumb" == viewStyle || "ThumbCard" == viewStyle ? "Primary,Backdrop,Thumb" : "Primary",
query = {
SortBy: "SortName",
SortOrder: "Ascending",
IncludeItemTypes: "Series",
Recursive: !0,
Fields: "PrimaryImageAspectRatio,MediaSourceCount,BasicSyncInfo",
ImageTypeLimit: 1,
EnableImageTypes: enableImageTypes,
Limit: limit,
GenreIds: id,
EnableTotalRecordCount: !1,
ParentId: params.topParentId
};
ApiClient.getItems(ApiClient.getCurrentUserId(), query).then(function(result) {
var id = elem.getAttribute("data-id");
var viewStyle = self.getCurrentViewStyle();
var limit = "Thumb" == viewStyle || "ThumbCard" == viewStyle ? 5 : 9;
if (enableScrollX()) {
limit = 10;
}
var enableImageTypes = "Thumb" == viewStyle || "ThumbCard" == viewStyle ? "Primary,Backdrop,Thumb" : "Primary";
var query = {
SortBy: "SortName",
SortOrder: "Ascending",
IncludeItemTypes: "Series",
Recursive: true,
Fields: "PrimaryImageAspectRatio,MediaSourceCount,BasicSyncInfo",
ImageTypeLimit: 1,
EnableImageTypes: enableImageTypes,
Limit: limit,
GenreIds: id,
EnableTotalRecordCount: false,
ParentId: params.topParentId
};
ApiClient.getItems(ApiClient.getCurrentUserId(), query).then(function (result) {
var supportsImageAnalysis = appHost.supports("imageanalysis");
"Thumb" == viewStyle ? cardBuilder.buildCards(result.Items, {
itemsContainer: elem,
shape: getThumbShape(),
preferThumb: !0,
showTitle: !0,
scalable: !0,
centerText: !0,
overlayMoreButton: !0,
allowBottomPadding: !1
}) : "ThumbCard" == viewStyle ? cardBuilder.buildCards(result.Items, {
itemsContainer: elem,
shape: getThumbShape(),
preferThumb: !0,
showTitle: !0,
scalable: !0,
centerText: !1,
cardLayout: !0,
showYear: !0
}) : "PosterCard" == viewStyle ? cardBuilder.buildCards(result.Items, {
itemsContainer: elem,
shape: getPortraitShape(),
showTitle: !0,
scalable: !0,
centerText: !1,
cardLayout: !0,
showYear: !0
}) : "Poster" == viewStyle && cardBuilder.buildCards(result.Items, {
itemsContainer: elem,
shape: getPortraitShape(),
scalable: !0,
overlayMoreButton: !0,
allowBottomPadding: !1
}), result.Items.length >= query.Limit && tabContent.querySelector(".btnMoreFromGenre" + id + " i").classList.remove("hide")
})
if (viewStyle == "Thumb") {
cardBuilder.buildCards(result.Items, {
itemsContainer: elem,
shape: getThumbShape(),
preferThumb: true,
showTitle: true,
scalable: true,
centerText: true,
overlayMoreButton: true,
allowBottomPadding: false
});
} else if (viewStyle == "ThumbCard") {
cardBuilder.buildCards(result.Items, {
itemsContainer: elem,
shape: getThumbShape(),
preferThumb: true,
showTitle: true,
scalable: true,
centerText: false,
cardLayout: true,
showYear: true
});
} else if (viewStyle == "PosterCard") {
cardBuilder.buildCards(result.Items, {
itemsContainer: elem,
shape: getPortraitShape(),
showTitle: true,
scalable: true,
centerText: false,
cardLayout: true,
showYear: true
});
} else if (viewStyle == "Poster") {
cardBuilder.buildCards(result.Items, {
itemsContainer: elem,
shape: getPortraitShape(),
scalable: true,
overlayMoreButton: true,
allowBottomPadding: false
});
}
if (result.Items.length >= query.Limit) {
tabContent.querySelector(".btnMoreFromGenre" + id + " i").classList.remove("hide");
}
});
}
function reloadItems(context, promise) {
var query = getQuery();
promise.then(function(result) {
for (var elem = context.querySelector("#items"), html = "", items = result.Items, i = 0, length = items.length; i < length; i++) {
promise.then(function (result) {
var elem = context.querySelector("#items");
var html = "";
var items = result.Items;
for (var i = 0, length = items.length; i < length; i++) {
var item = items[i];
if (html += '<div class="verticalSection">', html += '<div class="sectionTitleContainer sectionTitleContainer-cards padded-left">', html += '<a is="emby-linkbutton" href="' + appRouter.getRouteUrl(item, {
context: "tvshows",
parentId: params.topParentId
}) + '" class="more button-flat button-flat-mini sectionTitleTextButton btnMoreFromGenre' + item.Id + '">', html += '<h2 class="sectionTitle sectionTitle-cards">', html += item.Name, html += "</h2>", html += '<i class="md-icon hide">&#xE5CC;</i>', html += "</a>", html += "</div>", enableScrollX()) {
html += '<div class="verticalSection">';
html += '<div class="sectionTitleContainer sectionTitleContainer-cards padded-left">';
html += '<a is="emby-linkbutton" href="' + appRouter.getRouteUrl(item, {
context: "tvshows",
parentId: params.topParentId
}) + '" class="more button-flat button-flat-mini sectionTitleTextButton btnMoreFromGenre' + item.Id + '">';
html += '<h2 class="sectionTitle sectionTitle-cards">';
html += item.Name;
html += "</h2>";
html += '<i class="md-icon hide">&#xE5CC;</i>';
html += "</a>";
html += "</div>";
if (enableScrollX()) {
var scrollXClass = "scrollX hiddenScrollX";
layoutManager.tv && (scrollXClass += " smoothScrollX"), html += '<div is="emby-itemscontainer" class="itemsContainer ' + scrollXClass + ' lazy padded-left padded-right" data-id="' + item.Id + '">'
} else html += '<div is="emby-itemscontainer" class="itemsContainer vertical-wrap lazy padded-left padded-right" data-id="' + item.Id + '">';
html += "</div>", html += "</div>"
if (layoutManager.tv) {
scrollXClass += "smoothScrollX";
}
html += '<div is="emby-itemscontainer" class="itemsContainer ' + scrollXClass + ' lazy padded-left padded-right" data-id="' + item.Id + '">';
} else {
html += '<div is="emby-itemscontainer" class="itemsContainer vertical-wrap lazy padded-left padded-right" data-id="' + item.Id + '">';
}
html += "</div>";
html += "</div>";
}
elem.innerHTML = html, lazyLoader.lazyChildren(elem, fillItemsContainer), libraryBrowser.saveQueryValues(getSavedQueryKey(), query), loading.hide()
})
elem.innerHTML = html;
lazyLoader.lazyChildren(elem, fillItemsContainer);
libraryBrowser.saveQueryValues(getSavedQueryKey(), query);
loading.hide();
});
}
function fullyReload() {
self.preRender(), self.renderTab()
self.preRender();
self.renderTab();
}
var self = this,
data = {};
self.getViewStyles = function() {
return "Poster,PosterCard,Thumb,ThumbCard".split(",")
}, self.getCurrentViewStyle = function() {
return getPageData(tabContent).view
}, self.setCurrentViewStyle = function(viewStyle) {
getPageData(tabContent).view = viewStyle, libraryBrowser.saveViewSetting(getSavedQueryKey(tabContent), viewStyle), fullyReload()
}, self.enableViewSelection = !0;
var self = this;
var data = {};
self.getViewStyles = function () {
return "Poster,PosterCard,Thumb,ThumbCard".split(",");
};
self.getCurrentViewStyle = function () {
return getPageData(tabContent).view;
};
self.setCurrentViewStyle = function (viewStyle) {
getPageData(tabContent).view = viewStyle;
libraryBrowser.saveViewSetting(getSavedQueryKey(tabContent), viewStyle);
fullyReload();
};
self.enableViewSelection = true;
var promise;
self.preRender = function() {
promise = getPromise()
}, self.renderTab = function() {
reloadItems(tabContent, promise)
}
}
});
self.preRender = function () {
promise = getPromise();
};
self.renderTab = function () {
reloadItems(tabContent, promise);
};
};
});

View file

@ -1,52 +1,60 @@
define(["loading", "components/groupedcards", "cardBuilder", "apphost", "imageLoader"], function(loading, groupedcards, cardBuilder, appHost, imageLoader) {
define(["loading", "components/groupedcards", "cardBuilder", "apphost", "imageLoader"], function (loading, groupedcards, cardBuilder, appHost, imageLoader) {
"use strict";
function getLatestPromise(context, params) {
loading.show();
var userId = ApiClient.getCurrentUserId(),
parentId = params.topParentId,
options = {
IncludeItemTypes: "Episode",
Limit: 30,
Fields: "PrimaryImageAspectRatio,BasicSyncInfo",
ParentId: parentId,
ImageTypeLimit: 1,
EnableImageTypes: "Primary,Backdrop,Thumb"
};
return ApiClient.getJSON(ApiClient.getUrl("Users/" + userId + "/Items/Latest", options))
var userId = ApiClient.getCurrentUserId();
var parentId = params.topParentId;
var options = {
IncludeItemTypes: "Episode",
Limit: 30,
Fields: "PrimaryImageAspectRatio,BasicSyncInfo",
ParentId: parentId,
ImageTypeLimit: 1,
EnableImageTypes: "Primary,Backdrop,Thumb"
};
return ApiClient.getJSON(ApiClient.getUrl("Users/" + userId + "/Items/Latest", options));
}
function loadLatest(context, params, promise) {
promise.then(function(items) {
promise.then(function (items) {
var html = "";
appHost.supports("imageanalysis");
html += cardBuilder.getCardsHtml({
items: items,
shape: "backdrop",
preferThumb: !0,
showTitle: !0,
showSeriesYear: !0,
showParentTitle: !0,
overlayText: !1,
cardLayout: !1,
showUnplayedIndicator: !1,
showChildCountIndicator: !0,
centerText: !0,
lazy: !0,
overlayPlayButton: !0,
preferThumb: true,
showTitle: true,
showSeriesYear: true,
showParentTitle: true,
overlayText: false,
cardLayout: false,
showUnplayedIndicator: false,
showChildCountIndicator: true,
centerText: true,
lazy: true,
overlayPlayButton: true,
lines: 2
});
var elem = context.querySelector("#latestEpisodes");
elem.innerHTML = html, imageLoader.lazyChildren(elem), loading.hide()
})
elem.innerHTML = html;
imageLoader.lazyChildren(elem);
loading.hide();
});
}
return function(view, params, tabContent) {
return function (view, params, tabContent) {
var self = this;
var latestPromise;
self.preRender = function() {
latestPromise = getLatestPromise(view, params)
}, self.renderTab = function() {
loadLatest(tabContent, params, latestPromise)
}, tabContent.querySelector("#latestEpisodes").addEventListener("click", groupedcards.onItemsContainerClick)
}
});
self.preRender = function () {
latestPromise = getLatestPromise(view, params);
};
self.renderTab = function () {
loadLatest(tabContent, params, latestPromise);
};
tabContent.querySelector("#latestEpisodes").addEventListener("click", groupedcards.onItemsContainerClick);
};
});

View file

@ -1,4 +1,4 @@
define(["events", "inputManager", "libraryMenu", "layoutManager", "loading", "dom", "userSettings", "cardBuilder", "playbackManager", "mainTabsManager", "scrollStyles", "emby-itemscontainer", "emby-button"], function(events, inputManager, libraryMenu, layoutManager, loading, dom, userSettings, cardBuilder, playbackManager, mainTabsManager) {
define(["events", "inputManager", "libraryMenu", "layoutManager", "loading", "dom", "userSettings", "cardBuilder", "playbackManager", "mainTabsManager", "scrollStyles", "emby-itemscontainer", "emby-button"], function (events, inputManager, libraryMenu, layoutManager, loading, dom, userSettings, cardBuilder, playbackManager, mainTabsManager) {
"use strict";
function getTabs() {
@ -19,30 +19,51 @@ define(["events", "inputManager", "libraryMenu", "layoutManager", "loading", "do
}, {
name: Globalize.translate("ButtonSearch"),
cssClass: "searchTabButton"
}]
}];
}
function getDefaultTabIndex(folderId) {
switch (userSettings.get("landing-" + folderId)) {
case "suggestions":
return 1;
case "latest":
return 2;
case "favorites":
return 1;
case "genres":
return 4;
default:
return 0
return 0;
}
}
function setScrollClasses(elem, scrollX) {
scrollX ? (elem.classList.add("hiddenScrollX"), layoutManager.tv && elem.classList.add("smoothScrollX"), elem.classList.add("scrollX"), elem.classList.remove("vertical-wrap")) : (elem.classList.remove("hiddenScrollX"), elem.classList.remove("smoothScrollX"), elem.classList.remove("scrollX"), elem.classList.add("vertical-wrap"))
if (scrollX) {
elem.classList.add("hiddenScrollX");
if (layoutManager.tv) {
elem.classList.add("smoothScrollX");
}
elem.classList.add("scrollX");
elem.classList.remove("vertical-wrap");
} else {
elem.classList.remove("hiddenScrollX");
elem.classList.remove("smoothScrollX");
elem.classList.remove("scrollX");
elem.classList.add("vertical-wrap");
}
}
return function(view, params) {
return function (view, params) {
function reload() {
loading.show(), loadResume(), loadNextUp()
loading.show();
loadResume();
loadNextUp();
}
function loadNextUp() {
@ -52,178 +73,263 @@ define(["events", "inputManager", "libraryMenu", "layoutManager", "loading", "do
UserId: ApiClient.getCurrentUserId(),
ImageTypeLimit: 1,
EnableImageTypes: "Primary,Backdrop,Thumb",
EnableTotalRecordCount: !1
EnableTotalRecordCount: false
};
query.ParentId = libraryMenu.getTopParentId(), ApiClient.getNextUpEpisodes(query).then(function(result) {
result.Items.length ? view.querySelector(".noNextUpItems").classList.add("hide") : view.querySelector(".noNextUpItems").classList.remove("hide");
query.ParentId = libraryMenu.getTopParentId();
ApiClient.getNextUpEpisodes(query).then(function (result) {
if (result.Items.length) {
view.querySelector(".noNextUpItems").classList.add("hide");
} else {
view.querySelector(".noNextUpItems").classList.remove("hide");
}
var container = view.querySelector("#nextUpItems");
cardBuilder.buildCards(result.Items, {
itemsContainer: container,
preferThumb: !0,
preferThumb: true,
shape: "backdrop",
scalable: !0,
showTitle: !0,
showParentTitle: !0,
overlayText: !1,
centerText: !0,
overlayPlayButton: !0,
cardLayout: !1
}), loading.hide()
})
scalable: true,
showTitle: true,
showParentTitle: true,
overlayText: false,
centerText: true,
overlayPlayButton: true,
cardLayout: false
});
loading.hide();
});
}
function enableScrollX() {
return !layoutManager.desktop
return !layoutManager.desktop;
}
function getThumbShape() {
return enableScrollX() ? "overflowBackdrop" : "backdrop"
return enableScrollX() ? "overflowBackdrop" : "backdrop";
}
function loadResume() {
var parentId = libraryMenu.getTopParentId(),
screenWidth = dom.getWindowSize().innerWidth,
limit = screenWidth >= 1600 ? 5 : 6,
options = {
SortBy: "DatePlayed",
SortOrder: "Descending",
IncludeItemTypes: "Episode",
Filters: "IsResumable",
Limit: limit,
Recursive: !0,
Fields: "PrimaryImageAspectRatio,SeriesInfo,UserData,BasicSyncInfo",
ExcludeLocationTypes: "Virtual",
ParentId: parentId,
ImageTypeLimit: 1,
EnableImageTypes: "Primary,Backdrop,Thumb",
EnableTotalRecordCount: !1
};
ApiClient.getItems(ApiClient.getCurrentUserId(), options).then(function(result) {
result.Items.length ? view.querySelector("#resumableSection").classList.remove("hide") : view.querySelector("#resumableSection").classList.add("hide");
var allowBottomPadding = !enableScrollX(),
container = view.querySelector("#resumableItems");
var parentId = libraryMenu.getTopParentId();
var screenWidth = dom.getWindowSize().innerWidth;
var limit = screenWidth >= 1600 ? 5 : 6;
var options = {
SortBy: "DatePlayed",
SortOrder: "Descending",
IncludeItemTypes: "Episode",
Filters: "IsResumable",
Limit: limit,
Recursive: true,
Fields: "PrimaryImageAspectRatio,SeriesInfo,UserData,BasicSyncInfo",
ExcludeLocationTypes: "Virtual",
ParentId: parentId,
ImageTypeLimit: 1,
EnableImageTypes: "Primary,Backdrop,Thumb",
EnableTotalRecordCount: false
};
ApiClient.getItems(ApiClient.getCurrentUserId(), options).then(function (result) {
if (result.Items.length) {
view.querySelector("#resumableSection").classList.remove("hide");
} else {
view.querySelector("#resumableSection").classList.add("hide");
}
var allowBottomPadding = !enableScrollX();
var container = view.querySelector("#resumableItems");
cardBuilder.buildCards(result.Items, {
itemsContainer: container,
preferThumb: !0,
preferThumb: true,
shape: getThumbShape(),
scalable: !0,
showTitle: !0,
showParentTitle: !0,
overlayText: !1,
centerText: !0,
overlayPlayButton: !0,
scalable: true,
showTitle: true,
showParentTitle: true,
overlayText: false,
centerText: true,
overlayPlayButton: true,
allowBottomPadding: allowBottomPadding,
cardLayout: !1
})
})
cardLayout: false
});
});
}
function onBeforeTabChange(e) {
preLoadTab(view, parseInt(e.detail.selectedTabIndex))
preLoadTab(view, parseInt(e.detail.selectedTabIndex));
}
function onTabChange(e) {
var newIndex = parseInt(e.detail.selectedTabIndex);
loadTab(view, newIndex)
loadTab(view, newIndex);
}
function getTabContainers() {
return view.querySelectorAll(".pageTabContent")
return view.querySelectorAll(".pageTabContent");
}
function initTabs() {
mainTabsManager.setTabs(view, currentTabIndex, getTabs, getTabContainers, onBeforeTabChange, onTabChange)
mainTabsManager.setTabs(view, currentTabIndex, getTabs, getTabContainers, onBeforeTabChange, onTabChange);
}
function getTabController(page, index, callback) {
var depends = [];
switch (index) {
case 0:
depends.push("controllers/shows/tvshows");
break;
case 1:
break;
case 2:
depends.push("controllers/shows/tvlatest");
break;
case 3:
depends.push("controllers/shows/tvupcoming");
break;
case 4:
depends.push("controllers/shows/tvgenres");
break;
case 5:
depends.push("controllers/shows/tvstudios");
break;
case 6:
depends.push("controllers/shows/episodes");
break;
case 7:
depends.push("scripts/searchtab")
depends.push("scripts/searchtab");
}
require(depends, function(controllerFactory) {
require(depends, function (controllerFactory) {
var tabContent;
1 === index && (tabContent = view.querySelector(".pageTabContent[data-index='" + index + "']"), self.tabContent = tabContent);
if (index === 1) {
tabContent = view.querySelector(".pageTabContent[data-index='" + index + "']");
self.tabContent = tabContent;
}
var controller = tabControllers[index];
controller || (tabContent = view.querySelector(".pageTabContent[data-index='" + index + "']"), controller = 1 === index ? self : 7 === index ? new controllerFactory(view, tabContent, {
collectionType: "tvshows",
parentId: params.topParentId
}) : new controllerFactory(view, params, tabContent), tabControllers[index] = controller, controller.initTab && controller.initTab()), callback(controller)
})
if (!controller) {
tabContent = view.querySelector(".pageTabContent[data-index='" + index + "']");
if (index === 1) {
controller = self;
} else if (index === 7) {
controller = new controllerFactory(view, tabContent, {
collectionType: "tvshows",
parentId: params.topParentId
});
} else {
controller = new controllerFactory(view, params, tabContent);
}
tabControllers[index] = controller;
if (controller.initTab) {
controller.initTab();
}
}
callback(controller);
});
}
function preLoadTab(page, index) {
getTabController(page, index, function(controller) {
-1 == renderedTabs.indexOf(index) && controller.preRender && controller.preRender()
})
getTabController(page, index, function (controller) {
if (renderedTabs.indexOf(index) == -1 && controller.preRender) {
controller.preRender();
}
});
}
function loadTab(page, index) {
currentTabIndex = index, getTabController(page, index, function(controller) {
initialTabIndex = null, -1 == renderedTabs.indexOf(index) && (renderedTabs.push(index), controller.renderTab())
})
currentTabIndex = index;
getTabController(page, index, function (controller) {
initialTabIndex = null;
if (renderedTabs.indexOf(index) == -1) {
renderedTabs.push(index);
controller.renderTab();
}
});
}
function onPlaybackStop(e, state) {
state.NowPlayingItem && "Video" == state.NowPlayingItem.MediaType && (renderedTabs = [], mainTabsManager.getTabsElement().triggerTabChange())
if (state.NowPlayingItem && state.NowPlayingItem.MediaType == "Video") {
renderedTabs = [];
mainTabsManager.getTabsElement().triggerTabChange();
}
}
function onWebSocketMessage(e, data) {
var msg = data;
"UserDataChanged" === msg.MessageType && msg.Data.UserId == ApiClient.getCurrentUserId() && (renderedTabs = [])
if (msg.MessageType === "UserDataChanged" && msg.Data.UserId == ApiClient.getCurrentUserId()) {
renderedTabs = [];
}
}
function onInputCommand(e) {
switch (e.detail.command) {
case "search":
e.preventDefault(), Dashboard.navigate("search.html?collectionType=tv&parentId=" + params.topParentId)
e.preventDefault();
Dashboard.navigate("search.html?collectionType=tv&parentId=" + params.topParentId);
}
}
var isViewRestored, self = this,
currentTabIndex = parseInt(params.tab || getDefaultTabIndex(params.topParentId)),
initialTabIndex = currentTabIndex;
self.initTab = function() {
var isViewRestored;
var self = this;
var currentTabIndex = parseInt(params.tab || getDefaultTabIndex(params.topParentId));
var initialTabIndex = currentTabIndex;
self.initTab = function () {
var tabContent = self.tabContent;
setScrollClasses(tabContent.querySelector("#resumableItems"), enableScrollX());
}, self.renderTab = function() {
reload()
};
var tabControllers = [],
renderedTabs = [];
setScrollClasses(view.querySelector("#resumableItems"), enableScrollX()), view.addEventListener("viewshow", function(e) {
if (isViewRestored = e.detail.isRestored, initTabs(), !view.getAttribute("data-title")) {
self.renderTab = function () {
reload();
};
var tabControllers = [];
var renderedTabs = [];
setScrollClasses(view.querySelector("#resumableItems"), enableScrollX());
view.addEventListener("viewshow", function (e) {
isViewRestored = e.detail.isRestored;
initTabs();
if (!view.getAttribute("data-title")) {
var parentId = params.topParentId;
parentId ? ApiClient.getItem(ApiClient.getCurrentUserId(), parentId).then(function(item) {
view.setAttribute("data-title", item.Name), libraryMenu.setTitle(item.Name)
}) : (view.setAttribute("data-title", Globalize.translate("TabShows")), libraryMenu.setTitle(Globalize.translate("TabShows")))
if (parentId) {
ApiClient.getItem(ApiClient.getCurrentUserId(), parentId).then(function (item) {
view.setAttribute("data-title", item.Name);
libraryMenu.setTitle(item.Name);
});
} else {
view.setAttribute("data-title", Globalize.translate("TabShows"));
libraryMenu.setTitle(Globalize.translate("TabShows"));
}
}
events.on(playbackManager, "playbackstop", onPlaybackStop), events.on(ApiClient, "message", onWebSocketMessage), inputManager.on(window, onInputCommand)
}), view.addEventListener("viewbeforehide", function(e) {
inputManager.off(window, onInputCommand), events.off(playbackManager, "playbackstop", onPlaybackStop), events.off(ApiClient, "message", onWebSocketMessage)
}), view.addEventListener("viewdestroy", function(e) {
tabControllers.forEach(function(t) {
t.destroy && t.destroy()
})
})
}
events.on(playbackManager, "playbackstop", onPlaybackStop);
events.on(ApiClient, "message", onWebSocketMessage);
inputManager.on(window, onInputCommand);
});
view.addEventListener("viewbeforehide", function (e) {
inputManager.off(window, onInputCommand);
events.off(playbackManager, "playbackstop", onPlaybackStop);
events.off(ApiClient, "message", onWebSocketMessage);
});
view.addEventListener("viewdestroy", function (e) {
tabControllers.forEach(function (t) {
if (t.destroy) {
t.destroy();
}
});
});
};
});

View file

@ -1,199 +1,284 @@
define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", "listView", "cardBuilder", "alphaPicker", "emby-itemscontainer"], function(layoutManager, loading, events, libraryBrowser, imageLoader, listView, cardBuilder, alphaPicker) {
define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", "listView", "cardBuilder", "alphaPicker", "emby-itemscontainer"], function (layoutManager, loading, events, libraryBrowser, imageLoader, listView, cardBuilder, alphaPicker) {
"use strict";
return function(view, params, tabContent) {
return function (view, params, tabContent) {
function getPageData(context) {
var key = getSavedQueryKey(context),
pageData = data[key];
return pageData || (pageData = data[key] = {
query: {
SortBy: "SortName",
SortOrder: "Ascending",
IncludeItemTypes: "Series",
Recursive: !0,
Fields: "PrimaryImageAspectRatio,BasicSyncInfo",
ImageTypeLimit: 1,
EnableImageTypes: "Primary,Backdrop,Banner,Thumb",
StartIndex: 0,
Limit: pageSize
},
view: libraryBrowser.getSavedView(key) || "Poster"
}, pageData.query.ParentId = params.topParentId, libraryBrowser.loadSavedQueryValues(key, pageData.query)), pageData
var key = getSavedQueryKey(context);
var pageData = data[key];
if (!pageData) {
pageData = data[key] = {
query: {
SortBy: "SortName",
SortOrder: "Ascending",
IncludeItemTypes: "Series",
Recursive: true,
Fields: "PrimaryImageAspectRatio,BasicSyncInfo",
ImageTypeLimit: 1,
EnableImageTypes: "Primary,Backdrop,Banner,Thumb",
StartIndex: 0,
Limit: pageSize
},
view: libraryBrowser.getSavedView(key) || "Poster"
};
pageData.query.ParentId = params.topParentId;
libraryBrowser.loadSavedQueryValues(key, pageData.query);
}
return pageData;
}
function getQuery(context) {
return getPageData(context).query
return getPageData(context).query;
}
function getSavedQueryKey(context) {
return context.savedQueryKey || (context.savedQueryKey = libraryBrowser.getSavedQueryKey("series")), context.savedQueryKey
if (!context.savedQueryKey) {
context.savedQueryKey = libraryBrowser.getSavedQueryKey("series");
}
return context.savedQueryKey;
}
function onViewStyleChange() {
var viewStyle = self.getCurrentViewStyle(),
itemsContainer = tabContent.querySelector(".itemsContainer");
"List" == viewStyle ? (itemsContainer.classList.add("vertical-list"), itemsContainer.classList.remove("vertical-wrap")) : (itemsContainer.classList.remove("vertical-list"), itemsContainer.classList.add("vertical-wrap")), itemsContainer.innerHTML = ""
var viewStyle = self.getCurrentViewStyle();
var itemsContainer = tabContent.querySelector(".itemsContainer");
if ("List" == viewStyle) {
itemsContainer.classList.add("vertical-list");
itemsContainer.classList.remove("vertical-wrap");
} else {
itemsContainer.classList.remove("vertical-list");
itemsContainer.classList.add("vertical-wrap");
}
itemsContainer.innerHTML = "";
}
function reloadItems(page) {
loading.show();
isLoading = true;
var query = getQuery(page);
ApiClient.getItems(ApiClient.getCurrentUserId(), query).then(function(result) {
ApiClient.getItems(ApiClient.getCurrentUserId(), query).then(function (result) {
function onNextPageClick() {
if (isLoading) return;
if (isLoading) {
return;
}
query.StartIndex += query.Limit;
reloadItems(tabContent);
}
function onPreviousPageClick() {
if (isLoading) return;
if (isLoading) {
return;
}
query.StartIndex -= query.Limit;
reloadItems(tabContent);
}
window.scrollTo(0, 0), updateFilterControls(page);
var html, pagingHtml = libraryBrowser.getQueryPagingHtml({
startIndex: query.StartIndex,
limit: query.Limit,
totalRecordCount: result.TotalRecordCount,
showLimit: !1,
updatePageSizeSetting: !1,
addLayoutButton: !1,
sortButton: !1,
filterButton: !1
}),
viewStyle = self.getCurrentViewStyle();
html = "Thumb" == viewStyle ? cardBuilder.getCardsHtml({
items: result.Items,
shape: "backdrop",
preferThumb: !0,
context: "tvshows",
overlayMoreButton: !0,
showTitle: !0,
centerText: !0
}) : "ThumbCard" == viewStyle ? cardBuilder.getCardsHtml({
items: result.Items,
shape: "backdrop",
preferThumb: !0,
context: "tvshows",
cardLayout: !0,
showTitle: !0,
showYear: !0,
centerText: !0
}) : "Banner" == viewStyle ? cardBuilder.getCardsHtml({
items: result.Items,
shape: "banner",
preferBanner: !0,
context: "tvshows"
}) : "List" == viewStyle ? listView.getListViewHtml({
items: result.Items,
context: "tvshows",
sortBy: query.SortBy
}) : "PosterCard" == viewStyle ? cardBuilder.getCardsHtml({
items: result.Items,
shape: "portrait",
context: "tvshows",
showTitle: !0,
showYear: !0,
centerText: !0,
cardLayout: !0
}) : cardBuilder.getCardsHtml({
items: result.Items,
shape: "portrait",
context: "tvshows",
centerText: !0,
lazy: !0,
overlayMoreButton: !0,
showTitle: !0,
showYear: !0
window.scrollTo(0, 0);
updateFilterControls(page);
var html;
var pagingHtml = libraryBrowser.getQueryPagingHtml({
startIndex: query.StartIndex,
limit: query.Limit,
totalRecordCount: result.TotalRecordCount,
showLimit: false,
updatePageSizeSetting: false,
addLayoutButton: false,
sortButton: false,
filterButton: false
});
var i, length, elems = tabContent.querySelectorAll(".paging");
for (i = 0, length = elems.length; i < length; i++) elems[i].innerHTML = pagingHtml;
for (elems = tabContent.querySelectorAll(".btnNextPage"), i = 0, length = elems.length; i < length; i++) elems[i].addEventListener("click", onNextPageClick);
for (elems = tabContent.querySelectorAll(".btnPreviousPage"), i = 0, length = elems.length; i < length; i++) elems[i].addEventListener("click", onPreviousPageClick);
var viewStyle = self.getCurrentViewStyle();
if (viewStyle == "Thumb") {
html = cardBuilder.getCardsHtml({
items: result.Items,
shape: "backdrop",
preferThumb: true,
context: "tvshows",
overlayMoreButton: true,
showTitle: true,
centerText: true
});
} else if (viewStyle == "ThumbCard") {
html = cardBuilder.getCardsHtml({
items: result.Items,
shape: "backdrop",
preferThumb: true,
context: "tvshows",
cardLayout: true,
showTitle: true,
showYear: true,
centerText: true
});
} else if (viewStyle == "Banner") {
html = cardBuilder.getCardsHtml({
items: result.Items,
shape: "banner",
preferBanner: true,
context: "tvshows"
});
} else if (viewStyle == "List") {
html = listView.getListViewHtml({
items: result.Items,
context: "tvshows",
sortBy: query.SortBy
});
} else if (viewStyle == "PosterCard") {
html = cardBuilder.getCardsHtml({
items: result.Items,
shape: "portrait",
context: "tvshows",
showTitle: true,
showYear: true,
centerText: true,
cardLayout: true
});
} else {
html = cardBuilder.getCardsHtml({
items: result.Items,
shape: "portrait",
context: "tvshows",
centerText: true,
lazy: true,
overlayMoreButton: true,
showTitle: true,
showYear: true
});
}
var i;
var length;
var elems = tabContent.querySelectorAll(".paging");
for (i = 0, length = elems.length; i < length; i++) {
elems[i].innerHTML = pagingHtml;
}
elems = tabContent.querySelectorAll(".btnNextPage");
for (i = 0, length = elems.length; i < length; i++) {
elems[i].addEventListener("click", onNextPageClick);
}
elems = tabContent.querySelectorAll(".btnPreviousPage");
for (i = 0, length = elems.length; i < length; i++) {
elems[i].addEventListener("click", onPreviousPageClick);
}
var itemsContainer = tabContent.querySelector(".itemsContainer");
itemsContainer.innerHTML = html;
imageLoader.lazyChildren(itemsContainer);
libraryBrowser.saveQueryValues(getSavedQueryKey(page), query);
loading.hide();
isLoading = false;
})
});
}
function updateFilterControls(tabContent) {
var query = getQuery(tabContent);
self.alphaPicker.value(query.NameStartsWithOrGreater)
self.alphaPicker.value(query.NameStartsWithOrGreater);
}
var self = this,
pageSize = 100,
data = {},
isLoading = false;
self.showFilterMenu = function() {
require(["components/filterdialog/filterdialog"], function(filterDialogFactory) {
var filterDialog = new filterDialogFactory({
query: getQuery(tabContent),
mode: "series",
serverId: ApiClient.serverId()
});
events.on(filterDialog, "filterchange", function() {
getQuery(tabContent).StartIndex = 0, reloadItems(tabContent)
}), filterDialog.show()
})
}, self.getCurrentViewStyle = function() {
return getPageData(tabContent).view
},
function(tabContent) {
var alphaPickerElement = tabContent.querySelector(".alphaPicker");
if (alphaPickerElement.addEventListener("alphavaluechanged", function(e) {
var newValue = e.detail.value,
query = getQuery(tabContent);
query.NameStartsWithOrGreater = newValue, query.StartIndex = 0, reloadItems(tabContent)
}), self.alphaPicker = new alphaPicker({
element: alphaPickerElement,
valueChangeEvent: "click"
}), layoutManager.desktop || layoutManager.mobile) {
tabContent.querySelector(".alphaPicker").classList.add("alphabetPicker-right");
var itemsContainer = tabContent.querySelector(".itemsContainer");
itemsContainer.classList.remove("padded-left-withalphapicker"), itemsContainer.classList.add("padded-right-withalphapicker")
}
tabContent.querySelector(".btnFilter").addEventListener("click", function() {
self.showFilterMenu()
}), tabContent.querySelector(".btnSort").addEventListener("click", function(e) {
libraryBrowser.showSortMenu({
items: [{
name: Globalize.translate("OptionNameSort"),
id: "SortName"
}, {
name: Globalize.translate("OptionImdbRating"),
id: "CommunityRating,SortName"
}, {
name: Globalize.translate("OptionDateAdded"),
id: "DateCreated,SortName"
}, {
name: Globalize.translate("OptionDatePlayed"),
id: "DatePlayed,SortName"
}, {
name: Globalize.translate("OptionParentalRating"),
id: "OfficialRating,SortName"
}, {
name: Globalize.translate("OptionReleaseDate"),
id: "PremiereDate,SortName"
}],
callback: function() {
getQuery(tabContent).StartIndex = 0, reloadItems(tabContent)
},
query: getQuery(tabContent),
button: e.target
})
var self = this;
var pageSize = 100;
var data = {};
var isLoading = false;
self.showFilterMenu = function () {
require(["components/filterdialog/filterdialog"], function (filterDialogFactory) {
var filterDialog = new filterDialogFactory({
query: getQuery(tabContent),
mode: "series",
serverId: ApiClient.serverId()
});
var btnSelectView = tabContent.querySelector(".btnSelectView");
btnSelectView.addEventListener("click", function(e) {
libraryBrowser.showLayoutMenu(e.target, self.getCurrentViewStyle(), "Banner,List,Poster,PosterCard,Thumb,ThumbCard".split(","))
}), btnSelectView.addEventListener("layoutchange", function(e) {
var viewStyle = e.detail.viewStyle;
getPageData(tabContent).view = viewStyle, libraryBrowser.saveViewSetting(getSavedQueryKey(tabContent), viewStyle), getQuery(tabContent).StartIndex = 0, onViewStyleChange(), reloadItems(tabContent)
})
}(tabContent), onViewStyleChange(), self.renderTab = function() {
reloadItems(tabContent), updateFilterControls(tabContent)
}, self.destroy = function() {}
}
events.on(filterDialog, "filterchange", function () {
getQuery(tabContent).StartIndex = 0;
reloadItems(tabContent);
});
filterDialog.show();
});
};
self.getCurrentViewStyle = function () {
return getPageData(tabContent).view;
};
function initPage(tabContent) {
var alphaPickerElement = tabContent.querySelector(".alphaPicker");
alphaPickerElement.addEventListener("alphavaluechanged", function (e) {
var newValue = e.detail.value;
var query = getQuery(tabContent);
query.NameStartsWithOrGreater = newValue;
query.StartIndex = 0;
reloadItems(tabContent);
});
self.alphaPicker = new alphaPicker({
element: alphaPickerElement,
valueChangeEvent: "click"
});
if (layoutManager.desktop || layoutManager.mobile) {
tabContent.querySelector(".alphaPicker").classList.add("alphabetPicker-right");
var itemsContainer = tabContent.querySelector(".itemsContainer");
itemsContainer.classList.remove("padded-left-withalphapicker");
itemsContainer.classList.add("padded-right-withalphapicker");
}
tabContent.querySelector(".btnFilter").addEventListener("click", function () {
self.showFilterMenu();
});
tabContent.querySelector(".btnSort").addEventListener("click", function (e) {
libraryBrowser.showSortMenu({
items: [{
name: Globalize.translate("OptionNameSort"),
id: "SortName"
}, {
name: Globalize.translate("OptionImdbRating"),
id: "CommunityRating,SortName"
}, {
name: Globalize.translate("OptionDateAdded"),
id: "DateCreated,SortName"
}, {
name: Globalize.translate("OptionDatePlayed"),
id: "DatePlayed,SortName"
}, {
name: Globalize.translate("OptionParentalRating"),
id: "OfficialRating,SortName"
}, {
name: Globalize.translate("OptionReleaseDate"),
id: "PremiereDate,SortName"
}],
callback: function () {
getQuery(tabContent).StartIndex = 0;
reloadItems(tabContent);
},
query: getQuery(tabContent),
button: e.target
});
});
var btnSelectView = tabContent.querySelector(".btnSelectView");
btnSelectView.addEventListener("click", function (e) {
libraryBrowser.showLayoutMenu(e.target, self.getCurrentViewStyle(), "Banner,List,Poster,PosterCard,Thumb,ThumbCard".split(","));
});
btnSelectView.addEventListener("layoutchange", function (e) {
var viewStyle = e.detail.viewStyle;
getPageData(tabContent).view = viewStyle;
libraryBrowser.saveViewSetting(getSavedQueryKey(tabContent), viewStyle);
getQuery(tabContent).StartIndex = 0;
onViewStyleChange();
reloadItems(tabContent);
});
}
initPage(tabContent);
onViewStyleChange();
self.renderTab = function () {
reloadItems(tabContent);
updateFilterControls(tabContent);
};
self.destroy = function () {};
};
});

View file

@ -1,52 +1,65 @@
define(["loading", "libraryBrowser", "cardBuilder", "apphost"], function(loading, libraryBrowser, cardBuilder, appHost) {
define(["loading", "libraryBrowser", "cardBuilder", "apphost"], function (loading, libraryBrowser, cardBuilder, appHost) {
"use strict";
function getQuery(params) {
var key = getSavedQueryKey(),
pageData = data[key];
return pageData || (pageData = data[key] = {
query: {
SortBy: "SortName",
SortOrder: "Ascending",
IncludeItemTypes: "Series",
Recursive: !0,
Fields: "DateCreated,PrimaryImageAspectRatio",
StartIndex: 0
}
}, pageData.query.ParentId = params.topParentId), pageData.query
var key = getSavedQueryKey();
var pageData = data[key];
if (!pageData) {
pageData = data[key] = {
query: {
SortBy: "SortName",
SortOrder: "Ascending",
IncludeItemTypes: "Series",
Recursive: true,
Fields: "DateCreated,PrimaryImageAspectRatio",
StartIndex: 0
}
};
pageData.query.ParentId = params.topParentId;
}
return pageData.query;
}
function getSavedQueryKey() {
return libraryBrowser.getSavedQueryKey("studios")
return libraryBrowser.getSavedQueryKey("studios");
}
function getPromise(context, params) {
var query = getQuery(params);
return loading.show(), ApiClient.getStudios(ApiClient.getCurrentUserId(), query)
loading.show();
return ApiClient.getStudios(ApiClient.getCurrentUserId(), query);
}
function reloadItems(context, params, promise) {
promise.then(function(result) {
promise.then(function (result) {
var elem = context.querySelector("#items");
cardBuilder.buildCards(result.Items, {
itemsContainer: elem,
shape: "backdrop",
preferThumb: !0,
showTitle: !0,
scalable: !0,
centerText: !0,
overlayMoreButton: !0,
preferThumb: true,
showTitle: true,
scalable: true,
centerText: true,
overlayMoreButton: true,
context: "tvshows"
}), loading.hide()
})
});
loading.hide();
});
}
var data = {};
return function(view, params, tabContent) {
var promise, self = this;
self.preRender = function() {
promise = getPromise(view, params)
}, self.renderTab = function() {
reloadItems(tabContent, params, promise)
}
}
});
return function (view, params, tabContent) {
var promise;
var self = this;
self.preRender = function () {
promise = getPromise(view, params);
};
self.renderTab = function () {
reloadItems(tabContent, params, promise);
};
};
});

View file

@ -1,4 +1,4 @@
define(["layoutManager", "loading", "datetime", "libraryBrowser", "cardBuilder", "apphost", "imageLoader", "scrollStyles", "emby-itemscontainer"], function(layoutManager, loading, datetime, libraryBrowser, cardBuilder, appHost, imageLoader) {
define(["layoutManager", "loading", "datetime", "libraryBrowser", "cardBuilder", "apphost", "imageLoader", "scrollStyles", "emby-itemscontainer"], function (layoutManager, loading, datetime, libraryBrowser, cardBuilder, appHost, imageLoader) {
"use strict";
function getUpcomingPromise(context, params) {
@ -9,82 +9,129 @@ define(["layoutManager", "loading", "datetime", "libraryBrowser", "cardBuilder",
UserId: ApiClient.getCurrentUserId(),
ImageTypeLimit: 1,
EnableImageTypes: "Primary,Backdrop,Banner,Thumb",
EnableTotalRecordCount: !1
EnableTotalRecordCount: false
};
return query.ParentId = params.topParentId, ApiClient.getJSON(ApiClient.getUrl("Shows/Upcoming", query))
query.ParentId = params.topParentId;
return ApiClient.getJSON(ApiClient.getUrl("Shows/Upcoming", query));
}
function loadUpcoming(context, params, promise) {
promise.then(function(result) {
promise.then(function (result) {
var items = result.Items;
items.length ? context.querySelector(".noItemsMessage").style.display = "none" : context.querySelector(".noItemsMessage").style.display = "block", renderUpcoming(context.querySelector("#upcomingItems"), items), loading.hide()
})
if (items.length) {
context.querySelector(".noItemsMessage").style.display = "none";
} else {
context.querySelector(".noItemsMessage").style.display = "block";
}
renderUpcoming(context.querySelector("#upcomingItems"), items);
loading.hide();
});
}
function enableScrollX() {
return !layoutManager.desktop
return !layoutManager.desktop;
}
function getThumbShape() {
return enableScrollX() ? "overflowBackdrop" : "backdrop"
return enableScrollX() ? "overflowBackdrop" : "backdrop";
}
function renderUpcoming(elem, items) {
var i, length, groups = [],
currentGroupName = "",
currentGroup = [];
var i;
var length;
var groups = [];
var currentGroupName = "";
var currentGroup = [];
for (i = 0, length = items.length; i < length; i++) {
var item = items[i],
dateText = "";
if (item.PremiereDate) try {
var premiereDate = datetime.parseISO8601Date(item.PremiereDate, !0);
dateText = datetime.isRelativeDay(premiereDate, -1) ? Globalize.translate("Yesterday") : datetime.toLocaleDateString(premiereDate, {
weekday: "long",
month: "short",
day: "numeric"
})
} catch (err) {}
dateText != currentGroupName ? (currentGroup.length && groups.push({
name: currentGroupName,
items: currentGroup
}), currentGroupName = dateText, currentGroup = [item]) : currentGroup.push(item)
var item = items[i];
var dateText = "";
if (item.PremiereDate) {
try {
var premiereDate = datetime.parseISO8601Date(item.PremiereDate, true);
dateText = datetime.isRelativeDay(premiereDate, -1) ? Globalize.translate("Yesterday") : datetime.toLocaleDateString(premiereDate, {
weekday: "long",
month: "short",
day: "numeric"
});
} catch (err) {}
}
if (dateText != currentGroupName) {
if (currentGroup.length) {
groups.push({
name: currentGroupName,
items: currentGroup
});
}
currentGroupName = dateText;
currentGroup = [item];
} else {
currentGroup.push(item);
}
}
var html = "";
for (i = 0, length = groups.length; i < length; i++) {
var group = groups[i];
html += '<div class="verticalSection">', html += '<h2 class="sectionTitle sectionTitle-cards padded-left">' + group.name + "</h2>";
var allowBottomPadding = !0;
html += '<div class="verticalSection">';
html += '<h2 class="sectionTitle sectionTitle-cards padded-left">' + group.name + "</h2>";
var allowBottomPadding = true;
if (enableScrollX()) {
allowBottomPadding = !1;
allowBottomPadding = false;
var scrollXClass = "scrollX hiddenScrollX";
layoutManager.tv && (scrollXClass += " smoothScrollX"), html += '<div is="emby-itemscontainer" class="itemsContainer ' + scrollXClass + ' padded-left padded-right">'
} else html += '<div is="emby-itemscontainer" class="itemsContainer vertical-wrap padded-left padded-right">';
if (layoutManager.tv) {
scrollXClass += " smoothScrollX";
}
html += '<div is="emby-itemscontainer" class="itemsContainer ' + scrollXClass + ' padded-left padded-right">';
} else {
html += '<div is="emby-itemscontainer" class="itemsContainer vertical-wrap padded-left padded-right">';
}
var supportsImageAnalysis = appHost.supports("imageanalysis");
supportsImageAnalysis = !1, html += cardBuilder.getCardsHtml({
supportsImageAnalysis = false;
html += cardBuilder.getCardsHtml({
items: group.items,
showLocationTypeIndicator: !1,
showLocationTypeIndicator: false,
shape: getThumbShape(),
showTitle: !0,
preferThumb: !0,
lazy: !0,
showDetailsMenu: !0,
showTitle: true,
preferThumb: true,
lazy: true,
showDetailsMenu: true,
centerText: !supportsImageAnalysis,
showParentTitle: !0,
overlayText: !1,
showParentTitle: true,
overlayText: false,
allowBottomPadding: allowBottomPadding,
cardLayout: supportsImageAnalysis,
overlayMoreButton: !0,
missingIndicator: !1
}), html += "</div>", html += "</div>"
overlayMoreButton: true,
missingIndicator: false
});
html += "</div>";
html += "</div>";
}
elem.innerHTML = html, imageLoader.lazyChildren(elem)
elem.innerHTML = html;
imageLoader.lazyChildren(elem);
}
return function(view, params, tabContent) {
var upcomingPromise, self = this;
self.preRender = function() {
upcomingPromise = getUpcomingPromise(view, params)
}, self.renderTab = function() {
loadUpcoming(tabContent, params, upcomingPromise)
}
}
});
return function (view, params, tabContent) {
var upcomingPromise;
var self = this;
self.preRender = function () {
upcomingPromise = getUpcomingPromise(view, params);
};
self.renderTab = function () {
loadUpcoming(tabContent, params, upcomingPromise);
};
};
});

View file

@ -1,16 +1,19 @@
define(["jQuery", "libraryMenu", "loading"], function($, libraryMenu, loading) {
define(["jQuery", "libraryMenu", "loading"], function ($, libraryMenu, loading) {
"use strict";
function loadPage(page, config) {
$("#txtRemoteClientBitrateLimit", page).val(config.RemoteClientBitrateLimit / 1e6 || ""), loading.hide()
$("#txtRemoteClientBitrateLimit", page).val(config.RemoteClientBitrateLimit / 1e6 || "");
loading.hide();
}
function onSubmit() {
loading.show();
var form = this;
return ApiClient.getServerConfiguration().then(function(config) {
config.RemoteClientBitrateLimit = parseInt(1e6 * parseFloat($("#txtRemoteClientBitrateLimit", form).val() || "0")), ApiClient.updateServerConfiguration(config).then(Dashboard.processServerConfigurationUpdateResult)
}), !1
ApiClient.getServerConfiguration().then(function (config) {
config.RemoteClientBitrateLimit = parseInt(1e6 * parseFloat($("#txtRemoteClientBitrateLimit", form).val() || "0"));
ApiClient.updateServerConfiguration(config).then(Dashboard.processServerConfigurationUpdateResult);
});
return false;
}
function getTabs() {
@ -23,30 +26,35 @@ define(["jQuery", "libraryMenu", "loading"], function($, libraryMenu, loading) {
}, {
href: "streamingsettings.html",
name: Globalize.translate("TabStreaming")
}]
}];
}
$(document).on("pageinit", "#streamingSettingsPage", function() {
$(document).on("pageinit", "#streamingSettingsPage", function () {
var page = this;
$("#btnSelectTranscodingTempPath", page).on("click.selectDirectory", function() {
require(["directorybrowser"], function(directoryBrowser) {
var picker = new directoryBrowser;
$("#btnSelectTranscodingTempPath", page).on("click.selectDirectory", function () {
require(["directorybrowser"], function (directoryBrowser) {
var picker = new directoryBrowser();
picker.show({
callback: function(path) {
path && $("#txtTranscodingTempPath", page).val(path), picker.close()
callback: function (path) {
if (path) {
$("#txtTranscodingTempPath", page).val(path);
}
picker.close();
},
validateWriteable: !0,
validateWriteable: true,
header: Globalize.translate("HeaderSelectTranscodingPath"),
instruction: Globalize.translate("HeaderSelectTranscodingPathHelp")
})
})
}), $(".streamingSettingsForm").off("submit", onSubmit).on("submit", onSubmit)
}).on("pageshow", "#streamingSettingsPage", function() {
});
});
});
$(".streamingSettingsForm").off("submit", onSubmit).on("submit", onSubmit);
}).on("pageshow", "#streamingSettingsPage", function () {
loading.show();
libraryMenu.setTabs("playback", 2, getTabs);
var page = this;
ApiClient.getServerConfiguration().then(function(config) {
loadPage(page, config)
})
})
});
ApiClient.getServerConfiguration().then(function (config) {
loadPage(page, config);
});
});
});

View file

@ -1,28 +1,49 @@
define(["displaySettings", "userSettingsBuilder", "userSettings"], function(DisplaySettings, userSettingsBuilder, currentUserSettings) {
define(["displaySettings", "userSettingsBuilder", "userSettings"], function (DisplaySettings, userSettingsBuilder, currentUserSettings) {
"use strict";
return function(view, params) {
return function (view, params) {
function onBeforeUnload(e) {
hasChanges && (e.returnValue = "You currently have unsaved changes. Are you sure you wish to leave?")
if (hasChanges) {
e.returnValue = "You currently have unsaved changes. Are you sure you wish to leave?";
}
}
var settingsInstance, hasChanges, userId = params.userId || ApiClient.getCurrentUserId(),
userSettings = userId === ApiClient.getCurrentUserId() ? currentUserSettings : new userSettingsBuilder;
view.addEventListener("viewshow", function() {
window.addEventListener("beforeunload", onBeforeUnload), settingsInstance ? settingsInstance.loadData() : settingsInstance = new DisplaySettings({
serverId: ApiClient.serverId(),
userId: userId,
element: view.querySelector(".settingsContainer"),
userSettings: userSettings,
enableSaveButton: !1,
enableSaveConfirmation: !1
})
}), view.addEventListener("change", function() {
hasChanges = !0
}), view.addEventListener("viewbeforehide", function() {
window.removeEventListener("beforeunload", onBeforeUnload), hasChanges = !1, settingsInstance && settingsInstance.submit()
}), view.addEventListener("viewdestroy", function() {
settingsInstance && (settingsInstance.destroy(), settingsInstance = null)
}), view.addEventListener("viewdestroy", function() {
settingsInstance && (settingsInstance.destroy(), settingsInstance = null)
})
}
});
var settingsInstance;
var hasChanges;
var userId = params.userId || ApiClient.getCurrentUserId();
var userSettings = userId === ApiClient.getCurrentUserId() ? currentUserSettings : new userSettingsBuilder();
view.addEventListener("viewshow", function () {
window.addEventListener("beforeunload", onBeforeUnload);
if (settingsInstance) {
settingsInstance.loadData();
} else {
settingsInstance = new DisplaySettings({
serverId: ApiClient.serverId(),
userId: userId,
element: view.querySelector(".settingsContainer"),
userSettings: userSettings,
enableSaveButton: false,
enableSaveConfirmation: false
});
}
});
view.addEventListener("change", function () {
hasChanges = true;
});
view.addEventListener("viewbeforehide", function () {
window.removeEventListener("beforeunload", onBeforeUnload);
hasChanges = false;
if (settingsInstance) {
settingsInstance.submit();
}
});
view.addEventListener("viewdestroy", function () {
if (settingsInstance) {
settingsInstance.destroy();
settingsInstance = null;
}
});
};
});

View file

@ -1,26 +1,48 @@
define(["homescreenSettings", "userSettingsBuilder", "dom", "globalize", "loading", "userSettings", "listViewStyle"], function(HomescreenSettings, userSettingsBuilder, dom, globalize, loading, currentUserSettings) {
define(["homescreenSettings", "userSettingsBuilder", "dom", "globalize", "loading", "userSettings", "listViewStyle"], function (HomescreenSettings, userSettingsBuilder, dom, globalize, loading, currentUserSettings) {
"use strict";
return function(view, params) {
return function (view, params) {
function onBeforeUnload(e) {
hasChanges && (e.returnValue = "You currently have unsaved changes. Are you sure you wish to leave?")
if (hasChanges) {
e.returnValue = "You currently have unsaved changes. Are you sure you wish to leave?";
}
}
var homescreenSettingsInstance, hasChanges, userId = params.userId || ApiClient.getCurrentUserId(),
userSettings = userId === ApiClient.getCurrentUserId() ? currentUserSettings : new userSettingsBuilder;
view.addEventListener("viewshow", function() {
window.addEventListener("beforeunload", onBeforeUnload), homescreenSettingsInstance ? homescreenSettingsInstance.loadData() : homescreenSettingsInstance = new HomescreenSettings({
serverId: ApiClient.serverId(),
userId: userId,
element: view.querySelector(".homeScreenSettingsContainer"),
userSettings: userSettings,
enableSaveButton: !1,
enableSaveConfirmation: !1
})
}), view.addEventListener("change", function() {
hasChanges = !0
}), view.addEventListener("viewbeforehide", function() {
hasChanges = !1, homescreenSettingsInstance && homescreenSettingsInstance.submit()
}), view.addEventListener("viewdestroy", function() {
homescreenSettingsInstance && (homescreenSettingsInstance.destroy(), homescreenSettingsInstance = null)
})
}
});
var homescreenSettingsInstance;
var hasChanges;
var userId = params.userId || ApiClient.getCurrentUserId();
var userSettings = userId === ApiClient.getCurrentUserId() ? currentUserSettings : new userSettingsBuilder();
view.addEventListener("viewshow", function () {
window.addEventListener("beforeunload", onBeforeUnload);
if (homescreenSettingsInstance) {
homescreenSettingsInstance.loadData();
} else {
homescreenSettingsInstance = new HomescreenSettings({
serverId: ApiClient.serverId(),
userId: userId,
element: view.querySelector(".homeScreenSettingsContainer"),
userSettings: userSettings,
enableSaveButton: false,
enableSaveConfirmation: false
});
}
});
view.addEventListener("change", function () {
hasChanges = true;
});
view.addEventListener("viewbeforehide", function () {
hasChanges = false;
if (homescreenSettingsInstance) {
homescreenSettingsInstance.submit();
}
});
view.addEventListener("viewdestroy", function () {
if (homescreenSettingsInstance) {
homescreenSettingsInstance.destroy();
homescreenSettingsInstance = null;
}
});
};
});

View file

@ -18,7 +18,7 @@ define(["apphost", "connectionManager", "listViewStyle", "emby-button"], functio
page.querySelector(".lnkSubtitlePreferences").setAttribute("href", "mypreferencessubtitles.html?userId=" + userId);
if (appHost.supports("multiserver")) {
page.querySelector(".selectServer").classList.remove("hide")
page.querySelector(".selectServer").classList.remove("hide");
} else {
page.querySelector(".selectServer").classList.add("hide");
}
@ -35,6 +35,6 @@ define(["apphost", "connectionManager", "listViewStyle", "emby-button"], functio
page.querySelector(".adminSection").classList.add("hide");
}
});
})
}
});
};
});

View file

@ -1,26 +1,48 @@
define(["playbackSettings", "userSettingsBuilder", "dom", "globalize", "loading", "userSettings", "listViewStyle"], function(PlaybackSettings, userSettingsBuilder, dom, globalize, loading, currentUserSettings) {
define(["playbackSettings", "userSettingsBuilder", "dom", "globalize", "loading", "userSettings", "listViewStyle"], function (PlaybackSettings, userSettingsBuilder, dom, globalize, loading, currentUserSettings) {
"use strict";
return function(view, params) {
return function (view, params) {
function onBeforeUnload(e) {
hasChanges && (e.returnValue = "You currently have unsaved changes. Are you sure you wish to leave?")
if (hasChanges) {
e.returnValue = "You currently have unsaved changes. Are you sure you wish to leave?";
}
}
var settingsInstance, hasChanges, userId = params.userId || ApiClient.getCurrentUserId(),
userSettings = userId === ApiClient.getCurrentUserId() ? currentUserSettings : new userSettingsBuilder;
view.addEventListener("viewshow", function() {
window.addEventListener("beforeunload", onBeforeUnload), settingsInstance ? settingsInstance.loadData() : settingsInstance = new PlaybackSettings({
serverId: ApiClient.serverId(),
userId: userId,
element: view.querySelector(".settingsContainer"),
userSettings: userSettings,
enableSaveButton: !1,
enableSaveConfirmation: !1
})
}), view.addEventListener("change", function() {
hasChanges = !0
}), view.addEventListener("viewbeforehide", function() {
hasChanges = !1, settingsInstance && settingsInstance.submit()
}), view.addEventListener("viewdestroy", function() {
settingsInstance && (settingsInstance.destroy(), settingsInstance = null)
})
}
});
var settingsInstance;
var hasChanges;
var userId = params.userId || ApiClient.getCurrentUserId();
var userSettings = userId === ApiClient.getCurrentUserId() ? currentUserSettings : new userSettingsBuilder();
view.addEventListener("viewshow", function () {
window.addEventListener("beforeunload", onBeforeUnload);
if (settingsInstance) {
settingsInstance.loadData();
} else {
settingsInstance = new PlaybackSettings({
serverId: ApiClient.serverId(),
userId: userId,
element: view.querySelector(".settingsContainer"),
userSettings: userSettings,
enableSaveButton: false,
enableSaveConfirmation: false
});
}
});
view.addEventListener("change", function () {
hasChanges = true;
});
view.addEventListener("viewbeforehide", function () {
hasChanges = false;
if (settingsInstance) {
settingsInstance.submit();
}
});
view.addEventListener("viewdestroy", function () {
if (settingsInstance) {
settingsInstance.destroy();
settingsInstance = null;
}
});
};
});

View file

@ -1,26 +1,48 @@
define(["subtitleSettings", "userSettingsBuilder", "userSettings"], function(SubtitleSettings, userSettingsBuilder, currentUserSettings) {
define(["subtitleSettings", "userSettingsBuilder", "userSettings"], function (SubtitleSettings, userSettingsBuilder, currentUserSettings) {
"use strict";
return function(view, params) {
return function (view, params) {
function onBeforeUnload(e) {
hasChanges && (e.returnValue = "You currently have unsaved changes. Are you sure you wish to leave?")
if (hasChanges) {
e.returnValue = "You currently have unsaved changes. Are you sure you wish to leave?";
}
}
var subtitleSettingsInstance, hasChanges, userId = params.userId || ApiClient.getCurrentUserId(),
userSettings = userId === ApiClient.getCurrentUserId() ? currentUserSettings : new userSettingsBuilder;
view.addEventListener("viewshow", function() {
window.addEventListener("beforeunload", onBeforeUnload), subtitleSettingsInstance ? subtitleSettingsInstance.loadData() : subtitleSettingsInstance = new SubtitleSettings({
serverId: ApiClient.serverId(),
userId: userId,
element: view.querySelector(".settingsContainer"),
userSettings: userSettings,
enableSaveButton: !1,
enableSaveConfirmation: !1
})
}), view.addEventListener("change", function() {
hasChanges = !0
}), view.addEventListener("viewbeforehide", function() {
hasChanges = !1, subtitleSettingsInstance && subtitleSettingsInstance.submit()
}), view.addEventListener("viewdestroy", function() {
subtitleSettingsInstance && (subtitleSettingsInstance.destroy(), subtitleSettingsInstance = null)
})
}
});
var subtitleSettingsInstance;
var hasChanges;
var userId = params.userId || ApiClient.getCurrentUserId();
var userSettings = userId === ApiClient.getCurrentUserId() ? currentUserSettings : new userSettingsBuilder();
view.addEventListener("viewshow", function () {
window.addEventListener("beforeunload", onBeforeUnload);
if (subtitleSettingsInstance) {
subtitleSettingsInstance.loadData();
} else {
subtitleSettingsInstance = new SubtitleSettings({
serverId: ApiClient.serverId(),
userId: userId,
element: view.querySelector(".settingsContainer"),
userSettings: userSettings,
enableSaveButton: false,
enableSaveConfirmation: false
});
}
});
view.addEventListener("change", function () {
hasChanges = true;
});
view.addEventListener("viewbeforehide", function () {
hasChanges = false;
if (subtitleSettingsInstance) {
subtitleSettingsInstance.submit();
}
});
view.addEventListener("viewdestroy", function () {
if (subtitleSettingsInstance) {
subtitleSettingsInstance.destroy();
subtitleSettingsInstance = null;
}
});
};
});

View file

@ -1,53 +1,84 @@
define(["jQuery", "loading", "libraryMenu", "fnchecked"], function($, loading, libraryMenu) {
define(["jQuery", "loading", "libraryMenu", "fnchecked"], function ($, loading, libraryMenu) {
"use strict";
function loadDeleteFolders(page, user, mediaFolders) {
ApiClient.getJSON(ApiClient.getUrl("Channels", {
SupportsMediaDeletion: !0
})).then(function(channelsResult) {
var i, length, folder, isChecked, checkedAttribute, html = "";
for (i = 0, length = mediaFolders.length; i < length; i++) folder = mediaFolders[i], isChecked = user.Policy.EnableContentDeletion || -1 != user.Policy.EnableContentDeletionFromFolders.indexOf(folder.Id), checkedAttribute = isChecked ? ' checked="checked"' : "", html += '<label><input type="checkbox" is="emby-checkbox" class="chkFolder" data-id="' + folder.Id + '" ' + checkedAttribute + "><span>" + folder.Name + "</span></label>";
for (i = 0, length = channelsResult.Items.length; i < length; i++) folder = channelsResult.Items[i], isChecked = user.Policy.EnableContentDeletion || -1 != user.Policy.EnableContentDeletionFromFolders.indexOf(folder.Id), checkedAttribute = isChecked ? ' checked="checked"' : "", html += '<label><input type="checkbox" is="emby-checkbox" class="chkFolder" data-id="' + folder.Id + '" ' + checkedAttribute + "><span>" + folder.Name + "</span></label>";
$(".deleteAccess", page).html(html).trigger("create"), $("#chkEnableDeleteAllFolders", page).checked(user.Policy.EnableContentDeletion).trigger("change")
})
SupportsMediaDeletion: true
})).then(function (channelsResult) {
var i;
var length;
var folder;
var isChecked;
var checkedAttribute;
var html = "";
for (i = 0, length = mediaFolders.length; i < length; i++) {
folder = mediaFolders[i];
isChecked = user.Policy.EnableContentDeletion || -1 != user.Policy.EnableContentDeletionFromFolders.indexOf(folder.Id);
checkedAttribute = isChecked ? ' checked="checked"' : "";
html += '<label><input type="checkbox" is="emby-checkbox" class="chkFolder" data-id="' + folder.Id + '" ' + checkedAttribute + "><span>" + folder.Name + "</span></label>";
}
for (i = 0, length = channelsResult.Items.length; i < length; i++) {
folder = channelsResult.Items[i];
isChecked = user.Policy.EnableContentDeletion || -1 != user.Policy.EnableContentDeletionFromFolders.indexOf(folder.Id);
checkedAttribute = isChecked ? ' checked="checked"' : "";
html += '<label><input type="checkbox" is="emby-checkbox" class="chkFolder" data-id="' + folder.Id + '" ' + checkedAttribute + "><span>" + folder.Name + "</span></label>";
}
$(".deleteAccess", page).html(html).trigger("create");
$("#chkEnableDeleteAllFolders", page).checked(user.Policy.EnableContentDeletion).trigger("change");
});
}
function loadAuthProviders(page, user, providers) {
providers.length > 1 ? page.querySelector(".fldSelectLoginProvider").classList.remove("hide") : page.querySelector(".fldSelectLoginProvider").classList.add("hide");
if (providers.length > 1) {
page.querySelector(".fldSelectLoginProvider").classList.remove("hide");
} else {
page.querySelector(".fldSelectLoginProvider").classList.add("hide");
}
var currentProviderId = user.Policy.AuthenticationProviderId;
page.querySelector(".selectLoginProvider").innerHTML = providers.map(function(provider) {
page.querySelector(".selectLoginProvider").innerHTML = providers.map(function (provider) {
var selected = provider.Id === currentProviderId || providers.length < 2 ? " selected" : "";
return '<option value="' + provider.Id + '"' + selected + ">" + provider.Name + "</option>"
})
return '<option value="' + provider.Id + '"' + selected + ">" + provider.Name + "</option>";
});
}
function loadPasswordResetProviders(page, user, providers) {
providers.length > 1 ? page.querySelector(".fldSelectPasswordResetProvider").classList.remove("hide") : page.querySelector(".fldSelectPasswordResetProvider").classList.add("hide");
if (providers.length > 1) {
page.querySelector(".fldSelectPasswordResetProvider").classList.remove("hide");
} else {
page.querySelector(".fldSelectPasswordResetProvider").classList.add("hide");
}
var currentProviderId = user.Policy.PasswordResetProviderId;
page.querySelector(".selectPasswordResetProvider").innerHTML = providers.map(function(provider) {
var selected = (provider.Id === currentProviderId || providers.length < 2) ? " selected" : "";
return '<option value="' + provider.Id + '"' + selected + ">" + provider.Name + "</option>"
})
page.querySelector(".selectPasswordResetProvider").innerHTML = providers.map(function (provider) {
var selected = provider.Id === currentProviderId || providers.length < 2 ? " selected" : "";
return '<option value="' + provider.Id + '"' + selected + ">" + provider.Name + "</option>";
});
}
function loadUser(page, user) {
currentUser = user;
ApiClient.getJSON(ApiClient.getUrl("Auth/Providers")).then(function(providers) {
loadAuthProviders(page, user, providers)
ApiClient.getJSON(ApiClient.getUrl("Auth/Providers")).then(function (providers) {
loadAuthProviders(page, user, providers);
});
ApiClient.getJSON(ApiClient.getUrl("Auth/PasswordResetProviders")).then(function(providers) {
loadPasswordResetProviders(page, user, providers)
ApiClient.getJSON(ApiClient.getUrl("Auth/PasswordResetProviders")).then(function (providers) {
loadPasswordResetProviders(page, user, providers);
});
ApiClient.getJSON(ApiClient.getUrl("Library/MediaFolders", {
IsHidden: false
})).then(function(folders) {
loadDeleteFolders(page, user, folders.Items)
IsHidden: false
})).then(function (folders) {
loadDeleteFolders(page, user, folders.Items);
});
if (user.Policy.IsDisabled) {
$(".disabledUserBanner", page).show();
} else {
$(".disabledUserBanner", page).hide();
}
$("#txtUserName", page).prop("disabled", "").removeAttr("disabled");
$("#fldConnectInfo", page).show();
$(".lnkEditUserPreferences", page).attr("href", "mypreferencesmenu.html?userId=" + user.Id);
@ -78,7 +109,8 @@ define(["jQuery", "loading", "libraryMenu", "fnchecked"], function($, loading, l
function onSaveComplete(page, user) {
Dashboard.navigate("userprofiles.html");
loading.hide();
require(["toast"], function(toast) {
require(["toast"], function (toast) {
toast(Globalize.translate("SettingsSaved"));
});
}
@ -106,45 +138,59 @@ define(["jQuery", "loading", "libraryMenu", "fnchecked"], function($, loading, l
user.Policy.AuthenticationProviderId = page.querySelector(".selectLoginProvider").value;
user.Policy.PasswordResetProviderId = page.querySelector(".selectPasswordResetProvider").value;
user.Policy.EnableContentDeletion = $("#chkEnableDeleteAllFolders", page).checked();
user.Policy.EnableContentDeletionFromFolders = user.Policy.EnableContentDeletion ? [] : $(".chkFolder", page).get().filter(function(c) {
return c.checked
}).map(function(c) {
return c.getAttribute("data-id")
user.Policy.EnableContentDeletionFromFolders = user.Policy.EnableContentDeletion ? [] : $(".chkFolder", page).get().filter(function (c) {
return c.checked;
}).map(function (c) {
return c.getAttribute("data-id");
});
ApiClient.updateUser(user).then(function () {
ApiClient.updateUserPolicy(user.Id, user.Policy).then(function () {
onSaveComplete(page, user);
});
});
ApiClient.updateUser(user).then(function() {
ApiClient.updateUserPolicy(user.Id, user.Policy).then(function() {
onSaveComplete(page, user)
})
})
}
function onSubmit() {
var page = $(this).parents(".page")[0];
return loading.show(), getUser().then(function(result) {
saveUser(result, page)
}), !1
loading.show();
getUser().then(function (result) {
saveUser(result, page);
});
return false;
}
function getUser() {
var userId = getParameterByName("userId");
return ApiClient.getUser(userId)
return ApiClient.getUser(userId);
}
function loadData(page) {
loading.show(), getUser().then(function(user) {
loadUser(page, user)
})
loading.show();
getUser().then(function (user) {
loadUser(page, user);
});
}
var currentUser;
$(document).on("pageinit", "#editUserPage", function() {
$(".editUserProfileForm").off("submit", onSubmit).on("submit", onSubmit), this.querySelector(".sharingHelp").innerHTML = Globalize.translate("OptionAllowLinkSharingHelp", 30);
$(document).on("pageinit", "#editUserPage", function () {
$(".editUserProfileForm").off("submit", onSubmit).on("submit", onSubmit);
this.querySelector(".sharingHelp").innerHTML = Globalize.translate("OptionAllowLinkSharingHelp", 30);
var page = this;
$("#chkEnableDeleteAllFolders", this).on("change", function() {
this.checked ? $(".deleteAccess", page).hide() : $(".deleteAccess", page).show()
}), ApiClient.getServerConfiguration().then(function(config) {
config.EnableRemoteAccess ? page.querySelector(".fldRemoteAccess").classList.remove("hide") : page.querySelector(".fldRemoteAccess").classList.add("hide")
})
}).on("pagebeforeshow", "#editUserPage", function() {
loadData(this)
})
$("#chkEnableDeleteAllFolders", this).on("change", function () {
if (this.checked) {
$(".deleteAccess", page).hide();
} else {
$(".deleteAccess", page).show();
}
});
ApiClient.getServerConfiguration().then(function (config) {
if (config.EnableRemoteAccess) {
page.querySelector(".fldRemoteAccess").classList.remove("hide");
} else {
page.querySelector(".fldRemoteAccess").classList.add("hide");
}
});
}).on("pagebeforeshow", "#editUserPage", function () {
loadData(this);
});
});

View file

@ -1,112 +1,178 @@
define(["jQuery", "loading", "libraryMenu", "fnchecked"], function($, loading, libraryMenu) {
define(["jQuery", "loading", "libraryMenu", "fnchecked"], function ($, loading, libraryMenu) {
"use strict";
function triggerChange(select) {
var evt = document.createEvent("HTMLEvents");
evt.initEvent("change", !1, !0), select.dispatchEvent(evt)
evt.initEvent("change", false, true);
select.dispatchEvent(evt);
}
function loadMediaFolders(page, user, mediaFolders) {
var html = "";
html += '<h3 class="checkboxListLabel">' + Globalize.translate("HeaderLibraries") + "</h3>", html += '<div class="checkboxList paperList checkboxList-paperList">';
html += '<h3 class="checkboxListLabel">' + Globalize.translate("HeaderLibraries") + "</h3>";
html += '<div class="checkboxList paperList checkboxList-paperList">';
for (var i = 0, length = mediaFolders.length; i < length; i++) {
var folder = mediaFolders[i],
isChecked = user.Policy.EnableAllFolders || -1 != user.Policy.EnabledFolders.indexOf(folder.Id),
checkedAttribute = isChecked ? ' checked="checked"' : "";
html += '<label><input type="checkbox" is="emby-checkbox" class="chkFolder" data-id="' + folder.Id + '" ' + checkedAttribute + "><span>" + folder.Name + "</span></label>"
var folder = mediaFolders[i];
var isChecked = user.Policy.EnableAllFolders || -1 != user.Policy.EnabledFolders.indexOf(folder.Id);
var checkedAttribute = isChecked ? ' checked="checked"' : "";
html += '<label><input type="checkbox" is="emby-checkbox" class="chkFolder" data-id="' + folder.Id + '" ' + checkedAttribute + "><span>" + folder.Name + "</span></label>";
}
html += "</div>", page.querySelector(".folderAccess").innerHTML = html;
html += "</div>";
page.querySelector(".folderAccess").innerHTML = html;
var chkEnableAllFolders = page.querySelector("#chkEnableAllFolders");
chkEnableAllFolders.checked = user.Policy.EnableAllFolders, triggerChange(chkEnableAllFolders)
chkEnableAllFolders.checked = user.Policy.EnableAllFolders;
triggerChange(chkEnableAllFolders);
}
function loadChannels(page, user, channels) {
var html = "";
html += '<h3 class="checkboxListLabel">' + Globalize.translate("HeaderChannels") + "</h3>", html += '<div class="checkboxList paperList checkboxList-paperList">';
html += '<h3 class="checkboxListLabel">' + Globalize.translate("HeaderChannels") + "</h3>";
html += '<div class="checkboxList paperList checkboxList-paperList">';
for (var i = 0, length = channels.length; i < length; i++) {
var folder = channels[i],
isChecked = user.Policy.EnableAllChannels || -1 != user.Policy.EnabledChannels.indexOf(folder.Id),
checkedAttribute = isChecked ? ' checked="checked"' : "";
html += '<label><input type="checkbox" is="emby-checkbox" class="chkChannel" data-id="' + folder.Id + '" ' + checkedAttribute + "><span>" + folder.Name + "</span></label>"
var folder = channels[i];
var isChecked = user.Policy.EnableAllChannels || -1 != user.Policy.EnabledChannels.indexOf(folder.Id);
var checkedAttribute = isChecked ? ' checked="checked"' : "";
html += '<label><input type="checkbox" is="emby-checkbox" class="chkChannel" data-id="' + folder.Id + '" ' + checkedAttribute + "><span>" + folder.Name + "</span></label>";
}
html += "</div>", $(".channelAccess", page).show().html(html), channels.length ? $(".channelAccessContainer", page).show() : $(".channelAccessContainer", page).hide(), $("#chkEnableAllChannels", page).checked(user.Policy.EnableAllChannels).trigger("change")
html += "</div>";
$(".channelAccess", page).show().html(html);
if (channels.length) {
$(".channelAccessContainer", page).show();
} else {
$(".channelAccessContainer", page).hide();
}
$("#chkEnableAllChannels", page).checked(user.Policy.EnableAllChannels).trigger("change");
}
function loadDevices(page, user, devices) {
var html = "";
html += '<h3 class="checkboxListLabel">' + Globalize.translate("HeaderDevices") + "</h3>", html += '<div class="checkboxList paperList checkboxList-paperList">';
html += '<h3 class="checkboxListLabel">' + Globalize.translate("HeaderDevices") + "</h3>";
html += '<div class="checkboxList paperList checkboxList-paperList">';
for (var i = 0, length = devices.length; i < length; i++) {
var device = devices[i],
checkedAttribute = user.Policy.EnableAllDevices || -1 != user.Policy.EnabledDevices.indexOf(device.Id) ? ' checked="checked"' : "";
html += '<label><input type="checkbox" is="emby-checkbox" class="chkDevice" data-id="' + device.Id + '" ' + checkedAttribute + "><span>" + device.Name + " - " + device.AppName + "</span></label>"
var device = devices[i];
var checkedAttribute = user.Policy.EnableAllDevices || -1 != user.Policy.EnabledDevices.indexOf(device.Id) ? ' checked="checked"' : "";
html += '<label><input type="checkbox" is="emby-checkbox" class="chkDevice" data-id="' + device.Id + '" ' + checkedAttribute + "><span>" + device.Name + " - " + device.AppName + "</span></label>";
}
html += "</div>";
$(".deviceAccess", page).show().html(html);
$("#chkEnableAllDevices", page).checked(user.Policy.EnableAllDevices).trigger("change");
if (user.Policy.IsAdministrator) {
page.querySelector(".deviceAccessContainer").classList.add("hide");
} else {
page.querySelector(".deviceAccessContainer").classList.remove("hide");
}
html += "</div>", $(".deviceAccess", page).show().html(html), $("#chkEnableAllDevices", page).checked(user.Policy.EnableAllDevices).trigger("change"), user.Policy.IsAdministrator ? page.querySelector(".deviceAccessContainer").classList.add("hide") : page.querySelector(".deviceAccessContainer").classList.remove("hide")
}
function loadUser(page, user, loggedInUser, mediaFolders, channels, devices) {
page.querySelector(".username").innerHTML = user.Name, libraryMenu.setTitle(user.Name), loadChannels(page, user, channels), loadMediaFolders(page, user, mediaFolders), loadDevices(page, user, devices), loading.hide()
page.querySelector(".username").innerHTML = user.Name;
libraryMenu.setTitle(user.Name);
loadChannels(page, user, channels);
loadMediaFolders(page, user, mediaFolders);
loadDevices(page, user, devices);
loading.hide();
}
function onSaveComplete(page) {
loading.hide(), require(["toast"], function(toast) {
toast(Globalize.translate("SettingsSaved"))
})
loading.hide();
require(["toast"], function (toast) {
toast(Globalize.translate("SettingsSaved"));
});
}
function saveUser(user, page) {
user.Policy.EnableAllFolders = $("#chkEnableAllFolders", page).checked(), user.Policy.EnabledFolders = user.Policy.EnableAllFolders ? [] : $(".chkFolder", page).get().filter(function(c) {
return c.checked
}).map(function(c) {
return c.getAttribute("data-id")
}), user.Policy.EnableAllChannels = $("#chkEnableAllChannels", page).checked(), user.Policy.EnabledChannels = user.Policy.EnableAllChannels ? [] : $(".chkChannel", page).get().filter(function(c) {
return c.checked
}).map(function(c) {
return c.getAttribute("data-id")
}), user.Policy.EnableAllDevices = $("#chkEnableAllDevices", page).checked(), user.Policy.EnabledDevices = user.Policy.EnableAllDevices ? [] : $(".chkDevice", page).get().filter(function(c) {
return c.checked
}).map(function(c) {
return c.getAttribute("data-id")
}), user.Policy.BlockedChannels = null, user.Policy.BlockedMediaFolders = null, ApiClient.updateUserPolicy(user.Id, user.Policy).then(function() {
onSaveComplete(page)
})
user.Policy.EnableAllFolders = $("#chkEnableAllFolders", page).checked();
user.Policy.EnabledFolders = user.Policy.EnableAllFolders ? [] : $(".chkFolder", page).get().filter(function (c) {
return c.checked;
}).map(function (c) {
return c.getAttribute("data-id");
});
user.Policy.EnableAllChannels = $("#chkEnableAllChannels", page).checked();
user.Policy.EnabledChannels = user.Policy.EnableAllChannels ? [] : $(".chkChannel", page).get().filter(function (c) {
return c.checked;
}).map(function (c) {
return c.getAttribute("data-id");
});
user.Policy.EnableAllDevices = $("#chkEnableAllDevices", page).checked();
user.Policy.EnabledDevices = user.Policy.EnableAllDevices ? [] : $(".chkDevice", page).get().filter(function (c) {
return c.checked;
}).map(function (c) {
return c.getAttribute("data-id");
});
user.Policy.BlockedChannels = null;
user.Policy.BlockedMediaFolders = null;
ApiClient.updateUserPolicy(user.Id, user.Policy).then(function () {
onSaveComplete(page);
});
}
function onSubmit() {
var page = $(this).parents(".page");
loading.show();
var userId = getParameterByName("userId");
return ApiClient.getUser(userId).then(function(result) {
saveUser(result, page)
}), !1
ApiClient.getUser(userId).then(function (result) {
saveUser(result, page);
});
return false;
}
$(document).on("pageinit", "#userLibraryAccessPage", function() {
$(document).on("pageinit", "#userLibraryAccessPage", function () {
var page = this;
$("#chkEnableAllDevices", page).on("change", function() {
this.checked ? $(".deviceAccessListContainer", page).hide() : $(".deviceAccessListContainer", page).show()
}), $("#chkEnableAllChannels", page).on("change", function() {
this.checked ? $(".channelAccessListContainer", page).hide() : $(".channelAccessListContainer", page).show()
}), page.querySelector("#chkEnableAllFolders").addEventListener("change", function() {
this.checked ? page.querySelector(".folderAccessListContainer").classList.add("hide") : page.querySelector(".folderAccessListContainer").classList.remove("hide")
}), $(".userLibraryAccessForm").off("submit", onSubmit).on("submit", onSubmit)
}).on("pageshow", "#userLibraryAccessPage", function() {
$("#chkEnableAllDevices", page).on("change", function () {
if (this.checked) {
$(".deviceAccessListContainer", page).hide();
} else {
$(".deviceAccessListContainer", page).show();
}
});
$("#chkEnableAllChannels", page).on("change", function () {
if (this.checked) {
$(".channelAccessListContainer", page).hide();
} else {
$(".channelAccessListContainer", page).show();
}
});
page.querySelector("#chkEnableAllFolders").addEventListener("change", function () {
if (this.checked) {
page.querySelector(".folderAccessListContainer").classList.add("hide");
} else {
page.querySelector(".folderAccessListContainer").classList.remove("hide");
}
});
$(".userLibraryAccessForm").off("submit", onSubmit).on("submit", onSubmit);
}).on("pageshow", "#userLibraryAccessPage", function () {
var page = this;
loading.show();
var promise1, userId = getParameterByName("userId");
if (userId) promise1 = ApiClient.getUser(userId);
else {
var promise1;
var userId = getParameterByName("userId");
if (userId) {
promise1 = ApiClient.getUser(userId);
} else {
var deferred = $.Deferred();
deferred.resolveWith(null, [{
Configuration: {}
}]), promise1 = deferred.promise()
}]);
promise1 = deferred.promise();
}
var promise2 = Dashboard.getCurrentUser(),
promise4 = ApiClient.getJSON(ApiClient.getUrl("Library/MediaFolders", {
IsHidden: !1
})),
promise5 = ApiClient.getJSON(ApiClient.getUrl("Channels")),
promise6 = ApiClient.getJSON(ApiClient.getUrl("Devices"));
Promise.all([promise1, promise2, promise4, promise5, promise6]).then(function(responses) {
loadUser(page, responses[0], responses[1], responses[2].Items, responses[3].Items, responses[4].Items)
})
})
});
var promise2 = Dashboard.getCurrentUser();
var promise4 = ApiClient.getJSON(ApiClient.getUrl("Library/MediaFolders", {
IsHidden: false
}));
var promise5 = ApiClient.getJSON(ApiClient.getUrl("Channels"));
var promise6 = ApiClient.getJSON(ApiClient.getUrl("Devices"));
Promise.all([promise1, promise2, promise4, promise5, promise6]).then(function (responses) {
loadUser(page, responses[0], responses[1], responses[2].Items, responses[3].Items, responses[4].Items);
});
});
});

View file

@ -1,14 +1,16 @@
define(["jQuery", "loading", "fnchecked", "emby-checkbox"], function($, loading) {
define(["jQuery", "loading", "fnchecked", "emby-checkbox"], function ($, loading) {
"use strict";
function loadMediaFolders(page, mediaFolders) {
var html = "";
html += '<h3 class="checkboxListLabel">' + Globalize.translate("HeaderLibraries") + "</h3>";
html += '<div class="checkboxList paperList" style="padding:.5em 1em;">';
for (var i = 0; i < mediaFolders.length; i++) {
var folder = mediaFolders[i];
html += '<label><input type="checkbox" is="emby-checkbox" class="chkFolder" data-id="' + folder.Id + '" checked="checked"/><span>' + folder.Name + "</span></label>";
}
html += "</div>";
$(".folderAccess", page).html(html).trigger("create");
$("#chkEnableAllFolders", page).checked(true).trigger("change");
@ -18,17 +20,21 @@ define(["jQuery", "loading", "fnchecked", "emby-checkbox"], function($, loading)
var html = "";
html += '<h3 class="checkboxListLabel">' + Globalize.translate("HeaderChannels") + "</h3>";
html += '<div class="checkboxList paperList" style="padding:.5em 1em;">';
for (var i = 0; i < channels.length; i++) {
var folder = channels[i];
html += '<label><input type="checkbox" is="emby-checkbox" class="chkChannel" data-id="' + folder.Id + '" checked="checked"/><span>' + folder.Name + "</span></label>";
}
html += "</div>";
$(".channelAccess", page).show().html(html).trigger("create");
if (channels.length) {
$(".channelAccessContainer", page).show();
} else {
$(".channelAccessContainer", page).hide();
}
$("#chkEnableAllChannels", page).checked(true).trigger("change");
}
@ -37,46 +43,51 @@ define(["jQuery", "loading", "fnchecked", "emby-checkbox"], function($, loading)
$("#txtPassword", page).val("");
loading.show();
var promiseFolders = ApiClient.getJSON(ApiClient.getUrl("Library/MediaFolders", {
IsHidden: false
IsHidden: false
}));
var promiseChannels = ApiClient.getJSON(ApiClient.getUrl("Channels"));
Promise.all([promiseFolders, promiseChannels]).then(function(responses) {
Promise.all([promiseFolders, promiseChannels]).then(function (responses) {
loadMediaFolders(page, responses[0].Items);
loadChannels(page, responses[1].Items);
loading.hide();
})
});
}
function saveUser(page) {
var user = {};
user.Name = $("#txtUsername", page).val();
user.Password = $("#txtPassword", page).val();
ApiClient.createUser(user).then(function(user) {
ApiClient.createUser(user).then(function (user) {
user.Policy.EnableAllFolders = $("#chkEnableAllFolders", page).checked();
user.Policy.EnabledFolders = [];
if (!user.Policy.EnableAllFolders) {
user.Policy.EnabledFolders = $(".chkFolder", page).get().filter(function(i) {
return i.checked
}).map(function(i) {
user.Policy.EnabledFolders = $(".chkFolder", page).get().filter(function (i) {
return i.checked;
}).map(function (i) {
return i.getAttribute("data-id");
});
}
user.Policy.EnableAllChannels = $("#chkEnableAllChannels", page).checked();
user.Policy.EnabledChannels = [];
if (!user.Policy.EnableAllChannels) {
user.Policy.EnabledChannels = $(".chkChannel", page).get().filter(function(i) {
return i.checked
}).map(function(i) {
user.Policy.EnabledChannels = $(".chkChannel", page).get().filter(function (i) {
return i.checked;
}).map(function (i) {
return i.getAttribute("data-id");
});
}
ApiClient.updateUserPolicy(user.Id, user.Policy).then(function() {
ApiClient.updateUserPolicy(user.Id, user.Policy).then(function () {
Dashboard.navigate("useredit.html?userId=" + user.Id);
});
}, function(response) {
require(["toast"], function(toast) {
}, function (response) {
require(["toast"], function (toast) {
toast(Globalize.translate("DefaultErrorMessage"));
});
loading.hide();
});
}
@ -92,16 +103,16 @@ define(["jQuery", "loading", "fnchecked", "emby-checkbox"], function($, loading)
loadUser(page);
}
$(document).on("pageinit", "#newUserPage", function() {
$(document).on("pageinit", "#newUserPage", function () {
var page = this;
$("#chkEnableAllChannels", page).on("change", function() {
$("#chkEnableAllChannels", page).on("change", function () {
if (this.checked) {
$(".channelAccessListContainer", page).hide();
} else {
$(".channelAccessListContainer", page).show();
}
});
$("#chkEnableAllFolders", page).on("change", function() {
$("#chkEnableAllFolders", page).on("change", function () {
if (this.checked) {
$(".folderAccessListContainer", page).hide();
} else {
@ -109,7 +120,7 @@ define(["jQuery", "loading", "fnchecked", "emby-checkbox"], function($, loading)
}
});
$(".newUserProfileForm").off("submit", onSubmit).on("submit", onSubmit);
}).on("pageshow", "#newUserPage", function() {
}).on("pageshow", "#newUserPage", function () {
loadData(this);
});
});
});

View file

@ -1,185 +1,271 @@
define(["jQuery", "datetime", "loading", "libraryMenu", "listViewStyle", "paper-icon-button-light"], function($, datetime, loading, libraryMenu) {
define(["jQuery", "datetime", "loading", "libraryMenu", "listViewStyle", "paper-icon-button-light"], function ($, datetime, loading, libraryMenu) {
"use strict";
function populateRatings(allParentalRatings, page) {
var html = "";
html += "<option value=''></option>";
var i, length, rating, ratings = [];
var i;
var length;
var rating;
var ratings = [];
for (i = 0, length = allParentalRatings.length; i < length; i++) {
if (rating = allParentalRatings[i], ratings.length) {
var lastRating = ratings[ratings.length - 1];
if (lastRating.Value === rating.Value) {
lastRating.Name += "/" + rating.Name;
continue
continue;
}
}
ratings.push({
Name: rating.Name,
Value: rating.Value
})
});
}
for (i = 0, length = ratings.length; i < length; i++) rating = ratings[i], html += "<option value='" + rating.Value + "'>" + rating.Name + "</option>";
$("#selectMaxParentalRating", page).html(html)
for (i = 0, length = ratings.length; i < length; i++) {
rating = ratings[i];
html += "<option value='" + rating.Value + "'>" + rating.Name + "</option>";
}
$("#selectMaxParentalRating", page).html(html);
}
function loadUnratedItems(page, user) {
var items = [{
name: Globalize.translate("OptionBlockBooks"),
value: "Book"
}, {
name: Globalize.translate("OptionBlockChannelContent"),
value: "ChannelContent"
}, {
name: Globalize.translate("OptionBlockLiveTvChannels"),
value: "LiveTvChannel"
}, {
name: Globalize.translate("OptionBlockMovies"),
value: "Movie"
}, {
name: Globalize.translate("OptionBlockMusic"),
value: "Music"
}, {
name: Globalize.translate("OptionBlockTrailers"),
value: "Trailer"
}, {
name: Globalize.translate("OptionBlockTvShows"),
value: "Series"
}],
html = "";
html += '<h3 class="checkboxListLabel">' + Globalize.translate("HeaderBlockItemsWithNoRating") + "</h3>", html += '<div class="checkboxList paperList checkboxList-paperList">';
name: Globalize.translate("OptionBlockBooks"),
value: "Book"
}, {
name: Globalize.translate("OptionBlockChannelContent"),
value: "ChannelContent"
}, {
name: Globalize.translate("OptionBlockLiveTvChannels"),
value: "LiveTvChannel"
}, {
name: Globalize.translate("OptionBlockMovies"),
value: "Movie"
}, {
name: Globalize.translate("OptionBlockMusic"),
value: "Music"
}, {
name: Globalize.translate("OptionBlockTrailers"),
value: "Trailer"
}, {
name: Globalize.translate("OptionBlockTvShows"),
value: "Series"
}];
var html = "";
html += '<h3 class="checkboxListLabel">' + Globalize.translate("HeaderBlockItemsWithNoRating") + "</h3>";
html += '<div class="checkboxList paperList checkboxList-paperList">';
for (var i = 0, length = items.length; i < length; i++) {
var item = items[i],
checkedAttribute = -1 != user.Policy.BlockUnratedItems.indexOf(item.value) ? ' checked="checked"' : "";
html += '<label><input type="checkbox" is="emby-checkbox" class="chkUnratedItem" data-itemtype="' + item.value + '" type="checkbox"' + checkedAttribute + "><span>" + item.name + "</span></label>"
var item = items[i];
var checkedAttribute = -1 != user.Policy.BlockUnratedItems.indexOf(item.value) ? ' checked="checked"' : "";
html += '<label><input type="checkbox" is="emby-checkbox" class="chkUnratedItem" data-itemtype="' + item.value + '" type="checkbox"' + checkedAttribute + "><span>" + item.name + "</span></label>";
}
html += "</div>", $(".blockUnratedItems", page).html(html).trigger("create")
html += "</div>";
$(".blockUnratedItems", page).html(html).trigger("create");
}
function loadUser(page, user, allParentalRatings) {
page.querySelector(".username").innerHTML = user.Name, libraryMenu.setTitle(user.Name), loadUnratedItems(page, user), loadBlockedTags(page, user.Policy.BlockedTags), populateRatings(allParentalRatings, page);
page.querySelector(".username").innerHTML = user.Name;
libraryMenu.setTitle(user.Name);
loadUnratedItems(page, user);
loadBlockedTags(page, user.Policy.BlockedTags);
populateRatings(allParentalRatings, page);
var ratingValue = "";
if (user.Policy.MaxParentalRating)
if (user.Policy.MaxParentalRating) {
for (var i = 0, length = allParentalRatings.length; i < length; i++) {
var rating = allParentalRatings[i];
user.Policy.MaxParentalRating >= rating.Value && (ratingValue = rating.Value)
if (user.Policy.MaxParentalRating >= rating.Value) {
ratingValue = rating.Value;
}
}
$("#selectMaxParentalRating", page).val(ratingValue), user.Policy.IsAdministrator ? $(".accessScheduleSection", page).hide() : $(".accessScheduleSection", page).show(), renderAccessSchedule(page, user.Policy.AccessSchedules || []), loading.hide()
}
$("#selectMaxParentalRating", page).val(ratingValue);
if (user.Policy.IsAdministrator) {
$(".accessScheduleSection", page).hide();
} else {
$(".accessScheduleSection", page).show();
}
renderAccessSchedule(page, user.Policy.AccessSchedules || []);
loading.hide();
}
function loadBlockedTags(page, tags) {
var html = tags.map(function(h) {
var html = tags.map(function (h) {
var li = '<div class="listItem">';
return li += '<div class="listItemBody">', li += '<h3 class="listItemBodyText">', li += h, li += "</h3>", li += "</div>", li += '<button type="button" is="paper-icon-button-light" class="blockedTag btnDeleteTag listItemButton" data-tag="' + h + '"><i class="md-icon">delete</i></button>', li += "</div>"
li += '<div class="listItemBody">';
li += '<h3 class="listItemBodyText">';
li += h;
li += "</h3>";
li += "</div>";
li += '<button type="button" is="paper-icon-button-light" class="blockedTag btnDeleteTag listItemButton" data-tag="' + h + '"><i class="md-icon">delete</i></button>';
return li += "</div>";
}).join("");
html && (html = '<div class="paperList">' + html + "</div>");
if (html) {
html = '<div class="paperList">' + html + "</div>";
}
var elem = $(".blockedTags", page).html(html).trigger("create");
$(".btnDeleteTag", elem).on("click", function() {
var tag = this.getAttribute("data-tag"),
newTags = tags.filter(function(t) {
return t != tag
});
loadBlockedTags(page, newTags)
})
$(".btnDeleteTag", elem).on("click", function () {
var tag = this.getAttribute("data-tag");
var newTags = tags.filter(function (t) {
return t != tag;
});
loadBlockedTags(page, newTags);
});
}
function deleteAccessSchedule(page, schedules, index) {
schedules.splice(index, 1), renderAccessSchedule(page, schedules)
schedules.splice(index, 1);
renderAccessSchedule(page, schedules);
}
function renderAccessSchedule(page, schedules) {
var html = "",
index = 0;
html += schedules.map(function(a) {
var html = "";
var index = 0;
html += schedules.map(function (a) {
var itemHtml = "";
return itemHtml += '<div class="liSchedule listItem" data-day="' + a.DayOfWeek + '" data-start="' + a.StartHour + '" data-end="' + a.EndHour + '">', itemHtml += '<div class="listItemBody two-line">', itemHtml += '<h3 class="listItemBodyText">', itemHtml += Globalize.translate("Option" + a.DayOfWeek), itemHtml += "</h3>", itemHtml += '<div class="listItemBodyText secondary">' + getDisplayTime(a.StartHour) + " - " + getDisplayTime(a.EndHour) + "</div>", itemHtml += "</div>", itemHtml += '<button type="button" is="paper-icon-button-light" class="btnDelete listItemButton" data-index="' + index + '"><i class="md-icon">delete</i></button>', itemHtml += "</div>", index++, itemHtml
itemHtml += '<div class="liSchedule listItem" data-day="' + a.DayOfWeek + '" data-start="' + a.StartHour + '" data-end="' + a.EndHour + '">';
itemHtml += '<div class="listItemBody two-line">';
itemHtml += '<h3 class="listItemBodyText">';
itemHtml += Globalize.translate("Option" + a.DayOfWeek);
itemHtml += "</h3>";
itemHtml += '<div class="listItemBodyText secondary">' + getDisplayTime(a.StartHour) + " - " + getDisplayTime(a.EndHour) + "</div>";
itemHtml += "</div>";
itemHtml += '<button type="button" is="paper-icon-button-light" class="btnDelete listItemButton" data-index="' + index + '"><i class="md-icon">delete</i></button>';
itemHtml += "</div>";
index++;
return itemHtml;
}).join("");
var accessScheduleList = page.querySelector(".accessScheduleList");
accessScheduleList.innerHTML = html, $(".btnDelete", accessScheduleList).on("click", function() {
deleteAccessSchedule(page, schedules, parseInt(this.getAttribute("data-index")))
})
accessScheduleList.innerHTML = html;
$(".btnDelete", accessScheduleList).on("click", function () {
deleteAccessSchedule(page, schedules, parseInt(this.getAttribute("data-index")));
});
}
function onSaveComplete(page) {
loading.hide(), require(["toast"], function(toast) {
toast(Globalize.translate("SettingsSaved"))
})
loading.hide();
require(["toast"], function (toast) {
toast(Globalize.translate("SettingsSaved"));
});
}
function saveUser(user, page) {
user.Policy.MaxParentalRating = $("#selectMaxParentalRating", page).val() || null, user.Policy.BlockUnratedItems = $(".chkUnratedItem", page).get().filter(function(i) {
return i.checked
}).map(function(i) {
return i.getAttribute("data-itemtype")
}), user.Policy.AccessSchedules = getSchedulesFromPage(page), user.Policy.BlockedTags = getBlockedTagsFromPage(page), ApiClient.updateUserPolicy(user.Id, user.Policy).then(function() {
onSaveComplete(page)
})
user.Policy.MaxParentalRating = $("#selectMaxParentalRating", page).val() || null;
user.Policy.BlockUnratedItems = $(".chkUnratedItem", page).get().filter(function (i) {
return i.checked;
}).map(function (i) {
return i.getAttribute("data-itemtype");
});
user.Policy.AccessSchedules = getSchedulesFromPage(page);
user.Policy.BlockedTags = getBlockedTagsFromPage(page);
ApiClient.updateUserPolicy(user.Id, user.Policy).then(function () {
onSaveComplete(page);
});
}
function getDisplayTime(hours) {
var minutes = 0,
pct = hours % 1;
return pct && (minutes = parseInt(60 * pct)), datetime.getDisplayTime(new Date(2e3, 1, 1, hours, minutes, 0, 0))
var minutes = 0;
var pct = hours % 1;
if (pct) {
minutes = parseInt(60 * pct);
}
return datetime.getDisplayTime(new Date(2000, 1, 1, hours, minutes, 0, 0));
}
function showSchedulePopup(page, schedule, index) {
schedule = schedule || {}, require(["components/accessschedule/accessschedule"], function(accessschedule) {
schedule = schedule || {};
require(["components/accessschedule/accessschedule"], function (accessschedule) {
accessschedule.show({
schedule: schedule
}).then(function(updatedSchedule) {
var schedules = getSchedulesFromPage(page); - 1 == index && (index = schedules.length), schedules[index] = updatedSchedule, renderAccessSchedule(page, schedules)
})
})
}).then(function (updatedSchedule) {
var schedules = getSchedulesFromPage(page);
if (-1 == index) {
index = schedules.length;
}
schedules[index] = updatedSchedule;
renderAccessSchedule(page, schedules);
});
});
}
function getSchedulesFromPage(page) {
return $(".liSchedule", page).map(function() {
return $(".liSchedule", page).map(function () {
return {
DayOfWeek: this.getAttribute("data-day"),
StartHour: this.getAttribute("data-start"),
EndHour: this.getAttribute("data-end")
}
}).get()
};
}).get();
}
function getBlockedTagsFromPage(page) {
return $(".blockedTag", page).map(function() {
return this.getAttribute("data-tag")
}).get()
return $(".blockedTag", page).map(function () {
return this.getAttribute("data-tag");
}).get();
}
function showBlockedTagPopup(page) {
require(["prompt"], function(prompt) {
require(["prompt"], function (prompt) {
prompt({
label: Globalize.translate("LabelTag")
}).then(function(value) {
var tags = getBlockedTagsFromPage(page); - 1 == tags.indexOf(value) && (tags.push(value), loadBlockedTags(page, tags))
})
})
}).then(function (value) {
var tags = getBlockedTagsFromPage(page);
if (-1 == tags.indexOf(value)) {
tags.push(value);
loadBlockedTags(page, tags);
}
});
});
}
window.UserParentalControlPage = {
onSubmit: function() {
onSubmit: function () {
var page = $(this).parents(".page");
loading.show();
var userId = getParameterByName("userId");
return ApiClient.getUser(userId).then(function(result) {
saveUser(result, page)
}), !1
ApiClient.getUser(userId).then(function (result) {
saveUser(result, page);
});
return false;
}
}, $(document).on("pageinit", "#userParentalControlPage", function() {
};
$(document).on("pageinit", "#userParentalControlPage", function () {
var page = this;
$(".btnAddSchedule", page).on("click", function() {
showSchedulePopup(page, {}, -1)
}), $(".btnAddBlockedTag", page).on("click", function() {
showBlockedTagPopup(page)
}), $(".userParentalControlForm").off("submit", UserParentalControlPage.onSubmit).on("submit", UserParentalControlPage.onSubmit)
}).on("pageshow", "#userParentalControlPage", function() {
$(".btnAddSchedule", page).on("click", function () {
showSchedulePopup(page, {}, -1);
});
$(".btnAddBlockedTag", page).on("click", function () {
showBlockedTagPopup(page);
});
$(".userParentalControlForm").off("submit", UserParentalControlPage.onSubmit).on("submit", UserParentalControlPage.onSubmit);
}).on("pageshow", "#userParentalControlPage", function () {
var page = this;
loading.show();
var userId = getParameterByName("userId"),
promise1 = ApiClient.getUser(userId),
promise2 = ApiClient.getParentalRatings();
Promise.all([promise1, promise2]).then(function(responses) {
loadUser(page, responses[0], responses[1])
})
})
var userId = getParameterByName("userId");
var promise1 = ApiClient.getUser(userId);
var promise2 = ApiClient.getParentalRatings();
Promise.all([promise1, promise2]).then(function (responses) {
loadUser(page, responses[0], responses[1]);
});
});
});

View file

@ -1,101 +1,183 @@
define(["loading", "libraryMenu", "emby-button"], function(loading, libraryMenu) {
define(["loading", "libraryMenu", "emby-button"], function (loading, libraryMenu) {
"use strict";
function loadUser(page, params) {
var userid = params.userId;
ApiClient.getUser(userid).then(function(user) {
Dashboard.getCurrentUser().then(function(loggedInUser) {
libraryMenu.setTitle(user.Name), page.querySelector(".username").innerHTML = user.Name;
var showPasswordSection = !0,
showLocalAccessSection = !1;
"Guest" == user.ConnectLinkType ? (page.querySelector(".localAccessSection").classList.add("hide"), showPasswordSection = !1) : user.HasConfiguredPassword ? (page.querySelector("#btnResetPassword").classList.remove("hide"), page.querySelector("#fldCurrentPassword").classList.remove("hide"), showLocalAccessSection = !0) : (page.querySelector("#btnResetPassword").classList.add("hide"), page.querySelector("#fldCurrentPassword").classList.add("hide")), showPasswordSection && (loggedInUser.Policy.IsAdministrator || user.Policy.EnableUserPreferenceAccess) ? page.querySelector(".passwordSection").classList.remove("hide") : page.querySelector(".passwordSection").classList.add("hide"), showLocalAccessSection && (loggedInUser.Policy.IsAdministrator || user.Policy.EnableUserPreferenceAccess) ? page.querySelector(".localAccessSection").classList.remove("hide") : page.querySelector(".localAccessSection").classList.add("hide");
ApiClient.getUser(userid).then(function (user) {
Dashboard.getCurrentUser().then(function (loggedInUser) {
libraryMenu.setTitle(user.Name);
page.querySelector(".username").innerHTML = user.Name;
var showPasswordSection = true;
var showLocalAccessSection = false;
if ("Guest" == user.ConnectLinkType) {
page.querySelector(".localAccessSection").classList.add("hide");
showPasswordSection = false;
} else if (user.HasConfiguredPassword) {
page.querySelector("#btnResetPassword").classList.remove("hide");
page.querySelector("#fldCurrentPassword").classList.remove("hide");
showLocalAccessSection = true;
} else {
page.querySelector("#btnResetPassword").classList.add("hide");
page.querySelector("#fldCurrentPassword").classList.add("hide");
}
if (showPasswordSection && (loggedInUser.Policy.IsAdministrator || user.Policy.EnableUserPreferenceAccess)) {
page.querySelector(".passwordSection").classList.remove("hide");
} else {
page.querySelector(".passwordSection").classList.add("hide");
}
if (showLocalAccessSection && (loggedInUser.Policy.IsAdministrator || user.Policy.EnableUserPreferenceAccess)) {
page.querySelector(".localAccessSection").classList.remove("hide");
} else {
page.querySelector(".localAccessSection").classList.add("hide");
}
var txtEasyPassword = page.querySelector("#txtEasyPassword");
txtEasyPassword.value = "", user.HasConfiguredEasyPassword ? (txtEasyPassword.placeholder = "******", page.querySelector("#btnResetEasyPassword").classList.remove("hide")) : (txtEasyPassword.removeAttribute("placeholder"), txtEasyPassword.placeholder = "", page.querySelector("#btnResetEasyPassword").classList.add("hide")), page.querySelector(".chkEnableLocalEasyPassword").checked = user.Configuration.EnableLocalPassword
})
}), page.querySelector("#txtCurrentPassword").value = "", page.querySelector("#txtNewPassword").value = "", page.querySelector("#txtNewPasswordConfirm").value = ""
txtEasyPassword.value = "";
if (user.HasConfiguredEasyPassword) {
txtEasyPassword.placeholder = "******";
page.querySelector("#btnResetEasyPassword").classList.remove("hide");
} else {
txtEasyPassword.removeAttribute("placeholder");
txtEasyPassword.placeholder = "";
page.querySelector("#btnResetEasyPassword").classList.add("hide");
}
page.querySelector(".chkEnableLocalEasyPassword").checked = user.Configuration.EnableLocalPassword;
});
});
page.querySelector("#txtCurrentPassword").value = "";
page.querySelector("#txtNewPassword").value = "";
page.querySelector("#txtNewPasswordConfirm").value = "";
}
return function(view, params) {
return function (view, params) {
function saveEasyPassword() {
var userId = params.userId,
easyPassword = view.querySelector("#txtEasyPassword").value;
easyPassword ? ApiClient.updateEasyPassword(userId, easyPassword).then(function() {
onEasyPasswordSaved(userId)
}) : onEasyPasswordSaved(userId)
var userId = params.userId;
var easyPassword = view.querySelector("#txtEasyPassword").value;
if (easyPassword) {
ApiClient.updateEasyPassword(userId, easyPassword).then(function () {
onEasyPasswordSaved(userId);
});
} else {
onEasyPasswordSaved(userId);
}
}
function onEasyPasswordSaved(userId) {
ApiClient.getUser(userId).then(function(user) {
user.Configuration.EnableLocalPassword = view.querySelector(".chkEnableLocalEasyPassword").checked, ApiClient.updateUserConfiguration(user.Id, user.Configuration).then(function() {
loading.hide(), require(["toast"], function(toast) {
toast(Globalize.translate("MessageSettingsSaved"))
}), loadUser(view, params)
})
})
ApiClient.getUser(userId).then(function (user) {
user.Configuration.EnableLocalPassword = view.querySelector(".chkEnableLocalEasyPassword").checked;
ApiClient.updateUserConfiguration(user.Id, user.Configuration).then(function () {
loading.hide();
require(["toast"], function (toast) {
toast(Globalize.translate("MessageSettingsSaved"));
});
loadUser(view, params);
});
});
}
function savePassword() {
var userId = params.userId,
currentPassword = view.querySelector("#txtCurrentPassword").value,
newPassword = view.querySelector("#txtNewPassword").value;
var userId = params.userId;
var currentPassword = view.querySelector("#txtCurrentPassword").value;
var newPassword = view.querySelector("#txtNewPassword").value;
if (view.querySelector("#fldCurrentPassword").classList.contains("hide")) {
// Firefox does not respect autocomplete=off, so clear it if the field is supposed to be hidden (and blank)
// This should only happen when user.HasConfiguredPassword is false, but this information is not passed on
currentPassword = "";
}
ApiClient.updateUserPassword(userId, currentPassword, newPassword).then(function() {
loading.hide(), require(["toast"], function(toast) {
toast(Globalize.translate("PasswordSaved"))
}), loadUser(view, params)
}, function() {
loading.hide(), Dashboard.alert({
ApiClient.updateUserPassword(userId, currentPassword, newPassword).then(function () {
loading.hide();
require(["toast"], function (toast) {
toast(Globalize.translate("PasswordSaved"));
});
loadUser(view, params);
}, function () {
loading.hide();
Dashboard.alert({
title: Globalize.translate("HeaderLoginFailure"),
message: Globalize.translate("MessageInvalidUser")
})
})
});
});
}
function onSubmit(e) {
var form = this;
return form.querySelector("#txtNewPassword").value != form.querySelector("#txtNewPasswordConfirm").value ? require(["toast"], function(toast) {
toast(Globalize.translate("PasswordMatchError"))
}) : (loading.show(), savePassword()), e.preventDefault(), !1
if (form.querySelector("#txtNewPassword").value != form.querySelector("#txtNewPasswordConfirm").value) {
require(["toast"], function (toast) {
toast(Globalize.translate("PasswordMatchError"));
});
} else {
loading.show();
savePassword();
}
e.preventDefault();
return false;
}
function onLocalAccessSubmit(e) {
return loading.show(), saveEasyPassword(), e.preventDefault(), !1
loading.show();
saveEasyPassword();
e.preventDefault();
return false;
}
function resetPassword() {
var msg = Globalize.translate("PasswordResetConfirmation");
require(["confirm"], function(confirm) {
confirm(msg, Globalize.translate("PasswordResetHeader")).then(function() {
require(["confirm"], function (confirm) {
confirm(msg, Globalize.translate("PasswordResetHeader")).then(function () {
var userId = params.userId;
loading.show(), ApiClient.resetUserPassword(userId).then(function() {
loading.hide(), Dashboard.alert({
loading.show();
ApiClient.resetUserPassword(userId).then(function () {
loading.hide();
Dashboard.alert({
message: Globalize.translate("PasswordResetComplete"),
title: Globalize.translate("PasswordResetHeader")
}), loadUser(view, params)
})
})
})
});
loadUser(view, params);
});
});
});
}
function resetEasyPassword() {
var msg = Globalize.translate("PinCodeResetConfirmation");
require(["confirm"], function(confirm) {
confirm(msg, Globalize.translate("HeaderPinCodeReset")).then(function() {
require(["confirm"], function (confirm) {
confirm(msg, Globalize.translate("HeaderPinCodeReset")).then(function () {
var userId = params.userId;
loading.show(), ApiClient.resetEasyPassword(userId).then(function() {
loading.hide(), Dashboard.alert({
loading.show();
ApiClient.resetEasyPassword(userId).then(function () {
loading.hide();
Dashboard.alert({
message: Globalize.translate("PinCodeResetComplete"),
title: Globalize.translate("HeaderPinCodeReset")
}), loadUser(view, params)
})
})
})
});
loadUser(view, params);
});
});
});
}
view.querySelector(".updatePasswordForm").addEventListener("submit", onSubmit), view.querySelector(".localAccessForm").addEventListener("submit", onLocalAccessSubmit), view.querySelector("#btnResetEasyPassword").addEventListener("click", resetEasyPassword), view.querySelector("#btnResetPassword").addEventListener("click", resetPassword), view.addEventListener("viewshow", function() {
loadUser(view, params)
})
}
view.querySelector(".updatePasswordForm").addEventListener("submit", onSubmit);
view.querySelector(".localAccessForm").addEventListener("submit", onLocalAccessSubmit);
view.querySelector("#btnResetEasyPassword").addEventListener("click", resetEasyPassword);
view.querySelector("#btnResetPassword").addEventListener("click", resetPassword);
view.addEventListener("viewshow", function () {
loadUser(view, params);
});
};
});

View file

@ -6,7 +6,7 @@ define(["loading"], function (loading) {
ApiClient.ajax({
url: ApiClient.getUrl("Startup/Complete"),
type: "POST"
}).then(function() {
}).then(function () {
loading.hide();
window.location.href = "index.html";
});

View file

@ -98,8 +98,8 @@
<body>
<div class="backdropContainer"></div>
<div class="backgroundContainer"></div>
<div class="mainDrawer hide"><div class="mainDrawer-scrollContainer scrollContainer"></div></div>
<div class="skinHeader"></div>
<div class="mainDrawer hide"><div class="mainDrawer-scrollContainer scrollContainer focuscontainer-y"></div></div>
<div class="skinHeader focuscontainer-x"></div>
<div class="mainAnimatedPages skinBody"></div>
<div class="mainDrawerHandle"></div>
</body>

View file

@ -20,7 +20,7 @@
}
injectScriptElement(
self.Promise ? "./bower_components/alameda/alameda.js" : "./bower_components/requirejs/require.js",
self.Promise ? "./libraries/alameda.js" : "./libraries/require.js",
function() {
// onload of require library
injectScriptElement("./scripts/site.js");

View file

@ -52,14 +52,6 @@ define(["dom", "layoutManager", "inputManager", "connectionManager", "events", "
headerSearchButton.classList.remove("hide");
}
if (headerSettingsButton) {
if (user.localUser.Policy.IsAdministrator) {
headerSettingsButton.classList.remove("hide");
} else {
headerSettingsButton.classList.add("hide");
}
}
headerCastButton.classList.remove("hide");
} else {
headerHomeButton.classList.add("hide");
@ -68,10 +60,6 @@ define(["dom", "layoutManager", "inputManager", "connectionManager", "events", "
if (headerSearchButton) {
headerSearchButton.classList.add("hide");
}
if (headerSettingsButton) {
headerSettingsButton.classList.add("hide");
}
}
requiresUserRefresh = false;
@ -95,10 +83,6 @@ define(["dom", "layoutManager", "inputManager", "connectionManager", "events", "
Dashboard.navigate("mypreferencesmenu.html");
}
function onSettingsClick(e) {
Dashboard.navigate("dashboard.html");
}
function onHeaderHomeButtonClick() {
Dashboard.navigate("home.html");
}
@ -122,12 +106,9 @@ define(["dom", "layoutManager", "inputManager", "connectionManager", "events", "
headerUserButton.addEventListener("click", onHeaderUserButtonClick);
headerHomeButton.addEventListener("click", onHeaderHomeButtonClick);
initHeadRoom(skinHeader);
headerCastButton.addEventListener("click", onCastButtonClicked);
if (headerSettingsButton) {
headerSettingsButton.addEventListener("click", onSettingsClick);
}
initHeadRoom(skinHeader);
}
function onCastButtonClicked() {
@ -747,7 +728,6 @@ define(["dom", "layoutManager", "inputManager", "connectionManager", "events", "
var headerBackButton;
var headerUserButton;
var currentUser;
var headerSettingsButton;
var headerCastButton;
var headerSearchButton;
var enableLibraryNavDrawer = !layoutManager.tv;
@ -873,23 +853,20 @@ define(["dom", "layoutManager", "inputManager", "connectionManager", "events", "
html += '<button is="paper-icon-button-light" class="headerCastButton castButton headerButton headerButtonRight hide"><i class="md-icon">&#xE307;</i></button>';
html += '<button type="button" is="paper-icon-button-light" class="headerButton headerButtonRight headerSearchButton hide"><i class="md-icon">&#xE8B6;</i></button>';
html += '<button is="paper-icon-button-light" class="headerButton headerButtonRight headerUserButton hide"><i class="md-icon">&#xE7FD;</i></button>';
if (!layoutManager.mobile) {
html += '<button is="paper-icon-button-light" class="headerButton headerButtonRight headerSettingsButton hide"><i class="md-icon">dashboard</i></button>';
}
html += "</div>";
html += "</div>";
html += '<div class="headerTabs sectionTabs hide">';
html += "</div>";
skinHeader.classList.add("skinHeader-withBackground");
skinHeader.classList.add("skinHeader-blurred");
skinHeader.innerHTML = html;
headerHomeButton = skinHeader.querySelector(".headerHomeButton");
headerUserButton = skinHeader.querySelector(".headerUserButton");
headerSettingsButton = skinHeader.querySelector(".headerSettingsButton");
headerCastButton = skinHeader.querySelector(".headerCastButton");
headerSearchButton = skinHeader.querySelector(".headerSearchButton");
skinHeader.classList.add("skinHeader-blurred");
lazyLoadViewMenuBarImages();
bindMenuEvents();
})();

View file

@ -13,7 +13,7 @@
"AllChannels": "Všechny kanály",
"AllEpisodes": "Všechny epizody",
"AllLanguages": "Všechny jazyky",
"AllowHWTranscodingHelp": "Pokud nastavíte, povolíte tuneru překódování v reálném čase. Může snížit zátěž překódovávání požadované Jellyfin serverem.",
"AllowHWTranscodingHelp": "Povolit tuneru překódování v reálném čase. Může snížit zátěž překódovávání požadované Jellyfin serverem.",
"AlwaysPlaySubtitles": "Vždy zobrazit titulky",
"AlwaysPlaySubtitlesHelp": "Titulky odpovídající jazykové předvolbě se načtou bez ohledu na jazyk audia.",
"Anytime": "Kdykoliv",
@ -30,7 +30,7 @@
"BirthDateValue": "Narozen: {0}",
"BirthLocation": "Místo narození",
"BirthPlaceValue": "Místo narození: {0}",
"BookLibraryHelp": "Audio a textové knihy jsou podporovány. Přečtěte si {0}pravidla pro názvy knih v Jellyfin{1}.",
"BookLibraryHelp": "Audio a textové knihy jsou podporovány. Přečtěte si {0}pravidla pro názvy knih {1}.",
"Books": "Knihy",
"Box": "Pouzdro",
"BoxRear": "Zadní část pouzdra",
@ -157,7 +157,7 @@
"Dislike": "Nemám rád",
"Display": "Zobrazení",
"DisplayMissingEpisodesWithinSeasons": "Zobrazit chybějící epizody",
"DisplayMissingEpisodesWithinSeasonsHelp": "Toto musí být zapnuto pro knihovny TV v nastavení Jellyfin serveru.",
"DisplayMissingEpisodesWithinSeasonsHelp": "Toto musí být zapnuto pro knihovny TV v nastavení serveru.",
"DisplayModeHelp": "Zvolte typ obrazovky, na které používáte Jellyfin.",
"DoNotRecord": "Nenahrávat",
"Down": "Dolů",
@ -522,7 +522,7 @@
"LabelEnableDlnaClientDiscoveryInterval": "Čas pro vyhledání klienta (sekund)",
"LabelEnableDlnaClientDiscoveryIntervalHelp": "Určuje dobu trvání v sekundách mezi SSDP vyhledávání prováděných pomocí Jellyfin.",
"LabelEnableDlnaDebugLogging": "Povolit DLNA protokolování (pro ladění)",
"LabelEnableDlnaDebugLoggingHelp": "Toto nastavení vytváří velmi velké soubory se záznamy a doporučuje se pouze v případě problémů.",
"LabelEnableDlnaDebugLoggingHelp": "Vytváří velké soubory se záznamy a doporučuje se používat pouze pro potřeby odstraňování problémů.",
"LabelEnableDlnaPlayTo": "Povolit DLNA přehrávání",
"LabelEnableDlnaPlayToHelp": "Jellyfin dokáže detekovat zařízení v rámci vaší sítě a nabízí možnost jeho dálkového ovládání.",
"LabelEnableDlnaServer": "Povolit Dlna Server",
@ -611,9 +611,9 @@
"LabelMethod": "Metoda:",
"LabelMinBackdropDownloadWidth": "Maximální šířka pro stažení pozadí:",
"LabelMinResumeDuration": "Minimální doba trvání:",
"LabelMinResumeDurationHelp": "Videa kratší než tato délka nebudou pozastavitelné",
"LabelMinResumeDurationHelp": "Videa kratší než tato délka nebudou pozastavitelné.",
"LabelMinResumePercentage": "Minimální procento pro přerušení:",
"LabelMinResumePercentageHelp": "Tituly budou označeny jako \"nepřehráno\", pokud budou zastaveny před tímto časem",
"LabelMinResumePercentageHelp": "Tituly budou označeny jako \"nepřehráno\", pokud budou zastaveny před tímto časem.",
"LabelMinScreenshotDownloadWidth": "Minimální šířka screenshotu obrazovky:",
"LabelModelDescription": "Popis modelu",
"LabelModelName": "Název modelu",
@ -1027,7 +1027,7 @@
"PlaybackErrorNotAllowed": "V současné době nejste oprávněni přehrávat tento obsah. Pro více informací se obraťte se na správce systému.",
"PlaybackErrorPlaceHolder": "Chcete-li toto video přehrát, vložte disk.",
"Played": "Přehráno",
"Playlists": "Playlisty",
"Playlists": "Seznamy skladeb",
"PleaseAddAtLeastOneFolder": "Přidejte prosím nejméně jednu složku do této knihovny pomocí tlačítka Přidat.",
"PleaseConfirmPluginInstallation": "Pro potvrzení, že jste si přečetli text výše a chcete pokračovat v instalaci zásuvných modulů, klikněte na tlačítko OK.",
"PleaseEnterNameOrId": "Prosím, zadejte název nebo externí Id.",
@ -1230,7 +1230,7 @@
"AllowMediaConversion": "Povolit konverzi médií",
"AllowMediaConversionHelp": "Povolit nebo zakázat přístup k funkci konverze médií.",
"AllowOnTheFlySubtitleExtraction": "Povolit extrahování titulků za běhu",
"AllowOnTheFlySubtitleExtractionHelp": "Vložené titulky mohou být extrahovány z videa a dodávány do aplikace Jellyfin ve formě prostého textu, aby se zabránilo překódování videa. V některých systémech to může trvat dlouho a způsobit zasekávání přehrávání videa. Při vypnutí funkce budou během překódování obsažené titulky vypáleny do obrazu, pokud je klientské zařízení nativně nepodporuje.",
"AllowOnTheFlySubtitleExtractionHelp": "Vložené titulky mohou být extrahovány z videa a dodávány do aplikací ve formě prostého textu, aby se zabránilo překódování videa. V některých systémech to může trvat dlouho a způsobit zasekávání přehrávání videa. Při vypnutí funkce budou během překódování obsažené titulky vypáleny do obrazu, pokud je klientské zařízení nativně nepodporuje.",
"AllowRemoteAccess": "Povolit vzdálené připojení na server Jellyfin.",
"AllowRemoteAccessHelp": "Pokud není zapnuto, všechna vzdálená připojení budou blokována.",
"AllowSeasonalThemesHelp": "Pokud je povoleno, sezónní motivy občas přepíšou nastavení vašeho motivu.",
@ -1249,7 +1249,7 @@
"Blacklist": "Blacklist",
"BobAndWeaveWithHelp": "Bob and weave (vyšší kvalita, ale pomalejší)",
"Browse": "Procházet",
"BurnSubtitlesHelp": "Určuje, zda má server vypalovat titulky při převodu videa v závislosti na formátu titulků. Vynechání vypalování titulků zlepší výkon serveru. Chcete-li vypálit grafické formáty (např. VOBSUB, PGS, SUB / IDX atd.), stejně jako některé titulky ASS / SSA, vyberte možnost Auto",
"BurnSubtitlesHelp": "Určuje, zda má server vypalovat titulky při převodu videa v závislosti na formátu titulků. Vynechání vypalování titulků zlepší výkon serveru. Chcete-li vypálit grafické formáty (VOBSUB, PGS, SUB / IDX atd.) a některé titulky ASS / SSA, vyberte možnost Auto.",
"ButtonInfo": "Info",
"ButtonMenu": "Menu",
"ButtonOk": "Ok",
@ -1304,7 +1304,7 @@
"HandledByProxy": "Zpracováno reverzním proxy",
"HeaderAddLocalUser": "Přidat místního uživatele",
"HeaderAllowMediaDeletionFrom": "Povolit smazání médií z",
"HeaderAppearsOn": "Appears On",
"HeaderAppearsOn": "Objeví se",
"HeaderAudio": "Audio",
"HeaderBlockItemsWithNoRating": "Blokovat položky s žádnými nebo nerozpoznanými informacemi o hodnocení:",
"HeaderCameraUploadHelp": "Aplikace Jellyfin mohou automaticky nahrávat fotografie z mobilních zařízení do serveru Jellyfin.",
@ -1322,8 +1322,8 @@
"HeaderImageOptions": "Volby obrázku",
"HeaderInviteWithJellyfinConnect": "Pozvat s Jellyfin Connect",
"HeaderKodiMetadataHelp": "Chcete-li povolit nebo zakázat Nfo metadata, upravte nastavení knihovny v sekci ukládání metadat.",
"HeaderLiveTV": "Live TV",
"HeaderLiveTv": "Live TV",
"HeaderLiveTV": "Živá TV",
"HeaderLiveTv": "Živá TV",
"HeaderLiveTvTunerSetup": "Nastavení tuneru Live TV",
"HeaderMenu": "Menu",
"HeaderNewDevices": "Nové zařízení",
@ -1350,7 +1350,7 @@
"LabelAlbum": "Album:",
"LabelAllowedRemoteAddresses": "Filtr vzdálené IP adresy:",
"LabelAllowedRemoteAddressesMode": "Režim filtru vzdálené IP adresy:",
"LabelAudioCodec": "Audio: {0}",
"LabelAudioCodec": "Audio kodek:",
"LabelAutomaticallyRefreshInternetMetadataEvery": "Automaticky aktualizovat metadata z internetu:",
"LabelBlockContentWithTags": "Blokovat položky s tagy:",
"LabelBurnSubtitles": "Vypálit titulky:",
@ -1369,8 +1369,8 @@
"LabelEnableHardwareDecodingFor": "Povolit hardwarové dekódování pro:",
"LabelHomeNetworkQuality": "Kvalita na domácí síti:",
"LabelInternetQuality": "Kvalita na internetu:",
"LabelKodiMetadataUser": "Uložení dat sledování uživatele do nfo pro:",
"LabelKodiMetadataUserHelp": "Povolte toto nastavení pro uložení dat sledování do souborů NFO pro jiné aplikace, které chcete používat.",
"LabelKodiMetadataUser": "Uložit data sledování uživatele do NFO souboru pro:",
"LabelKodiMetadataUserHelp": "Uložit sledovaná data o přehrávání pro využití dalšími aplikacemi.",
"LabelLanNetworks": "Sítě LAN:",
"LabelLimit": "Limit:",
"LabelMaxStreamingBitrate": "Maximální kvalita streamování:",
@ -1383,7 +1383,7 @@
"LabelSecureConnectionsMode": "Režim zabezpečeného připojení:",
"LabelServerHost": "Host:",
"LabelSimultaneousConnectionLimit": "Limit současně běžících streamů:",
"LabelSkin": "Skin:",
"LabelSkin": "Vzhled:",
"LabelSortBy": "Řadit podle:",
"LabelSortOrder": "Pořadí řazení:",
"LabelSpecialSeasonsDisplayName": "Zobrazovaný název pro zvláštní sezónu:",
@ -1395,14 +1395,14 @@
"LabelTypeText": "Text",
"LabelUrl": "URL:",
"LabelUserAgent": "User agent:",
"LabelUserRemoteClientBitrateLimitHelp": "Toto přepíše výchozí globální hodnotu nastavenou v nastavení přehrávání serveru.",
"LabelUserRemoteClientBitrateLimitHelp": "Přepíše výchozí globální hodnotu nastavenou v nastavení přehrávání serveru.",
"LabelVideo": "Video:",
"LabelVideoCodec": "Video: {0}",
"LeaveBlankToNotSetAPassword": "Volitelné - ponechat prázdné pro nastavení bez hesla",
"LabelVideoCodec": "Video kodek:",
"LeaveBlankToNotSetAPassword": "Můžete ponechat prázdné pro nastavení bez hesla.",
"LetterButtonAbbreviation": "A",
"LinkApi": "API",
"LinksValue": "Odkazy: {0}",
"LiveTV": "Live TV",
"LiveTV": "Živá TV",
"LiveTvFeatureDescription": "Streamujte televizní vysílání do libovolné aplikace Jellyfin s kompatibilním televizním tunerem instalovaným na serveru Jellyfin.",
"Logo": "Logo",
"ManageLibrary": "Spravovat knihovnu",
@ -1411,7 +1411,7 @@
"MediaInfoStreamTypeAudio": "Audio",
"MediaInfoStreamTypeData": "Data",
"MediaInfoStreamTypeVideo": "Video",
"AuthProviderHelp": "Vyberte poskytovatele ověřování, který bude použit k ověření hesla tohoto uživatele",
"AuthProviderHelp": "Vyberte poskytovatele ověřování, který bude použit k ověření hesla tohoto uživatele.",
"HeaderFavoriteMovies": "Oblíbená videa",
"HeaderFavoriteShows": "Oblíbené seriály",
"HeaderFavoriteEpisodes": "Oblíbené epizody",
@ -1420,7 +1420,7 @@
"HeaderFavoriteSongs": "Oblíbená hudba",
"HeaderRestartingServer": "Restartování serveru",
"LabelAuthProvider": "Poskytovatel ověření:",
"LabelServerNameHelp": "Tento název bude použit k identifikaci tohoto serveru. Pokud zůstane prázdné, bude použit název počítače.",
"LabelServerNameHelp": "Tento název bude použit k identifikaci serveru a bude výchozí pro název počítače serveru.",
"LabelPasswordResetProvider": "Poskytovatel obnovy hesla:",
"LabelServerName": "Název serveru:",
"LabelTranscodePath": "Cesta pro překódování:",
@ -1439,16 +1439,16 @@
"MessageNoCollectionsAvailable": "Kolekce vám umožní vychutnat si osobní seskupení filmů, seriálů a hudebních alb. Chcete-li je začít vytvářet, klikněte na tlačítko +.",
"MessagePleaseWait": "Prosím, čekejte. Může to trvat několik minut.",
"Metadata": "Metadata",
"MovieLibraryHelp": "Podívejte se na {0}průvodce pojmenováním filmů Jellyfin{1}.",
"MovieLibraryHelp": "Podívejte se na {0}průvodce pojmenováním filmů{1}.",
"Never": "Nikdy",
"NextUp": "Další",
"NoNewDevicesFound": "Nebyla nalezena žádná nová zařízení. Chcete-li přidat nový tuner, zavřete tento dialog a zadejte informace o zařízení ručně.",
"OnlyImageFormats": "Pouze obrazové formáty (VOBSUB, PGS, SUB/IDX, atd.)",
"OnlyImageFormats": "Pouze obrazové formáty (VOBSUB, PGS, SUB, atd.)",
"Option3D": "3D",
"OptionAlbum": "Album",
"OptionAllowMediaPlaybackTranscodingHelp": "Omezení přístupu k překódování může způsobit selhání přehrávání v aplikacích Jellyfin kvůli nepodporovaným formátům médií.",
"OptionAllowSyncTranscoding": "Povolit stahování a synchronizaci médií, které vyžaduje překódování",
"OptionBluray": "Bluray",
"OptionBluray": "Blu-ray",
"OptionCaptionInfoExSamsung": "CaptionInfoEx (Samsung)",
"OptionDownloadBannerImage": "Banner",
"OptionDownloadBoxImage": "Box",
@ -1456,7 +1456,7 @@
"OptionIsHD": "HD",
"OptionIsSD": "SD",
"OptionLoginAttemptsBeforeLockout": "Určuje, kolik chybných pokusů o přihlášení lze provést před zablokováním.",
"OptionLoginAttemptsBeforeLockoutHelp": "0 znamená zdědění výchozí hodnoty 3 pro non-admin a 5 pro admin, -1 deaktivuje uzamykání",
"OptionLoginAttemptsBeforeLockoutHelp": "0 znamená zdědění výchozí hodnoty 3 pokusů pro běžné uživatele a 5 pro administrátory. Nastavení na -1 deaktivuje funkci.",
"OptionMax": "Max",
"OptionProfileAudio": "Audio",
"OptionProfileVideo": "Video",
@ -1489,14 +1489,14 @@
"Sort": "Třídit",
"StatsForNerds": "Statistiky pro šprty",
"SubtitleAppearanceSettingsAlsoPassedToCastDevices": "Tato nastavení platí také pro jakékoli přehrávání na Chromecastu spuštěné tímto zařízením.",
"SubtitleAppearanceSettingsDisclaimer": "Tato nastavení se nevztahuje na grafické titulky (PGS, DVD atd.) nebo titulky, které mají vlastní vložené styly (ASS / SSA).",
"SubtitleAppearanceSettingsDisclaimer": "Tato nastavení se nevztahuje na grafické titulky (PGS, DVD atd.) nebo ASS/SSA titulky, které mají vlastní vložené styly.",
"SubtitleDownloadersHelp": "Povolte a zařaďte preferované stahovače titulků v pořadí podle priority.",
"SubtitleSettings": "Nastavení titulků",
"SubtitleSettingsIntro": "Chcete-li nastavit výchozí vzhled a jazyk titulků, zastavte přehrávání videa a klepněte na ikonu uživatele v pravé horní části aplikace.",
"TV": "TV",
"TabDirectPlay": "Přímé přehrávání",
"TabInfo": "Info",
"TabLiveTV": "Live TV",
"TabLiveTV": "Živá TV",
"TabMetadata": "Metadata",
"TabPlaylist": "Playlist",
"TabServer": "Server",
@ -1504,10 +1504,10 @@
"ThemeSongs": "Tematická hudba",
"ThemeVideos": "Tematická videa",
"Trailers": "Trailery",
"TvLibraryHelp": "Podívejte se na {0}průvodce pojmenováním TV Jellyfin{1}.",
"TvLibraryHelp": "Podívejte se na {0}průvodce pojmenováním TV pořadů{1}.",
"Uniform": "Uniformní",
"Unplayed": "Nepřehrané",
"UserAgentHelp": "V případě potřeby zadejte vlastní hlavičku user agenta http.",
"UserAgentHelp": "Zadejte vlastní HTTP hlavičku user agenta.",
"ValueMinutes": "{0} min",
"ValueOneAlbum": "1 album",
"ValueOneSong": "1 skladba",
@ -1518,8 +1518,8 @@
"HeaderHome": "Domů",
"DashboardOperatingSystem": "Operační systém: {0}",
"DashboardArchitecture": "Architektura: {0}",
"LaunchWebAppOnStartup": "Spusťte webovou aplikaci Jellyfin ve svém webovém prohlížeči po nastartování Jellyfin serveru",
"LaunchWebAppOnStartupHelp": "Toto otevře se webovou aplikaci ve vašem výchozím webovém prohlížeči, když se spustí server Jellyfin. K tomu nedochází při použití funkce restartování serveru.",
"LaunchWebAppOnStartup": "Spustit webové rozhraní po spustění serveru",
"LaunchWebAppOnStartupHelp": "Otevře se webový klient ve vašem výchozím webovém prohlížeči, když server se spustí. K tomu nedochází při použití funkce restartování serveru.",
"MessageNoServersAvailable": "Pomocí automatického zjišťování nebyly nalezeny žádné servery.",
"OptionBanner": "Banner",
"OptionList": "Seznam",
@ -1532,5 +1532,27 @@
"MusicArtist": "Interpret",
"MusicVideo": "Videoklip",
"SubtitleOffset": "Nastavení titulků",
"TabNetworking": "Vytváření sítí"
"TabNetworking": "Vytváření sítí",
"MusicLibraryHelp": "Prostudujte si {0}průvodce pojmenováním hudby{1}.",
"MoreMediaInfo": "Informace o médiu",
"LabelVideoBitrate": "Datový tok videa:",
"LabelTranscodingProgress": "Průběh překódování:",
"LabelTranscodingFramerate": "Snimková frekvence pro překódování:",
"LabelSize": "Velikost:",
"LabelPleaseRestart": "Změny se projeví až po ručním obnovení webového klienta.",
"LabelPlayMethod": "Způsob přehrání:",
"LabelPlayer": "Přehrávač:",
"LabelFolder": "Složka:",
"LabelBaseUrlHelp": "Zde můžete přidat vlastní podsložku aby bylo možné přistupovat na server z unikátnější adresy.",
"LabelBaseUrl": "Výchozí URL:",
"LabelBitrate": "Datový tok:",
"LabelAudioSampleRate": "Vzorkovací frekvence zvuku:",
"LabelAudioChannels": "Počet kanálů zvuku:",
"LabelAudioBitrate": "Datový tok zvuku:",
"LabelAudioBitDepth": "Bitová hloubka zvuku:",
"HeaderFavoriteBooks": "Oblíbené knihy",
"FetchingData": "Načtení dalších dat",
"CopyStreamURLSuccess": "Úspěšně zkopírovaná URL.",
"CopyStreamURL": "Kopírovat URL adresu streamu",
"ButtonAddImage": "Přidat obrázek"
}

View file

@ -509,5 +509,8 @@
"Writer": "כותב",
"Albums": "אלבומים",
"Artists": "אמנים",
"Books": "ספרים"
"Books": "ספרים",
"Absolute": "מוחלט",
"AccessRestrictedTryAgainLater": "הגישה כרגע מוגבלת. אנא נסה שוב מאוחר יותר.",
"AddedOnValue": "נוסף {0}"
}

View file

@ -710,7 +710,7 @@
"HeaderActivity": "Tevékenység",
"HeaderAdditionalParts": "További részek",
"HeaderAdmin": "Adminisztrátor",
"HeaderAlbumArtists": "Album Előadók",
"HeaderAlbumArtists": "Album előadók",
"HeaderAlert": "Figyelem",
"HeaderAllowMediaDeletionFrom": "Média törlés engedélyezése",
"HeaderApiKey": "API Kulcs",
@ -1300,7 +1300,7 @@
"MessageNoServersAvailable": "Az automatikus kiszolgálókeresés nem talált szervert.",
"OptionLoginAttemptsBeforeLockout": "Meghatározza, hogy hány érvénytelen bejelentkezési kísérlet történhet zárolás előtt.",
"TabNetworking": "Hálózat",
"HeaderFavoriteArtists": "Kedvenc Előadók",
"HeaderFavoriteArtists": "Kedvenc előadók",
"SmallCaps": "Kiskapitális",
"AllowOnTheFlySubtitleExtractionHelp": "A beágyazott feliratokat ki lehet távolítani a videókból és elküldeni a Jellyfin alkalmazásoknak sima szöveg formátumba, hogy ne legyen átkódolás. Néhány eszközön ez hosszú ideig is eltarthat, valamint a videó lejátszás megakadhat az eltávolítási folyamat futása közben. Ezt kikapcsolva a beágyazott feliratok videó átkódolással beégetésre kerülnek azon kliens eszközökre melyek nem támogatják a külső feliratokat.",
"Art": "ClearArt",
@ -1321,10 +1321,10 @@
"HeaderContinueListening": "Folyamatban lévő zenék",
"HeaderDeleteTaskTrigger": "Feladatvezérlő törlése",
"HeaderFavoriteMovies": "Kedvenc Filmek",
"HeaderFavoriteShows": "Kedvenc Sorozatok",
"HeaderFavoriteEpisodes": "Kedvenc Epizódok",
"HeaderFavoriteAlbums": "Kedvenc Albumok",
"HeaderFavoriteSongs": "Kedvenc Dalok",
"HeaderFavoriteShows": "Kedvenc sorozatok",
"HeaderFavoriteEpisodes": "Kedvenc epizódok",
"HeaderFavoriteAlbums": "Kedvenc albumok",
"HeaderFavoriteSongs": "Kedvenc dalok",
"HeaderFavoriteVideos": "Kedvenc Videók",
"HeaderGuideProviders": "TV műsorújság Szolgáltatók",
"HeaderHome": "Kezdőlap",

View file

@ -1327,5 +1327,6 @@
"LabelProfileVideoCodecs": "Video codecs:",
"LabelProtocolInfo": "Protocol info:",
"LabelServerName": "Server naam:",
"LabelSkin": "Skin:"
"LabelSkin": "Skin:",
"ButtonAddImage": "Voeg afbeelding toe"
}

View file

@ -439,5 +439,121 @@
"EnableNextVideoInfoOverlay": "Oynatma sırasında bir sonraki video bilgisini göster",
"EnablePhotosHelp": "Görüntüler diğer medya dosyalarıyla birlikte algılanacak ve gösterilecektir.",
"EnableCinemaMode": "Sinema Modu",
"EnableColorCodedBackgrounds": "Renk kodlu arka planlar"
"EnableColorCodedBackgrounds": "Renk kodlu arka planlar",
"HeaderGuideProviders": "TV Rehberi Veri Sağlayıcıları",
"HeaderGenres": "Türler",
"HeaderForgotPassword": "Parolanızı mı unuttunuz",
"HeaderForKids": "Çocuklar için",
"HeaderFetcherSettings": "Alıcı Ayarları",
"HeaderFetchImages": "Görüntüleri Getir:",
"HeaderFeatures": "Özellikleri",
"HeaderFeatureAccess": "Özellik Erişimi",
"HeaderFavoriteVideos": "Favori Videolar",
"HeaderFavoriteMovies": "Favori Filmler",
"HeaderFavoriteBooks": "favori kitaplar",
"HeaderExternalIds": "Dış kimlikler:",
"HeaderError": "Hata",
"HeaderEpisodes": "Bölümler",
"HeaderEnabledFieldsHelp": "Kilitlemek ve verilerinin değişmesini önlemek için bir alanın işaretini kaldırın.",
"HeaderEnabledFields": "Etkin Alanlar",
"HeaderEditImages": "Görüntüleri Düzenle",
"HeaderDownloadSync": "İndir ve Eşitle",
"HeaderDisplay": "Görüntüle",
"HeaderDirectPlayProfileHelp": "Aygıtın yerel olarak hangi biçimlerde kullanılabileceğini göstermek için doğrudan oynatma profilleri ekleyin.",
"HeaderDirectPlayProfile": "Doğrudan Oyun Profili",
"HeaderDevices": "Cihazlar",
"HeaderDeveloperInfo": "Geliştirici Bilgisi",
"HeaderDetectMyDevices": "Cihazlarımı Algıla",
"HeaderDeleteTaskTrigger": "Görev Tetikleyicisini Sil",
"HeaderDeleteProvider": "Sağlayıcıyı Sil",
"HeaderDeleteItems": "Ürünleri sil",
"HeaderDeleteItem": "Öğeyi sil",
"HeaderDeleteDevice": "Cihazı Sil",
"HeaderDefaultRecordingSettings": "Varsayılan Kayıt Ayarları",
"HeaderDateIssued": ıkış Tarihi",
"HeaderContinueListening": "Dinlemeye Devam Et",
"HeaderContainerProfileHelp": "Konteyner profilleri, belirli formatları oynatırken cihazın sınırlamalarını gösterir. Bir sınırlama uygulanırsa, format doğrudan oynatma için yapılandırılmış olsa bile ortam kodlanır.",
"HeaderContainerProfile": "Konteyner Profili",
"HeaderConnectionFailure": "Bağlantı hatası",
"HeaderConnectToServer": "Sunucuya bağlan",
"HeaderConfirmRevokeApiKey": "API Anahtarını İptal Et",
"HeaderConfirmProfileDeletion": "Profil Silme İşlemini Onayla",
"HeaderConfirmPluginInstallation": "Eklenti Yüklemesini Onayla",
"HeaderConfigureRemoteAccess": "Uzaktan Erişimi Yapılandırma",
"HeaderCodecProfileHelp": "Codec profilleri, belirli kodlayıcıları oynatırken cihazın sınırlamalarını gösterir. Eğer bir sınırlama uygulanırsa, kodeğin doğrudan oynaması için yapılandırılmış olsa bile, ortam kodlanır.",
"HeaderChapterImages": "Bölüm Görüntüleri",
"HeaderChannelAccess": "Kanal erişimi",
"HeaderCastCrew": "Kast ekibi",
"HeaderCastAndCrew": "Kast ekibi",
"HeaderCancelSeries": "Serileri İptal Et",
"HeaderCancelRecording": "Kaydı İptal Et",
"HeaderBranding": "dağlama",
"HeaderBooks": "Kitaplar",
"HeaderBlockItemsWithNoRating": "Tanınmayan veya bilinmeyen derecelendirme bilgisine sahip öğeleri engelle:",
"HeaderAudioSettings": "Ses ayarları",
"HeaderAudioBooks": "Sesli Kitaplar",
"HeaderAppearsOn": "Görünür",
"HeaderApp": "Uygulama",
"HeaderApiKeysHelp": "Jellyfin Server ile iletişim kurabilmek için harici uygulamaların bir API anahtarına sahip olmaları gerekir. Anahtarlar bir Jellyfin hesabıyla giriş yaparak veya uygulamaya manuel olarak bir anahtar vererek verilir.",
"HeaderApiKeys": "API Anahtarları",
"HeaderApiKey": "API Anahtarı",
"HeaderAllowMediaDeletionFrom": "Medyadan Silinmeye İzin Ver",
"HeaderAlert": "Alarm",
"HeaderAlbums": "Albümler",
"HeaderAdmin": "Yönetici",
"HeaderAdditionalParts": "İlave parçalar",
"HeaderAddUpdateImage": "Resim Ekle / Güncelle",
"HeaderAddToPlaylist": "Oynatma listesine ekle",
"HeaderAddToCollection": "Koleksiyona ekle",
"HeaderAddScheduledTaskTrigger": "Tetikleyici ekle",
"HeaderActivity": "Aktivite",
"HeaderActiveDevices": "Aktif Cihazlar",
"HeaderAccessScheduleHelp": "Belirli saatlerle erişimi sınırlamak için bir erişim programı oluşturun.",
"HeaderAccessSchedule": "Erişim Takvimi",
"HardwareAccelerationWarning": "Donanım ivmesini etkinleştirmek bazı ortamlarda dengesizliğe neden olabilir. İşletim sisteminizin ve video sürücülerinizin tamamen güncel olduğundan emin olun. Bunu etkinleştirdikten sonra video oynatmakta zorluk çekiyorsanız, ayarı tekrar Auto (Otomatik) olarak değiştirmeniz gerekecektir.",
"HandledByProxy": "Ters proxy tarafından kullanılır",
"HDPrograms": "HD programlar",
"H264EncodingPresetHelp": "Performansı artırmak için daha hızlı bir değer veya kaliteyi artırmak için daha yavaş bir değer seçin.",
"H264CrfHelp": "Sabit Hız Faktörü (CRF), x264 kodlayıcı için varsayılan kalite ayarıdır. Değerleri 0 ile 51 arasında ayarlayabilirsiniz, burada daha düşük değerler daha iyi kaliteyle sonuçlanır (daha yüksek dosya boyutları pahasına). Aklı başında değerleri 18 ila 28 arasındadır. X264 için varsayılan 23, bu nedenle bunu başlangıç noktası olarak kullanabilirsiniz.",
"GuideProviderSelectListings": "İlan Seç",
"GuideProviderLogin": "Oturum aç",
"Guide": "Rehber",
"GuestStar": "Konuk sanatçı",
"GroupVersions": "Grup versiyonları",
"GroupBySeries": "Seriye göre gruplandır",
"GenresValue": "Türler: {0}",
"GenreValue": "Tür: {0}",
"General": "Genel",
"Fullscreen": "Tam ekran",
"FormatValue": "Biçim: {0}",
"FolderTypeUnset": "Karışık içerik",
"Filters": "Filtreler",
"File": "Dosya",
"FetchingData": "Ek veri alınıyor",
"Features": "Özellikleri",
"Favorite": "Favori",
"FastForward": "İleri sar",
"FFmpegSavePathNotFound": "Girdiğiniz yolu kullanarak FFmpeg'i bulamıyoruz. FFprobe da gereklidir ve aynı klasörde bulunmalıdır. Bu bileşenler normalde aynı indirmede birlikte paketlenmiştir. Lütfen yolu kontrol edip tekrar deneyin.",
"Extras": "Ekstralar",
"ExtractChapterImagesHelp": "Bölüm görüntülerini çıkarmak, müşterilerin grafiksel sahne seçim menülerini görüntülemesini sağlar. İşlem yavaş olabilir, kaynak yoğun olabilir ve birkaç gigabaytlık alan gerektirebilir. Videolar keşfedildiğinde ve ayrıca zamanlanmış bir görev olarak çalışır. Zamanlanmış, zamanlanmış görevler alanında yapılandırılabilir. Bu görevi yoğun kullanım saatlerinde yapmanız önerilmez.",
"ExtraLarge": "Ekstra büyük",
"ExitFullscreen": "Tam ekrandan çık",
"EveryNDays": "Her {0} günde",
"ErrorSavingTvProvider": "TV sağlayıcısını kaydederken bir hata oluştu. Lütfen erişilebilir olduğundan emin olun ve tekrar deneyin.",
"ErrorPleaseSelectLineup": "Lütfen bir grup seçin ve tekrar deneyin. Hiç bir sıralama yoksa, lütfen kullanıcı adınızın, şifrenizin ve posta kodunuzun doğru olup olmadığını kontrol edin.",
"ErrorMessageStartHourGreaterThanEnd": "Bitiş saati, başlangıç saatinden büyük olmalıdır.",
"ErrorGettingTvLineups": "TV dizilimini indirirken bir hata oluştu. Lütfen bilgilerinizin doğru olduğundan emin olun ve tekrar deneyin.",
"ErrorDeletingItem": "Öğe Jellyfin Sunucusundan silinirken bir hata oluştu. Lütfen Jellyfin Server'ın medya klasörüne yazma erişimi olup olmadığını kontrol edin ve tekrar deneyin.",
"ErrorAddingXmlTvFile": "XmlTV dosyasına erişilirken bir hata oluştu. Lütfen dosyanın var olduğundan emin olun ve tekrar deneyin.",
"ErrorAddingTunerDevice": "Tuner cihazı eklenirken bir hata oluştu. Lütfen erişilebilir olduğundan emin olun ve tekrar deneyin.",
"ErrorAddingMediaPathToVirtualFolder": "Medya yolu eklenirken bir hata oluştu. Lütfen yolun geçerli olduğundan ve Jellyfin Server işleminin o konuma erişebildiğinden emin olun.",
"ErrorAddingListingsToSchedulesDirect": "Dizilişi Schedules Direct hesabınıza eklerken bir hata oluştu. Schedules Direct, hesap başına yalnızca sınırlı sayıda kadroya izin verir. Devam etmeden önce Schedules Direct web sitesine giriş yapmanız ve başka girişleri hesabınızdan kaldırmanız gerekebilir.",
"Episodes": "Bölümler",
"EndsAtValue": "{0} konumundaki biter",
"EnableThemeVideosHelp": "Kitaplığa göz atarken tema videoları arka planda oynatın.",
"EnableThemeVideos": "Tema videoları",
"EnableThemeSongsHelp": "Kitaplığa göz atarken tema şarkıları arka planda çalın.",
"EnableThemeSongs": "Tema şarkıları",
"EnableStreamLoopingHelp": "Canlı akışlar yalnızca birkaç saniye veri içeriyorsa ve sürekli istenmesi gerekiyorsa bunu etkinleştirin. Gerekmediğinde bunu etkinleştirmek sorunlara neden olabilir.",
"EnableStreamLooping": "Otomatik döngü canlı akışları"
}

View file

@ -1,5 +1,13 @@
const path = require("path");
const { CleanWebpackPlugin} = require("clean-webpack-plugin");
const CopyPlugin = require("copy-webpack-plugin");
const Assets = [
"alameda/alameda.js",
"requirejs/require.js",
"libass-wasm/dist/subtitles-octopus-worker.js",
"libass-wasm/dist/subtitles-octopus-worker.data",
"libass-wasm/dist/subtitles-octopus-worker.wasm"
];
module.exports = {
context: path.resolve(__dirname, "src"),
@ -10,15 +18,18 @@ module.exports = {
]
},
plugins: [
new CopyPlugin([
{
from: "**/*",
to: "."
},
{
context: path.resolve(__dirname),
from: "node_modules/libass-wasm/dist/subtitles-octopus-worker.*",
}
])
new CleanWebpackPlugin(),
new CopyPlugin([{
from: "**/*",
to: "."
}]),
new CopyPlugin(
Assets.map(asset => {
return {
from: path.resolve(__dirname, `./node_modules/${asset}`),
to: path.resolve(__dirname, './dist/libraries')
};
})
)
]
};