diff --git a/src/components/Feature/Edit/FeatureExtraForm.vue b/src/components/Feature/Edit/FeatureExtraForm.vue index 778c46539df03dbc82510be65fb9577478e5a3d4..8953315d23d7c56e62a1944abf8dd3f616d1fea9 100644 --- a/src/components/Feature/Edit/FeatureExtraForm.vue +++ b/src/components/Feature/Edit/FeatureExtraForm.vue @@ -5,6 +5,7 @@ <label v-if="$route.name !== 'details-signalement'" :for="field.name" + :class="{ required: field.is_mandatory }" > {{ field.label }} </label> @@ -13,8 +14,18 @@ :value="field.value" type="text" :name="field.name" + :required="field.is_mandatory" @blur="updateStore_extra_form" > + <ul + v-if="field.is_mandatory && error" + :id="`errorlist-extra-form-${field.name}`" + class="errorlist" + > + <li> + {{ error }} + </li> + </ul> </div> <div @@ -23,6 +34,7 @@ <label v-if="$route.name !== 'details-signalement'" :for="field.name" + :class="{ required: field.is_mandatory }" > {{ field.label }} </label> @@ -30,7 +42,17 @@ :options="field.options" :selected="selected_extra_form_list" :selection.sync="selected_extra_form_list" + :required="field.is_mandatory" /> + <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'" @@ -38,6 +60,7 @@ <label v-if="$route.name !== 'details-signalement'" :for="field.name" + :class="{ required: field.is_mandatory }" > {{ field.label }} </label> @@ -48,9 +71,19 @@ :value="field.value" type="number" :name="field.name" + :required="field.is_mandatory" @change="updateStore_extra_form" > </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 === 'boolean'" @@ -74,6 +107,7 @@ <label v-if="$route.name !== 'details-signalement'" :for="field.name" + :class="{ required: field.is_mandatory }" > {{ field.label }} </label> @@ -82,8 +116,18 @@ :value="field.value" type="date" :name="field.name" + :required="field.is_mandatory" @blur="updateStore_extra_form" > + <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 === 'decimal'" @@ -91,6 +135,7 @@ <label v-if="$route.name !== 'details-signalement'" :for="field.name" + :class="{ required: field.is_mandatory }" > {{ field.label }} </label> @@ -101,9 +146,19 @@ type="number" step=".01" :name="field.name" + :required="field.is_mandatory" @change="updateStore_extra_form" > </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 === 'text'" @@ -111,15 +166,26 @@ <label v-if="$route.name !== 'details-signalement'" :for="field.name" + :class="{ required: field.is_mandatory }" > {{ field.label }} </label> <textarea :value="field.value" :name="field.name" + :required="field.is_mandatory" 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> </div> </template> @@ -140,6 +206,12 @@ export default { } }, + data() { + return { + error: null + }; + }, + computed: { selected_extra_form_list: { get() { @@ -154,6 +226,14 @@ export default { }, }, + watch: { + 'field.value': function(newValue) { + if (newValue) { + this.error = null; + } + } + }, + methods: { updateStore_extra_form(evt) { const newExtraForm = this.field; @@ -164,6 +244,26 @@ export default { } this.$store.commit('feature/UPDATE_EXTRA_FORM', newExtraForm); }, + + checkForm() { + let isValid = true; + if (this.field.is_mandatory && !this.field.value) { + isValid = false; + this.error = 'Ce champ est obligatoire'; + } else { + this.error = null; + } + return isValid; + } }, }; </script> + +<style lang="less" scoped> + +label.required:after { + content: ' *'; + color: rgb(209, 0, 0); +} + +</style> diff --git a/src/components/FeatureType/FeatureTypeCustomForm.vue b/src/components/FeatureType/FeatureTypeCustomForm.vue index d064ee6ca7a27c946f98d3543e65621a946da83b..24b535fdbf2723a0d314dcaea1fe9ef1f073dabb 100644 --- a/src/components/FeatureType/FeatureTypeCustomForm.vue +++ b/src/components/FeatureType/FeatureTypeCustomForm.vue @@ -3,19 +3,34 @@ :id="`custom_form-${form.position.value}`" class="ui teal segment pers-field" > - <h4> - Champ personnalisé - <button - class="ui small compact right floated icon button remove-field" - type="button" - @click="removeCustomForm()" - > - <i - class="ui times icon" - aria-hidden="true" - /> - </button> - </h4> + <div class="custom-field-header"> + <h4> + Champ personnalisé + </h4> + <div class="top-right"> + <div + v-if="(form.label.value || form.name.value) && selectedFieldType !== 'Booléen'" + class="ui checkbox" + > + <input + type="checkbox" + name="mandatory-custom-field" + @change="setIsFieldMandatory($event)" + > + <label>Champ obligatoire</label> + </div> + <button + class="ui small compact right floated icon button remove-field" + type="button" + @click="removeCustomForm()" + > + <i + class="ui times icon" + aria-hidden="true" + /> + </button> + </div> + </div> <div class="visible-fields"> <div class="two fields"> <div class="required field"> @@ -193,6 +208,7 @@ export default { ], form: { dataKey: 0, + isFieldMandatory: false, label: { errors: [], id_for_label: 'label', @@ -292,12 +308,28 @@ export default { }, }, + watch: { + 'form.isFieldMandatory': { + deep: true, + handler(newValue) { + console.log(newValue); + } + } + }, + mounted() { //* add datas from store to state to avoid mutating directly store with v-model (not good practice), could have used computed with getter and setter as well this.fillCustomFormData(this.customForm); }, methods: { + + setIsFieldMandatory(e) { + this.form.isFieldMandatory = e.target.checked; + this.updateStore(); + console.log(this.form.isFieldMandatory); + }, + hasDuplicateOptions() { this.form.options.errors = []; const isDup = @@ -332,6 +364,7 @@ export default { updateStore() { const data = { dataKey: this.customForm.dataKey, + isMandatory: this.form.isFieldMandatory, label: this.form.label.value, name: this.form.name.value, position: this.form.position.value, @@ -416,3 +449,22 @@ export default { }, }; </script> + +<style lang="less" scoped> + +.custom-field-header { + display: flex; + align-items: center; + justify-content: space-between; + + .top-right { + display: flex; + align-items: center; + + .checkbox { + margin-right: 5rem; + } + } +} + +</style> diff --git a/src/store/modules/feature-type.store.js b/src/store/modules/feature-type.store.js index 49921f0132dfd260b45b198d359bd45fc4f4fd30..0fe6b25c8de60295e8d2ba2a166fdd592ceead4e 100644 --- a/src/store/modules/feature-type.store.js +++ b/src/store/modules/feature-type.store.js @@ -111,6 +111,7 @@ const feature_type = { customfield_set: state.customForms.map(el => { return { position: el.position, + is_mandatory: el.isMandatory, label: el.label, name: el.name, field_type: el.field_type, diff --git a/src/views/Feature/FeatureEdit.vue b/src/views/Feature/FeatureEdit.vue index 6059ea53eff334338c572a54415fadaac7b9905b..7b4d03283161257b7cf5dae95a2d92b7f1ce2453 100644 --- a/src/views/Feature/FeatureEdit.vue +++ b/src/views/Feature/FeatureEdit.vue @@ -268,6 +268,7 @@ > <FeatureExtraForm :id="field.label" + ref="extraForm" :field="field" /> {{ field.errors }} @@ -753,6 +754,13 @@ export default { checkAddedForm() { let isValid = true; //* fallback if all customForms returned true + if (this.$refs.extraForm) { + for (const extraForm of this.$refs.extraForm) { + if (extraForm.checkForm() === false) { + isValid = false; + } + } + } if (this.$refs.attachementForm) { for (const attachementForm of this.$refs.attachementForm) { if (attachementForm.checkForm() === false) {