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

基础功能

用于固定表单按钮工具栏展示,表单字段内容过多编辑完成时,需要进行按钮操作得时候得优化。


当ibps-affix元素中注入对应得参数属性后得效果

<template>
  <ibps-affix
    v-if="(actions && actions.length >0) || hasStepButton"
    ref="affix"
    :offset-top="offsetTop"
    :offset-bottom="offsetBottom"
    :mode="mode"
    :class="formToolbarClass"
    :style="formToolbarStyle"
    class="ibps-form-toolbar hidden-print"
    @change-zindex="(z)=>{zIndex = z}"
  >
    <div :class="['ibps-form-toolbar--' +$ELEMENT.size,mode === 'dialog' && !isTop?'ibps-form-toolbar--dialog':null ]" class="ibps-form-toolbar__buttons">
      <div
        v-if="hasPrevStepButton "
        class="buttons ibps-pr-10 ibps-fl-important"
      >
        <el-button
          v-for="button in prevStepButtons"
          :key="button.key"
          :size="button.size||size"
          :icon="'ibps-icon-'+button.icon"
          :autofocus="false"
          :disabled="disabledStepButton(button.key)"
          :loading="stepLoading"
          @click="()=>{ handleStepButtonEvent(button)}"
        >{{ $t(button.label) }}
        </el-button>
      </div>
      <ibps-toolbar
        ref="toolbar"
        :actions="actions"
        :show-icon="false"
        :class="toolbarClass"
        style="flex: 1;"
        @action-event="handleActionEvent"
      />
      <template v-if="hasStepButton">
        <div class="buttons ibps-fr-important ibps-pl-5" :class="isTop?'ibps-pr-30':'ibps-pr-10'">
          <el-button
            v-for="button in newStepButtons"
            :key="button.key"
            :size="button.size||size"
            :icon="'ibps-icon-'+button.icon"
            :autofocus="false"
            :disabled="disabledStepButton(button.key)"
            :loading="stepLoading"
            @click="()=>{ handleStepButtonEvent(button)}"
          >{{ $t(button.label) }}
          </el-button>
        </div>
      </template>
    </div>
  </ibps-affix>

</template>
<script>
import ActionUtils from '@/utils/action'
import IbpsAffix from '@/components/ibps-affix'

