packages/core/src/codecatalyst/vue/configure/root.vue (190 lines of code) (raw):
<template>
<div id="configure-header">
<h2 style="display: inline">Settings for {{ devenvName }}</h2>
<br />
</div>
<transition name="slide-down">
<div id="restart-notification" class="notification" v-if="canRestart">
<span id="notification-span">
<span id="info-notification-icon" class="icon icon-lg icon-vscode-info mr-8"></span>
<span>Restart your Dev Environment to update with changes.</span>
</span>
<button
id="restart-button"
type="button"
class="button-theme-primary ml-16"
:disabled="restarting"
@click="restart()"
>
{{ restarting ? 'Restarting...' : 'Restart' }}
</button>
</div>
</transition>
<settings-panel id="summary-panel" title="Details">
<summary-panel v-model="details" @edit-settings="editCompute"></summary-panel>
</settings-panel>
<settings-panel
id="dev-file-panel"
title="Devfile"
description="Contains the definition to build your application libraries and toolchain. You can change the currently
configured definition file."
>
<devfile-panel :file-path="definitionFilePath"></devfile-panel>
</settings-panel>
<settings-panel
id="compute-settings-panel"
title="Dev Environment Configuration"
description="All settings except Storage can be changed after creation."
>
<compute-panel v-model="compute" type="configure" @edit-settings="editCompute"></compute-panel>
</settings-panel>
</template>
<script lang="ts">
import summaryPanel, { VueModel as DevEnvDetailsModel } from '../summary.vue'
import computePanel, { VueModel as ComputeModel } from '../compute.vue'
import settingsPanel from '../../../webviews/components/settingsPanel.vue'
import devfilePanel from '../devfile.vue'
import { defineComponent } from 'vue'
import { CodeCatalystConfigureWebview } from './backend'
import { WebviewClientFactory } from '../../../webviews/client'
import saveData from '../../../webviews/mixins/saveData'
import { Status } from '../../../shared/clients/devenvClient'
import { DevEnvironmentSettings } from '../../commands'
const client = WebviewClientFactory.create<CodeCatalystConfigureWebview>()
const model = {
details: new DevEnvDetailsModel(),
definitionFilePath: '',
devenvUrl: '',
devfileStatus: 'STABLE' as Status,
compute: new ComputeModel(),
restarting: false,
needsRestart: false,
branchUrl: '',
}
export default defineComponent({
name: 'configure',
components: {
settingsPanel,
devfilePanel,
computePanel,
summaryPanel,
},
mixins: [saveData],
data() {
return model
},
computed: {
devenvName() {
const alias = this.details.alias
const branch = this.details.repositories[0]?.branchName
return alias ?? branch ?? this.details.id
},
canRestart() {
return (this.needsRestart || this.devfileStatus === 'CHANGED') && this.details.status === 'RUNNING'
},
// TODO(sijaden): add `busy` and then bind it to all components so they can disable things
},
created() {
client.init().then(env => {
this.details = env ? new DevEnvDetailsModel(env) : this.details
this.compute = env ? new ComputeModel(env) : this.compute
})
client.onDidChangeDevfile(data => {
this.devfileStatus = data.status ?? this.devfileStatus
})
if (!this.definitionFilePath) {
client.getDevfileLocation().then(f => (this.definitionFilePath = f))
}
},
methods: {
async editCompute(key: keyof DevEnvironmentSettings) {
const previous = this.compute[key as Exclude<typeof key, 'alias'>]
const current = { ...this.compute, alias: this.details.alias }
const resp = await client.editSetting(current, key)
if (key !== 'alias') {
this.needsRestart = this.needsRestart || previous !== resp[key]
this.compute = new ComputeModel(resp)
} else if (resp.alias) {
this.details.alias = resp.alias
await client.updateDevEnv(this.details, { alias: this.details.alias })
}
},
async restart() {
this.restarting = true
try {
if (this.devfileStatus === 'CHANGED' && !this.needsRestart) {
return await client.updateDevfile(this.definitionFilePath)
}
// SDK rejects extraneous fields
const resp = await client.updateDevEnv(this.details, {
instanceType: this.compute.instanceType,
inactivityTimeoutMinutes: this.compute.inactivityTimeoutMinutes,
// persistentStorage: this.compute.persistentStorage,
})
this.restarting = !!resp
} catch {
this.restarting = false
client.showLogsMessage('Unable to update the dev Environment. View the logs for more information')
}
},
},
})
</script>
<style scoped>
html {
overflow-y: scroll;
}
body {
padding-right: 12px;
}
#configure-header {
padding: 16px 0 0 0;
background-color: none;
position: relative;
}
.notification {
color: var(--vscode-notifications-foreground);
background-color: var(--vscode-notifications-background);
display: flex;
justify-content: flex-end;
align-items: center;
margin: 16px 0;
padding: 12px;
box-shadow: 2px 2px 8px #111111;
position: sticky;
}
#notification-span {
display: flex;
justify-content: left;
align-items: inherit;
width: 100%;
flex-grow: 0;
}
#restart-button {
font-size: small;
width: 100px;
flex-grow: 1;
}
#info-notification-icon {
color: var(--vscode-notificationsInfoIcon-foreground);
}
.slide-down-enter-active {
transition: all 0.4s ease-in-out;
}
.slide-down-leave-active {
transition: none;
}
.slide-down-enter-from {
margin-bottom: -70px;
transform: translateY(-70px);
top: -70px;
}
.slide-down-enter-to {
margin-bottom: 0px;
top: 16px;
}
#restart-notification {
z-index: 1;
top: 16px;
}
</style>