app-panel-field.vue 4.0 KB
Newer Older
1
<template>
2 3
  <div :class="curClassName" :style="curStyle">
    <div v-if="Object.is(labelPos, 'NONE') || !labelPos" class="editor">
4
      <div :class="{'check-error': !valueCheck}">
5
        <slot></slot>
6
        <span v-if="!valueCheck" class="error-info">{{ error }}</span>
7
      </div>
8
    </div>
9 10
    <div v-if="!Object.is(labelPos, 'NONE')" class="app-panel-field-label">
      <span v-if="required" style="color: red">* </span>
11
      <span v-if="showCaption">{{ caption }}</span>
12 13 14 15 16 17 18 19 20 21
    </div>
    <div
      v-if="
        Object.is(labelPos, 'BOTTOM') ||
        Object.is(labelPos, 'TOP') ||
        Object.is(labelPos, 'LEFT') ||
        Object.is(labelPos, 'RIGHT')
      "
      class="editor"
    >
22
      <div :class="{'check-error': !valueCheck}">
23
        <slot></slot>
24
        <span v-if="!valueCheck" class="error-info">{{ error }}</span>
25 26 27
      </div>
    </div>
  </div>
28 29 30 31 32 33 34 35 36 37 38 39
</template>
<script lang="ts">
import { Vue, Component, Prop, Watch } from "vue-property-decorator";

@Component({})
export default class AppPanelField extends Vue {
  /**
   * 名称
   *
   * @type {string}
   * @memberof AppPanelField
   */
40
  @Prop() public name!: string;
41 42

  /**
43
   * 标题
44 45 46 47
   *
   * @type {string}
   * @memberof AppPanelField
   */
48
  @Prop() public caption!: string;
49 50

  /**
51
   * 下标
52
   *
53
   * @type {string}
54 55
   * @memberof AppPanelField
   */
56
  @Prop({ default: 0 }) public index?: number;
57 58

  /**
59
   * 编辑器值
60
   *
61
   * @type {any}
62 63
   * @memberof AppPanelField
   */
64
  @Prop() public value!: any;
65 66

  /**
67
   * 布局模型详情
68
   *
69
   * @type {*}
70 71
   * @memberof AppPanelField
   */
72
  @Prop() public layoutModelDetails!: any;
73 74

  /**
75
   * 项名称
76 77 78
   *
   * @memberof AppPanelField
   */
79 80 81
  get itemName() {
    return this.index ? `${this.name}_${this.index}` : this.name;
  }
82 83

  /**
84
   * 显示标题
85 86 87
   *
   * @memberof AppPanelField
   */
88 89 90 91 92 93
  get showCaption() {
    const layoutModel = this.layoutModelDetails[this.itemName];
    if (layoutModel) {
      return layoutModel.isShowCaption;
    }
  }
94 95

  /**
96
   * 类名
97 98 99
   *
   * @memberof AppPanelField
   */
100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124
  get curClassName() {
    const layoutModel = this.layoutModelDetails[this.itemName];
    if (layoutModel) {
      let posClass = "";
      switch (layoutModel.labelPos) {
        case "TOP":
          posClass = "label-top";
          break;
        case "LEFT":
          posClass = "label-left";
          break;
        case "BOTTOM":
          posClass = "label-bottom";
          break;
        case "RIGHT":
          posClass = "label-right";
          break;
        case "NONE":
          posClass = "label-none";
          break;
      }
      return `app-panel-field ${posClass} ${this.itemName} ${layoutModel.sysCss}`;
    }
  }

125
  /**
126
   * 样式
127 128 129
   *
   * @memberof AppPanelField
   */
130 131 132 133 134 135
  get curStyle() {
    const layoutModel = this.layoutModelDetails[this.itemName];
    if (layoutModel) {
      return layoutModel.getElementStyle();
    }
  }
136 137

  /**
138
   * 标签位置
139 140 141
   *
   * @memberof AppPanelField
   */
142 143 144 145 146 147 148
  get labelPos() {
    const layoutModel = this.layoutModelDetails[this.itemName];
    if (layoutModel) {
      return layoutModel.labelPos || "LEFT";
    }
    return "LEFT";
  }
149 150

  /**
151
   * 必填
152 153 154
   *
   * @memberof AppPanelField
   */
155 156 157 158
  get required() {
    const layoutModel = this.layoutModelDetails[this.itemName];
    if (layoutModel) {
      return layoutModel.required;
159 160 161
    }
  }

162 163 164 165 166 167 168 169 170 171 172 173
  /**
   * 错误信息
   *
   * @memberof AppPanelField
   */
  get error() {
    const layoutModel = this.layoutModelDetails[this.itemName];
    if (layoutModel) {
      return layoutModel.error || `${this.caption} 值不能为空!`;
    }
  }

174
  /**
175
   * 值校验
176 177 178 179 180 181 182 183 184 185 186 187 188 189
   *
   * @type {boolean}
   * @memberof AppPanelField
   */
  public valueCheck: boolean = true;

  /**
   * 编辑器值监控
   *
   * @param {*} newVal
   * @param {*} oldVal
   * @memberof AppPanelField
   */
  @Watch("value")
190 191 192 193 194
  itemValueRules(newVal: any, oldVal: any) {
    if (this.required && !newVal) {
      this.valueCheck = false;
    } else {
      this.valueCheck = true;
195 196 197 198 199 200 201
    }
  }
}
</script>
<style lang='less'>
@import "./app-panel-field.less";
</style>