Skip to content
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

Dev #38

Merged
merged 20 commits into from
Oct 23, 2024
Merged

Dev #38

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
Removing TomSelect because it is no longer updated
fotisp committed Aug 20, 2024
commit eb2bbad2a890e8254d56fd7ac8a1ff29278c3873
1 change: 1 addition & 0 deletions gui/.gitignore
Original file line number Diff line number Diff line change
@@ -28,3 +28,4 @@ yarn.lock
/gerrit

!.env.docker
.env
2 changes: 1 addition & 1 deletion gui/Dockerfile
Original file line number Diff line number Diff line change
@@ -4,7 +4,7 @@ WORKDIR /app
COPY package*.json ./
COPY .env.docker ./.env

RUN npm install
RUN npm install --include-dev
COPY ./ .
RUN npm run build

9 changes: 5 additions & 4 deletions gui/package.json
Original file line number Diff line number Diff line change
@@ -3,7 +3,7 @@
"private": true,
"version": "0.0.0",
"engines": {
"node": "v20.9.0"
"node": "v20.13.1"
},
"scripts": {
"serve": "vite",
@@ -52,13 +52,13 @@
"tiny-slider": "^2.9.4",
"tippy.js": "^6.3.7",
"toastify-js": "^1.12.0",
"tom-select": "^2.3.1",
"uuid": "^9.0.1",
"vite-svg-loader": "^5.1.0",
"vue": "^3.3.9",
"vue-draggable-next": "^2.2.1",
"vue-multiselect": "^3.0.0-beta.3",
"vue-router": "^4.1.6",
"xlsx": "^0.18.5",
"vue3-select-component": "^0.5.2",
"zoom-vanilla.js": "^2.0.6"
},
"devDependencies": {
@@ -76,6 +76,7 @@
"@typescript-eslint/parser": "^6.10.0",
"@vitejs/plugin-vue": "^4.2.3",
"@vue/eslint-config-standard": "^8.0.1",
"add": "^2.0.6",
"autoprefixer": "^10.4.14",
"eslint": "^8.53.0",
"eslint-config-prettier": "^9.0.0",
@@ -93,6 +94,6 @@
"typescript": "^5.2.2",
"vite": "^4.4.2",
"vue-eslint-parser": "^9.3.2",
"vue-tsc": "^1.8.22"
"vue-tsc": "^2.0.29"
}
}
7 changes: 5 additions & 2 deletions gui/src/assets/css/app.css
Original file line number Diff line number Diff line change
@@ -37,7 +37,6 @@
@import "simplebar/src/simplebar.css";
@import "dropzone/dist/dropzone.css";
@import "tabulator-tables/dist/css/tabulator.css";
@import "tom-select/dist/css/tom-select.css";
@import "zoom-vanilla.js/dist/zoom.css";
@import "toastify-js/src/toastify.css";
@import "highlight.js/styles/github.css";
@@ -48,6 +47,7 @@
@import "tiny-slider/dist/tiny-slider.css";
@import "leaflet/dist/leaflet.css";
@import "leaflet.markercluster/dist/MarkerCluster.css";
@import "vue-multiselect/dist/vue-multiselect.css";

