diff --git a/apps/web/app/environments/[environmentId]/surveys/[surveyId]/edit/MultipleChoiceSingleForm.tsx b/apps/web/app/environments/[environmentId]/surveys/[surveyId]/edit/MultipleChoiceSingleForm.tsx index 515a34c7d8..57f76e9b78 100644 --- a/apps/web/app/environments/[environmentId]/surveys/[surveyId]/edit/MultipleChoiceSingleForm.tsx +++ b/apps/web/app/environments/[environmentId]/surveys/[surveyId]/edit/MultipleChoiceSingleForm.tsx @@ -1,7 +1,7 @@ import type { MultipleChoiceSingleQuestion } from "@formbricks/types/questions"; import { Survey } from "@formbricks/types/surveys"; import { Button, Input, Label } from "@formbricks/ui"; -import { TrashIcon } from "@heroicons/react/24/solid"; +import { TrashIcon, PlusIcon } from "@heroicons/react/24/solid"; import { createId } from "@paralleldrive/cuid2"; import { cn } from "@formbricks/lib/cn"; @@ -31,13 +31,18 @@ export default function MultipleChoiceSingleForm({ updateQuestion(questionIdx, { choices: newChoices }); }; - const addChoice = () => { + const addChoice = (choiceIdx?: number) => { let newChoices = !question.choices ? [] : question.choices; const otherChoice = newChoices.find((choice) => choice.id === "other"); if (otherChoice) { newChoices = newChoices.filter((choice) => choice.id !== "other"); } - newChoices.push({ id: createId(), label: "" }); + const newChoice = { id: createId(), label: "" }; + if (choiceIdx !== undefined) { + newChoices.splice(choiceIdx + 1, 0, newChoice); + } else { + newChoices.push(newChoice); + } if (otherChoice) { newChoices.push(otherChoice); } @@ -84,17 +89,23 @@ export default function MultipleChoiceSingleForm({ -
- -
- updateQuestion(questionIdx, { subheader: e.target.value })} - /> + {question.subheader && ( +
+ +
+ updateQuestion(questionIdx, { subheader: e.target.value })} + /> + updateQuestion(questionIdx, { subheader: "" })} + /> +
-
+ )}
@@ -116,15 +127,15 @@ export default function MultipleChoiceSingleForm({ onClick={() => deleteChoice(choiceIdx)} /> )} + addChoice(choiceIdx)} + />
))}
- {question.choices.filter((c) => c.id === "other").length === 0 && ( <> -

or

@@ -133,19 +144,6 @@ export default function MultipleChoiceSingleForm({
- -
- -
- updateQuestion(questionIdx, { buttonLabel: e.target.value })} - /> -
-
); } diff --git a/apps/web/app/environments/[environmentId]/surveys/[surveyId]/edit/QuestionCard.tsx b/apps/web/app/environments/[environmentId]/surveys/[surveyId]/edit/QuestionCard.tsx index f4cc14802a..0ead1a7ff4 100644 --- a/apps/web/app/environments/[environmentId]/surveys/[surveyId]/edit/QuestionCard.tsx +++ b/apps/web/app/environments/[environmentId]/surveys/[surveyId]/edit/QuestionCard.tsx @@ -5,7 +5,7 @@ import { getQuestionTypeName } from "@/lib/questions"; import { cn } from "@formbricks/lib/cn"; import type { Question } from "@formbricks/types/questions"; import type { Survey } from "@formbricks/types/surveys"; -import { Label, Switch } from "@formbricks/ui"; +import { Input, Label, Switch } from "@formbricks/ui"; import { ChatBubbleBottomCenterTextIcon, ChevronDownIcon, @@ -24,7 +24,7 @@ import MultipleChoiceMultiForm from "./MultipleChoiceMultiForm"; import MultipleChoiceSingleForm from "./MultipleChoiceSingleForm"; import NPSQuestionForm from "./NPSQuestionForm"; import OpenQuestionForm from "./OpenQuestionForm"; -import QuestionDropdown from "./QuestionDropdown"; +import QuestionDropdown from "./QuestionMenu"; import RatingQuestionForm from "./RatingQuestionForm"; import UpdateQuestionId from "./UpdateQuestionId"; @@ -116,19 +116,6 @@ export default function QuestionCard({
- {open && ( -
- - { - e.stopPropagation(); - updateQuestion(questionIdx, { required: !question.required }); - }} - /> -
- )} ) : null}
- {openAdvanced ? ( @@ -207,6 +188,24 @@ export default function QuestionCard({ +
+ +
+ updateQuestion(questionIdx, { buttonLabel: e.target.value })} + /> +
+
+
+
+ {open && ( +
+ + { + e.stopPropagation(); + updateQuestion(questionIdx, { required: !question.required }); + }} + /> +
+ )} +
)} diff --git a/apps/web/app/environments/[environmentId]/surveys/[surveyId]/edit/QuestionDropdown.tsx b/apps/web/app/environments/[environmentId]/surveys/[surveyId]/edit/QuestionDropdown.tsx deleted file mode 100644 index 88a47ea78b..0000000000 --- a/apps/web/app/environments/[environmentId]/surveys/[surveyId]/edit/QuestionDropdown.tsx +++ /dev/null @@ -1,71 +0,0 @@ -"use client"; - -import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from "@formbricks/ui"; -import { - EllipsisHorizontalIcon, - ArrowUpIcon, - ArrowDownIcon, - TrashIcon, - DocumentDuplicateIcon, -} from "@heroicons/react/24/solid"; - -interface QuestionDropdownProps { - questionIdx: number; - lastQuestion: boolean; - duplicateQuestion: (questionIdx: number) => void; - deleteQuestion: (questionIdx: number) => void; - moveQuestion: (questionIdx: number, up: boolean) => void; -} - -export default function QuestionDropdown({ - questionIdx, - lastQuestion, - duplicateQuestion, - deleteQuestion, - moveQuestion, -}: QuestionDropdownProps) { - return ( - - - - - - { - e.stopPropagation(); - moveQuestion(questionIdx, true); - }} - disabled={questionIdx == 0}> - Move up - - { - e.stopPropagation(); - moveQuestion(questionIdx, false); - }} - disabled={lastQuestion}> - Move down - - - { - e.stopPropagation(); - duplicateQuestion(questionIdx); - }}> - Duplicate - - { - e.stopPropagation(); - deleteQuestion(questionIdx); - }}> - Delete - - - - ); -} diff --git a/apps/web/app/environments/[environmentId]/surveys/[surveyId]/edit/QuestionMenu.tsx b/apps/web/app/environments/[environmentId]/surveys/[surveyId]/edit/QuestionMenu.tsx new file mode 100644 index 0000000000..e521dd8f7c --- /dev/null +++ b/apps/web/app/environments/[environmentId]/surveys/[surveyId]/edit/QuestionMenu.tsx @@ -0,0 +1,56 @@ +"use client"; + +import { ArrowUpIcon, ArrowDownIcon, TrashIcon, DocumentDuplicateIcon } from "@heroicons/react/24/solid"; + +interface QuestionDropdownProps { + questionIdx: number; + lastQuestion: boolean; + duplicateQuestion: (questionIdx: number) => void; + deleteQuestion: (questionIdx: number) => void; + moveQuestion: (questionIdx: number, up: boolean) => void; +} + +export default function QuestionActions({ + questionIdx, + lastQuestion, + duplicateQuestion, + deleteQuestion, + moveQuestion, +}: QuestionDropdownProps) { + return ( +
+ { + if (questionIdx !== 0) { + e.stopPropagation(); + moveQuestion(questionIdx, true); + } + }} + /> + { + if (!lastQuestion) { + e.stopPropagation(); + moveQuestion(questionIdx, false); + } + }} + /> + { + e.stopPropagation(); + duplicateQuestion(questionIdx); + }} + /> + { + e.stopPropagation(); + deleteQuestion(questionIdx); + }} + /> +
+ ); +}