作者:管理员  历史版本:1  最后编辑:龚清  更新时间:2024-11-20 15:41

基础功能

用于选择或输入日期,展示日期范围,快速填写对应得日期格式数据。


当ibps-date-range元素中注入对应数据后得效果,此处应用在数据模板得查询条件控件中。

<template>
  <el-form
    v-if="forms"
    ref="form"
    width="30%"
    :label-suffix="labelSuffix"
    :model="params"
    :inline="inline"
    :label-position="'left'"
    :label-width="labelWidth ? (labelWidth + 'px') : ''"
    class="ibps-crud__search-form"
    @keyup.enter.native.stop="handleEnter"
  >
    <el-row :gutter="20">
      <el-col
        v-for="(item, index) in showForms"
        :key="index"
        :style="{display: isExpand ? (index > indexNum ? 'none' : 'inline') : 'inline','margin':'5px 0px','text-align':'center'}"
        :xs="12"
        :sm="12"
        :md="12"
        :lg="6"
        :xl="6"
      >
        <el-form-item
          :prop="item.modelValue"
          :label="$t(item.label)"
          :rules="item.rules || []"
          :label-width="getLabelWidth( item.label) + 'px' "
          class="search-form-item"
          @submit.native.prevent
        >
          <template slot="label">
            <ibps-ellipsis :length="10">{{ item.label }}</ibps-ellipsis>{{ labelSuffix?labelSuffix:':' }}
          </template>
          ...
          <!-- 日期范围(年)-->
          <ibps-date-range
            v-else-if="item.fieldType === 'yearrange'"
            v-model="params[item.modelValue + item.datefmt]"
            :size="item.size ? item.size : size"
            :disabled="item.disabled"
            :readonly="item.readonly"
            :editable="item.editable"
            :placeholder="item.placeholder?item.placeholder:$t('common.placeholder.please-select')"
            :style="itemStyle + (item.itemWidth ? `width: ${item.itemWidth}%;` : '')"
            :value-format="item.field_options.datefmt||'yyyy'"
            :format="item.field_options.datefmt||'yyyy'"
            type="year"
            clearable
            @change="date => changeDate(date, item.prop[0], item.prop[1])"
            @keyup.enter.native.stop="handleEnter"
          />
          ...
        </el-form-item>
      </el-col>
      <el-col
        :xs="12"
        :sm="12"
        :md="12"
        :lg="6"
        :xl="6"
        :offset="offset"
        style="margin-top: 5px;text-align:center"
      >
        <div class="ibps-fr ibps-mb-10">
          <slot name="searchToolbars" />
          <el-link
            v-show="displayIcon"
            type="primary"
            :underline="false"
            class="ibps-mr-5 ibps-ml-20"
            @click="handleCollapseExpandToolbar()"
          >
            {{ $t('components.crud.'+(+isExpand?'expand':'collapse')) }}
            <i :class="isExpand ? 'el-icon-arrow-down' : 'el-icon-arrow-up'" class="el-icon--right" />
          </el-link>
        </div>
      </el-col>
    </el-row>
  </el-form>
</template>

<script>
...
import IbpsDateRange from '@/components/ibps-date-range'
...

