<style lang="less" scoped>
.view-div {
  width: 100%;
  height: 100%;
  padding: 10px 0 0 10px;

  .selected-view {
    width: 150px;
    height: 100%;
    float: left;
    font-size: .75rem;
  }

  .selected-view-content {
    width: 100%;
    height: calc(~'100% - 38px');
  }

  .table-view {
    width: calc(~'100% - 160px');
    margin-left: 10px;
    height: 100%;
    float: left;
  }
  .table-view-noselected{
    width: calc(~'100% - 10px')
  }
}
</style>
<template>
  <div class="view-div">
    <div v-show="false" class="selected-view" >
      <div style="margin-bottom: 20px; width: 100%;">
        <Checkbox
          :value="selection.length > 0"
          :disabled="selection.length == 0"
          @on-change="allCancel"
        />
        {{"已选(" + selection.length + ")条"}}
      </div>
      <div class="selected-view-content">
        <SelectedView
          :data="selection"
          @on-change="onCancelSelected"
        />
      </div>
    </div>
    <div class="table-view " :class="{'table-view-noselected': hideSelected}">
      <TableView
        ref="_tableView"
        :primaryKey="primaryKey"
        :columns="tableColumns"
        :data="tableDatas"
        :pageTotal="pageTotal"
        :pageSize="pageSize"
        :selection="selection"
        :multiple="multiple"
        :loading="loading"
        :isLeaf="isLeaf"
        :treeDataMap="treeDataMap"
        :structtype="structtype"
        :canSwitchMode="false"
        :searchPlaceholder="searchPlaceholder"
        @on-page-change="onPageChange"
        @on-select="onSelect"
        @on-select-cancel="onSelectCancel"
        @on-select-all="onSelectAll"
        @on-select-all-cancel="onSelectAllCancel"
        @on-search-enter="onSearchEnter"
      />
    </div>
  </div>