/*
|--------------------------------------------------------------------------
@@ -73,9 +73,12 @@
@import "./components/_toastify.css";
@import "./components/_transitions.css";
@import "./components/_zoom-vanilla.css";
@import "./components/_tom-select.css";
@import "./components/_ckeditor.css";
@import "./components/_litepicker.css";
@import "./components/_full-calendar.css";
@import "./components/_tabulator.css";
@import "./components/_vue-multiselect.css";
@import "./components/_main.css";



173 changes: 0 additions & 173 deletions gui/src/assets/css/components/_tom-select.css

This file was deleted.

78 changes: 78 additions & 0 deletions gui/src/assets/css/components/_vue-multiselect.css
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
.dark{

.multiselect,
.multiselect__input,
.multiselect__single {
font-family: inherit;
font-size: inherit;
}

.multiselect {
color: inherit;
}

.multiselect__content-wrapper {
background: theme('colors.darkmode.700');

}

.multiselect--disabled {
background: theme('colors.darkmode.700');
}

.multiselect__tag{
color:inherit;
background: theme('colors.darkmode.600');
}

.multiselect__tags {
background: theme('colors.darkmode.800');
border-radius: theme('borderRadius.DEFAULT');
font-size:inherit;

}
.multiselect__tag-icon::after {
color: theme('colors.slate.500');
}

.multiselect__tag-icon:focus::after,
.multiselect__tag-icon:hover::after {
color: white;
}

.multiselect__option--highlight {
background:theme('colors.slate.500');
outline: none;
color: white;
}

.multiselect__option--highlight::after {
content: attr(data-select);
background:theme('colors.slate.500');
color: white;
}


.multiselect__option--selected {
background: theme('colors.slate.700');
color: inherit;
font-weight: bold;
}

.multiselect__input::placeholder {
color: theme("colors.slate.500");
}

.multiselect__input,
.multiselect__single{
background: theme('colors.darkmode.700');
}


.multiselect__spinner::before,
.multiselect__spinner::after{
border-color: theme('colors.slate.600') transparent transparent;
}

}

118 changes: 0 additions & 118 deletions gui/src/base-components/TomSelect/TomSelect.vue

This file was deleted.

3 changes: 0 additions & 3 deletions gui/src/base-components/TomSelect/index.ts

This file was deleted.

145 changes: 0 additions & 145 deletions gui/src/base-components/TomSelect/tom-select.ts

This file was deleted.

91 changes: 65 additions & 26 deletions gui/src/components/Application/Details.vue
Original file line number Diff line number Diff line change
@@ -40,27 +40,15 @@
<Table.Td class="w-1/3">
<div class="flex flex-col">
<div>
<TomSelect
<VueSelect
v-model="variable.name"
class="w-60"
:class="{
'input--invalid': v.name?.$error || hasBackendError(`variables[${index}].name`)
}"
>
<template v-if="autocompleteOptions.length">
<option v-if="!variable.name" value="">Please select key</option>
<option
v-for="(option, variableOptionIndex) in autocompleteOptions"
:key="variableOptionIndex"
:value="option.value"
>
{{ option.label }}
</option>
</template>
<template v-else>
<option>No keys available</option>
</template>
</TomSelect>
:options="autocompleteOptions"

/>
</div>
</div>
</Table.Td>
@@ -172,22 +160,20 @@
</template>

<script setup lang="ts">
import { computed, Ref, inject, reactive, ref } from "vue"
import STAGES from "@/components/Application/stages.ts"
import {computed, inject, reactive, Ref, ref} from "vue"
import Lucide from "@/base-components/Lucide/Lucide.vue"
import Input from "@/base-components/Form/FormInput.vue"
import { IVariable } from "@/interfaces/variables.interface.ts"
import {IVariable} from "@/interfaces/variables.interface.ts"
import {IEnvironment} from "@/interfaces/environment.interface.ts";
import { debounce } from "@/utils/helper.ts"
import { useApplicationStore } from "@/store/modules/application.ts"
import { helpers, required } from "@vuelidate/validators"
import { ValidateEach } from "@vuelidate/components"
import { useVuelidate } from "@vuelidate/core"
import {debounce} from "@/utils/helper.ts"
import {useApplicationStore} from "@/store/modules/application.ts"
import {required} from "@vuelidate/validators"
import {ValidateEach} from "@vuelidate/components"
import {useVuelidate} from "@vuelidate/core"
import MonacoEditor from "@/base-components/MonacoEditor/MonacoEditor.vue"
import Table from "@/base-components/Table"
import TomSelect from "@/base-components/TomSelect/TomSelect.vue"
import FormCheck from "@/base-components/Form/FormCheck/FormCheck.vue";
import {FormSwitch} from "@/base-components/Form";
import VueSelect from "vue3-select-component";
interface DetailsProps {
payload: {
@@ -271,3 +257,56 @@ defineExpose({
</script>
<style>
:root {
--vs-input-bg: theme("colors.slate.800");
--vs-input-outline: theme("colors.slate.800");
--vs-input-placeholder-color: theme("colors.darkmode.600");
--vs-padding: 0.25rem 0.5rem;
--vs-border: theme("colors.darkmode.800");
--vs-border-radius: theme("borderRadius.DEFAULT");
--vs-font-size: inherit;
--vs-font-weight: theme("fontWeight.medium");
--vs-font-family: inherit;
--vs-text-color: inherit;
--vs-line-height: 1.5;
--vs-menu-offset-top: 8px;
--vs-menu-height: 200px;
--vs-menu-padding: 0;
--vs-menu-border: theme("colors.darkmode.800");
--vs-menu-bg: theme("colors.darkmode.700");
--vs-menu-box-shadow: none;
--vs-menu-z-index: 2;
--vs-option-padding: 8px 12px;
--vs-option-font-size: var(--vs-font-size);
--vs-option-font-weight: var(--vs-font-weight);
--vs-option-text-color: var(--vs-text-color);
--vs-option-bg: var(--vs-menu-bg);
--vs-option-hover-color: theme("colors.darkmode.400");
--vs-option-focused-color: var(--vs-option-hover-color);
--vs-option-selected-color: theme("colors.darkmode.600");
--vs-option-disabled-color: theme("colors.darkmode.600");
--vs-option-disabled-text-color: theme("colors.slate.100");
--vs-multi-value-gap: 4px;
--vs-multi-value-padding: 4px;
--vs-multi-value-font-size: 14px;
--vs-multi-value-font-weight: 400;
--vs-multi-value-line-height: 1;
--vs-multi-value-text-color: inherit;
--vs-multi-value-bg: theme("colors.darkmode.800");
--vs-multi-value-xmark-size: 16px;
--vs-multi-value-xmark-color: theme("colors.slate.100");
--vs-indicators-gap: 4px;
--vs-icon-size: 20px;
--vs-icon-color: var(--vs-text-color);
--vs-dropdown-transition: transform 0.25s ease-out;
}
</style>
65 changes: 24 additions & 41 deletions gui/src/components/Application/Metrics/MetricsTemplateDesktop.vue
Original file line number Diff line number Diff line change
@@ -111,25 +111,17 @@

<div v-if="metric.level === 'components' && metric.components" class="flex flex-col">
<Label>Components</Label>
<TomSelect
v-model="metric.components"
class="w-full"
multiple
:class="{

<VueSelect
v-model="metric.components"
class="w-full"
:is-multi="true"
:class="{
'input--invalid': v.components?.$error || hasBackendError(`metrics[${index}].components`)
}"
>
<template v-if="componentList.length">
<option
v-for="(option, componentOptionIndex) in componentList"
:key="componentOptionIndex"
:value="option.value"
>
{{ option.label }}
</option>
</template>
<template v-else> <option>No keys available</option> </template>
</TomSelect>
}"
:options="componentList"
/>

</div>

</div>
@@ -306,25 +298,16 @@

<div v-if="metric.level === 'components' && metric.components" class="flex flex-col">
<Label>Components</Label>
<TomSelect
<VueSelect
v-model="metric.components"
:is-multi="true"
class="w-full"
multiple
:class="{
'input--invalid': v.components?.$error || hasBackendError(`metrics[${index}].components`)
}"
>
<template v-if="componentList.length">
<option
v-for="(option, componentOptionIndex) in componentList"
:key="componentOptionIndex"
:value="option.value"
>
{{ option.label }}
</option>
</template>
<template v-else> <option>No keys available</option> </template>
</TomSelect>
}"
:options="componentList"
/>

</div>
</div>

@@ -389,21 +372,21 @@
</template>

<script setup lang="ts">
import { computed, Ref, inject, ref } from "vue"
import { useMetrics } from "@/components/Application/Metrics/MetricsComposable.ts"
import { Disclosure } from "@/base-components/Headless"
import { ValidateEach } from "@vuelidate/components"
import { FormCheck } from "@/base-components/Form"
import { IMetricComposite, IMetricRaw } from "@/interfaces/metrics.interface.ts"
import { UNIT_TIME_OPTIONS, BEHAVIOR_OPTIONS, BEHAVIOR_OPTIONS_INPUT ,BEHAVIOR_OPTIONS_OUTPUT} from "@/constants"
import {computed, inject, Ref, ref} from "vue"
import {useMetrics} from "@/components/Application/Metrics/MetricsComposable.ts"
import {Disclosure} from "@/base-components/Headless"
import {ValidateEach} from "@vuelidate/components"
import {FormCheck} from "@/base-components/Form"
import {IMetricComposite, IMetricRaw} from "@/interfaces/metrics.interface.ts"
import {BEHAVIOR_OPTIONS, BEHAVIOR_OPTIONS_INPUT, BEHAVIOR_OPTIONS_OUTPUT, UNIT_TIME_OPTIONS} from "@/constants"
import Select from "@/base-components/Form/FormSelect.vue"
import Label from "@/base-components/Form/FormLabel.vue"
import Input from "@/base-components/Form/FormInput.vue"
import Lucide from "@/base-components/Lucide/Lucide.vue"
import ArrowDown from "@/assets/svg/ArrowDown.svg"
import Table from "@/base-components/Table"
import MonacoEditor from "@/base-components/MonacoEditor/MonacoEditor.vue"
import TomSelect from "@/base-components/TomSelect/TomSelect.vue"
import VueSelect from "vue3-select-component";
const pathsWithError = inject<Ref<Array<string>>>("pathsWithError")
22 changes: 5 additions & 17 deletions gui/src/components/Application/Metrics/MetricsTemplateMobile.vue
Original file line number Diff line number Diff line change
@@ -86,25 +86,15 @@

<div v-if="metric.level === 'components' && metric.components" class="flex flex-col">
<Label>Components</Label>
<TomSelect
<VueSelect
v-model="metric.components"
class="w-full"
multiple
:is-multi="true"
:class="{
'input--invalid': v.components?.$error || hasBackendError(`metrics[${index}].components`)
}"
>
<template v-if="componentList.length">
<option
v-for="(option, componentOptionIndex) in componentList"
:key="componentOptionIndex"
:value="option.value"
>
{{ option.label }}
</option>
</template>
<template v-else> <option>No keys available</option> </template>
</TomSelect>
:options="componentList"
/>
</div>

<div class="flex flex-col">
@@ -328,9 +318,7 @@ import ArrowDown from "@/assets/svg/ArrowDown.svg"
import Textarea from "@/base-components/Form/FormTextarea.vue"
import { IMetricComposite, IMetricRaw } from "@/interfaces/metrics.interface.ts"
import { useMetrics } from "@/components/Application/Metrics/MetricsComposable.ts"
import TomSelect from "@/base-components/TomSelect/TomSelect.vue"
import MonacoEditor from "@/base-components/MonacoEditor/MonacoEditor.vue"
import VueSelect from "vue3-select-component";
const pathsWithError = inject<Ref<Array<string>>>("pathsWithError")
const emit = defineEmits<{
314 changes: 154 additions & 160 deletions gui/src/components/Modal/ResourceForm.vue
Original file line number Diff line number Diff line change
@@ -1,178 +1,172 @@
<template>
<form>
<Dialog.Description class="grid grid-cols-3 gap-4 p-4" :class=" availableInPlatform(['OPENSTACK','AWS']) ? 'grid-cols-3' : 'grid-cols-2' "
>
<div class="col-span-3 p-0">
<div class="mb-3">
<Label>Name</Label>
<Input
type="text"
v-model="resourceData.title"
:class="{
<Dialog.Description class="grid grid-cols-3 gap-4 p-4"
:class=" availableInPlatform(['OPENSTACK','AWS']) ? 'grid-cols-3' : 'grid-cols-2' "
>
<div class="col-span-3 p-0">
<div class="mb-3">
<Label>Name</Label>
<Input
type="text"
v-model="resourceData.title"
:class="{
'input--invalid': v$.title.$error
}"
/>
</div>
<div class="flex flex-col">
<Label>Platform</Label>
<Select
v-model="resourceData.platform.uuid"
:class="{
/>
</div>
<div class="flex flex-col">
<Label>Platform</Label>
<Select
v-model="resourceData.platform.uuid"
:class="{
'input--invalid': v$.platform.$error
}"
>
<option v-for="(platform, index) in platformsOptions" :key="index" :value="platform.uuid">
{{ platform.title }}
</option>
</Select>
</div>
<div v-if="availableInPlatform(['OPENSTACK','AWS'])"
class="flex flex-col"
>
<div class="mt-4 mb-3">
<Label>Regions</Label>
<div v-if="availableInPlatform(['AWS'])"
>

<TomSelect
v-model="resourceData.regions"
class="w-full"
multiple
>
<template v-if="availableRegions['AWS'].length">
<option
v-for="(option, componentOptionIndex) in availableRegions['AWS']"
:key="componentOptionIndex"
:value="option.region"
>
{{ option.region }} ({{option.region_name}})
</option>
</template>
</TomSelect>
<option v-for="(platform, index) in platformsOptions" :key="index" :value="platform.uuid">
{{ platform.title }}
</option>
</Select>
</div>
<div v-if="availableInPlatform(['OPENSTACK','AWS'])"
class="flex flex-col"
>
<div class="mt-4 mb-3">
<Label>Regions</Label>
<div v-if="availableInPlatform(['AWS'])"
>
<VueMultiselect
v-model="resourceData.regions"
:close-on-select="true"
:clear-on-select="false"
:multiple="true"
placeholder="Select Region"
label="region_name"
track-by="region"
:options="availableRegions['AWS']">
</VueMultiselect>
</div>
<Input type="text"
v-if="availableInPlatform(['OPENSTACK'])"
v-model="resourceData.regions"/>
</div>
<Input type="text"
v-if="availableInPlatform(['OPENSTACK'])"
v-model="resourceData.regions"/>
</div>
</div>
</div>
<div class="flex flex-col">
<h3 class="font-bold text-lg mb-2">General</h3>

<div class="flex flex-col">
<Label>Default Network</Label>
<Input
type="text"
v-model="resourceData.defaultNetwork"
/>
</div>
<div class="flex flex-col">
<Label>Subnet</Label>
<Input
type="text"
v-model="resourceData.subnet"
/>
</div>
<h3 class="font-bold text-lg mb-2">General</h3>

<div class="flex flex-col">
<Label>Endpoint</Label>
<Input
type="text"
v-model="resourceData.endpoint"
/>
</div>
<div class="flex flex-col">
<Label>Default Network</Label>
<Input
type="text"
v-model="resourceData.defaultNetwork"
/>
</div>
<div class="flex flex-col">
<Label>Subnet</Label>
<Input
type="text"
v-model="resourceData.subnet"
/>
</div>

<div class="flex flex-col">
<Label>Identity Version</Label>
<Input
type="text"
v-model="resourceData.identityVersion"
/>
</div>
<div class="flex flex-col">
<Label>Security Group</Label>
<Input
type="text"
v-model="resourceData.securityGroup"
/>
</div>
<div class="flex flex-col">
<Label>Endpoint</Label>
<Input
type="text"
v-model="resourceData.endpoint"
/>
</div>

<div class="flex flex-col">
<Label>Identity Version</Label>
<Input
type="text"
v-model="resourceData.identityVersion"
/>
</div>
<div class="flex flex-col">
<Label>Security Group</Label>
<Input
type="text"
v-model="resourceData.securityGroup"
/>
</div>

</div>
<div class="flex flex-col">
<h3 class="font-bold text-lg mb-2">Credentials</h3>
<div class="flex flex-col">
<Label>Username</Label>
<Input
type="text"
v-model="resourceData.credentials.user"
/>
</div>
<div class="flex flex-col">
<Label>Secret</Label>
<Input
type="text"
v-model="resourceData.credentials.secret"
/>
</div>
<h3 class="font-bold text-lg mb-2">Credentials</h3>
<div class="flex flex-col">
<Label>Username</Label>
<Input
type="text"
v-model="resourceData.credentials.user"
/>
</div>
<div class="flex flex-col">
<Label>Secret</Label>
<Input
type="text"
v-model="resourceData.credentials.secret"
/>
</div>

<div class="flex flex-col">
<Label>Domain</Label>
<Input
type="text"
v-model="resourceData.credentials.domain"
/>
</div>
<div class="flex flex-col">
<Label>Domain</Label>
<Input
type="text"
v-model="resourceData.credentials.domain"
/>
</div>


</div>
<div class="flex flex-col">
</div>
<div class="flex flex-col">

<h3 class="font-bold text-lg mb-2"
v-if="availableInPlatform(['OPENSTACK','AWS'])"
>SSH Credentials</h3>
<h3 class="font-bold text-lg mb-2"
v-if="availableInPlatform(['OPENSTACK','AWS'])"
>SSH Credentials</h3>


<div class="flex flex-col"
v-if="availableInPlatform(['OPENSTACK','AWS'])"
>
<Label>Username</Label>
<Input
type="text"
v-model="resourceData.sshCredentials.username"
<div class="flex flex-col"
v-if="availableInPlatform(['OPENSTACK','AWS'])"
>
<Label>Username</Label>
<Input
type="text"
v-model="resourceData.sshCredentials.username"

/>
</div>
/>
</div>

<div class="flex flex-col"
v-if="availableInPlatform(['OPENSTACK','AWS'])"
>
<Label>Key Pair Name</Label>
<Input
autocomplete="false"
type="password"
v-model="resourceData.sshCredentials.keyPairName"
/>
</div>
<div class="flex flex-col"
v-if="availableInPlatform(['OPENSTACK','AWS'])"
>
<Label>Key Pair Name</Label>
<Input
autocomplete="false"
type="password"
v-model="resourceData.sshCredentials.keyPairName"
/>
</div>

<div class="flex flex-col"
v-if="availableInPlatform(['OPENSTACK','AWS'])"
>
<Label>Key Private Key</Label>
<Input
autocomplete="false"
type="password"
v-model="resourceData.sshCredentials.privateKey"
/>
</div>
<div class="flex flex-col"
v-if="availableInPlatform(['OPENSTACK','AWS'])"
>
<Label>Key Private Key</Label>
<Input
autocomplete="false"
type="password"
v-model="resourceData.sshCredentials.privateKey"
/>
</div>

</div>
</Dialog.Description>
</div>
</Dialog.Description>
</form>
</template>
<script setup lang="ts">
import { reactive, ref } from "vue"
import {FormTextarea} from "@/base-components/Form";
import { Dialog } from "@/base-components/Headless"
import {computed, watch, reactive, ref} from "vue"
import {Dialog} from "@/base-components/Headless"
import Input from "../../base-components/Form/FormInput.vue";
import Label from "../../base-components/Form/FormLabel.vue";
import Select from "../../base-components/Form/FormSelect.vue";
@@ -181,16 +175,17 @@ import {IPlatform} from "@/interfaces/platform.interface.ts";
import {useResourceStore} from "@/store/modules/resources.ts";
import {IResourcePayload} from "@/types/resource.ts";
import {useVuelidate} from "@vuelidate/core";
import TomSelect from "@/base-components/TomSelect";
import VueMultiselect from "vue-multiselect";
import {IRegion, IRegions} from "@/interfaces/resources.interface.ts";
const resourceStore = useResourceStore()
const props = defineProps(['resourceData','rules'])
const props = defineProps(['resourceData', 'rules'])
const resourceData = ref<IResourcePayload>(props.resourceData)
console.log(resourceData)
const availableRegions = {
'AWS':[
const availableRegions:IRegions = {
'AWS': [
{
"region_name": "US East (Ohio)",
"region": "us-east-2",
@@ -485,19 +480,19 @@ const availableRegions = {
const rules = ref<IResourcePayload>(props.rules)
const $externalResults = reactive({})
const v$ = useVuelidate(rules.value, resourceData.value, { $externalResults })
const v$ = useVuelidate(rules.value, resourceData.value, {$externalResults})
const platformsOptions = ref<Array<IPlatform>>([])
const availableInPlatform = (platforms:Array<string>): boolean => {
const availableInPlatform = (platforms: Array<string>): boolean => {
if(!platformsOptions.value){
if (!platformsOptions.value) {
return false
}
const to_uuid:Array<string> = []
_.each(platformsOptions.value, (k)=>{
if(platforms.includes(k.title)){
const to_uuid: Array<string> = []
_.each(platformsOptions.value, (k) => {
if (platforms.includes(k.title)) {
to_uuid.push(k.uuid)
}
})
@@ -507,10 +502,9 @@ const getPlatforms = async () => {
console.log(resourceStore)
const p = await resourceStore.getPlatforms()
console.log(p)
platformsOptions.value =p
platformsOptions.value = p
}
getPlatforms()
</script>
</script>
16 changes: 16 additions & 0 deletions gui/src/interfaces/resources.interface.ts
Original file line number Diff line number Diff line change
@@ -42,6 +42,22 @@ export interface IAppResource {



export interface IRegion {
region_name: string
region: string
endpoints: any
protocol: any
}


export interface IRegions {
[key: string]: Array<IRegion>
}





export interface INodeCandidate {
id: number
region: string