blob: 61c30f340ac4cca2d9d8f51fbd66025171858b60 [file] [log] [blame]
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
<template>
<a-form layout="vertical" >
<a-form-item :label="$t('label.owner.type')">
<a-select
@change="changeDomain"
v-model:value="selectedAccountType"
defaultValue="account"
autoFocus
showSearch
optionFilterProp="label"
:filterOption="
(input, option) => {
return option.label.toLowerCase().indexOf(input.toLowerCase()) >= 0
}
"
>
<a-select-option :value="$t('label.account')">{{ $t('label.account') }}</a-select-option>
<a-select-option :value="$t('label.project')">{{ $t('label.project') }}</a-select-option>
</a-select>
</a-form-item>
<a-form-item :label="$t('label.domain')" required>
<a-select
@change="changeDomain"
v-model:value="selectedDomain"
showSearch
optionFilterProp="label"
:filterOption="
(input, option) => {
return option.label.toLowerCase().indexOf(input.toLowerCase()) >= 0
}
"
>
<a-select-option
v-for="domain in domains"
:key="domain.name"
:value="domain.id"
:label="domain.path || domain.name || domain.description"
>
<span>
<resource-icon
v-if="domain && domain.icon"
:image="domain.icon.base64image"
size="1x"
style="margin-right: 5px"
/>
<block-outlined v-else />
{{ domain.path || domain.name || domain.description }}
</span>
</a-select-option>
</a-select>
</a-form-item>
<template v-if="selectedAccountType === $t('label.account')">
<a-form-item :label="$t('label.account')" required>
<a-select
@change="emitChangeEvent"
v-model:value="selectedAccount"
showSearch
optionFilterProp="label"
:filterOption="
(input, option) => {
return option.label.toLowerCase().indexOf(input.toLowerCase()) >= 0
}
"
>
<a-select-option v-for="account in accounts" :key="account.name" :value="account.name">
<span>
<resource-icon
v-if="account && account.icon"
:image="account.icon.base64image"
size="1x"
style="margin-right: 5px"
/>
<team-outlined v-else />
{{ account.name }}
</span>
</a-select-option>
</a-select>
</a-form-item>
</template>
<template v-else>
<a-form-item :label="$t('label.project')" required>
<a-select
@change="emitChangeEvent"
v-model:value="selectedProject"
showSearch
optionFilterProp="label"
:filterOption="
(input, option) => {
return option.label.toLowerCase().indexOf(input.toLowerCase()) >= 0
}
"
>
<a-select-option v-for="project in projects" :key="project.id" :value="project.id" :label="project.name">
<span>
<resource-icon
v-if="project && project.icon"
:image="project.icon.base64image"
size="1x"
style="margin-right: 5px"
/>
<project-outlined v-else />
{{ project.name }}
</span>
</a-select-option>
</a-select>
</a-form-item>
</template>
</a-form>
</template>
<script>
import { api } from '@/api'
import ResourceIcon from '@/components/view/ResourceIcon.vue'
export default {
name: 'OwnershipSelection',
components: { ResourceIcon },
data () {
return {
domains: [],
accounts: [],
projects: [],
selectedAccountType: this.$store.getters.project?.id ? this.$t('label.project') : this.$t('label.account'),
selectedDomain: null,
selectedAccount: null,
selectedProject: null,
loading: false
}
},
props: {
override: {
type: Object
}
},
created () {
this.fetchData()
},
methods: {
fetchData () {
this.loading = true
api('listDomains', {
response: 'json',
listAll: true,
showicon: true,
details: 'min'
})
.then((response) => {
this.domains = response.listdomainsresponse.domain
if (this.override) {
this.domains = this.domains.filter(item => this.override.domains.has(item.id))
}
if (this.domains.length === 0) {
this.selectedDomain = null
this.selectedProject = null
this.selectedAccount = null
return
}
const domainIds = this.domains?.map(domain => domain.id)
const ownerDomainId = this.$store.getters.project?.domainid || this.$store.getters.userInfo.domainid
this.selectedDomain = domainIds?.includes(ownerDomainId) ? ownerDomainId : this.domains?.[0]?.id
this.changeDomain()
})
.catch((error) => {
this.$notifyError(error)
})
.finally(() => {
this.loading = false
})
},
fetchAccounts () {
this.loading = true
api('listAccounts', {
response: 'json',
domainId: this.selectedDomain,
showicon: true,
state: 'Enabled',
isrecursive: false
})
.then((response) => {
this.accounts = response.listaccountsresponse.account || []
if (this.override?.accounts && this.accounts) {
this.accounts = this.accounts.filter(item => this.override.accounts.has(item.name))
}
const accountNames = this.accounts.map(account => account.name)
if (this.selectedDomain === this.$store.getters.userInfo.domainid && accountNames.includes(this.$store.getters.userInfo.account)) {
this.selectedAccount = this.$store.getters.userInfo.account
} else {
this.selectedAccount = this.accounts?.[0]?.name
}
this.selectedProject = null
this.emitChangeEvent()
})
.catch((error) => {
this.$notifyError(error)
})
.finally(() => {
this.loading = false
})
},
fetchProjects () {
this.loading = true
api('listProjects', {
response: 'json',
domainId: this.selectedDomain,
state: 'Active',
showicon: true,
details: 'min',
isrecursive: false
})
.then((response) => {
this.projects = response.listprojectsresponse.project
if (this.override?.projects && this.projects) {
this.projects = this.projects.filter(item => this.override.projects.has(item.id))
}
this.selectedProject = this.projects?.map(project => project.id)?.includes(this.$store.getters.project?.id) ? this.$store.getters.project?.id : this.projects?.[0]?.id
this.selectedAccount = null
this.emitChangeEvent()
})
.catch((error) => {
this.$notifyError(error)
})
.finally(() => {
this.loading = false
})
},
changeDomain () {
if (this.selectedAccountType === this.$t('label.account')) {
this.fetchAccounts()
} else {
this.fetchProjects()
}
},
emitChangeEvent () {
this.$emit('fetch-owner', this)
}
}
}
</script>