CSR-319: implement full validation on form-test

This commit is contained in:
Adam Caouette 2022-03-01 09:16:18 -05:00
parent 52cc306860
commit e6e9c92f2f
12 changed files with 297 additions and 90 deletions

View file

@ -122,6 +122,7 @@ export default {
}, },
methods: { methods: {
handleCheckedChanged(val) { handleCheckedChanged(val) {
console.log('BQ handleCheckedChanged, val: ', val)
if(this.isMultiSelect && this.selectedValues) { if(this.isMultiSelect && this.selectedValues) {
// Add or remove item to array of data to emit // Add or remove item to array of data to emit
if(Array.isArray(this.selectedValues)) { if(Array.isArray(this.selectedValues)) {
@ -132,6 +133,7 @@ export default {
} else { } else {
this.selectedValues = [val.value]; this.selectedValues = [val.value];
} }
console.log('BQ handleCheckedChanged, this.selectedValues is now: ', this.selectedValues)
}, },
}, },
components: { components: {

View file

@ -15,23 +15,31 @@
groupName="DamageLocationQuestion" groupName="DamageLocationQuestion"
/> />
<windshieldOptions <windshieldOptions
ref="windshieldOptions" ref="windshieldOptions"
:showWindshieldDamageTypeQuestion="values.DamageLocationQuestion && values.DamageLocationQuestion.toString().includes('-Windshield')" v-model="selectedWindshieldOptions"
:suppressError="errors.windshieldDamageTypeQuestion && errors.windshieldDamageTypeQuestion.startsWith('checkForRepairAndReplace')" :suppressError="errors.WindshieldDamageTypeQuestion && errors.WindshieldDamageTypeQuestion.startsWith('checkForRepairAndReplace')"
:selectedDamageLocations="selectedDamageLocations"
/> />
<alert <alert
class="my-3" class="my-3"
v-if="errors.windshieldDamageTypeQuestion && errors.windshieldDamageTypeQuestion.startsWith('checkForRepairAndReplace')" v-if="errors.WindshieldDamageTypeQuestion && errors.WindshieldDamageTypeQuestion.startsWith('checkForRepairAndReplace')"
alertClass="alert-danger" alertClass="alert-danger"
alertHeadline="You'll need to schedule separate appointments" alertHeadline="You'll need to schedule separate appointments"
alertCopy="Vehicle service requiring both glass repair and replacement must be scheduled separately, as they're performed by different technicians." alertCopy="Vehicle service requiring both glass repair and replacement must be scheduled separately, as they're performed by different technicians. Continue scheduling your first service now, and then come back to schedule the second service."
:isDismissible="false" :isDismissible="false"
/> />
<sideDoorOptions
ref="sideDoorOptions"
groupName="SideDoorSideQuestion"
v-model="sideDoorOptionsData"
:selectedDamageLocations="selectedDamageLocations"
/>
<replaceOptionsQuestion <replaceOptionsQuestion
ref="driverSideOptions" ref="backGlassOptions"
isAvailable :isAvailable="isRearWindowDamageLocation"
v-model="driverSideOptionsData" v-model="selectedRearReplaceOptions"
groupName="DriverSideReplaceOptionsQuestion" groupName="BackGlassReplaceOptionsQuestion"
validationRules="replace-options-required"
/> />
<funnel-footer <funnel-footer
ref="funnelFooter" ref="funnelFooter"
@ -60,19 +68,25 @@ import vehicleBanner from "@/common-components/vehicle-banner/vehicle-banner";
import funnelSubHeader from "@/common-components/funnel-sub-header/funnel-sub-header"; import funnelSubHeader from "@/common-components/funnel-sub-header/funnel-sub-header";
import replaceOptionsQuestion from "@/layouts/vehicle-damage/replace-options-question/replace-options-question"; import replaceOptionsQuestion from "@/layouts/vehicle-damage/replace-options-question/replace-options-question";
import damageLocationQuestion from "@/layouts/vehicle-damage/damage-location-question/damage-location-question"; import damageLocationQuestion from "@/layouts/vehicle-damage/damage-location-question/damage-location-question";
import sideDoorOptions from "@/layouts/vehicle-damage/side-door-options/side-door-options";
import windshieldOptions from "@/layouts/vehicle-damage/windshield-options/windshield-options"; import windshieldOptions from "@/layouts/vehicle-damage/windshield-options/windshield-options";
import alert from "@/ux-components/alert/alert"; import alert from "@/ux-components/alert/alert";
import { Form } from 'vee-validate';
// Supporting files // Supporting files
import { fetchCmsContentForPage } from "@/helpers/cms-content-helper"; import { fetchCmsContentForPage } from "@/helpers/cms-content-helper";
import { settleAllPromises } from "@/helpers/layout-helper"; import { settleAllPromises } from "@/helpers/layout-helper";
import { storeActions } from "@/constants/store-actions"; import { storeActions } from "@/constants/store-actions";
import store from "@/store"; import store from "@/store";
import baseMixin from "@/mixins/base-mixin"; import baseMixin from "@/mixins/base-mixin";
import { Form, defineRule } from "vee-validate";
// DEFINE VALIDATION RULES
defineRule("replace-options-required", (value) => {
if (!value || value.length < 1) {
return "Please select rear window type";
}
return true;
});
export default { export default {
name: "form-test", name: "form-test",
@ -110,12 +124,19 @@ export default {
vm.$refs.funnelSubHeader.initializeComponent( vm.$refs.funnelSubHeader.initializeComponent(
resultMap.cmsContent.FunnelSubHeaderWidget resultMap.cmsContent.FunnelSubHeaderWidget
); );
vm.$refs.driverSideOptions.initializeComponent(
resultMap.cmsContent.DriverSideReplaceOptionsQuestion, resultMap.damageOptions.driverSideOptions.availableReplacementOptions
);
vm.$refs.damageLocation.initializeComponent( vm.$refs.damageLocation.initializeComponent(
resultMap.cmsContent.DamageLocationQuestion, resultMap.damageOptions resultMap.cmsContent.DamageLocationQuestion, resultMap.damageOptions
); );
vm.$refs.sideDoorOptions.initializeComponent(
resultMap.cmsContent.SideDoorSideQuestion, resultMap.cmsContent.DriverSideReplaceOptionsQuestion, resultMap.cmsContent.PassengerSideReplaceOptionsQuestion, resultMap.damageOptions.driverSideOptions.availableReplacementOptions, resultMap.damageOptions.passengerSideOptions.availableReplacementOptions
);
vm.$refs.windshieldOptions.initializeComponent(
resultMap.cmsContent.WindshieldDamageTypeQuestion, resultMap.cmsContent.WindshieldChipCountQuestion,
resultMap.cmsContent.WindshieldReplaceOptionsQuestion, resultMap.damageOptions.windshieldOptions.availableReplacementOptions
);
vm.$refs.backGlassOptions.initializeComponent(
resultMap.cmsContent.RearReplaceOptionsQuestion, resultMap.damageOptions.backGlassOptions.availableReplacementOptions
);
vm.$refs.funnelFooter.initializeComponent( vm.$refs.funnelFooter.initializeComponent(
resultMap.cmsContent.FunnelFooterWidget resultMap.cmsContent.FunnelFooterWidget
); );
@ -124,14 +145,29 @@ export default {
data(){ data(){
return { return {
selectedDamageLocations: [], selectedDamageLocations: [],
driverSideOptionsData: [], sideDoorOptionsData: {
selectedDoorSides: [],
selectedDriverSideReplacOptions: [],
selectedPassengerSideReplaceOptions: []
},
selectedWindshieldOptions: [],
selectedRearReplaceOptions: [],
} }
}, },
computed: {
isRearWindowDamageLocation() {
return this.selectedDamageLocations.some(selectedDamages =>
{
return selectedDamages.toUpperCase() === "REARWINDOW";
});
},
},
components: { components: {
Form, Form,
funnelHeader, funnelHeader,
vehicleBanner, vehicleBanner,
funnelSubHeader, funnelSubHeader,
sideDoorOptions,
damageLocationQuestion, damageLocationQuestion,
replaceOptionsQuestion, replaceOptionsQuestion,
funnelFooter, funnelFooter,

View file

@ -9,7 +9,6 @@
v-model="selectedValues" v-model="selectedValues"
validationRules="damage-location-required" validationRules="damage-location-required"
/> />
</div> </div>
</template> </template>

View file

@ -1,6 +1,6 @@
<template> <template>
<transition name="fade" mode="out-in"> <transition name="fade" mode="out-in">
<div v-if="isAvailable && this.answersToDisplay.length > 0" class="replace-options-question" :class="this.answersToDisplay.length < 2 ? 'd-none' : ''" aria-live="polite"> <div v-if="isAvailable && this.answersToDisplay.length > 0" class="replace-options-question" :class="this.answersToDisplay.length < 2 ? 'd-noneXXXXXXXXXXXXXXXXX' : ''" aria-live="polite">
<buttonQuestion <buttonQuestion
isWide isWide
:questionText="questionText" :questionText="questionText"
@ -9,7 +9,7 @@
:groupName="groupName" :groupName="groupName"
buttonType="listCard" buttonType="listCard"
v-model="selectedValues" v-model="selectedValues"
validationRules="replace-options-required" :validationRules="validationRules"
/> />
</div> </div>
</transition> </transition>
@ -18,15 +18,6 @@
<script> <script>
import buttonQuestion from "@/common-components/button-question/button-question"; import buttonQuestion from "@/common-components/button-question/button-question";
import store from "@/store"; import store from "@/store";
import { defineRule } from "vee-validate";
// DEFINE VALIDATION RULES
defineRule("replace-options-required", (value) => {
if (!value || value.length < 1) {
return "Please select window";
}
return true;
});
export default ({ export default ({
name: "replaceOptionsQuestion", name: "replaceOptionsQuestion",
@ -43,6 +34,7 @@ export default ({
groupName: String, groupName: String,
modelValue: Array, modelValue: Array,
isMultiSelect: Boolean, isMultiSelect: Boolean,
validationRules: String,
}, },
methods: { methods: {
initializeComponent(cmsContent, replaceOptions){ initializeComponent(cmsContent, replaceOptions){
@ -50,12 +42,26 @@ export default ({
this.answersFromCms = cmsContent.Answers; this.answersFromCms = cmsContent.Answers;
this.replaceOptions = replaceOptions; this.replaceOptions = replaceOptions;
}, },
updateSelectedValues() { // updateSelectedValues() {
// UPDATE SELECTEDVALUES IF ONLY ONE ANSWER // // UPDATE SELECTEDVALUES IF ONLY ONE ANSWER
if(Array.isArray(this.answersToDisplay) && this.answersToDisplay.length === 1 && this.selectedValues) { // console.log(' ROQ updateSelectedValues, this.answersToDisplay: ', this.answersToDisplay);
// console.log(' ROQ updateSelectedValues, this.selectedValues: ', this.selectedValues);
// if(Array.isArray(this.answersToDisplay) && this.answersToDisplay.length === 1) {
// console.log(' ROQ ONLY ONE ANSWER!')
// this.selectedValues = [this.answersToDisplay[0].Name];
// }
// },
},
mounted() {
console.log('**** MOUJNTED *****. ')
console.log(' ROQ **** MOUJNTED *****, this.answersToDisplay: ', this.answersToDisplay);
console.log(' ROQ **** MOUJNTED *****, this.selectedValues: ', this.selectedValues);
if(Array.isArray(this.answersToDisplay) && this.answersToDisplay.length === 1) {
console.log(' ROQ ONLY ONE ANSWER!')
this.selectedValues = [this.answersToDisplay[0].Name]; this.selectedValues = [this.answersToDisplay[0].Name];
} }
},
}, },
computed: { computed: {
selectedValues: { selectedValues: {
@ -82,12 +88,13 @@ export default ({
}); });
}, },
}, },
watch: { // watch: {
isAvailable(val) { // isAvailable(val) {
// CHECK TO UPDATE SELECTED VALUES WHEN ISAVAILABLE IS TRUE // console.log('ROQ ^^^ isAvailable changed.')
val && this.updateSelectedValues(); // // CHECK TO UPDATE SELECTED VALUES WHEN ISAVAILABLE IS TRUE
} // val && this.updateSelectedValues();
}, // }
// },
components: { components: {
buttonQuestion, buttonQuestion,
} }

View file

@ -9,13 +9,28 @@
:groupName="groupName" :groupName="groupName"
buttonType="listCard" buttonType="listCard"
v-model="selectedDoorSidesValues" v-model="selectedDoorSidesValues"
validationRules="damage-side-required"
/> />
</div> </div>
</transition> </transition>
<replaceOptionsQuestion
<replaceOptionsQuestion ref="driverSideOptions" :isAvailable="isDriverSideReplaceOptionsQuestionAvailable" groupName="driverSideOptions" filterByVehicleCategory v-model="selectedDriverSideReplacOptionsValues" /> ref="driverSideOptions"
:isAvailable="isDriverSideReplaceOptionsQuestionAvailable"
<replaceOptionsQuestion ref="passengerSideOptions" :isAvailable="isPassengerSideReplaceOptionsQuestionAvailable" groupName="passengerSideOptions" filterByVehicleCategory v-model="selectedPassengerSideReplaceOptionsValues" /> groupName="driverSideOptions"
isMultiSelect
filterByVehicleCategory
v-model="selectedDriverSideReplacOptionsValues"
validationRules="driver-side-options-required"
/>
<replaceOptionsQuestion
ref="passengerSideOptions"
:isAvailable="isPassengerSideReplaceOptionsQuestionAvailable"
groupName="passengerSideOptions"
isMultiSelect
filterByVehicleCategory
v-model="selectedPassengerSideReplaceOptionsValues"
validationRules="passenger-side-options-required"
/>
</div> </div>
</template> </template>
@ -23,6 +38,29 @@
import buttonQuestion from "@/common-components/button-question/button-question"; import buttonQuestion from "@/common-components/button-question/button-question";
import replaceOptionsQuestion from "@/layouts/vehicle-damage/replace-options-question/replace-options-question"; import replaceOptionsQuestion from "@/layouts/vehicle-damage/replace-options-question/replace-options-question";
import store from "@/store"; import store from "@/store";
import { defineRule } from "vee-validate";
// DEFINE VALIDATION RULES
defineRule("damage-side-required", (value) => {
if (!value || value.length < 1) {
return "Please select vehicle side";
}
return true;
});
defineRule("driver-side-options-required", (value) => {
if (!value || value.length < 1) {
return "Please select window";
}
return true;
});
defineRule("passenger-side-options-required", (value) => {
if (!value || value.length < 1) {
return "Please select window";
}
return true;
});
export default ({ export default ({
name: "sideDoorOptions", name: "sideDoorOptions",

View file

@ -24,6 +24,7 @@
:isAvailable="isRearWindowDamageLocation" :isAvailable="isRearWindowDamageLocation"
v-model="selectedRearReplaceOptions" v-model="selectedRearReplaceOptions"
groupName="BackGlassReplaceOptionsQuestion" groupName="BackGlassReplaceOptionsQuestion"
validationRules="replace-options-required"
/> />
<funnelFooter ref="funnelFooter" @back-clicked="backButtonAction" /> <funnelFooter ref="funnelFooter" @back-clicked="backButtonAction" />
</div> </div>
@ -46,6 +47,15 @@ import { settleAllPromises } from "@/helpers/layout-helper";
import { storeActions } from "@/constants/store-actions"; import { storeActions } from "@/constants/store-actions";
import store from "@/store"; import store from "@/store";
import baseMixin from "@/mixins/base-mixin"; import baseMixin from "@/mixins/base-mixin";
import { defineRule } from "vee-validate";
// DEFINE VALIDATION RULES
defineRule("replace-options-required", (value) => {
if (!value || value.length < 1) {
return "Please select rear window type";
}
return true;
});
export default { export default {

View file

@ -7,6 +7,7 @@
:groupName="groupName" :groupName="groupName"
buttonType="listButtonHorizontal" buttonType="listButtonHorizontal"
v-model="selectedChipCountValues" v-model="selectedChipCountValues"
:validationRules="validationRules"
/> />
</div> </div>
</transition> </transition>
@ -27,12 +28,23 @@ export default ({
modelValue: Array, modelValue: Array,
groupName: String, groupName: String,
isAvailable: Boolean, isAvailable: Boolean,
validationRules: String,
}, },
methods: { methods: {
initializeComponent(cmsContent){ initializeComponent(cmsContent){
this.questionText = cmsContent.QuestionText; this.questionText = cmsContent.QuestionText;
this.answersFromCms = cmsContent.Answers; this.answersFromCms = cmsContent.Answers;
} },
updateSelectedValues() {
// UPDATE SELECTEDVALUES IF ONLY ONE ANSWER
console.log(' updateSelectedValues, this.answersToDisplay: ', this.answersToDisplay);
console.log(' updateSelectedValues, this.selectedValues: ', this.selectedValues);
if(Array.isArray(this.answersToDisplay) && this.answersToDisplay.length === 1 && this.selectedValues) {
console.log(' ONLY ONE ANSWER!')
this.selectedValues = [this.answersToDisplay[0].Name];
}
},
}, },
computed: { computed: {
selectedChipCountValues: { selectedChipCountValues: {
@ -44,6 +56,13 @@ export default ({
} }
}, },
}, },
watch: {
isAvailable(val) {
console.log('*** isAvailable changed.')
// CHECK TO UPDATE SELECTED VALUES WHEN ISAVAILABLE IS TRUE
val && this.updateSelectedValues();
}
},
components: { components: {
buttonQuestion, buttonQuestion,
} }

View file

@ -7,6 +7,8 @@
:groupName="groupName" :groupName="groupName"
buttonType="listCard" buttonType="listCard"
v-model="selectedValues" v-model="selectedValues"
:suppressError="suppressError"
:validationRules="validationRules"
/> />
</div> </div>
</transition> </transition>
@ -14,22 +16,30 @@
<script> <script>
import buttonQuestion from "@/common-components/button-question/button-question"; import buttonQuestion from "@/common-components/button-question/button-question";
//import { defineRule } from "vee-validate"; import store from "@/store";
// import { defineRule } from "vee-validate";
//DEFINE VALIDATION RULES //
// add these to the button component above: // //DEFINE VALIDATION RULES
// validationRules="windshield-damage-required|checkForRepairAndReplace:@DamageLocationQuestion" // // add these to the button component above:
// :suppressError="suppressError" // // validationRules="windshield-damage-required|checkForRepairAndReplace:@DamageLocationQuestion"
// // :suppressError="suppressError"
// defineRule("windshield-damage-required", (value) => { // defineRule("windshield-damage-required", (value) => {
// // console.log('validation rule - windshield-damage-required, value: ', value);
// if (!value || value.length < 1) { // if (!value || value.length < 1) {
// // console.log('validation rule - windshield-damage-required, RETURN ERROR');
// return "Please select windshield damage"; // return "Please select windshield damage";
// } // }
// // console.log('validation rule - windshield-damage-required, return true');
// return true; // return true;
// }); // });
// defineRule("checkForRepairAndReplace", (value, [other]) => { // defineRule("checkForRepairAndReplace", (value, [other]) => {
// if (value === "Windshield-Chip" && other.toString().includes("Windshield") && other.length > 1) { // // console.log('validation rule - checkForRepairAndReplace, value: ', value);
// // console.log('validation rule - checkForRepairAndReplace, other: ', other);
// if (value.toUpperCase() === "REPAIR" && other.toString().includes("Windshield") && other.length > 1) {
// console.log('validation rule - checkForRepairAndReplace, RETURN ERROR');
// return "checkForRepairAndReplace error" // return "checkForRepairAndReplace error"
// } // }
// // console.log('validation rule - checkForRepairAndReplace, return true');
// return true; // return true;
// }); // });
@ -46,12 +56,13 @@ export default ({
groupName: String, groupName: String,
isAvailable: Boolean, isAvailable: Boolean,
suppressError: Boolean, suppressError: Boolean,
validationRules: String,
}, },
methods: { methods: {
initializeComponent(cmsContent){ initializeComponent(cmsContent){
this.questionText = cmsContent.QuestionText; this.questionText = cmsContent.QuestionText;
this.answersFromCms = cmsContent.Answers; this.answersFromCms = cmsContent.Answers;
} },
}, },
computed: { computed: {
selectedValues: { selectedValues: {
@ -62,6 +73,21 @@ export default ({
this.$emit("update:modelValue", newValue); this.$emit("update:modelValue", newValue);
} }
}, },
answersToDisplay(){
const filteredAnswers = Array.isArray(this.answersFromCms)
? this.answersFromCms.filter(ans =>
{
const name = ans.Name.split('-');
return this.filterByVehicleCategory ? name[0].toUpperCase() === store.getters.vehicle.category && this.replaceOptions.includes(name[1]) : this.replaceOptions.includes(ans.Name);
})
: [];
return filteredAnswers.map(ans => {
const newName = ans.Name.includes('-') ? ans.Name.split('-')[1] : ans.Name;
ans.Name = newName;
return ans;
});
},
}, },
components: { components: {
buttonQuestion, buttonQuestion,

View file

@ -4,17 +4,20 @@
:isAvailable=isWindshieldDamageLocation :isAvailable=isWindshieldDamageLocation
:suppressError="suppressError" :suppressError="suppressError"
groupName="WindshieldDamageTypeQuestion" groupName="WindshieldDamageTypeQuestion"
v-model="selectedWindshieldDamageTypeValues" v-model="selectedWindshieldDamageTypeValues"
validationRules="windshield-damage-type-required|checkForRepairAndReplace:@DamageLocationQuestion"
/> />
<windshieldChipCountQuestion ref="windshieldChipCountQuestion" <windshieldChipCountQuestion ref="windshieldChipCountQuestion"
:isAvailable=isRepairOptionSelected :isAvailable=isRepairOptionSelected
groupName="WindshieldChipCountQuestion" groupName="WindshieldChipCountQuestion"
v-model="selectedWindshieldChipCountValues" v-model="selectedWindshieldChipCountValues"
validationRules="windshield-chip-count-required"
/> />
<replaceOptionsQuestion ref="replaceOptionsQuestion" <replaceOptionsQuestion ref="replaceOptionsQuestion"
:isAvailable=isReplaceOptionSelected :isAvailable=isReplaceOptionSelected
groupName="WindshieldReplaceOptions" groupName="WindshieldReplaceOptions"
v-model="selectedWindshieldReplaceOptionsValues" v-model="selectedWindshieldReplaceOptionsValues"
validationRules="windshield-replace-options-required"
/> />
</div> </div>
</template> </template>
@ -23,6 +26,36 @@
import windshieldDamageTypeQuestion from"@/layouts/vehicle-damage/windshield-options/windshield-damage-type-question/windshield-damage-type-question"; import windshieldDamageTypeQuestion from"@/layouts/vehicle-damage/windshield-options/windshield-damage-type-question/windshield-damage-type-question";
import windshieldChipCountQuestion from"@/layouts/vehicle-damage/windshield-options/windshield-chip-count-question/windshield-chip-count-question"; import windshieldChipCountQuestion from"@/layouts/vehicle-damage/windshield-options/windshield-chip-count-question/windshield-chip-count-question";
import replaceOptionsQuestion from"@/layouts/vehicle-damage/replace-options-question/replace-options-question"; import replaceOptionsQuestion from"@/layouts/vehicle-damage/replace-options-question/replace-options-question";
import { defineRule } from "vee-validate";
// DEFINE VALIDATION RULES
defineRule("windshield-damage-type-required", (value) => {
console.log('windshield-damage-type-required, value: ', value);
if (!value || value.length < 1) {
return "Please select windshield damage";
}
return true;
});
defineRule("checkForRepairAndReplace", (value, [other]) => {
console.log('checkForRepairAndReplace, value: ', value, ' / other: ', other);
if (value.toString().toUpperCase().includes("REPAIR") && other.toString().toUpperCase().includes("WINDSHIELD") && other.length > 1) {
return "checkForRepairAndReplace error"
}
return true;
});
defineRule("windshield-chip-count-required", (value) => {
if (!value || value.length < 1) {
return "Please select chip(s)";
}
return true;
});
defineRule("windshield-replace-options-required", (value) => {
if (!value || value.length < 1) {
return "Please select windshield part";
}
return true;
});
export default ({ export default ({
name: "windshieldOptions", name: "windshieldOptions",

View file

@ -1,9 +1,7 @@
<template> <template>
<div <div
class="list-group list-button-horizontal d-flex flex-column w-100 mb-2" class="list-group list-button-horizontal d-flex flex-column w-100 mb-2"
:class="hasError ? 'has-error' : ''" :class="[errors.length > 0 ? 'has-error' : '', hasError ? 'has-error' : '']"
@mouseup="handleClick(value)"
@keyup.space="handleClick(value)"
> >
<input <input
:type="isMultiSelect ? 'checkbox' : 'radio'" :type="isMultiSelect ? 'checkbox' : 'radio'"
@ -12,6 +10,7 @@
:value="value" :value="value"
:aria-required="isRequired" :aria-required="isRequired"
:data-focus-target="groupName" :data-focus-target="groupName"
@click="handleChange(value)"
v-model="checkValue" v-model="checkValue"
@change="!selectingInitiatesLoad ? handleCheckChange() : ''" @change="!selectingInitiatesLoad ? handleCheckChange() : ''"
/> />
@ -46,7 +45,6 @@
</template> </template>
<script> <script>
import { toRefs } from "vue";
import { useField } from "vee-validate"; import { useField } from "vee-validate";
import loader from "@/ux-components/loader/loader"; import loader from "@/ux-components/loader/loader";
@ -69,6 +67,7 @@ export default {
type: String, type: String,
default: "", default: "",
}, },
validationRules: String,
selectedValues: [Array, String], selectedValues: [Array, String],
hasError: Boolean, hasError: Boolean,
}, },
@ -105,20 +104,26 @@ export default {
loader, loader,
}, },
setup(props) { setup(props) {
const { groupName, value } = toRefs(props);
const inputType = props.isMultiSelect ? "checkbox" : "radio"; const inputType = props.isMultiSelect ? "checkbox" : "radio";
const { checked, handleChange, errorMessage } = useField( const fieldOptions = {
groupName, type: inputType,
undefined, checkedValue: props.value,
{ };
type: inputType,
checkedValue: value, if (Array.isArray(props.selectedValues) && props.selectedValues.length == 1) {
} console.log('p r o p s . s el ectedV al ues, props.selectedValues: ', props.selectedValues)
); fieldOptions['initialValue'] = fieldOptions.checkedValue;
}
const {
checked,
handleChange,
errors,
} = useField(props.groupName, props.validationRules, fieldOptions);
return { return {
checked, checked,
handleChange, handleChange,
errorMessage, errors,
}; };
}, },
}; };

View file

@ -1,9 +1,7 @@
<template> <template>
<div <div
class="list-group list-button d-flex flex-column w-100 mb-2" class="list-group list-button d-flex flex-column w-100 mb-2"
:class="hasError ? 'has-error' : ''" :class="[errors.length > 0 ? 'has-error' : '', hasError ? 'has-error' : '']"
@mouseup="handleClick(value)"
@keyup.space="handleClick(value)"
> >
<input <input
:type="isMultiSelect ? 'checkbox' : 'radio'" :type="isMultiSelect ? 'checkbox' : 'radio'"
@ -12,6 +10,7 @@
:value="value" :value="value"
:aria-required="isRequired" :aria-required="isRequired"
:data-focus-target="groupName" :data-focus-target="groupName"
@click="handleChange(value)"
v-model="checkValue" v-model="checkValue"
@change="!selectingInitiatesLoad ? handleCheckChange() : ''" @change="!selectingInitiatesLoad ? handleCheckChange() : ''"
> >
@ -49,9 +48,9 @@
</template> </template>
<script> <script>
import { toRefs } from "vue";
import { useField } from "vee-validate"; import { useField } from "vee-validate";
import loader from "@/ux-components/loader/loader"; import loader from "@/ux-components/loader/loader";
export default { export default {
name: "listButton", name: "listButton",
props: { props: {
@ -71,6 +70,7 @@ export default {
type: [String, Number], type: [String, Number],
default: "", default: "",
}, },
validationRules: String,
selectedValues: [Array, String], selectedValues: [Array, String],
hasError: Boolean, hasError: Boolean,
}, },
@ -107,20 +107,26 @@ export default {
loader, loader,
}, },
setup(props) { setup(props) {
const { groupName, value } = toRefs(props);
const inputType = props.isMultiSelect ? "checkbox" : "radio"; const inputType = props.isMultiSelect ? "checkbox" : "radio";
const { checked, handleChange, errorMessage } = useField( const fieldOptions = {
groupName, type: inputType,
undefined, checkedValue: props.value,
{ };
type: inputType,
checkedValue: value, if (Array.isArray(props.selectedValues) && props.selectedValues.length == 1) {
} console.log('p r o p s . s el ectedV al ues, props.selectedValues: ', props.selectedValues)
); fieldOptions['initialValue'] = fieldOptions.checkedValue;
}
const {
checked,
handleChange,
errors,
} = useField(props.groupName, props.validationRules, fieldOptions);
return { return {
checked, checked,
handleChange, handleChange,
errorMessage, errors,
}; };
}, },
}; };

View file

@ -13,8 +13,10 @@
:data-focus-target="groupName" :data-focus-target="groupName"
@click="handleChange(value)" @click="handleChange(value)"
v-model="checkValue" v-model="checkValue"
@change="handleCheckChange()" @change="handleCheckChange(value)"
/> />
value: {{ value }}
checkValue: {{ checkValue }}
<label <label
:for="buttonID" :for="buttonID"
class="d-flex w-100 align-items-center px-2 h-100" class="d-flex w-100 align-items-center px-2 h-100"
@ -75,12 +77,13 @@ export default {
}, },
data(){ data(){
return { return {
checkValue: Boolean, checkValue: [Boolean, String],
} }
}, },
created(){ created(){
if(Array.isArray(this.selectedValues)){ if(Array.isArray(this.selectedValues)){
this.checkValue = this.isMultiSelect ? this.selectedValues.includes(this.value) : this.selectedValues[0]; this.checkValue = this.isMultiSelect ? this.selectedValues.includes(this.value) : this.selectedValues[0];
console.log('=================== this.checkValue: ', this.checkValue)
} }
}, },
computed: { computed: {
@ -98,6 +101,9 @@ export default {
}, },
methods: { methods: {
handleCheckChange(newValue, oldValue){ handleCheckChange(newValue, oldValue){
// console.log('LC handleCheckChange... oldValue: ', oldValue);
// console.log('LC handleCheckChange... newValue: ', newValue);
const isInitialization = typeof(oldValue) === 'function'; const isInitialization = typeof(oldValue) === 'function';
if (!isInitialization) { if (!isInitialization) {
this.$emit('isCheckedChanged', { checkValue: this.checkValue, value: this.value.toString() }); this.$emit('isCheckedChanged', { checkValue: this.checkValue, value: this.value.toString() });
@ -105,22 +111,42 @@ export default {
} }
}, },
setup(props) { setup(props) {
console.log('RUNNING setup... ... ... props.validationRules: ', props.validationRules)
console.log('RUNNING setup... ... ... props.value: ', props.value)
console.log('RUNNING setup... ... ... props.selectedValues: ', props.selectedValues)
const inputType = props.isMultiSelect ? "checkbox" : "radio"; const inputType = props.isMultiSelect ? "checkbox" : "radio";
const { // const { selectedValues, value } = toRefs(props);
value: inputValue, // console.log('XXXXXXX selectedValues: ', selectedValues)
handleChange, // console.log('XXXXXXX value: ', value)
errors,
} = useField(props.groupName, props.validationRules, const fieldOptions = {
{
type: inputType, type: inputType,
checkedValue: props.value, checkedValue: props.value,
}); };
if (Array.isArray(props.selectedValues) && props.selectedValues.length == 1) {
console.log('p r o p s . s el ectedV al ues, props.selectedValues: ', props.selectedValues)
fieldOptions['initialValue'] = fieldOptions.checkedValue;
}
const {
handleChange,
errors,
} = useField(props.groupName, props.validationRules, fieldOptions);
return { return {
handleChange, handleChange,
errors, errors,
}; };
}, },
// watch: {
// checkValue(val) {
// console.log('LC > CHANGE in checkValue, val: ', val)
// // this.handleChange()
// }
// },
}; };
</script> </script>