JSelectBizComponentModal.vue 8.9 KB
Newer Older
1 2 3 4
<template>
  <a-modal
    centered
    :title="name + '选择'"
JEECG低代码平台's avatar
JEECG低代码平台 已提交
5
    :width="width"
6 7 8 9 10 11 12 13 14 15 16 17 18 19
    :visible="visible"
    @ok="handleOk"
    @cancel="close"
    cancelText="关闭">

    <a-row :gutter="18">
      <a-col :span="16">
        <!-- 查询区域 -->
        <div class="table-page-search-wrapper">
          <a-form layout="inline">
            <a-row :gutter="24">

              <a-col :span="14">
                <a-form-item :label="(queryParamText||name)">
JEECG低代码平台's avatar
JEECG低代码平台 已提交
20
                  <a-input v-model="queryParam[queryParamCode||valueKey]" :placeholder="'请输入' + (queryParamText||name)" @pressEnter="searchQuery"/>
21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
                </a-form-item>
              </a-col>
              <a-col :span="8">
                  <span style="float: left;overflow: hidden;" class="table-page-search-submitButtons">
                    <a-button type="primary" @click="searchQuery" icon="search">查询</a-button>
                    <a-button type="primary" @click="searchReset" icon="reload" style="margin-left: 8px">重置</a-button>
                  </span>
              </a-col>

            </a-row>
          </a-form>
        </div>

        <a-table
          size="small"
          bordered
JEECG低代码平台's avatar
JEECG低代码平台 已提交
37 38
          :rowKey="rowKey"
          :columns="innerColumns"
39 40 41 42 43 44 45 46 47 48 49 50 51
          :dataSource="dataSource"
          :pagination="ipagination"
          :loading="loading"
          :scroll="{ y: 240 }"
          :rowSelection="{selectedRowKeys, onChange: onSelectChange, type: multiple ? 'checkbox':'radio'}"
          :customRow="customRowFn"
          @change="handleTableChange">
        </a-table>

      </a-col>
      <a-col :span="8">
        <a-card :title="'已选' + name" :bordered="false" :head-style="{padding:0}" :body-style="{padding:0}">

JEECG低代码平台's avatar
JEECG低代码平台 已提交
52
          <a-table size="small" :rowKey="rowKey" bordered v-bind="selectedTable">
53 54 55 56 57 58 59 60 61 62 63 64
              <span slot="action" slot-scope="text, record, index">
                <a @click="handleDeleteSelected(record, index)">删除</a>
              </span>
          </a-table>

        </a-card>
      </a-col>
    </a-row>
  </a-modal>
</template>

<script>
JEECG低代码平台's avatar
JEECG低代码平台 已提交
65
  import { getAction } from '@/api/manage'
66
  import { JeecgListMixin } from '@/mixins/JeecgListMixin'
JEECG低代码平台's avatar
JEECG低代码平台 已提交
67
  import { cloneObject, pushIfNotExist } from '@/utils/util'
