diff --git a/src/components/Feature/Edit/FeatureExtraForm.vue b/src/components/Feature/Edit/FeatureExtraForm.vue index 6e671d42c2baa854b1651e76c63b6e01587cca0c..3ae38ec519c52e664918ec5c33b58702c39cb126 100644 --- a/src/components/Feature/Edit/FeatureExtraForm.vue +++ b/src/components/Feature/Edit/FeatureExtraForm.vue @@ -3,6 +3,7 @@ <label v-if="displayLabels" :for="field.name" + :class="{ required: field.is_mandatory }" > {{ field.label }} </label> @@ -11,14 +12,25 @@ :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 v-else-if="field && field.field_type === 'list'"> <label v-if="displayLabels" :for="field.name" + :class="{ required: field.is_mandatory }" > {{ field.label }} </label> @@ -26,12 +38,23 @@ :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'"> <label v-if="displayLabels" :for="field.name" + :class="{ required: field.is_mandatory }" > {{ field.label }} </label> @@ -42,9 +65,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'"> <div class="ui checkbox"> @@ -64,6 +97,7 @@ <label v-if="displayLabels" :for="field.name" + :class="{ required: field.is_mandatory }" > {{ field.label }} </label> @@ -72,13 +106,24 @@ :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'"> <label v-if="displayLabels" :for="field.name" + :class="{ required: field.is_mandatory }" > {{ field.label }} </label> @@ -89,23 +134,44 @@ 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'"> <label v-if="displayLabels" :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> @@ -126,6 +192,12 @@ export default { } }, + data() { + return { + error: null + }; + }, + computed: { selected_extra_form_list: { get() { @@ -144,6 +216,14 @@ export default { } }, + watch: { + 'field.value': function(newValue) { + if (newValue) { + this.error = null; + } + } + }, + methods: { updateStore_extra_form(evt) { const newExtraForm = this.field; @@ -154,6 +234,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 51f068a1460a50452a0bd20da3def1f4302fb3ea..17dfbc157fb94e7b51a79c298153911a453241be 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, @@ -409,3 +442,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 824c440563985231552addb3ec5c9f1f585280f8..cf127b78cb27621d87db4914cb742293841fcc8b 100644 --- a/src/views/Feature/FeatureEdit.vue +++ b/src/views/Feature/FeatureEdit.vue @@ -279,6 +279,7 @@ > <FeatureExtraForm :id="field.label" + ref="extraForm" :field="field" class="field" /> @@ -772,6 +773,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) {