export default {
  components: {
    ...
    IbpsDateRange,
    ...
  },
  props: formProps,
  data() {
    const { forms, fuzzy } = this.$props
    const datePrefix = 'daterange-prefix'
    const selectOptionPrefix = 'select-option-prefix'
    const fieldTypes = ['select', 'checkbox']
    const dataObj = {
      selectOptions: {}
    }
    const params = {}
    const nameParams = {}
    const format = {}
    const fuzzyOps = {}
    forms.forEach((v, i) => {
      const propType = typeof v.prop
      if (propType === 'string') {
        v.modelValue = v.fieldType === 'customDialog' ? v.prop + 'L' : v.prop
        params[v.prop] = v.value || ''
        if (v.name) {
          nameParams[v.prop] = v.name
        }

        fuzzyOps[v.prop] = v.fuzzy ? v.fuzzy : fuzzy
        if (v.format) {
          format[v.prop] = v.format
        }
      } else if (propType === 'object' && Object.prototype.toString.call(v.prop) === '[object Array]') {
        const multiple = v.multiple || false
        if (fieldTypes.includes(v.fieldType) && multiple) {
          params[v.prop[0]] = []
        } else {
          v.prop.forEach((vv, j) => {
            params[vv] = v.value ? v.value[j] || '' : ''
            if (v.name) {
              nameParams[vv] = v.name[j]
            }
            if (v.format) {
              format[vv] = v.format
            }
            fuzzyOps[vv] = v.fuzzy ? v.fuzzy : fuzzy
          })
        }
      }
      if (v.fieldType === 'yearrange' || v.fieldType === 'monthrange' || v.fieldType === 'daterange' || v.fieldType === 'datetimerange' || v.fieldType === 'timerange' || v.fieldType === 'numberRange') {
        params[datePrefix + i] = v.fieldType === 'numberRange' ? [] : this.$utils.isNotEmpty(v.value) ? v.value : ''
        v.modelValue = datePrefix + i
      } else if (v.fieldType === 'select' && (v.selectFetch || v.selectUrl)) {
        const dataKey = selectOptionPrefix + i
        dataObj.selectOptions[dataKey] = []
        if (!v.selectMethod) {
          v.selectMethod = 'get'
        }
        this.getRemoteData({
          fetch: v.selectFetch ? v.selectFetch : () => {
            const p = v.selectMethod.toLowerCase() === 'get'
              ? { params: v.selectParams } : v.selectParams
            return request({
              url: v.selectUrl,
              method: v.selectMethod,
              p
            })
          },
          dataKey,
          resultField: v.resultField || 'data',
          resultHandler: v.resultHandler
        })
      }
    })
    return {
      params,
      nameParams,
      datePrefix,
      selectOptionPrefix,
      ...dataObj,
      format,
      fuzzyOps,
      buttonStatus: true,
      stopTime: null,
      isExpand: true
    }
  },
  computed: {
    itemStyle() {
      const { itemWidth } = this
      if (itemWidth) {
        return `width: ${itemWidth}%;`
      }
      return ''
    },
    indexNum() {
      if (document.body.clientWidth >= 1200) {
        return 2
      } else {
        return 0
      }
    },
    showForms() {
      const showForms = []
      this.forms.forEach(form => {
        if (form.fieldType !== 'hidden') {
          showForms.push(form)
        }
      })
      return showForms
    },
    offset() {
      let lableNum = 0
      let offsetNum = 0
      const showForms = []
      if (document.body.clientWidth >= 1200) {
        lableNum = 4
        offsetNum = 6
      } else {
        lableNum = 2
        offsetNum = 12
      }
      this.forms.forEach(form => {
        if (form.fieldType !== 'hidden') {
          showForms.push(form)
        }
      })
      // 展开
      if (this.isExpand) {
        return showForms.length < lableNum ? Math.abs(((lableNum - 1) - showForms.length)) * offsetNum : 0
      } else {
        // 收缩
        return Math.abs((lableNum - 1) - (showForms.length % lableNum)) * offsetNum
      }
    },
    displayIcon() {
      if (document.body.clientWidth >= 1920) {
        return !(this.showForms.length < 4)
      } else if (document.body.clientWidth >= 1200 && document.body.clientWidth < 1920) {
        return !(((this.selector && this.showForms.length < 3) || (!this.selector && this.showForms.length < 4)))
      } else {
        return !(this.showForms.length < 1)
      }
    }
  },
  beforeDestroy() {
    this.params = null
    this.nameParams = null
    this.format = null
    this.fuzzyOps = null
  },
  methods: {
    handleCollapseExpandToolbar() {
      this.isExpand = !this.isExpand
      this.$emit('collapse-expand-toolbar', this.isExpand)
    },
    /**
     * 处理回车
     */
    handleEnter() {
      this.$emit('search')
    },
    isArray(value) {
      return typeof value === 'object' && Object.prototype.toString.call(value) === '[object Array]'
    },
    getParamFuzzy() {
      return this.fuzzyOps
    },
    getParam() {
      return this.params
    },
    /**
     * 获取参数
     */
    getSearcFormData() {
      const { params, nameParams, datePrefix, format } = this
      const formattedForm = {}
      Object.keys(params).forEach(v => {
        if (v && v.indexOf(datePrefix) === -1) {
          const val = format[v] ? format[v](params[v], v) : params[v]
          if (this.$utils.isNotEmpty(val) && !Array.isArray(val)) {
            let key = v
            if (nameParams[v]) {
              key = nameParams[v]
            }
            formattedForm[key] = val
          } else {
            formattedForm[v] = params[v]
          }
        }
      })
      return formattedForm
    },
    /**
     *重置表单
     */
    resetSearchForm() {
      const { params, datePrefix } = this
      Object.keys(params).forEach(v => {
        if (v && v.indexOf(datePrefix) === -1) {
          params[v] = ''
        }
      })
      this.$refs['form'].resetFields()
    },
    changeNumber(data, start, end) {
      let startVal = null
      let endVal = null
      if (data !== null) {
        startVal = data[0] || null
        endVal = data[1] || null
      }
      this.params[start] = startVal
      this.params[end] = endVal
    },
    changeDate(date, startDate, endDate) {
      if (date === null) {
        this.params[startDate] = ''
        this.params[endDate] = ''
        return
      }
      this.params[startDate] = date[0]
      this.params[endDate] = date[1]
    },
    /**
     * 获取的远程数据【下拉框】
     */
    getRemoteData({ fetch, dataKey, resultField, resultHandler }) {
      fetch().then(response => {
        let result = response
        if (typeof response === 'object' && !this.isArray(response)) {
          if (resultField.indexOf('.') !== -1) {
            resultField.split('.').forEach(vv => {
              result = result[vv]
            })
          } else {
            result = response[resultField]
          }
        }
        if (!result || !(result instanceof Array)) {
          throw new Error(`The result of key:${resultField} is not Array.`)// 接口返回的字段:${resultField} 不是一个数组
        }
        if (this.resultHandler) {
          this.selectOptions[dataKey] = result.map(this.resultHandler)
        } else {
          this.selectOptions[dataKey] = result
        }
      })
    },
    getAddressTopVal(fieldOptions) {
      return FormUtils.getAddressTopVal(fieldOptions)
    },
    getLinkDynamicParams(fieldOptions, data) {
      return FormUtils.getLinkDynamicParams(fieldOptions, data)
    },
    getLinkValueKey(fieldOptions, data) {
      return FormUtils.getLinkValueKey(fieldOptions, data)
    },
    getLinkLabelType(fieldOptions, data) {
      return FormUtils.getLinkLabelType(fieldOptions, data)
    },
    getLinkLabelKey(fieldOptions, data) {
      return FormUtils.getLinkLabelKey(fieldOptions, data)
    },
    getLabelWidth(label) {
      let labelLength = getTextFullLength(label)
      const labelSuffixLength = getTextFullLength(this.labelSuffix)
      if (labelLength > 10) {
        labelLength = 12
      }
      return (labelLength + labelSuffixLength) * formLabelFontSize / 2 + 5
    }
  }
}
</script>