<template>
  <el-collapse-transition>
    <div class="tree-table-content">
      <div
        v-show="iShowTree"
        :class="iShowTree ? '' : 'hidden'"
        :style="{width: treeWidth}"
        class="left"
      >
        <span v-if="component === 'AutoDataZTree'" class="title">{{ $t('AssetTree') }}</span>
        <component
          :is="component"
          :key="componentTreeKey"
          ref="AutoDataZTree"
          :setting="treeSetting"
          class="auto-data-ztree"
          v-bind="treeTabConfig"
          @urlChange="handleUrlChange"
          v-on="$listeners"
        >
          <div slot="rMenu" slot-scope="{data}">
            <slot :data="data" name="rMenu" />
          </div>
        </component>
      </div>
      <div
        :style="{'width': iShowTree ? ('calc(100% - ' + treeWidth + ')') : '100%'}"
        class="right"
        style="display: flex"
      >
        <div v-if="true" class="mini">
          <div :class="{'is-show': iShowTree}" class="mini-button" @click="iShowTree = !iShowTree">
            <svg-icon
              :style="{'transform': iShowTree ? 'none' : 'rotate(180deg)'}"
              class="icon-left"
              icon-class="double-left"
            />
          </div>
        </div>
        <div class="transition-box" style="width: calc(100% - 7px);">
          <slot name="table">
            <ListTable
              :key="componentKey"
              ref="ListTable"
              :header-actions="headerActions"
              :quick-filters="quickFilters"
              :quick-summary="quickSummary"
              :table-config="iTableConfig"
              v-on="$listeners"
            />
          </slot>
        </div>
      </div>
    </div>
  </el-collapse-transition>
</template>

<script>
import Dialog from '@/components/Dialog/index.vue'
import { setUrlParam } from '@/utils/common'
import ListTable from '@/components/Table/DrawerListTable/index.vue'
import FileTree from '@/components/Table/TreeTable/components/FileTree.vue'
import IBox from '../../IBox/index.vue'
import TabTree from '../TabTree/index.vue'
import AutoDataZTree from '@/components/Tree/AutoDataZTree/index.vue'

export default {
  name: 'TreeTable',
  components: {
    ListTable,
    AutoDataZTree,
    FileTree,
    TabTree,
    IBox,
    Dialog
  },
  props: {
    ...ListTable.props,
    treeSetting: {
      type: Object,
      default: () => AutoDataZTree.props.setting.default()
    },
    showTree: {
      type: Boolean,
      default: true
    },
    // 默认引用的Tree组件
    component: {
      type: String,
      default: () => 'AutoDataZTree'
    },
    treeTabConfig: {
      type: Object,
      default: () => ({})
    },
    treeWidth: {
      type: String,
      default: () => '23.6%'
    },
    quickFilters: {
      type: Array,
      default: null
    },
    quickSummary: {
      type: Array,
      default: null
    },
    headerActions: {
      type: Object,
      default: () => ({})
    }
  },
  data() {
    return {
      iTableConfig: this.tableConfig,
      iShowTree: this.showTree,
      componentKey: 0,
      componentTreeKey: 0
    }
  },
  watch: {
    treeConfig: {
      handler(val) {
      },
      deep: true
    },
    showTree(val) {
      this.iShowTree = val
    }
  },
  mounted() {
    // debug(this.treeSetting)
    this.initSetTableUrl()
  },
  methods: {
    initSetTableUrl() {
      const { asset = '', node = '' } = this.$route.query || {}
      let url = this.iTableConfig?.url || ''
      if (url) {
        url = setUrlParam(url, 'asset', asset)
        url = setUrlParam(url, 'node', node)
        this.$set(this.iTableConfig, 'url', url)
      }
    },
    handleUrlChange(url) {
      this.$set(this.iTableConfig, 'url', url)
      this.$emit('urlChange', url)
      this.forceRerender()
    },
    forceRerender() {
      this.componentKey += 1
    },
    forceRerenderTree() {
      this.componentTreeKey += 1
    },
    hideRMenu() {
      this.$refs.AutoDataZTree.hideRMenu()
    },
    getSelectedNodes: function() {
      return this.$refs.AutoDataZTree.getSelectedNodes()
    },
    getNodes: function() {
      return this.$refs.AutoDataZTree.getNodes()
    },
    selectNode: function(node) {
      return this.$refs.AutoDataZTree.selectNode(node)
    },
    reloadTable() {
      this.$refs.ListTable.reloadTable()
    }
  }
}
</script>

<style lang="scss" scoped>
$origin-color: #ffffff;

.tree-table-content {
  display: flex;
  flex-wrap: nowrap;
  justify-content: space-between;

  .left {
    //height: 100%;
    background: $origin-color;
    color: var(--color-border);

    // title 部分
    .title {
      display: flex;
      align-items: center;
      height: 40px;
      padding: 0 20px;
      width: 100%;
      border-bottom: solid 2px var(--color-primary);
      font-size: 13px;
      font-weight: 600;
      color: var(--color-text-primary);

      &:hover {
        cursor: pointer;
        color: var(--color-primary);
      }
    }

    .auto-data-ztree {
      overflow: auto;
      height: 100%;

      &.tree-tab ::v-deep .page-submenu {
        height: 40px;
      }
    }

    // tree 部分
    .data-z-tree {
      //margin-left: -20px;
      //width: calc(100% + 20px);

      .treebox {
        padding-left: 10px;
        padding-bottom: 10px;
      }
    }

    ::v-deep .tab-text {
      font-size: 13px;
    }

    &:hover {
      ~ .right .is-show {
        display: block !important;;
      }
    }
  }
}

.is-show {
  display: none;
}

.hidden {
  width: 0;
}

.is-rotate {
  display: block;
  transform: rotate(180deg);
}

.mini-button {
  position: absolute;
  top: 50%;
  transform: translate(-100%, -50%);
  width: 13px;
  float: right;
  text-align: center;
  padding: 5px 0;
  border: 1px solid #DCDFE6;
  background-color: #f3f3f3;
  border-radius: 2px;
  cursor: pointer;
  height: 30px;

  &:hover {
    display: block;
    border: 1px solid #d2d2d2;
  }

  .icon-left {
    font-size: 11px;
    vertical-align: 0;
  }
}

.el-tree {
  background-color: inherit !important;
}

.mini {
  position: relative;
  margin-right: 5px;
  width: 2px !important;
}

.transition-box.left {
  background: white;
  border: 1px solid #e0e0e0;
  border-radius: 2px;
}

</style>