extends withQuestions
block append stylesheets
+ link(rel="stylesheet" href="/stylesheets/statements.css")
link(rel="stylesheet" href="/stylesheets/course.css")
block content
.container#course
if teacher
- #newAssessment.modal
+ #newEvaluation.modal
.modal-content
- form(@submit.prevent="addAssessment")
+ form(@submit.prevent="addEvaluation")
.input-field
- input#assessmentName(type="text" v-model="newAssessment.name" required)
- label(for="assessmentName") Name
+ input#evaluationName(type="text" v-model="newEvaluation.name" required)
+ label(for="evaluationName") Name
.modal-footer
.center-align
- a.waves-effect.waves-light.btn(href="#!" @click="addAssessment()")
+ a.waves-effect.waves-light.btn(href="#!" @click="addEvaluation()")
span Submit
i.material-icons.right send
- #assessmentSettings.modal
- .modal-content
- form
- p
- input#active(type="checkbox" v-model="assessment.active")
- label(for="active") Active
- p
- input#secure(name="status" type="radio" value="secure" v-model="assessment.mode")
- label(for="secure") Exam mode, secured (class only)
- p
- input#exam(name="status" type="radio" value="exam" v-model="assessment.mode")
- label(for="exam") Exam mode, free (class only)
- p
- input#open(name="status" type="radio" value="open" v-model="assessment.mode")
- label(for="open") Open to everyone
- p
- input#fixed(type="checkbox" v-model="assessment.fixed")
- label(for="fixed") Fixed questions order
- p
- input#displayOne(name="display" type="radio" value="one" v-model="assessment.display")
- label(for="displayOne") One question at a time
- p
- input#displayAll(name="display" type="radio" value="all" v-model="assessment.display")
- label(for="displayAll") Display all questions
- .input-field
- input#time(type="number" v-model.number="assessment.time")
- label(for="time") Time (minutes)
- .modal-footer
- .center-align
- a.modal-action.modal-close.waves-effect.waves-light.btn-flat(href="#!") Done
- #assessmentEdit.modal
- .modal-content
- form
- .input-field
- textarea#introduction.materialize-textarea(v-model="assessment.introduction")
- label(for="introduction") Introduction
- .input-field
- textarea#assessmentEdition.materialize-textarea(v-model="assessmentText")
- label(for="assessmentEdition") Assessment in text format
- .modal-footer
- .center-align
- a.modal-action.modal-close.waves-effect.waves-light.btn-flat(href="#!") Done
- #gradeSettings.modal
- .modal-content
- form(@submit.prevent="computeGrades")
- .input-field
- input#points(type="number" v-model.number="settings.totalPoints" required)
- label(for="points") Total points
- p
- input#partial(type="checkbox" v-model="settings.halfPoint")
- label(for="partial") Half point for partial answers? (≥ 50%)
- p
- input#malus(type="checkbox" v-model="settings.zeroSum")
- label(for="malus") Lose points on wrong answers? ("Zero-sum" game)
- .modal-footer
- .center-align
- a.modal-action.modal-close.waves-effect.waves-light.btn(href="#!" @click="computeGrades()")
- span Compute
- i.material-icons.right send
- #detailedGrades.modal
- .modal-content
- table
- thead
- tr
- th Number
- th(v-for="assessment in assessmentArray") {{ assessment.name }}
- tbody
- tr.grade(v-for="student in studentList(group)")
- td {{ student.number }}
- td(v-for="(assessment,i) in assessmentArray" @click="togglePresence(student.number,i)")
- | {{ grade(i,student.number) }}
- .modal-footer
- .center-align
- a.modal-action.modal-close.waves-effect.waves-light.btn-flat(href="#!") Close
- .row(v-show="mode=='view'")
- .col.s12.m10.offset-m1
- if teacher
+ .row
+ .col.s12.m10.offset-m1
h4.title(@click="toggleDisplay('students')") Students
.card(v-show="display=='students'")
.center-align
td {{ student.number }}
td {{ student.name }}
td {{ student.group }}
- h4.title(@click="toggleDisplay('assessments')") Assessments
- .card(v-show="display=='assessments'")
+ .row
+ .col.s12.m10.offset-m1
+ h4.title(@click="toggleDisplay('evaluations')") Evaluations
+ .card(v-show="display=='evaluations'")
if teacher
.center-align
- a.on-left.waves-effect.waves-light.btn.modal-trigger(href="#newAssessment") New assessment
+ a.on-left.waves-effect.waves-light.btn.modal-trigger(href="#newEvaluation") New evaluation
input#password(type="password" v-model="monitorPwd" @keyup.enter="setPassword"
placeholder="Password" title="Monitoring password")
table
th Name
th Mode
th #Questions
- th Time
tbody
- tr.assessment(v-for="(assessment,i) in assessmentArray" :class="{idle:!assessment.active}"
- @click.left="actionAssessment(i)" @contextmenu.prevent="deleteAssessment(assessment)")
- td {{ assessment.name }}
- td {{ assessment.mode }}
- td {{ assessment.questions.reduce( (a,b) => { return b.active ? a+1 : a; }, 0) }}
- td {{ assessment.time }}
- if teacher
- h4.title(@click="toggleDisplay('grades')") Grades
- .card(v-show="display=='grades'")
- .center-align
- button.on-left.waves-effect.waves-light.btn(@click="gradeSettings()") Settings
- a#download.hide(href="#" ref="download")
- button.waves-effect.waves-light.btn(@click="download") Download
- ul.tabs.tabs-fixed-width
- li.tab
- a(href="#group0") All
- li.tab(v-for="group in groupList()")
- a(:href="groupId(group,'#')") G.{{ group }}
- table.result(:id="groupId(group)" v-for="group in [0].concat(groupList())" @click="showDetails(group)")
- thead
- tr
- th Number
- th Name
- th Final
- tbody
- tr.grade(v-for="student in studentList(group)")
- td {{ student.number }}
- td {{ student.name }}
- td grade...
- //td {{ grades[student.number].final }}
- tr.stats
- td(colspan="4") Stats: range= stdev= mean=
+ tr.evaluation(v-for="(evaluation,i) in evaluationArray" :class="{idle:!evaluation.active}"
+ @click.left="actionEvaluation(i)" @contextmenu.prevent="deleteEvaluation(evaluation)")
+ td {{ evaluation.name }}
+ td {{ evaluation.mode }}
+ td {{ evaluation.questions.length }}
if teacher
- .row(v-show="mode=='edit'")
+ .row
.col.s12.m10.offset-m1
- h4 {{ assessment.name }}
- .card
- .center-align
- button.waves-effect.waves-light.btn.on-left(@click="materialOpenModal('assessmentSettings')") Settings
- button.waves-effect.waves-light.btn.on-left(@click="materialOpenModal('assessmentEdit')") Content
- button.waves-effect.waves-light.btn(@click="redirect(assessment.name)") View
- #questionList
- .introduction(v-html="assessment.introduction")
- .question(v-for="(question,i) in assessment.questions" :class="{questionInactive:!question.active}")
- .wording(v-html="question.wording")
- .option(v-for="(option,j) in question.options" :class="{choiceCorrect:question.answer.includes(j)}" v-html="option")
- p
- input(:id="checkBoxFixedId(i)" type="checkbox" v-model="question.fixed")
- label.on-left(:for="checkBoxFixedId(i)") Fixed
- input(:id="checkBoxActiveId(i)" type="checkbox" v-model="question.active")
- label(:for="checkBoxActiveId(i)") Active
+ h4 {{ evaluation.name }}
+ .card(v-show="mode=='view'")
.center-align
- button.waves-effect.waves-light.btn.on-left(@click="mode='view'") Cancel
- button.waves-effect.waves-light.btn(@click="updateAssessment") Send
+ button.waves-effect.waves-light.btn.on-left(@click="mode='edit'") Edit
+ button.waves-effect.waves-light.btn(@click="redirect(evaluation.name)") View
+ div
+ .introduction(v-html="evaluation.introduction")
+ statements(:questions="evaluation.questions" :display="solution")
+ .card(v-show="mode=='edit'")
+ form(@submit.prevent)
+ p
+ input#active(type="checkbox" v-model="evaluation.active")
+ label(for="active") evaluation is active
+ div
+ h4 Questions mode:
+ span(title="Exam mode, secured (class only): students cannot lose focus or exit fullscreen")
+ input#secure(name="status" type="radio" value="secure" v-model="evaluation.mode")
+ label(for="secure") secure
+ span(title="Exam mode, watched (class only): teachers are notified when students lose focus or resize window")
+ input#watch(name="status" type="radio" value="watch" v-model="evaluation.mode")
+ label(for="watch") watch
+ span(title="Exam mode, unwatched: students can browse the web freely")
+ input#exam(name="status" type="radio" value="exam" v-model="evaluation.mode")
+ label(for="exam") exam
+ span(title="Questions list open to the world (useful mode after an exam, or for a 'questions bank'")
+ input#open(name="status" type="radio" value="open" v-model="evaluation.mode")
+ label(for="open") open
+ p
+ input#fixed(type="checkbox" v-model="evaluation.fixed")
+ label(for="fixed") Fixed questions order
+ div
+ h4 Display type:
+ span(title="Show only one question at a time (with potential sub-questions)")
+ input#displayOne(name="display" type="radio" value="one" v-model="evaluation.display")
+ label(for="displayOne") one
+ span(title="Always show all questions (with an optional navigator)")
+ input#displayAll(name="display" type="radio" value="all" v-model="evaluation.display")
+ label(for="displayAll") all
+ .input-field
+ input#time(type="number" v-model.number="evaluation.time")
+ label(for="time") Time (minutes)
+ .input-field
+ textarea#introduction.materialize-textarea(v-model="evaluation.introduction")
+ label(for="introduction") Introduction
+ .input-field
+ textarea#evaluationEdition.materialize-textarea(v-model="evaluationText")
+ label(for="evaluationEdition") evaluation in text format
+ .center-align
+ button.waves-effect.waves-light.btn.on-left(@click="updateEvaluation()") Send
+ button.waves-effect.waves-light.btn(@click="mode='view'") Cancel
block append javascripts
script(src="//cdnjs.cloudflare.com/ajax/libs/PapaParse/4.3.6/papaparse.min.js")
script.
- let assessmentArray = !{JSON.stringify(assessmentArray)};
+ let evaluationArray = !{JSON.stringify(evaluationArray)};
const course = !{JSON.stringify(course)};
const initials = "#{initials}";
const admin = #{teacher};
script(src="/javascripts/utils/sha1.js")
script(src="/javascripts/utils/validation.js")
+ script(src="/javascripts/components/statements.js")
script(src="/javascripts/course.js")