blob: a2364597a63d7b4925d30044b063cb67a754df3d [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>
<div>
<a-radio-group
v-if="items.length <= maxBlocks"
v-model:value="localValue"
@change="handleChange()">
<a-row type="flex" :gutter="[horizontalGutter, verticalGutter]" justify="start">
<div v-for="item in items" :key="item.id">
<a-col :span="6">
<a-radio-button
:value="item.id"
style="border-width: 2px"
:class="blockRadioButtonClass">
<slot name="radio-option" :item="item"></slot>
</a-radio-button>
</a-col>
</div>
</a-row>
</a-radio-group>
<a-select
v-else
v-model:value="localValue"
showSearch
optionFilterProp="label"
:filterOption="(input, option) => {
return option.label.toLowerCase().indexOf(input.toLowerCase()) >= 0
}"
@change="handleChange()"
:loading="loading"
v-focus="true">
<a-select-option v-for="item in items" :key="item.id" :label="item.name">
<slot name="select-option" :item="item"></slot>
</a-select-option>
</a-select>
</div>
</template>
<script>
export default {
name: 'BlockRadioGroupSelect',
props: {
blockSize: {
type: String,
default: 'large'
},
selectedValue: {
type: [String, Number],
default: ''
},
horizontalGutter: {
type: Number,
default: 16
},
verticalGutter: {
type: Number,
default: 18
},
items: {
type: Array,
default: () => []
},
maxBlocks: {
type: Number,
default: 8
},
loading: {
type: Boolean,
default: false
}
},
data () {
return {
localValue: this.selectedValue
}
},
watch: {
selectedValue (newValue) {
if (this.localValue === newValue) {
return
}
this.localValue = newValue
}
},
computed: {
blockRadioButtonClass () {
if (['square', 'medium', 'small'].includes(this.blockSize)) {
return this.blockSize + '-block-radio-button'
}
return 'large-block-radio-button'
}
},
emits: ['change'],
methods: {
handleChange () {
this.$emit('change', this.localValue)
}
}
}
</script>
<style lang="less" scoped>
.large-block-radio-button {
width:100%;
min-width: 345px;
height: 60px;
display: flex;
padding-left: 20px;
align-items: center;
}
.medium-block-radio-button {
width:100%;
min-width: 160px;
height: 60px;
display: flex;
padding-left: 20px;
align-items: center;
}
.small-block-radio-button {
width:100%;
min-width: 80px;
height: 60px;
display: flex;
padding-left: 20px;
align-items: center;
}
.square-block-radio-button {
width: 88px;
height: 88px;
display: flex;
justify-content: center;
align-items: center;
text-align: center;
padding: 0;
box-sizing: border-box;
}
</style>