The project_id is required to be validated on form submit:
<td>
<select2
name="project_id"
id="project_id"
v-model.trim="item.project_id.$model"
v-bind:class="{
'is-invalid': item.project_id.$error,
'is-valid':
item.project_id.$dirty &&
!item.project_id.$error,
}"
>
<option value="">Select</option>
<option v-for="(project) in projects"
:selected="project.id == timesheet.project_id"
:key="project.id"
:value="project.id"
>{{ project.name }}
</option>
</select2>
</td>
<td><input type= "checkbox" name="disable" v-on:click="disabled()"></td>
<script>
import { required, minLength } from "vuelidate/lib/validators";
validations() {
return{
timesheet: {
items: {
required,
minLength: minLength(1),
project_id: { required },
}
}
}
},
disabled(){
$('#project_id').attr('disabled', true);
}
</script>
How to make the field non-required when the disable checkbox is checked?
I tried with the requiredIf validator, but seems like am missing somewhere:
$each: {
project_id: {
required: requiredIf (function(item){
return this.disable
})
},
},
CodePudding user response:
You probably trying to do the following in your disable() function:
document.getElementById("project_id").removeAttribute("required");
// or
document.getElementById("project_id").setAttribute("required", "");
To decide if you need to remove the attribute you need to apply a v-model property to your <input type= "checkbox" name="disable" v-on:click="disabled()">. If a this checkbox is checked, it´s property would turn true, else it would be false.
EDIT: Here is a complete example of usage.
<template>
<div>
<select id="project_id" required>
<option value="bar">Option 1</option>
<option value="foo">Option 2</option>
<option value="baz">Option 3</option>
</select>
<input type="checkbox" name="disable" v-model="clickedBox" @change="checkSelected">
</div>
</template>
<script>
export default {
data() {
return {
clickedBox: false
}
},
methods: {
checkSelected() {
if (this.clickedBox === true) {
document.getElementById("project_id").removeAttribute("required");
}
else {
document.getElementById("project_id").setAttribute("required", "");
}
}
}
}
</script>
If the checkbox is checked project_id will loose it´s required attribute. If it´s unchecked, the required attribute would be set again.
EDIT2: Using dynamic validation schema
If you want to use a dynamic validation schema for project_id, you need to use it like this:
validations() {
if (!this.clickedBox) {
return {
timesheet: {
items: {
required,
minLength: minLength(1),
project_id: { required },
}
}
}
} else {
return {
timesheet: {
items: {
required,
minLength: minLength(1),
project_id: ''
}
}
}
}
}
See the documentation for further information: Dynamic validation schema
