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 - future
- feature - feature
- enhancement - enhancement
- confirmed
# Label to use when marking an issue as stale # Label to use when marking an issue as stale
staleLabel: stale staleLabel: stale
# Comment to post when marking an issue as stale. Set to `false` to disable # 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", "repository": "https://github.com/jellyfin/jellyfin-web",
"license": "GPL-2.0-or-later", "license": "GPL-2.0-or-later",
"devDependencies": { "devDependencies": {
"clean-webpack-plugin": "^3.0.0",
"copy-webpack-plugin": "^5.0.3", "copy-webpack-plugin": "^5.0.3",
"css-loader": "^2.1.0", "css-loader": "^2.1.0",
"eslint": "^5.16.0", "eslint": "^5.16.0",
@ -16,12 +17,14 @@
"webpack-merge": "^4.2.2" "webpack-merge": "^4.2.2"
}, },
"dependencies": { "dependencies": {
"alameda": "^1.3.0",
"flv.js": "^1.5.0", "flv.js": "^1.5.0",
"hls.js": "^0.12.4", "hls.js": "^0.12.4",
"howler": "^2.1.2", "howler": "^2.1.2",
"jquery": "^3.4.1", "jquery": "^3.4.1",
"jstree": "^3.3.7", "jstree": "^3.3.7",
"libjass": "^0.11.0", "libjass": "^0.11.0",
"requirejs": "^2.3.5",
"shaka-player": "^2.5.5", "shaka-player": "^2.5.5",
"sortablejs": "^1.9.0", "sortablejs": "^1.9.0",
"swiper": "^3.4.2", "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); 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) { function getTabPanel(tabs, index) {
return null; return null;
@ -87,10 +70,6 @@ define(['dom', 'scroller', 'browser', 'layoutManager', 'focusManager', 'register
function onClick(e) { function onClick(e) {
if (this.focusTimeout) {
clearTimeout(this.focusTimeout);
}
var tabs = this; var tabs = this;
var current = tabs.querySelector('.' + activeButtonClass); var current = tabs.querySelector('.' + activeButtonClass);
@ -177,10 +156,6 @@ define(['dom', 'scroller', 'browser', 'layoutManager', 'focusManager', 'register
dom.addEventListener(this, 'click', onClick, { dom.addEventListener(this, 'click', onClick, {
passive: true passive: true
}); });
dom.addEventListener(this, 'focus', onFocus, {
passive: true,
capture: true
});
}; };
EmbyTabs.focus = function () { EmbyTabs.focus = function () {
@ -237,10 +212,6 @@ define(['dom', 'scroller', 'browser', 'layoutManager', 'focusManager', 'register
dom.removeEventListener(this, 'click', onClick, { dom.removeEventListener(this, 'click', onClick, {
passive: true passive: true
}); });
dom.removeEventListener(this, 'focus', onFocus, {
passive: true,
capture: true
});
}; };
function getSelectedTabButton(elem) { function getSelectedTabButton(elem) {

View file

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

View file

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

View file

@ -5,8 +5,8 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa
require(["alert"], function (alert) { require(["alert"], function (alert) {
var title; var title;
var text = []; var text = [];
var displayPlayMethod = playMethodHelper.getDisplayPlayMethod(session); var displayPlayMethod = playMethodHelper.getDisplayPlayMethod(session);
if (displayPlayMethod === "DirectStream") { if (displayPlayMethod === "DirectStream") {
title = globalize.translate("DirectStreaming"); title = globalize.translate("DirectStreaming");
text.push(globalize.translate("DirectStreamHelp1")); text.push(globalize.translate("DirectStreamHelp1"));
@ -15,6 +15,7 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa
} else if (displayPlayMethod === "Transcode") { } else if (displayPlayMethod === "Transcode") {
title = globalize.translate("Transcoding"); title = globalize.translate("Transcoding");
text.push(globalize.translate("MediaIsBeingConverted")); text.push(globalize.translate("MediaIsBeingConverted"));
if (session.TranscodingInfo && session.TranscodingInfo.TranscodeReasons && session.TranscodingInfo.TranscodeReasons.length) { if (session.TranscodingInfo && session.TranscodingInfo.TranscodeReasons && session.TranscodingInfo.TranscodeReasons.length) {
text.push("<br/>"); text.push("<br/>");
text.push(globalize.translate("LabelReasonForTranscoding")); text.push(globalize.translate("LabelReasonForTranscoding"));
@ -23,6 +24,7 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa
}); });
} }
} }
alert({ alert({
text: text.join("<br/>"), text: text.join("<br/>"),
title: title title: title
@ -73,6 +75,7 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa
case "sendmessage": case "sendmessage":
showSendMessageForm(btn, session); showSendMessageForm(btn, session);
break; break;
case "transcodinginfo": case "transcodinginfo":
showPlaybackInfo(btn, session); showPlaybackInfo(btn, session);
} }
@ -124,6 +127,7 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa
list.push(session); list.push(session);
} }
} }
return list; return list;
} }
@ -139,7 +143,7 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa
if (!result.Items.length) { if (!result.Items.length) {
view.querySelector(".activeRecordingsSection").classList.add("hide"); view.querySelector(".activeRecordingsSection").classList.add("hide");
return void (itemsContainer.innerHTML = ""); return void(itemsContainer.innerHTML = "");
} }
view.querySelector(".activeRecordingsSection").classList.remove("hide"); view.querySelector(".activeRecordingsSection").classList.remove("hide");
@ -165,13 +169,13 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa
function reloadSystemInfo(view, apiClient) { function reloadSystemInfo(view, apiClient) {
apiClient.getSystemInfo().then(function (systemInfo) { apiClient.getSystemInfo().then(function (systemInfo) {
view.querySelector("#serverName").innerHTML = globalize.translate("DashboardServerName", systemInfo.ServerName); view.querySelector("#serverName").innerHTML = globalize.translate("DashboardServerName", systemInfo.ServerName);
var localizedVersion = globalize.translate("DashboardVersionNumber", systemInfo.Version); var localizedVersion = globalize.translate("DashboardVersionNumber", systemInfo.Version);
if (systemInfo.SystemUpdateLevel !== "Release") { if (systemInfo.SystemUpdateLevel !== "Release") {
localizedVersion += " " + systemInfo.SystemUpdateLevel; localizedVersion += " " + systemInfo.SystemUpdateLevel;
} }
view.querySelector("#versionNumber").innerHTML = localizedVersion;
view.querySelector("#versionNumber").innerHTML = localizedVersion;
view.querySelector("#operatingSystem").innerHTML = globalize.translate("DashboardOperatingSystem", systemInfo.OperatingSystem); view.querySelector("#operatingSystem").innerHTML = globalize.translate("DashboardOperatingSystem", systemInfo.OperatingSystem);
view.querySelector("#architecture").innerHTML = globalize.translate("DashboardArchitecture", systemInfo.SystemArchitecture); view.querySelector("#architecture").innerHTML = globalize.translate("DashboardArchitecture", systemInfo.SystemArchitecture);
@ -226,14 +230,13 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa
} else { } else {
var nowPlayingItem = session.NowPlayingItem; var nowPlayingItem = session.NowPlayingItem;
var className = "scalableCard card activeSession backdropCard backdropCard-scalable"; var className = "scalableCard card activeSession backdropCard backdropCard-scalable";
html += '<div class="' + className + '" id="' + rowId + '">'; html += '<div class="' + className + '" id="' + rowId + '">';
html += '<div class="cardBox visualCardBox">'; html += '<div class="cardBox visualCardBox">';
html += '<div class="cardScalable visualCardBox-cardScalable">'; html += '<div class="cardScalable visualCardBox-cardScalable">';
html += '<div class="cardPadder cardPadder-backdrop"></div>'; html += '<div class="cardPadder cardPadder-backdrop"></div>';
html += '<div class="cardContent">'; html += '<div class="cardContent">';
var imgUrl = DashboardPage.getNowPlayingImageUrl(nowPlayingItem); var imgUrl = DashboardPage.getNowPlayingImageUrl(nowPlayingItem);
if (imgUrl) { if (imgUrl) {
html += '<div class="sessionNowPlayingContent sessionNowPlayingContent-withbackground"'; html += '<div class="sessionNowPlayingContent sessionNowPlayingContent-withbackground"';
html += ' data-src="' + imgUrl + '" style="display:inline-block;background-image:url(\'' + imgUrl + "');\"></div>"; 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="sessionNowPlayingInnerContent">';
html += '<div class="sessionAppInfo">'; html += '<div class="sessionAppInfo">';
var clientImage = DashboardPage.getClientImage(session); var clientImage = DashboardPage.getClientImage(session);
if (clientImage) { if (clientImage) {
html += clientImage; html += clientImage;
} }
@ -261,28 +264,36 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa
html += '<div class="sessionTranscodingFramerate"></div>'; html += '<div class="sessionTranscodingFramerate"></div>';
} }
html += '<div class="sessionNowPlayingDetails">' html += '<div class="sessionNowPlayingDetails">';
var nowPlayingName = DashboardPage.getNowPlayingName(session); var nowPlayingName = DashboardPage.getNowPlayingName(session);
html += '<div class="sessionNowPlayingInfo" data-imgsrc="' + nowPlayingName.image + '">'; html += '<div class="sessionNowPlayingInfo" data-imgsrc="' + nowPlayingName.image + '">';
html += nowPlayingName.html; html += nowPlayingName.html;
html += "</div>"; html += "</div>";
html += '<div class="sessionNowPlayingTime">' + DashboardPage.getSessionNowPlayingTime(session) + "</div>"; html += '<div class="sessionNowPlayingTime">' + DashboardPage.getSessionNowPlayingTime(session) + "</div>";
html += '</div>' html += '</div>';
if (nowPlayingItem && nowPlayingItem.RunTimeTicks) { if (nowPlayingItem && nowPlayingItem.RunTimeTicks) {
var percent = 100 * (session.PlayState.PositionTicks || 0) / nowPlayingItem.RunTimeTicks; var percent = 100 * (session.PlayState.PositionTicks || 0) / nowPlayingItem.RunTimeTicks;
html += indicators.getProgressHtml(percent, { containerClass: "playbackProgress" }); html += indicators.getProgressHtml(percent, {
containerClass: "playbackProgress"
});
} else { } else {
// need to leave the element in just in case the device starts playback // 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) { if (session.TranscodingInfo && session.TranscodingInfo.CompletionPercentage) {
var percent = session.TranscodingInfo.CompletionPercentage.toFixed(1); var percent = session.TranscodingInfo.CompletionPercentage.toFixed(1);
html += indicators.getProgressHtml(percent, { containerClass: "transcodingProgress" }); html += indicators.getProgressHtml(percent, {
containerClass: "transcodingProgress"
});
} else { } else {
// same issue as playbackProgress element above // same issue as playbackProgress element above
html += indicators.getProgressHtml(0, { containerClass: "transcodingProgress hide" }); html += indicators.getProgressHtml(0, {
containerClass: "transcodingProgress hide"
});
} }
html += "</div>"; html += "</div>";
@ -317,6 +328,7 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa
parentElement.insertAdjacentHTML("beforeend", html); parentElement.insertAdjacentHTML("beforeend", html);
var deadSessionElem = parentElement.querySelector(".deadSession"); var deadSessionElem = parentElement.querySelector(".deadSession");
if (deadSessionElem) { if (deadSessionElem) {
deadSessionElem.parentNode.removeChild(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++) { for (var i = 0, length = tasks.length; i < length; i++) {
var task = tasks[i]; var task = tasks[i];
html += "<p>"; html += "<p>";
html += task.Name + "<br/>"; html += task.Name + "<br/>";
if (task.State === "Running") { if (task.State === "Running") {
var progress = (task.CurrentProgressPercentage || 0).toFixed(1); var progress = (task.CurrentProgressPercentage || 0).toFixed(1);
html += '<progress max="100" value="' + progress + '" title="' + progress + '%">'; html += '<progress max="100" value="' + progress + '" title="' + progress + '%">';
@ -373,19 +385,24 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa
var html = ""; var html = "";
var showTranscodingInfo = false; var showTranscodingInfo = false;
var displayPlayMethod = playMethodHelper.getDisplayPlayMethod(session); var displayPlayMethod = playMethodHelper.getDisplayPlayMethod(session);
if (displayPlayMethod === "DirectStream") { if (displayPlayMethod === "DirectStream") {
html += globalize.translate("DirectStreaming"); html += globalize.translate("DirectStreaming");
} else if (displayPlayMethod === "Transcode") { } else if (displayPlayMethod === "Transcode") {
html += globalize.translate("Transcoding"); html += globalize.translate("Transcoding");
if (session.TranscodingInfo && session.TranscodingInfo.Framerate) { if (session.TranscodingInfo && session.TranscodingInfo.Framerate) {
html += " (" + session.TranscodingInfo.Framerate + " fps)"; html += " (" + session.TranscodingInfo.Framerate + " fps)";
} }
showTranscodingInfo = true; showTranscodingInfo = true;
} else if (displayPlayMethod === "DirectPlay") { } else if (displayPlayMethod === "DirectPlay") {
html += globalize.translate("DirectPlaying"); html += globalize.translate("DirectPlaying");
} }
if (showTranscodingInfo) { if (showTranscodingInfo) {
var line = []; var line = [];
if (session.TranscodingInfo) { if (session.TranscodingInfo) {
if (session.TranscodingInfo.Bitrate) { if (session.TranscodingInfo.Bitrate) {
if (session.TranscodingInfo.Bitrate > 1e6) { if (session.TranscodingInfo.Bitrate > 1e6) {
@ -493,6 +510,7 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa
}, },
getUsersHtml: function (session) { getUsersHtml: function (session) {
var html = []; var html = [];
if (session.UserId) { if (session.UserId) {
html.push(session.UserName); html.push(session.UserName);
} }
@ -516,8 +534,8 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa
}, },
updateSession: function (row, session) { updateSession: function (row, session) {
row.classList.remove("deadSession"); row.classList.remove("deadSession");
var nowPlayingItem = session.NowPlayingItem; var nowPlayingItem = session.NowPlayingItem;
if (nowPlayingItem) { if (nowPlayingItem) {
row.classList.add("playingSession"); row.classList.add("playingSession");
} else { } else {
@ -537,6 +555,7 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa
} }
var btnSessionPlayPause = row.querySelector(".btnSessionPlayPause"); var btnSessionPlayPause = row.querySelector(".btnSessionPlayPause");
if (session.ServerId && nowPlayingItem && session.SupportsRemoteControl && session.DeviceId !== connectionManager.deviceId()) { if (session.ServerId && nowPlayingItem && session.SupportsRemoteControl && session.DeviceId !== connectionManager.deviceId()) {
btnSessionPlayPause.classList.remove("hide"); btnSessionPlayPause.classList.remove("hide");
row.querySelector(".btnSessionStop").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"); var playbackProgressElem = row.querySelector(".playbackProgress");
if (nowPlayingItem && nowPlayingItem.RunTimeTicks) { if (nowPlayingItem && nowPlayingItem.RunTimeTicks) {
var percent = 100 * (session.PlayState.PositionTicks || 0) / 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 { } else {
playbackProgressElem.outerHTML = indicators.getProgressHtml(0, { containerClass: "playbackProgress hide" }); playbackProgressElem.outerHTML = indicators.getProgressHtml(0, {
containerClass: "playbackProgress hide"
});
} }
var transcodingProgress = row.querySelector(".transcodingProgress"); var transcodingProgress = row.querySelector(".transcodingProgress");
if (session.TranscodingInfo && session.TranscodingInfo.CompletionPercentage) { if (session.TranscodingInfo && session.TranscodingInfo.CompletionPercentage) {
var percent = session.TranscodingInfo.CompletionPercentage.toFixed(1); var percent = session.TranscodingInfo.CompletionPercentage.toFixed(1);
transcodingProgress.outerHTML = indicators.getProgressHtml(percent, { containerClass: "transcodingProgress" }); transcodingProgress.outerHTML = indicators.getProgressHtml(percent, {
containerClass: "transcodingProgress"
});
} else { } else {
transcodingProgress.outerHTML = indicators.getProgressHtml(0, { containerClass: "transcodingProgress hide" }); transcodingProgress.outerHTML = indicators.getProgressHtml(0, {
containerClass: "transcodingProgress hide"
});
} }
var imgUrl = DashboardPage.getNowPlayingImageUrl(nowPlayingItem) || ""; var imgUrl = DashboardPage.getNowPlayingImageUrl(nowPlayingItem) || "";
@ -815,10 +844,13 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa
view.addEventListener("viewdestroy", function () { view.addEventListener("viewdestroy", function () {
var page = this; var page = this;
var userActivityLog = page.userActivityLog; var userActivityLog = page.userActivityLog;
if (userActivityLog) { if (userActivityLog) {
userActivityLog.destroy(); userActivityLog.destroy();
} }
var serverActivityLog = page.serverActivityLog; var serverActivityLog = page.serverActivityLog;
if (serverActivityLog) { if (serverActivityLog) {
serverActivityLog.destroy(); 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"; "use strict";
function load(page, device, deviceOptions) { 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() { function loadData() {
var page = this; var page = this;
loading.show(); loading.show();
var id = getParameterByName("id"), var id = getParameterByName("id");
promise1 = ApiClient.getJSON(ApiClient.getUrl("Devices/Info", { var promise1 = ApiClient.getJSON(ApiClient.getUrl("Devices/Info", {
Id: id
})),
promise2 = ApiClient.getJSON(ApiClient.getUrl("Devices/Options", {
Id: id Id: id
})); }));
Promise.all([promise1, promise2]).then(function(responses) { var promise2 = ApiClient.getJSON(ApiClient.getUrl("Devices/Options", {
load(page, responses[0], responses[1]), loading.hide() Id: id
}) }));
Promise.all([promise1, promise2]).then(function (responses) {
load(page, responses[0], responses[1]);
loading.hide();
});
} }
function save(page) { function save(page) {
@ -31,14 +33,18 @@ define(["loading", "libraryMenu", "dom", "emby-input", "emby-button"], function(
CustomName: page.querySelector("#txtCustomName").value CustomName: page.querySelector("#txtCustomName").value
}), }),
contentType: "application/json" contentType: "application/json"
}).then(Dashboard.processServerConfigurationUpdateResult) }).then(Dashboard.processServerConfigurationUpdateResult);
} }
function onSubmit(e) { function onSubmit(e) {
var form = this; var form = this;
return save(dom.parentWithClass(form, "page")), e.preventDefault(), !1 save(dom.parentWithClass(form, "page"));
} e.preventDefault();
return function(view, params) { return false;
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"; "use strict";
function canDelete(deviceId) { function canDelete(deviceId) {
return deviceId !== ApiClient.deviceId() return deviceId !== ApiClient.deviceId();
} }
function deleteDevice(page, id) { function deleteDevice(page, id) {
var msg = globalize.translate("DeleteDeviceConfirmation"); var msg = globalize.translate("DeleteDeviceConfirmation");
require(["confirm"], function(confirm) {
require(["confirm"], function (confirm) {
confirm({ confirm({
text: msg, text: msg,
title: globalize.translate("HeaderDeleteDevice"), title: globalize.translate("HeaderDeleteDevice"),
confirmText: globalize.translate("ButtonDelete"), confirmText: globalize.translate("ButtonDelete"),
primary: "delete" primary: "delete"
}).then(function() { }).then(function () {
loading.show(), ApiClient.ajax({ loading.show();
ApiClient.ajax({
type: "DELETE", type: "DELETE",
url: ApiClient.getUrl("Devices", { url: ApiClient.getUrl("Devices", {
Id: id Id: id
}) })
}).then(function() { }).then(function () {
loadData(page) loadData(page);
}) });
}) });
}) });
} }
function showDeviceMenu(view, btn, deviceId) { function showDeviceMenu(view, btn, deviceId) {
var menuItems = []; var menuItems = [];
canEdit && menuItems.push({
if (canEdit) {
menuItems.push({
name: globalize.translate("Edit"), name: globalize.translate("Edit"),
id: "open", id: "open",
ironIcon: "mode-edit" ironIcon: "mode-edit"
}), canDelete(deviceId) && menuItems.push({ });
}
if (canDelete(deviceId)) {
menuItems.push({
name: globalize.translate("Delete"), name: globalize.translate("Delete"),
id: "delete", id: "delete",
ironIcon: "delete" ironIcon: "delete"
}), require(["actionsheet"], function(actionsheet) { });
}
require(["actionsheet"], function (actionsheet) {
actionsheet.show({ actionsheet.show({
items: menuItems, items: menuItems,
positionTo: btn, positionTo: btn,
callback: function(id) { callback: function (id) {
switch (id) { switch (id) {
case "open": case "open":
Dashboard.navigate("device.html?id=" + deviceId); Dashboard.navigate("device.html?id=" + deviceId);
break; break;
case "delete": case "delete":
deleteDevice(view, deviceId) deleteDevice(view, deviceId);
} }
} }
}) });
}) });
} }
function load(page, devices) { function load(page, devices) {
var html = ""; var html = "";
html += devices.map(function(device) { html += devices.map(function (device) {
var deviceHtml = ""; var deviceHtml = "";
deviceHtml += "<div data-id='" + device.Id + "' class='card backdropCard'>"; deviceHtml += "<div data-id='" + device.Id + "' class='card backdropCard'>";
deviceHtml += '<div class="cardBox visualCardBox">'; 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 += '<div class="cardPadder cardPadder-backdrop"></div>';
deviceHtml += '<a is="emby-linkbutton" href="' + (canEdit ? "device.html?id=" + device.Id : "#") + '" class="cardContent cardImageContainer">'; deviceHtml += '<a is="emby-linkbutton" href="' + (canEdit ? "device.html?id=" + device.Id : "#") + '" class="cardContent cardImageContainer">';
var iconUrl = imageHelper.getDeviceIcon(device.Name); var iconUrl = imageHelper.getDeviceIcon(device.Name);
if (iconUrl) { if (iconUrl) {
deviceHtml += '<div class="cardImage" style="background-image:url(\'' + iconUrl + "');background-size: auto 64%;background-position:center center;\">"; deviceHtml += '<div class="cardImage" style="background-image:url(\'' + iconUrl + "');background-size: auto 64%;background-position:center center;\">";
deviceHtml += "</div>"; deviceHtml += "</div>";
} else { } else {
deviceHtml += '<i class="cardImageIcon md-icon">tablet_android</i>'; deviceHtml += '<i class="cardImageIcon md-icon">tablet_android</i>';
} }
deviceHtml += "</a>"; deviceHtml += "</a>";
deviceHtml += "</div>"; deviceHtml += "</div>";
deviceHtml += '<div class="cardFooter">'; deviceHtml += '<div class="cardFooter">';
if (canEdit || canDelete(device.Id)) { if (canEdit || canDelete(device.Id)) {
deviceHtml += '<div style="text-align:right; float:right;padding-top:5px;">'; 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 += '<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>";
} }
deviceHtml += "<div class='cardText'>"; deviceHtml += "<div class='cardText'>";
deviceHtml += device.Name; deviceHtml += device.Name;
deviceHtml += "</div>"; deviceHtml += "</div>";
@ -84,10 +100,12 @@ define(["loading", "dom", "libraryMenu", "globalize", "scripts/imagehelper", "hu
deviceHtml += device.AppName + " " + device.AppVersion; deviceHtml += device.AppName + " " + device.AppVersion;
deviceHtml += "</div>"; deviceHtml += "</div>";
deviceHtml += "<div class='cardText cardText-secondary'>"; deviceHtml += "<div class='cardText cardText-secondary'>";
if (device.LastUserName) { if (device.LastUserName) {
deviceHtml += device.LastUserName; deviceHtml += device.LastUserName;
deviceHtml += ", " + humaneDate(device.DateLastActivity); deviceHtml += ", " + humaneDate(device.DateLastActivity);
} }
deviceHtml += "&nbsp;"; deviceHtml += "&nbsp;";
deviceHtml += "</div>"; deviceHtml += "</div>";
deviceHtml += "</div>"; deviceHtml += "</div>";
@ -99,17 +117,24 @@ define(["loading", "dom", "libraryMenu", "globalize", "scripts/imagehelper", "hu
} }
function loadData(page) { function loadData(page) {
loading.show(), ApiClient.getJSON(ApiClient.getUrl("Devices")).then(function(result) { loading.show();
load(page, result.Items), loading.hide() ApiClient.getJSON(ApiClient.getUrl("Devices")).then(function (result) {
}) load(page, result.Items);
loading.hide();
});
} }
var canEdit = ApiClient.isMinServerVersion("3.4.1.31"); var canEdit = ApiClient.isMinServerVersion("3.4.1.31");
return function(view, params) { return function (view, params) {
view.querySelector(".devicesList").addEventListener("click", function(e) { view.querySelector(".devicesList").addEventListener("click", function (e) {
var btnDeviceMenu = dom.parentWithClass(e.target, "btnDeviceMenu"); var btnDeviceMenu = dom.parentWithClass(e.target, "btnDeviceMenu");
btnDeviceMenu && showDeviceMenu(view, btnDeviceMenu, btnDeviceMenu.getAttribute("data-id"))
}), view.addEventListener("viewshow", function() { if (btnDeviceMenu) {
loadData(this) 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.ContainerProfiles = profile.ContainerProfiles || [];
profile.CodecProfiles = profile.CodecProfiles || []; profile.CodecProfiles = profile.CodecProfiles || [];
profile.ResponseProfiles = profile.ResponseProfiles || []; profile.ResponseProfiles = profile.ResponseProfiles || [];
var usersHtml = "<option></option>" + users.map(function (u__w) { var usersHtml = "<option></option>" + users.map(function (u) {
return '<option value="' + u__w.Id + '">' + u__w.Name + "</option>"; return '<option value="' + u.Id + '">' + u.Name + "</option>";
}).join(""); }).join("");
$("#selectUser", page).html(usersHtml).val(profile.UserId || ""); $("#selectUser", page).html(usersHtml).val(profile.UserId || "");
renderSubProfiles(page, profile); renderSubProfiles(page, profile);
@ -74,12 +74,12 @@ define(["jQuery", "loading", "fnchecked", "emby-select", "emby-button", "emby-in
function renderIdentificationHeaders(page, headers) { function renderIdentificationHeaders(page, headers) {
var index = 0; 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">'; var li = '<div class="listItem">';
li += '<i class="md-icon listItemIcon">info</i>'; li += '<i class="md-icon listItemIcon">info</i>';
li += '<div class="listItemBody">'; li += '<div class="listItemBody">';
li += '<h3 class="listItemBodyText">' + h__e.Name + ": " + (h__e.Value || "") + "</h3>"; li += '<h3 class="listItemBodyText">' + h.Name + ": " + (h.Value || "") + "</h3>";
li += '<div class="listItemBodyText secondary">' + (h__e.Match || "") + "</div>"; li += '<div class="listItemBodyText secondary">' + (h.Match || "") + "</div>";
li += "</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 += '<button type="button" is="paper-icon-button-light" class="btnDeleteIdentificationHeader listItemButton" data-index="' + index + '"><i class="md-icon">delete</i></button>';
li += "</div>"; li += "</div>";
@ -130,11 +130,11 @@ define(["jQuery", "loading", "fnchecked", "emby-select", "emby-button", "emby-in
} }
function renderXmlDocumentAttributes(page, attribute) { 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">'; var li = '<div class="listItem">';
li += '<i class="md-icon listItemIcon">info</i>'; li += '<i class="md-icon listItemIcon">info</i>';
li += '<div class="listItemBody">'; 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 += "</div>";
li += '<button type="button" is="paper-icon-button-light" class="btnDeleteXmlAttribute listItemButton" data-index="0"><i class="md-icon">delete</i></button>'; 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>"; return li += "</div>";
@ -172,11 +172,11 @@ define(["jQuery", "loading", "fnchecked", "emby-select", "emby-button", "emby-in
function renderSubtitleProfiles(page, profiles) { function renderSubtitleProfiles(page, profiles) {
var index = 0; 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 + '">'; var li = '<div class="listItem lnkEditSubProfile" data-index="' + index + '">';
li += '<i class="md-icon listItemIcon">info</i>'; li += '<i class="md-icon listItemIcon">info</i>';
li += '<div class="listItemBody">'; li += '<div class="listItemBody">';
li += '<h3 class="listItemBodyText">' + (h__t.Format || "") + "</h3>"; li += '<h3 class="listItemBodyText">' + (h.Format || "") + "</h3>";
li += "</div>"; 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 += '<button type="button" is="paper-icon-button-light" class="btnDeleteProfile listItemButton" data-index="' + index + '"><i class="md-icon">delete</i></button>';
li += "</div>"; 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">'; html += '<ul data-role="listview" data-inset="true" data-split-icon="delete">';
var currentType; var currentType;
for (var i__y = 0, length = profiles.length; i__y < length; i__y++) { for (var i = 0, length = profiles.length; i < length; i++) {
var profile = profiles[i__y]; var profile = profiles[i];
if (profile.Type !== currentType) { if (profile.Type !== currentType) {
html += '<li data-role="list-divider">' + profile.Type + "</li>"; 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 += "<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>"; html += "<p>" + Globalize.translate("ValueContainer").replace("{0}", profile.Container || allText) + "</p>";
if ("Video" == profile.Type) { if ("Video" == profile.Type) {
@ -270,7 +270,7 @@ define(["jQuery", "loading", "fnchecked", "emby-select", "emby-button", "emby-in
} }
html += "</a>"; 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>"; 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">'; html += '<ul data-role="listview" data-inset="true" data-split-icon="delete">';
var currentType; var currentType;
for (var i__u = 0, length = profiles.length; i__u < length; i__u++) { for (var i = 0, length = profiles.length; i < length; i++) {
var profile = profiles[i__u]; var profile = profiles[i];
if (profile.Type !== currentType) { if (profile.Type !== currentType) {
html += '<li data-role="list-divider">' + profile.Type + "</li>"; 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 += "<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>Protocol: " + (profile.Protocol || "Http") + "</p>";
html += "<p>" + Globalize.translate("ValueContainer").replace("{0}", profile.Container || allText) + "</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 += "</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>"; 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">'; html += '<ul data-role="listview" data-inset="true" data-split-icon="delete">';
var currentType; var currentType;
for (var i__i = 0, length = profiles.length; i__i < length; i__i++) { for (var i = 0, length = profiles.length; i < length; i++) {
var profile = profiles[i__i]; var profile = profiles[i];
if (profile.Type !== currentType) { if (profile.Type !== currentType) {
html += '<li data-role="list-divider">' + profile.Type + "</li>"; 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 += "<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>"; html += "<p>" + Globalize.translate("ValueContainer").replace("{0}", profile.Container || allText) + "</p>";
if (profile.Conditions && profile.Conditions.length) { if (profile.Conditions && profile.Conditions.length) {
html += "<p>"; html += "<p>";
html += Globalize.translate("ValueConditions").replace("{0}", profile.Conditions.map(function (c__o) { html += Globalize.translate("ValueConditions").replace("{0}", profile.Conditions.map(function (c) {
return c__o.Property; return c.Property;
}).join(", ")); }).join(", "));
html += "</p>"; html += "</p>";
} }
html += "</a>"; 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>"; 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">'; html += '<ul data-role="listview" data-inset="true" data-split-icon="delete">';
var currentType; var currentType;
for (var i__p = 0, length = profiles.length; i__p < length; i__p++) { for (var i = 0, length = profiles.length; i < length; i++) {
var profile = profiles[i__p]; var profile = profiles[i];
var type = profile.Type.replace("VideoAudio", "Video Audio"); var type = profile.Type.replace("VideoAudio", "Video Audio");
if (type !== currentType) { if (type !== currentType) {
@ -475,19 +475,19 @@ define(["jQuery", "loading", "fnchecked", "emby-select", "emby-button", "emby-in
} }
html += "<div>"; 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>"; html += "<p>" + Globalize.translate("ValueCodec").replace("{0}", profile.Codec || allText) + "</p>";
if (profile.Conditions && profile.Conditions.length) { if (profile.Conditions && profile.Conditions.length) {
html += "<p>"; html += "<p>";
html += Globalize.translate("ValueConditions").replace("{0}", profile.Conditions.map(function (c__a) { html += Globalize.translate("ValueConditions").replace("{0}", profile.Conditions.map(function (c) {
return c__a.Property; return c.Property;
}).join(", ")); }).join(", "));
html += "</p>"; html += "</p>";
} }
html += "</a>"; 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>"; 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">'; html += '<ul data-role="listview" data-inset="true" data-split-icon="delete">';
var currentType; var currentType;
for (var i__s = 0, length = profiles.length; i__s < length; i__s++) { for (var i = 0, length = profiles.length; i < length; i++) {
var profile = profiles[i__s]; var profile = profiles[i];
if (profile.Type !== currentType) { if (profile.Type !== currentType) {
html += '<li data-role="list-divider">' + profile.Type + "</li>"; 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 += "<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>"; html += "<p>" + Globalize.translate("ValueContainer").replace("{0}", profile.Container || allText) + "</p>";
if ("Video" == profile.Type) { if ("Video" == profile.Type) {
@ -560,14 +560,14 @@ define(["jQuery", "loading", "fnchecked", "emby-select", "emby-button", "emby-in
if (profile.Conditions && profile.Conditions.length) { if (profile.Conditions && profile.Conditions.length) {
html += "<p>"; html += "<p>";
html += Globalize.translate("ValueConditions").replace("{0}", profile.Conditions.map(function (c__d) { html += Globalize.translate("ValueConditions").replace("{0}", profile.Conditions.map(function (c) {
return c__d.Property; return c.Property;
}).join(", ")); }).join(", "));
html += "</p>"; html += "</p>";
} }
html += "</a>"; 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>"; html += "</div>";
} }
@ -649,8 +649,8 @@ define(["jQuery", "loading", "fnchecked", "emby-select", "emby-button", "emby-in
profile.Name = $("#txtName", page).val(); profile.Name = $("#txtName", page).val();
profile.EnableAlbumArtInDidl = $("#chkEnableAlbumArtInDidl", page).checked(); profile.EnableAlbumArtInDidl = $("#chkEnableAlbumArtInDidl", page).checked();
profile.EnableSingleAlbumArtLimit = $("#chkEnableSingleImageLimit", page).checked(); profile.EnableSingleAlbumArtLimit = $("#chkEnableSingleImageLimit", page).checked();
profile.SupportedMediaTypes = $(".chkMediaType:checked", page).get().map(function (c__f) { profile.SupportedMediaTypes = $(".chkMediaType:checked", page).get().map(function (c) {
return c__f.getAttribute("data-value"); return c.getAttribute("data-value");
}).join(","); }).join(",");
profile.Identification = profile.Identification || {}; profile.Identification = profile.Identification || {};
profile.FriendlyName = $("#txtInfoFriendlyName", page).val(); 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"; "use strict";
function loadProfiles(page) { function loadProfiles(page) {
loading.show(), ApiClient.getJSON(ApiClient.getUrl("Dlna/ProfileInfos")).then(function(result) { loading.show();
renderUserProfiles(page, result), renderSystemProfiles(page, result), loading.hide() ApiClient.getJSON(ApiClient.getUrl("Dlna/ProfileInfos")).then(function (result) {
}) renderUserProfiles(page, result);
renderSystemProfiles(page, result);
loading.hide();
});
} }
function renderUserProfiles(page, profiles) { function renderUserProfiles(page, profiles) {
renderProfiles(page, page.querySelector(".customProfiles"), profiles.filter(function(p) { renderProfiles(page, page.querySelector(".customProfiles"), profiles.filter(function (p) {
return "User" == p.Type return "User" == p.Type;
})) }));
} }
function renderSystemProfiles(page, profiles) { function renderSystemProfiles(page, profiles) {
renderProfiles(page, page.querySelector(".systemProfiles"), profiles.filter(function(p) { renderProfiles(page, page.querySelector(".systemProfiles"), profiles.filter(function (p) {
return "System" == p.Type return "System" == p.Type;
})) }));
} }
function renderProfiles(page, element, profiles) { function renderProfiles(page, element, profiles) {
var html = ""; 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++) { for (var i = 0, length = profiles.length; i < length; i++) {
var profile = profiles[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>';
} }
profiles.length && (html += "</div>"), element.innerHTML = html, $(".btnDeleteProfile", element).on("click", function() {
html += "</div>";
}
if (profiles.length) {
html += "</div>";
}
element.innerHTML = html;
$(".btnDeleteProfile", element).on("click", function () {
var id = this.getAttribute("data-profileid"); var id = this.getAttribute("data-profileid");
deleteProfile(page, id) deleteProfile(page, id);
}) });
} }
function deleteProfile(page, id) { function deleteProfile(page, id) {
require(["confirm"], function(confirm) { require(["confirm"], function (confirm) {
confirm(globalize.translate("MessageConfirmProfileDeletion"), globalize.translate("HeaderConfirmProfileDeletion")).then(function() { confirm(globalize.translate("MessageConfirmProfileDeletion"), globalize.translate("HeaderConfirmProfileDeletion")).then(function () {
loading.show(), ApiClient.ajax({ loading.show();
ApiClient.ajax({
type: "DELETE", type: "DELETE",
url: ApiClient.getUrl("Dlna/Profiles/" + id) url: ApiClient.getUrl("Dlna/Profiles/" + id)
}).then(function() { }).then(function () {
loading.hide(), loadProfiles(page) loading.hide();
}) loadProfiles(page);
}) });
}) });
});
} }
function getTabs() { function getTabs() {
@ -52,10 +79,11 @@ define(["jQuery", "globalize", "loading", "libraryMenu", "listViewStyle", "emby-
}, { }, {
href: "dlnaprofiles.html", href: "dlnaprofiles.html",
name: globalize.translate("TabProfiles") name: globalize.translate("TabProfiles")
}] }];
} }
$(document).on("pageshow", "#dlnaProfilesPage", function() { $(document).on("pageshow", "#dlnaProfilesPage", function () {
libraryMenu.setTabs("dlna", 1, getTabs), loadProfiles(this) 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"; "use strict";
function loadPage(page, config, users) { 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); page.querySelector("#chkEnablePlayTo").checked = config.EnablePlayTo;
var usersHtml = users.map(function(u) { page.querySelector("#chkEnableDlnaDebugLogging").checked = config.EnableDebugLog;
return '<option value="' + u.Id + '">' + u.Name + "</option>" $("#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(""); }).join("");
$("#selectUser", page).html(usersHtml).val(config.DefaultUserId || ""), loading.hide() $("#selectUser", page).html(usersHtml).val(config.DefaultUserId || "");
loading.hide();
} }
function onSubmit() { function onSubmit() {
loading.show(); loading.show();
var form = this; var form = this;
return ApiClient.getNamedConfiguration("dlna").then(function(config) { 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) config.EnablePlayTo = form.querySelector("#chkEnablePlayTo").checked;
}), !1 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() { function getTabs() {
@ -24,17 +38,19 @@ define(["jQuery", "loading", "libraryMenu", "fnchecked"], function($, loading, l
}, { }, {
href: "dlnaprofiles.html", href: "dlnaprofiles.html",
name: Globalize.translate("TabProfiles") name: Globalize.translate("TabProfiles")
}] }];
} }
$(document).on("pageinit", "#dlnaSettingsPage", function() {
$(".dlnaSettingsForm").off("submit", onSubmit).on("submit", onSubmit) $(document).on("pageinit", "#dlnaSettingsPage", function () {
}).on("pageshow", "#dlnaSettingsPage", function() { $(".dlnaSettingsForm").off("submit", onSubmit).on("submit", onSubmit);
libraryMenu.setTabs("dlna", 0, getTabs), loading.show(); }).on("pageshow", "#dlnaSettingsPage", function () {
var page = this, libraryMenu.setTabs("dlna", 0, getTabs);
promise1 = ApiClient.getNamedConfiguration("dlna"), loading.show();
promise2 = ApiClient.getUsers(); var page = this;
Promise.all([promise1, promise2]).then(function(responses) { var promise1 = ApiClient.getNamedConfiguration("dlna");
loadPage(page, responses[0], responses[1]) 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"; "use strict";
function reload(context, itemId) { function reload(context, itemId) {
loading.show(), itemId ? require(["metadataEditor"], function(metadataEditor) { loading.show();
metadataEditor.embed(context.querySelector(".editPageInnerContent"), itemId, ApiClient.serverInfo().Id)
}) : (context.querySelector(".editPageInnerContent").innerHTML = "", loading.hide()) 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()) return function (view, params) {
}), MetadataEditor.setCurrentItemId(null), view.querySelector(".libraryTree").addEventListener("itemclicked", function(event) { view.addEventListener("viewshow", function () {
reload(this, MetadataEditor.getCurrentItemId());
});
MetadataEditor.setCurrentItemId(null);
view.querySelector(".libraryTree").addEventListener("itemclicked", function (event) {
var data = event.detail; 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"; "use strict";
function loadPage(page, config, systemInfo) { function loadPage(page, config, systemInfo) {
Array.prototype.forEach.call(page.querySelectorAll(".chkDecodeCodec"), function(c) { Array.prototype.forEach.call(page.querySelectorAll(".chkDecodeCodec"), function (c) {
c.checked = -1 !== (config.HardwareDecodingCodecs || []).indexOf(c.getAttribute("data-codec")) c.checked = -1 !== (config.HardwareDecodingCodecs || []).indexOf(c.getAttribute("data-codec"));
}); });
page.querySelector("#chkHardwareEncoding").checked = config.EnableHardwareEncoding; page.querySelector("#chkHardwareEncoding").checked = config.EnableHardwareEncoding;
$("#selectVideoDecoder", page).val(config.HardwareAccelerationType); $("#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("#chkEnableSubtitleExtraction").checked = config.EnableSubtitleExtraction || false;
page.querySelector("#selectVideoDecoder").dispatchEvent(new CustomEvent("change", { page.querySelector("#selectVideoDecoder").dispatchEvent(new CustomEvent("change", {
bubbles: true bubbles: true
})), loading.hide() }));
loading.hide();
} }
function onSaveEncodingPathFailure(response) { function onSaveEncodingPathFailure(response) {
loading.hide(); loading.hide();
var msg = ""; var msg = "";
msg = globalize.translate("FFmpegSavePathNotFound"), require(["alert"], function(alert) { msg = globalize.translate("FFmpegSavePathNotFound");
alert(msg)
}) require(["alert"], function (alert) {
alert(msg);
});
} }
function updateEncoder(form) { function updateEncoder(form) {
return ApiClient.getSystemInfo().then(function(systemInfo) { return ApiClient.getSystemInfo().then(function (systemInfo) {
return ApiClient.ajax({ return ApiClient.ajax({
url: ApiClient.getUrl("System/MediaEncoder/Path"), url: ApiClient.getUrl("System/MediaEncoder/Path"),
type: "POST", type: "POST",
@ -37,37 +40,67 @@ define(["jQuery", "loading", "globalize", "dom", "libraryMenu"], function($, loa
Path: form.querySelector(".txtEncoderPath").value, Path: form.querySelector(".txtEncoderPath").value,
PathType: "Custom" PathType: "Custom"
} }
}).then(Dashboard.processServerConfigurationUpdateResult, onSaveEncodingPathFailure) }).then(Dashboard.processServerConfigurationUpdateResult, onSaveEncodingPathFailure);
}) });
} }
function onSubmit() { function onSubmit() {
var form = this, var form = this;
onDecoderConfirmed = function() {
loading.show(), ApiClient.getNamedConfiguration("encoding").then(function(config) { var onDecoderConfirmed = function () {
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) { loading.show();
return c.checked ApiClient.getNamedConfiguration("encoding").then(function (config) {
}), function(c) { config.DownMixAudioBoost = $("#txtDownMixAudioBoost", form).val();
return c.getAttribute("data-codec") config.TranscodingTempPath = $("#txtTranscodingTempPath", form).val();
}), config.EnableHardwareEncoding = form.querySelector("#chkHardwareEncoding").checked, ApiClient.updateNamedConfiguration("encoding", config).then(function() { config.EncodingThreadCount = $("#selectThreadCount", form).val();
updateEncoder(form) 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) {
if ($("#selectVideoDecoder", form).val()) {
require(["alert"], function (alert) {
alert({ alert({
title: globalize.translate("TitleHardwareAcceleration"), title: globalize.translate("TitleHardwareAcceleration"),
text: globalize.translate("HardwareAccelerationWarning") text: globalize.translate("HardwareAccelerationWarning")
}).then(onDecoderConfirmed) }).then(onDecoderConfirmed);
}) : onDecoderConfirmed(), !1 });
} else {
onDecoderConfirmed();
}
return false;
} }
function setDecodingCodecsVisible(context, value) { function setDecodingCodecsVisible(context, value) {
value = value || ""; value = value || "";
var any; var any;
Array.prototype.forEach.call(context.querySelectorAll(".chkDecodeCodec"), function(c) { 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) if (-1 === c.getAttribute("data-types").split(",").indexOf(value)) {
}), any ? context.querySelector(".decodingCodecsList").classList.remove("hide") : context.querySelector(".decodingCodecsList").classList.add("hide") 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() { function getTabs() {
@ -80,44 +113,69 @@ define(["jQuery", "loading", "globalize", "dom", "libraryMenu"], function($, loa
}, { }, {
href: "streamingsettings.html", href: "streamingsettings.html",
name: Globalize.translate("TabStreaming") name: Globalize.translate("TabStreaming")
}] }];
} }
$(document).on("pageinit", "#encodingSettingsPage", function() { $(document).on("pageinit", "#encodingSettingsPage", function () {
var page = this; var page = this;
page.querySelector("#selectVideoDecoder").addEventListener("change", function() { 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) if ("vaapi" == this.value) {
}), $("#btnSelectEncoderPath", page).on("click.selectDirectory", function() { page.querySelector(".fldVaapiDevice").classList.remove("hide");
require(["directorybrowser"], function(directoryBrowser) { page.querySelector("#txtVaapiDevice").setAttribute("required", "required");
var picker = new directoryBrowser; } else {
picker.show({ page.querySelector(".fldVaapiDevice").classList.add("hide");
includeFiles: !0, page.querySelector("#txtVaapiDevice").removeAttribute("required");
callback: function(path) {
path && $(".txtEncoderPath", page).val(path), picker.close()
} }
})
}) if (this.value) {
}), $("#btnSelectTranscodingTempPath", page).on("click.selectDirectory", function() { page.querySelector(".hardwareAccelerationOptions").classList.remove("hide");
require(["directorybrowser"], function(directoryBrowser) { } else {
var picker = new directoryBrowser; 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({ picker.show({
callback: function(path) { includeFiles: true,
path && $("#txtTranscodingTempPath", page).val(path), picker.close() 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();
picker.show({
callback: function (path) {
if (path) {
$("#txtTranscodingTempPath", page).val(path);
}
picker.close();
}, },
validateWriteable: !0, validateWriteable: true,
header: globalize.translate("HeaderSelectTranscodingPath"), header: globalize.translate("HeaderSelectTranscodingPath"),
instruction: globalize.translate("HeaderSelectTranscodingPathHelp") 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(); loading.show();
libraryMenu.setTabs("playback", 0, getTabs); libraryMenu.setTabs("playback", 0, getTabs);
var page = this; var page = this;
ApiClient.getNamedConfiguration("encoding").then(function(config) { ApiClient.getNamedConfiguration("encoding").then(function (config) {
ApiClient.getSystemInfo().then(function(systemInfo) { ApiClient.getSystemInfo().then(function (systemInfo) {
loadPage(page, config, systemInfo); loadPage(page, config, systemInfo);
}) });
}) });
}) });
}); });

View file

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

View file

@ -1,33 +1,41 @@
define([], function() { define([], function () {
"use strict"; "use strict";
function processForgotPasswordResult(result) { function processForgotPasswordResult(result) {
if (result.Success) { if (result.Success) {
var msg = Globalize.translate("MessagePasswordResetForUsers"); 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, message: msg,
title: Globalize.translate("HeaderPasswordReset"), title: Globalize.translate("HeaderPasswordReset"),
callback: function() { callback: function () {
window.location.href = "index.html" window.location.href = "index.html";
} }
}) });
} }
Dashboard.alert({ Dashboard.alert({
message: Globalize.translate("MessageInvalidForgotPasswordPin"), message: Globalize.translate("MessageInvalidForgotPasswordPin"),
title: Globalize.translate("HeaderPasswordReset") title: Globalize.translate("HeaderPasswordReset")
}) });
} }
return function(view, params) {
return function (view, params) {
function onSubmit(e) { function onSubmit(e) {
return ApiClient.ajax({ ApiClient.ajax({
type: "POST", type: "POST",
url: ApiClient.getUrl("Users/ForgotPassword/Pin"), url: ApiClient.getUrl("Users/ForgotPassword/Pin"),
dataType: "json", dataType: "json",
data: { data: {
Pin: view.querySelector("#txtPin").value Pin: view.querySelector("#txtPin").value
} }
}).then(processForgotPasswordResult), e.preventDefault(), !1 }).then(processForgotPasswordResult);
} e.preventDefault();
view.querySelector("form").addEventListener("submit", onSubmit) return false;
} }
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"; "use strict";
function getTabs() { function getTabs() {
@ -6,47 +6,70 @@ define(["tabbedView", "globalize", "require", "emby-tabs", "emby-button", "emby-
name: globalize.translate("Home") name: globalize.translate("Home")
}, { }, {
name: globalize.translate("Favorites") name: globalize.translate("Favorites")
}] }];
} }
function getDefaultTabIndex() { function getDefaultTabIndex() {
return 0 return 0;
} }
function getRequirePromise(deps) { function getRequirePromise(deps) {
return new Promise(function(resolve, reject) { return new Promise(function (resolve, reject) {
require(deps, resolve) require(deps, resolve);
}) });
} }
function getTabController(index) { 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 = []; var depends = [];
switch (index) { switch (index) {
case 0: case 0:
depends.push("controllers/hometab"); depends.push("controllers/hometab");
break; break;
case 1: case 1:
depends.push("controllers/favorites") depends.push("controllers/favorites");
} }
var instance = this; var instance = this;
return getRequirePromise(depends).then(function(controllerFactory) { return getRequirePromise(depends).then(function (controllerFactory) {
var controller = instance.tabControllers[index]; var controller = instance.tabControllers[index];
if (!controller) { 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) { 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) Object.assign(HomeView.prototype, TabbedView.prototype);
}, HomeView.prototype.onPause = function() { HomeView.prototype.getTabs = getTabs;
TabbedView.prototype.onPause.call(this), document.querySelector(".skinHeader").classList.remove("noHomeButtonHeader") HomeView.prototype.getDefaultTabIndex = getDefaultTabIndex;
}, HomeView.prototype.onResume = function(options) { HomeView.prototype.getTabController = getTabController;
TabbedView.prototype.onResume.call(this, options), document.querySelector(".skinHeader").classList.add("noHomeButtonHeader")
}, HomeView 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"; "use strict";
function HomeTab(view, params) { 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() { function onHomeScreenSettingsChanged() {
this.sectionsRendered = !1, this.paused || this.onResume({ this.sectionsRendered = false;
refresh: !0
}) if (!this.paused) {
this.onResume({
refresh: true
});
} }
return HomeTab.prototype.onResume = function(options) { }
HomeTab.prototype.onResume = function (options) {
if (this.sectionsRendered) { if (this.sectionsRendered) {
var sectionsContainer = this.sectionsContainer; var sectionsContainer = this.sectionsContainer;
return sectionsContainer ? homeSections.resume(sectionsContainer, options) : Promise.resolve()
if (sectionsContainer) {
return homeSections.resume(sectionsContainer, options);
} }
return Promise.resolve();
}
loading.show(); loading.show();
var view = this.view, var view = this.view;
apiClient = this.apiClient; var apiClient = this.apiClient;
return this.destroyHomeSections(), this.sectionsRendered = !0, apiClient.getCurrentUser().then(function(user) { this.destroyHomeSections();
return homeSections.loadSections(view.querySelector(".sections"), apiClient, user, userSettings).then(function() { this.sectionsRendered = true;
options.autoFocus && focusManager.autoFocus(view), loading.hide() return apiClient.getCurrentUser().then(function (user) {
}) return homeSections.loadSections(view.querySelector(".sections"), apiClient, user, userSettings).then(function () {
}) if (options.autoFocus) {
}, HomeTab.prototype.onPause = function() { focusManager.autoFocus(view);
}
loading.hide();
});
});
};
HomeTab.prototype.onPause = function () {
var sectionsContainer = this.sectionsContainer; var sectionsContainer = this.sectionsContainer;
sectionsContainer && homeSections.pause(sectionsContainer)
}, HomeTab.prototype.destroy = function() { if (sectionsContainer) {
this.view = null, this.params = null, this.apiClient = null, this.destroyHomeSections(), this.sectionsContainer = null homeSections.pause(sectionsContainer);
}, HomeTab.prototype.destroyHomeSections = function() { }
};
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; 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"; "use strict";
function deletePlugin(page, uniqueid, name) { function deletePlugin(page, uniqueid, name) {
var msg = globalize.translate("UninstallPluginConfirmation").replace("{0}", name); var msg = globalize.translate("UninstallPluginConfirmation").replace("{0}", name);
require(["confirm"], function(confirm) {
require(["confirm"], function (confirm) {
confirm({ confirm({
title: globalize.translate("UninstallPluginHeader"), title: globalize.translate("UninstallPluginHeader"),
text: msg, text: msg,
primary: "delete", primary: "delete",
confirmText: globalize.translate("UninstallPluginHeader") confirmText: globalize.translate("UninstallPluginHeader")
}).then(function() { }).then(function () {
loading.show(); loading.show();
ApiClient.uninstallPlugin(uniqueid).then(function() { ApiClient.uninstallPlugin(uniqueid).then(function () {
reloadList(page); reloadList(page);
}); });
}) });
}) });
} }
function showNoConfigurationMessage() { function showNoConfigurationMessage() {
@ -31,23 +32,24 @@ define(["loading", "libraryMenu", "dom", "globalize", "cardStyle", "emby-button"
} }
function getPluginCardHtml(plugin, pluginConfigurationPages) { function getPluginCardHtml(plugin, pluginConfigurationPages) {
var configPage = pluginConfigurationPages.filter(function(pluginConfigurationPage) { var configPage = pluginConfigurationPages.filter(function (pluginConfigurationPage) {
return pluginConfigurationPage.PluginId == plugin.Id; return pluginConfigurationPage.PluginId == plugin.Id;
})[0]; })[0];
var configPageUrl = configPage ? Dashboard.getConfigurationPageUrl(configPage.Name) : null; var configPageUrl = configPage ? Dashboard.getConfigurationPageUrl(configPage.Name) : null;
var html = ""; var html = "";
html += "<div data-id='" + plugin.Id + "' data-name='" + plugin.Name + "' class='card backdropCard'>"; html += "<div data-id='" + plugin.Id + "' data-name='" + plugin.Name + "' class='card backdropCard'>";
html += '<div class="cardBox visualCardBox">'; html += '<div class="cardBox visualCardBox">';
html += '<div class="cardScalable">'; html += '<div class="cardScalable">';
html += '<div class="cardPadder cardPadder-backdrop"></div>'; html += '<div class="cardPadder cardPadder-backdrop"></div>';
html += configPageUrl ? '<a class="cardContent cardImageContainer" is="emby-linkbutton" href="' + configPageUrl + '">' : '<div class="cardContent noConfigPluginCard noHoverEffect cardImageContainer">'; html += configPageUrl ? '<a class="cardContent cardImageContainer" is="emby-linkbutton" href="' + configPageUrl + '">' : '<div class="cardContent noConfigPluginCard noHoverEffect cardImageContainer">';
if (plugin.ImageUrl) { if (plugin.ImageUrl) {
html += '<div class="cardImage coveredImage" style="background-image:url(\'' + plugin.ImageUrl + "');\">"; html += '<div class="cardImage coveredImage" style="background-image:url(\'' + plugin.ImageUrl + "');\">";
html += "</div>"; html += "</div>";
} else { } else {
html += '<i class="cardImageIcon md-icon">&#xE2C7;</i>'; html += '<i class="cardImageIcon md-icon">&#xE2C7;</i>';
} }
html += configPageUrl ? "</a>" : "</div>"; html += configPageUrl ? "</a>" : "</div>";
html += "</div>"; html += "</div>";
html += '<div class="cardFooter">'; html += '<div class="cardFooter">';
@ -67,21 +69,26 @@ define(["loading", "libraryMenu", "dom", "globalize", "cardStyle", "emby-button"
} }
function renderPlugins(page, plugins) { 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); populateList(page, plugins, configPages);
}); });
} }
function populateList(page, plugins, pluginConfigurationPages) { function populateList(page, plugins, pluginConfigurationPages) {
plugins = plugins.sort(function(plugin1, plugin2) { plugins = plugins.sort(function (plugin1, plugin2) {
return plugin1.Name > plugin2.Name ? 1 : -1 if (plugin1.Name > plugin2.Name) {
return 1;
}
return -1;
}); });
var html = plugins.map(function(p) { var html = plugins.map(function (p) {
return getPluginCardHtml(p, pluginConfigurationPages) return getPluginCardHtml(p, pluginConfigurationPages);
}).join(""); }).join("");
var installedPluginsElement = page.querySelector(".installedPlugins"); var installedPluginsElement = page.querySelector(".installedPlugins");
installedPluginsElement.removeEventListener("click", onInstalledPluginsClick); installedPluginsElement.removeEventListener("click", onInstalledPluginsClick);
installedPluginsElement.addEventListener("click", onInstalledPluginsClick); installedPluginsElement.addEventListener("click", onInstalledPluginsClick);
if (plugins.length) { if (plugins.length) {
installedPluginsElement.classList.add("itemsContainer"); installedPluginsElement.classList.add("itemsContainer");
installedPluginsElement.classList.add("vertical-wrap"); installedPluginsElement.classList.add("vertical-wrap");
@ -93,6 +100,7 @@ define(["loading", "libraryMenu", "dom", "globalize", "cardStyle", "emby-button"
html += "</a></p>"; html += "</a></p>";
html += "</div>"; html += "</div>";
} }
installedPluginsElement.innerHTML = html; installedPluginsElement.innerHTML = html;
loading.hide(); loading.hide();
} }
@ -103,6 +111,7 @@ define(["loading", "libraryMenu", "dom", "globalize", "cardStyle", "emby-button"
var name = card.getAttribute("data-name"); var name = card.getAttribute("data-name");
var configHref = card.querySelector(".cardContent").getAttribute("href"); var configHref = card.querySelector(".cardContent").getAttribute("href");
var menuItems = []; var menuItems = [];
if (configHref) { if (configHref) {
menuItems.push({ menuItems.push({
name: globalize.translate("ButtonSettings"), name: globalize.translate("ButtonSettings"),
@ -110,22 +119,25 @@ define(["loading", "libraryMenu", "dom", "globalize", "cardStyle", "emby-button"
ironIcon: "mode-edit" ironIcon: "mode-edit"
}); });
} }
menuItems.push({ menuItems.push({
name: globalize.translate("ButtonUninstall"), name: globalize.translate("ButtonUninstall"),
id: "delete", id: "delete",
ironIcon: "delete" ironIcon: "delete"
}); });
require(["actionsheet"], function(actionsheet) {
require(["actionsheet"], function (actionsheet) {
actionsheet.show({ actionsheet.show({
items: menuItems, items: menuItems,
positionTo: elem, positionTo: elem,
callback: function(resultId) { callback: function (resultId) {
switch (resultId) { switch (resultId) {
case "open": case "open":
Dashboard.navigate(configHref); Dashboard.navigate(configHref);
break; break;
case "delete": 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) { function reloadList(page) {
loading.show(); loading.show();
ApiClient.getInstalledPlugins().then(function(plugins) { ApiClient.getInstalledPlugins().then(function (plugins) {
renderPlugins(page, plugins); renderPlugins(page, plugins);
}); });
} }
@ -146,7 +158,7 @@ define(["loading", "libraryMenu", "dom", "globalize", "cardStyle", "emby-button"
}, { }, {
href: "availableplugins.html", href: "availableplugins.html",
name: globalize.translate("TabCatalog") name: globalize.translate("TabCatalog")
}] }];
} }
function onInstalledPluginsClick(e) { function onInstalledPluginsClick(e) {
@ -156,16 +168,18 @@ define(["loading", "libraryMenu", "dom", "globalize", "cardStyle", "emby-button"
showConnectMessage(); showConnectMessage();
} else { } else {
var btnCardMenu = dom.parentWithClass(e.target, "btnCardMenu"); 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); libraryMenu.setTabs("plugins", 0, getTabs);
reloadList(this); reloadList(this);
}); });
window.PluginsPage = { window.PluginsPage = {
renderPlugins: renderPlugins 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"; "use strict";
return function(view, params, tabContent) {
return function (view, params, tabContent) {
function getPageData() { function getPageData() {
return pageData || (pageData = { if (!pageData) {
pageData = {
query: { query: {
StartIndex: 0, StartIndex: 0,
Limit: 100, Limit: 100,
Fields: "PrimaryImageAspectRatio" Fields: "PrimaryImageAspectRatio"
} }
}), pageData };
}
return pageData;
} }
function getQuery() { function getQuery() {
return getPageData().query return getPageData().query;
} }
function getChannelsHtml(channels) { function getChannelsHtml(channels) {
return cardBuilder.getCardsHtml({ return cardBuilder.getCardsHtml({
items: channels, items: channels,
shape: "square", shape: "square",
showTitle: !0, showTitle: true,
lazy: !0, lazy: true,
cardLayout: !0, cardLayout: true,
showDetailsMenu: !0, showDetailsMenu: true,
showCurrentProgram: !0, showCurrentProgram: true,
showCurrentProgramTime: !0 showCurrentProgramTime: true
}) });
} }
function renderChannels(context, result) { function renderChannels(context, result) {
function onNextPageClick() { function onNextPageClick() {
if (isLoading) return; if (isLoading) {
query.StartIndex += query.Limit, reloadItems(context) return;
}
query.StartIndex += query.Limit;
reloadItems(context);
} }
function onPreviousPageClick() { function onPreviousPageClick() {
if (isLoading) return; if (isLoading) {
query.StartIndex -= query.Limit, reloadItems(context) return;
} }
query.StartIndex -= query.Limit;
reloadItems(context);
}
var query = getQuery(); var query = getQuery();
context.querySelector(".paging").innerHTML = libraryBrowser.getQueryPagingHtml({ context.querySelector(".paging").innerHTML = libraryBrowser.getQueryPagingHtml({
startIndex: query.StartIndex, startIndex: query.StartIndex,
limit: query.Limit, limit: query.Limit,
totalRecordCount: result.TotalRecordCount, totalRecordCount: result.TotalRecordCount,
showLimit: !1, showLimit: false,
updatePageSizeSetting: !1, updatePageSizeSetting: false,
filterButton: !1 filterButton: false
}); });
var html = getChannelsHtml(result.Items), var html = getChannelsHtml(result.Items);
elem = context.querySelector("#items"); var elem = context.querySelector("#items");
elem.innerHTML = html, imageLoader.lazyChildren(elem); elem.innerHTML = html;
var i, length, elems; imageLoader.lazyChildren(elem);
for (elems = context.querySelectorAll(".btnNextPage"), i = 0, length = elems.length; i < length; i++) elems[i].addEventListener("click", onNextPageClick); var i;
for (elems = context.querySelectorAll(".btnPreviousPage"), i = 0, length = elems.length; i < length; i++) elems[i].addEventListener("click", onPreviousPageClick) 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) { function showFilterMenu(context) {
require(["components/filterdialog/filterdialog"], function(filterDialogFactory) { require(["components/filterdialog/filterdialog"], function (filterDialogFactory) {
var filterDialog = new filterDialogFactory({ var filterDialog = new filterDialogFactory({
query: getQuery(), query: getQuery(),
mode: "livetvchannels", mode: "livetvchannels",
serverId: ApiClient.serverId() serverId: ApiClient.serverId()
}); });
events.on(filterDialog, "filterchange", function() { events.on(filterDialog, "filterchange", function () {
reloadItems(context) reloadItems(context);
}), filterDialog.show() });
}) filterDialog.show();
});
} }
function reloadItems(context, save) { function reloadItems(context, save) {
loading.show(); loading.show();
isLoading = true; isLoading = true;
var query = getQuery(), var query = getQuery();
apiClient = ApiClient; var apiClient = ApiClient;
query.UserId = apiClient.getCurrentUserId(), apiClient.getLiveTvChannels(query).then(function(result) { query.UserId = apiClient.getCurrentUserId();
apiClient.getLiveTvChannels(query).then(function (result) {
renderChannels(context, result); renderChannels(context, result);
loading.hide(); loading.hide();
isLoading = false; 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"; "use strict";
return function(view, params, tabContent) {
var guideInstance, self = this; return function (view, params, tabContent) {
self.renderTab = function() { var guideInstance;
guideInstance || (guideInstance = new tvguide({ var self = this;
self.renderTab = function () {
if (!guideInstance) {
guideInstance = new tvguide({
element: tabContent, element: tabContent,
serverId: ApiClient.serverId() serverId: ApiClient.serverId()
})) });
}, self.onShow = function() {
guideInstance && guideInstance.resume()
}, self.onHide = function() {
guideInstance && guideInstance.pause()
} }
};
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"; "use strict";
function renderRecordings(elem, recordings, cardOptions, scrollX) { 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"); 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"); appHost.supports("imageanalysis");
recordingItems.innerHTML = cardBuilder.getCardsHtml(Object.assign({ recordingItems.innerHTML = cardBuilder.getCardsHtml(Object.assign({
items: recordings, items: recordings,
shape: scrollX ? "autooverflow" : "auto", shape: scrollX ? "autooverflow" : "auto",
defaultShape: scrollX ? "overflowBackdrop" : "backdrop", defaultShape: scrollX ? "overflowBackdrop" : "backdrop",
showTitle: !0, showTitle: true,
showParentTitle: !0, showParentTitle: true,
coverImage: !0, coverImage: true,
cardLayout: !1, cardLayout: false,
centerText: !0, centerText: true,
allowBottomPadding: !scrollX, allowBottomPadding: !scrollX,
preferThumb: "auto", preferThumb: "auto",
overlayText: !1 overlayText: false
}, cardOptions || {})), imageLoader.lazyChildren(recordingItems) }, cardOptions || {}));
imageLoader.lazyChildren(recordingItems);
} }
function renderLatestRecordings(context, promise) { function renderLatestRecordings(context, promise) {
promise.then(function(result) { promise.then(function (result) {
renderRecordings(context.querySelector("#latestRecordings"), result.Items, { renderRecordings(context.querySelector("#latestRecordings"), result.Items, {
showYear: !0, showYear: true,
lines: 2 lines: 2
}, !1), loading.hide() }, false);
}) loading.hide();
});
} }
function renderRecordingFolders(context, promise) { function renderRecordingFolders(context, promise) {
promise.then(function(result) { promise.then(function (result) {
renderRecordings(context.querySelector("#recordingFolders"), result.Items, { renderRecordings(context.querySelector("#recordingFolders"), result.Items, {
showYear: !1, showYear: false,
showParentTitle: !1 showParentTitle: false
}, !1) }, false);
}) });
} }
function onMoreClick(e) { function onMoreClick(e) {
var type = this.getAttribute("data-type"), var type = this.getAttribute("data-type");
serverId = ApiClient.serverId(); var serverId = ApiClient.serverId();
switch (type) { switch (type) {
case "latest": 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() { function enableFullRender() {
return (new Date).getTime() - lastFullRender > 3e5 return new Date().getTime() - lastFullRender > 300000;
} }
var foldersPromise, latestPromise, self = this,
lastFullRender = 0; var foldersPromise;
for (var moreButtons = tabContent.querySelectorAll(".more"), i = 0, length = moreButtons.length; i < length; i++) moreButtons[i].addEventListener("click", onMoreClick); var latestPromise;
self.preRender = function() { var self = this;
enableFullRender() && (latestPromise = ApiClient.getLiveTvRecordings({ 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(), UserId: Dashboard.getCurrentUserId(),
Limit: 12, Limit: 12,
Fields: "CanDelete,PrimaryImageAspectRatio,BasicSyncInfo", Fields: "CanDelete,PrimaryImageAspectRatio,BasicSyncInfo",
EnableTotalRecordCount: !1, EnableTotalRecordCount: false,
EnableImageTypes: "Primary,Thumb,Backdrop" EnableImageTypes: "Primary,Thumb,Backdrop"
}), foldersPromise = ApiClient.getRecordingFolders(Dashboard.getCurrentUserId())) });
}, self.renderTab = function() { foldersPromise = ApiClient.getRecordingFolders(Dashboard.getCurrentUserId());
enableFullRender() && (loading.show(), renderLatestRecordings(tabContent, latestPromise), renderRecordingFolders(tabContent, foldersPromise), lastFullRender = (new Date).getTime())
} }
};
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"; "use strict";
function enableScrollX() { function enableScrollX() {
return !layoutManager.desktop return !layoutManager.desktop;
} }
function renderRecordings(elem, recordings, cardOptions) { 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"); 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"), if (enableScrollX()) {
cardLayout = appHost.preferVisualCards || supportsImageAnalysis; recordingItems.classList.add("scrollX");
cardLayout = !1, recordingItems.innerHTML = cardBuilder.getCardsHtml(Object.assign({
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, items: recordings,
shape: enableScrollX() ? "autooverflow" : "auto", shape: enableScrollX() ? "autooverflow" : "auto",
showTitle: !0, showTitle: true,
showParentTitle: !0, showParentTitle: true,
coverImage: !0, coverImage: true,
cardLayout: cardLayout, cardLayout: cardLayout,
centerText: !cardLayout, centerText: !cardLayout,
allowBottomPadding: !enableScrollX(), allowBottomPadding: !enableScrollX(),
preferThumb: "auto" preferThumb: "auto"
}, cardOptions || {})), imageLoader.lazyChildren(recordingItems) }, cardOptions || {}));
imageLoader.lazyChildren(recordingItems);
} }
function getBackdropShape() { function getBackdropShape() {
@ -29,52 +52,72 @@ define(["layoutManager", "cardBuilder", "apphost", "imageLoader", "loading", "sc
} }
function renderActiveRecordings(context, promise) { function renderActiveRecordings(context, promise) {
promise.then(function(result) { promise.then(function (result) {
renderRecordings(context.querySelector("#activeRecordings"), result.Items, { renderRecordings(context.querySelector("#activeRecordings"), result.Items, {
shape: enableScrollX() ? "autooverflow" : "auto", shape: enableScrollX() ? "autooverflow" : "auto",
defaultShape: getBackdropShape(), defaultShape: getBackdropShape(),
showParentTitle: !1, showParentTitle: false,
showParentTitleOrTitle: !0, showParentTitleOrTitle: true,
showTitle: !1, showTitle: false,
showAirTime: !0, showAirTime: true,
showAirEndTime: !0, showAirEndTime: true,
showChannelName: !0, showChannelName: true,
coverImage: !0, coverImage: true,
overlayText: !1, overlayText: false,
overlayMoreButton: !0 overlayMoreButton: true
}) });
}) });
} }
function renderTimers(context, timers, options) { function renderTimers(context, timers, options) {
LiveTvHelpers.getTimersHtml(timers, options).then(function(html) { LiveTvHelpers.getTimersHtml(timers, options).then(function (html) {
var elem = context; 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) { function renderUpcomingRecordings(context, promise) {
promise.then(function(result) { promise.then(function (result) {
renderTimers(context.querySelector("#upcomingRecordings"), result.Items), loading.hide() renderTimers(context.querySelector("#upcomingRecordings"), result.Items);
}) loading.hide();
});
} }
return function(view, params, tabContent) {
var activeRecordingsPromise, upcomingRecordingsPromise, self = this; return function (view, params, tabContent) {
tabContent.querySelector("#upcomingRecordings .recordingItems").addEventListener("timercancelled", function() { var activeRecordingsPromise;
self.preRender(), self.renderTab() var upcomingRecordingsPromise;
}), self.preRender = function() { var self = this;
tabContent.querySelector("#upcomingRecordings .recordingItems").addEventListener("timercancelled", function () {
self.preRender();
self.renderTab();
});
self.preRender = function () {
activeRecordingsPromise = ApiClient.getLiveTvRecordings({ activeRecordingsPromise = ApiClient.getLiveTvRecordings({
UserId: Dashboard.getCurrentUserId(), UserId: Dashboard.getCurrentUserId(),
IsInProgress: !0, IsInProgress: true,
Fields: "CanDelete,PrimaryImageAspectRatio,BasicSyncInfo", Fields: "CanDelete,PrimaryImageAspectRatio,BasicSyncInfo",
EnableTotalRecordCount: !1, EnableTotalRecordCount: false,
EnableImageTypes: "Primary,Thumb,Backdrop" EnableImageTypes: "Primary,Thumb,Backdrop"
}), upcomingRecordingsPromise = ApiClient.getLiveTvTimers({ });
IsActive: !1, upcomingRecordingsPromise = ApiClient.getLiveTvTimers({
IsScheduled: !0 IsActive: false,
}) IsScheduled: true
}, self.renderTab = function() { });
loading.show(), renderActiveRecordings(tabContent, activeRecordingsPromise), renderUpcomingRecordings(tabContent, upcomingRecordingsPromise) };
}
} 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"; "use strict";
function renderTimers(context, timers) { function renderTimers(context, timers) {
@ -8,36 +8,44 @@ define(["datetime", "cardBuilder", "imageLoader", "apphost", "loading", "paper-i
items: timers, items: timers,
shape: "auto", shape: "auto",
defaultShape: "portrait", defaultShape: "portrait",
showTitle: !0, showTitle: true,
cardLayout: !1, cardLayout: false,
preferThumb: "auto", preferThumb: "auto",
coverImage: !0, coverImage: true,
overlayText: !1, overlayText: false,
showSeriesTimerTime: !0, showSeriesTimerTime: true,
showSeriesTimerChannel: !0, showSeriesTimerChannel: true,
centerText: !0, centerText: true,
overlayMoreButton: !0, overlayMoreButton: true,
lines: 3 lines: 3
}); });
var elem = context.querySelector("#items"); 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) { function reload(context, promise) {
loading.show(), promise.then(function(result) { loading.show();
renderTimers(context, result.Items) promise.then(function (result) {
}) renderTimers(context, result.Items);
});
} }
var query = { var query = {
SortBy: "SortName", SortBy: "SortName",
SortOrder: "Ascending" SortOrder: "Ascending"
}; };
return function(view, params, tabContent) { return function (view, params, tabContent) {
var timersPromise, self = this; var timersPromise;
self.preRender = function() { var self = this;
timersPromise = ApiClient.getLiveTvSeriesTimers(query)
}, self.renderTab = function() { self.preRender = function () {
reload(tabContent, timersPromise) timersPromise = ApiClient.getLiveTvSeriesTimers(query);
} };
}
self.renderTab = function () {
reload(tabContent, timersPromise);
};
};
}); });

View file

@ -23,6 +23,7 @@ define(["layoutManager", "userSettings", "inputManager", "loading", "globalize",
if (enableScrollX()) { if (enableScrollX()) {
return 12; return 12;
} }
return 9; return 9;
} }
@ -150,15 +151,22 @@ define(["layoutManager", "userSettings", "inputManager", "loading", "globalize",
} }
function getTabs() { function getTabs() {
return [ return [{
{ name: globalize.translate("Programs") }, name: globalize.translate("Programs")
{ name: globalize.translate("TabGuide") }, }, {
{ name: globalize.translate("TabChannels") }, name: globalize.translate("TabGuide")
{ name: globalize.translate("TabRecordings") }, }, {
{ name: globalize.translate("HeaderSchedule") }, name: globalize.translate("TabChannels")
{ name: globalize.translate("TabSeries") }, }, {
{ name: globalize.translate("ButtonSearch"), cssClass: "searchTabButton" } name: globalize.translate("TabRecordings")
]; }, {
name: globalize.translate("HeaderSchedule")
}, {
name: globalize.translate("TabSeries")
}, {
name: globalize.translate("ButtonSearch"),
cssClass: "searchTabButton"
}];
} }
function setScrollClasses(elem, scrollX) { function setScrollClasses(elem, scrollX) {
@ -183,6 +191,7 @@ define(["layoutManager", "userSettings", "inputManager", "loading", "globalize",
if (userSettings.get("landing-" + folderId) === "guide") { if (userSettings.get("landing-" + folderId) === "guide") {
return 1; return 1;
} }
return 0; return 0;
} }
@ -220,21 +229,27 @@ define(["layoutManager", "userSettings", "inputManager", "loading", "globalize",
switch (index) { switch (index) {
case 0: case 0:
break; break;
case 1: case 1:
depends.push("controllers/livetv/livetvguide"); depends.push("controllers/livetv/livetvguide");
break; break;
case 2: case 2:
depends.push("controllers/livetv/livetvchannels"); depends.push("controllers/livetv/livetvchannels");
break; break;
case 3: case 3:
depends.push("controllers/livetv/livetvrecordings"); depends.push("controllers/livetv/livetvrecordings");
break; break;
case 4: case 4:
depends.push("controllers/livetv/livetvschedule"); depends.push("controllers/livetv/livetvschedule");
break; break;
case 5: case 5:
depends.push("controllers/livetv/livetvseriestimers"); depends.push("controllers/livetv/livetvseriestimers");
break; break;
case 6: case 6:
depends.push("scripts/searchtab"); depends.push("scripts/searchtab");
} }
@ -251,6 +266,7 @@ define(["layoutManager", "userSettings", "inputManager", "loading", "globalize",
if (!controller) { if (!controller) {
tabContent = view.querySelector(".pageTabContent[data-index='" + index + "']"); tabContent = view.querySelector(".pageTabContent[data-index='" + index + "']");
if (0 === index) { if (0 === index) {
controller = self; controller = self;
} else if (6 === index) { } else if (6 === index) {
@ -260,6 +276,7 @@ define(["layoutManager", "userSettings", "inputManager", "loading", "globalize",
} else { } else {
controller = new controllerFactory(view, params, tabContent); controller = new controllerFactory(view, params, tabContent);
} }
tabControllers[index] = controller; tabControllers[index] = controller;
if (controller.initTab) { if (controller.initTab) {
@ -347,15 +364,18 @@ define(["layoutManager", "userSettings", "inputManager", "loading", "globalize",
}); });
view.addEventListener("viewshow", function (evt) { view.addEventListener("viewshow", function (evt) {
isViewRestored = evt.detail.isRestored; isViewRestored = evt.detail.isRestored;
if (!isViewRestored) { if (!isViewRestored) {
mainTabsManager.selectedTabIndex(initialTabIndex); mainTabsManager.selectedTabIndex(initialTabIndex);
} }
inputManager.on(window, onInputCommand); inputManager.on(window, onInputCommand);
}); });
view.addEventListener("viewbeforehide", function (e__u) { view.addEventListener("viewbeforehide", function (e) {
if (currentTabController && currentTabController.onHide) { if (currentTabController && currentTabController.onHide) {
currentTabController.onHide(); currentTabController.onHide();
} }
inputManager.off(window, onInputCommand); inputManager.off(window, onInputCommand);
}); });
view.addEventListener("viewdestroy", function (evt) { 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"; "use strict";
function onListingsSubmitted() { function onListingsSubmitted() {
Dashboard.navigate("livetvstatus.html") Dashboard.navigate("livetvstatus.html");
} }
function init(page, type, providerId) { function init(page, type, providerId) {
var url = "components/tvproviders/" + type + ".js"; var url = "components/tvproviders/" + type + ".js";
require([url], function(factory) {
require([url], function (factory) {
var instance = new factory(page, providerId, {}); 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) { function loadTemplate(page, type, providerId) {
require(["text!./components/tvproviders/" + type + ".template.html"], function(html) { require(["text!./components/tvproviders/" + type + ".template.html"], function (html) {
page.querySelector(".providerTemplate").innerHTML = Globalize.translateDocument(html), init(page, type, providerId) page.querySelector(".providerTemplate").innerHTML = Globalize.translateDocument(html);
}) init(page, type, providerId);
});
} }
pageIdOn("pageshow", "liveTvGuideProviderPage", function() {
pageIdOn("pageshow", "liveTvGuideProviderPage", function () {
loading.show(); loading.show();
var providerId = getParameterByName("id"); 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"; "use strict";
function loadPage(page, config) { 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() { function onSubmit() {
loading.show(); loading.show();
var form = this; var form = this;
return ApiClient.getNamedConfiguration("livetv").then(function(config) { ApiClient.getNamedConfiguration("livetv").then(function (config) {
config.GuideDays = $("#selectGuideDays", form).val() || null; config.GuideDays = $("#selectGuideDays", form).val() || null;
var recordingPath = form.querySelector("#txtRecordingPath").value || null, var recordingPath = form.querySelector("#txtRecordingPath").value || null;
movieRecordingPath = form.querySelector("#txtMovieRecordingPath").value || null, var movieRecordingPath = form.querySelector("#txtMovieRecordingPath").value || null;
seriesRecordingPath = form.querySelector("#txtSeriesRecordingPath").value || null, var seriesRecordingPath = form.querySelector("#txtSeriesRecordingPath").value || null;
recordingPathChanged = recordingPath != config.RecordingPath || movieRecordingPath != config.MovieRecordingPath || seriesRecordingPath != config.SeriesRecordingPath; 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() { config.RecordingPath = recordingPath;
Dashboard.processServerConfigurationUpdateResult(), showSaveMessage(recordingPathChanged) config.MovieRecordingPath = movieRecordingPath;
}) config.SeriesRecordingPath = seriesRecordingPath;
}), !1 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) { function showSaveMessage(recordingPathChanged) {
var msg = ""; var msg = "";
recordingPathChanged && (msg += Globalize.translate("RecordingPathChangeMessage")), msg && require(["alert"], function(alert) {
alert(msg) if (recordingPathChanged) {
}) msg += Globalize.translate("RecordingPathChangeMessage");
} }
$(document).on("pageinit", "#liveTvSettingsPage", function() {
if (msg) {
require(["alert"], function (alert) {
alert(msg);
});
}
}
$(document).on("pageinit", "#liveTvSettingsPage", function () {
var page = this; var page = this;
$(".liveTvSettingsForm").off("submit", onSubmit).on("submit", onSubmit), $("#btnSelectRecordingPath", page).on("click.selectDirectory", function() { $(".liveTvSettingsForm").off("submit", onSubmit).on("submit", onSubmit);
require(["directorybrowser"], function(directoryBrowser) { $("#btnSelectRecordingPath", page).on("click.selectDirectory", function () {
var picker = new directoryBrowser; require(["directorybrowser"], function (directoryBrowser) {
var picker = new directoryBrowser();
picker.show({ picker.show({
callback: function(path) { callback: function (path) {
path && $("#txtRecordingPath", page).val(path), picker.close() if (path) {
}, $("#txtRecordingPath", page).val(path);
validateWriteable: !0
})
})
}), $("#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()
},
validateWriteable: !0
})
})
}), $("#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()
},
validateWriteable: !0
})
})
}), $("#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()
} }
})
}) picker.close();
}) },
}).on("pageshow", "#liveTvSettingsPage", function() { validateWriteable: true
});
});
});
$("#btnSelectMovieRecordingPath", page).on("click.selectDirectory", function () {
require(["directorybrowser"], function (directoryBrowser) {
var picker = new directoryBrowser();
picker.show({
callback: function (path) {
if (path) {
$("#txtMovieRecordingPath", page).val(path);
}
picker.close();
},
validateWriteable: true
});
});
});
$("#btnSelectSeriesRecordingPath", page).on("click.selectDirectory", function () {
require(["directorybrowser"], function (directoryBrowser) {
var picker = new directoryBrowser();
picker.show({
callback: function (path) {
if (path) {
$("#txtSeriesRecordingPath", page).val(path);
}
picker.close();
},
validateWriteable: true
});
});
});
$("#btnSelectPostProcessorPath", page).on("click.selectDirectory", function () {
require(["directorybrowser"], function (directoryBrowser) {
var picker = new directoryBrowser();
picker.show({
includeFiles: true,
callback: function (path) {
if (path) {
$("#txtPostProcessor", page).val(path);
}
picker.close();
}
});
});
});
}).on("pageshow", "#liveTvSettingsPage", function () {
loading.show(); loading.show();
var page = this; var page = this;
ApiClient.getNamedConfiguration("livetv").then(function(config) { ApiClient.getNamedConfiguration("livetv").then(function (config) {
loadPage(page, 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"; "use strict";
function getDeviceHtml(device) { function getDeviceHtml(device) {
var padderClass, html = "", var padderClass;
cssClass = "card scalableCard", var html = "";
cardBoxCssClass = "cardBox visualCardBox"; var cssClass = "card scalableCard";
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 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) { function renderDevices(page, devices) {
var html = devices.map(getDeviceHtml).join(""); var html = devices.map(getDeviceHtml).join("");
page.querySelector(".devicesList").innerHTML = html page.querySelector(".devicesList").innerHTML = html;
} }
function deleteDevice(page, id) { function deleteDevice(page, id) {
var message = globalize.translate("MessageConfirmDeleteTunerDevice"); var message = globalize.translate("MessageConfirmDeleteTunerDevice");
require(["confirm"], function(confirm) {
confirm(message, globalize.translate("HeaderDeleteDevice")).then(function() { require(["confirm"], function (confirm) {
loading.show(), ApiClient.ajax({ confirm(message, globalize.translate("HeaderDeleteDevice")).then(function () {
loading.show();
ApiClient.ajax({
type: "DELETE", type: "DELETE",
url: ApiClient.getUrl("LiveTv/TunerHosts", { url: ApiClient.getUrl("LiveTv/TunerHosts", {
Id: id Id: id
}) })
}).then(function() { }).then(function () {
reload(page) reload(page);
}) });
}) });
}) });
} }
function reload(page) { function reload(page) {
loading.show(), ApiClient.getNamedConfiguration("livetv").then(function(config) { loading.show();
renderDevices(page, config.TunerHosts), renderProviders(page, config.ListingProviders) ApiClient.getNamedConfiguration("livetv").then(function (config) {
}), loading.hide() renderDevices(page, config.TunerHosts);
renderProviders(page, config.ListingProviders);
});
loading.hide();
} }
function submitAddDeviceForm(page) { function submitAddDeviceForm(page) {
page.querySelector(".dlgAddDevice").close(), loading.show(), ApiClient.ajax({ page.querySelector(".dlgAddDevice").close();
loading.show();
ApiClient.ajax({
type: "POST", type: "POST",
url: ApiClient.getUrl("LiveTv/TunerHosts"), url: ApiClient.getUrl("LiveTv/TunerHosts"),
data: JSON.stringify({ data: JSON.stringify({
@ -44,30 +77,47 @@ define(["jQuery", "globalize", "scripts/taskbutton", "dom", "libraryMenu", "layo
Url: $("#txtDevicePath", page).val() Url: $("#txtDevicePath", page).val()
}), }),
contentType: "application/json" contentType: "application/json"
}).then(function() { }).then(function () {
reload(page) reload(page);
}, function() { }, function () {
Dashboard.alert({ Dashboard.alert({
message: globalize.translate("ErrorAddingTunerDevice") message: globalize.translate("ErrorAddingTunerDevice")
}) });
}) });
} }
function renderProviders(page, providers) { function renderProviders(page, providers) {
var html = ""; var html = "";
if (providers.length) { if (providers.length) {
html += '<div class="paperList">'; html += '<div class="paperList">';
for (var i = 0, length = providers.length; i < length; i++) { for (var i = 0, length = providers.length; i < length; i++) {
var provider = providers[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); var elem = $(".providerList", page).html(html);
$(".btnOptions", elem).on("click", function() { $(".btnOptions", elem).on("click", function () {
var id = this.getAttribute("data-id"); var id = this.getAttribute("data-id");
showProviderOptions(page, id, this) showProviderOptions(page, id, this);
}) });
} }
function showProviderOptions(page, providerId, button) { function showProviderOptions(page, providerId, button) {
@ -75,64 +125,74 @@ define(["jQuery", "globalize", "scripts/taskbutton", "dom", "libraryMenu", "layo
items.push({ items.push({
name: globalize.translate("ButtonDelete"), name: globalize.translate("ButtonDelete"),
id: "delete" id: "delete"
}), items.push({ });
items.push({
name: globalize.translate("MapChannels"), name: globalize.translate("MapChannels"),
id: "map" id: "map"
}), require(["actionsheet"], function(actionsheet) { });
require(["actionsheet"], function (actionsheet) {
actionsheet.show({ actionsheet.show({
items: items, items: items,
positionTo: button positionTo: button
}).then(function(id) { }).then(function (id) {
switch (id) { switch (id) {
case "delete": case "delete":
deleteProvider(page, providerId); deleteProvider(page, providerId);
break; break;
case "map": case "map":
mapChannels(page, providerId) mapChannels(page, providerId);
} }
}) });
}) });
} }
function mapChannels(page, providerId) { function mapChannels(page, providerId) {
require(["components/channelmapper/channelmapper"], function(channelmapper) { require(["components/channelmapper/channelmapper"], function (channelmapper) {
new channelmapper({ new channelmapper({
serverId: ApiClient.serverInfo().Id, serverId: ApiClient.serverInfo().Id,
providerId: providerId providerId: providerId
}).show() }).show();
}) });
} }
function deleteProvider(page, id) { function deleteProvider(page, id) {
var message = globalize.translate("MessageConfirmDeleteGuideProvider"); var message = globalize.translate("MessageConfirmDeleteGuideProvider");
require(["confirm"], function(confirm) {
confirm(message, globalize.translate("HeaderDeleteProvider")).then(function() { require(["confirm"], function (confirm) {
loading.show(), ApiClient.ajax({ confirm(message, globalize.translate("HeaderDeleteProvider")).then(function () {
loading.show();
ApiClient.ajax({
type: "DELETE", type: "DELETE",
url: ApiClient.getUrl("LiveTv/ListingProviders", { url: ApiClient.getUrl("LiveTv/ListingProviders", {
Id: id Id: id
}) })
}).then(function() { }).then(function () {
reload(page) reload(page);
}, function() { }, function () {
reload(page) reload(page);
}) });
}) });
}) });
} }
function getTunerName(providerId) { function getTunerName(providerId) {
switch (providerId = providerId.toLowerCase()) { switch (providerId = providerId.toLowerCase()) {
case "m3u": case "m3u":
return "M3U"; return "M3U";
case "hdhomerun": case "hdhomerun":
return "HDHomerun"; return "HDHomerun";
case "hauppauge": case "hauppauge":
return "Hauppauge"; return "Hauppauge";
case "satip": case "satip":
return "DVB"; return "DVB";
default: default:
return "Unknown" return "Unknown";
} }
} }
@ -140,12 +200,15 @@ define(["jQuery", "globalize", "scripts/taskbutton", "dom", "libraryMenu", "layo
switch (providerId = providerId.toLowerCase()) { switch (providerId = providerId.toLowerCase()) {
case "schedulesdirect": case "schedulesdirect":
return "Schedules Direct"; return "Schedules Direct";
case "xmltv": case "xmltv":
return "Xml TV"; return "Xml TV";
case "emby": case "emby":
return "Emby Guide"; return "Emby Guide";
default: default:
return "Unknown" return "Unknown";
} }
} }
@ -153,10 +216,12 @@ define(["jQuery", "globalize", "scripts/taskbutton", "dom", "libraryMenu", "layo
switch (providerId = providerId.toLowerCase()) { switch (providerId = providerId.toLowerCase()) {
case "xmltv": case "xmltv":
return "livetvguideprovider.html?type=xmltv"; return "livetvguideprovider.html?type=xmltv";
case "schedulesdirect": case "schedulesdirect":
return "livetvguideprovider.html?type=schedulesdirect"; return "livetvguideprovider.html?type=schedulesdirect";
case "emby": 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({ menuItems.push({
name: "Schedules Direct", name: "Schedules Direct",
id: "SchedulesDirect" id: "SchedulesDirect"
}), menuItems.push({ });
menuItems.push({
name: "Xml TV", name: "Xml TV",
id: "xmltv" id: "xmltv"
}), require(["actionsheet"], function(actionsheet) { });
require(["actionsheet"], function (actionsheet) {
actionsheet.show({ actionsheet.show({
items: menuItems, items: menuItems,
positionTo: button, positionTo: button,
callback: function(id) { callback: function (id) {
Dashboard.navigate(getProviderConfigurationUrl(id)) Dashboard.navigate(getProviderConfigurationUrl(id));
} }
}) });
}) });
} }
function addDevice(button) { function addDevice(button) {
Dashboard.navigate("livetvtuner.html") Dashboard.navigate("livetvtuner.html");
} }
function showDeviceMenu(button, tunerDeviceId) { function showDeviceMenu(button, tunerDeviceId) {
@ -188,57 +256,73 @@ define(["jQuery", "globalize", "scripts/taskbutton", "dom", "libraryMenu", "layo
items.push({ items.push({
name: globalize.translate("ButtonDelete"), name: globalize.translate("ButtonDelete"),
id: "delete" id: "delete"
}), items.push({ });
items.push({
name: globalize.translate("ButtonEdit"), name: globalize.translate("ButtonEdit"),
id: "edit" id: "edit"
}), require(["actionsheet"], function(actionsheet) { });
require(["actionsheet"], function (actionsheet) {
actionsheet.show({ actionsheet.show({
items: items, items: items,
positionTo: button positionTo: button
}).then(function(id) { }).then(function (id) {
switch (id) { switch (id) {
case "delete": case "delete":
deleteDevice(dom.parentWithClass(button, "page"), tunerDeviceId); deleteDevice(dom.parentWithClass(button, "page"), tunerDeviceId);
break; break;
case "edit": case "edit":
Dashboard.navigate("livetvtuner.html?id=" + tunerDeviceId) Dashboard.navigate("livetvtuner.html?id=" + tunerDeviceId);
} }
}) });
}) });
} }
function onDevicesListClick(e) { function onDevicesListClick(e) {
var card = dom.parentWithClass(e.target, "card"); var card = dom.parentWithClass(e.target, "card");
if (card) { if (card) {
var id = card.getAttribute("data-id"), var id = card.getAttribute("data-id");
btnCardOptions = dom.parentWithClass(e.target, "btnCardOptions"); var btnCardOptions = dom.parentWithClass(e.target, "btnCardOptions");
btnCardOptions ? showDeviceMenu(btnCardOptions, id) : Dashboard.navigate("livetvtuner.html?id=" + id)
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; var page = this;
$(".btnAddDevice", page).on("click", function() { $(".btnAddDevice", page).on("click", function () {
addDevice(this) addDevice(this);
}), $(".formAddDevice", page).on("submit", function() { });
return submitAddDeviceForm(page), !1 $(".formAddDevice", page).on("submit", function () {
}), $(".btnAddProvider", page).on("click", function() { submitAddDeviceForm(page);
addProvider(this) return false;
}), page.querySelector(".devicesList").addEventListener("click", onDevicesListClick) });
}).on("pageshow", "#liveTvStatusPage", function() { $(".btnAddProvider", page).on("click", function () {
addProvider(this);
});
page.querySelector(".devicesList").addEventListener("click", onDevicesListClick);
}).on("pageshow", "#liveTvStatusPage", function () {
var page = this; var page = this;
reload(page), taskButton({ reload(page);
taskButton({
mode: "on", mode: "on",
progressElem: page.querySelector(".refreshGuideProgress"), progressElem: page.querySelector(".refreshGuideProgress"),
taskKey: "RefreshGuide", taskKey: "RefreshGuide",
button: page.querySelector(".btnRefresh") button: page.querySelector(".btnRefresh")
}) });
}).on("pagehide", "#liveTvStatusPage", function() { }).on("pagehide", "#liveTvStatusPage", function () {
var page = this; var page = this;
taskButton({ taskButton({
mode: "off", mode: "off",
progressElem: page.querySelector(".refreshGuideProgress"), progressElem: page.querySelector(".refreshGuideProgress"),
taskKey: "RefreshGuide", taskKey: "RefreshGuide",
button: page.querySelector(".btnRefresh") 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"; "use strict";
function isM3uVariant(type) { function isM3uVariant(type) {
@ -6,17 +6,16 @@ define(["globalize", "loading", "libraryMenu", "dom", "emby-input", "emby-button
} }
function fillTypes(view, currentId) { 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 selectType = view.querySelector(".selectType");
var html = ""; var html = "";
html += types.map(function(tuner) { html += types.map(function (tuner) {
return '<option value="' + tuner.Id + '">' + tuner.Name + "</option>"; return '<option value="' + tuner.Id + '">' + tuner.Name + "</option>";
}).join(""); }).join("");
html += '<option value="other">'; html += '<option value="other">';
html += globalize.translate("TabOther"); html += globalize.translate("TabOther");
html += "</option>"; html += "</option>";
selectType.innerHTML = html; selectType.innerHTML = html;
selectType.disabled = null != currentId; selectType.disabled = null != currentId;
selectType.value = ""; selectType.value = "";
onTypeChange.call(selectType); onTypeChange.call(selectType);
@ -27,9 +26,10 @@ define(["globalize", "loading", "libraryMenu", "dom", "emby-input", "emby-button
view.querySelector(".txtDevicePath").value = ""; view.querySelector(".txtDevicePath").value = "";
view.querySelector(".chkFavorite").checked = false; view.querySelector(".chkFavorite").checked = false;
view.querySelector(".txtDevicePath").value = ""; view.querySelector(".txtDevicePath").value = "";
if (providerId) { if (providerId) {
ApiClient.getNamedConfiguration("livetv").then(function(config) { ApiClient.getNamedConfiguration("livetv").then(function (config) {
var info = config.TunerHosts.filter(function(i) { var info = config.TunerHosts.filter(function (i) {
return i.Id === providerId; return i.Id === providerId;
})[0]; })[0];
fillTunerHostInfo(view, info); fillTunerHostInfo(view, info);
@ -40,9 +40,11 @@ define(["globalize", "loading", "libraryMenu", "dom", "emby-input", "emby-button
function fillTunerHostInfo(view, info) { function fillTunerHostInfo(view, info) {
var selectType = view.querySelector(".selectType"); var selectType = view.querySelector(".selectType");
var type = info.Type || ""; var type = info.Type || "";
if (info.Source && isM3uVariant(info.Source)) { if (info.Source && isM3uVariant(info.Source)) {
type = info.Source; type = info.Source;
} }
selectType.value = type; selectType.value = type;
onTypeChange.call(selectType); onTypeChange.call(selectType);
view.querySelector(".txtDevicePath").value = info.Url || ""; view.querySelector(".txtDevicePath").value = info.Url || "";
@ -68,76 +70,164 @@ define(["globalize", "loading", "libraryMenu", "dom", "emby-input", "emby-button
AllowHWTranscoding: page.querySelector(".chkTranscode").checked, AllowHWTranscoding: page.querySelector(".chkTranscode").checked,
EnableStreamLooping: page.querySelector(".chkStreamLoop").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"); var id = getParameterByName("id");
id && (info.Id = id);
if (id) {
info.Id = id;
}
info.Id; info.Id;
ApiClient.ajax({ ApiClient.ajax({
type: "POST", type: "POST",
url: ApiClient.getUrl("LiveTv/TunerHosts"), url: ApiClient.getUrl("LiveTv/TunerHosts"),
data: JSON.stringify(info), data: JSON.stringify(info),
contentType: "application/json" contentType: "application/json"
}).then(function(result) { }).then(function (result) {
Dashboard.processServerConfigurationUpdateResult(), Dashboard.navigate("livetvstatus.html") Dashboard.processServerConfigurationUpdateResult();
}, function() { Dashboard.navigate("livetvstatus.html");
loading.hide(), Dashboard.alert({ }, function () {
loading.hide();
Dashboard.alert({
message: globalize.translate("ErrorSavingTvProvider") message: globalize.translate("ErrorSavingTvProvider")
}) });
}) });
} }
function getRequirePromise(deps) { function getRequirePromise(deps) {
return new Promise(function(resolve, reject) { return new Promise(function (resolve, reject) {
require(deps, resolve) require(deps, resolve);
}) });
} }
function getDetectedDevice() { function getDetectedDevice() {
return getRequirePromise(["tunerPicker"]).then(function(tunerPicker) { return getRequirePromise(["tunerPicker"]).then(function (tunerPicker) {
return (new tunerPicker).show({ return new tunerPicker().show({
serverId: ApiClient.serverId() serverId: ApiClient.serverId()
}) });
}) });
} }
function onTypeChange() { function onTypeChange() {
var value = this.value, var value = this.value;
view = dom.parentWithClass(this, "page"), var view = dom.parentWithClass(this, "page");
mayIncludeUnsupportedDrmChannels = "hdhomerun" === value, var mayIncludeUnsupportedDrmChannels = "hdhomerun" === value;
supportsTranscoding = "hdhomerun" === value, var supportsTranscoding = "hdhomerun" === value;
supportsFavorites = "hdhomerun" === value, var supportsFavorites = "hdhomerun" === value;
supportsTunerIpAddress = "hdhomerun" === value, var supportsTunerIpAddress = "hdhomerun" === value;
supportsTunerFileOrUrl = "m3u" === value, var supportsTunerFileOrUrl = "m3u" === value;
supportsStreamLooping = "m3u" === value, var supportsStreamLooping = "m3u" === value;
supportsTunerCount = "m3u" === value, var supportsTunerCount = "m3u" === value;
supportsUserAgent = "m3u" === value, var supportsUserAgent = "m3u" === value;
suppportsSubmit = "other" !== value, var suppportsSubmit = "other" !== value;
supportsSelectablePath = supportsTunerFileOrUrl, var supportsSelectablePath = supportsTunerFileOrUrl;
txtDevicePath = view.querySelector(".txtDevicePath"); var 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")
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");
} }
return function(view, params) {
params.id || view.querySelector(".btnDetect").classList.remove("hide"), view.addEventListener("viewshow", function() { 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) {
if (!params.id) {
view.querySelector(".btnDetect").classList.remove("hide");
}
view.addEventListener("viewshow", function () {
var currentId = params.id; var currentId = params.id;
fillTypes(view, currentId).then(function() { fillTypes(view, currentId).then(function () {
reload(view, currentId) reload(view, currentId);
}) });
}), view.querySelector("form").addEventListener("submit", function(e) { });
return submitForm(view), e.preventDefault(), e.stopPropagation(), !1 view.querySelector("form").addEventListener("submit", function (e) {
}), view.querySelector(".selectType").addEventListener("change", onTypeChange), view.querySelector(".btnDetect").addEventListener("click", function() { submitForm(view);
getDetectedDevice().then(function(info) { e.preventDefault();
fillTunerHostInfo(view, info) e.stopPropagation();
}) return false;
}), view.querySelector(".btnSelectPath").addEventListener("click", function() { });
require(["directorybrowser"], function(directoryBrowser) { view.querySelector(".selectType").addEventListener("change", onTypeChange);
var picker = new directoryBrowser; 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({ picker.show({
includeFiles: !0, includeFiles: true,
callback: function(path) { callback: function (path) {
path && (view.querySelector(".txtDevicePath").value = path), picker.close() 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"; "use strict";
function loadPage(page, config, users) { function loadPage(page, config, users) {
var html = '<option value="" selected="selected">' + Globalize.translate("OptionNone") + "</option>"; var html = '<option value="" selected="selected">' + Globalize.translate("OptionNone") + "</option>";
html += users.map(function(user) { html += users.map(function (user) {
return '<option value="' + user.Id + '">' + user.Name + "</option>" 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() }).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() { function onSubmit() {
loading.show(); loading.show();
var form = this; var form = this;
return ApiClient.getNamedConfiguration(metadataKey).then(function(config) { 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() { config.UserId = $("#selectUser", form).val() || null;
Dashboard.processServerConfigurationUpdateResult(), showConfirmMessage(config) config.ReleaseDateFormat = $("#selectReleaseDateFormat", form).val();
}) config.SaveImagePathsInNfo = form.querySelector("#chkSaveImagePaths").checked;
}), !1 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) { function showConfirmMessage(config) {
var msg = []; var msg = [];
msg.push(Globalize.translate("MetadataSettingChangeHelp")), require(["alert"], function(alert) { msg.push(Globalize.translate("MetadataSettingChangeHelp"));
require(["alert"], function (alert) {
alert({ alert({
text: msg.join("<br/><br/>") text: msg.join("<br/><br/>")
}) });
}) });
} }
function getTabs() { function getTabs() {
@ -40,19 +55,20 @@ define(["jQuery", "loading", "libraryMenu"], function($, loading, libraryMenu) {
}, { }, {
href: "metadatanfo.html", href: "metadatanfo.html",
name: Globalize.translate("TabNfoSettings") name: Globalize.translate("TabNfoSettings")
}] }];
} }
var metadataKey = "xbmcmetadata"; var metadataKey = "xbmcmetadata";
$(document).on("pageinit", "#metadataNfoPage", function() { $(document).on("pageinit", "#metadataNfoPage", function () {
$(".metadataNfoForm").off("submit", onSubmit).on("submit", onSubmit) $(".metadataNfoForm").off("submit", onSubmit).on("submit", onSubmit);
}).on("pageshow", "#metadataNfoPage", function() { }).on("pageshow", "#metadataNfoPage", function () {
libraryMenu.setTabs("metadata", 3, getTabs), loading.show(); libraryMenu.setTabs("metadata", 3, getTabs);
var page = this, loading.show();
promise1 = ApiClient.getUsers(), var page = this;
promise2 = ApiClient.getNamedConfiguration(metadataKey); var promise1 = ApiClient.getUsers();
Promise.all([promise1, promise2]).then(function(responses) { var promise2 = ApiClient.getNamedConfiguration(metadataKey);
loadPage(page, responses[1], responses[0]) 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"; "use strict";
return function(view, params, tabContent) {
return function (view, params, tabContent) {
function getPageData(context) { function getPageData(context) {
var key = getSavedQueryKey(context), var key = getSavedQueryKey(context);
pageData = data[key]; var pageData = data[key];
if (!pageData) { if (!pageData) {
pageData = data[key] = { pageData = data[key] = {
query: { query: {
@ -22,112 +24,168 @@ define(["loading", "events", "libraryBrowser", "imageLoader", "listView", "cardB
pageData.query.ParentId = params.topParentId; pageData.query.ParentId = params.topParentId;
libraryBrowser.loadSavedQueryValues(key, pageData.query); libraryBrowser.loadSavedQueryValues(key, pageData.query);
} }
return pageData; return pageData;
} }
function getQuery(context) { function getQuery(context) {
return getPageData(context).query return getPageData(context).query;
} }
function getSavedQueryKey(context) { 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() { function onViewStyleChange() {
var viewStyle = self.getCurrentViewStyle(), var viewStyle = self.getCurrentViewStyle();
itemsContainer = tabContent.querySelector(".itemsContainer"); var 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 = ""
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) { function reloadItems(page) {
loading.show(); loading.show();
isLoading = true; isLoading = true;
var query = getQuery(page); var query = getQuery(page);
ApiClient.getItems(ApiClient.getCurrentUserId(), query).then(function(result) { ApiClient.getItems(ApiClient.getCurrentUserId(), query).then(function (result) {
function onNextPageClick() { function onNextPageClick() {
if (isLoading) return; if (isLoading) {
query.StartIndex += query.Limit, reloadItems(tabContent) return;
}
query.StartIndex += query.Limit;
reloadItems(tabContent);
} }
function onPreviousPageClick() { function onPreviousPageClick() {
if (isLoading) return; if (isLoading) {
query.StartIndex -= query.Limit, reloadItems(tabContent) return;
} }
query.StartIndex -= query.Limit;
reloadItems(tabContent);
}
window.scrollTo(0, 0); window.scrollTo(0, 0);
var html, pagingHtml = libraryBrowser.getQueryPagingHtml({ var html;
var pagingHtml = libraryBrowser.getQueryPagingHtml({
startIndex: query.StartIndex, startIndex: query.StartIndex,
limit: query.Limit, limit: query.Limit,
totalRecordCount: result.TotalRecordCount, totalRecordCount: result.TotalRecordCount,
showLimit: !1, showLimit: false,
updatePageSizeSetting: !1, updatePageSizeSetting: false,
addLayoutButton: !1, addLayoutButton: false,
sortButton: !1, sortButton: false,
filterButton: !1 filterButton: false
}), });
viewStyle = self.getCurrentViewStyle(); var viewStyle = self.getCurrentViewStyle();
html = "Thumb" == viewStyle ? cardBuilder.getCardsHtml({ if (viewStyle == "Thumb") {
html = cardBuilder.getCardsHtml({
items: result.Items, items: result.Items,
shape: "backdrop", shape: "backdrop",
preferThumb: !0, preferThumb: true,
context: "movies", context: "movies",
overlayPlayButton: !0, overlayPlayButton: true,
centerText: !0, centerText: true,
showTitle: !0 showTitle: true
}) : "ThumbCard" == viewStyle ? cardBuilder.getCardsHtml({ });
} else if (viewStyle == "ThumbCard") {
html = cardBuilder.getCardsHtml({
items: result.Items, items: result.Items,
shape: "backdrop", shape: "backdrop",
preferThumb: !0, preferThumb: true,
context: "movies", context: "movies",
lazy: !0, lazy: true,
cardLayout: !0, cardLayout: true,
showTitle: !0 showTitle: true
}) : "Banner" == viewStyle ? cardBuilder.getCardsHtml({ });
} else if (viewStyle == "Banner") {
html = cardBuilder.getCardsHtml({
items: result.Items, items: result.Items,
shape: "banner", shape: "banner",
preferBanner: !0, preferBanner: true,
context: "movies", context: "movies",
lazy: !0 lazy: true
}) : "List" == viewStyle ? listView.getListViewHtml({ });
} else if (viewStyle == "List") {
html = listView.getListViewHtml({
items: result.Items, items: result.Items,
context: "movies", context: "movies",
sortBy: query.SortBy 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 i, length, elems = tabContent.querySelectorAll(".paging"); } else if (viewStyle == "PosterCard") {
for (i = 0, length = elems.length; i < length; i++) elems[i].innerHTML = pagingHtml; html = cardBuilder.getCardsHtml({
for (elems = tabContent.querySelectorAll(".btnNextPage"), i = 0, length = elems.length; i < length; i++) elems[i].addEventListener("click", onNextPageClick); items: result.Items,
for (elems = tabContent.querySelectorAll(".btnPreviousPage"), i = 0, length = elems.length; i < length; i++) elems[i].addEventListener("click", onPreviousPageClick); shape: "auto",
result.Items.length || (html = '<p style="text-align:center;">' + Globalize.translate("MessageNoCollectionsAvailable") + "</p>"); 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"); var itemsContainer = tabContent.querySelector(".itemsContainer");
itemsContainer.innerHTML = html; itemsContainer.innerHTML = html;
imageLoader.lazyChildren(itemsContainer); imageLoader.lazyChildren(itemsContainer);
libraryBrowser.saveQueryValues(getSavedQueryKey(page), query); libraryBrowser.saveQueryValues(getSavedQueryKey(page), query);
loading.hide(); loading.hide();
isLoading = false; isLoading = false;
}) });
} }
var self = this,
pageSize = 100, var self = this;
data = {}, var pageSize = 100;
isLoading = false; var data = {};
self.getCurrentViewStyle = function() { var isLoading = false;
return getPageData(tabContent).view
}, self.getCurrentViewStyle = function () {
function(tabContent) { return getPageData(tabContent).view;
tabContent.querySelector(".btnSort").addEventListener("click", function(e) { };
function initPage(tabContent) {
tabContent.querySelector(".btnSort").addEventListener("click", function (e) {
libraryBrowser.showSortMenu({ libraryBrowser.showSortMenu({
items: [{ items: [{
name: Globalize.translate("OptionNameSort"), name: Globalize.translate("OptionNameSort"),
@ -145,30 +203,44 @@ define(["loading", "events", "libraryBrowser", "imageLoader", "listView", "cardB
name: Globalize.translate("OptionReleaseDate"), name: Globalize.translate("OptionReleaseDate"),
id: "PremiereDate,SortName" id: "PremiereDate,SortName"
}], }],
callback: function() { callback: function () {
getQuery(tabContent).StartIndex = 0, reloadItems(tabContent) getQuery(tabContent).StartIndex = 0;
reloadItems(tabContent);
}, },
query: getQuery(tabContent), query: getQuery(tabContent),
button: e.target button: e.target
}) });
}); });
var btnSelectView = tabContent.querySelector(".btnSelectView"); var btnSelectView = tabContent.querySelector(".btnSelectView");
btnSelectView.addEventListener("click", function(e) { btnSelectView.addEventListener("click", function (e) {
libraryBrowser.showLayoutMenu(e.target, self.getCurrentViewStyle(), "List,Poster,PosterCard,Thumb,ThumbCard".split(",")) libraryBrowser.showLayoutMenu(e.target, self.getCurrentViewStyle(), "List,Poster,PosterCard,Thumb,ThumbCard".split(","));
}), btnSelectView.addEventListener("layoutchange", function(e) { });
btnSelectView.addEventListener("layoutchange", function (e) {
var viewStyle = e.detail.viewStyle; var viewStyle = e.detail.viewStyle;
getPageData(tabContent).view = viewStyle, libraryBrowser.saveViewSetting(getSavedQueryKey(tabContent), viewStyle), getQuery(tabContent).StartIndex = 0, onViewStyleChange(), reloadItems(tabContent) getPageData(tabContent).view = viewStyle;
}), tabContent.querySelector(".btnNewCollection").addEventListener("click", function() { libraryBrowser.saveViewSetting(getSavedQueryKey(tabContent), viewStyle);
require(["collectionEditor"], function(collectionEditor) { getQuery(tabContent).StartIndex = 0;
onViewStyleChange();
reloadItems(tabContent);
});
tabContent.querySelector(".btnNewCollection").addEventListener("click", function () {
require(["collectionEditor"], function (collectionEditor) {
var serverId = ApiClient.serverInfo().Id; var serverId = ApiClient.serverInfo().Id;
(new collectionEditor).show({ new collectionEditor().show({
items: [], items: [],
serverId: serverId serverId: serverId
}) });
}) });
}) });
}(tabContent), onViewStyleChange(), self.renderTab = function() {
reloadItems(tabContent)
}, self.destroy = function() {}
} }
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"; "use strict";
return function(view, params, tabContent) {
return function (view, params, tabContent) {
function getPageData() { function getPageData() {
var key = getSavedQueryKey(), var key = getSavedQueryKey();
pageData = data[key]; var pageData = data[key];
return pageData || (pageData = data[key] = {
if (!pageData) {
pageData = data[key] = {
query: { query: {
SortBy: "SortName", SortBy: "SortName",
SortOrder: "Ascending", SortOrder: "Ascending",
IncludeItemTypes: "Movie", IncludeItemTypes: "Movie",
Recursive: !0, Recursive: true,
EnableTotalRecordCount: !1 EnableTotalRecordCount: false
}, },
view: "Poster" view: "Poster"
}, pageData.query.ParentId = params.topParentId, libraryBrowser.loadSavedQueryValues(key, pageData.query)), pageData };
pageData.query.ParentId = params.topParentId;
libraryBrowser.loadSavedQueryValues(key, pageData.query);
}
return pageData;
} }
function getQuery() { function getQuery() {
return getPageData().query return getPageData().query;
} }
function getSavedQueryKey() { function getSavedQueryKey() {
return libraryBrowser.getSavedQueryKey("moviegenres") return libraryBrowser.getSavedQueryKey("moviegenres");
} }
function getPromise() { function getPromise() {
loading.show(); loading.show();
var query = getQuery(); var query = getQuery();
return ApiClient.getGenres(ApiClient.getCurrentUserId(), query) return ApiClient.getGenres(ApiClient.getCurrentUserId(), query);
} }
function enableScrollX() { function enableScrollX() {
return !layoutManager.desktop return !layoutManager.desktop;
} }
function getThumbShape() { function getThumbShape() {
return enableScrollX() ? "overflowBackdrop" : "backdrop" return enableScrollX() ? "overflowBackdrop" : "backdrop";
} }
function getPortraitShape() { function getPortraitShape() {
return enableScrollX() ? "overflowPortrait" : "portrait" return enableScrollX() ? "overflowPortrait" : "portrait";
} }
function fillItemsContainer(elem) { function fillItemsContainer(elem) {
var id = elem.getAttribute("data-id"), var id = elem.getAttribute("data-id");
viewStyle = self.getCurrentViewStyle(), var viewStyle = self.getCurrentViewStyle();
limit = "Thumb" == viewStyle || "ThumbCard" == viewStyle ? 5 : 9; var limit = "Thumb" == viewStyle || "ThumbCard" == viewStyle ? 5 : 9;
enableScrollX() && (limit = 10);
var enableImageTypes = "Thumb" == viewStyle || "ThumbCard" == viewStyle ? "Primary,Backdrop,Thumb" : "Primary", if (enableScrollX()) {
query = { limit = 10;
}
var enableImageTypes = "Thumb" == viewStyle || "ThumbCard" == viewStyle ? "Primary,Backdrop,Thumb" : "Primary";
var query = {
SortBy: "SortName", SortBy: "SortName",
SortOrder: "Ascending", SortOrder: "Ascending",
IncludeItemTypes: "Movie", IncludeItemTypes: "Movie",
Recursive: !0, Recursive: true,
Fields: "PrimaryImageAspectRatio,MediaSourceCount,BasicSyncInfo", Fields: "PrimaryImageAspectRatio,MediaSourceCount,BasicSyncInfo",
ImageTypeLimit: 1, ImageTypeLimit: 1,
EnableImageTypes: enableImageTypes, EnableImageTypes: enableImageTypes,
Limit: limit, Limit: limit,
GenreIds: id, GenreIds: id,
EnableTotalRecordCount: !1, EnableTotalRecordCount: false,
ParentId: params.topParentId ParentId: params.topParentId
}; };
ApiClient.getItems(ApiClient.getCurrentUserId(), query).then(function(result) { ApiClient.getItems(ApiClient.getCurrentUserId(), query).then(function (result) {
var supportsImageAnalysis = appHost.supports("imageanalysis"); var supportsImageAnalysis = appHost.supports("imageanalysis");
"Thumb" == viewStyle ? cardBuilder.buildCards(result.Items, {
if (viewStyle == "Thumb") {
cardBuilder.buildCards(result.Items, {
itemsContainer: elem, itemsContainer: elem,
shape: getThumbShape(), shape: getThumbShape(),
preferThumb: !0, preferThumb: true,
showTitle: !0, showTitle: true,
scalable: !0, scalable: true,
centerText: !0, centerText: true,
overlayMoreButton: !0, overlayMoreButton: true,
allowBottomPadding: !1 allowBottomPadding: false
}) : "ThumbCard" == viewStyle ? cardBuilder.buildCards(result.Items, { });
} else if (viewStyle == "ThumbCard") {
cardBuilder.buildCards(result.Items, {
itemsContainer: elem, itemsContainer: elem,
shape: getThumbShape(), shape: getThumbShape(),
preferThumb: !0, preferThumb: true,
showTitle: !0, showTitle: true,
scalable: !0, scalable: true,
centerText: !1, centerText: false,
cardLayout: !0, cardLayout: true,
showYear: !0 showYear: true
}) : "PosterCard" == viewStyle ? cardBuilder.buildCards(result.Items, { });
} else if (viewStyle == "PosterCard") {
cardBuilder.buildCards(result.Items, {
itemsContainer: elem, itemsContainer: elem,
shape: getPortraitShape(), shape: getPortraitShape(),
showTitle: !0, showTitle: true,
scalable: !0, scalable: true,
centerText: !1, centerText: false,
cardLayout: !0, cardLayout: true,
showYear: !0 showYear: true
}) : "Poster" == viewStyle && cardBuilder.buildCards(result.Items, { });
} else if (viewStyle == "Poster") {
cardBuilder.buildCards(result.Items, {
itemsContainer: elem, itemsContainer: elem,
shape: getPortraitShape(), shape: getPortraitShape(),
scalable: !0, scalable: true,
overlayMoreButton: !0, overlayMoreButton: true,
allowBottomPadding: !1 allowBottomPadding: false
}), result.Items.length >= query.Limit && tabContent.querySelector(".btnMoreFromGenre" + id + " i").classList.remove("hide") });
}) }
if (result.Items.length >= query.Limit) {
tabContent.querySelector(".btnMoreFromGenre" + id + " i").classList.remove("hide");
}
});
} }
function reloadItems(context, promise) { function reloadItems(context, promise) {
var query = getQuery(); var query = getQuery();
promise.then(function(result) { promise.then(function (result) {
for (var elem = context.querySelector("#items"), html = "", items = result.Items, i = 0, length = items.length; i < length; i++) { 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]; 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, {
html += '<div class="verticalSection">';
html += '<div class="sectionTitleContainer sectionTitleContainer-cards padded-left">';
html += '<a is="emby-linkbutton" href="' + appRouter.getRouteUrl(item, {
context: "movies", context: "movies",
parentId: params.topParentId 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()) { }) + '" 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"; 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 + '">'; if (layoutManager.tv) {
html += "</div>", html += "</div>" scrollXClass += "smoothScrollX";
} }
elem.innerHTML = html, lazyLoader.lazyChildren(elem, fillItemsContainer), libraryBrowser.saveQueryValues(getSavedQueryKey(), query), loading.hide()
}) 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();
});
} }
function fullyReload() { function fullyReload() {
self.preRender(), self.renderTab() self.preRender();
self.renderTab();
} }
var self = this,
data = {}; var self = this;
self.getViewStyles = function() { var data = {};
return "Poster,PosterCard,Thumb,ThumbCard".split(",")
}, self.getCurrentViewStyle = function() { self.getViewStyles = function () {
return getPageData(tabContent).view return "Poster,PosterCard,Thumb,ThumbCard".split(",");
}, self.setCurrentViewStyle = function(viewStyle) { };
getPageData(tabContent).view = viewStyle, libraryBrowser.saveViewSetting(getSavedQueryKey(tabContent), viewStyle), fullyReload()
}, self.enableViewSelection = !0; 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; var promise;
self.preRender = function() {
promise = getPromise() self.preRender = function () {
}, self.renderTab = function() { promise = getPromise();
reloadItems(tabContent, promise) };
}
} self.renderTab = function () {
reloadItems(tabContent, promise);
};
};
}); });

View file

@ -1,7 +1,7 @@
define(["loading", "layoutManager", "userSettings", "events", "libraryBrowser", "alphaPicker", "listView", "cardBuilder", "emby-itemscontainer"], define(["loading", "layoutManager", "userSettings", "events", "libraryBrowser", "alphaPicker", "listView", "cardBuilder", "emby-itemscontainer"], function (loading, layoutManager, userSettings, events, libraryBrowser, alphaPicker, listView, cardBuilder) {
function(loading, layoutManager, userSettings, events, libraryBrowser, alphaPicker, listView, cardBuilder) {
"use strict"; "use strict";
return function(view, params, tabContent, options) {
return function (view, params, tabContent, options) {
function onViewStyleChange() { function onViewStyleChange() {
if (self.getCurrentViewStyle() == "List") { if (self.getCurrentViewStyle() == "List") {
itemsContainer.classList.add("vertical-list"); itemsContainer.classList.add("vertical-list");
@ -10,103 +10,141 @@ define(["loading", "layoutManager", "userSettings", "events", "libraryBrowser",
itemsContainer.classList.remove("vertical-list"); itemsContainer.classList.remove("vertical-list");
itemsContainer.classList.add("vertical-wrap"); itemsContainer.classList.add("vertical-wrap");
} }
itemsContainer.innerHTML = ""; itemsContainer.innerHTML = "";
} }
function updateFilterControls() { function updateFilterControls() {
self.alphaPicker && self.alphaPicker.value(query.NameStartsWithOrGreater) if (self.alphaPicker) {
self.alphaPicker.value(query.NameStartsWithOrGreater);
}
} }
function fetchData() { function fetchData() {
isLoading = true; isLoading = true;
loading.show(); loading.show();
return ApiClient.getItems(ApiClient.getCurrentUserId(), query) return ApiClient.getItems(ApiClient.getCurrentUserId(), query);
} }
function afterRefresh(result) { function afterRefresh(result) {
function onNextPageClick() { function onNextPageClick() {
if (isLoading) return; if (isLoading) {
return;
}
query.StartIndex += query.Limit; query.StartIndex += query.Limit;
itemsContainer.refreshItems(); itemsContainer.refreshItems();
} }
function onPreviousPageClick() { function onPreviousPageClick() {
if (isLoading) return; if (isLoading) {
return;
}
query.StartIndex -= query.Limit; query.StartIndex -= query.Limit;
itemsContainer.refreshItems(); itemsContainer.refreshItems();
} }
window.scrollTo(0, 0); window.scrollTo(0, 0);
updateFilterControls(); updateFilterControls();
var i, length, elems, pagingHtml = libraryBrowser.getQueryPagingHtml({ var pagingHtml = libraryBrowser.getQueryPagingHtml({
startIndex: query.StartIndex, startIndex: query.StartIndex,
limit: query.Limit, limit: query.Limit,
totalRecordCount: result.TotalRecordCount, totalRecordCount: result.TotalRecordCount,
showLimit: !1, showLimit: false,
updatePageSizeSetting: !1, updatePageSizeSetting: false,
addLayoutButton: !1, addLayoutButton: false,
sortButton: !1, sortButton: false,
filterButton: !1 filterButton: false
}); });
for (elems = tabContent.querySelectorAll(".paging"), i = 0, length = elems.length; i < length; i++) var i;
var length;
var elems = tabContent.querySelectorAll(".paging");
for (i = 0, length = elems.length; i < length; i++) {
elems[i].innerHTML = pagingHtml; 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); 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; isLoading = false;
loading.hide(); loading.hide();
} }
function getItemsHtml(items) { function getItemsHtml(items) {
var html;
var viewStyle = self.getCurrentViewStyle(); var viewStyle = self.getCurrentViewStyle();
return "Thumb" == viewStyle ? cardBuilder.getCardsHtml({
if (viewStyle == "Thumb") {
html = cardBuilder.getCardsHtml({
items: items, items: items,
shape: "backdrop", shape: "backdrop",
preferThumb: !0, preferThumb: true,
context: "movies", context: "movies",
lazy: !0, lazy: true,
overlayPlayButton: !0, overlayPlayButton: true,
showTitle: !0, showTitle: true,
showYear: !0, showYear: true,
centerText: !0 centerText: true
}) : "ThumbCard" == viewStyle ? cardBuilder.getCardsHtml({ });
} else if (viewStyle == "ThumbCard") {
html = cardBuilder.getCardsHtml({
items: items, items: items,
shape: "backdrop", shape: "backdrop",
preferThumb: !0, preferThumb: true,
context: "movies", context: "movies",
lazy: !0, lazy: true,
cardLayout: !0, cardLayout: true,
showTitle: !0, showTitle: true,
showYear: !0, showYear: true,
centerText: !0 centerText: true
}) : "Banner" == viewStyle ? cardBuilder.getCardsHtml({ });
} else if (viewStyle == "Banner") {
html = cardBuilder.getCardsHtml({
items: items, items: items,
shape: "banner", shape: "banner",
preferBanner: !0, preferBanner: true,
context: "movies", context: "movies",
lazy: !0 lazy: true
}) : "List" == viewStyle ? listView.getListViewHtml({ });
} else if (viewStyle == "List") {
html = listView.getListViewHtml({
items: items, items: items,
context: "movies", context: "movies",
sortBy: query.SortBy sortBy: query.SortBy
}) : "PosterCard" == viewStyle ? cardBuilder.getCardsHtml({ });
} else if (viewStyle == "PosterCard") {
html = cardBuilder.getCardsHtml({
items: items, items: items,
shape: "portrait", shape: "portrait",
context: "movies", context: "movies",
showTitle: !0, showTitle: true,
showYear: !0, showYear: true,
centerText: !0, centerText: true,
lazy: !0, lazy: true,
cardLayout: !0 cardLayout: true
}) : cardBuilder.getCardsHtml({ });
} else {
html = cardBuilder.getCardsHtml({
items: items, items: items,
shape: "portrait", shape: "portrait",
context: "movies", context: "movies",
overlayPlayButton: !0, overlayPlayButton: true,
showTitle: !0, showTitle: true,
showYear: !0, showYear: true,
centerText: !0 centerText: true
}) });
}
return html;
} }
function initPage(tabContent) { function initPage(tabContent) {
@ -114,8 +152,9 @@ define(["loading", "layoutManager", "userSettings", "events", "libraryBrowser",
itemsContainer.getItemsHtml = getItemsHtml; itemsContainer.getItemsHtml = getItemsHtml;
itemsContainer.afterRefresh = afterRefresh; itemsContainer.afterRefresh = afterRefresh;
var alphaPickerElement = tabContent.querySelector(".alphaPicker"); var alphaPickerElement = tabContent.querySelector(".alphaPicker");
if (alphaPickerElement) { if (alphaPickerElement) {
alphaPickerElement.addEventListener("alphavaluechanged", function(e) { alphaPickerElement.addEventListener("alphavaluechanged", function (e) {
var newValue = e.detail.value; var newValue = e.detail.value;
query.NameStartsWithOrGreater = newValue; query.NameStartsWithOrGreater = newValue;
query.StartIndex = 0; query.StartIndex = 0;
@ -125,18 +164,25 @@ define(["loading", "layoutManager", "userSettings", "events", "libraryBrowser",
element: alphaPickerElement, element: alphaPickerElement,
valueChangeEvent: "click" valueChangeEvent: "click"
}); });
if (layoutManager.desktop || layoutManager.mobile) { if (layoutManager.desktop || layoutManager.mobile) {
alphaPickerElement.classList.add("alphabetPicker-right"); alphaPickerElement.classList.add("alphabetPicker-right");
itemsContainer.classList.remove("padded-left-withalphapicker"); itemsContainer.classList.remove("padded-left-withalphapicker");
itemsContainer.classList.add("padded-right-withalphapicker"); itemsContainer.classList.add("padded-right-withalphapicker");
} }
} }
var btnFilter = tabContent.querySelector(".btnFilter"); 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"); var btnSort = tabContent.querySelector(".btnSort");
btnSort && btnSort.addEventListener("click", function(e) {
if (btnSort) {
btnSort.addEventListener("click", function (e) {
libraryBrowser.showSortMenu({ libraryBrowser.showSortMenu({
items: [{ items: [{
name: Globalize.translate("OptionNameSort"), name: Globalize.translate("OptionNameSort"),
@ -166,68 +212,84 @@ define(["loading", "layoutManager", "userSettings", "events", "libraryBrowser",
name: Globalize.translate("OptionRuntime"), name: Globalize.translate("OptionRuntime"),
id: "Runtime,SortName,ProductionYear" id: "Runtime,SortName,ProductionYear"
}], }],
callback: function() { callback: function () {
query.StartIndex = 0, userSettings.saveQuerySettings(savedQueryKey, query), itemsContainer.refreshItems() query.StartIndex = 0;
userSettings.saveQuerySettings(savedQueryKey, query);
itemsContainer.refreshItems();
}, },
query: query, query: query,
button: e.target button: e.target
})
}); });
});
}
var btnSelectView = tabContent.querySelector(".btnSelectView"); var btnSelectView = tabContent.querySelector(".btnSelectView");
btnSelectView.addEventListener("click", function(e) { btnSelectView.addEventListener("click", function (e) {
libraryBrowser.showLayoutMenu(e.target, self.getCurrentViewStyle(), "Banner,List,Poster,PosterCard,Thumb,ThumbCard".split(",")) libraryBrowser.showLayoutMenu(e.target, self.getCurrentViewStyle(), "Banner,List,Poster,PosterCard,Thumb,ThumbCard".split(","));
}), btnSelectView.addEventListener("layoutchange", function(e) { });
btnSelectView.addEventListener("layoutchange", function (e) {
var viewStyle = e.detail.viewStyle; var viewStyle = e.detail.viewStyle;
userSettings.set(savedViewKey, viewStyle); userSettings.set(savedViewKey, viewStyle);
query.StartIndex = 0; query.StartIndex = 0;
onViewStyleChange(); onViewStyleChange();
itemsContainer.refreshItems(); itemsContainer.refreshItems();
}) });
} }
var self = this,
itemsContainer = tabContent.querySelector(".itemsContainer"), var self = this;
savedQueryKey = params.topParentId + "-" + options.mode, var itemsContainer = tabContent.querySelector(".itemsContainer");
savedViewKey = savedQueryKey + "-view", var savedQueryKey = params.topParentId + "-" + options.mode;
query = { var savedViewKey = savedQueryKey + "-view";
var query = {
SortBy: "SortName,ProductionYear", SortBy: "SortName,ProductionYear",
SortOrder: "Ascending", SortOrder: "Ascending",
IncludeItemTypes: "Movie", IncludeItemTypes: "Movie",
Recursive: !0, Recursive: true,
Fields: "PrimaryImageAspectRatio,MediaSourceCount,BasicSyncInfo", Fields: "PrimaryImageAspectRatio,MediaSourceCount,BasicSyncInfo",
ImageTypeLimit: 1, ImageTypeLimit: 1,
EnableImageTypes: "Primary,Backdrop,Banner,Thumb", EnableImageTypes: "Primary,Backdrop,Banner,Thumb",
StartIndex: 0, StartIndex: 0,
Limit: 100, Limit: 100,
ParentId: params.topParentId ParentId: params.topParentId
}, };
isLoading = false; var isLoading = false;
if (options.mode === "favorites") query.IsFavorite = true;
if (options.mode === "favorites") {
query.IsFavorite = true;
}
query = userSettings.loadQuerySettings(savedQueryKey, query); 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({ var filterDialog = new filterDialogFactory({
query: query, query: query,
mode: "movies", mode: "movies",
serverId: ApiClient.serverId() serverId: ApiClient.serverId()
}); });
events.on(filterDialog, "filterchange", function() { events.on(filterDialog, "filterchange", function () {
query.StartIndex = 0, itemsContainer.refreshItems() query.StartIndex = 0;
}), filterDialog.show() 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); initPage(tabContent);
onViewStyleChange(); onViewStyleChange();
}; };
self.renderTab = function() {
self.renderTab = function () {
itemsContainer.refreshItems(); itemsContainer.refreshItems();
updateFilterControls(); 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"; "use strict";
function enableScrollX() { function enableScrollX() {
return !layoutManager.desktop return !layoutManager.desktop;
} }
function getPortraitShape() { function getPortraitShape() {
return enableScrollX() ? "overflowPortrait" : "portrait" return enableScrollX() ? "overflowPortrait" : "portrait";
} }
function getThumbShape() { function getThumbShape() {
return enableScrollX() ? "overflowBackdrop" : "backdrop" return enableScrollX() ? "overflowBackdrop" : "backdrop";
} }
function loadLatest(page, userId, parentId) { function loadLatest(page, userId, parentId) {
@ -21,90 +21,113 @@ define(["events", "layoutManager", "inputManager", "userSettings", "libraryMenu"
ParentId: parentId, ParentId: parentId,
ImageTypeLimit: 1, ImageTypeLimit: 1,
EnableImageTypes: "Primary,Backdrop,Banner,Thumb", EnableImageTypes: "Primary,Backdrop,Banner,Thumb",
EnableTotalRecordCount: !1 EnableTotalRecordCount: false
}; };
ApiClient.getJSON(ApiClient.getUrl("Users/" + userId + "/Items/Latest", options)).then(function(items) { ApiClient.getJSON(ApiClient.getUrl("Users/" + userId + "/Items/Latest", options)).then(function (items) {
var allowBottomPadding = !enableScrollX(), var allowBottomPadding = !enableScrollX();
container = page.querySelector("#recentlyAddedItems"); var container = page.querySelector("#recentlyAddedItems");
cardBuilder.buildCards(items, { cardBuilder.buildCards(items, {
itemsContainer: container, itemsContainer: container,
shape: getPortraitShape(), shape: getPortraitShape(),
scalable: !0, scalable: true,
overlayPlayButton: !0, overlayPlayButton: true,
allowBottomPadding: allowBottomPadding, allowBottomPadding: allowBottomPadding,
showTitle: !0, showTitle: true,
showYear: !0, showYear: true,
centerText: !0 centerText: true
}) });
}) });
} }
function loadResume(page, userId, parentId) { function loadResume(page, userId, parentId) {
var screenWidth = dom.getWindowSize().innerWidth, var screenWidth = dom.getWindowSize().innerWidth;
options = { var options = {
SortBy: "DatePlayed", SortBy: "DatePlayed",
SortOrder: "Descending", SortOrder: "Descending",
IncludeItemTypes: "Movie", IncludeItemTypes: "Movie",
Filters: "IsResumable", Filters: "IsResumable",
Limit: screenWidth >= 1920 ? 5 : screenWidth >= 1600 ? 5 : 3, Limit: screenWidth >= 1920 ? 5 : screenWidth >= 1600 ? 5 : 3,
Recursive: !0, Recursive: true,
Fields: "PrimaryImageAspectRatio,MediaSourceCount,BasicSyncInfo", Fields: "PrimaryImageAspectRatio,MediaSourceCount,BasicSyncInfo",
CollapseBoxSetItems: !1, CollapseBoxSetItems: false,
ParentId: parentId, ParentId: parentId,
ImageTypeLimit: 1, ImageTypeLimit: 1,
EnableImageTypes: "Primary,Backdrop,Banner,Thumb", EnableImageTypes: "Primary,Backdrop,Banner,Thumb",
EnableTotalRecordCount: !1 EnableTotalRecordCount: false
}; };
ApiClient.getItems(userId, options).then(function(result) { ApiClient.getItems(userId, options).then(function (result) {
result.Items.length ? page.querySelector("#resumableSection").classList.remove("hide") : page.querySelector("#resumableSection").classList.add("hide"); if (result.Items.length) {
var allowBottomPadding = !enableScrollX(), page.querySelector("#resumableSection").classList.remove("hide");
container = page.querySelector("#resumableItems"); } else {
page.querySelector("#resumableSection").classList.add("hide");
}
var allowBottomPadding = !enableScrollX();
var container = page.querySelector("#resumableItems");
cardBuilder.buildCards(result.Items, { cardBuilder.buildCards(result.Items, {
itemsContainer: container, itemsContainer: container,
preferThumb: !0, preferThumb: true,
shape: getThumbShape(), shape: getThumbShape(),
scalable: !0, scalable: true,
overlayPlayButton: !0, overlayPlayButton: true,
allowBottomPadding: allowBottomPadding, allowBottomPadding: allowBottomPadding,
cardLayout: !1, cardLayout: false,
showTitle: !0, showTitle: true,
showYear: !0, showYear: true,
centerText: !0 centerText: true
}) });
}) });
} }
function getRecommendationHtml(recommendation) { function getRecommendationHtml(recommendation) {
var html = "", var html = "";
title = ""; var title = "";
switch (recommendation.RecommendationType) { switch (recommendation.RecommendationType) {
case "SimilarToRecentlyPlayed": case "SimilarToRecentlyPlayed":
title = Globalize.translate("RecommendationBecauseYouWatched").replace("{0}", recommendation.BaselineItemName); title = Globalize.translate("RecommendationBecauseYouWatched").replace("{0}", recommendation.BaselineItemName);
break; break;
case "SimilarToLikedItem": case "SimilarToLikedItem":
title = Globalize.translate("RecommendationBecauseYouLike").replace("{0}", recommendation.BaselineItemName); title = Globalize.translate("RecommendationBecauseYouLike").replace("{0}", recommendation.BaselineItemName);
break; break;
case "HasDirectorFromRecentlyPlayed": case "HasDirectorFromRecentlyPlayed":
case "HasLikedDirector": case "HasLikedDirector":
title = Globalize.translate("RecommendationDirectedBy").replace("{0}", recommendation.BaselineItemName); title = Globalize.translate("RecommendationDirectedBy").replace("{0}", recommendation.BaselineItemName);
break; break;
case "HasActorFromRecentlyPlayed": case "HasActorFromRecentlyPlayed":
case "HasLikedActor": 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; html += '<div class="verticalSection">';
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 += '<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(), shape: getPortraitShape(),
scalable: !0, scalable: true,
overlayPlayButton: !0, overlayPlayButton: true,
allowBottomPadding: allowBottomPadding allowBottomPadding: allowBottomPadding
}), html += "</div>", html += "</div>" });
html += "</div>";
html += "</div>";
return html;
} }
function loadSuggestions(page, userId, parentId) { function loadSuggestions(page, userId, parentId) {
var screenWidth = dom.getWindowSize().innerWidth, var screenWidth = dom.getWindowSize().innerWidth;
url = ApiClient.getUrl("Movies/Recommendations", { var url = ApiClient.getUrl("Movies/Recommendations", {
userId: userId, userId: userId,
categoryLimit: 6, categoryLimit: 6,
ItemLimit: screenWidth >= 1920 ? 8 : screenWidth >= 1600 ? 8 : screenWidth >= 1200 ? 6 : 5, ItemLimit: screenWidth >= 1920 ? 8 : screenWidth >= 1600 ? 8 : screenWidth >= 1200 ? 6 : 5,
@ -112,27 +135,54 @@ define(["events", "layoutManager", "inputManager", "userSettings", "libraryMenu"
ImageTypeLimit: 1, ImageTypeLimit: 1,
EnableImageTypes: "Primary,Backdrop,Banner,Thumb" EnableImageTypes: "Primary,Backdrop,Banner,Thumb"
}); });
ApiClient.getJSON(url).then(function(recommendations) { ApiClient.getJSON(url).then(function (recommendations) {
if (!recommendations.length) return page.querySelector(".noItemsMessage").classList.remove("hide"), void(page.querySelector(".recommendations").innerHTML = ""); if (!recommendations.length) {
page.querySelector(".noItemsMessage").classList.remove("hide");
page.querySelector(".recommendations").innerHTML = "";
return;
}
var html = recommendations.map(getRecommendationHtml).join(""); var html = recommendations.map(getRecommendationHtml).join("");
page.querySelector(".noItemsMessage").classList.add("hide"); page.querySelector(".noItemsMessage").classList.add("hide");
var recs = page.querySelector(".recommendations"); var recs = page.querySelector(".recommendations");
recs.innerHTML = html, imageLoader.lazyChildren(recs) recs.innerHTML = html;
}) imageLoader.lazyChildren(recs);
});
} }
function setScrollClasses(elem, scrollX) { 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) { 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) { function loadSuggestionsTab(view, params, tabContent) {
var parentId = params.topParentId, var parentId = params.topParentId;
userId = ApiClient.getCurrentUserId(); var userId = ApiClient.getCurrentUserId();
console.log("loadSuggestionsTab"), loadResume(tabContent, userId, parentId), loadLatest(tabContent, userId, parentId), loadSuggestions(tabContent, userId, parentId) console.log("loadSuggestionsTab");
loadResume(tabContent, userId, parentId);
loadLatest(tabContent, userId, parentId);
loadSuggestions(tabContent, userId, parentId);
} }
function getTabs() { function getTabs() {
@ -151,126 +201,196 @@ define(["events", "layoutManager", "inputManager", "userSettings", "libraryMenu"
}, { }, {
name: Globalize.translate("ButtonSearch"), name: Globalize.translate("ButtonSearch"),
cssClass: "searchTabButton" cssClass: "searchTabButton"
}] }];
} }
function getDefaultTabIndex(folderId) { function getDefaultTabIndex(folderId) {
switch (userSettings.get("landing-" + folderId)) { switch (userSettings.get("landing-" + folderId)) {
case "suggestions": case "suggestions":
return 1; return 1;
case "favorites": case "favorites":
return 3; return 3;
case "collections": case "collections":
return 4; return 4;
case "genres": case "genres":
return 5; return 5;
default: default:
return 0 return 0;
} }
} }
return function(view, params) {
return function (view, params) {
function onBeforeTabChange(e) { function onBeforeTabChange(e) {
preLoadTab(view, parseInt(e.detail.selectedTabIndex)) preLoadTab(view, parseInt(e.detail.selectedTabIndex));
} }
function onTabChange(e) { function onTabChange(e) {
var newIndex = parseInt(e.detail.selectedTabIndex); var newIndex = parseInt(e.detail.selectedTabIndex);
loadTab(view, newIndex) loadTab(view, newIndex);
} }
function getTabContainers() { function getTabContainers() {
return view.querySelectorAll(".pageTabContent") return view.querySelectorAll(".pageTabContent");
} }
function initTabs() { function initTabs() {
mainTabsManager.setTabs(view, currentTabIndex, getTabs, getTabContainers, onBeforeTabChange, onTabChange) mainTabsManager.setTabs(view, currentTabIndex, getTabs, getTabContainers, onBeforeTabChange, onTabChange);
} }
function getTabController(page, index, callback) { function getTabController(page, index, callback) {
var depends = []; var depends = [];
switch (index) { switch (index) {
case 0: case 0:
depends.push("controllers/movies/movies"); depends.push("controllers/movies/movies");
break; break;
case 1: case 1:
break; break;
case 2: case 2:
depends.push("controllers/movies/movietrailers"); depends.push("controllers/movies/movietrailers");
break; break;
case 3: case 3:
depends.push("controllers/movies/movies"); depends.push("controllers/movies/movies");
break; break;
case 4: case 4:
depends.push("controllers/movies/moviecollections"); depends.push("controllers/movies/moviecollections");
break; break;
case 5: case 5:
depends.push("controllers/movies/moviegenres"); depends.push("controllers/movies/moviegenres");
break; break;
case 6: case 6:
depends.push("scripts/searchtab") depends.push("scripts/searchtab");
} }
require(depends, function(controllerFactory) {
require(depends, function (controllerFactory) {
var tabContent; 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]; var controller = tabControllers[index];
controller || (tabContent = view.querySelector(".pageTabContent[data-index='" + index + "']"), controller = index === suggestionsTabIndex ? self : 6 === index ? new controllerFactory(view, tabContent, {
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", collectionType: "movies",
parentId: params.topParentId parentId: params.topParentId
}) : 0 === index || 3 === index ? new controllerFactory(view, params, tabContent, { });
} else if (index == 0 || index == 3) {
controller = new controllerFactory(view, params, tabContent, {
mode: index ? "favorites" : "movies" mode: index ? "favorites" : "movies"
}) : new controllerFactory(view, params, tabContent), tabControllers[index] = controller, controller.initTab && controller.initTab()), callback(controller) });
}) } else {
controller = new controllerFactory(view, params, tabContent);
}
tabControllers[index] = controller;
if (controller.initTab) {
controller.initTab();
}
}
callback(controller);
});
} }
function preLoadTab(page, index) { function preLoadTab(page, index) {
getTabController(page, index, function(controller) { getTabController(page, index, function (controller) {
-1 == renderedTabs.indexOf(index) && controller.preRender && controller.preRender() if (renderedTabs.indexOf(index) == -1 && controller.preRender) {
}) controller.preRender();
}
});
} }
function loadTab(page, index) { function loadTab(page, index) {
currentTabIndex = index, getTabController(page, index, function(controller) { currentTabIndex = index;
initialTabIndex = null, -1 == renderedTabs.indexOf(index) && (renderedTabs.push(index), controller.renderTab()) getTabController(page, index, function (controller) {
}) initialTabIndex = null;
if (renderedTabs.indexOf(index) == -1) {
renderedTabs.push(index);
controller.renderTab();
}
});
} }
function onPlaybackStop(e, state) { 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) { function onInputCommand(e) {
switch (e.detail.command) { switch (e.detail.command) {
case "search": 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)), var isViewRestored;
initialTabIndex = currentTabIndex, var self = this;
suggestionsTabIndex = 1; var currentTabIndex = parseInt(params.tab || getDefaultTabIndex(params.topParentId));
self.initTab = function() { var initialTabIndex = currentTabIndex;
var suggestionsTabIndex = 1;
self.initTab = function () {
var tabContent = view.querySelector(".pageTabContent[data-index='" + suggestionsTabIndex + "']"); var tabContent = view.querySelector(".pageTabContent[data-index='" + suggestionsTabIndex + "']");
initSuggestedTab(view, tabContent); initSuggestedTab(view, tabContent);
}, self.renderTab = function() {
var tabContent = view.querySelector(".pageTabContent[data-index='" + suggestionsTabIndex + "']");
loadSuggestionsTab(view, params, tabContent)
}; };
var tabControllers = [],
renderedTabs = []; self.renderTab = function () {
view.addEventListener("viewshow", function(e) { 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")) { if (isViewRestored = e.detail.isRestored, initTabs(), !view.getAttribute("data-title")) {
var parentId = params.topParentId; var parentId = params.topParentId;
parentId ? ApiClient.getItem(ApiClient.getCurrentUserId(), parentId).then(function(item) {
view.setAttribute("data-title", item.Name), libraryMenu.setTitle(item.Name) if (parentId) {
}) : (view.setAttribute("data-title", Globalize.translate("TabMovies")), libraryMenu.setTitle(Globalize.translate("TabMovies"))) 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,15 +1,18 @@
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"; "use strict";
return function(view, params, tabContent) {
return function (view, params, tabContent) {
function getPageData(context) { function getPageData(context) {
var key = getSavedQueryKey(context), var key = getSavedQueryKey(context);
pageData = data[key]; var pageData = data[key];
return pageData || (pageData = data[key] = {
if (!pageData) {
pageData = data[key] = {
query: { query: {
SortBy: "SortName", SortBy: "SortName",
SortOrder: "Ascending", SortOrder: "Ascending",
IncludeItemTypes: "Trailer", IncludeItemTypes: "Trailer",
Recursive: !0, Recursive: true,
Fields: "PrimaryImageAspectRatio,SortName,BasicSyncInfo", Fields: "PrimaryImageAspectRatio,SortName,BasicSyncInfo",
ImageTypeLimit: 1, ImageTypeLimit: 1,
EnableImageTypes: "Primary,Backdrop,Banner,Thumb", EnableImageTypes: "Primary,Backdrop,Banner,Thumb",
@ -17,137 +20,202 @@ define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", "
Limit: pageSize Limit: pageSize
}, },
view: libraryBrowser.getSavedView(key) || "Poster" view: libraryBrowser.getSavedView(key) || "Poster"
}, libraryBrowser.loadSavedQueryValues(key, pageData.query)), pageData };
libraryBrowser.loadSavedQueryValues(key, pageData.query);
}
return pageData;
} }
function getQuery(context) { function getQuery(context) {
return getPageData(context).query return getPageData(context).query;
} }
function getSavedQueryKey(context) { 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() { function reloadItems() {
loading.show(); loading.show();
isLoading = true; isLoading = true;
var query = getQuery(tabContent); var query = getQuery(tabContent);
ApiClient.getItems(ApiClient.getCurrentUserId(), query).then(function(result) { ApiClient.getItems(ApiClient.getCurrentUserId(), query).then(function (result) {
function onNextPageClick() { function onNextPageClick() {
if (isLoading) return; if (isLoading) {
query.StartIndex += query.Limit, reloadItems() return;
}
query.StartIndex += query.Limit;
reloadItems();
} }
function onPreviousPageClick() { function onPreviousPageClick() {
if (isLoading) return; if (isLoading) {
query.StartIndex -= query.Limit, reloadItems() return;
} }
window.scrollTo(0, 0), updateFilterControls(tabContent);
var html, pagingHtml = libraryBrowser.getQueryPagingHtml({ query.StartIndex -= query.Limit;
reloadItems();
}
window.scrollTo(0, 0);
updateFilterControls(tabContent);
var pagingHtml = libraryBrowser.getQueryPagingHtml({
startIndex: query.StartIndex, startIndex: query.StartIndex,
limit: query.Limit, limit: query.Limit,
totalRecordCount: result.TotalRecordCount, totalRecordCount: result.TotalRecordCount,
showLimit: !1, showLimit: false,
updatePageSizeSetting: !1, updatePageSizeSetting: false,
addLayoutButton: !1, addLayoutButton: false,
sortButton: !1, sortButton: false,
filterButton: !1 filterButton: false
}), });
viewStyle = self.getCurrentViewStyle(); var html;
html = "Thumb" == viewStyle ? cardBuilder.getCardsHtml({ var viewStyle = self.getCurrentViewStyle();
if (viewStyle == "Thumb") {
html = cardBuilder.getCardsHtml({
items: result.Items, items: result.Items,
shape: "backdrop", shape: "backdrop",
preferThumb: !0, preferThumb: true,
context: "movies", context: "movies",
overlayPlayButton: !0 overlayPlayButton: true
}) : "ThumbCard" == viewStyle ? cardBuilder.getCardsHtml({ });
} else if (viewStyle == "ThumbCard") {
html = cardBuilder.getCardsHtml({
items: result.Items, items: result.Items,
shape: "backdrop", shape: "backdrop",
preferThumb: !0, preferThumb: true,
context: "movies", context: "movies",
cardLayout: !0, cardLayout: true,
showTitle: !0, showTitle: true,
showYear: !0, showYear: true,
centerText: !0 centerText: true
}) : "Banner" == viewStyle ? cardBuilder.getCardsHtml({ });
} else if (viewStyle == "Banner") {
html = cardBuilder.getCardsHtml({
items: result.Items, items: result.Items,
shape: "banner", shape: "banner",
preferBanner: !0, preferBanner: true,
context: "movies" context: "movies"
}) : "List" == viewStyle ? listView.getListViewHtml({ });
} else if (viewStyle == "List") {
html = listView.getListViewHtml({
items: result.Items, items: result.Items,
context: "movies", context: "movies",
sortBy: query.SortBy 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
}); });
var i, length, elems = tabContent.querySelectorAll(".paging"); } else if (viewStyle == "PosterCard") {
for (i = 0, length = elems.length; i < length; i++) elems[i].innerHTML = pagingHtml; html = cardBuilder.getCardsHtml({
for (elems = tabContent.querySelectorAll(".btnNextPage"), i = 0, length = elems.length; i < length; i++) elems[i].addEventListener("click", onNextPageClick); items: result.Items,
for (elems = tabContent.querySelectorAll(".btnPreviousPage"), i = 0, length = elems.length; i < length; i++) elems[i].addEventListener("click", onPreviousPageClick); shape: "portrait",
result.Items.length || (html = '<p style="text-align:center;">' + Globalize.translate("MessageNoTrailersFound") + "</p>"); 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"); var itemsContainer = tabContent.querySelector(".itemsContainer");
itemsContainer.innerHTML = html; itemsContainer.innerHTML = html;
imageLoader.lazyChildren(itemsContainer); imageLoader.lazyChildren(itemsContainer);
libraryBrowser.saveQueryValues(getSavedQueryKey(tabContent), query); libraryBrowser.saveQueryValues(getSavedQueryKey(tabContent), query);
loading.hide(); loading.hide();
isLoading = false; isLoading = false;
}) });
} }
function updateFilterControls(tabContent) { function updateFilterControls(tabContent) {
var query = getQuery(tabContent); var query = getQuery(tabContent);
self.alphaPicker.value(query.NameStartsWithOrGreater) self.alphaPicker.value(query.NameStartsWithOrGreater);
} }
var self = this,
pageSize = 100, var self = this;
data = {}, var pageSize = 100;
isLoading = false; var data = {};
self.showFilterMenu = function() { var isLoading = false;
require(["components/filterdialog/filterdialog"], function(filterDialogFactory) {
self.showFilterMenu = function () {
require(["components/filterdialog/filterdialog"], function (filterDialogFactory) {
var filterDialog = new filterDialogFactory({ var filterDialog = new filterDialogFactory({
query: getQuery(tabContent), query: getQuery(tabContent),
mode: "movies", mode: "movies",
serverId: ApiClient.serverId() serverId: ApiClient.serverId()
}); });
events.on(filterDialog, "filterchange", function() { events.on(filterDialog, "filterchange", function () {
getQuery(tabContent).StartIndex = 0, reloadItems() getQuery(tabContent).StartIndex = 0;
}), filterDialog.show() reloadItems();
}) });
}, self.getCurrentViewStyle = function() { filterDialog.show();
return getPageData(tabContent).view });
}, };
function(tabContent) {
self.getCurrentViewStyle = function () {
return getPageData(tabContent).view;
};
function initPage(tabContent) {
var alphaPickerElement = tabContent.querySelector(".alphaPicker"); var alphaPickerElement = tabContent.querySelector(".alphaPicker");
if (alphaPickerElement.addEventListener("alphavaluechanged", function(e) { alphaPickerElement.addEventListener("alphavaluechanged", function (e) {
var newValue = e.detail.value, var newValue = e.detail.value;
query = getQuery(tabContent); var query = getQuery(tabContent);
query.NameStartsWithOrGreater = newValue, query.StartIndex = 0, reloadItems() query.NameStartsWithOrGreater = newValue;
}), self.alphaPicker = new alphaPicker({ query.StartIndex = 0;
reloadItems();
});
self.alphaPicker = new alphaPicker({
element: alphaPickerElement, element: alphaPickerElement,
valueChangeEvent: "click" valueChangeEvent: "click"
}), layoutManager.desktop || layoutManager.mobile) { });
if (layoutManager.desktop || layoutManager.mobile) {
tabContent.querySelector(".alphaPicker").classList.add("alphabetPicker-right"); tabContent.querySelector(".alphaPicker").classList.add("alphabetPicker-right");
var itemsContainer = tabContent.querySelector(".itemsContainer"); var itemsContainer = tabContent.querySelector(".itemsContainer");
itemsContainer.classList.remove("padded-left-withalphapicker"), itemsContainer.classList.add("padded-right-withalphapicker") itemsContainer.classList.remove("padded-left-withalphapicker");
itemsContainer.classList.add("padded-right-withalphapicker");
} }
tabContent.querySelector(".btnFilter").addEventListener("click", function() {
self.showFilterMenu() tabContent.querySelector(".btnFilter").addEventListener("click", function () {
}), tabContent.querySelector(".btnSort").addEventListener("click", function(e) { self.showFilterMenu();
});
tabContent.querySelector(".btnSort").addEventListener("click", function (e) {
libraryBrowser.showSortMenu({ libraryBrowser.showSortMenu({
items: [{ items: [{
name: Globalize.translate("OptionNameSort"), name: Globalize.translate("OptionNameSort"),
@ -171,15 +239,23 @@ define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", "
name: Globalize.translate("OptionReleaseDate"), name: Globalize.translate("OptionReleaseDate"),
id: "PremiereDate,SortName" id: "PremiereDate,SortName"
}], }],
callback: function() { callback: function () {
getQuery(tabContent).StartIndex = 0, reloadItems() getQuery(tabContent).StartIndex = 0;
reloadItems();
}, },
query: getQuery(tabContent), query: getQuery(tabContent),
button: e.target button: e.target
}) });
}) });
}(tabContent), self.renderTab = function() {
reloadItems(), updateFilterControls(tabContent)
}, self.destroy = function() {}
} }
initPage(tabContent);
self.renderTab = function () {
reloadItems();
updateFilterControls(tabContent);
};
self.destroy = function () {};
};
}); });

View file

@ -1,29 +1,32 @@
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"; "use strict";
return function(view, params, tabContent) {
return function (view, params, tabContent) {
function playAll() { function playAll() {
ApiClient.getItem(ApiClient.getCurrentUserId(), params.topParentId).then(function(item) { ApiClient.getItem(ApiClient.getCurrentUserId(), params.topParentId).then(function (item) {
playbackManager.play({ playbackManager.play({
items: [item] items: [item]
}) });
}) });
} }
function shuffle() { function shuffle() {
ApiClient.getItem(ApiClient.getCurrentUserId(), params.topParentId).then(function(item) { ApiClient.getItem(ApiClient.getCurrentUserId(), params.topParentId).then(function (item) {
getQuery(); getQuery();
playbackManager.shuffle(item, null) playbackManager.shuffle(item, null);
}) });
} }
function getPageData() { function getPageData() {
var key = getSavedQueryKey(); var key = getSavedQueryKey();
return pageData || (pageData = {
if (!pageData) {
pageData = {
query: { query: {
SortBy: "SortName", SortBy: "SortName",
SortOrder: "Ascending", SortOrder: "Ascending",
IncludeItemTypes: "MusicAlbum", IncludeItemTypes: "MusicAlbum",
Recursive: !0, Recursive: true,
Fields: "PrimaryImageAspectRatio,SortName,BasicSyncInfo", Fields: "PrimaryImageAspectRatio,SortName,BasicSyncInfo",
ImageTypeLimit: 1, ImageTypeLimit: 1,
EnableImageTypes: "Primary,Backdrop,Banner,Thumb", EnableImageTypes: "Primary,Backdrop,Banner,Thumb",
@ -31,124 +34,190 @@ define(["layoutManager", "playbackManager", "loading", "events", "libraryBrowser
Limit: pageSize Limit: pageSize
}, },
view: libraryBrowser.getSavedView(key) || "Poster" view: libraryBrowser.getSavedView(key) || "Poster"
}, pageData.query.ParentId = params.topParentId, libraryBrowser.loadSavedQueryValues(key, pageData.query)), pageData };
pageData.query.ParentId = params.topParentId;
libraryBrowser.loadSavedQueryValues(key, pageData.query);
}
return pageData;
} }
function getQuery() { function getQuery() {
return getPageData().query return getPageData().query;
} }
function getSavedQueryKey() { function getSavedQueryKey() {
return savedQueryKey || (savedQueryKey = libraryBrowser.getSavedQueryKey("musicalbums")), savedQueryKey if (!savedQueryKey) {
savedQueryKey = libraryBrowser.getSavedQueryKey("musicalbums");
}
return savedQueryKey;
} }
function onViewStyleChange() { function onViewStyleChange() {
var viewStyle = self.getCurrentViewStyle(), var viewStyle = self.getCurrentViewStyle();
itemsContainer = tabContent.querySelector(".itemsContainer"); var 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 = ""
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) { function reloadItems(page) {
loading.show(); loading.show();
isLoading = true; isLoading = true;
var query = getQuery(); var query = getQuery();
ApiClient.getItems(ApiClient.getCurrentUserId(), query).then(function(result) { ApiClient.getItems(ApiClient.getCurrentUserId(), query).then(function (result) {
function onNextPageClick() { function onNextPageClick() {
if (isLoading) return; if (isLoading) {
query.StartIndex += query.Limit, reloadItems(tabContent) return;
}
query.StartIndex += query.Limit;
reloadItems(tabContent);
} }
function onPreviousPageClick() { function onPreviousPageClick() {
if (isLoading) return; if (isLoading) {
query.StartIndex -= query.Limit, reloadItems(tabContent) return;
} }
window.scrollTo(0, 0), updateFilterControls(page);
var html, pagingHtml = libraryBrowser.getQueryPagingHtml({ query.StartIndex -= query.Limit;
reloadItems(tabContent);
}
window.scrollTo(0, 0);
updateFilterControls(page);
var html;
var pagingHtml = libraryBrowser.getQueryPagingHtml({
startIndex: query.StartIndex, startIndex: query.StartIndex,
limit: query.Limit, limit: query.Limit,
totalRecordCount: result.TotalRecordCount, totalRecordCount: result.TotalRecordCount,
showLimit: !1, showLimit: false,
updatePageSizeSetting: !1, updatePageSizeSetting: false,
addLayoutButton: !1, addLayoutButton: false,
sortButton: !1, sortButton: false,
filterButton: !1 filterButton: false
}), });
viewStyle = self.getCurrentViewStyle(); var viewStyle = self.getCurrentViewStyle();
html = "List" == viewStyle ? listView.getListViewHtml({ if (viewStyle == "List") {
html = listView.getListViewHtml({
items: result.Items, items: result.Items,
context: "music", context: "music",
sortBy: query.SortBy, sortBy: query.SortBy,
addToListButton: !0 addToListButton: true
}) : "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
}); });
var i, length, elems = tabContent.querySelectorAll(".paging"); } else if (viewStyle == "PosterCard") {
for (i = 0, length = elems.length; i < length; i++) elems[i].innerHTML = pagingHtml; html = cardBuilder.getCardsHtml({
for (elems = tabContent.querySelectorAll(".btnNextPage"), i = 0, length = elems.length; i < length; i++) elems[i].addEventListener("click", onNextPageClick); items: result.Items,
for (elems = tabContent.querySelectorAll(".btnPreviousPage"), i = 0, length = elems.length; i < length; i++) elems[i].addEventListener("click", onPreviousPageClick); 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"); var itemsContainer = tabContent.querySelector(".itemsContainer");
itemsContainer.innerHTML = html; itemsContainer.innerHTML = html;
imageLoader.lazyChildren(itemsContainer); imageLoader.lazyChildren(itemsContainer);
libraryBrowser.saveQueryValues(getSavedQueryKey(), query); libraryBrowser.saveQueryValues(getSavedQueryKey(), query);
loading.hide(); loading.hide();
isLoading = false; isLoading = false;
}) });
} }
function updateFilterControls(tabContent) { function updateFilterControls(tabContent) {
var query = getQuery(); var query = getQuery();
self.alphaPicker.value(query.NameStartsWithOrGreater) self.alphaPicker.value(query.NameStartsWithOrGreater);
} }
var savedQueryKey, pageData, self = this,
pageSize = 100, var savedQueryKey;
isLoading = false; var pageData;
self.showFilterMenu = function() { var self = this;
require(["components/filterdialog/filterdialog"], function(filterDialogFactory) { var pageSize = 100;
var isLoading = false;
self.showFilterMenu = function () {
require(["components/filterdialog/filterdialog"], function (filterDialogFactory) {
var filterDialog = new filterDialogFactory({ var filterDialog = new filterDialogFactory({
query: getQuery(), query: getQuery(),
mode: "albums", mode: "albums",
serverId: ApiClient.serverId() serverId: ApiClient.serverId()
}); });
events.on(filterDialog, "filterchange", function() { events.on(filterDialog, "filterchange", function () {
getQuery().StartIndex = 0, reloadItems(tabContent) getQuery().StartIndex = 0;
}), filterDialog.show() reloadItems(tabContent);
}) });
}, self.getCurrentViewStyle = function() { filterDialog.show();
return getPageData().view });
}, };
function(tabContent) {
self.getCurrentViewStyle = function () {
return getPageData().view;
};
function initPage(tabContent) {
var alphaPickerElement = tabContent.querySelector(".alphaPicker"); var alphaPickerElement = tabContent.querySelector(".alphaPicker");
if (alphaPickerElement.addEventListener("alphavaluechanged", function(e) {
var newValue = e.detail.value, alphaPickerElement.addEventListener("alphavaluechanged", function (e) {
query = getQuery(); var newValue = e.detail.value;
query.NameStartsWithOrGreater = newValue, query.StartIndex = 0, reloadItems(tabContent) var query = getQuery();
}), self.alphaPicker = new alphaPicker({ query.NameStartsWithOrGreater = newValue;
query.StartIndex = 0;
reloadItems(tabContent);
});
self.alphaPicker = new alphaPicker({
element: alphaPickerElement, element: alphaPickerElement,
valueChangeEvent: "click" valueChangeEvent: "click"
}), layoutManager.desktop || layoutManager.mobile) { });
if (layoutManager.desktop || layoutManager.mobile) {
tabContent.querySelector(".alphaPicker").classList.add("alphabetPicker-right"); tabContent.querySelector(".alphaPicker").classList.add("alphabetPicker-right");
var itemsContainer = tabContent.querySelector(".itemsContainer"); var itemsContainer = tabContent.querySelector(".itemsContainer");
itemsContainer.classList.remove("padded-left-withalphapicker"), itemsContainer.classList.add("padded-right-withalphapicker") itemsContainer.classList.remove("padded-left-withalphapicker");
itemsContainer.classList.add("padded-right-withalphapicker");
} }
tabContent.querySelector(".btnFilter").addEventListener("click", function() {
self.showFilterMenu() tabContent.querySelector(".btnFilter").addEventListener("click", function () {
}), tabContent.querySelector(".btnSort").addEventListener("click", function(e) { self.showFilterMenu();
});
tabContent.querySelector(".btnSort").addEventListener("click", function (e) {
libraryBrowser.showSortMenu({ libraryBrowser.showSortMenu({
items: [{ items: [{
name: Globalize.translate("OptionNameSort"), name: Globalize.translate("OptionNameSort"),
@ -169,22 +238,38 @@ define(["layoutManager", "playbackManager", "loading", "events", "libraryBrowser
name: Globalize.translate("OptionReleaseDate"), name: Globalize.translate("OptionReleaseDate"),
id: "ProductionYear,PremiereDate,SortName" id: "ProductionYear,PremiereDate,SortName"
}], }],
callback: function() { callback: function () {
getQuery().StartIndex = 0, reloadItems(tabContent) getQuery().StartIndex = 0;
reloadItems(tabContent);
}, },
query: getQuery(), query: getQuery(),
button: e.target button: e.target
}) });
}); });
var btnSelectView = tabContent.querySelector(".btnSelectView"); var btnSelectView = tabContent.querySelector(".btnSelectView");
btnSelectView.addEventListener("click", function(e) { btnSelectView.addEventListener("click", function (e) {
libraryBrowser.showLayoutMenu(e.target, self.getCurrentViewStyle(), "List,Poster,PosterCard".split(",")) libraryBrowser.showLayoutMenu(e.target, self.getCurrentViewStyle(), "List,Poster,PosterCard".split(","));
}), btnSelectView.addEventListener("layoutchange", function(e) { });
btnSelectView.addEventListener("layoutchange", function (e) {
var viewStyle = e.detail.viewStyle; var viewStyle = e.detail.viewStyle;
getPageData().view = viewStyle, libraryBrowser.saveViewSetting(getSavedQueryKey(), viewStyle), getQuery().StartIndex = 0, onViewStyleChange(), reloadItems(tabContent) getPageData().view = viewStyle;
}), tabContent.querySelector(".btnPlayAll").addEventListener("click", playAll), tabContent.querySelector(".btnShuffle").addEventListener("click", shuffle) libraryBrowser.saveViewSetting(getSavedQueryKey(), viewStyle);
}(tabContent), onViewStyleChange(), self.renderTab = function() { getQuery().StartIndex = 0;
reloadItems(tabContent), updateFilterControls(tabContent) onViewStyleChange();
}, self.destroy = function() {} 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,14 +1,17 @@
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"; "use strict";
return function(view, params, tabContent) {
return function (view, params, tabContent) {
function getPageData(context) { function getPageData(context) {
var key = getSavedQueryKey(context), var key = getSavedQueryKey(context);
pageData = data[key]; var pageData = data[key];
return pageData || (pageData = data[key] = {
if (!pageData) {
pageData = data[key] = {
query: { query: {
SortBy: "SortName", SortBy: "SortName",
SortOrder: "Ascending", SortOrder: "Ascending",
Recursive: !0, Recursive: true,
Fields: "PrimaryImageAspectRatio,SortName,BasicSyncInfo", Fields: "PrimaryImageAspectRatio,SortName,BasicSyncInfo",
StartIndex: 0, StartIndex: 0,
ImageTypeLimit: 1, ImageTypeLimit: 1,
@ -16,129 +19,208 @@ define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", "
Limit: 100 Limit: 100
}, },
view: libraryBrowser.getSavedView(key) || "Poster" view: libraryBrowser.getSavedView(key) || "Poster"
}, pageData.query.ParentId = params.topParentId, libraryBrowser.loadSavedQueryValues(key, pageData.query)), pageData };
pageData.query.ParentId = params.topParentId;
libraryBrowser.loadSavedQueryValues(key, pageData.query);
}
return pageData;
} }
function getQuery(context) { function getQuery(context) {
return getPageData(context).query return getPageData(context).query;
} }
function getSavedQueryKey(context) { 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() { function onViewStyleChange() {
var viewStyle = self.getCurrentViewStyle(), var viewStyle = self.getCurrentViewStyle();
itemsContainer = tabContent.querySelector(".itemsContainer"); var 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 = ""
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) { function reloadItems(page) {
loading.show(); loading.show();
isLoading = true; isLoading = true;
var query = getQuery(page); 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() { function onNextPageClick() {
if (isLoading) return; if (isLoading) {
query.StartIndex += query.Limit, reloadItems(tabContent) return;
}
query.StartIndex += query.Limit;
reloadItems(tabContent);
} }
function onPreviousPageClick() { function onPreviousPageClick() {
if (isLoading) return; if (isLoading) {
query.StartIndex -= query.Limit, reloadItems(tabContent) return;
} }
window.scrollTo(0, 0), updateFilterControls(page);
var html, pagingHtml = libraryBrowser.getQueryPagingHtml({ query.StartIndex -= query.Limit;
reloadItems(tabContent);
}
window.scrollTo(0, 0);
updateFilterControls(page);
var html;
var pagingHtml = libraryBrowser.getQueryPagingHtml({
startIndex: query.StartIndex, startIndex: query.StartIndex,
limit: query.Limit, limit: query.Limit,
totalRecordCount: result.TotalRecordCount, totalRecordCount: result.TotalRecordCount,
showLimit: !1, showLimit: false,
updatePageSizeSetting: !1, updatePageSizeSetting: false,
addLayoutButton: !1, addLayoutButton: false,
sortButton: !1, sortButton: false,
filterButton: !1 filterButton: false
}), });
viewStyle = self.getCurrentViewStyle(); var viewStyle = self.getCurrentViewStyle();
html = "List" == viewStyle ? listView.getListViewHtml({ if (viewStyle == "List") {
html = listView.getListViewHtml({
items: result.Items, items: result.Items,
sortBy: query.SortBy 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
}); });
var i, length, elems = tabContent.querySelectorAll(".paging"); } else if (viewStyle == "PosterCard") {
for (i = 0, length = elems.length; i < length; i++) elems[i].innerHTML = pagingHtml; html = cardBuilder.getCardsHtml({
for (elems = tabContent.querySelectorAll(".btnNextPage"), i = 0, length = elems.length; i < length; i++) elems[i].addEventListener("click", onNextPageClick); items: result.Items,
for (elems = tabContent.querySelectorAll(".btnPreviousPage"), i = 0, length = elems.length; i < length; i++) elems[i].addEventListener("click", onPreviousPageClick); 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"); var itemsContainer = tabContent.querySelector(".itemsContainer");
itemsContainer.innerHTML = html; itemsContainer.innerHTML = html;
imageLoader.lazyChildren(itemsContainer); imageLoader.lazyChildren(itemsContainer);
libraryBrowser.saveQueryValues(getSavedQueryKey(page), query); libraryBrowser.saveQueryValues(getSavedQueryKey(page), query);
loading.hide(); loading.hide();
isLoading = false; isLoading = false;
}) });
} }
function updateFilterControls(tabContent) { function updateFilterControls(tabContent) {
var query = getQuery(tabContent); var query = getQuery(tabContent);
self.alphaPicker.value(query.NameStartsWithOrGreater) self.alphaPicker.value(query.NameStartsWithOrGreater);
} }
var self = this,
data = {}, var self = this;
isLoading = false; var data = {};
self.showFilterMenu = function() { var isLoading = false;
require(["components/filterdialog/filterdialog"], function(filterDialogFactory) {
self.showFilterMenu = function () {
require(["components/filterdialog/filterdialog"], function (filterDialogFactory) {
var filterDialog = new filterDialogFactory({ var filterDialog = new filterDialogFactory({
query: getQuery(tabContent), query: getQuery(tabContent),
mode: self.mode, mode: self.mode,
serverId: ApiClient.serverId() serverId: ApiClient.serverId()
}); });
events.on(filterDialog, "filterchange", function() { events.on(filterDialog, "filterchange", function () {
getQuery(tabContent).StartIndex = 0, reloadItems(tabContent) getQuery(tabContent).StartIndex = 0;
}), filterDialog.show() reloadItems(tabContent);
}) });
}, self.getCurrentViewStyle = function() { filterDialog.show();
return getPageData(tabContent).view });
}, };
function(tabContent) {
self.getCurrentViewStyle = function () {
return getPageData(tabContent).view;
};
function initPage(tabContent) {
var alphaPickerElement = tabContent.querySelector(".alphaPicker"); var alphaPickerElement = tabContent.querySelector(".alphaPicker");
if (alphaPickerElement.addEventListener("alphavaluechanged", function(e) {
var newValue = e.detail.value, alphaPickerElement.addEventListener("alphavaluechanged", function (e) {
query = getQuery(tabContent); var newValue = e.detail.value;
query.NameStartsWithOrGreater = newValue, query.StartIndex = 0, reloadItems(tabContent) var query = getQuery(tabContent);
}), self.alphaPicker = new alphaPicker({ query.NameStartsWithOrGreater = newValue;
query.StartIndex = 0;
reloadItems(tabContent);
});
self.alphaPicker = new alphaPicker({
element: alphaPickerElement, element: alphaPickerElement,
valueChangeEvent: "click" valueChangeEvent: "click"
}), layoutManager.desktop || layoutManager.mobile) { });
if (layoutManager.desktop || layoutManager.mobile) {
tabContent.querySelector(".alphaPicker").classList.add("alphabetPicker-right"); tabContent.querySelector(".alphaPicker").classList.add("alphabetPicker-right");
var itemsContainer = tabContent.querySelector(".itemsContainer"); var itemsContainer = tabContent.querySelector(".itemsContainer");
itemsContainer.classList.remove("padded-left-withalphapicker"), itemsContainer.classList.add("padded-right-withalphapicker") itemsContainer.classList.remove("padded-left-withalphapicker");
itemsContainer.classList.add("padded-right-withalphapicker");
} }
tabContent.querySelector(".btnFilter").addEventListener("click", function() {
self.showFilterMenu() tabContent.querySelector(".btnFilter").addEventListener("click", function () {
self.showFilterMenu();
}); });
var btnSelectView = tabContent.querySelector(".btnSelectView"); var btnSelectView = tabContent.querySelector(".btnSelectView");
btnSelectView.addEventListener("click", function(e) { btnSelectView.addEventListener("click", function (e) {
libraryBrowser.showLayoutMenu(e.target, self.getCurrentViewStyle(), "List,Poster,PosterCard".split(",")) libraryBrowser.showLayoutMenu(e.target, self.getCurrentViewStyle(), "List,Poster,PosterCard".split(","));
}), btnSelectView.addEventListener("layoutchange", function(e) { });
btnSelectView.addEventListener("layoutchange", function (e) {
var viewStyle = e.detail.viewStyle; var viewStyle = e.detail.viewStyle;
getPageData(tabContent).view = viewStyle, libraryBrowser.saveViewSetting(getSavedQueryKey(tabContent), viewStyle), getQuery(tabContent).StartIndex = 0, onViewStyleChange(), reloadItems(tabContent) getPageData(tabContent).view = viewStyle;
}) libraryBrowser.saveViewSetting(getSavedQueryKey(tabContent), viewStyle);
}(tabContent), onViewStyleChange(), self.renderTab = function() { getQuery(tabContent).StartIndex = 0;
reloadItems(tabContent), updateFilterControls(tabContent) onViewStyleChange();
}, self.destroy = function() {} 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"; "use strict";
return function(view, params, tabContent) {
return function (view, params, tabContent) {
function getPageData() { function getPageData() {
var key = getSavedQueryKey(), var key = getSavedQueryKey();
pageData = data[key]; var pageData = data[key];
return pageData || (pageData = data[key] = {
if (!pageData) {
pageData = data[key] = {
query: { query: {
SortBy: "SortName", SortBy: "SortName",
SortOrder: "Ascending", SortOrder: "Ascending",
Recursive: !0, Recursive: true,
Fields: "PrimaryImageAspectRatio,ItemCounts", Fields: "PrimaryImageAspectRatio,ItemCounts",
StartIndex: 0 StartIndex: 0
}, },
view: libraryBrowser.getSavedView(key) || "Poster" view: libraryBrowser.getSavedView(key) || "Poster"
}, pageData.query.ParentId = params.topParentId, libraryBrowser.loadSavedQueryValues(key, pageData.query)), pageData };
pageData.query.ParentId = params.topParentId;
libraryBrowser.loadSavedQueryValues(key, pageData.query);
}
return pageData;
} }
function getQuery() { function getQuery() {
return getPageData().query return getPageData().query;
} }
function getSavedQueryKey() { function getSavedQueryKey() {
return libraryBrowser.getSavedQueryKey("genres") return libraryBrowser.getSavedQueryKey("genres");
} }
function getPromise() { function getPromise() {
loading.show(); loading.show();
var query = getQuery(); var query = getQuery();
return ApiClient.getGenres(ApiClient.getCurrentUserId(), query) return ApiClient.getGenres(ApiClient.getCurrentUserId(), query);
} }
function reloadItems(context, promise) { function reloadItems(context, promise) {
var query = getQuery(); var query = getQuery();
promise.then(function(result) { promise.then(function (result) {
var html = "", var html = "";
viewStyle = self.getCurrentViewStyle(); var viewStyle = self.getCurrentViewStyle();
"Thumb" == viewStyle ? html = cardBuilder.getCardsHtml({
if (viewStyle == "Thumb") {
html = cardBuilder.getCardsHtml({
items: result.Items, items: result.Items,
shape: "backdrop", shape: "backdrop",
preferThumb: !0, preferThumb: true,
context: "music", context: 'music',
centerText: !0, centerText: true,
overlayMoreButton: !0, overlayMoreButton: true,
showTitle: !0 showTitle: true
}) : "ThumbCard" == viewStyle ? html = cardBuilder.getCardsHtml({ });
} else if (viewStyle == "ThumbCard") {
html = cardBuilder.getCardsHtml({
items: result.Items, items: result.Items,
shape: "backdrop", shape: "backdrop",
preferThumb: !0, preferThumb: true,
context: "music", context: 'music',
cardLayout: !0, cardLayout: true,
showTitle: !0 showTitle: true,
}) : "PosterCard" == viewStyle ? html = cardBuilder.getCardsHtml({ });
} else if (viewStyle == "PosterCard") {
html = cardBuilder.getCardsHtml({
items: result.Items, items: result.Items,
shape: "auto", shape: "auto",
context: "music", context: 'music',
cardLayout: !0, cardLayout: true,
showTitle: !0 showTitle: true,
}) : "Poster" == viewStyle && (html = cardBuilder.getCardsHtml({ });
} else if (viewStyle == "Poster") {
html = cardBuilder.getCardsHtml({
items: result.Items, items: result.Items,
shape: "auto", shape: "auto",
context: "music", context: 'music',
centerText: !0, centerText: true,
overlayMoreButton: !0, overlayMoreButton: true,
showTitle: !0 showTitle: true
})); });
}
var elem = context.querySelector("#items"); 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() { function fullyReload() {
self.preRender(), self.renderTab() self.preRender();
self.renderTab();
} }
var self = this,
data = {}; var self = this;
self.getViewStyles = function() { var data = {};
return "Poster,PosterCard,Thumb,ThumbCard".split(",")
}, self.getCurrentViewStyle = function() { self.getViewStyles = function () {
return getPageData(tabContent).view return "Poster,PosterCard,Thumb,ThumbCard".split(",");
}, self.setCurrentViewStyle = function(viewStyle) { };
getPageData(tabContent).view = viewStyle, libraryBrowser.saveViewSetting(getSavedQueryKey(tabContent), viewStyle), fullyReload()
}, self.enableViewSelection = !0; 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; var promise;
self.preRender = function() {
promise = getPromise() self.preRender = function () {
}, self.renderTab = function() { promise = getPromise();
reloadItems(tabContent, promise) };
}
} 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"; "use strict";
return function(view, params, tabContent) {
return function (view, params, tabContent) {
function getPageData() { function getPageData() {
var key = getSavedQueryKey(), var key = getSavedQueryKey();
pageData = data[key]; var pageData = data[key];
return pageData || (pageData = data[key] = {
if (!pageData) {
pageData = data[key] = {
query: { query: {
SortBy: "SortName", SortBy: "SortName",
SortOrder: "Ascending", SortOrder: "Ascending",
IncludeItemTypes: "Playlist", IncludeItemTypes: "Playlist",
Recursive: !0, Recursive: true,
Fields: "PrimaryImageAspectRatio,SortName,CanDelete", Fields: "PrimaryImageAspectRatio,SortName,CanDelete",
StartIndex: 0 StartIndex: 0
}, },
view: libraryBrowser.getSavedView(key) || "Poster" view: libraryBrowser.getSavedView(key) || "Poster"
}, pageData.query.ParentId = params.topParentId, libraryBrowser.loadSavedQueryValues(key, pageData.query)), pageData };
pageData.query.ParentId = params.topParentId;
libraryBrowser.loadSavedQueryValues(key, pageData.query);
}
return pageData;
} }
function getQuery() { function getQuery() {
return getPageData().query return getPageData().query;
} }
function getSavedQueryKey() { function getSavedQueryKey() {
return libraryBrowser.getSavedQueryKey("genres") return libraryBrowser.getSavedQueryKey("genres");
} }
function getPromise() { function getPromise() {
loading.show(); loading.show();
var query = getQuery(); var query = getQuery();
return ApiClient.getItems(ApiClient.getCurrentUserId(), query) return ApiClient.getItems(ApiClient.getCurrentUserId(), query);
} }
function reloadItems(context, promise) { function reloadItems(context, promise) {
var query = getQuery(); var query = getQuery();
promise.then(function(result) { promise.then(function (result) {
var html = ""; var html = "";
html = cardBuilder.getCardsHtml({ html = cardBuilder.getCardsHtml({
items: result.Items, items: result.Items,
shape: "square", shape: "square",
showTitle: !0, showTitle: true,
coverImage: !0, coverImage: true,
centerText: !0, centerText: true,
overlayPlayButton: !0, overlayPlayButton: true,
allowBottomPadding: !0, allowBottomPadding: true,
cardLayout: !1 cardLayout: false
}); });
var elem = context.querySelector("#items"); 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 = {}; var self = this;
self.getCurrentViewStyle = function() { var data = {};
return getPageData(tabContent).view
self.getCurrentViewStyle = function () {
return getPageData(tabContent).view;
}; };
var promise; var promise;
self.preRender = function() {
promise = getPromise() self.preRender = function () {
}, self.renderTab = function() { promise = getPromise();
reloadItems(tabContent, promise) };
}
} 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"; "use strict";
function itemsPerRow() { function itemsPerRow() {
var screenWidth = dom.getWindowSize().innerWidth; 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() { function enableScrollX() {
return !layoutManager.desktop return !layoutManager.desktop;
} }
function getSquareShape() { function getSquareShape() {
return enableScrollX() ? "overflowSquare" : "square" return enableScrollX() ? "overflowSquare" : "square";
} }
function loadLatest(page, parentId) { function loadLatest(page, parentId) {
loading.show(); loading.show();
var userId = ApiClient.getCurrentUserId(), var userId = ApiClient.getCurrentUserId();
options = { var options = {
IncludeItemTypes: "Audio", IncludeItemTypes: "Audio",
Limit: enableScrollX() ? 3 * itemsPerRow() : 2 * itemsPerRow(), Limit: enableScrollX() ? 3 * itemsPerRow() : 2 * itemsPerRow(),
Fields: "PrimaryImageAspectRatio,BasicSyncInfo", Fields: "PrimaryImageAspectRatio,BasicSyncInfo",
ParentId: parentId, ParentId: parentId,
ImageTypeLimit: 1, ImageTypeLimit: 1,
EnableImageTypes: "Primary,Backdrop,Banner,Thumb", EnableImageTypes: "Primary,Backdrop,Banner,Thumb",
EnableTotalRecordCount: !1 EnableTotalRecordCount: false
}; };
ApiClient.getJSON(ApiClient.getUrl("Users/" + userId + "/Items/Latest", options)).then(function(items) { ApiClient.getJSON(ApiClient.getUrl("Users/" + userId + "/Items/Latest", options)).then(function (items) {
var elem = page.querySelector("#recentlyAddedSongs"), var elem = page.querySelector("#recentlyAddedSongs");
supportsImageAnalysis = appHost.supports("imageanalysis"); var supportsImageAnalysis = appHost.supports("imageanalysis");
supportsImageAnalysis = !1, elem.innerHTML = cardBuilder.getCardsHtml({ supportsImageAnalysis = false;
elem.innerHTML = cardBuilder.getCardsHtml({
items: items, items: items,
showUnplayedIndicator: !1, showUnplayedIndicator: false,
showLatestItemsPopup: !1, showLatestItemsPopup: false,
shape: getSquareShape(), shape: getSquareShape(),
showTitle: !0, showTitle: true,
showParentTitle: !0, showParentTitle: true,
lazy: !0, lazy: true,
centerText: !supportsImageAnalysis, centerText: !supportsImageAnalysis,
overlayPlayButton: !supportsImageAnalysis, overlayPlayButton: !supportsImageAnalysis,
allowBottomPadding: !enableScrollX(), allowBottomPadding: !enableScrollX(),
cardLayout: supportsImageAnalysis, cardLayout: supportsImageAnalysis,
coverImage: !0 coverImage: true
}), imageLoader.lazyChildren(elem), loading.hide() });
}) imageLoader.lazyChildren(elem);
loading.hide();
});
} }
function loadRecentlyPlayed(page, parentId) { function loadRecentlyPlayed(page, parentId) {
@ -52,34 +68,42 @@ define(["browser", "layoutManager", "userSettings", "inputManager", "loading", "
SortOrder: "Descending", SortOrder: "Descending",
IncludeItemTypes: "Audio", IncludeItemTypes: "Audio",
Limit: itemsPerRow(), Limit: itemsPerRow(),
Recursive: !0, Recursive: true,
Fields: "PrimaryImageAspectRatio,AudioInfo", Fields: "PrimaryImageAspectRatio,AudioInfo",
Filters: "IsPlayed", Filters: "IsPlayed",
ParentId: parentId, ParentId: parentId,
ImageTypeLimit: 1, ImageTypeLimit: 1,
EnableImageTypes: "Primary,Backdrop,Banner,Thumb", 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"); var elem = page.querySelector("#recentlyPlayed");
result.Items.length ? elem.classList.remove("hide") : elem.classList.add("hide");
var itemsContainer = elem.querySelector(".itemsContainer"), if (result.Items.length) {
supportsImageAnalysis = appHost.supports("imageanalysis"); elem.classList.remove("hide");
supportsImageAnalysis = !1, itemsContainer.innerHTML = cardBuilder.getCardsHtml({ } else {
elem.classList.add("hide");
}
var itemsContainer = elem.querySelector(".itemsContainer");
var supportsImageAnalysis = appHost.supports("imageanalysis");
supportsImageAnalysis = false;
itemsContainer.innerHTML = cardBuilder.getCardsHtml({
items: result.Items, items: result.Items,
showUnplayedIndicator: !1, showUnplayedIndicator: false,
shape: getSquareShape(), shape: getSquareShape(),
showTitle: !0, showTitle: true,
showParentTitle: !0, showParentTitle: true,
action: "instantmix", action: "instantmix",
lazy: !0, lazy: true,
centerText: !supportsImageAnalysis, centerText: !supportsImageAnalysis,
overlayMoreButton: !supportsImageAnalysis, overlayMoreButton: !supportsImageAnalysis,
allowBottomPadding: !enableScrollX(), allowBottomPadding: !enableScrollX(),
cardLayout: supportsImageAnalysis, cardLayout: supportsImageAnalysis,
coverImage: !0 coverImage: true
}), imageLoader.lazyChildren(itemsContainer) });
}) imageLoader.lazyChildren(itemsContainer);
});
} }
function loadFrequentlyPlayed(page, parentId) { function loadFrequentlyPlayed(page, parentId) {
@ -88,40 +112,53 @@ define(["browser", "layoutManager", "userSettings", "inputManager", "loading", "
SortOrder: "Descending", SortOrder: "Descending",
IncludeItemTypes: "Audio", IncludeItemTypes: "Audio",
Limit: itemsPerRow(), Limit: itemsPerRow(),
Recursive: !0, Recursive: true,
Fields: "PrimaryImageAspectRatio,AudioInfo", Fields: "PrimaryImageAspectRatio,AudioInfo",
Filters: "IsPlayed", Filters: "IsPlayed",
ParentId: parentId, ParentId: parentId,
ImageTypeLimit: 1, ImageTypeLimit: 1,
EnableImageTypes: "Primary,Backdrop,Banner,Thumb", 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"); var elem = page.querySelector("#topPlayed");
result.Items.length ? elem.classList.remove("hide") : elem.classList.add("hide");
var itemsContainer = elem.querySelector(".itemsContainer"), if (result.Items.length) {
supportsImageAnalysis = appHost.supports("imageanalysis"); elem.classList.remove("hide");
supportsImageAnalysis = !1, itemsContainer.innerHTML = cardBuilder.getCardsHtml({ } else {
elem.classList.add("hide");
}
var itemsContainer = elem.querySelector(".itemsContainer");
var supportsImageAnalysis = appHost.supports("imageanalysis");
supportsImageAnalysis = false;
itemsContainer.innerHTML = cardBuilder.getCardsHtml({
items: result.Items, items: result.Items,
showUnplayedIndicator: !1, showUnplayedIndicator: false,
shape: getSquareShape(), shape: getSquareShape(),
showTitle: !0, showTitle: true,
showParentTitle: !0, showParentTitle: true,
action: "instantmix", action: "instantmix",
lazy: !0, lazy: true,
centerText: !supportsImageAnalysis, centerText: !supportsImageAnalysis,
overlayMoreButton: !supportsImageAnalysis, overlayMoreButton: !supportsImageAnalysis,
allowBottomPadding: !enableScrollX(), allowBottomPadding: !enableScrollX(),
cardLayout: supportsImageAnalysis, cardLayout: supportsImageAnalysis,
coverImage: !0 coverImage: true
}), imageLoader.lazyChildren(itemsContainer) });
}) imageLoader.lazyChildren(itemsContainer);
});
} }
function loadSuggestionsTab(page, tabContent, parentId) { function loadSuggestionsTab(page, tabContent, parentId) {
console.log("loadSuggestionsTab"), loadLatest(tabContent, parentId), loadRecentlyPlayed(tabContent, parentId), loadFrequentlyPlayed(tabContent, parentId), require(["components/favoriteitems"], function(favoriteItems) { console.log("loadSuggestionsTab");
favoriteItems.render(tabContent, ApiClient.getCurrentUserId(), parentId, ["favoriteArtists", "favoriteAlbums", "favoriteSongs"]) 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() { function getTabs() {
@ -142,135 +179,227 @@ define(["browser", "layoutManager", "userSettings", "inputManager", "loading", "
}, { }, {
name: Globalize.translate("ButtonSearch"), name: Globalize.translate("ButtonSearch"),
cssClass: "searchTabButton" cssClass: "searchTabButton"
}] }];
} }
function getDefaultTabIndex(folderId) { function getDefaultTabIndex(folderId) {
switch (userSettings.get("landing-" + folderId)) { switch (userSettings.get("landing-" + folderId)) {
case "albums": case "albums":
return 1; return 1;
case "albumartists": case "albumartists":
return 2; return 2;
case "artists": case "artists":
return 3; return 3;
case "playlists": case "playlists":
return 4; return 4;
case "songs": case "songs":
return 5; return 5;
case "genres": case "genres":
return 6; return 6;
default: default:
return 0 return 0;
} }
} }
return function(view, params) {
return function (view, params) {
function reload() { function reload() {
loading.show(); loading.show();
var tabContent = view.querySelector(".pageTabContent[data-index='0']"); var tabContent = view.querySelector(".pageTabContent[data-index='0']");
loadSuggestionsTab(view, tabContent, params.topParentId) loadSuggestionsTab(view, tabContent, params.topParentId);
} }
function enableScrollX() { function enableScrollX() {
return browser.mobile return browser.mobile;
} }
function setScrollClasses(elem, scrollX) { 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) { function onBeforeTabChange(e) {
preLoadTab(view, parseInt(e.detail.selectedTabIndex)) preLoadTab(view, parseInt(e.detail.selectedTabIndex));
} }
function onTabChange(e) { function onTabChange(e) {
loadTab(view, parseInt(e.detail.selectedTabIndex)) loadTab(view, parseInt(e.detail.selectedTabIndex));
} }
function getTabContainers() { function getTabContainers() {
return view.querySelectorAll(".pageTabContent") return view.querySelectorAll(".pageTabContent");
} }
function initTabs() { function initTabs() {
mainTabsManager.setTabs(view, currentTabIndex, getTabs, getTabContainers, onBeforeTabChange, onTabChange) mainTabsManager.setTabs(view, currentTabIndex, getTabs, getTabContainers, onBeforeTabChange, onTabChange);
} }
function getTabController(page, index, callback) { function getTabController(page, index, callback) {
var depends = []; var depends = [];
switch (index) { switch (index) {
case 0: case 0:
break; break;
case 1: case 1:
depends.push("controllers/music/musicalbums"); depends.push("controllers/music/musicalbums");
break; break;
case 2: case 2:
case 3: case 3:
depends.push("controllers/music/musicartists"); depends.push("controllers/music/musicartists");
break; break;
case 4: case 4:
depends.push("controllers/music/musicplaylists"); depends.push("controllers/music/musicplaylists");
break; break;
case 5: case 5:
depends.push("controllers/music/songs"); depends.push("controllers/music/songs");
break; break;
case 6: case 6:
depends.push("controllers/music/musicgenres"); depends.push("controllers/music/musicgenres");
break; break;
case 7: case 7:
depends.push("scripts/searchtab") depends.push("scripts/searchtab");
} }
require(depends, function(controllerFactory) {
require(depends, function (controllerFactory) {
var tabContent; 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]; var controller = tabControllers[index];
controller || (tabContent = view.querySelector(".pageTabContent[data-index='" + index + "']"), controller = 0 === index ? self : 7 === index ? new controllerFactory(view, tabContent, {
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", collectionType: "music",
parentId: params.topParentId 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) });
}) } 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) { function preLoadTab(page, index) {
getTabController(page, index, function(controller) { getTabController(page, index, function (controller) {
-1 == renderedTabs.indexOf(index) && controller.preRender && controller.preRender() if (renderedTabs.indexOf(index) == -1 && controller.preRender) {
}) controller.preRender();
}
});
} }
function loadTab(page, index) { function loadTab(page, index) {
currentTabIndex = index, getTabController(page, index, function(controller) { currentTabIndex = index;
initialTabIndex = null, -1 == renderedTabs.indexOf(index) && (renderedTabs.push(index), controller.renderTab()) getTabController(page, index, function (controller) {
}) initialTabIndex = null;
if (renderedTabs.indexOf(index) == -1) {
renderedTabs.push(index);
controller.renderTab();
}
});
} }
function onInputCommand(e) { function onInputCommand(e) {
switch (e.detail.command) { switch (e.detail.command) {
case "search": 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)), var isViewRestored;
initialTabIndex = currentTabIndex; var self = this;
self.initTab = function() { var currentTabIndex = parseInt(params.tab || getDefaultTabIndex(params.topParentId));
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()) var initialTabIndex = currentTabIndex;
}, self.renderTab = function() {
reload() 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());
}
}; };
var tabControllers = [],
renderedTabs = []; self.renderTab = function () {
view.addEventListener("viewshow", function(e) { reload();
if (isViewRestored = e.detail.isRestored, initTabs(), !view.getAttribute("data-title")) { };
var tabControllers = [];
var renderedTabs = [];
view.addEventListener("viewshow", function (e) {
isViewRestored = e.detail.isRestored;
initTabs();
if (!view.getAttribute("data-title")) {
var parentId = params.topParentId; var parentId = params.topParentId;
parentId ? ApiClient.getItem(ApiClient.getCurrentUserId(), parentId).then(function(item) {
view.setAttribute("data-title", item.Name), libraryMenu.setTitle(item.Name) if (parentId) {
}) : (view.setAttribute("data-title", Globalize.translate("TabMusic")), libraryMenu.setTitle(Globalize.translate("TabMusic"))) 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) {
t.destroy && t.destroy()
})
})
} }
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,97 +1,140 @@
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"; "use strict";
return function(view, params, tabContent) {
return function (view, params, tabContent) {
function getPageData(context) { function getPageData(context) {
var key = getSavedQueryKey(context), var key = getSavedQueryKey(context);
pageData = data[key]; var pageData = data[key];
return pageData || (pageData = data[key] = {
if (!pageData) {
pageData = data[key] = {
query: { query: {
SortBy: "Album,SortName", SortBy: "Album,SortName",
SortOrder: "Ascending", SortOrder: "Ascending",
IncludeItemTypes: "Audio", IncludeItemTypes: "Audio",
Recursive: !0, Recursive: true,
Fields: "AudioInfo,ParentId", Fields: "AudioInfo,ParentId",
Limit: 100, Limit: 100,
StartIndex: 0, StartIndex: 0,
ImageTypeLimit: 1, ImageTypeLimit: 1,
EnableImageTypes: "Primary" EnableImageTypes: "Primary"
} }
}, pageData.query.ParentId = params.topParentId, libraryBrowser.loadSavedQueryValues(key, pageData.query)), pageData };
pageData.query.ParentId = params.topParentId;
libraryBrowser.loadSavedQueryValues(key, pageData.query);
}
return pageData;
} }
function getQuery(context) { function getQuery(context) {
return getPageData(context).query return getPageData(context).query;
} }
function getSavedQueryKey(context) { 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) { function reloadItems(page) {
loading.show(); loading.show();
isLoading = true; isLoading = true;
var query = getQuery(page); var query = getQuery(page);
ApiClient.getItems(Dashboard.getCurrentUserId(), query).then(function(result) { ApiClient.getItems(Dashboard.getCurrentUserId(), query).then(function (result) {
function onNextPageClick() { function onNextPageClick() {
if (isLoading) return; if (isLoading) {
query.StartIndex += query.Limit, reloadItems(tabContent) return;
}
query.StartIndex += query.Limit;
reloadItems(tabContent);
} }
function onPreviousPageClick() { function onPreviousPageClick() {
if (isLoading) return; if (isLoading) {
query.StartIndex -= query.Limit, reloadItems(tabContent) return;
} }
query.StartIndex -= query.Limit;
reloadItems(tabContent);
}
window.scrollTo(0, 0); window.scrollTo(0, 0);
var i, length, pagingHtml = libraryBrowser.getQueryPagingHtml({ var i;
var length;
var pagingHtml = libraryBrowser.getQueryPagingHtml({
startIndex: query.StartIndex, startIndex: query.StartIndex,
limit: query.Limit, limit: query.Limit,
totalRecordCount: result.TotalRecordCount, totalRecordCount: result.TotalRecordCount,
showLimit: !1, showLimit: false,
updatePageSizeSetting: !1, updatePageSizeSetting: false,
addLayoutButton: !1, addLayoutButton: false,
sortButton: !1, sortButton: false,
filterButton: !1 filterButton: false
}), });
html = listView.getListViewHtml({ var html = listView.getListViewHtml({
items: result.Items, items: result.Items,
action: "playallfromhere", action: "playallfromhere",
smallIcon: !0, smallIcon: true,
artist: !0, artist: true,
addToListButton: !0 addToListButton: true
}), });
elems = tabContent.querySelectorAll(".paging"); 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[i].addEventListener("click", onNextPageClick); for (i = 0, length = elems.length; i < length; i++) {
for (elems = tabContent.querySelectorAll(".btnPreviousPage"), i = 0, length = elems.length; i < length; i++) elems[i].addEventListener("click", onPreviousPageClick); 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"); var itemsContainer = tabContent.querySelector(".itemsContainer");
itemsContainer.innerHTML = html; itemsContainer.innerHTML = html;
imageLoader.lazyChildren(itemsContainer); imageLoader.lazyChildren(itemsContainer);
libraryBrowser.saveQueryValues(getSavedQueryKey(page), query); libraryBrowser.saveQueryValues(getSavedQueryKey(page), query);
loading.hide(); loading.hide();
isLoading = false; isLoading = false;
}) });
} }
var self = this,
data = {}, var self = this;
isLoading = false; var data = {};
self.showFilterMenu = function() { var isLoading = false;
require(["components/filterdialog/filterdialog"], function(filterDialogFactory) {
self.showFilterMenu = function () {
require(["components/filterdialog/filterdialog"], function (filterDialogFactory) {
var filterDialog = new filterDialogFactory({ var filterDialog = new filterDialogFactory({
query: getQuery(tabContent), query: getQuery(tabContent),
mode: "songs", mode: "songs",
serverId: ApiClient.serverId() serverId: ApiClient.serverId()
}); });
events.on(filterDialog, "filterchange", function() { events.on(filterDialog, "filterchange", function () {
getQuery(tabContent).StartIndex = 0, reloadItems(tabContent) getQuery(tabContent).StartIndex = 0;
}), filterDialog.show() reloadItems(tabContent);
}) });
}, self.getCurrentViewStyle = function() { filterDialog.show();
return getPageData(tabContent).view });
}, };
function(tabContent) {
tabContent.querySelector(".btnFilter").addEventListener("click", function() { self.getCurrentViewStyle = function () {
self.showFilterMenu() return getPageData(tabContent).view;
}), tabContent.querySelector(".btnSort").addEventListener("click", function(e) { };
function initPage(tabContent) {
tabContent.querySelector(".btnFilter").addEventListener("click", function () {
self.showFilterMenu();
});
tabContent.querySelector(".btnSort").addEventListener("click", function (e) {
libraryBrowser.showSortMenu({ libraryBrowser.showSortMenu({
items: [{ items: [{
name: Globalize.translate("OptionTrackName"), name: Globalize.translate("OptionTrackName"),
@ -121,15 +164,22 @@ define(["events", "libraryBrowser", "imageLoader", "listView", "loading", "emby-
name: Globalize.translate("OptionRuntime"), name: Globalize.translate("OptionRuntime"),
id: "Runtime,AlbumArtist,Album,SortName" id: "Runtime,AlbumArtist,Album,SortName"
}], }],
callback: function() { callback: function () {
getQuery(tabContent).StartIndex = 0, reloadItems(tabContent) getQuery(tabContent).StartIndex = 0;
reloadItems(tabContent);
}, },
query: getQuery(tabContent), query: getQuery(tabContent),
button: e.target button: e.target
}) });
}) });
}(tabContent), self.renderTab = function() {
reloadItems(tabContent)
}, self.destroy = function() {}
} }
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"; "use strict";
function fillItems(elem, items, cssClass, idPrefix, currentList, isEnabledList) { function fillItems(elem, items, cssClass, idPrefix, currentList, isEnabledList) {
var html = '<div class="checkboxList paperList" style="padding: .5em 1em;">'; var html = '<div class="checkboxList paperList" style="padding: .5em 1em;">';
html += items.map(function(u) { html += items.map(function (u) {
var isChecked = isEnabledList ? -1 != currentList.indexOf(u.Id) : -1 == currentList.indexOf(u.Id), var isChecked = isEnabledList ? currentList.indexOf(u.Id) != -1 : currentList.indexOf(u.Id) == -1;
checkedHtml = isChecked ? ' checked="checked"' : ""; 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>" 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") }).join("");
html += "</div>";
elem.html(html).trigger("create");
} }
function reload(page) { function reload(page) {
var type = getParameterByName("type"), var type = getParameterByName("type");
promise1 = ApiClient.getUsers(), var promise1 = ApiClient.getUsers();
promise2 = ApiClient.getNamedConfiguration(notificationsConfigurationKey), var promise2 = ApiClient.getNamedConfiguration(notificationsConfigurationKey);
promise3 = ApiClient.getJSON(ApiClient.getUrl("Notifications/Types")), var promise3 = ApiClient.getJSON(ApiClient.getUrl("Notifications/Types"));
promise4 = ApiClient.getJSON(ApiClient.getUrl("Notifications/Services")); var promise4 = ApiClient.getJSON(ApiClient.getUrl("Notifications/Services"));
Promise.all([promise1, promise2, promise3, promise4]).then(function(responses) { Promise.all([promise1, promise2, promise3, promise4]).then(function (responses) {
var users = responses[0], var users = responses[0];
notificationOptions = responses[1], var notificationOptions = responses[1];
types = responses[2], var types = responses[2];
services = responses[3], var services = responses[3];
notificationConfig = notificationOptions.Options.filter(function(n) { var notificationConfig = notificationOptions.Options.filter(function (n) {
return n.Type == type return n.Type == type;
})[0], })[0];
typeInfo = types.filter(function(n) { var typeInfo = types.filter(function (n) {
return n.Type == type return n.Type == type;
})[0] || {}; })[0] || {};
typeInfo.IsBasedOnUserEvent ? $(".monitorUsers", page).show() : $(".monitorUsers", page).hide(), $(".notificationType", page).html(typeInfo.Name || "Unknown Notification"), notificationConfig || (notificationConfig = {
if (typeInfo.IsBasedOnUserEvent) {
$(".monitorUsers", page).show();
} else {
$(".monitorUsers", page).hide();
}
$(".notificationType", page).html(typeInfo.Name || "Unknown Notification");
if (!notificationConfig) {
notificationConfig = {
DisabledMonitorUsers: [], DisabledMonitorUsers: [],
SendToUsers: [], SendToUsers: [],
DisabledServices: [], DisabledServices: [],
SendToUserMode: "Admins" 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") };
}) }
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) { function save(page) {
var type = getParameterByName("type"), var type = getParameterByName("type");
promise1 = ApiClient.getNamedConfiguration(notificationsConfigurationKey), var promise1 = ApiClient.getNamedConfiguration(notificationsConfigurationKey);
promise2 = ApiClient.getJSON(ApiClient.getUrl("Notifications/Types")); var promise2 = ApiClient.getJSON(ApiClient.getUrl("Notifications/Types"));
Promise.all([promise1, promise2]).then(function(responses) { Promise.all([promise1, promise2]).then(function (responses) {
var notificationOptions = responses[0], var notificationOptions = responses[0];
types = responses[1], var types = responses[1];
notificationConfig = notificationOptions.Options.filter(function(n) { var notificationConfig = notificationOptions.Options.filter(function (n) {
return n.Type == type return n.Type == type;
})[0]; })[0];
notificationConfig || (notificationConfig = {
if (!notificationConfig) {
notificationConfig = {
Type: type Type: type
}, notificationOptions.Options.push(notificationConfig)); };
types.filter(function(n) { notificationOptions.Options.push(notificationConfig);
return n.Type == type }
types.filter(function (n) {
return n.Type == type;
})[0]; })[0];
notificationConfig.Enabled = $("#chkEnabled", page).checked(), notificationConfig.SendToUserMode = $("#selectUsers", page).val(), notificationConfig.DisabledMonitorUsers = $(".chkMonitor", page).get().filter(function(c) { notificationConfig.Enabled = $("#chkEnabled", page).checked();
return !c.checked notificationConfig.SendToUserMode = $("#selectUsers", page).val();
}).map(function(c) { notificationConfig.DisabledMonitorUsers = $(".chkMonitor", page).get().filter(function (c) {
return c.getAttribute("data-itemid") return !c.checked;
}), notificationConfig.SendToUsers = $(".chkSendTo", page).get().filter(function(c) { }).map(function (c) {
return c.checked return c.getAttribute("data-itemid");
}).map(function(c) { });
return c.getAttribute("data-itemid") notificationConfig.SendToUsers = $(".chkSendTo", page).get().filter(function (c) {
}), notificationConfig.DisabledServices = $(".chkService", page).get().filter(function(c) { return c.checked;
return !c.checked }).map(function (c) {
}).map(function(c) { return c.getAttribute("data-itemid");
return c.getAttribute("data-itemid") });
}), ApiClient.updateNamedConfiguration(notificationsConfigurationKey, notificationOptions).then(function(r) { notificationConfig.DisabledServices = $(".chkService", page).get().filter(function (c) {
Dashboard.processServerConfigurationUpdateResult(), Dashboard.navigate("notificationsettings.html") 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() { function onSubmit() {
return save($(this).parents(".page")), !1 save($(this).parents(".page"));
return false;
} }
var notificationsConfigurationKey = "notifications"; var notificationsConfigurationKey = "notifications";
$(document).on("pageinit", "#notificationSettingPage", function() { $(document).on("pageinit", "#notificationSettingPage", function () {
var page = this; var page = this;
$("#selectUsers", page).on("change", function() { $("#selectUsers", page).on("change", function () {
"Custom" == this.value ? $(".selectCustomUsers", page).show() : $(".selectCustomUsers", page).hide() if ("Custom" == this.value) {
}), $(".notificationSettingForm").off("submit", onSubmit).on("submit", onSubmit) $(".selectCustomUsers", page).show();
}).on("pageshow", "#notificationSettingPage", function() { } else {
reload(this) $(".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"; "use strict";
return function(view, params) {
var remoteControl = new remotecontrolFactory; return function (view, params) {
remoteControl.init(view, view.querySelector(".remoteControlContent")), view.addEventListener("viewshow", function(e) { var remoteControl = new remotecontrolFactory();
libraryMenu.setTransparentMenu(!0), remoteControl && remoteControl.onShow() remoteControl.init(view, view.querySelector(".remoteControlContent"));
}), view.addEventListener("viewbeforehide", function(e) { view.addEventListener("viewshow", function (e) {
libraryMenu.setTransparentMenu(!1), remoteControl && remoteControl.destroy() 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"; "use strict";
function loadPage(page, config) { 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() { function onSubmit() {
loading.show(); loading.show();
var form = this; var form = this;
return ApiClient.getServerConfiguration().then(function(config) { 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) config.MinResumePct = $('#txtMinResumePct', form).val();
}), !1 config.MaxResumePct = $('#txtMaxResumePct', form).val();
config.MinResumeDurationSeconds = $('#txtMinResumeDuration', form).val();
ApiClient.updateServerConfiguration(config).then(Dashboard.processServerConfigurationUpdateResult);
});
return false;
} }
function getTabs() { function getTabs() {
@ -23,17 +32,17 @@ define(["jQuery", "loading", "libraryMenu"], function($, loading, libraryMenu) {
}, { }, {
href: "streamingsettings.html", href: "streamingsettings.html",
name: Globalize.translate("TabStreaming") name: Globalize.translate("TabStreaming")
}] }];
} }
$(document).on("pageinit", "#playbackConfigurationPage", function() { $(document).on("pageinit", "#playbackConfigurationPage", function () {
$(".playbackConfigurationForm").off("submit", onSubmit).on("submit", onSubmit) $(".playbackConfigurationForm").off("submit", onSubmit).on("submit", onSubmit)
}).on("pageshow", "#playbackConfigurationPage", function() { }).on("pageshow", "#playbackConfigurationPage", function () {
loading.show(); loading.show();
libraryMenu.setTabs("playback", 1, getTabs); libraryMenu.setTabs("playback", 1, getTabs);
var page = this; var page = this;
ApiClient.getServerConfiguration().then(function(config) { ApiClient.getServerConfiguration().then(function (config) {
loadPage(page, 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"; "use strict";
function fillTimeOfDay(select) { function fillTimeOfDay(select) {
for (var options = [], i = 0; i < 864e5; i += 9e5) options.push({
name: ScheduledTaskPage.getDisplayTime(1e4 * i), var options = [];
value: 1e4 * i
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) {
select.innerHTML = options.map(function (o) {
return '<option value="' + o.value + '">' + o.name + '</option>';
}).join("");
}
Array.prototype.remove = function (from, to) {
var rest = this.slice((to || from) + 1 || this.length); 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 = { var ScheduledTaskPage = {
refreshScheduledTask: function(view) { refreshScheduledTask: function (view) {
loading.show(); loading.show();
var id = getParameterByName("id"); var id = getParameterByName("id");
ApiClient.getScheduledTask(id).then(function(task) { ApiClient.getScheduledTask(id).then(function (task) {
ScheduledTaskPage.loadScheduledTask(view, task) ScheduledTaskPage.loadScheduledTask(view, task);
}) });
}, },
loadScheduledTask: function(view, task) { loadScheduledTask: function (view, task) {
$(".taskName", view).html(task.Name), $("#pTaskDescription", view).html(task.Description), require(["listViewStyle"], function() { $(".taskName", view).html(task.Name);
ScheduledTaskPage.loadTaskTriggers(view, task) $("#pTaskDescription", view).html(task.Description);
}), loading.hide()
require(["listViewStyle"], function () {
ScheduledTaskPage.loadTaskTriggers(view, task);
});
loading.hide();
}, },
loadTaskTriggers: function(context, task) { loadTaskTriggers: function (context, task) {
var html = ""; var html = "";
html += '<div class="paperList">'; html += '<div class="paperList">';
for (var i = 0, length = task.Triggers.length; i < length; i++) { for (var i = 0, length = task.Triggers.length; i < length; i++) {
var trigger = task.Triggers[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">'; html += '<div class="listItemBodyText secondary">';
var hours = trigger.MaxRuntimeTicks / 36e9; 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 += '<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 += "</div>", context.querySelector(".taskTriggers").innerHTML = html
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;
}, },
getTriggerFriendlyName: function(trigger) { getTriggerFriendlyName: function (trigger) {
if ("DailyTrigger" == trigger.Type) return "Daily at " + ScheduledTaskPage.getDisplayTime(trigger.TimeOfDayTicks); if ("DailyTrigger" == trigger.Type) {
if ("WeeklyTrigger" == trigger.Type) return trigger.DayOfWeek + "s at " + ScheduledTaskPage.getDisplayTime(trigger.TimeOfDayTicks); return "Daily at " + ScheduledTaskPage.getDisplayTime(trigger.TimeOfDayTicks);
if ("SystemEventTrigger" == trigger.Type && "WakeFromSleep" == trigger.SystemEvent) return "On wake from sleep"; }
if ("IntervalTrigger" == trigger.Type) {
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; 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";
} }
return "StartupTrigger" == trigger.Type ? "On application startup" : trigger.Type if (hours == .5) {
return "Every 30 minutes";
}
if (hours == .75) {
return "Every 45 minutes";
}
if (hours == 1) {
return "Every hour";
}
return "Every " + hours + " hours";
}
if (trigger.Type == "StartupTrigger") {
return "On application startup";
}
return trigger.Type;
}, },
getDisplayTime: function(ticks) { getDisplayTime: function (ticks) {
var ms = ticks / 1e4, var ms = ticks / 1e4;
now = new Date; var now = new Date();
return now.setHours(0, 0, 0, 0), now.setTime(now.getTime() + ms), datetime.getDisplayTime(now) now.setHours(0, 0, 0, 0);
now.setTime(now.getTime() + ms);
return datetime.getDisplayTime(now);
}, },
showAddTriggerPopup: function(view) { showAddTriggerPopup: function (view) {
$("#selectTriggerType", view).val("DailyTrigger"), view.querySelector("#selectTriggerType").dispatchEvent(new CustomEvent("change", {})), $("#popupAddTrigger", view).removeClass("hide") $("#selectTriggerType", view).val("DailyTrigger");
view.querySelector("#selectTriggerType").dispatchEvent(new CustomEvent("change", {}));
$("#popupAddTrigger", view).removeClass("hide");
}, },
confirmDeleteTrigger: function(view, index) { confirmDeleteTrigger: function (view, index) {
require(["confirm"], function(confirm) { require(["confirm"], function (confirm) {
confirm(globalize.translate("MessageDeleteTaskTrigger"), globalize.translate("HeaderDeleteTaskTrigger")).then(function() { confirm(globalize.translate("MessageDeleteTaskTrigger"), globalize.translate("HeaderDeleteTaskTrigger")).then(function () {
ScheduledTaskPage.deleteTrigger(view, index) ScheduledTaskPage.deleteTrigger(view, index);
}) });
}) });
}, },
deleteTrigger: function(view, index) { deleteTrigger: function (view, index) {
loading.show(); loading.show();
var id = getParameterByName("id"); var id = getParameterByName("id");
ApiClient.getScheduledTask(id).then(function(task) { ApiClient.getScheduledTask(id).then(function (task) {
task.Triggers.remove(index), ApiClient.updateScheduledTaskTriggers(task.Id, task.Triggers).then(function() { task.Triggers.remove(index);
ScheduledTaskPage.refreshScheduledTask(view) ApiClient.updateScheduledTaskTriggers(task.Id, task.Triggers).then(function () {
}) ScheduledTaskPage.refreshScheduledTask(view);
}) });
});
}, },
refreshTriggerFields: function(page, triggerType) { 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")) 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 = { var trigger = {
Type: $("#selectTriggerType", page).val() 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"; 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) { function onSubmit(e) {
loading.show(); loading.show();
var id = getParameterByName("id"); var id = getParameterByName("id");
ApiClient.getScheduledTask(id).then(function(task) { ApiClient.getScheduledTask(id).then(function (task) {
task.Triggers.push(ScheduledTaskPage.getTriggerToAdd(view)), ApiClient.updateScheduledTaskTriggers(task.Id, task.Triggers).then(function() { task.Triggers.push(ScheduledTaskPage.getTriggerToAdd(view));
$("#popupAddTrigger").addClass("hide"), ScheduledTaskPage.refreshScheduledTask(view) ApiClient.updateScheduledTaskTriggers(task.Id, task.Triggers).then(function () {
}) $("#popupAddTrigger").addClass("hide");
}), e.preventDefault() 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(".addTriggerForm").addEventListener("submit", onSubmit);
}), view.querySelector(".btnAddTrigger").addEventListener("click", function() { fillTimeOfDay(view.querySelector("#selectTimeOfDay"));
ScheduledTaskPage.showAddTriggerPopup(view) $(view.querySelector("#popupAddTrigger").parentNode).trigger("create");
}), view.addEventListener("click", function(e) { 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"); var btnDeleteTrigger = dom.parentWithClass(e.target, "btnDeleteTrigger");
btnDeleteTrigger && ScheduledTaskPage.confirmDeleteTrigger(view, parseInt(btnDeleteTrigger.getAttribute("data-index")))
}), view.addEventListener("viewshow", function() { if (btnDeleteTrigger) {
ScheduledTaskPage.refreshScheduledTask(view) 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"; "use strict";
return function(view, params) {
return function (view, params) {
function onSearch(e, value) { function onSearch(e, value) {
self.searchResults.search(value) self.searchResults.search(value);
} }
var self = this; var self = this;
view.addEventListener("viewshow", function() { view.addEventListener("viewshow", function () {
self.searchFields || (self.searchFields = new SearchFields({ if (!self.searchFields) {
self.searchFields = new SearchFields({
element: view.querySelector(".searchFields") element: view.querySelector(".searchFields")
}), self.searchResults = new SearchResults({ });
self.searchResults = new SearchResults({
element: view.querySelector(".searchResults"), element: view.querySelector(".searchResults"),
serverId: params.serverId || ApiClient.serverId(), serverId: params.serverId || ApiClient.serverId(),
parentId: params.parentId, parentId: params.parentId,
collectionType: params.collectionType collectionType: params.collectionType
}), events.on(self.searchFields, "search", onSearch)) });
}), view.addEventListener("viewdestroy", function() { events.on(self.searchFields, "search", onSearch);
self.searchFields && (self.searchFields.destroy(), self.searchFields = null), self.searchResults && (self.searchResults.destroy(), self.searchResults = null)
})
} }
});
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,28 +1,32 @@
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"; "use strict";
function renderSelectServerItems(view, servers) { function renderSelectServerItems(view, servers) {
var items = servers.map(function(server) { var items = servers.map(function (server) {
return { return {
name: server.Name, name: server.Name,
showIcon: !0, showIcon: true,
icon: "&#xE307;", icon: "&#xE307;",
cardType: "", cardType: "",
id: server.Id, id: server.Id,
server: server server: server
} };
}); });
var html = items.map(function(item) { var html = items.map(function (item) {
var cardImageContainer; var cardImageContainer;
if (item.showIcon) { if (item.showIcon) {
cardImageContainer = '<i class="cardImageIcon md-icon">' + item.icon + "</i>"; cardImageContainer = '<i class="cardImageIcon md-icon">' + item.icon + "</i>";
} else { } else {
cardImageContainer = '<div class="cardImage" style="' + item.cardImageStyle + '"></div>'; cardImageContainer = '<div class="cardImage" style="' + item.cardImageStyle + '"></div>';
} }
var cardBoxCssClass = "cardBox"; var cardBoxCssClass = "cardBox";
if (layoutManager.tv) { if (layoutManager.tv) {
cardBoxCssClass += " cardBox-focustransform"; cardBoxCssClass += " cardBox-focustransform";
} }
var innerOpening = '<div class="' + cardBoxCssClass + '">'; var innerOpening = '<div class="' + cardBoxCssClass + '">';
var cardContainer = ''; 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 += '<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 + '">';
@ -42,9 +46,11 @@ define(["loading", "appRouter", "layoutManager", "appSettings", "apphost", "focu
return cardContainer; return cardContainer;
}).join(""); }).join("");
var itemsContainer = view.querySelector(".servers"); var itemsContainer = view.querySelector(".servers");
if (!items.length) { if (!items.length) {
html = '<p>' + globalize.translate("MessageNoServersAvailable") + "</p>"; html = '<p>' + globalize.translate("MessageNoServersAvailable") + "</p>";
} }
itemsContainer.innerHTML = html; itemsContainer.innerHTML = html;
loading.hide(); loading.hide();
} }
@ -73,7 +79,7 @@ define(["loading", "appRouter", "layoutManager", "appSettings", "apphost", "focu
} }
function alertTextWithOptions(options) { function alertTextWithOptions(options) {
require(["alert"], function(alert) { require(["alert"], function (alert) {
alert(options); alert(options);
}); });
} }
@ -82,38 +88,42 @@ define(["loading", "appRouter", "layoutManager", "appSettings", "apphost", "focu
alertText(globalize.translate("MessageUnableToConnectToServer"), globalize.translate("HeaderConnectionFailure")); alertText(globalize.translate("MessageUnableToConnectToServer"), globalize.translate("HeaderConnectionFailure"));
} }
return function(view, params) { return function (view, params) {
function connectToServer(server) { function connectToServer(server) {
loading.show(); loading.show();
connectionManager.connectToServer(server, { connectionManager.connectToServer(server, {
enableAutoLogin: appSettings.enableAutoLogin() enableAutoLogin: appSettings.enableAutoLogin()
}).then(function(result) { }).then(function (result) {
loading.hide(); loading.hide();
var apiClient = result.ApiClient; var apiClient = result.ApiClient;
switch (result.State) { switch (result.State) {
case "SignedIn": case "SignedIn":
Dashboard.onServerChanged(apiClient.getCurrentUserId(), apiClient.accessToken(), apiClient); Dashboard.onServerChanged(apiClient.getCurrentUserId(), apiClient.accessToken(), apiClient);
Dashboard.navigate("home.html"); Dashboard.navigate("home.html");
break; break;
case "ServerSignIn": case "ServerSignIn":
Dashboard.onServerChanged(null, null, apiClient); Dashboard.onServerChanged(null, null, apiClient);
Dashboard.navigate("login.html?serverid=" + result.Servers[0].Id); Dashboard.navigate("login.html?serverid=" + result.Servers[0].Id);
break; break;
case "ServerUpdateNeeded": case "ServerUpdateNeeded":
alertTextWithOptions({ alertTextWithOptions({
text: globalize.translate("core#ServerUpdateNeeded", "https://github.com/jellyfin/jellyfin"), 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>') html: globalize.translate("core#ServerUpdateNeeded", '<a href="https://github.com/jellyfin/jellyfin">https://github.com/jellyfin/jellyfin</a>')
}); });
break; break;
default: default:
showServerConnectionFailure(); showServerConnectionFailure();
} }
}) });
} }
function deleteServer(server) { function deleteServer(server) {
loading.show(); loading.show();
connectionManager.deleteServer(server.Id).then(function() { connectionManager.deleteServer(server.Id).then(function () {
loading.hide(); loading.hide();
loadServers(); loadServers();
}); });
@ -132,20 +142,22 @@ define(["loading", "appRouter", "layoutManager", "appSettings", "apphost", "focu
actionSheet.show({ actionSheet.show({
items: menuItems, items: menuItems,
title: server.Name title: server.Name
}).then(function(id) { }).then(function (id) {
switch (id) { switch (id) {
case "connect": case "connect":
connectToServer(server); connectToServer(server);
break; break;
case "delete": case "delete":
deleteServer(server); deleteServer(server);
} }
}) });
} }
function onServersRetrieved(result) { function onServersRetrieved(result) {
servers = result; servers = result;
renderSelectServerItems(view, result); renderSelectServerItems(view, result);
if (layoutManager.tv) { if (layoutManager.tv) {
focusManager.autoFocus(view); focusManager.autoFocus(view);
} }
@ -158,25 +170,29 @@ define(["loading", "appRouter", "layoutManager", "appSettings", "apphost", "focu
var servers; var servers;
updatePageStyle(view, params); updatePageStyle(view, params);
view.addEventListener("viewshow", function (e) {
view.addEventListener("viewshow", function(e) {
var isRestored = e.detail.isRestored; var isRestored = e.detail.isRestored;
appRouter.setTitle(null); 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"); var card = dom.parentWithClass(e.target, "card");
if (card) { if (card) {
var url = card.getAttribute("data-url"); var url = card.getAttribute("data-url");
if (url) { if (url) {
appRouter.show(url); appRouter.show(url);
} else { } else {
var id = card.getAttribute("data-id"); var id = card.getAttribute("data-id");
onServerClick(servers.filter(function(s) { onServerClick(servers.filter(function (s) {
return s.Id === id; return s.Id === id;
})[0]); })[0]);
} }
} }
}) });
} };
}); });

View file

@ -1,14 +1,31 @@
define(["components/activitylog", "globalize"], function(ActivityLog, globalize) { define(["components/activitylog", "globalize"], function (ActivityLog, globalize) {
"use strict"; "use strict";
return function(view, params) {
return function (view, params) {
var activityLog; 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({ 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(), serverId: ApiClient.serverId(),
element: view.querySelector(".activityItems") element: view.querySelector(".activityItems")
})) });
}), view.addEventListener("viewdestroy", function() {
activityLog && activityLog.destroy(), activityLog = null
})
} }
});
view.addEventListener("viewdestroy", function () {
if (activityLog) {
activityLog.destroy();
}
activityLog = null;
});
};
}); });

View file

@ -1,127 +1,180 @@
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"; "use strict";
return function(view, params, tabContent) {
return function (view, params, tabContent) {
function getPageData(context) { function getPageData(context) {
var key = getSavedQueryKey(context), var key = getSavedQueryKey(context);
pageData = data[key]; var pageData = data[key];
return pageData || (pageData = data[key] = {
if (!pageData) {
pageData = data[key] = {
query: { query: {
SortBy: "SeriesSortName,SortName", SortBy: "SeriesSortName,SortName",
SortOrder: "Ascending", SortOrder: "Ascending",
IncludeItemTypes: "Episode", IncludeItemTypes: "Episode",
Recursive: !0, Recursive: true,
Fields: "PrimaryImageAspectRatio,MediaSourceCount,UserData", Fields: "PrimaryImageAspectRatio,MediaSourceCount,UserData",
IsMissing: !1, IsMissing: false,
ImageTypeLimit: 1, ImageTypeLimit: 1,
EnableImageTypes: "Primary,Backdrop,Thumb", EnableImageTypes: "Primary,Backdrop,Thumb",
StartIndex: 0, StartIndex: 0,
Limit: pageSize Limit: pageSize
}, },
view: libraryBrowser.getSavedView(key) || "Poster" view: libraryBrowser.getSavedView(key) || "Poster"
}, pageData.query.ParentId = params.topParentId, libraryBrowser.loadSavedQueryValues(key, pageData.query)), pageData };
pageData.query.ParentId = params.topParentId;
libraryBrowser.loadSavedQueryValues(key, pageData.query);
}
return pageData;
} }
function getQuery(context) { function getQuery(context) {
return getPageData(context).query return getPageData(context).query;
} }
function getSavedQueryKey(context) { 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() { function onViewStyleChange() {
var viewStyle = self.getCurrentViewStyle(), var viewStyle = self.getCurrentViewStyle();
itemsContainer = tabContent.querySelector(".itemsContainer"); var 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 = ""
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) { function reloadItems(page) {
loading.show(); loading.show();
isLoading = true; isLoading = true;
var query = getQuery(page); var query = getQuery(page);
ApiClient.getItems(Dashboard.getCurrentUserId(), query).then(function(result) { ApiClient.getItems(Dashboard.getCurrentUserId(), query).then(function (result) {
function onNextPageClick() { function onNextPageClick() {
if (isLoading) return; if (isLoading) {
return;
}
query.StartIndex += query.Limit; query.StartIndex += query.Limit;
reloadItems(tabContent) reloadItems(tabContent);
} }
function onPreviousPageClick() { function onPreviousPageClick() {
if (isLoading) return; if (isLoading) {
return;
}
query.StartIndex -= query.Limit; query.StartIndex -= query.Limit;
reloadItems(tabContent) reloadItems(tabContent);
} }
window.scrollTo(0, 0); window.scrollTo(0, 0);
var html, pagingHtml = libraryBrowser.getQueryPagingHtml({ var html;
var pagingHtml = libraryBrowser.getQueryPagingHtml({
startIndex: query.StartIndex, startIndex: query.StartIndex,
limit: query.Limit, limit: query.Limit,
totalRecordCount: result.TotalRecordCount, totalRecordCount: result.TotalRecordCount,
showLimit: !1, showLimit: false,
updatePageSizeSetting: !1, updatePageSizeSetting: false,
addLayoutButton: !1, addLayoutButton: false,
sortButton: !1, sortButton: false,
filterButton: !1 filterButton: false
}), });
viewStyle = self.getCurrentViewStyle(), var viewStyle = self.getCurrentViewStyle();
itemsContainer = tabContent.querySelector(".itemsContainer"); var itemsContainer = tabContent.querySelector(".itemsContainer");
html = "List" == viewStyle ? listView.getListViewHtml({ if (viewStyle == "List") {
html = listView.getListViewHtml({
items: result.Items, items: result.Items,
sortBy: query.SortBy, sortBy: query.SortBy,
showParentTitle: !0 showParentTitle: true
}) : "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 i, length, elems; } else if (viewStyle == "PosterCard") {
for (elems = tabContent.querySelectorAll(".paging"), i = 0, length = elems.length; i < length; i++) 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; 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); 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); elems[i].addEventListener("click", onPreviousPageClick);
}
itemsContainer.innerHTML = html; itemsContainer.innerHTML = html;
imageLoader.lazyChildren(itemsContainer); imageLoader.lazyChildren(itemsContainer);
libraryBrowser.saveQueryValues(getSavedQueryKey(page), query); libraryBrowser.saveQueryValues(getSavedQueryKey(page), query);
loading.hide(); loading.hide();
isLoading = false; isLoading = false;
}) });
} }
var self = this,
pageSize = 100, var self = this;
data = {}, var pageSize = 100;
isLoading = false; var data = {};
self.showFilterMenu = function() { var isLoading = false;
require(["components/filterdialog/filterdialog"], function(filterDialogFactory) {
self.showFilterMenu = function () {
require(["components/filterdialog/filterdialog"], function (filterDialogFactory) {
var filterDialog = new filterDialogFactory({ var filterDialog = new filterDialogFactory({
query: getQuery(tabContent), query: getQuery(tabContent),
mode: "episodes", mode: "episodes",
serverId: ApiClient.serverId() serverId: ApiClient.serverId()
}); });
events.on(filterDialog, "filterchange", function() { events.on(filterDialog, "filterchange", function () {
reloadItems(tabContent) reloadItems(tabContent);
}), filterDialog.show() });
}) filterDialog.show();
}, self.getCurrentViewStyle = function() { });
return getPageData(tabContent).view };
},
function(tabContent) { self.getCurrentViewStyle = function () {
tabContent.querySelector(".btnFilter").addEventListener("click", function() { return getPageData(tabContent).view;
self.showFilterMenu() };
}), tabContent.querySelector(".btnSort").addEventListener("click", function(e) {
function initPage(tabContent) {
tabContent.querySelector(".btnFilter").addEventListener("click", function () {
self.showFilterMenu();
});
tabContent.querySelector(".btnSort").addEventListener("click", function (e) {
libraryBrowser.showSortMenu({ libraryBrowser.showSortMenu({
items: [{ items: [{
name: Globalize.translate("OptionNameSort"), name: Globalize.translate("OptionNameSort"),
@ -148,22 +201,33 @@ define(["loading", "events", "libraryBrowser", "imageLoader", "listView", "cardB
name: Globalize.translate("OptionRuntime"), name: Globalize.translate("OptionRuntime"),
id: "Runtime,SeriesSortName,SortName" id: "Runtime,SeriesSortName,SortName"
}], }],
callback: function() { callback: function () {
reloadItems(tabContent) reloadItems(tabContent);
}, },
query: getQuery(tabContent), query: getQuery(tabContent),
button: e.target button: e.target
}) });
}); });
var btnSelectView = tabContent.querySelector(".btnSelectView"); var btnSelectView = tabContent.querySelector(".btnSelectView");
btnSelectView.addEventListener("click", function(e) { btnSelectView.addEventListener("click", function (e) {
libraryBrowser.showLayoutMenu(e.target, self.getCurrentViewStyle(), "List,Poster,PosterCard".split(",")) libraryBrowser.showLayoutMenu(e.target, self.getCurrentViewStyle(), "List,Poster,PosterCard".split(","));
}), btnSelectView.addEventListener("layoutchange", function(e) { });
btnSelectView.addEventListener("layoutchange", function (e) {
var viewStyle = e.detail.viewStyle; var viewStyle = e.detail.viewStyle;
getPageData(tabContent).view = viewStyle, libraryBrowser.saveViewSetting(getSavedQueryKey(tabContent), viewStyle), onViewStyleChange(), reloadItems(tabContent) getPageData(tabContent).view = viewStyle;
}) libraryBrowser.saveViewSetting(getSavedQueryKey(tabContent), viewStyle);
}(tabContent), onViewStyleChange(), self.renderTab = function() { onViewStyleChange();
reloadItems(tabContent) reloadItems(tabContent);
}, self.destroy = function() {} });
} }
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"; "use strict";
return function(view, params, tabContent) {
return function (view, params, tabContent) {
function getPageData() { function getPageData() {
var key = getSavedQueryKey(), var key = getSavedQueryKey();
pageData = data[key]; var pageData = data[key];
return pageData || (pageData = data[key] = {
if (!pageData) {
pageData = data[key] = {
query: { query: {
SortBy: "SortName", SortBy: "SortName",
SortOrder: "Ascending", SortOrder: "Ascending",
IncludeItemTypes: "Series", IncludeItemTypes: "Series",
Recursive: !0, Recursive: true,
EnableTotalRecordCount: !1 EnableTotalRecordCount: false
}, },
view: "Poster" view: "Poster"
}, pageData.query.ParentId = params.topParentId, libraryBrowser.loadSavedQueryValues(key, pageData.query)), pageData };
pageData.query.ParentId = params.topParentId;
libraryBrowser.loadSavedQueryValues(key, pageData.query);
}
return pageData;
} }
function getQuery() { function getQuery() {
return getPageData().query return getPageData().query;
} }
function getSavedQueryKey() { function getSavedQueryKey() {
return libraryBrowser.getSavedQueryKey("seriesgenres") return libraryBrowser.getSavedQueryKey("seriesgenres");
} }
function getPromise() { function getPromise() {
loading.show(); loading.show();
var query = getQuery(); var query = getQuery();
return ApiClient.getGenres(ApiClient.getCurrentUserId(), query) return ApiClient.getGenres(ApiClient.getCurrentUserId(), query);
} }
function enableScrollX() { function enableScrollX() {
return !layoutManager.desktop return !layoutManager.desktop;
} }
function getThumbShape() { function getThumbShape() {
return enableScrollX() ? "overflowBackdrop" : "backdrop" return enableScrollX() ? "overflowBackdrop" : "backdrop";
} }
function getPortraitShape() { function getPortraitShape() {
return enableScrollX() ? "overflowPortrait" : "portrait" return enableScrollX() ? "overflowPortrait" : "portrait";
} }
function fillItemsContainer(elem) { function fillItemsContainer(elem) {
var id = elem.getAttribute("data-id"), var id = elem.getAttribute("data-id");
viewStyle = self.getCurrentViewStyle(), var viewStyle = self.getCurrentViewStyle();
limit = "Thumb" == viewStyle || "ThumbCard" == viewStyle ? 5 : 9; var limit = "Thumb" == viewStyle || "ThumbCard" == viewStyle ? 5 : 9;
enableScrollX() && (limit = 10);
var enableImageTypes = "Thumb" == viewStyle || "ThumbCard" == viewStyle ? "Primary,Backdrop,Thumb" : "Primary", if (enableScrollX()) {
query = { limit = 10;
}
var enableImageTypes = "Thumb" == viewStyle || "ThumbCard" == viewStyle ? "Primary,Backdrop,Thumb" : "Primary";
var query = {
SortBy: "SortName", SortBy: "SortName",
SortOrder: "Ascending", SortOrder: "Ascending",
IncludeItemTypes: "Series", IncludeItemTypes: "Series",
Recursive: !0, Recursive: true,
Fields: "PrimaryImageAspectRatio,MediaSourceCount,BasicSyncInfo", Fields: "PrimaryImageAspectRatio,MediaSourceCount,BasicSyncInfo",
ImageTypeLimit: 1, ImageTypeLimit: 1,
EnableImageTypes: enableImageTypes, EnableImageTypes: enableImageTypes,
Limit: limit, Limit: limit,
GenreIds: id, GenreIds: id,
EnableTotalRecordCount: !1, EnableTotalRecordCount: false,
ParentId: params.topParentId ParentId: params.topParentId
}; };
ApiClient.getItems(ApiClient.getCurrentUserId(), query).then(function(result) { ApiClient.getItems(ApiClient.getCurrentUserId(), query).then(function (result) {
var supportsImageAnalysis = appHost.supports("imageanalysis"); var supportsImageAnalysis = appHost.supports("imageanalysis");
"Thumb" == viewStyle ? cardBuilder.buildCards(result.Items, {
if (viewStyle == "Thumb") {
cardBuilder.buildCards(result.Items, {
itemsContainer: elem, itemsContainer: elem,
shape: getThumbShape(), shape: getThumbShape(),
preferThumb: !0, preferThumb: true,
showTitle: !0, showTitle: true,
scalable: !0, scalable: true,
centerText: !0, centerText: true,
overlayMoreButton: !0, overlayMoreButton: true,
allowBottomPadding: !1 allowBottomPadding: false
}) : "ThumbCard" == viewStyle ? cardBuilder.buildCards(result.Items, { });
} else if (viewStyle == "ThumbCard") {
cardBuilder.buildCards(result.Items, {
itemsContainer: elem, itemsContainer: elem,
shape: getThumbShape(), shape: getThumbShape(),
preferThumb: !0, preferThumb: true,
showTitle: !0, showTitle: true,
scalable: !0, scalable: true,
centerText: !1, centerText: false,
cardLayout: !0, cardLayout: true,
showYear: !0 showYear: true
}) : "PosterCard" == viewStyle ? cardBuilder.buildCards(result.Items, { });
} else if (viewStyle == "PosterCard") {
cardBuilder.buildCards(result.Items, {
itemsContainer: elem, itemsContainer: elem,
shape: getPortraitShape(), shape: getPortraitShape(),
showTitle: !0, showTitle: true,
scalable: !0, scalable: true,
centerText: !1, centerText: false,
cardLayout: !0, cardLayout: true,
showYear: !0 showYear: true
}) : "Poster" == viewStyle && cardBuilder.buildCards(result.Items, { });
} else if (viewStyle == "Poster") {
cardBuilder.buildCards(result.Items, {
itemsContainer: elem, itemsContainer: elem,
shape: getPortraitShape(), shape: getPortraitShape(),
scalable: !0, scalable: true,
overlayMoreButton: !0, overlayMoreButton: true,
allowBottomPadding: !1 allowBottomPadding: false
}), result.Items.length >= query.Limit && tabContent.querySelector(".btnMoreFromGenre" + id + " i").classList.remove("hide") });
}) }
if (result.Items.length >= query.Limit) {
tabContent.querySelector(".btnMoreFromGenre" + id + " i").classList.remove("hide");
}
});
} }
function reloadItems(context, promise) { function reloadItems(context, promise) {
var query = getQuery(); var query = getQuery();
promise.then(function(result) { promise.then(function (result) {
for (var elem = context.querySelector("#items"), html = "", items = result.Items, i = 0, length = items.length; i < length; i++) { 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]; 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, { html += '<div class="verticalSection">';
html += '<div class="sectionTitleContainer sectionTitleContainer-cards padded-left">';
html += '<a is="emby-linkbutton" href="' + appRouter.getRouteUrl(item, {
context: "tvshows", context: "tvshows",
parentId: params.topParentId 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()) { }) + '" 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"; 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 + '">' if (layoutManager.tv) {
} else html += '<div is="emby-itemscontainer" class="itemsContainer vertical-wrap lazy padded-left padded-right" data-id="' + item.Id + '">'; scrollXClass += "smoothScrollX";
html += "</div>", html += "</div>"
} }
elem.innerHTML = html, lazyLoader.lazyChildren(elem, fillItemsContainer), libraryBrowser.saveQueryValues(getSavedQueryKey(), query), loading.hide() 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();
});
} }
function fullyReload() { function fullyReload() {
self.preRender(), self.renderTab() self.preRender();
self.renderTab();
} }
var self = this,
data = {}; var self = this;
self.getViewStyles = function() { var data = {};
return "Poster,PosterCard,Thumb,ThumbCard".split(",")
}, self.getCurrentViewStyle = function() { self.getViewStyles = function () {
return getPageData(tabContent).view return "Poster,PosterCard,Thumb,ThumbCard".split(",");
}, self.setCurrentViewStyle = function(viewStyle) { };
getPageData(tabContent).view = viewStyle, libraryBrowser.saveViewSetting(getSavedQueryKey(tabContent), viewStyle), fullyReload()
}, self.enableViewSelection = !0; 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; var promise;
self.preRender = function() {
promise = getPromise() self.preRender = function () {
}, self.renderTab = function() { promise = getPromise();
reloadItems(tabContent, promise) };
}
} self.renderTab = function () {
reloadItems(tabContent, promise);
};
};
}); });

View file

@ -1,11 +1,11 @@
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"; "use strict";
function getLatestPromise(context, params) { function getLatestPromise(context, params) {
loading.show(); loading.show();
var userId = ApiClient.getCurrentUserId(), var userId = ApiClient.getCurrentUserId();
parentId = params.topParentId, var parentId = params.topParentId;
options = { var options = {
IncludeItemTypes: "Episode", IncludeItemTypes: "Episode",
Limit: 30, Limit: 30,
Fields: "PrimaryImageAspectRatio,BasicSyncInfo", Fields: "PrimaryImageAspectRatio,BasicSyncInfo",
@ -13,40 +13,48 @@ define(["loading", "components/groupedcards", "cardBuilder", "apphost", "imageLo
ImageTypeLimit: 1, ImageTypeLimit: 1,
EnableImageTypes: "Primary,Backdrop,Thumb" EnableImageTypes: "Primary,Backdrop,Thumb"
}; };
return ApiClient.getJSON(ApiClient.getUrl("Users/" + userId + "/Items/Latest", options)) return ApiClient.getJSON(ApiClient.getUrl("Users/" + userId + "/Items/Latest", options));
} }
function loadLatest(context, params, promise) { function loadLatest(context, params, promise) {
promise.then(function(items) { promise.then(function (items) {
var html = ""; var html = "";
appHost.supports("imageanalysis"); appHost.supports("imageanalysis");
html += cardBuilder.getCardsHtml({ html += cardBuilder.getCardsHtml({
items: items, items: items,
shape: "backdrop", shape: "backdrop",
preferThumb: !0, preferThumb: true,
showTitle: !0, showTitle: true,
showSeriesYear: !0, showSeriesYear: true,
showParentTitle: !0, showParentTitle: true,
overlayText: !1, overlayText: false,
cardLayout: !1, cardLayout: false,
showUnplayedIndicator: !1, showUnplayedIndicator: false,
showChildCountIndicator: !0, showChildCountIndicator: true,
centerText: !0, centerText: true,
lazy: !0, lazy: true,
overlayPlayButton: !0, overlayPlayButton: true,
lines: 2 lines: 2
}); });
var elem = context.querySelector("#latestEpisodes"); 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 self = this;
var latestPromise; var latestPromise;
self.preRender = function() {
latestPromise = getLatestPromise(view, params) self.preRender = function () {
}, self.renderTab = function() { latestPromise = getLatestPromise(view, params);
loadLatest(tabContent, params, latestPromise) };
}, tabContent.querySelector("#latestEpisodes").addEventListener("click", groupedcards.onItemsContainerClick)
} 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"; "use strict";
function getTabs() { function getTabs() {
@ -19,30 +19,51 @@ define(["events", "inputManager", "libraryMenu", "layoutManager", "loading", "do
}, { }, {
name: Globalize.translate("ButtonSearch"), name: Globalize.translate("ButtonSearch"),
cssClass: "searchTabButton" cssClass: "searchTabButton"
}] }];
} }
function getDefaultTabIndex(folderId) { function getDefaultTabIndex(folderId) {
switch (userSettings.get("landing-" + folderId)) { switch (userSettings.get("landing-" + folderId)) {
case "suggestions": case "suggestions":
return 1; return 1;
case "latest": case "latest":
return 2; return 2;
case "favorites": case "favorites":
return 1; return 1;
case "genres": case "genres":
return 4; return 4;
default: default:
return 0 return 0;
} }
} }
function setScrollClasses(elem, scrollX) { 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");
} }
return function(view, params) {
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) {
function reload() { function reload() {
loading.show(), loadResume(), loadNextUp() loading.show();
loadResume();
loadNextUp();
} }
function loadNextUp() { function loadNextUp() {
@ -52,178 +73,263 @@ define(["events", "inputManager", "libraryMenu", "layoutManager", "loading", "do
UserId: ApiClient.getCurrentUserId(), UserId: ApiClient.getCurrentUserId(),
ImageTypeLimit: 1, ImageTypeLimit: 1,
EnableImageTypes: "Primary,Backdrop,Thumb", EnableImageTypes: "Primary,Backdrop,Thumb",
EnableTotalRecordCount: !1 EnableTotalRecordCount: false
}; };
query.ParentId = libraryMenu.getTopParentId(), ApiClient.getNextUpEpisodes(query).then(function(result) { query.ParentId = libraryMenu.getTopParentId();
result.Items.length ? view.querySelector(".noNextUpItems").classList.add("hide") : view.querySelector(".noNextUpItems").classList.remove("hide"); 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"); var container = view.querySelector("#nextUpItems");
cardBuilder.buildCards(result.Items, { cardBuilder.buildCards(result.Items, {
itemsContainer: container, itemsContainer: container,
preferThumb: !0, preferThumb: true,
shape: "backdrop", shape: "backdrop",
scalable: !0, scalable: true,
showTitle: !0, showTitle: true,
showParentTitle: !0, showParentTitle: true,
overlayText: !1, overlayText: false,
centerText: !0, centerText: true,
overlayPlayButton: !0, overlayPlayButton: true,
cardLayout: !1 cardLayout: false
}), loading.hide() });
}) loading.hide();
});
} }
function enableScrollX() { function enableScrollX() {
return !layoutManager.desktop return !layoutManager.desktop;
} }
function getThumbShape() { function getThumbShape() {
return enableScrollX() ? "overflowBackdrop" : "backdrop" return enableScrollX() ? "overflowBackdrop" : "backdrop";
} }
function loadResume() { function loadResume() {
var parentId = libraryMenu.getTopParentId(), var parentId = libraryMenu.getTopParentId();
screenWidth = dom.getWindowSize().innerWidth, var screenWidth = dom.getWindowSize().innerWidth;
limit = screenWidth >= 1600 ? 5 : 6, var limit = screenWidth >= 1600 ? 5 : 6;
options = { var options = {
SortBy: "DatePlayed", SortBy: "DatePlayed",
SortOrder: "Descending", SortOrder: "Descending",
IncludeItemTypes: "Episode", IncludeItemTypes: "Episode",
Filters: "IsResumable", Filters: "IsResumable",
Limit: limit, Limit: limit,
Recursive: !0, Recursive: true,
Fields: "PrimaryImageAspectRatio,SeriesInfo,UserData,BasicSyncInfo", Fields: "PrimaryImageAspectRatio,SeriesInfo,UserData,BasicSyncInfo",
ExcludeLocationTypes: "Virtual", ExcludeLocationTypes: "Virtual",
ParentId: parentId, ParentId: parentId,
ImageTypeLimit: 1, ImageTypeLimit: 1,
EnableImageTypes: "Primary,Backdrop,Thumb", EnableImageTypes: "Primary,Backdrop,Thumb",
EnableTotalRecordCount: !1 EnableTotalRecordCount: false
}; };
ApiClient.getItems(ApiClient.getCurrentUserId(), options).then(function(result) { ApiClient.getItems(ApiClient.getCurrentUserId(), options).then(function (result) {
result.Items.length ? view.querySelector("#resumableSection").classList.remove("hide") : view.querySelector("#resumableSection").classList.add("hide"); if (result.Items.length) {
var allowBottomPadding = !enableScrollX(), view.querySelector("#resumableSection").classList.remove("hide");
container = view.querySelector("#resumableItems"); } else {
view.querySelector("#resumableSection").classList.add("hide");
}
var allowBottomPadding = !enableScrollX();
var container = view.querySelector("#resumableItems");
cardBuilder.buildCards(result.Items, { cardBuilder.buildCards(result.Items, {
itemsContainer: container, itemsContainer: container,
preferThumb: !0, preferThumb: true,
shape: getThumbShape(), shape: getThumbShape(),
scalable: !0, scalable: true,
showTitle: !0, showTitle: true,
showParentTitle: !0, showParentTitle: true,
overlayText: !1, overlayText: false,
centerText: !0, centerText: true,
overlayPlayButton: !0, overlayPlayButton: true,
allowBottomPadding: allowBottomPadding, allowBottomPadding: allowBottomPadding,
cardLayout: !1 cardLayout: false
}) });
}) });
} }
function onBeforeTabChange(e) { function onBeforeTabChange(e) {
preLoadTab(view, parseInt(e.detail.selectedTabIndex)) preLoadTab(view, parseInt(e.detail.selectedTabIndex));
} }
function onTabChange(e) { function onTabChange(e) {
var newIndex = parseInt(e.detail.selectedTabIndex); var newIndex = parseInt(e.detail.selectedTabIndex);
loadTab(view, newIndex) loadTab(view, newIndex);
} }
function getTabContainers() { function getTabContainers() {
return view.querySelectorAll(".pageTabContent") return view.querySelectorAll(".pageTabContent");
} }
function initTabs() { function initTabs() {
mainTabsManager.setTabs(view, currentTabIndex, getTabs, getTabContainers, onBeforeTabChange, onTabChange) mainTabsManager.setTabs(view, currentTabIndex, getTabs, getTabContainers, onBeforeTabChange, onTabChange);
} }
function getTabController(page, index, callback) { function getTabController(page, index, callback) {
var depends = []; var depends = [];
switch (index) { switch (index) {
case 0: case 0:
depends.push("controllers/shows/tvshows"); depends.push("controllers/shows/tvshows");
break; break;
case 1: case 1:
break; break;
case 2: case 2:
depends.push("controllers/shows/tvlatest"); depends.push("controllers/shows/tvlatest");
break; break;
case 3: case 3:
depends.push("controllers/shows/tvupcoming"); depends.push("controllers/shows/tvupcoming");
break; break;
case 4: case 4:
depends.push("controllers/shows/tvgenres"); depends.push("controllers/shows/tvgenres");
break; break;
case 5: case 5:
depends.push("controllers/shows/tvstudios"); depends.push("controllers/shows/tvstudios");
break; break;
case 6: case 6:
depends.push("controllers/shows/episodes"); depends.push("controllers/shows/episodes");
break; break;
case 7: case 7:
depends.push("scripts/searchtab") depends.push("scripts/searchtab");
} }
require(depends, function(controllerFactory) {
require(depends, function (controllerFactory) {
var tabContent; 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]; var controller = tabControllers[index];
controller || (tabContent = view.querySelector(".pageTabContent[data-index='" + index + "']"), controller = 1 === index ? self : 7 === index ? new controllerFactory(view, tabContent, {
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", collectionType: "tvshows",
parentId: params.topParentId parentId: params.topParentId
}) : new controllerFactory(view, params, tabContent), tabControllers[index] = controller, controller.initTab && controller.initTab()), callback(controller) });
}) } else {
controller = new controllerFactory(view, params, tabContent);
}
tabControllers[index] = controller;
if (controller.initTab) {
controller.initTab();
}
}
callback(controller);
});
} }
function preLoadTab(page, index) { function preLoadTab(page, index) {
getTabController(page, index, function(controller) { getTabController(page, index, function (controller) {
-1 == renderedTabs.indexOf(index) && controller.preRender && controller.preRender() if (renderedTabs.indexOf(index) == -1 && controller.preRender) {
}) controller.preRender();
}
});
} }
function loadTab(page, index) { function loadTab(page, index) {
currentTabIndex = index, getTabController(page, index, function(controller) { currentTabIndex = index;
initialTabIndex = null, -1 == renderedTabs.indexOf(index) && (renderedTabs.push(index), controller.renderTab()) getTabController(page, index, function (controller) {
}) initialTabIndex = null;
if (renderedTabs.indexOf(index) == -1) {
renderedTabs.push(index);
controller.renderTab();
}
});
} }
function onPlaybackStop(e, state) { 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) { function onWebSocketMessage(e, data) {
var msg = 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) { function onInputCommand(e) {
switch (e.detail.command) { switch (e.detail.command) {
case "search": 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)), var isViewRestored;
initialTabIndex = currentTabIndex; var self = this;
self.initTab = function() { var currentTabIndex = parseInt(params.tab || getDefaultTabIndex(params.topParentId));
var initialTabIndex = currentTabIndex;
self.initTab = function () {
var tabContent = self.tabContent; var tabContent = self.tabContent;
setScrollClasses(tabContent.querySelector("#resumableItems"), enableScrollX()); setScrollClasses(tabContent.querySelector("#resumableItems"), enableScrollX());
}, self.renderTab = function() {
reload()
}; };
var tabControllers = [],
renderedTabs = []; self.renderTab = function () {
setScrollClasses(view.querySelector("#resumableItems"), enableScrollX()), view.addEventListener("viewshow", function(e) { reload();
if (isViewRestored = e.detail.isRestored, initTabs(), !view.getAttribute("data-title")) { };
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; var parentId = params.topParentId;
parentId ? ApiClient.getItem(ApiClient.getCurrentUserId(), parentId).then(function(item) {
view.setAttribute("data-title", item.Name), libraryMenu.setTitle(item.Name) if (parentId) {
}) : (view.setAttribute("data-title", Globalize.translate("TabShows")), libraryMenu.setTitle(Globalize.translate("TabShows"))) 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,15 +1,18 @@
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"; "use strict";
return function(view, params, tabContent) {
return function (view, params, tabContent) {
function getPageData(context) { function getPageData(context) {
var key = getSavedQueryKey(context), var key = getSavedQueryKey(context);
pageData = data[key]; var pageData = data[key];
return pageData || (pageData = data[key] = {
if (!pageData) {
pageData = data[key] = {
query: { query: {
SortBy: "SortName", SortBy: "SortName",
SortOrder: "Ascending", SortOrder: "Ascending",
IncludeItemTypes: "Series", IncludeItemTypes: "Series",
Recursive: !0, Recursive: true,
Fields: "PrimaryImageAspectRatio,BasicSyncInfo", Fields: "PrimaryImageAspectRatio,BasicSyncInfo",
ImageTypeLimit: 1, ImageTypeLimit: 1,
EnableImageTypes: "Primary,Backdrop,Banner,Thumb", EnableImageTypes: "Primary,Backdrop,Banner,Thumb",
@ -17,147 +20,215 @@ define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", "
Limit: pageSize Limit: pageSize
}, },
view: libraryBrowser.getSavedView(key) || "Poster" view: libraryBrowser.getSavedView(key) || "Poster"
}, pageData.query.ParentId = params.topParentId, libraryBrowser.loadSavedQueryValues(key, pageData.query)), pageData };
pageData.query.ParentId = params.topParentId;
libraryBrowser.loadSavedQueryValues(key, pageData.query);
}
return pageData;
} }
function getQuery(context) { function getQuery(context) {
return getPageData(context).query return getPageData(context).query;
} }
function getSavedQueryKey(context) { 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() { function onViewStyleChange() {
var viewStyle = self.getCurrentViewStyle(), var viewStyle = self.getCurrentViewStyle();
itemsContainer = tabContent.querySelector(".itemsContainer"); var 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 = ""
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) { function reloadItems(page) {
loading.show(); loading.show();
isLoading = true; isLoading = true;
var query = getQuery(page); var query = getQuery(page);
ApiClient.getItems(ApiClient.getCurrentUserId(), query).then(function(result) { ApiClient.getItems(ApiClient.getCurrentUserId(), query).then(function (result) {
function onNextPageClick() { function onNextPageClick() {
if (isLoading) return; if (isLoading) {
return;
}
query.StartIndex += query.Limit; query.StartIndex += query.Limit;
reloadItems(tabContent); reloadItems(tabContent);
} }
function onPreviousPageClick() { function onPreviousPageClick() {
if (isLoading) return; if (isLoading) {
return;
}
query.StartIndex -= query.Limit; query.StartIndex -= query.Limit;
reloadItems(tabContent); reloadItems(tabContent);
} }
window.scrollTo(0, 0), updateFilterControls(page);
var html, pagingHtml = libraryBrowser.getQueryPagingHtml({ window.scrollTo(0, 0);
updateFilterControls(page);
var html;
var pagingHtml = libraryBrowser.getQueryPagingHtml({
startIndex: query.StartIndex, startIndex: query.StartIndex,
limit: query.Limit, limit: query.Limit,
totalRecordCount: result.TotalRecordCount, totalRecordCount: result.TotalRecordCount,
showLimit: !1, showLimit: false,
updatePageSizeSetting: !1, updatePageSizeSetting: false,
addLayoutButton: !1, addLayoutButton: false,
sortButton: !1, sortButton: false,
filterButton: !1 filterButton: false
}), });
viewStyle = self.getCurrentViewStyle(); var viewStyle = self.getCurrentViewStyle();
html = "Thumb" == viewStyle ? cardBuilder.getCardsHtml({ if (viewStyle == "Thumb") {
html = cardBuilder.getCardsHtml({
items: result.Items, items: result.Items,
shape: "backdrop", shape: "backdrop",
preferThumb: !0, preferThumb: true,
context: "tvshows", context: "tvshows",
overlayMoreButton: !0, overlayMoreButton: true,
showTitle: !0, showTitle: true,
centerText: !0 centerText: true
}) : "ThumbCard" == viewStyle ? cardBuilder.getCardsHtml({ });
} else if (viewStyle == "ThumbCard") {
html = cardBuilder.getCardsHtml({
items: result.Items, items: result.Items,
shape: "backdrop", shape: "backdrop",
preferThumb: !0, preferThumb: true,
context: "tvshows", context: "tvshows",
cardLayout: !0, cardLayout: true,
showTitle: !0, showTitle: true,
showYear: !0, showYear: true,
centerText: !0 centerText: true
}) : "Banner" == viewStyle ? cardBuilder.getCardsHtml({ });
} else if (viewStyle == "Banner") {
html = cardBuilder.getCardsHtml({
items: result.Items, items: result.Items,
shape: "banner", shape: "banner",
preferBanner: !0, preferBanner: true,
context: "tvshows" context: "tvshows"
}) : "List" == viewStyle ? listView.getListViewHtml({ });
} else if (viewStyle == "List") {
html = listView.getListViewHtml({
items: result.Items, items: result.Items,
context: "tvshows", context: "tvshows",
sortBy: query.SortBy 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
}); });
var i, length, elems = tabContent.querySelectorAll(".paging"); } else if (viewStyle == "PosterCard") {
for (i = 0, length = elems.length; i < length; i++) elems[i].innerHTML = pagingHtml; html = cardBuilder.getCardsHtml({
for (elems = tabContent.querySelectorAll(".btnNextPage"), i = 0, length = elems.length; i < length; i++) elems[i].addEventListener("click", onNextPageClick); items: result.Items,
for (elems = tabContent.querySelectorAll(".btnPreviousPage"), i = 0, length = elems.length; i < length; i++) elems[i].addEventListener("click", onPreviousPageClick); 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"); var itemsContainer = tabContent.querySelector(".itemsContainer");
itemsContainer.innerHTML = html; itemsContainer.innerHTML = html;
imageLoader.lazyChildren(itemsContainer); imageLoader.lazyChildren(itemsContainer);
libraryBrowser.saveQueryValues(getSavedQueryKey(page), query); libraryBrowser.saveQueryValues(getSavedQueryKey(page), query);
loading.hide(); loading.hide();
isLoading = false; isLoading = false;
}) });
} }
function updateFilterControls(tabContent) { function updateFilterControls(tabContent) {
var query = getQuery(tabContent); var query = getQuery(tabContent);
self.alphaPicker.value(query.NameStartsWithOrGreater) self.alphaPicker.value(query.NameStartsWithOrGreater);
} }
var self = this,
pageSize = 100, var self = this;
data = {}, var pageSize = 100;
isLoading = false; var data = {};
self.showFilterMenu = function() { var isLoading = false;
require(["components/filterdialog/filterdialog"], function(filterDialogFactory) {
self.showFilterMenu = function () {
require(["components/filterdialog/filterdialog"], function (filterDialogFactory) {
var filterDialog = new filterDialogFactory({ var filterDialog = new filterDialogFactory({
query: getQuery(tabContent), query: getQuery(tabContent),
mode: "series", mode: "series",
serverId: ApiClient.serverId() serverId: ApiClient.serverId()
}); });
events.on(filterDialog, "filterchange", function() { events.on(filterDialog, "filterchange", function () {
getQuery(tabContent).StartIndex = 0, reloadItems(tabContent) getQuery(tabContent).StartIndex = 0;
}), filterDialog.show() reloadItems(tabContent);
}) });
}, self.getCurrentViewStyle = function() { filterDialog.show();
return getPageData(tabContent).view });
}, };
function(tabContent) {
self.getCurrentViewStyle = function () {
return getPageData(tabContent).view;
};
function initPage(tabContent) {
var alphaPickerElement = tabContent.querySelector(".alphaPicker"); var alphaPickerElement = tabContent.querySelector(".alphaPicker");
if (alphaPickerElement.addEventListener("alphavaluechanged", function(e) {
var newValue = e.detail.value, alphaPickerElement.addEventListener("alphavaluechanged", function (e) {
query = getQuery(tabContent); var newValue = e.detail.value;
query.NameStartsWithOrGreater = newValue, query.StartIndex = 0, reloadItems(tabContent) var query = getQuery(tabContent);
}), self.alphaPicker = new alphaPicker({ query.NameStartsWithOrGreater = newValue;
query.StartIndex = 0;
reloadItems(tabContent);
});
self.alphaPicker = new alphaPicker({
element: alphaPickerElement, element: alphaPickerElement,
valueChangeEvent: "click" valueChangeEvent: "click"
}), layoutManager.desktop || layoutManager.mobile) { });
if (layoutManager.desktop || layoutManager.mobile) {
tabContent.querySelector(".alphaPicker").classList.add("alphabetPicker-right"); tabContent.querySelector(".alphaPicker").classList.add("alphabetPicker-right");
var itemsContainer = tabContent.querySelector(".itemsContainer"); var itemsContainer = tabContent.querySelector(".itemsContainer");
itemsContainer.classList.remove("padded-left-withalphapicker"), itemsContainer.classList.add("padded-right-withalphapicker") itemsContainer.classList.remove("padded-left-withalphapicker");
itemsContainer.classList.add("padded-right-withalphapicker");
} }
tabContent.querySelector(".btnFilter").addEventListener("click", function() {
self.showFilterMenu() tabContent.querySelector(".btnFilter").addEventListener("click", function () {
}), tabContent.querySelector(".btnSort").addEventListener("click", function(e) { self.showFilterMenu();
});
tabContent.querySelector(".btnSort").addEventListener("click", function (e) {
libraryBrowser.showSortMenu({ libraryBrowser.showSortMenu({
items: [{ items: [{
name: Globalize.translate("OptionNameSort"), name: Globalize.translate("OptionNameSort"),
@ -178,22 +249,36 @@ define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", "
name: Globalize.translate("OptionReleaseDate"), name: Globalize.translate("OptionReleaseDate"),
id: "PremiereDate,SortName" id: "PremiereDate,SortName"
}], }],
callback: function() { callback: function () {
getQuery(tabContent).StartIndex = 0, reloadItems(tabContent) getQuery(tabContent).StartIndex = 0;
reloadItems(tabContent);
}, },
query: getQuery(tabContent), query: getQuery(tabContent),
button: e.target button: e.target
}) });
}); });
var btnSelectView = tabContent.querySelector(".btnSelectView"); var btnSelectView = tabContent.querySelector(".btnSelectView");
btnSelectView.addEventListener("click", function(e) { btnSelectView.addEventListener("click", function (e) {
libraryBrowser.showLayoutMenu(e.target, self.getCurrentViewStyle(), "Banner,List,Poster,PosterCard,Thumb,ThumbCard".split(",")) libraryBrowser.showLayoutMenu(e.target, self.getCurrentViewStyle(), "Banner,List,Poster,PosterCard,Thumb,ThumbCard".split(","));
}), btnSelectView.addEventListener("layoutchange", function(e) { });
btnSelectView.addEventListener("layoutchange", function (e) {
var viewStyle = e.detail.viewStyle; var viewStyle = e.detail.viewStyle;
getPageData(tabContent).view = viewStyle, libraryBrowser.saveViewSetting(getSavedQueryKey(tabContent), viewStyle), getQuery(tabContent).StartIndex = 0, onViewStyleChange(), reloadItems(tabContent) getPageData(tabContent).view = viewStyle;
}) libraryBrowser.saveViewSetting(getSavedQueryKey(tabContent), viewStyle);
}(tabContent), onViewStyleChange(), self.renderTab = function() { getQuery(tabContent).StartIndex = 0;
reloadItems(tabContent), updateFilterControls(tabContent) onViewStyleChange();
}, self.destroy = function() {} 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"; "use strict";
function getQuery(params) { function getQuery(params) {
var key = getSavedQueryKey(), var key = getSavedQueryKey();
pageData = data[key]; var pageData = data[key];
return pageData || (pageData = data[key] = {
if (!pageData) {
pageData = data[key] = {
query: { query: {
SortBy: "SortName", SortBy: "SortName",
SortOrder: "Ascending", SortOrder: "Ascending",
IncludeItemTypes: "Series", IncludeItemTypes: "Series",
Recursive: !0, Recursive: true,
Fields: "DateCreated,PrimaryImageAspectRatio", Fields: "DateCreated,PrimaryImageAspectRatio",
StartIndex: 0 StartIndex: 0
} }
}, pageData.query.ParentId = params.topParentId), pageData.query };
pageData.query.ParentId = params.topParentId;
}
return pageData.query;
} }
function getSavedQueryKey() { function getSavedQueryKey() {
return libraryBrowser.getSavedQueryKey("studios") return libraryBrowser.getSavedQueryKey("studios");
} }
function getPromise(context, params) { function getPromise(context, params) {
var query = getQuery(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) { function reloadItems(context, params, promise) {
promise.then(function(result) { promise.then(function (result) {
var elem = context.querySelector("#items"); var elem = context.querySelector("#items");
cardBuilder.buildCards(result.Items, { cardBuilder.buildCards(result.Items, {
itemsContainer: elem, itemsContainer: elem,
shape: "backdrop", shape: "backdrop",
preferThumb: !0, preferThumb: true,
showTitle: !0, showTitle: true,
scalable: !0, scalable: true,
centerText: !0, centerText: true,
overlayMoreButton: !0, overlayMoreButton: true,
context: "tvshows" context: "tvshows"
}), loading.hide() });
}) loading.hide();
});
} }
var data = {}; var data = {};
return function(view, params, tabContent) { return function (view, params, tabContent) {
var promise, self = this; var promise;
self.preRender = function() { var self = this;
promise = getPromise(view, params)
}, self.renderTab = function() { self.preRender = function () {
reloadItems(tabContent, params, promise) 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"; "use strict";
function getUpcomingPromise(context, params) { function getUpcomingPromise(context, params) {
@ -9,82 +9,129 @@ define(["layoutManager", "loading", "datetime", "libraryBrowser", "cardBuilder",
UserId: ApiClient.getCurrentUserId(), UserId: ApiClient.getCurrentUserId(),
ImageTypeLimit: 1, ImageTypeLimit: 1,
EnableImageTypes: "Primary,Backdrop,Banner,Thumb", 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) { function loadUpcoming(context, params, promise) {
promise.then(function(result) { promise.then(function (result) {
var items = result.Items; 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() { function enableScrollX() {
return !layoutManager.desktop return !layoutManager.desktop;
} }
function getThumbShape() { function getThumbShape() {
return enableScrollX() ? "overflowBackdrop" : "backdrop" return enableScrollX() ? "overflowBackdrop" : "backdrop";
} }
function renderUpcoming(elem, items) { function renderUpcoming(elem, items) {
var i, length, groups = [], var i;
currentGroupName = "", var length;
currentGroup = []; var groups = [];
var currentGroupName = "";
var currentGroup = [];
for (i = 0, length = items.length; i < length; i++) { for (i = 0, length = items.length; i < length; i++) {
var item = items[i], var item = items[i];
dateText = ""; var dateText = "";
if (item.PremiereDate) try {
var premiereDate = datetime.parseISO8601Date(item.PremiereDate, !0); if (item.PremiereDate) {
try {
var premiereDate = datetime.parseISO8601Date(item.PremiereDate, true);
dateText = datetime.isRelativeDay(premiereDate, -1) ? Globalize.translate("Yesterday") : datetime.toLocaleDateString(premiereDate, { dateText = datetime.isRelativeDay(premiereDate, -1) ? Globalize.translate("Yesterday") : datetime.toLocaleDateString(premiereDate, {
weekday: "long", weekday: "long",
month: "short", month: "short",
day: "numeric" day: "numeric"
}) });
} catch (err) {} } catch (err) {}
dateText != currentGroupName ? (currentGroup.length && groups.push({ }
if (dateText != currentGroupName) {
if (currentGroup.length) {
groups.push({
name: currentGroupName, name: currentGroupName,
items: currentGroup items: currentGroup
}), currentGroupName = dateText, currentGroup = [item]) : currentGroup.push(item) });
} }
currentGroupName = dateText;
currentGroup = [item];
} else {
currentGroup.push(item);
}
}
var html = ""; var html = "";
for (i = 0, length = groups.length; i < length; i++) { for (i = 0, length = groups.length; i < length; i++) {
var group = groups[i]; var group = groups[i];
html += '<div class="verticalSection">', html += '<h2 class="sectionTitle sectionTitle-cards padded-left">' + group.name + "</h2>"; html += '<div class="verticalSection">';
var allowBottomPadding = !0; html += '<h2 class="sectionTitle sectionTitle-cards padded-left">' + group.name + "</h2>";
var allowBottomPadding = true;
if (enableScrollX()) { if (enableScrollX()) {
allowBottomPadding = !1; allowBottomPadding = false;
var scrollXClass = "scrollX hiddenScrollX"; 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"); var supportsImageAnalysis = appHost.supports("imageanalysis");
supportsImageAnalysis = !1, html += cardBuilder.getCardsHtml({ supportsImageAnalysis = false;
html += cardBuilder.getCardsHtml({
items: group.items, items: group.items,
showLocationTypeIndicator: !1, showLocationTypeIndicator: false,
shape: getThumbShape(), shape: getThumbShape(),
showTitle: !0, showTitle: true,
preferThumb: !0, preferThumb: true,
lazy: !0, lazy: true,
showDetailsMenu: !0, showDetailsMenu: true,
centerText: !supportsImageAnalysis, centerText: !supportsImageAnalysis,
showParentTitle: !0, showParentTitle: true,
overlayText: !1, overlayText: false,
allowBottomPadding: allowBottomPadding, allowBottomPadding: allowBottomPadding,
cardLayout: supportsImageAnalysis, cardLayout: supportsImageAnalysis,
overlayMoreButton: !0, overlayMoreButton: true,
missingIndicator: !1 missingIndicator: false
}), html += "</div>", html += "</div>" });
} html += "</div>";
elem.innerHTML = html, imageLoader.lazyChildren(elem) html += "</div>";
}
return function(view, params, tabContent) {
var upcomingPromise, self = this;
self.preRender = function() {
upcomingPromise = getUpcomingPromise(view, params)
}, self.renderTab = function() {
loadUpcoming(tabContent, params, upcomingPromise)
} }
elem.innerHTML = html;
imageLoader.lazyChildren(elem);
} }
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"; "use strict";
function loadPage(page, config) { function loadPage(page, config) {
$("#txtRemoteClientBitrateLimit", page).val(config.RemoteClientBitrateLimit / 1e6 || ""), loading.hide() $("#txtRemoteClientBitrateLimit", page).val(config.RemoteClientBitrateLimit / 1e6 || "");
loading.hide();
} }
function onSubmit() { function onSubmit() {
loading.show(); loading.show();
var form = this; var form = this;
return ApiClient.getServerConfiguration().then(function(config) { ApiClient.getServerConfiguration().then(function (config) {
config.RemoteClientBitrateLimit = parseInt(1e6 * parseFloat($("#txtRemoteClientBitrateLimit", form).val() || "0")), ApiClient.updateServerConfiguration(config).then(Dashboard.processServerConfigurationUpdateResult) config.RemoteClientBitrateLimit = parseInt(1e6 * parseFloat($("#txtRemoteClientBitrateLimit", form).val() || "0"));
}), !1 ApiClient.updateServerConfiguration(config).then(Dashboard.processServerConfigurationUpdateResult);
});
return false;
} }
function getTabs() { function getTabs() {
@ -23,30 +26,35 @@ define(["jQuery", "libraryMenu", "loading"], function($, libraryMenu, loading) {
}, { }, {
href: "streamingsettings.html", href: "streamingsettings.html",
name: Globalize.translate("TabStreaming") name: Globalize.translate("TabStreaming")
}] }];
} }
$(document).on("pageinit", "#streamingSettingsPage", function() { $(document).on("pageinit", "#streamingSettingsPage", function () {
var page = this; var page = this;
$("#btnSelectTranscodingTempPath", page).on("click.selectDirectory", function() { $("#btnSelectTranscodingTempPath", page).on("click.selectDirectory", function () {
require(["directorybrowser"], function(directoryBrowser) { require(["directorybrowser"], function (directoryBrowser) {
var picker = new directoryBrowser; var picker = new directoryBrowser();
picker.show({ picker.show({
callback: function(path) { callback: function (path) {
path && $("#txtTranscodingTempPath", page).val(path), picker.close() if (path) {
$("#txtTranscodingTempPath", page).val(path);
}
picker.close();
}, },
validateWriteable: !0, validateWriteable: true,
header: Globalize.translate("HeaderSelectTranscodingPath"), header: Globalize.translate("HeaderSelectTranscodingPath"),
instruction: Globalize.translate("HeaderSelectTranscodingPathHelp") 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(); loading.show();
libraryMenu.setTabs("playback", 2, getTabs); libraryMenu.setTabs("playback", 2, getTabs);
var page = this; var page = this;
ApiClient.getServerConfiguration().then(function(config) { ApiClient.getServerConfiguration().then(function (config) {
loadPage(page, 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"; "use strict";
return function(view, params) {
return function (view, params) {
function onBeforeUnload(e) { 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() { var settingsInstance;
window.addEventListener("beforeunload", onBeforeUnload), settingsInstance ? settingsInstance.loadData() : settingsInstance = new DisplaySettings({ 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(), serverId: ApiClient.serverId(),
userId: userId, userId: userId,
element: view.querySelector(".settingsContainer"), element: view.querySelector(".settingsContainer"),
userSettings: userSettings, userSettings: userSettings,
enableSaveButton: !1, enableSaveButton: false,
enableSaveConfirmation: !1 enableSaveConfirmation: false
}) });
}), 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)
})
} }
});
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"; "use strict";
return function(view, params) {
return function (view, params) {
function onBeforeUnload(e) { 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() { var homescreenSettingsInstance;
window.addEventListener("beforeunload", onBeforeUnload), homescreenSettingsInstance ? homescreenSettingsInstance.loadData() : homescreenSettingsInstance = new HomescreenSettings({ 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(), serverId: ApiClient.serverId(),
userId: userId, userId: userId,
element: view.querySelector(".homeScreenSettingsContainer"), element: view.querySelector(".homeScreenSettingsContainer"),
userSettings: userSettings, userSettings: userSettings,
enableSaveButton: !1, enableSaveButton: false,
enableSaveConfirmation: !1 enableSaveConfirmation: false
}) });
}), view.addEventListener("change", function() {
hasChanges = !0
}), view.addEventListener("viewbeforehide", function() {
hasChanges = !1, homescreenSettingsInstance && homescreenSettingsInstance.submit()
}), view.addEventListener("viewdestroy", function() {
homescreenSettingsInstance && (homescreenSettingsInstance.destroy(), homescreenSettingsInstance = null)
})
} }
});
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); page.querySelector(".lnkSubtitlePreferences").setAttribute("href", "mypreferencessubtitles.html?userId=" + userId);
if (appHost.supports("multiserver")) { if (appHost.supports("multiserver")) {
page.querySelector(".selectServer").classList.remove("hide") page.querySelector(".selectServer").classList.remove("hide");
} else { } else {
page.querySelector(".selectServer").classList.add("hide"); page.querySelector(".selectServer").classList.add("hide");
} }
@ -35,6 +35,6 @@ define(["apphost", "connectionManager", "listViewStyle", "emby-button"], functio
page.querySelector(".adminSection").classList.add("hide"); 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"; "use strict";
return function(view, params) {
return function (view, params) {
function onBeforeUnload(e) { 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() { var settingsInstance;
window.addEventListener("beforeunload", onBeforeUnload), settingsInstance ? settingsInstance.loadData() : settingsInstance = new PlaybackSettings({ 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(), serverId: ApiClient.serverId(),
userId: userId, userId: userId,
element: view.querySelector(".settingsContainer"), element: view.querySelector(".settingsContainer"),
userSettings: userSettings, userSettings: userSettings,
enableSaveButton: !1, enableSaveButton: false,
enableSaveConfirmation: !1 enableSaveConfirmation: false
}) });
}), view.addEventListener("change", function() {
hasChanges = !0
}), view.addEventListener("viewbeforehide", function() {
hasChanges = !1, settingsInstance && settingsInstance.submit()
}), view.addEventListener("viewdestroy", function() {
settingsInstance && (settingsInstance.destroy(), settingsInstance = null)
})
} }
});
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"; "use strict";
return function(view, params) {
return function (view, params) {
function onBeforeUnload(e) { 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() { var subtitleSettingsInstance;
window.addEventListener("beforeunload", onBeforeUnload), subtitleSettingsInstance ? subtitleSettingsInstance.loadData() : subtitleSettingsInstance = new SubtitleSettings({ 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(), serverId: ApiClient.serverId(),
userId: userId, userId: userId,
element: view.querySelector(".settingsContainer"), element: view.querySelector(".settingsContainer"),
userSettings: userSettings, userSettings: userSettings,
enableSaveButton: !1, enableSaveButton: false,
enableSaveConfirmation: !1 enableSaveConfirmation: false
}) });
}), view.addEventListener("change", function() {
hasChanges = !0
}), view.addEventListener("viewbeforehide", function() {
hasChanges = !1, subtitleSettingsInstance && subtitleSettingsInstance.submit()
}), view.addEventListener("viewdestroy", function() {
subtitleSettingsInstance && (subtitleSettingsInstance.destroy(), subtitleSettingsInstance = null)
})
} }
});
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"; "use strict";
function loadDeleteFolders(page, user, mediaFolders) { function loadDeleteFolders(page, user, mediaFolders) {
ApiClient.getJSON(ApiClient.getUrl("Channels", { ApiClient.getJSON(ApiClient.getUrl("Channels", {
SupportsMediaDeletion: !0 SupportsMediaDeletion: true
})).then(function(channelsResult) { })).then(function (channelsResult) {
var i, length, folder, isChecked, checkedAttribute, html = ""; var i;
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>"; var length;
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>"; var folder;
$(".deleteAccess", page).html(html).trigger("create"), $("#chkEnableDeleteAllFolders", page).checked(user.Policy.EnableContentDeletion).trigger("change") 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) { 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; 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" : ""; 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) { 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; var currentProviderId = user.Policy.PasswordResetProviderId;
page.querySelector(".selectPasswordResetProvider").innerHTML = providers.map(function(provider) { page.querySelector(".selectPasswordResetProvider").innerHTML = providers.map(function (provider) {
var selected = (provider.Id === currentProviderId || providers.length < 2) ? " selected" : ""; 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 loadUser(page, user) { function loadUser(page, user) {
currentUser = user; currentUser = user;
ApiClient.getJSON(ApiClient.getUrl("Auth/Providers")).then(function(providers) { ApiClient.getJSON(ApiClient.getUrl("Auth/Providers")).then(function (providers) {
loadAuthProviders(page, user, providers) loadAuthProviders(page, user, providers);
}); });
ApiClient.getJSON(ApiClient.getUrl("Auth/PasswordResetProviders")).then(function(providers) { ApiClient.getJSON(ApiClient.getUrl("Auth/PasswordResetProviders")).then(function (providers) {
loadPasswordResetProviders(page, user, providers) loadPasswordResetProviders(page, user, providers);
}); });
ApiClient.getJSON(ApiClient.getUrl("Library/MediaFolders", { ApiClient.getJSON(ApiClient.getUrl("Library/MediaFolders", {
IsHidden: false IsHidden: false
})).then(function(folders) { })).then(function (folders) {
loadDeleteFolders(page, user, folders.Items) loadDeleteFolders(page, user, folders.Items);
}); });
if (user.Policy.IsDisabled) { if (user.Policy.IsDisabled) {
$(".disabledUserBanner", page).show(); $(".disabledUserBanner", page).show();
} else { } else {
$(".disabledUserBanner", page).hide(); $(".disabledUserBanner", page).hide();
} }
$("#txtUserName", page).prop("disabled", "").removeAttr("disabled"); $("#txtUserName", page).prop("disabled", "").removeAttr("disabled");
$("#fldConnectInfo", page).show(); $("#fldConnectInfo", page).show();
$(".lnkEditUserPreferences", page).attr("href", "mypreferencesmenu.html?userId=" + user.Id); $(".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) { function onSaveComplete(page, user) {
Dashboard.navigate("userprofiles.html"); Dashboard.navigate("userprofiles.html");
loading.hide(); loading.hide();
require(["toast"], function(toast) {
require(["toast"], function (toast) {
toast(Globalize.translate("SettingsSaved")); 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.AuthenticationProviderId = page.querySelector(".selectLoginProvider").value;
user.Policy.PasswordResetProviderId = page.querySelector(".selectPasswordResetProvider").value; user.Policy.PasswordResetProviderId = page.querySelector(".selectPasswordResetProvider").value;
user.Policy.EnableContentDeletion = $("#chkEnableDeleteAllFolders", page).checked(); user.Policy.EnableContentDeletion = $("#chkEnableDeleteAllFolders", page).checked();
user.Policy.EnableContentDeletionFromFolders = user.Policy.EnableContentDeletion ? [] : $(".chkFolder", page).get().filter(function(c) { user.Policy.EnableContentDeletionFromFolders = user.Policy.EnableContentDeletion ? [] : $(".chkFolder", page).get().filter(function (c) {
return c.checked return c.checked;
}).map(function(c) { }).map(function (c) {
return c.getAttribute("data-id") 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() { function onSubmit() {
var page = $(this).parents(".page")[0]; var page = $(this).parents(".page")[0];
return loading.show(), getUser().then(function(result) { loading.show();
saveUser(result, page) getUser().then(function (result) {
}), !1 saveUser(result, page);
});
return false;
} }
function getUser() { function getUser() {
var userId = getParameterByName("userId"); var userId = getParameterByName("userId");
return ApiClient.getUser(userId) return ApiClient.getUser(userId);
} }
function loadData(page) { function loadData(page) {
loading.show(), getUser().then(function(user) { loading.show();
loadUser(page, user) getUser().then(function (user) {
}) loadUser(page, user);
});
} }
var currentUser; var currentUser;
$(document).on("pageinit", "#editUserPage", function() { $(document).on("pageinit", "#editUserPage", function () {
$(".editUserProfileForm").off("submit", onSubmit).on("submit", onSubmit), this.querySelector(".sharingHelp").innerHTML = Globalize.translate("OptionAllowLinkSharingHelp", 30); $(".editUserProfileForm").off("submit", onSubmit).on("submit", onSubmit);
this.querySelector(".sharingHelp").innerHTML = Globalize.translate("OptionAllowLinkSharingHelp", 30);
var page = this; var page = this;
$("#chkEnableDeleteAllFolders", this).on("change", function() { $("#chkEnableDeleteAllFolders", this).on("change", function () {
this.checked ? $(".deleteAccess", page).hide() : $(".deleteAccess", page).show() if (this.checked) {
}), ApiClient.getServerConfiguration().then(function(config) { $(".deleteAccess", page).hide();
config.EnableRemoteAccess ? page.querySelector(".fldRemoteAccess").classList.remove("hide") : page.querySelector(".fldRemoteAccess").classList.add("hide") } else {
}) $(".deleteAccess", page).show();
}).on("pagebeforeshow", "#editUserPage", function() { }
loadData(this) });
}) 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"; "use strict";
function triggerChange(select) { function triggerChange(select) {
var evt = document.createEvent("HTMLEvents"); 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) { function loadMediaFolders(page, user, mediaFolders) {
var html = ""; 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++) { for (var i = 0, length = mediaFolders.length; i < length; i++) {
var folder = mediaFolders[i], var folder = mediaFolders[i];
isChecked = user.Policy.EnableAllFolders || -1 != user.Policy.EnabledFolders.indexOf(folder.Id), var isChecked = user.Policy.EnableAllFolders || -1 != user.Policy.EnabledFolders.indexOf(folder.Id);
checkedAttribute = isChecked ? ' checked="checked"' : ""; 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 += '<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"); var chkEnableAllFolders = page.querySelector("#chkEnableAllFolders");
chkEnableAllFolders.checked = user.Policy.EnableAllFolders, triggerChange(chkEnableAllFolders) chkEnableAllFolders.checked = user.Policy.EnableAllFolders;
triggerChange(chkEnableAllFolders);
} }
function loadChannels(page, user, channels) { function loadChannels(page, user, channels) {
var html = ""; 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++) { for (var i = 0, length = channels.length; i < length; i++) {
var folder = channels[i], var folder = channels[i];
isChecked = user.Policy.EnableAllChannels || -1 != user.Policy.EnabledChannels.indexOf(folder.Id), var isChecked = user.Policy.EnableAllChannels || -1 != user.Policy.EnabledChannels.indexOf(folder.Id);
checkedAttribute = isChecked ? ' checked="checked"' : ""; 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 += '<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) { function loadDevices(page, user, devices) {
var html = ""; 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++) { for (var i = 0, length = devices.length; i < length; i++) {
var device = devices[i], var device = devices[i];
checkedAttribute = user.Policy.EnableAllDevices || -1 != user.Policy.EnabledDevices.indexOf(device.Id) ? ' checked="checked"' : ""; 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 += '<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) { 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) { function onSaveComplete(page) {
loading.hide(), require(["toast"], function(toast) { loading.hide();
toast(Globalize.translate("SettingsSaved"))
}) require(["toast"], function (toast) {
toast(Globalize.translate("SettingsSaved"));
});
} }
function saveUser(user, page) { function saveUser(user, page) {
user.Policy.EnableAllFolders = $("#chkEnableAllFolders", page).checked(), user.Policy.EnabledFolders = user.Policy.EnableAllFolders ? [] : $(".chkFolder", page).get().filter(function(c) { user.Policy.EnableAllFolders = $("#chkEnableAllFolders", page).checked();
return c.checked user.Policy.EnabledFolders = user.Policy.EnableAllFolders ? [] : $(".chkFolder", page).get().filter(function (c) {
}).map(function(c) { return c.checked;
return c.getAttribute("data-id") }).map(function (c) {
}), user.Policy.EnableAllChannels = $("#chkEnableAllChannels", page).checked(), user.Policy.EnabledChannels = user.Policy.EnableAllChannels ? [] : $(".chkChannel", page).get().filter(function(c) { return c.getAttribute("data-id");
return c.checked });
}).map(function(c) { user.Policy.EnableAllChannels = $("#chkEnableAllChannels", page).checked();
return c.getAttribute("data-id") user.Policy.EnabledChannels = user.Policy.EnableAllChannels ? [] : $(".chkChannel", page).get().filter(function (c) {
}), user.Policy.EnableAllDevices = $("#chkEnableAllDevices", page).checked(), user.Policy.EnabledDevices = user.Policy.EnableAllDevices ? [] : $(".chkDevice", page).get().filter(function(c) { return c.checked;
return c.checked }).map(function (c) {
}).map(function(c) { return c.getAttribute("data-id");
return c.getAttribute("data-id") });
}), user.Policy.BlockedChannels = null, user.Policy.BlockedMediaFolders = null, ApiClient.updateUserPolicy(user.Id, user.Policy).then(function() { user.Policy.EnableAllDevices = $("#chkEnableAllDevices", page).checked();
onSaveComplete(page) 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() { function onSubmit() {
var page = $(this).parents(".page"); var page = $(this).parents(".page");
loading.show(); loading.show();
var userId = getParameterByName("userId"); var userId = getParameterByName("userId");
return ApiClient.getUser(userId).then(function(result) { ApiClient.getUser(userId).then(function (result) {
saveUser(result, page) saveUser(result, page);
}), !1 });
return false;
} }
$(document).on("pageinit", "#userLibraryAccessPage", function() {
$(document).on("pageinit", "#userLibraryAccessPage", function () {
var page = this; var page = this;
$("#chkEnableAllDevices", page).on("change", function() { $("#chkEnableAllDevices", page).on("change", function () {
this.checked ? $(".deviceAccessListContainer", page).hide() : $(".deviceAccessListContainer", page).show() if (this.checked) {
}), $("#chkEnableAllChannels", page).on("change", function() { $(".deviceAccessListContainer", page).hide();
this.checked ? $(".channelAccessListContainer", page).hide() : $(".channelAccessListContainer", page).show() } else {
}), page.querySelector("#chkEnableAllFolders").addEventListener("change", function() { $(".deviceAccessListContainer", page).show();
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() { $("#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; var page = this;
loading.show(); loading.show();
var promise1, userId = getParameterByName("userId"); var promise1;
if (userId) promise1 = ApiClient.getUser(userId); var userId = getParameterByName("userId");
else {
if (userId) {
promise1 = ApiClient.getUser(userId);
} else {
var deferred = $.Deferred(); var deferred = $.Deferred();
deferred.resolveWith(null, [{ deferred.resolveWith(null, [{
Configuration: {} Configuration: {}
}]), promise1 = deferred.promise() }]);
promise1 = deferred.promise();
} }
var promise2 = Dashboard.getCurrentUser(),
promise4 = ApiClient.getJSON(ApiClient.getUrl("Library/MediaFolders", { var promise2 = Dashboard.getCurrentUser();
IsHidden: !1 var promise4 = ApiClient.getJSON(ApiClient.getUrl("Library/MediaFolders", {
})), IsHidden: false
promise5 = ApiClient.getJSON(ApiClient.getUrl("Channels")), }));
promise6 = ApiClient.getJSON(ApiClient.getUrl("Devices")); var promise5 = ApiClient.getJSON(ApiClient.getUrl("Channels"));
Promise.all([promise1, promise2, promise4, promise5, promise6]).then(function(responses) { var promise6 = ApiClient.getJSON(ApiClient.getUrl("Devices"));
loadUser(page, responses[0], responses[1], responses[2].Items, responses[3].Items, responses[4].Items) 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"; "use strict";
function loadMediaFolders(page, mediaFolders) { function loadMediaFolders(page, mediaFolders) {
var html = ""; var html = "";
html += '<h3 class="checkboxListLabel">' + Globalize.translate("HeaderLibraries") + "</h3>"; html += '<h3 class="checkboxListLabel">' + Globalize.translate("HeaderLibraries") + "</h3>";
html += '<div class="checkboxList paperList" style="padding:.5em 1em;">'; html += '<div class="checkboxList paperList" style="padding:.5em 1em;">';
for (var i = 0; i < mediaFolders.length; i++) { for (var i = 0; i < mediaFolders.length; i++) {
var folder = mediaFolders[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 += '<label><input type="checkbox" is="emby-checkbox" class="chkFolder" data-id="' + folder.Id + '" checked="checked"/><span>' + folder.Name + "</span></label>";
} }
html += "</div>"; html += "</div>";
$(".folderAccess", page).html(html).trigger("create"); $(".folderAccess", page).html(html).trigger("create");
$("#chkEnableAllFolders", page).checked(true).trigger("change"); $("#chkEnableAllFolders", page).checked(true).trigger("change");
@ -18,17 +20,21 @@ define(["jQuery", "loading", "fnchecked", "emby-checkbox"], function($, loading)
var html = ""; var html = "";
html += '<h3 class="checkboxListLabel">' + Globalize.translate("HeaderChannels") + "</h3>"; html += '<h3 class="checkboxListLabel">' + Globalize.translate("HeaderChannels") + "</h3>";
html += '<div class="checkboxList paperList" style="padding:.5em 1em;">'; html += '<div class="checkboxList paperList" style="padding:.5em 1em;">';
for (var i = 0; i < channels.length; i++) { for (var i = 0; i < channels.length; i++) {
var folder = channels[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 += '<label><input type="checkbox" is="emby-checkbox" class="chkChannel" data-id="' + folder.Id + '" checked="checked"/><span>' + folder.Name + "</span></label>";
} }
html += "</div>"; html += "</div>";
$(".channelAccess", page).show().html(html).trigger("create"); $(".channelAccess", page).show().html(html).trigger("create");
if (channels.length) { if (channels.length) {
$(".channelAccessContainer", page).show(); $(".channelAccessContainer", page).show();
} else { } else {
$(".channelAccessContainer", page).hide(); $(".channelAccessContainer", page).hide();
} }
$("#chkEnableAllChannels", page).checked(true).trigger("change"); $("#chkEnableAllChannels", page).checked(true).trigger("change");
} }
@ -40,43 +46,48 @@ define(["jQuery", "loading", "fnchecked", "emby-checkbox"], function($, loading)
IsHidden: false IsHidden: false
})); }));
var promiseChannels = ApiClient.getJSON(ApiClient.getUrl("Channels")); 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); loadMediaFolders(page, responses[0].Items);
loadChannels(page, responses[1].Items); loadChannels(page, responses[1].Items);
loading.hide(); loading.hide();
}) });
} }
function saveUser(page) { function saveUser(page) {
var user = {}; var user = {};
user.Name = $("#txtUsername", page).val(); user.Name = $("#txtUsername", page).val();
user.Password = $("#txtPassword", 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.EnableAllFolders = $("#chkEnableAllFolders", page).checked();
user.Policy.EnabledFolders = []; user.Policy.EnabledFolders = [];
if (!user.Policy.EnableAllFolders) { if (!user.Policy.EnableAllFolders) {
user.Policy.EnabledFolders = $(".chkFolder", page).get().filter(function(i) { user.Policy.EnabledFolders = $(".chkFolder", page).get().filter(function (i) {
return i.checked return i.checked;
}).map(function(i) { }).map(function (i) {
return i.getAttribute("data-id"); return i.getAttribute("data-id");
}); });
} }
user.Policy.EnableAllChannels = $("#chkEnableAllChannels", page).checked(); user.Policy.EnableAllChannels = $("#chkEnableAllChannels", page).checked();
user.Policy.EnabledChannels = []; user.Policy.EnabledChannels = [];
if (!user.Policy.EnableAllChannels) { if (!user.Policy.EnableAllChannels) {
user.Policy.EnabledChannels = $(".chkChannel", page).get().filter(function(i) { user.Policy.EnabledChannels = $(".chkChannel", page).get().filter(function (i) {
return i.checked return i.checked;
}).map(function(i) { }).map(function (i) {
return i.getAttribute("data-id"); 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); Dashboard.navigate("useredit.html?userId=" + user.Id);
}); });
}, function(response) { }, function (response) {
require(["toast"], function(toast) { require(["toast"], function (toast) {
toast(Globalize.translate("DefaultErrorMessage")); toast(Globalize.translate("DefaultErrorMessage"));
}); });
loading.hide(); loading.hide();
}); });
} }
@ -92,16 +103,16 @@ define(["jQuery", "loading", "fnchecked", "emby-checkbox"], function($, loading)
loadUser(page); loadUser(page);
} }
$(document).on("pageinit", "#newUserPage", function() { $(document).on("pageinit", "#newUserPage", function () {
var page = this; var page = this;
$("#chkEnableAllChannels", page).on("change", function() { $("#chkEnableAllChannels", page).on("change", function () {
if (this.checked) { if (this.checked) {
$(".channelAccessListContainer", page).hide(); $(".channelAccessListContainer", page).hide();
} else { } else {
$(".channelAccessListContainer", page).show(); $(".channelAccessListContainer", page).show();
} }
}); });
$("#chkEnableAllFolders", page).on("change", function() { $("#chkEnableAllFolders", page).on("change", function () {
if (this.checked) { if (this.checked) {
$(".folderAccessListContainer", page).hide(); $(".folderAccessListContainer", page).hide();
} else { } else {
@ -109,7 +120,7 @@ define(["jQuery", "loading", "fnchecked", "emby-checkbox"], function($, loading)
} }
}); });
$(".newUserProfileForm").off("submit", onSubmit).on("submit", onSubmit); $(".newUserProfileForm").off("submit", onSubmit).on("submit", onSubmit);
}).on("pageshow", "#newUserPage", function() { }).on("pageshow", "#newUserPage", function () {
loadData(this); loadData(this);
}); });
}); });

View file

@ -1,25 +1,36 @@
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"; "use strict";
function populateRatings(allParentalRatings, page) { function populateRatings(allParentalRatings, page) {
var html = ""; var html = "";
html += "<option value=''></option>"; 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++) { for (i = 0, length = allParentalRatings.length; i < length; i++) {
if (rating = allParentalRatings[i], ratings.length) { if (rating = allParentalRatings[i], ratings.length) {
var lastRating = ratings[ratings.length - 1]; var lastRating = ratings[ratings.length - 1];
if (lastRating.Value === rating.Value) { if (lastRating.Value === rating.Value) {
lastRating.Name += "/" + rating.Name; lastRating.Name += "/" + rating.Name;
continue continue;
} }
} }
ratings.push({ ratings.push({
Name: rating.Name, Name: rating.Name,
Value: rating.Value 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) { function loadUnratedItems(page, user) {
@ -44,142 +55,217 @@ define(["jQuery", "datetime", "loading", "libraryMenu", "listViewStyle", "paper-
}, { }, {
name: Globalize.translate("OptionBlockTvShows"), name: Globalize.translate("OptionBlockTvShows"),
value: "Series" value: "Series"
}], }];
html = ""; var html = "";
html += '<h3 class="checkboxListLabel">' + Globalize.translate("HeaderBlockItemsWithNoRating") + "</h3>", html += '<div class="checkboxList paperList checkboxList-paperList">'; 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++) { for (var i = 0, length = items.length; i < length; i++) {
var item = items[i], var item = items[i];
checkedAttribute = -1 != user.Policy.BlockUnratedItems.indexOf(item.value) ? ' checked="checked"' : ""; 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 += '<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) { 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 = ""; var ratingValue = "";
if (user.Policy.MaxParentalRating)
if (user.Policy.MaxParentalRating) {
for (var i = 0, length = allParentalRatings.length; i < length; i++) { for (var i = 0, length = allParentalRatings.length; i < length; i++) {
var rating = allParentalRatings[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) { function loadBlockedTags(page, tags) {
var html = tags.map(function(h) { var html = tags.map(function (h) {
var li = '<div class="listItem">'; 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(""); }).join("");
html && (html = '<div class="paperList">' + html + "</div>");
if (html) {
html = '<div class="paperList">' + html + "</div>";
}
var elem = $(".blockedTags", page).html(html).trigger("create"); var elem = $(".blockedTags", page).html(html).trigger("create");
$(".btnDeleteTag", elem).on("click", function() { $(".btnDeleteTag", elem).on("click", function () {
var tag = this.getAttribute("data-tag"), var tag = this.getAttribute("data-tag");
newTags = tags.filter(function(t) { var newTags = tags.filter(function (t) {
return t != tag return t != tag;
});
loadBlockedTags(page, newTags);
}); });
loadBlockedTags(page, newTags)
})
} }
function deleteAccessSchedule(page, schedules, index) { function deleteAccessSchedule(page, schedules, index) {
schedules.splice(index, 1), renderAccessSchedule(page, schedules) schedules.splice(index, 1);
renderAccessSchedule(page, schedules);
} }
function renderAccessSchedule(page, schedules) { function renderAccessSchedule(page, schedules) {
var html = "", var html = "";
index = 0; var index = 0;
html += schedules.map(function(a) { html += schedules.map(function (a) {
var itemHtml = ""; 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(""); }).join("");
var accessScheduleList = page.querySelector(".accessScheduleList"); var accessScheduleList = page.querySelector(".accessScheduleList");
accessScheduleList.innerHTML = html, $(".btnDelete", accessScheduleList).on("click", function() { accessScheduleList.innerHTML = html;
deleteAccessSchedule(page, schedules, parseInt(this.getAttribute("data-index"))) $(".btnDelete", accessScheduleList).on("click", function () {
}) deleteAccessSchedule(page, schedules, parseInt(this.getAttribute("data-index")));
});
} }
function onSaveComplete(page) { function onSaveComplete(page) {
loading.hide(), require(["toast"], function(toast) { loading.hide();
toast(Globalize.translate("SettingsSaved"))
}) require(["toast"], function (toast) {
toast(Globalize.translate("SettingsSaved"));
});
} }
function saveUser(user, page) { function saveUser(user, page) {
user.Policy.MaxParentalRating = $("#selectMaxParentalRating", page).val() || null, user.Policy.BlockUnratedItems = $(".chkUnratedItem", page).get().filter(function(i) { user.Policy.MaxParentalRating = $("#selectMaxParentalRating", page).val() || null;
return i.checked user.Policy.BlockUnratedItems = $(".chkUnratedItem", page).get().filter(function (i) {
}).map(function(i) { return i.checked;
return i.getAttribute("data-itemtype") }).map(function (i) {
}), user.Policy.AccessSchedules = getSchedulesFromPage(page), user.Policy.BlockedTags = getBlockedTagsFromPage(page), ApiClient.updateUserPolicy(user.Id, user.Policy).then(function() { return i.getAttribute("data-itemtype");
onSaveComplete(page) });
}) user.Policy.AccessSchedules = getSchedulesFromPage(page);
user.Policy.BlockedTags = getBlockedTagsFromPage(page);
ApiClient.updateUserPolicy(user.Id, user.Policy).then(function () {
onSaveComplete(page);
});
} }
function getDisplayTime(hours) { function getDisplayTime(hours) {
var minutes = 0, var minutes = 0;
pct = hours % 1; var pct = hours % 1;
return pct && (minutes = parseInt(60 * pct)), datetime.getDisplayTime(new Date(2e3, 1, 1, hours, minutes, 0, 0))
if (pct) {
minutes = parseInt(60 * pct);
}
return datetime.getDisplayTime(new Date(2000, 1, 1, hours, minutes, 0, 0));
} }
function showSchedulePopup(page, schedule, index) { function showSchedulePopup(page, schedule, index) {
schedule = schedule || {}, require(["components/accessschedule/accessschedule"], function(accessschedule) { schedule = schedule || {};
require(["components/accessschedule/accessschedule"], function (accessschedule) {
accessschedule.show({ accessschedule.show({
schedule: schedule schedule: schedule
}).then(function(updatedSchedule) { }).then(function (updatedSchedule) {
var schedules = getSchedulesFromPage(page); - 1 == index && (index = schedules.length), schedules[index] = updatedSchedule, renderAccessSchedule(page, schedules) var schedules = getSchedulesFromPage(page);
})
}) if (-1 == index) {
index = schedules.length;
}
schedules[index] = updatedSchedule;
renderAccessSchedule(page, schedules);
});
});
} }
function getSchedulesFromPage(page) { function getSchedulesFromPage(page) {
return $(".liSchedule", page).map(function() { return $(".liSchedule", page).map(function () {
return { return {
DayOfWeek: this.getAttribute("data-day"), DayOfWeek: this.getAttribute("data-day"),
StartHour: this.getAttribute("data-start"), StartHour: this.getAttribute("data-start"),
EndHour: this.getAttribute("data-end") EndHour: this.getAttribute("data-end")
} };
}).get() }).get();
} }
function getBlockedTagsFromPage(page) { function getBlockedTagsFromPage(page) {
return $(".blockedTag", page).map(function() { return $(".blockedTag", page).map(function () {
return this.getAttribute("data-tag") return this.getAttribute("data-tag");
}).get() }).get();
} }
function showBlockedTagPopup(page) { function showBlockedTagPopup(page) {
require(["prompt"], function(prompt) { require(["prompt"], function (prompt) {
prompt({ prompt({
label: Globalize.translate("LabelTag") label: Globalize.translate("LabelTag")
}).then(function(value) { }).then(function (value) {
var tags = getBlockedTagsFromPage(page); - 1 == tags.indexOf(value) && (tags.push(value), loadBlockedTags(page, tags)) var tags = getBlockedTagsFromPage(page);
})
}) if (-1 == tags.indexOf(value)) {
tags.push(value);
loadBlockedTags(page, tags);
} }
});
});
}
window.UserParentalControlPage = { window.UserParentalControlPage = {
onSubmit: function() { onSubmit: function () {
var page = $(this).parents(".page"); var page = $(this).parents(".page");
loading.show(); loading.show();
var userId = getParameterByName("userId"); var userId = getParameterByName("userId");
return ApiClient.getUser(userId).then(function(result) { ApiClient.getUser(userId).then(function (result) {
saveUser(result, page) saveUser(result, page);
}), !1 });
return false;
} }
}, $(document).on("pageinit", "#userParentalControlPage", function() { };
$(document).on("pageinit", "#userParentalControlPage", function () {
var page = this; var page = this;
$(".btnAddSchedule", page).on("click", function() { $(".btnAddSchedule", page).on("click", function () {
showSchedulePopup(page, {}, -1) showSchedulePopup(page, {}, -1);
}), $(".btnAddBlockedTag", page).on("click", function() { });
showBlockedTagPopup(page) $(".btnAddBlockedTag", page).on("click", function () {
}), $(".userParentalControlForm").off("submit", UserParentalControlPage.onSubmit).on("submit", UserParentalControlPage.onSubmit) showBlockedTagPopup(page);
}).on("pageshow", "#userParentalControlPage", function() { });
$(".userParentalControlForm").off("submit", UserParentalControlPage.onSubmit).on("submit", UserParentalControlPage.onSubmit);
}).on("pageshow", "#userParentalControlPage", function () {
var page = this; var page = this;
loading.show(); loading.show();
var userId = getParameterByName("userId"), var userId = getParameterByName("userId");
promise1 = ApiClient.getUser(userId), var promise1 = ApiClient.getUser(userId);
promise2 = ApiClient.getParentalRatings(); var promise2 = ApiClient.getParentalRatings();
Promise.all([promise1, promise2]).then(function(responses) { Promise.all([promise1, promise2]).then(function (responses) {
loadUser(page, responses[0], responses[1]) 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"; "use strict";
function loadUser(page, params) { function loadUser(page, params) {
var userid = params.userId; var userid = params.userId;
ApiClient.getUser(userid).then(function(user) { ApiClient.getUser(userid).then(function (user) {
Dashboard.getCurrentUser().then(function(loggedInUser) { Dashboard.getCurrentUser().then(function (loggedInUser) {
libraryMenu.setTitle(user.Name), page.querySelector(".username").innerHTML = user.Name; libraryMenu.setTitle(user.Name);
var showPasswordSection = !0, page.querySelector(".username").innerHTML = user.Name;
showLocalAccessSection = !1; var showPasswordSection = true;
"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"); var showLocalAccessSection = false;
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 if ("Guest" == user.ConnectLinkType) {
}) page.querySelector(".localAccessSection").classList.add("hide");
}), page.querySelector("#txtCurrentPassword").value = "", page.querySelector("#txtNewPassword").value = "", page.querySelector("#txtNewPasswordConfirm").value = "" 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");
} }
return function(view, params) {
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 = "";
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) {
function saveEasyPassword() { function saveEasyPassword() {
var userId = params.userId, var userId = params.userId;
easyPassword = view.querySelector("#txtEasyPassword").value; var easyPassword = view.querySelector("#txtEasyPassword").value;
easyPassword ? ApiClient.updateEasyPassword(userId, easyPassword).then(function() {
onEasyPasswordSaved(userId) if (easyPassword) {
}) : onEasyPasswordSaved(userId) ApiClient.updateEasyPassword(userId, easyPassword).then(function () {
onEasyPasswordSaved(userId);
});
} else {
onEasyPasswordSaved(userId);
}
} }
function onEasyPasswordSaved(userId) { function onEasyPasswordSaved(userId) {
ApiClient.getUser(userId).then(function(user) { ApiClient.getUser(userId).then(function (user) {
user.Configuration.EnableLocalPassword = view.querySelector(".chkEnableLocalEasyPassword").checked, ApiClient.updateUserConfiguration(user.Id, user.Configuration).then(function() { user.Configuration.EnableLocalPassword = view.querySelector(".chkEnableLocalEasyPassword").checked;
loading.hide(), require(["toast"], function(toast) { ApiClient.updateUserConfiguration(user.Id, user.Configuration).then(function () {
toast(Globalize.translate("MessageSettingsSaved")) loading.hide();
}), loadUser(view, params)
}) require(["toast"], function (toast) {
}) toast(Globalize.translate("MessageSettingsSaved"));
});
loadUser(view, params);
});
});
} }
function savePassword() { function savePassword() {
var userId = params.userId, var userId = params.userId;
currentPassword = view.querySelector("#txtCurrentPassword").value, var currentPassword = view.querySelector("#txtCurrentPassword").value;
newPassword = view.querySelector("#txtNewPassword").value; var newPassword = view.querySelector("#txtNewPassword").value;
if (view.querySelector("#fldCurrentPassword").classList.contains("hide")) { 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) // 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 // This should only happen when user.HasConfiguredPassword is false, but this information is not passed on
currentPassword = ""; currentPassword = "";
} }
ApiClient.updateUserPassword(userId, currentPassword, newPassword).then(function() {
loading.hide(), require(["toast"], function(toast) { ApiClient.updateUserPassword(userId, currentPassword, newPassword).then(function () {
toast(Globalize.translate("PasswordSaved")) loading.hide();
}), loadUser(view, params)
}, function() { require(["toast"], function (toast) {
loading.hide(), Dashboard.alert({ toast(Globalize.translate("PasswordSaved"));
});
loadUser(view, params);
}, function () {
loading.hide();
Dashboard.alert({
title: Globalize.translate("HeaderLoginFailure"), title: Globalize.translate("HeaderLoginFailure"),
message: Globalize.translate("MessageInvalidUser") message: Globalize.translate("MessageInvalidUser")
}) });
}) });
} }
function onSubmit(e) { function onSubmit(e) {
var form = this; var form = this;
return form.querySelector("#txtNewPassword").value != form.querySelector("#txtNewPasswordConfirm").value ? require(["toast"], function(toast) {
toast(Globalize.translate("PasswordMatchError")) if (form.querySelector("#txtNewPassword").value != form.querySelector("#txtNewPasswordConfirm").value) {
}) : (loading.show(), savePassword()), e.preventDefault(), !1 require(["toast"], function (toast) {
toast(Globalize.translate("PasswordMatchError"));
});
} else {
loading.show();
savePassword();
}
e.preventDefault();
return false;
} }
function onLocalAccessSubmit(e) { function onLocalAccessSubmit(e) {
return loading.show(), saveEasyPassword(), e.preventDefault(), !1 loading.show();
saveEasyPassword();
e.preventDefault();
return false;
} }
function resetPassword() { function resetPassword() {
var msg = Globalize.translate("PasswordResetConfirmation"); 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; var userId = params.userId;
loading.show(), ApiClient.resetUserPassword(userId).then(function() { loading.show();
loading.hide(), Dashboard.alert({ ApiClient.resetUserPassword(userId).then(function () {
loading.hide();
Dashboard.alert({
message: Globalize.translate("PasswordResetComplete"), message: Globalize.translate("PasswordResetComplete"),
title: Globalize.translate("PasswordResetHeader") title: Globalize.translate("PasswordResetHeader")
}), loadUser(view, params) });
}) loadUser(view, params);
}) });
}) });
});
} }
function resetEasyPassword() { function resetEasyPassword() {
var msg = Globalize.translate("PinCodeResetConfirmation"); 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; var userId = params.userId;
loading.show(), ApiClient.resetEasyPassword(userId).then(function() { loading.show();
loading.hide(), Dashboard.alert({ ApiClient.resetEasyPassword(userId).then(function () {
loading.hide();
Dashboard.alert({
message: Globalize.translate("PinCodeResetComplete"), message: Globalize.translate("PinCodeResetComplete"),
title: Globalize.translate("HeaderPinCodeReset") 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({ ApiClient.ajax({
url: ApiClient.getUrl("Startup/Complete"), url: ApiClient.getUrl("Startup/Complete"),
type: "POST" type: "POST"
}).then(function() { }).then(function () {
loading.hide(); loading.hide();
window.location.href = "index.html"; window.location.href = "index.html";
}); });

View file

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

View file

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

View file

@ -52,14 +52,6 @@ define(["dom", "layoutManager", "inputManager", "connectionManager", "events", "
headerSearchButton.classList.remove("hide"); headerSearchButton.classList.remove("hide");
} }
if (headerSettingsButton) {
if (user.localUser.Policy.IsAdministrator) {
headerSettingsButton.classList.remove("hide");
} else {
headerSettingsButton.classList.add("hide");
}
}
headerCastButton.classList.remove("hide"); headerCastButton.classList.remove("hide");
} else { } else {
headerHomeButton.classList.add("hide"); headerHomeButton.classList.add("hide");
@ -68,10 +60,6 @@ define(["dom", "layoutManager", "inputManager", "connectionManager", "events", "
if (headerSearchButton) { if (headerSearchButton) {
headerSearchButton.classList.add("hide"); headerSearchButton.classList.add("hide");
} }
if (headerSettingsButton) {
headerSettingsButton.classList.add("hide");
}
} }
requiresUserRefresh = false; requiresUserRefresh = false;
@ -95,10 +83,6 @@ define(["dom", "layoutManager", "inputManager", "connectionManager", "events", "
Dashboard.navigate("mypreferencesmenu.html"); Dashboard.navigate("mypreferencesmenu.html");
} }
function onSettingsClick(e) {
Dashboard.navigate("dashboard.html");
}
function onHeaderHomeButtonClick() { function onHeaderHomeButtonClick() {
Dashboard.navigate("home.html"); Dashboard.navigate("home.html");
} }
@ -122,12 +106,9 @@ define(["dom", "layoutManager", "inputManager", "connectionManager", "events", "
headerUserButton.addEventListener("click", onHeaderUserButtonClick); headerUserButton.addEventListener("click", onHeaderUserButtonClick);
headerHomeButton.addEventListener("click", onHeaderHomeButtonClick); headerHomeButton.addEventListener("click", onHeaderHomeButtonClick);
initHeadRoom(skinHeader);
headerCastButton.addEventListener("click", onCastButtonClicked); headerCastButton.addEventListener("click", onCastButtonClicked);
if (headerSettingsButton) { initHeadRoom(skinHeader);
headerSettingsButton.addEventListener("click", onSettingsClick);
}
} }
function onCastButtonClicked() { function onCastButtonClicked() {
@ -747,7 +728,6 @@ define(["dom", "layoutManager", "inputManager", "connectionManager", "events", "
var headerBackButton; var headerBackButton;
var headerUserButton; var headerUserButton;
var currentUser; var currentUser;
var headerSettingsButton;
var headerCastButton; var headerCastButton;
var headerSearchButton; var headerSearchButton;
var enableLibraryNavDrawer = !layoutManager.tv; 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 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 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>'; 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>"; html += "</div>";
html += '<div class="headerTabs sectionTabs hide">'; html += '<div class="headerTabs sectionTabs hide">';
html += "</div>"; html += "</div>";
skinHeader.classList.add("skinHeader-withBackground"); skinHeader.classList.add("skinHeader-withBackground");
skinHeader.classList.add("skinHeader-blurred");
skinHeader.innerHTML = html; skinHeader.innerHTML = html;
headerHomeButton = skinHeader.querySelector(".headerHomeButton"); headerHomeButton = skinHeader.querySelector(".headerHomeButton");
headerUserButton = skinHeader.querySelector(".headerUserButton"); headerUserButton = skinHeader.querySelector(".headerUserButton");
headerSettingsButton = skinHeader.querySelector(".headerSettingsButton");
headerCastButton = skinHeader.querySelector(".headerCastButton"); headerCastButton = skinHeader.querySelector(".headerCastButton");
headerSearchButton = skinHeader.querySelector(".headerSearchButton"); headerSearchButton = skinHeader.querySelector(".headerSearchButton");
skinHeader.classList.add("skinHeader-blurred");
lazyLoadViewMenuBarImages(); lazyLoadViewMenuBarImages();
bindMenuEvents(); bindMenuEvents();
})(); })();

View file

@ -13,7 +13,7 @@
"AllChannels": "Všechny kanály", "AllChannels": "Všechny kanály",
"AllEpisodes": "Všechny epizody", "AllEpisodes": "Všechny epizody",
"AllLanguages": "Všechny jazyky", "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", "AlwaysPlaySubtitles": "Vždy zobrazit titulky",
"AlwaysPlaySubtitlesHelp": "Titulky odpovídající jazykové předvolbě se načtou bez ohledu na jazyk audia.", "AlwaysPlaySubtitlesHelp": "Titulky odpovídající jazykové předvolbě se načtou bez ohledu na jazyk audia.",
"Anytime": "Kdykoliv", "Anytime": "Kdykoliv",
@ -30,7 +30,7 @@
"BirthDateValue": "Narozen: {0}", "BirthDateValue": "Narozen: {0}",
"BirthLocation": "Místo narození", "BirthLocation": "Místo narození",
"BirthPlaceValue": "Místo narození: {0}", "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", "Books": "Knihy",
"Box": "Pouzdro", "Box": "Pouzdro",
"BoxRear": "Zadní část pouzdra", "BoxRear": "Zadní část pouzdra",
@ -157,7 +157,7 @@
"Dislike": "Nemám rád", "Dislike": "Nemám rád",
"Display": "Zobrazení", "Display": "Zobrazení",
"DisplayMissingEpisodesWithinSeasons": "Zobrazit chybějící epizody", "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.", "DisplayModeHelp": "Zvolte typ obrazovky, na které používáte Jellyfin.",
"DoNotRecord": "Nenahrávat", "DoNotRecord": "Nenahrávat",
"Down": "Dolů", "Down": "Dolů",
@ -522,7 +522,7 @@
"LabelEnableDlnaClientDiscoveryInterval": "Čas pro vyhledání klienta (sekund)", "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.", "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í)", "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í", "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í.", "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", "LabelEnableDlnaServer": "Povolit Dlna Server",
@ -611,9 +611,9 @@
"LabelMethod": "Metoda:", "LabelMethod": "Metoda:",
"LabelMinBackdropDownloadWidth": "Maximální šířka pro stažení pozadí:", "LabelMinBackdropDownloadWidth": "Maximální šířka pro stažení pozadí:",
"LabelMinResumeDuration": "Minimální doba trvání:", "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í:", "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:", "LabelMinScreenshotDownloadWidth": "Minimální šířka screenshotu obrazovky:",
"LabelModelDescription": "Popis modelu", "LabelModelDescription": "Popis modelu",
"LabelModelName": "Název 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.", "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.", "PlaybackErrorPlaceHolder": "Chcete-li toto video přehrát, vložte disk.",
"Played": "Přehráno", "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.", "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.", "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.", "PleaseEnterNameOrId": "Prosím, zadejte název nebo externí Id.",
@ -1230,7 +1230,7 @@
"AllowMediaConversion": "Povolit konverzi médií", "AllowMediaConversion": "Povolit konverzi médií",
"AllowMediaConversionHelp": "Povolit nebo zakázat přístup k funkci konverze médií.", "AllowMediaConversionHelp": "Povolit nebo zakázat přístup k funkci konverze médií.",
"AllowOnTheFlySubtitleExtraction": "Povolit extrahování titulků za běhu", "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.", "AllowRemoteAccess": "Povolit vzdálené připojení na server Jellyfin.",
"AllowRemoteAccessHelp": "Pokud není zapnuto, všechna vzdálená připojení budou blokována.", "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.", "AllowSeasonalThemesHelp": "Pokud je povoleno, sezónní motivy občas přepíšou nastavení vašeho motivu.",
@ -1249,7 +1249,7 @@
"Blacklist": "Blacklist", "Blacklist": "Blacklist",
"BobAndWeaveWithHelp": "Bob and weave (vyšší kvalita, ale pomalejší)", "BobAndWeaveWithHelp": "Bob and weave (vyšší kvalita, ale pomalejší)",
"Browse": "Procházet", "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", "ButtonInfo": "Info",
"ButtonMenu": "Menu", "ButtonMenu": "Menu",
"ButtonOk": "Ok", "ButtonOk": "Ok",
@ -1304,7 +1304,7 @@
"HandledByProxy": "Zpracováno reverzním proxy", "HandledByProxy": "Zpracováno reverzním proxy",
"HeaderAddLocalUser": "Přidat místního uživatele", "HeaderAddLocalUser": "Přidat místního uživatele",
"HeaderAllowMediaDeletionFrom": "Povolit smazání médií z", "HeaderAllowMediaDeletionFrom": "Povolit smazání médií z",
"HeaderAppearsOn": "Appears On", "HeaderAppearsOn": "Objeví se",
"HeaderAudio": "Audio", "HeaderAudio": "Audio",
"HeaderBlockItemsWithNoRating": "Blokovat položky s žádnými nebo nerozpoznanými informacemi o hodnocení:", "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.", "HeaderCameraUploadHelp": "Aplikace Jellyfin mohou automaticky nahrávat fotografie z mobilních zařízení do serveru Jellyfin.",
@ -1322,8 +1322,8 @@
"HeaderImageOptions": "Volby obrázku", "HeaderImageOptions": "Volby obrázku",
"HeaderInviteWithJellyfinConnect": "Pozvat s Jellyfin Connect", "HeaderInviteWithJellyfinConnect": "Pozvat s Jellyfin Connect",
"HeaderKodiMetadataHelp": "Chcete-li povolit nebo zakázat Nfo metadata, upravte nastavení knihovny v sekci ukládání metadat.", "HeaderKodiMetadataHelp": "Chcete-li povolit nebo zakázat Nfo metadata, upravte nastavení knihovny v sekci ukládání metadat.",
"HeaderLiveTV": "Live TV", "HeaderLiveTV": "Živá TV",
"HeaderLiveTv": "Live TV", "HeaderLiveTv": "Živá TV",
"HeaderLiveTvTunerSetup": "Nastavení tuneru Live TV", "HeaderLiveTvTunerSetup": "Nastavení tuneru Live TV",
"HeaderMenu": "Menu", "HeaderMenu": "Menu",
"HeaderNewDevices": "Nové zařízení", "HeaderNewDevices": "Nové zařízení",
@ -1350,7 +1350,7 @@
"LabelAlbum": "Album:", "LabelAlbum": "Album:",
"LabelAllowedRemoteAddresses": "Filtr vzdálené IP adresy:", "LabelAllowedRemoteAddresses": "Filtr vzdálené IP adresy:",
"LabelAllowedRemoteAddressesMode": "Režim filtru vzdálené IP adresy:", "LabelAllowedRemoteAddressesMode": "Režim filtru vzdálené IP adresy:",
"LabelAudioCodec": "Audio: {0}", "LabelAudioCodec": "Audio kodek:",
"LabelAutomaticallyRefreshInternetMetadataEvery": "Automaticky aktualizovat metadata z internetu:", "LabelAutomaticallyRefreshInternetMetadataEvery": "Automaticky aktualizovat metadata z internetu:",
"LabelBlockContentWithTags": "Blokovat položky s tagy:", "LabelBlockContentWithTags": "Blokovat položky s tagy:",
"LabelBurnSubtitles": "Vypálit titulky:", "LabelBurnSubtitles": "Vypálit titulky:",
@ -1369,8 +1369,8 @@
"LabelEnableHardwareDecodingFor": "Povolit hardwarové dekódování pro:", "LabelEnableHardwareDecodingFor": "Povolit hardwarové dekódování pro:",
"LabelHomeNetworkQuality": "Kvalita na domácí síti:", "LabelHomeNetworkQuality": "Kvalita na domácí síti:",
"LabelInternetQuality": "Kvalita na internetu:", "LabelInternetQuality": "Kvalita na internetu:",
"LabelKodiMetadataUser": "Uložení dat sledování uživatele do nfo pro:", "LabelKodiMetadataUser": "Uložit data sledování uživatele do NFO souboru pro:",
"LabelKodiMetadataUserHelp": "Povolte toto nastavení pro uložení dat sledování do souborů NFO pro jiné aplikace, které chcete používat.", "LabelKodiMetadataUserHelp": "Uložit sledovaná data o přehrávání pro využití dalšími aplikacemi.",
"LabelLanNetworks": "Sítě LAN:", "LabelLanNetworks": "Sítě LAN:",
"LabelLimit": "Limit:", "LabelLimit": "Limit:",
"LabelMaxStreamingBitrate": "Maximální kvalita streamování:", "LabelMaxStreamingBitrate": "Maximální kvalita streamování:",
@ -1383,7 +1383,7 @@
"LabelSecureConnectionsMode": "Režim zabezpečeného připojení:", "LabelSecureConnectionsMode": "Režim zabezpečeného připojení:",
"LabelServerHost": "Host:", "LabelServerHost": "Host:",
"LabelSimultaneousConnectionLimit": "Limit současně běžících streamů:", "LabelSimultaneousConnectionLimit": "Limit současně běžících streamů:",
"LabelSkin": "Skin:", "LabelSkin": "Vzhled:",
"LabelSortBy": "Řadit podle:", "LabelSortBy": "Řadit podle:",
"LabelSortOrder": "Pořadí řazení:", "LabelSortOrder": "Pořadí řazení:",
"LabelSpecialSeasonsDisplayName": "Zobrazovaný název pro zvláštní sezónu:", "LabelSpecialSeasonsDisplayName": "Zobrazovaný název pro zvláštní sezónu:",
@ -1395,14 +1395,14 @@
"LabelTypeText": "Text", "LabelTypeText": "Text",
"LabelUrl": "URL:", "LabelUrl": "URL:",
"LabelUserAgent": "User agent:", "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:", "LabelVideo": "Video:",
"LabelVideoCodec": "Video: {0}", "LabelVideoCodec": "Video kodek:",
"LeaveBlankToNotSetAPassword": "Volitelné - ponechat prázdné pro nastavení bez hesla", "LeaveBlankToNotSetAPassword": "Můžete ponechat prázdné pro nastavení bez hesla.",
"LetterButtonAbbreviation": "A", "LetterButtonAbbreviation": "A",
"LinkApi": "API", "LinkApi": "API",
"LinksValue": "Odkazy: {0}", "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.", "LiveTvFeatureDescription": "Streamujte televizní vysílání do libovolné aplikace Jellyfin s kompatibilním televizním tunerem instalovaným na serveru Jellyfin.",
"Logo": "Logo", "Logo": "Logo",
"ManageLibrary": "Spravovat knihovnu", "ManageLibrary": "Spravovat knihovnu",
@ -1411,7 +1411,7 @@
"MediaInfoStreamTypeAudio": "Audio", "MediaInfoStreamTypeAudio": "Audio",
"MediaInfoStreamTypeData": "Data", "MediaInfoStreamTypeData": "Data",
"MediaInfoStreamTypeVideo": "Video", "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", "HeaderFavoriteMovies": "Oblíbená videa",
"HeaderFavoriteShows": "Oblíbené seriály", "HeaderFavoriteShows": "Oblíbené seriály",
"HeaderFavoriteEpisodes": "Oblíbené epizody", "HeaderFavoriteEpisodes": "Oblíbené epizody",
@ -1420,7 +1420,7 @@
"HeaderFavoriteSongs": "Oblíbená hudba", "HeaderFavoriteSongs": "Oblíbená hudba",
"HeaderRestartingServer": "Restartování serveru", "HeaderRestartingServer": "Restartování serveru",
"LabelAuthProvider": "Poskytovatel ověření:", "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:", "LabelPasswordResetProvider": "Poskytovatel obnovy hesla:",
"LabelServerName": "Název serveru:", "LabelServerName": "Název serveru:",
"LabelTranscodePath": "Cesta pro překódování:", "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 +.", "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.", "MessagePleaseWait": "Prosím, čekejte. Může to trvat několik minut.",
"Metadata": "Metadata", "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", "Never": "Nikdy",
"NextUp": "Další", "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ě.", "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", "Option3D": "3D",
"OptionAlbum": "Album", "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í.", "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í", "OptionAllowSyncTranscoding": "Povolit stahování a synchronizaci médií, které vyžaduje překódování",
"OptionBluray": "Bluray", "OptionBluray": "Blu-ray",
"OptionCaptionInfoExSamsung": "CaptionInfoEx (Samsung)", "OptionCaptionInfoExSamsung": "CaptionInfoEx (Samsung)",
"OptionDownloadBannerImage": "Banner", "OptionDownloadBannerImage": "Banner",
"OptionDownloadBoxImage": "Box", "OptionDownloadBoxImage": "Box",
@ -1456,7 +1456,7 @@
"OptionIsHD": "HD", "OptionIsHD": "HD",
"OptionIsSD": "SD", "OptionIsSD": "SD",
"OptionLoginAttemptsBeforeLockout": "Určuje, kolik chybných pokusů o přihlášení lze provést před zablokováním.", "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", "OptionMax": "Max",
"OptionProfileAudio": "Audio", "OptionProfileAudio": "Audio",
"OptionProfileVideo": "Video", "OptionProfileVideo": "Video",
@ -1489,14 +1489,14 @@
"Sort": "Třídit", "Sort": "Třídit",
"StatsForNerds": "Statistiky pro šprty", "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.", "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.", "SubtitleDownloadersHelp": "Povolte a zařaďte preferované stahovače titulků v pořadí podle priority.",
"SubtitleSettings": "Nastavení titulků", "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.", "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", "TV": "TV",
"TabDirectPlay": "Přímé přehrávání", "TabDirectPlay": "Přímé přehrávání",
"TabInfo": "Info", "TabInfo": "Info",
"TabLiveTV": "Live TV", "TabLiveTV": "Živá TV",
"TabMetadata": "Metadata", "TabMetadata": "Metadata",
"TabPlaylist": "Playlist", "TabPlaylist": "Playlist",
"TabServer": "Server", "TabServer": "Server",
@ -1504,10 +1504,10 @@
"ThemeSongs": "Tematická hudba", "ThemeSongs": "Tematická hudba",
"ThemeVideos": "Tematická videa", "ThemeVideos": "Tematická videa",
"Trailers": "Trailery", "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í", "Uniform": "Uniformní",
"Unplayed": "Nepřehrané", "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", "ValueMinutes": "{0} min",
"ValueOneAlbum": "1 album", "ValueOneAlbum": "1 album",
"ValueOneSong": "1 skladba", "ValueOneSong": "1 skladba",
@ -1518,8 +1518,8 @@
"HeaderHome": "Domů", "HeaderHome": "Domů",
"DashboardOperatingSystem": "Operační systém: {0}", "DashboardOperatingSystem": "Operační systém: {0}",
"DashboardArchitecture": "Architektura: {0}", "DashboardArchitecture": "Architektura: {0}",
"LaunchWebAppOnStartup": "Spusťte webovou aplikaci Jellyfin ve svém webovém prohlížeči po nastartování Jellyfin serveru", "LaunchWebAppOnStartup": "Spustit webové rozhraní po spustění 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.", "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.", "MessageNoServersAvailable": "Pomocí automatického zjišťování nebyly nalezeny žádné servery.",
"OptionBanner": "Banner", "OptionBanner": "Banner",
"OptionList": "Seznam", "OptionList": "Seznam",
@ -1532,5 +1532,27 @@
"MusicArtist": "Interpret", "MusicArtist": "Interpret",
"MusicVideo": "Videoklip", "MusicVideo": "Videoklip",
"SubtitleOffset": "Nastavení titulků", "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": "כותב", "Writer": "כותב",
"Albums": "אלבומים", "Albums": "אלבומים",
"Artists": "אמנים", "Artists": "אמנים",
"Books": "ספרים" "Books": "ספרים",
"Absolute": "מוחלט",
"AccessRestrictedTryAgainLater": "הגישה כרגע מוגבלת. אנא נסה שוב מאוחר יותר.",
"AddedOnValue": "נוסף {0}"
} }

View file

@ -710,7 +710,7 @@
"HeaderActivity": "Tevékenység", "HeaderActivity": "Tevékenység",
"HeaderAdditionalParts": "További részek", "HeaderAdditionalParts": "További részek",
"HeaderAdmin": "Adminisztrátor", "HeaderAdmin": "Adminisztrátor",
"HeaderAlbumArtists": "Album Előadók", "HeaderAlbumArtists": "Album előadók",
"HeaderAlert": "Figyelem", "HeaderAlert": "Figyelem",
"HeaderAllowMediaDeletionFrom": "Média törlés engedélyezése", "HeaderAllowMediaDeletionFrom": "Média törlés engedélyezése",
"HeaderApiKey": "API Kulcs", "HeaderApiKey": "API Kulcs",
@ -1300,7 +1300,7 @@
"MessageNoServersAvailable": "Az automatikus kiszolgálókeresés nem talált szervert.", "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.", "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", "TabNetworking": "Hálózat",
"HeaderFavoriteArtists": "Kedvenc Előadók", "HeaderFavoriteArtists": "Kedvenc előadók",
"SmallCaps": "Kiskapitális", "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.", "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", "Art": "ClearArt",
@ -1321,10 +1321,10 @@
"HeaderContinueListening": "Folyamatban lévő zenék", "HeaderContinueListening": "Folyamatban lévő zenék",
"HeaderDeleteTaskTrigger": "Feladatvezérlő törlése", "HeaderDeleteTaskTrigger": "Feladatvezérlő törlése",
"HeaderFavoriteMovies": "Kedvenc Filmek", "HeaderFavoriteMovies": "Kedvenc Filmek",
"HeaderFavoriteShows": "Kedvenc Sorozatok", "HeaderFavoriteShows": "Kedvenc sorozatok",
"HeaderFavoriteEpisodes": "Kedvenc Epizódok", "HeaderFavoriteEpisodes": "Kedvenc epizódok",
"HeaderFavoriteAlbums": "Kedvenc Albumok", "HeaderFavoriteAlbums": "Kedvenc albumok",
"HeaderFavoriteSongs": "Kedvenc Dalok", "HeaderFavoriteSongs": "Kedvenc dalok",
"HeaderFavoriteVideos": "Kedvenc Videók", "HeaderFavoriteVideos": "Kedvenc Videók",
"HeaderGuideProviders": "TV műsorújság Szolgáltatók", "HeaderGuideProviders": "TV műsorújság Szolgáltatók",
"HeaderHome": "Kezdőlap", "HeaderHome": "Kezdőlap",

View file

@ -1327,5 +1327,6 @@
"LabelProfileVideoCodecs": "Video codecs:", "LabelProfileVideoCodecs": "Video codecs:",
"LabelProtocolInfo": "Protocol info:", "LabelProtocolInfo": "Protocol info:",
"LabelServerName": "Server naam:", "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", "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.", "EnablePhotosHelp": "Görüntüler diğer medya dosyalarıyla birlikte algılanacak ve gösterilecektir.",
"EnableCinemaMode": "Sinema Modu", "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 path = require("path");
const { CleanWebpackPlugin} = require("clean-webpack-plugin");
const CopyPlugin = require("copy-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 = { module.exports = {
context: path.resolve(__dirname, "src"), context: path.resolve(__dirname, "src"),
@ -10,15 +18,18 @@ module.exports = {
] ]
}, },
plugins: [ plugins: [
new CopyPlugin([ new CleanWebpackPlugin(),
{ new CopyPlugin([{
from: "**/*", from: "**/*",
to: "." to: "."
}, }]),
{ new CopyPlugin(
context: path.resolve(__dirname), Assets.map(asset => {
from: "node_modules/libass-wasm/dist/subtitles-octopus-worker.*", return {
} from: path.resolve(__dirname, `./node_modules/${asset}`),
]) to: path.resolve(__dirname, './dist/libraries')
};
})
)
] ]
}; };