<template>
  <div class="el-tree-select">
    <el-input
        v-model="filterTxt"
        style="width: 240px;margin-bottom: 10px"
        placeholder="搜索"
        @input="filterInput()"
    />
        <el-tree
          id="tree-option"
          ref="treeData"
          show-checkbox
          :accordion="accordion"
          :data="options"
          :props="objMap"
          :node-key="objMap.value"
          :default-expand-all="true"
          :expand-on-click-node="false"

          :default-expanded-keys="defaultExpandedKey"
          :filter-node-method="filterNode"
          @check="handleNodeClick"
        >
<!--          <template v-if="selfStyle" #default="{ node, data }">-->
<!--        <div class="custom-tree-node">-->

<!--          <div class="f-box-y"  v-if="selectId == data.id">-->

<!--            <el-icon color="#fff"><Select /></el-icon>-->
<!--          </div>-->
<!--          <div class="f-box" v-else ></div>-->
<!--          <span>{{ data.label }}</span>-->
<!--        </div>-->
<!--          </template>-->
        </el-tree>
  </div>
</template>

<script setup>

const { proxy } = getCurrentInstance();

const props = defineProps({
  /* 配置项 */
  objMap: {
    type: Object,
    default: () => {
      return {
        value: 'id', // ID字段名
        label: 'label', // 显示名称
        children: 'children' // 子级字段名
      }
    }
  },
  selfStyle:{
    type: Boolean,
    default: () => {
      return true
    }
  },
  /* 自动收起 */
  accordion: {
    type: Boolean,
    default: () => {
      return false
    }
  },
  needCheck: {
    type: Boolean,
    default: () => {
      return false
    }
  },
  /**当前双向数据绑定的值 */
  value: {
    type: [String, Number],
    default: ''
  },
  /**当前的数据 */
  options: {
    type: Array,
    default: () => []
  },
  /**输入框内部的文字 */
  placeholder: {
    type: String,
    default: ''
  }
})

const emit = defineEmits(['update:value']);

const filterTxt = ref('');
const selectId = ref('');
const valueId = computed({
  get: () => props.value,
  set: (val) => {
    emit('update:value', val)
  }
});
const valueTitle = ref('');
const defaultExpandedKey = ref([]);
function initHandle() {
  nextTick(() => {
    const selectedValue = valueId.value;
    if(selectedValue !== null && typeof (selectedValue) !== 'undefined') {
      const node = proxy.$refs.treeData.getNode(selectedValue)
      if (node) {
        valueTitle.value = node.data[props.objMap.label]
        proxy.$refs.treeData.setCurrentKey(selectedValue) // 设置默认选中
        defaultExpandedKey.value = [selectedValue] // 设置默认展开
      }
    } else {
      clearHandle()
    }
  })
}
function filterInput(){
  selectFilterData(filterTxt.value)
}
function handleNodeClick() {
  let data =  proxy.$refs['treeData'].getCheckedNodes()
  let chooseIds ="";
  for (let i = 0; i < data.length; i++) {
    if(i+1==data.length){
      chooseIds = chooseIds+data[i].id
    }else {
      chooseIds = chooseIds+data[i].id+","
    }

  }
  proxy.$forceUpdate()
  proxy.$emit('nodeClick',chooseIds)
}
function selectFilterData(val) {
  proxy.$refs.treeData.filter(val)
}
function filterNode(value, data) {
  if (!value) return true
  return data[props.objMap['label']].indexOf(value) !== -1
}
function clearHandle() {
  valueTitle.value = ''
  valueId.value = ''
  defaultExpandedKey.value = [];
  clearSelected()
}
function clearSelected() {
  const allNode = document.querySelectorAll('#tree-option .el-tree-node')
  allNode.forEach((element) => element.classList.remove('is-current'))
}

onMounted(() => {
  initHandle()
})

watch(valueId, () => {
  initHandle();
})
</script>

<style lang='scss' scoped>
@import "@/assets/styles/variables.module.scss";
.el-scrollbar .el-scrollbar__view .el-select-dropdown__item {
  padding: 0;
  background-color: #fff;
  height: auto;
}

.el-select-dropdown__item.selected {
  font-weight: normal;
}

ul li .el-tree .el-tree-node__content {
  height: auto;
  padding: 0 20px;
  box-sizing: border-box;
}

:deep(.el-tree-node__content:hover),
:deep(.el-tree-node__content:active),
:deep(.is-current > div:first-child),
:deep(.el-tree-node__content:focus) {
  background-color: mix(#fff, $--color-primary, 90%);
  color: $--color-primary;
}
.f-box{
  width: 13px;
  height: 13px;
  border-radius: 2px;
  border: 1px solid #a3a7a8;
  margin-right: 5px;
}
.custom-tree-node{
  display: flex;
  align-items: center;
}
.f-box-y{
  width: 13px;
  height: 13px;
  border-radius: 2px;
  border: 1px solid #1890ff;
  margin-right: 5px;
  background: #1890ff;
  display: flex;
  align-items: center;
  justify-content: center;
  color: #fff;
}

</style>
