<template>
  <div class="cus-content" :class="{'cus-content-full': full !== false}">
    <div class="cc-top-slot" v-if="$slots.top">
      <slot name="top"/>
    </div>
    <div class="cc-field-out" id="field-out" v-if="$slots.fieldOut">
      <div class="field-out-slot cus-content-form">
        <slot name="fieldOut"/>
      </div>
    </div>
    <div class="cc-center-slot" v-if="$slots.center">
      <slot name="center"/>
    </div>
    <div class="cc-bottom">
      <div id="operation" class="operation">
        <div class="buttons">
          <slot name="buttons"/>
        </div>
        <div class="filters">
          <el-dropdown :teleported="false">
            <div class="tools __hover">
              <SvgIcon name="cus-content_tools" size="18" color="#666666"/>
            </div>
            <template #dropdown>
              <el-dropdown-menu>
                <el-dropdown-item @click="showFieldIn = true" v-if="$slots.fieldIn" style="width: 170px;">
                  <div class="tools-item">
                    <SvgIcon name="cus-content_field-in" size="18"/>高级筛选
                  </div>
                </el-dropdown-item>
                <el-dropdown-item @click="showFieldColumn = true">
                  <div class="tools-item">
                    <SvgIcon name="cus-content_field-column" size="18"/>字段筛选
                  </div>
                </el-dropdown-item>
                <el-dropdown-item>
                  <div class="tools-item" @click="showContentFixed = true">
                    <SvgIcon name="cus-content_field-fixed" size="18"/>冻结窗格
                  </div>
                </el-dropdown-item>
              </el-dropdown-menu>
            </template>
          </el-dropdown>
        </div>
      </div>
      <div id="table" class="table">
        <slot name="table"/>
      </div>
    </div>
    <el-dialog
        v-model="showFieldIn"
        width="566px"
        align-center
        modal-class="field-dialog"
        :close-on-click-modal="false"
        :show-close="false"
    >
      <template #header>
        <span>高级筛选设置</span>
        <SvgIcon class="__hover" name="close_2" size="16" @click="showFieldIn = false"/>
      </template>
      <div class="field-in-slot">
        <slot name="fieldIn"/>
      </div>
      <template #footer>
        <div class="buttons">
          <div class="cancel __hover" @click="showFieldIn = false">取消</div>
          <div class="submit __hover" @click="$emit('handleSearch'), showFieldIn = false">确定</div>
        </div>
      </template>
    </el-dialog>
    <el-dialog
        v-model="showFieldColumn"
        width="790px"
        align-center
        modal-class="field-dialog"
        :close-on-click-modal="false"
        :show-close="false"
    >
      <template #header>
        <span>字段筛选设置</span>
        <SvgIcon class="__hover" name="close_2" size="16" @click="showFieldColumn = false"/>
      </template>
      <div class="field-column">
        <div class="fc-block fc-all">
          <div class="fcb-title">全部字段</div>
          <div class="fcb-content">
            <div class="fcbc-filter">
              <el-input v-model="columnAllInputFilter" placeholder="请输入关键词..." clearable>
                <template #suffix>
                  <SvgIcon name="search"/>
                </template>
              </el-input>
            </div>
            <div class="fcbc-list">
              <template v-for="(item, index) in tableHeadTempDeep.filter(v => v.allLabel.includes(columnAllInputFilter))" :key="item.allLabel">
                <div class="table-head-item __hover" @click="item.show = !item.show">
                  <div class="check" :class="{active: item.show}"/>
                  <CusEllipsis class="label" :value="item.allLabel"/>
                </div>
              </template>
            </div>
            <div class="fcbc-bottom">
              <div>共 {{ tableHeadTempDeep.length }} 条</div>
              <div class="__hover" @click="handleCheckAllChange">
                <div class="check" :class="{active: columnIsAllCpt}"/>全选
              </div>
            </div>
          </div>
        </div>
        <div class="fc-block fc-select">
          <div class="fcb-title">已选字段</div>
          <div class="fcb-content">
            <div class="fcbc-filter">
              <el-input v-model="columnSelectInputFilter" placeholder="请输入关键词..." clearable>
                <template #suffix>
                  <SvgIcon name="search"/>
                </template>
              </el-input>
            </div>
            <div class="fcbc-list">
              <template v-for="(item, index) in tableHeadTempDeep.filter(v => v.show && v.allLabel.includes(columnSelectInputFilter))" :key="item.allLabel">
                <div class="table-head-select-item">
                  <SvgIcon name="cus-content_field-column-select" size="12" color="#e4e4e4"/>
                  <CusEllipsis class="label" :value="item.allLabel"/>
                  <SvgIcon class="__hover" name="close_2" size="12" color="#e4e4e4" @click="item.show = false"/>
                </div>
              </template>
            </div>
            <div class="fcbc-bottom">
              <div>已选 {{ tableHeadTempDeep.filter(v => v.show).length }} 条</div>
              <div v-if="tableHeadTempDeep.filter(v => v.show).length > 0" @click="tableHeadTempDeep.forEach(v => v.show = false)" class="clear __hover">清空</div>
            </div>
          </div>
        </div>
      </div>
      <template #footer>
        <div class="buttons">
          <div class="cancel __hover" @click="showFieldColumn = false">取消</div>
          <div class="submit __hover" @click="$emit('update:tableHead', tableHeadTemp), showFieldColumn = false">确定</div>
        </div>
      </template>
    </el-dialog>
    <el-dialog
        v-model="showContentFixed"
        width="790px"
        align-center
        modal-class="field-dialog"
        :close-on-click-modal="false"
        :show-close="false"
    >
      <template #header>
        <span>表格冻结</span>
        <SvgIcon class="__hover" name="close_2" size="16" @click="showContentFixed = false"/>
      </template>
      <div class="content-fixed">
        <div class="cf-item">
          <el-checkbox v-model="tempContentFixed.full">内容</el-checkbox>
        </div>
        <div class="cf-item">
          <el-checkbox v-model="tempContentFixed.leftFixed">表格左侧</el-checkbox>
        </div>
        <div class="cf-item">
          <el-checkbox v-model="tempContentFixed.rightFixed">表格右侧</el-checkbox>
        </div>
      </div>
      <template #footer>
        <div class="buttons">
          <div class="cancel __hover" @click="showContentFixed = false">取消</div>
          <div class="submit __hover" @click="handleContentFixed">确定</div>
        </div>
      </template>
    </el-dialog>
  </div>
