Newer
Older
Sébastien DA ROCHA
committed
<template>
<div v-if="field && field.field_type === 'char'">
v-if="displayLabels"
>
{{ field.label }}
</label>
Sébastien DA ROCHA
committed
<input
:id="field.name"
:value="field.value"
Sébastien DA ROCHA
committed
@blur="updateStore_extra_form"
<ul
v-if="field.is_mandatory && error"
:id="`errorlist-extra-form-${field.name}`"
class="errorlist"
>
<li>
{{ error }}
</li>
</ul>
Sébastien DA ROCHA
committed
</div>
<div v-else-if="field && field.field_type === 'list'">
v-if="displayLabels"
>
{{ field.label }}
</label>
Sébastien DA ROCHA
committed
<Dropdown
:options="field.options"
:selected="selected_extra_form_list"
:selection.sync="selected_extra_form_list"
:search="true"
Sébastien DA ROCHA
committed
/>
<ul
v-if="field.is_mandatory && error"
:id="`errorlist-extra-form-${field.name}`"
class="errorlist"
>
<li>
{{ error }}
</li>
</ul>
Sébastien DA ROCHA
committed
</div>
<div v-else-if="field && field.field_type === 'pre_recorded_list'">
<label
v-if="displayLabels"
:for="field.name"
:class="{ required: field.is_mandatory }"
>
{{ field.label }}
</label>
<Multiselect
v-model="selectedPrerecordedValue"
:options="
selectedPrerecordedListValues[field.options[0]] ? selectedPrerecordedListValues[field.options[0]] : []
"
:options-limit="10"
:allow-empty="!field.is_mandatory"
track-by="label"
label="label"
:reset-after="false"
select-label=""
selected-label=""
deselect-label=""
:searchable="true"
:placeholder="'Recherchez une valeur de la liste pré-définie ...'"
:show-no-results="true"
:loading="loadingPrerecordedListValues"
:clear-on-select="false"
:preserve-search="false"
@select="selectPrerecordedValue"
>
<template slot="clear">
<div
v-if="selectedPrerecordedValue"
class="multiselect__clear"
>
<i
class="close icon"
aria-hidden="true"
/>
</div>
</template>
<span slot="noResult">
Aucun résultat.
</span>
<span slot="noOptions">
Saisissez les premiers caractères ...
</span>
</Multiselect>
<ul
v-if="field.is_mandatory && error"
:id="`errorlist-extra-form-${field.name}`"
class="errorlist"
>
<li>
{{ error }}
</li>
</ul>
</div>
<div v-else-if="field && field.field_type === 'multi_choices_list'">
<label
v-if="displayLabels"
:for="field.name"
:class="{ required: field.is_mandatory }"
>
{{ field.label }}
</label>
<div class="checkbox_list">
<div
v-for="option in field.options"
:key="option"
class="ui checkbox"
<input
:id="option"
type="checkbox"
:checked="field.value && field.value.includes(option)"
:name="option"
@change="selectMultipleCheckbox"
>
<label :for="option">
{{ option }}
</label>
</div>
</div>
<ul
v-if="field.is_mandatory && error"
:id="`errorlist-extra-form-${field.name}`"
class="errorlist"
>
<li>
{{ error }}
</li>
</ul>
</div>
<div v-else-if="field && field.field_type === 'integer'">
v-if="displayLabels"
:for="field.name"
>
{{ field.label }}
</label>
Sébastien DA ROCHA
committed
<div class="ui input">
<!-- //* si click sur fléche dans champ input, pas de focus, donc pas de blur, donc utilisation de @change -->
Sébastien DA ROCHA
committed
<input
:id="field.name"
:value="field.value"
Sébastien DA ROCHA
committed
@change="updateStore_extra_form"
Sébastien DA ROCHA
committed
</div>
<ul
v-if="field.is_mandatory && error"
:id="`errorlist-extra-form-${field.name}`"
class="errorlist"
>
<li>
{{ error }}
</li>
</ul>
Sébastien DA ROCHA
committed
</div>
<div v-else-if="field && field.field_type === 'boolean'">
Sébastien DA ROCHA
committed
<div class="ui checkbox">
<input
Sébastien DA ROCHA
committed
type="checkbox"
:checked="field.value"
:name="field.name"
@change="updateStore_extra_form"
<label :for="field.name">
{{ displayLabels ? field.label : '' }}
Sébastien DA ROCHA
committed
</div>
</div>
<div v-else-if="field && field.field_type === 'date'">
v-if="displayLabels"
:for="field.name"
>
{{ field.label }}
</label>
Sébastien DA ROCHA
committed
<input
:id="field.name"
:value="field.value"
@change="updateStore_extra_form"
<ul
v-if="field.is_mandatory && error"
:id="`errorlist-extra-form-${field.name}`"
class="errorlist"
>
<li>
{{ error }}
</li>
</ul>
Sébastien DA ROCHA
committed
</div>
<div v-else-if="field && field.field_type === 'decimal'">
v-if="displayLabels"
:for="field.name"
>
{{ field.label }}
</label>
Sébastien DA ROCHA
committed
<div class="ui input">
<input
:value="field.value"
Sébastien DA ROCHA
committed
type="number"
step=".01"
:name="field.name"
Sébastien DA ROCHA
committed
@change="updateStore_extra_form"
Sébastien DA ROCHA
committed
</div>
<ul
v-if="field.is_mandatory && error"
:id="`errorlist-extra-form-${field.name}`"
class="errorlist"
>
<li>
{{ error }}
</li>
</ul>
Sébastien DA ROCHA
committed
</div>
<div v-else-if="field && field.field_type === 'text'">
v-if="displayLabels"
:for="field.name"
>
{{ field.label }}
</label>
Sébastien DA ROCHA
committed
<textarea
:value="field.value"
Sébastien DA ROCHA
committed
:name="field.name"
Sébastien DA ROCHA
committed
rows="3"
@blur="updateStore_extra_form"
<ul
v-if="field.is_mandatory && error"
:id="`errorlist-extra-form-${field.name}`"
class="errorlist"
>
<li>
{{ error }}
</li>
</ul>
Sébastien DA ROCHA
committed
</div>
</template>
<script>
import { mapState, mapActions, mapMutations } from 'vuex';
import Multiselect from 'vue-multiselect';
import Dropdown from '@/components/Dropdown.vue';
import { isXtraFormActive } from'@/utils';
Sébastien DA ROCHA
committed
export default {
Sébastien DA ROCHA
committed
components: {
Dropdown,
Sébastien DA ROCHA
committed
},
props: {
field: {
type: Object,
default: null,
},
isConditionalField: {
type: Boolean,
default: false,
Sébastien DA ROCHA
committed
prerecordedListSearchQuery: null,
loadingPrerecordedListValues: false,
selectedPrerecordedValue: null,
selectedMultipleCheckbox: [],
Sébastien DA ROCHA
committed
computed: {
...mapState('feature-type', [
'selectedPrerecordedListValues'
]),
...mapState('feature', [
'extra_forms',
]),
Sébastien DA ROCHA
committed
selected_extra_form_list: {
get() {
Sébastien DA ROCHA
committed
},
set(newValue) {
//* set the value selected in the dropdown
if (this.isConditionalField) {
this.$emit('update:condition-value', newValue);
} else {
const newExtraForm = this.field;
newExtraForm['value'] = newValue;
this.$store.commit('feature/UPDATE_EXTRA_FORM', newExtraForm);
}
Sébastien DA ROCHA
committed
},
},
displayLabels() {
return this.$route.name === 'editer-signalement' || this.$route.name === 'ajouter-signalement' || this.$route.name === 'editer-attribut-signalement';
Sébastien DA ROCHA
committed
},
watch: {
'field.value': function(newValue) {
if (newValue) {
this.error = null;
}
this.checkDeactivatedValues(); // check when a custom form value changes
prerecordedListSearchQuery(newValue) {
this.loadingPrerecordedListValues = true;
this.GET_SELECTED_PRERECORDED_LIST_VALUES({
name: this.field.options[0],
pattern: newValue
})
.then(() => {
this.loadingPrerecordedListValues = false;
})
.catch(() => {
this.loadingPrerecordedListValues = false;
});
}
if (this.field) {
const { field_type, options, value } = this.field;
if (field_type === 'pre_recorded_list') {
this.loadingPrerecordedListValues = true;
this.GET_SELECTED_PRERECORDED_LIST_VALUES({
name: options[0],
pattern: ''
.then(() => {
this.loadingPrerecordedListValues = false;
})
.catch(() => {
this.loadingPrerecordedListValues = false;
});
if (value) {
this.selectedPrerecordedValue = { label: value.label ? value.label : value };
}
} else if (field_type === 'multi_choices_list' && value) {
this.selectedMultipleCheckbox = value;
mounted() {
this.checkDeactivatedValues(); // check when custom form appears on page
},
destroyed() {
this.checkDeactivatedValues(); // necessary to ensure all imbricated condition would be verified when an extra form is deactivated
},
Sébastien DA ROCHA
committed
methods: {
...mapActions('feature-type', [
'GET_SELECTED_PRERECORDED_LIST_VALUES'
]),
...mapMutations('feature', [
'UPDATE_EXTRA_FORM',
'SET_EXTRA_FORMS',
Sébastien DA ROCHA
committed
updateStore_extra_form(evt) {
if (this.field.field_type === 'boolean') {
newValue = evt.target.checked; //* if checkbox use "checked"
} else if (this.field.field_type === 'multi_choices_list') {
newValue = this.selectedMultipleCheckbox;
} else {
newValue = evt.target.value;
}
//* set the value selected
if (this.isConditionalField) {
this.$emit('update:condition-value', newValue);
this.UPDATE_EXTRA_FORM({ ...this.field, ['value']: newValue });
this.checkDeactivatedValues(); // check when value changed
Sébastien DA ROCHA
committed
},
checkDeactivatedValues() {
// if changes occured, update extra_forms array with freshly checked active customForms
let newExtraForms = this.extra_forms.map((xForm) => { // we use 'deactivate' instead of 'activate' because at initialization this property cannot be evaluated ...
const isDeactivated = !isXtraFormActive(this.extra_forms, xForm.conditional_field_config); // ... if the component is not created to set this property, thus no extra form would appear at all
// toggle value to null to deactivate other fields conditioned by it
if (isDeactivated) {
xForm['value'] = null;
}
return { ...xForm, ['isDeactivated']: isDeactivated };
});
this.SET_EXTRA_FORMS(newExtraForms);
},
if (this.field && this.field.is_mandatory && !this.field.value) {
isValid = false;
this.error = 'Ce champ est obligatoire';
} else {
this.error = null;
}
return isValid;
search(text) {
this.prerecordedListSearchQuery = text;
},
selectPrerecordedValue(e) {
this.prerecordedListSearchQuery = null;
this.updateStore_extra_form({ target: { value: this.selectedPrerecordedValue } });
},
this.selectedPrerecordedValue = null;
this.prerecordedListSearchQuery = null;
this.updateStore_extra_form({ target: { value: null } });
},
selectMultipleCheckbox(e) {
const { checked, name } = e.target;
if (checked) {
this.selectedMultipleCheckbox.push(name);
} else {
this.selectedMultipleCheckbox = this.selectedMultipleCheckbox.filter((el) => el !== name);
}
this.updateStore_extra_form();
},
Sébastien DA ROCHA
committed
},
};
label.required:after {
content: ' *';
color: rgb(209, 0, 0);
}
.checkbox_list {
display: flex;
flex-direction: column;
.ui.checkbox {
margin: .5rem;
font-weight: normal;
}
<style>
/* keep placeholder width when opening dropdown */
.multiselect {
width: 305px;
}
/* keep font-weight from overide of semantic classes */
.multiselect__placeholder, .multiselect__content, .multiselect__tags {
font-weight: initial !important;
}
/* keep placeholder eigth */
.multiselect .multiselect__placeholder {
margin-bottom: 9px !important;
padding-top: 1px;
}
/* keep placeholder height when opening dropdown without selection */
input.multiselect__input {
padding: 3px 0 0 0 !important;
}
/* keep placeholder height when opening dropdown with already a value selected */
.multiselect__tags .multiselect__single {
padding: 1px 0 0 0 !important;
margin-bottom: 9px;
}