extends /templates/base-flat block page_nav include ./teacher-dashboard-nav.jade block content - var classroom = view.classroom if !me.isTeacher() .alert.alert-danger.text-center .container // DNT: Temporary h3 ATTENTION: Please upgrade your account to a Teacher Account. p | We are transitioning to a new improved classroom management system for instructors. | Please convert your account to ensure you retain access to your classrooms. a.btn.btn-primary.btn-lg(href="/teachers/update-account") Upgrade to teacher account if classroom.loaded .container +breadcrumbs h3.m-t-2= classroom.get('name') a.label.edit-classroom(data-classroom-id=classroom.id) span(data-i18n='teacher.edit_class_settings') h4= classroom.get('description') .classroom-info-row.row.m-t-5 .classroom-details.col-md-3 - var stats = view.classStats() h4.m-b-2(data-i18n='teacher.class_overview') .language.small-details span(data-i18n='teacher.language') span.spr : span= classroom.capitalLanguage .student-count.small-details span(data-i18n='teacher.students') span.spr : span= classroom.get('members').length .average-playtime.small-details span(data-i18n='teacher.avg_playtime') span.spr : span= stats.averagePlaytime .total-playtime.small-details span(data-i18n='teacher.total_playtime') span.spr : span= stats.totalPlaytime .average-complete.small-details span(data-i18n='teacher.avg_completed') span.spr : span= stats.averageLevelsComplete .total-complete.small-details span(data-i18n='teacher.total_completed') span.spr : span= stats.totalLevelsComplete .total-complete.small-details span(data-i18n='teacher.created') span.spr : span= moment(classroom.created()).format('l') //- .concepts.small-details //- if view.progressData //- div //- span(data-i18n='teacher.concepts_covered') //- span : //- - console.log('concepts', view.conceptData) //- - concepts = view.conceptData //- each state, name in view.conceptData[view.classroom.id] //- if state.started //- b.concept(class=state.completed ? 'forest' : 'gold') //- span(data-i18n='concepts.'+name) .completeness-info.col-md-4 h4.m-b-2   if view.earliestIncompleteLevel div.small-details span(data-i18n='teacher.earliest_incomplete') span : +longLevelName(view.earliestIncompleteLevel) +inlineUserList(view.earliestIncompleteLevel.users) if view.latestCompleteLevel div.small-details.m-t-3 span(data-i18n='teacher.latest_complete') span : +longLevelName(view.latestCompleteLevel) +inlineUserList(view.latestCompleteLevel.users) .adding-students.col-md-5 h4.m-b-2 span(data-i18n='teacher.adding_students') span : +copyCodes +addStudentsButton ul.nav.nav-tabs.m-t-5(role='tablist') li.active a(href='#students-tab' data-toggle='tab') .small-details.text-center(data-i18n='teacher.students') .tab-spacer li a(href='#course-progress-tab' data-toggle='tab') .small-details.text-center(data-i18n='teacher.course_progress') .tab-filler .tab-content +studentsTab +courseProgressTab mixin breadcrumbs .breadcrumbs a(data-i18n='teacher.my_classes' href='/teachers/classes') span.spl.spr > //- TODO: Use .glyphicon-menu-right when we update bootstrap span = view.classroom.get('name') mixin longLevelName(data) if data div.level-name span.spr Course span= data.courseNumber span.spr , Level span= data.levelNumber span.spr : span= data.levelName else div.level-name(data-i18n='teacher.not_applicable') mixin inlineUserList(users) if users ul.inline-student-list.small each student in users li //- a(href='TODO') //- = student.broadName() span.inline-student-name = student.broadName() mixin addStudentsButton .add-students.text-center a.add-students-btn.btn.btn-lg.btn-primary(data-classroom-id=view.classroom.id) span(data-i18n='teacher.add_students_manually') mixin studentsTab #students-tab.tab-pane.active +bulkAssignControls table.students-table thead th.checkbox-col.select-all span Select All .checkbox-flat input(type='checkbox' id='checkbox-all-students') label.checkmark(for='checkbox-all-students') th +sortButtons tbody each student in view.students.models +studentRow(student) mixin sortButtons .sort-buttons.small span(data-i18n='teacher.sort_by') span.spr : button.sort-button.sort-by-name(data-i18n='general.name') button.sort-button.sort-by-progress(data-i18n='teacher.progress') mixin studentRow(student) tr.student-row.alternating-background td.checkbox-col.student-checkbox .checkbox-flat input(type='checkbox' id='checkbox-student-' + student.id, data-student-id=student.id) label.checkmark(for='checkbox-student-' + student.id) td.student-info-col .student-info if student.get('deleted') em (deleted) div.student-name= student.broadName() div.student-email.small-details= student.get('email') td.hidden a.edit-student-button(data-student-id=student.id) span.glyphicon.glyphicon-edit span(data-i18n='teacher.edit') td.latest-level-col.small div i span(data-i18n='teacher.latest_completed') span : div +longLevelName(student.latestCompleteLevel) td if view.progressData each course, index in view.courses.models - var instance = view.courseInstances.findWhere({ courseID: course.id, classroomID: classroom.id }) if instance && instance.hasMember(student) - var progress = view.progressData.get({ classroom: view.classroom, course: course, user: student }) +progressDot(progress, 'CS' + (index+1)) unless student.isEnrolled() +enrollStudentButton(student) //- td //- span.view-class-arrow.glyphicon.glyphicon-chevron-right td a.remove-student-link.small.center-block.text-center.pull-right.m-r-2(data-student-id=student.id) div.glyphicon.glyphicon-remove div(data-i18n='teacher.remove') mixin enrollStudentButton(student) a.enroll-student-button.btn.btn-lg.btn-primary(data-classroom-id=view.classroom.id data-user-id=student.id) span(data-i18n='teacher.enroll_student') mixin courseProgressTab #course-progress-tab.tab-pane.m-t-3 if view.courses .text-center span(data-i18n='teacher.select_course') span.spr : select.course-select each trimCourse in view.classroom.get('courses') - var course = view.courses.get(trimCourse._id); option(value=course.id) = course.get('name') if view.progressData .render-on-course-sync +courseOverview .student-levels-table +sortButtons each student in view.students.models +studentLevelsRow(student) mixin courseOverview - var course = view.selectedCourse - var levels = view.classroom.getLevels({courseID: course.id, withoutLadderLevels: true}).models .course-overview-row .course-title.student-name span= course.get('name') span : span(data-i18n='teacher.course_overview') .course-overview-progress each level, index in levels - var progress = view.progressData.get({ classroom: view.classroom, course: course, level: level }) +progressDot(progress, index+1) mixin studentLevelsRow(student) .student-levels-row.alternating-background div.student-info div.student-name= student.broadName() div.student-email.small-details= student.get('email') div.student-levels-progress - var course = view.selectedCourse - var levels = view.classroom.getLevels({courseID: course.id, withoutLadderLevels: true}).models each level, index in levels - var progress = view.progressData.get({ classroom: view.classroom, course: course, level: level, user: student }) +progressDot(progress, index+1) mixin progressDot(progress, label) //- TODO: Refactor with TeacherClassesView jade //- TODO: Give classes abbreviations instead of using index? //- TODO: inefficient. Cache this in the view? - dotClass = progress.completed ? 'forest' : (progress.started ? 'gold' : ''); .progress-dot(class=dotClass, data-html='true', data-title=view.progressDotTemplate(progressDotContext) data-toggle='tooltip') +progressDotLabel(label) mixin progressDotLabel(label) .dot-label.text-center .dot-label-inner = label mixin copyCodes div.copy-button-group.form-inline.m-b-3 .form-group input.text-h4.semibold#join-code-input(value=view.classCode) button#copy-code-btn.form-control.btn.btn-lg.btn-forest span(data-i18n='teacher.copy_class_code') div.text-center.small(data-i18n='teacher.class_code_blurb') div.copy-button-group.form-inline.m-b-3 .form-group input.form-control.text-h4.semibold#join-url-input(value=view.joinURL) button#copy-url-btn.form-control.btn.btn-lg.btn-forest span(data-i18n='teacher.copy_class_url') div.text-center.small(data-i18n='teacher.class_join_url_blurb') mixin bulkAssignControls .bulk-assign-controls.form-inline .no-students-selected.small-details(class=view.assigningToNobody ? 'visible' : '') span(data-i18n='teacher.no_students_selected') .cant-assign-to-unenrolled.small-details(class=view.assigningToUnenrolled ? 'visible' : '') span(data-i18n='teacher.cant_assign_to_unenrolled') span.small span(data-i18n='teacher.bulk_assign') span : select.bulk-course-select.form-control each trimCourse in _.rest(view.classroom.get('courses')) - var course = view.courses.get(trimCourse._id) option(value=course.id) = course.get('name') button.btn.btn-primary-alt.assign-to-selected-students span(data-i18n='teacher.assign_to_selected_students') button.btn.btn-primary-alt.enroll-selected-students span(data-i18n='teacher.enroll_selected_students')