app-date-range-picker.vue 5.0 KB
<template>
    <div class="app-date-range-picker">
        <el-time-picker
            v-if="Object.is(type, 'timerange')"
            v-model="curValue"
            is-range
            :size="size"
            popper-class="app-date-range-picker-popper"
            :format="format"
            :value-format="valueFormat"
            :disabled="disabled"
            :readonly="readonly"
            :range-separator="$t('components.appdaterangepicker.separator')"
            :start-placeholder="startPlaceholder || $t('components.appdaterangepicker.start')"
            :end-placeholder="endPlaceholder || $t('components.appdaterangepicker.end')"
            @focus="handleFocus"
            @blur="handleBlur"
        >
        </el-time-picker>
        <el-date-picker
            v-else
            v-model="curValue"
            :type="type"
            :size="size"
            popper-class="app-date-range-picker-popper"
            :format="format"
            :value-format="valueFormat"
            :disabled="disabled"
            :readonly="readonly"
            :unlink-panels="unlinkPanels"
            :range-separator="$t('components.appdaterangepicker.separator')"
            :start-placeholder="startPlaceholder || $t('components.appdaterangepicker.start')"
            :end-placeholder="endPlaceholder || $t('components.appdaterangepicker.end')"
            @focus="handleFocus"
            @blur="handleBlur"
        >
        </el-date-picker>
    </div>
</template>

<script lang="ts">
import { Component, Vue, Prop, Model } from 'vue-property-decorator';

@Component({})
export default class AppDateRangePicker extends Vue {
    /**
     * 双向绑定表单项值
     *
     * @type {*}
     * @memberof AppDateRangePicker
     */

    @Model('change') public value: any;

    /**
     * 编辑项名称
     *
     * @type {string}
     * @memberof AppRangDate
     */
    @Prop() public name!: string;

    /**
     * 表单数据
     *
     * @type {*}
     * @memberof AppRangDate
     */
    @Prop() public data: any;

    /**
     * 是否禁用
     *
     * @type {boolean}
     * @memberof AppRangDate
     */
    @Prop({ default: false }) public disabled!: boolean;

    /**
     * 只读
     *
     * @type {boolean}
     * @memberof AppRangDate
     */
    @Prop({ default: false }) public readonly?: boolean;

    /**
     * 类型
     *
     * @type {string}
     * @memberof AppRangDate
     */
    @Prop({ default: 'daterange' }) public type!: string;

    /**
     * 显示格式化
     *
     * @type {string}
     * @memberof AppRangDate
     */
    @Prop() public format?: string;

    /**
     * 值格式化
     *
     * @type {string}
     * @memberof AppRangDate
     */
    @Prop() public valueFormat?: string;

    /**
     * 开始占位提示
     *
     * @type {string}
     * @memberof AppRangDate
     */
    @Prop() public startPlaceholder?: string;

    /**
     * 结束占位提示
     *
     * @type {string}
     * @memberof AppRangDate
     */
    @Prop() public endPlaceholder?: string;

    /**
     * 大小
     *
     * @type {string}
     * @memberof AppRangDate
     */
    @Prop({default: 'small'}) public size?: 'large' | 'small' | 'mini';

    /**
     * 关系表单项集合
     *
     * @type {string}
     * @memberof AppRangDate
     */
    @Prop() public valueItemNames?: string;

    /**
     * 取消范围联动
     *
     * @type {boolean}
     * @memberof AppRangDate
     */
    @Prop({ default: false }) public unlinkPanels!: boolean;

    /**
     * 值分割符
     *
     * @type {boolean}
     * @memberof AppRangDate
     */
    @Prop({ default: ',' }) public valueSeparator!: string;

    /**
     * 输入框失焦
     * @param e
     */
    public handleBlur(e: any): void {
        this.$emit('blur', this.value);
    }

    /**
     * 输入框聚焦
     * @param e
     */
    public handleFocus(e: any): void {
        this.$emit('focus', this.value);
    }

    get curValue() {
        let value: any[] = [];
        if (this.valueItemNames) {
            this.valueItemNames.split(',').forEach((name: any) => {
                if (this.data[name]) {
                    value.push(this.data[name]);
                }
            });
        } else if (this.value) {
            value = this.value.split(this.valueSeparator);
        }
        return value;
    }

    set curValue(dates: string[]) {
        if (dates) {
            this.$emit('change', dates.join(this.valueSeparator));
            if (this.valueItemNames) {
                const valueItemNames: string[] = this.valueItemNames.split(',');
                dates.forEach((value: any, index: number) => {
                    this.$emit('itemChange', { name: valueItemNames[index], value: value });
                });
            }
        } else {
            this.$emit('change', null);
            if (this.valueItemNames) {
                this.valueItemNames.split(',').forEach((name: any) => {
                    this.$emit('itemChange', { name: name, value: null });
                });
            }
        }
    }
}
</script>