From b8450525a576ff2fb5f46011e8498e195ead4a6e Mon Sep 17 00:00:00 2001 From: Dm1tr1y147 <me@dmitriy.icu> Date: Mon, 19 Oct 2020 22:48:51 +0500 Subject: [PATCH] Added form submissions showing for submitted forms and authors instead of forms itself --- .gitignore | 1 + src/apollo/defs.ts | 32 ++++++++ src/apollo/typeDefs.gql | 1 + src/components/DoForm/index.tsx | 139 ++++++++++++++++++++------------ 4 files changed, 121 insertions(+), 52 deletions(-) diff --git a/.gitignore b/.gitignore index e00931e..fc074b5 100644 --- a/.gitignore +++ b/.gitignore @@ -13,6 +13,7 @@ # misc .DS_Store +.env .env.local .env.development.local .env.test.local diff --git a/src/apollo/defs.ts b/src/apollo/defs.ts index e6f0504..a9b6bfe 100644 --- a/src/apollo/defs.ts +++ b/src/apollo/defs.ts @@ -32,6 +32,22 @@ const FORM = gql` title } } + submissions { + answers { + ... on InputAnswer { + type + userInput + } + ... on ChoiseAnswer { + type + userChoise + } + } + date + user { + name + } + } title } } @@ -46,6 +62,22 @@ const USER = gql` forms { id title + submissions { + answers { + ... on InputAnswer { + type + userInput + } + ... on ChoiseAnswer { + type + userChoise + } + } + date + user { + name + } + } } } } diff --git a/src/apollo/typeDefs.gql b/src/apollo/typeDefs.gql index dbcb68d..e3607fc 100644 --- a/src/apollo/typeDefs.gql +++ b/src/apollo/typeDefs.gql @@ -42,6 +42,7 @@ type InputQuestion implements Question { } type FormSubmission { + user: User answers: [Answer!]! date: String! id: Int! diff --git a/src/components/DoForm/index.tsx b/src/components/DoForm/index.tsx index fe15db2..d7d3067 100644 --- a/src/components/DoForm/index.tsx +++ b/src/components/DoForm/index.tsx @@ -107,59 +107,94 @@ const DoForm: React.FC = () => { <h1>{form.title}</h1> <p>{form.dateCreated}</p> <h3>{form.author?.name || 'No author'}</h3> - - <form onSubmit={handleSubmit}> - <ul> - {form.questions.map((el: InputQuestion | ChoisesQuestion) => { - if (el.__typename === 'InputQuestion') - return ( - <li key={el.number}> - <label> - {el.title} - <input - onChange={(e) => - answerChange(el.number)(e.currentTarget.value) - } - type="text" - /> - </label> - </li> - ) - if (el.__typename === 'ChoisesQuestion') - return ( - <li key={el.number}> - <label> - {el.title} - {el.type === 'SELECT' ? ( - <select - onChange={(e) => { - const selectValue = el.variants.findIndex( - (val) => val.text === e.currentTarget.value - ) - answerChange(el.number)(selectValue) - }} - name={el.title} - > - {el.variants.map((option, index) => ( - <option key={index}>{option.text}</option> - ))} - </select> - ) : ( - <Lists - variants={el.variants} - onChange={answerChange(el.number)} - name={el.title} - type={el.type} + {form.submissions ? ( + <div> + <h1>Submission{form.submissions.length > 1 && 's'}:</h1> + <ul> + {form.submissions.map((submission, submissionIndex) => ( + <li key={submissionIndex}> + <h2> + User:{' '} + {submission.user ? submission.user.name : 'No submitter'} + </h2> + <ul> + {submission.answers.map( + (answer: InputAnswer | ChoiseAnswer, answerIndex) => ( + <li key={answerIndex}> + <h3>{form.questions[answerIndex].title}</h3> + {answer.__typename === 'ChoiseAnswer' && ( + <h4> + { + (form.questions[answerIndex] as ChoisesQuestion) + .variants[answer.userChoise].text + } + </h4> + )} + {answer.__typename === 'InputAnswer' && ( + <h4>{answer.userInput}</h4> + )} + </li> + ) + )} + </ul> + </li> + ))} + </ul> + </div> + ) : ( + <form onSubmit={handleSubmit}> + <ul> + {form.questions.map((el: InputQuestion | ChoisesQuestion) => { + if (el.__typename === 'InputQuestion') + return ( + <li key={el.number}> + <label> + {el.title} + <input + onChange={(e) => + answerChange(el.number)(e.currentTarget.value) + } + type="text" /> - )} - </label> - </li> - ) - return <li>Unknown question type</li> - })} - </ul> - {submitLoading ? <p>Uploading...</p> : <input type="submit" />} - </form> + </label> + </li> + ) + if (el.__typename === 'ChoisesQuestion') + return ( + <li key={el.number}> + <label> + {el.title} + {el.type === 'SELECT' ? ( + <select + onChange={(e) => { + const selectValue = el.variants.findIndex( + (val) => val.text === e.currentTarget.value + ) + answerChange(el.number)(selectValue) + }} + name={el.title} + > + {el.variants.map((option, index) => ( + <option key={index}>{option.text}</option> + ))} + </select> + ) : ( + <Lists + variants={el.variants} + onChange={answerChange(el.number)} + name={el.title} + type={el.type} + /> + )} + </label> + </li> + ) + return <li>Unknown question type</li> + })} + </ul> + {submitLoading ? <p>Uploading...</p> : <input type="submit" />} + </form> + )} {submitError && <p>{submitError.message}</p>} {submitData && submitData.formSubmit && submitData.formSubmit.success && ( <p>Successfully uploaded</p>