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

move authentication and playback controllers to subdirectories

This commit is contained in:
dkanada 2019-12-15 23:53:13 +09:00
parent 4bf12b1682
commit 07994e0a40
13 changed files with 12 additions and 12 deletions

View file

@ -0,0 +1,65 @@
define(["appSettings", "loading", "browser", "emby-button"], function(appSettings, loading, browser) {
"use strict";
function handleConnectionResult(page, result) {
loading.hide();
switch (result.State) {
case "SignedIn":
var apiClient = result.ApiClient;
Dashboard.onServerChanged(apiClient.getCurrentUserId(), apiClient.accessToken(), apiClient);
Dashboard.navigate("home.html");
break;
case "ServerSignIn":
Dashboard.navigate("login.html?serverid=" + result.Servers[0].Id, false, "none");
break;
case "ServerSelection":
Dashboard.navigate("selectserver.html", false, "none");
break;
case "ServerUpdateNeeded":
Dashboard.alert({
message: Globalize.translate("ServerUpdateNeeded", '<a href="https://github.com/jellyfin/jellyfin">https://github.com/jellyfin/jellyfin</a>')
});
break;
case "Unavailable":
Dashboard.alert({
message: Globalize.translate("MessageUnableToConnectToServer"),
title: Globalize.translate("HeaderConnectionFailure")
});
}
}
function submitServer(page) {
loading.show();
var host = page.querySelector("#txtServerHost").value;
ConnectionManager.connectToAddress(host, {
enableAutoLogin: appSettings.enableAutoLogin()
}).then(function(result) {
handleConnectionResult(page, result);
}, function() {
handleConnectionResult(page, {
State: "Unavailable"
});
});
}
return function(view, params) {
view.querySelector(".addServerForm").addEventListener("submit", onServerSubmit);
view.querySelector(".btnCancel").addEventListener("click", goBack);
require(["autoFocuser"], function (autoFocuser) {
autoFocuser.autoFocus(view);
});
function onServerSubmit(e) {
submitServer(view);
e.preventDefault();
return false;
}
function goBack() {
require(["appRouter"], function(appRouter) {
appRouter.back();
});
}
};
});

View file

@ -0,0 +1,53 @@
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 ("PinCode" == result.Action) {
var msg = Globalize.translate("MessageForgotPasswordFileCreated");
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");
}
});
}
}
return function (view, params) {
function onSubmit(e) {
ApiClient.ajax({
type: "POST",
url: ApiClient.getUrl("Users/ForgotPassword"),
dataType: "json",
data: {
EnteredUsername: view.querySelector("#txtName").value
}
}).then(processForgotPasswordResult);
e.preventDefault();
return false;
}
view.querySelector("form").addEventListener("submit", onSubmit);
};
});

View file

@ -0,0 +1,41 @@
define([], function () {
"use strict";
function processForgotPasswordResult(result) {
if (result.Success) {
var msg = Globalize.translate("MessagePasswordResetForUsers");
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";
}
});
}
Dashboard.alert({
message: Globalize.translate("MessageInvalidForgotPasswordPin"),
title: Globalize.translate("HeaderPasswordReset")
});
}
return function (view, params) {
function onSubmit(e) {
ApiClient.ajax({
type: "POST",
url: ApiClient.getUrl("Users/ForgotPassword/Pin"),
dataType: "json",
data: {
Pin: view.querySelector("#txtPin").value
}
}).then(processForgotPasswordResult);
e.preventDefault();
return false;
}
view.querySelector("form").addEventListener("submit", onSubmit);
};
});

View file

