123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222 |
- <template>
- <a-select
- ref="select"
- :value="innerValue"
- allowClear
- :filterOption="handleSelectFilterOption"
- v-bind="selectProps"
- style="width: 100%;"
- @blur="handleBlur"
- @change="handleChange"
- @search="handleSearchSelect"
- >
- <div v-if="loading" slot="notFoundContent">
- <a-icon type="loading" />
- <span> 加载中…</span>
- </div>
- <template v-for="option of selectOptions">
- <a-select-option :key="option.value" :value="option.value" :disabled="option.disabled">
- <span>{{option.text || option.label || option.title|| option.value}}</span>
- </a-select-option>
- </template>
- </a-select>
- </template>
- <script>
- import JVxeCellMixins, { dispatchEvent } from '@/components/jeecg/JVxeTable/mixins/JVxeCellMixins'
- import { JVXETypes } from '@comp/jeecg/JVxeTable/index'
- import { filterDictText } from '@comp/dict/JDictSelectUtil'
- export default {
- name: 'JVxeSelectCell',
- mixins: [JVxeCellMixins],
- data(){
- return {
- loading: false,
- // 异步加载的options(用于多级联动)
- asyncOptions: null,
- }
- },
- computed: {
- selectProps() {
- let props = {...this.cellProps}
- // 判断select是否允许输入
- let {allowSearch, allowInput} = this.originColumn
- if (allowInput === true || allowSearch === true) {
- props['showSearch'] = true
- }
- return props
- },
- // 下拉选项
- selectOptions() {
- if (this.asyncOptions) {
- return this.asyncOptions
- }
- let {linkage} = this.renderOptions
- if (linkage) {
- let {getLinkageOptionsSibling, config} = linkage
- let res = getLinkageOptionsSibling(this.row, this.originColumn, config, true)
- // 当返回Promise时,说明是多级联动
- if (res instanceof Promise) {
- this.loading = true
- res.then(opt => {
- this.asyncOptions = opt
- this.loading = false
- }).catch(e => {
- console.error(e)
- this.loading = false
- })
- } else {
- this.asyncOptions = null
- return res
- }
- }
- return this.originColumn.options
- },
- },
- created() {
- let multiple = [JVXETypes.selectMultiple, JVXETypes.list_multi]
- let search = [JVXETypes.selectSearch, JVXETypes.sel_search]
- if (multiple.includes(this.$type)) {
- // 处理多选
- let props = this.originColumn.props || {}
- props['mode'] = 'multiple'
- props['maxTagCount'] = 1
- this.$set(this.originColumn, 'props', props)
- } else if (search.includes(this.$type)) {
- // 处理搜索
- this.$set(this.originColumn, 'allowSearch', true)
- }
- },
- methods: {
- handleChange(value) {
- debugger
- // 处理下级联动
- let linkage = this.renderOptions.linkage
- if (linkage) {
- linkage.linkageSelectChange(this.row, this.originColumn, linkage.config, value)
- }
- this.handleChangeCommon(value)
- },
- /** 处理blur失去焦点事件 */
- handleBlur(value) {
- let {allowInput, options} = this.originColumn
- if (allowInput === true) {
- // 删除无用的因搜索(用户输入)而创建的项
- if (typeof value === 'string') {
- let indexes = []
- options.forEach((option, index) => {
- if (option.value.toLocaleString() === value.toLocaleString()) {
- delete option.searchAdd
- } else if (option.searchAdd === true) {
- indexes.push(index)
- }
- })
- // 翻转删除数组中的项
- for (let index of indexes.reverse()) {
- options.splice(index, 1)
- }
- }
- }
- this.handleBlurCommon(value)
- },
- /** 用于搜索下拉框中的内容 */
- handleSelectFilterOption(input, option) {
- let {allowSearch, allowInput} = this.originColumn
- if (allowSearch === true || allowInput === true) {
- //update-begin-author:taoyan date:20200820 for:【专项任务】大连项目反馈行编辑问题处理 下拉框搜索
- return option.componentOptions.children[0].children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
- //update-end-author:taoyan date:20200820 for:【专项任务】大连项目反馈行编辑问题处理 下拉框搜索
- }
- return true
- },
- /** select 搜索时的事件,用于动态添加options */
- handleSearchSelect(value) {
- let {allowSearch, allowInput, options} = this.originColumn
- if (allowSearch !== true && allowInput === true) {
- // 是否找到了对应的项,找不到则添加这一项
- let flag = false
- for (let option of options) {
- if (option.value.toLocaleString() === value.toLocaleString()) {
- flag = true
- break
- }
- }
- // !!value :不添加空值
- if (!flag && !!value) {
- // searchAdd 是否是通过搜索添加的
- options.push({title: value, value: value, searchAdd: true})
- }
- }
- },
- },
- // 【组件增强】注释详见:JVxeCellMixins.js
- enhanced: {
- aopEvents: {
- editActived(event) {
- dispatchEvent.call(this, event, 'ant-select')
- },
- },
- translate: {
- enabled: true,
- async handler(value,) {
- let options
- let {linkage} = this.renderOptions
- // 判断是否是多级联动,如果是就通过接口异步翻译
- if (linkage) {
- let {getLinkageOptionsSibling, config} = linkage
- options = getLinkageOptionsSibling(this.row, this.originColumn, config, true)
- if (options instanceof Promise) {
- return new Promise(resolve => {
- options.then(opt => {
- resolve(filterDictText(opt, value))
- })
- })
- }
- } else {
- options = this.column.own.options
- }
- return filterDictText(options, value)
- },
- },
- getValue(value) {
- if (Array.isArray(value)) {
- return value.join(',')
- } else {
- return value
- }
- },
- setValue(value) {
- let {column: {own: col}, params: {$table}} = this
- // 判断是否是多选
- if ((col.props || {})['mode'] === 'multiple') {
- $table.$set(col.props, 'maxTagCount', 1)
- }
- if (value != null && value !== '') {
- if (typeof value === 'string') {
- return value === '' ? [] : value.split(',')
- }
- return value
- } else {
- return undefined
- }
- }
- }
- }
- </script>
- <style scoped>
- </style>
|