<template> <div class="setup"> <div id="validationErrorMessage" class="alert alert-danger" role="alert" v-if="validationError" > {{ $t("validationErrorMessage") }} </div> <div v-if="resourceTypes.length > 0"> <coscine-form-group :mandatory="true" labelFor="ResourceTypes" :label="$t('resourceTypesLabel')" > <multiselect v-if="resourceTypes.length > 1" id="ResourceTypes" v-model="selectedResourceType" :options="resourceTypes" @input="retrieveFields" :multiple="false" :hide-selected="false" label="iDisplayName" track-by="iDisplayName" :placeholder="$t('MultiselectPlaceholderResourceType')" select-label="" selected-label="" deselect-label="" > <span slot="noResult">{{ $t("MultiselectNoResults") }}</span> <span slot="noOptions">{{ $t("MultiselectNoOptions") }}</span> </multiselect> <b-input v-else-if="resourceTypes.length === 1" id="ResourceType" v-model="selectedResourceType.iDisplayName" disabled > </b-input> </coscine-form-group> <coscine-form-group v-if="selectedResourceType !== null" :label="selectedResourceType.iFullName" > <p>{{ selectedResourceType.iDescription }}</p> </coscine-form-group> </div> <SetupPage v-if=" selectedResourceType !== null && selectedResourceType.displayName !== undefined " ref="setupSubPage" :isProjectOwner="isProjectOwner" :finishedLoadingResourceTypes="finishedLoadingResourceTypes" :projectId="projectId" :resource="resource" :formFields=" this.selectedResourceTypeInformation.resourceCreate.components[0] " :sliderValue="sliderValue" :selectedResourceType="selectedResourceType" @waitingForResponse="setWaitingForResponse" @sliderValChange="setSliderValue" /> <div @mouseenter="showPopover"> <b-button id="button-enabledPopover" @click.prevent="validateAndProceed" class="float-right" variant="outline-primary" :disabled="sliderValue <= 0 || selectedResourceType === null" >{{ $t("next") }} </b-button> <b-popover ref="popover" target="button-enabledPopover" placement="top"> <template v-slot:title>{{ $t("popoverHeader") }}</template> {{ $t("popoverContent") }} <b-link :href="quotaLink">{{ $t("needMore") }}</b-link> </b-popover> </div> </div> </template> <script lang="ts"> import Vue from "vue"; import { BlobApi, ProjectApi, ResourceTypeApi } from "@coscine/api-connection"; import { GuidUtil, LinkUtil } from "@coscine/app-util"; import { CoscineFormGroup } from "@coscine/component-library"; import "@coscine/component-library/dist/index.css"; import SetupPage from "./Setup/SetupPage.vue"; import Multiselect from "vue-multiselect"; import "vue-multiselect/dist/vue-multiselect.min.css"; Vue.component("multiselect", Multiselect); export default Vue.extend({ name: "Setup", components: { SetupPage, CoscineFormGroup, }, data() { return { quotaLink: LinkUtil.getProjectLink("QuotaManagement"), sliderValue: 1, validationError: false, selectedResourceType: {} as any, }; }, methods: { showPopover() { if (this.sliderValue <= 0 && this.resourceTypeHasSize()) { (this as any).$refs.popover.$emit("open"); setTimeout(() => { (this as any).$refs.popover.$emit("close"); }, 5000); } }, setSliderValue(val: any) { this.sliderValue = val; this.resource.resourceTypeOption["Size"] = this.sliderValue; }, getComponentsLength() { if ( this.selectedResourceTypeInformation === undefined || this.selectedResourceTypeInformation.resourceCreate === undefined || this.selectedResourceTypeInformation.resourceCreate.components === undefined || this.selectedResourceTypeInformation.resourceCreate.components[0] === undefined ) { return -1; } return this.selectedResourceTypeInformation.resourceCreate.components[0] .length; }, resourceTypeHasSize() { if (this.getComponentsLength() > 0) { for (const field of this.selectedResourceTypeInformation.resourceCreate .components[0]) { if (field === "Size") { return true; } } } return false; }, next() { this.$emit("next"); }, setWaitingForResponse(newIsWaitingForResponse: boolean) { this.$emit("waitingForResponse", newIsWaitingForResponse); }, validateAndProceed() { if ( this.$refs.setupSubPage !== undefined && (this.$refs.setupSubPage as any).validateResource() ) { this.validationError = false; this.$emit("next"); } else { this.validationError = true; } }, retrieveFields(resourceType: any) { if (GuidUtil.isValidGuid(resourceType.id)) { this.$emit("setSelectedResourceTypeInformation", resourceType); } }, getResourceTypeInformation(id: string): any { for (const resourceTypeInformation of this.resourceTypes) { if ((resourceTypeInformation as any).id === id) { return resourceTypeInformation; } } }, init() { this.selectedResourceType = null; }, }, props: { resource: Object, resourceTypes: Array, isProjectOwner: Boolean, isWaitingForResponse: Boolean, finishedLoadingResourceTypes: Boolean, projectId: String, selectedResourceTypeInformation: Object, }, watch: { finishedLoadingResourceTypes() { this.init(); }, }, mounted() { this.init(); }, }); </script> <style scoped> #validationErrorMessage { margin-left: 1em; margin-right: 1em; } </style>