<template>
  <div id="list-frame" :style="`height:${heights}px`">
    <el-scrollbar style="height:100%">
      <el-card style="background:rgb(231, 224, 235);border-radius: 60px;" shadow="hover">
        <el-row>
          <el-col :span="21" class="title">
            <span v-if="returns">
              <el-button size="mini" plan circle @click="toReturns" style="box-shadow: 0 2px 4px rgba(0, 0, 0, .12), 0 0 6px rgba(0, 0, 0, .04)">
                <span class="el-icon-arrow-left" style="zoom:1.5;font-weight:700"></span>
              </el-button>
            </span>
            <slot name="title">
              {{ title }}
            </slot>
          </el-col>
          <el-col :span="3" class="title" v-if="needAdd">
            <el-button type="primary" icon="el-icon-plus" size="mini" @click="$emit('add')">新增</el-button>
          </el-col>
        </el-row>
        <slot name="filter" v-if="needFilter">
          <el-form :inline="true" style="padding:0.9rem 1.875rem ;">
            <el-form-item v-for="(item, index) in filter" :key="index" :label="item.label">
              <template v-if="item.type === `select`">
                <el-select v-model="searchInfo[`${item.model}`]" size="mini" clearable>
                  <!-- <el-option v-for="(select, sIndex) in item.list" :key="sIndex" :label="select.label" :value="select.value"></el-option> -->
                  <slot name="options" v-bind="{ item }"></slot>
                </el-select>
              </template>
              <template v-else>
                <el-input v-model="searchInfo[`${item.model}`]" size="mini" clearable></el-input>
              </template>
            </el-form-item>
            <el-form-item>
              <el-button type="primary" size="mini" @click="toQuery()">查询</el-button>
            </el-form-item>
          </el-form>
        </slot>

        <div style="padding:0.9rem 1.875rem ;">
          <slot> </slot>
        </div>
        <el-row type="flex" align="middle" justify="end" v-if="needPag">
          <el-col :span="24" style="text-align:right;">
            <el-pagination
              background
              layout="total, prev, pager, next"
              :total="total"
              :page-size="limit"
              :current-page.sync="currentPage"
              @current-change="changePage"
            >
            </el-pagination>
          </el-col>
        </el-row>
      </el-card>
    </el-scrollbar>
  </div>
</template>

<script>
import _ from 'lodash';
export default {
  name: 'list-frame',
  props: {
    title: { type: String },
    filter: { type: Array, default: () => [] },
    total: { type: Number, default: 0 },
    needPag: { type: Boolean, default: true },
    returns: { type: null, default: null },
    needFilter: { type: Boolean, default: true },
    needAdd: { type: Boolean, default: true },
  },
  components: {},
  data: () => ({
    limit: _.get(this, `$limit`, undefined) !== undefined ? this.$limit : process.env.VUE_APP_LIMIT * 1,
    currentPage: 1,
    searchInfo: {},
    heights: document.documentElement.clientHeight - 80,
  }),
  created() {},
  computed: {},
  mounted() {
    const that = this;
    window.onresize = () => {
      return (() => {
        window.fullHeight = document.documentElement.clientHeight - 80;
        that.heights = window.fullHeight;
      })();
    };
  },
  methods: {
    changePage(page) {
      this.$emit('query', { skip: (page - 1) * this.limit, limit: this.limit, ...this.searchInfo });
    },
    toQuery() {
      let keys = Object.keys(this.searchInfo);
      for (const key of keys) if (this.searchInfo[key] === '' || !this.searchInfo[key]) delete this.searchInfo[key];
      this.$emit('query', this.searchInfo);
    },
    toReturns() {
      if (_.isString(this.returns)) this.$router.push({ path: this.returns });
      else if (_.isFunction(this.returns)) {
        let fun = _.get(this, `returns`);
        fun();
      }
    },
  },
};
</script>

<style lang="less" scoped>
.title {
  font-size: 1rem;
  font-weight: 700;
  padding: 1rem;
}
/deep/.el-scrollbar__wrap {
  overflow-x: auto;
}
</style>
