// components/wan-select/select.js
Component({
    options: {
      addGlobalClass: true,
    },
    properties: {
      /* --------- 样式参数 --------- */
      titleWidth: { // 标题长度
        type: String,
        value: "60px"
      },
      bgColor: { // 输入框背景颜色
        type: String,
        value: "#fff"
      },
      itemBgColor: { // 选中的选项背景颜色
        type: String,
        value: "#F5F8FE"
      },
      textColor: { // 选中的字体颜色
        type: String,
        value: "#3772E9"
      },
      /* --------- 数据参数 --------- */
      title: { // 下拉框标题
        type: String,
        value: ""
      },
      options: { // 选项数组
        type: Array,
        value: [],
      },
      labelName: { // 选项数组-绑定的label名称
        type: String,
        value: "dictLabel",
      },
      valueName: { // 选项数组-绑定的value名称
        type: String,
        value: "dictValue"
      },
      modelValue: { // 绑定的value
        type: String,
        value: "",
        observer: function () {
          //如果有默认值，需要匹配出name，所以这里使用obersver，当父组件中值改变时触发
          this.handleData();
        }
      },
      placeholder: { // 输入框为空时占位符
        type: String,
        value: "请选择"
      },
      disabled: { // 是否禁用
        type: Boolean,
        value: false
      },
      readonly: { // 是否只读
        type: Boolean,
        value: false
      }
    },
    /**
     * 页面的初始数据
     */
    data: {
      show: false, //选项框及图标展示
      selectValue: "", //选中的value
      selectLabel: "", //选中的label
      toTop: false, // 下拉框是否展示在输入框上方
    },
    attached() {
      this.handleData()
    },
    methods: {
      // 清空输入框
      clearInput() {
        this.setData({
          selectValue: "", //选中的value
          selectLabel: "", //选中的label
          show: false,
        })
      },
      // 下拉框收起和展开
      changeShow(e) {
        let that = this
        const query = wx.createSelectorQuery();
        // 选择当前点击的 view 元素
        query.select('.inputPlaceholder').boundingClientRect();
        query.exec(function (res) { // res[0].bottom 是元素距离可视区域顶部的距离加上元素自身的高度; res[1].scrollTop 是页面的滚动距离
          var show = !that.data.show
          if (res[0]) {
            /* that.triggerEvent("handleShow", show); // [暂未发现]处理滚动选项区域时背景页面滚动问题 */
            let toBottom = wx.getSystemInfoSync().windowHeight - res[0].bottom;
            console.log('距离设备底部的距离:', toBottom);
            that.setData({
              toTop: toBottom < 160 ? true : false,
              show: show
            })
          } else {
            that.setData({ show: show })
          }
        });
      },
      // 选择数据后回显
      handleChange(e) {
        let { item } = e.currentTarget.dataset
        let { labelName, valueName } = this.data
        this.setData({
          selectValue: item[valueName],
          selectLabel: item[labelName],
          show: false
        })
        let obj = {}
        obj[valueName] = item[valueName]
        obj[labelName] = item[labelName]
        this.triggerEvent("handleChange", obj);// 传参
      },
      // 匹配值并回显
      handleData() {
        let { modelValue, options, valueName, labelName } = this.properties;
        if (modelValue) {
          let item = options.find(r => r[valueName] == modelValue)
          this.setData({
            selectLabel: item ? item[labelName] : modelValue,
            selectValue: modelValue,
          });
        }
      }
    }
  })
  
  