Newer
Older
Sébastien DA ROCHA
committed
<template>
<div>
<div class="ui teal segment">
<h4>
Pièce jointe
<button
class="ui small compact right floated icon button remove-formset"
type="button"
@click="removeAttachmentFormset(form.dataKey)"
Sébastien DA ROCHA
committed
>
Sébastien DA ROCHA
committed
</button>
</h4>
<!-- {{ form.errors }} -->
Sébastien DA ROCHA
committed
<div class="visible-fields">
<div class="two fields">
<div class="required field">
<label :for="form.title.id_for_label">{{ form.title.label }}</label>
<input
:id="form.title.id_for_label"
v-model="form.title.value"
Sébastien DA ROCHA
committed
type="text"
required
:maxlength="form.title.field.max_length"
:name="form.title.html_name"
>
<ul
:id="form.title.id_for_error"
class="errorlist"
>
<li
v-for="error in form.title.errors"
:key="error"
>
{{ error }}
</li>
</ul>
Sébastien DA ROCHA
committed
</div>
<div class="required field">
<label>Fichier (PDF, PNG, JPEG)</label>
<label
class="ui icon button"
:for="'attachment_file' + attachmentForm.dataKey"
>
<span
v-if="form.attachment_file.value"
class="label"
>{{
Sébastien DA ROCHA
committed
form.attachment_file.value
}}</span>
<span
v-else
class="label"
>Sélectionner un fichier ... </span>
Sébastien DA ROCHA
committed
</label>
<input
:id="'attachment_file' + attachmentForm.dataKey"
Sébastien DA ROCHA
committed
type="file"
accept="application/pdf, image/jpeg, image/png"
Sébastien DA ROCHA
committed
style="display: none"
:name="form.attachment_file.html_name"
@change="onFileChange"
>
<ul
:id="form.attachment_file.id_for_error"
class="errorlist"
>
<li
v-for="error in form.attachment_file.errors"
:key="error"
>
{{ error }}
</li>
</ul>
Sébastien DA ROCHA
committed
</div>
</div>
<div class="field">
<label for="form.info.id_for_label">{{ form.info.label }}</label>
<textarea
Sébastien DA ROCHA
committed
name="form.info.html_name"
rows="5"
<!-- {{ form.info.errors }} -->
Sébastien DA ROCHA
committed
</div>
</div>
</div>
</div>
</template>
<script>
export default {
Sébastien DA ROCHA
committed
props: {
attachmentForm: {
type: Object,
default: null,
}
},
Sébastien DA ROCHA
committed
data() {
return {
Sébastien DA ROCHA
committed
form: {
Sébastien DA ROCHA
committed
title: {
errors: [],
id_for_error: `errorlist-title-${this.attachmentForm.dataKey}`,
Sébastien DA ROCHA
committed
field: {
max_length: 30, // todo : vérifier dans django
},
html_name: 'titre',
label: 'Titre',
value: '',
Sébastien DA ROCHA
committed
},
attachment_file: {
errors: [],
id_for_error: `errorlist-file-${this.attachmentForm.dataKey}`,
Sébastien DA ROCHA
committed
},
info: {
Sébastien DA ROCHA
committed
errors: null,
Sébastien DA ROCHA
committed
},
},
};
},
watch: {
attachmentForm(newValue) {
this.initForm(newValue);
},
//* utilisation de watcher, car @change aurait un délai
'form.title.value': function (newValue, oldValue) {
if (oldValue !== '') {
if (newValue !== oldValue) {
this.updateStore();
}
}
},
'form.info.value': function (newValue, oldValue) {
if (oldValue !== '') {
if (newValue !== oldValue) {
this.updateStore();
}
}
},
mounted() {
this.initForm(this.attachmentForm);
},
Sébastien DA ROCHA
committed
methods: {
initForm(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];
}
}
}
},
Sébastien DA ROCHA
committed
this.$store.commit(
Sébastien DA ROCHA
committed
this.attachmentForm.dataKey
);
this.$store.commit('feature/ADD_ATTACHMENT_TO_DELETE', this.form.id.value);
Sébastien DA ROCHA
committed
},
Sébastien DA ROCHA
committed
updateStore() {
const data = {
id: this.form.id.value,
Sébastien DA ROCHA
committed
dataKey: this.attachmentForm.dataKey,
title: this.form.title.value,
attachment_file: this.form.attachment_file.value,
info: this.form.info.value,
this.$store.commit('feature/UPDATE_ATTACHMENT_FORM', data);
Sébastien DA ROCHA
committed
},
const url = window.URL || window.webkitURL;
const image = new Image();
image.onload = function () {
handleFile(true);
};
image.onerror = function () {
handleFile(false);
};
image.src = url.createObjectURL(files);
},
const files = e.target.files || e.dataTransfer.files;
const _this = this; //* 'this' is different in onload function
function handleFile(isValid) {
if (isValid) {
_this.fileToImport = files[0]; //* store the file to post later
_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();
_this.form.attachment_file.errors = [];
} else {
_this.form.attachment_file.errors.push(
"Transférez une image valide. Le fichier que vous avez transféré n'est pas une image, ou il est corrompu."
);
}
}
if (files.length) {
//* exception for pdf
if (files[0].type === 'application/pdf') {
handleFile(true);
} else {
this.form.attachment_file.errors = [];
//* check if file is an image and pass callback to handle file
this.validateImgFile(files[0], handleFile);
}
}
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;
},
Sébastien DA ROCHA
committed
},
};