app-form-item.vue 6.4 KB
Newer Older
1
<template>
2
    <div :class="classes">
neko's avatar
neko committed
3 4
        <template v-if="this.uiStyle === 'STYLE2'">
            <app-form-item2
5 6 7 8 9 10 11 12 13 14 15 16
                :caption="caption"
                :labelStyle="labelStyle"
                :error="error"
                :labelPos="labelPos"
                :labelWidth="labelWidth"
                :isShowCaption="isShowCaption"
                :isEmptyCaption="isEmptyCaption"
                :name="name"
                :uiStyle="uiStyle"
                :itemRules="itemRules">
                <slot></slot>
            </app-form-item2>
neko's avatar
neko committed
17 18
        </template>
        <template v-if="this.uiStyle !== 'STYLE2'">
19 20 21 22 23
            <div
                v-if="Object.is(this.labelPos,'BOTTOM') || Object.is(this.labelPos,'NONE') || !this.labelPos"
                class="editor"
                :style="slotstyle"
            >
RedPig97's avatar
RedPig97 committed
24
                <form-item :prop="name" :error="error"  :rules="itemRules">
25
                    <slot></slot>
26 27 28 29 30 31 32 33
                </form-item>
            </div>
            <span
                v-if="!Object.is(this.labelPos,'NONE') && this.isShowCaption && this.labelWidth > 0"
                :style="labelstyle"
                :class="labelclasses"
            >
                <span v-if="required" style="color:red;">* </span>
34 35 36 37 38 39 40 41 42 43 44
                    <span v-if="!isEmptyCaption">
                        <el-tooltip v-if="isShowTip" placement="top" effect="light">
                            <span v-html="caption"></span>
                            <template >
                                <span slot="content" v-html="caption" ></span>
                            </template>
                        </el-tooltip>
                        <template v-if="!isShowTip">
                            <span v-html="caption" ></span>
                        </template>
                    </span>
45 46 47 48 49 50
            </span>
            <div
                v-if="Object.is(this.labelPos,'TOP') || Object.is(this.labelPos,'LEFT') || Object.is(this.labelPos,'RIGHT')"
                class="editor"
                :style="slotstyle"
            >
RedPig97's avatar
RedPig97 committed
51
                <form-item :prop="name" :error="error"  :rules="itemRules">
52
                    <slot></slot>
53 54
                </form-item>
            </div>
neko's avatar
neko committed
55
        </template>
56 57 58
    </div>
</template>
<script lang="ts">
neko's avatar
neko committed
59
import { Vue, Component, Prop, Watch } from "vue-property-decorator";
60 61 62

@Component({})
export default class AppFormItem extends Vue {
neko's avatar
neko committed
63 64 65 66 67 68 69
  /**
   * 名称
   *
   * @type {string}
   * @memberof AppFormItem
   */
  @Prop() public caption!: string;
70

neko's avatar
neko committed
71 72 73 74 75 76 77
  /**
   * 错误信息
   *
   * @type {string}
   * @memberof AppFormItem
   */
  @Prop() public error?: string;
78

neko's avatar
neko committed
79 80 81 82 83 84 85
  /**
   * label样式
   *
   * @type {string}
   * @memberof AppFormItem
   */
  @Prop() public labelStyle?: string;
86

neko's avatar
neko committed
87 88 89 90 91 92 93 94 95 96 97 98 99
  /**
   * 标签位置
   *
   * @type {(string | 'BOTTOM' | 'LEFT' | 'NONE' | 'RIGHT' | 'TOP')}
   * @memberof AppFormItem
   */
  @Prop() public labelPos?:
    | string
    | "BOTTOM"
    | "LEFT"
    | "NONE"
    | "RIGHT"
    | "TOP";
100

neko's avatar
neko committed
101 102 103 104 105 106 107
  /**
   * 标签宽度
   *
   * @type {number}
   * @memberof AppFormItem
   */
  @Prop({}) public labelWidth!: number;
108

neko's avatar
neko committed
109 110 111 112 113 114 115
  /**
   * 是否显示标题
   *
   * @type {boolean}
   * @memberof AppFormItem
   */
  @Prop() public isShowCaption?: boolean;
116

neko's avatar
neko committed
117 118 119 120 121 122 123
  /**
   * 标签是否空白
   *
   * @type {boolean}
   * @memberof AppFormItem
   */
  @Prop() public isEmptyCaption?: boolean;
124

neko's avatar
neko committed
125 126 127 128 129 130 131
  /**
   * 表单项名称
   *
   * @type {string}
   * @memberof AppFormItem
   */
  @Prop() public name!: string;
132

neko's avatar
neko committed
133 134 135 136 137 138 139
  /**
   * 内置样式
   *
   * @type {string}
   * @memberof AppFormItem
   */
  @Prop() public uiStyle?: string;
140

neko's avatar
neko committed
141 142 143 144 145 146 147
  /**
   * 表单项值规则
   *
   * @type {string}
   * @memberof AppFormItem
   */
  @Prop() public itemRules!: any;
148

149 150 151 152 153 154 155 156