export default {
  components: {
    IbpsAffix
  },
  props: {
    /**
     * @description 按钮位置
     */
    buttonPosition: {
      type: String
    },
    size: {
      type: String
    },
    /**
     * @description 工具栏
     */
    actions: {
      type: Array
    },
    mode: String,
    width: [Number, String],
    marginTop: {
      type: [Number, String]
    },
    offsetTop: Number,
    offsetBottom: Number,
    /**
     *  @description 步骤条按钮
     */
    stepButtons: {
      type: Array
    },
    curActiveStep: {
      type: Number
    },
    stepNum: {
      type: Number
    }
  },
  data() {
    return {
      curTime: new Date().getTime(),
      stepLoading: false,
      zIndex: (this.$ELEMENT || {}).zIndex || 2000
    }
  },
  computed: {
    isTop() {
      return this.judgePosition('top', true)
    },
    isCenter() {
      return this.judgePosition('center')
    },
    formToolbarClass() {
      return this.$utils.isNotEmpty(this.buttonPosition) ? this.judgePosition('Left') ? 'ibps-tl' : this.judgePosition('Right') ? 'ibps-tr' : 'ibps-tc' : 'ibps-tl'
    },
    formToolbarStyle() {
      const style = {
        width: this.width || '100%'
      }
      if (this.mode === 'default') {
        return style
      } else if (this.mode === 'dialog') {
        // style.position = 'fixed'
        style.width = '100%'
        return style
      } else {
        style.position = 'fixed'
      }

      if (this.isTop) {
        style.top = 0
      } else {
        style.bottom = 0
      }
      return style
    },
    toolbarClass() {
      if (this.hasStepButton) {
        return null
      }
      return this.isTop && this.judgePosition('Right') ? 'ibps-pr-30' : null
    },
    hasStepButton() {
      return this.$utils.isNotEmpty(this.stepButtons)
    },
    hasPrevStepButton() {
      return this.hasStepButton && this.isCenter && this.$utils.isNotEmpty(this.prevStepButtons)
    },
    prevStepButtons() {
      return this.getStepButtonByKey('prev')
    },
    nextStepButtons() {
      return this.getStepButtonByKey('next')
    },
    newStepButtons() {
      if (!this.isCenter) {
        return this.stepButtons
      } else {
        return this.$utils.isNotEmpty(this.nextStepButtons) ? this.nextStepButtons : []
      }
    }
  },
  watch: {
    zIndex: {
      handler() {
        this.$emit('change-zindex', this.zIndex)
      },
      immediate: true
    }
  },
  beforeDestroy() {
    this.curTime = null
  },
  methods: {
    updatePosition() {
      return this.$refs.affix.updatePosition()
    },
    judgePosition(position, defaultVal = false) {
      return this.$utils.isNotEmpty(this.buttonPosition) ? this.buttonPosition.includes(position) : defaultVal
    },
    handleActionEvent(actionKey, args = {}) {
      this.$emit('action-event', actionKey, args)
    },
    /**
     * 获取表单验证
     */
    validate(callback) {
      this.$emit('validate', callback)
    },
    // 处理表单提交验证
    formSubmitVerify(callback) {
      this.$emit('form-submit-verify', callback)
    },
    /**
     * 获取审批意见验证
     */
    formOpinionValidate(callback) {
      this.$emit('form-opinion-validate', callback)
    },
    formErrorToast(msg) {
      ActionUtils.saveErrorMessage(msg)
    },
    disabledStepButton(key) {
      if (key === 'prev') {
        return this.curActiveStep === 0
      } else {
        return this.stepNum - 1 === this.curActiveStep
      }
    },
    getStepButtonByKey(key) {
      if (!this.hasStepButton) {
        return null
      }
      const buttons = []
      for (let i = 0; i < this.stepButtons.length; i++) {
        const button = this.stepButtons[i]
        if (button.key === key) {
          buttons.push(button)
          return buttons
        }
      }
    },
    handleStepButtonEvent({ key }) {
      if (key === 'next' && this.curActiveStep === this.stepNum - 1) {
        ActionUtils.warning(this.$t('business.platform.form.formrender.no-more'))
        return
      }
      if (key === 'prev' && this.curActiveStep === 0) {
        ActionUtils.warning(this.$t('business.platform.form.formrender.no-last-step'))
        return
      }
      this.stepLoading = true
      const curDate = new Date().getTime()
      let time = 0
      if (this.curTime + 1500 >= curDate) {
        time = 1000
      }
      this.curTime = curDate
      setTimeout(() => {
        if (key === 'next') {
          this.validate((valid) => {
            if (valid) {
              this.$emit('step-event', this.curActiveStep + 1, key)
            } else {
              this.formErrorToast()
            }
          })
        } else {
          this.$emit('step-event', this.curActiveStep - 1, key)
        }
        this.stepLoading = false
      }, time)
    }
  }
}
</script>
<style lang="scss" scoped>
  .ibps-pr-30{
    padding-right: 30px!important;
  }
  .ibps-form-toolbar{
    box-sizing: border-box;
    z-index: 2000;

    .ibps-form-toolbar__buttons{
      background-color: #FFFFFF;
      box-shadow: 0px 2px 6px rgb(60 60 60 / 12%);
      padding: 8px 20px;
      box-sizing: border-box;

      display: flex;
      justify-content: space-between;
    }
    .ibps-form-toolbar--dialog{
      background-color: #ffffff;
      border: 0;
    }
     .el-button+.el-button{
        margin-left: 5px;
    }
  }
    @media print {
    .hidden-print{
      padding: 0;
      margin:  0;
    }
  }

</style>