Merge remote-tracking branch 'origin/master' into suboctopus
This commit is contained in:
@@ -8,6 +8,7 @@ exemptLabels:
|
||||
- future
|
||||
- feature
|
||||
- enhancement
|
||||
- confirmed
|
||||
# Label to use when marking an issue as stale
|
||||
staleLabel: stale
|
||||
# Comment to post when marking an issue as stale. Set to `false` to disable
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
"repository": "https://github.com/jellyfin/jellyfin-web",
|
||||
"license": "GPL-2.0-or-later",
|
||||
"devDependencies": {
|
||||
"clean-webpack-plugin": "^3.0.0",
|
||||
"copy-webpack-plugin": "^5.0.3",
|
||||
"css-loader": "^2.1.0",
|
||||
"eslint": "^5.16.0",
|
||||
@@ -16,12 +17,14 @@
|
||||
"webpack-merge": "^4.2.2"
|
||||
},
|
||||
"dependencies": {
|
||||
"alameda": "^1.3.0",
|
||||
"flv.js": "^1.5.0",
|
||||
"hls.js": "^0.12.4",
|
||||
"howler": "^2.1.2",
|
||||
"jquery": "^3.4.1",
|
||||
"jstree": "^3.3.7",
|
||||
"libjass": "^0.11.0",
|
||||
"requirejs": "^2.3.5",
|
||||
"shaka-player": "^2.5.5",
|
||||
"sortablejs": "^1.9.0",
|
||||
"swiper": "^3.4.2",
|
||||
|
||||
-419
@@ -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);
|
||||
+696
-639
File diff suppressed because it is too large
Load Diff
-607
@@ -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);
|
||||
@@ -10,23 +10,6 @@ define(['dom', 'scroller', 'browser', 'layoutManager', 'focusManager', 'register
|
||||
newButton.classList.add(activeButtonClass);
|
||||
}
|
||||
|
||||
function getFocusCallback(tabs, e) {
|
||||
return function () {
|
||||
onClick.call(tabs, e);
|
||||
};
|
||||
}
|
||||
|
||||
function onFocus(e) {
|
||||
|
||||
if (layoutManager.tv) {
|
||||
|
||||
if (this.focusTimeout) {
|
||||
clearTimeout(this.focusTimeout);
|
||||
}
|
||||
this.focusTimeout = setTimeout(getFocusCallback(this, e), 700);
|
||||
}
|
||||
}
|
||||
|
||||
function getTabPanel(tabs, index) {
|
||||
|
||||
return null;
|
||||
@@ -87,10 +70,6 @@ define(['dom', 'scroller', 'browser', 'layoutManager', 'focusManager', 'register
|
||||
|
||||
function onClick(e) {
|
||||
|
||||
if (this.focusTimeout) {
|
||||
clearTimeout(this.focusTimeout);
|
||||
}
|
||||
|
||||
var tabs = this;
|
||||
|
||||
var current = tabs.querySelector('.' + activeButtonClass);
|
||||
@@ -177,10 +156,6 @@ define(['dom', 'scroller', 'browser', 'layoutManager', 'focusManager', 'register
|
||||
dom.addEventListener(this, 'click', onClick, {
|
||||
passive: true
|
||||
});
|
||||
dom.addEventListener(this, 'focus', onFocus, {
|
||||
passive: true,
|
||||
capture: true
|
||||
});
|
||||
};
|
||||
|
||||
EmbyTabs.focus = function () {
|
||||
@@ -237,10 +212,6 @@ define(['dom', 'scroller', 'browser', 'layoutManager', 'focusManager', 'register
|
||||
dom.removeEventListener(this, 'click', onClick, {
|
||||
passive: true
|
||||
});
|
||||
dom.removeEventListener(this, 'focus', onFocus, {
|
||||
passive: true,
|
||||
capture: true
|
||||
});
|
||||
};
|
||||
|
||||
function getSelectedTabButton(elem) {
|
||||
|
||||
@@ -330,6 +330,7 @@ define(['require', 'apphost', 'layoutManager', 'focusManager', 'globalize', 'loa
|
||||
if (next) {
|
||||
viewItem.parentNode.removeChild(viewItem);
|
||||
next.parentNode.insertBefore(viewItem, next.nextSibling);
|
||||
focusManager.focus(e.target);
|
||||
}
|
||||
|
||||
} else {
|
||||
@@ -339,6 +340,7 @@ define(['require', 'apphost', 'layoutManager', 'focusManager', 'globalize', 'loa
|
||||
if (prev) {
|
||||
viewItem.parentNode.removeChild(viewItem);
|
||||
prev.parentNode.insertBefore(viewItem, prev);
|
||||
focusManager.focus(e.target);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1043,7 +1043,7 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa
|
||||
video: videoElement,
|
||||
subUrl: getTextTrackUrl(track, item),
|
||||
fonts: attachments.map(i => i.DeliveryUrl),
|
||||
workerUrl: appRouter.baseUrl() + "/node_modules/libass-wasm/dist/subtitles-octopus-worker.js",
|
||||
workerUrl: appRouter.baseUrl() + "/libraries/subtitles-octopus-worker.js",
|
||||
onError: function() {
|
||||
htmlMediaHelper.onErrorInternal(self, 'mediadecodeerror')
|
||||
}
|
||||
|
||||
@@ -1,31 +1,37 @@
|
||||
define(["jQuery", "loading", "libraryMenu", "globalize", "connectionManager", "emby-button"], function($, loading, libraryMenu, globalize, connectionManager) {
|
||||
define(["jQuery", "loading", "libraryMenu", "globalize", "connectionManager", "emby-button"], function ($, loading, libraryMenu, globalize, connectionManager) {
|
||||
"use strict";
|
||||
|
||||
function populateHistory(packageInfo, page) {
|
||||
var html = "";
|
||||
var length = Math.min(packageInfo.versions.length, 10);
|
||||
|
||||
for (var i = 0; i < length; i++) {
|
||||
var version = packageInfo.versions[i];
|
||||
html += '<h2 style="margin:.5em 0;">' + version.versionStr + " (" + version.classification + ")</h2>";
|
||||
html += '<div style="margin-bottom:1.5em;">' + version.description + "</div>";
|
||||
}
|
||||
|
||||
$("#revisionHistory", page).html(html);
|
||||
}
|
||||
|
||||
function populateVersions(packageInfo, page, installedPlugin) {
|
||||
var html = "";
|
||||
|
||||
for (var i = 0; i < packageInfo.versions.length; i++) {
|
||||
var version = packageInfo.versions[i];
|
||||
html += '<option value="' + version.versionStr + "|" + version.classification + '">' + version.versionStr + " (" + version.classification + ")</option>";
|
||||
}
|
||||
|
||||
var selectmenu = $("#selectVersion", page).html(html);
|
||||
|
||||
if (!installedPlugin) {
|
||||
$("#pCurrentVersion", page).hide().html("");
|
||||
}
|
||||
var packageVersion = packageInfo.versions.filter(function(current) {
|
||||
|
||||
var packageVersion = packageInfo.versions.filter(function (current) {
|
||||
return "Release" == current.classification;
|
||||
})[0];
|
||||
packageVersion = packageVersion || packageInfo.versions.filter(function(current) {
|
||||
packageVersion = packageVersion || packageInfo.versions.filter(function (current) {
|
||||
return "Beta" == current.classification;
|
||||
})[0];
|
||||
|
||||
@@ -36,12 +42,13 @@ define(["jQuery", "loading", "libraryMenu", "globalize", "connectionManager", "e
|
||||
}
|
||||
|
||||
function renderPackage(pkg, installedPlugins, page) {
|
||||
var installedPlugin = installedPlugins.filter(function(ip) {
|
||||
return ip.Name == pkg.name
|
||||
var installedPlugin = installedPlugins.filter(function (ip) {
|
||||
return ip.Name == pkg.name;
|
||||
})[0];
|
||||
populateVersions(pkg, page, installedPlugin);
|
||||
populateHistory(pkg, page);
|
||||
$(".pluginName", page).html(pkg.name);
|
||||
|
||||
if ("Server" == pkg.targetSystem) {
|
||||
$("#btnInstallDiv", page).removeClass("hide");
|
||||
$("#nonServerMsg", page).hide();
|
||||
@@ -52,60 +59,69 @@ define(["jQuery", "loading", "libraryMenu", "globalize", "connectionManager", "e
|
||||
var msg = globalize.translate("MessageInstallPluginFromApp");
|
||||
$("#nonServerMsg", page).html(msg).show();
|
||||
}
|
||||
|
||||
if (pkg.shortDescription) {
|
||||
$("#tagline", page).show().html(pkg.shortDescription);
|
||||
} else {
|
||||
$("#tagline", page).hide();
|
||||
}
|
||||
|
||||
$("#overview", page).html(pkg.overview || "");
|
||||
$("#developer", page).html(pkg.owner);
|
||||
|
||||
if (pkg.richDescUrl) {
|
||||
$("#pViewWebsite", page).show();
|
||||
$("#pViewWebsite a", page).attr("href", pkg.richDescUrl);
|
||||
} else {
|
||||
$("#pViewWebsite", page).hide();
|
||||
}
|
||||
|
||||
if (pkg.previewImage || pkg.thumbImage) {
|
||||
var img = pkg.previewImage ? pkg.previewImage : pkg.thumbImage;
|
||||
$("#pPreviewImage", page).show().html("<img class='pluginPreviewImg' src='" + img + "' style='max-width: 100%;' />");
|
||||
} else {
|
||||
$("#pPreviewImage", page).hide().html("");
|
||||
}
|
||||
|
||||
if (installedPlugin) {
|
||||
var currentVersionText = globalize.translate("MessageYouHaveVersionInstalled").replace("{0}", "<strong>" + installedPlugin.Version + "</strong>");
|
||||
$("#pCurrentVersion", page).show().html(currentVersionText);
|
||||
} else {
|
||||
$("#pCurrentVersion", page).hide().html("");
|
||||
}
|
||||
|
||||
loading.hide();
|
||||
}
|
||||
|
||||
function alertText(options) {
|
||||
require(["alert"], function(alert) {
|
||||
alert(options)
|
||||
})
|
||||
require(["alert"], function (alert) {
|
||||
alert(options);
|
||||
});
|
||||
}
|
||||
|
||||
function performInstallation(page, packageName, guid, updateClass, version) {
|
||||
var developer = $("#developer", page).html().toLowerCase();
|
||||
var alertCallback = function() {
|
||||
|
||||
var alertCallback = function () {
|
||||
loading.show();
|
||||
page.querySelector("#btnInstall").disabled = true;
|
||||
ApiClient.installPlugin(packageName, guid, updateClass, version).then(function() {
|
||||
ApiClient.installPlugin(packageName, guid, updateClass, version).then(function () {
|
||||
loading.hide();
|
||||
alertText(globalize.translate("PluginInstalledMessage"));
|
||||
});
|
||||
};
|
||||
|
||||
if (developer !== 'jellyfin') {
|
||||
loading.hide();
|
||||
var msg = globalize.translate("MessagePluginInstallDisclaimer");
|
||||
msg += "<br/>";
|
||||
msg += "<br/>";
|
||||
msg += globalize.translate("PleaseConfirmPluginInstallation");
|
||||
require(["confirm"], function(confirm) {
|
||||
confirm(msg, globalize.translate("HeaderConfirmPluginInstallation")).then(function() {
|
||||
|
||||
require(["confirm"], function (confirm) {
|
||||
confirm(msg, globalize.translate("HeaderConfirmPluginInstallation")).then(function () {
|
||||
alertCallback();
|
||||
}, function() {
|
||||
}, function () {
|
||||
console.log('plugin not installed');
|
||||
});
|
||||
});
|
||||
@@ -114,18 +130,19 @@ define(["jQuery", "loading", "libraryMenu", "globalize", "connectionManager", "e
|
||||
}
|
||||
}
|
||||
|
||||
return function(view, params) {
|
||||
$(".addPluginForm", view).on("submit", function() {
|
||||
return function (view, params) {
|
||||
$(".addPluginForm", view).on("submit", function () {
|
||||
loading.show();
|
||||
var page = $(this).parents("#addPluginPage")[0];
|
||||
var name = params.name;
|
||||
var guid = params.guid;
|
||||
ApiClient.getInstalledPlugins().then(function(plugins) {
|
||||
var installedPlugin = plugins.filter(function(plugin) {
|
||||
ApiClient.getInstalledPlugins().then(function (plugins) {
|
||||
var installedPlugin = plugins.filter(function (plugin) {
|
||||
return plugin.Name == name;
|
||||
})[0];
|
||||
var vals = $("#selectVersion", page).val().split("|");
|
||||
var version = vals[0];
|
||||
|
||||
if (installedPlugin) {
|
||||
if (installedPlugin.Version === version) {
|
||||
loading.hide();
|
||||
@@ -140,16 +157,16 @@ define(["jQuery", "loading", "libraryMenu", "globalize", "connectionManager", "e
|
||||
});
|
||||
return false;
|
||||
});
|
||||
view.addEventListener("viewshow", function() {
|
||||
view.addEventListener("viewshow", function () {
|
||||
var page = this;
|
||||
loading.show();
|
||||
var name = params.name;
|
||||
var guid = params.guid;
|
||||
var promise1 = ApiClient.getPackageInfo(name, guid);
|
||||
var promise2 = ApiClient.getInstalledPlugins();
|
||||
Promise.all([promise1, promise2]).then(function(responses) {
|
||||
Promise.all([promise1, promise2]).then(function (responses) {
|
||||
renderPackage(responses[0], responses[1], page);
|
||||
});
|
||||
})
|
||||
}
|
||||
});
|
||||
};
|
||||
});
|
||||
|
||||
@@ -57,5 +57,5 @@ define(["appSettings", "loading", "browser", "emby-button"], function(appSetting
|
||||
appRouter.back();
|
||||
});
|
||||
}
|
||||
}
|
||||
};
|
||||
});
|
||||
|
||||
+39
-25
@@ -1,14 +1,14 @@
|
||||
define(["datetime", "loading", "libraryMenu", "dom", "globalize", "emby-button"], function(datetime, loading, libraryMenu, dom, globalize) {
|
||||
define(["datetime", "loading", "libraryMenu", "dom", "globalize", "emby-button"], function (datetime, loading, libraryMenu, dom, globalize) {
|
||||
"use strict";
|
||||
|
||||
function revoke(page, key) {
|
||||
require(["confirm"], function(confirm) {
|
||||
confirm(globalize.translate("MessageConfirmRevokeApiKey"), globalize.translate("HeaderConfirmRevokeApiKey")).then(function() {
|
||||
require(["confirm"], function (confirm) {
|
||||
confirm(globalize.translate("MessageConfirmRevokeApiKey"), globalize.translate("HeaderConfirmRevokeApiKey")).then(function () {
|
||||
loading.show();
|
||||
ApiClient.ajax({
|
||||
type: "DELETE",
|
||||
url: ApiClient.getUrl("Auth/Keys/" + key)
|
||||
}).then(function() {
|
||||
}).then(function () {
|
||||
loadData(page);
|
||||
});
|
||||
});
|
||||
@@ -16,11 +16,23 @@ define(["datetime", "loading", "libraryMenu", "dom", "globalize", "emby-button"]
|
||||
}
|
||||
|
||||
function renderKeys(page, keys) {
|
||||
var rows = keys.map(function(item) {
|
||||
var rows = keys.map(function (item) {
|
||||
var html = "";
|
||||
html += '<tr class="detailTableBodyRow detailTableBodyRow-shaded">', html += '<td class="detailTableBodyCell">', html += '<button type="button" is="emby-button" data-token="' + item.AccessToken + '" class="raised raised-mini btnRevoke" data-mini="true" title="' + globalize.translate("ButtonRevoke") + '" style="margin:0;">' + globalize.translate("ButtonRevoke") + "</button>", html += "</td>", html += '<td class="detailTableBodyCell" style="vertical-align:middle;">', html += item.AccessToken, html += "</td>", html += '<td class="detailTableBodyCell" style="vertical-align:middle;">', html += item.AppName || "", html += "</td>", html += '<td class="detailTableBodyCell" style="vertical-align:middle;">';
|
||||
var date = datetime.parseISO8601Date(item.DateCreated, !0);
|
||||
return html += datetime.toLocaleDateString(date) + " " + datetime.getDisplayTime(date), html += "</td>", html += "</tr>"
|
||||
html += '<tr class="detailTableBodyRow detailTableBodyRow-shaded">';
|
||||
html += '<td class="detailTableBodyCell">';
|
||||
html += '<button type="button" is="emby-button" data-token="' + item.AccessToken + '" class="raised raised-mini btnRevoke" data-mini="true" title="' + globalize.translate("ButtonRevoke") + '" style="margin:0;">' + globalize.translate("ButtonRevoke") + "</button>";
|
||||
html += "</td>";
|
||||
html += '<td class="detailTableBodyCell" style="vertical-align:middle;">';
|
||||
html += item.AccessToken;
|
||||
html += "</td>";
|
||||
html += '<td class="detailTableBodyCell" style="vertical-align:middle;">';
|
||||
html += item.AppName || "";
|
||||
html += "</td>";
|
||||
html += '<td class="detailTableBodyCell" style="vertical-align:middle;">';
|
||||
var date = datetime.parseISO8601Date(item.DateCreated, true);
|
||||
html += datetime.toLocaleDateString(date) + " " + datetime.getDisplayTime(date);
|
||||
html += "</td>";
|
||||
return html += "</tr>";
|
||||
}).join("");
|
||||
page.querySelector(".resultBody").innerHTML = rows;
|
||||
loading.hide();
|
||||
@@ -28,42 +40,44 @@ define(["datetime", "loading", "libraryMenu", "dom", "globalize", "emby-button"]
|
||||
|
||||
function loadData(page) {
|
||||
loading.show();
|
||||
ApiClient.getJSON(ApiClient.getUrl("Auth/Keys")).then(function(result) {
|
||||
ApiClient.getJSON(ApiClient.getUrl("Auth/Keys")).then(function (result) {
|
||||
renderKeys(page, result.Items);
|
||||
});
|
||||
}
|
||||
|
||||
function showNewKeyPrompt(page) {
|
||||
require(["prompt"], function(prompt) {
|
||||
require(["prompt"], function (prompt) {
|
||||
prompt({
|
||||
title: globalize.translate("HeaderNewApiKey"),
|
||||
label: globalize.translate("LabelAppName"),
|
||||
description: globalize.translate("LabelAppNameExample")
|
||||
}).then(function(value) {
|
||||
}).then(function (value) {
|
||||
ApiClient.ajax({
|
||||
type: "POST",
|
||||
url: ApiClient.getUrl("Auth/Keys", {
|
||||
App: value
|
||||
})
|
||||
}).then(function() {
|
||||
loadData(page)
|
||||
})
|
||||
})
|
||||
})
|
||||
}).then(function () {
|
||||
loadData(page);
|
||||
});
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
pageIdOn("pageinit", "apiKeysPage", function() {
|
||||
pageIdOn("pageinit", "apiKeysPage", function () {
|
||||
var page = this;
|
||||
page.querySelector(".btnNewKey").addEventListener("click", function() {
|
||||
showNewKeyPrompt(page)
|
||||
page.querySelector(".btnNewKey").addEventListener("click", function () {
|
||||
showNewKeyPrompt(page);
|
||||
});
|
||||
page.querySelector(".tblApiKeys").addEventListener("click", function(e) {
|
||||
page.querySelector(".tblApiKeys").addEventListener("click", function (e) {
|
||||
var btnRevoke = dom.parentWithClass(e.target, "btnRevoke");
|
||||
btnRevoke && revoke(page, btnRevoke.getAttribute("data-token"))
|
||||
|
||||
if (btnRevoke) {
|
||||
revoke(page, btnRevoke.getAttribute("data-token"));
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
pageIdOn("pagebeforeshow", "apiKeysPage", function() {
|
||||
pageIdOn("pagebeforeshow", "apiKeysPage", function () {
|
||||
loadData(this);
|
||||
})
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
@@ -5,8 +5,8 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa
|
||||
require(["alert"], function (alert) {
|
||||
var title;
|
||||
var text = [];
|
||||
|
||||
var displayPlayMethod = playMethodHelper.getDisplayPlayMethod(session);
|
||||
|
||||
if (displayPlayMethod === "DirectStream") {
|
||||
title = globalize.translate("DirectStreaming");
|
||||
text.push(globalize.translate("DirectStreamHelp1"));
|
||||
@@ -15,6 +15,7 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa
|
||||
} else if (displayPlayMethod === "Transcode") {
|
||||
title = globalize.translate("Transcoding");
|
||||
text.push(globalize.translate("MediaIsBeingConverted"));
|
||||
|
||||
if (session.TranscodingInfo && session.TranscodingInfo.TranscodeReasons && session.TranscodingInfo.TranscodeReasons.length) {
|
||||
text.push("<br/>");
|
||||
text.push(globalize.translate("LabelReasonForTranscoding"));
|
||||
@@ -23,6 +24,7 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
alert({
|
||||
text: text.join("<br/>"),
|
||||
title: title
|
||||
@@ -73,6 +75,7 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa
|
||||
case "sendmessage":
|
||||
showSendMessageForm(btn, session);
|
||||
break;
|
||||
|
||||
case "transcodinginfo":
|
||||
showPlaybackInfo(btn, session);
|
||||
}
|
||||
@@ -124,6 +127,7 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa
|
||||
list.push(session);
|
||||
}
|
||||
}
|
||||
|
||||
return list;
|
||||
}
|
||||
|
||||
@@ -139,7 +143,7 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa
|
||||
|
||||
if (!result.Items.length) {
|
||||
view.querySelector(".activeRecordingsSection").classList.add("hide");
|
||||
return void (itemsContainer.innerHTML = "");
|
||||
return void(itemsContainer.innerHTML = "");
|
||||
}
|
||||
|
||||
view.querySelector(".activeRecordingsSection").classList.remove("hide");
|
||||
@@ -165,13 +169,13 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa
|
||||
function reloadSystemInfo(view, apiClient) {
|
||||
apiClient.getSystemInfo().then(function (systemInfo) {
|
||||
view.querySelector("#serverName").innerHTML = globalize.translate("DashboardServerName", systemInfo.ServerName);
|
||||
|
||||
var localizedVersion = globalize.translate("DashboardVersionNumber", systemInfo.Version);
|
||||
|
||||
if (systemInfo.SystemUpdateLevel !== "Release") {
|
||||
localizedVersion += " " + systemInfo.SystemUpdateLevel;
|
||||
}
|
||||
view.querySelector("#versionNumber").innerHTML = localizedVersion;
|
||||
|
||||
view.querySelector("#versionNumber").innerHTML = localizedVersion;
|
||||
view.querySelector("#operatingSystem").innerHTML = globalize.translate("DashboardOperatingSystem", systemInfo.OperatingSystem);
|
||||
view.querySelector("#architecture").innerHTML = globalize.translate("DashboardArchitecture", systemInfo.SystemArchitecture);
|
||||
|
||||
@@ -226,14 +230,13 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa
|
||||
} else {
|
||||
var nowPlayingItem = session.NowPlayingItem;
|
||||
var className = "scalableCard card activeSession backdropCard backdropCard-scalable";
|
||||
|
||||
html += '<div class="' + className + '" id="' + rowId + '">';
|
||||
html += '<div class="cardBox visualCardBox">';
|
||||
html += '<div class="cardScalable visualCardBox-cardScalable">';
|
||||
html += '<div class="cardPadder cardPadder-backdrop"></div>';
|
||||
html += '<div class="cardContent">';
|
||||
|
||||
var imgUrl = DashboardPage.getNowPlayingImageUrl(nowPlayingItem);
|
||||
|
||||
if (imgUrl) {
|
||||
html += '<div class="sessionNowPlayingContent sessionNowPlayingContent-withbackground"';
|
||||
html += ' data-src="' + imgUrl + '" style="display:inline-block;background-image:url(\'' + imgUrl + "');\"></div>";
|
||||
@@ -243,8 +246,8 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa
|
||||
|
||||
html += '<div class="sessionNowPlayingInnerContent">';
|
||||
html += '<div class="sessionAppInfo">';
|
||||
|
||||
var clientImage = DashboardPage.getClientImage(session);
|
||||
|
||||
if (clientImage) {
|
||||
html += clientImage;
|
||||
}
|
||||
@@ -261,28 +264,36 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa
|
||||
html += '<div class="sessionTranscodingFramerate"></div>';
|
||||
}
|
||||
|
||||
html += '<div class="sessionNowPlayingDetails">'
|
||||
html += '<div class="sessionNowPlayingDetails">';
|
||||
var nowPlayingName = DashboardPage.getNowPlayingName(session);
|
||||
html += '<div class="sessionNowPlayingInfo" data-imgsrc="' + nowPlayingName.image + '">';
|
||||
html += nowPlayingName.html;
|
||||
html += "</div>";
|
||||
html += '<div class="sessionNowPlayingTime">' + DashboardPage.getSessionNowPlayingTime(session) + "</div>";
|
||||
html += '</div>'
|
||||
html += '</div>';
|
||||
|
||||
if (nowPlayingItem && nowPlayingItem.RunTimeTicks) {
|
||||
var percent = 100 * (session.PlayState.PositionTicks || 0) / nowPlayingItem.RunTimeTicks;
|
||||
html += indicators.getProgressHtml(percent, { containerClass: "playbackProgress" });
|
||||
html += indicators.getProgressHtml(percent, {
|
||||
containerClass: "playbackProgress"
|
||||
});
|
||||
} else {
|
||||
// need to leave the element in just in case the device starts playback
|
||||
html += indicators.getProgressHtml(0, { containerClass: "playbackProgress hide" });
|
||||
html += indicators.getProgressHtml(0, {
|
||||
containerClass: "playbackProgress hide"
|
||||
});
|
||||
}
|
||||
|
||||
if (session.TranscodingInfo && session.TranscodingInfo.CompletionPercentage) {
|
||||
var percent = session.TranscodingInfo.CompletionPercentage.toFixed(1);
|
||||
html += indicators.getProgressHtml(percent, { containerClass: "transcodingProgress" });
|
||||
html += indicators.getProgressHtml(percent, {
|
||||
containerClass: "transcodingProgress"
|
||||
});
|
||||
} else {
|
||||
// same issue as playbackProgress element above
|
||||
html += indicators.getProgressHtml(0, { containerClass: "transcodingProgress hide" });
|
||||
html += indicators.getProgressHtml(0, {
|
||||
containerClass: "transcodingProgress hide"
|
||||
});
|
||||
}
|
||||
|
||||
html += "</div>";
|
||||
@@ -317,6 +328,7 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa
|
||||
|
||||
parentElement.insertAdjacentHTML("beforeend", html);
|
||||
var deadSessionElem = parentElement.querySelector(".deadSession");
|
||||
|
||||
if (deadSessionElem) {
|
||||
deadSessionElem.parentNode.removeChild(deadSessionElem);
|
||||
}
|
||||
@@ -340,9 +352,9 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa
|
||||
|
||||
for (var i = 0, length = tasks.length; i < length; i++) {
|
||||
var task = tasks[i];
|
||||
|
||||
html += "<p>";
|
||||
html += task.Name + "<br/>";
|
||||
|
||||
if (task.State === "Running") {
|
||||
var progress = (task.CurrentProgressPercentage || 0).toFixed(1);
|
||||
html += '<progress max="100" value="' + progress + '" title="' + progress + '%">';
|
||||
@@ -373,19 +385,24 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa
|
||||
var html = "";
|
||||
var showTranscodingInfo = false;
|
||||
var displayPlayMethod = playMethodHelper.getDisplayPlayMethod(session);
|
||||
|
||||
if (displayPlayMethod === "DirectStream") {
|
||||
html += globalize.translate("DirectStreaming");
|
||||
} else if (displayPlayMethod === "Transcode") {
|
||||
html += globalize.translate("Transcoding");
|
||||
|
||||
if (session.TranscodingInfo && session.TranscodingInfo.Framerate) {
|
||||
html += " (" + session.TranscodingInfo.Framerate + " fps)";
|
||||
}
|
||||
|
||||
showTranscodingInfo = true;
|
||||
} else if (displayPlayMethod === "DirectPlay") {
|
||||
html += globalize.translate("DirectPlaying");
|
||||
}
|
||||
|
||||
if (showTranscodingInfo) {
|
||||
var line = [];
|
||||
|
||||
if (session.TranscodingInfo) {
|
||||
if (session.TranscodingInfo.Bitrate) {
|
||||
if (session.TranscodingInfo.Bitrate > 1e6) {
|
||||
@@ -493,6 +510,7 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa
|
||||
},
|
||||
getUsersHtml: function (session) {
|
||||
var html = [];
|
||||
|
||||
if (session.UserId) {
|
||||
html.push(session.UserName);
|
||||
}
|
||||
@@ -516,8 +534,8 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa
|
||||
},
|
||||
updateSession: function (row, session) {
|
||||
row.classList.remove("deadSession");
|
||||
|
||||
var nowPlayingItem = session.NowPlayingItem;
|
||||
|
||||
if (nowPlayingItem) {
|
||||
row.classList.add("playingSession");
|
||||
} else {
|
||||
@@ -537,6 +555,7 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa
|
||||
}
|
||||
|
||||
var btnSessionPlayPause = row.querySelector(".btnSessionPlayPause");
|
||||
|
||||
if (session.ServerId && nowPlayingItem && session.SupportsRemoteControl && session.DeviceId !== connectionManager.deviceId()) {
|
||||
btnSessionPlayPause.classList.remove("hide");
|
||||
row.querySelector(".btnSessionStop").classList.remove("hide");
|
||||
@@ -565,19 +584,29 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa
|
||||
}
|
||||
|
||||
var playbackProgressElem = row.querySelector(".playbackProgress");
|
||||
|
||||
if (nowPlayingItem && nowPlayingItem.RunTimeTicks) {
|
||||
var percent = 100 * (session.PlayState.PositionTicks || 0) / nowPlayingItem.RunTimeTicks;
|
||||
playbackProgressElem.outerHTML = indicators.getProgressHtml(percent, { containerClass: "playbackProgress" });
|
||||
playbackProgressElem.outerHTML = indicators.getProgressHtml(percent, {
|
||||
containerClass: "playbackProgress"
|
||||
});
|
||||
} else {
|
||||
playbackProgressElem.outerHTML = indicators.getProgressHtml(0, { containerClass: "playbackProgress hide" });
|
||||
playbackProgressElem.outerHTML = indicators.getProgressHtml(0, {
|
||||
containerClass: "playbackProgress hide"
|
||||
});
|
||||
}
|
||||
|
||||
var transcodingProgress = row.querySelector(".transcodingProgress");
|
||||
|
||||
if (session.TranscodingInfo && session.TranscodingInfo.CompletionPercentage) {
|
||||
var percent = session.TranscodingInfo.CompletionPercentage.toFixed(1);
|
||||
transcodingProgress.outerHTML = indicators.getProgressHtml(percent, { containerClass: "transcodingProgress" });
|
||||
transcodingProgress.outerHTML = indicators.getProgressHtml(percent, {
|
||||
containerClass: "transcodingProgress"
|
||||
});
|
||||
} else {
|
||||
transcodingProgress.outerHTML = indicators.getProgressHtml(0, { containerClass: "transcodingProgress hide" });
|
||||
transcodingProgress.outerHTML = indicators.getProgressHtml(0, {
|
||||
containerClass: "transcodingProgress hide"
|
||||
});
|
||||
}
|
||||
|
||||
var imgUrl = DashboardPage.getNowPlayingImageUrl(nowPlayingItem) || "";
|
||||
@@ -815,10 +844,13 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa
|
||||
view.addEventListener("viewdestroy", function () {
|
||||
var page = this;
|
||||
var userActivityLog = page.userActivityLog;
|
||||
|
||||
if (userActivityLog) {
|
||||
userActivityLog.destroy();
|
||||
}
|
||||
|
||||
var serverActivityLog = page.serverActivityLog;
|
||||
|
||||
if (serverActivityLog) {
|
||||
serverActivityLog.destroy();
|
||||
}
|
||||
|
||||
+24
-18
@@ -1,23 +1,25 @@
|
||||
define(["loading", "libraryMenu", "dom", "emby-input", "emby-button"], function(loading, libraryMenu, dom) {
|
||||
define(["loading", "libraryMenu", "dom", "emby-input", "emby-button"], function (loading, libraryMenu, dom) {
|
||||
"use strict";
|
||||
|
||||
function load(page, device, deviceOptions) {
|
||||
page.querySelector("#txtCustomName", page).value = deviceOptions.CustomName || "", page.querySelector(".reportedName", page).innerHTML = device.Name || ""
|
||||
page.querySelector("#txtCustomName", page).value = deviceOptions.CustomName || "";
|
||||
page.querySelector(".reportedName", page).innerHTML = device.Name || "";
|
||||
}
|
||||
|
||||
function loadData() {
|
||||
var page = this;
|
||||
loading.show();
|
||||
var id = getParameterByName("id"),
|
||||
promise1 = ApiClient.getJSON(ApiClient.getUrl("Devices/Info", {
|
||||
Id: id
|
||||
})),
|
||||
promise2 = ApiClient.getJSON(ApiClient.getUrl("Devices/Options", {
|
||||
Id: id
|
||||
}));
|
||||
Promise.all([promise1, promise2]).then(function(responses) {
|
||||
load(page, responses[0], responses[1]), loading.hide()
|
||||
})
|
||||
var id = getParameterByName("id");
|
||||
var promise1 = ApiClient.getJSON(ApiClient.getUrl("Devices/Info", {
|
||||
Id: id
|
||||
}));
|
||||
var promise2 = ApiClient.getJSON(ApiClient.getUrl("Devices/Options", {
|
||||
Id: id
|
||||
}));
|
||||
Promise.all([promise1, promise2]).then(function (responses) {
|
||||
load(page, responses[0], responses[1]);
|
||||
loading.hide();
|
||||
});
|
||||
}
|
||||
|
||||
function save(page) {
|
||||
@@ -31,14 +33,18 @@ define(["loading", "libraryMenu", "dom", "emby-input", "emby-button"], function(
|
||||
CustomName: page.querySelector("#txtCustomName").value
|
||||
}),
|
||||
contentType: "application/json"
|
||||
}).then(Dashboard.processServerConfigurationUpdateResult)
|
||||
}).then(Dashboard.processServerConfigurationUpdateResult);
|
||||
}
|
||||
|
||||
function onSubmit(e) {
|
||||
var form = this;
|
||||
return save(dom.parentWithClass(form, "page")), e.preventDefault(), !1
|
||||
save(dom.parentWithClass(form, "page"));
|
||||
e.preventDefault();
|
||||
return false;
|
||||
}
|
||||
return function(view, params) {
|
||||
view.querySelector("form").addEventListener("submit", onSubmit), view.addEventListener("viewshow", loadData)
|
||||
}
|
||||
});
|
||||
|
||||
return function (view, params) {
|
||||
view.querySelector("form").addEventListener("submit", onSubmit);
|
||||
view.addEventListener("viewshow", loadData);
|
||||
};
|
||||
});
|
||||
|
||||
+59
-34
@@ -1,61 +1,73 @@
|
||||
define(["loading", "dom", "libraryMenu", "globalize", "scripts/imagehelper", "humanedate", "emby-button", "emby-itemscontainer", "cardStyle"], function(loading, dom, libraryMenu, globalize, imageHelper) {
|
||||
define(["loading", "dom", "libraryMenu", "globalize", "scripts/imagehelper", "humanedate", "emby-button", "emby-itemscontainer", "cardStyle"], function (loading, dom, libraryMenu, globalize, imageHelper) {
|
||||
"use strict";
|
||||
|
||||
function canDelete(deviceId) {
|
||||
return deviceId !== ApiClient.deviceId()
|
||||
return deviceId !== ApiClient.deviceId();
|
||||
}
|
||||
|
||||
function deleteDevice(page, id) {
|
||||
var msg = globalize.translate("DeleteDeviceConfirmation");
|
||||
require(["confirm"], function(confirm) {
|
||||
|
||||
require(["confirm"], function (confirm) {
|
||||
confirm({
|
||||
text: msg,
|
||||
title: globalize.translate("HeaderDeleteDevice"),
|
||||
confirmText: globalize.translate("ButtonDelete"),
|
||||
primary: "delete"
|
||||
}).then(function() {
|
||||
loading.show(), ApiClient.ajax({
|
||||
}).then(function () {
|
||||
loading.show();
|
||||
ApiClient.ajax({
|
||||
type: "DELETE",
|
||||
url: ApiClient.getUrl("Devices", {
|
||||
Id: id
|
||||
})
|
||||
}).then(function() {
|
||||
loadData(page)
|
||||
})
|
||||
})
|
||||
})
|
||||
}).then(function () {
|
||||
loadData(page);
|
||||
});
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function showDeviceMenu(view, btn, deviceId) {
|
||||
var menuItems = [];
|
||||
canEdit && menuItems.push({
|
||||
name: globalize.translate("Edit"),
|
||||
id: "open",
|
||||
ironIcon: "mode-edit"
|
||||
}), canDelete(deviceId) && menuItems.push({
|
||||
name: globalize.translate("Delete"),
|
||||
id: "delete",
|
||||
ironIcon: "delete"
|
||||
}), require(["actionsheet"], function(actionsheet) {
|
||||
|
||||
if (canEdit) {
|
||||
menuItems.push({
|
||||
name: globalize.translate("Edit"),
|
||||
id: "open",
|
||||
ironIcon: "mode-edit"
|
||||
});
|
||||
}
|
||||
|
||||
if (canDelete(deviceId)) {
|
||||
menuItems.push({
|
||||
name: globalize.translate("Delete"),
|
||||
id: "delete",
|
||||
ironIcon: "delete"
|
||||
});
|
||||
}
|
||||
|
||||
require(["actionsheet"], function (actionsheet) {
|
||||
actionsheet.show({
|
||||
items: menuItems,
|
||||
positionTo: btn,
|
||||
callback: function(id) {
|
||||
callback: function (id) {
|
||||
switch (id) {
|
||||
case "open":
|
||||
Dashboard.navigate("device.html?id=" + deviceId);
|
||||
break;
|
||||
|
||||
case "delete":
|
||||
deleteDevice(view, deviceId)
|
||||
deleteDevice(view, deviceId);
|
||||
}
|
||||
}
|
||||
})
|
||||
})
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function load(page, devices) {
|
||||
var html = "";
|
||||
html += devices.map(function(device) {
|
||||
html += devices.map(function (device) {
|
||||
var deviceHtml = "";
|
||||
deviceHtml += "<div data-id='" + device.Id + "' class='card backdropCard'>";
|
||||
deviceHtml += '<div class="cardBox visualCardBox">';
|
||||
@@ -63,20 +75,24 @@ define(["loading", "dom", "libraryMenu", "globalize", "scripts/imagehelper", "hu
|
||||
deviceHtml += '<div class="cardPadder cardPadder-backdrop"></div>';
|
||||
deviceHtml += '<a is="emby-linkbutton" href="' + (canEdit ? "device.html?id=" + device.Id : "#") + '" class="cardContent cardImageContainer">';
|
||||
var iconUrl = imageHelper.getDeviceIcon(device.Name);
|
||||
|
||||
if (iconUrl) {
|
||||
deviceHtml += '<div class="cardImage" style="background-image:url(\'' + iconUrl + "');background-size: auto 64%;background-position:center center;\">";
|
||||
deviceHtml += "</div>";
|
||||
} else {
|
||||
deviceHtml += '<i class="cardImageIcon md-icon">tablet_android</i>';
|
||||
}
|
||||
|
||||
deviceHtml += "</a>";
|
||||
deviceHtml += "</div>";
|
||||
deviceHtml += '<div class="cardFooter">';
|
||||
|
||||
if (canEdit || canDelete(device.Id)) {
|
||||
deviceHtml += '<div style="text-align:right; float:right;padding-top:5px;">';
|
||||
deviceHtml += '<button type="button" is="paper-icon-button-light" data-id="' + device.Id + '" title="' + globalize.translate("Menu") + '" class="btnDeviceMenu"><i class="md-icon"></i></button>';
|
||||
deviceHtml += "</div>";
|
||||
}
|
||||
|
||||
deviceHtml += "<div class='cardText'>";
|
||||
deviceHtml += device.Name;
|
||||
deviceHtml += "</div>";
|
||||
@@ -84,10 +100,12 @@ define(["loading", "dom", "libraryMenu", "globalize", "scripts/imagehelper", "hu
|
||||
deviceHtml += device.AppName + " " + device.AppVersion;
|
||||
deviceHtml += "</div>";
|
||||
deviceHtml += "<div class='cardText cardText-secondary'>";
|
||||
|
||||
if (device.LastUserName) {
|
||||
deviceHtml += device.LastUserName;
|
||||
deviceHtml += ", " + humaneDate(device.DateLastActivity);
|
||||
}
|
||||
|
||||
deviceHtml += " ";
|
||||
deviceHtml += "</div>";
|
||||
deviceHtml += "</div>";
|
||||
@@ -99,17 +117,24 @@ define(["loading", "dom", "libraryMenu", "globalize", "scripts/imagehelper", "hu
|
||||
}
|
||||
|
||||
function loadData(page) {
|
||||
loading.show(), ApiClient.getJSON(ApiClient.getUrl("Devices")).then(function(result) {
|
||||
load(page, result.Items), loading.hide()
|
||||
})
|
||||
loading.show();
|
||||
ApiClient.getJSON(ApiClient.getUrl("Devices")).then(function (result) {
|
||||
load(page, result.Items);
|
||||
loading.hide();
|
||||
});
|
||||
}
|
||||
|
||||
var canEdit = ApiClient.isMinServerVersion("3.4.1.31");
|
||||
return function(view, params) {
|
||||
view.querySelector(".devicesList").addEventListener("click", function(e) {
|
||||
return function (view, params) {
|
||||
view.querySelector(".devicesList").addEventListener("click", function (e) {
|
||||
var btnDeviceMenu = dom.parentWithClass(e.target, "btnDeviceMenu");
|
||||
btnDeviceMenu && showDeviceMenu(view, btnDeviceMenu, btnDeviceMenu.getAttribute("data-id"))
|
||||
}), view.addEventListener("viewshow", function() {
|
||||
loadData(this)
|
||||
})
|
||||
}
|
||||
|
||||
if (btnDeviceMenu) {
|
||||
showDeviceMenu(view, btnDeviceMenu, btnDeviceMenu.getAttribute("data-id"));
|
||||
}
|
||||
});
|
||||
view.addEventListener("viewshow", function () {
|
||||
loadData(this);
|
||||
});
|
||||
};
|
||||
});
|
||||
|
||||
@@ -65,8 +65,8 @@ define(["jQuery", "loading", "fnchecked", "emby-select", "emby-button", "emby-in
|
||||
profile.ContainerProfiles = profile.ContainerProfiles || [];
|
||||
profile.CodecProfiles = profile.CodecProfiles || [];
|
||||
profile.ResponseProfiles = profile.ResponseProfiles || [];
|
||||
var usersHtml = "<option></option>" + users.map(function (u__w) {
|
||||
return '<option value="' + u__w.Id + '">' + u__w.Name + "</option>";
|
||||
var usersHtml = "<option></option>" + users.map(function (u) {
|
||||
return '<option value="' + u.Id + '">' + u.Name + "</option>";
|
||||
}).join("");
|
||||
$("#selectUser", page).html(usersHtml).val(profile.UserId || "");
|
||||
renderSubProfiles(page, profile);
|
||||
@@ -74,12 +74,12 @@ define(["jQuery", "loading", "fnchecked", "emby-select", "emby-button", "emby-in
|
||||
|
||||
function renderIdentificationHeaders(page, headers) {
|
||||
var index = 0;
|
||||
var html = '<div class="paperList">' + headers.map(function (h__e) {
|
||||
var html = '<div class="paperList">' + headers.map(function (h) {
|
||||
var li = '<div class="listItem">';
|
||||
li += '<i class="md-icon listItemIcon">info</i>';
|
||||
li += '<div class="listItemBody">';
|
||||
li += '<h3 class="listItemBodyText">' + h__e.Name + ": " + (h__e.Value || "") + "</h3>";
|
||||
li += '<div class="listItemBodyText secondary">' + (h__e.Match || "") + "</div>";
|
||||
li += '<h3 class="listItemBodyText">' + h.Name + ": " + (h.Value || "") + "</h3>";
|
||||
li += '<div class="listItemBodyText secondary">' + (h.Match || "") + "</div>";
|
||||
li += "</div>";
|
||||
li += '<button type="button" is="paper-icon-button-light" class="btnDeleteIdentificationHeader listItemButton" data-index="' + index + '"><i class="md-icon">delete</i></button>';
|
||||
li += "</div>";
|
||||
@@ -130,11 +130,11 @@ define(["jQuery", "loading", "fnchecked", "emby-select", "emby-button", "emby-in
|
||||
}
|
||||
|
||||
function renderXmlDocumentAttributes(page, attribute) {
|
||||
var html = '<div class="paperList">' + attribute.map(function (h__r) {
|
||||
var html = '<div class="paperList">' + attribute.map(function (h) {
|
||||
var li = '<div class="listItem">';
|
||||
li += '<i class="md-icon listItemIcon">info</i>';
|
||||
li += '<div class="listItemBody">';
|
||||
li += '<h3 class="listItemBodyText">' + h__r.Name + " = " + (h__r.Value || "") + "</h3>";
|
||||
li += '<h3 class="listItemBodyText">' + h.Name + " = " + (h.Value || "") + "</h3>";
|
||||
li += "</div>";
|
||||
li += '<button type="button" is="paper-icon-button-light" class="btnDeleteXmlAttribute listItemButton" data-index="0"><i class="md-icon">delete</i></button>';
|
||||
return li += "</div>";
|
||||
@@ -172,11 +172,11 @@ define(["jQuery", "loading", "fnchecked", "emby-select", "emby-button", "emby-in
|
||||
|
||||
function renderSubtitleProfiles(page, profiles) {
|
||||
var index = 0;
|
||||
var html = '<div class="paperList">' + profiles.map(function (h__t) {
|
||||
var html = '<div class="paperList">' + profiles.map(function (h) {
|
||||
var li = '<div class="listItem lnkEditSubProfile" data-index="' + index + '">';
|
||||
li += '<i class="md-icon listItemIcon">info</i>';
|
||||
li += '<div class="listItemBody">';
|
||||
li += '<h3 class="listItemBodyText">' + (h__t.Format || "") + "</h3>";
|
||||
li += '<h3 class="listItemBodyText">' + (h.Format || "") + "</h3>";
|
||||
li += "</div>";
|
||||
li += '<button type="button" is="paper-icon-button-light" class="btnDeleteProfile listItemButton" data-index="' + index + '"><i class="md-icon">delete</i></button>';
|
||||
li += "</div>";
|
||||
@@ -248,8 +248,8 @@ define(["jQuery", "loading", "fnchecked", "emby-select", "emby-button", "emby-in
|
||||
html += '<ul data-role="listview" data-inset="true" data-split-icon="delete">';
|
||||
var currentType;
|
||||
|
||||
for (var i__y = 0, length = profiles.length; i__y < length; i__y++) {
|
||||
var profile = profiles[i__y];
|
||||
for (var i = 0, length = profiles.length; i < length; i++) {
|
||||
var profile = profiles[i];
|
||||
|
||||
if (profile.Type !== currentType) {
|
||||
html += '<li data-role="list-divider">' + profile.Type + "</li>";
|
||||
@@ -257,7 +257,7 @@ define(["jQuery", "loading", "fnchecked", "emby-select", "emby-button", "emby-in
|
||||
}
|
||||
|
||||
html += "<div>";
|
||||
html += '<a is="emby-linkbutton" href="#" class="lnkEditSubProfile" data-profileindex="' + i__y + '">';
|
||||
html += '<a is="emby-linkbutton" href="#" class="lnkEditSubProfile" data-profileindex="' + i + '">';
|
||||
html += "<p>" + Globalize.translate("ValueContainer").replace("{0}", profile.Container || allText) + "</p>";
|
||||
|
||||
if ("Video" == profile.Type) {
|
||||
@@ -270,7 +270,7 @@ define(["jQuery", "loading", "fnchecked", "emby-select", "emby-button", "emby-in
|
||||
}
|
||||
|
||||
html += "</a>";
|
||||
html += '<button type="button" is="paper-icon-button-light" class="btnDeleteProfile listItemButton" data-profileindex="' + i__y + '"><i class="md-icon">delete</i></button>';
|
||||
html += '<button type="button" is="paper-icon-button-light" class="btnDeleteProfile listItemButton" data-profileindex="' + i + '"><i class="md-icon">delete</i></button>';
|
||||
html += "</div>";
|
||||
}
|
||||
|
||||
@@ -308,8 +308,8 @@ define(["jQuery", "loading", "fnchecked", "emby-select", "emby-button", "emby-in
|
||||
html += '<ul data-role="listview" data-inset="true" data-split-icon="delete">';
|
||||
var currentType;
|
||||
|
||||
for (var i__u = 0, length = profiles.length; i__u < length; i__u++) {
|
||||
var profile = profiles[i__u];
|
||||
for (var i = 0, length = profiles.length; i < length; i++) {
|
||||
var profile = profiles[i];
|
||||
|
||||
if (profile.Type !== currentType) {
|
||||
html += '<li data-role="list-divider">' + profile.Type + "</li>";
|
||||
@@ -317,7 +317,7 @@ define(["jQuery", "loading", "fnchecked", "emby-select", "emby-button", "emby-in
|
||||
}
|
||||
|
||||
html += "<div>";
|
||||
html += '<a is="emby-linkbutton" href="#" class="lnkEditSubProfile" data-profileindex="' + i__u + '">';
|
||||
html += '<a is="emby-linkbutton" href="#" class="lnkEditSubProfile" data-profileindex="' + i + '">';
|
||||
html += "<p>Protocol: " + (profile.Protocol || "Http") + "</p>";
|
||||
html += "<p>" + Globalize.translate("ValueContainer").replace("{0}", profile.Container || allText) + "</p>";
|
||||
|
||||
@@ -331,7 +331,7 @@ define(["jQuery", "loading", "fnchecked", "emby-select", "emby-button", "emby-in
|
||||
}
|
||||
|
||||
html += "</a>";
|
||||
html += '<button type="button" is="paper-icon-button-light" class="btnDeleteProfile listItemButton" data-profileindex="' + i__u + '"><i class="md-icon">delete</i></button>';
|
||||
html += '<button type="button" is="paper-icon-button-light" class="btnDeleteProfile listItemButton" data-profileindex="' + i + '"><i class="md-icon">delete</i></button>';
|
||||
html += "</div>";
|
||||
}
|
||||
|
||||
@@ -394,8 +394,8 @@ define(["jQuery", "loading", "fnchecked", "emby-select", "emby-button", "emby-in
|
||||
html += '<ul data-role="listview" data-inset="true" data-split-icon="delete">';
|
||||
var currentType;
|
||||
|
||||
for (var i__i = 0, length = profiles.length; i__i < length; i__i++) {
|
||||
var profile = profiles[i__i];
|
||||
for (var i = 0, length = profiles.length; i < length; i++) {
|
||||
var profile = profiles[i];
|
||||
|
||||
if (profile.Type !== currentType) {
|
||||
html += '<li data-role="list-divider">' + profile.Type + "</li>";
|
||||
@@ -403,19 +403,19 @@ define(["jQuery", "loading", "fnchecked", "emby-select", "emby-button", "emby-in
|
||||
}
|
||||
|
||||
html += "<div>";
|
||||
html += '<a is="emby-linkbutton" href="#" class="lnkEditSubProfile" data-profileindex="' + i__i + '">';
|
||||
html += '<a is="emby-linkbutton" href="#" class="lnkEditSubProfile" data-profileindex="' + i + '">';
|
||||
html += "<p>" + Globalize.translate("ValueContainer").replace("{0}", profile.Container || allText) + "</p>";
|
||||
|
||||
if (profile.Conditions && profile.Conditions.length) {
|
||||
html += "<p>";
|
||||
html += Globalize.translate("ValueConditions").replace("{0}", profile.Conditions.map(function (c__o) {
|
||||
return c__o.Property;
|
||||
html += Globalize.translate("ValueConditions").replace("{0}", profile.Conditions.map(function (c) {
|
||||
return c.Property;
|
||||
}).join(", "));
|
||||
html += "</p>";
|
||||
}
|
||||
|
||||
html += "</a>";
|
||||
html += '<button type="button" is="paper-icon-button-light" class="btnDeleteProfile listItemButton" data-profileindex="' + i__i + '"><i class="md-icon">delete</i></button>';
|
||||
html += '<button type="button" is="paper-icon-button-light" class="btnDeleteProfile listItemButton" data-profileindex="' + i + '"><i class="md-icon">delete</i></button>';
|
||||
html += "</div>";
|
||||
}
|
||||
|
||||
@@ -465,8 +465,8 @@ define(["jQuery", "loading", "fnchecked", "emby-select", "emby-button", "emby-in
|
||||
html += '<ul data-role="listview" data-inset="true" data-split-icon="delete">';
|
||||
var currentType;
|
||||
|
||||
for (var i__p = 0, length = profiles.length; i__p < length; i__p++) {
|
||||
var profile = profiles[i__p];
|
||||
for (var i = 0, length = profiles.length; i < length; i++) {
|
||||
var profile = profiles[i];
|
||||
var type = profile.Type.replace("VideoAudio", "Video Audio");
|
||||
|
||||
if (type !== currentType) {
|
||||
@@ -475,19 +475,19 @@ define(["jQuery", "loading", "fnchecked", "emby-select", "emby-button", "emby-in
|
||||
}
|
||||
|
||||
html += "<div>";
|
||||
html += '<a is="emby-linkbutton" href="#" class="lnkEditSubProfile" data-profileindex="' + i__p + '">';
|
||||
html += '<a is="emby-linkbutton" href="#" class="lnkEditSubProfile" data-profileindex="' + i + '">';
|
||||
html += "<p>" + Globalize.translate("ValueCodec").replace("{0}", profile.Codec || allText) + "</p>";
|
||||
|
||||
if (profile.Conditions && profile.Conditions.length) {
|
||||
html += "<p>";
|
||||
html += Globalize.translate("ValueConditions").replace("{0}", profile.Conditions.map(function (c__a) {
|
||||
return c__a.Property;
|
||||
html += Globalize.translate("ValueConditions").replace("{0}", profile.Conditions.map(function (c) {
|
||||
return c.Property;
|
||||
}).join(", "));
|
||||
html += "</p>";
|
||||
}
|
||||
|
||||
html += "</a>";
|
||||
html += '<button type="button" is="paper-icon-button-light" class="btnDeleteProfile listItemButton" data-profileindex="' + i__p + '"><i class="md-icon">delete</i></button>';
|
||||
html += '<button type="button" is="paper-icon-button-light" class="btnDeleteProfile listItemButton" data-profileindex="' + i + '"><i class="md-icon">delete</i></button>';
|
||||
html += "</div>";
|
||||
}
|
||||
|
||||
@@ -537,8 +537,8 @@ define(["jQuery", "loading", "fnchecked", "emby-select", "emby-button", "emby-in
|
||||
html += '<ul data-role="listview" data-inset="true" data-split-icon="delete">';
|
||||
var currentType;
|
||||
|
||||
for (var i__s = 0, length = profiles.length; i__s < length; i__s++) {
|
||||
var profile = profiles[i__s];
|
||||
for (var i = 0, length = profiles.length; i < length; i++) {
|
||||
var profile = profiles[i];
|
||||
|
||||
if (profile.Type !== currentType) {
|
||||
html += '<li data-role="list-divider">' + profile.Type + "</li>";
|
||||
@@ -546,7 +546,7 @@ define(["jQuery", "loading", "fnchecked", "emby-select", "emby-button", "emby-in
|
||||
}
|
||||
|
||||
html += "<div>";
|
||||
html += '<a is="emby-linkbutton" href="#" class="lnkEditSubProfile" data-profileindex="' + i__s + '">';
|
||||
html += '<a is="emby-linkbutton" href="#" class="lnkEditSubProfile" data-profileindex="' + i + '">';
|
||||
html += "<p>" + Globalize.translate("ValueContainer").replace("{0}", profile.Container || allText) + "</p>";
|
||||
|
||||
if ("Video" == profile.Type) {
|
||||
@@ -560,14 +560,14 @@ define(["jQuery", "loading", "fnchecked", "emby-select", "emby-button", "emby-in
|
||||
|
||||
if (profile.Conditions && profile.Conditions.length) {
|
||||
html += "<p>";
|
||||
html += Globalize.translate("ValueConditions").replace("{0}", profile.Conditions.map(function (c__d) {
|
||||
return c__d.Property;
|
||||
html += Globalize.translate("ValueConditions").replace("{0}", profile.Conditions.map(function (c) {
|
||||
return c.Property;
|
||||
}).join(", "));
|
||||
html += "</p>";
|
||||
}
|
||||
|
||||
html += "</a>";
|
||||
html += '<button type="button" is="paper-icon-button-light" class="btnDeleteProfile listItemButton" data-profileindex="' + i__s + '"><i class="md-icon">delete</i></button>';
|
||||
html += '<button type="button" is="paper-icon-button-light" class="btnDeleteProfile listItemButton" data-profileindex="' + i + '"><i class="md-icon">delete</i></button>';
|
||||
html += "</div>";
|
||||
}
|
||||
|
||||
@@ -649,8 +649,8 @@ define(["jQuery", "loading", "fnchecked", "emby-select", "emby-button", "emby-in
|
||||
profile.Name = $("#txtName", page).val();
|
||||
profile.EnableAlbumArtInDidl = $("#chkEnableAlbumArtInDidl", page).checked();
|
||||
profile.EnableSingleAlbumArtLimit = $("#chkEnableSingleImageLimit", page).checked();
|
||||
profile.SupportedMediaTypes = $(".chkMediaType:checked", page).get().map(function (c__f) {
|
||||
return c__f.getAttribute("data-value");
|
||||
profile.SupportedMediaTypes = $(".chkMediaType:checked", page).get().map(function (c) {
|
||||
return c.getAttribute("data-value");
|
||||
}).join(",");
|
||||
profile.Identification = profile.Identification || {};
|
||||
profile.FriendlyName = $("#txtInfoFriendlyName", page).val();
|
||||
|
||||
@@ -1,48 +1,75 @@
|
||||
define(["jQuery", "globalize", "loading", "libraryMenu", "listViewStyle", "emby-button"], function($, globalize, loading, libraryMenu) {
|
||||
define(["jQuery", "globalize", "loading", "libraryMenu", "listViewStyle", "emby-button"], function ($, globalize, loading, libraryMenu) {
|
||||
"use strict";
|
||||
|
||||
function loadProfiles(page) {
|
||||
loading.show(), ApiClient.getJSON(ApiClient.getUrl("Dlna/ProfileInfos")).then(function(result) {
|
||||
renderUserProfiles(page, result), renderSystemProfiles(page, result), loading.hide()
|
||||
})
|
||||
loading.show();
|
||||
ApiClient.getJSON(ApiClient.getUrl("Dlna/ProfileInfos")).then(function (result) {
|
||||
renderUserProfiles(page, result);
|
||||
renderSystemProfiles(page, result);
|
||||
loading.hide();
|
||||
});
|
||||
}
|
||||
|
||||
function renderUserProfiles(page, profiles) {
|
||||
renderProfiles(page, page.querySelector(".customProfiles"), profiles.filter(function(p) {
|
||||
return "User" == p.Type
|
||||
}))
|
||||
renderProfiles(page, page.querySelector(".customProfiles"), profiles.filter(function (p) {
|
||||
return "User" == p.Type;
|
||||
}));
|
||||
}
|
||||
|
||||
function renderSystemProfiles(page, profiles) {
|
||||
renderProfiles(page, page.querySelector(".systemProfiles"), profiles.filter(function(p) {
|
||||
return "System" == p.Type
|
||||
}))
|
||||
renderProfiles(page, page.querySelector(".systemProfiles"), profiles.filter(function (p) {
|
||||
return "System" == p.Type;
|
||||
}));
|
||||
}
|
||||
|
||||
function renderProfiles(page, element, profiles) {
|
||||
var html = "";
|
||||
profiles.length && (html += '<div class="paperList">');
|
||||
|
||||
if (profiles.length) {
|
||||
html += '<div class="paperList">';
|
||||
}
|
||||
|
||||
for (var i = 0, length = profiles.length; i < length; i++) {
|
||||
var profile = profiles[i];
|
||||
html += '<div class="listItem listItem-border">', html += '<i class="listItemIcon md-icon">live_tv</i>', html += '<div class="listItemBody two-line">', html += "<a is='emby-linkbutton' style='padding:0;margin:0;' data-ripple='false' class='clearLink' href='dlnaprofile.html?id=" + profile.Id + "'>", html += "<div>" + profile.Name + "</div>", html += "</a>", html += "</div>", "User" == profile.Type && (html += '<button type="button" is="paper-icon-button-light" class="btnDeleteProfile" data-profileid="' + profile.Id + '" title="' + globalize.translate("ButtonDelete") + '"><i class="md-icon">delete</i></button>'), html += "</div>"
|
||||
html += '<div class="listItem listItem-border">';
|
||||
html += '<i class="listItemIcon md-icon">live_tv</i>';
|
||||
html += '<div class="listItemBody two-line">';
|
||||
html += "<a is='emby-linkbutton' style='padding:0;margin:0;' data-ripple='false' class='clearLink' href='dlnaprofile.html?id=" + profile.Id + "'>";
|
||||
html += "<div>" + profile.Name + "</div>";
|
||||
html += "</a>";
|
||||
html += "</div>";
|
||||
|
||||
if ("User" == profile.Type) {
|
||||
html += '<button type="button" is="paper-icon-button-light" class="btnDeleteProfile" data-profileid="' + profile.Id + '" title="' + globalize.translate("ButtonDelete") + '"><i class="md-icon">delete</i></button>';
|
||||
}
|
||||
|
||||
html += "</div>";
|
||||
}
|
||||
profiles.length && (html += "</div>"), element.innerHTML = html, $(".btnDeleteProfile", element).on("click", function() {
|
||||
|
||||
if (profiles.length) {
|
||||
html += "</div>";
|
||||
}
|
||||
|
||||
element.innerHTML = html;
|
||||
$(".btnDeleteProfile", element).on("click", function () {
|
||||
var id = this.getAttribute("data-profileid");
|
||||
deleteProfile(page, id)
|
||||
})
|
||||
deleteProfile(page, id);
|
||||
});
|
||||
}
|
||||
|
||||
function deleteProfile(page, id) {
|
||||
require(["confirm"], function(confirm) {
|
||||
confirm(globalize.translate("MessageConfirmProfileDeletion"), globalize.translate("HeaderConfirmProfileDeletion")).then(function() {
|
||||
loading.show(), ApiClient.ajax({
|
||||
require(["confirm"], function (confirm) {
|
||||
confirm(globalize.translate("MessageConfirmProfileDeletion"), globalize.translate("HeaderConfirmProfileDeletion")).then(function () {
|
||||
loading.show();
|
||||
ApiClient.ajax({
|
||||
type: "DELETE",
|
||||
url: ApiClient.getUrl("Dlna/Profiles/" + id)
|
||||
}).then(function() {
|
||||
loading.hide(), loadProfiles(page)
|
||||
})
|
||||
})
|
||||
})
|
||||
}).then(function () {
|
||||
loading.hide();
|
||||
loadProfiles(page);
|
||||
});
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function getTabs() {
|
||||
@@ -52,10 +79,11 @@ define(["jQuery", "globalize", "loading", "libraryMenu", "listViewStyle", "emby-
|
||||
}, {
|
||||
href: "dlnaprofiles.html",
|
||||
name: globalize.translate("TabProfiles")
|
||||
}]
|
||||
}];
|
||||
}
|
||||
|
||||
$(document).on("pageshow", "#dlnaProfilesPage", function() {
|
||||
libraryMenu.setTabs("dlna", 1, getTabs), loadProfiles(this)
|
||||
})
|
||||
});
|
||||
$(document).on("pageshow", "#dlnaProfilesPage", function () {
|
||||
libraryMenu.setTabs("dlna", 1, getTabs);
|
||||
loadProfiles(this);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -1,20 +1,34 @@
|
||||
define(["jQuery", "loading", "libraryMenu", "fnchecked"], function($, loading, libraryMenu) {
|
||||
define(["jQuery", "loading", "libraryMenu", "fnchecked"], function ($, loading, libraryMenu) {
|
||||
"use strict";
|
||||
|
||||
function loadPage(page, config, users) {
|
||||
page.querySelector("#chkEnablePlayTo").checked = config.EnablePlayTo, page.querySelector("#chkEnableDlnaDebugLogging").checked = config.EnableDebugLog, $("#txtClientDiscoveryInterval", page).val(config.ClientDiscoveryIntervalSeconds), $("#chkEnableServer", page).checked(config.EnableServer), $("#chkBlastAliveMessages", page).checked(config.BlastAliveMessages), $("#txtBlastInterval", page).val(config.BlastAliveMessageIntervalSeconds);
|
||||
var usersHtml = users.map(function(u) {
|
||||
return '<option value="' + u.Id + '">' + u.Name + "</option>"
|
||||
page.querySelector("#chkEnablePlayTo").checked = config.EnablePlayTo;
|
||||
page.querySelector("#chkEnableDlnaDebugLogging").checked = config.EnableDebugLog;
|
||||
$("#txtClientDiscoveryInterval", page).val(config.ClientDiscoveryIntervalSeconds);
|
||||
$("#chkEnableServer", page).checked(config.EnableServer);
|
||||
$("#chkBlastAliveMessages", page).checked(config.BlastAliveMessages);
|
||||
$("#txtBlastInterval", page).val(config.BlastAliveMessageIntervalSeconds);
|
||||
var usersHtml = users.map(function (u) {
|
||||
return '<option value="' + u.Id + '">' + u.Name + "</option>";
|
||||
}).join("");
|
||||
$("#selectUser", page).html(usersHtml).val(config.DefaultUserId || ""), loading.hide()
|
||||
$("#selectUser", page).html(usersHtml).val(config.DefaultUserId || "");
|
||||
loading.hide();
|
||||
}
|
||||
|
||||
function onSubmit() {
|
||||
loading.show();
|
||||
var form = this;
|
||||
return ApiClient.getNamedConfiguration("dlna").then(function(config) {
|
||||
config.EnablePlayTo = form.querySelector("#chkEnablePlayTo").checked, config.EnableDebugLog = form.querySelector("#chkEnableDlnaDebugLogging").checked, config.ClientDiscoveryIntervalSeconds = $("#txtClientDiscoveryInterval", form).val(), config.EnableServer = $("#chkEnableServer", form).checked(), config.BlastAliveMessages = $("#chkBlastAliveMessages", form).checked(), config.BlastAliveMessageIntervalSeconds = $("#txtBlastInterval", form).val(), config.DefaultUserId = $("#selectUser", form).val(), ApiClient.updateNamedConfiguration("dlna", config).then(Dashboard.processServerConfigurationUpdateResult)
|
||||
}), !1
|
||||
ApiClient.getNamedConfiguration("dlna").then(function (config) {
|
||||
config.EnablePlayTo = form.querySelector("#chkEnablePlayTo").checked;
|
||||
config.EnableDebugLog = form.querySelector("#chkEnableDlnaDebugLogging").checked;
|
||||
config.ClientDiscoveryIntervalSeconds = $("#txtClientDiscoveryInterval", form).val();
|
||||
config.EnableServer = $("#chkEnableServer", form).checked();
|
||||
config.BlastAliveMessages = $("#chkBlastAliveMessages", form).checked();
|
||||
config.BlastAliveMessageIntervalSeconds = $("#txtBlastInterval", form).val();
|
||||
config.DefaultUserId = $("#selectUser", form).val();
|
||||
ApiClient.updateNamedConfiguration("dlna", config).then(Dashboard.processServerConfigurationUpdateResult);
|
||||
});
|
||||
return false;
|
||||
}
|
||||
|
||||
function getTabs() {
|
||||
@@ -24,17 +38,19 @@ define(["jQuery", "loading", "libraryMenu", "fnchecked"], function($, loading, l
|
||||
}, {
|
||||
href: "dlnaprofiles.html",
|
||||
name: Globalize.translate("TabProfiles")
|
||||
}]
|
||||
}];
|
||||
}
|
||||
$(document).on("pageinit", "#dlnaSettingsPage", function() {
|
||||
$(".dlnaSettingsForm").off("submit", onSubmit).on("submit", onSubmit)
|
||||
}).on("pageshow", "#dlnaSettingsPage", function() {
|
||||
libraryMenu.setTabs("dlna", 0, getTabs), loading.show();
|
||||
var page = this,
|
||||
promise1 = ApiClient.getNamedConfiguration("dlna"),
|
||||
promise2 = ApiClient.getUsers();
|
||||
Promise.all([promise1, promise2]).then(function(responses) {
|
||||
loadPage(page, responses[0], responses[1])
|
||||
})
|
||||
})
|
||||
});
|
||||
|
||||
$(document).on("pageinit", "#dlnaSettingsPage", function () {
|
||||
$(".dlnaSettingsForm").off("submit", onSubmit).on("submit", onSubmit);
|
||||
}).on("pageshow", "#dlnaSettingsPage", function () {
|
||||
libraryMenu.setTabs("dlna", 0, getTabs);
|
||||
loading.show();
|
||||
var page = this;
|
||||
var promise1 = ApiClient.getNamedConfiguration("dlna");
|
||||
var promise2 = ApiClient.getUsers();
|
||||
Promise.all([promise1, promise2]).then(function (responses) {
|
||||
loadPage(page, responses[0], responses[1]);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
@@ -1,17 +1,31 @@
|
||||
define(["loading", "scripts/editorsidebar"], function(loading) {
|
||||
define(["loading", "scripts/editorsidebar"], function (loading) {
|
||||
"use strict";
|
||||
|
||||
function reload(context, itemId) {
|
||||
loading.show(), itemId ? require(["metadataEditor"], function(metadataEditor) {
|
||||
metadataEditor.embed(context.querySelector(".editPageInnerContent"), itemId, ApiClient.serverInfo().Id)
|
||||
}) : (context.querySelector(".editPageInnerContent").innerHTML = "", loading.hide())
|
||||
loading.show();
|
||||
|
||||
if (itemId) {
|
||||
require(["metadataEditor"], function (metadataEditor) {
|
||||
metadataEditor.embed(context.querySelector(".editPageInnerContent"), itemId, ApiClient.serverInfo().Id);
|
||||
});
|
||||
} else {
|
||||
context.querySelector(".editPageInnerContent").innerHTML = "";
|
||||
loading.hide();
|
||||
}
|
||||
}
|
||||
return function(view, params) {
|
||||
view.addEventListener("viewshow", function() {
|
||||
reload(this, MetadataEditor.getCurrentItemId())
|
||||
}), MetadataEditor.setCurrentItemId(null), view.querySelector(".libraryTree").addEventListener("itemclicked", function(event) {
|
||||
|
||||
return function (view, params) {
|
||||
view.addEventListener("viewshow", function () {
|
||||
reload(this, MetadataEditor.getCurrentItemId());
|
||||
});
|
||||
MetadataEditor.setCurrentItemId(null);
|
||||
view.querySelector(".libraryTree").addEventListener("itemclicked", function (event) {
|
||||
var data = event.detail;
|
||||
data.id != MetadataEditor.getCurrentItemId() && (MetadataEditor.setCurrentItemId(data.id), reload(view, data.id))
|
||||
})
|
||||
}
|
||||
});
|
||||
|
||||
if (data.id != MetadataEditor.getCurrentItemId()) {
|
||||
MetadataEditor.setCurrentItemId(data.id);
|
||||
reload(view, data.id);
|
||||
}
|
||||
});
|
||||
};
|
||||
});
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
define(["jQuery", "loading", "globalize", "dom", "libraryMenu"], function($, loading, globalize, dom, libraryMenu) {
|
||||
define(["jQuery", "loading", "globalize", "dom", "libraryMenu"], function ($, loading, globalize, dom, libraryMenu) {
|
||||
"use strict";
|
||||
|
||||
function loadPage(page, config, systemInfo) {
|
||||
Array.prototype.forEach.call(page.querySelectorAll(".chkDecodeCodec"), function(c) {
|
||||
c.checked = -1 !== (config.HardwareDecodingCodecs || []).indexOf(c.getAttribute("data-codec"))
|
||||
Array.prototype.forEach.call(page.querySelectorAll(".chkDecodeCodec"), function (c) {
|
||||
c.checked = -1 !== (config.HardwareDecodingCodecs || []).indexOf(c.getAttribute("data-codec"));
|
||||
});
|
||||
page.querySelector("#chkHardwareEncoding").checked = config.EnableHardwareEncoding;
|
||||
$("#selectVideoDecoder", page).val(config.HardwareAccelerationType);
|
||||
@@ -17,19 +17,22 @@ define(["jQuery", "loading", "globalize", "dom", "libraryMenu"], function($, loa
|
||||
page.querySelector("#chkEnableSubtitleExtraction").checked = config.EnableSubtitleExtraction || false;
|
||||
page.querySelector("#selectVideoDecoder").dispatchEvent(new CustomEvent("change", {
|
||||
bubbles: true
|
||||
})), loading.hide()
|
||||
}));
|
||||
loading.hide();
|
||||
}
|
||||
|
||||
function onSaveEncodingPathFailure(response) {
|
||||
loading.hide();
|
||||
var msg = "";
|
||||
msg = globalize.translate("FFmpegSavePathNotFound"), require(["alert"], function(alert) {
|
||||
alert(msg)
|
||||
})
|
||||
msg = globalize.translate("FFmpegSavePathNotFound");
|
||||
|
||||
require(["alert"], function (alert) {
|
||||
alert(msg);
|
||||
});
|
||||
}
|
||||
|
||||
function updateEncoder(form) {
|
||||
return ApiClient.getSystemInfo().then(function(systemInfo) {
|
||||
return ApiClient.getSystemInfo().then(function (systemInfo) {
|
||||
return ApiClient.ajax({
|
||||
url: ApiClient.getUrl("System/MediaEncoder/Path"),
|
||||
type: "POST",
|
||||
@@ -37,37 +40,67 @@ define(["jQuery", "loading", "globalize", "dom", "libraryMenu"], function($, loa
|
||||
Path: form.querySelector(".txtEncoderPath").value,
|
||||
PathType: "Custom"
|
||||
}
|
||||
}).then(Dashboard.processServerConfigurationUpdateResult, onSaveEncodingPathFailure)
|
||||
})
|
||||
}).then(Dashboard.processServerConfigurationUpdateResult, onSaveEncodingPathFailure);
|
||||
});
|
||||
}
|
||||
|
||||
function onSubmit() {
|
||||
var form = this,
|
||||
onDecoderConfirmed = function() {
|
||||
loading.show(), ApiClient.getNamedConfiguration("encoding").then(function(config) {
|
||||
config.DownMixAudioBoost = $("#txtDownMixAudioBoost", form).val(), config.TranscodingTempPath = $("#txtTranscodingTempPath", form).val(), config.EncodingThreadCount = $("#selectThreadCount", form).val(), config.HardwareAccelerationType = $("#selectVideoDecoder", form).val(), config.VaapiDevice = $("#txtVaapiDevice", form).val(), config.H264Preset = form.querySelector("#selectH264Preset").value, config.H264Crf = parseInt(form.querySelector("#txtH264Crf").value || "0"), config.EnableSubtitleExtraction = form.querySelector("#chkEnableSubtitleExtraction").checked, config.HardwareDecodingCodecs = Array.prototype.map.call(Array.prototype.filter.call(form.querySelectorAll(".chkDecodeCodec"), function(c) {
|
||||
return c.checked
|
||||
}), function(c) {
|
||||
return c.getAttribute("data-codec")
|
||||
}), config.EnableHardwareEncoding = form.querySelector("#chkHardwareEncoding").checked, ApiClient.updateNamedConfiguration("encoding", config).then(function() {
|
||||
updateEncoder(form)
|
||||
})
|
||||
})
|
||||
};
|
||||
return $("#selectVideoDecoder", form).val() ? require(["alert"], function(alert) {
|
||||
alert({
|
||||
title: globalize.translate("TitleHardwareAcceleration"),
|
||||
text: globalize.translate("HardwareAccelerationWarning")
|
||||
}).then(onDecoderConfirmed)
|
||||
}) : onDecoderConfirmed(), !1
|
||||
var form = this;
|
||||
|
||||
var onDecoderConfirmed = function () {
|
||||
loading.show();
|
||||
ApiClient.getNamedConfiguration("encoding").then(function (config) {
|
||||
config.DownMixAudioBoost = $("#txtDownMixAudioBoost", form).val();
|
||||
config.TranscodingTempPath = $("#txtTranscodingTempPath", form).val();
|
||||
config.EncodingThreadCount = $("#selectThreadCount", form).val();
|
||||
config.HardwareAccelerationType = $("#selectVideoDecoder", form).val();
|
||||
config.VaapiDevice = $("#txtVaapiDevice", form).val();
|
||||
config.H264Preset = form.querySelector("#selectH264Preset").value;
|
||||
config.H264Crf = parseInt(form.querySelector("#txtH264Crf").value || "0");
|
||||
config.EnableSubtitleExtraction = form.querySelector("#chkEnableSubtitleExtraction").checked;
|
||||
config.HardwareDecodingCodecs = Array.prototype.map.call(Array.prototype.filter.call(form.querySelectorAll(".chkDecodeCodec"), function (c) {
|
||||
return c.checked;
|
||||
}), function (c) {
|
||||
return c.getAttribute("data-codec");
|
||||
});
|
||||
config.EnableHardwareEncoding = form.querySelector("#chkHardwareEncoding").checked;
|
||||
ApiClient.updateNamedConfiguration("encoding", config).then(function () {
|
||||
updateEncoder(form);
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
if ($("#selectVideoDecoder", form).val()) {
|
||||
require(["alert"], function (alert) {
|
||||
alert({
|
||||
title: globalize.translate("TitleHardwareAcceleration"),
|
||||
text: globalize.translate("HardwareAccelerationWarning")
|
||||
}).then(onDecoderConfirmed);
|
||||
});
|
||||
} else {
|
||||
onDecoderConfirmed();
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
function setDecodingCodecsVisible(context, value) {
|
||||
value = value || "";
|
||||
var any;
|
||||
Array.prototype.forEach.call(context.querySelectorAll(".chkDecodeCodec"), function(c) {
|
||||
-1 === c.getAttribute("data-types").split(",").indexOf(value) ? dom.parentWithTag(c, "LABEL").classList.add("hide") : (dom.parentWithTag(c, "LABEL").classList.remove("hide"), any = !0)
|
||||
}), any ? context.querySelector(".decodingCodecsList").classList.remove("hide") : context.querySelector(".decodingCodecsList").classList.add("hide")
|
||||
Array.prototype.forEach.call(context.querySelectorAll(".chkDecodeCodec"), function (c) {
|
||||
if (-1 === c.getAttribute("data-types").split(",").indexOf(value)) {
|
||||
dom.parentWithTag(c, "LABEL").classList.add("hide");
|
||||
} else {
|
||||
dom.parentWithTag(c, "LABEL").classList.remove("hide");
|
||||
any = true;
|
||||
}
|
||||
});
|
||||
|
||||
if (any) {
|
||||
context.querySelector(".decodingCodecsList").classList.remove("hide");
|
||||
} else {
|
||||
context.querySelector(".decodingCodecsList").classList.add("hide");
|
||||
}
|
||||
}
|
||||
|
||||
function getTabs() {
|
||||
@@ -80,44 +113,69 @@ define(["jQuery", "loading", "globalize", "dom", "libraryMenu"], function($, loa
|
||||
}, {
|
||||
href: "streamingsettings.html",
|
||||
name: Globalize.translate("TabStreaming")
|
||||
}]
|
||||
}];
|
||||
}
|
||||
|
||||
$(document).on("pageinit", "#encodingSettingsPage", function() {
|
||||
$(document).on("pageinit", "#encodingSettingsPage", function () {
|
||||
var page = this;
|
||||
page.querySelector("#selectVideoDecoder").addEventListener("change", function() {
|
||||
"vaapi" == this.value ? (page.querySelector(".fldVaapiDevice").classList.remove("hide"), page.querySelector("#txtVaapiDevice").setAttribute("required", "required")) : (page.querySelector(".fldVaapiDevice").classList.add("hide"), page.querySelector("#txtVaapiDevice").removeAttribute("required")), this.value ? page.querySelector(".hardwareAccelerationOptions").classList.remove("hide") : page.querySelector(".hardwareAccelerationOptions").classList.add("hide"), setDecodingCodecsVisible(page, this.value)
|
||||
}), $("#btnSelectEncoderPath", page).on("click.selectDirectory", function() {
|
||||
require(["directorybrowser"], function(directoryBrowser) {
|
||||
var picker = new directoryBrowser;
|
||||
page.querySelector("#selectVideoDecoder").addEventListener("change", function () {
|
||||
if ("vaapi" == this.value) {
|
||||
page.querySelector(".fldVaapiDevice").classList.remove("hide");
|
||||
page.querySelector("#txtVaapiDevice").setAttribute("required", "required");
|
||||
} else {
|
||||
page.querySelector(".fldVaapiDevice").classList.add("hide");
|
||||
page.querySelector("#txtVaapiDevice").removeAttribute("required");
|
||||
}
|
||||
|
||||
if (this.value) {
|
||||
page.querySelector(".hardwareAccelerationOptions").classList.remove("hide");
|
||||
} else {
|
||||
page.querySelector(".hardwareAccelerationOptions").classList.add("hide");
|
||||
}
|
||||
|
||||
setDecodingCodecsVisible(page, this.value);
|
||||
});
|
||||
$("#btnSelectEncoderPath", page).on("click.selectDirectory", function () {
|
||||
require(["directorybrowser"], function (directoryBrowser) {
|
||||
var picker = new directoryBrowser();
|
||||
picker.show({
|
||||
includeFiles: !0,
|
||||
callback: function(path) {
|
||||
path && $(".txtEncoderPath", page).val(path), picker.close()
|
||||
includeFiles: true,
|
||||
callback: function (path) {
|
||||
if (path) {
|
||||
$(".txtEncoderPath", page).val(path);
|
||||
}
|
||||
|
||||
picker.close();
|
||||
}
|
||||
})
|
||||
})
|
||||
}), $("#btnSelectTranscodingTempPath", page).on("click.selectDirectory", function() {
|
||||
require(["directorybrowser"], function(directoryBrowser) {
|
||||
var picker = new directoryBrowser;
|
||||
});
|
||||
});
|
||||
});
|
||||
$("#btnSelectTranscodingTempPath", page).on("click.selectDirectory", function () {
|
||||
require(["directorybrowser"], function (directoryBrowser) {
|
||||
var picker = new directoryBrowser();
|
||||
picker.show({
|
||||
callback: function(path) {
|
||||
path && $("#txtTranscodingTempPath", page).val(path), picker.close()
|
||||
callback: function (path) {
|
||||
if (path) {
|
||||
$("#txtTranscodingTempPath", page).val(path);
|
||||
}
|
||||
|
||||
picker.close();
|
||||
},
|
||||
validateWriteable: !0,
|
||||
validateWriteable: true,
|
||||
header: globalize.translate("HeaderSelectTranscodingPath"),
|
||||
instruction: globalize.translate("HeaderSelectTranscodingPathHelp")
|
||||
})
|
||||
})
|
||||
}), $(".encodingSettingsForm").off("submit", onSubmit).on("submit", onSubmit)
|
||||
}).on("pageshow", "#encodingSettingsPage", function() {
|
||||
});
|
||||
});
|
||||
});
|
||||
$(".encodingSettingsForm").off("submit", onSubmit).on("submit", onSubmit);
|
||||
}).on("pageshow", "#encodingSettingsPage", function () {
|
||||
loading.show();
|
||||
libraryMenu.setTabs("playback", 0, getTabs);
|
||||
var page = this;
|
||||
ApiClient.getNamedConfiguration("encoding").then(function(config) {
|
||||
ApiClient.getSystemInfo().then(function(systemInfo) {
|
||||
ApiClient.getNamedConfiguration("encoding").then(function (config) {
|
||||
ApiClient.getSystemInfo().then(function (systemInfo) {
|
||||
loadPage(page, config, systemInfo);
|
||||
})
|
||||
})
|
||||
})
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
@@ -1,37 +1,53 @@
|
||||
define([], function() {
|
||||
define([], function () {
|
||||
"use strict";
|
||||
|
||||
function processForgotPasswordResult(result) {
|
||||
if ("ContactAdmin" == result.Action) return void Dashboard.alert({
|
||||
message: Globalize.translate("MessageContactAdminToResetPassword"),
|
||||
title: Globalize.translate("HeaderForgotPassword")
|
||||
});
|
||||
if ("InNetworkRequired" == result.Action) return void Dashboard.alert({
|
||||
message: Globalize.translate("MessageForgotPasswordInNetworkRequired"),
|
||||
title: Globalize.translate("HeaderForgotPassword")
|
||||
});
|
||||
if ("ContactAdmin" == result.Action) {
|
||||
return void Dashboard.alert({
|
||||
message: Globalize.translate("MessageContactAdminToResetPassword"),
|
||||
title: Globalize.translate("HeaderForgotPassword")
|
||||
});
|
||||
}
|
||||
|
||||
if ("InNetworkRequired" == result.Action) {
|
||||
return void Dashboard.alert({
|
||||
message: Globalize.translate("MessageForgotPasswordInNetworkRequired"),
|
||||
title: Globalize.translate("HeaderForgotPassword")
|
||||
});
|
||||
}
|
||||
|
||||
if ("PinCode" == result.Action) {
|
||||
var msg = Globalize.translate("MessageForgotPasswordFileCreated");
|
||||
return msg += "<br/>", msg += "<br/>", msg += "Enter PIN here to finish Password Reset<br/>" ,msg += "<br/>",msg += result.PinFile, msg += "<br/>", void Dashboard.alert({
|
||||
msg += "<br/>";
|
||||
msg += "<br/>";
|
||||
msg += "Enter PIN here to finish Password Reset<br/>";
|
||||
msg += "<br/>";
|
||||
msg += result.PinFile;
|
||||
msg += "<br/>";
|
||||
return void Dashboard.alert({
|
||||
message: msg,
|
||||
title: Globalize.translate("HeaderForgotPassword"),
|
||||
callback: function() {
|
||||
Dashboard.navigate("forgotpasswordpin.html")
|
||||
callback: function () {
|
||||
Dashboard.navigate("forgotpasswordpin.html");
|
||||
}
|
||||
})
|
||||
});
|
||||
}
|
||||
}
|
||||
return function(view, params) {
|
||||
|
||||
return function (view, params) {
|
||||
function onSubmit(e) {
|
||||
return ApiClient.ajax({
|
||||
ApiClient.ajax({
|
||||
type: "POST",
|
||||
url: ApiClient.getUrl("Users/ForgotPassword"),
|
||||
dataType: "json",
|
||||
data: {
|
||||
EnteredUsername: view.querySelector("#txtName").value
|
||||
}
|
||||
}).then(processForgotPasswordResult), e.preventDefault(), !1
|
||||
}).then(processForgotPasswordResult);
|
||||
e.preventDefault();
|
||||
return false;
|
||||
}
|
||||
view.querySelector("form").addEventListener("submit", onSubmit)
|
||||
}
|
||||
|
||||
view.querySelector("form").addEventListener("submit", onSubmit);
|
||||
};
|
||||
});
|
||||
|
||||
@@ -1,33 +1,41 @@
|
||||
define([], function() {
|
||||
define([], function () {
|
||||
"use strict";
|
||||
|
||||
function processForgotPasswordResult(result) {
|
||||
if (result.Success) {
|
||||
var msg = Globalize.translate("MessagePasswordResetForUsers");
|
||||
return msg += "<br/>", msg += "<br/>", msg += result.UsersReset.join("<br/>"), void Dashboard.alert({
|
||||
msg += "<br/>";
|
||||
msg += "<br/>";
|
||||
msg += result.UsersReset.join("<br/>");
|
||||
return void Dashboard.alert({
|
||||
message: msg,
|
||||
title: Globalize.translate("HeaderPasswordReset"),
|
||||
callback: function() {
|
||||
window.location.href = "index.html"
|
||||
callback: function () {
|
||||
window.location.href = "index.html";
|
||||
}
|
||||
})
|
||||
});
|
||||
}
|
||||
|
||||
Dashboard.alert({
|
||||
message: Globalize.translate("MessageInvalidForgotPasswordPin"),
|
||||
title: Globalize.translate("HeaderPasswordReset")
|
||||
})
|
||||
});
|
||||
}
|
||||
return function(view, params) {
|
||||
|
||||
return function (view, params) {
|
||||
function onSubmit(e) {
|
||||
return ApiClient.ajax({
|
||||
ApiClient.ajax({
|
||||
type: "POST",
|
||||
url: ApiClient.getUrl("Users/ForgotPassword/Pin"),
|
||||
dataType: "json",
|
||||
data: {
|
||||
Pin: view.querySelector("#txtPin").value
|
||||
}
|
||||
}).then(processForgotPasswordResult), e.preventDefault(), !1
|
||||
}).then(processForgotPasswordResult);
|
||||
e.preventDefault();
|
||||
return false;
|
||||
}
|
||||
view.querySelector("form").addEventListener("submit", onSubmit)
|
||||
}
|
||||
});
|
||||
|
||||
view.querySelector("form").addEventListener("submit", onSubmit);
|
||||
};
|
||||
});
|
||||
|
||||
+44
-21
@@ -1,4 +1,4 @@
|
||||
define(["tabbedView", "globalize", "require", "emby-tabs", "emby-button", "emby-scroller"], function(TabbedView, globalize, require) {
|
||||
define(["tabbedView", "globalize", "require", "emby-tabs", "emby-button", "emby-scroller"], function (TabbedView, globalize, require) {
|
||||
"use strict";
|
||||
|
||||
function getTabs() {
|
||||
@@ -6,47 +6,70 @@ define(["tabbedView", "globalize", "require", "emby-tabs", "emby-button", "emby-
|
||||
name: globalize.translate("Home")
|
||||
}, {
|
||||
name: globalize.translate("Favorites")
|
||||
}]
|
||||
}];
|
||||
}
|
||||
|
||||
function getDefaultTabIndex() {
|
||||
return 0
|
||||
return 0;
|
||||
}
|
||||
|
||||
function getRequirePromise(deps) {
|
||||
return new Promise(function(resolve, reject) {
|
||||
require(deps, resolve)
|
||||
})
|
||||
return new Promise(function (resolve, reject) {
|
||||
require(deps, resolve);
|
||||
});
|
||||
}
|
||||
|
||||
function getTabController(index) {
|
||||
if (null == index) throw new Error("index cannot be null");
|
||||
if (null == index) {
|
||||
throw new Error("index cannot be null");
|
||||
}
|
||||
|
||||
var depends = [];
|
||||
|
||||
switch (index) {
|
||||
case 0:
|
||||
depends.push("controllers/hometab");
|
||||
break;
|
||||
|
||||
case 1:
|
||||
depends.push("controllers/favorites")
|
||||
depends.push("controllers/favorites");
|
||||
}
|
||||
|
||||
var instance = this;
|
||||
return getRequirePromise(depends).then(function(controllerFactory) {
|
||||
return getRequirePromise(depends).then(function (controllerFactory) {
|
||||
var controller = instance.tabControllers[index];
|
||||
|
||||
if (!controller) {
|
||||
controller = new controllerFactory(instance.view.querySelector(".tabContent[data-index='" + index + "']"), instance.params), instance.tabControllers[index] = controller
|
||||
controller = new controllerFactory(instance.view.querySelector(".tabContent[data-index='" + index + "']"), instance.params);
|
||||
instance.tabControllers[index] = controller;
|
||||
}
|
||||
return controller
|
||||
})
|
||||
|
||||
return controller;
|
||||
});
|
||||
}
|
||||
|
||||
function HomeView(view, params) {
|
||||
TabbedView.call(this, view, params)
|
||||
TabbedView.call(this, view, params);
|
||||
}
|
||||
return Object.assign(HomeView.prototype, TabbedView.prototype), HomeView.prototype.getTabs = getTabs, HomeView.prototype.getDefaultTabIndex = getDefaultTabIndex, HomeView.prototype.getTabController = getTabController, HomeView.prototype.setTitle = function() {
|
||||
Emby.Page.setTitle(null)
|
||||
}, HomeView.prototype.onPause = function() {
|
||||
TabbedView.prototype.onPause.call(this), document.querySelector(".skinHeader").classList.remove("noHomeButtonHeader")
|
||||
}, HomeView.prototype.onResume = function(options) {
|
||||
TabbedView.prototype.onResume.call(this, options), document.querySelector(".skinHeader").classList.add("noHomeButtonHeader")
|
||||
}, HomeView
|
||||
});
|
||||
|
||||
Object.assign(HomeView.prototype, TabbedView.prototype);
|
||||
HomeView.prototype.getTabs = getTabs;
|
||||
HomeView.prototype.getDefaultTabIndex = getDefaultTabIndex;
|
||||
HomeView.prototype.getTabController = getTabController;
|
||||
|
||||
HomeView.prototype.setTitle = function () {
|
||||
Emby.Page.setTitle(null);
|
||||
};
|
||||
|
||||
HomeView.prototype.onPause = function () {
|
||||
TabbedView.prototype.onPause.call(this);
|
||||
document.querySelector(".skinHeader").classList.remove("noHomeButtonHeader");
|
||||
};
|
||||
|
||||
HomeView.prototype.onResume = function (options) {
|
||||
TabbedView.prototype.onResume.call(this, options);
|
||||
document.querySelector(".skinHeader").classList.add("noHomeButtonHeader");
|
||||
};
|
||||
|
||||
return HomeView;
|
||||
});
|
||||
|
||||
+61
-22
@@ -1,35 +1,74 @@
|
||||
define(["userSettings", "loading", "connectionManager", "apphost", "layoutManager", "focusManager", "homeSections", "emby-itemscontainer"], function(userSettings, loading, connectionManager, appHost, layoutManager, focusManager, homeSections) {
|
||||
define(["userSettings", "loading", "connectionManager", "apphost", "layoutManager", "focusManager", "homeSections", "emby-itemscontainer"], function (userSettings, loading, connectionManager, appHost, layoutManager, focusManager, homeSections) {
|
||||
"use strict";
|
||||
|
||||
function HomeTab(view, params) {
|
||||
this.view = view, this.params = params, this.apiClient = connectionManager.currentApiClient(), this.sectionsContainer = view.querySelector(".sections"), view.querySelector(".sections").addEventListener("settingschange", onHomeScreenSettingsChanged.bind(this))
|
||||
this.view = view;
|
||||
this.params = params;
|
||||
this.apiClient = connectionManager.currentApiClient();
|
||||
this.sectionsContainer = view.querySelector(".sections");
|
||||
view.querySelector(".sections").addEventListener("settingschange", onHomeScreenSettingsChanged.bind(this));
|
||||
}
|
||||
|
||||
function onHomeScreenSettingsChanged() {
|
||||
this.sectionsRendered = !1, this.paused || this.onResume({
|
||||
refresh: !0
|
||||
})
|
||||
this.sectionsRendered = false;
|
||||
|
||||
if (!this.paused) {
|
||||
this.onResume({
|
||||
refresh: true
|
||||
});
|
||||
}
|
||||
}
|
||||
return HomeTab.prototype.onResume = function(options) {
|
||||
|
||||
HomeTab.prototype.onResume = function (options) {
|
||||
if (this.sectionsRendered) {
|
||||
var sectionsContainer = this.sectionsContainer;
|
||||
return sectionsContainer ? homeSections.resume(sectionsContainer, options) : Promise.resolve()
|
||||
|
||||
if (sectionsContainer) {
|
||||
return homeSections.resume(sectionsContainer, options);
|
||||
}
|
||||
|
||||
return Promise.resolve();
|
||||
}
|
||||
|
||||
loading.show();
|
||||
var view = this.view,
|
||||
apiClient = this.apiClient;
|
||||
return this.destroyHomeSections(), this.sectionsRendered = !0, apiClient.getCurrentUser().then(function(user) {
|
||||
return homeSections.loadSections(view.querySelector(".sections"), apiClient, user, userSettings).then(function() {
|
||||
options.autoFocus && focusManager.autoFocus(view), loading.hide()
|
||||
})
|
||||
})
|
||||
}, HomeTab.prototype.onPause = function() {
|
||||
var view = this.view;
|
||||
var apiClient = this.apiClient;
|
||||
this.destroyHomeSections();
|
||||
this.sectionsRendered = true;
|
||||
return apiClient.getCurrentUser().then(function (user) {
|
||||
return homeSections.loadSections(view.querySelector(".sections"), apiClient, user, userSettings).then(function () {
|
||||
if (options.autoFocus) {
|
||||
focusManager.autoFocus(view);
|
||||
}
|
||||
|
||||
loading.hide();
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
HomeTab.prototype.onPause = function () {
|
||||
var sectionsContainer = this.sectionsContainer;
|
||||
sectionsContainer && homeSections.pause(sectionsContainer)
|
||||
}, HomeTab.prototype.destroy = function() {
|
||||
this.view = null, this.params = null, this.apiClient = null, this.destroyHomeSections(), this.sectionsContainer = null
|
||||
}, HomeTab.prototype.destroyHomeSections = function() {
|
||||
|
||||
if (sectionsContainer) {
|
||||
homeSections.pause(sectionsContainer);
|
||||
}
|
||||
};
|
||||
|
||||
HomeTab.prototype.destroy = function () {
|
||||
this.view = null;
|
||||
this.params = null;
|
||||
this.apiClient = null;
|
||||
this.destroyHomeSections();
|
||||
this.sectionsContainer = null;
|
||||
};
|
||||
|
||||
HomeTab.prototype.destroyHomeSections = function () {
|
||||
var sectionsContainer = this.sectionsContainer;
|
||||
sectionsContainer && homeSections.destroySections(sectionsContainer)
|
||||
}, HomeTab
|
||||
});
|
||||
|
||||
if (sectionsContainer) {
|
||||
homeSections.destroySections(sectionsContainer);
|
||||
}
|
||||
};
|
||||
|
||||
return HomeTab;
|
||||
});
|
||||
|
||||
@@ -1,21 +1,22 @@
|
||||
define(["loading", "libraryMenu", "dom", "globalize", "cardStyle", "emby-button"], function(loading, libraryMenu, dom, globalize) {
|
||||
define(["loading", "libraryMenu", "dom", "globalize", "cardStyle", "emby-button"], function (loading, libraryMenu, dom, globalize) {
|
||||
"use strict";
|
||||
|
||||
function deletePlugin(page, uniqueid, name) {
|
||||
var msg = globalize.translate("UninstallPluginConfirmation").replace("{0}", name);
|
||||
require(["confirm"], function(confirm) {
|
||||
|
||||
require(["confirm"], function (confirm) {
|
||||
confirm({
|
||||
title: globalize.translate("UninstallPluginHeader"),
|
||||
text: msg,
|
||||
primary: "delete",
|
||||
confirmText: globalize.translate("UninstallPluginHeader")
|
||||
}).then(function() {
|
||||
}).then(function () {
|
||||
loading.show();
|
||||
ApiClient.uninstallPlugin(uniqueid).then(function() {
|
||||
ApiClient.uninstallPlugin(uniqueid).then(function () {
|
||||
reloadList(page);
|
||||
});
|
||||
})
|
||||
})
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function showNoConfigurationMessage() {
|
||||
@@ -31,23 +32,24 @@ define(["loading", "libraryMenu", "dom", "globalize", "cardStyle", "emby-button"
|
||||
}
|
||||
|
||||
function getPluginCardHtml(plugin, pluginConfigurationPages) {
|
||||
var configPage = pluginConfigurationPages.filter(function(pluginConfigurationPage) {
|
||||
return pluginConfigurationPage.PluginId == plugin.Id;
|
||||
var configPage = pluginConfigurationPages.filter(function (pluginConfigurationPage) {
|
||||
return pluginConfigurationPage.PluginId == plugin.Id;
|
||||
})[0];
|
||||
var configPageUrl = configPage ? Dashboard.getConfigurationPageUrl(configPage.Name) : null;
|
||||
|
||||
var html = "";
|
||||
html += "<div data-id='" + plugin.Id + "' data-name='" + plugin.Name + "' class='card backdropCard'>";
|
||||
html += '<div class="cardBox visualCardBox">';
|
||||
html += '<div class="cardScalable">';
|
||||
html += '<div class="cardPadder cardPadder-backdrop"></div>';
|
||||
html += configPageUrl ? '<a class="cardContent cardImageContainer" is="emby-linkbutton" href="' + configPageUrl + '">' : '<div class="cardContent noConfigPluginCard noHoverEffect cardImageContainer">';
|
||||
|
||||
if (plugin.ImageUrl) {
|
||||
html += '<div class="cardImage coveredImage" style="background-image:url(\'' + plugin.ImageUrl + "');\">";
|
||||
html += "</div>";
|
||||
} else {
|
||||
html += '<i class="cardImageIcon md-icon"></i>';
|
||||
}
|
||||
|
||||
html += configPageUrl ? "</a>" : "</div>";
|
||||
html += "</div>";
|
||||
html += '<div class="cardFooter">';
|
||||
@@ -67,21 +69,26 @@ define(["loading", "libraryMenu", "dom", "globalize", "cardStyle", "emby-button"
|
||||
}
|
||||
|
||||
function renderPlugins(page, plugins) {
|
||||
ApiClient.getJSON(ApiClient.getUrl("web/configurationpages") + "?pageType=PluginConfiguration").then(function(configPages) {
|
||||
ApiClient.getJSON(ApiClient.getUrl("web/configurationpages") + "?pageType=PluginConfiguration").then(function (configPages) {
|
||||
populateList(page, plugins, configPages);
|
||||
});
|
||||
}
|
||||
|
||||
function populateList(page, plugins, pluginConfigurationPages) {
|
||||
plugins = plugins.sort(function(plugin1, plugin2) {
|
||||
return plugin1.Name > plugin2.Name ? 1 : -1
|
||||
plugins = plugins.sort(function (plugin1, plugin2) {
|
||||
if (plugin1.Name > plugin2.Name) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
return -1;
|
||||
});
|
||||
var html = plugins.map(function(p) {
|
||||
return getPluginCardHtml(p, pluginConfigurationPages)
|
||||
var html = plugins.map(function (p) {
|
||||
return getPluginCardHtml(p, pluginConfigurationPages);
|
||||
}).join("");
|
||||
var installedPluginsElement = page.querySelector(".installedPlugins");
|
||||
installedPluginsElement.removeEventListener("click", onInstalledPluginsClick);
|
||||
installedPluginsElement.addEventListener("click", onInstalledPluginsClick);
|
||||
|
||||
if (plugins.length) {
|
||||
installedPluginsElement.classList.add("itemsContainer");
|
||||
installedPluginsElement.classList.add("vertical-wrap");
|
||||
@@ -93,6 +100,7 @@ define(["loading", "libraryMenu", "dom", "globalize", "cardStyle", "emby-button"
|
||||
html += "</a></p>";
|
||||
html += "</div>";
|
||||
}
|
||||
|
||||
installedPluginsElement.innerHTML = html;
|
||||
loading.hide();
|
||||
}
|
||||
@@ -103,6 +111,7 @@ define(["loading", "libraryMenu", "dom", "globalize", "cardStyle", "emby-button"
|
||||
var name = card.getAttribute("data-name");
|
||||
var configHref = card.querySelector(".cardContent").getAttribute("href");
|
||||
var menuItems = [];
|
||||
|
||||
if (configHref) {
|
||||
menuItems.push({
|
||||
name: globalize.translate("ButtonSettings"),
|
||||
@@ -110,22 +119,25 @@ define(["loading", "libraryMenu", "dom", "globalize", "cardStyle", "emby-button"
|
||||
ironIcon: "mode-edit"
|
||||
});
|
||||
}
|
||||
|
||||
menuItems.push({
|
||||
name: globalize.translate("ButtonUninstall"),
|
||||
id: "delete",
|
||||
ironIcon: "delete"
|
||||
});
|
||||
require(["actionsheet"], function(actionsheet) {
|
||||
|
||||
require(["actionsheet"], function (actionsheet) {
|
||||
actionsheet.show({
|
||||
items: menuItems,
|
||||
positionTo: elem,
|
||||
callback: function(resultId) {
|
||||
callback: function (resultId) {
|
||||
switch (resultId) {
|
||||
case "open":
|
||||
Dashboard.navigate(configHref);
|
||||
break;
|
||||
|
||||
case "delete":
|
||||
deletePlugin(page, id, name)
|
||||
deletePlugin(page, id, name);
|
||||
}
|
||||
}
|
||||
});
|
||||
@@ -134,7 +146,7 @@ define(["loading", "libraryMenu", "dom", "globalize", "cardStyle", "emby-button"
|
||||
|
||||
function reloadList(page) {
|
||||
loading.show();
|
||||
ApiClient.getInstalledPlugins().then(function(plugins) {
|
||||
ApiClient.getInstalledPlugins().then(function (plugins) {
|
||||
renderPlugins(page, plugins);
|
||||
});
|
||||
}
|
||||
@@ -146,7 +158,7 @@ define(["loading", "libraryMenu", "dom", "globalize", "cardStyle", "emby-button"
|
||||
}, {
|
||||
href: "availableplugins.html",
|
||||
name: globalize.translate("TabCatalog")
|
||||
}]
|
||||
}];
|
||||
}
|
||||
|
||||
function onInstalledPluginsClick(e) {
|
||||
@@ -156,16 +168,18 @@ define(["loading", "libraryMenu", "dom", "globalize", "cardStyle", "emby-button"
|
||||
showConnectMessage();
|
||||
} else {
|
||||
var btnCardMenu = dom.parentWithClass(e.target, "btnCardMenu");
|
||||
btnCardMenu && showPluginMenu(dom.parentWithClass(btnCardMenu, "page"), btnCardMenu);
|
||||
|
||||
if (btnCardMenu) {
|
||||
showPluginMenu(dom.parentWithClass(btnCardMenu, "page"), btnCardMenu);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pageIdOn("pageshow", "pluginsPage", function() {
|
||||
pageIdOn("pageshow", "pluginsPage", function () {
|
||||
libraryMenu.setTabs("plugins", 0, getTabs);
|
||||
reloadList(this);
|
||||
});
|
||||
|
||||
window.PluginsPage = {
|
||||
renderPlugins: renderPlugins
|
||||
}
|
||||
};
|
||||
});
|
||||
|
||||
+1605
-777
File diff suppressed because it is too large
Load Diff
+945
-201
File diff suppressed because it is too large
Load Diff
@@ -1,89 +1,119 @@
|
||||
define(["cardBuilder", "imageLoader", "libraryBrowser", "loading", "events", "emby-itemscontainer"], function(cardBuilder, imageLoader, libraryBrowser, loading, events) {
|
||||
define(["cardBuilder", "imageLoader", "libraryBrowser", "loading", "events", "emby-itemscontainer"], function (cardBuilder, imageLoader, libraryBrowser, loading, events) {
|
||||
"use strict";
|
||||
return function(view, params, tabContent) {
|
||||
|
||||
return function (view, params, tabContent) {
|
||||
function getPageData() {
|
||||
return pageData || (pageData = {
|
||||
query: {
|
||||
StartIndex: 0,
|
||||
Limit: 100,
|
||||
Fields: "PrimaryImageAspectRatio"
|
||||
}
|
||||
}), pageData
|
||||
if (!pageData) {
|
||||
pageData = {
|
||||
query: {
|
||||
StartIndex: 0,
|
||||
Limit: 100,
|
||||
Fields: "PrimaryImageAspectRatio"
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
return pageData;
|
||||
}
|
||||
|
||||
function getQuery() {
|
||||
return getPageData().query
|
||||
return getPageData().query;
|
||||
}
|
||||
|
||||
function getChannelsHtml(channels) {
|
||||
return cardBuilder.getCardsHtml({
|
||||
items: channels,
|
||||
shape: "square",
|
||||
showTitle: !0,
|
||||
lazy: !0,
|
||||
cardLayout: !0,
|
||||
showDetailsMenu: !0,
|
||||
showCurrentProgram: !0,
|
||||
showCurrentProgramTime: !0
|
||||
})
|
||||
showTitle: true,
|
||||
lazy: true,
|
||||
cardLayout: true,
|
||||
showDetailsMenu: true,
|
||||
showCurrentProgram: true,
|
||||
showCurrentProgramTime: true
|
||||
});
|
||||
}
|
||||
|
||||
function renderChannels(context, result) {
|
||||
function onNextPageClick() {
|
||||
if (isLoading) return;
|
||||
query.StartIndex += query.Limit, reloadItems(context)
|
||||
if (isLoading) {
|
||||
return;
|
||||
}
|
||||
|
||||
query.StartIndex += query.Limit;
|
||||
reloadItems(context);
|
||||
}
|
||||
|
||||
function onPreviousPageClick() {
|
||||
if (isLoading) return;
|
||||
query.StartIndex -= query.Limit, reloadItems(context)
|
||||
if (isLoading) {
|
||||
return;
|
||||
}
|
||||
|
||||
query.StartIndex -= query.Limit;
|
||||
reloadItems(context);
|
||||
}
|
||||
|
||||
var query = getQuery();
|
||||
context.querySelector(".paging").innerHTML = libraryBrowser.getQueryPagingHtml({
|
||||
startIndex: query.StartIndex,
|
||||
limit: query.Limit,
|
||||
totalRecordCount: result.TotalRecordCount,
|
||||
showLimit: !1,
|
||||
updatePageSizeSetting: !1,
|
||||
filterButton: !1
|
||||
showLimit: false,
|
||||
updatePageSizeSetting: false,
|
||||
filterButton: false
|
||||
});
|
||||
var html = getChannelsHtml(result.Items),
|
||||
elem = context.querySelector("#items");
|
||||
elem.innerHTML = html, imageLoader.lazyChildren(elem);
|
||||
var i, length, elems;
|
||||
for (elems = context.querySelectorAll(".btnNextPage"), i = 0, length = elems.length; i < length; i++) elems[i].addEventListener("click", onNextPageClick);
|
||||
for (elems = context.querySelectorAll(".btnPreviousPage"), i = 0, length = elems.length; i < length; i++) elems[i].addEventListener("click", onPreviousPageClick)
|
||||
var html = getChannelsHtml(result.Items);
|
||||
var elem = context.querySelector("#items");
|
||||
elem.innerHTML = html;
|
||||
imageLoader.lazyChildren(elem);
|
||||
var i;
|
||||
var length;
|
||||
var elems;
|
||||
|
||||
for (elems = context.querySelectorAll(".btnNextPage"), i = 0, length = elems.length; i < length; i++) {
|
||||
elems[i].addEventListener("click", onNextPageClick);
|
||||
}
|
||||
|
||||
for (elems = context.querySelectorAll(".btnPreviousPage"), i = 0, length = elems.length; i < length; i++) {
|
||||
elems[i].addEventListener("click", onPreviousPageClick);
|
||||
}
|
||||
}
|
||||
|
||||
function showFilterMenu(context) {
|
||||
require(["components/filterdialog/filterdialog"], function(filterDialogFactory) {
|
||||
require(["components/filterdialog/filterdialog"], function (filterDialogFactory) {
|
||||
var filterDialog = new filterDialogFactory({
|
||||
query: getQuery(),
|
||||
mode: "livetvchannels",
|
||||
serverId: ApiClient.serverId()
|
||||
});
|
||||
events.on(filterDialog, "filterchange", function() {
|
||||
reloadItems(context)
|
||||
}), filterDialog.show()
|
||||
})
|
||||
events.on(filterDialog, "filterchange", function () {
|
||||
reloadItems(context);
|
||||
});
|
||||
filterDialog.show();
|
||||
});
|
||||
}
|
||||
|
||||
function reloadItems(context, save) {
|
||||
loading.show();
|
||||
isLoading = true;
|
||||
var query = getQuery(),
|
||||
apiClient = ApiClient;
|
||||
query.UserId = apiClient.getCurrentUserId(), apiClient.getLiveTvChannels(query).then(function(result) {
|
||||
var query = getQuery();
|
||||
var apiClient = ApiClient;
|
||||
query.UserId = apiClient.getCurrentUserId();
|
||||
apiClient.getLiveTvChannels(query).then(function (result) {
|
||||
renderChannels(context, result);
|
||||
loading.hide();
|
||||
isLoading = false;
|
||||
})
|
||||
});
|
||||
}
|
||||
var pageData, self = this, isLoading = false;
|
||||
tabContent.querySelector(".btnFilter").addEventListener("click", function() {
|
||||
showFilterMenu(tabContent)
|
||||
}), self.renderTab = function() {
|
||||
reloadItems(tabContent)
|
||||
}
|
||||
}
|
||||
|
||||
var pageData;
|
||||
var self = this;
|
||||
var isLoading = false;
|
||||
tabContent.querySelector(".btnFilter").addEventListener("click", function () {
|
||||
showFilterMenu(tabContent);
|
||||
});
|
||||
|
||||
self.renderTab = function () {
|
||||
reloadItems(tabContent);
|
||||
};
|
||||
};
|
||||
});
|
||||
|
||||
@@ -1,16 +1,29 @@
|
||||
define(["tvguide"], function(tvguide) {
|
||||
define(["tvguide"], function (tvguide) {
|
||||
"use strict";
|
||||
return function(view, params, tabContent) {
|
||||
var guideInstance, self = this;
|
||||
self.renderTab = function() {
|
||||
guideInstance || (guideInstance = new tvguide({
|
||||
element: tabContent,
|
||||
serverId: ApiClient.serverId()
|
||||
}))
|
||||
}, self.onShow = function() {
|
||||
guideInstance && guideInstance.resume()
|
||||
}, self.onHide = function() {
|
||||
guideInstance && guideInstance.pause()
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
return function (view, params, tabContent) {
|
||||
var guideInstance;
|
||||
var self = this;
|
||||
|
||||
self.renderTab = function () {
|
||||
if (!guideInstance) {
|
||||
guideInstance = new tvguide({
|
||||
element: tabContent,
|
||||
serverId: ApiClient.serverId()
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
self.onShow = function () {
|
||||
if (guideInstance) {
|
||||
guideInstance.resume();
|
||||
}
|
||||
};
|
||||
|
||||
self.onHide = function () {
|
||||
if (guideInstance) {
|
||||
guideInstance.pause();
|
||||
}
|
||||
};
|
||||
};
|
||||
});
|
||||
|
||||
@@ -1,69 +1,106 @@
|
||||
define(["layoutManager", "loading", "cardBuilder", "apphost", "imageLoader", "scripts/livetvcomponents", "listViewStyle", "emby-itemscontainer"], function(layoutManager, loading, cardBuilder, appHost, imageLoader) {
|
||||
define(["layoutManager", "loading", "cardBuilder", "apphost", "imageLoader", "scripts/livetvcomponents", "listViewStyle", "emby-itemscontainer"], function (layoutManager, loading, cardBuilder, appHost, imageLoader) {
|
||||
"use strict";
|
||||
|
||||
function renderRecordings(elem, recordings, cardOptions, scrollX) {
|
||||
recordings.length ? elem.classList.remove("hide") : elem.classList.add("hide");
|
||||
if (recordings.length) {
|
||||
elem.classList.remove("hide");
|
||||
} else {
|
||||
elem.classList.add("hide");
|
||||
}
|
||||
|
||||
var recordingItems = elem.querySelector(".recordingItems");
|
||||
scrollX ? (recordingItems.classList.add("scrollX"), recordingItems.classList.add("hiddenScrollX"), recordingItems.classList.remove("vertical-wrap")) : (recordingItems.classList.remove("scrollX"), recordingItems.classList.remove("hiddenScrollX"), recordingItems.classList.add("vertical-wrap"));
|
||||
|
||||
if (scrollX) {
|
||||
recordingItems.classList.add("scrollX");
|
||||
recordingItems.classList.add("hiddenScrollX");
|
||||
recordingItems.classList.remove("vertical-wrap");
|
||||
} else {
|
||||
recordingItems.classList.remove("scrollX");
|
||||
recordingItems.classList.remove("hiddenScrollX");
|
||||
recordingItems.classList.add("vertical-wrap");
|
||||
}
|
||||
|
||||
appHost.supports("imageanalysis");
|
||||
recordingItems.innerHTML = cardBuilder.getCardsHtml(Object.assign({
|
||||
items: recordings,
|
||||
shape: scrollX ? "autooverflow" : "auto",
|
||||
defaultShape: scrollX ? "overflowBackdrop" : "backdrop",
|
||||
showTitle: !0,
|
||||
showParentTitle: !0,
|
||||
coverImage: !0,
|
||||
cardLayout: !1,
|
||||
centerText: !0,
|
||||
showTitle: true,
|
||||
showParentTitle: true,
|
||||
coverImage: true,
|
||||
cardLayout: false,
|
||||
centerText: true,
|
||||
allowBottomPadding: !scrollX,
|
||||
preferThumb: "auto",
|
||||
overlayText: !1
|
||||
}, cardOptions || {})), imageLoader.lazyChildren(recordingItems)
|
||||
overlayText: false
|
||||
}, cardOptions || {}));
|
||||
imageLoader.lazyChildren(recordingItems);
|
||||
}
|
||||
|
||||
function renderLatestRecordings(context, promise) {
|
||||
promise.then(function(result) {
|
||||
promise.then(function (result) {
|
||||
renderRecordings(context.querySelector("#latestRecordings"), result.Items, {
|
||||
showYear: !0,
|
||||
showYear: true,
|
||||
lines: 2
|
||||
}, !1), loading.hide()
|
||||
})
|
||||
}, false);
|
||||
loading.hide();
|
||||
});
|
||||
}
|
||||
|
||||
function renderRecordingFolders(context, promise) {
|
||||
promise.then(function(result) {
|
||||
promise.then(function (result) {
|
||||
renderRecordings(context.querySelector("#recordingFolders"), result.Items, {
|
||||
showYear: !1,
|
||||
showParentTitle: !1
|
||||
}, !1)
|
||||
})
|
||||
showYear: false,
|
||||
showParentTitle: false
|
||||
}, false);
|
||||
});
|
||||
}
|
||||
|
||||
function onMoreClick(e) {
|
||||
var type = this.getAttribute("data-type"),
|
||||
serverId = ApiClient.serverId();
|
||||
var type = this.getAttribute("data-type");
|
||||
var serverId = ApiClient.serverId();
|
||||
|
||||
switch (type) {
|
||||
case "latest":
|
||||
Dashboard.navigate("list.html?type=Recordings&serverId=" + serverId)
|
||||
Dashboard.navigate("list.html?type=Recordings&serverId=" + serverId);
|
||||
}
|
||||
}
|
||||
return function(view, params, tabContent) {
|
||||
|
||||
return function (view, params, tabContent) {
|
||||
function enableFullRender() {
|
||||
return (new Date).getTime() - lastFullRender > 3e5
|
||||
return new Date().getTime() - lastFullRender > 300000;
|
||||
}
|
||||
var foldersPromise, latestPromise, self = this,
|
||||
lastFullRender = 0;
|
||||
for (var moreButtons = tabContent.querySelectorAll(".more"), i = 0, length = moreButtons.length; i < length; i++) moreButtons[i].addEventListener("click", onMoreClick);
|
||||
self.preRender = function() {
|
||||
enableFullRender() && (latestPromise = ApiClient.getLiveTvRecordings({
|
||||
UserId: Dashboard.getCurrentUserId(),
|
||||
Limit: 12,
|
||||
Fields: "CanDelete,PrimaryImageAspectRatio,BasicSyncInfo",
|
||||
EnableTotalRecordCount: !1,
|
||||
EnableImageTypes: "Primary,Thumb,Backdrop"
|
||||
}), foldersPromise = ApiClient.getRecordingFolders(Dashboard.getCurrentUserId()))
|
||||
}, self.renderTab = function() {
|
||||
enableFullRender() && (loading.show(), renderLatestRecordings(tabContent, latestPromise), renderRecordingFolders(tabContent, foldersPromise), lastFullRender = (new Date).getTime())
|
||||
|
||||
var foldersPromise;
|
||||
var latestPromise;
|
||||
var self = this;
|
||||
var lastFullRender = 0;
|
||||
var moreButtons = tabContent.querySelectorAll(".more");
|
||||
|
||||
for (var i = 0, length = moreButtons.length; i < length; i++) {
|
||||
moreButtons[i].addEventListener("click", onMoreClick);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
self.preRender = function () {
|
||||
if (enableFullRender()) {
|
||||
latestPromise = ApiClient.getLiveTvRecordings({
|
||||
UserId: Dashboard.getCurrentUserId(),
|
||||
Limit: 12,
|
||||
Fields: "CanDelete,PrimaryImageAspectRatio,BasicSyncInfo",
|
||||
EnableTotalRecordCount: false,
|
||||
EnableImageTypes: "Primary,Thumb,Backdrop"
|
||||
});
|
||||
foldersPromise = ApiClient.getRecordingFolders(Dashboard.getCurrentUserId());
|
||||
}
|
||||
};
|
||||
|
||||
self.renderTab = function () {
|
||||
if (enableFullRender()) {
|
||||
loading.show();
|
||||
renderLatestRecordings(tabContent, latestPromise);
|
||||
renderRecordingFolders(tabContent, foldersPromise);
|
||||
lastFullRender = new Date().getTime();
|
||||
}
|
||||
};
|
||||
};
|
||||
});
|
||||
|
||||
@@ -1,27 +1,50 @@
|
||||
define(["layoutManager", "cardBuilder", "apphost", "imageLoader", "loading", "scripts/livetvcomponents", "emby-button", "emby-itemscontainer"], function(layoutManager, cardBuilder, appHost, imageLoader, loading) {
|
||||
define(["layoutManager", "cardBuilder", "apphost", "imageLoader", "loading", "scripts/livetvcomponents", "emby-button", "emby-itemscontainer"], function (layoutManager, cardBuilder, appHost, imageLoader, loading) {
|
||||
"use strict";
|
||||
|
||||
function enableScrollX() {
|
||||
return !layoutManager.desktop
|
||||
return !layoutManager.desktop;
|
||||
}
|
||||
|
||||
function renderRecordings(elem, recordings, cardOptions) {
|
||||
recordings.length ? elem.classList.remove("hide") : elem.classList.add("hide");
|
||||
if (recordings.length) {
|
||||
elem.classList.remove("hide");
|
||||
} else {
|
||||
elem.classList.add("hide");
|
||||
}
|
||||
|
||||
var recordingItems = elem.querySelector(".recordingItems");
|
||||
enableScrollX() ? (recordingItems.classList.add("scrollX"), layoutManager.tv && recordingItems.classList.add("smoothScrollX"), recordingItems.classList.add("hiddenScrollX"), recordingItems.classList.remove("vertical-wrap")) : (recordingItems.classList.remove("scrollX"), recordingItems.classList.remove("smoothScrollX"), recordingItems.classList.remove("hiddenScrollX"), recordingItems.classList.add("vertical-wrap"));
|
||||
var supportsImageAnalysis = appHost.supports("imageanalysis"),
|
||||
cardLayout = appHost.preferVisualCards || supportsImageAnalysis;
|
||||
cardLayout = !1, recordingItems.innerHTML = cardBuilder.getCardsHtml(Object.assign({
|
||||
|
||||
if (enableScrollX()) {
|
||||
recordingItems.classList.add("scrollX");
|
||||
|
||||
if (layoutManager.tv) {
|
||||
recordingItems.classList.add("smoothScrollX");
|
||||
}
|
||||
|
||||
recordingItems.classList.add("hiddenScrollX");
|
||||
recordingItems.classList.remove("vertical-wrap");
|
||||
} else {
|
||||
recordingItems.classList.remove("scrollX");
|
||||
recordingItems.classList.remove("smoothScrollX");
|
||||
recordingItems.classList.remove("hiddenScrollX");
|
||||
recordingItems.classList.add("vertical-wrap");
|
||||
}
|
||||
|
||||
var supportsImageAnalysis = appHost.supports("imageanalysis");
|
||||
var cardLayout = appHost.preferVisualCards || supportsImageAnalysis;
|
||||
cardLayout = false;
|
||||
recordingItems.innerHTML = cardBuilder.getCardsHtml(Object.assign({
|
||||
items: recordings,
|
||||
shape: enableScrollX() ? "autooverflow" : "auto",
|
||||
showTitle: !0,
|
||||
showParentTitle: !0,
|
||||
coverImage: !0,
|
||||
showTitle: true,
|
||||
showParentTitle: true,
|
||||
coverImage: true,
|
||||
cardLayout: cardLayout,
|
||||
centerText: !cardLayout,
|
||||
allowBottomPadding: !enableScrollX(),
|
||||
preferThumb: "auto"
|
||||
}, cardOptions || {})), imageLoader.lazyChildren(recordingItems)
|
||||
}, cardOptions || {}));
|
||||
imageLoader.lazyChildren(recordingItems);
|
||||
}
|
||||
|
||||
function getBackdropShape() {
|
||||
@@ -29,52 +52,72 @@ define(["layoutManager", "cardBuilder", "apphost", "imageLoader", "loading", "sc
|
||||
}
|
||||
|
||||
function renderActiveRecordings(context, promise) {
|
||||
promise.then(function(result) {
|
||||
promise.then(function (result) {
|
||||
renderRecordings(context.querySelector("#activeRecordings"), result.Items, {
|
||||
shape: enableScrollX() ? "autooverflow" : "auto",
|
||||
defaultShape: getBackdropShape(),
|
||||
showParentTitle: !1,
|
||||
showParentTitleOrTitle: !0,
|
||||
showTitle: !1,
|
||||
showAirTime: !0,
|
||||
showAirEndTime: !0,
|
||||
showChannelName: !0,
|
||||
coverImage: !0,
|
||||
overlayText: !1,
|
||||
overlayMoreButton: !0
|
||||
})
|
||||
})
|
||||
showParentTitle: false,
|
||||
showParentTitleOrTitle: true,
|
||||
showTitle: false,
|
||||
showAirTime: true,
|
||||
showAirEndTime: true,
|
||||
showChannelName: true,
|
||||
coverImage: true,
|
||||
overlayText: false,
|
||||
overlayMoreButton: true
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function renderTimers(context, timers, options) {
|
||||
LiveTvHelpers.getTimersHtml(timers, options).then(function(html) {
|
||||
LiveTvHelpers.getTimersHtml(timers, options).then(function (html) {
|
||||
var elem = context;
|
||||
html ? elem.classList.remove("hide") : elem.classList.add("hide"), elem.querySelector(".recordingItems").innerHTML = html, imageLoader.lazyChildren(elem)
|
||||
})
|
||||
|
||||
if (html) {
|
||||
elem.classList.remove("hide");
|
||||
} else {
|
||||
elem.classList.add("hide");
|
||||
}
|
||||
|
||||
elem.querySelector(".recordingItems").innerHTML = html;
|
||||
imageLoader.lazyChildren(elem);
|
||||
});
|
||||
}
|
||||
|
||||
function renderUpcomingRecordings(context, promise) {
|
||||
promise.then(function(result) {
|
||||
renderTimers(context.querySelector("#upcomingRecordings"), result.Items), loading.hide()
|
||||
})
|
||||
promise.then(function (result) {
|
||||
renderTimers(context.querySelector("#upcomingRecordings"), result.Items);
|
||||
loading.hide();
|
||||
});
|
||||
}
|
||||
return function(view, params, tabContent) {
|
||||
var activeRecordingsPromise, upcomingRecordingsPromise, self = this;
|
||||
tabContent.querySelector("#upcomingRecordings .recordingItems").addEventListener("timercancelled", function() {
|
||||
self.preRender(), self.renderTab()
|
||||
}), self.preRender = function() {
|
||||
|
||||
return function (view, params, tabContent) {
|
||||
var activeRecordingsPromise;
|
||||
var upcomingRecordingsPromise;
|
||||
var self = this;
|
||||
tabContent.querySelector("#upcomingRecordings .recordingItems").addEventListener("timercancelled", function () {
|
||||
self.preRender();
|
||||
self.renderTab();
|
||||
});
|
||||
|
||||
self.preRender = function () {
|
||||
activeRecordingsPromise = ApiClient.getLiveTvRecordings({
|
||||
UserId: Dashboard.getCurrentUserId(),
|
||||
IsInProgress: !0,
|
||||
IsInProgress: true,
|
||||
Fields: "CanDelete,PrimaryImageAspectRatio,BasicSyncInfo",
|
||||
EnableTotalRecordCount: !1,
|
||||
EnableTotalRecordCount: false,
|
||||
EnableImageTypes: "Primary,Thumb,Backdrop"
|
||||
}), upcomingRecordingsPromise = ApiClient.getLiveTvTimers({
|
||||
IsActive: !1,
|
||||
IsScheduled: !0
|
||||
})
|
||||
}, self.renderTab = function() {
|
||||
loading.show(), renderActiveRecordings(tabContent, activeRecordingsPromise), renderUpcomingRecordings(tabContent, upcomingRecordingsPromise)
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
upcomingRecordingsPromise = ApiClient.getLiveTvTimers({
|
||||
IsActive: false,
|
||||
IsScheduled: true
|
||||
});
|
||||
};
|
||||
|
||||
self.renderTab = function () {
|
||||
loading.show();
|
||||
renderActiveRecordings(tabContent, activeRecordingsPromise);
|
||||
renderUpcomingRecordings(tabContent, upcomingRecordingsPromise);
|
||||
};
|
||||
};
|
||||
});
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
define(["datetime", "cardBuilder", "imageLoader", "apphost", "loading", "paper-icon-button-light", "emby-button"], function(datetime, cardBuilder, imageLoader, appHost, loading) {
|
||||
define(["datetime", "cardBuilder", "imageLoader", "apphost", "loading", "paper-icon-button-light", "emby-button"], function (datetime, cardBuilder, imageLoader, appHost, loading) {
|
||||
"use strict";
|
||||
|
||||
function renderTimers(context, timers) {
|
||||
@@ -8,36 +8,44 @@ define(["datetime", "cardBuilder", "imageLoader", "apphost", "loading", "paper-i
|
||||
items: timers,
|
||||
shape: "auto",
|
||||
defaultShape: "portrait",
|
||||
showTitle: !0,
|
||||
cardLayout: !1,
|
||||
showTitle: true,
|
||||
cardLayout: false,
|
||||
preferThumb: "auto",
|
||||
coverImage: !0,
|
||||
overlayText: !1,
|
||||
showSeriesTimerTime: !0,
|
||||
showSeriesTimerChannel: !0,
|
||||
centerText: !0,
|
||||
overlayMoreButton: !0,
|
||||
coverImage: true,
|
||||
overlayText: false,
|
||||
showSeriesTimerTime: true,
|
||||
showSeriesTimerChannel: true,
|
||||
centerText: true,
|
||||
overlayMoreButton: true,
|
||||
lines: 3
|
||||
});
|
||||
var elem = context.querySelector("#items");
|
||||
elem.innerHTML = html, imageLoader.lazyChildren(elem), loading.hide()
|
||||
elem.innerHTML = html;
|
||||
imageLoader.lazyChildren(elem);
|
||||
loading.hide();
|
||||
}
|
||||
|
||||
function reload(context, promise) {
|
||||
loading.show(), promise.then(function(result) {
|
||||
renderTimers(context, result.Items)
|
||||
})
|
||||
loading.show();
|
||||
promise.then(function (result) {
|
||||
renderTimers(context, result.Items);
|
||||
});
|
||||
}
|
||||
|
||||
var query = {
|
||||
SortBy: "SortName",
|
||||
SortOrder: "Ascending"
|
||||
};
|
||||
return function(view, params, tabContent) {
|
||||
var timersPromise, self = this;
|
||||
self.preRender = function() {
|
||||
timersPromise = ApiClient.getLiveTvSeriesTimers(query)
|
||||
}, self.renderTab = function() {
|
||||
reload(tabContent, timersPromise)
|
||||
}
|
||||
}
|
||||
});
|
||||
return function (view, params, tabContent) {
|
||||
var timersPromise;
|
||||
var self = this;
|
||||
|
||||
self.preRender = function () {
|
||||
timersPromise = ApiClient.getLiveTvSeriesTimers(query);
|
||||
};
|
||||
|
||||
self.renderTab = function () {
|
||||
reload(tabContent, timersPromise);
|
||||
};
|
||||
};
|
||||
});
|
||||
|
||||
@@ -23,6 +23,7 @@ define(["layoutManager", "userSettings", "inputManager", "loading", "globalize",
|
||||
if (enableScrollX()) {
|
||||
return 12;
|
||||
}
|
||||
|
||||
return 9;
|
||||
}
|
||||
|
||||
@@ -150,15 +151,22 @@ define(["layoutManager", "userSettings", "inputManager", "loading", "globalize",
|
||||
}
|
||||
|
||||
function getTabs() {
|
||||
return [
|
||||
{ name: globalize.translate("Programs") },
|
||||
{ name: globalize.translate("TabGuide") },
|
||||
{ name: globalize.translate("TabChannels") },
|
||||
{ name: globalize.translate("TabRecordings") },
|
||||
{ name: globalize.translate("HeaderSchedule") },
|
||||
{ name: globalize.translate("TabSeries") },
|
||||
{ name: globalize.translate("ButtonSearch"), cssClass: "searchTabButton" }
|
||||
];
|
||||
return [{
|
||||
name: globalize.translate("Programs")
|
||||
}, {
|
||||
name: globalize.translate("TabGuide")
|
||||
}, {
|
||||
name: globalize.translate("TabChannels")
|
||||
}, {
|
||||
name: globalize.translate("TabRecordings")
|
||||
}, {
|
||||
name: globalize.translate("HeaderSchedule")
|
||||
}, {
|
||||
name: globalize.translate("TabSeries")
|
||||
}, {
|
||||
name: globalize.translate("ButtonSearch"),
|
||||
cssClass: "searchTabButton"
|
||||
}];
|
||||
}
|
||||
|
||||
function setScrollClasses(elem, scrollX) {
|
||||
@@ -183,6 +191,7 @@ define(["layoutManager", "userSettings", "inputManager", "loading", "globalize",
|
||||
if (userSettings.get("landing-" + folderId) === "guide") {
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -220,21 +229,27 @@ define(["layoutManager", "userSettings", "inputManager", "loading", "globalize",
|
||||
switch (index) {
|
||||
case 0:
|
||||
break;
|
||||
|
||||
case 1:
|
||||
depends.push("controllers/livetv/livetvguide");
|
||||
break;
|
||||
|
||||
case 2:
|
||||
depends.push("controllers/livetv/livetvchannels");
|
||||
break;
|
||||
|
||||
case 3:
|
||||
depends.push("controllers/livetv/livetvrecordings");
|
||||
break;
|
||||
|
||||
case 4:
|
||||
depends.push("controllers/livetv/livetvschedule");
|
||||
break;
|
||||
|
||||
case 5:
|
||||
depends.push("controllers/livetv/livetvseriestimers");
|
||||
break;
|
||||
|
||||
case 6:
|
||||
depends.push("scripts/searchtab");
|
||||
}
|
||||
@@ -251,6 +266,7 @@ define(["layoutManager", "userSettings", "inputManager", "loading", "globalize",
|
||||
|
||||
if (!controller) {
|
||||
tabContent = view.querySelector(".pageTabContent[data-index='" + index + "']");
|
||||
|
||||
if (0 === index) {
|
||||
controller = self;
|
||||
} else if (6 === index) {
|
||||
@@ -260,6 +276,7 @@ define(["layoutManager", "userSettings", "inputManager", "loading", "globalize",
|
||||
} else {
|
||||
controller = new controllerFactory(view, params, tabContent);
|
||||
}
|
||||
|
||||
tabControllers[index] = controller;
|
||||
|
||||
if (controller.initTab) {
|
||||
@@ -347,15 +364,18 @@ define(["layoutManager", "userSettings", "inputManager", "loading", "globalize",
|
||||
});
|
||||
view.addEventListener("viewshow", function (evt) {
|
||||
isViewRestored = evt.detail.isRestored;
|
||||
|
||||
if (!isViewRestored) {
|
||||
mainTabsManager.selectedTabIndex(initialTabIndex);
|
||||
}
|
||||
|
||||
inputManager.on(window, onInputCommand);
|
||||
});
|
||||
view.addEventListener("viewbeforehide", function (e__u) {
|
||||
view.addEventListener("viewbeforehide", function (e) {
|
||||
if (currentTabController && currentTabController.onHide) {
|
||||
currentTabController.onHide();
|
||||
}
|
||||
|
||||
inputManager.off(window, onInputCommand);
|
||||
});
|
||||
view.addEventListener("viewdestroy", function (evt) {
|
||||
|
||||
@@ -1,26 +1,30 @@
|
||||
define(["events", "loading"], function(events, loading) {
|
||||
define(["events", "loading"], function (events, loading) {
|
||||
"use strict";
|
||||
|
||||
function onListingsSubmitted() {
|
||||
Dashboard.navigate("livetvstatus.html")
|
||||
Dashboard.navigate("livetvstatus.html");
|
||||
}
|
||||
|
||||
function init(page, type, providerId) {
|
||||
var url = "components/tvproviders/" + type + ".js";
|
||||
require([url], function(factory) {
|
||||
|
||||
require([url], function (factory) {
|
||||
var instance = new factory(page, providerId, {});
|
||||
events.on(instance, "submitted", onListingsSubmitted), instance.init()
|
||||
})
|
||||
events.on(instance, "submitted", onListingsSubmitted);
|
||||
instance.init();
|
||||
});
|
||||
}
|
||||
|
||||
function loadTemplate(page, type, providerId) {
|
||||
require(["text!./components/tvproviders/" + type + ".template.html"], function(html) {
|
||||
page.querySelector(".providerTemplate").innerHTML = Globalize.translateDocument(html), init(page, type, providerId)
|
||||
})
|
||||
require(["text!./components/tvproviders/" + type + ".template.html"], function (html) {
|
||||
page.querySelector(".providerTemplate").innerHTML = Globalize.translateDocument(html);
|
||||
init(page, type, providerId);
|
||||
});
|
||||
}
|
||||
pageIdOn("pageshow", "liveTvGuideProviderPage", function() {
|
||||
|
||||
pageIdOn("pageshow", "liveTvGuideProviderPage", function () {
|
||||
loading.show();
|
||||
var providerId = getParameterByName("id");
|
||||
loadTemplate(this, getParameterByName("type"), providerId)
|
||||
})
|
||||
});
|
||||
loadTemplate(this, getParameterByName("type"), providerId);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -1,79 +1,127 @@
|
||||
define(["jQuery", "loading", "fnchecked", "emby-button"], function($, loading) {
|
||||
define(["jQuery", "loading", "fnchecked", "emby-button"], function ($, loading) {
|
||||
"use strict";
|
||||
|
||||
function loadPage(page, config) {
|
||||
$(".liveTvSettingsForm", page).show(), $(".noLiveTvServices", page).hide(), $("#selectGuideDays", page).val(config.GuideDays || ""), $("#txtPrePaddingMinutes", page).val(config.PrePaddingSeconds / 60), $("#txtPostPaddingMinutes", page).val(config.PostPaddingSeconds / 60), page.querySelector("#txtRecordingPath").value = config.RecordingPath || "", page.querySelector("#txtMovieRecordingPath").value = config.MovieRecordingPath || "", page.querySelector("#txtSeriesRecordingPath").value = config.SeriesRecordingPath || "", page.querySelector("#txtPostProcessor").value = config.RecordingPostProcessor || "", page.querySelector("#txtPostProcessorArguments").value = config.RecordingPostProcessorArguments || "", loading.hide()
|
||||
$(".liveTvSettingsForm", page).show();
|
||||
$(".noLiveTvServices", page).hide();
|
||||
$("#selectGuideDays", page).val(config.GuideDays || "");
|
||||
$("#txtPrePaddingMinutes", page).val(config.PrePaddingSeconds / 60);
|
||||
$("#txtPostPaddingMinutes", page).val(config.PostPaddingSeconds / 60);
|
||||
page.querySelector("#txtRecordingPath").value = config.RecordingPath || "";
|
||||
page.querySelector("#txtMovieRecordingPath").value = config.MovieRecordingPath || "";
|
||||
page.querySelector("#txtSeriesRecordingPath").value = config.SeriesRecordingPath || "";
|
||||
page.querySelector("#txtPostProcessor").value = config.RecordingPostProcessor || "";
|
||||
page.querySelector("#txtPostProcessorArguments").value = config.RecordingPostProcessorArguments || "";
|
||||
loading.hide();
|
||||
}
|
||||
|
||||
function onSubmit() {
|
||||
loading.show();
|
||||
var form = this;
|
||||
return ApiClient.getNamedConfiguration("livetv").then(function(config) {
|
||||
ApiClient.getNamedConfiguration("livetv").then(function (config) {
|
||||
config.GuideDays = $("#selectGuideDays", form).val() || null;
|
||||
var recordingPath = form.querySelector("#txtRecordingPath").value || null,
|
||||
movieRecordingPath = form.querySelector("#txtMovieRecordingPath").value || null,
|
||||
seriesRecordingPath = form.querySelector("#txtSeriesRecordingPath").value || null,
|
||||
recordingPathChanged = recordingPath != config.RecordingPath || movieRecordingPath != config.MovieRecordingPath || seriesRecordingPath != config.SeriesRecordingPath;
|
||||
config.RecordingPath = recordingPath, config.MovieRecordingPath = movieRecordingPath, config.SeriesRecordingPath = seriesRecordingPath, config.RecordingEncodingFormat = "mkv", config.PrePaddingSeconds = 60 * $("#txtPrePaddingMinutes", form).val(), config.PostPaddingSeconds = 60 * $("#txtPostPaddingMinutes", form).val(), config.RecordingPostProcessor = $("#txtPostProcessor", form).val(), config.RecordingPostProcessorArguments = $("#txtPostProcessorArguments", form).val(), ApiClient.updateNamedConfiguration("livetv", config).then(function() {
|
||||
Dashboard.processServerConfigurationUpdateResult(), showSaveMessage(recordingPathChanged)
|
||||
})
|
||||
}), !1
|
||||
var recordingPath = form.querySelector("#txtRecordingPath").value || null;
|
||||
var movieRecordingPath = form.querySelector("#txtMovieRecordingPath").value || null;
|
||||
var seriesRecordingPath = form.querySelector("#txtSeriesRecordingPath").value || null;
|
||||
var recordingPathChanged = recordingPath != config.RecordingPath || movieRecordingPath != config.MovieRecordingPath || seriesRecordingPath != config.SeriesRecordingPath;
|
||||
config.RecordingPath = recordingPath;
|
||||
config.MovieRecordingPath = movieRecordingPath;
|
||||
config.SeriesRecordingPath = seriesRecordingPath;
|
||||
config.RecordingEncodingFormat = "mkv";
|
||||
config.PrePaddingSeconds = 60 * $("#txtPrePaddingMinutes", form).val();
|
||||
config.PostPaddingSeconds = 60 * $("#txtPostPaddingMinutes", form).val();
|
||||
config.RecordingPostProcessor = $("#txtPostProcessor", form).val();
|
||||
config.RecordingPostProcessorArguments = $("#txtPostProcessorArguments", form).val();
|
||||
ApiClient.updateNamedConfiguration("livetv", config).then(function () {
|
||||
Dashboard.processServerConfigurationUpdateResult();
|
||||
showSaveMessage(recordingPathChanged);
|
||||
});
|
||||
});
|
||||
return false;
|
||||
}
|
||||
|
||||
function showSaveMessage(recordingPathChanged) {
|
||||
var msg = "";
|
||||
recordingPathChanged && (msg += Globalize.translate("RecordingPathChangeMessage")), msg && require(["alert"], function(alert) {
|
||||
alert(msg)
|
||||
})
|
||||
|
||||
if (recordingPathChanged) {
|
||||
msg += Globalize.translate("RecordingPathChangeMessage");
|
||||
}
|
||||
|
||||
if (msg) {
|
||||
require(["alert"], function (alert) {
|
||||
alert(msg);
|
||||
});
|
||||
}
|
||||
}
|
||||
$(document).on("pageinit", "#liveTvSettingsPage", function() {
|
||||
|
||||
$(document).on("pageinit", "#liveTvSettingsPage", function () {
|
||||
var page = this;
|
||||
$(".liveTvSettingsForm").off("submit", onSubmit).on("submit", onSubmit), $("#btnSelectRecordingPath", page).on("click.selectDirectory", function() {
|
||||
require(["directorybrowser"], function(directoryBrowser) {
|
||||
var picker = new directoryBrowser;
|
||||
$(".liveTvSettingsForm").off("submit", onSubmit).on("submit", onSubmit);
|
||||
$("#btnSelectRecordingPath", page).on("click.selectDirectory", function () {
|
||||
require(["directorybrowser"], function (directoryBrowser) {
|
||||
var picker = new directoryBrowser();
|
||||
picker.show({
|
||||
callback: function(path) {
|
||||
path && $("#txtRecordingPath", page).val(path), picker.close()
|
||||
callback: function (path) {
|
||||
if (path) {
|
||||
$("#txtRecordingPath", page).val(path);
|
||||
}
|
||||
|
||||
picker.close();
|
||||
},
|
||||
validateWriteable: !0
|
||||
})
|
||||
})
|
||||
}), $("#btnSelectMovieRecordingPath", page).on("click.selectDirectory", function() {
|
||||
require(["directorybrowser"], function(directoryBrowser) {
|
||||
var picker = new directoryBrowser;
|
||||
validateWriteable: true
|
||||
});
|
||||
});
|
||||
});
|
||||
$("#btnSelectMovieRecordingPath", page).on("click.selectDirectory", function () {
|
||||
require(["directorybrowser"], function (directoryBrowser) {
|
||||
var picker = new directoryBrowser();
|
||||
picker.show({
|
||||
callback: function(path) {
|
||||
path && $("#txtMovieRecordingPath", page).val(path), picker.close()
|
||||
callback: function (path) {
|
||||
if (path) {
|
||||
$("#txtMovieRecordingPath", page).val(path);
|
||||
}
|
||||
|
||||
picker.close();
|
||||
},
|
||||
validateWriteable: !0
|
||||
})
|
||||
})
|
||||
}), $("#btnSelectSeriesRecordingPath", page).on("click.selectDirectory", function() {
|
||||
require(["directorybrowser"], function(directoryBrowser) {
|
||||
var picker = new directoryBrowser;
|
||||
validateWriteable: true
|
||||
});
|
||||
});
|
||||
});
|
||||
$("#btnSelectSeriesRecordingPath", page).on("click.selectDirectory", function () {
|
||||
require(["directorybrowser"], function (directoryBrowser) {
|
||||
var picker = new directoryBrowser();
|
||||
picker.show({
|
||||
callback: function(path) {
|
||||
path && $("#txtSeriesRecordingPath", page).val(path), picker.close()
|
||||
callback: function (path) {
|
||||
if (path) {
|
||||
$("#txtSeriesRecordingPath", page).val(path);
|
||||
}
|
||||
|
||||
picker.close();
|
||||
},
|
||||
validateWriteable: !0
|
||||
})
|
||||
})
|
||||
}), $("#btnSelectPostProcessorPath", page).on("click.selectDirectory", function() {
|
||||
require(["directorybrowser"], function(directoryBrowser) {
|
||||
var picker = new directoryBrowser;
|
||||
validateWriteable: true
|
||||
});
|
||||
});
|
||||
});
|
||||
$("#btnSelectPostProcessorPath", page).on("click.selectDirectory", function () {
|
||||
require(["directorybrowser"], function (directoryBrowser) {
|
||||
var picker = new directoryBrowser();
|
||||
picker.show({
|
||||
includeFiles: !0,
|
||||
callback: function(path) {
|
||||
path && $("#txtPostProcessor", page).val(path), picker.close()
|
||||
includeFiles: true,
|
||||
callback: function (path) {
|
||||
if (path) {
|
||||
$("#txtPostProcessor", page).val(path);
|
||||
}
|
||||
|
||||
picker.close();
|
||||
}
|
||||
})
|
||||
})
|
||||
})
|
||||
}).on("pageshow", "#liveTvSettingsPage", function() {
|
||||
});
|
||||
});
|
||||
});
|
||||
}).on("pageshow", "#liveTvSettingsPage", function () {
|
||||
loading.show();
|
||||
var page = this;
|
||||
ApiClient.getNamedConfiguration("livetv").then(function(config) {
|
||||
loadPage(page, config)
|
||||
})
|
||||
})
|
||||
});
|
||||
ApiClient.getNamedConfiguration("livetv").then(function (config) {
|
||||
loadPage(page, config);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
+164
-80
@@ -1,42 +1,75 @@
|
||||
define(["jQuery", "globalize", "scripts/taskbutton", "dom", "libraryMenu", "layoutManager", "loading", "listViewStyle", "flexStyles", "emby-itemscontainer", "cardStyle", "material-icons", "emby-button"], function($, globalize, taskButton, dom, libraryMenu, layoutManager, loading) {
|
||||
define(["jQuery", "globalize", "scripts/taskbutton", "dom", "libraryMenu", "layoutManager", "loading", "listViewStyle", "flexStyles", "emby-itemscontainer", "cardStyle", "material-icons", "emby-button"], function ($, globalize, taskButton, dom, libraryMenu, layoutManager, loading) {
|
||||
"use strict";
|
||||
|
||||
function getDeviceHtml(device) {
|
||||
var padderClass, html = "",
|
||||
cssClass = "card scalableCard",
|
||||
cardBoxCssClass = "cardBox visualCardBox";
|
||||
return cssClass += " backdropCard backdropCard-scalable", padderClass = "cardPadder-backdrop", layoutManager.tv && (cssClass += " card-focusscale", cardBoxCssClass += " cardBox-focustransform"), cardBoxCssClass += " card-focuscontent", html += '<div type="button" class="' + cssClass + '" data-id="' + device.Id + '">', html += '<div class="' + cardBoxCssClass + '">', html += '<div class="cardScalable visualCardBox-cardScalable">', html += '<div class="' + padderClass + '"></div>', html += '<div class="cardContent searchImage">', html += '<div class="cardImageContainer coveredImage"><i class="cardImageIcon md-icon">dvr</i></div>', html += "</div>", html += "</div>", html += '<div class="cardFooter visualCardBox-cardFooter">', html += '<button is="paper-icon-button-light" class="itemAction btnCardOptions autoSize" data-action="menu"><i class="md-icon">more_horiz</i></button>', html += '<div class="cardText">' + (device.FriendlyName || getTunerName(device.Type)) + "</div>", html += '<div class="cardText cardText-secondary">', html += device.Url || " ", html += "</div>", html += "</div>", html += "</div>", html += "</div>"
|
||||
var padderClass;
|
||||
var html = "";
|
||||
var cssClass = "card scalableCard";
|
||||
var cardBoxCssClass = "cardBox visualCardBox";
|
||||
cssClass += " backdropCard backdropCard-scalable";
|
||||
padderClass = "cardPadder-backdrop";
|
||||
|
||||
if (layoutManager.tv) {
|
||||
cssClass += " card-focusscale";
|
||||
cardBoxCssClass += " cardBox-focustransform";
|
||||
}
|
||||
|
||||
cardBoxCssClass += " card-focuscontent";
|
||||
html += '<div type="button" class="' + cssClass + '" data-id="' + device.Id + '">';
|
||||
html += '<div class="' + cardBoxCssClass + '">';
|
||||
html += '<div class="cardScalable visualCardBox-cardScalable">';
|
||||
html += '<div class="' + padderClass + '"></div>';
|
||||
html += '<div class="cardContent searchImage">';
|
||||
html += '<div class="cardImageContainer coveredImage"><i class="cardImageIcon md-icon">dvr</i></div>';
|
||||
html += "</div>";
|
||||
html += "</div>";
|
||||
html += '<div class="cardFooter visualCardBox-cardFooter">';
|
||||
html += '<button is="paper-icon-button-light" class="itemAction btnCardOptions autoSize" data-action="menu"><i class="md-icon">more_horiz</i></button>';
|
||||
html += '<div class="cardText">' + (device.FriendlyName || getTunerName(device.Type)) + "</div>";
|
||||
html += '<div class="cardText cardText-secondary">';
|
||||
html += device.Url || " ";
|
||||
html += "</div>";
|
||||
html += "</div>";
|
||||
html += "</div>";
|
||||
return html += "</div>";
|
||||
}
|
||||
|
||||
function renderDevices(page, devices) {
|
||||
var html = devices.map(getDeviceHtml).join("");
|
||||
page.querySelector(".devicesList").innerHTML = html
|
||||
page.querySelector(".devicesList").innerHTML = html;
|
||||
}
|
||||
|
||||
function deleteDevice(page, id) {
|
||||
var message = globalize.translate("MessageConfirmDeleteTunerDevice");
|
||||
require(["confirm"], function(confirm) {
|
||||
confirm(message, globalize.translate("HeaderDeleteDevice")).then(function() {
|
||||
loading.show(), ApiClient.ajax({
|
||||
|
||||
require(["confirm"], function (confirm) {
|
||||
confirm(message, globalize.translate("HeaderDeleteDevice")).then(function () {
|
||||
loading.show();
|
||||
ApiClient.ajax({
|
||||
type: "DELETE",
|
||||
url: ApiClient.getUrl("LiveTv/TunerHosts", {
|
||||
Id: id
|
||||
})
|
||||
}).then(function() {
|
||||
reload(page)
|
||||
})
|
||||
})
|
||||
})
|
||||
}).then(function () {
|
||||
reload(page);
|
||||
});
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function reload(page) {
|
||||
loading.show(), ApiClient.getNamedConfiguration("livetv").then(function(config) {
|
||||
renderDevices(page, config.TunerHosts), renderProviders(page, config.ListingProviders)
|
||||
}), loading.hide()
|
||||
loading.show();
|
||||
ApiClient.getNamedConfiguration("livetv").then(function (config) {
|
||||
renderDevices(page, config.TunerHosts);
|
||||
renderProviders(page, config.ListingProviders);
|
||||
});
|
||||
loading.hide();
|
||||
}
|
||||
|
||||
function submitAddDeviceForm(page) {
|
||||
page.querySelector(".dlgAddDevice").close(), loading.show(), ApiClient.ajax({
|
||||
page.querySelector(".dlgAddDevice").close();
|
||||
loading.show();
|
||||
ApiClient.ajax({
|
||||
type: "POST",
|
||||
url: ApiClient.getUrl("LiveTv/TunerHosts"),
|
||||
data: JSON.stringify({
|
||||
@@ -44,30 +77,47 @@ define(["jQuery", "globalize", "scripts/taskbutton", "dom", "libraryMenu", "layo
|
||||
Url: $("#txtDevicePath", page).val()
|
||||
}),
|
||||
contentType: "application/json"
|
||||
}).then(function() {
|
||||
reload(page)
|
||||
}, function() {
|
||||
}).then(function () {
|
||||
reload(page);
|
||||
}, function () {
|
||||
Dashboard.alert({
|
||||
message: globalize.translate("ErrorAddingTunerDevice")
|
||||
})
|
||||
})
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function renderProviders(page, providers) {
|
||||
var html = "";
|
||||
|
||||
if (providers.length) {
|
||||
html += '<div class="paperList">';
|
||||
|
||||
for (var i = 0, length = providers.length; i < length; i++) {
|
||||
var provider = providers[i];
|
||||
html += '<div class="listItem">', html += '<i class="listItemIcon md-icon">dvr</i>', html += '<div class="listItemBody two-line">', html += '<a is="emby-linkbutton" style="display:block;padding:0;margin:0;text-align:left;" class="clearLink" href="' + getProviderConfigurationUrl(provider.Type) + "&id=" + provider.Id + '">', html += '<h3 class="listItemBodyText">', html += getProviderName(provider.Type), html += "</h3>", html += '<div class="listItemBodyText secondary">', html += provider.Path || provider.ListingsId || "", html += "</div>", html += "</a>", html += "</div>", html += '<button type="button" is="paper-icon-button-light" class="btnOptions" data-id="' + provider.Id + '"><i class="md-icon listItemAside">more_horiz</i></button>', html += "</div>"
|
||||
html += '<div class="listItem">';
|
||||
html += '<i class="listItemIcon md-icon">dvr</i>';
|
||||
html += '<div class="listItemBody two-line">';
|
||||
html += '<a is="emby-linkbutton" style="display:block;padding:0;margin:0;text-align:left;" class="clearLink" href="' + getProviderConfigurationUrl(provider.Type) + "&id=" + provider.Id + '">';
|
||||
html += '<h3 class="listItemBodyText">';
|
||||
html += getProviderName(provider.Type);
|
||||
html += "</h3>";
|
||||
html += '<div class="listItemBodyText secondary">';
|
||||
html += provider.Path || provider.ListingsId || "";
|
||||
html += "</div>";
|
||||
html += "</a>";
|
||||
html += "</div>";
|
||||
html += '<button type="button" is="paper-icon-button-light" class="btnOptions" data-id="' + provider.Id + '"><i class="md-icon listItemAside">more_horiz</i></button>';
|
||||
html += "</div>";
|
||||
}
|
||||
html += "</div>"
|
||||
|
||||
html += "</div>";
|
||||
}
|
||||
|
||||
var elem = $(".providerList", page).html(html);
|
||||
$(".btnOptions", elem).on("click", function() {
|
||||
$(".btnOptions", elem).on("click", function () {
|
||||
var id = this.getAttribute("data-id");
|
||||
showProviderOptions(page, id, this)
|
||||
})
|
||||
showProviderOptions(page, id, this);
|
||||
});
|
||||
}
|
||||
|
||||
function showProviderOptions(page, providerId, button) {
|
||||
@@ -75,64 +125,74 @@ define(["jQuery", "globalize", "scripts/taskbutton", "dom", "libraryMenu", "layo
|
||||
items.push({
|
||||
name: globalize.translate("ButtonDelete"),
|
||||
id: "delete"
|
||||
}), items.push({
|
||||
});
|
||||
items.push({
|
||||
name: globalize.translate("MapChannels"),
|
||||
id: "map"
|
||||
}), require(["actionsheet"], function(actionsheet) {
|
||||
});
|
||||
|
||||
require(["actionsheet"], function (actionsheet) {
|
||||
actionsheet.show({
|
||||
items: items,
|
||||
positionTo: button
|
||||
}).then(function(id) {
|
||||
}).then(function (id) {
|
||||
switch (id) {
|
||||
case "delete":
|
||||
deleteProvider(page, providerId);
|
||||
break;
|
||||
|
||||
case "map":
|
||||
mapChannels(page, providerId)
|
||||
mapChannels(page, providerId);
|
||||
}
|
||||
})
|
||||
})
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function mapChannels(page, providerId) {
|
||||
require(["components/channelmapper/channelmapper"], function(channelmapper) {
|
||||
require(["components/channelmapper/channelmapper"], function (channelmapper) {
|
||||
new channelmapper({
|
||||
serverId: ApiClient.serverInfo().Id,
|
||||
providerId: providerId
|
||||
}).show()
|
||||
})
|
||||
}).show();
|
||||
});
|
||||
}
|
||||
|
||||
function deleteProvider(page, id) {
|
||||
var message = globalize.translate("MessageConfirmDeleteGuideProvider");
|
||||
require(["confirm"], function(confirm) {
|
||||
confirm(message, globalize.translate("HeaderDeleteProvider")).then(function() {
|
||||
loading.show(), ApiClient.ajax({
|
||||
|
||||
require(["confirm"], function (confirm) {
|
||||
confirm(message, globalize.translate("HeaderDeleteProvider")).then(function () {
|
||||
loading.show();
|
||||
ApiClient.ajax({
|
||||
type: "DELETE",
|
||||
url: ApiClient.getUrl("LiveTv/ListingProviders", {
|
||||
Id: id
|
||||
})
|
||||
}).then(function() {
|
||||
reload(page)
|
||||
}, function() {
|
||||
reload(page)
|
||||
})
|
||||
})
|
||||
})
|
||||
}).then(function () {
|
||||
reload(page);
|
||||
}, function () {
|
||||
reload(page);
|
||||
});
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function getTunerName(providerId) {
|
||||
switch (providerId = providerId.toLowerCase()) {
|
||||
case "m3u":
|
||||
return "M3U";
|
||||
|
||||
case "hdhomerun":
|
||||
return "HDHomerun";
|
||||
|
||||
case "hauppauge":
|
||||
return "Hauppauge";
|
||||
|
||||
case "satip":
|
||||
return "DVB";
|
||||
|
||||
default:
|
||||
return "Unknown"
|
||||
return "Unknown";
|
||||
}
|
||||
}
|
||||
|
||||
@@ -140,12 +200,15 @@ define(["jQuery", "globalize", "scripts/taskbutton", "dom", "libraryMenu", "layo
|
||||
switch (providerId = providerId.toLowerCase()) {
|
||||
case "schedulesdirect":
|
||||
return "Schedules Direct";
|
||||
|
||||
case "xmltv":
|
||||
return "Xml TV";
|
||||
|
||||
case "emby":
|
||||
return "Emby Guide";
|
||||
|
||||
default:
|
||||
return "Unknown"
|
||||
return "Unknown";
|
||||
}
|
||||
}
|
||||
|
||||
@@ -153,10 +216,12 @@ define(["jQuery", "globalize", "scripts/taskbutton", "dom", "libraryMenu", "layo
|
||||
switch (providerId = providerId.toLowerCase()) {
|
||||
case "xmltv":
|
||||
return "livetvguideprovider.html?type=xmltv";
|
||||
|
||||
case "schedulesdirect":
|
||||
return "livetvguideprovider.html?type=schedulesdirect";
|
||||
|
||||
case "emby":
|
||||
return "livetvguideprovider.html?type=emby"
|
||||
return "livetvguideprovider.html?type=emby";
|
||||
}
|
||||
}
|
||||
|
||||
@@ -165,22 +230,25 @@ define(["jQuery", "globalize", "scripts/taskbutton", "dom", "libraryMenu", "layo
|
||||
menuItems.push({
|
||||
name: "Schedules Direct",
|
||||
id: "SchedulesDirect"
|
||||
}), menuItems.push({
|
||||
});
|
||||
menuItems.push({
|
||||
name: "Xml TV",
|
||||
id: "xmltv"
|
||||
}), require(["actionsheet"], function(actionsheet) {
|
||||
});
|
||||
|
||||
require(["actionsheet"], function (actionsheet) {
|
||||
actionsheet.show({
|
||||
items: menuItems,
|
||||
positionTo: button,
|
||||
callback: function(id) {
|
||||
Dashboard.navigate(getProviderConfigurationUrl(id))
|
||||
callback: function (id) {
|
||||
Dashboard.navigate(getProviderConfigurationUrl(id));
|
||||
}
|
||||
})
|
||||
})
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function addDevice(button) {
|
||||
Dashboard.navigate("livetvtuner.html")
|
||||
Dashboard.navigate("livetvtuner.html");
|
||||
}
|
||||
|
||||
function showDeviceMenu(button, tunerDeviceId) {
|
||||
@@ -188,57 +256,73 @@ define(["jQuery", "globalize", "scripts/taskbutton", "dom", "libraryMenu", "layo
|
||||
items.push({
|
||||
name: globalize.translate("ButtonDelete"),
|
||||
id: "delete"
|
||||
}), items.push({
|
||||
});
|
||||
items.push({
|
||||
name: globalize.translate("ButtonEdit"),
|
||||
id: "edit"
|
||||
}), require(["actionsheet"], function(actionsheet) {
|
||||
});
|
||||
|
||||
require(["actionsheet"], function (actionsheet) {
|
||||
actionsheet.show({
|
||||
items: items,
|
||||
positionTo: button
|
||||
}).then(function(id) {
|
||||
}).then(function (id) {
|
||||
switch (id) {
|
||||
case "delete":
|
||||
deleteDevice(dom.parentWithClass(button, "page"), tunerDeviceId);
|
||||
break;
|
||||
|
||||
case "edit":
|
||||
Dashboard.navigate("livetvtuner.html?id=" + tunerDeviceId)
|
||||
Dashboard.navigate("livetvtuner.html?id=" + tunerDeviceId);
|
||||
}
|
||||
})
|
||||
})
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function onDevicesListClick(e) {
|
||||
var card = dom.parentWithClass(e.target, "card");
|
||||
|
||||
if (card) {
|
||||
var id = card.getAttribute("data-id"),
|
||||
btnCardOptions = dom.parentWithClass(e.target, "btnCardOptions");
|
||||
btnCardOptions ? showDeviceMenu(btnCardOptions, id) : Dashboard.navigate("livetvtuner.html?id=" + id)
|
||||
var id = card.getAttribute("data-id");
|
||||
var btnCardOptions = dom.parentWithClass(e.target, "btnCardOptions");
|
||||
|
||||
if (btnCardOptions) {
|
||||
showDeviceMenu(btnCardOptions, id);
|
||||
} else {
|
||||
Dashboard.navigate("livetvtuner.html?id=" + id);
|
||||
}
|
||||
}
|
||||
}
|
||||
$(document).on("pageinit", "#liveTvStatusPage", function() {
|
||||
|
||||
$(document).on("pageinit", "#liveTvStatusPage", function () {
|
||||
var page = this;
|
||||
$(".btnAddDevice", page).on("click", function() {
|
||||
addDevice(this)
|
||||
}), $(".formAddDevice", page).on("submit", function() {
|
||||
return submitAddDeviceForm(page), !1
|
||||
}), $(".btnAddProvider", page).on("click", function() {
|
||||
addProvider(this)
|
||||
}), page.querySelector(".devicesList").addEventListener("click", onDevicesListClick)
|
||||
}).on("pageshow", "#liveTvStatusPage", function() {
|
||||
$(".btnAddDevice", page).on("click", function () {
|
||||
addDevice(this);
|
||||
});
|
||||
$(".formAddDevice", page).on("submit", function () {
|
||||
submitAddDeviceForm(page);
|
||||
return false;
|
||||
});
|
||||
$(".btnAddProvider", page).on("click", function () {
|
||||
addProvider(this);
|
||||
});
|
||||
page.querySelector(".devicesList").addEventListener("click", onDevicesListClick);
|
||||
}).on("pageshow", "#liveTvStatusPage", function () {
|
||||
var page = this;
|
||||
reload(page), taskButton({
|
||||
reload(page);
|
||||
taskButton({
|
||||
mode: "on",
|
||||
progressElem: page.querySelector(".refreshGuideProgress"),
|
||||
taskKey: "RefreshGuide",
|
||||
button: page.querySelector(".btnRefresh")
|
||||
})
|
||||
}).on("pagehide", "#liveTvStatusPage", function() {
|
||||
});
|
||||
}).on("pagehide", "#liveTvStatusPage", function () {
|
||||
var page = this;
|
||||
taskButton({
|
||||
mode: "off",
|
||||
progressElem: page.querySelector(".refreshGuideProgress"),
|
||||
taskKey: "RefreshGuide",
|
||||
button: page.querySelector(".btnRefresh")
|
||||
})
|
||||
})
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
+147
-57
@@ -1,4 +1,4 @@
|
||||
define(["globalize", "loading", "libraryMenu", "dom", "emby-input", "emby-button", "emby-checkbox", "emby-select"], function(globalize, loading, libraryMenu, dom) {
|
||||
define(["globalize", "loading", "libraryMenu", "dom", "emby-input", "emby-button", "emby-checkbox", "emby-select"], function (globalize, loading, libraryMenu, dom) {
|
||||
"use strict";
|
||||
|
||||
function isM3uVariant(type) {
|
||||
@@ -6,17 +6,16 @@ define(["globalize", "loading", "libraryMenu", "dom", "emby-input", "emby-button
|
||||
}
|
||||
|
||||
function fillTypes(view, currentId) {
|
||||
return ApiClient.getJSON(ApiClient.getUrl("LiveTv/TunerHosts/Types")).then(function(types) {
|
||||
return ApiClient.getJSON(ApiClient.getUrl("LiveTv/TunerHosts/Types")).then(function (types) {
|
||||
var selectType = view.querySelector(".selectType");
|
||||
var html = "";
|
||||
html += types.map(function(tuner) {
|
||||
html += types.map(function (tuner) {
|
||||
return '<option value="' + tuner.Id + '">' + tuner.Name + "</option>";
|
||||
}).join("");
|
||||
html += '<option value="other">';
|
||||
html += globalize.translate("TabOther");
|
||||
html += "</option>";
|
||||
selectType.innerHTML = html;
|
||||
|
||||
selectType.disabled = null != currentId;
|
||||
selectType.value = "";
|
||||
onTypeChange.call(selectType);
|
||||
@@ -27,9 +26,10 @@ define(["globalize", "loading", "libraryMenu", "dom", "emby-input", "emby-button
|
||||
view.querySelector(".txtDevicePath").value = "";
|
||||
view.querySelector(".chkFavorite").checked = false;
|
||||
view.querySelector(".txtDevicePath").value = "";
|
||||
|
||||
if (providerId) {
|
||||
ApiClient.getNamedConfiguration("livetv").then(function(config) {
|
||||
var info = config.TunerHosts.filter(function(i) {
|
||||
ApiClient.getNamedConfiguration("livetv").then(function (config) {
|
||||
var info = config.TunerHosts.filter(function (i) {
|
||||
return i.Id === providerId;
|
||||
})[0];
|
||||
fillTunerHostInfo(view, info);
|
||||
@@ -40,9 +40,11 @@ define(["globalize", "loading", "libraryMenu", "dom", "emby-input", "emby-button
|
||||
function fillTunerHostInfo(view, info) {
|
||||
var selectType = view.querySelector(".selectType");
|
||||
var type = info.Type || "";
|
||||
|
||||
if (info.Source && isM3uVariant(info.Source)) {
|
||||
type = info.Source;
|
||||
}
|
||||
|
||||
selectType.value = type;
|
||||
onTypeChange.call(selectType);
|
||||
view.querySelector(".txtDevicePath").value = info.Url || "";
|
||||
@@ -68,76 +70,164 @@ define(["globalize", "loading", "libraryMenu", "dom", "emby-input", "emby-button
|
||||
AllowHWTranscoding: page.querySelector(".chkTranscode").checked,
|
||||
EnableStreamLooping: page.querySelector(".chkStreamLoop").checked
|
||||
};
|
||||
isM3uVariant(info.Type) && (info.Source = info.Type, info.Type = "m3u");
|
||||
|
||||
if (isM3uVariant(info.Type)) {
|
||||
info.Source = info.Type;
|
||||
info.Type = "m3u";
|
||||
}
|
||||
|
||||
var id = getParameterByName("id");
|
||||
id && (info.Id = id);
|
||||
|
||||
if (id) {
|
||||
info.Id = id;
|
||||
}
|
||||
|
||||
info.Id;
|
||||
ApiClient.ajax({
|
||||
type: "POST",
|
||||
url: ApiClient.getUrl("LiveTv/TunerHosts"),
|
||||
data: JSON.stringify(info),
|
||||
contentType: "application/json"
|
||||
}).then(function(result) {
|
||||
Dashboard.processServerConfigurationUpdateResult(), Dashboard.navigate("livetvstatus.html")
|
||||
}, function() {
|
||||
loading.hide(), Dashboard.alert({
|
||||
}).then(function (result) {
|
||||
Dashboard.processServerConfigurationUpdateResult();
|
||||
Dashboard.navigate("livetvstatus.html");
|
||||
}, function () {
|
||||
loading.hide();
|
||||
Dashboard.alert({
|
||||
message: globalize.translate("ErrorSavingTvProvider")
|
||||
})
|
||||
})
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function getRequirePromise(deps) {
|
||||
return new Promise(function(resolve, reject) {
|
||||
require(deps, resolve)
|
||||
})
|
||||
return new Promise(function (resolve, reject) {
|
||||
require(deps, resolve);
|
||||
});
|
||||
}
|
||||
|
||||
function getDetectedDevice() {
|
||||
return getRequirePromise(["tunerPicker"]).then(function(tunerPicker) {
|
||||
return (new tunerPicker).show({
|
||||
return getRequirePromise(["tunerPicker"]).then(function (tunerPicker) {
|
||||
return new tunerPicker().show({
|
||||
serverId: ApiClient.serverId()
|
||||
})
|
||||
})
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function onTypeChange() {
|
||||
var value = this.value,
|
||||
view = dom.parentWithClass(this, "page"),
|
||||
mayIncludeUnsupportedDrmChannels = "hdhomerun" === value,
|
||||
supportsTranscoding = "hdhomerun" === value,
|
||||
supportsFavorites = "hdhomerun" === value,
|
||||
supportsTunerIpAddress = "hdhomerun" === value,
|
||||
supportsTunerFileOrUrl = "m3u" === value,
|
||||
supportsStreamLooping = "m3u" === value,
|
||||
supportsTunerCount = "m3u" === value,
|
||||
supportsUserAgent = "m3u" === value,
|
||||
suppportsSubmit = "other" !== value,
|
||||
supportsSelectablePath = supportsTunerFileOrUrl,
|
||||
txtDevicePath = view.querySelector(".txtDevicePath");
|
||||
supportsTunerIpAddress ? (txtDevicePath.label(globalize.translate("LabelTunerIpAddress")), view.querySelector(".fldPath").classList.remove("hide")) : supportsTunerFileOrUrl ? (txtDevicePath.label(globalize.translate("LabelFileOrUrl")), view.querySelector(".fldPath").classList.remove("hide")) : view.querySelector(".fldPath").classList.add("hide"), supportsSelectablePath ? (view.querySelector(".btnSelectPath").classList.remove("hide"), view.querySelector(".txtDevicePath").setAttribute("required", "required")) : (view.querySelector(".btnSelectPath").classList.add("hide"), view.querySelector(".txtDevicePath").removeAttribute("required")), supportsUserAgent ? view.querySelector(".fldUserAgent").classList.remove("hide") : view.querySelector(".fldUserAgent").classList.add("hide"), supportsFavorites ? view.querySelector(".fldFavorites").classList.remove("hide") : view.querySelector(".fldFavorites").classList.add("hide"), supportsTranscoding ? view.querySelector(".fldTranscode").classList.remove("hide") : view.querySelector(".fldTranscode").classList.add("hide"), supportsStreamLooping ? view.querySelector(".fldStreamLoop").classList.remove("hide") : view.querySelector(".fldStreamLoop").classList.add("hide"), supportsTunerCount ? (view.querySelector(".fldTunerCount").classList.remove("hide"), view.querySelector(".txtTunerCount").setAttribute("required", "required")) : (view.querySelector(".fldTunerCount").classList.add("hide"), view.querySelector(".txtTunerCount").removeAttribute("required")), mayIncludeUnsupportedDrmChannels ? view.querySelector(".drmMessage").classList.remove("hide") : view.querySelector(".drmMessage").classList.add("hide"), suppportsSubmit ? view.querySelector(".button-submit").classList.remove("hide") : view.querySelector(".button-submit").classList.add("hide")
|
||||
var value = this.value;
|
||||
var view = dom.parentWithClass(this, "page");
|
||||
var mayIncludeUnsupportedDrmChannels = "hdhomerun" === value;
|
||||
var supportsTranscoding = "hdhomerun" === value;
|
||||
var supportsFavorites = "hdhomerun" === value;
|
||||
var supportsTunerIpAddress = "hdhomerun" === value;
|
||||
var supportsTunerFileOrUrl = "m3u" === value;
|
||||
var supportsStreamLooping = "m3u" === value;
|
||||
var supportsTunerCount = "m3u" === value;
|
||||
var supportsUserAgent = "m3u" === value;
|
||||
var suppportsSubmit = "other" !== value;
|
||||
var supportsSelectablePath = supportsTunerFileOrUrl;
|
||||
var txtDevicePath = view.querySelector(".txtDevicePath");
|
||||
|
||||
if (supportsTunerIpAddress) {
|
||||
txtDevicePath.label(globalize.translate("LabelTunerIpAddress"));
|
||||
view.querySelector(".fldPath").classList.remove("hide");
|
||||
} else if (supportsTunerFileOrUrl) {
|
||||
txtDevicePath.label(globalize.translate("LabelFileOrUrl"));
|
||||
view.querySelector(".fldPath").classList.remove("hide");
|
||||
} else {
|
||||
view.querySelector(".fldPath").classList.add("hide");
|
||||
}
|
||||
|
||||
if (supportsSelectablePath) {
|
||||
view.querySelector(".btnSelectPath").classList.remove("hide");
|
||||
view.querySelector(".txtDevicePath").setAttribute("required", "required");
|
||||
} else {
|
||||
view.querySelector(".btnSelectPath").classList.add("hide");
|
||||
view.querySelector(".txtDevicePath").removeAttribute("required");
|
||||
}
|
||||
|
||||
if (supportsUserAgent) {
|
||||
view.querySelector(".fldUserAgent").classList.remove("hide");
|
||||
} else {
|
||||
view.querySelector(".fldUserAgent").classList.add("hide");
|
||||
}
|
||||
|
||||
if (supportsFavorites) {
|
||||
view.querySelector(".fldFavorites").classList.remove("hide");
|
||||
} else {
|
||||
view.querySelector(".fldFavorites").classList.add("hide");
|
||||
}
|
||||
|
||||
if (supportsTranscoding) {
|
||||
view.querySelector(".fldTranscode").classList.remove("hide");
|
||||
} else {
|
||||
view.querySelector(".fldTranscode").classList.add("hide");
|
||||
}
|
||||
|
||||
if (supportsStreamLooping) {
|
||||
view.querySelector(".fldStreamLoop").classList.remove("hide");
|
||||
} else {
|
||||
view.querySelector(".fldStreamLoop").classList.add("hide");
|
||||
}
|
||||
|
||||
if (supportsTunerCount) {
|
||||
view.querySelector(".fldTunerCount").classList.remove("hide");
|
||||
view.querySelector(".txtTunerCount").setAttribute("required", "required");
|
||||
} else {
|
||||
view.querySelector(".fldTunerCount").classList.add("hide");
|
||||
view.querySelector(".txtTunerCount").removeAttribute("required");
|
||||
}
|
||||
|
||||
if (mayIncludeUnsupportedDrmChannels) {
|
||||
view.querySelector(".drmMessage").classList.remove("hide");
|
||||
} else {
|
||||
view.querySelector(".drmMessage").classList.add("hide");
|
||||
}
|
||||
|
||||
if (suppportsSubmit) {
|
||||
view.querySelector(".button-submit").classList.remove("hide");
|
||||
} else {
|
||||
view.querySelector(".button-submit").classList.add("hide");
|
||||
}
|
||||
}
|
||||
return function(view, params) {
|
||||
params.id || view.querySelector(".btnDetect").classList.remove("hide"), view.addEventListener("viewshow", function() {
|
||||
|
||||
return function (view, params) {
|
||||
if (!params.id) {
|
||||
view.querySelector(".btnDetect").classList.remove("hide");
|
||||
}
|
||||
|
||||
view.addEventListener("viewshow", function () {
|
||||
var currentId = params.id;
|
||||
fillTypes(view, currentId).then(function() {
|
||||
reload(view, currentId)
|
||||
})
|
||||
}), view.querySelector("form").addEventListener("submit", function(e) {
|
||||
return submitForm(view), e.preventDefault(), e.stopPropagation(), !1
|
||||
}), view.querySelector(".selectType").addEventListener("change", onTypeChange), view.querySelector(".btnDetect").addEventListener("click", function() {
|
||||
getDetectedDevice().then(function(info) {
|
||||
fillTunerHostInfo(view, info)
|
||||
})
|
||||
}), view.querySelector(".btnSelectPath").addEventListener("click", function() {
|
||||
require(["directorybrowser"], function(directoryBrowser) {
|
||||
var picker = new directoryBrowser;
|
||||
fillTypes(view, currentId).then(function () {
|
||||
reload(view, currentId);
|
||||
});
|
||||
});
|
||||
view.querySelector("form").addEventListener("submit", function (e) {
|
||||
submitForm(view);
|
||||
e.preventDefault();
|
||||
e.stopPropagation();
|
||||
return false;
|
||||
});
|
||||
view.querySelector(".selectType").addEventListener("change", onTypeChange);
|
||||
view.querySelector(".btnDetect").addEventListener("click", function () {
|
||||
getDetectedDevice().then(function (info) {
|
||||
fillTunerHostInfo(view, info);
|
||||
});
|
||||
});
|
||||
view.querySelector(".btnSelectPath").addEventListener("click", function () {
|
||||
require(["directorybrowser"], function (directoryBrowser) {
|
||||
var picker = new directoryBrowser();
|
||||
picker.show({
|
||||
includeFiles: !0,
|
||||
callback: function(path) {
|
||||
path && (view.querySelector(".txtDevicePath").value = path), picker.close()
|
||||
includeFiles: true,
|
||||
callback: function (path) {
|
||||
if (path) {
|
||||
view.querySelector(".txtDevicePath").value = path;
|
||||
}
|
||||
|
||||
picker.close();
|
||||
}
|
||||
})
|
||||
})
|
||||
})
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
};
|
||||
});
|
||||
|
||||
@@ -1,30 +1,45 @@
|
||||
define(["jQuery", "loading", "libraryMenu"], function($, loading, libraryMenu) {
|
||||
define(["jQuery", "loading", "libraryMenu"], function ($, loading, libraryMenu) {
|
||||
"use strict";
|
||||
|
||||
function loadPage(page, config, users) {
|
||||
var html = '<option value="" selected="selected">' + Globalize.translate("OptionNone") + "</option>";
|
||||
html += users.map(function(user) {
|
||||
return '<option value="' + user.Id + '">' + user.Name + "</option>"
|
||||
}).join(""), $("#selectUser", page).html(html).val(config.UserId || ""), $("#selectReleaseDateFormat", page).val(config.ReleaseDateFormat), page.querySelector("#chkSaveImagePaths").checked = config.SaveImagePathsInNfo, page.querySelector("#chkEnablePathSubstitution").checked = config.EnablePathSubstitution, page.querySelector("#chkEnableExtraThumbs").checked = config.EnableExtraThumbsDuplication, loading.hide()
|
||||
html += users.map(function (user) {
|
||||
return '<option value="' + user.Id + '">' + user.Name + "</option>";
|
||||
}).join("");
|
||||
$("#selectUser", page).html(html).val(config.UserId || "");
|
||||
$("#selectReleaseDateFormat", page).val(config.ReleaseDateFormat);
|
||||
page.querySelector("#chkSaveImagePaths").checked = config.SaveImagePathsInNfo;
|
||||
page.querySelector("#chkEnablePathSubstitution").checked = config.EnablePathSubstitution;
|
||||
page.querySelector("#chkEnableExtraThumbs").checked = config.EnableExtraThumbsDuplication;
|
||||
loading.hide();
|
||||
}
|
||||
|
||||
function onSubmit() {
|
||||
loading.show();
|
||||
var form = this;
|
||||
return ApiClient.getNamedConfiguration(metadataKey).then(function(config) {
|
||||
config.UserId = $("#selectUser", form).val() || null, config.ReleaseDateFormat = $("#selectReleaseDateFormat", form).val(), config.SaveImagePathsInNfo = form.querySelector("#chkSaveImagePaths").checked, config.EnablePathSubstitution = form.querySelector("#chkEnablePathSubstitution").checked, config.EnableExtraThumbsDuplication = form.querySelector("#chkEnableExtraThumbs").checked, ApiClient.updateNamedConfiguration(metadataKey, config).then(function() {
|
||||
Dashboard.processServerConfigurationUpdateResult(), showConfirmMessage(config)
|
||||
})
|
||||
}), !1
|
||||
ApiClient.getNamedConfiguration(metadataKey).then(function (config) {
|
||||
config.UserId = $("#selectUser", form).val() || null;
|
||||
config.ReleaseDateFormat = $("#selectReleaseDateFormat", form).val();
|
||||
config.SaveImagePathsInNfo = form.querySelector("#chkSaveImagePaths").checked;
|
||||
config.EnablePathSubstitution = form.querySelector("#chkEnablePathSubstitution").checked;
|
||||
config.EnableExtraThumbsDuplication = form.querySelector("#chkEnableExtraThumbs").checked;
|
||||
ApiClient.updateNamedConfiguration(metadataKey, config).then(function () {
|
||||
Dashboard.processServerConfigurationUpdateResult();
|
||||
showConfirmMessage(config);
|
||||
});
|
||||
});
|
||||
return false;
|
||||
}
|
||||
|
||||
function showConfirmMessage(config) {
|
||||
var msg = [];
|
||||
msg.push(Globalize.translate("MetadataSettingChangeHelp")), require(["alert"], function(alert) {
|
||||
msg.push(Globalize.translate("MetadataSettingChangeHelp"));
|
||||
|
||||
require(["alert"], function (alert) {
|
||||
alert({
|
||||
text: msg.join("<br/><br/>")
|
||||
})
|
||||
})
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function getTabs() {
|
||||
@@ -40,19 +55,20 @@ define(["jQuery", "loading", "libraryMenu"], function($, loading, libraryMenu) {
|
||||
}, {
|
||||
href: "metadatanfo.html",
|
||||
name: Globalize.translate("TabNfoSettings")
|
||||
}]
|
||||
}];
|
||||
}
|
||||
|
||||
var metadataKey = "xbmcmetadata";
|
||||
$(document).on("pageinit", "#metadataNfoPage", function() {
|
||||
$(".metadataNfoForm").off("submit", onSubmit).on("submit", onSubmit)
|
||||
}).on("pageshow", "#metadataNfoPage", function() {
|
||||
libraryMenu.setTabs("metadata", 3, getTabs), loading.show();
|
||||
var page = this,
|
||||
promise1 = ApiClient.getUsers(),
|
||||
promise2 = ApiClient.getNamedConfiguration(metadataKey);
|
||||
Promise.all([promise1, promise2]).then(function(responses) {
|
||||
loadPage(page, responses[1], responses[0])
|
||||
})
|
||||
})
|
||||
});
|
||||
$(document).on("pageinit", "#metadataNfoPage", function () {
|
||||
$(".metadataNfoForm").off("submit", onSubmit).on("submit", onSubmit);
|
||||
}).on("pageshow", "#metadataNfoPage", function () {
|
||||
libraryMenu.setTabs("metadata", 3, getTabs);
|
||||
loading.show();
|
||||
var page = this;
|
||||
var promise1 = ApiClient.getUsers();
|
||||
var promise2 = ApiClient.getNamedConfiguration(metadataKey);
|
||||
Promise.all([promise1, promise2]).then(function (responses) {
|
||||
loadPage(page, responses[1], responses[0]);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
@@ -1,9 +1,11 @@
|
||||
define(["loading", "events", "libraryBrowser", "imageLoader", "listView", "cardBuilder", "apphost", "emby-itemscontainer"], function(loading, events, libraryBrowser, imageLoader, listView, cardBuilder, appHost) {
|
||||
define(["loading", "events", "libraryBrowser", "imageLoader", "listView", "cardBuilder", "apphost", "emby-itemscontainer"], function (loading, events, libraryBrowser, imageLoader, listView, cardBuilder, appHost) {
|
||||
"use strict";
|
||||
return function(view, params, tabContent) {
|
||||
|
||||
return function (view, params, tabContent) {
|
||||
function getPageData(context) {
|
||||
var key = getSavedQueryKey(context),
|
||||
pageData = data[key];
|
||||
var key = getSavedQueryKey(context);
|
||||
var pageData = data[key];
|
||||
|
||||
if (!pageData) {
|
||||
pageData = data[key] = {
|
||||
query: {
|
||||
@@ -22,153 +24,223 @@ define(["loading", "events", "libraryBrowser", "imageLoader", "listView", "cardB
|
||||
pageData.query.ParentId = params.topParentId;
|
||||
libraryBrowser.loadSavedQueryValues(key, pageData.query);
|
||||
}
|
||||
|
||||
return pageData;
|
||||
}
|
||||
|
||||
function getQuery(context) {
|
||||
return getPageData(context).query
|
||||
return getPageData(context).query;
|
||||
}
|
||||
|
||||
function getSavedQueryKey(context) {
|
||||
return context.savedQueryKey || (context.savedQueryKey = libraryBrowser.getSavedQueryKey("moviecollections")), context.savedQueryKey
|
||||
if (!context.savedQueryKey) {
|
||||
context.savedQueryKey = libraryBrowser.getSavedQueryKey("moviecollections");
|
||||
}
|
||||
|
||||
return context.savedQueryKey;
|
||||
}
|
||||
|
||||
function onViewStyleChange() {
|
||||
var viewStyle = self.getCurrentViewStyle(),
|
||||
itemsContainer = tabContent.querySelector(".itemsContainer");
|
||||
"List" == viewStyle ? (itemsContainer.classList.add("vertical-list"), itemsContainer.classList.remove("vertical-wrap")) : (itemsContainer.classList.remove("vertical-list"), itemsContainer.classList.add("vertical-wrap")), itemsContainer.innerHTML = ""
|
||||
var viewStyle = self.getCurrentViewStyle();
|
||||
var itemsContainer = tabContent.querySelector(".itemsContainer");
|
||||
|
||||
if ("List" == viewStyle) {
|
||||
itemsContainer.classList.add("vertical-list");
|
||||
itemsContainer.classList.remove("vertical-wrap");
|
||||
} else {
|
||||
itemsContainer.classList.remove("vertical-list");
|
||||
itemsContainer.classList.add("vertical-wrap");
|
||||
}
|
||||
|
||||
itemsContainer.innerHTML = "";
|
||||
}
|
||||
|
||||
function reloadItems(page) {
|
||||
loading.show();
|
||||
isLoading = true;
|
||||
var query = getQuery(page);
|
||||
ApiClient.getItems(ApiClient.getCurrentUserId(), query).then(function(result) {
|
||||
ApiClient.getItems(ApiClient.getCurrentUserId(), query).then(function (result) {
|
||||
function onNextPageClick() {
|
||||
if (isLoading) return;
|
||||
query.StartIndex += query.Limit, reloadItems(tabContent)
|
||||
if (isLoading) {
|
||||
return;
|
||||
}
|
||||
|
||||
query.StartIndex += query.Limit;
|
||||
reloadItems(tabContent);
|
||||
}
|
||||
|
||||
function onPreviousPageClick() {
|
||||
if (isLoading) return;
|
||||
query.StartIndex -= query.Limit, reloadItems(tabContent)
|
||||
if (isLoading) {
|
||||
return;
|
||||
}
|
||||
|
||||
query.StartIndex -= query.Limit;
|
||||
reloadItems(tabContent);
|
||||
}
|
||||
|
||||
window.scrollTo(0, 0);
|
||||
var html, pagingHtml = libraryBrowser.getQueryPagingHtml({
|
||||
startIndex: query.StartIndex,
|
||||
limit: query.Limit,
|
||||
totalRecordCount: result.TotalRecordCount,
|
||||
showLimit: !1,
|
||||
updatePageSizeSetting: !1,
|
||||
addLayoutButton: !1,
|
||||
sortButton: !1,
|
||||
filterButton: !1
|
||||
}),
|
||||
viewStyle = self.getCurrentViewStyle();
|
||||
html = "Thumb" == viewStyle ? cardBuilder.getCardsHtml({
|
||||
items: result.Items,
|
||||
shape: "backdrop",
|
||||
preferThumb: !0,
|
||||
context: "movies",
|
||||
overlayPlayButton: !0,
|
||||
centerText: !0,
|
||||
showTitle: !0
|
||||
}) : "ThumbCard" == viewStyle ? cardBuilder.getCardsHtml({
|
||||
items: result.Items,
|
||||
shape: "backdrop",
|
||||
preferThumb: !0,
|
||||
context: "movies",
|
||||
lazy: !0,
|
||||
cardLayout: !0,
|
||||
showTitle: !0
|
||||
}) : "Banner" == viewStyle ? cardBuilder.getCardsHtml({
|
||||
items: result.Items,
|
||||
shape: "banner",
|
||||
preferBanner: !0,
|
||||
context: "movies",
|
||||
lazy: !0
|
||||
}) : "List" == viewStyle ? listView.getListViewHtml({
|
||||
items: result.Items,
|
||||
context: "movies",
|
||||
sortBy: query.SortBy
|
||||
}) : "PosterCard" == viewStyle ? cardBuilder.getCardsHtml({
|
||||
items: result.Items,
|
||||
shape: "auto",
|
||||
context: "movies",
|
||||
showTitle: !0,
|
||||
centerText: !1,
|
||||
cardLayout: !0
|
||||
}) : cardBuilder.getCardsHtml({
|
||||
items: result.Items,
|
||||
shape: "auto",
|
||||
context: "movies",
|
||||
centerText: !0,
|
||||
overlayPlayButton: !0,
|
||||
showTitle: !0
|
||||
var html;
|
||||
var pagingHtml = libraryBrowser.getQueryPagingHtml({
|
||||
startIndex: query.StartIndex,
|
||||
limit: query.Limit,
|
||||
totalRecordCount: result.TotalRecordCount,
|
||||
showLimit: false,
|
||||
updatePageSizeSetting: false,
|
||||
addLayoutButton: false,
|
||||
sortButton: false,
|
||||
filterButton: false
|
||||
});
|
||||
var i, length, elems = tabContent.querySelectorAll(".paging");
|
||||
for (i = 0, length = elems.length; i < length; i++) elems[i].innerHTML = pagingHtml;
|
||||
for (elems = tabContent.querySelectorAll(".btnNextPage"), i = 0, length = elems.length; i < length; i++) elems[i].addEventListener("click", onNextPageClick);
|
||||
for (elems = tabContent.querySelectorAll(".btnPreviousPage"), i = 0, length = elems.length; i < length; i++) elems[i].addEventListener("click", onPreviousPageClick);
|
||||
result.Items.length || (html = '<p style="text-align:center;">' + Globalize.translate("MessageNoCollectionsAvailable") + "</p>");
|
||||
var viewStyle = self.getCurrentViewStyle();
|
||||
if (viewStyle == "Thumb") {
|
||||
html = cardBuilder.getCardsHtml({
|
||||
items: result.Items,
|
||||
shape: "backdrop",
|
||||
preferThumb: true,
|
||||
context: "movies",
|
||||
overlayPlayButton: true,
|
||||
centerText: true,
|
||||
showTitle: true
|
||||
});
|
||||
} else if (viewStyle == "ThumbCard") {
|
||||
html = cardBuilder.getCardsHtml({
|
||||
items: result.Items,
|
||||
shape: "backdrop",
|
||||
preferThumb: true,
|
||||
context: "movies",
|
||||
lazy: true,
|
||||
cardLayout: true,
|
||||
showTitle: true
|
||||
});
|
||||
} else if (viewStyle == "Banner") {
|
||||
html = cardBuilder.getCardsHtml({
|
||||
items: result.Items,
|
||||
shape: "banner",
|
||||
preferBanner: true,
|
||||
context: "movies",
|
||||
lazy: true
|
||||
});
|
||||
} else if (viewStyle == "List") {
|
||||
html = listView.getListViewHtml({
|
||||
items: result.Items,
|
||||
context: "movies",
|
||||
sortBy: query.SortBy
|
||||
});
|
||||
} else if (viewStyle == "PosterCard") {
|
||||
html = cardBuilder.getCardsHtml({
|
||||
items: result.Items,
|
||||
shape: "auto",
|
||||
context: "movies",
|
||||
showTitle: true,
|
||||
centerText: false,
|
||||
cardLayout: true
|
||||
});
|
||||
} else {
|
||||
html = cardBuilder.getCardsHtml({
|
||||
items: result.Items,
|
||||
shape: "auto",
|
||||
context: "movies",
|
||||
centerText: true,
|
||||
overlayPlayButton: true,
|
||||
showTitle: true
|
||||
});
|
||||
}
|
||||
var i;
|
||||
var length;
|
||||
var elems = tabContent.querySelectorAll(".paging");
|
||||
|
||||
for (i = 0, length = elems.length; i < length; i++) {
|
||||
elems[i].innerHTML = pagingHtml;
|
||||
}
|
||||
|
||||
elems = tabContent.querySelectorAll(".btnNextPage");
|
||||
for (i = 0, length = elems.length; i < length; i++) {
|
||||
elems[i].addEventListener("click", onNextPageClick);
|
||||
}
|
||||
|
||||
elems = tabContent.querySelectorAll(".btnPreviousPage");
|
||||
for (i = 0, length = elems.length; i < length; i++) {
|
||||
elems[i].addEventListener("click", onPreviousPageClick);
|
||||
}
|
||||
|
||||
if (!result.Items.length) {
|
||||
html = '<p style="text-align:center;">' + Globalize.translate("MessageNoCollectionsAvailable") + "</p>";
|
||||
}
|
||||
|
||||
var itemsContainer = tabContent.querySelector(".itemsContainer");
|
||||
itemsContainer.innerHTML = html;
|
||||
imageLoader.lazyChildren(itemsContainer);
|
||||
libraryBrowser.saveQueryValues(getSavedQueryKey(page), query);
|
||||
loading.hide();
|
||||
isLoading = false;
|
||||
})
|
||||
});
|
||||
}
|
||||
var self = this,
|
||||
pageSize = 100,
|
||||
data = {},
|
||||
isLoading = false;
|
||||
self.getCurrentViewStyle = function() {
|
||||
return getPageData(tabContent).view
|
||||
},
|
||||
function(tabContent) {
|
||||
tabContent.querySelector(".btnSort").addEventListener("click", function(e) {
|
||||
libraryBrowser.showSortMenu({
|
||||
items: [{
|
||||
name: Globalize.translate("OptionNameSort"),
|
||||
id: "SortName"
|
||||
}, {
|
||||
name: Globalize.translate("OptionImdbRating"),
|
||||
id: "CommunityRating,SortName"
|
||||
}, {
|
||||
name: Globalize.translate("OptionDateAdded"),
|
||||
id: "DateCreated,SortName"
|
||||
}, {
|
||||
name: Globalize.translate("OptionParentalRating"),
|
||||
id: "OfficialRating,SortName"
|
||||
}, {
|
||||
name: Globalize.translate("OptionReleaseDate"),
|
||||
id: "PremiereDate,SortName"
|
||||
}],
|
||||
callback: function() {
|
||||
getQuery(tabContent).StartIndex = 0, reloadItems(tabContent)
|
||||
},
|
||||
query: getQuery(tabContent),
|
||||
button: e.target
|
||||
})
|
||||
|
||||
var self = this;
|
||||
var pageSize = 100;
|
||||
var data = {};
|
||||
var isLoading = false;
|
||||
|
||||
self.getCurrentViewStyle = function () {
|
||||
return getPageData(tabContent).view;
|
||||
};
|
||||
|
||||
function initPage(tabContent) {
|
||||
tabContent.querySelector(".btnSort").addEventListener("click", function (e) {
|
||||
libraryBrowser.showSortMenu({
|
||||
items: [{
|
||||
name: Globalize.translate("OptionNameSort"),
|
||||
id: "SortName"
|
||||
}, {
|
||||
name: Globalize.translate("OptionImdbRating"),
|
||||
id: "CommunityRating,SortName"
|
||||
}, {
|
||||
name: Globalize.translate("OptionDateAdded"),
|
||||
id: "DateCreated,SortName"
|
||||
}, {
|
||||
name: Globalize.translate("OptionParentalRating"),
|
||||
id: "OfficialRating,SortName"
|
||||
}, {
|
||||
name: Globalize.translate("OptionReleaseDate"),
|
||||
id: "PremiereDate,SortName"
|
||||
}],
|
||||
callback: function () {
|
||||
getQuery(tabContent).StartIndex = 0;
|
||||
reloadItems(tabContent);
|
||||
},
|
||||
query: getQuery(tabContent),
|
||||
button: e.target
|
||||
});
|
||||
var btnSelectView = tabContent.querySelector(".btnSelectView");
|
||||
btnSelectView.addEventListener("click", function(e) {
|
||||
libraryBrowser.showLayoutMenu(e.target, self.getCurrentViewStyle(), "List,Poster,PosterCard,Thumb,ThumbCard".split(","))
|
||||
}), btnSelectView.addEventListener("layoutchange", function(e) {
|
||||
var viewStyle = e.detail.viewStyle;
|
||||
getPageData(tabContent).view = viewStyle, libraryBrowser.saveViewSetting(getSavedQueryKey(tabContent), viewStyle), getQuery(tabContent).StartIndex = 0, onViewStyleChange(), reloadItems(tabContent)
|
||||
}), tabContent.querySelector(".btnNewCollection").addEventListener("click", function() {
|
||||
require(["collectionEditor"], function(collectionEditor) {
|
||||
var serverId = ApiClient.serverInfo().Id;
|
||||
(new collectionEditor).show({
|
||||
items: [],
|
||||
serverId: serverId
|
||||
})
|
||||
})
|
||||
})
|
||||
}(tabContent), onViewStyleChange(), self.renderTab = function() {
|
||||
reloadItems(tabContent)
|
||||
}, self.destroy = function() {}
|
||||
}
|
||||
});
|
||||
var btnSelectView = tabContent.querySelector(".btnSelectView");
|
||||
btnSelectView.addEventListener("click", function (e) {
|
||||
libraryBrowser.showLayoutMenu(e.target, self.getCurrentViewStyle(), "List,Poster,PosterCard,Thumb,ThumbCard".split(","));
|
||||
});
|
||||
btnSelectView.addEventListener("layoutchange", function (e) {
|
||||
var viewStyle = e.detail.viewStyle;
|
||||
getPageData(tabContent).view = viewStyle;
|
||||
libraryBrowser.saveViewSetting(getSavedQueryKey(tabContent), viewStyle);
|
||||
getQuery(tabContent).StartIndex = 0;
|
||||
onViewStyleChange();
|
||||
reloadItems(tabContent);
|
||||
});
|
||||
tabContent.querySelector(".btnNewCollection").addEventListener("click", function () {
|
||||
require(["collectionEditor"], function (collectionEditor) {
|
||||
var serverId = ApiClient.serverInfo().Id;
|
||||
new collectionEditor().show({
|
||||
items: [],
|
||||
serverId: serverId
|
||||
});
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
initPage(tabContent);
|
||||
onViewStyleChange();
|
||||
|
||||
self.renderTab = function () {
|
||||
reloadItems(tabContent);
|
||||
};
|
||||
|
||||
self.destroy = function () {};
|
||||
};
|
||||
});
|
||||
|
||||
@@ -1,139 +1,204 @@
|
||||
define(["layoutManager", "loading", "libraryBrowser", "cardBuilder", "lazyLoader", "apphost", "globalize", "appRouter", "dom", "emby-button"], function(layoutManager, loading, libraryBrowser, cardBuilder, lazyLoader, appHost, globalize, appRouter, dom) {
|
||||
define(["layoutManager", "loading", "libraryBrowser", "cardBuilder", "lazyLoader", "apphost", "globalize", "appRouter", "dom", "emby-button"], function (layoutManager, loading, libraryBrowser, cardBuilder, lazyLoader, appHost, globalize, appRouter, dom) {
|
||||
"use strict";
|
||||
return function(view, params, tabContent) {
|
||||
|
||||
return function (view, params, tabContent) {
|
||||
function getPageData() {
|
||||
var key = getSavedQueryKey(),
|
||||
pageData = data[key];
|
||||
return pageData || (pageData = data[key] = {
|
||||
query: {
|
||||
SortBy: "SortName",
|
||||
SortOrder: "Ascending",
|
||||
IncludeItemTypes: "Movie",
|
||||
Recursive: !0,
|
||||
EnableTotalRecordCount: !1
|
||||
},
|
||||
view: "Poster"
|
||||
}, pageData.query.ParentId = params.topParentId, libraryBrowser.loadSavedQueryValues(key, pageData.query)), pageData
|
||||
var key = getSavedQueryKey();
|
||||
var pageData = data[key];
|
||||
|
||||
if (!pageData) {
|
||||
pageData = data[key] = {
|
||||
query: {
|
||||
SortBy: "SortName",
|
||||
SortOrder: "Ascending",
|
||||
IncludeItemTypes: "Movie",
|
||||
Recursive: true,
|
||||
EnableTotalRecordCount: false
|
||||
},
|
||||
view: "Poster"
|
||||
};
|
||||
pageData.query.ParentId = params.topParentId;
|
||||
libraryBrowser.loadSavedQueryValues(key, pageData.query);
|
||||
}
|
||||
|
||||
return pageData;
|
||||
}
|
||||
|
||||
function getQuery() {
|
||||
return getPageData().query
|
||||
return getPageData().query;
|
||||
}
|
||||
|
||||
function getSavedQueryKey() {
|
||||
return libraryBrowser.getSavedQueryKey("moviegenres")
|
||||
return libraryBrowser.getSavedQueryKey("moviegenres");
|
||||
}
|
||||
|
||||
function getPromise() {
|
||||
loading.show();
|
||||
var query = getQuery();
|
||||
return ApiClient.getGenres(ApiClient.getCurrentUserId(), query)
|
||||
return ApiClient.getGenres(ApiClient.getCurrentUserId(), query);
|
||||
}
|
||||
|
||||
function enableScrollX() {
|
||||
return !layoutManager.desktop
|
||||
return !layoutManager.desktop;
|
||||
}
|
||||
|
||||
function getThumbShape() {
|
||||
return enableScrollX() ? "overflowBackdrop" : "backdrop"
|
||||
return enableScrollX() ? "overflowBackdrop" : "backdrop";
|
||||
}
|
||||
|
||||
function getPortraitShape() {
|
||||
return enableScrollX() ? "overflowPortrait" : "portrait"
|
||||
return enableScrollX() ? "overflowPortrait" : "portrait";
|
||||
}
|
||||
|
||||
function fillItemsContainer(elem) {
|
||||
var id = elem.getAttribute("data-id"),
|
||||
viewStyle = self.getCurrentViewStyle(),
|
||||
limit = "Thumb" == viewStyle || "ThumbCard" == viewStyle ? 5 : 9;
|
||||
enableScrollX() && (limit = 10);
|
||||
var enableImageTypes = "Thumb" == viewStyle || "ThumbCard" == viewStyle ? "Primary,Backdrop,Thumb" : "Primary",
|
||||
query = {
|
||||
SortBy: "SortName",
|
||||
SortOrder: "Ascending",
|
||||
IncludeItemTypes: "Movie",
|
||||
Recursive: !0,
|
||||
Fields: "PrimaryImageAspectRatio,MediaSourceCount,BasicSyncInfo",
|
||||
ImageTypeLimit: 1,
|
||||
EnableImageTypes: enableImageTypes,
|
||||
Limit: limit,
|
||||
GenreIds: id,
|
||||
EnableTotalRecordCount: !1,
|
||||
ParentId: params.topParentId
|
||||
};
|
||||
ApiClient.getItems(ApiClient.getCurrentUserId(), query).then(function(result) {
|
||||
var id = elem.getAttribute("data-id");
|
||||
var viewStyle = self.getCurrentViewStyle();
|
||||
var limit = "Thumb" == viewStyle || "ThumbCard" == viewStyle ? 5 : 9;
|
||||
|
||||
if (enableScrollX()) {
|
||||
limit = 10;
|
||||
}
|
||||
|
||||
var enableImageTypes = "Thumb" == viewStyle || "ThumbCard" == viewStyle ? "Primary,Backdrop,Thumb" : "Primary";
|
||||
var query = {
|
||||
SortBy: "SortName",
|
||||
SortOrder: "Ascending",
|
||||
IncludeItemTypes: "Movie",
|
||||
Recursive: true,
|
||||
Fields: "PrimaryImageAspectRatio,MediaSourceCount,BasicSyncInfo",
|
||||
ImageTypeLimit: 1,
|
||||
EnableImageTypes: enableImageTypes,
|
||||
Limit: limit,
|
||||
GenreIds: id,
|
||||
EnableTotalRecordCount: false,
|
||||
ParentId: params.topParentId
|
||||
};
|
||||
ApiClient.getItems(ApiClient.getCurrentUserId(), query).then(function (result) {
|
||||
var supportsImageAnalysis = appHost.supports("imageanalysis");
|
||||
"Thumb" == viewStyle ? cardBuilder.buildCards(result.Items, {
|
||||
itemsContainer: elem,
|
||||
shape: getThumbShape(),
|
||||
preferThumb: !0,
|
||||
showTitle: !0,
|
||||
scalable: !0,
|
||||
centerText: !0,
|
||||
overlayMoreButton: !0,
|
||||
allowBottomPadding: !1
|
||||
}) : "ThumbCard" == viewStyle ? cardBuilder.buildCards(result.Items, {
|
||||
itemsContainer: elem,
|
||||
shape: getThumbShape(),
|
||||
preferThumb: !0,
|
||||
showTitle: !0,
|
||||
scalable: !0,
|
||||
centerText: !1,
|
||||
cardLayout: !0,
|
||||
showYear: !0
|
||||
}) : "PosterCard" == viewStyle ? cardBuilder.buildCards(result.Items, {
|
||||
itemsContainer: elem,
|
||||
shape: getPortraitShape(),
|
||||
showTitle: !0,
|
||||
scalable: !0,
|
||||
centerText: !1,
|
||||
cardLayout: !0,
|
||||
showYear: !0
|
||||
}) : "Poster" == viewStyle && cardBuilder.buildCards(result.Items, {
|
||||
itemsContainer: elem,
|
||||
shape: getPortraitShape(),
|
||||
scalable: !0,
|
||||
overlayMoreButton: !0,
|
||||
allowBottomPadding: !1
|
||||
}), result.Items.length >= query.Limit && tabContent.querySelector(".btnMoreFromGenre" + id + " i").classList.remove("hide")
|
||||
})
|
||||
|
||||
if (viewStyle == "Thumb") {
|
||||
cardBuilder.buildCards(result.Items, {
|
||||
itemsContainer: elem,
|
||||
shape: getThumbShape(),
|
||||
preferThumb: true,
|
||||
showTitle: true,
|
||||
scalable: true,
|
||||
centerText: true,
|
||||
overlayMoreButton: true,
|
||||
allowBottomPadding: false
|
||||
});
|
||||
} else if (viewStyle == "ThumbCard") {
|
||||
cardBuilder.buildCards(result.Items, {
|
||||
itemsContainer: elem,
|
||||
shape: getThumbShape(),
|
||||
preferThumb: true,
|
||||
showTitle: true,
|
||||
scalable: true,
|
||||
centerText: false,
|
||||
cardLayout: true,
|
||||
showYear: true
|
||||
});
|
||||
} else if (viewStyle == "PosterCard") {
|
||||
cardBuilder.buildCards(result.Items, {
|
||||
itemsContainer: elem,
|
||||
shape: getPortraitShape(),
|
||||
showTitle: true,
|
||||
scalable: true,
|
||||
centerText: false,
|
||||
cardLayout: true,
|
||||
showYear: true
|
||||
});
|
||||
} else if (viewStyle == "Poster") {
|
||||
cardBuilder.buildCards(result.Items, {
|
||||
itemsContainer: elem,
|
||||
shape: getPortraitShape(),
|
||||
scalable: true,
|
||||
overlayMoreButton: true,
|
||||
allowBottomPadding: false
|
||||
});
|
||||
}
|
||||
if (result.Items.length >= query.Limit) {
|
||||
tabContent.querySelector(".btnMoreFromGenre" + id + " i").classList.remove("hide");
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function reloadItems(context, promise) {
|
||||
var query = getQuery();
|
||||
promise.then(function(result) {
|
||||
for (var elem = context.querySelector("#items"), html = "", items = result.Items, i = 0, length = items.length; i < length; i++) {
|
||||
promise.then(function (result) {
|
||||
var elem = context.querySelector("#items");
|
||||
var html = "";
|
||||
var items = result.Items;
|
||||
|
||||
for (var i = 0, length = items.length; i < length; i++) {
|
||||
var item = items[i];
|
||||
if (html += '<div class="verticalSection">', html += '<div class="sectionTitleContainer sectionTitleContainer-cards padded-left">', html += '<a is="emby-linkbutton" href="' + appRouter.getRouteUrl(item, {
|
||||
context: "movies",
|
||||
parentId: params.topParentId
|
||||
}) + '" class="more button-flat button-flat-mini sectionTitleTextButton btnMoreFromGenre' + item.Id + '">', html += '<h2 class="sectionTitle sectionTitle-cards">', html += item.Name, html += "</h2>", html += '<i class="md-icon hide"></i>', html += "</a>", html += "</div>", enableScrollX()) {
|
||||
|
||||
html += '<div class="verticalSection">';
|
||||
html += '<div class="sectionTitleContainer sectionTitleContainer-cards padded-left">';
|
||||
html += '<a is="emby-linkbutton" href="' + appRouter.getRouteUrl(item, {
|
||||
context: "movies",
|
||||
parentId: params.topParentId
|
||||
}) + '" class="more button-flat button-flat-mini sectionTitleTextButton btnMoreFromGenre' + item.Id + '">';
|
||||
html += '<h2 class="sectionTitle sectionTitle-cards">';
|
||||
html += item.Name;
|
||||
html += "</h2>";
|
||||
html += '<i class="md-icon hide"></i>';
|
||||
html += "</a>";
|
||||
html += "</div>";
|
||||
if (enableScrollX()) {
|
||||
var scrollXClass = "scrollX hiddenScrollX";
|
||||
layoutManager.tv && (scrollXClass += " smoothScrollX"), html += '<div is="emby-itemscontainer" class="itemsContainer ' + scrollXClass + ' lazy padded-left padded-right" data-id="' + item.Id + '">'
|
||||
} else html += '<div is="emby-itemscontainer" class="itemsContainer vertical-wrap lazy padded-left padded-right" data-id="' + item.Id + '">';
|
||||
html += "</div>", html += "</div>"
|
||||
|
||||
if (layoutManager.tv) {
|
||||
scrollXClass += "smoothScrollX";
|
||||
}
|
||||
|
||||
html += '<div is="emby-itemscontainer" class="itemsContainer ' + scrollXClass + ' lazy padded-left padded-right" data-id="' + item.Id + '">';
|
||||
} else {
|
||||
html += '<div is="emby-itemscontainer" class="itemsContainer vertical-wrap lazy padded-left padded-right" data-id="' + item.Id + '">';
|
||||
}
|
||||
|
||||
html += "</div>";
|
||||
html += "</div>";
|
||||
}
|
||||
elem.innerHTML = html, lazyLoader.lazyChildren(elem, fillItemsContainer), libraryBrowser.saveQueryValues(getSavedQueryKey(), query), loading.hide()
|
||||
})
|
||||
|
||||
elem.innerHTML = html;
|
||||
lazyLoader.lazyChildren(elem, fillItemsContainer);
|
||||
libraryBrowser.saveQueryValues(getSavedQueryKey(), query);
|
||||
loading.hide();
|
||||
});
|
||||
}
|
||||
|
||||
function fullyReload() {
|
||||
self.preRender(), self.renderTab()
|
||||
self.preRender();
|
||||
self.renderTab();
|
||||
}
|
||||
var self = this,
|
||||
data = {};
|
||||
self.getViewStyles = function() {
|
||||
return "Poster,PosterCard,Thumb,ThumbCard".split(",")
|
||||
}, self.getCurrentViewStyle = function() {
|
||||
return getPageData(tabContent).view
|
||||
}, self.setCurrentViewStyle = function(viewStyle) {
|
||||
getPageData(tabContent).view = viewStyle, libraryBrowser.saveViewSetting(getSavedQueryKey(tabContent), viewStyle), fullyReload()
|
||||
}, self.enableViewSelection = !0;
|
||||
|
||||
var self = this;
|
||||
var data = {};
|
||||
|
||||
self.getViewStyles = function () {
|
||||
return "Poster,PosterCard,Thumb,ThumbCard".split(",");
|
||||
};
|
||||
|
||||
self.getCurrentViewStyle = function () {
|
||||
return getPageData(tabContent).view;
|
||||
};
|
||||
|
||||
self.setCurrentViewStyle = function (viewStyle) {
|
||||
getPageData(tabContent).view = viewStyle;
|
||||
libraryBrowser.saveViewSetting(getSavedQueryKey(tabContent), viewStyle);
|
||||
fullyReload();
|
||||
};
|
||||
|
||||
self.enableViewSelection = true;
|
||||
var promise;
|
||||
self.preRender = function() {
|
||||
promise = getPromise()
|
||||
}, self.renderTab = function() {
|
||||
reloadItems(tabContent, promise)
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
self.preRender = function () {
|
||||
promise = getPromise();
|
||||
};
|
||||
|
||||
self.renderTab = function () {
|
||||
reloadItems(tabContent, promise);
|
||||
};
|
||||
};
|
||||
});
|
||||
|
||||
+208
-146
@@ -1,7 +1,7 @@
|
||||
define(["loading", "layoutManager", "userSettings", "events", "libraryBrowser", "alphaPicker", "listView", "cardBuilder", "emby-itemscontainer"],
|
||||
function(loading, layoutManager, userSettings, events, libraryBrowser, alphaPicker, listView, cardBuilder) {
|
||||
define(["loading", "layoutManager", "userSettings", "events", "libraryBrowser", "alphaPicker", "listView", "cardBuilder", "emby-itemscontainer"], function (loading, layoutManager, userSettings, events, libraryBrowser, alphaPicker, listView, cardBuilder) {
|
||||
"use strict";
|
||||
return function(view, params, tabContent, options) {
|
||||
|
||||
return function (view, params, tabContent, options) {
|
||||
function onViewStyleChange() {
|
||||
if (self.getCurrentViewStyle() == "List") {
|
||||
itemsContainer.classList.add("vertical-list");
|
||||
@@ -10,103 +10,141 @@ define(["loading", "layoutManager", "userSettings", "events", "libraryBrowser",
|
||||
itemsContainer.classList.remove("vertical-list");
|
||||
itemsContainer.classList.add("vertical-wrap");
|
||||
}
|
||||
|
||||
itemsContainer.innerHTML = "";
|
||||
}
|
||||
|
||||
function updateFilterControls() {
|
||||
self.alphaPicker && self.alphaPicker.value(query.NameStartsWithOrGreater)
|
||||
if (self.alphaPicker) {
|
||||
self.alphaPicker.value(query.NameStartsWithOrGreater);
|
||||
}
|
||||
}
|
||||
|
||||
function fetchData() {
|
||||
isLoading = true;
|
||||
loading.show();
|
||||
return ApiClient.getItems(ApiClient.getCurrentUserId(), query)
|
||||
return ApiClient.getItems(ApiClient.getCurrentUserId(), query);
|
||||
}
|
||||
|
||||
function afterRefresh(result) {
|
||||
function onNextPageClick() {
|
||||
if (isLoading) return;
|
||||
if (isLoading) {
|
||||
return;
|
||||
}
|
||||
|
||||
query.StartIndex += query.Limit;
|
||||
itemsContainer.refreshItems();
|
||||
}
|
||||
|
||||
function onPreviousPageClick() {
|
||||
if (isLoading) return;
|
||||
if (isLoading) {
|
||||
return;
|
||||
}
|
||||
|
||||
query.StartIndex -= query.Limit;
|
||||
itemsContainer.refreshItems();
|
||||
}
|
||||
|
||||
window.scrollTo(0, 0);
|
||||
updateFilterControls();
|
||||
var i, length, elems, pagingHtml = libraryBrowser.getQueryPagingHtml({
|
||||
startIndex: query.StartIndex,
|
||||
limit: query.Limit,
|
||||
totalRecordCount: result.TotalRecordCount,
|
||||
showLimit: !1,
|
||||
updatePageSizeSetting: !1,
|
||||
addLayoutButton: !1,
|
||||
sortButton: !1,
|
||||
filterButton: !1
|
||||
});
|
||||
for (elems = tabContent.querySelectorAll(".paging"), i = 0, length = elems.length; i < length; i++)
|
||||
var pagingHtml = libraryBrowser.getQueryPagingHtml({
|
||||
startIndex: query.StartIndex,
|
||||
limit: query.Limit,
|
||||
totalRecordCount: result.TotalRecordCount,
|
||||
showLimit: false,
|
||||
updatePageSizeSetting: false,
|
||||
addLayoutButton: false,
|
||||
sortButton: false,
|
||||
filterButton: false
|
||||
});
|
||||
var i;
|
||||
var length;
|
||||
var elems = tabContent.querySelectorAll(".paging");
|
||||
|
||||
for (i = 0, length = elems.length; i < length; i++) {
|
||||
elems[i].innerHTML = pagingHtml;
|
||||
for (elems = tabContent.querySelectorAll(".btnNextPage"), i = 0, length = elems.length; i < length; i++)
|
||||
}
|
||||
|
||||
elems = tabContent.querySelectorAll(".btnNextPage");
|
||||
for (i = 0, length = elems.length; i < length; i++) {
|
||||
elems[i].addEventListener("click", onNextPageClick);
|
||||
for (elems = tabContent.querySelectorAll(".btnPreviousPage"), i = 0, length = elems.length; i < length; i++)
|
||||
elems[i].addEventListener("click", onPreviousPageClick)
|
||||
}
|
||||
|
||||
elems = tabContent.querySelectorAll(".btnPreviousPage");
|
||||
for (i = 0, length = elems.length; i < length; i++) {
|
||||
elems[i].addEventListener("click", onPreviousPageClick);
|
||||
}
|
||||
|
||||
isLoading = false;
|
||||
loading.hide();
|
||||
}
|
||||
|
||||
function getItemsHtml(items) {
|
||||
var html;
|
||||
var viewStyle = self.getCurrentViewStyle();
|
||||
return "Thumb" == viewStyle ? cardBuilder.getCardsHtml({
|
||||
items: items,
|
||||
shape: "backdrop",
|
||||
preferThumb: !0,
|
||||
context: "movies",
|
||||
lazy: !0,
|
||||
overlayPlayButton: !0,
|
||||
showTitle: !0,
|
||||
showYear: !0,
|
||||
centerText: !0
|
||||
}) : "ThumbCard" == viewStyle ? cardBuilder.getCardsHtml({
|
||||
items: items,
|
||||
shape: "backdrop",
|
||||
preferThumb: !0,
|
||||
context: "movies",
|
||||
lazy: !0,
|
||||
cardLayout: !0,
|
||||
showTitle: !0,
|
||||
showYear: !0,
|
||||
centerText: !0
|
||||
}) : "Banner" == viewStyle ? cardBuilder.getCardsHtml({
|
||||
items: items,
|
||||
shape: "banner",
|
||||
preferBanner: !0,
|
||||
context: "movies",
|
||||
lazy: !0
|
||||
}) : "List" == viewStyle ? listView.getListViewHtml({
|
||||
items: items,
|
||||
context: "movies",
|
||||
sortBy: query.SortBy
|
||||
}) : "PosterCard" == viewStyle ? cardBuilder.getCardsHtml({
|
||||
items: items,
|
||||
shape: "portrait",
|
||||
context: "movies",
|
||||
showTitle: !0,
|
||||
showYear: !0,
|
||||
centerText: !0,
|
||||
lazy: !0,
|
||||
cardLayout: !0
|
||||
}) : cardBuilder.getCardsHtml({
|
||||
items: items,
|
||||
shape: "portrait",
|
||||
context: "movies",
|
||||
overlayPlayButton: !0,
|
||||
showTitle: !0,
|
||||
showYear: !0,
|
||||
centerText: !0
|
||||
})
|
||||
|
||||
if (viewStyle == "Thumb") {
|
||||
html = cardBuilder.getCardsHtml({
|
||||
items: items,
|
||||
shape: "backdrop",
|
||||
preferThumb: true,
|
||||
context: "movies",
|
||||
lazy: true,
|
||||
overlayPlayButton: true,
|
||||
showTitle: true,
|
||||
showYear: true,
|
||||
centerText: true
|
||||
});
|
||||
} else if (viewStyle == "ThumbCard") {
|
||||
html = cardBuilder.getCardsHtml({
|
||||
items: items,
|
||||
shape: "backdrop",
|
||||
preferThumb: true,
|
||||
context: "movies",
|
||||
lazy: true,
|
||||
cardLayout: true,
|
||||
showTitle: true,
|
||||
showYear: true,
|
||||
centerText: true
|
||||
});
|
||||
} else if (viewStyle == "Banner") {
|
||||
html = cardBuilder.getCardsHtml({
|
||||
items: items,
|
||||
shape: "banner",
|
||||
preferBanner: true,
|
||||
context: "movies",
|
||||
lazy: true
|
||||
});
|
||||
} else if (viewStyle == "List") {
|
||||
html = listView.getListViewHtml({
|
||||
items: items,
|
||||
context: "movies",
|
||||
sortBy: query.SortBy
|
||||
});
|
||||
} else if (viewStyle == "PosterCard") {
|
||||
html = cardBuilder.getCardsHtml({
|
||||
items: items,
|
||||
shape: "portrait",
|
||||
context: "movies",
|
||||
showTitle: true,
|
||||
showYear: true,
|
||||
centerText: true,
|
||||
lazy: true,
|
||||
cardLayout: true
|
||||
});
|
||||
} else {
|
||||
html = cardBuilder.getCardsHtml({
|
||||
items: items,
|
||||
shape: "portrait",
|
||||
context: "movies",
|
||||
overlayPlayButton: true,
|
||||
showTitle: true,
|
||||
showYear: true,
|
||||
centerText: true
|
||||
});
|
||||
}
|
||||
|
||||
return html;
|
||||
}
|
||||
|
||||
function initPage(tabContent) {
|
||||
@@ -114,8 +152,9 @@ define(["loading", "layoutManager", "userSettings", "events", "libraryBrowser",
|
||||
itemsContainer.getItemsHtml = getItemsHtml;
|
||||
itemsContainer.afterRefresh = afterRefresh;
|
||||
var alphaPickerElement = tabContent.querySelector(".alphaPicker");
|
||||
|
||||
if (alphaPickerElement) {
|
||||
alphaPickerElement.addEventListener("alphavaluechanged", function(e) {
|
||||
alphaPickerElement.addEventListener("alphavaluechanged", function (e) {
|
||||
var newValue = e.detail.value;
|
||||
query.NameStartsWithOrGreater = newValue;
|
||||
query.StartIndex = 0;
|
||||
@@ -125,109 +164,132 @@ define(["loading", "layoutManager", "userSettings", "events", "libraryBrowser",
|
||||
element: alphaPickerElement,
|
||||
valueChangeEvent: "click"
|
||||
});
|
||||
|
||||
if (layoutManager.desktop || layoutManager.mobile) {
|
||||
alphaPickerElement.classList.add("alphabetPicker-right");
|
||||
itemsContainer.classList.remove("padded-left-withalphapicker");
|
||||
itemsContainer.classList.add("padded-right-withalphapicker");
|
||||
}
|
||||
}
|
||||
|
||||
var btnFilter = tabContent.querySelector(".btnFilter");
|
||||
btnFilter && btnFilter.addEventListener("click", function() {
|
||||
self.showFilterMenu()
|
||||
});
|
||||
|
||||
if (btnFilter) {
|
||||
btnFilter.addEventListener("click", function () {
|
||||
self.showFilterMenu();
|
||||
});
|
||||
}
|
||||
var btnSort = tabContent.querySelector(".btnSort");
|
||||
btnSort && btnSort.addEventListener("click", function(e) {
|
||||
libraryBrowser.showSortMenu({
|
||||
items: [{
|
||||
name: Globalize.translate("OptionNameSort"),
|
||||
id: "SortName,ProductionYear"
|
||||
}, {
|
||||
name: Globalize.translate("OptionImdbRating"),
|
||||
id: "CommunityRating,SortName,ProductionYear"
|
||||
}, {
|
||||
name: Globalize.translate("OptionCriticRating"),
|
||||
id: "CriticRating,SortName,ProductionYear"
|
||||
}, {
|
||||
name: Globalize.translate("OptionDateAdded"),
|
||||
id: "DateCreated,SortName,ProductionYear"
|
||||
}, {
|
||||
name: Globalize.translate("OptionDatePlayed"),
|
||||
id: "DatePlayed,SortName,ProductionYear"
|
||||
}, {
|
||||
name: Globalize.translate("OptionParentalRating"),
|
||||
id: "OfficialRating,SortName,ProductionYear"
|
||||
}, {
|
||||
name: Globalize.translate("OptionPlayCount"),
|
||||
id: "PlayCount,SortName,ProductionYear"
|
||||
}, {
|
||||
name: Globalize.translate("OptionReleaseDate"),
|
||||
id: "PremiereDate,SortName,ProductionYear"
|
||||
}, {
|
||||
name: Globalize.translate("OptionRuntime"),
|
||||
id: "Runtime,SortName,ProductionYear"
|
||||
}],
|
||||
callback: function() {
|
||||
query.StartIndex = 0, userSettings.saveQuerySettings(savedQueryKey, query), itemsContainer.refreshItems()
|
||||
},
|
||||
query: query,
|
||||
button: e.target
|
||||
})
|
||||
});
|
||||
|
||||
if (btnSort) {
|
||||
btnSort.addEventListener("click", function (e) {
|
||||
libraryBrowser.showSortMenu({
|
||||
items: [{
|
||||
name: Globalize.translate("OptionNameSort"),
|
||||
id: "SortName,ProductionYear"
|
||||
}, {
|
||||
name: Globalize.translate("OptionImdbRating"),
|
||||
id: "CommunityRating,SortName,ProductionYear"
|
||||
}, {
|
||||
name: Globalize.translate("OptionCriticRating"),
|
||||
id: "CriticRating,SortName,ProductionYear"
|
||||
}, {
|
||||
name: Globalize.translate("OptionDateAdded"),
|
||||
id: "DateCreated,SortName,ProductionYear"
|
||||
}, {
|
||||
name: Globalize.translate("OptionDatePlayed"),
|
||||
id: "DatePlayed,SortName,ProductionYear"
|
||||
}, {
|
||||
name: Globalize.translate("OptionParentalRating"),
|
||||
id: "OfficialRating,SortName,ProductionYear"
|
||||
}, {
|
||||
name: Globalize.translate("OptionPlayCount"),
|
||||
id: "PlayCount,SortName,ProductionYear"
|
||||
}, {
|
||||
name: Globalize.translate("OptionReleaseDate"),
|
||||
id: "PremiereDate,SortName,ProductionYear"
|
||||
}, {
|
||||
name: Globalize.translate("OptionRuntime"),
|
||||
id: "Runtime,SortName,ProductionYear"
|
||||
}],
|
||||
callback: function () {
|
||||
query.StartIndex = 0;
|
||||
userSettings.saveQuerySettings(savedQueryKey, query);
|
||||
itemsContainer.refreshItems();
|
||||
},
|
||||
query: query,
|
||||
button: e.target
|
||||
});
|
||||
});
|
||||
}
|
||||
var btnSelectView = tabContent.querySelector(".btnSelectView");
|
||||
btnSelectView.addEventListener("click", function(e) {
|
||||
libraryBrowser.showLayoutMenu(e.target, self.getCurrentViewStyle(), "Banner,List,Poster,PosterCard,Thumb,ThumbCard".split(","))
|
||||
}), btnSelectView.addEventListener("layoutchange", function(e) {
|
||||
btnSelectView.addEventListener("click", function (e) {
|
||||
libraryBrowser.showLayoutMenu(e.target, self.getCurrentViewStyle(), "Banner,List,Poster,PosterCard,Thumb,ThumbCard".split(","));
|
||||
});
|
||||
btnSelectView.addEventListener("layoutchange", function (e) {
|
||||
var viewStyle = e.detail.viewStyle;
|
||||
userSettings.set(savedViewKey, viewStyle);
|
||||
query.StartIndex = 0;
|
||||
onViewStyleChange();
|
||||
itemsContainer.refreshItems();
|
||||
})
|
||||
});
|
||||
}
|
||||
var self = this,
|
||||
itemsContainer = tabContent.querySelector(".itemsContainer"),
|
||||
savedQueryKey = params.topParentId + "-" + options.mode,
|
||||
savedViewKey = savedQueryKey + "-view",
|
||||
query = {
|
||||
SortBy: "SortName,ProductionYear",
|
||||
SortOrder: "Ascending",
|
||||
IncludeItemTypes: "Movie",
|
||||
Recursive: !0,
|
||||
Fields: "PrimaryImageAspectRatio,MediaSourceCount,BasicSyncInfo",
|
||||
ImageTypeLimit: 1,
|
||||
EnableImageTypes: "Primary,Backdrop,Banner,Thumb",
|
||||
StartIndex: 0,
|
||||
Limit: 100,
|
||||
ParentId: params.topParentId
|
||||
},
|
||||
isLoading = false;
|
||||
if (options.mode === "favorites") query.IsFavorite = true;
|
||||
|
||||
var self = this;
|
||||
var itemsContainer = tabContent.querySelector(".itemsContainer");
|
||||
var savedQueryKey = params.topParentId + "-" + options.mode;
|
||||
var savedViewKey = savedQueryKey + "-view";
|
||||
var query = {
|
||||
SortBy: "SortName,ProductionYear",
|
||||
SortOrder: "Ascending",
|
||||
IncludeItemTypes: "Movie",
|
||||
Recursive: true,
|
||||
Fields: "PrimaryImageAspectRatio,MediaSourceCount,BasicSyncInfo",
|
||||
ImageTypeLimit: 1,
|
||||
EnableImageTypes: "Primary,Backdrop,Banner,Thumb",
|
||||
StartIndex: 0,
|
||||
Limit: 100,
|
||||
ParentId: params.topParentId
|
||||
};
|
||||
var isLoading = false;
|
||||
|
||||
if (options.mode === "favorites") {
|
||||
query.IsFavorite = true;
|
||||
}
|
||||
|
||||
query = userSettings.loadQuerySettings(savedQueryKey, query);
|
||||
self.showFilterMenu = function() {
|
||||
require(["components/filterdialog/filterdialog"], function(filterDialogFactory) {
|
||||
|
||||
self.showFilterMenu = function () {
|
||||
require(["components/filterdialog/filterdialog"], function (filterDialogFactory) {
|
||||
var filterDialog = new filterDialogFactory({
|
||||
query: query,
|
||||
mode: "movies",
|
||||
serverId: ApiClient.serverId()
|
||||
});
|
||||
events.on(filterDialog, "filterchange", function() {
|
||||
query.StartIndex = 0, itemsContainer.refreshItems()
|
||||
}), filterDialog.show()
|
||||
})
|
||||
events.on(filterDialog, "filterchange", function () {
|
||||
query.StartIndex = 0;
|
||||
itemsContainer.refreshItems();
|
||||
});
|
||||
filterDialog.show();
|
||||
});
|
||||
};
|
||||
self.getCurrentViewStyle = function() {
|
||||
return userSettings.get(savedViewKey) || "Poster"
|
||||
|
||||
self.getCurrentViewStyle = function () {
|
||||
return userSettings.get(savedViewKey) || "Poster";
|
||||
};
|
||||
self.initTab = function() {
|
||||
|
||||
self.initTab = function () {
|
||||
initPage(tabContent);
|
||||
onViewStyleChange();
|
||||
};
|
||||
self.renderTab = function() {
|
||||
|
||||
self.renderTab = function () {
|
||||
itemsContainer.refreshItems();
|
||||
updateFilterControls();
|
||||
};
|
||||
self.destroy = function() {
|
||||
itemsContainer = null
|
||||
}
|
||||
}
|
||||
|
||||
self.destroy = function () {
|
||||
itemsContainer = null;
|
||||
};
|
||||
};
|
||||
});
|
||||
|
||||
@@ -1,16 +1,16 @@
|
||||
define(["events", "layoutManager", "inputManager", "userSettings", "libraryMenu", "mainTabsManager", "cardBuilder", "dom", "imageLoader", "playbackManager", "emby-itemscontainer", "emby-tabs", "emby-button"], function(events, layoutManager, inputManager, userSettings, libraryMenu, mainTabsManager, cardBuilder, dom, imageLoader, playbackManager) {
|
||||
define(["events", "layoutManager", "inputManager", "userSettings", "libraryMenu", "mainTabsManager", "cardBuilder", "dom", "imageLoader", "playbackManager", "emby-itemscontainer", "emby-tabs", "emby-button"], function (events, layoutManager, inputManager, userSettings, libraryMenu, mainTabsManager, cardBuilder, dom, imageLoader, playbackManager) {
|
||||
"use strict";
|
||||
|
||||
function enableScrollX() {
|
||||
return !layoutManager.desktop
|
||||
return !layoutManager.desktop;
|
||||
}
|
||||
|
||||
function getPortraitShape() {
|
||||
return enableScrollX() ? "overflowPortrait" : "portrait"
|
||||
return enableScrollX() ? "overflowPortrait" : "portrait";
|
||||
}
|
||||
|
||||
function getThumbShape() {
|
||||
return enableScrollX() ? "overflowBackdrop" : "backdrop"
|
||||
return enableScrollX() ? "overflowBackdrop" : "backdrop";
|
||||
}
|
||||
|
||||
function loadLatest(page, userId, parentId) {
|
||||
@@ -21,118 +21,168 @@ define(["events", "layoutManager", "inputManager", "userSettings", "libraryMenu"
|
||||
ParentId: parentId,
|
||||
ImageTypeLimit: 1,
|
||||
EnableImageTypes: "Primary,Backdrop,Banner,Thumb",
|
||||
EnableTotalRecordCount: !1
|
||||
EnableTotalRecordCount: false
|
||||
};
|
||||
ApiClient.getJSON(ApiClient.getUrl("Users/" + userId + "/Items/Latest", options)).then(function(items) {
|
||||
var allowBottomPadding = !enableScrollX(),
|
||||
container = page.querySelector("#recentlyAddedItems");
|
||||
ApiClient.getJSON(ApiClient.getUrl("Users/" + userId + "/Items/Latest", options)).then(function (items) {
|
||||
var allowBottomPadding = !enableScrollX();
|
||||
var container = page.querySelector("#recentlyAddedItems");
|
||||
cardBuilder.buildCards(items, {
|
||||
itemsContainer: container,
|
||||
shape: getPortraitShape(),
|
||||
scalable: !0,
|
||||
overlayPlayButton: !0,
|
||||
scalable: true,
|
||||
overlayPlayButton: true,
|
||||
allowBottomPadding: allowBottomPadding,
|
||||
showTitle: !0,
|
||||
showYear: !0,
|
||||
centerText: !0
|
||||
})
|
||||
})
|
||||
showTitle: true,
|
||||
showYear: true,
|
||||
centerText: true
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function loadResume(page, userId, parentId) {
|
||||
var screenWidth = dom.getWindowSize().innerWidth,
|
||||
options = {
|
||||
SortBy: "DatePlayed",
|
||||
SortOrder: "Descending",
|
||||
IncludeItemTypes: "Movie",
|
||||
Filters: "IsResumable",
|
||||
Limit: screenWidth >= 1920 ? 5 : screenWidth >= 1600 ? 5 : 3,
|
||||
Recursive: !0,
|
||||
Fields: "PrimaryImageAspectRatio,MediaSourceCount,BasicSyncInfo",
|
||||
CollapseBoxSetItems: !1,
|
||||
ParentId: parentId,
|
||||
ImageTypeLimit: 1,
|
||||
EnableImageTypes: "Primary,Backdrop,Banner,Thumb",
|
||||
EnableTotalRecordCount: !1
|
||||
};
|
||||
ApiClient.getItems(userId, options).then(function(result) {
|
||||
result.Items.length ? page.querySelector("#resumableSection").classList.remove("hide") : page.querySelector("#resumableSection").classList.add("hide");
|
||||
var allowBottomPadding = !enableScrollX(),
|
||||
container = page.querySelector("#resumableItems");
|
||||
var screenWidth = dom.getWindowSize().innerWidth;
|
||||
var options = {
|
||||
SortBy: "DatePlayed",
|
||||
SortOrder: "Descending",
|
||||
IncludeItemTypes: "Movie",
|
||||
Filters: "IsResumable",
|
||||
Limit: screenWidth >= 1920 ? 5 : screenWidth >= 1600 ? 5 : 3,
|
||||
Recursive: true,
|
||||
Fields: "PrimaryImageAspectRatio,MediaSourceCount,BasicSyncInfo",
|
||||
CollapseBoxSetItems: false,
|
||||
ParentId: parentId,
|
||||
ImageTypeLimit: 1,
|
||||
EnableImageTypes: "Primary,Backdrop,Banner,Thumb",
|
||||
EnableTotalRecordCount: false
|
||||
};
|
||||
ApiClient.getItems(userId, options).then(function (result) {
|
||||
if (result.Items.length) {
|
||||
page.querySelector("#resumableSection").classList.remove("hide");
|
||||
} else {
|
||||
page.querySelector("#resumableSection").classList.add("hide");
|
||||
}
|
||||
|
||||
var allowBottomPadding = !enableScrollX();
|
||||
var container = page.querySelector("#resumableItems");
|
||||
cardBuilder.buildCards(result.Items, {
|
||||
itemsContainer: container,
|
||||
preferThumb: !0,
|
||||
preferThumb: true,
|
||||
shape: getThumbShape(),
|
||||
scalable: !0,
|
||||
overlayPlayButton: !0,
|
||||
scalable: true,
|
||||
overlayPlayButton: true,
|
||||
allowBottomPadding: allowBottomPadding,
|
||||
cardLayout: !1,
|
||||
showTitle: !0,
|
||||
showYear: !0,
|
||||
centerText: !0
|
||||
})
|
||||
})
|
||||
cardLayout: false,
|
||||
showTitle: true,
|
||||
showYear: true,
|
||||
centerText: true
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function getRecommendationHtml(recommendation) {
|
||||
var html = "",
|
||||
title = "";
|
||||
var html = "";
|
||||
var title = "";
|
||||
|
||||
switch (recommendation.RecommendationType) {
|
||||
case "SimilarToRecentlyPlayed":
|
||||
title = Globalize.translate("RecommendationBecauseYouWatched").replace("{0}", recommendation.BaselineItemName);
|
||||
break;
|
||||
|
||||
case "SimilarToLikedItem":
|
||||
title = Globalize.translate("RecommendationBecauseYouLike").replace("{0}", recommendation.BaselineItemName);
|
||||
break;
|
||||
|
||||
case "HasDirectorFromRecentlyPlayed":
|
||||
case "HasLikedDirector":
|
||||
title = Globalize.translate("RecommendationDirectedBy").replace("{0}", recommendation.BaselineItemName);
|
||||
break;
|
||||
|
||||
case "HasActorFromRecentlyPlayed":
|
||||
case "HasLikedActor":
|
||||
title = Globalize.translate("RecommendationStarring").replace("{0}", recommendation.BaselineItemName)
|
||||
title = Globalize.translate("RecommendationStarring").replace("{0}", recommendation.BaselineItemName);
|
||||
break;
|
||||
}
|
||||
html += '<div class="verticalSection">', html += '<h2 class="sectionTitle sectionTitle-cards padded-left">' + title + "</h2>";
|
||||
var allowBottomPadding = !0;
|
||||
return enableScrollX() ? (allowBottomPadding = !1, html += '<div is="emby-itemscontainer" class="itemsContainer scrollX hiddenScrollX padded-left padded-right">') : html += '<div is="emby-itemscontainer" class="itemsContainer vertical-wrap padded-left padded-right">', html += cardBuilder.getCardsHtml(recommendation.Items, {
|
||||
|
||||
html += '<div class="verticalSection">';
|
||||
html += '<h2 class="sectionTitle sectionTitle-cards padded-left">' + title + "</h2>";
|
||||
var allowBottomPadding = true;
|
||||
|
||||
if (enableScrollX()) {
|
||||
allowBottomPadding = false;
|
||||
html += '<div is="emby-itemscontainer" class="itemsContainer hiddenScrollX padded-left padded-right">';
|
||||
} else {
|
||||
html += '<div is="emby-itemscontainer" class="itemsContainer vertical-wrap padded-left padded-right">';
|
||||
}
|
||||
|
||||
html += cardBuilder.getCardsHtml(recommendation.Items, {
|
||||
shape: getPortraitShape(),
|
||||
scalable: !0,
|
||||
overlayPlayButton: !0,
|
||||
scalable: true,
|
||||
overlayPlayButton: true,
|
||||
allowBottomPadding: allowBottomPadding
|
||||
}), html += "</div>", html += "</div>"
|
||||
});
|
||||
html += "</div>";
|
||||
html += "</div>";
|
||||
return html;
|
||||
}
|
||||
|
||||
function loadSuggestions(page, userId, parentId) {
|
||||
var screenWidth = dom.getWindowSize().innerWidth,
|
||||
url = ApiClient.getUrl("Movies/Recommendations", {
|
||||
userId: userId,
|
||||
categoryLimit: 6,
|
||||
ItemLimit: screenWidth >= 1920 ? 8 : screenWidth >= 1600 ? 8 : screenWidth >= 1200 ? 6 : 5,
|
||||
Fields: "PrimaryImageAspectRatio,MediaSourceCount,BasicSyncInfo",
|
||||
ImageTypeLimit: 1,
|
||||
EnableImageTypes: "Primary,Backdrop,Banner,Thumb"
|
||||
});
|
||||
ApiClient.getJSON(url).then(function(recommendations) {
|
||||
if (!recommendations.length) return page.querySelector(".noItemsMessage").classList.remove("hide"), void(page.querySelector(".recommendations").innerHTML = "");
|
||||
var screenWidth = dom.getWindowSize().innerWidth;
|
||||
var url = ApiClient.getUrl("Movies/Recommendations", {
|
||||
userId: userId,
|
||||
categoryLimit: 6,
|
||||
ItemLimit: screenWidth >= 1920 ? 8 : screenWidth >= 1600 ? 8 : screenWidth >= 1200 ? 6 : 5,
|
||||
Fields: "PrimaryImageAspectRatio,MediaSourceCount,BasicSyncInfo",
|
||||
ImageTypeLimit: 1,
|
||||
EnableImageTypes: "Primary,Backdrop,Banner,Thumb"
|
||||
});
|
||||
ApiClient.getJSON(url).then(function (recommendations) {
|
||||
if (!recommendations.length) {
|
||||
page.querySelector(".noItemsMessage").classList.remove("hide");
|
||||
page.querySelector(".recommendations").innerHTML = "";
|
||||
return;
|
||||
}
|
||||
|
||||
var html = recommendations.map(getRecommendationHtml).join("");
|
||||
page.querySelector(".noItemsMessage").classList.add("hide");
|
||||
var recs = page.querySelector(".recommendations");
|
||||
recs.innerHTML = html, imageLoader.lazyChildren(recs)
|
||||
})
|
||||
recs.innerHTML = html;
|
||||
imageLoader.lazyChildren(recs);
|
||||
});
|
||||
}
|
||||
|
||||
function setScrollClasses(elem, scrollX) {
|
||||
scrollX ? (elem.classList.add("hiddenScrollX"), layoutManager.tv && elem.classList.add("smoothScrollX"), elem.classList.add("scrollX"), elem.classList.remove("vertical-wrap")) : (elem.classList.remove("hiddenScrollX"), elem.classList.remove("smoothScrollX"), elem.classList.remove("scrollX"), elem.classList.add("vertical-wrap"))
|
||||
if (scrollX) {
|
||||
elem.classList.add("hiddenScrollX");
|
||||
|
||||
if (layoutManager.tv) {
|
||||
elem.classList.add("smoothScrollX");
|
||||
}
|
||||
|
||||
elem.classList.add("scrollX");
|
||||
elem.classList.remove("vertical-wrap");
|
||||
} else {
|
||||
elem.classList.remove("hiddenScrollX");
|
||||
elem.classList.remove("smoothScrollX");
|
||||
elem.classList.remove("scrollX");
|
||||
elem.classList.add("vertical-wrap");
|
||||
}
|
||||
}
|
||||
|
||||
function initSuggestedTab(page, tabContent) {
|
||||
for (var containers = tabContent.querySelectorAll(".itemsContainer"), i = 0, length = containers.length; i < length; i++) setScrollClasses(containers[i], enableScrollX())
|
||||
var containers = tabContent.querySelectorAll(".itemsContainer");
|
||||
|
||||
for (var i = 0, length = containers.length; i < length; i++) {
|
||||
setScrollClasses(containers[i], enableScrollX());
|
||||
}
|
||||
}
|
||||
|
||||
function loadSuggestionsTab(view, params, tabContent) {
|
||||
var parentId = params.topParentId,
|
||||
userId = ApiClient.getCurrentUserId();
|
||||
console.log("loadSuggestionsTab"), loadResume(tabContent, userId, parentId), loadLatest(tabContent, userId, parentId), loadSuggestions(tabContent, userId, parentId)
|
||||
var parentId = params.topParentId;
|
||||
var userId = ApiClient.getCurrentUserId();
|
||||
console.log("loadSuggestionsTab");
|
||||
loadResume(tabContent, userId, parentId);
|
||||
loadLatest(tabContent, userId, parentId);
|
||||
loadSuggestions(tabContent, userId, parentId);
|
||||
}
|
||||
|
||||
function getTabs() {
|
||||
@@ -151,126 +201,196 @@ define(["events", "layoutManager", "inputManager", "userSettings", "libraryMenu"
|
||||
}, {
|
||||
name: Globalize.translate("ButtonSearch"),
|
||||
cssClass: "searchTabButton"
|
||||
}]
|
||||
}];
|
||||
}
|
||||
|
||||
function getDefaultTabIndex(folderId) {
|
||||
switch (userSettings.get("landing-" + folderId)) {
|
||||
case "suggestions":
|
||||
return 1;
|
||||
|
||||
case "favorites":
|
||||
return 3;
|
||||
|
||||
case "collections":
|
||||
return 4;
|
||||
|
||||
case "genres":
|
||||
return 5;
|
||||
|
||||
default:
|
||||
return 0
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
return function(view, params) {
|
||||
|
||||
return function (view, params) {
|
||||
function onBeforeTabChange(e) {
|
||||
preLoadTab(view, parseInt(e.detail.selectedTabIndex))
|
||||
preLoadTab(view, parseInt(e.detail.selectedTabIndex));
|
||||
}
|
||||
|
||||
function onTabChange(e) {
|
||||
var newIndex = parseInt(e.detail.selectedTabIndex);
|
||||
loadTab(view, newIndex)
|
||||
loadTab(view, newIndex);
|
||||
}
|
||||
|
||||
function getTabContainers() {
|
||||
return view.querySelectorAll(".pageTabContent")
|
||||
return view.querySelectorAll(".pageTabContent");
|
||||
}
|
||||
|
||||
function initTabs() {
|
||||
mainTabsManager.setTabs(view, currentTabIndex, getTabs, getTabContainers, onBeforeTabChange, onTabChange)
|
||||
mainTabsManager.setTabs(view, currentTabIndex, getTabs, getTabContainers, onBeforeTabChange, onTabChange);
|
||||
}
|
||||
|
||||
function getTabController(page, index, callback) {
|
||||
var depends = [];
|
||||
|
||||
switch (index) {
|
||||
case 0:
|
||||
depends.push("controllers/movies/movies");
|
||||
break;
|
||||
|
||||
case 1:
|
||||
break;
|
||||
|
||||
case 2:
|
||||
depends.push("controllers/movies/movietrailers");
|
||||
break;
|
||||
|
||||
case 3:
|
||||
depends.push("controllers/movies/movies");
|
||||
break;
|
||||
|
||||
case 4:
|
||||
depends.push("controllers/movies/moviecollections");
|
||||
break;
|
||||
|
||||
case 5:
|
||||
depends.push("controllers/movies/moviegenres");
|
||||
break;
|
||||
|
||||
case 6:
|
||||
depends.push("scripts/searchtab")
|
||||
depends.push("scripts/searchtab");
|
||||
}
|
||||
require(depends, function(controllerFactory) {
|
||||
|
||||
require(depends, function (controllerFactory) {
|
||||
var tabContent;
|
||||
index === suggestionsTabIndex && (tabContent = view.querySelector(".pageTabContent[data-index='" + index + "']"), self.tabContent = tabContent);
|
||||
|
||||
if (index === suggestionsTabIndex) {
|
||||
tabContent = view.querySelector(".pageTabContent[data-index='" + index + "']");
|
||||
self.tabContent = tabContent;
|
||||
}
|
||||
|
||||
var controller = tabControllers[index];
|
||||
controller || (tabContent = view.querySelector(".pageTabContent[data-index='" + index + "']"), controller = index === suggestionsTabIndex ? self : 6 === index ? new controllerFactory(view, tabContent, {
|
||||
collectionType: "movies",
|
||||
parentId: params.topParentId
|
||||
}) : 0 === index || 3 === index ? new controllerFactory(view, params, tabContent, {
|
||||
mode: index ? "favorites" : "movies"
|
||||
}) : new controllerFactory(view, params, tabContent), tabControllers[index] = controller, controller.initTab && controller.initTab()), callback(controller)
|
||||
})
|
||||
|
||||
if (!controller) {
|
||||
tabContent = view.querySelector(".pageTabContent[data-index='" + index + "']");
|
||||
|
||||
if (index === suggestionsTabIndex) {
|
||||
controller = self;
|
||||
} else if (index === 6) {
|
||||
controller = new controllerFactory(view, tabContent, {
|
||||
collectionType: "movies",
|
||||
parentId: params.topParentId
|
||||
});
|
||||
} else if (index == 0 || index == 3) {
|
||||
controller = new controllerFactory(view, params, tabContent, {
|
||||
mode: index ? "favorites" : "movies"
|
||||
});
|
||||
} else {
|
||||
controller = new controllerFactory(view, params, tabContent);
|
||||
}
|
||||
|
||||
tabControllers[index] = controller;
|
||||
|
||||
if (controller.initTab) {
|
||||
controller.initTab();
|
||||
}
|
||||
}
|
||||
|
||||
callback(controller);
|
||||
});
|
||||
}
|
||||
|
||||
function preLoadTab(page, index) {
|
||||
getTabController(page, index, function(controller) {
|
||||
-1 == renderedTabs.indexOf(index) && controller.preRender && controller.preRender()
|
||||
})
|
||||
getTabController(page, index, function (controller) {
|
||||
if (renderedTabs.indexOf(index) == -1 && controller.preRender) {
|
||||
controller.preRender();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function loadTab(page, index) {
|
||||
currentTabIndex = index, getTabController(page, index, function(controller) {
|
||||
initialTabIndex = null, -1 == renderedTabs.indexOf(index) && (renderedTabs.push(index), controller.renderTab())
|
||||
})
|
||||
currentTabIndex = index;
|
||||
getTabController(page, index, function (controller) {
|
||||
initialTabIndex = null;
|
||||
|
||||
if (renderedTabs.indexOf(index) == -1) {
|
||||
renderedTabs.push(index);
|
||||
controller.renderTab();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function onPlaybackStop(e, state) {
|
||||
state.NowPlayingItem && "Video" == state.NowPlayingItem.MediaType && (renderedTabs = [], mainTabsManager.getTabsElement().triggerTabChange())
|
||||
if (state.NowPlayingItem && state.NowPlayingItem.MediaType == "Video") {
|
||||
renderedTabs = [];
|
||||
mainTabsManager.getTabsElement().triggerTabChange();
|
||||
}
|
||||
}
|
||||
|
||||
function onInputCommand(e) {
|
||||
switch (e.detail.command) {
|
||||
case "search":
|
||||
e.preventDefault(), Dashboard.navigate("search.html?collectionType=movies&parentId=" + params.topParentId)
|
||||
e.preventDefault();
|
||||
Dashboard.navigate("search.html?collectionType=movies&parentId=" + params.topParentId);
|
||||
}
|
||||
}
|
||||
var isViewRestored, self = this,
|
||||
currentTabIndex = parseInt(params.tab || getDefaultTabIndex(params.topParentId)),
|
||||
initialTabIndex = currentTabIndex,
|
||||
suggestionsTabIndex = 1;
|
||||
self.initTab = function() {
|
||||
|
||||
var isViewRestored;
|
||||
var self = this;
|
||||
var currentTabIndex = parseInt(params.tab || getDefaultTabIndex(params.topParentId));
|
||||
var initialTabIndex = currentTabIndex;
|
||||
var suggestionsTabIndex = 1;
|
||||
|
||||
self.initTab = function () {
|
||||
var tabContent = view.querySelector(".pageTabContent[data-index='" + suggestionsTabIndex + "']");
|
||||
initSuggestedTab(view, tabContent);
|
||||
}, self.renderTab = function() {
|
||||
var tabContent = view.querySelector(".pageTabContent[data-index='" + suggestionsTabIndex + "']");
|
||||
loadSuggestionsTab(view, params, tabContent)
|
||||
};
|
||||
var tabControllers = [],
|
||||
renderedTabs = [];
|
||||
view.addEventListener("viewshow", function(e) {
|
||||
|
||||
self.renderTab = function () {
|
||||
var tabContent = view.querySelector(".pageTabContent[data-index='" + suggestionsTabIndex + "']");
|
||||
loadSuggestionsTab(view, params, tabContent);
|
||||
};
|
||||
|
||||
var tabControllers = [];
|
||||
var renderedTabs = [];
|
||||
view.addEventListener("viewshow", function (e) {
|
||||
if (isViewRestored = e.detail.isRestored, initTabs(), !view.getAttribute("data-title")) {
|
||||
var parentId = params.topParentId;
|
||||
parentId ? ApiClient.getItem(ApiClient.getCurrentUserId(), parentId).then(function(item) {
|
||||
view.setAttribute("data-title", item.Name), libraryMenu.setTitle(item.Name)
|
||||
}) : (view.setAttribute("data-title", Globalize.translate("TabMovies")), libraryMenu.setTitle(Globalize.translate("TabMovies")))
|
||||
|
||||
if (parentId) {
|
||||
ApiClient.getItem(ApiClient.getCurrentUserId(), parentId).then(function (item) {
|
||||
view.setAttribute("data-title", item.Name);
|
||||
libraryMenu.setTitle(item.Name);
|
||||
});
|
||||
} else {
|
||||
view.setAttribute("data-title", Globalize.translate("TabMovies"));
|
||||
libraryMenu.setTitle(Globalize.translate("TabMovies"));
|
||||
}
|
||||
}
|
||||
events.on(playbackManager, "playbackstop", onPlaybackStop), inputManager.on(window, onInputCommand)
|
||||
}), view.addEventListener("viewbeforehide", function(e) {
|
||||
inputManager.off(window, onInputCommand)
|
||||
}), view.addEventListener("viewdestroy", function(e) {
|
||||
tabControllers.forEach(function(t) {
|
||||
t.destroy && t.destroy()
|
||||
})
|
||||
})
|
||||
}
|
||||
});
|
||||
|
||||
events.on(playbackManager, "playbackstop", onPlaybackStop);
|
||||
inputManager.on(window, onInputCommand);
|
||||
});
|
||||
view.addEventListener("viewbeforehide", function (e) {
|
||||
inputManager.off(window, onInputCommand);
|
||||
});
|
||||
view.addEventListener("viewdestroy", function (e) {
|
||||
tabControllers.forEach(function (t) {
|
||||
if (t.destroy) {
|
||||
t.destroy();
|
||||
}
|
||||
});
|
||||
});
|
||||
};
|
||||
});
|
||||
|
||||
@@ -1,185 +1,261 @@
|
||||
define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", "alphaPicker", "listView", "cardBuilder", "apphost", "emby-itemscontainer"], function(layoutManager, loading, events, libraryBrowser, imageLoader, alphaPicker, listView, cardBuilder, appHost) {
|
||||
define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", "alphaPicker", "listView", "cardBuilder", "apphost", "emby-itemscontainer"], function (layoutManager, loading, events, libraryBrowser, imageLoader, alphaPicker, listView, cardBuilder, appHost) {
|
||||
"use strict";
|
||||
return function(view, params, tabContent) {
|
||||
|
||||
return function (view, params, tabContent) {
|
||||
function getPageData(context) {
|
||||
var key = getSavedQueryKey(context),
|
||||
pageData = data[key];
|
||||
return pageData || (pageData = data[key] = {
|
||||
query: {
|
||||
SortBy: "SortName",
|
||||
SortOrder: "Ascending",
|
||||
IncludeItemTypes: "Trailer",
|
||||
Recursive: !0,
|
||||
Fields: "PrimaryImageAspectRatio,SortName,BasicSyncInfo",
|
||||
ImageTypeLimit: 1,
|
||||
EnableImageTypes: "Primary,Backdrop,Banner,Thumb",
|
||||
StartIndex: 0,
|
||||
Limit: pageSize
|
||||
},
|
||||
view: libraryBrowser.getSavedView(key) || "Poster"
|
||||
}, libraryBrowser.loadSavedQueryValues(key, pageData.query)), pageData
|
||||
var key = getSavedQueryKey(context);
|
||||
var pageData = data[key];
|
||||
|
||||
if (!pageData) {
|
||||
pageData = data[key] = {
|
||||
query: {
|
||||
SortBy: "SortName",
|
||||
SortOrder: "Ascending",
|
||||
IncludeItemTypes: "Trailer",
|
||||
Recursive: true,
|
||||
Fields: "PrimaryImageAspectRatio,SortName,BasicSyncInfo",
|
||||
ImageTypeLimit: 1,
|
||||
EnableImageTypes: "Primary,Backdrop,Banner,Thumb",
|
||||
StartIndex: 0,
|
||||
Limit: pageSize
|
||||
},
|
||||
view: libraryBrowser.getSavedView(key) || "Poster"
|
||||
};
|
||||
libraryBrowser.loadSavedQueryValues(key, pageData.query);
|
||||
}
|
||||
|
||||
return pageData;
|
||||
}
|
||||
|
||||
function getQuery(context) {
|
||||
return getPageData(context).query
|
||||
return getPageData(context).query;
|
||||
}
|
||||
|
||||
function getSavedQueryKey(context) {
|
||||
return context.savedQueryKey || (context.savedQueryKey = libraryBrowser.getSavedQueryKey("trailers")), context.savedQueryKey
|
||||
if (!context.savedQueryKey) {
|
||||
context.savedQueryKey = libraryBrowser.getSavedQueryKey("trailers");
|
||||
}
|
||||
|
||||
return context.savedQueryKey;
|
||||
}
|
||||
|
||||
function reloadItems() {
|
||||
loading.show();
|
||||
isLoading = true;
|
||||
var query = getQuery(tabContent);
|
||||
ApiClient.getItems(ApiClient.getCurrentUserId(), query).then(function(result) {
|
||||
ApiClient.getItems(ApiClient.getCurrentUserId(), query).then(function (result) {
|
||||
function onNextPageClick() {
|
||||
if (isLoading) return;
|
||||
query.StartIndex += query.Limit, reloadItems()
|
||||
if (isLoading) {
|
||||
return;
|
||||
}
|
||||
|
||||
query.StartIndex += query.Limit;
|
||||
reloadItems();
|
||||
}
|
||||
|
||||
function onPreviousPageClick() {
|
||||
if (isLoading) return;
|
||||
query.StartIndex -= query.Limit, reloadItems()
|
||||
if (isLoading) {
|
||||
return;
|
||||
}
|
||||
|
||||
query.StartIndex -= query.Limit;
|
||||
reloadItems();
|
||||
}
|
||||
window.scrollTo(0, 0), updateFilterControls(tabContent);
|
||||
var html, pagingHtml = libraryBrowser.getQueryPagingHtml({
|
||||
startIndex: query.StartIndex,
|
||||
limit: query.Limit,
|
||||
totalRecordCount: result.TotalRecordCount,
|
||||
showLimit: !1,
|
||||
updatePageSizeSetting: !1,
|
||||
addLayoutButton: !1,
|
||||
sortButton: !1,
|
||||
filterButton: !1
|
||||
}),
|
||||
viewStyle = self.getCurrentViewStyle();
|
||||
html = "Thumb" == viewStyle ? cardBuilder.getCardsHtml({
|
||||
items: result.Items,
|
||||
shape: "backdrop",
|
||||
preferThumb: !0,
|
||||
context: "movies",
|
||||
overlayPlayButton: !0
|
||||
}) : "ThumbCard" == viewStyle ? cardBuilder.getCardsHtml({
|
||||
items: result.Items,
|
||||
shape: "backdrop",
|
||||
preferThumb: !0,
|
||||
context: "movies",
|
||||
cardLayout: !0,
|
||||
showTitle: !0,
|
||||
showYear: !0,
|
||||
centerText: !0
|
||||
}) : "Banner" == viewStyle ? cardBuilder.getCardsHtml({
|
||||
items: result.Items,
|
||||
shape: "banner",
|
||||
preferBanner: !0,
|
||||
context: "movies"
|
||||
}) : "List" == viewStyle ? listView.getListViewHtml({
|
||||
items: result.Items,
|
||||
context: "movies",
|
||||
sortBy: query.SortBy
|
||||
}) : "PosterCard" == viewStyle ? cardBuilder.getCardsHtml({
|
||||
items: result.Items,
|
||||
shape: "portrait",
|
||||
context: "movies",
|
||||
showTitle: !0,
|
||||
showYear: !0,
|
||||
centerText: !0,
|
||||
cardLayout: !0
|
||||
}) : cardBuilder.getCardsHtml({
|
||||
items: result.Items,
|
||||
shape: "portrait",
|
||||
context: "movies",
|
||||
centerText: !0,
|
||||
overlayPlayButton: !0,
|
||||
showTitle: !0,
|
||||
showYear: !0
|
||||
|
||||
window.scrollTo(0, 0);
|
||||
updateFilterControls(tabContent);
|
||||
var pagingHtml = libraryBrowser.getQueryPagingHtml({
|
||||
startIndex: query.StartIndex,
|
||||
limit: query.Limit,
|
||||
totalRecordCount: result.TotalRecordCount,
|
||||
showLimit: false,
|
||||
updatePageSizeSetting: false,
|
||||
addLayoutButton: false,
|
||||
sortButton: false,
|
||||
filterButton: false
|
||||
});
|
||||
var i, length, elems = tabContent.querySelectorAll(".paging");
|
||||
for (i = 0, length = elems.length; i < length; i++) elems[i].innerHTML = pagingHtml;
|
||||
for (elems = tabContent.querySelectorAll(".btnNextPage"), i = 0, length = elems.length; i < length; i++) elems[i].addEventListener("click", onNextPageClick);
|
||||
for (elems = tabContent.querySelectorAll(".btnPreviousPage"), i = 0, length = elems.length; i < length; i++) elems[i].addEventListener("click", onPreviousPageClick);
|
||||
result.Items.length || (html = '<p style="text-align:center;">' + Globalize.translate("MessageNoTrailersFound") + "</p>");
|
||||
var html;
|
||||
var viewStyle = self.getCurrentViewStyle();
|
||||
|
||||
if (viewStyle == "Thumb") {
|
||||
html = cardBuilder.getCardsHtml({
|
||||
items: result.Items,
|
||||
shape: "backdrop",
|
||||
preferThumb: true,
|
||||
context: "movies",
|
||||
overlayPlayButton: true
|
||||
});
|
||||
} else if (viewStyle == "ThumbCard") {
|
||||
html = cardBuilder.getCardsHtml({
|
||||
items: result.Items,
|
||||
shape: "backdrop",
|
||||
preferThumb: true,
|
||||
context: "movies",
|
||||
cardLayout: true,
|
||||
showTitle: true,
|
||||
showYear: true,
|
||||
centerText: true
|
||||
});
|
||||
} else if (viewStyle == "Banner") {
|
||||
html = cardBuilder.getCardsHtml({
|
||||
items: result.Items,
|
||||
shape: "banner",
|
||||
preferBanner: true,
|
||||
context: "movies"
|
||||
});
|
||||
} else if (viewStyle == "List") {
|
||||
html = listView.getListViewHtml({
|
||||
items: result.Items,
|
||||
context: "movies",
|
||||
sortBy: query.SortBy
|
||||
});
|
||||
} else if (viewStyle == "PosterCard") {
|
||||
html = cardBuilder.getCardsHtml({
|
||||
items: result.Items,
|
||||
shape: "portrait",
|
||||
context: "movies",
|
||||
showTitle: true,
|
||||
showYear: true,
|
||||
cardLayout: true,
|
||||
centerText: true
|
||||
});
|
||||
} else {
|
||||
html = cardBuilder.getCardsHtml({
|
||||
items: result.Items,
|
||||
shape: "portrait",
|
||||
context: "movies",
|
||||
centerText: true,
|
||||
overlayPlayButton: true,
|
||||
showTitle: true,
|
||||
showYear: true
|
||||
});
|
||||
}
|
||||
|
||||
var i;
|
||||
var length;
|
||||
var elems = tabContent.querySelectorAll(".paging");
|
||||
|
||||
for (i = 0, length = elems.length; i < length; i++) {
|
||||
elems[i].innerHTML = pagingHtml;
|
||||
}
|
||||
|
||||
elems = tabContent.querySelectorAll(".btnNextPage");
|
||||
for (i = 0, length = elems.length; i < length; i++) {
|
||||
elems[i].addEventListener("click", onNextPageClick);
|
||||
}
|
||||
|
||||
elems = tabContent.querySelectorAll(".btnPreviousPage");
|
||||
for (i = 0, length = elems.length; i < length; i++) {
|
||||
elems[i].addEventListener("click", onPreviousPageClick);
|
||||
}
|
||||
|
||||
if (!result.Items.length) {
|
||||
html = '<p style="text-align:center;">' + Globalize.translate("MessageNoTrailersFound") + "</p>";
|
||||
}
|
||||
|
||||
var itemsContainer = tabContent.querySelector(".itemsContainer");
|
||||
itemsContainer.innerHTML = html;
|
||||
imageLoader.lazyChildren(itemsContainer);
|
||||
libraryBrowser.saveQueryValues(getSavedQueryKey(tabContent), query);
|
||||
loading.hide();
|
||||
isLoading = false;
|
||||
})
|
||||
});
|
||||
}
|
||||
|
||||
function updateFilterControls(tabContent) {
|
||||
var query = getQuery(tabContent);
|
||||
self.alphaPicker.value(query.NameStartsWithOrGreater)
|
||||
self.alphaPicker.value(query.NameStartsWithOrGreater);
|
||||
}
|
||||
var self = this,
|
||||
pageSize = 100,
|
||||
data = {},
|
||||
isLoading = false;
|
||||
self.showFilterMenu = function() {
|
||||
require(["components/filterdialog/filterdialog"], function(filterDialogFactory) {
|
||||
var filterDialog = new filterDialogFactory({
|
||||
query: getQuery(tabContent),
|
||||
mode: "movies",
|
||||
serverId: ApiClient.serverId()
|
||||
});
|
||||
events.on(filterDialog, "filterchange", function() {
|
||||
getQuery(tabContent).StartIndex = 0, reloadItems()
|
||||
}), filterDialog.show()
|
||||
})
|
||||
}, self.getCurrentViewStyle = function() {
|
||||
return getPageData(tabContent).view
|
||||
},
|
||||
function(tabContent) {
|
||||
var alphaPickerElement = tabContent.querySelector(".alphaPicker");
|
||||
if (alphaPickerElement.addEventListener("alphavaluechanged", function(e) {
|
||||
var newValue = e.detail.value,
|
||||
query = getQuery(tabContent);
|
||||
query.NameStartsWithOrGreater = newValue, query.StartIndex = 0, reloadItems()
|
||||
}), self.alphaPicker = new alphaPicker({
|
||||
element: alphaPickerElement,
|
||||
valueChangeEvent: "click"
|
||||
}), layoutManager.desktop || layoutManager.mobile) {
|
||||
tabContent.querySelector(".alphaPicker").classList.add("alphabetPicker-right");
|
||||
var itemsContainer = tabContent.querySelector(".itemsContainer");
|
||||
itemsContainer.classList.remove("padded-left-withalphapicker"), itemsContainer.classList.add("padded-right-withalphapicker")
|
||||
}
|
||||
tabContent.querySelector(".btnFilter").addEventListener("click", function() {
|
||||
self.showFilterMenu()
|
||||
}), tabContent.querySelector(".btnSort").addEventListener("click", function(e) {
|
||||
libraryBrowser.showSortMenu({
|
||||
items: [{
|
||||
name: Globalize.translate("OptionNameSort"),
|
||||
id: "SortName"
|
||||
}, {
|
||||
name: Globalize.translate("OptionImdbRating"),
|
||||
id: "CommunityRating,SortName"
|
||||
}, {
|
||||
name: Globalize.translate("OptionDateAdded"),
|
||||
id: "DateCreated,SortName"
|
||||
}, {
|
||||
name: Globalize.translate("OptionDatePlayed"),
|
||||
id: "DatePlayed,SortName"
|
||||
}, {
|
||||
name: Globalize.translate("OptionParentalRating"),
|
||||
id: "OfficialRating,SortName"
|
||||
}, {
|
||||
name: Globalize.translate("OptionPlayCount"),
|
||||
id: "PlayCount,SortName"
|
||||
}, {
|
||||
name: Globalize.translate("OptionReleaseDate"),
|
||||
id: "PremiereDate,SortName"
|
||||
}],
|
||||
callback: function() {
|
||||
getQuery(tabContent).StartIndex = 0, reloadItems()
|
||||
},
|
||||
query: getQuery(tabContent),
|
||||
button: e.target
|
||||
})
|
||||
})
|
||||
}(tabContent), self.renderTab = function() {
|
||||
reloadItems(), updateFilterControls(tabContent)
|
||||
}, self.destroy = function() {}
|
||||
}
|
||||
|
||||
var self = this;
|
||||
var pageSize = 100;
|
||||
var data = {};
|
||||
var isLoading = false;
|
||||
|
||||
self.showFilterMenu = function () {
|
||||
require(["components/filterdialog/filterdialog"], function (filterDialogFactory) {
|
||||
var filterDialog = new filterDialogFactory({
|
||||
query: getQuery(tabContent),
|
||||
mode: "movies",
|
||||
serverId: ApiClient.serverId()
|
||||
});
|
||||
events.on(filterDialog, "filterchange", function () {
|
||||
getQuery(tabContent).StartIndex = 0;
|
||||
reloadItems();
|
||||
});
|
||||
filterDialog.show();
|
||||
});
|
||||
};
|
||||
|
||||
self.getCurrentViewStyle = function () {
|
||||
return getPageData(tabContent).view;
|
||||
};
|
||||
|
||||
function initPage(tabContent) {
|
||||
var alphaPickerElement = tabContent.querySelector(".alphaPicker");
|
||||
alphaPickerElement.addEventListener("alphavaluechanged", function (e) {
|
||||
var newValue = e.detail.value;
|
||||
var query = getQuery(tabContent);
|
||||
query.NameStartsWithOrGreater = newValue;
|
||||
query.StartIndex = 0;
|
||||
reloadItems();
|
||||
});
|
||||
self.alphaPicker = new alphaPicker({
|
||||
element: alphaPickerElement,
|
||||
valueChangeEvent: "click"
|
||||
});
|
||||
|
||||
if (layoutManager.desktop || layoutManager.mobile) {
|
||||
tabContent.querySelector(".alphaPicker").classList.add("alphabetPicker-right");
|
||||
var itemsContainer = tabContent.querySelector(".itemsContainer");
|
||||
itemsContainer.classList.remove("padded-left-withalphapicker");
|
||||
itemsContainer.classList.add("padded-right-withalphapicker");
|
||||
}
|
||||
|
||||
tabContent.querySelector(".btnFilter").addEventListener("click", function () {
|
||||
self.showFilterMenu();
|
||||
});
|
||||
tabContent.querySelector(".btnSort").addEventListener("click", function (e) {
|
||||
libraryBrowser.showSortMenu({
|
||||
items: [{
|
||||
name: Globalize.translate("OptionNameSort"),
|
||||
id: "SortName"
|
||||
}, {
|
||||
name: Globalize.translate("OptionImdbRating"),
|
||||
id: "CommunityRating,SortName"
|
||||
}, {
|
||||
name: Globalize.translate("OptionDateAdded"),
|
||||
id: "DateCreated,SortName"
|
||||
}, {
|
||||
name: Globalize.translate("OptionDatePlayed"),
|
||||
id: "DatePlayed,SortName"
|
||||
}, {
|
||||
name: Globalize.translate("OptionParentalRating"),
|
||||
id: "OfficialRating,SortName"
|
||||
}, {
|
||||
name: Globalize.translate("OptionPlayCount"),
|
||||
id: "PlayCount,SortName"
|
||||
}, {
|
||||
name: Globalize.translate("OptionReleaseDate"),
|
||||
id: "PremiereDate,SortName"
|
||||
}],
|
||||
callback: function () {
|
||||
getQuery(tabContent).StartIndex = 0;
|
||||
reloadItems();
|
||||
},
|
||||
query: getQuery(tabContent),
|
||||
button: e.target
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
initPage(tabContent);
|
||||
|
||||
self.renderTab = function () {
|
||||
reloadItems();
|
||||
updateFilterControls(tabContent);
|
||||
};
|
||||
|
||||
self.destroy = function () {};
|
||||
};
|
||||
});
|
||||
|
||||
@@ -1,190 +1,275 @@
|
||||
define(["layoutManager", "playbackManager", "loading", "events", "libraryBrowser", "imageLoader", "alphaPicker", "listView", "cardBuilder", "apphost", "emby-itemscontainer"], function(layoutManager, playbackManager, loading, events, libraryBrowser, imageLoader, alphaPicker, listView, cardBuilder, appHost) {
|
||||
define(["layoutManager", "playbackManager", "loading", "events", "libraryBrowser", "imageLoader", "alphaPicker", "listView", "cardBuilder", "apphost", "emby-itemscontainer"], function (layoutManager, playbackManager, loading, events, libraryBrowser, imageLoader, alphaPicker, listView, cardBuilder, appHost) {
|
||||
"use strict";
|
||||
return function(view, params, tabContent) {
|
||||
|
||||
return function (view, params, tabContent) {
|
||||
function playAll() {
|
||||
ApiClient.getItem(ApiClient.getCurrentUserId(), params.topParentId).then(function(item) {
|
||||
ApiClient.getItem(ApiClient.getCurrentUserId(), params.topParentId).then(function (item) {
|
||||
playbackManager.play({
|
||||
items: [item]
|
||||
})
|
||||
})
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function shuffle() {
|
||||
ApiClient.getItem(ApiClient.getCurrentUserId(), params.topParentId).then(function(item) {
|
||||
ApiClient.getItem(ApiClient.getCurrentUserId(), params.topParentId).then(function (item) {
|
||||
getQuery();
|
||||
playbackManager.shuffle(item, null)
|
||||
})
|
||||
playbackManager.shuffle(item, null);
|
||||
});
|
||||
}
|
||||
|
||||
function getPageData() {
|
||||
var key = getSavedQueryKey();
|
||||
return pageData || (pageData = {
|
||||
query: {
|
||||
SortBy: "SortName",
|
||||
SortOrder: "Ascending",
|
||||
IncludeItemTypes: "MusicAlbum",
|
||||
Recursive: !0,
|
||||
Fields: "PrimaryImageAspectRatio,SortName,BasicSyncInfo",
|
||||
ImageTypeLimit: 1,
|
||||
EnableImageTypes: "Primary,Backdrop,Banner,Thumb",
|
||||
StartIndex: 0,
|
||||
Limit: pageSize
|
||||
},
|
||||
view: libraryBrowser.getSavedView(key) || "Poster"
|
||||
}, pageData.query.ParentId = params.topParentId, libraryBrowser.loadSavedQueryValues(key, pageData.query)), pageData
|
||||
|
||||
if (!pageData) {
|
||||
pageData = {
|
||||
query: {
|
||||
SortBy: "SortName",
|
||||
SortOrder: "Ascending",
|
||||
IncludeItemTypes: "MusicAlbum",
|
||||
Recursive: true,
|
||||
Fields: "PrimaryImageAspectRatio,SortName,BasicSyncInfo",
|
||||
ImageTypeLimit: 1,
|
||||
EnableImageTypes: "Primary,Backdrop,Banner,Thumb",
|
||||
StartIndex: 0,
|
||||
Limit: pageSize
|
||||
},
|
||||
view: libraryBrowser.getSavedView(key) || "Poster"
|
||||
};
|
||||
pageData.query.ParentId = params.topParentId;
|
||||
libraryBrowser.loadSavedQueryValues(key, pageData.query);
|
||||
}
|
||||
|
||||
return pageData;
|
||||
}
|
||||
|
||||
function getQuery() {
|
||||
return getPageData().query
|
||||
return getPageData().query;
|
||||
}
|
||||
|
||||
function getSavedQueryKey() {
|
||||
return savedQueryKey || (savedQueryKey = libraryBrowser.getSavedQueryKey("musicalbums")), savedQueryKey
|
||||
if (!savedQueryKey) {
|
||||
savedQueryKey = libraryBrowser.getSavedQueryKey("musicalbums");
|
||||
}
|
||||
|
||||
return savedQueryKey;
|
||||
}
|
||||
|
||||
function onViewStyleChange() {
|
||||
var viewStyle = self.getCurrentViewStyle(),
|
||||
itemsContainer = tabContent.querySelector(".itemsContainer");
|
||||
"List" == viewStyle ? (itemsContainer.classList.add("vertical-list"), itemsContainer.classList.remove("vertical-wrap")) : (itemsContainer.classList.remove("vertical-list"), itemsContainer.classList.add("vertical-wrap")), itemsContainer.innerHTML = ""
|
||||
var viewStyle = self.getCurrentViewStyle();
|
||||
var itemsContainer = tabContent.querySelector(".itemsContainer");
|
||||
|
||||
if ("List" == viewStyle) {
|
||||
itemsContainer.classList.add("vertical-list");
|
||||
itemsContainer.classList.remove("vertical-wrap");
|
||||
} else {
|
||||
itemsContainer.classList.remove("vertical-list");
|
||||
itemsContainer.classList.add("vertical-wrap");
|
||||
}
|
||||
|
||||
itemsContainer.innerHTML = "";
|
||||
}
|
||||
|
||||
function reloadItems(page) {
|
||||
loading.show();
|
||||
isLoading = true;
|
||||
var query = getQuery();
|
||||
ApiClient.getItems(ApiClient.getCurrentUserId(), query).then(function(result) {
|
||||
ApiClient.getItems(ApiClient.getCurrentUserId(), query).then(function (result) {
|
||||
function onNextPageClick() {
|
||||
if (isLoading) return;
|
||||
query.StartIndex += query.Limit, reloadItems(tabContent)
|
||||
if (isLoading) {
|
||||
return;
|
||||
}
|
||||
|
||||
query.StartIndex += query.Limit;
|
||||
reloadItems(tabContent);
|
||||
}
|
||||
|
||||
function onPreviousPageClick() {
|
||||
if (isLoading) return;
|
||||
query.StartIndex -= query.Limit, reloadItems(tabContent)
|
||||
if (isLoading) {
|
||||
return;
|
||||
}
|
||||
|
||||
query.StartIndex -= query.Limit;
|
||||
reloadItems(tabContent);
|
||||
}
|
||||
window.scrollTo(0, 0), updateFilterControls(page);
|
||||
var html, pagingHtml = libraryBrowser.getQueryPagingHtml({
|
||||
startIndex: query.StartIndex,
|
||||
limit: query.Limit,
|
||||
totalRecordCount: result.TotalRecordCount,
|
||||
showLimit: !1,
|
||||
updatePageSizeSetting: !1,
|
||||
addLayoutButton: !1,
|
||||
sortButton: !1,
|
||||
filterButton: !1
|
||||
}),
|
||||
viewStyle = self.getCurrentViewStyle();
|
||||
html = "List" == viewStyle ? listView.getListViewHtml({
|
||||
items: result.Items,
|
||||
context: "music",
|
||||
sortBy: query.SortBy,
|
||||
addToListButton: !0
|
||||
}) : "PosterCard" == viewStyle ? cardBuilder.getCardsHtml({
|
||||
items: result.Items,
|
||||
shape: "square",
|
||||
context: "music",
|
||||
showTitle: !0,
|
||||
coverImage: !0,
|
||||
showParentTitle: !0,
|
||||
lazy: !0,
|
||||
cardLayout: !0
|
||||
}) : cardBuilder.getCardsHtml({
|
||||
items: result.Items,
|
||||
shape: "square",
|
||||
context: "music",
|
||||
showTitle: !0,
|
||||
showParentTitle: !0,
|
||||
lazy: !0,
|
||||
centerText: !0,
|
||||
overlayPlayButton: !0
|
||||
|
||||
window.scrollTo(0, 0);
|
||||
updateFilterControls(page);
|
||||
var html;
|
||||
var pagingHtml = libraryBrowser.getQueryPagingHtml({
|
||||
startIndex: query.StartIndex,
|
||||
limit: query.Limit,
|
||||
totalRecordCount: result.TotalRecordCount,
|
||||
showLimit: false,
|
||||
updatePageSizeSetting: false,
|
||||
addLayoutButton: false,
|
||||
sortButton: false,
|
||||
filterButton: false
|
||||
});
|
||||
var i, length, elems = tabContent.querySelectorAll(".paging");
|
||||
for (i = 0, length = elems.length; i < length; i++) elems[i].innerHTML = pagingHtml;
|
||||
for (elems = tabContent.querySelectorAll(".btnNextPage"), i = 0, length = elems.length; i < length; i++) elems[i].addEventListener("click", onNextPageClick);
|
||||
for (elems = tabContent.querySelectorAll(".btnPreviousPage"), i = 0, length = elems.length; i < length; i++) elems[i].addEventListener("click", onPreviousPageClick);
|
||||
var viewStyle = self.getCurrentViewStyle();
|
||||
if (viewStyle == "List") {
|
||||
html = listView.getListViewHtml({
|
||||
items: result.Items,
|
||||
context: "music",
|
||||
sortBy: query.SortBy,
|
||||
addToListButton: true
|
||||
});
|
||||
} else if (viewStyle == "PosterCard") {
|
||||
html = cardBuilder.getCardsHtml({
|
||||
items: result.Items,
|
||||
shape: "square",
|
||||
context: "music",
|
||||
showTitle: true,
|
||||
coverImage: true,
|
||||
showParentTitle: true,
|
||||
lazy: true,
|
||||
cardLayout: true
|
||||
});
|
||||
} else {
|
||||
html = cardBuilder.getCardsHtml({
|
||||
items: result.Items,
|
||||
shape: "square",
|
||||
context: "music",
|
||||
showTitle: true,
|
||||
showParentTitle: true,
|
||||
lazy: true,
|
||||
centerText: true,
|
||||
overlayPlayButton: true
|
||||
});
|
||||
}
|
||||
var i;
|
||||
var length;
|
||||
var elems = tabContent.querySelectorAll(".paging");
|
||||
|
||||
for (i = 0, length = elems.length; i < length; i++) {
|
||||
elems[i].innerHTML = pagingHtml;
|
||||
}
|
||||
|
||||
elems = tabContent.querySelectorAll(".btnNextPage");
|
||||
for (i = 0, length = elems.length; i < length; i++) {
|
||||
elems[i].addEventListener("click", onNextPageClick);
|
||||
}
|
||||
|
||||
elems = tabContent.querySelectorAll(".btnPreviousPage");
|
||||
for (i = 0, length = elems.length; i < length; i++) {
|
||||
elems[i].addEventListener("click", onPreviousPageClick);
|
||||
}
|
||||
|
||||
var itemsContainer = tabContent.querySelector(".itemsContainer");
|
||||
itemsContainer.innerHTML = html;
|
||||
imageLoader.lazyChildren(itemsContainer);
|
||||
libraryBrowser.saveQueryValues(getSavedQueryKey(), query);
|
||||
loading.hide();
|
||||
isLoading = false;
|
||||
})
|
||||
});
|
||||
}
|
||||
|
||||
function updateFilterControls(tabContent) {
|
||||
var query = getQuery();
|
||||
self.alphaPicker.value(query.NameStartsWithOrGreater)
|
||||
self.alphaPicker.value(query.NameStartsWithOrGreater);
|
||||
}
|
||||
var savedQueryKey, pageData, self = this,
|
||||
pageSize = 100,
|
||||
isLoading = false;
|
||||
self.showFilterMenu = function() {
|
||||
require(["components/filterdialog/filterdialog"], function(filterDialogFactory) {
|
||||
var filterDialog = new filterDialogFactory({
|
||||
query: getQuery(),
|
||||
mode: "albums",
|
||||
serverId: ApiClient.serverId()
|
||||
});
|
||||
events.on(filterDialog, "filterchange", function() {
|
||||
getQuery().StartIndex = 0, reloadItems(tabContent)
|
||||
}), filterDialog.show()
|
||||
})
|
||||
}, self.getCurrentViewStyle = function() {
|
||||
return getPageData().view
|
||||
},
|
||||
function(tabContent) {
|
||||
var alphaPickerElement = tabContent.querySelector(".alphaPicker");
|
||||
if (alphaPickerElement.addEventListener("alphavaluechanged", function(e) {
|
||||
var newValue = e.detail.value,
|
||||
query = getQuery();
|
||||
query.NameStartsWithOrGreater = newValue, query.StartIndex = 0, reloadItems(tabContent)
|
||||
}), self.alphaPicker = new alphaPicker({
|
||||
element: alphaPickerElement,
|
||||
valueChangeEvent: "click"
|
||||
}), layoutManager.desktop || layoutManager.mobile) {
|
||||
tabContent.querySelector(".alphaPicker").classList.add("alphabetPicker-right");
|
||||
var itemsContainer = tabContent.querySelector(".itemsContainer");
|
||||
itemsContainer.classList.remove("padded-left-withalphapicker"), itemsContainer.classList.add("padded-right-withalphapicker")
|
||||
}
|
||||
tabContent.querySelector(".btnFilter").addEventListener("click", function() {
|
||||
self.showFilterMenu()
|
||||
}), tabContent.querySelector(".btnSort").addEventListener("click", function(e) {
|
||||
libraryBrowser.showSortMenu({
|
||||
items: [{
|
||||
name: Globalize.translate("OptionNameSort"),
|
||||
id: "SortName"
|
||||
}, {
|
||||
name: Globalize.translate("OptionAlbumArtist"),
|
||||
id: "AlbumArtist,SortName"
|
||||
}, {
|
||||
name: Globalize.translate("OptionCommunityRating"),
|
||||
id: "CommunityRating,SortName"
|
||||
}, {
|
||||
name: Globalize.translate("OptionCriticRating"),
|
||||
id: "CriticRating,SortName"
|
||||
}, {
|
||||
name: Globalize.translate("OptionDateAdded"),
|
||||
id: "DateCreated,SortName"
|
||||
}, {
|
||||
name: Globalize.translate("OptionReleaseDate"),
|
||||
id: "ProductionYear,PremiereDate,SortName"
|
||||
}],
|
||||
callback: function() {
|
||||
getQuery().StartIndex = 0, reloadItems(tabContent)
|
||||
},
|
||||
query: getQuery(),
|
||||
button: e.target
|
||||
})
|
||||
|
||||
var savedQueryKey;
|
||||
var pageData;
|
||||
var self = this;
|
||||
var pageSize = 100;
|
||||
var isLoading = false;
|
||||
|
||||
self.showFilterMenu = function () {
|
||||
require(["components/filterdialog/filterdialog"], function (filterDialogFactory) {
|
||||
var filterDialog = new filterDialogFactory({
|
||||
query: getQuery(),
|
||||
mode: "albums",
|
||||
serverId: ApiClient.serverId()
|
||||
});
|
||||
var btnSelectView = tabContent.querySelector(".btnSelectView");
|
||||
btnSelectView.addEventListener("click", function(e) {
|
||||
libraryBrowser.showLayoutMenu(e.target, self.getCurrentViewStyle(), "List,Poster,PosterCard".split(","))
|
||||
}), btnSelectView.addEventListener("layoutchange", function(e) {
|
||||
var viewStyle = e.detail.viewStyle;
|
||||
getPageData().view = viewStyle, libraryBrowser.saveViewSetting(getSavedQueryKey(), viewStyle), getQuery().StartIndex = 0, onViewStyleChange(), reloadItems(tabContent)
|
||||
}), tabContent.querySelector(".btnPlayAll").addEventListener("click", playAll), tabContent.querySelector(".btnShuffle").addEventListener("click", shuffle)
|
||||
}(tabContent), onViewStyleChange(), self.renderTab = function() {
|
||||
reloadItems(tabContent), updateFilterControls(tabContent)
|
||||
}, self.destroy = function() {}
|
||||
}
|
||||
events.on(filterDialog, "filterchange", function () {
|
||||
getQuery().StartIndex = 0;
|
||||
reloadItems(tabContent);
|
||||
});
|
||||
filterDialog.show();
|
||||
});
|
||||
};
|
||||
|
||||
self.getCurrentViewStyle = function () {
|
||||
return getPageData().view;
|
||||
};
|
||||
|
||||
function initPage(tabContent) {
|
||||
var alphaPickerElement = tabContent.querySelector(".alphaPicker");
|
||||
|
||||
alphaPickerElement.addEventListener("alphavaluechanged", function (e) {
|
||||
var newValue = e.detail.value;
|
||||
var query = getQuery();
|
||||
query.NameStartsWithOrGreater = newValue;
|
||||
query.StartIndex = 0;
|
||||
reloadItems(tabContent);
|
||||
});
|
||||
self.alphaPicker = new alphaPicker({
|
||||
element: alphaPickerElement,
|
||||
valueChangeEvent: "click"
|
||||
});
|
||||
if (layoutManager.desktop || layoutManager.mobile) {
|
||||
tabContent.querySelector(".alphaPicker").classList.add("alphabetPicker-right");
|
||||
var itemsContainer = tabContent.querySelector(".itemsContainer");
|
||||
itemsContainer.classList.remove("padded-left-withalphapicker");
|
||||
itemsContainer.classList.add("padded-right-withalphapicker");
|
||||
}
|
||||
|
||||
tabContent.querySelector(".btnFilter").addEventListener("click", function () {
|
||||
self.showFilterMenu();
|
||||
});
|
||||
tabContent.querySelector(".btnSort").addEventListener("click", function (e) {
|
||||
libraryBrowser.showSortMenu({
|
||||
items: [{
|
||||
name: Globalize.translate("OptionNameSort"),
|
||||
id: "SortName"
|
||||
}, {
|
||||
name: Globalize.translate("OptionAlbumArtist"),
|
||||
id: "AlbumArtist,SortName"
|
||||
}, {
|
||||
name: Globalize.translate("OptionCommunityRating"),
|
||||
id: "CommunityRating,SortName"
|
||||
}, {
|
||||
name: Globalize.translate("OptionCriticRating"),
|
||||
id: "CriticRating,SortName"
|
||||
}, {
|
||||
name: Globalize.translate("OptionDateAdded"),
|
||||
id: "DateCreated,SortName"
|
||||
}, {
|
||||
name: Globalize.translate("OptionReleaseDate"),
|
||||
id: "ProductionYear,PremiereDate,SortName"
|
||||
}],
|
||||
callback: function () {
|
||||
getQuery().StartIndex = 0;
|
||||
reloadItems(tabContent);
|
||||
},
|
||||
query: getQuery(),
|
||||
button: e.target
|
||||
});
|
||||
});
|
||||
var btnSelectView = tabContent.querySelector(".btnSelectView");
|
||||
btnSelectView.addEventListener("click", function (e) {
|
||||
libraryBrowser.showLayoutMenu(e.target, self.getCurrentViewStyle(), "List,Poster,PosterCard".split(","));
|
||||
});
|
||||
btnSelectView.addEventListener("layoutchange", function (e) {
|
||||
var viewStyle = e.detail.viewStyle;
|
||||
getPageData().view = viewStyle;
|
||||
libraryBrowser.saveViewSetting(getSavedQueryKey(), viewStyle);
|
||||
getQuery().StartIndex = 0;
|
||||
onViewStyleChange();
|
||||
reloadItems(tabContent);
|
||||
});
|
||||
tabContent.querySelector(".btnPlayAll").addEventListener("click", playAll);
|
||||
tabContent.querySelector(".btnShuffle").addEventListener("click", shuffle);
|
||||
}
|
||||
|
||||
initPage(tabContent);
|
||||
onViewStyleChange();
|
||||
|
||||
self.renderTab = function () {
|
||||
reloadItems(tabContent);
|
||||
updateFilterControls(tabContent);
|
||||
};
|
||||
|
||||
self.destroy = function () {};
|
||||
};
|
||||
});
|
||||
|
||||
@@ -1,144 +1,226 @@
|
||||
define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", "alphaPicker", "listView", "cardBuilder", "apphost", "emby-itemscontainer"], function(layoutManager, loading, events, libraryBrowser, imageLoader, alphaPicker, listView, cardBuilder, appHost) {
|
||||
define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", "alphaPicker", "listView", "cardBuilder", "apphost", "emby-itemscontainer"], function (layoutManager, loading, events, libraryBrowser, imageLoader, alphaPicker, listView, cardBuilder, appHost) {
|
||||
"use strict";
|
||||
return function(view, params, tabContent) {
|
||||
|
||||
return function (view, params, tabContent) {
|
||||
function getPageData(context) {
|
||||
var key = getSavedQueryKey(context),
|
||||
pageData = data[key];
|
||||
return pageData || (pageData = data[key] = {
|
||||
query: {
|
||||
SortBy: "SortName",
|
||||
SortOrder: "Ascending",
|
||||
Recursive: !0,
|
||||
Fields: "PrimaryImageAspectRatio,SortName,BasicSyncInfo",
|
||||
StartIndex: 0,
|
||||
ImageTypeLimit: 1,
|
||||
EnableImageTypes: "Primary,Backdrop,Banner,Thumb",
|
||||
Limit: 100
|
||||
},
|
||||
view: libraryBrowser.getSavedView(key) || "Poster"
|
||||
}, pageData.query.ParentId = params.topParentId, libraryBrowser.loadSavedQueryValues(key, pageData.query)), pageData
|
||||
var key = getSavedQueryKey(context);
|
||||
var pageData = data[key];
|
||||
|
||||
if (!pageData) {
|
||||
pageData = data[key] = {
|
||||
query: {
|
||||
SortBy: "SortName",
|
||||
SortOrder: "Ascending",
|
||||
Recursive: true,
|
||||
Fields: "PrimaryImageAspectRatio,SortName,BasicSyncInfo",
|
||||
StartIndex: 0,
|
||||
ImageTypeLimit: 1,
|
||||
EnableImageTypes: "Primary,Backdrop,Banner,Thumb",
|
||||
Limit: 100
|
||||
},
|
||||
view: libraryBrowser.getSavedView(key) || "Poster"
|
||||
};
|
||||
pageData.query.ParentId = params.topParentId;
|
||||
libraryBrowser.loadSavedQueryValues(key, pageData.query);
|
||||
}
|
||||
|
||||
return pageData;
|
||||
}
|
||||
|
||||
function getQuery(context) {
|
||||
return getPageData(context).query
|
||||
return getPageData(context).query;
|
||||
}
|
||||
|
||||
function getSavedQueryKey(context) {
|
||||
return context.savedQueryKey || (context.savedQueryKey = libraryBrowser.getSavedQueryKey(self.mode)), context.savedQueryKey
|
||||
if (!context.savedQueryKey) {
|
||||
context.savedQueryKey = libraryBrowser.getSavedQueryKey(self.mode);
|
||||
}
|
||||
|
||||
return context.savedQueryKey;
|
||||
}
|
||||
|
||||
function onViewStyleChange() {
|
||||
var viewStyle = self.getCurrentViewStyle(),
|
||||
itemsContainer = tabContent.querySelector(".itemsContainer");
|
||||
"List" == viewStyle ? (itemsContainer.classList.add("vertical-list"), itemsContainer.classList.remove("vertical-wrap")) : (itemsContainer.classList.remove("vertical-list"), itemsContainer.classList.add("vertical-wrap")), itemsContainer.innerHTML = ""
|
||||
var viewStyle = self.getCurrentViewStyle();
|
||||
var itemsContainer = tabContent.querySelector(".itemsContainer");
|
||||
|
||||
if ("List" == viewStyle) {
|
||||
itemsContainer.classList.add("vertical-list");
|
||||
itemsContainer.classList.remove("vertical-wrap");
|
||||
} else {
|
||||
itemsContainer.classList.remove("vertical-list");
|
||||
itemsContainer.classList.add("vertical-wrap");
|
||||
}
|
||||
|
||||
itemsContainer.innerHTML = "";
|
||||
}
|
||||
|
||||
function reloadItems(page) {
|
||||
loading.show();
|
||||
isLoading = true;
|
||||
var query = getQuery(page);
|
||||
("albumartists" == self.mode ? ApiClient.getAlbumArtists(ApiClient.getCurrentUserId(), query) : ApiClient.getArtists(ApiClient.getCurrentUserId(), query)).then(function(result) {
|
||||
var promise = self.mode == 'albumartists' ?
|
||||
ApiClient.getAlbumArtists(ApiClient.getCurrentUserId(), query) :
|
||||
ApiClient.getArtists(ApiClient.getCurrentUserId(), query);
|
||||
promise.then(function (result) {
|
||||
function onNextPageClick() {
|
||||
if (isLoading) return;
|
||||
query.StartIndex += query.Limit, reloadItems(tabContent)
|
||||
if (isLoading) {
|
||||
return;
|
||||
}
|
||||
|
||||
query.StartIndex += query.Limit;
|
||||
reloadItems(tabContent);
|
||||
}
|
||||
|
||||
function onPreviousPageClick() {
|
||||
if (isLoading) return;
|
||||
query.StartIndex -= query.Limit, reloadItems(tabContent)
|
||||
if (isLoading) {
|
||||
return;
|
||||
}
|
||||
|
||||
query.StartIndex -= query.Limit;
|
||||
reloadItems(tabContent);
|
||||
}
|
||||
window.scrollTo(0, 0), updateFilterControls(page);
|
||||
var html, pagingHtml = libraryBrowser.getQueryPagingHtml({
|
||||
startIndex: query.StartIndex,
|
||||
limit: query.Limit,
|
||||
totalRecordCount: result.TotalRecordCount,
|
||||
showLimit: !1,
|
||||
updatePageSizeSetting: !1,
|
||||
addLayoutButton: !1,
|
||||
sortButton: !1,
|
||||
filterButton: !1
|
||||
}),
|
||||
viewStyle = self.getCurrentViewStyle();
|
||||
html = "List" == viewStyle ? listView.getListViewHtml({
|
||||
items: result.Items,
|
||||
sortBy: query.SortBy
|
||||
}) : "PosterCard" == viewStyle ? cardBuilder.getCardsHtml({
|
||||
items: result.Items,
|
||||
shape: "square",
|
||||
context: "music",
|
||||
showTitle: !0,
|
||||
coverImage: !0,
|
||||
cardLayout: !0
|
||||
}) : cardBuilder.getCardsHtml({
|
||||
items: result.Items,
|
||||
shape: "square",
|
||||
context: "music",
|
||||
showTitle: !0,
|
||||
coverImage: !0,
|
||||
lazy: !0,
|
||||
centerText: !0,
|
||||
overlayPlayButton: !0
|
||||
|
||||
window.scrollTo(0, 0);
|
||||
updateFilterControls(page);
|
||||
var html;
|
||||
var pagingHtml = libraryBrowser.getQueryPagingHtml({
|
||||
startIndex: query.StartIndex,
|
||||
limit: query.Limit,
|
||||
totalRecordCount: result.TotalRecordCount,
|
||||
showLimit: false,
|
||||
updatePageSizeSetting: false,
|
||||
addLayoutButton: false,
|
||||
sortButton: false,
|
||||
filterButton: false
|
||||
});
|
||||
var i, length, elems = tabContent.querySelectorAll(".paging");
|
||||
for (i = 0, length = elems.length; i < length; i++) elems[i].innerHTML = pagingHtml;
|
||||
for (elems = tabContent.querySelectorAll(".btnNextPage"), i = 0, length = elems.length; i < length; i++) elems[i].addEventListener("click", onNextPageClick);
|
||||
for (elems = tabContent.querySelectorAll(".btnPreviousPage"), i = 0, length = elems.length; i < length; i++) elems[i].addEventListener("click", onPreviousPageClick);
|
||||
var viewStyle = self.getCurrentViewStyle();
|
||||
if (viewStyle == "List") {
|
||||
html = listView.getListViewHtml({
|
||||
items: result.Items,
|
||||
sortBy: query.SortBy
|
||||
});
|
||||
} else if (viewStyle == "PosterCard") {
|
||||
html = cardBuilder.getCardsHtml({
|
||||
items: result.Items,
|
||||
shape: "square",
|
||||
context: "music",
|
||||
showTitle: true,
|
||||
coverImage: true,
|
||||
cardLayout: true
|
||||
});
|
||||
} else {
|
||||
html = cardBuilder.getCardsHtml({
|
||||
items: result.Items,
|
||||
shape: "square",
|
||||
context: "music",
|
||||
showTitle: true,
|
||||
coverImage: true,
|
||||
lazy: true,
|
||||
centerText: true,
|
||||
overlayPlayButton: true
|
||||
});
|
||||
}
|
||||
var i;
|
||||
var length;
|
||||
var elems = tabContent.querySelectorAll(".paging");
|
||||
|
||||
for (i = 0, length = elems.length; i < length; i++) {
|
||||
elems[i].innerHTML = pagingHtml;
|
||||
}
|
||||
|
||||
elems = tabContent.querySelectorAll(".btnNextPage");
|
||||
for (i = 0, length = elems.length; i < length; i++) {
|
||||
elems[i].addEventListener("click", onNextPageClick);
|
||||
}
|
||||
|
||||
elems = tabContent.querySelectorAll(".btnPreviousPage");
|
||||
for (i = 0, length = elems.length; i < length; i++) {
|
||||
elems[i].addEventListener("click", onPreviousPageClick);
|
||||
}
|
||||
|
||||
var itemsContainer = tabContent.querySelector(".itemsContainer");
|
||||
itemsContainer.innerHTML = html;
|
||||
imageLoader.lazyChildren(itemsContainer);
|
||||
libraryBrowser.saveQueryValues(getSavedQueryKey(page), query);
|
||||
loading.hide();
|
||||
isLoading = false;
|
||||
})
|
||||
});
|
||||
}
|
||||
|
||||
function updateFilterControls(tabContent) {
|
||||
var query = getQuery(tabContent);
|
||||
self.alphaPicker.value(query.NameStartsWithOrGreater)
|
||||
self.alphaPicker.value(query.NameStartsWithOrGreater);
|
||||
}
|
||||
var self = this,
|
||||
data = {},
|
||||
isLoading = false;
|
||||
self.showFilterMenu = function() {
|
||||
require(["components/filterdialog/filterdialog"], function(filterDialogFactory) {
|
||||
var filterDialog = new filterDialogFactory({
|
||||
query: getQuery(tabContent),
|
||||
mode: self.mode,
|
||||
serverId: ApiClient.serverId()
|
||||
});
|
||||
events.on(filterDialog, "filterchange", function() {
|
||||
getQuery(tabContent).StartIndex = 0, reloadItems(tabContent)
|
||||
}), filterDialog.show()
|
||||
})
|
||||
}, self.getCurrentViewStyle = function() {
|
||||
return getPageData(tabContent).view
|
||||
},
|
||||
function(tabContent) {
|
||||
var alphaPickerElement = tabContent.querySelector(".alphaPicker");
|
||||
if (alphaPickerElement.addEventListener("alphavaluechanged", function(e) {
|
||||
var newValue = e.detail.value,
|
||||
query = getQuery(tabContent);
|
||||
query.NameStartsWithOrGreater = newValue, query.StartIndex = 0, reloadItems(tabContent)
|
||||
}), self.alphaPicker = new alphaPicker({
|
||||
element: alphaPickerElement,
|
||||
valueChangeEvent: "click"
|
||||
}), layoutManager.desktop || layoutManager.mobile) {
|
||||
tabContent.querySelector(".alphaPicker").classList.add("alphabetPicker-right");
|
||||
var itemsContainer = tabContent.querySelector(".itemsContainer");
|
||||
itemsContainer.classList.remove("padded-left-withalphapicker"), itemsContainer.classList.add("padded-right-withalphapicker")
|
||||
}
|
||||
tabContent.querySelector(".btnFilter").addEventListener("click", function() {
|
||||
self.showFilterMenu()
|
||||
|
||||
var self = this;
|
||||
var data = {};
|
||||
var isLoading = false;
|
||||
|
||||
self.showFilterMenu = function () {
|
||||
require(["components/filterdialog/filterdialog"], function (filterDialogFactory) {
|
||||
var filterDialog = new filterDialogFactory({
|
||||
query: getQuery(tabContent),
|
||||
mode: self.mode,
|
||||
serverId: ApiClient.serverId()
|
||||
});
|
||||
var btnSelectView = tabContent.querySelector(".btnSelectView");
|
||||
btnSelectView.addEventListener("click", function(e) {
|
||||
libraryBrowser.showLayoutMenu(e.target, self.getCurrentViewStyle(), "List,Poster,PosterCard".split(","))
|
||||
}), btnSelectView.addEventListener("layoutchange", function(e) {
|
||||
var viewStyle = e.detail.viewStyle;
|
||||
getPageData(tabContent).view = viewStyle, libraryBrowser.saveViewSetting(getSavedQueryKey(tabContent), viewStyle), getQuery(tabContent).StartIndex = 0, onViewStyleChange(), reloadItems(tabContent)
|
||||
})
|
||||
}(tabContent), onViewStyleChange(), self.renderTab = function() {
|
||||
reloadItems(tabContent), updateFilterControls(tabContent)
|
||||
}, self.destroy = function() {}
|
||||
}
|
||||
events.on(filterDialog, "filterchange", function () {
|
||||
getQuery(tabContent).StartIndex = 0;
|
||||
reloadItems(tabContent);
|
||||
});
|
||||
filterDialog.show();
|
||||
});
|
||||
};
|
||||
|
||||
self.getCurrentViewStyle = function () {
|
||||
return getPageData(tabContent).view;
|
||||
};
|
||||
|
||||
function initPage(tabContent) {
|
||||
var alphaPickerElement = tabContent.querySelector(".alphaPicker");
|
||||
|
||||
alphaPickerElement.addEventListener("alphavaluechanged", function (e) {
|
||||
var newValue = e.detail.value;
|
||||
var query = getQuery(tabContent);
|
||||
query.NameStartsWithOrGreater = newValue;
|
||||
query.StartIndex = 0;
|
||||
reloadItems(tabContent);
|
||||
});
|
||||
self.alphaPicker = new alphaPicker({
|
||||
element: alphaPickerElement,
|
||||
valueChangeEvent: "click"
|
||||
});
|
||||
if (layoutManager.desktop || layoutManager.mobile) {
|
||||
tabContent.querySelector(".alphaPicker").classList.add("alphabetPicker-right");
|
||||
var itemsContainer = tabContent.querySelector(".itemsContainer");
|
||||
itemsContainer.classList.remove("padded-left-withalphapicker");
|
||||
itemsContainer.classList.add("padded-right-withalphapicker");
|
||||
}
|
||||
|
||||
tabContent.querySelector(".btnFilter").addEventListener("click", function () {
|
||||
self.showFilterMenu();
|
||||
});
|
||||
var btnSelectView = tabContent.querySelector(".btnSelectView");
|
||||
btnSelectView.addEventListener("click", function (e) {
|
||||
libraryBrowser.showLayoutMenu(e.target, self.getCurrentViewStyle(), "List,Poster,PosterCard".split(","));
|
||||
});
|
||||
btnSelectView.addEventListener("layoutchange", function (e) {
|
||||
var viewStyle = e.detail.viewStyle;
|
||||
getPageData(tabContent).view = viewStyle;
|
||||
libraryBrowser.saveViewSetting(getSavedQueryKey(tabContent), viewStyle);
|
||||
getQuery(tabContent).StartIndex = 0;
|
||||
onViewStyleChange();
|
||||
reloadItems(tabContent);
|
||||
});
|
||||
}
|
||||
|
||||
initPage(tabContent);
|
||||
onViewStyleChange();
|
||||
|
||||
self.renderTab = function () {
|
||||
reloadItems(tabContent);
|
||||
updateFilterControls(tabContent);
|
||||
};
|
||||
|
||||
self.destroy = function () {};
|
||||
};
|
||||
});
|
||||
|
||||
@@ -1,91 +1,126 @@
|
||||
define(["libraryBrowser", "cardBuilder", "apphost", "imageLoader", "loading"], function(libraryBrowser, cardBuilder, appHost, imageLoader, loading) {
|
||||
define(["libraryBrowser", "cardBuilder", "apphost", "imageLoader", "loading"], function (libraryBrowser, cardBuilder, appHost, imageLoader, loading) {
|
||||
"use strict";
|
||||
return function(view, params, tabContent) {
|
||||
|
||||
return function (view, params, tabContent) {
|
||||
function getPageData() {
|
||||
var key = getSavedQueryKey(),
|
||||
pageData = data[key];
|
||||
return pageData || (pageData = data[key] = {
|
||||
query: {
|
||||
SortBy: "SortName",
|
||||
SortOrder: "Ascending",
|
||||
Recursive: !0,
|
||||
Fields: "PrimaryImageAspectRatio,ItemCounts",
|
||||
StartIndex: 0
|
||||
},
|
||||
view: libraryBrowser.getSavedView(key) || "Poster"
|
||||
}, pageData.query.ParentId = params.topParentId, libraryBrowser.loadSavedQueryValues(key, pageData.query)), pageData
|
||||
var key = getSavedQueryKey();
|
||||
var pageData = data[key];
|
||||
|
||||
if (!pageData) {
|
||||
pageData = data[key] = {
|
||||
query: {
|
||||
SortBy: "SortName",
|
||||
SortOrder: "Ascending",
|
||||
Recursive: true,
|
||||
Fields: "PrimaryImageAspectRatio,ItemCounts",
|
||||
StartIndex: 0
|
||||
},
|
||||
view: libraryBrowser.getSavedView(key) || "Poster"
|
||||
};
|
||||
pageData.query.ParentId = params.topParentId;
|
||||
libraryBrowser.loadSavedQueryValues(key, pageData.query);
|
||||
}
|
||||
|
||||
return pageData;
|
||||
}
|
||||
|
||||
function getQuery() {
|
||||
return getPageData().query
|
||||
return getPageData().query;
|
||||
}
|
||||
|
||||
function getSavedQueryKey() {
|
||||
return libraryBrowser.getSavedQueryKey("genres")
|
||||
return libraryBrowser.getSavedQueryKey("genres");
|
||||
}
|
||||
|
||||
function getPromise() {
|
||||
loading.show();
|
||||
var query = getQuery();
|
||||
return ApiClient.getGenres(ApiClient.getCurrentUserId(), query)
|
||||
return ApiClient.getGenres(ApiClient.getCurrentUserId(), query);
|
||||
}
|
||||
|
||||
function reloadItems(context, promise) {
|
||||
var query = getQuery();
|
||||
promise.then(function(result) {
|
||||
var html = "",
|
||||
viewStyle = self.getCurrentViewStyle();
|
||||
"Thumb" == viewStyle ? html = cardBuilder.getCardsHtml({
|
||||
items: result.Items,
|
||||
shape: "backdrop",
|
||||
preferThumb: !0,
|
||||
context: "music",
|
||||
centerText: !0,
|
||||
overlayMoreButton: !0,
|
||||
showTitle: !0
|
||||
}) : "ThumbCard" == viewStyle ? html = cardBuilder.getCardsHtml({
|
||||
items: result.Items,
|
||||
shape: "backdrop",
|
||||
preferThumb: !0,
|
||||
context: "music",
|
||||
cardLayout: !0,
|
||||
showTitle: !0
|
||||
}) : "PosterCard" == viewStyle ? html = cardBuilder.getCardsHtml({
|
||||
items: result.Items,
|
||||
shape: "auto",
|
||||
context: "music",
|
||||
cardLayout: !0,
|
||||
showTitle: !0
|
||||
}) : "Poster" == viewStyle && (html = cardBuilder.getCardsHtml({
|
||||
items: result.Items,
|
||||
shape: "auto",
|
||||
context: "music",
|
||||
centerText: !0,
|
||||
overlayMoreButton: !0,
|
||||
showTitle: !0
|
||||
}));
|
||||
promise.then(function (result) {
|
||||
var html = "";
|
||||
var viewStyle = self.getCurrentViewStyle();
|
||||
|
||||
if (viewStyle == "Thumb") {
|
||||
html = cardBuilder.getCardsHtml({
|
||||
items: result.Items,
|
||||
shape: "backdrop",
|
||||
preferThumb: true,
|
||||
context: 'music',
|
||||
centerText: true,
|
||||
overlayMoreButton: true,
|
||||
showTitle: true
|
||||
});
|
||||
} else if (viewStyle == "ThumbCard") {
|
||||
html = cardBuilder.getCardsHtml({
|
||||
items: result.Items,
|
||||
shape: "backdrop",
|
||||
preferThumb: true,
|
||||
context: 'music',
|
||||
cardLayout: true,
|
||||
showTitle: true,
|
||||
});
|
||||
} else if (viewStyle == "PosterCard") {
|
||||
html = cardBuilder.getCardsHtml({
|
||||
items: result.Items,
|
||||
shape: "auto",
|
||||
context: 'music',
|
||||
cardLayout: true,
|
||||
showTitle: true,
|
||||
});
|
||||
} else if (viewStyle == "Poster") {
|
||||
html = cardBuilder.getCardsHtml({
|
||||
items: result.Items,
|
||||
shape: "auto",
|
||||
context: 'music',
|
||||
centerText: true,
|
||||
overlayMoreButton: true,
|
||||
showTitle: true
|
||||
});
|
||||
}
|
||||
|
||||
var elem = context.querySelector("#items");
|
||||
elem.innerHTML = html, imageLoader.lazyChildren(elem), libraryBrowser.saveQueryValues(getSavedQueryKey(), query), loading.hide()
|
||||
})
|
||||
elem.innerHTML = html;
|
||||
imageLoader.lazyChildren(elem);
|
||||
libraryBrowser.saveQueryValues(getSavedQueryKey(), query);
|
||||
loading.hide();
|
||||
});
|
||||
}
|
||||
|
||||
function fullyReload() {
|
||||
self.preRender(), self.renderTab()
|
||||
self.preRender();
|
||||
self.renderTab();
|
||||
}
|
||||
var self = this,
|
||||
data = {};
|
||||
self.getViewStyles = function() {
|
||||
return "Poster,PosterCard,Thumb,ThumbCard".split(",")
|
||||
}, self.getCurrentViewStyle = function() {
|
||||
return getPageData(tabContent).view
|
||||
}, self.setCurrentViewStyle = function(viewStyle) {
|
||||
getPageData(tabContent).view = viewStyle, libraryBrowser.saveViewSetting(getSavedQueryKey(tabContent), viewStyle), fullyReload()
|
||||
}, self.enableViewSelection = !0;
|
||||
|
||||
var self = this;
|
||||
var data = {};
|
||||
|
||||
self.getViewStyles = function () {
|
||||
return "Poster,PosterCard,Thumb,ThumbCard".split(",");
|
||||
};
|
||||
|
||||
self.getCurrentViewStyle = function () {
|
||||
return getPageData(tabContent).view;
|
||||
};
|
||||
|
||||
self.setCurrentViewStyle = function (viewStyle) {
|
||||
getPageData(tabContent).view = viewStyle;
|
||||
libraryBrowser.saveViewSetting(getSavedQueryKey(tabContent), viewStyle);
|
||||
fullyReload();
|
||||
};
|
||||
|
||||
self.enableViewSelection = true;
|
||||
var promise;
|
||||
self.preRender = function() {
|
||||
promise = getPromise()
|
||||
}, self.renderTab = function() {
|
||||
reloadItems(tabContent, promise)
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
self.preRender = function () {
|
||||
promise = getPromise();
|
||||
};
|
||||
|
||||
self.renderTab = function () {
|
||||
reloadItems(tabContent, promise);
|
||||
};
|
||||
};
|
||||
});
|
||||
|
||||
@@ -1,64 +1,81 @@
|
||||
define(["libraryBrowser", "cardBuilder", "apphost", "imageLoader", "loading"], function(libraryBrowser, cardBuilder, appHost, imageLoader, loading) {
|
||||
define(["libraryBrowser", "cardBuilder", "apphost", "imageLoader", "loading"], function (libraryBrowser, cardBuilder, appHost, imageLoader, loading) {
|
||||
"use strict";
|
||||
return function(view, params, tabContent) {
|
||||
|
||||
return function (view, params, tabContent) {
|
||||
function getPageData() {
|
||||
var key = getSavedQueryKey(),
|
||||
pageData = data[key];
|
||||
return pageData || (pageData = data[key] = {
|
||||
query: {
|
||||
SortBy: "SortName",
|
||||
SortOrder: "Ascending",
|
||||
IncludeItemTypes: "Playlist",
|
||||
Recursive: !0,
|
||||
Fields: "PrimaryImageAspectRatio,SortName,CanDelete",
|
||||
StartIndex: 0
|
||||
},
|
||||
view: libraryBrowser.getSavedView(key) || "Poster"
|
||||
}, pageData.query.ParentId = params.topParentId, libraryBrowser.loadSavedQueryValues(key, pageData.query)), pageData
|
||||
var key = getSavedQueryKey();
|
||||
var pageData = data[key];
|
||||
|
||||
if (!pageData) {
|
||||
pageData = data[key] = {
|
||||
query: {
|
||||
SortBy: "SortName",
|
||||
SortOrder: "Ascending",
|
||||
IncludeItemTypes: "Playlist",
|
||||
Recursive: true,
|
||||
Fields: "PrimaryImageAspectRatio,SortName,CanDelete",
|
||||
StartIndex: 0
|
||||
},
|
||||
view: libraryBrowser.getSavedView(key) || "Poster"
|
||||
};
|
||||
pageData.query.ParentId = params.topParentId;
|
||||
libraryBrowser.loadSavedQueryValues(key, pageData.query);
|
||||
}
|
||||
|
||||
return pageData;
|
||||
}
|
||||
|
||||
function getQuery() {
|
||||
return getPageData().query
|
||||
return getPageData().query;
|
||||
}
|
||||
|
||||
function getSavedQueryKey() {
|
||||
return libraryBrowser.getSavedQueryKey("genres")
|
||||
return libraryBrowser.getSavedQueryKey("genres");
|
||||
}
|
||||
|
||||
function getPromise() {
|
||||
loading.show();
|
||||
var query = getQuery();
|
||||
return ApiClient.getItems(ApiClient.getCurrentUserId(), query)
|
||||
return ApiClient.getItems(ApiClient.getCurrentUserId(), query);
|
||||
}
|
||||
|
||||
function reloadItems(context, promise) {
|
||||
var query = getQuery();
|
||||
promise.then(function(result) {
|
||||
promise.then(function (result) {
|
||||
var html = "";
|
||||
html = cardBuilder.getCardsHtml({
|
||||
items: result.Items,
|
||||
shape: "square",
|
||||
showTitle: !0,
|
||||
coverImage: !0,
|
||||
centerText: !0,
|
||||
overlayPlayButton: !0,
|
||||
allowBottomPadding: !0,
|
||||
cardLayout: !1
|
||||
showTitle: true,
|
||||
coverImage: true,
|
||||
centerText: true,
|
||||
overlayPlayButton: true,
|
||||
allowBottomPadding: true,
|
||||
cardLayout: false
|
||||
});
|
||||
var elem = context.querySelector("#items");
|
||||
elem.innerHTML = html, imageLoader.lazyChildren(elem), libraryBrowser.saveQueryValues(getSavedQueryKey(), query), loading.hide()
|
||||
})
|
||||
elem.innerHTML = html;
|
||||
imageLoader.lazyChildren(elem);
|
||||
libraryBrowser.saveQueryValues(getSavedQueryKey(), query);
|
||||
loading.hide();
|
||||
});
|
||||
}
|
||||
var self = this,
|
||||
data = {};
|
||||
self.getCurrentViewStyle = function() {
|
||||
return getPageData(tabContent).view
|
||||
|
||||
var self = this;
|
||||
var data = {};
|
||||
|
||||
self.getCurrentViewStyle = function () {
|
||||
return getPageData(tabContent).view;
|
||||
};
|
||||
|
||||
var promise;
|
||||
self.preRender = function() {
|
||||
promise = getPromise()
|
||||
}, self.renderTab = function() {
|
||||
reloadItems(tabContent, promise)
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
self.preRender = function () {
|
||||
promise = getPromise();
|
||||
};
|
||||
|
||||
self.renderTab = function () {
|
||||
reloadItems(tabContent, promise);
|
||||
};
|
||||
};
|
||||
});
|
||||
|
||||
@@ -1,49 +1,65 @@
|
||||
define(["browser", "layoutManager", "userSettings", "inputManager", "loading", "cardBuilder", "dom", "apphost", "imageLoader", "libraryMenu", "playbackManager", "mainTabsManager", "scrollStyles", "emby-itemscontainer", "emby-tabs", "emby-button", "flexStyles"], function(browser, layoutManager, userSettings, inputManager, loading, cardBuilder, dom, appHost, imageLoader, libraryMenu, playbackManager, mainTabsManager) {
|
||||
define(["browser", "layoutManager", "userSettings", "inputManager", "loading", "cardBuilder", "dom", "apphost", "imageLoader", "libraryMenu", "playbackManager", "mainTabsManager", "scrollStyles", "emby-itemscontainer", "emby-tabs", "emby-button", "flexStyles"], function (browser, layoutManager, userSettings, inputManager, loading, cardBuilder, dom, appHost, imageLoader, libraryMenu, playbackManager, mainTabsManager) {
|
||||
"use strict";
|
||||
|
||||
function itemsPerRow() {
|
||||
var screenWidth = dom.getWindowSize().innerWidth;
|
||||
return screenWidth >= 1920 ? 9 : screenWidth >= 1200 ? 12 : screenWidth >= 1e3 ? 10 : 8
|
||||
|
||||
if (screenWidth >= 1920) {
|
||||
return 9;
|
||||
}
|
||||
|
||||
if (screenWidth >= 1200) {
|
||||
return 12;
|
||||
}
|
||||
|
||||
if (screenWidth >= 1000) {
|
||||
return 10;
|
||||
}
|
||||
|
||||
return 8;
|
||||
}
|
||||
|
||||
function enableScrollX() {
|
||||
return !layoutManager.desktop
|
||||
return !layoutManager.desktop;
|
||||
}
|
||||
|
||||
function getSquareShape() {
|
||||
return enableScrollX() ? "overflowSquare" : "square"
|
||||
return enableScrollX() ? "overflowSquare" : "square";
|
||||
}
|
||||
|
||||
function loadLatest(page, parentId) {
|
||||
loading.show();
|
||||
var userId = ApiClient.getCurrentUserId(),
|
||||
options = {
|
||||
IncludeItemTypes: "Audio",
|
||||
Limit: enableScrollX() ? 3 * itemsPerRow() : 2 * itemsPerRow(),
|
||||
Fields: "PrimaryImageAspectRatio,BasicSyncInfo",
|
||||
ParentId: parentId,
|
||||
ImageTypeLimit: 1,
|
||||
EnableImageTypes: "Primary,Backdrop,Banner,Thumb",
|
||||
EnableTotalRecordCount: !1
|
||||
};
|
||||
ApiClient.getJSON(ApiClient.getUrl("Users/" + userId + "/Items/Latest", options)).then(function(items) {
|
||||
var elem = page.querySelector("#recentlyAddedSongs"),
|
||||
supportsImageAnalysis = appHost.supports("imageanalysis");
|
||||
supportsImageAnalysis = !1, elem.innerHTML = cardBuilder.getCardsHtml({
|
||||
var userId = ApiClient.getCurrentUserId();
|
||||
var options = {
|
||||
IncludeItemTypes: "Audio",
|
||||
Limit: enableScrollX() ? 3 * itemsPerRow() : 2 * itemsPerRow(),
|
||||
Fields: "PrimaryImageAspectRatio,BasicSyncInfo",
|
||||
ParentId: parentId,
|
||||
ImageTypeLimit: 1,
|
||||
EnableImageTypes: "Primary,Backdrop,Banner,Thumb",
|
||||
EnableTotalRecordCount: false
|
||||
};
|
||||
ApiClient.getJSON(ApiClient.getUrl("Users/" + userId + "/Items/Latest", options)).then(function (items) {
|
||||
var elem = page.querySelector("#recentlyAddedSongs");
|
||||
var supportsImageAnalysis = appHost.supports("imageanalysis");
|
||||
supportsImageAnalysis = false;
|
||||
elem.innerHTML = cardBuilder.getCardsHtml({
|
||||
items: items,
|
||||
showUnplayedIndicator: !1,
|
||||
showLatestItemsPopup: !1,
|
||||
showUnplayedIndicator: false,
|
||||
showLatestItemsPopup: false,
|
||||
shape: getSquareShape(),
|
||||
showTitle: !0,
|
||||
showParentTitle: !0,
|
||||
lazy: !0,
|
||||
showTitle: true,
|
||||
showParentTitle: true,
|
||||
lazy: true,
|
||||
centerText: !supportsImageAnalysis,
|
||||
overlayPlayButton: !supportsImageAnalysis,
|
||||
allowBottomPadding: !enableScrollX(),
|
||||
cardLayout: supportsImageAnalysis,
|
||||
coverImage: !0
|
||||
}), imageLoader.lazyChildren(elem), loading.hide()
|
||||
})
|
||||
coverImage: true
|
||||
});
|
||||
imageLoader.lazyChildren(elem);
|
||||
loading.hide();
|
||||
});
|
||||
}
|
||||
|
||||
function loadRecentlyPlayed(page, parentId) {
|
||||
@@ -52,34 +68,42 @@ define(["browser", "layoutManager", "userSettings", "inputManager", "loading", "
|
||||
SortOrder: "Descending",
|
||||
IncludeItemTypes: "Audio",
|
||||
Limit: itemsPerRow(),
|
||||
Recursive: !0,
|
||||
Recursive: true,
|
||||
Fields: "PrimaryImageAspectRatio,AudioInfo",
|
||||
Filters: "IsPlayed",
|
||||
ParentId: parentId,
|
||||
ImageTypeLimit: 1,
|
||||
EnableImageTypes: "Primary,Backdrop,Banner,Thumb",
|
||||
EnableTotalRecordCount: !1
|
||||
EnableTotalRecordCount: false
|
||||
};
|
||||
ApiClient.getItems(ApiClient.getCurrentUserId(), options).then(function(result) {
|
||||
ApiClient.getItems(ApiClient.getCurrentUserId(), options).then(function (result) {
|
||||
var elem = page.querySelector("#recentlyPlayed");
|
||||
result.Items.length ? elem.classList.remove("hide") : elem.classList.add("hide");
|
||||
var itemsContainer = elem.querySelector(".itemsContainer"),
|
||||
supportsImageAnalysis = appHost.supports("imageanalysis");
|
||||
supportsImageAnalysis = !1, itemsContainer.innerHTML = cardBuilder.getCardsHtml({
|
||||
|
||||
if (result.Items.length) {
|
||||
elem.classList.remove("hide");
|
||||
} else {
|
||||
elem.classList.add("hide");
|
||||
}
|
||||
|
||||
var itemsContainer = elem.querySelector(".itemsContainer");
|
||||
var supportsImageAnalysis = appHost.supports("imageanalysis");
|
||||
supportsImageAnalysis = false;
|
||||
itemsContainer.innerHTML = cardBuilder.getCardsHtml({
|
||||
items: result.Items,
|
||||
showUnplayedIndicator: !1,
|
||||
showUnplayedIndicator: false,
|
||||
shape: getSquareShape(),
|
||||
showTitle: !0,
|
||||
showParentTitle: !0,
|
||||
showTitle: true,
|
||||
showParentTitle: true,
|
||||
action: "instantmix",
|
||||
lazy: !0,
|
||||
lazy: true,
|
||||
centerText: !supportsImageAnalysis,
|
||||
overlayMoreButton: !supportsImageAnalysis,
|
||||
allowBottomPadding: !enableScrollX(),
|
||||
cardLayout: supportsImageAnalysis,
|
||||
coverImage: !0
|
||||
}), imageLoader.lazyChildren(itemsContainer)
|
||||
})
|
||||
coverImage: true
|
||||
});
|
||||
imageLoader.lazyChildren(itemsContainer);
|
||||
});
|
||||
}
|
||||
|
||||
function loadFrequentlyPlayed(page, parentId) {
|
||||
@@ -88,40 +112,53 @@ define(["browser", "layoutManager", "userSettings", "inputManager", "loading", "
|
||||
SortOrder: "Descending",
|
||||
IncludeItemTypes: "Audio",
|
||||
Limit: itemsPerRow(),
|
||||
Recursive: !0,
|
||||
Recursive: true,
|
||||
Fields: "PrimaryImageAspectRatio,AudioInfo",
|
||||
Filters: "IsPlayed",
|
||||
ParentId: parentId,
|
||||
ImageTypeLimit: 1,
|
||||
EnableImageTypes: "Primary,Backdrop,Banner,Thumb",
|
||||
EnableTotalRecordCount: !1
|
||||
EnableTotalRecordCount: false
|
||||
};
|
||||
ApiClient.getItems(ApiClient.getCurrentUserId(), options).then(function(result) {
|
||||
ApiClient.getItems(ApiClient.getCurrentUserId(), options).then(function (result) {
|
||||
var elem = page.querySelector("#topPlayed");
|
||||
result.Items.length ? elem.classList.remove("hide") : elem.classList.add("hide");
|
||||
var itemsContainer = elem.querySelector(".itemsContainer"),
|
||||
supportsImageAnalysis = appHost.supports("imageanalysis");
|
||||
supportsImageAnalysis = !1, itemsContainer.innerHTML = cardBuilder.getCardsHtml({
|
||||
|
||||
if (result.Items.length) {
|
||||
elem.classList.remove("hide");
|
||||
} else {
|
||||
elem.classList.add("hide");
|
||||
}
|
||||
|
||||
var itemsContainer = elem.querySelector(".itemsContainer");
|
||||
var supportsImageAnalysis = appHost.supports("imageanalysis");
|
||||
supportsImageAnalysis = false;
|
||||
itemsContainer.innerHTML = cardBuilder.getCardsHtml({
|
||||
items: result.Items,
|
||||
showUnplayedIndicator: !1,
|
||||
showUnplayedIndicator: false,
|
||||
shape: getSquareShape(),
|
||||
showTitle: !0,
|
||||
showParentTitle: !0,
|
||||
showTitle: true,
|
||||
showParentTitle: true,
|
||||
action: "instantmix",
|
||||
lazy: !0,
|
||||
lazy: true,
|
||||
centerText: !supportsImageAnalysis,
|
||||
overlayMoreButton: !supportsImageAnalysis,
|
||||
allowBottomPadding: !enableScrollX(),
|
||||
cardLayout: supportsImageAnalysis,
|
||||
coverImage: !0
|
||||
}), imageLoader.lazyChildren(itemsContainer)
|
||||
})
|
||||
coverImage: true
|
||||
});
|
||||
imageLoader.lazyChildren(itemsContainer);
|
||||
});
|
||||
}
|
||||
|
||||
function loadSuggestionsTab(page, tabContent, parentId) {
|
||||
console.log("loadSuggestionsTab"), loadLatest(tabContent, parentId), loadRecentlyPlayed(tabContent, parentId), loadFrequentlyPlayed(tabContent, parentId), require(["components/favoriteitems"], function(favoriteItems) {
|
||||
favoriteItems.render(tabContent, ApiClient.getCurrentUserId(), parentId, ["favoriteArtists", "favoriteAlbums", "favoriteSongs"])
|
||||
})
|
||||
console.log("loadSuggestionsTab");
|
||||
loadLatest(tabContent, parentId);
|
||||
loadRecentlyPlayed(tabContent, parentId);
|
||||
loadFrequentlyPlayed(tabContent, parentId);
|
||||
|
||||
require(["components/favoriteitems"], function (favoriteItems) {
|
||||
favoriteItems.render(tabContent, ApiClient.getCurrentUserId(), parentId, ["favoriteArtists", "favoriteAlbums", "favoriteSongs"]);
|
||||
});
|
||||
}
|
||||
|
||||
function getTabs() {
|
||||
@@ -142,135 +179,227 @@ define(["browser", "layoutManager", "userSettings", "inputManager", "loading", "
|
||||
}, {
|
||||
name: Globalize.translate("ButtonSearch"),
|
||||
cssClass: "searchTabButton"
|
||||
}]
|
||||
}];
|
||||
}
|
||||
|
||||
function getDefaultTabIndex(folderId) {
|
||||
switch (userSettings.get("landing-" + folderId)) {
|
||||
case "albums":
|
||||
return 1;
|
||||
|
||||
case "albumartists":
|
||||
return 2;
|
||||
|
||||
case "artists":
|
||||
return 3;
|
||||
|
||||
case "playlists":
|
||||
return 4;
|
||||
|
||||
case "songs":
|
||||
return 5;
|
||||
|
||||
case "genres":
|
||||
return 6;
|
||||
|
||||
default:
|
||||
return 0
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
return function(view, params) {
|
||||
|
||||
return function (view, params) {
|
||||
function reload() {
|
||||
loading.show();
|
||||
var tabContent = view.querySelector(".pageTabContent[data-index='0']");
|
||||
loadSuggestionsTab(view, tabContent, params.topParentId)
|
||||
loadSuggestionsTab(view, tabContent, params.topParentId);
|
||||
}
|
||||
|
||||
function enableScrollX() {
|
||||
return browser.mobile
|
||||
return browser.mobile;
|
||||
}
|
||||
|
||||
function setScrollClasses(elem, scrollX) {
|
||||
scrollX ? (elem.classList.add("hiddenScrollX"), layoutManager.tv && elem.classList.add("smoothScrollX"), elem.classList.add("scrollX"), elem.classList.remove("vertical-wrap")) : (elem.classList.remove("hiddenScrollX"), elem.classList.remove("smoothScrollX"), elem.classList.remove("scrollX"), elem.classList.add("vertical-wrap"))
|
||||
if (scrollX) {
|
||||
elem.classList.add("hiddenScrollX");
|
||||
|
||||
if (layoutManager.tv) {
|
||||
elem.classList.add("smoothScrollX");
|
||||
}
|
||||
|
||||
elem.classList.add("scrollX");
|
||||
elem.classList.remove("vertical-wrap");
|
||||
} else {
|
||||
elem.classList.remove("hiddenScrollX");
|
||||
elem.classList.remove("smoothScrollX");
|
||||
elem.classList.remove("scrollX");
|
||||
elem.classList.add("vertical-wrap");
|
||||
}
|
||||
}
|
||||
|
||||
function onBeforeTabChange(e) {
|
||||
preLoadTab(view, parseInt(e.detail.selectedTabIndex))
|
||||
preLoadTab(view, parseInt(e.detail.selectedTabIndex));
|
||||
}
|
||||
|
||||
function onTabChange(e) {
|
||||
loadTab(view, parseInt(e.detail.selectedTabIndex))
|
||||
loadTab(view, parseInt(e.detail.selectedTabIndex));
|
||||
}
|
||||
|
||||
function getTabContainers() {
|
||||
return view.querySelectorAll(".pageTabContent")
|
||||
return view.querySelectorAll(".pageTabContent");
|
||||
}
|
||||
|
||||
function initTabs() {
|
||||
mainTabsManager.setTabs(view, currentTabIndex, getTabs, getTabContainers, onBeforeTabChange, onTabChange)
|
||||
mainTabsManager.setTabs(view, currentTabIndex, getTabs, getTabContainers, onBeforeTabChange, onTabChange);
|
||||
}
|
||||
|
||||
function getTabController(page, index, callback) {
|
||||
var depends = [];
|
||||
|
||||
switch (index) {
|
||||
case 0:
|
||||
break;
|
||||
|
||||
case 1:
|
||||
depends.push("controllers/music/musicalbums");
|
||||
break;
|
||||
|
||||
case 2:
|
||||
case 3:
|
||||
depends.push("controllers/music/musicartists");
|
||||
break;
|
||||
|
||||
case 4:
|
||||
depends.push("controllers/music/musicplaylists");
|
||||
break;
|
||||
|
||||
case 5:
|
||||
depends.push("controllers/music/songs");
|
||||
break;
|
||||
|
||||
case 6:
|
||||
depends.push("controllers/music/musicgenres");
|
||||
break;
|
||||
|
||||
case 7:
|
||||
depends.push("scripts/searchtab")
|
||||
depends.push("scripts/searchtab");
|
||||
}
|
||||
require(depends, function(controllerFactory) {
|
||||
|
||||
require(depends, function (controllerFactory) {
|
||||
var tabContent;
|
||||
0 == index && (tabContent = view.querySelector(".pageTabContent[data-index='" + index + "']"), self.tabContent = tabContent);
|
||||
|
||||
if (0 == index) {
|
||||
tabContent = view.querySelector(".pageTabContent[data-index='" + index + "']");
|
||||
self.tabContent = tabContent;
|
||||
}
|
||||
|
||||
var controller = tabControllers[index];
|
||||
controller || (tabContent = view.querySelector(".pageTabContent[data-index='" + index + "']"), controller = 0 === index ? self : 7 === index ? new controllerFactory(view, tabContent, {
|
||||
collectionType: "music",
|
||||
parentId: params.topParentId
|
||||
}) : new controllerFactory(view, params, tabContent), 2 == index ? controller.mode = "albumartists" : 3 == index && (controller.mode = "artists"), tabControllers[index] = controller, controller.initTab && controller.initTab()), callback(controller)
|
||||
})
|
||||
|
||||
if (!controller) {
|
||||
tabContent = view.querySelector(".pageTabContent[data-index='" + index + "']");
|
||||
|
||||
if (index === 0) {
|
||||
controller = self;
|
||||
} else if (index === 7) {
|
||||
controller = new controllerFactory(view, tabContent, {
|
||||
collectionType: "music",
|
||||
parentId: params.topParentId
|
||||
});
|
||||
} else {
|
||||
controller = new controllerFactory(view, params, tabContent);
|
||||
}
|
||||
|
||||
if (index == 2) {
|
||||
controller.mode = "albumartists";
|
||||
} else if (index == 3) {
|
||||
controller.mode = "artists";
|
||||
}
|
||||
|
||||
tabControllers[index] = controller;
|
||||
if (controller.initTab) {
|
||||
controller.initTab();
|
||||
}
|
||||
}
|
||||
|
||||
callback(controller);
|
||||
});
|
||||
}
|
||||
|
||||
function preLoadTab(page, index) {
|
||||
getTabController(page, index, function(controller) {
|
||||
-1 == renderedTabs.indexOf(index) && controller.preRender && controller.preRender()
|
||||
})
|
||||
getTabController(page, index, function (controller) {
|
||||
if (renderedTabs.indexOf(index) == -1 && controller.preRender) {
|
||||
controller.preRender();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function loadTab(page, index) {
|
||||
currentTabIndex = index, getTabController(page, index, function(controller) {
|
||||
initialTabIndex = null, -1 == renderedTabs.indexOf(index) && (renderedTabs.push(index), controller.renderTab())
|
||||
})
|
||||
currentTabIndex = index;
|
||||
getTabController(page, index, function (controller) {
|
||||
initialTabIndex = null;
|
||||
|
||||
if (renderedTabs.indexOf(index) == -1) {
|
||||
renderedTabs.push(index);
|
||||
controller.renderTab();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function onInputCommand(e) {
|
||||
switch (e.detail.command) {
|
||||
case "search":
|
||||
e.preventDefault(), Dashboard.navigate("search.html?collectionType=music&parentId=" + params.topParentId)
|
||||
e.preventDefault();
|
||||
Dashboard.navigate("search.html?collectionType=music&parentId=" + params.topParentId);
|
||||
}
|
||||
}
|
||||
var isViewRestored, self = this,
|
||||
currentTabIndex = parseInt(params.tab || getDefaultTabIndex(params.topParentId)),
|
||||
initialTabIndex = currentTabIndex;
|
||||
self.initTab = function() {
|
||||
for (var tabContent = view.querySelector(".pageTabContent[data-index='0']"), containers = tabContent.querySelectorAll(".itemsContainer"), i = 0, length = containers.length; i < length; i++) setScrollClasses(containers[i], enableScrollX())
|
||||
}, self.renderTab = function() {
|
||||
reload()
|
||||
};
|
||||
var tabControllers = [],
|
||||
renderedTabs = [];
|
||||
view.addEventListener("viewshow", function(e) {
|
||||
if (isViewRestored = e.detail.isRestored, initTabs(), !view.getAttribute("data-title")) {
|
||||
var parentId = params.topParentId;
|
||||
parentId ? ApiClient.getItem(ApiClient.getCurrentUserId(), parentId).then(function(item) {
|
||||
view.setAttribute("data-title", item.Name), libraryMenu.setTitle(item.Name)
|
||||
}) : (view.setAttribute("data-title", Globalize.translate("TabMusic")), libraryMenu.setTitle(Globalize.translate("TabMusic")))
|
||||
|
||||
var isViewRestored;
|
||||
var self = this;
|
||||
var currentTabIndex = parseInt(params.tab || getDefaultTabIndex(params.topParentId));
|
||||
var initialTabIndex = currentTabIndex;
|
||||
|
||||
self.initTab = function () {
|
||||
var tabContent = view.querySelector(".pageTabContent[data-index='0']");
|
||||
var containers = tabContent.querySelectorAll(".itemsContainer");
|
||||
|
||||
for (var i = 0, length = containers.length; i < length; i++) {
|
||||
setScrollClasses(containers[i], enableScrollX());
|
||||
}
|
||||
inputManager.on(window, onInputCommand)
|
||||
}), view.addEventListener("viewbeforehide", function(e) {
|
||||
inputManager.off(window, onInputCommand)
|
||||
}), view.addEventListener("viewdestroy", function(e) {
|
||||
tabControllers.forEach(function(t) {
|
||||
t.destroy && t.destroy()
|
||||
})
|
||||
})
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
self.renderTab = function () {
|
||||
reload();
|
||||
};
|
||||
|
||||
var tabControllers = [];
|
||||
var renderedTabs = [];
|
||||
view.addEventListener("viewshow", function (e) {
|
||||
isViewRestored = e.detail.isRestored;
|
||||
initTabs();
|
||||
if (!view.getAttribute("data-title")) {
|
||||
var parentId = params.topParentId;
|
||||
|
||||
if (parentId) {
|
||||
ApiClient.getItem(ApiClient.getCurrentUserId(), parentId).then(function (item) {
|
||||
view.setAttribute("data-title", item.Name);
|
||||
libraryMenu.setTitle(item.Name);
|
||||
});
|
||||
} else {
|
||||
view.setAttribute("data-title", Globalize.translate("TabMusic"));
|
||||
libraryMenu.setTitle(Globalize.translate("TabMusic"));
|
||||
}
|
||||
}
|
||||
|
||||
inputManager.on(window, onInputCommand);
|
||||
});
|
||||
view.addEventListener("viewbeforehide", function (e) {
|
||||
inputManager.off(window, onInputCommand);
|
||||
});
|
||||
view.addEventListener("viewdestroy", function (e) {
|
||||
tabControllers.forEach(function (t) {
|
||||
if (t.destroy) {
|
||||
t.destroy();
|
||||
}
|
||||
});
|
||||
});
|
||||
};
|
||||
});
|
||||
|
||||
+157
-107
@@ -1,135 +1,185 @@
|
||||
define(["events", "libraryBrowser", "imageLoader", "listView", "loading", "emby-itemscontainer"], function(events, libraryBrowser, imageLoader, listView, loading) {
|
||||
define(["events", "libraryBrowser", "imageLoader", "listView", "loading", "emby-itemscontainer"], function (events, libraryBrowser, imageLoader, listView, loading) {
|
||||
"use strict";
|
||||
return function(view, params, tabContent) {
|
||||
|
||||
return function (view, params, tabContent) {
|
||||
function getPageData(context) {
|
||||
var key = getSavedQueryKey(context),
|
||||
pageData = data[key];
|
||||
return pageData || (pageData = data[key] = {
|
||||
query: {
|
||||
SortBy: "Album,SortName",
|
||||
SortOrder: "Ascending",
|
||||
IncludeItemTypes: "Audio",
|
||||
Recursive: !0,
|
||||
Fields: "AudioInfo,ParentId",
|
||||
Limit: 100,
|
||||
StartIndex: 0,
|
||||
ImageTypeLimit: 1,
|
||||
EnableImageTypes: "Primary"
|
||||
}
|
||||
}, pageData.query.ParentId = params.topParentId, libraryBrowser.loadSavedQueryValues(key, pageData.query)), pageData
|
||||
var key = getSavedQueryKey(context);
|
||||
var pageData = data[key];
|
||||
|
||||
if (!pageData) {
|
||||
pageData = data[key] = {
|
||||
query: {
|
||||
SortBy: "Album,SortName",
|
||||
SortOrder: "Ascending",
|
||||
IncludeItemTypes: "Audio",
|
||||
Recursive: true,
|
||||
Fields: "AudioInfo,ParentId",
|
||||
Limit: 100,
|
||||
StartIndex: 0,
|
||||
ImageTypeLimit: 1,
|
||||
EnableImageTypes: "Primary"
|
||||
}
|
||||
};
|
||||
pageData.query.ParentId = params.topParentId;
|
||||
libraryBrowser.loadSavedQueryValues(key, pageData.query);
|
||||
}
|
||||
|
||||
return pageData;
|
||||
}
|
||||
|
||||
function getQuery(context) {
|
||||
return getPageData(context).query
|
||||
return getPageData(context).query;
|
||||
}
|
||||
|
||||
function getSavedQueryKey(context) {
|
||||
return context.savedQueryKey || (context.savedQueryKey = libraryBrowser.getSavedQueryKey("songs")), context.savedQueryKey
|
||||
if (!context.savedQueryKey) {
|
||||
context.savedQueryKey = libraryBrowser.getSavedQueryKey("songs");
|
||||
}
|
||||
|
||||
return context.savedQueryKey;
|
||||
}
|
||||
|
||||
function reloadItems(page) {
|
||||
loading.show();
|
||||
isLoading = true;
|
||||
var query = getQuery(page);
|
||||
ApiClient.getItems(Dashboard.getCurrentUserId(), query).then(function(result) {
|
||||
ApiClient.getItems(Dashboard.getCurrentUserId(), query).then(function (result) {
|
||||
function onNextPageClick() {
|
||||
if (isLoading) return;
|
||||
query.StartIndex += query.Limit, reloadItems(tabContent)
|
||||
if (isLoading) {
|
||||
return;
|
||||
}
|
||||
|
||||
query.StartIndex += query.Limit;
|
||||
reloadItems(tabContent);
|
||||
}
|
||||
|
||||
function onPreviousPageClick() {
|
||||
if (isLoading) return;
|
||||
query.StartIndex -= query.Limit, reloadItems(tabContent)
|
||||
if (isLoading) {
|
||||
return;
|
||||
}
|
||||
|
||||
query.StartIndex -= query.Limit;
|
||||
reloadItems(tabContent);
|
||||
}
|
||||
|
||||
window.scrollTo(0, 0);
|
||||
var i, length, pagingHtml = libraryBrowser.getQueryPagingHtml({
|
||||
startIndex: query.StartIndex,
|
||||
limit: query.Limit,
|
||||
totalRecordCount: result.TotalRecordCount,
|
||||
showLimit: !1,
|
||||
updatePageSizeSetting: !1,
|
||||
addLayoutButton: !1,
|
||||
sortButton: !1,
|
||||
filterButton: !1
|
||||
}),
|
||||
html = listView.getListViewHtml({
|
||||
items: result.Items,
|
||||
action: "playallfromhere",
|
||||
smallIcon: !0,
|
||||
artist: !0,
|
||||
addToListButton: !0
|
||||
}),
|
||||
elems = tabContent.querySelectorAll(".paging");
|
||||
for (i = 0, length = elems.length; i < length; i++) elems[i].innerHTML = pagingHtml;
|
||||
for (elems = tabContent.querySelectorAll(".btnNextPage"), i = 0, length = elems.length; i < length; i++) elems[i].addEventListener("click", onNextPageClick);
|
||||
for (elems = tabContent.querySelectorAll(".btnPreviousPage"), i = 0, length = elems.length; i < length; i++) elems[i].addEventListener("click", onPreviousPageClick);
|
||||
var i;
|
||||
var length;
|
||||
var pagingHtml = libraryBrowser.getQueryPagingHtml({
|
||||
startIndex: query.StartIndex,
|
||||
limit: query.Limit,
|
||||
totalRecordCount: result.TotalRecordCount,
|
||||
showLimit: false,
|
||||
updatePageSizeSetting: false,
|
||||
addLayoutButton: false,
|
||||
sortButton: false,
|
||||
filterButton: false
|
||||
});
|
||||
var html = listView.getListViewHtml({
|
||||
items: result.Items,
|
||||
action: "playallfromhere",
|
||||
smallIcon: true,
|
||||
artist: true,
|
||||
addToListButton: true
|
||||
});
|
||||
var elems = tabContent.querySelectorAll(".paging");
|
||||
|
||||
for (i = 0, length = elems.length; i < length; i++) {
|
||||
elems[i].innerHTML = pagingHtml;
|
||||
}
|
||||
|
||||
elems = tabContent.querySelectorAll(".btnNextPage");
|
||||
for (i = 0, length = elems.length; i < length; i++) {
|
||||
elems[i].addEventListener("click", onNextPageClick);
|
||||
}
|
||||
|
||||
elems = tabContent.querySelectorAll(".btnPreviousPage");
|
||||
for (i = 0, length = elems.length; i < length; i++) {
|
||||
elems[i].addEventListener("click", onPreviousPageClick);
|
||||
}
|
||||
|
||||
var itemsContainer = tabContent.querySelector(".itemsContainer");
|
||||
itemsContainer.innerHTML = html;
|
||||
imageLoader.lazyChildren(itemsContainer);
|
||||
libraryBrowser.saveQueryValues(getSavedQueryKey(page), query);
|
||||
loading.hide();
|
||||
isLoading = false;
|
||||
})
|
||||
});
|
||||
}
|
||||
var self = this,
|
||||
data = {},
|
||||
isLoading = false;
|
||||
self.showFilterMenu = function() {
|
||||
require(["components/filterdialog/filterdialog"], function(filterDialogFactory) {
|
||||
var filterDialog = new filterDialogFactory({
|
||||
query: getQuery(tabContent),
|
||||
mode: "songs",
|
||||
serverId: ApiClient.serverId()
|
||||
});
|
||||
events.on(filterDialog, "filterchange", function() {
|
||||
getQuery(tabContent).StartIndex = 0, reloadItems(tabContent)
|
||||
}), filterDialog.show()
|
||||
})
|
||||
}, self.getCurrentViewStyle = function() {
|
||||
return getPageData(tabContent).view
|
||||
},
|
||||
function(tabContent) {
|
||||
tabContent.querySelector(".btnFilter").addEventListener("click", function() {
|
||||
self.showFilterMenu()
|
||||
}), tabContent.querySelector(".btnSort").addEventListener("click", function(e) {
|
||||
libraryBrowser.showSortMenu({
|
||||
items: [{
|
||||
name: Globalize.translate("OptionTrackName"),
|
||||
id: "Name"
|
||||
}, {
|
||||
name: Globalize.translate("OptionAlbum"),
|
||||
id: "Album,SortName"
|
||||
}, {
|
||||
name: Globalize.translate("OptionAlbumArtist"),
|
||||
id: "AlbumArtist,Album,SortName"
|
||||
}, {
|
||||
name: Globalize.translate("OptionArtist"),
|
||||
id: "Artist,Album,SortName"
|
||||
}, {
|
||||
name: Globalize.translate("OptionDateAdded"),
|
||||
id: "DateCreated,SortName"
|
||||
}, {
|
||||
name: Globalize.translate("OptionDatePlayed"),
|
||||
id: "DatePlayed,SortName"
|
||||
}, {
|
||||
name: Globalize.translate("OptionPlayCount"),
|
||||
id: "PlayCount,SortName"
|
||||
}, {
|
||||
name: Globalize.translate("OptionReleaseDate"),
|
||||
id: "PremiereDate,AlbumArtist,Album,SortName"
|
||||
}, {
|
||||
name: Globalize.translate("OptionRuntime"),
|
||||
id: "Runtime,AlbumArtist,Album,SortName"
|
||||
}],
|
||||
callback: function() {
|
||||
getQuery(tabContent).StartIndex = 0, reloadItems(tabContent)
|
||||
},
|
||||
query: getQuery(tabContent),
|
||||
button: e.target
|
||||
})
|
||||
})
|
||||
}(tabContent), self.renderTab = function() {
|
||||
reloadItems(tabContent)
|
||||
}, self.destroy = function() {}
|
||||
}
|
||||
|
||||
var self = this;
|
||||
var data = {};
|
||||
var isLoading = false;
|
||||
|
||||
self.showFilterMenu = function () {
|
||||
require(["components/filterdialog/filterdialog"], function (filterDialogFactory) {
|
||||
var filterDialog = new filterDialogFactory({
|
||||
query: getQuery(tabContent),
|
||||
mode: "songs",
|
||||
serverId: ApiClient.serverId()
|
||||
});
|
||||
events.on(filterDialog, "filterchange", function () {
|
||||
getQuery(tabContent).StartIndex = 0;
|
||||
reloadItems(tabContent);
|
||||
});
|
||||
filterDialog.show();
|
||||
});
|
||||
};
|
||||
|
||||
self.getCurrentViewStyle = function () {
|
||||
return getPageData(tabContent).view;
|
||||
};
|
||||
|
||||
function initPage(tabContent) {
|
||||
tabContent.querySelector(".btnFilter").addEventListener("click", function () {
|
||||
self.showFilterMenu();
|
||||
});
|
||||
tabContent.querySelector(".btnSort").addEventListener("click", function (e) {
|
||||
libraryBrowser.showSortMenu({
|
||||
items: [{
|
||||
name: Globalize.translate("OptionTrackName"),
|
||||
id: "Name"
|
||||
}, {
|
||||
name: Globalize.translate("OptionAlbum"),
|
||||
id: "Album,SortName"
|
||||
}, {
|
||||
name: Globalize.translate("OptionAlbumArtist"),
|
||||
id: "AlbumArtist,Album,SortName"
|
||||
}, {
|
||||
name: Globalize.translate("OptionArtist"),
|
||||
id: "Artist,Album,SortName"
|
||||
}, {
|
||||
name: Globalize.translate("OptionDateAdded"),
|
||||
id: "DateCreated,SortName"
|
||||
}, {
|
||||
name: Globalize.translate("OptionDatePlayed"),
|
||||
id: "DatePlayed,SortName"
|
||||
}, {
|
||||
name: Globalize.translate("OptionPlayCount"),
|
||||
id: "PlayCount,SortName"
|
||||
}, {
|
||||
name: Globalize.translate("OptionReleaseDate"),
|
||||
id: "PremiereDate,AlbumArtist,Album,SortName"
|
||||
}, {
|
||||
name: Globalize.translate("OptionRuntime"),
|
||||
id: "Runtime,AlbumArtist,Album,SortName"
|
||||
}],
|
||||
callback: function () {
|
||||
getQuery(tabContent).StartIndex = 0;
|
||||
reloadItems(tabContent);
|
||||
},
|
||||
query: getQuery(tabContent),
|
||||
button: e.target
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
initPage(tabContent);
|
||||
|
||||
self.renderTab = function () {
|
||||
reloadItems(tabContent);
|
||||
};
|
||||
|
||||
self.destroy = function () {};
|
||||
};
|
||||
});
|
||||
|
||||
@@ -1,85 +1,122 @@
|
||||
define(["jQuery", "emby-checkbox", "fnchecked"], function($) {
|
||||
define(["jQuery", "emby-checkbox", "fnchecked"], function ($) {
|
||||
"use strict";
|
||||
|
||||
function fillItems(elem, items, cssClass, idPrefix, currentList, isEnabledList) {
|
||||
var html = '<div class="checkboxList paperList" style="padding: .5em 1em;">';
|
||||
html += items.map(function(u) {
|
||||
var isChecked = isEnabledList ? -1 != currentList.indexOf(u.Id) : -1 == currentList.indexOf(u.Id),
|
||||
checkedHtml = isChecked ? ' checked="checked"' : "";
|
||||
return '<label><input is="emby-checkbox" class="' + cssClass + '" type="checkbox" data-itemid="' + u.Id + '"' + checkedHtml + "/><span>" + u.Name + "</span></label>"
|
||||
}).join(""), html += "</div>", elem.html(html).trigger("create")
|
||||
html += items.map(function (u) {
|
||||
var isChecked = isEnabledList ? currentList.indexOf(u.Id) != -1 : currentList.indexOf(u.Id) == -1;
|
||||
var checkedHtml = isChecked ? ' checked="checked"' : "";
|
||||
return '<label><input is="emby-checkbox" class="' + cssClass + '" type="checkbox" data-itemid="' + u.Id + '"' + checkedHtml + "/><span>" + u.Name + "</span></label>";
|
||||
}).join("");
|
||||
html += "</div>";
|
||||
elem.html(html).trigger("create");
|
||||
}
|
||||
|
||||
function reload(page) {
|
||||
var type = getParameterByName("type"),
|
||||
promise1 = ApiClient.getUsers(),
|
||||
promise2 = ApiClient.getNamedConfiguration(notificationsConfigurationKey),
|
||||
promise3 = ApiClient.getJSON(ApiClient.getUrl("Notifications/Types")),
|
||||
promise4 = ApiClient.getJSON(ApiClient.getUrl("Notifications/Services"));
|
||||
Promise.all([promise1, promise2, promise3, promise4]).then(function(responses) {
|
||||
var users = responses[0],
|
||||
notificationOptions = responses[1],
|
||||
types = responses[2],
|
||||
services = responses[3],
|
||||
notificationConfig = notificationOptions.Options.filter(function(n) {
|
||||
return n.Type == type
|
||||
})[0],
|
||||
typeInfo = types.filter(function(n) {
|
||||
return n.Type == type
|
||||
})[0] || {};
|
||||
typeInfo.IsBasedOnUserEvent ? $(".monitorUsers", page).show() : $(".monitorUsers", page).hide(), $(".notificationType", page).html(typeInfo.Name || "Unknown Notification"), notificationConfig || (notificationConfig = {
|
||||
DisabledMonitorUsers: [],
|
||||
SendToUsers: [],
|
||||
DisabledServices: [],
|
||||
SendToUserMode: "Admins"
|
||||
}), fillItems($(".monitorUsersList", page), users, "chkMonitor", "chkMonitor", notificationConfig.DisabledMonitorUsers), fillItems($(".sendToUsersList", page), users, "chkSendTo", "chkSendTo", notificationConfig.SendToUsers, !0), fillItems($(".servicesList", page), services, "chkService", "chkService", notificationConfig.DisabledServices), $("#chkEnabled", page).checked(notificationConfig.Enabled || !1), $("#selectUsers", page).val(notificationConfig.SendToUserMode).trigger("change")
|
||||
})
|
||||
var type = getParameterByName("type");
|
||||
var promise1 = ApiClient.getUsers();
|
||||
var promise2 = ApiClient.getNamedConfiguration(notificationsConfigurationKey);
|
||||
var promise3 = ApiClient.getJSON(ApiClient.getUrl("Notifications/Types"));
|
||||
var promise4 = ApiClient.getJSON(ApiClient.getUrl("Notifications/Services"));
|
||||
Promise.all([promise1, promise2, promise3, promise4]).then(function (responses) {
|
||||
var users = responses[0];
|
||||
var notificationOptions = responses[1];
|
||||
var types = responses[2];
|
||||
var services = responses[3];
|
||||
var notificationConfig = notificationOptions.Options.filter(function (n) {
|
||||
return n.Type == type;
|
||||
})[0];
|
||||
var typeInfo = types.filter(function (n) {
|
||||
return n.Type == type;
|
||||
})[0] || {};
|
||||
|
||||
if (typeInfo.IsBasedOnUserEvent) {
|
||||
$(".monitorUsers", page).show();
|
||||
} else {
|
||||
$(".monitorUsers", page).hide();
|
||||
}
|
||||
|
||||
$(".notificationType", page).html(typeInfo.Name || "Unknown Notification");
|
||||
|
||||
if (!notificationConfig) {
|
||||
notificationConfig = {
|
||||
DisabledMonitorUsers: [],
|
||||
SendToUsers: [],
|
||||
DisabledServices: [],
|
||||
SendToUserMode: "Admins"
|
||||
};
|
||||
}
|
||||
|
||||
fillItems($(".monitorUsersList", page), users, "chkMonitor", "chkMonitor", notificationConfig.DisabledMonitorUsers);
|
||||
fillItems($(".sendToUsersList", page), users, "chkSendTo", "chkSendTo", notificationConfig.SendToUsers, true);
|
||||
fillItems($(".servicesList", page), services, "chkService", "chkService", notificationConfig.DisabledServices);
|
||||
$("#chkEnabled", page).checked(notificationConfig.Enabled || false);
|
||||
$("#selectUsers", page).val(notificationConfig.SendToUserMode).trigger("change");
|
||||
});
|
||||
}
|
||||
|
||||
function save(page) {
|
||||
var type = getParameterByName("type"),
|
||||
promise1 = ApiClient.getNamedConfiguration(notificationsConfigurationKey),
|
||||
promise2 = ApiClient.getJSON(ApiClient.getUrl("Notifications/Types"));
|
||||
Promise.all([promise1, promise2]).then(function(responses) {
|
||||
var notificationOptions = responses[0],
|
||||
types = responses[1],
|
||||
notificationConfig = notificationOptions.Options.filter(function(n) {
|
||||
return n.Type == type
|
||||
})[0];
|
||||
notificationConfig || (notificationConfig = {
|
||||
Type: type
|
||||
}, notificationOptions.Options.push(notificationConfig));
|
||||
types.filter(function(n) {
|
||||
return n.Type == type
|
||||
var type = getParameterByName("type");
|
||||
var promise1 = ApiClient.getNamedConfiguration(notificationsConfigurationKey);
|
||||
var promise2 = ApiClient.getJSON(ApiClient.getUrl("Notifications/Types"));
|
||||
Promise.all([promise1, promise2]).then(function (responses) {
|
||||
var notificationOptions = responses[0];
|
||||
var types = responses[1];
|
||||
var notificationConfig = notificationOptions.Options.filter(function (n) {
|
||||
return n.Type == type;
|
||||
})[0];
|
||||
notificationConfig.Enabled = $("#chkEnabled", page).checked(), notificationConfig.SendToUserMode = $("#selectUsers", page).val(), notificationConfig.DisabledMonitorUsers = $(".chkMonitor", page).get().filter(function(c) {
|
||||
return !c.checked
|
||||
}).map(function(c) {
|
||||
return c.getAttribute("data-itemid")
|
||||
}), notificationConfig.SendToUsers = $(".chkSendTo", page).get().filter(function(c) {
|
||||
return c.checked
|
||||
}).map(function(c) {
|
||||
return c.getAttribute("data-itemid")
|
||||
}), notificationConfig.DisabledServices = $(".chkService", page).get().filter(function(c) {
|
||||
return !c.checked
|
||||
}).map(function(c) {
|
||||
return c.getAttribute("data-itemid")
|
||||
}), ApiClient.updateNamedConfiguration(notificationsConfigurationKey, notificationOptions).then(function(r) {
|
||||
Dashboard.processServerConfigurationUpdateResult(), Dashboard.navigate("notificationsettings.html")
|
||||
})
|
||||
})
|
||||
|
||||
if (!notificationConfig) {
|
||||
notificationConfig = {
|
||||
Type: type
|
||||
};
|
||||
notificationOptions.Options.push(notificationConfig);
|
||||
}
|
||||
|
||||
types.filter(function (n) {
|
||||
return n.Type == type;
|
||||
})[0];
|
||||
notificationConfig.Enabled = $("#chkEnabled", page).checked();
|
||||
notificationConfig.SendToUserMode = $("#selectUsers", page).val();
|
||||
notificationConfig.DisabledMonitorUsers = $(".chkMonitor", page).get().filter(function (c) {
|
||||
return !c.checked;
|
||||
}).map(function (c) {
|
||||
return c.getAttribute("data-itemid");
|
||||
});
|
||||
notificationConfig.SendToUsers = $(".chkSendTo", page).get().filter(function (c) {
|
||||
return c.checked;
|
||||
}).map(function (c) {
|
||||
return c.getAttribute("data-itemid");
|
||||
});
|
||||
notificationConfig.DisabledServices = $(".chkService", page).get().filter(function (c) {
|
||||
return !c.checked;
|
||||
}).map(function (c) {
|
||||
return c.getAttribute("data-itemid");
|
||||
});
|
||||
ApiClient.updateNamedConfiguration(notificationsConfigurationKey, notificationOptions).then(function (r) {
|
||||
Dashboard.processServerConfigurationUpdateResult();
|
||||
Dashboard.navigate("notificationsettings.html");
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function onSubmit() {
|
||||
return save($(this).parents(".page")), !1
|
||||
save($(this).parents(".page"));
|
||||
return false;
|
||||
}
|
||||
|
||||
var notificationsConfigurationKey = "notifications";
|
||||
$(document).on("pageinit", "#notificationSettingPage", function() {
|
||||
$(document).on("pageinit", "#notificationSettingPage", function () {
|
||||
var page = this;
|
||||
$("#selectUsers", page).on("change", function() {
|
||||
"Custom" == this.value ? $(".selectCustomUsers", page).show() : $(".selectCustomUsers", page).hide()
|
||||
}), $(".notificationSettingForm").off("submit", onSubmit).on("submit", onSubmit)
|
||||
}).on("pageshow", "#notificationSettingPage", function() {
|
||||
reload(this)
|
||||
})
|
||||
});
|
||||
$("#selectUsers", page).on("change", function () {
|
||||
if ("Custom" == this.value) {
|
||||
$(".selectCustomUsers", page).show();
|
||||
} else {
|
||||
$(".selectCustomUsers", page).hide();
|
||||
}
|
||||
});
|
||||
$(".notificationSettingForm").off("submit", onSubmit).on("submit", onSubmit);
|
||||
}).on("pageshow", "#notificationSettingPage", function () {
|
||||
reload(this);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -1,11 +1,22 @@
|
||||
define(["components/remotecontrol/remotecontrol", "libraryMenu", "emby-button"], function(remotecontrolFactory, libraryMenu) {
|
||||
define(["components/remotecontrol/remotecontrol", "libraryMenu", "emby-button"], function (remotecontrolFactory, libraryMenu) {
|
||||
"use strict";
|
||||
return function(view, params) {
|
||||
var remoteControl = new remotecontrolFactory;
|
||||
remoteControl.init(view, view.querySelector(".remoteControlContent")), view.addEventListener("viewshow", function(e) {
|
||||
libraryMenu.setTransparentMenu(!0), remoteControl && remoteControl.onShow()
|
||||
}), view.addEventListener("viewbeforehide", function(e) {
|
||||
libraryMenu.setTransparentMenu(!1), remoteControl && remoteControl.destroy()
|
||||
})
|
||||
}
|
||||
});
|
||||
|
||||
return function (view, params) {
|
||||
var remoteControl = new remotecontrolFactory();
|
||||
remoteControl.init(view, view.querySelector(".remoteControlContent"));
|
||||
view.addEventListener("viewshow", function (e) {
|
||||
libraryMenu.setTransparentMenu(true);
|
||||
|
||||
if (remoteControl) {
|
||||
remoteControl.onShow();
|
||||
}
|
||||
});
|
||||
view.addEventListener("viewbeforehide", function (e) {
|
||||
libraryMenu.setTransparentMenu(false);
|
||||
|
||||
if (remoteControl) {
|
||||
remoteControl.destroy();
|
||||
}
|
||||
});
|
||||
};
|
||||
});
|
||||
|
||||
@@ -1,16 +1,25 @@
|
||||
define(["jQuery", "loading", "libraryMenu"], function($, loading, libraryMenu) {
|
||||
define(["jQuery", "loading", "libraryMenu"], function ($, loading, libraryMenu) {
|
||||
"use strict";
|
||||
|
||||
function loadPage(page, config) {
|
||||
$("#txtMinResumePct", page).val(config.MinResumePct), $("#txtMaxResumePct", page).val(config.MaxResumePct), $("#txtMinResumeDuration", page).val(config.MinResumeDurationSeconds), loading.hide()
|
||||
$("#txtMinResumePct", page).val(config.MinResumePct);
|
||||
$("#txtMaxResumePct", page).val(config.MaxResumePct);
|
||||
$("#txtMinResumeDuration", page).val(config.MinResumeDurationSeconds);
|
||||
loading.hide();
|
||||
}
|
||||
|
||||
function onSubmit() {
|
||||
loading.show();
|
||||
var form = this;
|
||||
return ApiClient.getServerConfiguration().then(function(config) {
|
||||
config.MinResumePct = $("#txtMinResumePct", form).val(), config.MaxResumePct = $("#txtMaxResumePct", form).val(), config.MinResumeDurationSeconds = $("#txtMinResumeDuration", form).val(), ApiClient.updateServerConfiguration(config).then(Dashboard.processServerConfigurationUpdateResult)
|
||||
}), !1
|
||||
ApiClient.getServerConfiguration().then(function (config) {
|
||||
config.MinResumePct = $('#txtMinResumePct', form).val();
|
||||
config.MaxResumePct = $('#txtMaxResumePct', form).val();
|
||||
config.MinResumeDurationSeconds = $('#txtMinResumeDuration', form).val();
|
||||
|
||||
ApiClient.updateServerConfiguration(config).then(Dashboard.processServerConfigurationUpdateResult);
|
||||
});
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
function getTabs() {
|
||||
@@ -23,17 +32,17 @@ define(["jQuery", "loading", "libraryMenu"], function($, loading, libraryMenu) {
|
||||
}, {
|
||||
href: "streamingsettings.html",
|
||||
name: Globalize.translate("TabStreaming")
|
||||
}]
|
||||
}];
|
||||
}
|
||||
|
||||
$(document).on("pageinit", "#playbackConfigurationPage", function() {
|
||||
$(document).on("pageinit", "#playbackConfigurationPage", function () {
|
||||
$(".playbackConfigurationForm").off("submit", onSubmit).on("submit", onSubmit)
|
||||
}).on("pageshow", "#playbackConfigurationPage", function() {
|
||||
}).on("pageshow", "#playbackConfigurationPage", function () {
|
||||
loading.show();
|
||||
libraryMenu.setTabs("playback", 1, getTabs);
|
||||
var page = this;
|
||||
ApiClient.getServerConfiguration().then(function(config) {
|
||||
loadPage(page, config)
|
||||
})
|
||||
})
|
||||
});
|
||||
ApiClient.getServerConfiguration().then(function (config) {
|
||||
loadPage(page, config);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
@@ -1,111 +1,237 @@
|
||||
define(["jQuery", "loading", "datetime", "dom", "globalize", "emby-input", "emby-button", "emby-select"], function($, loading, datetime, dom, globalize) {
|
||||
define(["jQuery", "loading", "datetime", "dom", "globalize", "emby-input", "emby-button", "emby-select"], function ($, loading, datetime, dom, globalize) {
|
||||
"use strict";
|
||||
|
||||
function fillTimeOfDay(select) {
|
||||
for (var options = [], i = 0; i < 864e5; i += 9e5) options.push({
|
||||
name: ScheduledTaskPage.getDisplayTime(1e4 * i),
|
||||
value: 1e4 * i
|
||||
});
|
||||
select.innerHTML = options.map(function(o) {
|
||||
return '<option value="' + o.value + '">' + o.name + "</option>"
|
||||
}).join("")
|
||||
|
||||
var options = [];
|
||||
|
||||
for (var i = 0; i < 86400000; i += 900000) {
|
||||
options.push({
|
||||
name: ScheduledTaskPage.getDisplayTime(i * 10000),
|
||||
value: i * 10000
|
||||
});
|
||||
}
|
||||
|
||||
select.innerHTML = options.map(function (o) {
|
||||
return '<option value="' + o.value + '">' + o.name + '</option>';
|
||||
}).join("");
|
||||
}
|
||||
Array.prototype.remove = function(from, to) {
|
||||
|
||||
Array.prototype.remove = function (from, to) {
|
||||
var rest = this.slice((to || from) + 1 || this.length);
|
||||
return this.length = from < 0 ? this.length + from : from, this.push.apply(this, rest)
|
||||
this.length = from < 0 ? this.length + from : from;
|
||||
return this.push.apply(this, rest);
|
||||
};
|
||||
|
||||
var ScheduledTaskPage = {
|
||||
refreshScheduledTask: function(view) {
|
||||
refreshScheduledTask: function (view) {
|
||||
loading.show();
|
||||
var id = getParameterByName("id");
|
||||
ApiClient.getScheduledTask(id).then(function(task) {
|
||||
ScheduledTaskPage.loadScheduledTask(view, task)
|
||||
})
|
||||
ApiClient.getScheduledTask(id).then(function (task) {
|
||||
ScheduledTaskPage.loadScheduledTask(view, task);
|
||||
});
|
||||
},
|
||||
loadScheduledTask: function(view, task) {
|
||||
$(".taskName", view).html(task.Name), $("#pTaskDescription", view).html(task.Description), require(["listViewStyle"], function() {
|
||||
ScheduledTaskPage.loadTaskTriggers(view, task)
|
||||
}), loading.hide()
|
||||
loadScheduledTask: function (view, task) {
|
||||
$(".taskName", view).html(task.Name);
|
||||
$("#pTaskDescription", view).html(task.Description);
|
||||
|
||||
require(["listViewStyle"], function () {
|
||||
ScheduledTaskPage.loadTaskTriggers(view, task);
|
||||
});
|
||||
|
||||
loading.hide();
|
||||
},
|
||||
loadTaskTriggers: function(context, task) {
|
||||
loadTaskTriggers: function (context, task) {
|
||||
var html = "";
|
||||
html += '<div class="paperList">';
|
||||
|
||||
for (var i = 0, length = task.Triggers.length; i < length; i++) {
|
||||
var trigger = task.Triggers[i];
|
||||
if (html += '<div class="listItem listItem-border">', html += '<i class="md-icon listItemIcon">schedule</i>', trigger.MaxRuntimeTicks ? html += '<div class="listItemBody two-line">' : html += '<div class="listItemBody">', html += "<div class='listItemBodyText'>" + ScheduledTaskPage.getTriggerFriendlyName(trigger) + "</div>", trigger.MaxRuntimeTicks) {
|
||||
|
||||
html += '<div class="listItem listItem-border">';
|
||||
html += '<i class="md-icon listItemIcon">schedule</i>';
|
||||
if (trigger.MaxRuntimeMs) {
|
||||
html += '<div class="listItemBody two-line">';
|
||||
} else {
|
||||
html += '<div class="listItemBody">';
|
||||
}
|
||||
html += "<div class='listItemBodyText'>" + ScheduledTaskPage.getTriggerFriendlyName(trigger) + "</div>";
|
||||
if (trigger.MaxRuntimeMs) {
|
||||
html += '<div class="listItemBodyText secondary">';
|
||||
var hours = trigger.MaxRuntimeTicks / 36e9;
|
||||
html += 1 == hours ? globalize.translate("ValueTimeLimitSingleHour") : globalize.translate("ValueTimeLimitMultiHour", hours), html += "</div>"
|
||||
if (hours == 1) {
|
||||
html += globalize.translate("ValueTimeLimitSingleHour");
|
||||
} else {
|
||||
html += globalize.translate("ValueTimeLimitMultiHour", hours);
|
||||
}
|
||||
html += "</div>";
|
||||
}
|
||||
html += "</div>", html += '<button class="btnDeleteTrigger" data-index="' + i + '" type="button" is="paper-icon-button-light" title="' + globalize.translate("ButtonDelete") + '"><i class="md-icon">delete</i></button>', html += "</div>"
|
||||
|
||||
html += "</div>";
|
||||
html += '<button class="btnDeleteTrigger" data-index="' + i + '" type="button" is="paper-icon-button-light" title="' + globalize.translate("ButtonDelete") + '"><i class="md-icon">delete</i></button>';
|
||||
html += "</div>";
|
||||
}
|
||||
html += "</div>", context.querySelector(".taskTriggers").innerHTML = html
|
||||
|
||||
html += "</div>";
|
||||
context.querySelector(".taskTriggers").innerHTML = html;
|
||||
},
|
||||
getTriggerFriendlyName: function(trigger) {
|
||||
if ("DailyTrigger" == trigger.Type) return "Daily at " + ScheduledTaskPage.getDisplayTime(trigger.TimeOfDayTicks);
|
||||
if ("WeeklyTrigger" == trigger.Type) return trigger.DayOfWeek + "s at " + ScheduledTaskPage.getDisplayTime(trigger.TimeOfDayTicks);
|
||||
if ("SystemEventTrigger" == trigger.Type && "WakeFromSleep" == trigger.SystemEvent) return "On wake from sleep";
|
||||
if ("IntervalTrigger" == trigger.Type) {
|
||||
getTriggerFriendlyName: function (trigger) {
|
||||
if ("DailyTrigger" == trigger.Type) {
|
||||
return "Daily at " + ScheduledTaskPage.getDisplayTime(trigger.TimeOfDayTicks);
|
||||
}
|
||||
|
||||
if ("WeeklyTrigger" == trigger.Type) {
|
||||
return trigger.DayOfWeek + "s at " + ScheduledTaskPage.getDisplayTime(trigger.TimeOfDayTicks);
|
||||
}
|
||||
|
||||
if ("SystemEventTrigger" == trigger.Type && "WakeFromSleep" == trigger.SystemEvent) {
|
||||
return "On wake from sleep";
|
||||
}
|
||||
|
||||
if (trigger.Type == "IntervalTrigger") {
|
||||
|
||||
var hours = trigger.IntervalTicks / 36e9;
|
||||
return .25 == hours ? "Every 15 minutes" : .5 == hours ? "Every 30 minutes" : .75 == hours ? "Every 45 minutes" : 1 == hours ? "Every hour" : "Every " + hours + " hours"
|
||||
|
||||
if (hours == .25) {
|
||||
return "Every 15 minutes";
|
||||
}
|
||||
if (hours == .5) {
|
||||
return "Every 30 minutes";
|
||||
}
|
||||
if (hours == .75) {
|
||||
return "Every 45 minutes";
|
||||
}
|
||||
if (hours == 1) {
|
||||
return "Every hour";
|
||||
}
|
||||
|
||||
return "Every " + hours + " hours";
|
||||
}
|
||||
return "StartupTrigger" == trigger.Type ? "On application startup" : trigger.Type
|
||||
|
||||
if (trigger.Type == "StartupTrigger") {
|
||||
return "On application startup";
|
||||
}
|
||||
|
||||
return trigger.Type;
|
||||
},
|
||||
getDisplayTime: function(ticks) {
|
||||
var ms = ticks / 1e4,
|
||||
now = new Date;
|
||||
return now.setHours(0, 0, 0, 0), now.setTime(now.getTime() + ms), datetime.getDisplayTime(now)
|
||||
getDisplayTime: function (ticks) {
|
||||
var ms = ticks / 1e4;
|
||||
var now = new Date();
|
||||
now.setHours(0, 0, 0, 0);
|
||||
now.setTime(now.getTime() + ms);
|
||||
return datetime.getDisplayTime(now);
|
||||
},
|
||||
showAddTriggerPopup: function(view) {
|
||||
$("#selectTriggerType", view).val("DailyTrigger"), view.querySelector("#selectTriggerType").dispatchEvent(new CustomEvent("change", {})), $("#popupAddTrigger", view).removeClass("hide")
|
||||
showAddTriggerPopup: function (view) {
|
||||
$("#selectTriggerType", view).val("DailyTrigger");
|
||||
view.querySelector("#selectTriggerType").dispatchEvent(new CustomEvent("change", {}));
|
||||
$("#popupAddTrigger", view).removeClass("hide");
|
||||
},
|
||||
confirmDeleteTrigger: function(view, index) {
|
||||
require(["confirm"], function(confirm) {
|
||||
confirm(globalize.translate("MessageDeleteTaskTrigger"), globalize.translate("HeaderDeleteTaskTrigger")).then(function() {
|
||||
ScheduledTaskPage.deleteTrigger(view, index)
|
||||
})
|
||||
})
|
||||
confirmDeleteTrigger: function (view, index) {
|
||||
require(["confirm"], function (confirm) {
|
||||
confirm(globalize.translate("MessageDeleteTaskTrigger"), globalize.translate("HeaderDeleteTaskTrigger")).then(function () {
|
||||
ScheduledTaskPage.deleteTrigger(view, index);
|
||||
});
|
||||
});
|
||||
},
|
||||
deleteTrigger: function(view, index) {
|
||||
deleteTrigger: function (view, index) {
|
||||
loading.show();
|
||||
var id = getParameterByName("id");
|
||||
ApiClient.getScheduledTask(id).then(function(task) {
|
||||
task.Triggers.remove(index), ApiClient.updateScheduledTaskTriggers(task.Id, task.Triggers).then(function() {
|
||||
ScheduledTaskPage.refreshScheduledTask(view)
|
||||
})
|
||||
})
|
||||
ApiClient.getScheduledTask(id).then(function (task) {
|
||||
task.Triggers.remove(index);
|
||||
ApiClient.updateScheduledTaskTriggers(task.Id, task.Triggers).then(function () {
|
||||
ScheduledTaskPage.refreshScheduledTask(view);
|
||||
});
|
||||
});
|
||||
},
|
||||
refreshTriggerFields: function(page, triggerType) {
|
||||
"DailyTrigger" == triggerType ? ($("#fldTimeOfDay", page).show(), $("#fldDayOfWeek", page).hide(), $("#fldSelectSystemEvent", page).hide(), $("#fldSelectInterval", page).hide(), $("#selectTimeOfDay", page).attr("required", "required")) : "WeeklyTrigger" == triggerType ? ($("#fldTimeOfDay", page).show(), $("#fldDayOfWeek", page).show(), $("#fldSelectSystemEvent", page).hide(), $("#fldSelectInterval", page).hide(), $("#selectTimeOfDay", page).attr("required", "required")) : "SystemEventTrigger" == triggerType ? ($("#fldTimeOfDay", page).hide(), $("#fldDayOfWeek", page).hide(), $("#fldSelectSystemEvent", page).show(), $("#fldSelectInterval", page).hide(), $("#selectTimeOfDay", page).removeAttr("required")) : "IntervalTrigger" == triggerType ? ($("#fldTimeOfDay", page).hide(), $("#fldDayOfWeek", page).hide(), $("#fldSelectSystemEvent", page).hide(), $("#fldSelectInterval", page).show(), $("#selectTimeOfDay", page).removeAttr("required")) : "StartupTrigger" == triggerType && ($("#fldTimeOfDay", page).hide(), $("#fldDayOfWeek", page).hide(), $("#fldSelectSystemEvent", page).hide(), $("#fldSelectInterval", page).hide(), $("#selectTimeOfDay", page).removeAttr("required"))
|
||||
refreshTriggerFields: function (page, triggerType) {
|
||||
if (triggerType == "DailyTrigger") {
|
||||
$("#fldTimeOfDay", page).show();
|
||||
$("#fldDayOfWeek", page).hide();
|
||||
$("#fldSelectSystemEvent", page).hide();
|
||||
$("#fldSelectInterval", page).hide();
|
||||
$("#selectTimeOfDay", page).attr("required", "required");
|
||||
} else if (triggerType == "WeeklyTrigger") {
|
||||
$("#fldTimeOfDay", page).show();
|
||||
$("#fldDayOfWeek", page).show();
|
||||
$("#fldSelectSystemEvent", page).hide();
|
||||
$("#fldSelectInterval", page).hide();
|
||||
$("#selectTimeOfDay", page).attr("required", "required");
|
||||
} else if (triggerType == "SystemEventTrigger") {
|
||||
$("#fldTimeOfDay", page).hide();
|
||||
$("#fldDayOfWeek", page).hide();
|
||||
$("#fldSelectSystemEvent", page).show();
|
||||
$("#fldSelectInterval", page).hide();
|
||||
$("#selectTimeOfDay", page).removeAttr("required");
|
||||
} else if (triggerType == "IntervalTrigger") {
|
||||
$("#fldTimeOfDay", page).hide();
|
||||
$("#fldDayOfWeek", page).hide();
|
||||
$("#fldSelectSystemEvent", page).hide();
|
||||
$("#fldSelectInterval", page).show();
|
||||
$("#selectTimeOfDay", page).removeAttr("required");
|
||||
} else if (triggerType == "StartupTrigger") {
|
||||
$("#fldTimeOfDay", page).hide();
|
||||
$("#fldDayOfWeek", page).hide();
|
||||
$("#fldSelectSystemEvent", page).hide();
|
||||
$("#fldSelectInterval", page).hide();
|
||||
$("#selectTimeOfDay", page).removeAttr("required");
|
||||
}
|
||||
},
|
||||
getTriggerToAdd: function(page) {
|
||||
getTriggerToAdd: function (page) {
|
||||
var trigger = {
|
||||
Type: $("#selectTriggerType", page).val()
|
||||
};
|
||||
"DailyTrigger" == trigger.Type ? trigger.TimeOfDayTicks = $("#selectTimeOfDay", page).val() : "WeeklyTrigger" == trigger.Type ? (trigger.DayOfWeek = $("#selectDayOfWeek", page).val(), trigger.TimeOfDayTicks = $("#selectTimeOfDay", page).val()) : "SystemEventTrigger" == trigger.Type ? trigger.SystemEvent = $("#selectSystemEvent", page).val() : "IntervalTrigger" == trigger.Type && (trigger.IntervalTicks = $("#selectInterval", page).val());
|
||||
|
||||
if (trigger.Type == "DailyTrigger") {
|
||||
trigger.TimeOfDayTicks = $("#selectTimeOfDay", page).val();
|
||||
} else if (trigger.Type == "WeeklyTrigger") {
|
||||
trigger.DayOfWeek = $("#selectDayOfWeek", page).val();
|
||||
trigger.TimeOfDayTicks = $("#selectTimeOfDay", page).val();
|
||||
} else if (trigger.Type == "SystemEventTrigger") {
|
||||
trigger.SystemEvent = $("#selectSystemEvent", page).val();
|
||||
} else if (trigger.Type == "IntervalTrigger") {
|
||||
trigger.IntervalTicks = $("#selectInterval", page).val();
|
||||
}
|
||||
|
||||
var timeLimit = $("#txtTimeLimit", page).val() || "0";
|
||||
return timeLimit = 36e5 * parseFloat(timeLimit), trigger.MaxRuntimeMs = timeLimit || null, trigger
|
||||
timeLimit = parseFloat(timeLimit) * 3600000;
|
||||
|
||||
trigger.MaxRuntimeMs = timeLimit || null;
|
||||
|
||||
return trigger;
|
||||
}
|
||||
};
|
||||
return function(view, params) {
|
||||
return function (view, params) {
|
||||
function onSubmit(e) {
|
||||
loading.show();
|
||||
var id = getParameterByName("id");
|
||||
ApiClient.getScheduledTask(id).then(function(task) {
|
||||
task.Triggers.push(ScheduledTaskPage.getTriggerToAdd(view)), ApiClient.updateScheduledTaskTriggers(task.Id, task.Triggers).then(function() {
|
||||
$("#popupAddTrigger").addClass("hide"), ScheduledTaskPage.refreshScheduledTask(view)
|
||||
})
|
||||
}), e.preventDefault()
|
||||
ApiClient.getScheduledTask(id).then(function (task) {
|
||||
task.Triggers.push(ScheduledTaskPage.getTriggerToAdd(view));
|
||||
ApiClient.updateScheduledTaskTriggers(task.Id, task.Triggers).then(function () {
|
||||
$("#popupAddTrigger").addClass("hide");
|
||||
ScheduledTaskPage.refreshScheduledTask(view);
|
||||
});
|
||||
});
|
||||
e.preventDefault();
|
||||
}
|
||||
view.querySelector(".addTriggerForm").addEventListener("submit", onSubmit), fillTimeOfDay(view.querySelector("#selectTimeOfDay")), $(view.querySelector("#popupAddTrigger").parentNode).trigger("create"), view.querySelector(".selectTriggerType").addEventListener("change", function() {
|
||||
ScheduledTaskPage.refreshTriggerFields(view, this.value)
|
||||
}), view.querySelector(".btnAddTrigger").addEventListener("click", function() {
|
||||
ScheduledTaskPage.showAddTriggerPopup(view)
|
||||
}), view.addEventListener("click", function(e) {
|
||||
|
||||
view.querySelector(".addTriggerForm").addEventListener("submit", onSubmit);
|
||||
fillTimeOfDay(view.querySelector("#selectTimeOfDay"));
|
||||
$(view.querySelector("#popupAddTrigger").parentNode).trigger("create");
|
||||
view.querySelector(".selectTriggerType").addEventListener("change", function () {
|
||||
ScheduledTaskPage.refreshTriggerFields(view, this.value);
|
||||
});
|
||||
view.querySelector(".btnAddTrigger").addEventListener("click", function () {
|
||||
ScheduledTaskPage.showAddTriggerPopup(view);
|
||||
});
|
||||
view.addEventListener("click", function (e) {
|
||||
var btnDeleteTrigger = dom.parentWithClass(e.target, "btnDeleteTrigger");
|
||||
btnDeleteTrigger && ScheduledTaskPage.confirmDeleteTrigger(view, parseInt(btnDeleteTrigger.getAttribute("data-index")))
|
||||
}), view.addEventListener("viewshow", function() {
|
||||
ScheduledTaskPage.refreshScheduledTask(view)
|
||||
})
|
||||
}
|
||||
});
|
||||
|
||||
if (btnDeleteTrigger) {
|
||||
ScheduledTaskPage.confirmDeleteTrigger(view, parseInt(btnDeleteTrigger.getAttribute("data-index")));
|
||||
}
|
||||
});
|
||||
view.addEventListener("viewshow", function () {
|
||||
ScheduledTaskPage.refreshScheduledTask(view);
|
||||
});
|
||||
};
|
||||
});
|
||||
|
||||
@@ -1,21 +1,36 @@
|
||||
define(["focusManager", "searchFields", "searchResults", "events"], function(focusManager, SearchFields, SearchResults, events) {
|
||||
define(["focusManager", "searchFields", "searchResults", "events"], function (focusManager, SearchFields, SearchResults, events) {
|
||||
"use strict";
|
||||
return function(view, params) {
|
||||
|
||||
return function (view, params) {
|
||||
function onSearch(e, value) {
|
||||
self.searchResults.search(value)
|
||||
self.searchResults.search(value);
|
||||
}
|
||||
|
||||
var self = this;
|
||||
view.addEventListener("viewshow", function() {
|
||||
self.searchFields || (self.searchFields = new SearchFields({
|
||||
element: view.querySelector(".searchFields")
|
||||
}), self.searchResults = new SearchResults({
|
||||
element: view.querySelector(".searchResults"),
|
||||
serverId: params.serverId || ApiClient.serverId(),
|
||||
parentId: params.parentId,
|
||||
collectionType: params.collectionType
|
||||
}), events.on(self.searchFields, "search", onSearch))
|
||||
}), view.addEventListener("viewdestroy", function() {
|
||||
self.searchFields && (self.searchFields.destroy(), self.searchFields = null), self.searchResults && (self.searchResults.destroy(), self.searchResults = null)
|
||||
})
|
||||
}
|
||||
});
|
||||
view.addEventListener("viewshow", function () {
|
||||
if (!self.searchFields) {
|
||||
self.searchFields = new SearchFields({
|
||||
element: view.querySelector(".searchFields")
|
||||
});
|
||||
self.searchResults = new SearchResults({
|
||||
element: view.querySelector(".searchResults"),
|
||||
serverId: params.serverId || ApiClient.serverId(),
|
||||
parentId: params.parentId,
|
||||
collectionType: params.collectionType
|
||||
});
|
||||
events.on(self.searchFields, "search", onSearch);
|
||||
}
|
||||
});
|
||||
view.addEventListener("viewdestroy", function () {
|
||||
if (self.searchFields) {
|
||||
self.searchFields.destroy();
|
||||
self.searchFields = null;
|
||||
}
|
||||
|
||||
if (self.searchResults) {
|
||||
self.searchResults.destroy();
|
||||
self.searchResults = null;
|
||||
}
|
||||
});
|
||||
};
|
||||
});
|
||||
|
||||
@@ -1,50 +1,56 @@
|
||||
define(["loading", "appRouter", "layoutManager", "appSettings", "apphost", "focusManager", "connectionManager", "globalize", "actionsheet", "dom", "material-icons", "flexStyles", "emby-scroller", "emby-itemscontainer", "cardStyle", "emby-button"], function(loading, appRouter, layoutManager, appSettings, appHost, focusManager, connectionManager, globalize, actionSheet, dom) {
|
||||
define(["loading", "appRouter", "layoutManager", "appSettings", "apphost", "focusManager", "connectionManager", "globalize", "actionsheet", "dom", "material-icons", "flexStyles", "emby-scroller", "emby-itemscontainer", "cardStyle", "emby-button"], function (loading, appRouter, layoutManager, appSettings, appHost, focusManager, connectionManager, globalize, actionSheet, dom) {
|
||||
"use strict";
|
||||
|
||||
function renderSelectServerItems(view, servers) {
|
||||
var items = servers.map(function(server) {
|
||||
return {
|
||||
name: server.Name,
|
||||
showIcon: !0,
|
||||
icon: "",
|
||||
cardType: "",
|
||||
id: server.Id,
|
||||
server: server
|
||||
}
|
||||
var items = servers.map(function (server) {
|
||||
return {
|
||||
name: server.Name,
|
||||
showIcon: true,
|
||||
icon: "",
|
||||
cardType: "",
|
||||
id: server.Id,
|
||||
server: server
|
||||
};
|
||||
});
|
||||
var html = items.map(function(item) {
|
||||
var cardImageContainer;
|
||||
if (item.showIcon) {
|
||||
cardImageContainer = '<i class="cardImageIcon md-icon">' + item.icon + "</i>";
|
||||
} else {
|
||||
cardImageContainer = '<div class="cardImage" style="' + item.cardImageStyle + '"></div>';
|
||||
}
|
||||
var cardBoxCssClass = "cardBox";
|
||||
if (layoutManager.tv) {
|
||||
cardBoxCssClass += " cardBox-focustransform";
|
||||
}
|
||||
var innerOpening = '<div class="' + cardBoxCssClass + '">';
|
||||
var cardContainer = '';
|
||||
cardContainer += '<button raised class="card overflowSquareCard loginSquareCard scalableCard overflowSquareCard-scalable" style="display:inline-block;" data-id="' + item.id + '" data-url="' + (item.url || "") + '" data-cardtype="' + item.cardType + '">';
|
||||
cardContainer += innerOpening;
|
||||
cardContainer += '<div class="cardScalable card-focuscontent">';
|
||||
cardContainer += '<div class="cardPadder cardPadder-square">';
|
||||
cardContainer += '</div>';
|
||||
cardContainer += '<div class="cardContent">';
|
||||
cardContainer += '<div class="cardImageContainer coveredImage" style="background:#0288D1;border-radius:.15em;">';
|
||||
cardContainer += cardImageContainer;
|
||||
cardContainer += '</div>';
|
||||
cardContainer += '</div>';
|
||||
cardContainer += '</div>';
|
||||
cardContainer += '<div class="cardFooter">';
|
||||
cardContainer += '<div class="cardText cardTextCentered">' + item.name + '</div>';
|
||||
cardContainer += '</div></div></button>';
|
||||
return cardContainer;
|
||||
var html = items.map(function (item) {
|
||||
var cardImageContainer;
|
||||
|
||||
if (item.showIcon) {
|
||||
cardImageContainer = '<i class="cardImageIcon md-icon">' + item.icon + "</i>";
|
||||
} else {
|
||||
cardImageContainer = '<div class="cardImage" style="' + item.cardImageStyle + '"></div>';
|
||||
}
|
||||
|
||||
var cardBoxCssClass = "cardBox";
|
||||
|
||||
if (layoutManager.tv) {
|
||||
cardBoxCssClass += " cardBox-focustransform";
|
||||
}
|
||||
|
||||
var innerOpening = '<div class="' + cardBoxCssClass + '">';
|
||||
var cardContainer = '';
|
||||
cardContainer += '<button raised class="card overflowSquareCard loginSquareCard scalableCard overflowSquareCard-scalable" style="display:inline-block;" data-id="' + item.id + '" data-url="' + (item.url || "") + '" data-cardtype="' + item.cardType + '">';
|
||||
cardContainer += innerOpening;
|
||||
cardContainer += '<div class="cardScalable card-focuscontent">';
|
||||
cardContainer += '<div class="cardPadder cardPadder-square">';
|
||||
cardContainer += '</div>';
|
||||
cardContainer += '<div class="cardContent">';
|
||||
cardContainer += '<div class="cardImageContainer coveredImage" style="background:#0288D1;border-radius:.15em;">';
|
||||
cardContainer += cardImageContainer;
|
||||
cardContainer += '</div>';
|
||||
cardContainer += '</div>';
|
||||
cardContainer += '</div>';
|
||||
cardContainer += '<div class="cardFooter">';
|
||||
cardContainer += '<div class="cardText cardTextCentered">' + item.name + '</div>';
|
||||
cardContainer += '</div></div></button>';
|
||||
return cardContainer;
|
||||
}).join("");
|
||||
var itemsContainer = view.querySelector(".servers");
|
||||
|
||||
if (!items.length) {
|
||||
html = '<p>' + globalize.translate("MessageNoServersAvailable") + "</p>";
|
||||
}
|
||||
|
||||
itemsContainer.innerHTML = html;
|
||||
loading.hide();
|
||||
}
|
||||
@@ -73,7 +79,7 @@ define(["loading", "appRouter", "layoutManager", "appSettings", "apphost", "focu
|
||||
}
|
||||
|
||||
function alertTextWithOptions(options) {
|
||||
require(["alert"], function(alert) {
|
||||
require(["alert"], function (alert) {
|
||||
alert(options);
|
||||
});
|
||||
}
|
||||
@@ -82,38 +88,42 @@ define(["loading", "appRouter", "layoutManager", "appSettings", "apphost", "focu
|
||||
alertText(globalize.translate("MessageUnableToConnectToServer"), globalize.translate("HeaderConnectionFailure"));
|
||||
}
|
||||
|
||||
return function(view, params) {
|
||||
return function (view, params) {
|
||||
function connectToServer(server) {
|
||||
loading.show();
|
||||
connectionManager.connectToServer(server, {
|
||||
enableAutoLogin: appSettings.enableAutoLogin()
|
||||
}).then(function(result) {
|
||||
}).then(function (result) {
|
||||
loading.hide();
|
||||
var apiClient = result.ApiClient;
|
||||
|
||||
switch (result.State) {
|
||||
case "SignedIn":
|
||||
Dashboard.onServerChanged(apiClient.getCurrentUserId(), apiClient.accessToken(), apiClient);
|
||||
Dashboard.navigate("home.html");
|
||||
break;
|
||||
|
||||
case "ServerSignIn":
|
||||
Dashboard.onServerChanged(null, null, apiClient);
|
||||
Dashboard.navigate("login.html?serverid=" + result.Servers[0].Id);
|
||||
break;
|
||||
|
||||
case "ServerUpdateNeeded":
|
||||
alertTextWithOptions({
|
||||
text: globalize.translate("core#ServerUpdateNeeded", "https://github.com/jellyfin/jellyfin"),
|
||||
html: globalize.translate("core#ServerUpdateNeeded", '<a href="https://github.com/jellyfin/jellyfin">https://github.com/jellyfin/jellyfin</a>')
|
||||
});
|
||||
break;
|
||||
|
||||
default:
|
||||
showServerConnectionFailure();
|
||||
}
|
||||
})
|
||||
});
|
||||
}
|
||||
|
||||
function deleteServer(server) {
|
||||
loading.show();
|
||||
connectionManager.deleteServer(server.Id).then(function() {
|
||||
connectionManager.deleteServer(server.Id).then(function () {
|
||||
loading.hide();
|
||||
loadServers();
|
||||
});
|
||||
@@ -132,20 +142,22 @@ define(["loading", "appRouter", "layoutManager", "appSettings", "apphost", "focu
|
||||
actionSheet.show({
|
||||
items: menuItems,
|
||||
title: server.Name
|
||||
}).then(function(id) {
|
||||
}).then(function (id) {
|
||||
switch (id) {
|
||||
case "connect":
|
||||
connectToServer(server);
|
||||
break;
|
||||
|
||||
case "delete":
|
||||
deleteServer(server);
|
||||
}
|
||||
})
|
||||
});
|
||||
}
|
||||
|
||||
function onServersRetrieved(result) {
|
||||
servers = result;
|
||||
renderSelectServerItems(view, result);
|
||||
|
||||
if (layoutManager.tv) {
|
||||
focusManager.autoFocus(view);
|
||||
}
|
||||
@@ -158,25 +170,29 @@ define(["loading", "appRouter", "layoutManager", "appSettings", "apphost", "focu
|
||||
|
||||
var servers;
|
||||
updatePageStyle(view, params);
|
||||
|
||||
view.addEventListener("viewshow", function(e) {
|
||||
view.addEventListener("viewshow", function (e) {
|
||||
var isRestored = e.detail.isRestored;
|
||||
appRouter.setTitle(null);
|
||||
if (!isRestored) loadServers();
|
||||
|
||||
if (!isRestored) {
|
||||
loadServers();
|
||||
}
|
||||
});
|
||||
view.querySelector(".servers").addEventListener("click", function(e) {
|
||||
view.querySelector(".servers").addEventListener("click", function (e) {
|
||||
var card = dom.parentWithClass(e.target, "card");
|
||||
|
||||
if (card) {
|
||||
var url = card.getAttribute("data-url");
|
||||
|
||||
if (url) {
|
||||
appRouter.show(url);
|
||||
} else {
|
||||
var id = card.getAttribute("data-id");
|
||||
onServerClick(servers.filter(function(s) {
|
||||
onServerClick(servers.filter(function (s) {
|
||||
return s.Id === id;
|
||||
})[0]);
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
});
|
||||
};
|
||||
});
|
||||
|
||||
@@ -1,14 +1,31 @@
|
||||
define(["components/activitylog", "globalize"], function(ActivityLog, globalize) {
|
||||
define(["components/activitylog", "globalize"], function (ActivityLog, globalize) {
|
||||
"use strict";
|
||||
return function(view, params) {
|
||||
|
||||
return function (view, params) {
|
||||
var activityLog;
|
||||
"false" !== params.useractivity ? (view.querySelector(".activityItems").setAttribute("data-useractivity", "true"), view.querySelector(".sectionTitle").innerHTML = globalize.translate("HeaderActivity")) : (view.querySelector(".activityItems").setAttribute("data-useractivity", "false"), view.querySelector(".sectionTitle").innerHTML = globalize.translate("Alerts")), view.addEventListener("viewshow", function() {
|
||||
activityLog || (activityLog = new ActivityLog({
|
||||
serverId: ApiClient.serverId(),
|
||||
element: view.querySelector(".activityItems")
|
||||
}))
|
||||
}), view.addEventListener("viewdestroy", function() {
|
||||
activityLog && activityLog.destroy(), activityLog = null
|
||||
})
|
||||
}
|
||||
});
|
||||
|
||||
if (params.useractivity !== "false") {
|
||||
view.querySelector(".activityItems").setAttribute("data-useractivity", "true");
|
||||
view.querySelector(".sectionTitle").innerHTML = globalize.translate("HeaderActivity");
|
||||
} else {
|
||||
view.querySelector(".activityItems").setAttribute("data-useractivity", "false");
|
||||
view.querySelector(".sectionTitle").innerHTML = globalize.translate("Alerts");
|
||||
}
|
||||
|
||||
view.addEventListener("viewshow", function () {
|
||||
if (!activityLog) {
|
||||
activityLog = new ActivityLog({
|
||||
serverId: ApiClient.serverId(),
|
||||
element: view.querySelector(".activityItems")
|
||||
});
|
||||
}
|
||||
});
|
||||
view.addEventListener("viewdestroy", function () {
|
||||
if (activityLog) {
|
||||
activityLog.destroy();
|
||||
}
|
||||
|
||||
activityLog = null;
|
||||
});
|
||||
};
|
||||
});
|
||||
|
||||
+195
-131
@@ -1,169 +1,233 @@
|
||||
define(["loading", "events", "libraryBrowser", "imageLoader", "listView", "cardBuilder", "emby-itemscontainer"], function(loading, events, libraryBrowser, imageLoader, listView, cardBuilder) {
|
||||
define(["loading", "events", "libraryBrowser", "imageLoader", "listView", "cardBuilder", "emby-itemscontainer"], function (loading, events, libraryBrowser, imageLoader, listView, cardBuilder) {
|
||||
"use strict";
|
||||
return function(view, params, tabContent) {
|
||||
|
||||
return function (view, params, tabContent) {
|
||||
function getPageData(context) {
|
||||
var key = getSavedQueryKey(context),
|
||||
pageData = data[key];
|
||||
return pageData || (pageData = data[key] = {
|
||||
query: {
|
||||
SortBy: "SeriesSortName,SortName",
|
||||
SortOrder: "Ascending",
|
||||
IncludeItemTypes: "Episode",
|
||||
Recursive: !0,
|
||||
Fields: "PrimaryImageAspectRatio,MediaSourceCount,UserData",
|
||||
IsMissing: !1,
|
||||
ImageTypeLimit: 1,
|
||||
EnableImageTypes: "Primary,Backdrop,Thumb",
|
||||
StartIndex: 0,
|
||||
Limit: pageSize
|
||||
},
|
||||
view: libraryBrowser.getSavedView(key) || "Poster"
|
||||
}, pageData.query.ParentId = params.topParentId, libraryBrowser.loadSavedQueryValues(key, pageData.query)), pageData
|
||||
var key = getSavedQueryKey(context);
|
||||
var pageData = data[key];
|
||||
|
||||
if (!pageData) {
|
||||
pageData = data[key] = {
|
||||
query: {
|
||||
SortBy: "SeriesSortName,SortName",
|
||||
SortOrder: "Ascending",
|
||||
IncludeItemTypes: "Episode",
|
||||
Recursive: true,
|
||||
Fields: "PrimaryImageAspectRatio,MediaSourceCount,UserData",
|
||||
IsMissing: false,
|
||||
ImageTypeLimit: 1,
|
||||
EnableImageTypes: "Primary,Backdrop,Thumb",
|
||||
StartIndex: 0,
|
||||
Limit: pageSize
|
||||
},
|
||||
view: libraryBrowser.getSavedView(key) || "Poster"
|
||||
};
|
||||
pageData.query.ParentId = params.topParentId;
|
||||
libraryBrowser.loadSavedQueryValues(key, pageData.query);
|
||||
}
|
||||
|
||||
return pageData;
|
||||
}
|
||||
|
||||
function getQuery(context) {
|
||||
return getPageData(context).query
|
||||
return getPageData(context).query;
|
||||
}
|
||||
|
||||
function getSavedQueryKey(context) {
|
||||
return context.savedQueryKey || (context.savedQueryKey = libraryBrowser.getSavedQueryKey("episodes")), context.savedQueryKey
|
||||
if (!context.savedQueryKey) {
|
||||
context.savedQueryKey = libraryBrowser.getSavedQueryKey("episodes");
|
||||
}
|
||||
|
||||
return context.savedQueryKey;
|
||||
}
|
||||
|
||||
function onViewStyleChange() {
|
||||
var viewStyle = self.getCurrentViewStyle(),
|
||||
itemsContainer = tabContent.querySelector(".itemsContainer");
|
||||
"List" == viewStyle ? (itemsContainer.classList.add("vertical-list"), itemsContainer.classList.remove("vertical-wrap")) : (itemsContainer.classList.remove("vertical-list"), itemsContainer.classList.add("vertical-wrap")), itemsContainer.innerHTML = ""
|
||||
var viewStyle = self.getCurrentViewStyle();
|
||||
var itemsContainer = tabContent.querySelector(".itemsContainer");
|
||||
|
||||
if ("List" == viewStyle) {
|
||||
itemsContainer.classList.add("vertical-list");
|
||||
itemsContainer.classList.remove("vertical-wrap");
|
||||
} else {
|
||||
itemsContainer.classList.remove("vertical-list");
|
||||
itemsContainer.classList.add("vertical-wrap");
|
||||
}
|
||||
|
||||
itemsContainer.innerHTML = "";
|
||||
}
|
||||
|
||||
function reloadItems(page) {
|
||||
loading.show();
|
||||
isLoading = true;
|
||||
var query = getQuery(page);
|
||||
ApiClient.getItems(Dashboard.getCurrentUserId(), query).then(function(result) {
|
||||
ApiClient.getItems(Dashboard.getCurrentUserId(), query).then(function (result) {
|
||||
function onNextPageClick() {
|
||||
if (isLoading) return;
|
||||
if (isLoading) {
|
||||
return;
|
||||
}
|
||||
|
||||
query.StartIndex += query.Limit;
|
||||
reloadItems(tabContent)
|
||||
reloadItems(tabContent);
|
||||
}
|
||||
|
||||
function onPreviousPageClick() {
|
||||
if (isLoading) return;
|
||||
if (isLoading) {
|
||||
return;
|
||||
}
|
||||
|
||||
query.StartIndex -= query.Limit;
|
||||
reloadItems(tabContent)
|
||||
reloadItems(tabContent);
|
||||
}
|
||||
|
||||
window.scrollTo(0, 0);
|
||||
var html, pagingHtml = libraryBrowser.getQueryPagingHtml({
|
||||
startIndex: query.StartIndex,
|
||||
limit: query.Limit,
|
||||
totalRecordCount: result.TotalRecordCount,
|
||||
showLimit: !1,
|
||||
updatePageSizeSetting: !1,
|
||||
addLayoutButton: !1,
|
||||
sortButton: !1,
|
||||
filterButton: !1
|
||||
}),
|
||||
viewStyle = self.getCurrentViewStyle(),
|
||||
itemsContainer = tabContent.querySelector(".itemsContainer");
|
||||
html = "List" == viewStyle ? listView.getListViewHtml({
|
||||
items: result.Items,
|
||||
sortBy: query.SortBy,
|
||||
showParentTitle: !0
|
||||
}) : "PosterCard" == viewStyle ? cardBuilder.getCardsHtml({
|
||||
items: result.Items,
|
||||
shape: "backdrop",
|
||||
showTitle: !0,
|
||||
showParentTitle: !0,
|
||||
scalable: !0,
|
||||
cardLayout: !0
|
||||
}) : cardBuilder.getCardsHtml({
|
||||
items: result.Items,
|
||||
shape: "backdrop",
|
||||
showTitle: !0,
|
||||
showParentTitle: !0,
|
||||
overlayText: !1,
|
||||
centerText: !0,
|
||||
scalable: !0,
|
||||
overlayPlayButton: !0
|
||||
var html;
|
||||
var pagingHtml = libraryBrowser.getQueryPagingHtml({
|
||||
startIndex: query.StartIndex,
|
||||
limit: query.Limit,
|
||||
totalRecordCount: result.TotalRecordCount,
|
||||
showLimit: false,
|
||||
updatePageSizeSetting: false,
|
||||
addLayoutButton: false,
|
||||
sortButton: false,
|
||||
filterButton: false
|
||||
});
|
||||
var i, length, elems;
|
||||
for (elems = tabContent.querySelectorAll(".paging"), i = 0, length = elems.length; i < length; i++)
|
||||
var viewStyle = self.getCurrentViewStyle();
|
||||
var itemsContainer = tabContent.querySelector(".itemsContainer");
|
||||
if (viewStyle == "List") {
|
||||
html = listView.getListViewHtml({
|
||||
items: result.Items,
|
||||
sortBy: query.SortBy,
|
||||
showParentTitle: true
|
||||
});
|
||||
} else if (viewStyle == "PosterCard") {
|
||||
html = cardBuilder.getCardsHtml({
|
||||
items: result.Items,
|
||||
shape: "backdrop",
|
||||
showTitle: true,
|
||||
showParentTitle: true,
|
||||
scalable: true,
|
||||
cardLayout: true
|
||||
});
|
||||
} else {
|
||||
html = cardBuilder.getCardsHtml({
|
||||
items: result.Items,
|
||||
shape: "backdrop",
|
||||
showTitle: true,
|
||||
showParentTitle: true,
|
||||
overlayText: false,
|
||||
centerText: true,
|
||||
scalable: true,
|
||||
overlayPlayButton: true
|
||||
});
|
||||
}
|
||||
var i;
|
||||
var length;
|
||||
var elems;
|
||||
|
||||
elems = tabContent.querySelectorAll(".paging");
|
||||
for (i = 0, length = elems.length; i < length; i++) {
|
||||
elems[i].innerHTML = pagingHtml;
|
||||
for (elems = tabContent.querySelectorAll(".btnNextPage"), i = 0, length = elems.length; i < length; i++)
|
||||
}
|
||||
|
||||
elems = tabContent.querySelectorAll(".btnNextPage");
|
||||
for (i = 0, length = elems.length; i < length; i++) {
|
||||
elems[i].addEventListener("click", onNextPageClick);
|
||||
for (elems = tabContent.querySelectorAll(".btnPreviousPage"), i = 0, length = elems.length; i < length; i++)
|
||||
}
|
||||
|
||||
elems = tabContent.querySelectorAll(".btnPreviousPage");
|
||||
for (i = 0, length = elems.length; i < length; i++) {
|
||||
elems[i].addEventListener("click", onPreviousPageClick);
|
||||
}
|
||||
|
||||
itemsContainer.innerHTML = html;
|
||||
imageLoader.lazyChildren(itemsContainer);
|
||||
libraryBrowser.saveQueryValues(getSavedQueryKey(page), query);
|
||||
loading.hide();
|
||||
isLoading = false;
|
||||
})
|
||||
});
|
||||
}
|
||||
var self = this,
|
||||
pageSize = 100,
|
||||
data = {},
|
||||
isLoading = false;
|
||||
self.showFilterMenu = function() {
|
||||
require(["components/filterdialog/filterdialog"], function(filterDialogFactory) {
|
||||
var filterDialog = new filterDialogFactory({
|
||||
query: getQuery(tabContent),
|
||||
mode: "episodes",
|
||||
serverId: ApiClient.serverId()
|
||||
});
|
||||
events.on(filterDialog, "filterchange", function() {
|
||||
reloadItems(tabContent)
|
||||
}), filterDialog.show()
|
||||
})
|
||||
}, self.getCurrentViewStyle = function() {
|
||||
return getPageData(tabContent).view
|
||||
},
|
||||
function(tabContent) {
|
||||
tabContent.querySelector(".btnFilter").addEventListener("click", function() {
|
||||
self.showFilterMenu()
|
||||
}), tabContent.querySelector(".btnSort").addEventListener("click", function(e) {
|
||||
libraryBrowser.showSortMenu({
|
||||
items: [{
|
||||
name: Globalize.translate("OptionNameSort"),
|
||||
id: "SeriesSortName,SortName"
|
||||
}, {
|
||||
name: Globalize.translate("OptionTvdbRating"),
|
||||
id: "CommunityRating,SeriesSortName,SortName"
|
||||
}, {
|
||||
name: Globalize.translate("OptionDateAdded"),
|
||||
id: "DateCreated,SeriesSortName,SortName"
|
||||
}, {
|
||||
name: Globalize.translate("OptionPremiereDate"),
|
||||
id: "PremiereDate,SeriesSortName,SortName"
|
||||
}, {
|
||||
name: Globalize.translate("OptionDatePlayed"),
|
||||
id: "DatePlayed,SeriesSortName,SortName"
|
||||
}, {
|
||||
name: Globalize.translate("OptionParentalRating"),
|
||||
id: "OfficialRating,SeriesSortName,SortName"
|
||||
}, {
|
||||
name: Globalize.translate("OptionPlayCount"),
|
||||
id: "PlayCount,SeriesSortName,SortName"
|
||||
}, {
|
||||
name: Globalize.translate("OptionRuntime"),
|
||||
id: "Runtime,SeriesSortName,SortName"
|
||||
}],
|
||||
callback: function() {
|
||||
reloadItems(tabContent)
|
||||
},
|
||||
query: getQuery(tabContent),
|
||||
button: e.target
|
||||
})
|
||||
|
||||
var self = this;
|
||||
var pageSize = 100;
|
||||
var data = {};
|
||||
var isLoading = false;
|
||||
|
||||
self.showFilterMenu = function () {
|
||||
require(["components/filterdialog/filterdialog"], function (filterDialogFactory) {
|
||||
var filterDialog = new filterDialogFactory({
|
||||
query: getQuery(tabContent),
|
||||
mode: "episodes",
|
||||
serverId: ApiClient.serverId()
|
||||
});
|
||||
var btnSelectView = tabContent.querySelector(".btnSelectView");
|
||||
btnSelectView.addEventListener("click", function(e) {
|
||||
libraryBrowser.showLayoutMenu(e.target, self.getCurrentViewStyle(), "List,Poster,PosterCard".split(","))
|
||||
}), btnSelectView.addEventListener("layoutchange", function(e) {
|
||||
var viewStyle = e.detail.viewStyle;
|
||||
getPageData(tabContent).view = viewStyle, libraryBrowser.saveViewSetting(getSavedQueryKey(tabContent), viewStyle), onViewStyleChange(), reloadItems(tabContent)
|
||||
})
|
||||
}(tabContent), onViewStyleChange(), self.renderTab = function() {
|
||||
reloadItems(tabContent)
|
||||
}, self.destroy = function() {}
|
||||
}
|
||||
events.on(filterDialog, "filterchange", function () {
|
||||
reloadItems(tabContent);
|
||||
});
|
||||
filterDialog.show();
|
||||
});
|
||||
};
|
||||
|
||||
self.getCurrentViewStyle = function () {
|
||||
return getPageData(tabContent).view;
|
||||
};
|
||||
|
||||
function initPage(tabContent) {
|
||||
tabContent.querySelector(".btnFilter").addEventListener("click", function () {
|
||||
self.showFilterMenu();
|
||||
});
|
||||
tabContent.querySelector(".btnSort").addEventListener("click", function (e) {
|
||||
libraryBrowser.showSortMenu({
|
||||
items: [{
|
||||
name: Globalize.translate("OptionNameSort"),
|
||||
id: "SeriesSortName,SortName"
|
||||
}, {
|
||||
name: Globalize.translate("OptionTvdbRating"),
|
||||
id: "CommunityRating,SeriesSortName,SortName"
|
||||
}, {
|
||||
name: Globalize.translate("OptionDateAdded"),
|
||||
id: "DateCreated,SeriesSortName,SortName"
|
||||
}, {
|
||||
name: Globalize.translate("OptionPremiereDate"),
|
||||
id: "PremiereDate,SeriesSortName,SortName"
|
||||
}, {
|
||||
name: Globalize.translate("OptionDatePlayed"),
|
||||
id: "DatePlayed,SeriesSortName,SortName"
|
||||
}, {
|
||||
name: Globalize.translate("OptionParentalRating"),
|
||||
id: "OfficialRating,SeriesSortName,SortName"
|
||||
}, {
|
||||
name: Globalize.translate("OptionPlayCount"),
|
||||
id: "PlayCount,SeriesSortName,SortName"
|
||||
}, {
|
||||
name: Globalize.translate("OptionRuntime"),
|
||||
id: "Runtime,SeriesSortName,SortName"
|
||||
}],
|
||||
callback: function () {
|
||||
reloadItems(tabContent);
|
||||
},
|
||||
query: getQuery(tabContent),
|
||||
button: e.target
|
||||
});
|
||||
});
|
||||
var btnSelectView = tabContent.querySelector(".btnSelectView");
|
||||
btnSelectView.addEventListener("click", function (e) {
|
||||
libraryBrowser.showLayoutMenu(e.target, self.getCurrentViewStyle(), "List,Poster,PosterCard".split(","));
|
||||
});
|
||||
btnSelectView.addEventListener("layoutchange", function (e) {
|
||||
var viewStyle = e.detail.viewStyle;
|
||||
getPageData(tabContent).view = viewStyle;
|
||||
libraryBrowser.saveViewSetting(getSavedQueryKey(tabContent), viewStyle);
|
||||
onViewStyleChange();
|
||||
reloadItems(tabContent);
|
||||
});
|
||||
}
|
||||
|
||||
initPage(tabContent);
|
||||
onViewStyleChange();
|
||||
|
||||
self.renderTab = function () {
|
||||
reloadItems(tabContent);
|
||||
};
|
||||
|
||||
self.destroy = function () {};
|
||||
};
|
||||
});
|
||||
|
||||
+162
-101
@@ -1,139 +1,200 @@
|
||||
define(["layoutManager", "loading", "libraryBrowser", "cardBuilder", "lazyLoader", "apphost", "globalize", "appRouter", "dom", "emby-button"], function(layoutManager, loading, libraryBrowser, cardBuilder, lazyLoader, appHost, globalize, appRouter, dom) {
|
||||
define(["layoutManager", "loading", "libraryBrowser", "cardBuilder", "lazyLoader", "apphost", "globalize", "appRouter", "dom", "emby-button"], function (layoutManager, loading, libraryBrowser, cardBuilder, lazyLoader, appHost, globalize, appRouter, dom) {
|
||||
"use strict";
|
||||
return function(view, params, tabContent) {
|
||||
|
||||
return function (view, params, tabContent) {
|
||||
function getPageData() {
|
||||
var key = getSavedQueryKey(),
|
||||
pageData = data[key];
|
||||
return pageData || (pageData = data[key] = {
|
||||
query: {
|
||||
SortBy: "SortName",
|
||||
SortOrder: "Ascending",
|
||||
IncludeItemTypes: "Series",
|
||||
Recursive: !0,
|
||||
EnableTotalRecordCount: !1
|
||||
},
|
||||
view: "Poster"
|
||||
}, pageData.query.ParentId = params.topParentId, libraryBrowser.loadSavedQueryValues(key, pageData.query)), pageData
|
||||
var key = getSavedQueryKey();
|
||||
var pageData = data[key];
|
||||
|
||||
if (!pageData) {
|
||||
pageData = data[key] = {
|
||||
query: {
|
||||
SortBy: "SortName",
|
||||
SortOrder: "Ascending",
|
||||
IncludeItemTypes: "Series",
|
||||
Recursive: true,
|
||||
EnableTotalRecordCount: false
|
||||
},
|
||||
view: "Poster"
|
||||
};
|
||||
pageData.query.ParentId = params.topParentId;
|
||||
libraryBrowser.loadSavedQueryValues(key, pageData.query);
|
||||
}
|
||||
|
||||
return pageData;
|
||||
}
|
||||
|
||||
function getQuery() {
|
||||
return getPageData().query
|
||||
return getPageData().query;
|
||||
}
|
||||
|
||||
function getSavedQueryKey() {
|
||||
return libraryBrowser.getSavedQueryKey("seriesgenres")
|
||||
return libraryBrowser.getSavedQueryKey("seriesgenres");
|
||||
}
|
||||
|
||||
function getPromise() {
|
||||
loading.show();
|
||||
var query = getQuery();
|
||||
return ApiClient.getGenres(ApiClient.getCurrentUserId(), query)
|
||||
return ApiClient.getGenres(ApiClient.getCurrentUserId(), query);
|
||||
}
|
||||
|
||||
function enableScrollX() {
|
||||
return !layoutManager.desktop
|
||||
return !layoutManager.desktop;
|
||||
}
|
||||
|
||||
function getThumbShape() {
|
||||
return enableScrollX() ? "overflowBackdrop" : "backdrop"
|
||||
return enableScrollX() ? "overflowBackdrop" : "backdrop";
|
||||
}
|
||||
|
||||
function getPortraitShape() {
|
||||
return enableScrollX() ? "overflowPortrait" : "portrait"
|
||||
return enableScrollX() ? "overflowPortrait" : "portrait";
|
||||
}
|
||||
|
||||
function fillItemsContainer(elem) {
|
||||
var id = elem.getAttribute("data-id"),
|
||||
viewStyle = self.getCurrentViewStyle(),
|
||||
limit = "Thumb" == viewStyle || "ThumbCard" == viewStyle ? 5 : 9;
|
||||
enableScrollX() && (limit = 10);
|
||||
var enableImageTypes = "Thumb" == viewStyle || "ThumbCard" == viewStyle ? "Primary,Backdrop,Thumb" : "Primary",
|
||||
query = {
|
||||
SortBy: "SortName",
|
||||
SortOrder: "Ascending",
|
||||
IncludeItemTypes: "Series",
|
||||
Recursive: !0,
|
||||
Fields: "PrimaryImageAspectRatio,MediaSourceCount,BasicSyncInfo",
|
||||
ImageTypeLimit: 1,
|
||||
EnableImageTypes: enableImageTypes,
|
||||
Limit: limit,
|
||||
GenreIds: id,
|
||||
EnableTotalRecordCount: !1,
|
||||
ParentId: params.topParentId
|
||||
};
|
||||
ApiClient.getItems(ApiClient.getCurrentUserId(), query).then(function(result) {
|
||||
var id = elem.getAttribute("data-id");
|
||||
var viewStyle = self.getCurrentViewStyle();
|
||||
var limit = "Thumb" == viewStyle || "ThumbCard" == viewStyle ? 5 : 9;
|
||||
|
||||
if (enableScrollX()) {
|
||||
limit = 10;
|
||||
}
|
||||
|
||||
var enableImageTypes = "Thumb" == viewStyle || "ThumbCard" == viewStyle ? "Primary,Backdrop,Thumb" : "Primary";
|
||||
var query = {
|
||||
SortBy: "SortName",
|
||||
SortOrder: "Ascending",
|
||||
IncludeItemTypes: "Series",
|
||||
Recursive: true,
|
||||
Fields: "PrimaryImageAspectRatio,MediaSourceCount,BasicSyncInfo",
|
||||
ImageTypeLimit: 1,
|
||||
EnableImageTypes: enableImageTypes,
|
||||
Limit: limit,
|
||||
GenreIds: id,
|
||||
EnableTotalRecordCount: false,
|
||||
ParentId: params.topParentId
|
||||
};
|
||||
ApiClient.getItems(ApiClient.getCurrentUserId(), query).then(function (result) {
|
||||
var supportsImageAnalysis = appHost.supports("imageanalysis");
|
||||
"Thumb" == viewStyle ? cardBuilder.buildCards(result.Items, {
|
||||
itemsContainer: elem,
|
||||
shape: getThumbShape(),
|
||||
preferThumb: !0,
|
||||
showTitle: !0,
|
||||
scalable: !0,
|
||||
centerText: !0,
|
||||
overlayMoreButton: !0,
|
||||
allowBottomPadding: !1
|
||||
}) : "ThumbCard" == viewStyle ? cardBuilder.buildCards(result.Items, {
|
||||
itemsContainer: elem,
|
||||
shape: getThumbShape(),
|
||||
preferThumb: !0,
|
||||
showTitle: !0,
|
||||
scalable: !0,
|
||||
centerText: !1,
|
||||
cardLayout: !0,
|
||||
showYear: !0
|
||||
}) : "PosterCard" == viewStyle ? cardBuilder.buildCards(result.Items, {
|
||||
itemsContainer: elem,
|
||||
shape: getPortraitShape(),
|
||||
showTitle: !0,
|
||||
scalable: !0,
|
||||
centerText: !1,
|
||||
cardLayout: !0,
|
||||
showYear: !0
|
||||
}) : "Poster" == viewStyle && cardBuilder.buildCards(result.Items, {
|
||||
itemsContainer: elem,
|
||||
shape: getPortraitShape(),
|
||||
scalable: !0,
|
||||
overlayMoreButton: !0,
|
||||
allowBottomPadding: !1
|
||||
}), result.Items.length >= query.Limit && tabContent.querySelector(".btnMoreFromGenre" + id + " i").classList.remove("hide")
|
||||
})
|
||||
|
||||
if (viewStyle == "Thumb") {
|
||||
cardBuilder.buildCards(result.Items, {
|
||||
itemsContainer: elem,
|
||||
shape: getThumbShape(),
|
||||
preferThumb: true,
|
||||
showTitle: true,
|
||||
scalable: true,
|
||||
centerText: true,
|
||||
overlayMoreButton: true,
|
||||
allowBottomPadding: false
|
||||
});
|
||||
} else if (viewStyle == "ThumbCard") {
|
||||
cardBuilder.buildCards(result.Items, {
|
||||
itemsContainer: elem,
|
||||
shape: getThumbShape(),
|
||||
preferThumb: true,
|
||||
showTitle: true,
|
||||
scalable: true,
|
||||
centerText: false,
|
||||
cardLayout: true,
|
||||
showYear: true
|
||||
});
|
||||
} else if (viewStyle == "PosterCard") {
|
||||
cardBuilder.buildCards(result.Items, {
|
||||
itemsContainer: elem,
|
||||
shape: getPortraitShape(),
|
||||
showTitle: true,
|
||||
scalable: true,
|
||||
centerText: false,
|
||||
cardLayout: true,
|
||||
showYear: true
|
||||
});
|
||||
} else if (viewStyle == "Poster") {
|
||||
cardBuilder.buildCards(result.Items, {
|
||||
itemsContainer: elem,
|
||||
shape: getPortraitShape(),
|
||||
scalable: true,
|
||||
overlayMoreButton: true,
|
||||
allowBottomPadding: false
|
||||
});
|
||||
}
|
||||
if (result.Items.length >= query.Limit) {
|
||||
tabContent.querySelector(".btnMoreFromGenre" + id + " i").classList.remove("hide");
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function reloadItems(context, promise) {
|
||||
var query = getQuery();
|
||||
promise.then(function(result) {
|
||||
for (var elem = context.querySelector("#items"), html = "", items = result.Items, i = 0, length = items.length; i < length; i++) {
|
||||
promise.then(function (result) {
|
||||
var elem = context.querySelector("#items");
|
||||
var html = "";
|
||||
var items = result.Items;
|
||||
|
||||
for (var i = 0, length = items.length; i < length; i++) {
|
||||
var item = items[i];
|
||||
if (html += '<div class="verticalSection">', html += '<div class="sectionTitleContainer sectionTitleContainer-cards padded-left">', html += '<a is="emby-linkbutton" href="' + appRouter.getRouteUrl(item, {
|
||||
context: "tvshows",
|
||||
parentId: params.topParentId
|
||||
}) + '" class="more button-flat button-flat-mini sectionTitleTextButton btnMoreFromGenre' + item.Id + '">', html += '<h2 class="sectionTitle sectionTitle-cards">', html += item.Name, html += "</h2>", html += '<i class="md-icon hide"></i>', html += "</a>", html += "</div>", enableScrollX()) {
|
||||
html += '<div class="verticalSection">';
|
||||
html += '<div class="sectionTitleContainer sectionTitleContainer-cards padded-left">';
|
||||
html += '<a is="emby-linkbutton" href="' + appRouter.getRouteUrl(item, {
|
||||
context: "tvshows",
|
||||
parentId: params.topParentId
|
||||
}) + '" class="more button-flat button-flat-mini sectionTitleTextButton btnMoreFromGenre' + item.Id + '">';
|
||||
html += '<h2 class="sectionTitle sectionTitle-cards">';
|
||||
html += item.Name;
|
||||
html += "</h2>";
|
||||
html += '<i class="md-icon hide"></i>';
|
||||
html += "</a>";
|
||||
html += "</div>";
|
||||
if (enableScrollX()) {
|
||||
var scrollXClass = "scrollX hiddenScrollX";
|
||||
layoutManager.tv && (scrollXClass += " smoothScrollX"), html += '<div is="emby-itemscontainer" class="itemsContainer ' + scrollXClass + ' lazy padded-left padded-right" data-id="' + item.Id + '">'
|
||||
} else html += '<div is="emby-itemscontainer" class="itemsContainer vertical-wrap lazy padded-left padded-right" data-id="' + item.Id + '">';
|
||||
html += "</div>", html += "</div>"
|
||||
if (layoutManager.tv) {
|
||||
scrollXClass += "smoothScrollX";
|
||||
}
|
||||
html += '<div is="emby-itemscontainer" class="itemsContainer ' + scrollXClass + ' lazy padded-left padded-right" data-id="' + item.Id + '">';
|
||||
} else {
|
||||
html += '<div is="emby-itemscontainer" class="itemsContainer vertical-wrap lazy padded-left padded-right" data-id="' + item.Id + '">';
|
||||
}
|
||||
html += "</div>";
|
||||
html += "</div>";
|
||||
}
|
||||
elem.innerHTML = html, lazyLoader.lazyChildren(elem, fillItemsContainer), libraryBrowser.saveQueryValues(getSavedQueryKey(), query), loading.hide()
|
||||
})
|
||||
|
||||
elem.innerHTML = html;
|
||||
lazyLoader.lazyChildren(elem, fillItemsContainer);
|
||||
libraryBrowser.saveQueryValues(getSavedQueryKey(), query);
|
||||
loading.hide();
|
||||
});
|
||||
}
|
||||
|
||||
function fullyReload() {
|
||||
self.preRender(), self.renderTab()
|
||||
self.preRender();
|
||||
self.renderTab();
|
||||
}
|
||||
var self = this,
|
||||
data = {};
|
||||
self.getViewStyles = function() {
|
||||
return "Poster,PosterCard,Thumb,ThumbCard".split(",")
|
||||
}, self.getCurrentViewStyle = function() {
|
||||
return getPageData(tabContent).view
|
||||
}, self.setCurrentViewStyle = function(viewStyle) {
|
||||
getPageData(tabContent).view = viewStyle, libraryBrowser.saveViewSetting(getSavedQueryKey(tabContent), viewStyle), fullyReload()
|
||||
}, self.enableViewSelection = !0;
|
||||
|
||||
var self = this;
|
||||
var data = {};
|
||||
|
||||
self.getViewStyles = function () {
|
||||
return "Poster,PosterCard,Thumb,ThumbCard".split(",");
|
||||
};
|
||||
|
||||
self.getCurrentViewStyle = function () {
|
||||
return getPageData(tabContent).view;
|
||||
};
|
||||
|
||||
self.setCurrentViewStyle = function (viewStyle) {
|
||||
getPageData(tabContent).view = viewStyle;
|
||||
libraryBrowser.saveViewSetting(getSavedQueryKey(tabContent), viewStyle);
|
||||
fullyReload();
|
||||
};
|
||||
|
||||
self.enableViewSelection = true;
|
||||
var promise;
|
||||
self.preRender = function() {
|
||||
promise = getPromise()
|
||||
}, self.renderTab = function() {
|
||||
reloadItems(tabContent, promise)
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
self.preRender = function () {
|
||||
promise = getPromise();
|
||||
};
|
||||
|
||||
self.renderTab = function () {
|
||||
reloadItems(tabContent, promise);
|
||||
};
|
||||
};
|
||||
});
|
||||
|
||||
@@ -1,52 +1,60 @@
|
||||
define(["loading", "components/groupedcards", "cardBuilder", "apphost", "imageLoader"], function(loading, groupedcards, cardBuilder, appHost, imageLoader) {
|
||||
define(["loading", "components/groupedcards", "cardBuilder", "apphost", "imageLoader"], function (loading, groupedcards, cardBuilder, appHost, imageLoader) {
|
||||
"use strict";
|
||||
|
||||
function getLatestPromise(context, params) {
|
||||
loading.show();
|
||||
var userId = ApiClient.getCurrentUserId(),
|
||||
parentId = params.topParentId,
|
||||
options = {
|
||||
IncludeItemTypes: "Episode",
|
||||
Limit: 30,
|
||||
Fields: "PrimaryImageAspectRatio,BasicSyncInfo",
|
||||
ParentId: parentId,
|
||||
ImageTypeLimit: 1,
|
||||
EnableImageTypes: "Primary,Backdrop,Thumb"
|
||||
};
|
||||
return ApiClient.getJSON(ApiClient.getUrl("Users/" + userId + "/Items/Latest", options))
|
||||
var userId = ApiClient.getCurrentUserId();
|
||||
var parentId = params.topParentId;
|
||||
var options = {
|
||||
IncludeItemTypes: "Episode",
|
||||
Limit: 30,
|
||||
Fields: "PrimaryImageAspectRatio,BasicSyncInfo",
|
||||
ParentId: parentId,
|
||||
ImageTypeLimit: 1,
|
||||
EnableImageTypes: "Primary,Backdrop,Thumb"
|
||||
};
|
||||
return ApiClient.getJSON(ApiClient.getUrl("Users/" + userId + "/Items/Latest", options));
|
||||
}
|
||||
|
||||
function loadLatest(context, params, promise) {
|
||||
promise.then(function(items) {
|
||||
promise.then(function (items) {
|
||||
var html = "";
|
||||
appHost.supports("imageanalysis");
|
||||
html += cardBuilder.getCardsHtml({
|
||||
items: items,
|
||||
shape: "backdrop",
|
||||
preferThumb: !0,
|
||||
showTitle: !0,
|
||||
showSeriesYear: !0,
|
||||
showParentTitle: !0,
|
||||
overlayText: !1,
|
||||
cardLayout: !1,
|
||||
showUnplayedIndicator: !1,
|
||||
showChildCountIndicator: !0,
|
||||
centerText: !0,
|
||||
lazy: !0,
|
||||
overlayPlayButton: !0,
|
||||
preferThumb: true,
|
||||
showTitle: true,
|
||||
showSeriesYear: true,
|
||||
showParentTitle: true,
|
||||
overlayText: false,
|
||||
cardLayout: false,
|
||||
showUnplayedIndicator: false,
|
||||
showChildCountIndicator: true,
|
||||
centerText: true,
|
||||
lazy: true,
|
||||
overlayPlayButton: true,
|
||||
lines: 2
|
||||
});
|
||||
var elem = context.querySelector("#latestEpisodes");
|
||||
elem.innerHTML = html, imageLoader.lazyChildren(elem), loading.hide()
|
||||
})
|
||||
elem.innerHTML = html;
|
||||
imageLoader.lazyChildren(elem);
|
||||
loading.hide();
|
||||
});
|
||||
}
|
||||
return function(view, params, tabContent) {
|
||||
|
||||
return function (view, params, tabContent) {
|
||||
var self = this;
|
||||
var latestPromise;
|
||||
self.preRender = function() {
|
||||
latestPromise = getLatestPromise(view, params)
|
||||
}, self.renderTab = function() {
|
||||
loadLatest(tabContent, params, latestPromise)
|
||||
}, tabContent.querySelector("#latestEpisodes").addEventListener("click", groupedcards.onItemsContainerClick)
|
||||
}
|
||||
});
|
||||
|
||||
self.preRender = function () {
|
||||
latestPromise = getLatestPromise(view, params);
|
||||
};
|
||||
|
||||
self.renderTab = function () {
|
||||
loadLatest(tabContent, params, latestPromise);
|
||||
};
|
||||
|
||||
tabContent.querySelector("#latestEpisodes").addEventListener("click", groupedcards.onItemsContainerClick);
|
||||
};
|
||||
});
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
define(["events", "inputManager", "libraryMenu", "layoutManager", "loading", "dom", "userSettings", "cardBuilder", "playbackManager", "mainTabsManager", "scrollStyles", "emby-itemscontainer", "emby-button"], function(events, inputManager, libraryMenu, layoutManager, loading, dom, userSettings, cardBuilder, playbackManager, mainTabsManager) {
|
||||
define(["events", "inputManager", "libraryMenu", "layoutManager", "loading", "dom", "userSettings", "cardBuilder", "playbackManager", "mainTabsManager", "scrollStyles", "emby-itemscontainer", "emby-button"], function (events, inputManager, libraryMenu, layoutManager, loading, dom, userSettings, cardBuilder, playbackManager, mainTabsManager) {
|
||||
"use strict";
|
||||
|
||||
function getTabs() {
|
||||
@@ -19,30 +19,51 @@ define(["events", "inputManager", "libraryMenu", "layoutManager", "loading", "do
|
||||
}, {
|
||||
name: Globalize.translate("ButtonSearch"),
|
||||
cssClass: "searchTabButton"
|
||||
}]
|
||||
}];
|
||||
}
|
||||
|
||||
function getDefaultTabIndex(folderId) {
|
||||
switch (userSettings.get("landing-" + folderId)) {
|
||||
case "suggestions":
|
||||
return 1;
|
||||
|
||||
case "latest":
|
||||
return 2;
|
||||
|
||||
case "favorites":
|
||||
return 1;
|
||||
|
||||
case "genres":
|
||||
return 4;
|
||||
|
||||
default:
|
||||
return 0
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
function setScrollClasses(elem, scrollX) {
|
||||
scrollX ? (elem.classList.add("hiddenScrollX"), layoutManager.tv && elem.classList.add("smoothScrollX"), elem.classList.add("scrollX"), elem.classList.remove("vertical-wrap")) : (elem.classList.remove("hiddenScrollX"), elem.classList.remove("smoothScrollX"), elem.classList.remove("scrollX"), elem.classList.add("vertical-wrap"))
|
||||
if (scrollX) {
|
||||
elem.classList.add("hiddenScrollX");
|
||||
|
||||
if (layoutManager.tv) {
|
||||
elem.classList.add("smoothScrollX");
|
||||
}
|
||||
|
||||
elem.classList.add("scrollX");
|
||||
elem.classList.remove("vertical-wrap");
|
||||
} else {
|
||||
elem.classList.remove("hiddenScrollX");
|
||||
elem.classList.remove("smoothScrollX");
|
||||
elem.classList.remove("scrollX");
|
||||
elem.classList.add("vertical-wrap");
|
||||
}
|
||||
}
|
||||
return function(view, params) {
|
||||
|
||||
return function (view, params) {
|
||||
function reload() {
|
||||
loading.show(), loadResume(), loadNextUp()
|
||||
loading.show();
|
||||
loadResume();
|
||||
loadNextUp();
|
||||
}
|
||||
|
||||
function loadNextUp() {
|
||||
@@ -52,178 +73,263 @@ define(["events", "inputManager", "libraryMenu", "layoutManager", "loading", "do
|
||||
UserId: ApiClient.getCurrentUserId(),
|
||||
ImageTypeLimit: 1,
|
||||
EnableImageTypes: "Primary,Backdrop,Thumb",
|
||||
EnableTotalRecordCount: !1
|
||||
EnableTotalRecordCount: false
|
||||
};
|
||||
query.ParentId = libraryMenu.getTopParentId(), ApiClient.getNextUpEpisodes(query).then(function(result) {
|
||||
result.Items.length ? view.querySelector(".noNextUpItems").classList.add("hide") : view.querySelector(".noNextUpItems").classList.remove("hide");
|
||||
query.ParentId = libraryMenu.getTopParentId();
|
||||
ApiClient.getNextUpEpisodes(query).then(function (result) {
|
||||
if (result.Items.length) {
|
||||
view.querySelector(".noNextUpItems").classList.add("hide");
|
||||
} else {
|
||||
view.querySelector(".noNextUpItems").classList.remove("hide");
|
||||
}
|
||||
|
||||
var container = view.querySelector("#nextUpItems");
|
||||
cardBuilder.buildCards(result.Items, {
|
||||
itemsContainer: container,
|
||||
preferThumb: !0,
|
||||
preferThumb: true,
|
||||
shape: "backdrop",
|
||||
scalable: !0,
|
||||
showTitle: !0,
|
||||
showParentTitle: !0,
|
||||
overlayText: !1,
|
||||
centerText: !0,
|
||||
overlayPlayButton: !0,
|
||||
cardLayout: !1
|
||||
}), loading.hide()
|
||||
})
|
||||
scalable: true,
|
||||
showTitle: true,
|
||||
showParentTitle: true,
|
||||
overlayText: false,
|
||||
centerText: true,
|
||||
overlayPlayButton: true,
|
||||
cardLayout: false
|
||||
});
|
||||
loading.hide();
|
||||
});
|
||||
}
|
||||
|
||||
function enableScrollX() {
|
||||
return !layoutManager.desktop
|
||||
return !layoutManager.desktop;
|
||||
}
|
||||
|
||||
function getThumbShape() {
|
||||
return enableScrollX() ? "overflowBackdrop" : "backdrop"
|
||||
return enableScrollX() ? "overflowBackdrop" : "backdrop";
|
||||
}
|
||||
|
||||
function loadResume() {
|
||||
var parentId = libraryMenu.getTopParentId(),
|
||||
screenWidth = dom.getWindowSize().innerWidth,
|
||||
limit = screenWidth >= 1600 ? 5 : 6,
|
||||
options = {
|
||||
SortBy: "DatePlayed",
|
||||
SortOrder: "Descending",
|
||||
IncludeItemTypes: "Episode",
|
||||
Filters: "IsResumable",
|
||||
Limit: limit,
|
||||
Recursive: !0,
|
||||
Fields: "PrimaryImageAspectRatio,SeriesInfo,UserData,BasicSyncInfo",
|
||||
ExcludeLocationTypes: "Virtual",
|
||||
ParentId: parentId,
|
||||
ImageTypeLimit: 1,
|
||||
EnableImageTypes: "Primary,Backdrop,Thumb",
|
||||
EnableTotalRecordCount: !1
|
||||
};
|
||||
ApiClient.getItems(ApiClient.getCurrentUserId(), options).then(function(result) {
|
||||
result.Items.length ? view.querySelector("#resumableSection").classList.remove("hide") : view.querySelector("#resumableSection").classList.add("hide");
|
||||
var allowBottomPadding = !enableScrollX(),
|
||||
container = view.querySelector("#resumableItems");
|
||||
var parentId = libraryMenu.getTopParentId();
|
||||
var screenWidth = dom.getWindowSize().innerWidth;
|
||||
var limit = screenWidth >= 1600 ? 5 : 6;
|
||||
var options = {
|
||||
SortBy: "DatePlayed",
|
||||
SortOrder: "Descending",
|
||||
IncludeItemTypes: "Episode",
|
||||
Filters: "IsResumable",
|
||||
Limit: limit,
|
||||
Recursive: true,
|
||||
Fields: "PrimaryImageAspectRatio,SeriesInfo,UserData,BasicSyncInfo",
|
||||
ExcludeLocationTypes: "Virtual",
|
||||
ParentId: parentId,
|
||||
ImageTypeLimit: 1,
|
||||
EnableImageTypes: "Primary,Backdrop,Thumb",
|
||||
EnableTotalRecordCount: false
|
||||
};
|
||||
ApiClient.getItems(ApiClient.getCurrentUserId(), options).then(function (result) {
|
||||
if (result.Items.length) {
|
||||
view.querySelector("#resumableSection").classList.remove("hide");
|
||||
} else {
|
||||
view.querySelector("#resumableSection").classList.add("hide");
|
||||
}
|
||||
|
||||
var allowBottomPadding = !enableScrollX();
|
||||
var container = view.querySelector("#resumableItems");
|
||||
cardBuilder.buildCards(result.Items, {
|
||||
itemsContainer: container,
|
||||
preferThumb: !0,
|
||||
preferThumb: true,
|
||||
shape: getThumbShape(),
|
||||
scalable: !0,
|
||||
showTitle: !0,
|
||||
showParentTitle: !0,
|
||||
overlayText: !1,
|
||||
centerText: !0,
|
||||
overlayPlayButton: !0,
|
||||
scalable: true,
|
||||
showTitle: true,
|
||||
showParentTitle: true,
|
||||
overlayText: false,
|
||||
centerText: true,
|
||||
overlayPlayButton: true,
|
||||
allowBottomPadding: allowBottomPadding,
|
||||
cardLayout: !1
|
||||
})
|
||||
})
|
||||
cardLayout: false
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function onBeforeTabChange(e) {
|
||||
preLoadTab(view, parseInt(e.detail.selectedTabIndex))
|
||||
preLoadTab(view, parseInt(e.detail.selectedTabIndex));
|
||||
}
|
||||
|
||||
function onTabChange(e) {
|
||||
var newIndex = parseInt(e.detail.selectedTabIndex);
|
||||
loadTab(view, newIndex)
|
||||
loadTab(view, newIndex);
|
||||
}
|
||||
|
||||
function getTabContainers() {
|
||||
return view.querySelectorAll(".pageTabContent")
|
||||
return view.querySelectorAll(".pageTabContent");
|
||||
}
|
||||
|
||||
function initTabs() {
|
||||
mainTabsManager.setTabs(view, currentTabIndex, getTabs, getTabContainers, onBeforeTabChange, onTabChange)
|
||||
mainTabsManager.setTabs(view, currentTabIndex, getTabs, getTabContainers, onBeforeTabChange, onTabChange);
|
||||
}
|
||||
|
||||
function getTabController(page, index, callback) {
|
||||
var depends = [];
|
||||
|
||||
switch (index) {
|
||||
case 0:
|
||||
depends.push("controllers/shows/tvshows");
|
||||
break;
|
||||
|
||||
case 1:
|
||||
break;
|
||||
|
||||
case 2:
|
||||
depends.push("controllers/shows/tvlatest");
|
||||
break;
|
||||
|
||||
case 3:
|
||||
depends.push("controllers/shows/tvupcoming");
|
||||
break;
|
||||
|
||||
case 4:
|
||||
depends.push("controllers/shows/tvgenres");
|
||||
break;
|
||||
|
||||
case 5:
|
||||
depends.push("controllers/shows/tvstudios");
|
||||
break;
|
||||
|
||||
case 6:
|
||||
depends.push("controllers/shows/episodes");
|
||||
break;
|
||||
|
||||
case 7:
|
||||
depends.push("scripts/searchtab")
|
||||
depends.push("scripts/searchtab");
|
||||
}
|
||||
require(depends, function(controllerFactory) {
|
||||
|
||||
require(depends, function (controllerFactory) {
|
||||
var tabContent;
|
||||
1 === index && (tabContent = view.querySelector(".pageTabContent[data-index='" + index + "']"), self.tabContent = tabContent);
|
||||
|
||||
if (index === 1) {
|
||||
tabContent = view.querySelector(".pageTabContent[data-index='" + index + "']");
|
||||
self.tabContent = tabContent;
|
||||
}
|
||||
|
||||
var controller = tabControllers[index];
|
||||
controller || (tabContent = view.querySelector(".pageTabContent[data-index='" + index + "']"), controller = 1 === index ? self : 7 === index ? new controllerFactory(view, tabContent, {
|
||||
collectionType: "tvshows",
|
||||
parentId: params.topParentId
|
||||
}) : new controllerFactory(view, params, tabContent), tabControllers[index] = controller, controller.initTab && controller.initTab()), callback(controller)
|
||||
})
|
||||
|
||||
if (!controller) {
|
||||
tabContent = view.querySelector(".pageTabContent[data-index='" + index + "']");
|
||||
|
||||
if (index === 1) {
|
||||
controller = self;
|
||||
} else if (index === 7) {
|
||||
controller = new controllerFactory(view, tabContent, {
|
||||
collectionType: "tvshows",
|
||||
parentId: params.topParentId
|
||||
});
|
||||
} else {
|
||||
controller = new controllerFactory(view, params, tabContent);
|
||||
}
|
||||
|
||||
tabControllers[index] = controller;
|
||||
|
||||
if (controller.initTab) {
|
||||
controller.initTab();
|
||||
}
|
||||
}
|
||||
|
||||
callback(controller);
|
||||
});
|
||||
}
|
||||
|
||||
function preLoadTab(page, index) {
|
||||
getTabController(page, index, function(controller) {
|
||||
-1 == renderedTabs.indexOf(index) && controller.preRender && controller.preRender()
|
||||
})
|
||||
getTabController(page, index, function (controller) {
|
||||
if (renderedTabs.indexOf(index) == -1 && controller.preRender) {
|
||||
controller.preRender();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function loadTab(page, index) {
|
||||
currentTabIndex = index, getTabController(page, index, function(controller) {
|
||||
initialTabIndex = null, -1 == renderedTabs.indexOf(index) && (renderedTabs.push(index), controller.renderTab())
|
||||
})
|
||||
currentTabIndex = index;
|
||||
getTabController(page, index, function (controller) {
|
||||
initialTabIndex = null;
|
||||
|
||||
if (renderedTabs.indexOf(index) == -1) {
|
||||
renderedTabs.push(index);
|
||||
controller.renderTab();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function onPlaybackStop(e, state) {
|
||||
state.NowPlayingItem && "Video" == state.NowPlayingItem.MediaType && (renderedTabs = [], mainTabsManager.getTabsElement().triggerTabChange())
|
||||
if (state.NowPlayingItem && state.NowPlayingItem.MediaType == "Video") {
|
||||
renderedTabs = [];
|
||||
mainTabsManager.getTabsElement().triggerTabChange();
|
||||
}
|
||||
}
|
||||
|
||||
function onWebSocketMessage(e, data) {
|
||||
var msg = data;
|
||||
"UserDataChanged" === msg.MessageType && msg.Data.UserId == ApiClient.getCurrentUserId() && (renderedTabs = [])
|
||||
|
||||
if (msg.MessageType === "UserDataChanged" && msg.Data.UserId == ApiClient.getCurrentUserId()) {
|
||||
renderedTabs = [];
|
||||
}
|
||||
}
|
||||
|
||||
function onInputCommand(e) {
|
||||
switch (e.detail.command) {
|
||||
case "search":
|
||||
e.preventDefault(), Dashboard.navigate("search.html?collectionType=tv&parentId=" + params.topParentId)
|
||||
e.preventDefault();
|
||||
Dashboard.navigate("search.html?collectionType=tv&parentId=" + params.topParentId);
|
||||
}
|
||||
}
|
||||
var isViewRestored, self = this,
|
||||
currentTabIndex = parseInt(params.tab || getDefaultTabIndex(params.topParentId)),
|
||||
initialTabIndex = currentTabIndex;
|
||||
self.initTab = function() {
|
||||
|
||||
var isViewRestored;
|
||||
var self = this;
|
||||
var currentTabIndex = parseInt(params.tab || getDefaultTabIndex(params.topParentId));
|
||||
var initialTabIndex = currentTabIndex;
|
||||
|
||||
self.initTab = function () {
|
||||
var tabContent = self.tabContent;
|
||||
setScrollClasses(tabContent.querySelector("#resumableItems"), enableScrollX());
|
||||
}, self.renderTab = function() {
|
||||
reload()
|
||||
};
|
||||
var tabControllers = [],
|
||||
renderedTabs = [];
|
||||
setScrollClasses(view.querySelector("#resumableItems"), enableScrollX()), view.addEventListener("viewshow", function(e) {
|
||||
if (isViewRestored = e.detail.isRestored, initTabs(), !view.getAttribute("data-title")) {
|
||||
|
||||
self.renderTab = function () {
|
||||
reload();
|
||||
};
|
||||
|
||||
var tabControllers = [];
|
||||
var renderedTabs = [];
|
||||
setScrollClasses(view.querySelector("#resumableItems"), enableScrollX());
|
||||
view.addEventListener("viewshow", function (e) {
|
||||
isViewRestored = e.detail.isRestored;
|
||||
initTabs();
|
||||
if (!view.getAttribute("data-title")) {
|
||||
var parentId = params.topParentId;
|
||||
parentId ? ApiClient.getItem(ApiClient.getCurrentUserId(), parentId).then(function(item) {
|
||||
view.setAttribute("data-title", item.Name), libraryMenu.setTitle(item.Name)
|
||||
}) : (view.setAttribute("data-title", Globalize.translate("TabShows")), libraryMenu.setTitle(Globalize.translate("TabShows")))
|
||||
|
||||
if (parentId) {
|
||||
ApiClient.getItem(ApiClient.getCurrentUserId(), parentId).then(function (item) {
|
||||
view.setAttribute("data-title", item.Name);
|
||||
libraryMenu.setTitle(item.Name);
|
||||
});
|
||||
} else {
|
||||
view.setAttribute("data-title", Globalize.translate("TabShows"));
|
||||
libraryMenu.setTitle(Globalize.translate("TabShows"));
|
||||
}
|
||||
}
|
||||
events.on(playbackManager, "playbackstop", onPlaybackStop), events.on(ApiClient, "message", onWebSocketMessage), inputManager.on(window, onInputCommand)
|
||||
}), view.addEventListener("viewbeforehide", function(e) {
|
||||
inputManager.off(window, onInputCommand), events.off(playbackManager, "playbackstop", onPlaybackStop), events.off(ApiClient, "message", onWebSocketMessage)
|
||||
}), view.addEventListener("viewdestroy", function(e) {
|
||||
tabControllers.forEach(function(t) {
|
||||
t.destroy && t.destroy()
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
events.on(playbackManager, "playbackstop", onPlaybackStop);
|
||||
events.on(ApiClient, "message", onWebSocketMessage);
|
||||
inputManager.on(window, onInputCommand);
|
||||
});
|
||||
view.addEventListener("viewbeforehide", function (e) {
|
||||
inputManager.off(window, onInputCommand);
|
||||
events.off(playbackManager, "playbackstop", onPlaybackStop);
|
||||
events.off(ApiClient, "message", onWebSocketMessage);
|
||||
});
|
||||
view.addEventListener("viewdestroy", function (e) {
|
||||
tabControllers.forEach(function (t) {
|
||||
if (t.destroy) {
|
||||
t.destroy();
|
||||
}
|
||||
});
|
||||
});
|
||||
};
|
||||
});
|
||||
|
||||
+244
-159
@@ -1,199 +1,284 @@
|
||||
define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", "listView", "cardBuilder", "alphaPicker", "emby-itemscontainer"], function(layoutManager, loading, events, libraryBrowser, imageLoader, listView, cardBuilder, alphaPicker) {
|
||||
define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", "listView", "cardBuilder", "alphaPicker", "emby-itemscontainer"], function (layoutManager, loading, events, libraryBrowser, imageLoader, listView, cardBuilder, alphaPicker) {
|
||||
"use strict";
|
||||
return function(view, params, tabContent) {
|
||||
|
||||
return function (view, params, tabContent) {
|
||||
function getPageData(context) {
|
||||
var key = getSavedQueryKey(context),
|
||||
pageData = data[key];
|
||||
return pageData || (pageData = data[key] = {
|
||||
query: {
|
||||
SortBy: "SortName",
|
||||
SortOrder: "Ascending",
|
||||
IncludeItemTypes: "Series",
|
||||
Recursive: !0,
|
||||
Fields: "PrimaryImageAspectRatio,BasicSyncInfo",
|
||||
ImageTypeLimit: 1,
|
||||
EnableImageTypes: "Primary,Backdrop,Banner,Thumb",
|
||||
StartIndex: 0,
|
||||
Limit: pageSize
|
||||
},
|
||||
view: libraryBrowser.getSavedView(key) || "Poster"
|
||||
}, pageData.query.ParentId = params.topParentId, libraryBrowser.loadSavedQueryValues(key, pageData.query)), pageData
|
||||
var key = getSavedQueryKey(context);
|
||||
var pageData = data[key];
|
||||
|
||||
if (!pageData) {
|
||||
pageData = data[key] = {
|
||||
query: {
|
||||
SortBy: "SortName",
|
||||
SortOrder: "Ascending",
|
||||
IncludeItemTypes: "Series",
|
||||
Recursive: true,
|
||||
Fields: "PrimaryImageAspectRatio,BasicSyncInfo",
|
||||
ImageTypeLimit: 1,
|
||||
EnableImageTypes: "Primary,Backdrop,Banner,Thumb",
|
||||
StartIndex: 0,
|
||||
Limit: pageSize
|
||||
},
|
||||
view: libraryBrowser.getSavedView(key) || "Poster"
|
||||
};
|
||||
pageData.query.ParentId = params.topParentId;
|
||||
libraryBrowser.loadSavedQueryValues(key, pageData.query);
|
||||
}
|
||||
|
||||
return pageData;
|
||||
}
|
||||
|
||||
function getQuery(context) {
|
||||
return getPageData(context).query
|
||||
return getPageData(context).query;
|
||||
}
|
||||
|
||||
function getSavedQueryKey(context) {
|
||||
return context.savedQueryKey || (context.savedQueryKey = libraryBrowser.getSavedQueryKey("series")), context.savedQueryKey
|
||||
if (!context.savedQueryKey) {
|
||||
context.savedQueryKey = libraryBrowser.getSavedQueryKey("series");
|
||||
}
|
||||
|
||||
return context.savedQueryKey;
|
||||
}
|
||||
|
||||
function onViewStyleChange() {
|
||||
var viewStyle = self.getCurrentViewStyle(),
|
||||
itemsContainer = tabContent.querySelector(".itemsContainer");
|
||||
"List" == viewStyle ? (itemsContainer.classList.add("vertical-list"), itemsContainer.classList.remove("vertical-wrap")) : (itemsContainer.classList.remove("vertical-list"), itemsContainer.classList.add("vertical-wrap")), itemsContainer.innerHTML = ""
|
||||
var viewStyle = self.getCurrentViewStyle();
|
||||
var itemsContainer = tabContent.querySelector(".itemsContainer");
|
||||
|
||||
if ("List" == viewStyle) {
|
||||
itemsContainer.classList.add("vertical-list");
|
||||
itemsContainer.classList.remove("vertical-wrap");
|
||||
} else {
|
||||
itemsContainer.classList.remove("vertical-list");
|
||||
itemsContainer.classList.add("vertical-wrap");
|
||||
}
|
||||
|
||||
itemsContainer.innerHTML = "";
|
||||
}
|
||||
|
||||
function reloadItems(page) {
|
||||
loading.show();
|
||||
isLoading = true;
|
||||
var query = getQuery(page);
|
||||
ApiClient.getItems(ApiClient.getCurrentUserId(), query).then(function(result) {
|
||||
ApiClient.getItems(ApiClient.getCurrentUserId(), query).then(function (result) {
|
||||
function onNextPageClick() {
|
||||
if (isLoading) return;
|
||||
if (isLoading) {
|
||||
return;
|
||||
}
|
||||
|
||||
query.StartIndex += query.Limit;
|
||||
reloadItems(tabContent);
|
||||
}
|
||||
|
||||
function onPreviousPageClick() {
|
||||
if (isLoading) return;
|
||||
if (isLoading) {
|
||||
return;
|
||||
}
|
||||
|
||||
query.StartIndex -= query.Limit;
|
||||
reloadItems(tabContent);
|
||||
}
|
||||
window.scrollTo(0, 0), updateFilterControls(page);
|
||||
var html, pagingHtml = libraryBrowser.getQueryPagingHtml({
|
||||
startIndex: query.StartIndex,
|
||||
limit: query.Limit,
|
||||
totalRecordCount: result.TotalRecordCount,
|
||||
showLimit: !1,
|
||||
updatePageSizeSetting: !1,
|
||||
addLayoutButton: !1,
|
||||
sortButton: !1,
|
||||
filterButton: !1
|
||||
}),
|
||||
viewStyle = self.getCurrentViewStyle();
|
||||
html = "Thumb" == viewStyle ? cardBuilder.getCardsHtml({
|
||||
items: result.Items,
|
||||
shape: "backdrop",
|
||||
preferThumb: !0,
|
||||
context: "tvshows",
|
||||
overlayMoreButton: !0,
|
||||
showTitle: !0,
|
||||
centerText: !0
|
||||
}) : "ThumbCard" == viewStyle ? cardBuilder.getCardsHtml({
|
||||
items: result.Items,
|
||||
shape: "backdrop",
|
||||
preferThumb: !0,
|
||||
context: "tvshows",
|
||||
cardLayout: !0,
|
||||
showTitle: !0,
|
||||
showYear: !0,
|
||||
centerText: !0
|
||||
}) : "Banner" == viewStyle ? cardBuilder.getCardsHtml({
|
||||
items: result.Items,
|
||||
shape: "banner",
|
||||
preferBanner: !0,
|
||||
context: "tvshows"
|
||||
}) : "List" == viewStyle ? listView.getListViewHtml({
|
||||
items: result.Items,
|
||||
context: "tvshows",
|
||||
sortBy: query.SortBy
|
||||
}) : "PosterCard" == viewStyle ? cardBuilder.getCardsHtml({
|
||||
items: result.Items,
|
||||
shape: "portrait",
|
||||
context: "tvshows",
|
||||
showTitle: !0,
|
||||
showYear: !0,
|
||||
centerText: !0,
|
||||
cardLayout: !0
|
||||
}) : cardBuilder.getCardsHtml({
|
||||
items: result.Items,
|
||||
shape: "portrait",
|
||||
context: "tvshows",
|
||||
centerText: !0,
|
||||
lazy: !0,
|
||||
overlayMoreButton: !0,
|
||||
showTitle: !0,
|
||||
showYear: !0
|
||||
|
||||
window.scrollTo(0, 0);
|
||||
updateFilterControls(page);
|
||||
var html;
|
||||
var pagingHtml = libraryBrowser.getQueryPagingHtml({
|
||||
startIndex: query.StartIndex,
|
||||
limit: query.Limit,
|
||||
totalRecordCount: result.TotalRecordCount,
|
||||
showLimit: false,
|
||||
updatePageSizeSetting: false,
|
||||
addLayoutButton: false,
|
||||
sortButton: false,
|
||||
filterButton: false
|
||||
});
|
||||
var i, length, elems = tabContent.querySelectorAll(".paging");
|
||||
for (i = 0, length = elems.length; i < length; i++) elems[i].innerHTML = pagingHtml;
|
||||
for (elems = tabContent.querySelectorAll(".btnNextPage"), i = 0, length = elems.length; i < length; i++) elems[i].addEventListener("click", onNextPageClick);
|
||||
for (elems = tabContent.querySelectorAll(".btnPreviousPage"), i = 0, length = elems.length; i < length; i++) elems[i].addEventListener("click", onPreviousPageClick);
|
||||
var viewStyle = self.getCurrentViewStyle();
|
||||
if (viewStyle == "Thumb") {
|
||||
html = cardBuilder.getCardsHtml({
|
||||
items: result.Items,
|
||||
shape: "backdrop",
|
||||
preferThumb: true,
|
||||
context: "tvshows",
|
||||
overlayMoreButton: true,
|
||||
showTitle: true,
|
||||
centerText: true
|
||||
});
|
||||
} else if (viewStyle == "ThumbCard") {
|
||||
html = cardBuilder.getCardsHtml({
|
||||
items: result.Items,
|
||||
shape: "backdrop",
|
||||
preferThumb: true,
|
||||
context: "tvshows",
|
||||
cardLayout: true,
|
||||
showTitle: true,
|
||||
showYear: true,
|
||||
centerText: true
|
||||
});
|
||||
} else if (viewStyle == "Banner") {
|
||||
html = cardBuilder.getCardsHtml({
|
||||
items: result.Items,
|
||||
shape: "banner",
|
||||
preferBanner: true,
|
||||
context: "tvshows"
|
||||
});
|
||||
} else if (viewStyle == "List") {
|
||||
html = listView.getListViewHtml({
|
||||
items: result.Items,
|
||||
context: "tvshows",
|
||||
sortBy: query.SortBy
|
||||
});
|
||||
} else if (viewStyle == "PosterCard") {
|
||||
html = cardBuilder.getCardsHtml({
|
||||
items: result.Items,
|
||||
shape: "portrait",
|
||||
context: "tvshows",
|
||||
showTitle: true,
|
||||
showYear: true,
|
||||
centerText: true,
|
||||
cardLayout: true
|
||||
});
|
||||
} else {
|
||||
html = cardBuilder.getCardsHtml({
|
||||
items: result.Items,
|
||||
shape: "portrait",
|
||||
context: "tvshows",
|
||||
centerText: true,
|
||||
lazy: true,
|
||||
overlayMoreButton: true,
|
||||
showTitle: true,
|
||||
showYear: true
|
||||
});
|
||||
}
|
||||
var i;
|
||||
var length;
|
||||
var elems = tabContent.querySelectorAll(".paging");
|
||||
|
||||
for (i = 0, length = elems.length; i < length; i++) {
|
||||
elems[i].innerHTML = pagingHtml;
|
||||
}
|
||||
|
||||
elems = tabContent.querySelectorAll(".btnNextPage");
|
||||
for (i = 0, length = elems.length; i < length; i++) {
|
||||
elems[i].addEventListener("click", onNextPageClick);
|
||||
}
|
||||
|
||||
elems = tabContent.querySelectorAll(".btnPreviousPage");
|
||||
for (i = 0, length = elems.length; i < length; i++) {
|
||||
elems[i].addEventListener("click", onPreviousPageClick);
|
||||
}
|
||||
|
||||
var itemsContainer = tabContent.querySelector(".itemsContainer");
|
||||
itemsContainer.innerHTML = html;
|
||||
imageLoader.lazyChildren(itemsContainer);
|
||||
libraryBrowser.saveQueryValues(getSavedQueryKey(page), query);
|
||||
loading.hide();
|
||||
isLoading = false;
|
||||
})
|
||||
});
|
||||
}
|
||||
|
||||
function updateFilterControls(tabContent) {
|
||||
var query = getQuery(tabContent);
|
||||
self.alphaPicker.value(query.NameStartsWithOrGreater)
|
||||
self.alphaPicker.value(query.NameStartsWithOrGreater);
|
||||
}
|
||||
var self = this,
|
||||
pageSize = 100,
|
||||
data = {},
|
||||
isLoading = false;
|
||||
self.showFilterMenu = function() {
|
||||
require(["components/filterdialog/filterdialog"], function(filterDialogFactory) {
|
||||
var filterDialog = new filterDialogFactory({
|
||||
query: getQuery(tabContent),
|
||||
mode: "series",
|
||||
serverId: ApiClient.serverId()
|
||||
});
|
||||
events.on(filterDialog, "filterchange", function() {
|
||||
getQuery(tabContent).StartIndex = 0, reloadItems(tabContent)
|
||||
}), filterDialog.show()
|
||||
})
|
||||
}, self.getCurrentViewStyle = function() {
|
||||
return getPageData(tabContent).view
|
||||
},
|
||||
function(tabContent) {
|
||||
var alphaPickerElement = tabContent.querySelector(".alphaPicker");
|
||||
if (alphaPickerElement.addEventListener("alphavaluechanged", function(e) {
|
||||
var newValue = e.detail.value,
|
||||
query = getQuery(tabContent);
|
||||
query.NameStartsWithOrGreater = newValue, query.StartIndex = 0, reloadItems(tabContent)
|
||||
}), self.alphaPicker = new alphaPicker({
|
||||
element: alphaPickerElement,
|
||||
valueChangeEvent: "click"
|
||||
}), layoutManager.desktop || layoutManager.mobile) {
|
||||
tabContent.querySelector(".alphaPicker").classList.add("alphabetPicker-right");
|
||||
var itemsContainer = tabContent.querySelector(".itemsContainer");
|
||||
itemsContainer.classList.remove("padded-left-withalphapicker"), itemsContainer.classList.add("padded-right-withalphapicker")
|
||||
}
|
||||
tabContent.querySelector(".btnFilter").addEventListener("click", function() {
|
||||
self.showFilterMenu()
|
||||
}), tabContent.querySelector(".btnSort").addEventListener("click", function(e) {
|
||||
libraryBrowser.showSortMenu({
|
||||
items: [{
|
||||
name: Globalize.translate("OptionNameSort"),
|
||||
id: "SortName"
|
||||
}, {
|
||||
name: Globalize.translate("OptionImdbRating"),
|
||||
id: "CommunityRating,SortName"
|
||||
}, {
|
||||
name: Globalize.translate("OptionDateAdded"),
|
||||
id: "DateCreated,SortName"
|
||||
}, {
|
||||
name: Globalize.translate("OptionDatePlayed"),
|
||||
id: "DatePlayed,SortName"
|
||||
}, {
|
||||
name: Globalize.translate("OptionParentalRating"),
|
||||
id: "OfficialRating,SortName"
|
||||
}, {
|
||||
name: Globalize.translate("OptionReleaseDate"),
|
||||
id: "PremiereDate,SortName"
|
||||
}],
|
||||
callback: function() {
|
||||
getQuery(tabContent).StartIndex = 0, reloadItems(tabContent)
|
||||
},
|
||||
query: getQuery(tabContent),
|
||||
button: e.target
|
||||
})
|
||||
|
||||
var self = this;
|
||||
var pageSize = 100;
|
||||
var data = {};
|
||||
var isLoading = false;
|
||||
|
||||
self.showFilterMenu = function () {
|
||||
require(["components/filterdialog/filterdialog"], function (filterDialogFactory) {
|
||||
var filterDialog = new filterDialogFactory({
|
||||
query: getQuery(tabContent),
|
||||
mode: "series",
|
||||
serverId: ApiClient.serverId()
|
||||
});
|
||||
var btnSelectView = tabContent.querySelector(".btnSelectView");
|
||||
btnSelectView.addEventListener("click", function(e) {
|
||||
libraryBrowser.showLayoutMenu(e.target, self.getCurrentViewStyle(), "Banner,List,Poster,PosterCard,Thumb,ThumbCard".split(","))
|
||||
}), btnSelectView.addEventListener("layoutchange", function(e) {
|
||||
var viewStyle = e.detail.viewStyle;
|
||||
getPageData(tabContent).view = viewStyle, libraryBrowser.saveViewSetting(getSavedQueryKey(tabContent), viewStyle), getQuery(tabContent).StartIndex = 0, onViewStyleChange(), reloadItems(tabContent)
|
||||
})
|
||||
}(tabContent), onViewStyleChange(), self.renderTab = function() {
|
||||
reloadItems(tabContent), updateFilterControls(tabContent)
|
||||
}, self.destroy = function() {}
|
||||
}
|
||||
events.on(filterDialog, "filterchange", function () {
|
||||
getQuery(tabContent).StartIndex = 0;
|
||||
reloadItems(tabContent);
|
||||
});
|
||||
filterDialog.show();
|
||||
});
|
||||
};
|
||||
|
||||
self.getCurrentViewStyle = function () {
|
||||
return getPageData(tabContent).view;
|
||||
};
|
||||
|
||||
function initPage(tabContent) {
|
||||
var alphaPickerElement = tabContent.querySelector(".alphaPicker");
|
||||
|
||||
alphaPickerElement.addEventListener("alphavaluechanged", function (e) {
|
||||
var newValue = e.detail.value;
|
||||
var query = getQuery(tabContent);
|
||||
query.NameStartsWithOrGreater = newValue;
|
||||
query.StartIndex = 0;
|
||||
reloadItems(tabContent);
|
||||
});
|
||||
self.alphaPicker = new alphaPicker({
|
||||
element: alphaPickerElement,
|
||||
valueChangeEvent: "click"
|
||||
});
|
||||
if (layoutManager.desktop || layoutManager.mobile) {
|
||||
tabContent.querySelector(".alphaPicker").classList.add("alphabetPicker-right");
|
||||
var itemsContainer = tabContent.querySelector(".itemsContainer");
|
||||
itemsContainer.classList.remove("padded-left-withalphapicker");
|
||||
itemsContainer.classList.add("padded-right-withalphapicker");
|
||||
}
|
||||
|
||||
tabContent.querySelector(".btnFilter").addEventListener("click", function () {
|
||||
self.showFilterMenu();
|
||||
});
|
||||
tabContent.querySelector(".btnSort").addEventListener("click", function (e) {
|
||||
libraryBrowser.showSortMenu({
|
||||
items: [{
|
||||
name: Globalize.translate("OptionNameSort"),
|
||||
id: "SortName"
|
||||
}, {
|
||||
name: Globalize.translate("OptionImdbRating"),
|
||||
id: "CommunityRating,SortName"
|
||||
}, {
|
||||
name: Globalize.translate("OptionDateAdded"),
|
||||
id: "DateCreated,SortName"
|
||||
}, {
|
||||
name: Globalize.translate("OptionDatePlayed"),
|
||||
id: "DatePlayed,SortName"
|
||||
}, {
|
||||
name: Globalize.translate("OptionParentalRating"),
|
||||
id: "OfficialRating,SortName"
|
||||
}, {
|
||||
name: Globalize.translate("OptionReleaseDate"),
|
||||
id: "PremiereDate,SortName"
|
||||
}],
|
||||
callback: function () {
|
||||
getQuery(tabContent).StartIndex = 0;
|
||||
reloadItems(tabContent);
|
||||
},
|
||||
query: getQuery(tabContent),
|
||||
button: e.target
|
||||
});
|
||||
});
|
||||
var btnSelectView = tabContent.querySelector(".btnSelectView");
|
||||
btnSelectView.addEventListener("click", function (e) {
|
||||
libraryBrowser.showLayoutMenu(e.target, self.getCurrentViewStyle(), "Banner,List,Poster,PosterCard,Thumb,ThumbCard".split(","));
|
||||
});
|
||||
btnSelectView.addEventListener("layoutchange", function (e) {
|
||||
var viewStyle = e.detail.viewStyle;
|
||||
getPageData(tabContent).view = viewStyle;
|
||||
libraryBrowser.saveViewSetting(getSavedQueryKey(tabContent), viewStyle);
|
||||
getQuery(tabContent).StartIndex = 0;
|
||||
onViewStyleChange();
|
||||
reloadItems(tabContent);
|
||||
});
|
||||
}
|
||||
|
||||
initPage(tabContent);
|
||||
onViewStyleChange();
|
||||
|
||||
self.renderTab = function () {
|
||||
reloadItems(tabContent);
|
||||
updateFilterControls(tabContent);
|
||||
};
|
||||
|
||||
self.destroy = function () {};
|
||||
};
|
||||
});
|
||||
|
||||
@@ -1,52 +1,65 @@
|
||||
define(["loading", "libraryBrowser", "cardBuilder", "apphost"], function(loading, libraryBrowser, cardBuilder, appHost) {
|
||||
define(["loading", "libraryBrowser", "cardBuilder", "apphost"], function (loading, libraryBrowser, cardBuilder, appHost) {
|
||||
"use strict";
|
||||
|
||||
function getQuery(params) {
|
||||
var key = getSavedQueryKey(),
|
||||
pageData = data[key];
|
||||
return pageData || (pageData = data[key] = {
|
||||
query: {
|
||||
SortBy: "SortName",
|
||||
SortOrder: "Ascending",
|
||||
IncludeItemTypes: "Series",
|
||||
Recursive: !0,
|
||||
Fields: "DateCreated,PrimaryImageAspectRatio",
|
||||
StartIndex: 0
|
||||
}
|
||||
}, pageData.query.ParentId = params.topParentId), pageData.query
|
||||
var key = getSavedQueryKey();
|
||||
var pageData = data[key];
|
||||
|
||||
if (!pageData) {
|
||||
pageData = data[key] = {
|
||||
query: {
|
||||
SortBy: "SortName",
|
||||
SortOrder: "Ascending",
|
||||
IncludeItemTypes: "Series",
|
||||
Recursive: true,
|
||||
Fields: "DateCreated,PrimaryImageAspectRatio",
|
||||
StartIndex: 0
|
||||
}
|
||||
};
|
||||
pageData.query.ParentId = params.topParentId;
|
||||
}
|
||||
|
||||
return pageData.query;
|
||||
}
|
||||
|
||||
function getSavedQueryKey() {
|
||||
return libraryBrowser.getSavedQueryKey("studios")
|
||||
return libraryBrowser.getSavedQueryKey("studios");
|
||||
}
|
||||
|
||||
function getPromise(context, params) {
|
||||
var query = getQuery(params);
|
||||
return loading.show(), ApiClient.getStudios(ApiClient.getCurrentUserId(), query)
|
||||
loading.show();
|
||||
return ApiClient.getStudios(ApiClient.getCurrentUserId(), query);
|
||||
}
|
||||
|
||||
function reloadItems(context, params, promise) {
|
||||
promise.then(function(result) {
|
||||
promise.then(function (result) {
|
||||
var elem = context.querySelector("#items");
|
||||
cardBuilder.buildCards(result.Items, {
|
||||
itemsContainer: elem,
|
||||
shape: "backdrop",
|
||||
preferThumb: !0,
|
||||
showTitle: !0,
|
||||
scalable: !0,
|
||||
centerText: !0,
|
||||
overlayMoreButton: !0,
|
||||
preferThumb: true,
|
||||
showTitle: true,
|
||||
scalable: true,
|
||||
centerText: true,
|
||||
overlayMoreButton: true,
|
||||
context: "tvshows"
|
||||
}), loading.hide()
|
||||
})
|
||||
});
|
||||
loading.hide();
|
||||
});
|
||||
}
|
||||
|
||||
var data = {};
|
||||
return function(view, params, tabContent) {
|
||||
var promise, self = this;
|
||||
self.preRender = function() {
|
||||
promise = getPromise(view, params)
|
||||
}, self.renderTab = function() {
|
||||
reloadItems(tabContent, params, promise)
|
||||
}
|
||||
}
|
||||
});
|
||||
return function (view, params, tabContent) {
|
||||
var promise;
|
||||
var self = this;
|
||||
|
||||
self.preRender = function () {
|
||||
promise = getPromise(view, params);
|
||||
};
|
||||
|
||||
self.renderTab = function () {
|
||||
reloadItems(tabContent, params, promise);
|
||||
};
|
||||
};
|
||||
});
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
define(["layoutManager", "loading", "datetime", "libraryBrowser", "cardBuilder", "apphost", "imageLoader", "scrollStyles", "emby-itemscontainer"], function(layoutManager, loading, datetime, libraryBrowser, cardBuilder, appHost, imageLoader) {
|
||||
define(["layoutManager", "loading", "datetime", "libraryBrowser", "cardBuilder", "apphost", "imageLoader", "scrollStyles", "emby-itemscontainer"], function (layoutManager, loading, datetime, libraryBrowser, cardBuilder, appHost, imageLoader) {
|
||||
"use strict";
|
||||
|
||||
function getUpcomingPromise(context, params) {
|
||||
@@ -9,82 +9,129 @@ define(["layoutManager", "loading", "datetime", "libraryBrowser", "cardBuilder",
|
||||
UserId: ApiClient.getCurrentUserId(),
|
||||
ImageTypeLimit: 1,
|
||||
EnableImageTypes: "Primary,Backdrop,Banner,Thumb",
|
||||
EnableTotalRecordCount: !1
|
||||
EnableTotalRecordCount: false
|
||||
};
|
||||
return query.ParentId = params.topParentId, ApiClient.getJSON(ApiClient.getUrl("Shows/Upcoming", query))
|
||||
query.ParentId = params.topParentId;
|
||||
return ApiClient.getJSON(ApiClient.getUrl("Shows/Upcoming", query));
|
||||
}
|
||||
|
||||
function loadUpcoming(context, params, promise) {
|
||||
promise.then(function(result) {
|
||||
promise.then(function (result) {
|
||||
var items = result.Items;
|
||||
items.length ? context.querySelector(".noItemsMessage").style.display = "none" : context.querySelector(".noItemsMessage").style.display = "block", renderUpcoming(context.querySelector("#upcomingItems"), items), loading.hide()
|
||||
})
|
||||
|
||||
if (items.length) {
|
||||
context.querySelector(".noItemsMessage").style.display = "none";
|
||||
} else {
|
||||
context.querySelector(".noItemsMessage").style.display = "block";
|
||||
}
|
||||
|
||||
renderUpcoming(context.querySelector("#upcomingItems"), items);
|
||||
loading.hide();
|
||||
});
|
||||
}
|
||||
|
||||
function enableScrollX() {
|
||||
return !layoutManager.desktop
|
||||
return !layoutManager.desktop;
|
||||
}
|
||||
|
||||
function getThumbShape() {
|
||||
return enableScrollX() ? "overflowBackdrop" : "backdrop"
|
||||
return enableScrollX() ? "overflowBackdrop" : "backdrop";
|
||||
}
|
||||
|
||||
function renderUpcoming(elem, items) {
|
||||
var i, length, groups = [],
|
||||
currentGroupName = "",
|
||||
currentGroup = [];
|
||||
var i;
|
||||
var length;
|
||||
var groups = [];
|
||||
var currentGroupName = "";
|
||||
var currentGroup = [];
|
||||
|
||||
for (i = 0, length = items.length; i < length; i++) {
|
||||
var item = items[i],
|
||||
dateText = "";
|
||||
if (item.PremiereDate) try {
|
||||
var premiereDate = datetime.parseISO8601Date(item.PremiereDate, !0);
|
||||
dateText = datetime.isRelativeDay(premiereDate, -1) ? Globalize.translate("Yesterday") : datetime.toLocaleDateString(premiereDate, {
|
||||
weekday: "long",
|
||||
month: "short",
|
||||
day: "numeric"
|
||||
})
|
||||
} catch (err) {}
|
||||
dateText != currentGroupName ? (currentGroup.length && groups.push({
|
||||
name: currentGroupName,
|
||||
items: currentGroup
|
||||
}), currentGroupName = dateText, currentGroup = [item]) : currentGroup.push(item)
|
||||
var item = items[i];
|
||||
var dateText = "";
|
||||
|
||||
if (item.PremiereDate) {
|
||||
try {
|
||||
var premiereDate = datetime.parseISO8601Date(item.PremiereDate, true);
|
||||
dateText = datetime.isRelativeDay(premiereDate, -1) ? Globalize.translate("Yesterday") : datetime.toLocaleDateString(premiereDate, {
|
||||
weekday: "long",
|
||||
month: "short",
|
||||
day: "numeric"
|
||||
});
|
||||
} catch (err) {}
|
||||
}
|
||||
|
||||
if (dateText != currentGroupName) {
|
||||
if (currentGroup.length) {
|
||||
groups.push({
|
||||
name: currentGroupName,
|
||||
items: currentGroup
|
||||
});
|
||||
}
|
||||
|
||||
currentGroupName = dateText;
|
||||
currentGroup = [item];
|
||||
} else {
|
||||
currentGroup.push(item);
|
||||
}
|
||||
}
|
||||
|
||||
var html = "";
|
||||
|
||||
for (i = 0, length = groups.length; i < length; i++) {
|
||||
var group = groups[i];
|
||||
html += '<div class="verticalSection">', html += '<h2 class="sectionTitle sectionTitle-cards padded-left">' + group.name + "</h2>";
|
||||
var allowBottomPadding = !0;
|
||||
html += '<div class="verticalSection">';
|
||||
html += '<h2 class="sectionTitle sectionTitle-cards padded-left">' + group.name + "</h2>";
|
||||
var allowBottomPadding = true;
|
||||
|
||||
if (enableScrollX()) {
|
||||
allowBottomPadding = !1;
|
||||
allowBottomPadding = false;
|
||||
var scrollXClass = "scrollX hiddenScrollX";
|
||||
layoutManager.tv && (scrollXClass += " smoothScrollX"), html += '<div is="emby-itemscontainer" class="itemsContainer ' + scrollXClass + ' padded-left padded-right">'
|
||||
} else html += '<div is="emby-itemscontainer" class="itemsContainer vertical-wrap padded-left padded-right">';
|
||||
|
||||
if (layoutManager.tv) {
|
||||
scrollXClass += " smoothScrollX";
|
||||
}
|
||||
|
||||
html += '<div is="emby-itemscontainer" class="itemsContainer ' + scrollXClass + ' padded-left padded-right">';
|
||||
} else {
|
||||
html += '<div is="emby-itemscontainer" class="itemsContainer vertical-wrap padded-left padded-right">';
|
||||
}
|
||||
|
||||
var supportsImageAnalysis = appHost.supports("imageanalysis");
|
||||
supportsImageAnalysis = !1, html += cardBuilder.getCardsHtml({
|
||||
supportsImageAnalysis = false;
|
||||
html += cardBuilder.getCardsHtml({
|
||||
items: group.items,
|
||||
showLocationTypeIndicator: !1,
|
||||
showLocationTypeIndicator: false,
|
||||
shape: getThumbShape(),
|
||||
showTitle: !0,
|
||||
preferThumb: !0,
|
||||
lazy: !0,
|
||||
showDetailsMenu: !0,
|
||||
showTitle: true,
|
||||
preferThumb: true,
|
||||
lazy: true,
|
||||
showDetailsMenu: true,
|
||||
centerText: !supportsImageAnalysis,
|
||||
showParentTitle: !0,
|
||||
overlayText: !1,
|
||||
showParentTitle: true,
|
||||
overlayText: false,
|
||||
allowBottomPadding: allowBottomPadding,
|
||||
cardLayout: supportsImageAnalysis,
|
||||
overlayMoreButton: !0,
|
||||
missingIndicator: !1
|
||||
}), html += "</div>", html += "</div>"
|
||||
overlayMoreButton: true,
|
||||
missingIndicator: false
|
||||
});
|
||||
html += "</div>";
|
||||
html += "</div>";
|
||||
}
|
||||
elem.innerHTML = html, imageLoader.lazyChildren(elem)
|
||||
|
||||
elem.innerHTML = html;
|
||||
imageLoader.lazyChildren(elem);
|
||||
}
|
||||
return function(view, params, tabContent) {
|
||||
var upcomingPromise, self = this;
|
||||
self.preRender = function() {
|
||||
upcomingPromise = getUpcomingPromise(view, params)
|
||||
}, self.renderTab = function() {
|
||||
loadUpcoming(tabContent, params, upcomingPromise)
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
return function (view, params, tabContent) {
|
||||
var upcomingPromise;
|
||||
var self = this;
|
||||
|
||||
self.preRender = function () {
|
||||
upcomingPromise = getUpcomingPromise(view, params);
|
||||
};
|
||||
|
||||
self.renderTab = function () {
|
||||
loadUpcoming(tabContent, params, upcomingPromise);
|
||||
};
|
||||
};
|
||||
});
|
||||
|
||||
@@ -1,16 +1,19 @@
|
||||
define(["jQuery", "libraryMenu", "loading"], function($, libraryMenu, loading) {
|
||||
define(["jQuery", "libraryMenu", "loading"], function ($, libraryMenu, loading) {
|
||||
"use strict";
|
||||
|
||||
function loadPage(page, config) {
|
||||
$("#txtRemoteClientBitrateLimit", page).val(config.RemoteClientBitrateLimit / 1e6 || ""), loading.hide()
|
||||
$("#txtRemoteClientBitrateLimit", page).val(config.RemoteClientBitrateLimit / 1e6 || "");
|
||||
loading.hide();
|
||||
}
|
||||
|
||||
function onSubmit() {
|
||||
loading.show();
|
||||
var form = this;
|
||||
return ApiClient.getServerConfiguration().then(function(config) {
|
||||
config.RemoteClientBitrateLimit = parseInt(1e6 * parseFloat($("#txtRemoteClientBitrateLimit", form).val() || "0")), ApiClient.updateServerConfiguration(config).then(Dashboard.processServerConfigurationUpdateResult)
|
||||
}), !1
|
||||
ApiClient.getServerConfiguration().then(function (config) {
|
||||
config.RemoteClientBitrateLimit = parseInt(1e6 * parseFloat($("#txtRemoteClientBitrateLimit", form).val() || "0"));
|
||||
ApiClient.updateServerConfiguration(config).then(Dashboard.processServerConfigurationUpdateResult);
|
||||
});
|
||||
return false;
|
||||
}
|
||||
|
||||
function getTabs() {
|
||||
@@ -23,30 +26,35 @@ define(["jQuery", "libraryMenu", "loading"], function($, libraryMenu, loading) {
|
||||
}, {
|
||||
href: "streamingsettings.html",
|
||||
name: Globalize.translate("TabStreaming")
|
||||
}]
|
||||
}];
|
||||
}
|
||||
|
||||
$(document).on("pageinit", "#streamingSettingsPage", function() {
|
||||
$(document).on("pageinit", "#streamingSettingsPage", function () {
|
||||
var page = this;
|
||||
$("#btnSelectTranscodingTempPath", page).on("click.selectDirectory", function() {
|
||||
require(["directorybrowser"], function(directoryBrowser) {
|
||||
var picker = new directoryBrowser;
|
||||
$("#btnSelectTranscodingTempPath", page).on("click.selectDirectory", function () {
|
||||
require(["directorybrowser"], function (directoryBrowser) {
|
||||
var picker = new directoryBrowser();
|
||||
picker.show({
|
||||
callback: function(path) {
|
||||
path && $("#txtTranscodingTempPath", page).val(path), picker.close()
|
||||
callback: function (path) {
|
||||
if (path) {
|
||||
$("#txtTranscodingTempPath", page).val(path);
|
||||
}
|
||||
|
||||
picker.close();
|
||||
},
|
||||
validateWriteable: !0,
|
||||
validateWriteable: true,
|
||||
header: Globalize.translate("HeaderSelectTranscodingPath"),
|
||||
instruction: Globalize.translate("HeaderSelectTranscodingPathHelp")
|
||||
})
|
||||
})
|
||||
}), $(".streamingSettingsForm").off("submit", onSubmit).on("submit", onSubmit)
|
||||
}).on("pageshow", "#streamingSettingsPage", function() {
|
||||
});
|
||||
});
|
||||
});
|
||||
$(".streamingSettingsForm").off("submit", onSubmit).on("submit", onSubmit);
|
||||
}).on("pageshow", "#streamingSettingsPage", function () {
|
||||
loading.show();
|
||||
libraryMenu.setTabs("playback", 2, getTabs);
|
||||
var page = this;
|
||||
ApiClient.getServerConfiguration().then(function(config) {
|
||||
loadPage(page, config)
|
||||
})
|
||||
})
|
||||
});
|
||||
ApiClient.getServerConfiguration().then(function (config) {
|
||||
loadPage(page, config);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
@@ -1,28 +1,49 @@
|
||||
define(["displaySettings", "userSettingsBuilder", "userSettings"], function(DisplaySettings, userSettingsBuilder, currentUserSettings) {
|
||||
define(["displaySettings", "userSettingsBuilder", "userSettings"], function (DisplaySettings, userSettingsBuilder, currentUserSettings) {
|
||||
"use strict";
|
||||
return function(view, params) {
|
||||
|
||||
return function (view, params) {
|
||||
function onBeforeUnload(e) {
|
||||
hasChanges && (e.returnValue = "You currently have unsaved changes. Are you sure you wish to leave?")
|
||||
if (hasChanges) {
|
||||
e.returnValue = "You currently have unsaved changes. Are you sure you wish to leave?";
|
||||
}
|
||||
}
|
||||
var settingsInstance, hasChanges, userId = params.userId || ApiClient.getCurrentUserId(),
|
||||
userSettings = userId === ApiClient.getCurrentUserId() ? currentUserSettings : new userSettingsBuilder;
|
||||
view.addEventListener("viewshow", function() {
|
||||
window.addEventListener("beforeunload", onBeforeUnload), settingsInstance ? settingsInstance.loadData() : settingsInstance = new DisplaySettings({
|
||||
serverId: ApiClient.serverId(),
|
||||
userId: userId,
|
||||
element: view.querySelector(".settingsContainer"),
|
||||
userSettings: userSettings,
|
||||
enableSaveButton: !1,
|
||||
enableSaveConfirmation: !1
|
||||
})
|
||||
}), view.addEventListener("change", function() {
|
||||
hasChanges = !0
|
||||
}), view.addEventListener("viewbeforehide", function() {
|
||||
window.removeEventListener("beforeunload", onBeforeUnload), hasChanges = !1, settingsInstance && settingsInstance.submit()
|
||||
}), view.addEventListener("viewdestroy", function() {
|
||||
settingsInstance && (settingsInstance.destroy(), settingsInstance = null)
|
||||
}), view.addEventListener("viewdestroy", function() {
|
||||
settingsInstance && (settingsInstance.destroy(), settingsInstance = null)
|
||||
})
|
||||
}
|
||||
});
|
||||
|
||||
var settingsInstance;
|
||||
var hasChanges;
|
||||
var userId = params.userId || ApiClient.getCurrentUserId();
|
||||
var userSettings = userId === ApiClient.getCurrentUserId() ? currentUserSettings : new userSettingsBuilder();
|
||||
view.addEventListener("viewshow", function () {
|
||||
window.addEventListener("beforeunload", onBeforeUnload);
|
||||
|
||||
if (settingsInstance) {
|
||||
settingsInstance.loadData();
|
||||
} else {
|
||||
settingsInstance = new DisplaySettings({
|
||||
serverId: ApiClient.serverId(),
|
||||
userId: userId,
|
||||
element: view.querySelector(".settingsContainer"),
|
||||
userSettings: userSettings,
|
||||
enableSaveButton: false,
|
||||
enableSaveConfirmation: false
|
||||
});
|
||||
}
|
||||
});
|
||||
view.addEventListener("change", function () {
|
||||
hasChanges = true;
|
||||
});
|
||||
view.addEventListener("viewbeforehide", function () {
|
||||
window.removeEventListener("beforeunload", onBeforeUnload);
|
||||
hasChanges = false;
|
||||
|
||||
if (settingsInstance) {
|
||||
settingsInstance.submit();
|
||||
}
|
||||
});
|
||||
view.addEventListener("viewdestroy", function () {
|
||||
if (settingsInstance) {
|
||||
settingsInstance.destroy();
|
||||
settingsInstance = null;
|
||||
}
|
||||
});
|
||||
};
|
||||
});
|
||||
|
||||
@@ -1,26 +1,48 @@
|
||||
define(["homescreenSettings", "userSettingsBuilder", "dom", "globalize", "loading", "userSettings", "listViewStyle"], function(HomescreenSettings, userSettingsBuilder, dom, globalize, loading, currentUserSettings) {
|
||||
define(["homescreenSettings", "userSettingsBuilder", "dom", "globalize", "loading", "userSettings", "listViewStyle"], function (HomescreenSettings, userSettingsBuilder, dom, globalize, loading, currentUserSettings) {
|
||||
"use strict";
|
||||
return function(view, params) {
|
||||
|
||||
return function (view, params) {
|
||||
function onBeforeUnload(e) {
|
||||
hasChanges && (e.returnValue = "You currently have unsaved changes. Are you sure you wish to leave?")
|
||||
if (hasChanges) {
|
||||
e.returnValue = "You currently have unsaved changes. Are you sure you wish to leave?";
|
||||
}
|
||||
}
|
||||
var homescreenSettingsInstance, hasChanges, userId = params.userId || ApiClient.getCurrentUserId(),
|
||||
userSettings = userId === ApiClient.getCurrentUserId() ? currentUserSettings : new userSettingsBuilder;
|
||||
view.addEventListener("viewshow", function() {
|
||||
window.addEventListener("beforeunload", onBeforeUnload), homescreenSettingsInstance ? homescreenSettingsInstance.loadData() : homescreenSettingsInstance = new HomescreenSettings({
|
||||
serverId: ApiClient.serverId(),
|
||||
userId: userId,
|
||||
element: view.querySelector(".homeScreenSettingsContainer"),
|
||||
userSettings: userSettings,
|
||||
enableSaveButton: !1,
|
||||
enableSaveConfirmation: !1
|
||||
})
|
||||
}), view.addEventListener("change", function() {
|
||||
hasChanges = !0
|
||||
}), view.addEventListener("viewbeforehide", function() {
|
||||
hasChanges = !1, homescreenSettingsInstance && homescreenSettingsInstance.submit()
|
||||
}), view.addEventListener("viewdestroy", function() {
|
||||
homescreenSettingsInstance && (homescreenSettingsInstance.destroy(), homescreenSettingsInstance = null)
|
||||
})
|
||||
}
|
||||
});
|
||||
|
||||
var homescreenSettingsInstance;
|
||||
var hasChanges;
|
||||
var userId = params.userId || ApiClient.getCurrentUserId();
|
||||
var userSettings = userId === ApiClient.getCurrentUserId() ? currentUserSettings : new userSettingsBuilder();
|
||||
view.addEventListener("viewshow", function () {
|
||||
window.addEventListener("beforeunload", onBeforeUnload);
|
||||
|
||||
if (homescreenSettingsInstance) {
|
||||
homescreenSettingsInstance.loadData();
|
||||
} else {
|
||||
homescreenSettingsInstance = new HomescreenSettings({
|
||||
serverId: ApiClient.serverId(),
|
||||
userId: userId,
|
||||
element: view.querySelector(".homeScreenSettingsContainer"),
|
||||
userSettings: userSettings,
|
||||
enableSaveButton: false,
|
||||
enableSaveConfirmation: false
|
||||
});
|
||||
}
|
||||
});
|
||||
view.addEventListener("change", function () {
|
||||
hasChanges = true;
|
||||
});
|
||||
view.addEventListener("viewbeforehide", function () {
|
||||
hasChanges = false;
|
||||
|
||||
if (homescreenSettingsInstance) {
|
||||
homescreenSettingsInstance.submit();
|
||||
}
|
||||
});
|
||||
view.addEventListener("viewdestroy", function () {
|
||||
if (homescreenSettingsInstance) {
|
||||
homescreenSettingsInstance.destroy();
|
||||
homescreenSettingsInstance = null;
|
||||
}
|
||||
});
|
||||
};
|
||||
});
|
||||
|
||||
@@ -18,7 +18,7 @@ define(["apphost", "connectionManager", "listViewStyle", "emby-button"], functio
|
||||
page.querySelector(".lnkSubtitlePreferences").setAttribute("href", "mypreferencessubtitles.html?userId=" + userId);
|
||||
|
||||
if (appHost.supports("multiserver")) {
|
||||
page.querySelector(".selectServer").classList.remove("hide")
|
||||
page.querySelector(".selectServer").classList.remove("hide");
|
||||
} else {
|
||||
page.querySelector(".selectServer").classList.add("hide");
|
||||
}
|
||||
@@ -35,6 +35,6 @@ define(["apphost", "connectionManager", "listViewStyle", "emby-button"], functio
|
||||
page.querySelector(".adminSection").classList.add("hide");
|
||||
}
|
||||
});
|
||||
})
|
||||
}
|
||||
});
|
||||
};
|
||||
});
|
||||
|
||||
@@ -1,26 +1,48 @@
|
||||
define(["playbackSettings", "userSettingsBuilder", "dom", "globalize", "loading", "userSettings", "listViewStyle"], function(PlaybackSettings, userSettingsBuilder, dom, globalize, loading, currentUserSettings) {
|
||||
define(["playbackSettings", "userSettingsBuilder", "dom", "globalize", "loading", "userSettings", "listViewStyle"], function (PlaybackSettings, userSettingsBuilder, dom, globalize, loading, currentUserSettings) {
|
||||
"use strict";
|
||||
return function(view, params) {
|
||||
|
||||
return function (view, params) {
|
||||
function onBeforeUnload(e) {
|
||||
hasChanges && (e.returnValue = "You currently have unsaved changes. Are you sure you wish to leave?")
|
||||
if (hasChanges) {
|
||||
e.returnValue = "You currently have unsaved changes. Are you sure you wish to leave?";
|
||||
}
|
||||
}
|
||||
var settingsInstance, hasChanges, userId = params.userId || ApiClient.getCurrentUserId(),
|
||||
userSettings = userId === ApiClient.getCurrentUserId() ? currentUserSettings : new userSettingsBuilder;
|
||||
view.addEventListener("viewshow", function() {
|
||||
window.addEventListener("beforeunload", onBeforeUnload), settingsInstance ? settingsInstance.loadData() : settingsInstance = new PlaybackSettings({
|
||||
serverId: ApiClient.serverId(),
|
||||
userId: userId,
|
||||
element: view.querySelector(".settingsContainer"),
|
||||
userSettings: userSettings,
|
||||
enableSaveButton: !1,
|
||||
enableSaveConfirmation: !1
|
||||
})
|
||||
}), view.addEventListener("change", function() {
|
||||
hasChanges = !0
|
||||
}), view.addEventListener("viewbeforehide", function() {
|
||||
hasChanges = !1, settingsInstance && settingsInstance.submit()
|
||||
}), view.addEventListener("viewdestroy", function() {
|
||||
settingsInstance && (settingsInstance.destroy(), settingsInstance = null)
|
||||
})
|
||||
}
|
||||
});
|
||||
|
||||
var settingsInstance;
|
||||
var hasChanges;
|
||||
var userId = params.userId || ApiClient.getCurrentUserId();
|
||||
var userSettings = userId === ApiClient.getCurrentUserId() ? currentUserSettings : new userSettingsBuilder();
|
||||
view.addEventListener("viewshow", function () {
|
||||
window.addEventListener("beforeunload", onBeforeUnload);
|
||||
|
||||
if (settingsInstance) {
|
||||
settingsInstance.loadData();
|
||||
} else {
|
||||
settingsInstance = new PlaybackSettings({
|
||||
serverId: ApiClient.serverId(),
|
||||
userId: userId,
|
||||
element: view.querySelector(".settingsContainer"),
|
||||
userSettings: userSettings,
|
||||
enableSaveButton: false,
|
||||
enableSaveConfirmation: false
|
||||
});
|
||||
}
|
||||
});
|
||||
view.addEventListener("change", function () {
|
||||
hasChanges = true;
|
||||
});
|
||||
view.addEventListener("viewbeforehide", function () {
|
||||
hasChanges = false;
|
||||
|
||||
if (settingsInstance) {
|
||||
settingsInstance.submit();
|
||||
}
|
||||
});
|
||||
view.addEventListener("viewdestroy", function () {
|
||||
if (settingsInstance) {
|
||||
settingsInstance.destroy();
|
||||
settingsInstance = null;
|
||||
}
|
||||
});
|
||||
};
|
||||
});
|
||||
|
||||
@@ -1,26 +1,48 @@
|
||||
define(["subtitleSettings", "userSettingsBuilder", "userSettings"], function(SubtitleSettings, userSettingsBuilder, currentUserSettings) {
|
||||
define(["subtitleSettings", "userSettingsBuilder", "userSettings"], function (SubtitleSettings, userSettingsBuilder, currentUserSettings) {
|
||||
"use strict";
|
||||
return function(view, params) {
|
||||
|
||||
return function (view, params) {
|
||||
function onBeforeUnload(e) {
|
||||
hasChanges && (e.returnValue = "You currently have unsaved changes. Are you sure you wish to leave?")
|
||||
if (hasChanges) {
|
||||
e.returnValue = "You currently have unsaved changes. Are you sure you wish to leave?";
|
||||
}
|
||||
}
|
||||
var subtitleSettingsInstance, hasChanges, userId = params.userId || ApiClient.getCurrentUserId(),
|
||||
userSettings = userId === ApiClient.getCurrentUserId() ? currentUserSettings : new userSettingsBuilder;
|
||||
view.addEventListener("viewshow", function() {
|
||||
window.addEventListener("beforeunload", onBeforeUnload), subtitleSettingsInstance ? subtitleSettingsInstance.loadData() : subtitleSettingsInstance = new SubtitleSettings({
|
||||
serverId: ApiClient.serverId(),
|
||||
userId: userId,
|
||||
element: view.querySelector(".settingsContainer"),
|
||||
userSettings: userSettings,
|
||||
enableSaveButton: !1,
|
||||
enableSaveConfirmation: !1
|
||||
})
|
||||
}), view.addEventListener("change", function() {
|
||||
hasChanges = !0
|
||||
}), view.addEventListener("viewbeforehide", function() {
|
||||
hasChanges = !1, subtitleSettingsInstance && subtitleSettingsInstance.submit()
|
||||
}), view.addEventListener("viewdestroy", function() {
|
||||
subtitleSettingsInstance && (subtitleSettingsInstance.destroy(), subtitleSettingsInstance = null)
|
||||
})
|
||||
}
|
||||
});
|
||||
|
||||
var subtitleSettingsInstance;
|
||||
var hasChanges;
|
||||
var userId = params.userId || ApiClient.getCurrentUserId();
|
||||
var userSettings = userId === ApiClient.getCurrentUserId() ? currentUserSettings : new userSettingsBuilder();
|
||||
view.addEventListener("viewshow", function () {
|
||||
window.addEventListener("beforeunload", onBeforeUnload);
|
||||
|
||||
if (subtitleSettingsInstance) {
|
||||
subtitleSettingsInstance.loadData();
|
||||
} else {
|
||||
subtitleSettingsInstance = new SubtitleSettings({
|
||||
serverId: ApiClient.serverId(),
|
||||
userId: userId,
|
||||
element: view.querySelector(".settingsContainer"),
|
||||
userSettings: userSettings,
|
||||
enableSaveButton: false,
|
||||
enableSaveConfirmation: false
|
||||
});
|
||||
}
|
||||
});
|
||||
view.addEventListener("change", function () {
|
||||
hasChanges = true;
|
||||
});
|
||||
view.addEventListener("viewbeforehide", function () {
|
||||
hasChanges = false;
|
||||
|
||||
if (subtitleSettingsInstance) {
|
||||
subtitleSettingsInstance.submit();
|
||||
}
|
||||
});
|
||||
view.addEventListener("viewdestroy", function () {
|
||||
if (subtitleSettingsInstance) {
|
||||
subtitleSettingsInstance.destroy();
|
||||
subtitleSettingsInstance = null;
|
||||
}
|
||||
});
|
||||
};
|
||||
});
|
||||
|
||||
+97
-51
@@ -1,53 +1,84 @@
|
||||
define(["jQuery", "loading", "libraryMenu", "fnchecked"], function($, loading, libraryMenu) {
|
||||
define(["jQuery", "loading", "libraryMenu", "fnchecked"], function ($, loading, libraryMenu) {
|
||||
"use strict";
|
||||
|
||||
function loadDeleteFolders(page, user, mediaFolders) {
|
||||
ApiClient.getJSON(ApiClient.getUrl("Channels", {
|
||||
SupportsMediaDeletion: !0
|
||||
})).then(function(channelsResult) {
|
||||
var i, length, folder, isChecked, checkedAttribute, html = "";
|
||||
for (i = 0, length = mediaFolders.length; i < length; i++) folder = mediaFolders[i], isChecked = user.Policy.EnableContentDeletion || -1 != user.Policy.EnableContentDeletionFromFolders.indexOf(folder.Id), checkedAttribute = isChecked ? ' checked="checked"' : "", html += '<label><input type="checkbox" is="emby-checkbox" class="chkFolder" data-id="' + folder.Id + '" ' + checkedAttribute + "><span>" + folder.Name + "</span></label>";
|
||||
for (i = 0, length = channelsResult.Items.length; i < length; i++) folder = channelsResult.Items[i], isChecked = user.Policy.EnableContentDeletion || -1 != user.Policy.EnableContentDeletionFromFolders.indexOf(folder.Id), checkedAttribute = isChecked ? ' checked="checked"' : "", html += '<label><input type="checkbox" is="emby-checkbox" class="chkFolder" data-id="' + folder.Id + '" ' + checkedAttribute + "><span>" + folder.Name + "</span></label>";
|
||||
$(".deleteAccess", page).html(html).trigger("create"), $("#chkEnableDeleteAllFolders", page).checked(user.Policy.EnableContentDeletion).trigger("change")
|
||||
})
|
||||
SupportsMediaDeletion: true
|
||||
})).then(function (channelsResult) {
|
||||
var i;
|
||||
var length;
|
||||
var folder;
|
||||
var isChecked;
|
||||
var checkedAttribute;
|
||||
var html = "";
|
||||
|
||||
for (i = 0, length = mediaFolders.length; i < length; i++) {
|
||||
folder = mediaFolders[i];
|
||||
isChecked = user.Policy.EnableContentDeletion || -1 != user.Policy.EnableContentDeletionFromFolders.indexOf(folder.Id);
|
||||
checkedAttribute = isChecked ? ' checked="checked"' : "";
|
||||
html += '<label><input type="checkbox" is="emby-checkbox" class="chkFolder" data-id="' + folder.Id + '" ' + checkedAttribute + "><span>" + folder.Name + "</span></label>";
|
||||
}
|
||||
|
||||
for (i = 0, length = channelsResult.Items.length; i < length; i++) {
|
||||
folder = channelsResult.Items[i];
|
||||
isChecked = user.Policy.EnableContentDeletion || -1 != user.Policy.EnableContentDeletionFromFolders.indexOf(folder.Id);
|
||||
checkedAttribute = isChecked ? ' checked="checked"' : "";
|
||||
html += '<label><input type="checkbox" is="emby-checkbox" class="chkFolder" data-id="' + folder.Id + '" ' + checkedAttribute + "><span>" + folder.Name + "</span></label>";
|
||||
}
|
||||
|
||||
$(".deleteAccess", page).html(html).trigger("create");
|
||||
$("#chkEnableDeleteAllFolders", page).checked(user.Policy.EnableContentDeletion).trigger("change");
|
||||
});
|
||||
}
|
||||
|
||||
function loadAuthProviders(page, user, providers) {
|
||||
providers.length > 1 ? page.querySelector(".fldSelectLoginProvider").classList.remove("hide") : page.querySelector(".fldSelectLoginProvider").classList.add("hide");
|
||||
if (providers.length > 1) {
|
||||
page.querySelector(".fldSelectLoginProvider").classList.remove("hide");
|
||||
} else {
|
||||
page.querySelector(".fldSelectLoginProvider").classList.add("hide");
|
||||
}
|
||||
|
||||
var currentProviderId = user.Policy.AuthenticationProviderId;
|
||||
page.querySelector(".selectLoginProvider").innerHTML = providers.map(function(provider) {
|
||||
page.querySelector(".selectLoginProvider").innerHTML = providers.map(function (provider) {
|
||||
var selected = provider.Id === currentProviderId || providers.length < 2 ? " selected" : "";
|
||||
return '<option value="' + provider.Id + '"' + selected + ">" + provider.Name + "</option>"
|
||||
})
|
||||
return '<option value="' + provider.Id + '"' + selected + ">" + provider.Name + "</option>";
|
||||
});
|
||||
}
|
||||
|
||||
function loadPasswordResetProviders(page, user, providers) {
|
||||
providers.length > 1 ? page.querySelector(".fldSelectPasswordResetProvider").classList.remove("hide") : page.querySelector(".fldSelectPasswordResetProvider").classList.add("hide");
|
||||
if (providers.length > 1) {
|
||||
page.querySelector(".fldSelectPasswordResetProvider").classList.remove("hide");
|
||||
} else {
|
||||
page.querySelector(".fldSelectPasswordResetProvider").classList.add("hide");
|
||||
}
|
||||
|
||||
var currentProviderId = user.Policy.PasswordResetProviderId;
|
||||
page.querySelector(".selectPasswordResetProvider").innerHTML = providers.map(function(provider) {
|
||||
var selected = (provider.Id === currentProviderId || providers.length < 2) ? " selected" : "";
|
||||
return '<option value="' + provider.Id + '"' + selected + ">" + provider.Name + "</option>"
|
||||
})
|
||||
page.querySelector(".selectPasswordResetProvider").innerHTML = providers.map(function (provider) {
|
||||
var selected = provider.Id === currentProviderId || providers.length < 2 ? " selected" : "";
|
||||
return '<option value="' + provider.Id + '"' + selected + ">" + provider.Name + "</option>";
|
||||
});
|
||||
}
|
||||
|
||||
function loadUser(page, user) {
|
||||
currentUser = user;
|
||||
ApiClient.getJSON(ApiClient.getUrl("Auth/Providers")).then(function(providers) {
|
||||
loadAuthProviders(page, user, providers)
|
||||
ApiClient.getJSON(ApiClient.getUrl("Auth/Providers")).then(function (providers) {
|
||||
loadAuthProviders(page, user, providers);
|
||||
});
|
||||
ApiClient.getJSON(ApiClient.getUrl("Auth/PasswordResetProviders")).then(function(providers) {
|
||||
loadPasswordResetProviders(page, user, providers)
|
||||
ApiClient.getJSON(ApiClient.getUrl("Auth/PasswordResetProviders")).then(function (providers) {
|
||||
loadPasswordResetProviders(page, user, providers);
|
||||
});
|
||||
ApiClient.getJSON(ApiClient.getUrl("Library/MediaFolders", {
|
||||
IsHidden: false
|
||||
})).then(function(folders) {
|
||||
loadDeleteFolders(page, user, folders.Items)
|
||||
IsHidden: false
|
||||
})).then(function (folders) {
|
||||
loadDeleteFolders(page, user, folders.Items);
|
||||
});
|
||||
|
||||
if (user.Policy.IsDisabled) {
|
||||
$(".disabledUserBanner", page).show();
|
||||
} else {
|
||||
$(".disabledUserBanner", page).hide();
|
||||
}
|
||||
|
||||
$("#txtUserName", page).prop("disabled", "").removeAttr("disabled");
|
||||
$("#fldConnectInfo", page).show();
|
||||
$(".lnkEditUserPreferences", page).attr("href", "mypreferencesmenu.html?userId=" + user.Id);
|
||||
@@ -78,7 +109,8 @@ define(["jQuery", "loading", "libraryMenu", "fnchecked"], function($, loading, l
|
||||
function onSaveComplete(page, user) {
|
||||
Dashboard.navigate("userprofiles.html");
|
||||
loading.hide();
|
||||
require(["toast"], function(toast) {
|
||||
|
||||
require(["toast"], function (toast) {
|
||||
toast(Globalize.translate("SettingsSaved"));
|
||||
});
|
||||
}
|
||||
@@ -106,45 +138,59 @@ define(["jQuery", "loading", "libraryMenu", "fnchecked"], function($, loading, l
|
||||
user.Policy.AuthenticationProviderId = page.querySelector(".selectLoginProvider").value;
|
||||
user.Policy.PasswordResetProviderId = page.querySelector(".selectPasswordResetProvider").value;
|
||||
user.Policy.EnableContentDeletion = $("#chkEnableDeleteAllFolders", page).checked();
|
||||
user.Policy.EnableContentDeletionFromFolders = user.Policy.EnableContentDeletion ? [] : $(".chkFolder", page).get().filter(function(c) {
|
||||
return c.checked
|
||||
}).map(function(c) {
|
||||
return c.getAttribute("data-id")
|
||||
user.Policy.EnableContentDeletionFromFolders = user.Policy.EnableContentDeletion ? [] : $(".chkFolder", page).get().filter(function (c) {
|
||||
return c.checked;
|
||||
}).map(function (c) {
|
||||
return c.getAttribute("data-id");
|
||||
});
|
||||
ApiClient.updateUser(user).then(function () {
|
||||
ApiClient.updateUserPolicy(user.Id, user.Policy).then(function () {
|
||||
onSaveComplete(page, user);
|
||||
});
|
||||
});
|
||||
ApiClient.updateUser(user).then(function() {
|
||||
ApiClient.updateUserPolicy(user.Id, user.Policy).then(function() {
|
||||
onSaveComplete(page, user)
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
function onSubmit() {
|
||||
var page = $(this).parents(".page")[0];
|
||||
return loading.show(), getUser().then(function(result) {
|
||||
saveUser(result, page)
|
||||
}), !1
|
||||
loading.show();
|
||||
getUser().then(function (result) {
|
||||
saveUser(result, page);
|
||||
});
|
||||
return false;
|
||||
}
|
||||
|
||||
function getUser() {
|
||||
var userId = getParameterByName("userId");
|
||||
return ApiClient.getUser(userId)
|
||||
return ApiClient.getUser(userId);
|
||||
}
|
||||
|
||||
function loadData(page) {
|
||||
loading.show(), getUser().then(function(user) {
|
||||
loadUser(page, user)
|
||||
})
|
||||
loading.show();
|
||||
getUser().then(function (user) {
|
||||
loadUser(page, user);
|
||||
});
|
||||
}
|
||||
|
||||
var currentUser;
|
||||
$(document).on("pageinit", "#editUserPage", function() {
|
||||
$(".editUserProfileForm").off("submit", onSubmit).on("submit", onSubmit), this.querySelector(".sharingHelp").innerHTML = Globalize.translate("OptionAllowLinkSharingHelp", 30);
|
||||
$(document).on("pageinit", "#editUserPage", function () {
|
||||
$(".editUserProfileForm").off("submit", onSubmit).on("submit", onSubmit);
|
||||
this.querySelector(".sharingHelp").innerHTML = Globalize.translate("OptionAllowLinkSharingHelp", 30);
|
||||
var page = this;
|
||||
$("#chkEnableDeleteAllFolders", this).on("change", function() {
|
||||
this.checked ? $(".deleteAccess", page).hide() : $(".deleteAccess", page).show()
|
||||
}), ApiClient.getServerConfiguration().then(function(config) {
|
||||
config.EnableRemoteAccess ? page.querySelector(".fldRemoteAccess").classList.remove("hide") : page.querySelector(".fldRemoteAccess").classList.add("hide")
|
||||
})
|
||||
}).on("pagebeforeshow", "#editUserPage", function() {
|
||||
loadData(this)
|
||||
})
|
||||
$("#chkEnableDeleteAllFolders", this).on("change", function () {
|
||||
if (this.checked) {
|
||||
$(".deleteAccess", page).hide();
|
||||
} else {
|
||||
$(".deleteAccess", page).show();
|
||||
}
|
||||
});
|
||||
ApiClient.getServerConfiguration().then(function (config) {
|
||||
if (config.EnableRemoteAccess) {
|
||||
page.querySelector(".fldRemoteAccess").classList.remove("hide");
|
||||
} else {
|
||||
page.querySelector(".fldRemoteAccess").classList.add("hide");
|
||||
}
|
||||
});
|
||||
}).on("pagebeforeshow", "#editUserPage", function () {
|
||||
loadData(this);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -1,112 +1,178 @@
|
||||
define(["jQuery", "loading", "libraryMenu", "fnchecked"], function($, loading, libraryMenu) {
|
||||
define(["jQuery", "loading", "libraryMenu", "fnchecked"], function ($, loading, libraryMenu) {
|
||||
"use strict";
|
||||
|
||||
function triggerChange(select) {
|
||||
var evt = document.createEvent("HTMLEvents");
|
||||
evt.initEvent("change", !1, !0), select.dispatchEvent(evt)
|
||||
evt.initEvent("change", false, true);
|
||||
select.dispatchEvent(evt);
|
||||
}
|
||||
|
||||
function loadMediaFolders(page, user, mediaFolders) {
|
||||
var html = "";
|
||||
html += '<h3 class="checkboxListLabel">' + Globalize.translate("HeaderLibraries") + "</h3>", html += '<div class="checkboxList paperList checkboxList-paperList">';
|
||||
html += '<h3 class="checkboxListLabel">' + Globalize.translate("HeaderLibraries") + "</h3>";
|
||||
html += '<div class="checkboxList paperList checkboxList-paperList">';
|
||||
|
||||
for (var i = 0, length = mediaFolders.length; i < length; i++) {
|
||||
var folder = mediaFolders[i],
|
||||
isChecked = user.Policy.EnableAllFolders || -1 != user.Policy.EnabledFolders.indexOf(folder.Id),
|
||||
checkedAttribute = isChecked ? ' checked="checked"' : "";
|
||||
html += '<label><input type="checkbox" is="emby-checkbox" class="chkFolder" data-id="' + folder.Id + '" ' + checkedAttribute + "><span>" + folder.Name + "</span></label>"
|
||||
var folder = mediaFolders[i];
|
||||
var isChecked = user.Policy.EnableAllFolders || -1 != user.Policy.EnabledFolders.indexOf(folder.Id);
|
||||
var checkedAttribute = isChecked ? ' checked="checked"' : "";
|
||||
html += '<label><input type="checkbox" is="emby-checkbox" class="chkFolder" data-id="' + folder.Id + '" ' + checkedAttribute + "><span>" + folder.Name + "</span></label>";
|
||||
}
|
||||
html += "</div>", page.querySelector(".folderAccess").innerHTML = html;
|
||||
|
||||
html += "</div>";
|
||||
page.querySelector(".folderAccess").innerHTML = html;
|
||||
var chkEnableAllFolders = page.querySelector("#chkEnableAllFolders");
|
||||
chkEnableAllFolders.checked = user.Policy.EnableAllFolders, triggerChange(chkEnableAllFolders)
|
||||
chkEnableAllFolders.checked = user.Policy.EnableAllFolders;
|
||||
triggerChange(chkEnableAllFolders);
|
||||
}
|
||||
|
||||
function loadChannels(page, user, channels) {
|
||||
var html = "";
|
||||
html += '<h3 class="checkboxListLabel">' + Globalize.translate("HeaderChannels") + "</h3>", html += '<div class="checkboxList paperList checkboxList-paperList">';
|
||||
html += '<h3 class="checkboxListLabel">' + Globalize.translate("HeaderChannels") + "</h3>";
|
||||
html += '<div class="checkboxList paperList checkboxList-paperList">';
|
||||
|
||||
for (var i = 0, length = channels.length; i < length; i++) {
|
||||
var folder = channels[i],
|
||||
isChecked = user.Policy.EnableAllChannels || -1 != user.Policy.EnabledChannels.indexOf(folder.Id),
|
||||
checkedAttribute = isChecked ? ' checked="checked"' : "";
|
||||
html += '<label><input type="checkbox" is="emby-checkbox" class="chkChannel" data-id="' + folder.Id + '" ' + checkedAttribute + "><span>" + folder.Name + "</span></label>"
|
||||
var folder = channels[i];
|
||||
var isChecked = user.Policy.EnableAllChannels || -1 != user.Policy.EnabledChannels.indexOf(folder.Id);
|
||||
var checkedAttribute = isChecked ? ' checked="checked"' : "";
|
||||
html += '<label><input type="checkbox" is="emby-checkbox" class="chkChannel" data-id="' + folder.Id + '" ' + checkedAttribute + "><span>" + folder.Name + "</span></label>";
|
||||
}
|
||||
html += "</div>", $(".channelAccess", page).show().html(html), channels.length ? $(".channelAccessContainer", page).show() : $(".channelAccessContainer", page).hide(), $("#chkEnableAllChannels", page).checked(user.Policy.EnableAllChannels).trigger("change")
|
||||
|
||||
html += "</div>";
|
||||
$(".channelAccess", page).show().html(html);
|
||||
|
||||
if (channels.length) {
|
||||
$(".channelAccessContainer", page).show();
|
||||
} else {
|
||||
$(".channelAccessContainer", page).hide();
|
||||
}
|
||||
|
||||
$("#chkEnableAllChannels", page).checked(user.Policy.EnableAllChannels).trigger("change");
|
||||
}
|
||||
|
||||
function loadDevices(page, user, devices) {
|
||||
var html = "";
|
||||
html += '<h3 class="checkboxListLabel">' + Globalize.translate("HeaderDevices") + "</h3>", html += '<div class="checkboxList paperList checkboxList-paperList">';
|
||||
html += '<h3 class="checkboxListLabel">' + Globalize.translate("HeaderDevices") + "</h3>";
|
||||
html += '<div class="checkboxList paperList checkboxList-paperList">';
|
||||
|
||||
for (var i = 0, length = devices.length; i < length; i++) {
|
||||
var device = devices[i],
|
||||
checkedAttribute = user.Policy.EnableAllDevices || -1 != user.Policy.EnabledDevices.indexOf(device.Id) ? ' checked="checked"' : "";
|
||||
html += '<label><input type="checkbox" is="emby-checkbox" class="chkDevice" data-id="' + device.Id + '" ' + checkedAttribute + "><span>" + device.Name + " - " + device.AppName + "</span></label>"
|
||||
var device = devices[i];
|
||||
var checkedAttribute = user.Policy.EnableAllDevices || -1 != user.Policy.EnabledDevices.indexOf(device.Id) ? ' checked="checked"' : "";
|
||||
html += '<label><input type="checkbox" is="emby-checkbox" class="chkDevice" data-id="' + device.Id + '" ' + checkedAttribute + "><span>" + device.Name + " - " + device.AppName + "</span></label>";
|
||||
}
|
||||
|
||||
html += "</div>";
|
||||
$(".deviceAccess", page).show().html(html);
|
||||
$("#chkEnableAllDevices", page).checked(user.Policy.EnableAllDevices).trigger("change");
|
||||
|
||||
if (user.Policy.IsAdministrator) {
|
||||
page.querySelector(".deviceAccessContainer").classList.add("hide");
|
||||
} else {
|
||||
page.querySelector(".deviceAccessContainer").classList.remove("hide");
|
||||
}
|
||||
html += "</div>", $(".deviceAccess", page).show().html(html), $("#chkEnableAllDevices", page).checked(user.Policy.EnableAllDevices).trigger("change"), user.Policy.IsAdministrator ? page.querySelector(".deviceAccessContainer").classList.add("hide") : page.querySelector(".deviceAccessContainer").classList.remove("hide")
|
||||
}
|
||||
|
||||
function loadUser(page, user, loggedInUser, mediaFolders, channels, devices) {
|
||||
page.querySelector(".username").innerHTML = user.Name, libraryMenu.setTitle(user.Name), loadChannels(page, user, channels), loadMediaFolders(page, user, mediaFolders), loadDevices(page, user, devices), loading.hide()
|
||||
page.querySelector(".username").innerHTML = user.Name;
|
||||
libraryMenu.setTitle(user.Name);
|
||||
loadChannels(page, user, channels);
|
||||
loadMediaFolders(page, user, mediaFolders);
|
||||
loadDevices(page, user, devices);
|
||||
loading.hide();
|
||||
}
|
||||
|
||||
function onSaveComplete(page) {
|
||||
loading.hide(), require(["toast"], function(toast) {
|
||||
toast(Globalize.translate("SettingsSaved"))
|
||||
})
|
||||
loading.hide();
|
||||
|
||||
require(["toast"], function (toast) {
|
||||
toast(Globalize.translate("SettingsSaved"));
|
||||
});
|
||||
}
|
||||
|
||||
function saveUser(user, page) {
|
||||
user.Policy.EnableAllFolders = $("#chkEnableAllFolders", page).checked(), user.Policy.EnabledFolders = user.Policy.EnableAllFolders ? [] : $(".chkFolder", page).get().filter(function(c) {
|
||||
return c.checked
|
||||
}).map(function(c) {
|
||||
return c.getAttribute("data-id")
|
||||
}), user.Policy.EnableAllChannels = $("#chkEnableAllChannels", page).checked(), user.Policy.EnabledChannels = user.Policy.EnableAllChannels ? [] : $(".chkChannel", page).get().filter(function(c) {
|
||||
return c.checked
|
||||
}).map(function(c) {
|
||||
return c.getAttribute("data-id")
|
||||
}), user.Policy.EnableAllDevices = $("#chkEnableAllDevices", page).checked(), user.Policy.EnabledDevices = user.Policy.EnableAllDevices ? [] : $(".chkDevice", page).get().filter(function(c) {
|
||||
return c.checked
|
||||
}).map(function(c) {
|
||||
return c.getAttribute("data-id")
|
||||
}), user.Policy.BlockedChannels = null, user.Policy.BlockedMediaFolders = null, ApiClient.updateUserPolicy(user.Id, user.Policy).then(function() {
|
||||
onSaveComplete(page)
|
||||
})
|
||||
user.Policy.EnableAllFolders = $("#chkEnableAllFolders", page).checked();
|
||||
user.Policy.EnabledFolders = user.Policy.EnableAllFolders ? [] : $(".chkFolder", page).get().filter(function (c) {
|
||||
return c.checked;
|
||||
}).map(function (c) {
|
||||
return c.getAttribute("data-id");
|
||||
});
|
||||
user.Policy.EnableAllChannels = $("#chkEnableAllChannels", page).checked();
|
||||
user.Policy.EnabledChannels = user.Policy.EnableAllChannels ? [] : $(".chkChannel", page).get().filter(function (c) {
|
||||
return c.checked;
|
||||
}).map(function (c) {
|
||||
return c.getAttribute("data-id");
|
||||
});
|
||||
user.Policy.EnableAllDevices = $("#chkEnableAllDevices", page).checked();
|
||||
user.Policy.EnabledDevices = user.Policy.EnableAllDevices ? [] : $(".chkDevice", page).get().filter(function (c) {
|
||||
return c.checked;
|
||||
}).map(function (c) {
|
||||
return c.getAttribute("data-id");
|
||||
});
|
||||
user.Policy.BlockedChannels = null;
|
||||
user.Policy.BlockedMediaFolders = null;
|
||||
ApiClient.updateUserPolicy(user.Id, user.Policy).then(function () {
|
||||
onSaveComplete(page);
|
||||
});
|
||||
}
|
||||
|
||||
function onSubmit() {
|
||||
var page = $(this).parents(".page");
|
||||
loading.show();
|
||||
var userId = getParameterByName("userId");
|
||||
return ApiClient.getUser(userId).then(function(result) {
|
||||
saveUser(result, page)
|
||||
}), !1
|
||||
ApiClient.getUser(userId).then(function (result) {
|
||||
saveUser(result, page);
|
||||
});
|
||||
return false;
|
||||
}
|
||||
$(document).on("pageinit", "#userLibraryAccessPage", function() {
|
||||
|
||||
$(document).on("pageinit", "#userLibraryAccessPage", function () {
|
||||
var page = this;
|
||||
$("#chkEnableAllDevices", page).on("change", function() {
|
||||
this.checked ? $(".deviceAccessListContainer", page).hide() : $(".deviceAccessListContainer", page).show()
|
||||
}), $("#chkEnableAllChannels", page).on("change", function() {
|
||||
this.checked ? $(".channelAccessListContainer", page).hide() : $(".channelAccessListContainer", page).show()
|
||||
}), page.querySelector("#chkEnableAllFolders").addEventListener("change", function() {
|
||||
this.checked ? page.querySelector(".folderAccessListContainer").classList.add("hide") : page.querySelector(".folderAccessListContainer").classList.remove("hide")
|
||||
}), $(".userLibraryAccessForm").off("submit", onSubmit).on("submit", onSubmit)
|
||||
}).on("pageshow", "#userLibraryAccessPage", function() {
|
||||
$("#chkEnableAllDevices", page).on("change", function () {
|
||||
if (this.checked) {
|
||||
$(".deviceAccessListContainer", page).hide();
|
||||
} else {
|
||||
$(".deviceAccessListContainer", page).show();
|
||||
}
|
||||
});
|
||||
$("#chkEnableAllChannels", page).on("change", function () {
|
||||
if (this.checked) {
|
||||
$(".channelAccessListContainer", page).hide();
|
||||
} else {
|
||||
$(".channelAccessListContainer", page).show();
|
||||
}
|
||||
});
|
||||
page.querySelector("#chkEnableAllFolders").addEventListener("change", function () {
|
||||
if (this.checked) {
|
||||
page.querySelector(".folderAccessListContainer").classList.add("hide");
|
||||
} else {
|
||||
page.querySelector(".folderAccessListContainer").classList.remove("hide");
|
||||
}
|
||||
});
|
||||
$(".userLibraryAccessForm").off("submit", onSubmit).on("submit", onSubmit);
|
||||
}).on("pageshow", "#userLibraryAccessPage", function () {
|
||||
var page = this;
|
||||
loading.show();
|
||||
var promise1, userId = getParameterByName("userId");
|
||||
if (userId) promise1 = ApiClient.getUser(userId);
|
||||
else {
|
||||
var promise1;
|
||||
var userId = getParameterByName("userId");
|
||||
|
||||
if (userId) {
|
||||
promise1 = ApiClient.getUser(userId);
|
||||
} else {
|
||||
var deferred = $.Deferred();
|
||||
deferred.resolveWith(null, [{
|
||||
Configuration: {}
|
||||
}]), promise1 = deferred.promise()
|
||||
}]);
|
||||
promise1 = deferred.promise();
|
||||
}
|
||||
var promise2 = Dashboard.getCurrentUser(),
|
||||
promise4 = ApiClient.getJSON(ApiClient.getUrl("Library/MediaFolders", {
|
||||
IsHidden: !1
|
||||
})),
|
||||
promise5 = ApiClient.getJSON(ApiClient.getUrl("Channels")),
|
||||
promise6 = ApiClient.getJSON(ApiClient.getUrl("Devices"));
|
||||
Promise.all([promise1, promise2, promise4, promise5, promise6]).then(function(responses) {
|
||||
loadUser(page, responses[0], responses[1], responses[2].Items, responses[3].Items, responses[4].Items)
|
||||
})
|
||||
})
|
||||
});
|
||||
|
||||
var promise2 = Dashboard.getCurrentUser();
|
||||
var promise4 = ApiClient.getJSON(ApiClient.getUrl("Library/MediaFolders", {
|
||||
IsHidden: false
|
||||
}));
|
||||
var promise5 = ApiClient.getJSON(ApiClient.getUrl("Channels"));
|
||||
var promise6 = ApiClient.getJSON(ApiClient.getUrl("Devices"));
|
||||
Promise.all([promise1, promise2, promise4, promise5, promise6]).then(function (responses) {
|
||||
loadUser(page, responses[0], responses[1], responses[2].Items, responses[3].Items, responses[4].Items);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
+30
-19
@@ -1,14 +1,16 @@
|
||||
define(["jQuery", "loading", "fnchecked", "emby-checkbox"], function($, loading) {
|
||||
define(["jQuery", "loading", "fnchecked", "emby-checkbox"], function ($, loading) {
|
||||
"use strict";
|
||||
|
||||
function loadMediaFolders(page, mediaFolders) {
|
||||
var html = "";
|
||||
html += '<h3 class="checkboxListLabel">' + Globalize.translate("HeaderLibraries") + "</h3>";
|
||||
html += '<div class="checkboxList paperList" style="padding:.5em 1em;">';
|
||||
|
||||
for (var i = 0; i < mediaFolders.length; i++) {
|
||||
var folder = mediaFolders[i];
|
||||
html += '<label><input type="checkbox" is="emby-checkbox" class="chkFolder" data-id="' + folder.Id + '" checked="checked"/><span>' + folder.Name + "</span></label>";
|
||||
}
|
||||
|
||||
html += "</div>";
|
||||
$(".folderAccess", page).html(html).trigger("create");
|
||||
$("#chkEnableAllFolders", page).checked(true).trigger("change");
|
||||
@@ -18,17 +20,21 @@ define(["jQuery", "loading", "fnchecked", "emby-checkbox"], function($, loading)
|
||||
var html = "";
|
||||
html += '<h3 class="checkboxListLabel">' + Globalize.translate("HeaderChannels") + "</h3>";
|
||||
html += '<div class="checkboxList paperList" style="padding:.5em 1em;">';
|
||||
|
||||
for (var i = 0; i < channels.length; i++) {
|
||||
var folder = channels[i];
|
||||
html += '<label><input type="checkbox" is="emby-checkbox" class="chkChannel" data-id="' + folder.Id + '" checked="checked"/><span>' + folder.Name + "</span></label>";
|
||||
}
|
||||
|
||||
html += "</div>";
|
||||
$(".channelAccess", page).show().html(html).trigger("create");
|
||||
|
||||
if (channels.length) {
|
||||
$(".channelAccessContainer", page).show();
|
||||
} else {
|
||||
$(".channelAccessContainer", page).hide();
|
||||
}
|
||||
|
||||
$("#chkEnableAllChannels", page).checked(true).trigger("change");
|
||||
}
|
||||
|
||||
@@ -37,46 +43,51 @@ define(["jQuery", "loading", "fnchecked", "emby-checkbox"], function($, loading)
|
||||
$("#txtPassword", page).val("");
|
||||
loading.show();
|
||||
var promiseFolders = ApiClient.getJSON(ApiClient.getUrl("Library/MediaFolders", {
|
||||
IsHidden: false
|
||||
IsHidden: false
|
||||
}));
|
||||
var promiseChannels = ApiClient.getJSON(ApiClient.getUrl("Channels"));
|
||||
Promise.all([promiseFolders, promiseChannels]).then(function(responses) {
|
||||
Promise.all([promiseFolders, promiseChannels]).then(function (responses) {
|
||||
loadMediaFolders(page, responses[0].Items);
|
||||
loadChannels(page, responses[1].Items);
|
||||
loading.hide();
|
||||
})
|
||||
});
|
||||
}
|
||||
|
||||
function saveUser(page) {
|
||||
var user = {};
|
||||
user.Name = $("#txtUsername", page).val();
|
||||
user.Password = $("#txtPassword", page).val();
|
||||
ApiClient.createUser(user).then(function(user) {
|
||||
ApiClient.createUser(user).then(function (user) {
|
||||
user.Policy.EnableAllFolders = $("#chkEnableAllFolders", page).checked();
|
||||
user.Policy.EnabledFolders = [];
|
||||
|
||||
if (!user.Policy.EnableAllFolders) {
|
||||
user.Policy.EnabledFolders = $(".chkFolder", page).get().filter(function(i) {
|
||||
return i.checked
|
||||
}).map(function(i) {
|
||||
user.Policy.EnabledFolders = $(".chkFolder", page).get().filter(function (i) {
|
||||
return i.checked;
|
||||
}).map(function (i) {
|
||||
return i.getAttribute("data-id");
|
||||
});
|
||||
}
|
||||
|
||||
user.Policy.EnableAllChannels = $("#chkEnableAllChannels", page).checked();
|
||||
user.Policy.EnabledChannels = [];
|
||||
|
||||
if (!user.Policy.EnableAllChannels) {
|
||||
user.Policy.EnabledChannels = $(".chkChannel", page).get().filter(function(i) {
|
||||
return i.checked
|
||||
}).map(function(i) {
|
||||
user.Policy.EnabledChannels = $(".chkChannel", page).get().filter(function (i) {
|
||||
return i.checked;
|
||||
}).map(function (i) {
|
||||
return i.getAttribute("data-id");
|
||||
});
|
||||
}
|
||||
ApiClient.updateUserPolicy(user.Id, user.Policy).then(function() {
|
||||
|
||||
ApiClient.updateUserPolicy(user.Id, user.Policy).then(function () {
|
||||
Dashboard.navigate("useredit.html?userId=" + user.Id);
|
||||
});
|
||||
}, function(response) {
|
||||
require(["toast"], function(toast) {
|
||||
}, function (response) {
|
||||
require(["toast"], function (toast) {
|
||||
toast(Globalize.translate("DefaultErrorMessage"));
|
||||
});
|
||||
|
||||
loading.hide();
|
||||
});
|
||||
}
|
||||
@@ -92,16 +103,16 @@ define(["jQuery", "loading", "fnchecked", "emby-checkbox"], function($, loading)
|
||||
loadUser(page);
|
||||
}
|
||||
|
||||
$(document).on("pageinit", "#newUserPage", function() {
|
||||
$(document).on("pageinit", "#newUserPage", function () {
|
||||
var page = this;
|
||||
$("#chkEnableAllChannels", page).on("change", function() {
|
||||
$("#chkEnableAllChannels", page).on("change", function () {
|
||||
if (this.checked) {
|
||||
$(".channelAccessListContainer", page).hide();
|
||||
} else {
|
||||
$(".channelAccessListContainer", page).show();
|
||||
}
|
||||
});
|
||||
$("#chkEnableAllFolders", page).on("change", function() {
|
||||
$("#chkEnableAllFolders", page).on("change", function () {
|
||||
if (this.checked) {
|
||||
$(".folderAccessListContainer", page).hide();
|
||||
} else {
|
||||
@@ -109,7 +120,7 @@ define(["jQuery", "loading", "fnchecked", "emby-checkbox"], function($, loading)
|
||||
}
|
||||
});
|
||||
$(".newUserProfileForm").off("submit", onSubmit).on("submit", onSubmit);
|
||||
}).on("pageshow", "#newUserPage", function() {
|
||||
}).on("pageshow", "#newUserPage", function () {
|
||||
loadData(this);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
@@ -1,185 +1,271 @@
|
||||
define(["jQuery", "datetime", "loading", "libraryMenu", "listViewStyle", "paper-icon-button-light"], function($, datetime, loading, libraryMenu) {
|
||||
define(["jQuery", "datetime", "loading", "libraryMenu", "listViewStyle", "paper-icon-button-light"], function ($, datetime, loading, libraryMenu) {
|
||||
"use strict";
|
||||
|
||||
function populateRatings(allParentalRatings, page) {
|
||||
var html = "";
|
||||
html += "<option value=''></option>";
|
||||
var i, length, rating, ratings = [];
|
||||
var i;
|
||||
var length;
|
||||
var rating;
|
||||
var ratings = [];
|
||||
|
||||
for (i = 0, length = allParentalRatings.length; i < length; i++) {
|
||||
if (rating = allParentalRatings[i], ratings.length) {
|
||||
var lastRating = ratings[ratings.length - 1];
|
||||
|
||||
if (lastRating.Value === rating.Value) {
|
||||
lastRating.Name += "/" + rating.Name;
|
||||
continue
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
ratings.push({
|
||||
Name: rating.Name,
|
||||
Value: rating.Value
|
||||
})
|
||||
});
|
||||
}
|
||||
for (i = 0, length = ratings.length; i < length; i++) rating = ratings[i], html += "<option value='" + rating.Value + "'>" + rating.Name + "</option>";
|
||||
$("#selectMaxParentalRating", page).html(html)
|
||||
|
||||
for (i = 0, length = ratings.length; i < length; i++) {
|
||||
rating = ratings[i];
|
||||
html += "<option value='" + rating.Value + "'>" + rating.Name + "</option>";
|
||||
}
|
||||
|
||||
$("#selectMaxParentalRating", page).html(html);
|
||||
}
|
||||
|
||||
function loadUnratedItems(page, user) {
|
||||
var items = [{
|
||||
name: Globalize.translate("OptionBlockBooks"),
|
||||
value: "Book"
|
||||
}, {
|
||||
name: Globalize.translate("OptionBlockChannelContent"),
|
||||
value: "ChannelContent"
|
||||
}, {
|
||||
name: Globalize.translate("OptionBlockLiveTvChannels"),
|
||||
value: "LiveTvChannel"
|
||||
}, {
|
||||
name: Globalize.translate("OptionBlockMovies"),
|
||||
value: "Movie"
|
||||
}, {
|
||||
name: Globalize.translate("OptionBlockMusic"),
|
||||
value: "Music"
|
||||
}, {
|
||||
name: Globalize.translate("OptionBlockTrailers"),
|
||||
value: "Trailer"
|
||||
}, {
|
||||
name: Globalize.translate("OptionBlockTvShows"),
|
||||
value: "Series"
|
||||
}],
|
||||
html = "";
|
||||
html += '<h3 class="checkboxListLabel">' + Globalize.translate("HeaderBlockItemsWithNoRating") + "</h3>", html += '<div class="checkboxList paperList checkboxList-paperList">';
|
||||
name: Globalize.translate("OptionBlockBooks"),
|
||||
value: "Book"
|
||||
}, {
|
||||
name: Globalize.translate("OptionBlockChannelContent"),
|
||||
value: "ChannelContent"
|
||||
}, {
|
||||
name: Globalize.translate("OptionBlockLiveTvChannels"),
|
||||
value: "LiveTvChannel"
|
||||
}, {
|
||||
name: Globalize.translate("OptionBlockMovies"),
|
||||
value: "Movie"
|
||||
}, {
|
||||
name: Globalize.translate("OptionBlockMusic"),
|
||||
value: "Music"
|
||||
}, {
|
||||
name: Globalize.translate("OptionBlockTrailers"),
|
||||
value: "Trailer"
|
||||
}, {
|
||||
name: Globalize.translate("OptionBlockTvShows"),
|
||||
value: "Series"
|
||||
}];
|
||||
var html = "";
|
||||
html += '<h3 class="checkboxListLabel">' + Globalize.translate("HeaderBlockItemsWithNoRating") + "</h3>";
|
||||
html += '<div class="checkboxList paperList checkboxList-paperList">';
|
||||
|
||||
for (var i = 0, length = items.length; i < length; i++) {
|
||||
var item = items[i],
|
||||
checkedAttribute = -1 != user.Policy.BlockUnratedItems.indexOf(item.value) ? ' checked="checked"' : "";
|
||||
html += '<label><input type="checkbox" is="emby-checkbox" class="chkUnratedItem" data-itemtype="' + item.value + '" type="checkbox"' + checkedAttribute + "><span>" + item.name + "</span></label>"
|
||||
var item = items[i];
|
||||
var checkedAttribute = -1 != user.Policy.BlockUnratedItems.indexOf(item.value) ? ' checked="checked"' : "";
|
||||
html += '<label><input type="checkbox" is="emby-checkbox" class="chkUnratedItem" data-itemtype="' + item.value + '" type="checkbox"' + checkedAttribute + "><span>" + item.name + "</span></label>";
|
||||
}
|
||||
html += "</div>", $(".blockUnratedItems", page).html(html).trigger("create")
|
||||
|
||||
html += "</div>";
|
||||
$(".blockUnratedItems", page).html(html).trigger("create");
|
||||
}
|
||||
|
||||
function loadUser(page, user, allParentalRatings) {
|
||||
page.querySelector(".username").innerHTML = user.Name, libraryMenu.setTitle(user.Name), loadUnratedItems(page, user), loadBlockedTags(page, user.Policy.BlockedTags), populateRatings(allParentalRatings, page);
|
||||
page.querySelector(".username").innerHTML = user.Name;
|
||||
libraryMenu.setTitle(user.Name);
|
||||
loadUnratedItems(page, user);
|
||||
loadBlockedTags(page, user.Policy.BlockedTags);
|
||||
populateRatings(allParentalRatings, page);
|
||||
var ratingValue = "";
|
||||
if (user.Policy.MaxParentalRating)
|
||||
|
||||
if (user.Policy.MaxParentalRating) {
|
||||
for (var i = 0, length = allParentalRatings.length; i < length; i++) {
|
||||
var rating = allParentalRatings[i];
|
||||
user.Policy.MaxParentalRating >= rating.Value && (ratingValue = rating.Value)
|
||||
|
||||
if (user.Policy.MaxParentalRating >= rating.Value) {
|
||||
ratingValue = rating.Value;
|
||||
}
|
||||
}
|
||||
$("#selectMaxParentalRating", page).val(ratingValue), user.Policy.IsAdministrator ? $(".accessScheduleSection", page).hide() : $(".accessScheduleSection", page).show(), renderAccessSchedule(page, user.Policy.AccessSchedules || []), loading.hide()
|
||||
}
|
||||
|
||||
$("#selectMaxParentalRating", page).val(ratingValue);
|
||||
|
||||
if (user.Policy.IsAdministrator) {
|
||||
$(".accessScheduleSection", page).hide();
|
||||
} else {
|
||||
$(".accessScheduleSection", page).show();
|
||||
}
|
||||
|
||||
renderAccessSchedule(page, user.Policy.AccessSchedules || []);
|
||||
loading.hide();
|
||||
}
|
||||
|
||||
function loadBlockedTags(page, tags) {
|
||||
var html = tags.map(function(h) {
|
||||
var html = tags.map(function (h) {
|
||||
var li = '<div class="listItem">';
|
||||
return li += '<div class="listItemBody">', li += '<h3 class="listItemBodyText">', li += h, li += "</h3>", li += "</div>", li += '<button type="button" is="paper-icon-button-light" class="blockedTag btnDeleteTag listItemButton" data-tag="' + h + '"><i class="md-icon">delete</i></button>', li += "</div>"
|
||||
li += '<div class="listItemBody">';
|
||||
li += '<h3 class="listItemBodyText">';
|
||||
li += h;
|
||||
li += "</h3>";
|
||||
li += "</div>";
|
||||
li += '<button type="button" is="paper-icon-button-light" class="blockedTag btnDeleteTag listItemButton" data-tag="' + h + '"><i class="md-icon">delete</i></button>';
|
||||
return li += "</div>";
|
||||
}).join("");
|
||||
html && (html = '<div class="paperList">' + html + "</div>");
|
||||
|
||||
if (html) {
|
||||
html = '<div class="paperList">' + html + "</div>";
|
||||
}
|
||||
|
||||
var elem = $(".blockedTags", page).html(html).trigger("create");
|
||||
$(".btnDeleteTag", elem).on("click", function() {
|
||||
var tag = this.getAttribute("data-tag"),
|
||||
newTags = tags.filter(function(t) {
|
||||
return t != tag
|
||||
});
|
||||
loadBlockedTags(page, newTags)
|
||||
})
|
||||
$(".btnDeleteTag", elem).on("click", function () {
|
||||
var tag = this.getAttribute("data-tag");
|
||||
var newTags = tags.filter(function (t) {
|
||||
return t != tag;
|
||||
});
|
||||
loadBlockedTags(page, newTags);
|
||||
});
|
||||
}
|
||||
|
||||
function deleteAccessSchedule(page, schedules, index) {
|
||||
schedules.splice(index, 1), renderAccessSchedule(page, schedules)
|
||||
schedules.splice(index, 1);
|
||||
renderAccessSchedule(page, schedules);
|
||||
}
|
||||
|
||||
function renderAccessSchedule(page, schedules) {
|
||||
var html = "",
|
||||
index = 0;
|
||||
html += schedules.map(function(a) {
|
||||
var html = "";
|
||||
var index = 0;
|
||||
html += schedules.map(function (a) {
|
||||
var itemHtml = "";
|
||||
return itemHtml += '<div class="liSchedule listItem" data-day="' + a.DayOfWeek + '" data-start="' + a.StartHour + '" data-end="' + a.EndHour + '">', itemHtml += '<div class="listItemBody two-line">', itemHtml += '<h3 class="listItemBodyText">', itemHtml += Globalize.translate("Option" + a.DayOfWeek), itemHtml += "</h3>", itemHtml += '<div class="listItemBodyText secondary">' + getDisplayTime(a.StartHour) + " - " + getDisplayTime(a.EndHour) + "</div>", itemHtml += "</div>", itemHtml += '<button type="button" is="paper-icon-button-light" class="btnDelete listItemButton" data-index="' + index + '"><i class="md-icon">delete</i></button>', itemHtml += "</div>", index++, itemHtml
|
||||
itemHtml += '<div class="liSchedule listItem" data-day="' + a.DayOfWeek + '" data-start="' + a.StartHour + '" data-end="' + a.EndHour + '">';
|
||||
itemHtml += '<div class="listItemBody two-line">';
|
||||
itemHtml += '<h3 class="listItemBodyText">';
|
||||
itemHtml += Globalize.translate("Option" + a.DayOfWeek);
|
||||
itemHtml += "</h3>";
|
||||
itemHtml += '<div class="listItemBodyText secondary">' + getDisplayTime(a.StartHour) + " - " + getDisplayTime(a.EndHour) + "</div>";
|
||||
itemHtml += "</div>";
|
||||
itemHtml += '<button type="button" is="paper-icon-button-light" class="btnDelete listItemButton" data-index="' + index + '"><i class="md-icon">delete</i></button>';
|
||||
itemHtml += "</div>";
|
||||
index++;
|
||||
return itemHtml;
|
||||
}).join("");
|
||||
var accessScheduleList = page.querySelector(".accessScheduleList");
|
||||
accessScheduleList.innerHTML = html, $(".btnDelete", accessScheduleList).on("click", function() {
|
||||
deleteAccessSchedule(page, schedules, parseInt(this.getAttribute("data-index")))
|
||||
})
|
||||
accessScheduleList.innerHTML = html;
|
||||
$(".btnDelete", accessScheduleList).on("click", function () {
|
||||
deleteAccessSchedule(page, schedules, parseInt(this.getAttribute("data-index")));
|
||||
});
|
||||
}
|
||||
|
||||
function onSaveComplete(page) {
|
||||
loading.hide(), require(["toast"], function(toast) {
|
||||
toast(Globalize.translate("SettingsSaved"))
|
||||
})
|
||||
loading.hide();
|
||||
|
||||
require(["toast"], function (toast) {
|
||||
toast(Globalize.translate("SettingsSaved"));
|
||||
});
|
||||
}
|
||||
|
||||
function saveUser(user, page) {
|
||||
user.Policy.MaxParentalRating = $("#selectMaxParentalRating", page).val() || null, user.Policy.BlockUnratedItems = $(".chkUnratedItem", page).get().filter(function(i) {
|
||||
return i.checked
|
||||
}).map(function(i) {
|
||||
return i.getAttribute("data-itemtype")
|
||||
}), user.Policy.AccessSchedules = getSchedulesFromPage(page), user.Policy.BlockedTags = getBlockedTagsFromPage(page), ApiClient.updateUserPolicy(user.Id, user.Policy).then(function() {
|
||||
onSaveComplete(page)
|
||||
})
|
||||
user.Policy.MaxParentalRating = $("#selectMaxParentalRating", page).val() || null;
|
||||
user.Policy.BlockUnratedItems = $(".chkUnratedItem", page).get().filter(function (i) {
|
||||
return i.checked;
|
||||
}).map(function (i) {
|
||||
return i.getAttribute("data-itemtype");
|
||||
});
|
||||
user.Policy.AccessSchedules = getSchedulesFromPage(page);
|
||||
user.Policy.BlockedTags = getBlockedTagsFromPage(page);
|
||||
ApiClient.updateUserPolicy(user.Id, user.Policy).then(function () {
|
||||
onSaveComplete(page);
|
||||
});
|
||||
}
|
||||
|
||||
function getDisplayTime(hours) {
|
||||
var minutes = 0,
|
||||
pct = hours % 1;
|
||||
return pct && (minutes = parseInt(60 * pct)), datetime.getDisplayTime(new Date(2e3, 1, 1, hours, minutes, 0, 0))
|
||||
var minutes = 0;
|
||||
var pct = hours % 1;
|
||||
|
||||
if (pct) {
|
||||
minutes = parseInt(60 * pct);
|
||||
}
|
||||
|
||||
return datetime.getDisplayTime(new Date(2000, 1, 1, hours, minutes, 0, 0));
|
||||
}
|
||||
|
||||
function showSchedulePopup(page, schedule, index) {
|
||||
schedule = schedule || {}, require(["components/accessschedule/accessschedule"], function(accessschedule) {
|
||||
schedule = schedule || {};
|
||||
|
||||
require(["components/accessschedule/accessschedule"], function (accessschedule) {
|
||||
accessschedule.show({
|
||||
schedule: schedule
|
||||
}).then(function(updatedSchedule) {
|
||||
var schedules = getSchedulesFromPage(page); - 1 == index && (index = schedules.length), schedules[index] = updatedSchedule, renderAccessSchedule(page, schedules)
|
||||
})
|
||||
})
|
||||
}).then(function (updatedSchedule) {
|
||||
var schedules = getSchedulesFromPage(page);
|
||||
|
||||
if (-1 == index) {
|
||||
index = schedules.length;
|
||||
}
|
||||
|
||||
schedules[index] = updatedSchedule;
|
||||
renderAccessSchedule(page, schedules);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function getSchedulesFromPage(page) {
|
||||
return $(".liSchedule", page).map(function() {
|
||||
return $(".liSchedule", page).map(function () {
|
||||
return {
|
||||
DayOfWeek: this.getAttribute("data-day"),
|
||||
StartHour: this.getAttribute("data-start"),
|
||||
EndHour: this.getAttribute("data-end")
|
||||
}
|
||||
}).get()
|
||||
};
|
||||
}).get();
|
||||
}
|
||||
|
||||
function getBlockedTagsFromPage(page) {
|
||||
return $(".blockedTag", page).map(function() {
|
||||
return this.getAttribute("data-tag")
|
||||
}).get()
|
||||
return $(".blockedTag", page).map(function () {
|
||||
return this.getAttribute("data-tag");
|
||||
}).get();
|
||||
}
|
||||
|
||||
function showBlockedTagPopup(page) {
|
||||
require(["prompt"], function(prompt) {
|
||||
require(["prompt"], function (prompt) {
|
||||
prompt({
|
||||
label: Globalize.translate("LabelTag")
|
||||
}).then(function(value) {
|
||||
var tags = getBlockedTagsFromPage(page); - 1 == tags.indexOf(value) && (tags.push(value), loadBlockedTags(page, tags))
|
||||
})
|
||||
})
|
||||
}).then(function (value) {
|
||||
var tags = getBlockedTagsFromPage(page);
|
||||
|
||||
if (-1 == tags.indexOf(value)) {
|
||||
tags.push(value);
|
||||
loadBlockedTags(page, tags);
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
window.UserParentalControlPage = {
|
||||
onSubmit: function() {
|
||||
onSubmit: function () {
|
||||
var page = $(this).parents(".page");
|
||||
loading.show();
|
||||
var userId = getParameterByName("userId");
|
||||
return ApiClient.getUser(userId).then(function(result) {
|
||||
saveUser(result, page)
|
||||
}), !1
|
||||
ApiClient.getUser(userId).then(function (result) {
|
||||
saveUser(result, page);
|
||||
});
|
||||
return false;
|
||||
}
|
||||
}, $(document).on("pageinit", "#userParentalControlPage", function() {
|
||||
};
|
||||
$(document).on("pageinit", "#userParentalControlPage", function () {
|
||||
var page = this;
|
||||
$(".btnAddSchedule", page).on("click", function() {
|
||||
showSchedulePopup(page, {}, -1)
|
||||
}), $(".btnAddBlockedTag", page).on("click", function() {
|
||||
showBlockedTagPopup(page)
|
||||
}), $(".userParentalControlForm").off("submit", UserParentalControlPage.onSubmit).on("submit", UserParentalControlPage.onSubmit)
|
||||
}).on("pageshow", "#userParentalControlPage", function() {
|
||||
$(".btnAddSchedule", page).on("click", function () {
|
||||
showSchedulePopup(page, {}, -1);
|
||||
});
|
||||
$(".btnAddBlockedTag", page).on("click", function () {
|
||||
showBlockedTagPopup(page);
|
||||
});
|
||||
$(".userParentalControlForm").off("submit", UserParentalControlPage.onSubmit).on("submit", UserParentalControlPage.onSubmit);
|
||||
}).on("pageshow", "#userParentalControlPage", function () {
|
||||
var page = this;
|
||||
loading.show();
|
||||
var userId = getParameterByName("userId"),
|
||||
promise1 = ApiClient.getUser(userId),
|
||||
promise2 = ApiClient.getParentalRatings();
|
||||
Promise.all([promise1, promise2]).then(function(responses) {
|
||||
loadUser(page, responses[0], responses[1])
|
||||
})
|
||||
})
|
||||
var userId = getParameterByName("userId");
|
||||
var promise1 = ApiClient.getUser(userId);
|
||||
var promise2 = ApiClient.getParentalRatings();
|
||||
Promise.all([promise1, promise2]).then(function (responses) {
|
||||
loadUser(page, responses[0], responses[1]);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
@@ -1,101 +1,183 @@
|
||||
define(["loading", "libraryMenu", "emby-button"], function(loading, libraryMenu) {
|
||||
define(["loading", "libraryMenu", "emby-button"], function (loading, libraryMenu) {
|
||||
"use strict";
|
||||
|
||||
function loadUser(page, params) {
|
||||
var userid = params.userId;
|
||||
ApiClient.getUser(userid).then(function(user) {
|
||||
Dashboard.getCurrentUser().then(function(loggedInUser) {
|
||||
libraryMenu.setTitle(user.Name), page.querySelector(".username").innerHTML = user.Name;
|
||||
var showPasswordSection = !0,
|
||||
showLocalAccessSection = !1;
|
||||
"Guest" == user.ConnectLinkType ? (page.querySelector(".localAccessSection").classList.add("hide"), showPasswordSection = !1) : user.HasConfiguredPassword ? (page.querySelector("#btnResetPassword").classList.remove("hide"), page.querySelector("#fldCurrentPassword").classList.remove("hide"), showLocalAccessSection = !0) : (page.querySelector("#btnResetPassword").classList.add("hide"), page.querySelector("#fldCurrentPassword").classList.add("hide")), showPasswordSection && (loggedInUser.Policy.IsAdministrator || user.Policy.EnableUserPreferenceAccess) ? page.querySelector(".passwordSection").classList.remove("hide") : page.querySelector(".passwordSection").classList.add("hide"), showLocalAccessSection && (loggedInUser.Policy.IsAdministrator || user.Policy.EnableUserPreferenceAccess) ? page.querySelector(".localAccessSection").classList.remove("hide") : page.querySelector(".localAccessSection").classList.add("hide");
|
||||
ApiClient.getUser(userid).then(function (user) {
|
||||
Dashboard.getCurrentUser().then(function (loggedInUser) {
|
||||
libraryMenu.setTitle(user.Name);
|
||||
page.querySelector(".username").innerHTML = user.Name;
|
||||
var showPasswordSection = true;
|
||||
var showLocalAccessSection = false;
|
||||
|
||||
if ("Guest" == user.ConnectLinkType) {
|
||||
page.querySelector(".localAccessSection").classList.add("hide");
|
||||
showPasswordSection = false;
|
||||
} else if (user.HasConfiguredPassword) {
|
||||
page.querySelector("#btnResetPassword").classList.remove("hide");
|
||||
page.querySelector("#fldCurrentPassword").classList.remove("hide");
|
||||
showLocalAccessSection = true;
|
||||
} else {
|
||||
page.querySelector("#btnResetPassword").classList.add("hide");
|
||||
page.querySelector("#fldCurrentPassword").classList.add("hide");
|
||||
}
|
||||
|
||||
if (showPasswordSection && (loggedInUser.Policy.IsAdministrator || user.Policy.EnableUserPreferenceAccess)) {
|
||||
page.querySelector(".passwordSection").classList.remove("hide");
|
||||
} else {
|
||||
page.querySelector(".passwordSection").classList.add("hide");
|
||||
}
|
||||
|
||||
if (showLocalAccessSection && (loggedInUser.Policy.IsAdministrator || user.Policy.EnableUserPreferenceAccess)) {
|
||||
page.querySelector(".localAccessSection").classList.remove("hide");
|
||||
} else {
|
||||
page.querySelector(".localAccessSection").classList.add("hide");
|
||||
}
|
||||
|
||||
var txtEasyPassword = page.querySelector("#txtEasyPassword");
|
||||
txtEasyPassword.value = "", user.HasConfiguredEasyPassword ? (txtEasyPassword.placeholder = "******", page.querySelector("#btnResetEasyPassword").classList.remove("hide")) : (txtEasyPassword.removeAttribute("placeholder"), txtEasyPassword.placeholder = "", page.querySelector("#btnResetEasyPassword").classList.add("hide")), page.querySelector(".chkEnableLocalEasyPassword").checked = user.Configuration.EnableLocalPassword
|
||||
})
|
||||
}), page.querySelector("#txtCurrentPassword").value = "", page.querySelector("#txtNewPassword").value = "", page.querySelector("#txtNewPasswordConfirm").value = ""
|
||||
txtEasyPassword.value = "";
|
||||
|
||||
if (user.HasConfiguredEasyPassword) {
|
||||
txtEasyPassword.placeholder = "******";
|
||||
page.querySelector("#btnResetEasyPassword").classList.remove("hide");
|
||||
} else {
|
||||
txtEasyPassword.removeAttribute("placeholder");
|
||||
txtEasyPassword.placeholder = "";
|
||||
page.querySelector("#btnResetEasyPassword").classList.add("hide");
|
||||
}
|
||||
|
||||
page.querySelector(".chkEnableLocalEasyPassword").checked = user.Configuration.EnableLocalPassword;
|
||||
});
|
||||
});
|
||||
page.querySelector("#txtCurrentPassword").value = "";
|
||||
page.querySelector("#txtNewPassword").value = "";
|
||||
page.querySelector("#txtNewPasswordConfirm").value = "";
|
||||
}
|
||||
return function(view, params) {
|
||||
|
||||
return function (view, params) {
|
||||
function saveEasyPassword() {
|
||||
var userId = params.userId,
|
||||
easyPassword = view.querySelector("#txtEasyPassword").value;
|
||||
easyPassword ? ApiClient.updateEasyPassword(userId, easyPassword).then(function() {
|
||||
onEasyPasswordSaved(userId)
|
||||
}) : onEasyPasswordSaved(userId)
|
||||
var userId = params.userId;
|
||||
var easyPassword = view.querySelector("#txtEasyPassword").value;
|
||||
|
||||
if (easyPassword) {
|
||||
ApiClient.updateEasyPassword(userId, easyPassword).then(function () {
|
||||
onEasyPasswordSaved(userId);
|
||||
});
|
||||
} else {
|
||||
onEasyPasswordSaved(userId);
|
||||
}
|
||||
}
|
||||
|
||||
function onEasyPasswordSaved(userId) {
|
||||
ApiClient.getUser(userId).then(function(user) {
|
||||
user.Configuration.EnableLocalPassword = view.querySelector(".chkEnableLocalEasyPassword").checked, ApiClient.updateUserConfiguration(user.Id, user.Configuration).then(function() {
|
||||
loading.hide(), require(["toast"], function(toast) {
|
||||
toast(Globalize.translate("MessageSettingsSaved"))
|
||||
}), loadUser(view, params)
|
||||
})
|
||||
})
|
||||
ApiClient.getUser(userId).then(function (user) {
|
||||
user.Configuration.EnableLocalPassword = view.querySelector(".chkEnableLocalEasyPassword").checked;
|
||||
ApiClient.updateUserConfiguration(user.Id, user.Configuration).then(function () {
|
||||
loading.hide();
|
||||
|
||||
require(["toast"], function (toast) {
|
||||
toast(Globalize.translate("MessageSettingsSaved"));
|
||||
});
|
||||
|
||||
loadUser(view, params);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function savePassword() {
|
||||
var userId = params.userId,
|
||||
currentPassword = view.querySelector("#txtCurrentPassword").value,
|
||||
newPassword = view.querySelector("#txtNewPassword").value;
|
||||
var userId = params.userId;
|
||||
var currentPassword = view.querySelector("#txtCurrentPassword").value;
|
||||
var newPassword = view.querySelector("#txtNewPassword").value;
|
||||
|
||||
if (view.querySelector("#fldCurrentPassword").classList.contains("hide")) {
|
||||
// Firefox does not respect autocomplete=off, so clear it if the field is supposed to be hidden (and blank)
|
||||
// This should only happen when user.HasConfiguredPassword is false, but this information is not passed on
|
||||
currentPassword = "";
|
||||
}
|
||||
ApiClient.updateUserPassword(userId, currentPassword, newPassword).then(function() {
|
||||
loading.hide(), require(["toast"], function(toast) {
|
||||
toast(Globalize.translate("PasswordSaved"))
|
||||
}), loadUser(view, params)
|
||||
}, function() {
|
||||
loading.hide(), Dashboard.alert({
|
||||
|
||||
ApiClient.updateUserPassword(userId, currentPassword, newPassword).then(function () {
|
||||
loading.hide();
|
||||
|
||||
require(["toast"], function (toast) {
|
||||
toast(Globalize.translate("PasswordSaved"));
|
||||
});
|
||||
|
||||
loadUser(view, params);
|
||||
}, function () {
|
||||
loading.hide();
|
||||
Dashboard.alert({
|
||||
title: Globalize.translate("HeaderLoginFailure"),
|
||||
message: Globalize.translate("MessageInvalidUser")
|
||||
})
|
||||
})
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function onSubmit(e) {
|
||||
var form = this;
|
||||
return form.querySelector("#txtNewPassword").value != form.querySelector("#txtNewPasswordConfirm").value ? require(["toast"], function(toast) {
|
||||
toast(Globalize.translate("PasswordMatchError"))
|
||||
}) : (loading.show(), savePassword()), e.preventDefault(), !1
|
||||
|
||||
if (form.querySelector("#txtNewPassword").value != form.querySelector("#txtNewPasswordConfirm").value) {
|
||||
require(["toast"], function (toast) {
|
||||
toast(Globalize.translate("PasswordMatchError"));
|
||||
});
|
||||
} else {
|
||||
loading.show();
|
||||
savePassword();
|
||||
}
|
||||
|
||||
e.preventDefault();
|
||||
return false;
|
||||
}
|
||||
|
||||
function onLocalAccessSubmit(e) {
|
||||
return loading.show(), saveEasyPassword(), e.preventDefault(), !1
|
||||
loading.show();
|
||||
saveEasyPassword();
|
||||
e.preventDefault();
|
||||
return false;
|
||||
}
|
||||
|
||||
function resetPassword() {
|
||||
var msg = Globalize.translate("PasswordResetConfirmation");
|
||||
require(["confirm"], function(confirm) {
|
||||
confirm(msg, Globalize.translate("PasswordResetHeader")).then(function() {
|
||||
|
||||
require(["confirm"], function (confirm) {
|
||||
confirm(msg, Globalize.translate("PasswordResetHeader")).then(function () {
|
||||
var userId = params.userId;
|
||||
loading.show(), ApiClient.resetUserPassword(userId).then(function() {
|
||||
loading.hide(), Dashboard.alert({
|
||||
loading.show();
|
||||
ApiClient.resetUserPassword(userId).then(function () {
|
||||
loading.hide();
|
||||
Dashboard.alert({
|
||||
message: Globalize.translate("PasswordResetComplete"),
|
||||
title: Globalize.translate("PasswordResetHeader")
|
||||
}), loadUser(view, params)
|
||||
})
|
||||
})
|
||||
})
|
||||
});
|
||||
loadUser(view, params);
|
||||
});
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function resetEasyPassword() {
|
||||
var msg = Globalize.translate("PinCodeResetConfirmation");
|
||||
require(["confirm"], function(confirm) {
|
||||
confirm(msg, Globalize.translate("HeaderPinCodeReset")).then(function() {
|
||||
|
||||
require(["confirm"], function (confirm) {
|
||||
confirm(msg, Globalize.translate("HeaderPinCodeReset")).then(function () {
|
||||
var userId = params.userId;
|
||||
loading.show(), ApiClient.resetEasyPassword(userId).then(function() {
|
||||
loading.hide(), Dashboard.alert({
|
||||
loading.show();
|
||||
ApiClient.resetEasyPassword(userId).then(function () {
|
||||
loading.hide();
|
||||
Dashboard.alert({
|
||||
message: Globalize.translate("PinCodeResetComplete"),
|
||||
title: Globalize.translate("HeaderPinCodeReset")
|
||||
}), loadUser(view, params)
|
||||
})
|
||||
})
|
||||
})
|
||||
});
|
||||
loadUser(view, params);
|
||||
});
|
||||
});
|
||||
});
|
||||
}
|
||||
view.querySelector(".updatePasswordForm").addEventListener("submit", onSubmit), view.querySelector(".localAccessForm").addEventListener("submit", onLocalAccessSubmit), view.querySelector("#btnResetEasyPassword").addEventListener("click", resetEasyPassword), view.querySelector("#btnResetPassword").addEventListener("click", resetPassword), view.addEventListener("viewshow", function() {
|
||||
loadUser(view, params)
|
||||
})
|
||||
}
|
||||
|
||||
view.querySelector(".updatePasswordForm").addEventListener("submit", onSubmit);
|
||||
view.querySelector(".localAccessForm").addEventListener("submit", onLocalAccessSubmit);
|
||||
view.querySelector("#btnResetEasyPassword").addEventListener("click", resetEasyPassword);
|
||||
view.querySelector("#btnResetPassword").addEventListener("click", resetPassword);
|
||||
view.addEventListener("viewshow", function () {
|
||||
loadUser(view, params);
|
||||
});
|
||||
};
|
||||
});
|
||||
|
||||
@@ -6,7 +6,7 @@ define(["loading"], function (loading) {
|
||||
ApiClient.ajax({
|
||||
url: ApiClient.getUrl("Startup/Complete"),
|
||||
type: "POST"
|
||||
}).then(function() {
|
||||
}).then(function () {
|
||||
loading.hide();
|
||||
window.location.href = "index.html";
|
||||
});
|
||||
|
||||
+2
-2
@@ -98,8 +98,8 @@
|
||||
<body>
|
||||
<div class="backdropContainer"></div>
|
||||
<div class="backgroundContainer"></div>
|
||||
<div class="mainDrawer hide"><div class="mainDrawer-scrollContainer scrollContainer"></div></div>
|
||||
<div class="skinHeader"></div>
|
||||
<div class="mainDrawer hide"><div class="mainDrawer-scrollContainer scrollContainer focuscontainer-y"></div></div>
|
||||
<div class="skinHeader focuscontainer-x"></div>
|
||||
<div class="mainAnimatedPages skinBody"></div>
|
||||
<div class="mainDrawerHandle"></div>
|
||||
</body>
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
}
|
||||
|
||||
injectScriptElement(
|
||||
self.Promise ? "./bower_components/alameda/alameda.js" : "./bower_components/requirejs/require.js",
|
||||
self.Promise ? "./libraries/alameda.js" : "./libraries/require.js",
|
||||
function() {
|
||||
// onload of require library
|
||||
injectScriptElement("./scripts/site.js");
|
||||
|
||||
@@ -52,14 +52,6 @@ define(["dom", "layoutManager", "inputManager", "connectionManager", "events", "
|
||||
headerSearchButton.classList.remove("hide");
|
||||
}
|
||||
|
||||
if (headerSettingsButton) {
|
||||
if (user.localUser.Policy.IsAdministrator) {
|
||||
headerSettingsButton.classList.remove("hide");
|
||||
} else {
|
||||
headerSettingsButton.classList.add("hide");
|
||||
}
|
||||
}
|
||||
|
||||
headerCastButton.classList.remove("hide");
|
||||
} else {
|
||||
headerHomeButton.classList.add("hide");
|
||||
@@ -68,10 +60,6 @@ define(["dom", "layoutManager", "inputManager", "connectionManager", "events", "
|
||||
if (headerSearchButton) {
|
||||
headerSearchButton.classList.add("hide");
|
||||
}
|
||||
|
||||
if (headerSettingsButton) {
|
||||
headerSettingsButton.classList.add("hide");
|
||||
}
|
||||
}
|
||||
|
||||
requiresUserRefresh = false;
|
||||
@@ -95,10 +83,6 @@ define(["dom", "layoutManager", "inputManager", "connectionManager", "events", "
|
||||
Dashboard.navigate("mypreferencesmenu.html");
|
||||
}
|
||||
|
||||
function onSettingsClick(e) {
|
||||
Dashboard.navigate("dashboard.html");
|
||||
}
|
||||
|
||||
function onHeaderHomeButtonClick() {
|
||||
Dashboard.navigate("home.html");
|
||||
}
|
||||
@@ -122,12 +106,9 @@ define(["dom", "layoutManager", "inputManager", "connectionManager", "events", "
|
||||
|
||||
headerUserButton.addEventListener("click", onHeaderUserButtonClick);
|
||||
headerHomeButton.addEventListener("click", onHeaderHomeButtonClick);
|
||||
initHeadRoom(skinHeader);
|
||||
headerCastButton.addEventListener("click", onCastButtonClicked);
|
||||
|
||||
if (headerSettingsButton) {
|
||||
headerSettingsButton.addEventListener("click", onSettingsClick);
|
||||
}
|
||||
initHeadRoom(skinHeader);
|
||||
}
|
||||
|
||||
function onCastButtonClicked() {
|
||||
@@ -747,7 +728,6 @@ define(["dom", "layoutManager", "inputManager", "connectionManager", "events", "
|
||||
var headerBackButton;
|
||||
var headerUserButton;
|
||||
var currentUser;
|
||||
var headerSettingsButton;
|
||||
var headerCastButton;
|
||||
var headerSearchButton;
|
||||
var enableLibraryNavDrawer = !layoutManager.tv;
|
||||
@@ -873,23 +853,20 @@ define(["dom", "layoutManager", "inputManager", "connectionManager", "events", "
|
||||
html += '<button is="paper-icon-button-light" class="headerCastButton castButton headerButton headerButtonRight hide"><i class="md-icon"></i></button>';
|
||||
html += '<button type="button" is="paper-icon-button-light" class="headerButton headerButtonRight headerSearchButton hide"><i class="md-icon"></i></button>';
|
||||
html += '<button is="paper-icon-button-light" class="headerButton headerButtonRight headerUserButton hide"><i class="md-icon"></i></button>';
|
||||
|
||||
if (!layoutManager.mobile) {
|
||||
html += '<button is="paper-icon-button-light" class="headerButton headerButtonRight headerSettingsButton hide"><i class="md-icon">dashboard</i></button>';
|
||||
}
|
||||
|
||||
html += "</div>";
|
||||
html += "</div>";
|
||||
html += '<div class="headerTabs sectionTabs hide">';
|
||||
html += "</div>";
|
||||
|
||||
skinHeader.classList.add("skinHeader-withBackground");
|
||||
skinHeader.classList.add("skinHeader-blurred");
|
||||
skinHeader.innerHTML = html;
|
||||
|
||||
headerHomeButton = skinHeader.querySelector(".headerHomeButton");
|
||||
headerUserButton = skinHeader.querySelector(".headerUserButton");
|
||||
headerSettingsButton = skinHeader.querySelector(".headerSettingsButton");
|
||||
headerCastButton = skinHeader.querySelector(".headerCastButton");
|
||||
headerSearchButton = skinHeader.querySelector(".headerSearchButton");
|
||||
skinHeader.classList.add("skinHeader-blurred");
|
||||
|
||||
lazyLoadViewMenuBarImages();
|
||||
bindMenuEvents();
|
||||
})();
|
||||
|
||||
+55
-33
@@ -13,7 +13,7 @@
|
||||
"AllChannels": "Všechny kanály",
|
||||
"AllEpisodes": "Všechny epizody",
|
||||
"AllLanguages": "Všechny jazyky",
|
||||
"AllowHWTranscodingHelp": "Pokud nastavíte, povolíte tuneru překódování v reálném čase. Může snížit zátěž překódovávání požadované Jellyfin serverem.",
|
||||
"AllowHWTranscodingHelp": "Povolit tuneru překódování v reálném čase. Může snížit zátěž překódovávání požadované Jellyfin serverem.",
|
||||
"AlwaysPlaySubtitles": "Vždy zobrazit titulky",
|
||||
"AlwaysPlaySubtitlesHelp": "Titulky odpovídající jazykové předvolbě se načtou bez ohledu na jazyk audia.",
|
||||
"Anytime": "Kdykoliv",
|
||||
@@ -30,7 +30,7 @@
|
||||
"BirthDateValue": "Narozen: {0}",
|
||||
"BirthLocation": "Místo narození",
|
||||
"BirthPlaceValue": "Místo narození: {0}",
|
||||
"BookLibraryHelp": "Audio a textové knihy jsou podporovány. Přečtěte si {0}pravidla pro názvy knih v Jellyfin{1}.",
|
||||
"BookLibraryHelp": "Audio a textové knihy jsou podporovány. Přečtěte si {0}pravidla pro názvy knih {1}.",
|
||||
"Books": "Knihy",
|
||||
"Box": "Pouzdro",
|
||||
"BoxRear": "Zadní část pouzdra",
|
||||
@@ -157,7 +157,7 @@
|
||||
"Dislike": "Nemám rád",
|
||||
"Display": "Zobrazení",
|
||||
"DisplayMissingEpisodesWithinSeasons": "Zobrazit chybějící epizody",
|
||||
"DisplayMissingEpisodesWithinSeasonsHelp": "Toto musí být zapnuto pro knihovny TV v nastavení Jellyfin serveru.",
|
||||
"DisplayMissingEpisodesWithinSeasonsHelp": "Toto musí být zapnuto pro knihovny TV v nastavení serveru.",
|
||||
"DisplayModeHelp": "Zvolte typ obrazovky, na které používáte Jellyfin.",
|
||||
"DoNotRecord": "Nenahrávat",
|
||||
"Down": "Dolů",
|
||||
@@ -522,7 +522,7 @@
|
||||
"LabelEnableDlnaClientDiscoveryInterval": "Čas pro vyhledání klienta (sekund)",
|
||||
"LabelEnableDlnaClientDiscoveryIntervalHelp": "Určuje dobu trvání v sekundách mezi SSDP vyhledávání prováděných pomocí Jellyfin.",
|
||||
"LabelEnableDlnaDebugLogging": "Povolit DLNA protokolování (pro ladění)",
|
||||
"LabelEnableDlnaDebugLoggingHelp": "Toto nastavení vytváří velmi velké soubory se záznamy a doporučuje se pouze v případě problémů.",
|
||||
"LabelEnableDlnaDebugLoggingHelp": "Vytváří velké soubory se záznamy a doporučuje se používat pouze pro potřeby odstraňování problémů.",
|
||||
"LabelEnableDlnaPlayTo": "Povolit DLNA přehrávání",
|
||||
"LabelEnableDlnaPlayToHelp": "Jellyfin dokáže detekovat zařízení v rámci vaší sítě a nabízí možnost jeho dálkového ovládání.",
|
||||
"LabelEnableDlnaServer": "Povolit Dlna Server",
|
||||
@@ -611,9 +611,9 @@
|
||||
"LabelMethod": "Metoda:",
|
||||
"LabelMinBackdropDownloadWidth": "Maximální šířka pro stažení pozadí:",
|
||||
"LabelMinResumeDuration": "Minimální doba trvání:",
|
||||
"LabelMinResumeDurationHelp": "Videa kratší než tato délka nebudou pozastavitelné",
|
||||
"LabelMinResumeDurationHelp": "Videa kratší než tato délka nebudou pozastavitelné.",
|
||||
"LabelMinResumePercentage": "Minimální procento pro přerušení:",
|
||||
"LabelMinResumePercentageHelp": "Tituly budou označeny jako \"nepřehráno\", pokud budou zastaveny před tímto časem",
|
||||
"LabelMinResumePercentageHelp": "Tituly budou označeny jako \"nepřehráno\", pokud budou zastaveny před tímto časem.",
|
||||
"LabelMinScreenshotDownloadWidth": "Minimální šířka screenshotu obrazovky:",
|
||||
"LabelModelDescription": "Popis modelu",
|
||||
"LabelModelName": "Název modelu",
|
||||
@@ -1027,7 +1027,7 @@
|
||||
"PlaybackErrorNotAllowed": "V současné době nejste oprávněni přehrávat tento obsah. Pro více informací se obraťte se na správce systému.",
|
||||
"PlaybackErrorPlaceHolder": "Chcete-li toto video přehrát, vložte disk.",
|
||||
"Played": "Přehráno",
|
||||
"Playlists": "Playlisty",
|
||||
"Playlists": "Seznamy skladeb",
|
||||
"PleaseAddAtLeastOneFolder": "Přidejte prosím nejméně jednu složku do této knihovny pomocí tlačítka Přidat.",
|
||||
"PleaseConfirmPluginInstallation": "Pro potvrzení, že jste si přečetli text výše a chcete pokračovat v instalaci zásuvných modulů, klikněte na tlačítko OK.",
|
||||
"PleaseEnterNameOrId": "Prosím, zadejte název nebo externí Id.",
|
||||
@@ -1230,7 +1230,7 @@
|
||||
"AllowMediaConversion": "Povolit konverzi médií",
|
||||
"AllowMediaConversionHelp": "Povolit nebo zakázat přístup k funkci konverze médií.",
|
||||
"AllowOnTheFlySubtitleExtraction": "Povolit extrahování titulků za běhu",
|
||||
"AllowOnTheFlySubtitleExtractionHelp": "Vložené titulky mohou být extrahovány z videa a dodávány do aplikace Jellyfin ve formě prostého textu, aby se zabránilo překódování videa. V některých systémech to může trvat dlouho a způsobit zasekávání přehrávání videa. Při vypnutí funkce budou během překódování obsažené titulky vypáleny do obrazu, pokud je klientské zařízení nativně nepodporuje.",
|
||||
"AllowOnTheFlySubtitleExtractionHelp": "Vložené titulky mohou být extrahovány z videa a dodávány do aplikací ve formě prostého textu, aby se zabránilo překódování videa. V některých systémech to může trvat dlouho a způsobit zasekávání přehrávání videa. Při vypnutí funkce budou během překódování obsažené titulky vypáleny do obrazu, pokud je klientské zařízení nativně nepodporuje.",
|
||||
"AllowRemoteAccess": "Povolit vzdálené připojení na server Jellyfin.",
|
||||
"AllowRemoteAccessHelp": "Pokud není zapnuto, všechna vzdálená připojení budou blokována.",
|
||||
"AllowSeasonalThemesHelp": "Pokud je povoleno, sezónní motivy občas přepíšou nastavení vašeho motivu.",
|
||||
@@ -1249,7 +1249,7 @@
|
||||
"Blacklist": "Blacklist",
|
||||
"BobAndWeaveWithHelp": "Bob and weave (vyšší kvalita, ale pomalejší)",
|
||||
"Browse": "Procházet",
|
||||
"BurnSubtitlesHelp": "Určuje, zda má server vypalovat titulky při převodu videa v závislosti na formátu titulků. Vynechání vypalování titulků zlepší výkon serveru. Chcete-li vypálit grafické formáty (např. VOBSUB, PGS, SUB / IDX atd.), stejně jako některé titulky ASS / SSA, vyberte možnost Auto",
|
||||
"BurnSubtitlesHelp": "Určuje, zda má server vypalovat titulky při převodu videa v závislosti na formátu titulků. Vynechání vypalování titulků zlepší výkon serveru. Chcete-li vypálit grafické formáty (VOBSUB, PGS, SUB / IDX atd.) a některé titulky ASS / SSA, vyberte možnost Auto.",
|
||||
"ButtonInfo": "Info",
|
||||
"ButtonMenu": "Menu",
|
||||
"ButtonOk": "Ok",
|
||||
@@ -1304,7 +1304,7 @@
|
||||
"HandledByProxy": "Zpracováno reverzním proxy",
|
||||
"HeaderAddLocalUser": "Přidat místního uživatele",
|
||||
"HeaderAllowMediaDeletionFrom": "Povolit smazání médií z",
|
||||
"HeaderAppearsOn": "Appears On",
|
||||
"HeaderAppearsOn": "Objeví se",
|
||||
"HeaderAudio": "Audio",
|
||||
"HeaderBlockItemsWithNoRating": "Blokovat položky s žádnými nebo nerozpoznanými informacemi o hodnocení:",
|
||||
"HeaderCameraUploadHelp": "Aplikace Jellyfin mohou automaticky nahrávat fotografie z mobilních zařízení do serveru Jellyfin.",
|
||||
@@ -1322,8 +1322,8 @@
|
||||
"HeaderImageOptions": "Volby obrázku",
|
||||
"HeaderInviteWithJellyfinConnect": "Pozvat s Jellyfin Connect",
|
||||
"HeaderKodiMetadataHelp": "Chcete-li povolit nebo zakázat Nfo metadata, upravte nastavení knihovny v sekci ukládání metadat.",
|
||||
"HeaderLiveTV": "Live TV",
|
||||
"HeaderLiveTv": "Live TV",
|
||||
"HeaderLiveTV": "Živá TV",
|
||||
"HeaderLiveTv": "Živá TV",
|
||||
"HeaderLiveTvTunerSetup": "Nastavení tuneru Live TV",
|
||||
"HeaderMenu": "Menu",
|
||||
"HeaderNewDevices": "Nové zařízení",
|
||||
@@ -1350,7 +1350,7 @@
|
||||
"LabelAlbum": "Album:",
|
||||
"LabelAllowedRemoteAddresses": "Filtr vzdálené IP adresy:",
|
||||
"LabelAllowedRemoteAddressesMode": "Režim filtru vzdálené IP adresy:",
|
||||
"LabelAudioCodec": "Audio: {0}",
|
||||
"LabelAudioCodec": "Audio kodek:",
|
||||
"LabelAutomaticallyRefreshInternetMetadataEvery": "Automaticky aktualizovat metadata z internetu:",
|
||||
"LabelBlockContentWithTags": "Blokovat položky s tagy:",
|
||||
"LabelBurnSubtitles": "Vypálit titulky:",
|
||||
@@ -1369,8 +1369,8 @@
|
||||
"LabelEnableHardwareDecodingFor": "Povolit hardwarové dekódování pro:",
|
||||
"LabelHomeNetworkQuality": "Kvalita na domácí síti:",
|
||||
"LabelInternetQuality": "Kvalita na internetu:",
|
||||
"LabelKodiMetadataUser": "Uložení dat sledování uživatele do nfo pro:",
|
||||
"LabelKodiMetadataUserHelp": "Povolte toto nastavení pro uložení dat sledování do souborů NFO pro jiné aplikace, které chcete používat.",
|
||||
"LabelKodiMetadataUser": "Uložit data sledování uživatele do NFO souboru pro:",
|
||||
"LabelKodiMetadataUserHelp": "Uložit sledovaná data o přehrávání pro využití dalšími aplikacemi.",
|
||||
"LabelLanNetworks": "Sítě LAN:",
|
||||
"LabelLimit": "Limit:",
|
||||
"LabelMaxStreamingBitrate": "Maximální kvalita streamování:",
|
||||
@@ -1383,7 +1383,7 @@
|
||||
"LabelSecureConnectionsMode": "Režim zabezpečeného připojení:",
|
||||
"LabelServerHost": "Host:",
|
||||
"LabelSimultaneousConnectionLimit": "Limit současně běžících streamů:",
|
||||
"LabelSkin": "Skin:",
|
||||
"LabelSkin": "Vzhled:",
|
||||
"LabelSortBy": "Řadit podle:",
|
||||
"LabelSortOrder": "Pořadí řazení:",
|
||||
"LabelSpecialSeasonsDisplayName": "Zobrazovaný název pro zvláštní sezónu:",
|
||||
@@ -1395,14 +1395,14 @@
|
||||
"LabelTypeText": "Text",
|
||||
"LabelUrl": "URL:",
|
||||
"LabelUserAgent": "User agent:",
|
||||
"LabelUserRemoteClientBitrateLimitHelp": "Toto přepíše výchozí globální hodnotu nastavenou v nastavení přehrávání serveru.",
|
||||
"LabelUserRemoteClientBitrateLimitHelp": "Přepíše výchozí globální hodnotu nastavenou v nastavení přehrávání serveru.",
|
||||
"LabelVideo": "Video:",
|
||||
"LabelVideoCodec": "Video: {0}",
|
||||
"LeaveBlankToNotSetAPassword": "Volitelné - ponechat prázdné pro nastavení bez hesla",
|
||||
"LabelVideoCodec": "Video kodek:",
|
||||
"LeaveBlankToNotSetAPassword": "Můžete ponechat prázdné pro nastavení bez hesla.",
|
||||
"LetterButtonAbbreviation": "A",
|
||||
"LinkApi": "API",
|
||||
"LinksValue": "Odkazy: {0}",
|
||||
"LiveTV": "Live TV",
|
||||
"LiveTV": "Živá TV",
|
||||
"LiveTvFeatureDescription": "Streamujte televizní vysílání do libovolné aplikace Jellyfin s kompatibilním televizním tunerem instalovaným na serveru Jellyfin.",
|
||||
"Logo": "Logo",
|
||||
"ManageLibrary": "Spravovat knihovnu",
|
||||
@@ -1411,7 +1411,7 @@
|
||||
"MediaInfoStreamTypeAudio": "Audio",
|
||||
"MediaInfoStreamTypeData": "Data",
|
||||
"MediaInfoStreamTypeVideo": "Video",
|
||||
"AuthProviderHelp": "Vyberte poskytovatele ověřování, který bude použit k ověření hesla tohoto uživatele",
|
||||
"AuthProviderHelp": "Vyberte poskytovatele ověřování, který bude použit k ověření hesla tohoto uživatele.",
|
||||
"HeaderFavoriteMovies": "Oblíbená videa",
|
||||
"HeaderFavoriteShows": "Oblíbené seriály",
|
||||
"HeaderFavoriteEpisodes": "Oblíbené epizody",
|
||||
@@ -1420,7 +1420,7 @@
|
||||
"HeaderFavoriteSongs": "Oblíbená hudba",
|
||||
"HeaderRestartingServer": "Restartování serveru",
|
||||
"LabelAuthProvider": "Poskytovatel ověření:",
|
||||
"LabelServerNameHelp": "Tento název bude použit k identifikaci tohoto serveru. Pokud zůstane prázdné, bude použit název počítače.",
|
||||
"LabelServerNameHelp": "Tento název bude použit k identifikaci serveru a bude výchozí pro název počítače serveru.",
|
||||
"LabelPasswordResetProvider": "Poskytovatel obnovy hesla:",
|
||||
"LabelServerName": "Název serveru:",
|
||||
"LabelTranscodePath": "Cesta pro překódování:",
|
||||
@@ -1439,16 +1439,16 @@
|
||||
"MessageNoCollectionsAvailable": "Kolekce vám umožní vychutnat si osobní seskupení filmů, seriálů a hudebních alb. Chcete-li je začít vytvářet, klikněte na tlačítko +.",
|
||||
"MessagePleaseWait": "Prosím, čekejte. Může to trvat několik minut.",
|
||||
"Metadata": "Metadata",
|
||||
"MovieLibraryHelp": "Podívejte se na {0}průvodce pojmenováním filmů Jellyfin{1}.",
|
||||
"MovieLibraryHelp": "Podívejte se na {0}průvodce pojmenováním filmů{1}.",
|
||||
"Never": "Nikdy",
|
||||
"NextUp": "Další",
|
||||
"NoNewDevicesFound": "Nebyla nalezena žádná nová zařízení. Chcete-li přidat nový tuner, zavřete tento dialog a zadejte informace o zařízení ručně.",
|
||||
"OnlyImageFormats": "Pouze obrazové formáty (VOBSUB, PGS, SUB/IDX, atd.)",
|
||||
"OnlyImageFormats": "Pouze obrazové formáty (VOBSUB, PGS, SUB, atd.)",
|
||||
"Option3D": "3D",
|
||||
"OptionAlbum": "Album",
|
||||
"OptionAllowMediaPlaybackTranscodingHelp": "Omezení přístupu k překódování může způsobit selhání přehrávání v aplikacích Jellyfin kvůli nepodporovaným formátům médií.",
|
||||
"OptionAllowSyncTranscoding": "Povolit stahování a synchronizaci médií, které vyžaduje překódování",
|
||||
"OptionBluray": "Bluray",
|
||||
"OptionBluray": "Blu-ray",
|
||||
"OptionCaptionInfoExSamsung": "CaptionInfoEx (Samsung)",
|
||||
"OptionDownloadBannerImage": "Banner",
|
||||
"OptionDownloadBoxImage": "Box",
|
||||
@@ -1456,7 +1456,7 @@
|
||||
"OptionIsHD": "HD",
|
||||
"OptionIsSD": "SD",
|
||||
"OptionLoginAttemptsBeforeLockout": "Určuje, kolik chybných pokusů o přihlášení lze provést před zablokováním.",
|
||||
"OptionLoginAttemptsBeforeLockoutHelp": "0 znamená zdědění výchozí hodnoty 3 pro non-admin a 5 pro admin, -1 deaktivuje uzamykání",
|
||||
"OptionLoginAttemptsBeforeLockoutHelp": "0 znamená zdědění výchozí hodnoty 3 pokusů pro běžné uživatele a 5 pro administrátory. Nastavení na -1 deaktivuje funkci.",
|
||||
"OptionMax": "Max",
|
||||
"OptionProfileAudio": "Audio",
|
||||
"OptionProfileVideo": "Video",
|
||||
@@ -1489,14 +1489,14 @@
|
||||
"Sort": "Třídit",
|
||||
"StatsForNerds": "Statistiky pro šprty",
|
||||
"SubtitleAppearanceSettingsAlsoPassedToCastDevices": "Tato nastavení platí také pro jakékoli přehrávání na Chromecastu spuštěné tímto zařízením.",
|
||||
"SubtitleAppearanceSettingsDisclaimer": "Tato nastavení se nevztahuje na grafické titulky (PGS, DVD atd.) nebo titulky, které mají vlastní vložené styly (ASS / SSA).",
|
||||
"SubtitleAppearanceSettingsDisclaimer": "Tato nastavení se nevztahuje na grafické titulky (PGS, DVD atd.) nebo ASS/SSA titulky, které mají vlastní vložené styly.",
|
||||
"SubtitleDownloadersHelp": "Povolte a zařaďte preferované stahovače titulků v pořadí podle priority.",
|
||||
"SubtitleSettings": "Nastavení titulků",
|
||||
"SubtitleSettingsIntro": "Chcete-li nastavit výchozí vzhled a jazyk titulků, zastavte přehrávání videa a klepněte na ikonu uživatele v pravé horní části aplikace.",
|
||||
"TV": "TV",
|
||||
"TabDirectPlay": "Přímé přehrávání",
|
||||
"TabInfo": "Info",
|
||||
"TabLiveTV": "Live TV",
|
||||
"TabLiveTV": "Živá TV",
|
||||
"TabMetadata": "Metadata",
|
||||
"TabPlaylist": "Playlist",
|
||||
"TabServer": "Server",
|
||||
@@ -1504,10 +1504,10 @@
|
||||
"ThemeSongs": "Tematická hudba",
|
||||
"ThemeVideos": "Tematická videa",
|
||||
"Trailers": "Trailery",
|
||||
"TvLibraryHelp": "Podívejte se na {0}průvodce pojmenováním TV Jellyfin{1}.",
|
||||
"TvLibraryHelp": "Podívejte se na {0}průvodce pojmenováním TV pořadů{1}.",
|
||||
"Uniform": "Uniformní",
|
||||
"Unplayed": "Nepřehrané",
|
||||
"UserAgentHelp": "V případě potřeby zadejte vlastní hlavičku user agenta http.",
|
||||
"UserAgentHelp": "Zadejte vlastní HTTP hlavičku user agenta.",
|
||||
"ValueMinutes": "{0} min",
|
||||
"ValueOneAlbum": "1 album",
|
||||
"ValueOneSong": "1 skladba",
|
||||
@@ -1518,8 +1518,8 @@
|
||||
"HeaderHome": "Domů",
|
||||
"DashboardOperatingSystem": "Operační systém: {0}",
|
||||
"DashboardArchitecture": "Architektura: {0}",
|
||||
"LaunchWebAppOnStartup": "Spusťte webovou aplikaci Jellyfin ve svém webovém prohlížeči po nastartování Jellyfin serveru",
|
||||
"LaunchWebAppOnStartupHelp": "Toto otevře se webovou aplikaci ve vašem výchozím webovém prohlížeči, když se spustí server Jellyfin. K tomu nedochází při použití funkce restartování serveru.",
|
||||
"LaunchWebAppOnStartup": "Spustit webové rozhraní po spustění serveru",
|
||||
"LaunchWebAppOnStartupHelp": "Otevře se webový klient ve vašem výchozím webovém prohlížeči, když server se spustí. K tomu nedochází při použití funkce restartování serveru.",
|
||||
"MessageNoServersAvailable": "Pomocí automatického zjišťování nebyly nalezeny žádné servery.",
|
||||
"OptionBanner": "Banner",
|
||||
"OptionList": "Seznam",
|
||||
@@ -1532,5 +1532,27 @@
|
||||
"MusicArtist": "Interpret",
|
||||
"MusicVideo": "Videoklip",
|
||||
"SubtitleOffset": "Nastavení titulků",
|
||||
"TabNetworking": "Vytváření sítí"
|
||||
"TabNetworking": "Vytváření sítí",
|
||||
"MusicLibraryHelp": "Prostudujte si {0}průvodce pojmenováním hudby{1}.",
|
||||
"MoreMediaInfo": "Informace o médiu",
|
||||
"LabelVideoBitrate": "Datový tok videa:",
|
||||
"LabelTranscodingProgress": "Průběh překódování:",
|
||||
"LabelTranscodingFramerate": "Snimková frekvence pro překódování:",
|
||||
"LabelSize": "Velikost:",
|
||||
"LabelPleaseRestart": "Změny se projeví až po ručním obnovení webového klienta.",
|
||||
"LabelPlayMethod": "Způsob přehrání:",
|
||||
"LabelPlayer": "Přehrávač:",
|
||||
"LabelFolder": "Složka:",
|
||||
"LabelBaseUrlHelp": "Zde můžete přidat vlastní podsložku aby bylo možné přistupovat na server z unikátnější adresy.",
|
||||
"LabelBaseUrl": "Výchozí URL:",
|
||||
"LabelBitrate": "Datový tok:",
|
||||
"LabelAudioSampleRate": "Vzorkovací frekvence zvuku:",
|
||||
"LabelAudioChannels": "Počet kanálů zvuku:",
|
||||
"LabelAudioBitrate": "Datový tok zvuku:",
|
||||
"LabelAudioBitDepth": "Bitová hloubka zvuku:",
|
||||
"HeaderFavoriteBooks": "Oblíbené knihy",
|
||||
"FetchingData": "Načtení dalších dat",
|
||||
"CopyStreamURLSuccess": "Úspěšně zkopírovaná URL.",
|
||||
"CopyStreamURL": "Kopírovat URL adresu streamu",
|
||||
"ButtonAddImage": "Přidat obrázek"
|
||||
}
|
||||
|
||||
+4
-1
@@ -509,5 +509,8 @@
|
||||
"Writer": "כותב",
|
||||
"Albums": "אלבומים",
|
||||
"Artists": "אמנים",
|
||||
"Books": "ספרים"
|
||||
"Books": "ספרים",
|
||||
"Absolute": "מוחלט",
|
||||
"AccessRestrictedTryAgainLater": "הגישה כרגע מוגבלת. אנא נסה שוב מאוחר יותר.",
|
||||
"AddedOnValue": "נוסף {0}"
|
||||
}
|
||||
|
||||
+6
-6
@@ -710,7 +710,7 @@
|
||||
"HeaderActivity": "Tevékenység",
|
||||
"HeaderAdditionalParts": "További részek",
|
||||
"HeaderAdmin": "Adminisztrátor",
|
||||
"HeaderAlbumArtists": "Album Előadók",
|
||||
"HeaderAlbumArtists": "Album előadók",
|
||||
"HeaderAlert": "Figyelem",
|
||||
"HeaderAllowMediaDeletionFrom": "Média törlés engedélyezése",
|
||||
"HeaderApiKey": "API Kulcs",
|
||||
@@ -1300,7 +1300,7 @@
|
||||
"MessageNoServersAvailable": "Az automatikus kiszolgálókeresés nem talált szervert.",
|
||||
"OptionLoginAttemptsBeforeLockout": "Meghatározza, hogy hány érvénytelen bejelentkezési kísérlet történhet zárolás előtt.",
|
||||
"TabNetworking": "Hálózat",
|
||||
"HeaderFavoriteArtists": "Kedvenc Előadók",
|
||||
"HeaderFavoriteArtists": "Kedvenc előadók",
|
||||
"SmallCaps": "Kiskapitális",
|
||||
"AllowOnTheFlySubtitleExtractionHelp": "A beágyazott feliratokat ki lehet távolítani a videókból és elküldeni a Jellyfin alkalmazásoknak sima szöveg formátumba, hogy ne legyen átkódolás. Néhány eszközön ez hosszú ideig is eltarthat, valamint a videó lejátszás megakadhat az eltávolítási folyamat futása közben. Ezt kikapcsolva a beágyazott feliratok videó átkódolással beégetésre kerülnek azon kliens eszközökre melyek nem támogatják a külső feliratokat.",
|
||||
"Art": "ClearArt",
|
||||
@@ -1321,10 +1321,10 @@
|
||||
"HeaderContinueListening": "Folyamatban lévő zenék",
|
||||
"HeaderDeleteTaskTrigger": "Feladatvezérlő törlése",
|
||||
"HeaderFavoriteMovies": "Kedvenc Filmek",
|
||||
"HeaderFavoriteShows": "Kedvenc Sorozatok",
|
||||
"HeaderFavoriteEpisodes": "Kedvenc Epizódok",
|
||||
"HeaderFavoriteAlbums": "Kedvenc Albumok",
|
||||
"HeaderFavoriteSongs": "Kedvenc Dalok",
|
||||
"HeaderFavoriteShows": "Kedvenc sorozatok",
|
||||
"HeaderFavoriteEpisodes": "Kedvenc epizódok",
|
||||
"HeaderFavoriteAlbums": "Kedvenc albumok",
|
||||
"HeaderFavoriteSongs": "Kedvenc dalok",
|
||||
"HeaderFavoriteVideos": "Kedvenc Videók",
|
||||
"HeaderGuideProviders": "TV műsorújság Szolgáltatók",
|
||||
"HeaderHome": "Kezdőlap",
|
||||
|
||||
+2
-1
@@ -1327,5 +1327,6 @@
|
||||
"LabelProfileVideoCodecs": "Video codecs:",
|
||||
"LabelProtocolInfo": "Protocol info:",
|
||||
"LabelServerName": "Server naam:",
|
||||
"LabelSkin": "Skin:"
|
||||
"LabelSkin": "Skin:",
|
||||
"ButtonAddImage": "Voeg afbeelding toe"
|
||||
}
|
||||
|
||||
+117
-1
@@ -439,5 +439,121 @@
|
||||
"EnableNextVideoInfoOverlay": "Oynatma sırasında bir sonraki video bilgisini göster",
|
||||
"EnablePhotosHelp": "Görüntüler diğer medya dosyalarıyla birlikte algılanacak ve gösterilecektir.",
|
||||
"EnableCinemaMode": "Sinema Modu",
|
||||
"EnableColorCodedBackgrounds": "Renk kodlu arka planlar"
|
||||
"EnableColorCodedBackgrounds": "Renk kodlu arka planlar",
|
||||
"HeaderGuideProviders": "TV Rehberi Veri Sağlayıcıları",
|
||||
"HeaderGenres": "Türler",
|
||||
"HeaderForgotPassword": "Parolanızı mı unuttunuz",
|
||||
"HeaderForKids": "Çocuklar için",
|
||||
"HeaderFetcherSettings": "Alıcı Ayarları",
|
||||
"HeaderFetchImages": "Görüntüleri Getir:",
|
||||
"HeaderFeatures": "Özellikleri",
|
||||
"HeaderFeatureAccess": "Özellik Erişimi",
|
||||
"HeaderFavoriteVideos": "Favori Videolar",
|
||||
"HeaderFavoriteMovies": "Favori Filmler",
|
||||
"HeaderFavoriteBooks": "favori kitaplar",
|
||||
"HeaderExternalIds": "Dış kimlikler:",
|
||||
"HeaderError": "Hata",
|
||||
"HeaderEpisodes": "Bölümler",
|
||||
"HeaderEnabledFieldsHelp": "Kilitlemek ve verilerinin değişmesini önlemek için bir alanın işaretini kaldırın.",
|
||||
"HeaderEnabledFields": "Etkin Alanlar",
|
||||
"HeaderEditImages": "Görüntüleri Düzenle",
|
||||
"HeaderDownloadSync": "İndir ve Eşitle",
|
||||
"HeaderDisplay": "Görüntüle",
|
||||
"HeaderDirectPlayProfileHelp": "Aygıtın yerel olarak hangi biçimlerde kullanılabileceğini göstermek için doğrudan oynatma profilleri ekleyin.",
|
||||
"HeaderDirectPlayProfile": "Doğrudan Oyun Profili",
|
||||
"HeaderDevices": "Cihazlar",
|
||||
"HeaderDeveloperInfo": "Geliştirici Bilgisi",
|
||||
"HeaderDetectMyDevices": "Cihazlarımı Algıla",
|
||||
"HeaderDeleteTaskTrigger": "Görev Tetikleyicisini Sil",
|
||||
"HeaderDeleteProvider": "Sağlayıcıyı Sil",
|
||||
"HeaderDeleteItems": "Ürünleri sil",
|
||||
"HeaderDeleteItem": "Öğeyi sil",
|
||||
"HeaderDeleteDevice": "Cihazı Sil",
|
||||
"HeaderDefaultRecordingSettings": "Varsayılan Kayıt Ayarları",
|
||||
"HeaderDateIssued": "Çıkış Tarihi",
|
||||
"HeaderContinueListening": "Dinlemeye Devam Et",
|
||||
"HeaderContainerProfileHelp": "Konteyner profilleri, belirli formatları oynatırken cihazın sınırlamalarını gösterir. Bir sınırlama uygulanırsa, format doğrudan oynatma için yapılandırılmış olsa bile ortam kodlanır.",
|
||||
"HeaderContainerProfile": "Konteyner Profili",
|
||||
"HeaderConnectionFailure": "Bağlantı hatası",
|
||||
"HeaderConnectToServer": "Sunucuya bağlan",
|
||||
"HeaderConfirmRevokeApiKey": "API Anahtarını İptal Et",
|
||||
"HeaderConfirmProfileDeletion": "Profil Silme İşlemini Onayla",
|
||||
"HeaderConfirmPluginInstallation": "Eklenti Yüklemesini Onayla",
|
||||
"HeaderConfigureRemoteAccess": "Uzaktan Erişimi Yapılandırma",
|
||||
"HeaderCodecProfileHelp": "Codec profilleri, belirli kodlayıcıları oynatırken cihazın sınırlamalarını gösterir. Eğer bir sınırlama uygulanırsa, kodeğin doğrudan oynaması için yapılandırılmış olsa bile, ortam kodlanır.",
|
||||
"HeaderChapterImages": "Bölüm Görüntüleri",
|
||||
"HeaderChannelAccess": "Kanal erişimi",
|
||||
"HeaderCastCrew": "Kast ekibi",
|
||||
"HeaderCastAndCrew": "Kast ekibi",
|
||||
"HeaderCancelSeries": "Serileri İptal Et",
|
||||
"HeaderCancelRecording": "Kaydı İptal Et",
|
||||
"HeaderBranding": "dağlama",
|
||||
"HeaderBooks": "Kitaplar",
|
||||
"HeaderBlockItemsWithNoRating": "Tanınmayan veya bilinmeyen derecelendirme bilgisine sahip öğeleri engelle:",
|
||||
"HeaderAudioSettings": "Ses ayarları",
|
||||
"HeaderAudioBooks": "Sesli Kitaplar",
|
||||
"HeaderAppearsOn": "Görünür",
|
||||
"HeaderApp": "Uygulama",
|
||||
"HeaderApiKeysHelp": "Jellyfin Server ile iletişim kurabilmek için harici uygulamaların bir API anahtarına sahip olmaları gerekir. Anahtarlar bir Jellyfin hesabıyla giriş yaparak veya uygulamaya manuel olarak bir anahtar vererek verilir.",
|
||||
"HeaderApiKeys": "API Anahtarları",
|
||||
"HeaderApiKey": "API Anahtarı",
|
||||
"HeaderAllowMediaDeletionFrom": "Medyadan Silinmeye İzin Ver",
|
||||
"HeaderAlert": "Alarm",
|
||||
"HeaderAlbums": "Albümler",
|
||||
"HeaderAdmin": "Yönetici",
|
||||
"HeaderAdditionalParts": "İlave parçalar",
|
||||
"HeaderAddUpdateImage": "Resim Ekle / Güncelle",
|
||||
"HeaderAddToPlaylist": "Oynatma listesine ekle",
|
||||
"HeaderAddToCollection": "Koleksiyona ekle",
|
||||
"HeaderAddScheduledTaskTrigger": "Tetikleyici ekle",
|
||||
"HeaderActivity": "Aktivite",
|
||||
"HeaderActiveDevices": "Aktif Cihazlar",
|
||||
"HeaderAccessScheduleHelp": "Belirli saatlerle erişimi sınırlamak için bir erişim programı oluşturun.",
|
||||
"HeaderAccessSchedule": "Erişim Takvimi",
|
||||
"HardwareAccelerationWarning": "Donanım ivmesini etkinleştirmek bazı ortamlarda dengesizliğe neden olabilir. İşletim sisteminizin ve video sürücülerinizin tamamen güncel olduğundan emin olun. Bunu etkinleştirdikten sonra video oynatmakta zorluk çekiyorsanız, ayarı tekrar Auto (Otomatik) olarak değiştirmeniz gerekecektir.",
|
||||
"HandledByProxy": "Ters proxy tarafından kullanılır",
|
||||
"HDPrograms": "HD programlar",
|
||||
"H264EncodingPresetHelp": "Performansı artırmak için daha hızlı bir değer veya kaliteyi artırmak için daha yavaş bir değer seçin.",
|
||||
"H264CrfHelp": "Sabit Hız Faktörü (CRF), x264 kodlayıcı için varsayılan kalite ayarıdır. Değerleri 0 ile 51 arasında ayarlayabilirsiniz, burada daha düşük değerler daha iyi kaliteyle sonuçlanır (daha yüksek dosya boyutları pahasına). Aklı başında değerleri 18 ila 28 arasındadır. X264 için varsayılan 23, bu nedenle bunu başlangıç noktası olarak kullanabilirsiniz.",
|
||||
"GuideProviderSelectListings": "İlan Seç",
|
||||
"GuideProviderLogin": "Oturum aç",
|
||||
"Guide": "Rehber",
|
||||
"GuestStar": "Konuk sanatçı",
|
||||
"GroupVersions": "Grup versiyonları",
|
||||
"GroupBySeries": "Seriye göre gruplandır",
|
||||
"GenresValue": "Türler: {0}",
|
||||
"GenreValue": "Tür: {0}",
|
||||
"General": "Genel",
|
||||
"Fullscreen": "Tam ekran",
|
||||
"FormatValue": "Biçim: {0}",
|
||||
"FolderTypeUnset": "Karışık içerik",
|
||||
"Filters": "Filtreler",
|
||||
"File": "Dosya",
|
||||
"FetchingData": "Ek veri alınıyor",
|
||||
"Features": "Özellikleri",
|
||||
"Favorite": "Favori",
|
||||
"FastForward": "İleri sar",
|
||||
"FFmpegSavePathNotFound": "Girdiğiniz yolu kullanarak FFmpeg'i bulamıyoruz. FFprobe da gereklidir ve aynı klasörde bulunmalıdır. Bu bileşenler normalde aynı indirmede birlikte paketlenmiştir. Lütfen yolu kontrol edip tekrar deneyin.",
|
||||
"Extras": "Ekstralar",
|
||||
"ExtractChapterImagesHelp": "Bölüm görüntülerini çıkarmak, müşterilerin grafiksel sahne seçim menülerini görüntülemesini sağlar. İşlem yavaş olabilir, kaynak yoğun olabilir ve birkaç gigabaytlık alan gerektirebilir. Videolar keşfedildiğinde ve ayrıca zamanlanmış bir görev olarak çalışır. Zamanlanmış, zamanlanmış görevler alanında yapılandırılabilir. Bu görevi yoğun kullanım saatlerinde yapmanız önerilmez.",
|
||||
"ExtraLarge": "Ekstra büyük",
|
||||
"ExitFullscreen": "Tam ekrandan çık",
|
||||
"EveryNDays": "Her {0} günde",
|
||||
"ErrorSavingTvProvider": "TV sağlayıcısını kaydederken bir hata oluştu. Lütfen erişilebilir olduğundan emin olun ve tekrar deneyin.",
|
||||
"ErrorPleaseSelectLineup": "Lütfen bir grup seçin ve tekrar deneyin. Hiç bir sıralama yoksa, lütfen kullanıcı adınızın, şifrenizin ve posta kodunuzun doğru olup olmadığını kontrol edin.",
|
||||
"ErrorMessageStartHourGreaterThanEnd": "Bitiş saati, başlangıç saatinden büyük olmalıdır.",
|
||||
"ErrorGettingTvLineups": "TV dizilimini indirirken bir hata oluştu. Lütfen bilgilerinizin doğru olduğundan emin olun ve tekrar deneyin.",
|
||||
"ErrorDeletingItem": "Öğe Jellyfin Sunucusundan silinirken bir hata oluştu. Lütfen Jellyfin Server'ın medya klasörüne yazma erişimi olup olmadığını kontrol edin ve tekrar deneyin.",
|
||||
"ErrorAddingXmlTvFile": "XmlTV dosyasına erişilirken bir hata oluştu. Lütfen dosyanın var olduğundan emin olun ve tekrar deneyin.",
|
||||
"ErrorAddingTunerDevice": "Tuner cihazı eklenirken bir hata oluştu. Lütfen erişilebilir olduğundan emin olun ve tekrar deneyin.",
|
||||
"ErrorAddingMediaPathToVirtualFolder": "Medya yolu eklenirken bir hata oluştu. Lütfen yolun geçerli olduğundan ve Jellyfin Server işleminin o konuma erişebildiğinden emin olun.",
|
||||
"ErrorAddingListingsToSchedulesDirect": "Dizilişi Schedules Direct hesabınıza eklerken bir hata oluştu. Schedules Direct, hesap başına yalnızca sınırlı sayıda kadroya izin verir. Devam etmeden önce Schedules Direct web sitesine giriş yapmanız ve başka girişleri hesabınızdan kaldırmanız gerekebilir.",
|
||||
"Episodes": "Bölümler",
|
||||
"EndsAtValue": "{0} konumundaki biter",
|
||||
"EnableThemeVideosHelp": "Kitaplığa göz atarken tema videoları arka planda oynatın.",
|
||||
"EnableThemeVideos": "Tema videoları",
|
||||
"EnableThemeSongsHelp": "Kitaplığa göz atarken tema şarkıları arka planda çalın.",
|
||||
"EnableThemeSongs": "Tema şarkıları",
|
||||
"EnableStreamLoopingHelp": "Canlı akışlar yalnızca birkaç saniye veri içeriyorsa ve sürekli istenmesi gerekiyorsa bunu etkinleştirin. Gerekmediğinde bunu etkinleştirmek sorunlara neden olabilir.",
|
||||
"EnableStreamLooping": "Otomatik döngü canlı akışları"
|
||||
}
|
||||
|
||||
+21
-10
@@ -1,5 +1,13 @@
|
||||
const path = require("path");
|
||||
const { CleanWebpackPlugin} = require("clean-webpack-plugin");
|
||||
const CopyPlugin = require("copy-webpack-plugin");
|
||||
const Assets = [
|
||||
"alameda/alameda.js",
|
||||
"requirejs/require.js",
|
||||
"libass-wasm/dist/subtitles-octopus-worker.js",
|
||||
"libass-wasm/dist/subtitles-octopus-worker.data",
|
||||
"libass-wasm/dist/subtitles-octopus-worker.wasm"
|
||||
];
|
||||
|
||||
module.exports = {
|
||||
context: path.resolve(__dirname, "src"),
|
||||
@@ -10,15 +18,18 @@ module.exports = {
|
||||
]
|
||||
},
|
||||
plugins: [
|
||||
new CopyPlugin([
|
||||
{
|
||||
from: "**/*",
|
||||
to: "."
|
||||
},
|
||||
{
|
||||
context: path.resolve(__dirname),
|
||||
from: "node_modules/libass-wasm/dist/subtitles-octopus-worker.*",
|
||||
}
|
||||
])
|
||||
new CleanWebpackPlugin(),
|
||||
new CopyPlugin([{
|
||||
from: "**/*",
|
||||
to: "."
|
||||
}]),
|
||||
new CopyPlugin(
|
||||
Assets.map(asset => {
|
||||
return {
|
||||
from: path.resolve(__dirname, `./node_modules/${asset}`),
|
||||
to: path.resolve(__dirname, './dist/libraries')
|
||||
};
|
||||
})
|
||||
)
|
||||
]
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user