  /**
  * 是否显示表单项Label提示
  *
  * @memberof AppFormItem
  */
  public isShowTip:boolean = false;

neko's avatar
neko committed
157 158 159 160 161 162 163
  /**
   * 是否必填
   *
   * @type {boolean}
   * @memberof AppFormItem
   */
  public required: boolean = false;
164

neko's avatar
neko committed
165 166 167 168 169 170 171 172 173 174 175
  /**
   * 表单项值规则监控
   *
   * @param {*} newVal
   * @param {*} oldVal
   * @memberof AppFormItem
   */
  @Watch("itemRules", { deep: true })
  onItemRulesChange(newVal: any, oldVal: any) {
    if (newVal) {
      try {
RedPig97's avatar
RedPig97 committed
176
        this.itemRules.some((rule: any) => {
neko's avatar
neko committed
177 178 179 180 181 182 183
          if (rule.hasOwnProperty("required")) {
            this.required = rule.required;
            return true;
          }
          return false;
        });
      } catch (error) {}
184
    }
neko's avatar
neko committed
185
  }
186

neko's avatar
neko committed
187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211
  /**
   * 计算样式
   *
   * @readonly
   * @type {string []}
   * @memberof AppFormItem
   */
  get classes(): string[] {
    let posClass = "";
    switch (this.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;
212
    }
neko's avatar
neko committed
213 214
    return [ "app-form-item", posClass ];
  }
215

neko's avatar
neko committed
216 217 218 219 220 221 222 223 224 225 226 227
  /**
   * label样式
   *
   * @readonly
   * @type {string}
   * @memberof AppFormItem
   */
  get labelclasses(): string {
    return this.labelStyle
      ? this.labelStyle + " app-form-item-label"
      : "app-form-item-label";
  }
228

neko's avatar
neko committed
229 230 231 232 233 234 235 236 237 238
  /**
   * label行内样式
   *
   * @readonly
   * @type {string}
   * @memberof AppFormItem
   */
  get labelstyle(): any {
    if (Object.is(this.labelPos, 'LEFT') || Object.is(this.labelPos, 'RIGHT')) {
      return { width: this.labelWidth + "px" };
239
    }
neko's avatar
neko committed
240
  }
241

neko's avatar
neko committed
242 243 244 245 246 247 248 249 250 251 252 253
  /**
   * slot行内样式
   *
   * @readonly
   * @type {string}
   * @memberof AppFormItem
   */
  get slotstyle(): any {
    if (Object.is(this.labelPos, "LEFT")) {
      return { marginLeft: this.labelWidth + "px" };
    } else if (Object.is(this.labelPos, "RIGHT")) {
      return { marginRight: this.labelWidth + "px" };
254
    }
neko's avatar
neko committed
255
  }
256

neko's avatar
neko committed
257 258 259 260 261 262 263 264
  /**
   * vue 生命周期
   *
   * @memberof AppFormItem
   */
  public mounted() {
    if (this.itemRules) {
      try {
RedPig97's avatar
RedPig97 committed
265
        this.itemRules.some((rule: any) => {
neko's avatar
neko committed
266 267 268 269 270 271 272
          if (rule.hasOwnProperty("required")) {
            this.required = rule.required;
            return true;
          }
          return false;
        });
      } catch (error) {}
273
    }
274
    this.getShowTip();
neko's avatar
neko committed
275
  }
276 277 278 279 280 281 282 283 284 285 286 287 288


  /**
  * 计算是否显示表单项Label提示
  *
  * @memberof AppFormItem
  */
  public getShowTip(){
      if(this.caption && ((this.caption.length)*14) > this.labelWidth ){
          this.isShowTip = true;
      }
  } 

289 290 291
}
</script>
<style lang='less'>
neko's avatar
neko committed
292
@import "./app-form-item.less";
293
</style>