diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 7b8f73e..95514f2 100755 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -20,19 +20,12 @@ </component> <component name="ChangeListManager"> <list default="true" id="fc13552d-b118-4828-b78f-fc8714e0cfdc" name="Default Changelist" comment=""> - <change afterPath="$PROJECT_DIR$/.idea/dataSources.xml" afterDir="false" /> - <change afterPath="$PROJECT_DIR$/vendor/js/faq.js" afterDir="false" /> <change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" /> - <change beforePath="$PROJECT_DIR$/classes/Api.class.inc.php" beforeDir="false" afterPath="$PROJECT_DIR$/classes/Api.class.inc.php" afterDir="false" /> <change beforePath="$PROJECT_DIR$/config.inc.php" beforeDir="false" afterPath="$PROJECT_DIR$/config.inc.php" afterDir="false" /> - <change beforePath="$PROJECT_DIR$/controller/DefaultController.class.inc.php" beforeDir="false" afterPath="$PROJECT_DIR$/controller/DefaultController.class.inc.php" afterDir="false" /> <change beforePath="$PROJECT_DIR$/controller/FaqController.class.inc.php" beforeDir="false" afterPath="$PROJECT_DIR$/controller/FaqController.class.inc.php" afterDir="false" /> - <change beforePath="$PROJECT_DIR$/index.php" beforeDir="false" afterPath="$PROJECT_DIR$/index.php" afterDir="false" /> - <change beforePath="$PROJECT_DIR$/main.inc.php" beforeDir="false" afterPath="$PROJECT_DIR$/main.inc.php" afterDir="false" /> - <change beforePath="$PROJECT_DIR$/model/DefaultModel.class.inc.php" beforeDir="false" afterPath="$PROJECT_DIR$/model/DefaultModel.class.inc.php" afterDir="false" /> <change beforePath="$PROJECT_DIR$/model/FaqModel.class.inc.php" beforeDir="false" afterPath="$PROJECT_DIR$/model/FaqModel.class.inc.php" afterDir="false" /> <change beforePath="$PROJECT_DIR$/templates/faq.tmpl.html" beforeDir="false" afterPath="$PROJECT_DIR$/templates/faq.tmpl.html" afterDir="false" /> - <change beforePath="$PROJECT_DIR$/templates/start.tmpl.html" beforeDir="false" afterPath="$PROJECT_DIR$/templates/start.tmpl.html" afterDir="false" /> + <change beforePath="$PROJECT_DIR$/vendor/js/faq.js" beforeDir="false" afterPath="$PROJECT_DIR$/vendor/js/faq.js" afterDir="false" /> <change beforePath="$PROJECT_DIR$/views/Apitemplate.class.inc.php" beforeDir="false" afterPath="$PROJECT_DIR$/views/Apitemplate.class.inc.php" afterDir="false" /> </list> <option name="SHOW_DIALOG" value="false" /> @@ -44,7 +37,7 @@ <execution /> </component> <component name="DarkyenusTimeTracker"> - <option name="totalTimeSeconds" value="24012" /> + <option name="totalTimeSeconds" value="26733" /> <option name="gitIntegration" value="true" /> <option name="naggedAbout" value="1" /> </component> @@ -88,7 +81,7 @@ <option name="number" value="Default" /> <option name="presentableId" value="Default" /> <updated>1601618466935</updated> - <workItem from="1601618467981" duration="26007000" /> + <workItem from="1601618467981" duration="28726000" /> </task> <task id="LOCAL-00001" summary="Initial commit"> <created>1601618764031</created> @@ -104,7 +97,14 @@ <option name="project" value="LOCAL" /> <updated>1601628069096</updated> </task> - <option name="localTasksCounter" value="3" /> + <task id="LOCAL-00003" summary="Almost done, just the answer system and query is missing"> + <created>1601648584159</created> + <option name="number" value="00003" /> + <option name="presentableId" value="LOCAL-00003" /> + <option name="project" value="LOCAL" /> + <updated>1601648584159</updated> + </task> + <option name="localTasksCounter" value="4" /> <servers /> </component> <component name="TypeScriptGeneratedFilesManager"> @@ -124,7 +124,8 @@ <component name="VcsManagerConfiguration"> <MESSAGE value="Initial commit" /> <MESSAGE value="Stunden ende, einiges fertig, fehlt nicht mehr viel" /> - <option name="LAST_COMMIT_MESSAGE" value="Stunden ende, einiges fertig, fehlt nicht mehr viel" /> + <MESSAGE value="Almost done, just the answer system and query is missing" /> + <option name="LAST_COMMIT_MESSAGE" value="Almost done, just the answer system and query is missing" /> </component> <component name="WindowStateProjectService"> <state x="728" y="326" width="800" height="683" key="#com.intellij.execution.impl.EditConfigurationsDialog" timestamp="1601632929047"> @@ -163,10 +164,10 @@ <screen x="0" y="34" width="1920" height="1046" /> </state> <state x="441" y="192" width="1037" height="736" key="SettingsEditor/0.34.1920.1046@0.34.1920.1046" timestamp="1601632853044" /> - <state x="555" y="292" width="800" height="535" key="Vcs.Push.Dialog.v2" timestamp="1601628070210"> + <state x="555" y="292" width="800" height="535" key="Vcs.Push.Dialog.v2" timestamp="1601648585625"> <screen x="0" y="34" width="1920" height="1046" /> </state> - <state x="555" y="292" width="800" height="535" key="Vcs.Push.Dialog.v2/0.34.1920.1046@0.34.1920.1046" timestamp="1601628070210" /> + <state x="555" y="292" width="800" height="535" key="Vcs.Push.Dialog.v2/0.34.1920.1046@0.34.1920.1046" timestamp="1601648585625" /> <state x="809" y="122" width="639" height="876" key="com.intellij.database.view.ui.AbstractDbRefactoringDialog" timestamp="1601632983240"> <screen x="0" y="34" width="1920" height="1046" /> </state> diff --git a/config.inc.php b/config.inc.php index 8bf529d..302bf48 100644 --- a/config.inc.php +++ b/config.inc.php @@ -7,4 +7,4 @@ define( 'MYSQL_PASS', 'RnKVJHcUBIIu1XM2' ); define( 'MYSQL_DB', 'online-faq' ); define( 'CODE_LENGTH', 4 ); -define( 'WASTED_TIME', '5hrs and 51min' ); \ No newline at end of file +define( 'WASTED_TIME', '7hrs and 26min' ); \ No newline at end of file diff --git a/controller/FaqController.class.inc.php b/controller/FaqController.class.inc.php index af8bc3d..2065ba3 100644 --- a/controller/FaqController.class.inc.php +++ b/controller/FaqController.class.inc.php @@ -29,6 +29,32 @@ class FaqController extends DefaultController return $view->getResponse(); } + public function getQuestionAction() + { + $view = new Apitemplate(); + $FAQModel = new FaqModel(); + $room = $FAQModel->getRoom(); + + $question_id = Api::getVar( 'question_id' ); + if( empty( $question_id ) || !isset( $question_id ) ) + { + $view->setSuccess( false ); + $view->setHeaderCode( 903 ); + return $view->getResponse(); + } + + if( ( $question = $FAQModel->getQuestion( $question_id ) ) === false ) + { + $view->setSuccess( false ); + $view->setHeaderCode( 906 ); + return $view->getResponse(); + } + $view->setResponse( $question ); + $view->setSuccess( true ); + + return $view->getResponse(); + } + public function addQuestionAction() { $view = new Apitemplate(); diff --git a/model/FaqModel.class.inc.php b/model/FaqModel.class.inc.php index c8156e2..d0b80e8 100644 --- a/model/FaqModel.class.inc.php +++ b/model/FaqModel.class.inc.php @@ -40,6 +40,15 @@ class FaqModel return false; } + $return = array(); + foreach( $result as $index => $value ) + { + $result[$index]['question'] = substr( $result[$index]['question'], 0, 50 ); + $result[$index]['question'] = str_replace( "\n", ' ', $result[$index]['question'] ); + $result[$index]['answer'] = substr( $result[$index]['answer'], 0, 50 ); + $result[$index]['answer'] = str_replace( "\n", ' ', $result[$index]['answer'] ); + } + return $result; } @@ -59,22 +68,22 @@ class FaqModel public function addQuestion(int $room_id, string $question) { $stmnt = Database::getConnection()->prepare( 'INSERT INTO questions ( room_id, question, created_by ) VALUES ( :room_id, :question, :created_by )' ); - $stmnt->execute( array( 'room_id' => $room_id, 'question' => $question, 'created_by' => 'Anonymous' ) ); + $stmnt->execute( array( 'room_id' => $room_id, 'question' => htmlspecialchars( $question ), 'created_by' => 'Anonymous' ) ); } public function addAnswer(int $question_id, string $answer) { $stmnt = Database::getConnection()->prepare( 'UPDATE questions SET answer = :answer WHERE id = :id' ); - $stmnt->execute( array( 'answer' => $answer, 'id' => $question_id ) ); + $stmnt->execute( array( 'answer' => htmlspecialchars( $answer ), 'id' => $question_id ) ); } public function checkUserIsRoomOwner( array $a_room ) { - $stmnt = Database::getConnection()->prepare( 'SELECT owner_sid FROM rooms WHERE id = :id' ); + $stmnt = Database::getConnection()->prepare( 'SELECT id, owner_sid FROM rooms WHERE id = :id' ); $stmnt->execute( array( 'id' => $a_room['id'] ) ); - $result = $stmnt->fetchAll( PDO::FETCH_ASSOC ); + $result = $stmnt->fetch( PDO::FETCH_ASSOC ); if( $result === false || empty( $result ) ) { @@ -87,4 +96,18 @@ class FaqModel return false; } + + public function getQuestion( int $question_id) + { + $stmnt = Database::getConnection()->prepare( 'SELECT * FROM questions WHERE id = :id' ); + $stmnt->execute( array( 'id' => $question_id ) ); + + $result = $stmnt->fetch( PDO::FETCH_ASSOC ); + if( $result === false || empty( $result ) ) + { + return false; + } + $result['question'] = str_replace( "\n", '<br>', $result['question'] ); + return $result; + } } \ No newline at end of file diff --git a/templates/faq.tmpl.html b/templates/faq.tmpl.html index 937bae0..38f2987 100755 --- a/templates/faq.tmpl.html +++ b/templates/faq.tmpl.html @@ -68,6 +68,9 @@ <div class="modal-body"> <span class="text-danger" id="askErrorMsg"></span> <div class="form-group"> + <label for="name" class="col-form-label">Name</label><br> + <input type="text" maxlength="15" id="name"> + <br> <label for="question" class="col-form-label">Question</label> <textarea name="question" class="form-control" id="question" maxlength="500" rows="4"></textarea> </div> @@ -104,6 +107,25 @@ </div> </div> +<div class="modal fade" id="readMoreModal" tabindex="-1" role="dialog" aria-labelledby="answerModalLabel" aria-hidden="true"> + <div class="modal-dialog modal-lg" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h5 class="modal-title" id="readMoreModalLabel">Answer a question</h5> + <button type="button" class="close" data-dismiss="modal" aria-label="Close"> + <span aria-hidden="true">×</span> + </button> + </div> + <div class="modal-body"> + <span id="readMoreModalText" class="text-justify">Loading...</span> + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button> + </div> + </div> + </div> +</div> + <div class="modal fade" id="errorModal" tabindex="-1" role="dialog" aria-labelledby="errorModalLabel" aria-hidden="true"> <div class="modal-dialog" role="document"> <div class="modal-content"> diff --git a/vendor/js/faq.js b/vendor/js/faq.js index 9090f05..c62b3fb 100644 --- a/vendor/js/faq.js +++ b/vendor/js/faq.js @@ -4,9 +4,9 @@ askQuestionModal = $( '#askQuestionModal' ); readMoreModal = $( '#readMoreModal' ); answerModal = $( '#answerModal' ); answerText = $('#answer' ); -answerModalTitle = $('#answerModalTitle'); +answerModalTitle = $('#answerModalLabel'); readMoreModalText = $('#readMoreModalText' ); -readMoreModalTitle = $('#readMoreModalTitle' ); +readMoreModalTitle = $('#readMoreModalLabel' ); errorMsg = $( '#errorMsg' ); askErrorMsg = $('#askErrorMsg') answerErrorMsg = $('#answerErrorMsg' ); @@ -68,6 +68,7 @@ function askQuestion() function( result ){ askErrorMsg.html( '' ); askButton.prop( 'disabled', false ); + question.val(''); askQuestionModal.modal( 'hide' ); }, function( result ) { askButton.prop( 'disabled', false ); @@ -97,10 +98,12 @@ function openReadMoreModal( id ) readMoreModal.modal( 'show' ); readMoreModalText.html( 'Loading...' ); readMoreModalTitle.html( 'Question from: Anonymous' ); - request( 'getQuestion', {"id":id}, function( result ) + request( 'getQuestion', {"question_id":id}, function( result ) { readMoreModalTitle.html( 'Question from: ' + result.data.created_by ); - readMoreModalText.html( result.data.question ); + readMoreModalText.html( '<strong>Question</strong><br>' + result.data.question + + '<hr><strong>Answer</strong><br>' + result.data.answer + ); }, function() { readMoreModalText.html( 'An error occurred, please try again later!' ); }); @@ -114,7 +117,7 @@ function openAnswerModal( id ) answerErrorMsg.html( '' ); answerModal.modal( 'show' ); - request( 'getQuestion', {"id":id}, function( result ) + request( 'getQuestion', {"question_id":id}, function( result ) { readMoreModalTitle.html( 'Answer ' + result.data.created_by + " question" ); answer_id = result.data.id; @@ -160,15 +163,20 @@ function getQuestions() { questions.append( '<div class="col-sm-6 col-lg-4 col-md-5"><div class="card" id="q_' + result.data.questions[i].id + '" style=" margin-bottom: 10px;">' + ' <div class="card-body">' + - ' <h5 class="card-title">Subject</h5>' + - ' <h6 class="card-subtitle mb-2 text-muted">Creator</h6>' + - ' <p class="card-text">Text up to 100 characters</p>' + - ' <a onclick="openReadMoreModal(\''+ result.data.questions[i].id + '\');" class="card-link">Read more</a>' + - ' <a onclick="openAnswerModal(\'' + result.data.questions[i].id + '\');" class="card-link">Answer</a>' + + ' <h5 class="card-title">Question</h5>' + + ' <h6 class="card-subtitle mb-2 text-muted">From ' + result.data.questions[i].created_by + '</h6>' + + ' <p class="card-text">'+ result.data.questions[i].question + '</p>' + + ' <a href="#" onclick="openReadMoreModal(\''+ result.data.questions[i].id + '\');" class="card-link">Read more</a>' + + ' <a href="#" onclick="openAnswerModal(\'' + result.data.questions[i].id + '\');" class="card-link">Answer</a>' + ' </div>' + ' </div>' + '</div> ' ) } + else if ( $( '#qa_' + result.data.questions[i].id ).length < 1 && result.data.questions[i].answer.length !== null ) + { + $('#q_' + result.data.questions[i].id + ' p' ).html( result.data.questions[i].question + '<hr><span id="qa_' + result.data.questions[i].id + '">' + result.data.questions[i].answer + '</span>' ); + } + } @@ -188,4 +196,5 @@ function getQuestions() ); } -getQuestions(); \ No newline at end of file +getQuestions(); +setInterval( function() { getQuestions(); }, 1500 ); \ No newline at end of file diff --git a/views/Apitemplate.class.inc.php b/views/Apitemplate.class.inc.php index 1668f63..c48b5b9 100644 --- a/views/Apitemplate.class.inc.php +++ b/views/Apitemplate.class.inc.php @@ -36,6 +36,7 @@ class Apitemplate 902 => 'Answer-cannot-be-set', 903 => 'wrong-parameters-given', 905 => 'User-is-not-owner', + 906 => 'Question-does-not-exist', ); $text = isset( $codes[$a_code] ) ? $codes[$a_code] : "Error"; header("HTTP/1.1 $a_code $text" );