@ -0,0 +1,188 @@
define(["apphost", "appSettings", "dom", "connectionManager", "loading", "layoutManager", "browser", "cardStyle", "emby-checkbox"], function(appHost, appSettings, dom, connectionManager, loading, layoutManager, browser) {
"use strict";
var enableFocusTransform = !browser.slow && !browser.edge;
function authenticateUserByName(page, apiClient, username, password) {
loading.show();
apiClient.authenticateUserByName(username, password).then(function(result) {
var user = result.User;
var serverId = getParameterByName("serverid");
var newUrl = user.Policy.IsAdministrator && !serverId ? "dashboard.html" : "home.html";
loading.hide();
Dashboard.onServerChanged(user.Id, result.AccessToken, apiClient);
Dashboard.navigate(newUrl);
}, function(response) {
page.querySelector("#txtManualName").value = "";
page.querySelector("#txtManualPassword").value = "";
loading.hide();
if (response.status === 401) {
require(["toast"], function(toast) {
toast(Globalize.translate("MessageInvalidUser"));
});
} else {
Dashboard.alert({
message: Globalize.translate("MessageUnableToConnectToServer"),
title: Globalize.translate("HeaderConnectionFailure")
});
}
});
}
function showManualForm(context, showCancel, focusPassword) {
context.querySelector(".chkRememberLogin").checked = appSettings.enableAutoLogin();
context.querySelector(".manualLoginForm").classList.remove("hide");
context.querySelector(".visualLoginForm").classList.add("hide");
context.querySelector(".btnManual").classList.add("hide");
focusPassword ? context.querySelector("#txtManualPassword").focus() : context.querySelector("#txtManualName").focus();
showCancel ? context.querySelector(".btnCancel").classList.remove("hide") : context.querySelector(".btnCancel").classList.add("hide");
}
var metroColors = ["#6FBD45", "#4BB3DD", "#4164A5", "#E12026", "#800080", "#E1B222", "#008040", "#0094FF", "#FF00C7", "#FF870F", "#7F0037"];
function getRandomMetroColor() {
var index = Math.floor(Math.random() * (metroColors.length - 1));
return metroColors[index];
}
function getMetroColor(str) {
if (str) {
var character = String(str.substr(0, 1).charCodeAt());
var sum = 0;
for (var i = 0; i < character.length; i++) {
sum += parseInt(character.charAt(i));
}
var index = String(sum).substr(-1);
return metroColors[index];
}
return getRandomMetroColor();
}
function loadUserList(context, apiClient, users) {
var html = "";
for (var i = 0; i < users.length; i++) {
var user = users[i];
// TODO move card creation code to Card component
var cssClass = "card squareCard scalableCard squareCard-scalable";
if (layoutManager.tv) {
cssClass += " show-focus";
if (enableFocusTransform) {
cssClass += " show-animation";
}
}
var cardBoxCssClass = "cardBox cardBox-bottompadded";
html += '<button type="button" class="' + cssClass + '">';
html += '<div class="' + cardBoxCssClass + '">';
html += '<div class="cardScalable">';
html += '<div class="cardPadder cardPadder-square"></div>';
html += '<div class="cardContent" data-haspw="' + user.HasPassword + '" data-username="' + user.Name + '" data-userid="' + user.Id + '">';
var imgUrl;
if (user.PrimaryImageTag) {
imgUrl = apiClient.getUserImageUrl(user.Id, {
width: 300,
tag: user.PrimaryImageTag,
type: "Primary"
});
html += '<div class="cardImageContainer coveredImage coveredImage-noScale" style="background-image:url(\'' + imgUrl + "');\"></div>";
} else {
var background = getMetroColor(user.Id);
imgUrl = "img/logindefault.png";
html += '<div class="cardImageContainer coveredImage coveredImage-noScale" style="background-image:url(\'' + imgUrl + "');background-color:" + background + ';"></div>';
}
html += "</div>";
html += "</div>";
html += '<div class="cardFooter visualCardBox-cardFooter">';
html += '<div class="cardText singleCardText cardTextCentered">' + user.Name + "</div>";
html += "</div>";
html += "</div>";
html += "</button>";
}
context.querySelector("#divUsers").innerHTML = html;
}
return function(view, params) {
function getApiClient() {
var serverId = params.serverid;
return serverId ? connectionManager.getOrCreateApiClient(serverId) : ApiClient;
}
function showVisualForm() {
view.querySelector(".visualLoginForm").classList.remove("hide");
view.querySelector(".manualLoginForm").classList.add("hide");
view.querySelector(".btnManual").classList.remove("hide");
require(["autoFocuser"], function (autoFocuser) {
autoFocuser.autoFocus(view);
});
}
view.querySelector("#divUsers").addEventListener("click", function(e) {
var card = dom.parentWithClass(e.target, "card");
var cardContent = card ? card.querySelector(".cardContent") : null;
if (cardContent) {
var context = view;
var id = cardContent.getAttribute("data-userid");
var name = cardContent.getAttribute("data-username");
var haspw = cardContent.getAttribute("data-haspw");
if (id === 'manual') {
context.querySelector("#txtManualName").value = "";
showManualForm(context, true);
} else if (haspw == 'false') {
authenticateUserByName(context, getApiClient(), name, "");
} else {
context.querySelector("#txtManualName").value = name;
context.querySelector("#txtManualPassword").value = "";
showManualForm(context, true, true);
}
}
});
view.querySelector(".manualLoginForm").addEventListener("submit", function(e) {
appSettings.enableAutoLogin(view.querySelector(".chkRememberLogin").checked);
var apiClient = getApiClient();
authenticateUserByName(view, apiClient, view.querySelector("#txtManualName").value, view.querySelector("#txtManualPassword").value);
e.preventDefault();
return false;
});
view.querySelector(".btnForgotPassword").addEventListener("click", function() {
Dashboard.navigate("forgotpassword.html");
});
view.querySelector(".btnCancel").addEventListener("click", showVisualForm);
view.querySelector(".btnManual").addEventListener("click", function() {
view.querySelector("#txtManualName").value = "";
showManualForm(view, true);
});
view.addEventListener("viewshow", function(e) {
loading.show();
if (!appHost.supports('multiserver')) {
view.querySelector(".btnSelectServer").classList.add("hide");
}
var apiClient = getApiClient();
apiClient.getPublicUsers().then(function(users) {
if (users.length) {
showVisualForm();
loadUserList(view, apiClient, users);
} else {
view.querySelector("#txtManualName").value = "";
showManualForm(view, false, false);
}
}).catch().then(function() {
loading.hide();
});
apiClient.getJSON(apiClient.getUrl("Branding/Configuration")).then(function(options) {
view.querySelector(".disclaimer").textContent = options.LoginDisclaimer || "";
});
});
}
});

