<!--
* @name: 页面基本结构组件
* @author: zhangpengcheng
* @date: 2022-08-23
-->
<!-- style="overflow: auto;" -->
<template>
  <div
    class="container"
    v-loading="loading"
    :style="
      'backgroundColor:' +
      bgColor +
      ';paddingBottom:' +
      paddingBottom +
      ';height:' +
      bodyHight
    "
  >
    <!-- 标题       -->
    <div class="title" flex="cross:center" v-if="showTitle">
      <span v-if="!$route.meta.back">{{ title }}</span>
      <span @click="goBack" class="back" v-else
      ><i class="el-icon-arrow-left"></i>返回</span
      >
    </div>

    <!-- <div class="main":style="'backgroundColor:'+ mainColor " > -->
    <div
      class="main"
      :style="{
        height: showTitle ? 'calc(100% - 38px)' : '100%',
        backgroundColor: mainColor,
      }"
    >
      <!-- 操作按钮 -->
      <div
        class="pushButton"
        flex="cross:centet main:right cross:center"
        v-if="operateButtonSwitch"
      >
        <div class="operationButton" flex="cross:center">
          <div v-if="defaultButtonSwitch" style="margin-right: 5px">
            <el-button
              v-for="(item, index) in defaultButtonList"
              :type="item.type ? item.type : 'primary'"
              size="small"
              class="iconfont buttonList"
              :icon="item.icon"
              @click="funNewClick(item)"
              :key="index"
            >
              {{ item.menuName }}
            </el-button>
          </div>
          <slot name="btn"></slot>
          <el-button
            v-for="(item, index) in buttonList"
            :type="item.type ? item.type : 'primary'"
            size="small"
            class="iconfont buttonList"
            :icon="item.icon"
            @click="funNewClick(item)"
            :key="index"
          >
            <span v-if="item.menuName">{{ item.menuName }}</span>
          </el-button>
        </div>
        <div v-if="fixedButton" style="margin-left: 5px">
          <el-tooltip
            class="item"
            effect="dark"
            :content="item.title"
            placement="top"
            v-for="(item, index) in fixedButtonList"
            :key="index"
            trigger="hover"
          >
            <span>
              <el-button
                size="mini"
                :icon="item.icon"
                @click.stop="fixedClick(item)"
                style="margin: 0"
              ></el-button>
            </span>
          </el-tooltip>
        </div>
      </div>
      <!-- 搜索 -->
      <div
        v-show="querySwitch"
        style="padding: 5px; background-color: #fff"
        flex="cross:center"
        ref="serchRefs"
        class="searchForTable"
      >
        <div
          v-for="(row, indexRow) in searchList"
          class="searchBox"
          :key="indexRow"
          style="margin-right: 5px"
        >
          <el-input
            v-model="ruleForm[row.columnNameEN]"
            clearable
            :type="row.type ? row.type : 'text'"
            style="width: 100%"
            :placeholder="!row.columnNameCN ? '请输入' : row.columnNameCN"
            v-if="row.tag === 'elInput'"
            min="1"
            @keydown.enter.native="handerInputEnter()"
          >
          </el-input>
          <el-date-picker
            v-model="ruleForm[row.columnNameEN]"
            v-if="row.tag === 'elDatePicker'"
            :class="{ one: row.type ? 'date' : row.type }"
            style="width: 100%"
            :value-format="!row.valueFormat ? 'yyyy-MM-dd' : row.valueFormat"
            range-separator="至"
            start-placeholder="开始日期"
            end-placeholder="结束日期"
            :type="!row.type ? 'date' : row.type"
            :placeholder="!row.columnNameCN ? '请选择' : row.columnNameCN"
          >
          </el-date-picker>
          <el-radio-group
            v-model="ruleForm[row.columnNameEN]"
            v-if="row.tag === 'elRadio'"
          >
            <el-radio-button
              v-for="el in row.options"
              :label="el.value"
              :key="el.value"
            >{{ el.label }}
            </el-radio-button>
          </el-radio-group>
          <div
            v-if="row.tag === 'elDialog'"
            class="elDialog"
            style="cursor: pointer; height: 32px; ine-height: 32px"
          >
            <p
              :style="{
                color: ruleForm[row.columnNameEN] ? '#000' : '#c0c4cc',
              }"
              style="width: 100%; margin: 0"
              @click="elDialogClick(row, index, indexRow)"
            >
              {{
                ruleForm[row.columnNameEN]
                  ? ruleForm[row.columnNameEN]
                  : row.columnNameCN
                    ? row.columnNameCN
                    : "请点击选择"
              }}
            </p>
            <i
              class="el-icon-more"
              @click="elDialogClick(row, index, indexRow)"
              v-if="!row.disabled && !ruleForm[row.columnNameEN]"
            ></i>
            <i
              class="el-icon-circle-close"
              v-if="!row.disabled && ruleForm[row.columnNameEN]"
              @click="elDialogClear(row)"
              style="margin-left: 10px"
            ></i>
          </div>
          <el-select
            v-model="ruleForm[row.columnNameEN]"
            filterable
            style="width: 100%"
            @change="selectChange($event, indexRow)"
            :clearable="row.clearable ? row.clearable : true"
            :placeholder="!row.columnNameCN ? '请选择' : row.columnNameCN"
            v-if="row.tag === 'elSelect'"
          >
            <el-option
              v-for="(el, elIndex) in row.options"
              :key="!row.optionValue ? el['value'] : el[row.optionValue]"
              :label="!row.optionLabel ? el['label'] : el[row.optionLabel]"
              :value="!row.optionValue ? el['value'] : el[row.optionValue]"
            >
            </el-option>
          </el-select>
        </div>
        <!-- 搜索按钮 -->
        <el-button
          type="primary"
          size="small"
          icon="el-icon-search searchIcon"
          @click="search"
          title="搜索"
        >
          搜索
        </el-button>
        <el-button
          v-if="searchList.length > 1"
          type="primary"
          size="small"
          icon="el-icon-refresh-left searchIcon"
          class="searchIcon"
          @click="refresh"
          title="重置"
        >重置
        </el-button>
        <slot name="searchBtn"></slot>
      </div>
      <div :style="'height:' + getMainHeight()" class="tableHeight">
        <slot name="main" :tableHeight="tableHeight"></slot>
      </div>
      <!-- 主要内容  -->
      <!-- 分页 -->
      <base-page
        v-if="isPage"
        :pageModel.sync="pageModel"
        @onPageChange="onPageChange"
      ></base-page>
    </div>
  </div>
