From 433dbb4c66ccafd48853f7e9a82d183a448316f0 Mon Sep 17 00:00:00 2001 From: Konstantin Kolosovsky Date: Mon, 15 Jun 2020 20:30:21 +0300 Subject: [PATCH] github: Allow OAuth in GH clone dialog login panel (IDEA-199502) GitOrigin-RevId: 225bc778ed0ad78464508b4aaa9ad28c74fb7633 --- .../authentication/ui/GithubLoginPanel.kt | 1 + .../ui/cloneDialog/CloneDialogLoginPanel.kt | 44 ++++++++++++++++--- .../ui/cloneDialog/GHCloneDialogExtension.kt | 12 ++++- 3 files changed, 49 insertions(+), 8 deletions(-) diff --git a/plugins/github/src/org/jetbrains/plugins/github/authentication/ui/GithubLoginPanel.kt b/plugins/github/src/org/jetbrains/plugins/github/authentication/ui/GithubLoginPanel.kt index 702d66e3f93e..dc2846ae2677 100644 --- a/plugins/github/src/org/jetbrains/plugins/github/authentication/ui/GithubLoginPanel.kt +++ b/plugins/github/src/org/jetbrains/plugins/github/authentication/ui/GithubLoginPanel.kt @@ -48,6 +48,7 @@ internal class GithubLoginPanel( set(value) { passwordUi.footer = value tokenUi.footer = value + oauthUi.footer = value applyUi(currentUi) } diff --git a/plugins/github/src/org/jetbrains/plugins/github/ui/cloneDialog/CloneDialogLoginPanel.kt b/plugins/github/src/org/jetbrains/plugins/github/ui/cloneDialog/CloneDialogLoginPanel.kt index 580b07afaa05..6bbf5ae5538f 100644 --- a/plugins/github/src/org/jetbrains/plugins/github/ui/cloneDialog/CloneDialogLoginPanel.kt +++ b/plugins/github/src/org/jetbrains/plugins/github/ui/cloneDialog/CloneDialogLoginPanel.kt @@ -14,10 +14,13 @@ import com.intellij.ui.SimpleColoredComponent import com.intellij.ui.SimpleTextAttributes.ERROR_ATTRIBUTES import com.intellij.ui.components.JBPanel import com.intellij.ui.components.labels.LinkLabel +import com.intellij.ui.components.panels.HorizontalLayout import com.intellij.ui.components.panels.VerticalLayout import com.intellij.ui.layout.* +import com.intellij.ui.scale.JBUIScale.scale import com.intellij.util.ui.JBEmptyBorder import com.intellij.util.ui.JBUI.Borders.empty +import com.intellij.util.ui.JBUI.Panels.simplePanel import com.intellij.util.ui.JBUI.emptyInsets import com.intellij.util.ui.UIUtil.getRegularPanelInsets import org.jetbrains.plugins.github.api.GithubApiRequestExecutor @@ -33,6 +36,7 @@ import org.jetbrains.plugins.github.util.successOnEdt import javax.swing.JButton import javax.swing.JComponent import javax.swing.JPanel +import javax.swing.SwingConstants.TOP internal class CloneDialogLoginPanel(private val account: GithubAccount?) : JBPanel(VerticalLayout(0)) { @@ -43,8 +47,9 @@ internal class CloneDialogLoginPanel(private val account: GithubAccount?) : private val loginPanel = GithubLoginPanel(GithubApiRequestExecutor.Factory.getInstance()) { name, server -> if (account == null) authenticationManager.isAccountUnique(name, server) else true } + private val inlineCancelPanel = simplePanel() private val loginButton = JButton(message("button.login.mnemonic")) - private val backLink = LinkLabel(IdeBundle.message("button.back"), null) + private val backLink = LinkLabel(IdeBundle.message("button.back"), null).apply { verticalAlignment = TOP } private var loginIndicator: ProgressIndicator? = null @@ -75,17 +80,44 @@ internal class CloneDialogLoginPanel(private val account: GithubAccount?) : null ) - fun setTokenUi() = loginPanel.setTokenUi() - fun setPasswordUi() = loginPanel.setPasswordUi() + fun setTokenUi() { + setupNewUi(false) + loginPanel.setTokenUi() + } + + fun setPasswordUi() { + setupNewUi(false) + loginPanel.setPasswordUi() + } + + fun setOAuthUi() { + setupNewUi(true) + loginPanel.setOAuthUi() + + login() + } + fun setServer(path: String, editable: Boolean) = loginPanel.setServer(path, editable) private fun buildLayout() { - loginPanel.footer = { buttonPanel() } // footer is used to put buttons in 2-nd column - align under text boxes - - add(loginPanel) + add(JPanel(HorizontalLayout(0)).apply { + add(loginPanel) + add(inlineCancelPanel.apply { border = JBEmptyBorder(getRegularPanelInsets().apply { left = scale(6) }) }) + }) add(errorPanel.apply { border = JBEmptyBorder(getRegularPanelInsets().apply { top = 0 }) }) } + private fun setupNewUi(isOAuth: Boolean) { + loginButton.isVisible = !isOAuth + backLink.text = if (isOAuth) IdeBundle.message("link.cancel") else IdeBundle.message("button.back") + + loginPanel.footer = { if (!isOAuth) buttonPanel() } // footer is used to put buttons in 2-nd column - align under text boxes + if (isOAuth) inlineCancelPanel.addToCenter(backLink) + inlineCancelPanel.isVisible = isOAuth + + errorPanel.removeAll() + } + private fun LayoutBuilder.buttonPanel() = row("") { cell { diff --git a/plugins/github/src/org/jetbrains/plugins/github/ui/cloneDialog/GHCloneDialogExtension.kt b/plugins/github/src/org/jetbrains/plugins/github/ui/cloneDialog/GHCloneDialogExtension.kt index 6053abcbfe11..753425c3cd38 100644 --- a/plugins/github/src/org/jetbrains/plugins/github/ui/cloneDialog/GHCloneDialogExtension.kt +++ b/plugins/github/src/org/jetbrains/plugins/github/ui/cloneDialog/GHCloneDialogExtension.kt @@ -28,6 +28,7 @@ import org.jetbrains.plugins.github.authentication.accounts.GithubAccountInforma import org.jetbrains.plugins.github.authentication.accounts.GithubAccountManager.Companion.ACCOUNT_REMOVED_TOPIC import org.jetbrains.plugins.github.authentication.accounts.GithubAccountManager.Companion.ACCOUNT_TOKEN_CHANGED_TOPIC import org.jetbrains.plugins.github.authentication.accounts.isGHAccount +import org.jetbrains.plugins.github.authentication.isOAuthEnabled import org.jetbrains.plugins.github.i18n.GithubBundle.message import org.jetbrains.plugins.github.util.CachingGithubUserAvatarLoader import org.jetbrains.plugins.github.util.GithubImageResizer @@ -91,7 +92,7 @@ private class GHCloneDialogExtensionComponent(project: Project) : BaseCloneDialo if (isExistingAccount) message("login.action") else message("login.via.github.action"), { switchToLogin(account) - getLoginPanel()?.setPasswordUi() + getLoginPanel()?.setPrimaryLoginUi() }, showSeparatorAbove = !isExistingAccount ) @@ -126,7 +127,7 @@ private class GHCloneDialogLoginPanel(account: GithubAccount?) : JPanel(HorizontalLayout(0)).apply { border = JBEmptyBorder(getRegularPanelInsets()) - val loginViaGHButton = JButton(message("login.via.github.action")).apply { addActionListener { setPasswordUi() } } + val loginViaGHButton = JButton(message("login.via.github.action")).apply { addActionListener { setPrimaryLoginUi() } } val useTokenLink = LinkLabel.create(message("link.label.use.token")) { setTokenUi() } add(loginViaGHButton) @@ -144,6 +145,8 @@ private class GHCloneDialogLoginPanel(account: GithubAccount?) : fun setChooseLoginUi() = setContent(chooseLoginUiPanel) + fun setPrimaryLoginUi() = if (isOAuthEnabled()) setOAuthUi() else setPasswordUi() + fun setTokenUi() { setContent(loginPanel) loginPanel.setTokenUi() // after `loginPanel` is set as content to ensure correct focus behavior @@ -154,6 +157,11 @@ private class GHCloneDialogLoginPanel(account: GithubAccount?) : loginPanel.setPasswordUi() // after `loginPanel` is set as content to ensure correct focus behavior } + fun setOAuthUi() { + setContent(loginPanel) + loginPanel.setOAuthUi() + } + private fun setContent(content: JComponent) { contentPanel.setContent(content)