-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #84 from manh-t/feature/30-integrate-question-page
[#30] Fill the data into the Question page
- Loading branch information
Showing
17 changed files
with
443 additions
and
65 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,112 @@ | ||
import React from 'react'; | ||
|
||
import { render, screen } from '@testing-library/react'; | ||
|
||
import { appSliderDataTestIds } from 'components/AppSlider'; | ||
import { dropdownDataTestIds } from 'components/Dropdown'; | ||
import { multiChoiceDataTestIds } from 'components/MultiChoice'; | ||
import { multiInputsDataTestIds } from 'components/MultiInputs'; | ||
import { npsDataTestIds } from 'components/Nps'; | ||
import { ratingDataTestIds } from 'components/Rating'; | ||
import { textAreaDataTestIds } from 'components/TextArea'; | ||
import { questionFabricator } from 'tests/fabricator'; | ||
|
||
import Answer, { answerDataTestIds } from '.'; | ||
|
||
describe('Answer', () => { | ||
describe('given the display type is star', () => { | ||
it('renders Rating component', () => { | ||
const question = questionFabricator(); | ||
|
||
render(<Answer question={question} />); | ||
|
||
const star = screen.getByTestId(ratingDataTestIds.base); | ||
|
||
expect(star).toBeVisible(); | ||
}); | ||
}); | ||
|
||
describe('given the display type is choice', () => { | ||
it('renders MultiChoice component', () => { | ||
const question = questionFabricator({ displayType: 'choice' }); | ||
|
||
render(<Answer question={question} />); | ||
|
||
const multiChoice = screen.getByTestId(multiChoiceDataTestIds.base); | ||
|
||
expect(multiChoice).toBeVisible(); | ||
}); | ||
}); | ||
|
||
describe('given the display type is nps', () => { | ||
it('renders Nps component', () => { | ||
const question = questionFabricator({ displayType: 'nps' }); | ||
|
||
render(<Answer question={question} />); | ||
|
||
const nps = screen.getByTestId(npsDataTestIds.base); | ||
|
||
expect(nps).toBeVisible(); | ||
}); | ||
}); | ||
|
||
describe('given the display type is textarea', () => { | ||
it('renders TextArea component', () => { | ||
const question = questionFabricator({ displayType: 'textarea' }); | ||
|
||
render(<Answer question={question} />); | ||
|
||
const textArea = screen.getByTestId(textAreaDataTestIds.base); | ||
|
||
expect(textArea).toBeVisible(); | ||
}); | ||
}); | ||
|
||
describe('given the display type is textfield', () => { | ||
it('renders MultiInputs component', () => { | ||
const question = questionFabricator({ displayType: 'textfield' }); | ||
|
||
render(<Answer question={question} />); | ||
|
||
const multiInputs = screen.getByTestId(multiInputsDataTestIds.base); | ||
|
||
expect(multiInputs).toBeVisible(); | ||
}); | ||
}); | ||
|
||
describe('given the display type is dropdown', () => { | ||
it('renders Dropdown component', () => { | ||
const question = questionFabricator({ displayType: 'dropdown' }); | ||
|
||
render(<Answer question={question} />); | ||
|
||
const dropdown = screen.getByTestId(dropdownDataTestIds.base); | ||
|
||
expect(dropdown).toBeVisible(); | ||
}); | ||
}); | ||
|
||
describe('given the display type is slider', () => { | ||
it('renders Dropdown component', () => { | ||
const question = questionFabricator({ displayType: 'slider' }); | ||
|
||
render(<Answer question={question} />); | ||
|
||
const slider = screen.getByTestId(appSliderDataTestIds.base); | ||
|
||
expect(slider).toBeVisible(); | ||
}); | ||
}); | ||
|
||
describe('given the display type is intro', () => { | ||
it('does NOT render any components', () => { | ||
const question = questionFabricator({ displayType: 'intro' }); | ||
|
||
render(<Answer question={question} />); | ||
|
||
const intro = screen.getByTestId(answerDataTestIds.base); | ||
|
||
expect(intro).toBeEmptyDOMElement(); | ||
}); | ||
}); | ||
}); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,68 @@ | ||
import React from 'react'; | ||
|
||
import AppSlider from 'components/AppSlider'; | ||
import Dropdown from 'components/Dropdown'; | ||
import MultiChoice from 'components/MultiChoice'; | ||
import MultiInputs from 'components/MultiInputs'; | ||
import Nps from 'components/Nps'; | ||
import Rating from 'components/Rating'; | ||
import TextArea from 'components/TextArea'; | ||
import { Answer as AnswerType } from 'types/answer'; | ||
import { DisplayType, Question, getDisplayTypeEnum } from 'types/question'; | ||
import { AnswerRequest } from 'types/request/surveySubmitRequest'; | ||
|
||
export const answerDataTestIds = { | ||
base: 'answer__base', | ||
}; | ||
|
||
interface AnswerProps { | ||
question: Question; | ||
} | ||
const Answer = ({ question }: AnswerProps): JSX.Element => { | ||
const displayTypeEnum = getDisplayTypeEnum(question); | ||
|
||
const onValueChanged = (answer: number | AnswerType | AnswerRequest) => { | ||
// TODO | ||
console.log(answer); | ||
}; | ||
|
||
const onValuesChanged = (answers: AnswerType[] | AnswerRequest[]) => { | ||
// TODO | ||
console.log(answers); | ||
}; | ||
|
||
const answerComponent = (): JSX.Element => { | ||
switch (displayTypeEnum) { | ||
case DisplayType.Heart: | ||
case DisplayType.Smiley: | ||
case DisplayType.Thumbs: | ||
case DisplayType.Star: | ||
return <Rating items={question.answers} displayType={displayTypeEnum} onValueChanged={onValueChanged} />; | ||
case DisplayType.Choice: | ||
return <MultiChoice items={question.answers} isPickOne={question?.pick === 'one'} onValuesChanged={onValuesChanged} />; | ||
case DisplayType.Nps: | ||
return <Nps items={question.answers} onValuesChanged={onValuesChanged} />; | ||
case DisplayType.Textarea: | ||
return <TextArea items={question.answers} onValueChange={onValueChanged} />; | ||
case DisplayType.Textfield: | ||
return <MultiInputs questionId={question.id} items={question.answers} onValuesChanged={onValuesChanged} />; | ||
case DisplayType.Dropdown: | ||
return <Dropdown items={question.answers} onValueChanged={onValueChanged} />; | ||
case DisplayType.Slider: | ||
return <AppSlider min={0} max={question.answers.length} onValueChanged={onValueChanged} />; | ||
case DisplayType.Unknown: | ||
case DisplayType.Intro: | ||
case DisplayType.Outro: | ||
default: | ||
return <></>; | ||
} | ||
}; | ||
|
||
return ( | ||
<div key={question.id} data-test-id={answerDataTestIds.base}> | ||
{answerComponent()} | ||
</div> | ||
); | ||
}; | ||
|
||
export default Answer; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,30 @@ | ||
import React from 'react'; | ||
|
||
import { render, screen, within } from '@testing-library/react'; | ||
|
||
import { answerFabricator } from 'tests/fabricator'; | ||
|
||
import MultiInputs, { multiInputsDataTestIds } from '.'; | ||
|
||
describe('MultiInputs', () => { | ||
it('renders a multi inputs component', () => { | ||
const answers = answerFabricator.times(3); | ||
|
||
render( | ||
<MultiInputs | ||
questionId="question id" | ||
items={answers} | ||
onValuesChanged={() => { | ||
// Do nothing | ||
}} | ||
/> | ||
); | ||
|
||
const multiInputs = screen.getByTestId(multiInputsDataTestIds.base); | ||
|
||
expect(multiInputs).toBeVisible(); | ||
expect(within(multiInputs).getByPlaceholderText(answers[0].text)).toBeVisible(); | ||
expect(within(multiInputs).getByPlaceholderText(answers[1].text)).toBeVisible(); | ||
expect(within(multiInputs).getByPlaceholderText(answers[2].text)).toBeVisible(); | ||
}); | ||
}); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,48 @@ | ||
import React, { useState } from 'react'; | ||
|
||
import TextInput from 'components/TextInput'; | ||
import { Answer } from 'types/answer'; | ||
import { AnswerRequest } from 'types/request/surveySubmitRequest'; | ||
|
||
export const multiInputsDataTestIds = { | ||
base: 'multi-inputs__base', | ||
}; | ||
|
||
interface MultiInputProps { | ||
questionId: string; | ||
items: Answer[]; | ||
onValuesChanged: (answers: AnswerRequest[]) => void; | ||
} | ||
const MultiInputs = ({ items, onValuesChanged }: MultiInputProps): JSX.Element => { | ||
const [selectedValues, setSelectedValues] = useState<AnswerRequest[]>([]); | ||
|
||
const handleValuesChanged = (answer: Answer, content: string) => { | ||
const newSelectedValues = selectedValues; | ||
const itemIndex = newSelectedValues.findIndex((value) => value.id === answer.id); | ||
if (itemIndex !== -1) { | ||
newSelectedValues[itemIndex].answer = content; | ||
} | ||
setSelectedValues(newSelectedValues); | ||
onValuesChanged(newSelectedValues); | ||
}; | ||
|
||
return ( | ||
<div data-test-id={multiInputsDataTestIds.base}> | ||
{items.map((item) => ( | ||
<div key={item.id}> | ||
<TextInput | ||
inputAttributes={{ | ||
id: `answer-text-input__${item.id}`, | ||
required: true, | ||
type: 'text', | ||
placeholder: item.text, | ||
onChange: (event) => handleValuesChanged(item, event.target.value), | ||
}} | ||
/> | ||
</div> | ||
))} | ||
</div> | ||
); | ||
}; | ||
|
||
export default MultiInputs; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.