From c0168c6a14729ebb238f85d4877de5fe393c42fc Mon Sep 17 00:00:00 2001 From: Jan Tuomi Date: Wed, 13 Mar 2019 17:38:47 +0200 Subject: [PATCH] Restructure signup questions widget --- .../SignupQuestionsWidget/OptionsWidget.tsx | 46 ++++++++++ .../SignupQuestionsWidget.scss | 15 ++++ .../SignupQuestionsWidget.tsx | 86 +++---------------- .../SignupQuestionsWidget/TypeWidget.tsx | 33 +++++++ src/components/SignupQuestionsWidget/index.ts | 22 +++++ .../AdminCommonPage/AdminCommonPage.scss | 3 +- 6 files changed, 130 insertions(+), 75 deletions(-) create mode 100644 src/components/SignupQuestionsWidget/OptionsWidget.tsx create mode 100644 src/components/SignupQuestionsWidget/SignupQuestionsWidget.scss create mode 100644 src/components/SignupQuestionsWidget/TypeWidget.tsx diff --git a/src/components/SignupQuestionsWidget/OptionsWidget.tsx b/src/components/SignupQuestionsWidget/OptionsWidget.tsx new file mode 100644 index 0000000..99933a1 --- /dev/null +++ b/src/components/SignupQuestionsWidget/OptionsWidget.tsx @@ -0,0 +1,46 @@ +import * as React from "react"; +import * as shortid from "shortid"; +import { Question, InputProps, optionTypes, SignupQuestionError } from "./index"; + +export interface OptionsWidgetProps { + inputProps: InputProps; + onChange: (value: Question[]) => void; +} +export interface OptionsWidgetState { } + +class OptionsWidget extends React.Component { + handleRadiobuttonOptionsChange = (questions: Question[], index: number) => (event) => { + const { onChange } = this.props; + const val = event.target.value; + const lst = val.split(",").map(p => p.trimLeft()); + questions[index].options = lst; + onChange(questions); + } + + render() { + const { inputProps } = this.props; + const { type, value, questions, index } = inputProps; + if (!optionTypes.includes(type)) { + throw new SignupQuestionError(`Qquestion widget type "${type}" not in types array.`); + } + + if (type === "text") { + return null; + } + + else if (type === "radiobutton") { + const lst = value as string[]; + const joinedValue = lst.join(","); + return ; + } + + + throw new SignupQuestionError(`Unrecognized question widget type "${type}"`); + } +} + +export default OptionsWidget; diff --git a/src/components/SignupQuestionsWidget/SignupQuestionsWidget.scss b/src/components/SignupQuestionsWidget/SignupQuestionsWidget.scss new file mode 100644 index 0000000..0d5329f --- /dev/null +++ b/src/components/SignupQuestionsWidget/SignupQuestionsWidget.scss @@ -0,0 +1,15 @@ +@import "../../assets/scss/globals"; + +.signup-questions-widget { + button.add-link { + background: none; + padding: 0; + margin: 1rem 0; + } + + .signup-questions-widget-row { + margin-bottom: 1rem; + display: flex; + flex-flow: column nowrap; + } +} diff --git a/src/components/SignupQuestionsWidget/SignupQuestionsWidget.tsx b/src/components/SignupQuestionsWidget/SignupQuestionsWidget.tsx index 0aa7010..4639e85 100644 --- a/src/components/SignupQuestionsWidget/SignupQuestionsWidget.tsx +++ b/src/components/SignupQuestionsWidget/SignupQuestionsWidget.tsx @@ -1,5 +1,11 @@ import * as React from "react"; import * as shortid from "shortid"; +import OptionsWidget from "./OptionsWidget"; +import { Question, InputProps, optionTypes } from "."; +// @ts-ignore +import * as AddIcon from "../../assets/img/add-icon.png"; +import "./SignupQuestionsWidget.scss"; +import TypeWidget from "./TypeWidget"; export interface SignupQuestionsWidgetProps { value: string; @@ -9,27 +15,6 @@ export interface SignupQuestionsWidgetProps { } export interface SignupQuestionsWidgetState {} -interface Question { - id: string; - name: string; - type: string; - options: string[]; -} - -interface InputProps { - index: number; - value: string | string[]; - questions: Question[]; - type: string; -} - -const types = [ - "text", - "radiobutton", -]; - -class SignupQuestionError extends Error {} - class SignupQuestionsWidget extends React.Component { onValueChange = (questions: Question[]) => { const { onChange } = this.props; @@ -55,67 +40,18 @@ class SignupQuestionsWidget extends React.Component (event) => { - const val = event.target.value; - questions[index].type = val; - this.onValueChange(questions); - } - - handleRadiobuttonOptionsChange = (questions: Question[], index: number) => (event) => { - const val = event.target.value; - const lst = val.split(",").map(p => p.trimLeft()); - questions[index].options = lst; - this.onValueChange(questions); - } - renderTextWidget = ({ questions, value, index }: InputProps) => ( ) - renderOptionsWidgetByType = (props: InputProps) => { - const { type, value, questions, index } = props; - if (!types.includes(type)) { - throw new SignupQuestionError(`Qquestion widget type "${type}" not in types array.`); - } - - if (type === "text") { - return null; - } - - else if (type === "radiobutton") { - const lst = value as string[]; - const joinedValue = lst.join(","); - return ; - } - - - throw new SignupQuestionError(`Unrecognized question widget type "${type}"`); - } - - renderTypeSelectWidget = (props: InputProps) => { - const { questions, index, type } = props; - const options = types.map(t => ( - - )); - return ( - - ); - } - renderQuestions = (questions: Question[]) => { return questions.map((q, index) => { const nameWidgetProps = { value: q.name, type: "text", questions, index }; const nameWidget = this.renderTextWidget(nameWidgetProps); - const optionsWidgetProps = { value: q.options, type: q.type, questions, index }; - const optionsWidget = this.renderOptionsWidgetByType(optionsWidgetProps); - const typeSelectWidget = this.renderTypeSelectWidget(optionsWidgetProps); + const dataProps = { value: q.options, type: q.type, questions, index }; + const optionsWidget = ; + const typeSelectWidget = ; return (
{ nameWidget } @@ -133,8 +69,10 @@ class SignupQuestionsWidget extends React.Component - {this.renderQuestions(questions)} +
); } diff --git a/src/components/SignupQuestionsWidget/TypeWidget.tsx b/src/components/SignupQuestionsWidget/TypeWidget.tsx new file mode 100644 index 0000000..ec2bbbb --- /dev/null +++ b/src/components/SignupQuestionsWidget/TypeWidget.tsx @@ -0,0 +1,33 @@ +import * as React from "react"; +import * as shortid from "shortid"; +import { Question, InputProps, optionTypes, SignupQuestionError } from "./index"; + +export interface TypeWidgetProps { + inputProps: InputProps; + onChange: (value: Question[]) => void; +} +export interface TypeWidgetState { } + +class TypeWidget extends React.Component { + handleTypeChange = (questions: Question[], index: number) => (event) => { + const { onChange } = this.props; + const val = event.target.value; + questions[index].type = val; + onChange(questions); + } + + render() { + const { inputProps } = this.props; + const { type, questions, index } = inputProps; + const options = optionTypes.map(t => ( + + )); + return ( + + ); + } +} + +export default TypeWidget; diff --git a/src/components/SignupQuestionsWidget/index.ts b/src/components/SignupQuestionsWidget/index.ts index 5905d4e..5e75f65 100644 --- a/src/components/SignupQuestionsWidget/index.ts +++ b/src/components/SignupQuestionsWidget/index.ts @@ -1,2 +1,24 @@ import SignupQuestionsWidget from "./SignupQuestionsWidget"; + +export interface Question { + id: string; + name: string; + type: string; + options: string[]; +} + +export interface InputProps { + index: number; + value: string | string[]; + questions: Question[]; + type: string; +} + +export const optionTypes = [ + "text", + "radiobutton", +]; + +export class SignupQuestionError extends Error { } + export default SignupQuestionsWidget; diff --git a/src/pages/AdminCommonPage/AdminCommonPage.scss b/src/pages/AdminCommonPage/AdminCommonPage.scss index cf71fbd..ead118a 100644 --- a/src/pages/AdminCommonPage/AdminCommonPage.scss +++ b/src/pages/AdminCommonPage/AdminCommonPage.scss @@ -20,7 +20,8 @@ margin-bottom: 0.5rem; } - input { + input, + select { padding: 0.3rem 0.5rem; margin-bottom: 0.5rem; }