Je suis encore très novice en matière de Javascript et de développement de logiciels en général, car il s'agit de mon premier emploi, et je suis actuellement en train de déboguer un défaut critique lié à la validation.
J'ai un scénario dans lequel j'ai un tableau, et dans ce tableau chaque produit a un attribut intitulé Volume unitaire avec un code ASC_Sales_Volume.
Le défaut actuel est que lorsqu'un utilisateur configure plus d'un produit, mais en laisse un avec un volume unitaire de zéro, l'utilisateur est toujours autorisé à naviguer vers la page suivante bien qu'il y ait un contrôle de validation en place pour empêcher cela. La condition qui empêcherait l'utilisateur d'avancer est la suivante $scope.bpTree.response.errorCheckVolume = true .
Avec ce qui est actuellement écrit par l'ancien développeur, la boucle forEach continue de changer le $scope.bpTree.response.errorCheckVolume en faux lorsque l'utilisateur clique sur le bouton pour déclencher les fonctions.
Le bouton Next lui-même est un composant OOTB que je ne peux pas modifier directement.
Quelle serait la prochaine étape pour résoudre ce problème ? En fait, lorsque le forEach évalue un produit dont le volume unitaire est égal à 0, le paramètre $scope.bpTree.response.errorCheckVolume doit toujours être égal à true, quelles que soient les valeurs de volume unitaire ultérieures, jusqu'à ce que l'utilisateur modifie la valeur du volume unitaire pour ce produit particulier, puis clique sur le bouton Next et que la logique s'enclenche à nouveau. Si les enregistrements d'erreur (c'est-à-dire tout produit du tableau dont le volume unitaire est égal à 0) sont supérieurs à zéro, errorCheckVolume doit toujours être égal à true et l'utilisateur ne doit pas pouvoir progresser.
Est-ce que j'utiliserais quelque chose de similaire à Array.prototype.some() ? J'ai regardé mon écran pendant des heures en essayant différentes choses en vain.
Voici l'extrait de code :
function validateAllPlansUnitVolume(triggeredFromNextBtn) {
var coveragesData = $scope.sortedCoverages[$scope.childProduct.instanceKey || $scope.childProduct.productName || $scope.childProduct.Name],
errorRecords = checkForInvalidPlans(coveragesData, triggeredFromNextBtn);
if(errorRecords > 0) {
$scope.bpTree.response.errorCheckVolume = true;
}
else {
$scope.bpTree.response.errorCheckVolume = false;
}
}
function checkForInvalidPlans(coveragesData, triggeredFromNextBtn){
if(!!coveragesData && coveragesData.length) {
coveragesData.forEach(function(product){
if(!!product.attributeCategories){
unitVolumeAttrNodes = product.attributeCategories.records[0].productAttributes.records.filter((ele) => ele.code == "ASC_Sales_Volume");
if(!!unitVolumeAttrNodes && unitVolumeAttrNodes.length){
unitVolumeAttrNodes.forEach(function(attrNode){
if(unitVolumeAttrNodes[0].userValues === 0){
$scope.bpTree.response.errorCheckVolume = true;
product.unitVolumeErr = true;
product.unitVolumeErrMsg = "Unit Volume cannot be zero. Please update before proceeding to the next screen";
}
else {
product.unitVolumeErrMsg = "";
product.unitVolumeErr = false;
$scope.bpTree.response.errorCheckVolume = false;
}
});
}
}
});
return coveragesData.filter((ele) => ele.unitVolumeErr).length;
}
return 0;
}