MovieCommentForm.vue 2.96 KB
<script lang="ts" setup>
import { useVuelidate } from "@vuelidate/core";
import { helpers, maxLength, minLength, required, minValue, maxValue } from "@vuelidate/validators";

// type FormData = {
//   username: string
//   message: string
//   rating: number
// };

type FormData = { [key: string]: string|number };

//#region --Data/ref--.
const initialState = {
  username: "",
  message: "",
  rating: 5,
};

// Validation rules
const rules = {
  username: {
    required: helpers.withMessage("Le nom d'utilisateur est requis", required),
    minLength: helpers.withMessage("Le nom d'utilisateur doit contenir au moins 3 caractères", minLength(3)),
    maxLength: helpers.withMessage("Le nom d'utilisateur ne peut pas dépasser 50 caractères", maxLength(50)),
    alpha: helpers.withMessage(
      "Le nom d'utilisateur ne peut contenir que des lettres",
      helpers.regex(/^[a-zA-ZÀ-ÿ\s]+$/),
    ),
  },
  message: {
    required: helpers.withMessage("Le message est requis", required),
    minLength: helpers.withMessage("Le message doit contenir au moins 3 caractères", minLength(3)),
    maxLength: helpers.withMessage("Le message ne peut pas dépasser 500 caractères", maxLength(500)),
  },
  rating:{
    required: helpers.withMessage("La notation est requise", required),
    minValue: helpers.withMessage("Le message ne être inférieure à 0", minValue(0)),
    maxValue: helpers.withMessage("Le message ne être suppérieur à 10", maxValue(10)),
  }
};

const formData = reactive({
  ...initialState,
});
const v$ = useVuelidate(rules, formData);
//#endregion

function submitComment() {
  console.log("Submit !")
}

function clear () {
  v$.value.$reset();
  formData.username = initialState.username;
  formData.message = initialState.message;
  formData.rating = initialState.rating;
}

// :error-messages="getErrors('username', $v.username)" :counter="10" label="username"
// :error-messages="getErrors('message', $v.message)"
</script>

<template>
  <section>
    movie comment form
    <VForm @submit.prevent="submitComment">
      <v-text-field
        v-model="formData.username"
        :error-messages="v$.username.$errors.map(e => e.$message)"
        label="nom d'utilisateur"
        placeholder="nom d'utilisateur"
        required
        @blur="v$.username.$touch()"
        @input="v$.username.$touch()"
      />
      <v-textarea
        v-model="formData.message"
        :error-messages="v$.message.$errors.map(e => e.$message)"
        label="message"
        placeholder="Saisissez votre commentaire"
        required
        @blur="v$.message.$touch"
        @input="v$.message.$touch"
      />
      <v-text-field
        v-model="formData.rating"
        :error-messages="v$.rating.$errors.map(e => e.$message)"
        label="Note (1-10)"
        placeholder=""
        required
        type="number"
        @blur="v$.rating.$touch"
        @input="v$.rating.$touch"
      />
      <v-btn class="mr-4">submit</v-btn>
    </VForm>
  </section>
</template>

<style scoped></style>