Skip to content
Snippets Groups Projects
Datepicker.vue 4.16 KiB
Newer Older
<template>
    <span>
        <input type="hidden" :name="name" :value="returnValue">
        <input type="text"
               ref="visibleInput"
               class="visible_input"
               v-bind="$attrs"
               v-on="$listeners"
               :placeholder="placeholder">
    </span>
</template>

<script>
import RestrictedDatesHelper from '../../assets/javascripts/lib/RestrictedDatesHelper';

export default {
    inheritAttrs: false,
    props: {
        name: {
            type: String,
            required: false
        },
        value: [Date, String, Number],
        mindate: [Date, Number, String],
        maxdate: [Date, Number, String],
        placeholder: String,
        disableHolidays: {
            type: Boolean,
            default: false,
        returnAs: {
            type: String,
            default: 'localized',
            validator(value) {
                return ['localized', 'unix', 'iso'].includes(value);
            }
        }
    },
    computed: {
        input() {
            return $(this.$refs.visibleInput);
        },
        parameters() {
            let params = {
                onSelect: () => {
                    this.setUnixTimestamp();
                },
                maxDate: this.convertInputToNativeDate(this.maxdate),
                minDate: this.convertInputToNativeDate(this.mindate),
            };
            if (this.disableHolidays) {
                params.beforeShowDay = (date) => {
                    RestrictedDatesHelper.loadRestrictedDatesByYear(date.getFullYear()).then(
                        () => this.input.datepicker('refresh'),
                        () => null
                    );

                    const {reason, lock} = RestrictedDatesHelper.isDateRestricted(date);
                    return [!lock, lock ? 'ui-datepicker-is-locked' : null, reason];
                };
            }

            return params;
        },
        returnValue() {
            if (this.returnAs === 'unix') {
                return this.convertInputToUnixTimestamp(this.value);
            }

            if (this.returnAs === 'iso') {
                return this.convertInputToNativeDate(this.value).toISOString();
            }

            return this.convertInputToNativeDate(this.value).toLocaleDateString(String.locale);
        }
    },
    methods: {
        convertInputToNativeDate(input) {
            if (input instanceof Date) {
                return input;
            }

            if (input === 'today') {
                return new Date();
            }

            return input ? new Date(input * 1000) : null;
        },
        convertInputToUnixTimestamp(input) {
            if (input instanceof Date) {
                return Math.floor(input.getTime() / 1000);
            }

            if (!isNaN(parseInt(input, 10))) {
                return parseInt(input, 10);
            }

            return input;
        },
        setUnixTimestamp () {
            let date = this.input.datepicker('getDate');
            this.$emit('input', this.emitDate ? date : Math.floor(date.getTime() / 1000));
        }
    },
    mounted () {
        let value = this.convertInputToUnixTimestamp(this.value);

        if (Number.isInteger(value)) {
            let date = new Date(value * 1000);
            this.input.val(date.toLocaleDateString());
        } else {
        this.input.datepicker(this.parameters);
    },
    watch: {
        maxdate(current) {
            this.input.datepicker(
                'option',
                'maxDate',
                this.convertInputToNativeDate(current)
            );
        mindate(current) {
            this.input.datepicker(
                'option',
                'minDate',
                this.convertInputToNativeDate(current)
            );
        },
        value(current, previous) {
            if (current.toISOString() !== previous.toISOString()) {
                this.input.datepicker('setDate', current);
                this.input.datepicker('refresh');
            }