Skip to content
Snippets Groups Projects
FeatureAttachmentForm.vue 5.33 KiB
<template>
  <div>
    <div class="ui teal segment">
      <h4>
        Pièce jointe
        <button
          @click="removeAttachmentFormset(form.dataKey)"
          class="ui small compact right floated icon button remove-formset"
          type="button"
        >
          <i class="ui times icon"></i>
        </button>
      </h4>
      <!-- {{ form.errors }} -->
      <div class="visible-fields">
        <div class="two fields">
          <div class="required field">
            <label :for="form.title.id_for_label">{{ form.title.label }}</label>
            <input
              type="text"
              required
              :maxlength="form.title.field.max_length"
              :name="form.title.html_name"
              :id="form.title.id_for_label"
              v-model="form.title.value"
              @change="updateStore"
            />
            <ul :id="form.title.id_for_error" class="errorlist">
              <li v-for="error in form.title.errors" :key="error">
                {{ error }}
              </li>
            </ul>
          </div>
          <div class="required field">
            <label>Fichier (PDF, PNG, JPEG)</label>
            <label
              class="ui icon button"
              :for="'attachment_file' + attachmentForm.dataKey"
            >
              <i class="file icon"></i>
              <span v-if="form.attachment_file.value" class="label">{{
                form.attachment_file.value
              }}</span>
              <span v-else class="label">Sélectionner un fichier ... </span>
            </label>
            <input
              @change="onFileChange"
              type="file"
              style="display: none"
              :name="form.attachment_file.html_name"
              :id="'attachment_file' + attachmentForm.dataKey"
            />
            <ul :id="form.attachment_file.id_for_error" class="errorlist">
              <li v-for="error in form.attachment_file.errors" :key="error">
                {{ error }}
              </li>
            </ul>
          </div>
        </div>
        <div class="field">
          <label for="form.info.id_for_label">{{ form.info.label }}</label>
          <textarea
            name="form.info.html_name"
            rows="5"
            v-model="form.info.value"
            @change="updateStore"
          ></textarea>
          <!-- {{ form.info.errors }} -->
        </div>
      </div>
    </div>
  </div>
</template>

<script>
export default {
  name: "FeatureAttachmentFormset",

  props: ["attachmentForm"],

  data() {
    return {
      fileToImport: null,
      form: {
        title: {
          errors: [],
          id_for_error: `errorlist-title-${this.attachmentForm.dataKey}`,
          id_for_label: "titre",
          field: {
            max_length: 30, // todo : vérifier dans django
          },
          html_name: "titre",
          label: "Titre",
          value: "",
        },
        attachment_file: {
          errors: [],
          id_for_error: `errorlist-file-${this.attachmentForm.dataKey}`,
          html_name: "titre",
          label: "Titre",
          value: null,
        },
        info: {
          value: "",
          errors: null,
          label: "Info",
        },
      },
    };
  },

  watch: {
    attachmentForm(newValue) {
      this.initForm(newValue);
    },
  },

  methods: {
    initForm(attachmentForm) {
      for (let el in attachmentForm) {
        if (el && this.form[el]) {
          if (el === "attachment_file" && attachmentForm[el]) {
            this.form[el].value = attachmentForm[el].split("/").pop(); //* keep only the file name, not the path
          } else {
            this.form[el].value = attachmentForm[el];
          }
        }
      }
    },

    removeAttachmentFormset() {
      this.$store.commit(
        "feature/REMOVE_ATTACHMENT_FORM",
        this.attachmentForm.dataKey
      );
    },

    updateStore() {
      this.$store.commit("feature/UPDATE_ATTACHMENT_FORM", {
        dataKey: this.attachmentForm.dataKey,
        title: this.form.title.value,
        attachment_file: this.form.attachment_file.value,
        info: this.form.info.value,
        fileToImport: this.fileToImport,
      });
    },

    onFileChange(e) {
      const files = e.target.files || e.dataTransfer.files;
      if (!files.length) return;
      this.fileToImport = files[0]; //* store file to import
      this.form.attachment_file.value = files[0].name; //* add name to the form for display, in order to match format return from API
      this.updateStore();
    },

    checkForm() {
      let isValid = true;
      if (this.form.title.value === "") {
        this.form.title.errors = ["Veuillez compléter ce champ."];
        document
          .getElementById(this.form.title.id_for_error)
          .scrollIntoView({ block: "start", inline: "nearest" });
        isValid = false;
      } else if (this.form.attachment_file.value === null) {
        this.form.attachment_file.errors = ["Veuillez compléter ce champ."];
        this.form.title.errors = [];
        document
          .getElementById(this.form.attachment_file.id_for_error)
          .scrollIntoView({ block: "start", inline: "nearest" });
        isValid = false;
      } else {
        this.form.title.errors = [];
        this.form.attachment_file.errors = [];
      }
      return isValid;
    },
  },

  mounted() {
    this.initForm(this.attachmentForm);
  },
};
</script>