</template>
<script>
import TableView from './table-view'
import SelectedView from './option-group'
import baseDataMixin from './baseDataMixin'
export default {
  mixins: [baseDataMixin],
  data() {
    return {
      pageTotal: 0,
      pageSize: 20,
      pageNo: 1,
      total: 0,
      tableDatas: [],
      selection: [],
      searchInfo: '', // 模糊搜索信息
      justSelected: false, // 查看模式
      loading: false,
    }
  },
  props: {
    treeDataMap: {
      type: Object
    },
    groupFieldName: {
      type: String
    },
    treeNode: {
      type: Object,
      required: false,
    },
    value: {
      type: Array,
      required: false,
    },
    primaryKey: {
      type: String,
      required: true,
    },
    tableColumns: {
      type: Array,
      require: true,
    },
  },
  watch: {
    treeNode: {
      handler: function (newVal, oldVal) {
        if (newVal && oldVal && newVal[this.treeKey] == oldVal[this.treeKey]) {
          return
        }
        this.pageNo = 1
        this.refresh(newVal)
      },
      deep: true,
    },
    value: {
      handler: function (newVal) {
        this.selection = JSON.parse(JSON.stringify(newVal))
        this.selection.map((item) => {
          item._checked = true
        })
        this.refreshRowsCheckStatus(newVal, this.tableDatas)
      },
      deep: true,
    },
  },
  components: {
    TableView,
    SelectedView,
  },
  mounted() {
    this.selection = this.value ? JSON.parse(JSON.stringify(this.value)) : []
    this.selection.map((item) => {
      item._checked = true
    })
    this.loading = true
    this.resize()
  },
  methods: {
    save() {
      let _selection = JSON.parse(JSON.stringify(this.selection))
      return _selection
    },
    resize() {
      this.$refs._tableView &&
        this.$refs._tableView.resize &&
        this.$refs._tableView.resize()
    },
    refresh(treeNode) {
      if (!treeNode) {
        this.tableDatas = []
        return
      }
      this.refreshWhenAll(treeNode)
    },
    async refreshWhenAll(treeNode) {
      if (this.isOrg) {
        let param = {
          pagination: true,
          parentcode: treeNode.code,
          searchKey: this.searchInfo,
          queryDataStructure: 'ALL',
          limit: this.pageSize,
          offset: (this.pageNo - 1) * this.pageSize,
        }
        GMS.$http
          .post('/org/data/list', param)
          .then((res) => {
            const { rows, total } = res.data
            this.pageTotal = total
            let _tabledatas = rows
            this.refreshRowsCheckStatus(this.selection, _tabledatas)
            this.tableDatas = _tabledatas
            this.loading = false
          })
          .catch((err) => {
            console.error('获取组织机构失败:' + JSON.stringify(err))
            console.log('error', err)
          })
      } else {
        this.loading = true
        // 更新右侧table
        let postData = {}
        if (this.structtype === 1) {
          const treeData = JSON.parse(JSON.stringify(this.treeNode))
          treeData.children = this.treeDataMap[this.treeNode.code]
          let objectCodes = []
          const getGroupNames = (nodes) => {
            nodes.forEach(item => {
              if (item && item.attributes && item.attributes.objectcode) {
                objectCodes.push(item.attributes.objectcode)
              }
              if (item.children && item.children.length > 0) {
                getGroupNames(item.children)
              }
            })
          }
          getGroupNames([treeData])
          postData = {
            groupFieldName: this.groupFieldName,
            groupname: this.treeNode.attributes.objectcode,
            groupNames: objectCodes,
            tableName: this.tableName,
            pagination: true,
            offset: (this.pageNo - 1) * this.pageSize,
            limit: this.pageSize,
            searchKey: this.searchInfo,
            stopflag: -1,
            queryDataStructure: "ALL",
            authType: this.authType,
            versionDate: this.versionDate,
            expression: this.filterFormular,
            'BI-SYNTAX': null 
          }
        } else {
          postData = {
            pagination: true,
            limit: this.pageSize,
            offset: (this.pageNo - 1) * this.pageSize,
            tableName: this.tableName,
            searchKey: this.searchInfo,
            queryDataStructure: 'ALL',
            queryChildrenType: 'ALL_CHILDREN_WITH_SELF',
            lazyload: false,
            code: treeNode.code === '-'? '': treeNode.code,
            authType: this.authType,
            versionDate: this.versionDate,
            expression: this.filterFormular,
            'BI-SYNTAX': null 
          }
        }
        this.getBaseData(postData)
          .then((response) => {
            if (!(response || response.data)) {
              this.tableDatas = []
              return
            }
            const { rows, total } = response.data

            this.pageTotal = total
            let _tabledatas = rows
            this.refreshRowsCheckStatus(this.selection, _tabledatas)
            this.tableDatas = _tabledatas
            this.$emit('init-list', _tabledatas)
            this.loading = false
          })
          .catch((err) => {
            this.loading = false
            console.error('获取表格信息失败:' + JSON.stringify(XMLHttpRequest))
            console.log('error', err)
          })
      }
    },

    /**
     * 刷新表格每行的勾选状态
     * @param {Array} selected 已经选中的数据集合
     * @param {Array} rows 表格行数据集合
     */
    refreshRowsCheckStatus(selected, rows) {
      let that = this
      rows.map((value) => {
        value._checked = that.isSelected(selected, value)
      })
    },
    /**
     * 判断指定行是否已经被选中
     * @param {Object} row table表格行数据
     */
    isSelected(selected, row) {
      let result = false
      selected.map((value) => {
        if (value[this.primaryKey] == row[this.primaryKey]) {
          result = true
          return
        }
      })
      return result
    },
    onPageChange(pageNo) {
      this.pageNo = pageNo
      this.refresh(this.treeNode)
    },
    onSelect(selection) {
      this.selection = selection
    },
    onSelectCancel(selection, row) {
      this.selection = selection
    },
    onSelectAll(selection) {
      this.selection = selection
    },
    onSelectAllCancel(selection) {
      this.selection = selection
    },
    onSearchEnter(searchInfo) {
      this.searchInfo = searchInfo
      this.pageNo = 1
      this.refresh(this.treeNode)
    },
    onCancelSelected(item) {
      for (let i = this.selection.length - 1; i >= 0; i--) {
        if (this.selection[i].name == item.name) {
          this.selection._checked = false
          this.selection.splice(i, 1)
          break
        }
      }
    },
    allCancel() {
      this.selection.map((item) => {
        item._checked = false
      })
      this.selection = []
    },
  },
}
</script>