Skip to content

Commit

Permalink
Create components for each survey element
Browse files Browse the repository at this point in the history
  • Loading branch information
henrycatalinismith committed Nov 11, 2023
1 parent 662fc2c commit 6c46a81
Show file tree
Hide file tree
Showing 5 changed files with 120 additions and 21 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ test.describe('User submitting a survey', () => {
`${appUri}/o/${KPDMembershipSurvey.organization.id}/surveys/${KPDMembershipSurvey.id}`
);

await page.fill('input', 'Topple capitalism');
await page.fill('input[name="2.text"]', 'Topple capitalism');
await Promise.all([
page.click('text=Submit'),
page.waitForResponse((res) => res.request().method() == 'POST'),

Check failure on line 50 in integrationTesting/tests/organize/surveys/submitting-survey.spec.ts

View workflow job for this annotation

GitHub Actions / playwright-test / Test (18, ubuntu-latest)

tests/organize/surveys/submitting-survey.spec.ts:14:3 › User submitting a survey › submits data successfully

1) tests/organize/surveys/submitting-survey.spec.ts:14:3 › User submitting a survey › submits data successfully page.waitForResponse: Page closed 48 | await Promise.all([ 49 | page.click('text=Submit'), > 50 | page.waitForResponse((res) => res.request().method() == 'POST'), | ^ 51 | ]); 52 | 53 | const reqLog = moxy.log(`/v1${apiPostPath}`); at /home/runner/work/app.zetkin.org/app.zetkin.org/integrationTesting/tests/organize/surveys/submitting-survey.spec.ts:50:12
Expand Down
70 changes: 70 additions & 0 deletions src/features/surveys/components/surveyForm/OptionsQuestion.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
import { FC } from 'react';
import {
Checkbox,
FormControl,
FormControlLabel,
FormGroup,
FormLabel,
MenuItem,
Radio,
RadioGroup,
Select,
} from '@mui/material';
import {
ZetkinSurveyOption,
ZetkinSurveyOptionsQuestionElement,
} from 'utils/types/zetkin';

const OptionsQuestion: FC<{ element: ZetkinSurveyOptionsQuestionElement }> = ({
element,
}) => {
return (
<FormControl>
<FormLabel id="demo-radio-buttons-group-label">
{element.question.question}
</FormLabel>
{element.question.response_config.widget_type === 'checkbox' && (
<FormGroup aria-labelledby="demo-radio-buttons-group-label">
{element.question.options!.map((option: ZetkinSurveyOption) => (
<FormControlLabel
key={option.id}
control={<Checkbox />}
label={option.text}
name={`${element.id}.options`}
value={option.id}
/>
))}
</FormGroup>
)}
{element.question.response_config.widget_type === 'radio' && (
<RadioGroup
aria-labelledby="demo-radio-buttons-group-label"
name={`${element.id}.options`}
>
{element.question.options!.map((option: ZetkinSurveyOption) => (
<FormControlLabel
key={option.id}
control={<Radio />}
label={option.text}
value={option.id}
/>
))}
</RadioGroup>
)}
{element.question.response_config.widget_type === 'select' && (
<Select
aria-labelledby="demo-radio-buttons-group-label"
name={`${element.id}.options`}
>
{element.question.options!.map((option: ZetkinSurveyOption) => (
<MenuItem key={option.id} value={option.id}>
{option.text}
</MenuItem>
))}
</Select>
)}
</FormControl>
);
};

export default OptionsQuestion;
8 changes: 8 additions & 0 deletions src/features/surveys/components/surveyForm/TextBlock.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import { FC } from 'react';
import { ZetkinSurveyTextElement } from 'utils/types/zetkin';

const TextBlock: FC<{ element: ZetkinSurveyTextElement }> = ({ element }) => {
return <p>{element.text_block.content}</p>;
};

export default TextBlock;
22 changes: 22 additions & 0 deletions src/features/surveys/components/surveyForm/TextQuestion.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
import { FC } from 'react';
import { ZetkinSurveyTextQuestionElement } from 'utils/types/zetkin';
import { FormControl, FormLabel, TextField } from '@mui/material';

const OptionsQuestion: FC<{ element: ZetkinSurveyTextQuestionElement }> = ({
element,
}) => {
return (
<FormControl>
<FormLabel id="demo-radio-buttons-group-label">
{element.question.question}
</FormLabel>
<TextField
id={`input-${element.id}`}
name={`${element.id}.text`}
type="text"
/>
</FormControl>
);
};

export default OptionsQuestion;
39 changes: 19 additions & 20 deletions src/pages/o/[orgId]/surveys/[surveyId]/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,15 @@ import { IncomingMessage } from 'http';
import messageIds from 'features/surveys/l10n/messageIds';
import { parse } from 'querystring';
import { scaffold } from 'utils/next';
import {
ZetkinSurveyOptionsQuestionElement,
ZetkinSurveyTextElement,
ZetkinSurveyTextQuestionElement,
} from 'utils/types/zetkin';

import OptionsQuestion from 'features/surveys/components/surveyForm/OptionsQuestion';
import TextBlock from 'features/surveys/components/surveyForm/TextBlock';
import TextQuestion from 'features/surveys/components/surveyForm/TextQuestion';
import useSurvey from 'features/surveys/hooks/useSurvey';
import useSurveyElements from 'features/surveys/hooks/useSurveyElements';
import ZUIAvatar from 'zui/ZUIAvatar';
Expand Down Expand Up @@ -145,32 +154,22 @@ const Page: FC<PageProps> = ({ orgId, surveyId }) => {
{(elements.data || []).map((element) => (
<div key={element.id}>
{element.type === 'question' && (
<Box display="flex" flexDirection="column" maxWidth={256}>
<label htmlFor={`input-${element.id}`}>
{element.question.question}
</label>
<>
{element.question.response_type === 'text' && (
<input
id={`input-${element.id}`}
name={`${element.id}.text`}
type="text"
<TextQuestion
element={element as ZetkinSurveyTextQuestionElement}
/>
)}
{element.question.response_type === 'options' && (
<select
id={`input-${element.id}`}
name={`${element.id}.options`}
>
{element.question.options!.map((option) => (
<option key={option.id} value={option.id}>
{option.text}
</option>
))}
</select>
<OptionsQuestion
element={element as ZetkinSurveyOptionsQuestionElement}
/>
)}
</Box>
</>
)}
{element.type === 'text' && (
<TextBlock element={element as ZetkinSurveyTextElement} />
)}
{element.type === 'text' && <p>{element.text_block.content}</p>}
</div>
))}
<FormControlLabel
Expand Down

0 comments on commit 6c46a81

Please sign in to comment.