View file

@ -0,0 +1,208 @@
define(["loading", "appRouter", "layoutManager", "appSettings", "apphost", "focusManager", "connectionManager", "globalize", "actionsheet", "dom", "browser", "material-icons", "flexStyles", "emby-scroller", "emby-itemscontainer", "cardStyle", "emby-button"], function (loading, appRouter, layoutManager, appSettings, appHost, focusManager, connectionManager, globalize, actionSheet, dom, browser) {
"use strict";
var enableFocusTransform = !browser.slow && !browser.edge;
function renderSelectServerItems(view, servers) {
var items = servers.map(function (server) {
return {
name: server.Name,
showIcon: true,
icon: "cast",
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>';
}
// TODO move card creation code to Card component
var cssClass = "card overflowSquareCard loginSquareCard scalableCard overflowSquareCard-scalable";
if (layoutManager.tv) {
cssClass += " show-focus";
if (enableFocusTransform) {
cssClass += " show-animation";
}
}
var cardBoxCssClass = "cardBox";
var innerOpening = '<div class="' + cardBoxCssClass + '">';
var cardContainer = '';
cardContainer += '<button raised class="' + cssClass + '" style="display:inline-block;" data-id="' + item.id + '" data-url="' + (item.url || "") + '" data-cardtype="' + item.cardType + '">';
cardContainer += innerOpening;
cardContainer += '<div class="cardScalable">';
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();
}
function updatePageStyle(view, params) {
if (params.showuser == "1") {
view.classList.add("libraryPage");
view.classList.remove("standalonePage");
view.classList.add("noSecondaryNavPage");
} else {
view.classList.add("standalonePage");
view.classList.remove("libraryPage");
view.classList.remove("noSecondaryNavPage");
}
}
function showGeneralError() {
loading.hide();
alertText(globalize.translate("DefaultErrorMessage"));
}
function alertText(text) {
alertTextWithOptions({
text: text
});
}
function alertTextWithOptions(options) {
require(["alert"], function (alert) {
alert(options);
});
}
function showServerConnectionFailure() {
alertText(globalize.translate("MessageUnableToConnectToServer"), globalize.translate("HeaderConnectionFailure"));
}
return function (view, params) {
function connectToServer(server) {
loading.show();
connectionManager.connectToServer(server, {
enableAutoLogin: appSettings.enableAutoLogin()
}).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 () {
loading.hide();
loadServers();
});
}
function onServerClick(server) {
var menuItems = [];
menuItems.push({
name: globalize.translate("Connect"),
id: "connect"
});
menuItems.push({
name: globalize.translate("Delete"),
id: "delete"
});
actionSheet.show({
items: menuItems,
title: server.Name
}).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);
}
}
function loadServers() {
loading.show();
connectionManager.getAvailableServers().then(onServersRetrieved);
}
var servers;
updatePageStyle(view, params);
view.addEventListener("viewshow", function (e) {
var isRestored = e.detail.isRestored;
appRouter.setTitle(null);
if (!isRestored) {
loadServers();
}
});
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) {
return s.Id === id;
})[0]);
}
}
});
};
});