YannickIngenierie
YannickIngenierie

Reputation: 622

How do a date range validation with vue/Quasar

I try to create a date range with controls in a compoment

Vue.component('FraisHebergement', {
template: '<div class="q-pt-xs">
            <div class="q-pt-xs row">\
            <template>\
                    <q-input filled v-model="model.date" :rules="ConfirmDateRange" label="Date début" class="td25pc q-pr-xs" ref="dtedeb">\
                        <template v-slot:append>\
                            <q-icon name="event" class="cursor-pointer">\
                                <q-popup-proxy ref="qDateProxy" transition-show="scale" transition-hide="scale">\
                                    <q-date v-model="model.date" mask="DD/MM/YYYY" @input="() => $refs.qDateProxy.hide()" :locale="myLocale"/>\
                                </q-popup-proxy>\
                            </q-icon>\
                        </template>\
                    </q-input >\
                </template ><template>\
                    <q-input filled v-model="model.dateFin" :rules="ConfirmDateRange" label="Date Fin" class="td25pc" ref="dtefin">\
                        <template v-slot:append>\
                            <q-icon name="event" class="cursor-pointer">\
                                <q-popup-proxy ref="qDateProxyf" transition-show="scale" transition-hide="scale">\
                                    <q-date v-model="model.dateFin" mask="DD/MM/YYYY" @input="() => $refs.qDateProxyf.hide()" :locale="myLocale"/>\
                                </q-popup-proxy>\
                            </q-icon>\
                        </template>\
                    </q-input >\
                </template>\
                <q-input input-class="text-right" filled ></q-input >\</div>\
             <q-btn class="q-mt-sm" label="Reset Validation" @click="reset" color="primary"/><div class="row q-pt-xs">   \

        </div></div>',
computed: {
    ConfirmDateRange() {
        return [
            (v) => !!v || "Saisissez quelque chose :-)",
            (v) => regex.test(v) || "Format de date à utiliser: JJ/MM/AAAA",
            (v) => this.model.dateFin > this.model.date || "Date incohérente"
        ]
    }
},
 data: function () {
    return {
        model: {
           date: Quasar.utils.date.formatDate(Date.now(), 'DD/MM/YYYY'), dateFin: ''
        },
        myLocale: {
            days: 'Dimanche_Lundi_Mardi_Mercredi_Jeudi_Vendredi_Samedi'.split('_'),
            daysShort: 'Dim_Lun_Mar_Mer_Jeu_Ven_Sam'.split('_'),
            months: 'Janvier_Fevrier_Mars_Avril_Mai_Juin_Juillet_Aout_Septembre_Octobre_Novembre_Decembre'.split('_'),
            monthsShort: 'Janv_Fevr_Mars_Avr_Mai_Juin_Juil_Aout_Sept_Oct_Nov_Dec'.split('_'),
            firstDayOfWeek: 1
        },
        natures: [],
    }
},
methods: {
    reset() {
        this.$refs.dtedeb.resetValidation(); this.$refs.dtefin.resetValidation()
    }
}
});

All controls are ok, but I want use resetValidation function of q-input to reset errors on 2 dates and after apply rules. Cause I put startdate bigger than enddate : error appear on startdate. But If I change enddate, my old error stay on startdate. I put a button to reset... but I would like an automatical system Thanks for your help

Upvotes: 1

Views: 6247

Answers (3)

Alexis Gatuingt
Alexis Gatuingt

Reputation: 547

I think that by using watch properties, your problem can be solved

watch: {
   model: {
      handler() {
         this.reset();
      },
      deep: true,
   }
}

I do not know if it's ok, can be adapted according to your data

deep: true allows you to inherit from the method on other properties of your object

https://v2.vuejs.org/v2/guide/computed.html#Watchers

see you

edit 11/12

here is an example of watch properties

https://jsfiddle.net/alexisgt01/nhatL8cv/15/

Upvotes: 1

insign
insign

Reputation: 5803

Currently, there is a big issue open, for now I recommend use vcalendar.io

Upvotes: 0

YannickIngenierie
YannickIngenierie

Reputation: 622

Thanks, I didn't understand watch clearly. I just begin with Vue. I find another and simplier way. Use the rule. resetValidation is a function return void then I just call it in first like that

 ConfirmDateRange() {
        return [
            (v) => (this.$refs.dtedeb.resetValidation()|| this.$refs.dtefin.resetValidation() || !!v) || "Saisissez quelque chose :-)",
            (v) => regex.test(v) || "Format de date à utiliser: JJ/MM/AAAA",
            (v) => this.model.dateFin > this.model.date || "Date incohérente"
        ]
    }

It's ok now Hope that can help others :-)

Upvotes: 1

Related Questions