</template>

<script lang="ts">
  import {
    defineComponent,
    computed,
    onMounted,
    ref,
    reactive,
    watch,
    getCurrentInstance,
    ComponentInternalInstance,
    toRefs
  } from 'vue'
  import {useStore} from 'vuex'
  import {useRouter} from 'vue-router'

  export default defineComponent({
    name: 'CusContent',
    components: {},
    props: {
      tableHead: {
        required: true,
        default: () => []
      },
      text: {},
      showText: {
        default: false
      },
      searchTip: {
        default: '请输入查询关键词'
      },
      full: {
        required: true,
        default: false
      }
    },
    setup(props, { emit }) {
      const store = useStore();
      const router = useRouter();
      const that = (getCurrentInstance() as ComponentInternalInstance).appContext.config.globalProperties
      const state = reactive({
        textTemp: '',
        showFieldIn: false,
        showFieldColumn: false,
        showContentFixed: false,
        columnAllInputFilter: '',
        columnSelectInputFilter: '',
        tableHeadTemp: [],
        contentFixed: {
          full: props.full,
          leftFixed: true,
          rightFixed: true
        },
        tempContentFixed: {
          full: props.full,
          leftFixed: true,
          rightFixed: true
        }
      });
      watch(() => props.text, (nV: any) => {
        state.textTemp = nV
      })
      watch(() => state.showFieldColumn, (n) => {
        if (n) {
          state.tableHeadTemp = JSON.parse(JSON.stringify(props.tableHead))
        }
      })
      watch(() => state.showContentFixed, (n) => {
        if (n) {
          state.tempContentFixed = JSON.parse(JSON.stringify(state.contentFixed))
        }
      })
      const tableHeadTempDeep = computed(() => {
        const list: any = []
        const deep = (arr: any[], pLabel: string = '') => {
          arr.forEach(v => {
            v.allLabel = pLabel ? `${pLabel}-${v.label}` : v.label
            if (!v.tempFixed && v.fixed) {
              v.tempFixed = JSON.parse(JSON.stringify(v.fixed))
            }
            if (v.children && v.children.length > 0) {
              deep(v.children, v.allLabel)
            } else {
              list.push(v)
            }
          })
        }
        deep(state.tableHeadTemp)
        return list
      })

      const columnIsAllCpt = computed(() => {
        return tableHeadTempDeep.value.every(v => v.show)
      })

      const handleCheckAllChange = () => {
        if (columnIsAllCpt.value) {
          tableHeadTempDeep.value.forEach(v => {
            v.show = false
          })
        } else {
          tableHeadTempDeep.value.forEach(v => {
            v.show = true
          })
        }
      }
      const handleContentFixed = () => {
        state.contentFixed = JSON.parse(JSON.stringify(state.tempContentFixed))
        tableHeadTempDeep.value.forEach((v: any) => {
          if (v.tempFixed === 'left') {
            v.fixed = state.contentFixed.leftFixed ? 'left' : false
          } else if (v.tempFixed === 'right') {
            v.fixed = state.contentFixed.rightFixed ? 'right' : false
          }
        })
        emit('update:full', state.contentFixed.full)
        emit('update:tableHead', state.tableHeadTemp)
        state.showContentFixed = false
      }
      onMounted(() => {
        state.tableHeadTemp = JSON.parse(JSON.stringify(props.tableHead))
        state.tempContentFixed = JSON.parse(JSON.stringify(state.contentFixed))
      })
      return {
        ...toRefs(state),
        tableHeadTempDeep,
        handleCheckAllChange,
        columnIsAllCpt,
        handleContentFixed
      }
    },
  })
