@@ -70,180 +70,171 @@ private class CoderWorkspaceStepDialog(
7070 }
7171}
7272
73- /* *
74- * Generic function to ask for consent.
75- */
76- fun confirm (
77- title : String ,
78- comment : String ,
79- details : String ,
80- ): Boolean {
81- var inputFromUser = false
82- ApplicationManager .getApplication().invokeAndWait({
83- val panel =
84- panel {
85- row {
86- label(comment)
87- }
88- row {
89- label(details)
90- }
91- }
92- AppIcon .getInstance().requestAttention(null , true )
93- if (! dialog(
94- title = title,
95- panel = panel,
96- ).showAndGet()
97- ) {
98- return @invokeAndWait
99- }
100- inputFromUser = true
101- }, ModalityState .defaultModalityState())
102- return inputFromUser
73+ fun askIDE (
74+ name : String ,
75+ agent : WorkspaceAgent ,
76+ workspace : Workspace ,
77+ cli : CoderCLIManager ,
78+ client : CoderRestClient ,
79+ workspaces : List <Workspace >,
80+ ): WorkspaceProjectIDE ? {
81+ var data: WorkspaceProjectIDE ? = null
82+ ApplicationManager .getApplication().invokeAndWait {
83+ val dialog =
84+ CoderWorkspaceStepDialog (
85+ name,
86+ CoderWorkspacesStepSelection (agent, workspace, cli, client, workspaces),
87+ )
88+ data = dialog.showAndGetData()
89+ }
90+ return data
10391}
10492
10593/* *
106- * Generic function to ask for input.
94+ * Dialog implementation for standalone Gateway.
95+ *
96+ * This is meant to mimic ToolboxUi.
10797 */
108- fun ask (
109- comment : String ,
110- isError : Boolean = false,
111- link : Pair <String , String >? = null,
112- default : String? = null,
113- ): String? {
114- var inputFromUser: String? = null
115- ApplicationManager .getApplication().invokeAndWait({
116- lateinit var inputTextField: JBTextField
117- val panel =
118- panel {
119- row {
120- if (link != null ) browserLink(link.first, link.second)
121- inputTextField =
122- textField()
123- .applyToComponent {
124- text = default ? : " "
125- minimumSize = Dimension (520 , - 1 )
126- }.component
127- }.layout(RowLayout .PARENT_GRID )
128- row {
129- cell() // To align with the text box.
130- cell(
131- ComponentPanelBuilder .createCommentComponent(comment, false , - 1 , true )
132- .applyIf(isError) {
133- apply {
134- foreground = UIUtil .getErrorForeground()
135- }
136- },
137- )
138- }.layout(RowLayout .PARENT_GRID )
98+ class DialogUi (
99+ private val settings : CoderSettings ,
100+ ) {
101+ fun confirm (title : String , description : String ): Boolean {
102+ var inputFromUser = false
103+ ApplicationManager .getApplication().invokeAndWait({
104+ AppIcon .getInstance().requestAttention(null , true )
105+ if (! dialog(
106+ title = title,
107+ panel = panel {
108+ row {
109+ label(description)
110+ }
111+ },
112+ ).showAndGet()
113+ ) {
114+ return @invokeAndWait
139115 }
140- AppIcon .getInstance().requestAttention(null , true )
141- if (! dialog(
142- comment,
143- panel = panel,
144- focusedComponent = inputTextField,
145- ).showAndGet()
146- ) {
147- return @invokeAndWait
148- }
149- inputFromUser = inputTextField.text
150- }, ModalityState .any())
151- return inputFromUser
152- }
116+ inputFromUser = true
117+ }, ModalityState .defaultModalityState())
118+ return inputFromUser
119+ }
153120
154- /* *
155- * Open a dialog for providing the token. Show any existing token so
156- * the user can validate it if a previous connection failed.
157- *
158- * If we are not retrying and the user has not checked the existing
159- * token box then also open a browser to the auth page.
160- *
161- * If the user has checked the existing token box then return the token
162- * on disk immediately and skip the dialog (this will overwrite any
163- * other existing token) unless this is a retry to avoid clobbering the
164- * token that just failed.
165- */
166- fun askToken (
167- url : URL ,
168- token : Pair <String , Source >? ,
169- isRetry : Boolean ,
170- useExisting : Boolean ,
171- settings : CoderSettings ,
172- ): Pair <String , Source >? {
173- var (existingToken, tokenSource) = token ? : Pair (" " , Source .USER )
174- val getTokenUrl = url.withPath(" /login?redirect=%2Fcli-auth" )
121+ fun ask (
122+ title : String ,
123+ description : String ,
124+ placeholder : String? = null,
125+ isError : Boolean = false,
126+ link : Pair <String , String >? = null,
127+ ): String? {
128+ var inputFromUser: String? = null
129+ ApplicationManager .getApplication().invokeAndWait({
130+ lateinit var inputTextField: JBTextField
131+ AppIcon .getInstance().requestAttention(null , true )
132+ if (! dialog(
133+ title = title,
134+ panel = panel {
135+ row {
136+ if (link != null ) browserLink(link.first, link.second)
137+ inputTextField =
138+ textField()
139+ .applyToComponent {
140+ this .text = placeholder
141+ minimumSize = Dimension (520 , - 1 )
142+ }.component
143+ }.layout(RowLayout .PARENT_GRID )
144+ row {
145+ cell() // To align with the text box.
146+ cell(
147+ ComponentPanelBuilder .createCommentComponent(description, false , - 1 , true )
148+ .applyIf(isError) {
149+ apply {
150+ foreground = UIUtil .getErrorForeground()
151+ }
152+ },
153+ )
154+ }.layout(RowLayout .PARENT_GRID )
155+ },
156+ focusedComponent = inputTextField,
157+ ).showAndGet()
158+ ) {
159+ return @invokeAndWait
160+ }
161+ inputFromUser = inputTextField.text
162+ }, ModalityState .any())
163+ return inputFromUser
164+ }
165+
166+ private fun openUrl (url : URL ) {
167+ BrowserUtil .browse(url)
168+ }
169+
170+ /* *
171+ * Open a dialog for providing the token. Show any existing token so
172+ * the user can validate it if a previous connection failed.
173+ *
174+ * If we are not retrying and the user has not checked the existing
175+ * token box then also open a browser to the auth page.
176+ *
177+ * If the user has checked the existing token box then return the token
178+ * on disk immediately and skip the dialog (this will overwrite any
179+ * other existing token) unless this is a retry to avoid clobbering the
180+ * token that just failed.
181+ */
182+ fun askToken (
183+ url : URL ,
184+ token : Pair <String , Source >? ,
185+ isRetry : Boolean ,
186+ useExisting : Boolean ,
187+ ): Pair <String , Source >? {
188+ var (existingToken, tokenSource) = token ? : Pair (" " , Source .USER )
189+ val getTokenUrl = url.withPath(" /login?redirect=%2Fcli-auth" )
175190
176- // On the first run either open a browser to generate a new token
177- // or, if using an existing token, use the token on disk if it
178- // exists otherwise assume the user already copied an existing
179- // token and they will paste in.
180- if (! isRetry) {
181- if (! useExisting) {
182- BrowserUtil .browse(getTokenUrl)
183- } else {
184- // Look on disk in case we already have a token, either in
185- // the deployment's config or the global config.
186- val tryToken = settings.token(url)
187- if (tryToken != null && tryToken.first != existingToken) {
188- return tryToken
191+ // On the first run either open a browser to generate a new token
192+ // or, if using an existing token, use the token on disk if it
193+ // exists otherwise assume the user already copied an existing
194+ // token and they will paste in.
195+ if (! isRetry) {
196+ if (! useExisting) {
197+ openUrl(getTokenUrl)
198+ } else {
199+ // Look on disk in case we already have a token, either in
200+ // the deployment's config or the global config.
201+ val tryToken = settings.token(url)
202+ if (tryToken != null && tryToken.first != existingToken) {
203+ return tryToken
204+ }
189205 }
190206 }
191- }
192207
193- // On subsequent tries or if not using an existing token, ask the user
194- // for the token.
195- val tokenFromUser =
196- ask(
197- CoderGatewayBundle .message(
198- if (isRetry) {
199- " gateway.connector.view.workspaces. token. rejected"
208+ // On subsequent tries or if not using an existing token, ask the user
209+ // for the token.
210+ val tokenFromUser =
211+ ask(
212+ title = " Session Token " ,
213+ description = if (isRetry) {
214+ " This token was rejected by ${url.host} . "
200215 } else if (tokenSource == Source .CONFIG ) {
201- " gateway.connector.view.workspaces. token.injected- global"
216+ " This token was pulled from your global CLI config. "
202217 } else if (tokenSource == Source .DEPLOYMENT_CONFIG ) {
203- " gateway.connector.view.workspaces. token.injected "
218+ " This token was pulled from your CLI config for ${url.host} . "
204219 } else if (tokenSource == Source .LAST_USED ) {
205- " gateway.connector.view.workspaces. token. last- used"
220+ " This token was the last used token for ${url.host} . "
206221 } else if (tokenSource == Source .QUERY ) {
207- " gateway.connector.view.workspaces. token.query "
222+ " This token was pulled from the Gateway link from ${url.host} . "
208223 } else if (existingToken.isNotBlank()) {
209- " gateway.connector.view.workspaces. token.comment "
224+ " The last used token for ${url.host} is shown above. "
210225 } else {
211- " gateway.connector.view.workspaces. token.none "
226+ " No existing token for ${url.host} found. "
212227 },
213- url.host,
214- ),
215- isRetry,
216- Pair (
217- CoderGatewayBundle .message(" gateway.connector.view.login.token.label" ),
218- getTokenUrl.toString(),
219- ),
220- existingToken,
221- )
222- if (tokenFromUser.isNullOrBlank()) {
223- return null
224- }
225- if (tokenFromUser != existingToken) {
226- tokenSource = Source .USER
227- }
228- return Pair (tokenFromUser, tokenSource)
229- }
230-
231- fun askIDE (
232- name : String ,
233- agent : WorkspaceAgent ,
234- workspace : Workspace ,
235- cli : CoderCLIManager ,
236- client : CoderRestClient ,
237- workspaces : List <Workspace >,
238- ): WorkspaceProjectIDE ? {
239- var data: WorkspaceProjectIDE ? = null
240- ApplicationManager .getApplication().invokeAndWait {
241- val dialog =
242- CoderWorkspaceStepDialog (
243- name,
244- CoderWorkspacesStepSelection (agent, workspace, cli, client, workspaces),
228+ placeholder = existingToken,
229+ link = Pair (" Session Token:" , getTokenUrl.toString()),
230+ isError = isRetry,
245231 )
246- data = dialog.showAndGetData()
232+ if (tokenFromUser.isNullOrBlank()) {
233+ return null
234+ }
235+ if (tokenFromUser != existingToken) {
236+ tokenSource = Source .USER
237+ }
238+ return Pair (tokenFromUser, tokenSource)
247239 }
248- return data
249240}
0 commit comments