diff --git a/apps/web/app/(app)/environments/[environmentId]/surveys/[surveyId]/edit/LogicEditor.tsx b/apps/web/app/(app)/environments/[environmentId]/surveys/[surveyId]/edit/LogicEditor.tsx index 58780a0877..7bea427e73 100644 --- a/apps/web/app/(app)/environments/[environmentId]/surveys/[surveyId]/edit/LogicEditor.tsx +++ b/apps/web/app/(app)/environments/[environmentId]/surveys/[surveyId]/edit/LogicEditor.tsx @@ -241,15 +241,18 @@ export default function LogicEditor({ - {conditions[question.type].map((condition) => ( - - {logicConditions[condition].label} - - ))} + {conditions[question.type].map( + (condition) => + !(question.required && condition === "skipped") && ( + + {logicConditions[condition].label} + + ) + )} diff --git a/apps/web/app/(app)/environments/[environmentId]/surveys/[surveyId]/edit/SurveyMenuBar.tsx b/apps/web/app/(app)/environments/[environmentId]/surveys/[surveyId]/edit/SurveyMenuBar.tsx index d08d2875da..b1a32c9296 100644 --- a/apps/web/app/(app)/environments/[environmentId]/surveys/[surveyId]/edit/SurveyMenuBar.tsx +++ b/apps/web/app/(app)/environments/[environmentId]/surveys/[surveyId]/edit/SurveyMenuBar.tsx @@ -15,6 +15,7 @@ import { useRouter } from "next/navigation"; import { useEffect, useState } from "react"; import toast from "react-hot-toast"; import { validateQuestion } from "./Validation"; +import { QuestionType } from "@formbricks/types/questions"; interface SurveyMenuBarProps { localSurvey: Survey; @@ -124,13 +125,26 @@ export default function SurveyMenuBar({ return false; } existingQuestionIds.add(question.id); - for (const logic of question.logic || []) { - if (question.required && logic.condition === "skipped") { - setInvalidQuestions([question.id]); - toast.error("Your logic jumps a required question. Please update the logic settings."); + + if ( + question.type === QuestionType.MultipleChoiceSingle || + question.type === QuestionType.MultipleChoiceMulti + ) { + const haveSameChoices = + question.choices.some((element) => element.label.trim() === "") || + question.choices.some((element, index) => + question.choices + .slice(index + 1) + .some((nextElement) => nextElement.label.trim() === element.label.trim()) + ); + + if (haveSameChoices) { + toast.error("You have 2 same choices. Please update or delete one."); return false; } + } + for (const logic of question.logic || []) { const validFields = ["condition", "destination", "value"].filter( (field) => logic[field] !== undefined ).length; @@ -141,6 +155,11 @@ export default function SurveyMenuBar({ return false; } + if (question.required && logic.condition === "skipped") { + toast.error("You have a missing logic condition. Please update or delete it."); + return false; + } + const thisLogic = `${logic.condition}-${logic.value}`; if (existingLogicConditions.has(thisLogic)) { setInvalidQuestions([question.id]); diff --git a/apps/web/app/(app)/environments/[environmentId]/surveys/[surveyId]/edit/Validation.ts b/apps/web/app/(app)/environments/[environmentId]/surveys/[surveyId]/edit/Validation.ts index 1835e1b360..35261f0017 100644 --- a/apps/web/app/(app)/environments/[environmentId]/surveys/[surveyId]/edit/Validation.ts +++ b/apps/web/app/(app)/environments/[environmentId]/surveys/[surveyId]/edit/Validation.ts @@ -9,24 +9,10 @@ import { const validationRules = { multipleChoiceMulti: (question: MultipleChoiceMultiQuestion) => { - return !( - question.choices.some((element) => element.label.trim() === "") || - question.choices.some((element, index) => - question.choices - .slice(index + 1) - .some((nextElement) => nextElement.label.trim() === element.label.trim()) - ) - ); + return !question.choices.some((element) => element.label.trim() === ""); }, multipleChoiceSingle: (question: MultipleChoiceSingleQuestion) => { - return !( - question.choices.some((element) => element.label.trim() === "") || - question.choices.some((element, index) => - question.choices - .slice(index + 1) - .some((nextElement) => nextElement.label.trim() === element.label.trim()) - ) - ); + return !question.choices.some((element) => element.label.trim() === ""); }, consent: (question: ConsentQuestion) => { return question.label.trim() !== "";