Merge forename + name into [identifying] 'name' (more general)
[qomet.git] / views / course.pug
CommitLineData
e99c53fb
BA
1extends withQuestions
2
3block append stylesheets
4 link(rel="stylesheet" href="/stylesheets/course.css")
5
6block content
7 .container#course
8 if teacher
9 #newAssessment.modal
10 .modal-content
11 form(@submit.prevent="addAssessment")
12 .input-field
13 input#assessmentName(type="text" v-model="newAssessment.name" required)
14 label(for="assessmentName") Name
15 .modal-footer
16 .center-align
17 a.waves-effect.waves-light.btn(href="#!" @click="addAssessment()")
18 span Submit
19 i.material-icons.right send
20 #assessmentSettings.modal
21 .modal-content
22 form
23 p
24 input#active(type="checkbox" v-model="assessment.active")
25 label(for="active") Active
26 p
27 input#secure(name="status" type="radio" value="secure" v-model="assessment.mode")
28 label(for="secure") Exam mode, secured (class only)
29 p
30 input#exam(name="status" type="radio" value="exam" v-model="assessment.mode")
31 label(for="exam") Exam mode, free (class only)
32 p
33 input#open(name="status" type="radio" value="open" v-model="assessment.mode")
34 label(for="open") Open to everyone
35 p
36 input#fixed(type="checkbox" v-model="assessment.fixed")
37 label(for="fixed") Fixed questions order
38 p
39 input#displayOne(name="display" type="radio" value="one" v-model="assessment.display")
40 label(for="displayOne") One question at a time
41 p
42 input#displayAll(name="display" type="radio" value="all" v-model="assessment.display")
43 label(for="displayAll") Display all questions
44 .input-field
45 input#time(type="number" v-model.number="assessment.time")
46 label(for="time") Time (minutes)
47 .modal-footer
48 .center-align
49 a.modal-action.modal-close.waves-effect.waves-light.btn-flat(href="#!") Done
50 #assessmentEdit.modal
51 .modal-content
52 form
53 .input-field
54 textarea#introduction.materialize-textarea(v-model="assessment.introduction")
55 label(for="introduction") Introduction
56 .input-field
57 textarea#assessmentEdition.materialize-textarea(v-model="assessmentText")
58 label(for="assessmentEdition") Assessment in text format
59 .input-field
60 textarea#conclusion.materialize-textarea(v-model="assessment.conclusion")
61 label(for="conclusion") Conclusion
62 .modal-footer
63 .center-align
64 a.modal-action.modal-close.waves-effect.waves-light.btn-flat(href="#!") Done
65 #gradeSettings.modal
66 .modal-content
67 form(@submit.prevent="computeGrades")
68 .input-field
69 input#points(type="number" v-model.number="settings.totalPoints" required)
70 label(for="points") Total points
71 p
72 input#partial(type="checkbox" v-model="settings.halfPoint")
73 label(for="partial") Half point for partial answers? (≥ 50%)
74 p
75 input#malus(type="checkbox" v-model="settings.zeroSum")
76 label(for="malus") Lose points on wrong answers? ("Zero-sum" game)
77 .modal-footer
78 .center-align
79 a.modal-action.modal-close.waves-effect.waves-light.btn(href="#!" @click="computeGrades()")
80 span Compute
81 i.material-icons.right send
82 #detailedGrades.modal
83 .modal-content
84 table
85 thead
86 tr
87 th Number
88 th(v-for="assessment in assessmentArray") {{ assessment.name }}
89 tbody
90 tr.grade(v-for="student in studentList(group)")
91 td {{ student.number }}
b3540dbb
BA
92 td(v-for="(assessment,i) in assessmentArray" @click="togglePresence(student.number,i)")
93 {{ grade(i,student.number) }}
e99c53fb
BA
94 .modal-footer
95 .center-align
96 a.modal-action.modal-close.waves-effect.waves-light.btn-flat(href="#!") Close
97 .row(v-show="mode=='view'")
98 .col.s12.m10.offset-m1.l8.offset-l2.xl6.offset-xl3
99 if teacher
100 h4.title(@click="toggleDisplay('students')") Students
101 .card(v-show="display=='students'")
102 .center-align
103 input.hide#upload(type="file" @change="upload")
104 button.on-left.waves-effect.waves-light.btn(@click="uploadTrigger()") Import
105 table
106 thead
107 tr
108 th Number
e99c53fb
BA
109 th Name
110 th Group
111 tbody
112 tr.student(v-for="student in studentList(0)")
113 td {{ student.number }}
e99c53fb
BA
114 td {{ student.name }}
115 td {{ student.group }}
116 h4.title(@click="toggleDisplay('assessments')") Assessments
117 .card(v-show="display=='assessments'")
118 if teacher
119 .center-align
120 a.on-left.waves-effect.waves-light.btn.modal-trigger(href="#newAssessment") New assessment
b3540dbb
BA
121 input#password(type="password" v-model="monitorPwd" @keyup.enter="setPassword"
122 placeholder="Password" title="Monitoring password")
e99c53fb
BA
123 table
124 thead
125 tr
126 th Name
0b57a78b 127 th Mode
e99c53fb
BA
128 th #Questions
129 th Time
130 tbody
b3540dbb
BA
131 tr.assessment(v-for="(assessment,i) in assessmentArray" v-if="assessment.active"
132 @click.left="actionAssessment(i)" @contextmenu.prevent="deleteAssessment(assessment)")
e99c53fb 133 td {{ assessment.name }}
0b57a78b 134 td {{ assessment.mode }}
e99c53fb
BA
135 td {{ assessment.questions.reduce( (a,b) => { return b.active ? a+1 : a; }, 0) }}
136 td {{ assessment.time }}
137 if teacher
138 h4.title(@click="toggleDisplay('grades')") Grades
139 .card(v-show="display=='grades'")
140 .center-align
141 button.on-left.waves-effect.waves-light.btn(@click="gradeSettings()") Settings
142 a#download.hide(href="#" ref="download")
143 button.waves-effect.waves-light.btn(@click="download") Download
144 ul.tabs.tabs-fixed-width
145 li.tab
146 a(href="#group0") All
147 li.tab(v-for="group in groupList()")
71d1ca9c 148 a(:href="groupId(group,'#')") G.{{ group }}
e99c53fb
BA
149 table.result(:id="groupId(group)" v-for="group in [0].concat(groupList())" @click="showDetails(group)")
150 thead
151 tr
152 th Number
e99c53fb
BA
153 th Name
154 th Final
155 tbody
156 tr.grade(v-for="student in studentList(group)")
157 td {{ student.number }}
e99c53fb
BA
158 td {{ student.name }}
159 td grade...
160 //td {{ grades[student.number].final }}
161 tr.stats
162 td(colspan="4") Stats: range= stdev= mean=
163 if teacher
164 .row(v-show="mode=='edit'")
165 .col.s12.m10.offset-m1.l8.offset-l2.xl6.offset-xl3
166 h4 {{ assessment.name }}
167 .card
168 .center-align
169 button.waves-effect.waves-light.btn.on-left(@click="materialOpenModal('assessmentSettings')") Settings
170 button.waves-effect.waves-light.btn.on-left(@click="materialOpenModal('assessmentEdit')") Content
171 button.waves-effect.waves-light.btn(@click="redirect(assessment.name)") View
172 #questionList
173 .introduction(v-html="assessment.introduction")
174 .question(v-for="(question,i) in assessment.questions" :class="{questionInactive:!question.active}")
175 .wording(v-html="question.wording")
176 .option(v-for="(option,j) in question.options" :class="{choiceCorrect:question.answer.includes(j)}" v-html="option")
177 p
178 input(:id="checkBoxFixedId(i)" type="checkbox" v-model="question.fixed")
179 label.on-left(:for="checkBoxFixedId(i)") Fixed
180 input(:id="checkBoxActiveId(i)" type="checkbox" v-model="question.active")
181 label(:for="checkBoxActiveId(i)") Active
182 .conclusion(v-html="assessment.conclusion")
183 .center-align
184 button.waves-effect.waves-light.btn.on-left(@click="mode='view'") Cancel
185 button.waves-effect.waves-light.btn(@click="updateAssessment") Send
186
187block append javascripts
188 script(src="//cdnjs.cloudflare.com/ajax/libs/PapaParse/4.3.6/papaparse.min.js")
189 script(src="/javascripts/utils/sha1.js")
190 script(src="/javascripts/utils/validation.js")
191 script.
192 let assessmentArray = !{JSON.stringify(assessmentArray)};
193 const course = !{JSON.stringify(course)};
194 const initials = "#{initials}";
195 const admin = #{teacher};
196 script(src="/javascripts/course.js")