Skip to content

[WIP ]Toolbox ramp up #532

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 15 commits into from
Closed
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
impl: update class usages (1)
- to reflect the new toolbox api
  • Loading branch information
fioan89 committed Feb 12, 2025
commit aa60ea8b0fc72b78ecdac473599fc8f1231e0ee2
20 changes: 10 additions & 10 deletions src/main/kotlin/com/coder/gateway/CoderGatewayExtension.kt
Original file line number Diff line number Diff line change
@@ -1,22 +1,22 @@
package com.coder.gateway

import com.jetbrains.toolbox.gateway.GatewayExtension
import com.jetbrains.toolbox.gateway.PluginSecretStore
import com.jetbrains.toolbox.gateway.PluginSettingsStore
import com.jetbrains.toolbox.gateway.RemoteEnvironmentConsumer
import com.jetbrains.toolbox.gateway.RemoteProvider
import com.jetbrains.toolbox.gateway.ToolboxServiceLocator
import com.jetbrains.toolbox.gateway.ui.ObservablePropertiesFactory
import com.jetbrains.toolbox.gateway.ui.ToolboxUi
import com.jetbrains.toolbox.api.core.PluginSecretStore
import com.jetbrains.toolbox.api.core.PluginSettingsStore
import com.jetbrains.toolbox.api.core.ServiceLocator
import com.jetbrains.toolbox.api.remoteDev.RemoteDevExtension
import com.jetbrains.toolbox.api.remoteDev.RemoteEnvironmentConsumer
import com.jetbrains.toolbox.api.remoteDev.RemoteProvider
import com.jetbrains.toolbox.api.ui.ToolboxUi
import com.jetbrains.toolbox.api.ui.observables.ObservablePropertiesFactory
import kotlinx.coroutines.CoroutineScope
import okhttp3.OkHttpClient

