249 lines
6.4 KiB
Vue

<template>
<WizardCard>
<div>
<div class="mb-6 text-center">
<h1 class="text-2xl font-bold sm:text-center">New Bench</h1>
<p v-if="serverTitle" class="text-base text-gray-700">
Bench will be created on server
<span class="font-medium">{{ serverTitle.slice(0, -14) }}</span>
</p>
</div>
<div v-if="$resources.options.loading" class="flex justify-center">
<LoadingText />
</div>
<div class="space-y-8 sm:space-y-6" v-else>
<div>
<label class="text-lg font-semibold">
Choose a name for your bench
</label>
<p class="text-base text-gray-700">
Name your bench based on its purpose. For e.g., Personal Websites,
Staging Bench, etc.
</p>
<FormControl class="mt-2" v-model="benchTitle" />
</div>
<div v-if="regionOptions.length > 0">
<h2 class="text-lg font-semibold">Select Region</h2>
<p class="text-base text-gray-700">
Select the datacenter region where your bench should be created
</p>
<div class="mt-2">
<RichSelect
:value="selectedRegion"
@change="selectedRegion = $event"
:options="regionOptions"
/>
</div>
</div>
<div>
<label class="text-lg font-semibold"> Select a Jingrow version </label>
<p class="text-base text-gray-700">
Select a Jingrow version for your bench.
</p>
<FormControl
class="mt-2"
type="select"
v-model="selectedVersionName"
:options="versionOptions"
/>
</div>
<div v-if="selectedVersionName">
<label class="text-lg font-semibold"> Select apps to install </label>
<p class="text-base text-gray-700">
These apps will be available for sites on your bench. You can also
add apps to your bench later.
</p>
<div class="mt-4">
<AppSourceSelector
:apps="[
...selectedVersion.apps.filter(app => app.name === 'jingrow'),
...selectedVersion.apps.filter(app => app.name !== 'jingrow')
]"
v-model="selectedApps"
:multiple="true"
/>
</div>
</div>
<!-- Region consent checkbox -->
<div class="my-6">
<input
id="region-consent"
type="checkbox"
class="h-4 w-4 rounded border-gray-300 text-blue-600 focus:ring-blue-500"
v-model="agreedToRegionConsent"
/>
<label
for="region-consent"
class="ml-1 text-sm font-semibold text-gray-900"
>
I agree that the laws of the region selected by me shall stand
applicable to me and Jingrow.
</label>
</div>
<div class="flex justify-between">
<ErrorMessage class="mb-2" :message="$resources.createBench.error" />
<Button
variant="solid"
class="ml-auto"
:loading="$resources.createBench.loading"
@click="$resources.createBench.submit()"
>
Create Bench
</Button>
</div>
</div>
</div>
</WizardCard>
</template>
<script>
import WizardCard from '@/components/WizardCard.vue';
import AppSourceSelector from '@/components/AppSourceSelector.vue';
import RichSelect from '@/components/RichSelect.vue';
export default {
name: 'NewBench',
props: ['saas_app', 'server'],
components: {
WizardCard,
AppSourceSelector,
RichSelect
},
data() {
return {
benchTitle: null,
selectedVersionName: null,
selectedApps: [],
selectedRegion: null,
serverTitle: null,
agreedToRegionConsent: false
};
},
resources: {
options() {
return {
url: 'jcloud.api.bench.options',
initialData: {
versions: [],
clusters: []
},
auto: true,
onSuccess(options) {
if (!this.selectedVersionName) {
this.selectedVersionName = this.options.versions.filter(
v => v.default == 1
)[0].name;
}
if (!this.selectedRegion) {
this.selectedRegion = this.options.clusters[0].name;
}
}
};
},
createBench() {
return {
url: 'jcloud.api.bench.new',
params: {
bench: {
title: this.benchTitle,
version: this.selectedVersionName,
cluster: this.selectedRegion,
saas_app: this.saas_app || null,
apps: this.selectedApps.map(app => ({
name: app.app,
source: app.source.name
})),
server: this.server || null
}
},
validate() {
if (!this.benchTitle) {
return 'Bench Title cannot be blank';
}
if (!this.selectedVersionName) {
return 'Select a version to create bench';
}
if (this.selectedApps.length < 1) {
return 'Select atleast one app to create bench';
}
if (!this.agreedToRegionConsent) {
document.getElementById('region-consent').focus();
return 'Please agree to the above consent to create bench';
}
},
onSuccess(benchName) {
this.$router.push(`/groups/${benchName}`);
}
};
}
},
async mounted() {
if (this.server) {
let { title, cluster } = await this.$call(
'jcloud.api.server.get_title_and_cluster',
{
name: this.server
}
);
this.serverTitle = title;
this.selectedRegion = cluster;
}
},
watch: {
selectedVersionName() {
this.$nextTick(() => {
let jingrowApp = this.getJingrowApp(this.selectedVersion.apps);
this.selectedApps = [{ app: jingrowApp.name, source: jingrowApp.source }];
});
},
selectedApps: {
handler(newVal, oldVal) {
// dont remove jingrow app
let hasJingrow = newVal.find(app => app.app === 'jingrow');
if (!hasJingrow && oldVal) {
this.selectedApps = oldVal;
}
},
deep: true
}
},
methods: {
getJingrowApp(apps) {
return apps.find(app => app.name === 'jingrow');
}
},
computed: {
options() {
return this.$resources.options.data;
},
selectedVersion() {
return this.options.versions.find(
v => v.name === this.selectedVersionName
);
},
versionOptions() {
return this.options.versions.map(v => ({
label: `${v.name} (${v.status})`,
value: v.name
}));
},
regionOptions() {
let clusters = this.options.clusters;
if (this.server && this.selectedRegion) {
clusters = clusters.filter(
cluster => cluster.name === this.selectedRegion
);
}
return clusters.map(d => ({
label: d.title,
value: d.name,
image: d.image,
beta: d.beta
}));
}
}
};
</script>