Update /courses/teachers
Still incomplete: edit class modal, create new class modal, updated available courses list UI
This commit is contained in:
parent
5e733d1517
commit
e8fc90de23
2 changed files with 149 additions and 189 deletions
app
|
@ -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
|
||||
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
|
||||
|
|
|
@ -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
|
||||
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)
|
||||
|
|
Reference in a new issue