mirror of
https://github.com/jellyfin/jellyfin-web
synced 2025-03-30 19:56:21 +00:00
First separation commit.
Added LICENSE, README.md, CONTRIBUTORS.md
This commit is contained in:
parent
09513af31b
commit
4678528d00
657 changed files with 422 additions and 0 deletions
9
src/dashboard/aboutpage.js
Normal file
9
src/dashboard/aboutpage.js
Normal file
|
@ -0,0 +1,9 @@
|
|||
define([], function() {
|
||||
"use strict";
|
||||
return function(view, params) {
|
||||
view.addEventListener("viewbeforeshow", function(e) {
|
||||
var elem = view.querySelector("#appVersionNumber");
|
||||
elem.innerHTML = elem.innerHTML.replace("{0}", ConnectionManager.appVersion())
|
||||
})
|
||||
}
|
||||
});
|
51
src/dashboard/dashboardgeneral.js
Normal file
51
src/dashboard/dashboardgeneral.js
Normal file
|
@ -0,0 +1,51 @@
|
|||
define(["jQuery", "loading", "fnchecked", "emby-checkbox", "emby-textarea", "emby-input", "emby-select", "emby-linkbutton"], function($, loading) {
|
||||
"use strict";
|
||||
|
||||
function loadPage(page, config, languageOptions, systemInfo) {
|
||||
systemInfo.CanLaunchWebBrowser ? page.querySelector("#fldRunWebAppAtStartup").classList.remove("hide") : page.querySelector("#fldRunWebAppAtStartup").classList.add("hide"), page.querySelector("#txtCachePath").value = config.CachePath || "", $("#selectLocalizationLanguage", page).html(languageOptions.map(function(l) {
|
||||
return '<option value="' + l.Value + '">' + l.Name + "</option>"
|
||||
})).val(config.UICulture), currentLanguage = config.UICulture, systemInfo.CanSelfUpdate ? page.querySelector(".fldAutomaticUpdates").classList.remove("hide") : page.querySelector(".fldAutomaticUpdates").classList.add("hide"), $("#chkEnableAutomaticServerUpdates", page).checked(config.EnableAutoUpdate), $("#chkEnableAutomaticRestart", page).checked(config.EnableAutomaticRestart), systemInfo.CanSelfRestart ? page.querySelector("#fldEnableAutomaticRestart").classList.remove("hide") : page.querySelector("#fldEnableAutomaticRestart").classList.add("hide"), systemInfo.CanSelfRestart || systemInfo.CanSelfUpdate ? $(".autoUpdatesContainer", page).removeClass("hide") : $(".autoUpdatesContainer", page).addClass("hide"), loading.hide()
|
||||
}
|
||||
|
||||
function onSubmit() {
|
||||
loading.show();
|
||||
var form = this;
|
||||
$(form).parents(".page");
|
||||
return ApiClient.getServerConfiguration().then(function(config) {
|
||||
config.UICulture = $("#selectLocalizationLanguage", form).val(), config.CachePath = form.querySelector("#txtCachePath").value;
|
||||
var requiresReload = !1;
|
||||
config.UICulture !== currentLanguage && (requiresReload = !0), config.EnableAutomaticRestart = $("#chkEnableAutomaticRestart", form).checked(), config.EnableAutoUpdate = $("#chkEnableAutomaticServerUpdates", form).checked(), ApiClient.updateServerConfiguration(config).then(function() {
|
||||
ApiClient.getNamedConfiguration(brandingConfigKey).then(function(brandingConfig) {
|
||||
brandingConfig.LoginDisclaimer = form.querySelector("#txtLoginDisclaimer").value, brandingConfig.CustomCss = form.querySelector("#txtCustomCss").value, currentBrandingOptions && brandingConfig.CustomCss !== currentBrandingOptions.CustomCss && (requiresReload = !0), ApiClient.updateNamedConfiguration(brandingConfigKey, brandingConfig).then(function() {
|
||||
Dashboard.processServerConfigurationUpdateResult(), requiresReload && !AppInfo.isNativeApp && window.location.reload(!0)
|
||||
})
|
||||
})
|
||||
})
|
||||
}), !1
|
||||
}
|
||||
var currentBrandingOptions, currentLanguage, brandingConfigKey = "branding";
|
||||
return function(view, params) {
|
||||
$("#btnSelectCachePath", view).on("click.selectDirectory", function() {
|
||||
require(["directorybrowser"], function(directoryBrowser) {
|
||||
var picker = new directoryBrowser;
|
||||
picker.show({
|
||||
callback: function(path) {
|
||||
path && (view.querySelector("#txtCachePath").value = path), picker.close()
|
||||
},
|
||||
validateWriteable: !0,
|
||||
header: Globalize.translate("HeaderSelectServerCachePath"),
|
||||
instruction: Globalize.translate("HeaderSelectServerCachePathHelp")
|
||||
})
|
||||
})
|
||||
}), $(".dashboardGeneralForm", view).off("submit", onSubmit).on("submit", onSubmit), view.addEventListener("viewshow", function() {
|
||||
var promise1 = ApiClient.getServerConfiguration(),
|
||||
promise2 = ApiClient.getJSON(ApiClient.getUrl("Localization/Options")),
|
||||
promise3 = ApiClient.getSystemInfo();
|
||||
Promise.all([promise1, promise2, promise3]).then(function(responses) {
|
||||
loadPage(view, responses[0], responses[1], responses[2])
|
||||
}), ApiClient.getNamedConfiguration(brandingConfigKey).then(function(config) {
|
||||
currentBrandingOptions = config, view.querySelector("#txtLoginDisclaimer").value = config.LoginDisclaimer || "", view.querySelector("#txtCustomCss").value = config.CustomCss || ""
|
||||
})
|
||||
})
|
||||
}
|
||||
});
|
105
src/dashboard/dashboardhosting.js
Normal file
105
src/dashboard/dashboardhosting.js
Normal file
|
@ -0,0 +1,105 @@
|
|||
define(["loading", "libraryMenu", "globalize", "emby-checkbox", "emby-select"], function(loading, libraryMenu, globalize) {
|
||||
"use strict";
|
||||
|
||||
function onSubmit(e) {
|
||||
var form = this,
|
||||
localAddress = form.querySelector("#txtLocalAddress").value,
|
||||
enableUpnp = form.querySelector("#chkEnableUpnp").checked;
|
||||
confirmSelections(localAddress, enableUpnp, function() {
|
||||
var validationResult = getValidationAlert(form);
|
||||
if (validationResult) return void alertText(validationResult);
|
||||
validateHttps(form).then(function() {
|
||||
loading.show(), ApiClient.getServerConfiguration().then(function(config) {
|
||||
config.LocalNetworkSubnets = form.querySelector("#txtLanNetworks").value.split(",").map(function(s) {
|
||||
return s.trim()
|
||||
}).filter(function(s) {
|
||||
return s.length > 0
|
||||
}), config.RemoteIPFilter = form.querySelector("#txtExternalAddressFilter").value.split(",").map(function(s) {
|
||||
return s.trim()
|
||||
}).filter(function(s) {
|
||||
return s.length > 0
|
||||
}), config.IsRemoteIPFilterBlacklist = "blacklist" === form.querySelector("#selectExternalAddressFilterMode").value, config.PublicPort = form.querySelector("#txtPublicPort").value, config.PublicHttpsPort = form.querySelector("#txtPublicHttpsPort").value;
|
||||
var httpsMode = form.querySelector("#selectHttpsMode").value;
|
||||
"proxy" === httpsMode ? (config.EnableHttps = !0, config.RequireHttps = !1, config.IsBehindProxy = !0) : "required" === httpsMode ? (config.EnableHttps = !0, config.RequireHttps = !0, config.IsBehindProxy = !1) : "enabled" === httpsMode ? (config.EnableHttps = !0, config.RequireHttps = !1, config.IsBehindProxy = !1) : (config.EnableHttps = !1, config.RequireHttps = !1, config.IsBehindProxy = !1), config.HttpsPortNumber = form.querySelector("#txtHttpsPort").value, config.HttpServerPortNumber = form.querySelector("#txtPortNumber").value, config.EnableUPnP = enableUpnp, config.WanDdns = form.querySelector("#txtDdns").value, config.EnableRemoteAccess = form.querySelector("#chkRemoteAccess").checked, config.CertificatePath = form.querySelector("#txtCertificatePath").value || null, config.CertificatePassword = form.querySelector("#txtCertPassword").value || null, config.LocalNetworkAddresses = localAddress ? [localAddress] : [], ApiClient.updateServerConfiguration(config).then(Dashboard.processServerConfigurationUpdateResult, Dashboard.processErrorResponse)
|
||||
})
|
||||
})
|
||||
}), e.preventDefault()
|
||||
}
|
||||
|
||||
function triggerChange(select) {
|
||||
var evt = document.createEvent("HTMLEvents");
|
||||
evt.initEvent("change", !1, !0), select.dispatchEvent(evt)
|
||||
}
|
||||
|
||||
function getValidationAlert(form) {
|
||||
return form.querySelector("#txtPublicPort").value === form.querySelector("#txtPublicHttpsPort").value ? "The public http and https ports must be different." : form.querySelector("#txtPortNumber").value === form.querySelector("#txtHttpsPort").value ? "The http and https ports must be different." : null
|
||||
}
|
||||
|
||||
function validateHttps(form) {
|
||||
var certPath = form.querySelector("#txtCertificatePath").value || null,
|
||||
httpsMode = form.querySelector("#selectHttpsMode").value;
|
||||
return "enabled" !== httpsMode && "required" !== httpsMode || certPath ? Promise.resolve() : new Promise(function(resolve, reject) {
|
||||
return alertText({
|
||||
title: globalize.translate("TitleHostingSettings"),
|
||||
text: globalize.translate("HttpsRequiresCert")
|
||||
}).then(reject, reject)
|
||||
})
|
||||
}
|
||||
|
||||
function alertText(options) {
|
||||
return new Promise(function(resolve, reject) {
|
||||
require(["alert"], function(alert) {
|
||||
alert(options).then(resolve, reject)
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
function confirmSelections(localAddress, enableUpnp, callback) {
|
||||
localAddress || !enableUpnp ? alertText({
|
||||
title: globalize.translate("TitleHostingSettings"),
|
||||
text: globalize.translate("SettingsWarning")
|
||||
}).then(callback) : callback()
|
||||
}
|
||||
|
||||
function getTabs() {
|
||||
return [{
|
||||
href: "dashboardhosting.html",
|
||||
name: globalize.translate("TabHosting")
|
||||
}, {
|
||||
href: "serversecurity.html",
|
||||
name: globalize.translate("TabSecurity")
|
||||
}]
|
||||
}
|
||||
return function(view, params) {
|
||||
function loadPage(page, config) {
|
||||
page.querySelector("#txtPortNumber").value = config.HttpServerPortNumber, page.querySelector("#txtPublicPort").value = config.PublicPort, page.querySelector("#txtPublicHttpsPort").value = config.PublicHttpsPort, page.querySelector("#txtLocalAddress").value = config.LocalNetworkAddresses[0] || "", page.querySelector("#txtLanNetworks").value = (config.LocalNetworkSubnets || []).join(", "), page.querySelector("#txtExternalAddressFilter").value = (config.RemoteIPFilter || []).join(", "), page.querySelector("#selectExternalAddressFilterMode").value = config.IsRemoteIPFilterBlacklist ? "blacklist" : "whitelist", page.querySelector("#chkRemoteAccess").checked = null == config.EnableRemoteAccess || config.EnableRemoteAccess;
|
||||
var selectHttpsMode = page.querySelector("#selectHttpsMode");
|
||||
config.IsBehindProxy ? selectHttpsMode.value = "proxy" : config.RequireHttps ? selectHttpsMode.value = "required" : config.EnableHttps ? selectHttpsMode.value = "enabled" : selectHttpsMode.value = "disabled", page.querySelector("#txtHttpsPort").value = config.HttpsPortNumber, page.querySelector("#txtDdns").value = config.WanDdns || "";
|
||||
var txtCertificatePath = page.querySelector("#txtCertificatePath");
|
||||
txtCertificatePath.value = config.CertificatePath || "", page.querySelector("#txtCertPassword").value = config.CertificatePassword || "", page.querySelector("#chkEnableUpnp").checked = config.EnableUPnP, onCertPathChange.call(txtCertificatePath), triggerChange(page.querySelector("#chkRemoteAccess")), loading.hide()
|
||||
}
|
||||
|
||||
function onCertPathChange() {
|
||||
this.value ? view.querySelector("#txtDdns").setAttribute("required", "required") : view.querySelector("#txtDdns").removeAttribute("required")
|
||||
}
|
||||
view.querySelector("#chkRemoteAccess").addEventListener("change", function() {
|
||||
this.checked ? (view.querySelector(".fldExternalAddressFilter").classList.remove("hide"), view.querySelector(".fldExternalAddressFilterMode").classList.remove("hide"), view.querySelector(".fldPublicPort").classList.remove("hide"), view.querySelector(".fldPublicHttpsPort").classList.remove("hide"), view.querySelector(".fldDdns").classList.remove("hide"), view.querySelector(".fldCertificatePath").classList.remove("hide"), view.querySelector(".fldCertPassword").classList.remove("hide"), view.querySelector(".fldHttpsMode").classList.remove("hide"), view.querySelector(".fldEnableUpnp").classList.remove("hide")) : (view.querySelector(".fldExternalAddressFilter").classList.add("hide"), view.querySelector(".fldExternalAddressFilterMode").classList.add("hide"), view.querySelector(".fldPublicPort").classList.add("hide"), view.querySelector(".fldPublicHttpsPort").classList.add("hide"), view.querySelector(".fldDdns").classList.add("hide"), view.querySelector(".fldCertificatePath").classList.add("hide"), view.querySelector(".fldCertPassword").classList.add("hide"), view.querySelector(".fldHttpsMode").classList.add("hide"), view.querySelector(".fldEnableUpnp").classList.add("hide"))
|
||||
}), view.querySelector("#btnSelectCertPath").addEventListener("click", function() {
|
||||
require(["directorybrowser"], function(directoryBrowser) {
|
||||
var picker = new directoryBrowser;
|
||||
picker.show({
|
||||
includeFiles: !0,
|
||||
includeDirectories: !0,
|
||||
callback: function(path) {
|
||||
path && (view.querySelector("#txtCertificatePath").value = path), picker.close()
|
||||
},
|
||||
header: globalize.translate("HeaderSelectCertificatePath")
|
||||
})
|
||||
})
|
||||
}), view.querySelector(".dashboardHostingForm").addEventListener("submit", onSubmit), view.querySelector("#txtCertificatePath").addEventListener("change", onCertPathChange), view.addEventListener("viewshow", function(e) {
|
||||
libraryMenu.setTabs("adminadvanced", 0, getTabs), loading.show(), ApiClient.getServerConfiguration().then(function(config) {
|
||||
loadPage(view, config)
|
||||
})
|
||||
})
|
||||
}
|
||||
});
|
40
src/dashboard/devicesupload.js
Normal file
40
src/dashboard/devicesupload.js
Normal file
|
@ -0,0 +1,40 @@
|
|||
define(["jQuery", "loading", "libraryMenu", "fnchecked"], function($, loading, libraryMenu) {
|
||||
"use strict";
|
||||
|
||||
function load(page, config) {
|
||||
$("#txtUploadPath", page).val(config.CameraUploadPath || ""), $("#chkSubfolder", page).checked(config.EnableCameraUploadSubfolders)
|
||||
}
|
||||
|
||||
function loadData(page) {
|
||||
loading.show(), ApiClient.getNamedConfiguration("devices").then(function(config) {
|
||||
load(page, config), loading.hide()
|
||||
})
|
||||
}
|
||||
|
||||
function save(page) {
|
||||
ApiClient.getNamedConfiguration("devices").then(function(config) {
|
||||
config.CameraUploadPath = $("#txtUploadPath", page).val(), config.EnableCameraUploadSubfolders = $("#chkSubfolder", page).checked(), ApiClient.updateNamedConfiguration("devices", config).then(Dashboard.processServerConfigurationUpdateResult)
|
||||
})
|
||||
}
|
||||
|
||||
function onSubmit() {
|
||||
return save($(this).parents(".page")), !1
|
||||
}
|
||||
$(document).on("pageinit", "#devicesUploadPage", function() {
|
||||
var page = this;
|
||||
$("#btnSelectUploadPath", page).on("click.selectDirectory", function() {
|
||||
require(["directorybrowser"], function(directoryBrowser) {
|
||||
var picker = new directoryBrowser;
|
||||
picker.show({
|
||||
callback: function(path) {
|
||||
path && $("#txtUploadPath", page).val(path), picker.close()
|
||||
},
|
||||
validateWriteable: !0,
|
||||
header: Globalize.translate("HeaderSelectUploadPath")
|
||||
})
|
||||
})
|
||||
}), $(".devicesUploadForm").off("submit", onSubmit).on("submit", onSubmit)
|
||||
}).on("pageshow", "#devicesUploadPage", function() {
|
||||
loadData(this)
|
||||
})
|
||||
});
|
38
src/dashboard/librarydisplay.js
Normal file
38
src/dashboard/librarydisplay.js
Normal file
|
@ -0,0 +1,38 @@
|
|||
define(["globalize", "loading", "libraryMenu", "emby-checkbox", "emby-button", "emby-linkbutton"], function(globalize, loading, libraryMenu) {
|
||||
"use strict";
|
||||
|
||||
function getTabs() {
|
||||
return [{
|
||||
href: "library.html",
|
||||
name: Globalize.translate("HeaderLibraries")
|
||||
}, {
|
||||
href: "librarydisplay.html",
|
||||
name: Globalize.translate("TabDisplay")
|
||||
}, {
|
||||
href: "metadataimages.html",
|
||||
name: Globalize.translate("TabMetadata")
|
||||
}, {
|
||||
href: "metadatanfo.html",
|
||||
name: Globalize.translate("TabNfoSettings")
|
||||
}, {
|
||||
href: "librarysettings.html",
|
||||
name: Globalize.translate("TabAdvanced")
|
||||
}]
|
||||
}
|
||||
return function(view, params) {
|
||||
function loadData() {
|
||||
ApiClient.getServerConfiguration().then(function(config) {
|
||||
view.querySelector(".chkFolderView").checked = config.EnableFolderView, view.querySelector(".chkGroupMoviesIntoCollections").checked = config.EnableGroupingIntoCollections, view.querySelector(".chkDisplaySpecialsWithinSeasons").checked = config.DisplaySpecialsWithinSeasons, view.querySelector(".chkExternalContentInSuggestions").checked = config.EnableExternalContentInSuggestions
|
||||
})
|
||||
}
|
||||
view.querySelector("form").addEventListener("submit", function(e) {
|
||||
loading.show();
|
||||
var form = this;
|
||||
return ApiClient.getServerConfiguration().then(function(config) {
|
||||
config.EnableFolderView = form.querySelector(".chkFolderView").checked, config.EnableGroupingIntoCollections = form.querySelector(".chkGroupMoviesIntoCollections").checked, config.DisplaySpecialsWithinSeasons = form.querySelector(".chkDisplaySpecialsWithinSeasons").checked, config.EnableExternalContentInSuggestions = form.querySelector(".chkExternalContentInSuggestions").checked, ApiClient.updateServerConfiguration(config).then(Dashboard.processServerConfigurationUpdateResult)
|
||||
}), e.preventDefault(), !1
|
||||
}), view.addEventListener("viewshow", function() {
|
||||
libraryMenu.setTabs("librarysetup", 1, getTabs), loadData()
|
||||
})
|
||||
}
|
||||
});
|
94
src/dashboard/librarysettings.js
Normal file
94
src/dashboard/librarysettings.js
Normal file
|
@ -0,0 +1,94 @@
|
|||
define(["jQuery", "loading", "libraryMenu", "fnchecked", "emby-checkbox", "emby-linkbutton"], function($, loading, libraryMenu) {
|
||||
"use strict";
|
||||
|
||||
function loadPage(page, config) {
|
||||
config.MergeMetadataAndImagesByName ? $(".fldImagesByName", page).hide() : $(".fldImagesByName", page).show(), $("#chkSaveMetadataHidden", page).checked(config.SaveMetadataHidden), $("#txtMetadataPath", page).val(config.MetadataPath || ""), $("#txtMetadataNetworkPath", page).val(config.MetadataNetworkPath || ""), loading.hide()
|
||||
}
|
||||
|
||||
function loadMetadataConfig(page, config) {
|
||||
$("#selectDateAdded", page).val(config.UseFileCreationTimeForDateAdded ? "1" : "0")
|
||||
}
|
||||
|
||||
function loadFanartConfig(page, config) {
|
||||
$("#txtFanartApiKey", page).val(config.UserApiKey || "")
|
||||
}
|
||||
|
||||
function saveFanart(form) {
|
||||
ApiClient.getNamedConfiguration("fanart").then(function(config) {
|
||||
config.UserApiKey = $("#txtFanartApiKey", form).val(), ApiClient.updateNamedConfiguration("fanart", config)
|
||||
})
|
||||
}
|
||||
|
||||
function saveMetadata(form) {
|
||||
ApiClient.getNamedConfiguration("metadata").then(function(config) {
|
||||
config.UseFileCreationTimeForDateAdded = "1" === $("#selectDateAdded", form).val(), ApiClient.updateNamedConfiguration("metadata", config)
|
||||
})
|
||||
}
|
||||
|
||||
function alertText(options) {
|
||||
require(["alert"], function(alert) {
|
||||
alert(options)
|
||||
})
|
||||
}
|
||||
|
||||
function onSubmitFail(response) {
|
||||
loading.hide(), response && 404 === response.status ? alertText("The metadata path entered could not be found. Please ensure the path is valid and try again.") : response && 500 === response.status && alertText("The metadata path entered is not valid. Please ensure the path exists and that Jellyfin server has write access to the folder.")
|
||||
}
|
||||
|
||||
function onSubmit() {
|
||||
loading.show();
|
||||
var form = this;
|
||||
return ApiClient.getServerConfiguration().then(function(config) {
|
||||
config.SaveMetadataHidden = $("#chkSaveMetadataHidden", form).checked(), config.EnableTvDbUpdates = $("#chkEnableTvdbUpdates", form).checked(), config.EnableTmdbUpdates = $("#chkEnableTmdbUpdates", form).checked(), config.EnableFanArtUpdates = $("#chkEnableFanartUpdates", form).checked(), config.MetadataPath = $("#txtMetadataPath", form).val(), config.MetadataNetworkPath = $("#txtMetadataNetworkPath", form).val(), config.FanartApiKey = $("#txtFanartApiKey", form).val(), ApiClient.updateServerConfiguration(config).then(Dashboard.processServerConfigurationUpdateResult, onSubmitFail)
|
||||
}), saveMetadata(form), saveFanart(form), !1
|
||||
}
|
||||
|
||||
function getTabs() {
|
||||
return [{
|
||||
href: "library.html",
|
||||
name: Globalize.translate("HeaderLibraries")
|
||||
}, {
|
||||
href: "librarydisplay.html",
|
||||
name: Globalize.translate("TabDisplay")
|
||||
}, {
|
||||
href: "metadataimages.html",
|
||||
name: Globalize.translate("TabMetadata")
|
||||
}, {
|
||||
href: "metadatanfo.html",
|
||||
name: Globalize.translate("TabNfoSettings")
|
||||
}, {
|
||||
href: "librarysettings.html",
|
||||
name: Globalize.translate("TabAdvanced")
|
||||
}]
|
||||
}
|
||||
return function(view, params) {
|
||||
$("#btnSelectMetadataPath", view).on("click.selectDirectory", function() {
|
||||
require(["directorybrowser"], function(directoryBrowser) {
|
||||
var picker = new directoryBrowser;
|
||||
picker.show({
|
||||
path: $("#txtMetadataPath", view).val(),
|
||||
networkSharePath: $("#txtMetadataNetworkPath", view).val(),
|
||||
callback: function(path, networkPath) {
|
||||
path && ($("#txtMetadataPath", view).val(path), $("#txtMetadataNetworkPath", view).val(networkPath)), picker.close()
|
||||
},
|
||||
validateWriteable: !0,
|
||||
header: Globalize.translate("HeaderSelectMetadataPath"),
|
||||
instruction: Globalize.translate("HeaderSelectMetadataPathHelp"),
|
||||
enableNetworkSharePath: !0
|
||||
})
|
||||
})
|
||||
}), $(".librarySettingsForm").off("submit", onSubmit).on("submit", onSubmit), view.addEventListener("viewshow", function() {
|
||||
libraryMenu.setTabs("librarysetup", 4, getTabs), loading.show();
|
||||
var page = this;
|
||||
ApiClient.getServerConfiguration().then(function(config) {
|
||||
loadPage(page, config)
|
||||
}), ApiClient.getNamedConfiguration("metadata").then(function(metadata) {
|
||||
loadMetadataConfig(page, metadata)
|
||||
}), ApiClient.getNamedConfiguration("fanart").then(function(metadata) {
|
||||
loadFanartConfig(page, metadata)
|
||||
}), ApiClient.getSystemInfo().then(function(info) {
|
||||
"Windows" === info.OperatingSystem ? page.querySelector(".fldSaveMetadataHidden").classList.remove("hide") : page.querySelector(".fldSaveMetadataHidden").classList.add("hide")
|
||||
})
|
||||
})
|
||||
}
|
||||
});
|
128
src/dashboard/livetvtuner.js
Normal file
128
src/dashboard/livetvtuner.js
Normal file
|
@ -0,0 +1,128 @@
|
|||
define(["globalize", "loading", "libraryMenu", "dom", "emby-input", "emby-button", "emby-checkbox", "emby-select"], function(globalize, loading, libraryMenu, dom) {
|
||||
"use strict";
|
||||
|
||||
function isM3uVariant(type) {
|
||||
return -1 !== ["nextpvr"].indexOf(type || "")
|
||||
}
|
||||
|
||||
function fillTypes(view, currentId) {
|
||||
return ApiClient.getJSON(ApiClient.getUrl("LiveTv/TunerHosts/Types")).then(function(types) {
|
||||
var selectType = view.querySelector(".selectType");
|
||||
selectType.innerHTML = types.map(function(t) {
|
||||
return '<option value="' + t.Id + '">' + t.Name + "</option>"
|
||||
}).join("") + '<option value="other">' + globalize.translate("TabOther") + "</option>", selectType.disabled = null != currentId, selectType.value = "", onTypeChange.call(selectType)
|
||||
})
|
||||
}
|
||||
|
||||
function reload(view, providerId) {
|
||||
view.querySelector(".txtDevicePath").value = "", view.querySelector(".chkFavorite").checked = !1, view.querySelector(".txtDevicePath").value = "", providerId && ApiClient.getNamedConfiguration("livetv").then(function(config) {
|
||||
var info = config.TunerHosts.filter(function(i) {
|
||||
return i.Id === providerId
|
||||
})[0];
|
||||
fillTunerHostInfo(view, info)
|
||||
})
|
||||
}
|
||||
|
||||
function fillTunerHostInfo(view, info) {
|
||||
var selectType = view.querySelector(".selectType"),
|
||||
type = info.Type || "";
|
||||
info.Source && isM3uVariant(info.Source) && (type = info.Source), selectType.value = type, onTypeChange.call(selectType), view.querySelector(".txtDevicePath").value = info.Url || "", view.querySelector(".txtFriendlyName").value = info.FriendlyName || "", view.querySelector(".txtUserAgent").value = info.UserAgent || "", view.querySelector(".fldDeviceId").value = info.DeviceId || "", view.querySelector(".chkFavorite").checked = info.ImportFavoritesOnly, view.querySelector(".chkTranscode").checked = info.AllowHWTranscoding, view.querySelector(".chkStreamLoop").checked = info.EnableStreamLooping, view.querySelector(".txtTunerCount").value = info.TunerCount || "0"
|
||||
}
|
||||
|
||||
function submitForm(page) {
|
||||
loading.show();
|
||||
var info = {
|
||||
Type: page.querySelector(".selectType").value,
|
||||
Url: page.querySelector(".txtDevicePath").value || null,
|
||||
UserAgent: page.querySelector(".txtUserAgent").value || null,
|
||||
FriendlyName: page.querySelector(".txtFriendlyName").value || null,
|
||||
DeviceId: page.querySelector(".fldDeviceId").value || null,
|
||||
TunerCount: page.querySelector(".txtTunerCount").value || 0,
|
||||
ImportFavoritesOnly: page.querySelector(".chkFavorite").checked,
|
||||
AllowHWTranscoding: page.querySelector(".chkTranscode").checked,
|
||||
EnableStreamLooping: page.querySelector(".chkStreamLoop").checked
|
||||
};
|
||||
isM3uVariant(info.Type) && (info.Source = info.Type, info.Type = "m3u");
|
||||
var id = getParameterByName("id");
|
||||
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({
|
||||
message: globalize.translate("ErrorSavingTvProvider")
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
function getRequirePromise(deps) {
|
||||
return new Promise(function(resolve, reject) {
|
||||
require(deps, resolve)
|
||||
})
|
||||
}
|
||||
|
||||
function getDetectedDevice() {
|
||||
return getRequirePromise(["tunerPicker"]).then(function(tunerPicker) {
|
||||
return (new tunerPicker).show({
|
||||
serverId: ApiClient.serverId()
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
function getTabs() {
|
||||
return [{
|
||||
href: "livetvstatus.html",
|
||||
name: globalize.translate("TabDevices")
|
||||
}, {
|
||||
href: "appservices.html?context=livetv",
|
||||
name: globalize.translate("TabServices")
|
||||
}]
|
||||
}
|
||||
|
||||
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(".otherOptionsMessage").classList.add("hide")) : (view.querySelector(".button-submit").classList.add("hide"), view.querySelector(".otherOptionsMessage").classList.remove("hide"))
|
||||
}
|
||||
return function(view, params) {
|
||||
params.id || view.querySelector(".btnDetect").classList.remove("hide"), view.addEventListener("viewshow", function() {
|
||||
libraryMenu.setTabs("livetvadmin", 0, getTabs);
|
||||
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;
|
||||
picker.show({
|
||||
includeFiles: !0,
|
||||
callback: function(path) {
|
||||
path && (view.querySelector(".txtDevicePath").value = path), picker.close()
|
||||
}
|
||||
})
|
||||
})
|
||||
})
|
||||
}
|
||||
});
|
29
src/dashboard/logpage.js
Normal file
29
src/dashboard/logpage.js
Normal file
|
@ -0,0 +1,29 @@
|
|||
define(["datetime", "loading", "apphost", "listViewStyle", "emby-linkbutton", "flexStyles"], function(datetime, loading, appHost) {
|
||||
"use strict";
|
||||
return function(view, params) {
|
||||
view.querySelector("#chkDebugLog").addEventListener("change", function() {
|
||||
ApiClient.getServerConfiguration().then(function(config) {
|
||||
config.EnableDebugLevelLogging = view.querySelector("#chkDebugLog").checked, ApiClient.updateServerConfiguration(config)
|
||||
})
|
||||
}), view.addEventListener("viewbeforeshow", function() {
|
||||
loading.show();
|
||||
var apiClient = ApiClient;
|
||||
apiClient.getJSON(apiClient.getUrl("System/Logs")).then(function(logs) {
|
||||
var html = "";
|
||||
html += '<div class="paperList">', html += logs.map(function(log) {
|
||||
var logUrl = apiClient.getUrl("System/Logs/Log", {
|
||||
name: log.Name
|
||||
});
|
||||
logUrl += "&api_key=" + apiClient.accessToken();
|
||||
var logHtml = "";
|
||||
logHtml += '<a is="emby-linkbutton" href="' + logUrl + '" target="_blank" class="listItem listItem-border" style="color:inherit;">', logHtml += '<div class="listItemBody two-line">', logHtml += "<h3 class='listItemBodyText'>" + log.Name + "</h3>";
|
||||
var date = datetime.parseISO8601Date(log.DateModified, !0),
|
||||
text = datetime.toLocaleDateString(date);
|
||||
return text += " " + datetime.getDisplayTime(date), logHtml += '<div class="listItemBodyText secondary">' + text + "</div>", logHtml += "</div>", logHtml += "</a>"
|
||||
}).join(""), html += "</div>", view.querySelector(".serverLogs").innerHTML = html, loading.hide()
|
||||
}), apiClient.getServerConfiguration().then(function(config) {
|
||||
view.querySelector("#chkDebugLog").checked = config.EnableDebugLevelLogging
|
||||
})
|
||||
})
|
||||
}
|
||||
});
|
14
src/dashboard/serveractivity.js
Normal file
14
src/dashboard/serveractivity.js
Normal file
|
@ -0,0 +1,14 @@
|
|||
define(["components/activitylog", "globalize"], function(ActivityLog, globalize) {
|
||||
"use strict";
|
||||
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
|
||||
})
|
||||
}
|
||||
});
|
19
src/dashboard/wizardfinishpage.js
Normal file
19
src/dashboard/wizardfinishpage.js
Normal file
|
@ -0,0 +1,19 @@
|
|||
define(["loading"], function(loading) {
|
||||
"use strict";
|
||||
|
||||
function onFinish() {
|
||||
loading.show(), ApiClient.ajax({
|
||||
url: ApiClient.getUrl("Startup/Complete"),
|
||||
type: "POST"
|
||||
}).then(function() {
|
||||
Dashboard.navigate("dashboard.html"), loading.hide()
|
||||
})
|
||||
}
|
||||
return function(view, params) {
|
||||
view.querySelector(".btnWizardNext").addEventListener("click", onFinish), view.addEventListener("viewshow", function() {
|
||||
document.querySelector(".skinHeader").classList.add("noHomeButtonHeader")
|
||||
}), view.addEventListener("viewhide", function() {
|
||||
document.querySelector(".skinHeader").classList.remove("noHomeButtonHeader")
|
||||
})
|
||||
}
|
||||
});
|
31
src/dashboard/wizardremoteaccess.js
Normal file
31
src/dashboard/wizardremoteaccess.js
Normal file
|
@ -0,0 +1,31 @@
|
|||
define(["loading", "emby-checkbox", "emby-button", "emby-select"], function(loading) {
|
||||
"use strict";
|
||||
|
||||
function save(page) {
|
||||
loading.show();
|
||||
var apiClient = ApiClient,
|
||||
config = {};
|
||||
config.EnableRemoteAccess = page.querySelector("#chkRemoteAccess").checked, config.EnableAutomaticPortMapping = page.querySelector("#chkEnableUpnp").checked, apiClient.ajax({
|
||||
type: "POST",
|
||||
data: config,
|
||||
url: apiClient.getUrl("Startup/RemoteAccess")
|
||||
}).then(function() {
|
||||
loading.hide(), navigateToNextPage()
|
||||
})
|
||||
}
|
||||
|
||||
function navigateToNextPage() {
|
||||
Dashboard.navigate("wizardfinish.html")
|
||||
}
|
||||
|
||||
function onSubmit(e) {
|
||||
return save(this), e.preventDefault(), !1
|
||||
}
|
||||
return function(view, params) {
|
||||
view.querySelector(".wizardSettingsForm").addEventListener("submit", onSubmit), view.addEventListener("viewshow", function() {
|
||||
document.querySelector(".skinHeader").classList.add("noHomeButtonHeader")
|
||||
}), view.addEventListener("viewhide", function() {
|
||||
document.querySelector(".skinHeader").classList.remove("noHomeButtonHeader")
|
||||
})
|
||||
}
|
||||
});
|
67
src/dashboard/wizardsettings.js
Normal file
67
src/dashboard/wizardsettings.js
Normal file
|
@ -0,0 +1,67 @@
|
|||
define(["loading", "emby-checkbox", "emby-button", "emby-select"], function(loading) {
|
||||
"use strict";
|
||||
|
||||
function save(page) {
|
||||
loading.show();
|
||||
var apiClient = ApiClient;
|
||||
apiClient.getJSON(apiClient.getUrl("Startup/Configuration")).then(function(config) {
|
||||
config.PreferredMetadataLanguage = page.querySelector("#selectLanguage").value, config.MetadataCountryCode = page.querySelector("#selectCountry").value, apiClient.ajax({
|
||||
type: "POST",
|
||||
data: config,
|
||||
url: apiClient.getUrl("Startup/Configuration")
|
||||
}).then(function() {
|
||||
loading.hide(), navigateToNextPage()
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
function populateLanguages(select, languages) {
|
||||
var html = "";
|
||||
html += "<option value=''></option>";
|
||||
for (var i = 0, length = languages.length; i < length; i++) {
|
||||
var culture = languages[i];
|
||||
html += "<option value='" + culture.TwoLetterISOLanguageName + "'>" + culture.DisplayName + "</option>"
|
||||
}
|
||||
select.innerHTML = html
|
||||
}
|
||||
|
||||
function populateCountries(select, allCountries) {
|
||||
var html = "";
|
||||
html += "<option value=''></option>";
|
||||
for (var i = 0, length = allCountries.length; i < length; i++) {
|
||||
var culture = allCountries[i];
|
||||
html += "<option value='" + culture.TwoLetterISORegionName + "'>" + culture.DisplayName + "</option>"
|
||||
}
|
||||
select.innerHTML = html
|
||||
}
|
||||
|
||||
function reloadData(page, config, cultures, countries) {
|
||||
populateLanguages(page.querySelector("#selectLanguage"), cultures), populateCountries(page.querySelector("#selectCountry"), countries), page.querySelector("#selectLanguage").value = config.PreferredMetadataLanguage, page.querySelector("#selectCountry").value = config.MetadataCountryCode, loading.hide()
|
||||
}
|
||||
|
||||
function reload(page) {
|
||||
loading.show();
|
||||
var apiClient = ApiClient,
|
||||
promise1 = apiClient.getJSON(apiClient.getUrl("Startup/Configuration")),
|
||||
promise2 = apiClient.getCultures(),
|
||||
promise3 = apiClient.getCountries();
|
||||
Promise.all([promise1, promise2, promise3]).then(function(responses) {
|
||||
reloadData(page, responses[0], responses[1], responses[2])
|
||||
})
|
||||
}
|
||||
|
||||
function navigateToNextPage() {
|
||||
Dashboard.navigate("wizardremoteaccess.html")
|
||||
}
|
||||
|
||||
function onSubmit(e) {
|
||||
return save(this), e.preventDefault(), !1
|
||||
}
|
||||
return function(view, params) {
|
||||
view.querySelector(".wizardSettingsForm").addEventListener("submit", onSubmit), view.addEventListener("viewshow", function() {
|
||||
document.querySelector(".skinHeader").classList.add("noHomeButtonHeader"), reload(this)
|
||||
}), view.addEventListener("viewhide", function() {
|
||||
document.querySelector(".skinHeader").classList.remove("noHomeButtonHeader")
|
||||
})
|
||||
}
|
||||
});
|
41
src/dashboard/wizardstart.js
Normal file
41
src/dashboard/wizardstart.js
Normal file
|
@ -0,0 +1,41 @@
|
|||
define(["jQuery", "loading", "emby-button", "emby-select"], function($, loading) {
|
||||
"use strict";
|
||||
|
||||
function loadPage(page, config, languageOptions) {
|
||||
$("#selectLocalizationLanguage", page).html(languageOptions.map(function(l) {
|
||||
return '<option value="' + l.Value + '">' + l.Name + "</option>"
|
||||
})).val(config.UICulture), loading.hide()
|
||||
}
|
||||
|
||||
function save(page) {
|
||||
loading.show();
|
||||
var apiClient = ApiClient;
|
||||
apiClient.getJSON(apiClient.getUrl("Startup/Configuration")).then(function(config) {
|
||||
config.UICulture = $("#selectLocalizationLanguage", page).val(), apiClient.ajax({
|
||||
type: "POST",
|
||||
data: config,
|
||||
url: apiClient.getUrl("Startup/Configuration")
|
||||
}).then(function() {
|
||||
Dashboard.navigate("wizarduser.html")
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
function onSubmit() {
|
||||
return save($(this).parents(".page")), !1
|
||||
}
|
||||
return function(view, params) {
|
||||
$(".wizardStartForm", view).on("submit", onSubmit), view.addEventListener("viewshow", function() {
|
||||
document.querySelector(".skinHeader").classList.add("noHomeButtonHeader"), loading.show();
|
||||
var page = this,
|
||||
apiClient = ApiClient,
|
||||
promise1 = apiClient.getJSON(apiClient.getUrl("Startup/Configuration")),
|
||||
promise2 = apiClient.getJSON(apiClient.getUrl("Localization/Options"));
|
||||
Promise.all([promise1, promise2]).then(function(responses) {
|
||||
loadPage(page, responses[0], responses[1])
|
||||
})
|
||||
}), view.addEventListener("viewhide", function() {
|
||||
document.querySelector(".skinHeader").classList.remove("noHomeButtonHeader")
|
||||
})
|
||||
}
|
||||
});
|
Loading…
Add table
Add a link
Reference in a new issue