68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88

  export default {
    name: 'JSelectBizComponentModal',
    mixins: [JeecgListMixin],
    props: {
      value: {
        type: Array,
        default: () => []
      },
      visible: {
        type: Boolean,
        default: false
      },
      valueKey: {
        type: String,
        required: true
      },
      multiple: {
        type: Boolean,
        default: true
      },
JEECG低代码平台's avatar
JEECG低代码平台 已提交
89 90 91 92
      width: {
        type: Number,
        default: 900
      },
93 94 95 96 97 98 99 100 101 102

      name: {
        type: String,
        default: ''
      },
      listUrl: {
        type: String,
        required: true,
        default: ''
      },
JEECG低代码平台's avatar
JEECG低代码平台 已提交
103 104 105 106 107
      // 根据 value 获取显示文本的地址,例如存的是 username,可以通过该地址获取到 realname
      valueUrl: {
        type: String,
        default: ''
      },
108 109 110 111
      displayKey: {
        type: String,
        default: null
      },
JEECG低代码平台's avatar
JEECG低代码平台 已提交
112
      columns: {
113
        type: Array,
JEECG低代码平台's avatar
JEECG低代码平台 已提交
114
        required: true,
115 116
        default: () => []
      },
JEECG低代码平台's avatar
JEECG低代码平台 已提交
117 118 119 120 121
      // 查询条件Code
      queryParamCode: {
        type: String,
        default: null
      },
122 123 124 125 126
      // 查询条件文字
      queryParamText: {
        type: String,
        default: null
      },
JEECG低代码平台's avatar
JEECG低代码平台 已提交
127 128 129 130
      rowKey: {
        type: String,
        default: 'id'
      },
131 132 133
    },
    data() {
      return {
JEECG低代码平台's avatar
JEECG低代码平台 已提交
134
        innerValue: [],
135
        // 表头
JEECG低代码平台's avatar
JEECG低代码平台 已提交
136
        innerColumns: this.columns,
137 138 139 140 141
        // 已选择列表
        selectedTable: {
          pagination: false,
          scroll: { y: 240 },
          columns: [
JEECG低代码平台's avatar
JEECG低代码平台 已提交
142 143 144 145
            {
              ...this.columns[0],
              width: this.columns[0].widthRight || this.columns[0].width,
            },
146 147 148 149
            { title: '操作', dataIndex: 'action', align: 'center', width: 60, scopedSlots: { customRender: 'action' }, }
          ],
          dataSource: [],
        },
JEECG低代码平台's avatar
JEECG低代码平台 已提交
150 151 152 153 154 155 156 157 158 159 160 161 162 163 164
        url: { list: this.listUrl },
        /* 分页参数 */
        ipagination: {
          current: 1,
          pageSize: 5,
          pageSizeOptions: ['5', '10', '20', '30'],
          showTotal: (total, range) => {
            return range[0] + '-' + range[1] + '' + total + ''
          },
          showQuickJumper: true,
          showSizeChanger: true,
          total: 0
        },
        options: [],
        dataSourceMap: {},
165 166 167 168
      }
    },
    watch: {
      value: {
JEECG低代码平台's avatar
JEECG低代码平台 已提交
169
        deep: true,
170 171
        immediate: true,
        handler(val) {
JEECG低代码平台's avatar
JEECG低代码平台 已提交
172 173
          this.innerValue = cloneObject(val)
          this.selectedRowKeys = []
174
          this.valueWatchHandler(val)
JEECG低代码平台's avatar
JEECG低代码平台 已提交
175
          this.queryOptionsByValue(val)
176 177 178 179 180
        }
      },
      dataSource: {
        deep: true,
        handler(val) {
JEECG低代码平台's avatar
JEECG低代码平台 已提交
181 182
          this.emitOptions(val)
          this.valueWatchHandler(this.innerValue)
183 184
        }
      },
JEECG低代码平台's avatar
JEECG低代码平台 已提交
185
      selectedRowKeys: {
186 187 188
        immediate: true,
        deep: true,
        handler(val) {
JEECG低代码平台's avatar
JEECG低代码平台 已提交
189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204
          this.selectedTable.dataSource = val.map(key => {
            for (let data of this.dataSource) {
              if (data[this.rowKey] === key) {
                pushIfNotExist(this.innerValue, data[this.valueKey])
                return data
              }
            }
            for (let data of this.selectedTable.dataSource) {
              if (data[this.rowKey] === key) {
                pushIfNotExist(this.innerValue, data[this.valueKey])
                return data
              }
            }
            console.warn('未找到选择的行信息,key:' + key)
            return {}
          })
205
        },
JEECG低代码平台's avatar
JEECG低代码平台 已提交
206
      }
207 208 209 210 211 212 213 214 215 216 217
    },

    methods: {

      /** 关闭弹窗 */
      close() {
        this.$emit('update:visible', false)
      },

      valueWatchHandler(val) {
        val.forEach(item => {
JEECG低代码平台's avatar
JEECG低代码平台 已提交
218
          this.dataSource.concat(this.selectedTable.dataSource).forEach(data => {
219
            if (data[this.valueKey] === item) {
JEECG低代码平台's avatar
JEECG低代码平台 已提交
220
              pushIfNotExist(this.selectedRowKeys, data[this.rowKey])
221 222 223
            }
          })
        })
JEECG低代码平台's avatar
JEECG低代码平台 已提交
224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273
      },

      queryOptionsByValue(value) {
        if (!value || value.length === 0) {
          return
        }
        // 判断options是否存在value,如果已存在数据就不再请求后台了
        let notExist = false
        for (let val of value) {
          let find = false
          for (let option of this.options) {
            if (val === option.value) {
              find = true
              break
            }
          }
          if (!find) {
            notExist = true
            break
          }
        }
        if (!notExist) return
        getAction(this.valueUrl || this.listUrl, {
          // 这里最后加一个 , 的原因是因为无论如何都要使用 in 查询,防止后台进行了模糊匹配,导致查询结果不准确
          [this.valueKey]: value.join(',') + ',',
          pageNo: 1,
          pageSize: value.length
        }).then((res) => {
          if (res.success) {
            let dataSource = res.result
            if (!(dataSource instanceof Array)) {
              dataSource = res.result.records
            }
            this.emitOptions(dataSource, (data) => {
              pushIfNotExist(this.innerValue, data[this.valueKey])
              pushIfNotExist(this.selectedRowKeys, data[this.rowKey])
              pushIfNotExist(this.selectedTable.dataSource, data, this.rowKey)
            })
          }
        })
      },

      emitOptions(dataSource, callback) {
        dataSource.forEach(data => {
          let key = data[this.valueKey]
          this.dataSourceMap[key] = data
          pushIfNotExist(this.options, { label: data[this.displayKey || this.valueKey], value: key }, 'value')
          typeof callback === 'function' ? callback(data) : ''
        })
        this.$emit('options', this.options, this.dataSourceMap)
274 275 276 277 278 279 280 281 282 283 284
      },

      /** 完成选择 */
      handleOk() {
        let value = this.selectedTable.dataSource.map(data => data[this.valueKey])
        this.$emit('input', value)
        this.close()
      },

      /** 删除已选择的 */
      handleDeleteSelected(record, index) {
JEECG低代码平台's avatar
JEECG低代码平台 已提交
285
        this.selectedRowKeys.splice(this.selectedRowKeys.indexOf(record[this.rowKey]), 1)
286 287 288 289
        this.selectedTable.dataSource.splice(index, 1)
      },

      customRowFn(record) {
JEECG低代码平台's avatar
JEECG低代码平台 已提交
290 291 292 293 294 295
        return {
          on: {
            click: () => {
              let key = record[this.rowKey]
              if (!this.multiple) {
                this.selectedRowKeys = [key]
296
                this.selectedTable.dataSource = [record]
JEECG低代码平台's avatar
JEECG低代码平台 已提交
297 298 299 300 301 302 303 304
              } else {
                let index = this.selectedRowKeys.indexOf(key)
                if (index === -1) {
                  this.selectedRowKeys.push(key)
                  this.selectedTable.dataSource.push(record)
                } else {
                  this.handleDeleteSelected(record, index)
                }
305 306 307 308 309 310 311 312 313 314 315
              }
            }
          }
        }
      },

    }
  }
</script>
<style lang="less" scoped>
</style>