@@ -70,180 +70,171 @@ private class CoderWorkspaceStepDialog(
70
70
}
71
71
}
72
72
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
103
91
}
104
92
105
93
/* *
106
- * Generic function to ask for input.
94
+ * Dialog implementation for standalone Gateway.
95
+ *
96
+ * This is meant to mimic ToolboxUi.
107
97
*/
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
139
115
}
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
+ }
153
120
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" )
175
190
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
+ }
189
205
}
190
206
}
191
- }
192
207
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} . "
200
215
}else if (tokenSource== Source .CONFIG ) {
201
- " gateway.connector.view.workspaces. token.injected- global"
216
+ " This token was pulled from your global CLI config. "
202
217
}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} . "
204
219
}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} . "
206
221
}else if (tokenSource== Source .QUERY ) {
207
- " gateway.connector.view.workspaces. token.query "
222
+ " This token was pulled from the Gateway link from ${url.host} . "
208
223
}else if (existingToken.isNotBlank()) {
209
- " gateway.connector.view.workspaces. token.comment "
224
+ " The last used token for ${url.host} is shown above. "
210
225
}else {
211
- " gateway.connector.view.workspaces. token.none "
226
+ " No existing token for ${url.host} found. "
212
227
},
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,
245
231
)
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)
247
239
}
248
- return data
249
240
}