| // 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> |