/**
* Entry point into the extension.
*/
class CoderGatewayExtension : GatewayExtension {
class CoderGatewayExtension : RemoteDevExtension {
// All services must be passed in here and threaded as necessary.
override fun createRemoteProviderPluginInstance(serviceLocator: ToolboxServiceLocator): RemoteProvider = CoderRemoteProvider(
override fun createRemoteProviderPluginInstance(serviceLocator: ServiceLocator): RemoteProvider = CoderRemoteProvider(
serviceLocator.getService(OkHttpClient::class.java),
serviceLocator.getService(RemoteEnvironmentConsumer::class.java),
serviceLocator.getService(CoroutineScope::class.java),
Expand Down
26 changes: 16 additions & 10 deletions src/main/kotlin/com/coder/gateway/CoderRemoteEnvironment.kt
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,14 @@ import com.coder.gateway.models.WorkspaceAndAgentStatus
import com.coder.gateway.sdk.CoderRestClient
import com.coder.gateway.sdk.v2.models.Workspace
import com.coder.gateway.sdk.v2.models.WorkspaceAgent
import com.coder.gateway.util.withPath
import com.coder.gateway.views.Action
import com.coder.gateway.views.EnvironmentView
import com.jetbrains.toolbox.gateway.AbstractRemoteProviderEnvironment
import com.jetbrains.toolbox.gateway.EnvironmentVisibilityState
import com.jetbrains.toolbox.gateway.environments.EnvironmentContentsView
import com.jetbrains.toolbox.gateway.states.EnvironmentStateConsumer
import com.jetbrains.toolbox.gateway.ui.ObservablePropertiesFactory
import com.jetbrains.toolbox.gateway.ui.ToolboxUi
import com.jetbrains.toolbox.api.remoteDev.AbstractRemoteProviderEnvironment
import com.jetbrains.toolbox.api.remoteDev.EnvironmentVisibilityState
import com.jetbrains.toolbox.api.remoteDev.environments.EnvironmentContentsView
import com.jetbrains.toolbox.api.remoteDev.states.EnvironmentStateConsumer
import com.jetbrains.toolbox.api.ui.ToolboxUi
import com.jetbrains.toolbox.api.ui.observables.ObservablePropertiesFactory
import java.util.concurrent.CompletableFuture

/**
Expand All @@ -34,17 +33,20 @@ class CoderRemoteEnvironment(
init {
actionsList.add(
Action("Open web terminal") {
ui.openUrl(client.url.withPath("/${workspace.ownerName}/$name/terminal").toString())
// TODO - check this later
// ui.openUrl(client.url.withPath("/${workspace.ownerName}/$name/terminal").toString())
},
)
actionsList.add(
Action("Open in dashboard") {
ui.openUrl(client.url.withPath("/@${workspace.ownerName}/${workspace.name}").toString())
// TODO - check this later
// ui.openUrl(client.url.withPath("/@${workspace.ownerName}/${workspace.name}").toString())
},
)
actionsList.add(
Action("View template") {
ui.openUrl(client.url.withPath("/templates/${workspace.templateName}").toString())
// TODO - check this later
// ui.openUrl(client.url.withPath("/templates/${workspace.templateName}").toString())
},
)
actionsList.add(
Expand Down Expand Up @@ -112,6 +114,10 @@ class CoderRemoteEnvironment(
return super.addStateListener(consumer)
}

override fun onDelete() {
throw NotImplementedError()
}

/**
* An environment is equal if it has the same ID.
*/
Expand Down
29 changes: 16 additions & 13 deletions src/main/kotlin/com/coder/gateway/CoderRemoteProvider.kt
Original file line number Diff line number Diff line change
Expand Up @@ -16,16 +16,17 @@ import com.coder.gateway.views.ConnectPage
import com.coder.gateway.views.NewEnvironmentPage
import com.coder.gateway.views.SignInPage
import com.coder.gateway.views.TokenPage
import com.jetbrains.toolbox.gateway.PluginSecretStore
import com.jetbrains.toolbox.gateway.PluginSettingsStore
import com.jetbrains.toolbox.gateway.ProviderVisibilityState
import com.jetbrains.toolbox.gateway.RemoteEnvironmentConsumer
import com.jetbrains.toolbox.gateway.RemoteProvider
import com.jetbrains.toolbox.gateway.ui.AccountDropdownField
import com.jetbrains.toolbox.gateway.ui.ObservablePropertiesFactory
import com.jetbrains.toolbox.gateway.ui.RunnableActionDescription
import com.jetbrains.toolbox.gateway.ui.ToolboxUi
import com.jetbrains.toolbox.gateway.ui.UiPage
import com.jetbrains.toolbox.api.core.PluginSecretStore
import com.jetbrains.toolbox.api.core.PluginSettingsStore
import com.jetbrains.toolbox.api.core.ui.icons.SvgIcon
import com.jetbrains.toolbox.api.remoteDev.ProviderVisibilityState
import com.jetbrains.toolbox.api.remoteDev.RemoteEnvironmentConsumer
import com.jetbrains.toolbox.api.remoteDev.RemoteProvider
import com.jetbrains.toolbox.api.ui.ToolboxUi
import com.jetbrains.toolbox.api.ui.actions.RunnableActionDescription
import com.jetbrains.toolbox.api.ui.components.AccountDropdownField
import com.jetbrains.toolbox.api.ui.components.UiPage
import com.jetbrains.toolbox.api.ui.observables.ObservablePropertiesFactory
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Job
import kotlinx.coroutines.delay
Expand Down Expand Up @@ -186,8 +187,9 @@ class CoderRemoteProvider(
}

override fun getName(): String = "Coder Gateway"
override fun getSvgIcon(): ByteArray =
this::class.java.getResourceAsStream("/icon.svg")?.readAllBytes() ?: byteArrayOf()
override fun getSvgIcon(): SvgIcon =
SvgIcon(this::class.java.getResourceAsStream("/icon.svg")?.readAllBytes() ?: byteArrayOf())

override fun getNoEnvironmentsSvgIcon(): ByteArray =
this::class.java.getResourceAsStream("/icon.svg")?.readAllBytes() ?: byteArrayOf()

Expand Down Expand Up @@ -254,7 +256,8 @@ class CoderRemoteProvider(
* than using multiple root pages.
*/
private fun reset() {
ui.showPluginEnvironmentsPage()
// TODO - check this later
// ui.showPluginEnvironmentsPage()
}

/**
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.coder.gateway.services

import com.jetbrains.toolbox.gateway.PluginSecretStore
import com.jetbrains.toolbox.api.core.PluginSecretStore


/**
* Provides Coder secrets backed by the secrets store service.
Expand Down
35 changes: 16 additions & 19 deletions src/main/kotlin/com/coder/gateway/views/CoderPage.kt
Original file line number Diff line number Diff line change
@@ -1,13 +1,12 @@
package com.coder.gateway.views

import com.jetbrains.toolbox.gateway.ui.RunnableActionDescription
import com.jetbrains.toolbox.gateway.ui.UiField
import com.jetbrains.toolbox.gateway.ui.UiPage
import com.jetbrains.toolbox.gateway.ui.ValidationErrorField
import com.jetbrains.toolbox.api.core.ui.icons.SvgIcon
import com.jetbrains.toolbox.api.ui.actions.RunnableActionDescription
import com.jetbrains.toolbox.api.ui.components.UiField
import com.jetbrains.toolbox.api.ui.components.UiPage
import com.jetbrains.toolbox.api.ui.components.ValidationErrorField
import org.slf4j.LoggerFactory
import java.util.function.BiConsumer
import java.util.function.Consumer
import java.util.function.Function

/**
* Base page that handles the icon, displaying error notifications, and
Expand Down Expand Up @@ -35,7 +34,7 @@ abstract class CoderPage(
private var notifier: Consumer<Throwable>? = null

/** Used to get field values. */
private var getter: Function<UiField, *>? = null
private var stateAccessor: UiPage.UiFieldStateAccessor? = null

/** Let Toolbox know the fields should be updated. */
protected var listener: Consumer<UiField?>? = null
Expand All @@ -48,12 +47,13 @@ abstract class CoderPage(
*
* This seems to only work on the first page.
*/
override fun getSvgIcon(): ByteArray =
if (showIcon) {
this::class.java.getResourceAsStream("/icon.svg")?.readAllBytes() ?: byteArrayOf()
override fun getSvgIcon(): SvgIcon {
return if (showIcon) {
SvgIcon(this::class.java.getResourceAsStream("/icon.svg")?.readAllBytes() ?: byteArrayOf())
} else {
byteArrayOf()
SvgIcon(byteArrayOf())
}
}

/**
* Show an error as a popup on this page.
Expand All @@ -70,9 +70,8 @@ abstract class CoderPage(
* TODO@JB: Is this really meant to be used with casting? I kind of expected
* to be able to do `myField.value`.
*/
fun get(field: UiField): Any {
val getter = getter ?: throw Exception("Page is not being displayed")
return getter.apply(field)
fun get(field: UiField): Any? {
return stateAccessor?.get(field)
}

/**
Expand All @@ -82,11 +81,9 @@ abstract class CoderPage(
this.listener = listener
}

/**
* The setter is unused but the getter is used to get field values.
*/
override fun setStateAccessor(setter: BiConsumer<UiField, Any>?, getter: Function<UiField, *>?) {
this.getter = getter

override fun setStateAccessor(stateAccessor: UiPage.UiFieldStateAccessor?) {
this.stateAccessor = stateAccessor
}

/**
Expand Down
10 changes: 5 additions & 5 deletions src/main/kotlin/com/coder/gateway/views/CoderSettingsPage.kt
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
package com.coder.gateway.views

import com.coder.gateway.services.CoderSettingsService
import com.jetbrains.toolbox.gateway.ui.CheckboxField
import com.jetbrains.toolbox.gateway.ui.RunnableActionDescription
import com.jetbrains.toolbox.gateway.ui.TextField
import com.jetbrains.toolbox.gateway.ui.TextType
import com.jetbrains.toolbox.gateway.ui.UiField
import com.jetbrains.toolbox.api.ui.actions.RunnableActionDescription
import com.jetbrains.toolbox.api.ui.components.CheckboxField
import com.jetbrains.toolbox.api.ui.components.TextField
import com.jetbrains.toolbox.api.ui.components.TextType
import com.jetbrains.toolbox.api.ui.components.UiField

/**
* A page for modifying Coder settings.
Expand Down
Loading