diff --git a/src/components/questionAdder.js b/src/components/questionAdder.js new file mode 100644 index 0000000..a3754cf --- /dev/null +++ b/src/components/questionAdder.js @@ -0,0 +1,323 @@ +import React, { useState, useEffect } from 'react' +import Head from 'next/head' + +import LoadingIndicator from '../components/LoadingIndicator' + +import styles from './questionAdder.module.css' +import constants from '../constants.json' + +const getDefaultQuestion = () => { + return { + Q: '', + A: '', + data: { type: 'simple' }, + } +} + +export default function QuestionAdder() { + const [form, setForm] = useState({ quiz: [getDefaultQuestion()] }) + const [subjects, setSubjects] = useState(undefined) + const [isSubmitting, setIsSubmitting] = useState(false) + const [isNewSubj, setIsNewSubj] = useState(false) + + useEffect(() => { + console.info('Fetching subject names') + fetch(`${constants.apiUrl}dataCount?detailed=true`, { + credentials: 'include', + }) + .then((resp) => { + return resp.json() + }) + .then((data) => { + let res = data.reduce((acc, x) => { + return [ + ...acc, + ...x.subjs.map((subj) => { + return subj.name + }), + ] + }, []) + + res = res.sort() + setSubjects(res) + }) + }, []) + + const onChange = (newData, index) => { + let quiz = form.quiz + quiz[index] = newData + + setForm({ + ...form, + quiz: quiz, + }) + } + + const renderQuestionInput = (params) => { + const { index, onChange } = params + const currData = form.quiz[index] + const { Q, A, data } = form.quiz[index] || {} + + return ( +
+
+ + onChange({ ...currData, Q: err.target.value }, index) + } + value={Q || ''} + className={styles.questionInput} + /> +
+
+ + onChange({ ...currData, A: err.target.value }, index) + } + value={A || ''} + className={styles.questionInput} + /> +
+
+ { + // TODO: handle JSON + // try { + // let newData = JSON.parse(e.target.value) + // onChange({ ...currData, data: newData }, index) + // } catch (e) { + // } + }} + value={JSON.stringify(data) || ''} + className={styles.questionInput} + /> + deleteQuestion(index)} + > + Kérdés törlése + +
+
+
+ ) + } + + const deleteQuestion = (index) => { + let quiz = form.quiz + + quiz.splice(index, 1) + + setForm({ + ...form, + quiz: quiz, + }) + } + + const handleSubmit = async () => { + if (!form.subj) { + alert('Nem választottál ki tantárgyat!') // eslint-disable-line + return + } + let isValid = form.quiz.every((x) => { + return x.Q && x.A + }) + if (!isValid || form.quiz.length === 0) { + alert('Kérdés kitöltése kötelező!') // eslint-disable-line + return + } + + const t = document.getElementById('cid').value + let cid = '' + let version = '' + if (t) { + cid = t.split('|')[0] + version = t.split('|')[1] + } + + setIsSubmitting(true) + + const rawResponse = await fetch(constants.apiUrl + 'isAdding', { + method: 'POST', + credentials: 'include', + headers: { + Accept: 'application/json', + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + ...form, + id: cid, + version: 'WEBSITE', + scriptVersion: version, + }), + }) + rawResponse + .json() + .then((resp) => { + console.log(resp) + if (resp.success) { + alert( + 'Sikeres beküldés, ' + + resp.newQuestions.reduce((acc, res) => { + return acc + res.newQuestions + }, 0) + + ' új kérdés' + ) // eslint-disable-line + setIsSubmitting(false) + } else { + alert('Hiba beküldés közben :/') // eslint-disable-line + setIsSubmitting(false) + } + }) + .catch((err) => { + alert('Hiba beküldés közben :/') // eslint-disable-line + console.log(err) + setIsSubmitting(false) + }) + } + + const renderStuff = () => { + return ( +
+ {form.quiz.map((q, i) => { + return ( +
+ {renderQuestionInput({ + index: i, + onChange, + })} +
+ ) + })} +
+
{ + let quiz = form.quiz + quiz.push(getDefaultQuestion()) + setForm({ + ...form, + quiz: quiz, + }) + }} + > + Új kérdés +
+
+ {isSubmitting ? ( +
+ Kérdések feldolgozása folyamatban, ha sokat küldtél, akkor több perc + is lehet +
+ ) : ( +
+ +
+ )} + +
+ ) + } + + const renderSubjSelector = () => { + // TODO: handle if new subject + return ( +
+ {isNewSubj ? ( + { + setForm({ + ...form, + subj: event.target.value, + }) + }} + /> + ) : ( + + )} + { + setIsNewSubj(!isNewSubj) + }} + > + {isNewSubj ? 'Létező tárgy ...' : 'Új tárgy ...'} + +
+ ) + } + + const renderUsage = () => { + return ( + + ) + } + + return ( +
+ + Qmining - Kérdés beküldés | Frylabs.net + + {subjects ? ( + <> + {renderUsage()} +
+ {renderSubjSelector()} + {renderStuff()} + + ) : ( + + )} +
+ ) +} diff --git a/src/components/questionAdder.module.css b/src/components/questionAdder.module.css new file mode 100644 index 0000000..bba190a --- /dev/null +++ b/src/components/questionAdder.module.css @@ -0,0 +1,116 @@ +.questionInput { + flex-grow: 1; + font-size: 16px; + background-color: var(--background-color); + color: white; + border: none; + padding: 8px; + margin: 4px; + border: 1px solid; + border-color: var(--background-color); +} + +.questionContainer { + margin-top: 30px; + margin-bottom: 30px; + margin-right: 10px; + margin-left: 10px; +} + +.inputContainer { + width: 100%; + display: flex; +} + +.buttonContainer { + text-align: center; + width: 200px; + margin: 0 auto; + padding: 10px; +} + +.deleteButton { + display: flex; + align-items: center; + background-color: #333; + padding: 6px; + font-size: 16px; + color: white; + cursor: pointer; + border: 1px solid; + border-color: var(--background-color); +} + +.deleteButton:hover { + background-color: #666; +} + +.questionInput:hover { + border: 1px solid; +} + +.button { + cursor: pointer; + background-color: var(--text-color); + border: none; + padding: 10px 30px; + color: white; + width: 200px; +} + +.subjSelectorContainer { + width: 100%; + display: flex; +} + +.subjSelector { + flex-grow: 1; + background-color: var(--background-color); +} + +.newSubj { + display: flex; + justify-content: center; + + background-color: #333; + width: 150px; + margin: 0px 4px; + padding: 10px; + cursor: pointer; + font-size: 14px; + color: white; +} + +.newSubj:hover { + background-color: #666; +} + +.usage li { + margin: 5px; +} + +.usage { + font-size: 15px; + color: white; +} + +.issubmitting { + text-align: center; + color: white; +} + +.newQuestionButton { + display: flex; + justify-content: center; +} + +.newQuestionButton div { + background-color: #333; + color: white; + cursor: pointer; + padding: 10px 20px; +} + +.newQuestionButton div:hover { + background-color: #666; +} diff --git a/src/components/subjectView.module.css b/src/components/subjectView.module.css index d029668..61dbdf7 100644 --- a/src/components/subjectView.module.css +++ b/src/components/subjectView.module.css @@ -4,11 +4,9 @@ color: white; background-color: #222426; border: none; - font-size: 18px; flex-grow: 1; } - .searchContainer { width: 100%; display: flex; @@ -18,7 +16,6 @@ width: 80px; background-color: var(--background-color); color: white; - font-size: 23px; cursor: pointer; border: none; } diff --git a/src/pages/index.js b/src/pages/index.js index b8d1a8e..46451f5 100644 --- a/src/pages/index.js +++ b/src/pages/index.js @@ -3,6 +3,7 @@ import fetch from 'unfetch' import SubjectView from '../components/subjectView' import QuestionView from '../components/questionView' +import QuestionAdder from '../components/questionAdder.js' import LoadingIndicator from '../components/LoadingIndicator' import styles from './index.module.css' @@ -12,6 +13,7 @@ const views = { subject: 'SUBJECT', question: 'QUESTION', welcome: 'WELCOME', + questionAdder: 'QADDER', } // TODO: Add question on subjects view @@ -195,6 +197,8 @@ export default function Index() { deleteQuestion={deleteQuestion} /> ) + } else if (view === views.questionAdder) { + return } else if (view === views.welcome) { return (
@@ -262,7 +266,7 @@ export default function Index() { { @@ -272,10 +276,10 @@ export default function Index() { { - if (password) { + if (password && selectedDb) { SendDataToServer() } else { - alert('Hibás jelszó!') // eslint-disable-line + alert('Nincs jelszó, vagy nem választottál ki adatbázist!') // eslint-disable-line } }} > @@ -295,6 +299,9 @@ export default function Index() { Kérdés nézet { if (selectedDb) { setView(views.subject) @@ -305,6 +312,13 @@ export default function Index() { > Tárgy nézet + { + setView(views.questionAdder) + }} + > + Kérdés beküldés +
{renderView()}