diff --git a/app/styles/courses/teacher-courses-view.sass b/app/styles/courses/teacher-courses-view.sass index c1ce34b6f..d237514d8 100644 --- a/app/styles/courses/teacher-courses-view.sass +++ b/app/styles/courses/teacher-courses-view.sass @@ -1,26 +1,81 @@ #teacher-courses-view margin-bottom: 50px - + + .active-courses + font-size: 12px + font-weight: bold + text-transform: uppercase + + .class-count + font-size: 30px + + .class-name + font-size: 20px + font-weight: bold + + .course-concept + background-color: lightyellow + border: 1px dotted green + color: purple + margin-right: 6px + + .course-enrolled + font-size: 12px + font-weight: bold + + .course-name + font-size: 18px + font-weight: bold + + .divider + border-bottom: 1px solid black + margin-bottom: 20px + img.media-object width: 300px - + .edit-classroom-small cursor: pointer &:hover color: grey - + #fixed-area position: fixed bottom: 0 left: 0 right: 0 - + .well margin-bottom: 0 padding: 5px - + .col-sm-5 padding-top: 8px - + .progress - margin-bottom: 0 \ No newline at end of file + margin-bottom: 0 + + .no-students + font-size: 22px + font-style: italic + margin: 10px + text-align: center + + .section-header + border-bottom: 1px solid black + font-size: 20px + font-weight: bold + margin-bottom: 20px + text-transform: uppercase + + + .text-center + text-align: center + + .uppercase + text-transform: uppercase + + .welcome + font-size: 24px + font-weight: bold + margin-bottom: 20px diff --git a/app/templates/courses/teacher-courses-view.jade b/app/templates/courses/teacher-courses-view.jade index 196515000..ab59c8bb6 100644 --- a/app/templates/courses/teacher-courses-view.jade +++ b/app/templates/courses/teacher-courses-view.jade @@ -2,188 +2,93 @@ extends /templates/base block content - if view.hoc - h1 Welcome to Hour of Code! - - p - | Thank you for choosing CodeCombat for your students. - span.spr.spl To get your kids started, simply send them to - a(href="/hoc") https://codecombat.com/hoc - span . - - p - | If you'd like to use our courses system to view their progress: - - ol - li Login/create your account if you have not already. - li Create a classroom on this page. - li Invite your students to the classroom. - - p - | You can invite your students even if they've already started playing CodeCombat. - - p - span.spr If you have any problems, please email - a(href="mailto:team@codecombat.com") team@codecombat.com - span . + .text-center + if me.isAnonymous() || !me.get('name') + .welcome Welcome! + else + .welcome Welcome, #{me.get('name')}! + + + .section-header Your Classes + + if view.classrooms.models.length > 0 + .container-fluid + each classroom in view.classrooms.models + +classroom(classroom) + else + .no-students No classes yet! + + .text-center + button.btn.btn-lg.btn-success.uppercase create new class + + h3 Available Courses - if !me.isAnonymous() - ul.nav.nav-tabs(role='tablist') - li.active(role='presentation') - a(href="#courses-tab-pane" aria-controls="courses" role="tab" data-toggle="tab") Courses - li(role='presentation') - a(href="#manage-tab-pane" aria-controls="manage" role="tab" data-toggle="tab") Manage - - .tab-content - #courses-tab-pane.tab-pane.well.active - h3 Your Courses - - var courseInstances = view.courseInstances.sliceWithMembers(); - - if me.isAnonymous() - .alert.alert-info - strong Please click "Create Account" or "Log In" above to view and manage your courses. + for course in view.courses.models + .media + .pull-left + img.media-object(src=course.get('screenshot')) + .media-body + h3.media-heading + span.spr= course.get('name') + if course.get('free') + em (free!) + p= course.get('description') + p + strong.spr Concepts: + each concept in course.get('concepts') + span(data-i18n="concepts." + concept) + if course.get('concepts').indexOf(concept) !== course.get('concepts').length - 1 + span.spr , + p + strong.spr Length: + span #{course.get('duration') || 0} hours - else if !_.size(courseInstances) - .alert.alert-info - span.spr You currently have no students assigned to courses. - a#manage-tab-link Go to the manage tab to get set up. - - else - table.table - tr - th Class - th Course - th Size - th - for courseInstance in courseInstances - tr - td - - var classroom = view.classrooms.get(courseInstance.get('classroomID')); - if classroom - | #{classroom.get('name')} - td - - var course = view.courses.get(courseInstance.get('courseID')) - if course - | #{course.get('name')} - td= _.size(courseInstance.get('members')) - td - a.btn.btn-primary.btn-sm(href='/courses/#{courseInstance.get("courseID")}/#{courseInstance.id}') Enter - - h3 Available Courses - - for course in view.courses.models - .media - .pull-left - img.media-object(src=course.get('screenshot')) - .media-body - h3.media-heading - span.spr= course.get('name') - if course.get('free') - em (free!) - p= course.get('description') - p - strong.spr Concepts: - span= (course.get('concepts') || []).join(', ') - p - strong.spr Length: - span #{course.get('duration') || 0} hours - - - - #manage-tab-pane.tab-pane.well +block footer - p Create a class and add students to it. - - - var totalRedeemers = view.prepaids.totalRedeemers(); - - var totalMaxRedeemers = view.prepaids.totalMaxRedeemers(); - - .text-right - span.spr Used paid seats: #{totalRedeemers}/#{totalMaxRedeemers} - a.btn.btn-default.btn-xs(href="/courses/purchase") Add - - for classroom in view.classrooms.models - h2 - span.spr= classroom.get('name') - - var language = (classroom.get('aceConfig') || {}).language || 'python'; - if language === 'python' - img(src="/images/common/code_languages/python_icon.png") - if language === 'javascript' - img(src="/images/common/code_languages/javascript_icon.png") - small.spl.edit-classroom-small(data-classroom-id=classroom.id) - span.glyphicon.glyphicon-pencil - - - var courseInstances = view.courseInstances.where({classroomID: classroom.id}) - - if classroom.saving || classroom.filling - .progress.progress-striped.active - .progress-bar(style="width: 100%") - - else - - var description = classroom.get('description'); - if description - p= description - table.table - tr - th Student - for courseInstance in courseInstances - th - if courseInstance.course - | #{courseInstance.course.get('name')} - - if !_.size(classroom.get('members')) - tr - td(colspan=1+view.courses.size()) - em No students in this class yet. - - for member in classroom.get('members') || [] - - var user = view.members.get(member); - if !user - - continue; - tr - td= user.get('name') - for courseInstance in courseInstances - td - if _.contains(courseInstance.get('members'), user.id) - span.glyphicon.glyphicon-ok - else - input.course-instance-membership-checkbox( - type='checkbox' - data-course-instance-id=courseInstance.id - data-user-id=user.id - ) - - button.add-students-btn.btn.btn-sm(data-classroom-id=classroom.id) Add Students - - hr - - .row - .col-sm-3.col-sm-offset-3 - button#create-new-class-btn.btn.btn-default.btn-block Create New Class - .col-sm-3 - input#new-classroom-name-input.form-control(placeholder='new class name') - - #fixed-area - .container - .row.well - if view.state === 'saving-changes' - p Saving changes - - var total = view.membershipAdditions.originalSize + view.usersToRedeem.originalSize; - - var left = view.membershipAdditions.size() + view.usersToRedeem.size(); - - var pct = Math.max(10, (100 * (total - left) / total)).toFixed(1) + '%'; - .progress.progress-striped.active - .progress-bar(style="width: #{pct}") - else - - var seatsLeft = totalMaxRedeemers - totalRedeemers - view.usersToRedeem.size(); - if seatsLeft < 0 - .alert.alert-danger - span.spr You do not have enough seats to accommodate all students you have selected. - a(href="/courses/purchase") Buy more seats. - else - .col-sm-2 - button#save-changes-btn.btn.btn-primary.btn-block(disabled=!view.numCourseInstancesToAddTo) Save Changes - .col-sm-5 - | Students to add to courses: #{view.numCourseInstancesToAddTo || 0} - .col-sm-5 - | Seats to expend: #{view.usersToRedeem.size()} (will have #{seatsLeft} seats left) - -block footer \ No newline at end of file +mixin classroom(classroom) + .row + - var classMemberCount = classroom.get('members').length + if classMemberCount > 0 + .col-md-8 + p + span.spr.class-name= classroom.get('name') + if classroom.get('aceConfig') && classroom.get('aceConfig').language + span.spr (#{classroom.get('aceConfig').language}) + else + span.spr.class-name (Python) + a edit class details + .active-courses active courses + - var courseInstances = view.courseInstances.where({classroomID: classroom.id}) + each courseInstance in courseInstances + +course(courseInstance, classMemberCount) + else + .col-md-12 + p + span.spr.class-name= classroom.get('name') + if classroom.get('aceConfig') && classroom.get('aceConfig').language + span.spr (#{classroom.get('aceConfig').language}) + else + span.spr.class-name (Python) + a edit class details + .no-students No students yet! + .text-center + a.btn.btn-info.uppercase(href='/courses/#{classroom.id}') add students + br + if classMemberCount > 0 + .col-md-4.text-center + .class-count= classMemberCount + .active-courses(style='margin:6px;') students + a.btn.btn-info.uppercase(href='/courses/#{classroom.id}') view/edit + .row + .col-md-12 + .divider + +mixin course(courseInstance, classMemberCount) + - var courseMemberCount = courseInstance.get('members').length + if courseMemberCount > 0 + - var course = view.courses.get(courseInstance.get('courseID')) + p + .course-name= course.get('name') + .course-enrolled #{courseMemberCount} / #{classMemberCount} students enrolled + each concept in course.get('concepts') + span.spr.course-concept(data-i18n="concepts." + concept)