</script>

<style scoped lang="scss">
  .cus-content {
    width: 100%;
    height: 100%;
    display: flex;
    flex-direction: column;
    background-color: #F5FBFF;
    box-sizing: border-box;
    .cc-top-slot {
      margin-bottom: 10px;
      background-color: #FFFFFF;
    }
    .cc-field-out {
      margin-bottom: 10px;
      background-color: #FFFFFF;
      height: auto;
      padding: 14px 24px 0 24px;
      .field-out-slot {
        flex: 1;
        :deep(.el-form-item) {
          margin-bottom: 12px;
        }
      }
    }
    .cc-center-slot {
      margin-bottom: 10px;
      background-color: #FFFFFF;
    }
    .cc-bottom {
      background-color: #FFFFFF;
      flex: 1;
      z-index: 1;
      display: flex;
      flex-direction: column;
      padding: 12px 16px;
      .operation {
        display: flex;
        justify-content: space-between;
        margin-bottom: 12px;
        .buttons {
          display: flex;
          :deep(>*) {
            margin-right: 10px;
          }
        }
        .filters {
          height: 36px;
          :deep(.el-dropdown) {
            .tools {
              width: 36px;
              height: 36px;
              box-sizing: border-box;
              border-radius: 4px;
              border: 1px solid #E4E4E4;
              display: flex;
              align-items: center;
              justify-content: center;
            }
            .el-dropdown-menu {
              padding: 8px 4px;
            }
            .el-dropdown-menu__item {
              padding: 0;
              .tools-item {
                padding: 0 8px;
                display: flex;
                align-items: center;
                width: 170px;
                height: 40px;
                box-sizing: border-box;
                .svg-icon {
                  margin-right: 8px;
                }
              }
            }
          }
        }
      }
      .table {
        flex: 1;
        z-index: 1;
        display: flex;
      }
    }
    :deep(.field-dialog) {
      .el-overlay-dialog {
        overflow: hidden;
        .el-dialog {
          border-radius: 8px;
          .el-dialog__header {
            padding: 30px 28px 38px 28px;
            margin: 0;
            font-size: 18px;
            font-family: Microsoft YaHei;
            font-weight: bold;
            color: #333333;
            display: flex;
            justify-content: space-between;
          }
          .el-dialog__body {
            padding: 0 28px;
          }
          .el-dialog__footer {
            padding: 22px 28px 20px 28px;
            .buttons {
              width: 100%;
              display: flex;
              justify-content: flex-end;
              >div {
                display: flex;
                align-items: center;
                justify-content: center;
                box-sizing: border-box;
              }
              .cancel {
                margin-right: 10px;
                width: 72px;
                height: 36px;
                background: #F8F8F8;
                border: 1px solid #E4E4E4;
                border-radius: 4px;
                font-size: 14px;
                font-family: Microsoft YaHei;
                font-weight: 400;
                color: #999999;
              }
              .submit {
                width: 72px;
                height: 36px;
                background: #0062E9;
                border-radius: 4px;
                font-size: 14px;
                font-family: Microsoft YaHei;
                font-weight: 400;
                color: #FFFFFF;
              }
            }
          }
        }
      }
    }
    .field-column {
      display: flex;
      justify-content: space-between;
      .fc-block {
        .fcb-title {
          font-size: 14px;
          font-family: Microsoft YaHei;
          font-weight: 400;
          color: #666666;
          margin-bottom: 18px;
        }
        .fcb-content {
          height: 488px;
          border: 1px solid #E4E4E4;
          border-radius: 4px;
          display: flex;
          flex-direction: column;
          .fcbc-filter {
            padding: 10px 12px 0 12px;
          }
          .check {
            width: 18px;
            height: 18px;
            box-sizing: border-box;
            border: 1px solid #d3d3d3;
            border-radius: 2px;
            margin: 0 10px;
            cursor: pointer;
            font-size: 16px;
            &.active {
              background-color: #6587ff;
              border-color: #6587ff;
              display: grid;
              place-items: center;
              &:after {
                content: '✔';
                color: #ffffff;
                font-size: 14px;
              }
            }
            &:hover {
              opacity: 0.8;
            }
          }
          .fcbc-bottom {
            margin-top: auto;
            display: flex;
            justify-content: space-between;
            align-items: center;
            height: 40px;
            min-height: 40px;
            background: #FFFFFF;
            border-top: 1px solid #E4E4E4;
            border-radius: 0px 0px 4px 4px;
            padding: 0 10px 0 12px;
            font-size: 14px;
            font-family: Microsoft YaHei;
            font-weight: 400;
            color: #666666;
            box-sizing: border-box;
          }
        }
        &.fc-all {
          width: 480px;
          .fcbc-list {
            display: grid;
            grid-template-columns: repeat(2, 1fr);
            padding: 20px 12px;
            row-gap: 22px;
            column-gap: 30px;
            overflow-y: auto;
            .table-head-item {
              height: 18px;
              display: flex;
              align-items: center;
              line-height: 1;
              .label {
                width: 164px;
              }
            }
          }
          .fcbc-bottom {
            >div:nth-child(2) {
              display: flex;
              align-items: center;
              .check:after {
                transform: translateY(-2px);
              }
            }
          }
        }
        &.fc-select {
          width: 244px;
          .fcbc-list {
            overflow-y: auto;
            display: grid;
            row-gap: 26px;
            padding: 20px 12px;
            grid-template-columns: repeat(1, 1fr);
            .table-head-select-item {
              display: flex;
              align-items: center;
              .svg-icon:first-child {
                margin-right: 10px;
              }
              .label {
                width: 164px;
              }
              .svg-icon:last-child {
                margin-left: auto;
              }
            }
          }
          .fcbc-bottom {
            .clear {
              font-size: 14px;
              font-family: Microsoft YaHei;
              font-weight: 400;
              color: #0062E9;
            }
          }
        }
      }
    }
    &.cus-content-full {
      overflow-y: auto;
      position: absolute;
    }
  }
</style>