</template>

<script>
// import heightTransition from '@/common/js/heightTransition'
// import customCascader from "@/components/customCascader";
import { exportDown, wordDown, zipDown } from "@/utils/util.js";
import basePage from "@/components/base/basePage";
import { TokenKeys } from "@/utils/variable";
// import fetch from '../../api/request'
import { getApiSign } from "@/utils/apiSign";
// import domainsFuc from '@/api/domains.js'
export default {
  components: {
    // heightTransition,
    basePage,
    // customCascader
  },
  props: {
    // 是否展示标题
    showTitle: {
      type: Boolean,
      default: true,
    },

    // 标题
    title: {
      type: String,
      default: "",
    },

    // 背景颜色
    bgColor: {
      type: String,
      default: "#ffffff",
    },
    // 背景颜色
    mainColor: {
      type: String,
      default: "",
    },
    // 底部padding
    paddingBottom: {
      type: String,
      // default: '68px'
    },
    // 高度
    bodyHight: {
      type: [Number, String],
      default: "100%",
    },
    // main高度
    mainHight: {
      type: [Number, String, Boolean],
      default: "calc(100% - 38px)",
    },
    // 搜索配置
    searchModel: {
      type: Array,
      default: () => {
        return [];
      },
    },

    // 按钮配置
    buttonList: {
      type: Array,
      default: () => {
        return [];
        // [{
        // 	icon: 'el-icon-plus',
        // 	menuName: '新增'
        // }, {
        // 	icon: 'el-icon-edit',
        // 	menuName: '编辑'
        // }, {
        // 	icon: 'el-icon-delete',
        // 	menuName: '删除',
        // 	type: 'danger'
        // }, {
        // 	icon: 'el-icon-refresh',
        // 	menuName: '刷新'
        // },]
      },
    },
    defaultButtonList: {
      type: Array,
      default: () => {
        return [
          {
            icon: "el-icon-plus",
            menuName: "新增",
          },
          {
            icon: "el-icon-edit",
            menuName: "编辑",
          },
          {
            icon: "el-icon-delete",
            menuName: "删除",
            type: "danger",
          },
          // {
          // 	icon: 'el-icon-refresh',
          // 	menuName: '刷新'
          // },
        ];
      },
    },
    // 是否展示分页
    isPage: {
      type: Boolean,
      default: false,
    },
    // 导出接口地址
    exportUrl: {
      default: "",
    },
    // 导入接口地址
    importUrl: {
      default: "",
    },
    //单选
    only: {
      default: "",
    },
    // 左侧固定按钮
    fixedButton: {
      type: Boolean,
      default: false,
    },
    // 是否显示查询条件
    querySwitch: {
      type: Boolean,
      default: false,
    },
    // 搜索列表
    searchList: {
      type: Array,
      default: () => {
        return [];
      },
    },
    // 操作按钮
    operateButtonSwitch: {
      type: Boolean,
      default: true,
    },
    // 操作按钮
    defaultButtonSwitch: {
      type: Boolean,
      default: true,
    },
    // 右侧按钮
    fixedButtonList: {
      type: Array,
      default: () => {
        return [
          {
            icon: "el-icon-s-operation",
            title: "筛选",
          },
          {
            icon: "el-icon-printer",
            title: "打印",
          },
          {
            icon: "el-icon-folder",
            title: "导出",
          },
        ];
      },
    },
  },
  data() {
    return {
      ruleForm: {},
      onlyUrl: "",
      clientHeight: "",
      // 上传请求头
      uploadHeaders: {},
      // uurl: domainsFuc().domain,
      uurl: "http://www.wldxt.cn:8089/taizhou/daxitong/crm/",
      // 参数
      model: {},
      // 收起/展开搜索
      isSearch: false,
      // 分页数据
      pageModel: {
        total: 0,
        page: 1,
        limit: 20,
      },
      // 清除状态
      clearState: 0,
      loading: false,
      // fixedButtonList: [{
      // 	icon: 'el-icon-s-operation',
      // 	title: '筛选'
      // },
      // {
      // 	icon: 'el-icon-printer',
      // 	title: '打印'
      // },
      // {
      // 	icon: 'el-icon-folder',
      // 	title: '导出'
      // }
      // ],
      // defaultButtonList: [
      // 	{
      // 		icon: 'el-icon-plus',
      // 		menuName: '新增'
      // 	}, {
      // 		icon: 'el-icon-edit',
      // 		menuName: '编辑'
      // 	}, {
      // 		icon: 'el-icon-delete',
      // 		menuName: '删除',
      // 		type: 'danger'
      // 	}, {
      // 		icon: 'el-icon-refresh',
      // 		menuName: '刷新'
      // 	},
      // ],
      tableHeight: "100%",
    };
  },
  created() {},
  mounted() {
    // this.getTableHight()
    // window.onresize = () => {
    // 	this.clientHeight = document.documentElement.clientHeight;
    // },
    // this.importUpload(); //初始化上传
  },
  computed: {
    // menuJson() {
    // 	return JSON.parse(localStorage.getItem(TokenKeys.MENU_JSON))
    // }
  },
  methods: {
    getTableHight() {
      let height = "100%";
      let heightReduce = 0;
      if (this.operateButtonSwitch) {
        heightReduce = heightReduce + 53;
      }
      if (this.querySwitch) {
        heightReduce = heightReduce + 47;
      }
      if (this.isPage) {
        heightReduce = heightReduce + 53;
      }
      height = "calc(100% - " + heightReduce + "px)";
      this.tableHeight = height;
    },
    getMainHeight() {
      // operateButtonSwitch 操作开关 querySwitch查询高 度
      let height = "100%";
      let heightReduce = 0;
      if (this.operateButtonSwitch) {
        heightReduce = heightReduce + 56;
      }
      if (this.querySwitch) {
        heightReduce = heightReduce + 33;
      }
      if (this.isPage) {
        heightReduce = heightReduce + 56;
      }
      height = "calc(100% - " + heightReduce + "px)";
      // console.log(height, "height")
      return height;
    },
    pageClear() {
      this.pageModel.page = 1;
    },
    // importUpload() {
    // 	const timestamp = new Date().getTime() + '';
    // 	const sign = getApiSign(timestamp);
    // 	this.uploadHeaders['timestamp'] = timestamp;
    // 	this.uploadHeaders['appKey'] = TokenKeys.APP_KEY;
    // 	this.uploadHeaders['sign'] = sign;
    // 	this.uploadHeaders[TokenKeys.ACCESS_TOKEN] = localStorage.getItem(TokenKeys.ACCESS_TOKEN);
    // },
    handleSuccess(res) {
      const { code, msg, data } = res;
      if (code && code == 10000) {
        this.loading = false;
        this.$vmNews("上传成功", "success");
      } else {
        this.$vmNews(msg);
        this.loading = false;
      }
    },
    handleProgress() {
      this.loading = true;
    },
    handleError() {
      this.$vmNews("上传失败", "error");
    },
    // 自定义级联选择器返回值
    getCascader(value, field) {
      this.$set(this.model, field, value);
    },
    // 设置分页total值
    setPageTotal(total) {
      this.$set(this.pageModel, "total", total);
    },
    setPageNum(pageNum) {
      this.$set(this.pageModel, "page", pageNum);
    },
    //参数propLabel ， 值value
    getField(propLabel, value) {
      this.$set(this.ruleForm, propLabel, value);
    },
    // 返回
    goBack() {
      this.$router.go(-1);
    },
    // 按钮点击事件
    funNewClick(item) {
      if (item.menuName == "刷新" || item.btnFunction == "Refresh") {
        this.$tab.refreshPage(this.$route);
      } else {
        this.$emit("onFuncBtn", item);
      }
    },
    // 固定按钮点击事件
    fixedClick(item) {
      this.$emit("onFixedBtn", item);
    },
    // 操作按钮点击事件
    funcClick(btnItem) {
      this.$emit("onFuncBtn", btnItem);
    },
    // 导出函数
    eventExport(params) {
      // console.log(params, 'params')
      // console.log(this.onlyUrl ? this.onlyUrl : this.exportUrl, 'this.onlyUrl?this.onlyUrl:this.exportUrl')
      // return fetch.get(this.onlyUrl ? this.onlyUrl : this.exportUrl, {
      // 	params,
      // 	responseType: 'blob'
      // })
    },
    // 设置某个参数的值
    setSomeParam(field, value = null) {
      this.$set(this.model, field, value);
    },
    // 查询、重置事件
    queryEvent(state) {
      this.$emit("onQuery", this.mergeParam(true));
    },
    // 回车搜索
    handerInputEnter() {
      this.$emit("handerInputEnter", this.ruleForm);
    },
    // 条件查询-下拉框
    selectChange(event, index, indexItem) {
      if (typeof event == "number" && event < 3) {
        if (Number(event) == 2) {
          event = 0;
        } else {
          event = event - 1;
        }
      }
      if (event !== "" && event != undefined) {
        this.$emit("onElSelect", event, index, indexItem, this.model);
      }
    },
    // 页数或每页条数更改时触发
    onPageChange() {
      this.$emit("pageChange", this.mergeParam());
    },
    // 合并参数
    mergeParam(state) {
      if (state) {
        this.pageModel.page = 1;
      }
      let page = {
        page: this.pageModel.page,
        limit: this.pageModel.limit,
      };
      for (let i in this.model) {
        if (!this.model[i]) {
          this.model[i] = null;
        }
      }
      let search = Object.assign({}, page, this.model);
      return Object.assign({}, page, this.model);
    },
    // 收起展开分页
    showSearch() {
      this.isSearch = !this.isSearch;
    },
    // 查询函数
    search() {
      this.$emit("search", this.ruleForm);
    },
    // 重置函数
    refresh() {
      this.ruleForm = Object.assign({}, "");
      this.search();
    },
  },
};
</script>
<style scoped lang='scss'>
.pushButton {
  /* margin: 12px 10px 10px 10px; */
  padding: 10px;
}

::v-deep .iconfont {
  font-size: 12px;
  text-align: center;
}

::v-deep .el-tooltip {
  padding: 0 3px;
}

::v-deep .el-button--mini {
  padding: 6px 8px;
  margin: 5px;
}

.container {
  width: 100%;
  height: 100%;

  .title {
    /* @include boxBase(100%, 48px, $base-color); */
    /* @include fontBase(16px, #fff); */
    font-size: 14px;
    padding: 12px;
  }

  .buttonList + .buttonList {
    margin-left: 5px;
  }

  .main {
    /* height: auto !important; */
    overflow-y: auto;

    /* padding:0 12px; */
    .search {
      height: auto;
      background: #f5f5f5;
      border: 1px solid #d8d8d8;
      padding: 12px;
      transition: all 0.2s ease-in-out;
    }

    .hide {
      height: 0;
    }
  }

  .main::-webkit-scrollbar {
    width: 5px;
    /* background-color: #D8D8D8; */
  }

  .main::-webkit-scrollbar-thumb {
    border-radius: 5px;
    width: 5px;
    background: #b4bccc;
  }

  .w-100 {
    width: 100%;
  }

  .mb-12 {
    margin-bottom: 12px;
  }

  .back {
    cursor: pointer;
  }
}
</style>
