From a118879dc02a5ffd58bb94b25b3908e792d5cdf2 Mon Sep 17 00:00:00 2001 From: DacongDA Date: Sun, 10 Aug 2025 20:40:30 +0800 Subject: [PATCH] feat: allow user to select organization in login page when using shared app (#4053) --- web/src/auth/LoginPage.js | 37 ++++++++++++++++++++++++++++++++++++ web/src/table/SigninTable.js | 1 + 2 files changed, 38 insertions(+) diff --git a/web/src/auth/LoginPage.js b/web/src/auth/LoginPage.js index 7a5637aa..95f0406c 100644 --- a/web/src/auth/LoginPage.js +++ b/web/src/auth/LoginPage.js @@ -595,6 +595,32 @@ class LoginPage extends React.Component { return null; } + switchLoginOrganization(name) { + const searchParams = new URLSearchParams(window.location.search); + + const clientId = searchParams.get("client_id"); + if (clientId) { + const clientIdSplited = clientId.split("-org-"); + searchParams.set("client_id", `${clientIdSplited[0]}-org-${name}`); + + Setting.goToLink(`/login/oauth/authorize?${searchParams.toString()}`); + return; + } + + const application = this.getApplicationObj(); + if (window.location.pathname.startsWith("/login/saml/authorize")) { + Setting.goToLink(`/login/saml/authorize/${name}/${application.name}-org-${name}`); + return; + } + + if (window.location.pathname.startsWith("/cas")) { + Setting.goToLink(`/cas/${application.name}-org-${name}/${name}/login`); + return; + } + + Setting.goToLink(`/login/${name}?orgChoiceMode=None`); + } + renderFormItem(application, signinItem) { if (!signinItem.visible && signinItem.name !== "Forgot password?") { return null; @@ -854,6 +880,17 @@ class LoginPage extends React.Component { {this.renderFooter(application, signinItem)} ); + } else if (signinItem.name === "Select organization") { + return ( + +
+ { + this.switchLoginOrganization(value); + }} /> +
+
+ ); } } diff --git a/web/src/table/SigninTable.js b/web/src/table/SigninTable.js index 3e24276b..2ee52ad6 100644 --- a/web/src/table/SigninTable.js +++ b/web/src/table/SigninTable.js @@ -119,6 +119,7 @@ class SigninTable extends React.Component { {name: "Signup link", displayName: i18next.t("general:Signup link")}, {name: "Captcha", displayName: i18next.t("general:Captcha")}, {name: "Auto sign in", displayName: i18next.t("login:Auto sign in")}, + {name: "Select organization", displayName: i18next.t("login:Select organization")}, ]; const getItemDisplayName = (text) => {