From 56ba5e1a329dc489f71e27fade8b2766a03bcbe1 Mon Sep 17 00:00:00 2001 From: Brian Yang Date: Tue, 4 Aug 2015 18:31:46 -0400 Subject: [PATCH 01/19] Added more names for #53 --- app/lib/world/names.coffee | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/app/lib/world/names.coffee b/app/lib/world/names.coffee index bc9cf9d7f..08f2863e6 100644 --- a/app/lib/world/names.coffee +++ b/app/lib/world/names.coffee @@ -27,7 +27,7 @@ module.exports.thangNames = thangNames = 'Godel' 'Goreball' 'Gordok' - 'Toremon' + 'Gorylo' 'Gort' 'Kog' 'Kogpole' @@ -37,11 +37,13 @@ module.exports.thangNames = thangNames = 'Oogre' 'Raack' 'Ragtime' + 'Raort' 'Rexxar' 'Skoggen' 'Smerk' 'Snortt' 'Thabt' + 'Toremon' 'Treg' 'Ursa' 'Vorobun' @@ -184,6 +186,7 @@ module.exports.thangNames = thangNames = 'Belch' 'Booz' 'Brusentsov' + 'Demonik' 'Dronck' 'Gorlog' 'Grumus' @@ -204,7 +207,7 @@ module.exports.thangNames = thangNames = 'Trogdor' 'Trung' 'Vargutt' - 'Demonik' + 'Vyle' ] 'Ogre F': [ # Female From 1b21a677dcf6ba2cfa6a544fa1569c0606877a24 Mon Sep 17 00:00:00 2001 From: Matt Lott Date: Tue, 4 Aug 2015 20:01:13 -0700 Subject: [PATCH 02/19] Courses UI - Updating copy on landing page --- app/styles/courses/mock1/courses.sass | 3 ++ app/templates/courses/mock1/courses.jade | 41 +++++++++++------------- 2 files changed, 21 insertions(+), 23 deletions(-) diff --git a/app/styles/courses/mock1/courses.sass b/app/styles/courses/mock1/courses.sass index 41d6f2f17..a652bff20 100644 --- a/app/styles/courses/mock1/courses.sass +++ b/app/styles/courses/mock1/courses.sass @@ -1,5 +1,8 @@ #courses-view + .btn-continue + margin-top: 40px + .center text-align: center diff --git a/app/templates/courses/mock1/courses.jade b/app/templates/courses/mock1/courses.jade index d80fe04e1..986dbe928 100644 --- a/app/templates/courses/mock1/courses.jade +++ b/app/templates/courses/mock1/courses.jade @@ -51,31 +51,26 @@ block content .col-md-12 button.btn.btn-success.btn-lg.btn-buy(data-course-id="#{courseID}") Buy this course - h1.center Courses + h1.center Courses on CodeCombat .info-container - //- p.center.gameplay-img-container - //- img(src="/images/pages/courses/101_info.png" width='800') - p A course is a selection of CodeCombat levels designed to introduce computer science concepts in a fun and engaging environment. + p Courses are designed to introduce computer science concepts using CodeCombat's fun and engaging environment. CodeCombat levels are organized around key topics to encourage progressive learning, over the course of 5 hours. + .container-fluid - .row - .col-md-12 - p.center - button.btn.btn-success.btn-lg.btn-buy Enroll Now! .row .col-md-6 - div With CodeCombat courses, you and your students will: ul li Learn more in less time - li With no experience necesssary - li Monitor student progress - br + li No coding experience necesssary + li Easily monitor student progress + + div Purchase a course for your entire class. It's easy to sign up your students! .col-md-6 - p + .well.well-sm div.praise-quote "#{praise.quote}" div.caption-text - #{praise.source} - //- h2.center Available Courses + h2.center Choose Your Course: .container-fluid - var i = 0 @@ -95,13 +90,13 @@ mixin course-block(course, courseID) span.spr #{course.title} strong #{course.unlocked ? '[ enrolled ]' : ''} .panel-body - strong Topics - ul - each topic in course.topics - li= topic - strong Hours of content: #{course.duration} .container-fluid - .row.button-row.center - .col-md-12 - br - button.btn.btn-success.btn-continue(data-toggle='modal', data-target="#continueModal", data-course-title="#{course.title}", data-course-id="#{courseID}") #{course.unlocked ? 'Continue' : 'Enter'} + .row.button-row + .col-md-6 + strong Topics + ul + each topic in course.topics + li= topic + strong Hours of content: #{course.duration} + .col-md-6.center + button.btn.btn-lg.btn-success.btn-continue(data-toggle='modal', data-target="#continueModal", data-course-title="#{course.title}", data-course-id="#{courseID}") #{course.unlocked ? 'Continue' : 'Enter'} From c90fcada7d33a464ab33934f2fbe4ad42113d32e Mon Sep 17 00:00:00 2001 From: Matt Lott Date: Tue, 4 Aug 2015 20:03:30 -0700 Subject: [PATCH 03/19] Update course names --- app/views/courses/mock1/CoursesMockData.coffee | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/app/views/courses/mock1/CoursesMockData.coffee b/app/views/courses/mock1/CoursesMockData.coffee index 6ddedf593..26d58fd47 100644 --- a/app/views/courses/mock1/CoursesMockData.coffee +++ b/app/views/courses/mock1/CoursesMockData.coffee @@ -40,7 +40,7 @@ data.courses = [ image: '/images/pages/courses/102_info.png' }, { - title: 'CS Course 3' + title: 'Computer Science 3' description: 'Learn how to handle input.' topics: ['If Statements', 'Arithmetic', 'Input Handling'] duration: 5 @@ -48,7 +48,7 @@ data.courses = [ image: '/images/pages/courses/103_info.png' }, { - title: 'CS 4' + title: 'Computer Science 4' description: 'Time to tackle arrays and some pvp stuff.' topics: ['Loops', 'Break Statements', 'Arrays'] duration: 5 @@ -56,7 +56,7 @@ data.courses = [ image: '/images/pages/courses/104_info.png' }, { - title: 'Course 5' + title: 'Computer Science 5' description: 'Time to tackle arrays and some PVP.' topics: ['Break Statements', 'Arrays', 'Object Literals'] duration: 5 @@ -64,7 +64,7 @@ data.courses = [ image: '/images/pages/courses/105_info.png' }, { - title: 'Course 6' + title: 'Computer Science 6' description: 'For loops!' topics: ['Break Statements', 'Object Literals', 'For loops'] duration: 5 @@ -72,7 +72,7 @@ data.courses = [ image: '/images/pages/courses/106_info.png' }, { - title: 'Course 7' + title: 'Computer Science 7' description: 'Functions!' topics: ['Object Literals', 'For loops', 'Functions'] duration: 5 @@ -80,7 +80,7 @@ data.courses = [ image: '/images/pages/courses/107_info.png' }, { - title: 'CS 108' + title: 'Computer Science 8' description: 'Maths.' topics: ['For loops', 'Functions', 'Math Operations'] duration: 5 @@ -88,7 +88,7 @@ data.courses = [ image: '/images/pages/courses/107_info.png' }, { - title: 'Computer Science 109' + title: 'Computer Science 9' description: 'Vectors and strings.' topics: ['Vectors', 'Advanced Strings'] duration: 5 From ea90b93bd248988c525e8655d87e89d600bf68ab Mon Sep 17 00:00:00 2001 From: Matt Lott Date: Wed, 5 Aug 2015 09:35:18 -0700 Subject: [PATCH 04/19] Courses UI - Consolidate class settings into single modal --- app/styles/courses/mock1/course-details.sass | 9 ++-- .../courses/mock1/course-details.jade | 52 +++++++------------ .../courses/mock1/CourseDetailsView.coffee | 30 ++--------- 3 files changed, 28 insertions(+), 63 deletions(-) diff --git a/app/styles/courses/mock1/course-details.sass b/app/styles/courses/mock1/course-details.sass index 01f73f109..0364d21cc 100644 --- a/app/styles/courses/mock1/course-details.sass +++ b/app/styles/courses/mock1/course-details.sass @@ -12,18 +12,15 @@ .concept-completed-foreground font-size: 12pt - #editDescriptionModal .modal-dialog + #editSettingsModal .modal-dialog background-color: white - - #editNameModal .modal-dialog - background-color: white - max-width: 400px + font-size: 14pt .edit-description-input width: 100% .edit-name-input - width: 100% + width: 50% .member-header cursor: pointer diff --git a/app/templates/courses/mock1/course-details.jade b/app/templates/courses/mock1/course-details.jade index 44e4c8a79..b4f48e287 100644 --- a/app/templates/courses/mock1/course-details.jade +++ b/app/templates/courses/mock1/course-details.jade @@ -14,56 +14,44 @@ block content span.spl Student view div(style='border-bottom: 1px solid black;') - .modal#editNameModal + .modal#editSettingsModal .modal-dialog .modal-header button.close(data-dismiss='modal') span × - h3.modal-title Edit Class Name + h3.modal-title Edit Class Settings .modal-body - p This title will be displayed to everyone enrolled in this class. - input.edit-name-input(type='text', value="#{instance.name}") + p This title will be displayed to everyone in the class. + p + input.edit-name-input(type='text', value="#{instance.name}") + p This description will be displayed to everyone in the class. + p + textarea.edit-description-input(rows=2)= instance.description + p Select programming languages available to the class: + p + select.form-control.select-language + option(value="Python") Python + option(value="JavaScript") JavaScript + option(value="All Languages") All Languages + p + input(type='checkbox', checked) + span.spl Show student progress to everyone in the class .modal-footer - button.btn.edit-name-save-btn(data-i18n="common.save_changes") - - .modal#editDescriptionModal - .modal-dialog - .modal-header - button.close(data-dismiss='modal') - span × - h3.modal-title Edit Class Description - .modal-body - p This description will be displayed to everyone enrolled in this class. - textarea.edit-description-input(rows=2)= instance.description - .modal-footer - button.btn.edit-description-save-btn(data-i18n="common.save_changes") + button.btn.btn-save-settings(data-i18n="common.save_changes") h1= course.title p= course.description h3= instance.name - if !studentMode - span.spl - button.btn.btn-xs.edit-class-name-btn(data-toggle='modal', data-target='#editNameModal') edit class name p if instance.description each line in instance.description.split('\n') div= line - if !studentMode - span.spl - button.btn.btn-xs.edit-description-btn(data-toggle='modal', data-target='#editDescriptionModal') edit class description - else if !studentMode - div - button.btn.btn-xs.edit-description-btn add class description if !studentMode - .form-group - span.spr Select language - select.form-control.select-language - option(value="Python") Python - option(value="JavaScript") JavaScript - option(value="All Languages") All Languages + p + button.btn.btn-xs.btn-edit-settings(data-toggle='modal', data-target='#editSettingsModal') edit class settings div(role='tabpanel') ul.nav.nav-tabs(role='tablist') diff --git a/app/views/courses/mock1/CourseDetailsView.coffee b/app/views/courses/mock1/CourseDetailsView.coffee index fddd6360b..b01c27c09 100644 --- a/app/views/courses/mock1/CourseDetailsView.coffee +++ b/app/views/courses/mock1/CourseDetailsView.coffee @@ -10,11 +10,9 @@ module.exports = class CourseDetailsView extends RootView events: 'change .expand-progress-checkbox': 'onExpandedProgressCheckbox' - 'change .select-session': 'onChangeSession' 'change .student-mode-checkbox': 'onChangeStudent' 'click .btn-play-level': 'onClickPlayLevel' - 'click .edit-description-save-btn': 'onEditDescriptionSave' - 'click .edit-name-save-btn': 'onEditNameSave' + 'click .btn-save-settings': 'onClickSaveSettings' 'click .member-header': 'onClickMemberHeader' 'click .progress-header': 'onClickProgressHeader' 'mouseenter .progress-level-cell': 'onMouseEnterPoint' @@ -144,26 +142,12 @@ module.exports = class CourseDetailsView extends RootView @render?() $('.student-mode-checkbox').attr('checked', @options.studentMode) - onChangeSession: (e) -> - @showExpandedProgress = false - newSessionValue = $(e.target).val() - for val, index in @instances when val.name is newSessionValue - @currentInstanceIndex = index - @updateLevelMaps() - @onCampaignSync() - onExpandedProgressCheckbox: (e) -> @showExpandedProgress = $('.expand-progress-checkbox').prop('checked') # TODO: why does render reset the checkbox to be unchecked? @render?() $('.expand-progress-checkbox').attr('checked', @showExpandedProgress) - onClickEditClassName: (e) -> - alert 'TODO: Popup for editing name for this course session' - - onClickEditClassDescription: (e) -> - alert 'TODO: Popup for editing description for this course session' - onClickMemberHeader: (e) -> @memberSort = if @memberSort is 'nameAsc' then 'nameDesc' else 'nameAsc' @sortMembers() @@ -183,16 +167,12 @@ module.exports = class CourseDetailsView extends RootView viewArgs: [{}, levelSlug] } - onEditDescriptionSave: (e) -> - description = $('.edit-description-input').val() - @instances[@currentInstanceIndex].description = description - $('#editDescriptionModal').modal('hide') - @render?() - - onEditNameSave: (e) -> + onClickSaveSettings: (e) -> if name = $('.edit-name-input').val() @instances[@currentInstanceIndex].name = name - $('#editNameModal').modal('hide') + description = $('.edit-description-input').val() + @instances[@currentInstanceIndex].description = description + $('#editSettingsModal').modal('hide') @render?() onMouseEnterPoint: (e) -> From d47f41548cf1609eaae61e65b6ce619a1c90d616 Mon Sep 17 00:00:00 2001 From: Matt Lott Date: Wed, 5 Aug 2015 09:44:19 -0700 Subject: [PATCH 05/19] Courses UI - Show progress to students by default --- .../courses/mock1/course-details.jade | 195 +++++++++--------- 1 file changed, 101 insertions(+), 94 deletions(-) diff --git a/app/templates/courses/mock1/course-details.jade b/app/templates/courses/mock1/course-details.jade index b4f48e287..bafbeb516 100644 --- a/app/templates/courses/mock1/course-details.jade +++ b/app/templates/courses/mock1/course-details.jade @@ -5,7 +5,6 @@ block content //- DO NOT localize / i18n div TODO: fix ugly tabs - div TODO: not enrolled yet div span *UNDER CONSTRUCTION, send feedback to a.spl(href='mailto:team@codecombat.com') team@codecombat.com @@ -55,102 +54,28 @@ block content div(role='tabpanel') ul.nav.nav-tabs(role='tablist') - if !studentMode + if studentMode + li.active(role='presentation') + a(href='#levels', aria-controls='levels', role='tab', data-toggle='tab') Levels + li(role='presentation') + a(href='#progress', aria-controls='progress', role='tab', data-toggle='tab') Class + else li.active(role='presentation') a(href='#progress', aria-controls='progress', role='tab', data-toggle='tab') Class li(role='presentation') a(href='#invite', aria-controls='invite', role='tab', data-toggle='tab') Add Students - li(role='presentation') - a(href='#levels', aria-controls='levels', role='tab', data-toggle='tab') Levels + li(role='presentation') + a(href='#levels', aria-controls='levels', role='tab', data-toggle='tab') Levels .tab-content - if !studentMode + if studentMode + .tab-pane.active#levels(role='tabpanel') + +levels-tab + .tab-pane#progress(role='tabpanel') + +progress-tab + else .tab-pane.active#progress(role='tabpanel') - if instance.students - h3 Summary - - var averagePlaytime = Math.round(Math.random() * 30) + 30 - p - strong(style='font-size:12pt;') Average Play Time - p #{averagePlaytime} minutes - p - strong(style='font-size:12pt;') Concepts Covered - table.table.table-condensed - each concept in courseConcepts - - var conceptCompletion = Math.round(parseFloat(conceptsCompleted[concept]) / instance.students.length * 100) - if isNaN(conceptCompletion) - - conceptCompletion = 0 - tr - td.concept-completion-container - span.concept-completed-foreground(data-i18n="concepts." + concept) - span.spl - #{conceptCompletion}% - span.concept-completion-background(style="width:#{conceptCompletion}%;") - h3 Students - table.table.table-condensed - thead - tr - th - span.member-header.spr Name - if memberSort === 'nameAsc' - span.member-header.glyphicon.glyphicon-chevron-up - else if memberSort === 'nameDesc' - span.member-header.glyphicon.glyphicon-chevron-down - th - span.progress-header.spr Progress - if memberSort === 'progressAsc' - span.progress-header.glyphicon.glyphicon-chevron-up - else if memberSort === 'progressDesc' - span.progress-header.glyphicon.glyphicon-chevron-down - else - span(style='padding-left:16px;') - span.progress-key.progress-key-complete complete - span.progress-key.progress-key-started started - span.progress-key not started - if maxLastStartedIndex > 30 - input.expand-progress-checkbox(type='checkbox') - span.spl.expand-progress-label(data-i18n="clans.exp_levels") Expand levels - tbody - each student in instance.students - tr - td - a= student - td.progress-cell - .level-progression-concepts Concepts - each concept in courseConcepts - if userConceptsMap[student] && userConceptsMap[student][concept] === 'complete' - span.spr.progress-concept-cell.progress-concept-cell-complete(data-i18n="concepts." + concept) - else if userConceptsMap[student] && userConceptsMap[student][concept] === 'started' - span.spr.progress-concept-cell.progress-concept-cell-started(data-i18n="concepts." + concept) - else - span.spr.progress-concept-cell.progress-concept-cell-not-started(data-i18n="concepts." + concept) - - .level-progression-levels Levels - - var i = 0 - each level in course.levels - if userLevelStateMap[student][level] === 'complete' - span.progress-level-cell.progress-level-cell-complete #{i + 1} - if showExpandedProgress || i === 0 || i === course.levels.length - 1 - span.spl #{level} - .level-popup-container - h3 #{i + 1}. #{level} - p - div - - var playTime = Math.round(Math.random() * 600) - span Time to solve - span : #{playTime} seconds - div - - var completionDate = new Date() - - completionDate.setUTCDate(completionDate.getUTCDate() - Math.round(Math.random() * 60)) - span Completed on - span : #{moment(completionDate).format('MMMM Do YYYY, h:mm:ss a')} - strong(data-i18n="clans.view_solution") Click to view solution. - else if userLevelStateMap[student][level] === 'started' - span.progress-level-cell.progress-level-cell-started #{i + 1} #{level} - else - span.progress-level-cell.level-progression-level-not-started #{i + 1} - if showExpandedProgress || i === 0 - span.spl #{level} - - i++ - + +progress-tab .tab-pane#invite(role='tabpanel') p Invite students to join this class. if course.title !== 'Introduction to Computer Science' @@ -159,12 +84,94 @@ block content textarea.textarea-emails(rows=3, placeholder="Enter student emails to invite, one per line") div button.btn.btn-success.btn-invite Send Invites - .tab-pane#levels(role='tabpanel') +levels-tab - else - .tab-pane.active#levels(role='tabpanel') - +levels-tab + +mixin progress-tab + if instance.students + h3 Summary + - var averagePlaytime = Math.round(Math.random() * 30) + 30 + p + strong(style='font-size:12pt;') Average Play Time + p #{averagePlaytime} minutes + p + strong(style='font-size:12pt;') Concepts Covered + table.table.table-condensed + each concept in courseConcepts + - var conceptCompletion = Math.round(parseFloat(conceptsCompleted[concept]) / instance.students.length * 100) + if isNaN(conceptCompletion) + - conceptCompletion = 0 + tr + td.concept-completion-container + span.concept-completed-foreground(data-i18n="concepts." + concept) + span.spl - #{conceptCompletion}% + span.concept-completion-background(style="width:#{conceptCompletion}%;") + h3 Students + table.table.table-condensed + thead + tr + th + span.member-header.spr Name + if memberSort === 'nameAsc' + span.member-header.glyphicon.glyphicon-chevron-up + else if memberSort === 'nameDesc' + span.member-header.glyphicon.glyphicon-chevron-down + th + span.progress-header.spr Progress + if memberSort === 'progressAsc' + span.progress-header.glyphicon.glyphicon-chevron-up + else if memberSort === 'progressDesc' + span.progress-header.glyphicon.glyphicon-chevron-down + else + span(style='padding-left:16px;') + span.progress-key.progress-key-complete complete + span.progress-key.progress-key-started started + span.progress-key not started + if maxLastStartedIndex > 30 + input.expand-progress-checkbox(type='checkbox') + span.spl.expand-progress-label(data-i18n="clans.exp_levels") Expand levels + tbody + each student in instance.students + tr + td + a= student + td.progress-cell + .level-progression-concepts Concepts + each concept in courseConcepts + if userConceptsMap[student] && userConceptsMap[student][concept] === 'complete' + span.spr.progress-concept-cell.progress-concept-cell-complete(data-i18n="concepts." + concept) + else if userConceptsMap[student] && userConceptsMap[student][concept] === 'started' + span.spr.progress-concept-cell.progress-concept-cell-started(data-i18n="concepts." + concept) + else + span.spr.progress-concept-cell.progress-concept-cell-not-started(data-i18n="concepts." + concept) + + .level-progression-levels Levels + - var i = 0 + each level in course.levels + if userLevelStateMap[student][level] === 'complete' + span.progress-level-cell.progress-level-cell-complete #{i + 1} + if showExpandedProgress || i === 0 || i === course.levels.length - 1 + span.spl #{level} + .level-popup-container + h3 #{i + 1}. #{level} + p + div + - var playTime = Math.round(Math.random() * 600) + span Time to solve + span : #{playTime} seconds + div + - var completionDate = new Date() + - completionDate.setUTCDate(completionDate.getUTCDate() - Math.round(Math.random() * 60)) + span Completed on + span : #{moment(completionDate).format('MMMM Do YYYY, h:mm:ss a')} + strong(data-i18n="clans.view_solution") Click to view solution. + else if userLevelStateMap[student][level] === 'started' + span.progress-level-cell.progress-level-cell-started #{i + 1} #{level} + else + span.progress-level-cell.level-progression-level-not-started #{i + 1} + if showExpandedProgress || i === 0 + span.spl #{level} + - i++ mixin levels-tab table.table.table-striped.table-condensed From 579f63c05941a76e9d5214d047332d9da620a9ad Mon Sep 17 00:00:00 2001 From: Matt Lott Date: Wed, 5 Aug 2015 09:53:54 -0700 Subject: [PATCH 06/19] Courses UI - Clean up course details page titles --- app/templates/courses/mock1/course-details.jade | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/app/templates/courses/mock1/course-details.jade b/app/templates/courses/mock1/course-details.jade index bafbeb516..5b83e8ef1 100644 --- a/app/templates/courses/mock1/course-details.jade +++ b/app/templates/courses/mock1/course-details.jade @@ -38,10 +38,8 @@ block content .modal-footer button.btn.btn-save-settings(data-i18n="common.save_changes") - h1= course.title - p= course.description - - h3= instance.name + h1= instance.name + small.spl (#{course.title}) p if instance.description @@ -77,12 +75,13 @@ block content .tab-pane.active#progress(role='tabpanel') +progress-tab .tab-pane#invite(role='tabpanel') + br p Invite students to join this class. if course.title !== 'Introduction to Computer Science' p Student unlock code: #{instance.code} p Class capacity: 34/50 textarea.textarea-emails(rows=3, placeholder="Enter student emails to invite, one per line") - div + div(style='margin-top:10px;') button.btn.btn-success.btn-invite Send Invites .tab-pane#levels(role='tabpanel') +levels-tab From 697b0e9e42da3025d43e0f6718ed11518444faee Mon Sep 17 00:00:00 2001 From: Matt Lott Date: Wed, 5 Aug 2015 10:58:12 -0700 Subject: [PATCH 07/19] Courses UI - Clean up details page summary --- app/styles/courses/mock1/course-details.sass | 36 +++++++++---- .../courses/mock1/course-details.jade | 53 +++++++++++++------ .../courses/mock1/CourseDetailsView.coffee | 8 +++ 3 files changed, 70 insertions(+), 27 deletions(-) diff --git a/app/styles/courses/mock1/course-details.sass b/app/styles/courses/mock1/course-details.sass index 0364d21cc..7d023e1a4 100644 --- a/app/styles/courses/mock1/course-details.sass +++ b/app/styles/courses/mock1/course-details.sass @@ -1,16 +1,32 @@ #course-details-view .concept-completion-container - position: relative - .concept-completion-background - position: absolute - height: 100% - left: 0px - top: 0px - background-color: blue - opacity: 0.25 - .concept-completed-foreground - font-size: 12pt + font-size: 10pt + + .summary-container + font-size: 14pt + + .statistics-container + font-size: 12pt + td + padding-right: 8px + + .table-concepts-summary + width: 100% + + .concept-summary + width: 100% + background-color: white + cursor: default + display: inline-block + white-space: nowrap + font-size: 9pt + font-weight: normal + border: 1px solid gray + border-radius: 5px + margin: 0px + padding: 2px + background-color: white #editSettingsModal .modal-dialog background-color: white diff --git a/app/templates/courses/mock1/course-details.jade b/app/templates/courses/mock1/course-details.jade index 5b83e8ef1..5c2a01c65 100644 --- a/app/templates/courses/mock1/course-details.jade +++ b/app/templates/courses/mock1/course-details.jade @@ -88,23 +88,42 @@ block content mixin progress-tab if instance.students - h3 Summary - - var averagePlaytime = Math.round(Math.random() * 30) + 30 - p - strong(style='font-size:12pt;') Average Play Time - p #{averagePlaytime} minutes - p - strong(style='font-size:12pt;') Concepts Covered - table.table.table-condensed - each concept in courseConcepts - - var conceptCompletion = Math.round(parseFloat(conceptsCompleted[concept]) / instance.students.length * 100) - if isNaN(conceptCompletion) - - conceptCompletion = 0 - tr - td.concept-completion-container - span.concept-completed-foreground(data-i18n="concepts." + concept) - span.spl - #{conceptCompletion}% - span.concept-completion-background(style="width:#{conceptCompletion}%;") + .container-fluid.summary-container + .row + .col-md-6 + h3 Statistics + table.statistics-container + tr + td Total students: + td #{instance.students.length} + tr + td Average level play time: + td #{stats.averageLevelPlaytime} seconds + tr + td Total play time: + td #{stats.totalPlayTime} seconds + tr + td Average levels completed: + td #{stats.averageLevelsCompleted} + tr + td Total levels completed: + td #{stats.totalLevelsCompleted} + tr + td Last level completed: + td #{stats.lastLevelCompleted} + .col-md-6 + h3 Concepts Covered + table.table-concepts-summary + each concept in courseConcepts + - var conceptCompletion = Math.round(parseFloat(conceptsCompleted[concept]) / instance.students.length * 100) + if isNaN(conceptCompletion) + - conceptCompletion = 0 + tr + td.concept-completion-container + span.concept-summary(style="width:#{conceptCompletion}%;") + span.concept-completed-foreground(data-i18n="concepts." + concept) + span.spl - #{conceptCompletion}% + h3 Students table.table.table-condensed thead diff --git a/app/views/courses/mock1/CourseDetailsView.coffee b/app/views/courses/mock1/CourseDetailsView.coffee index b01c27c09..dd9ec574b 100644 --- a/app/views/courses/mock1/CourseDetailsView.coffee +++ b/app/views/courses/mock1/CourseDetailsView.coffee @@ -47,6 +47,14 @@ module.exports = class CourseDetailsView extends RootView conceptsCompleted[concept]++ context.conceptsCompleted = conceptsCompleted + stats = + averageLevelPlaytime: _.random(30, 240) + averageLevelsCompleted: _.random(1, @course.levels.length) + stats.totalPlayTime = context.instance.students?.length * stats.averageLevelPlaytime ? 0 + stats.totalLevelsCompleted = context.instance.students?.length * stats.averageLevelsCompleted ? 0 + stats.lastLevelCompleted = @course.levels[@maxLastStartedIndex] ? @course.levels[@course.levels.length - 1] + context.stats = stats + context initData: -> From 4593b7d864cd559f653d047ce3ef0ac83882ca57 Mon Sep 17 00:00:00 2001 From: Matt Lott Date: Wed, 5 Aug 2015 11:40:57 -0700 Subject: [PATCH 08/19] Teacher survey counts per day script --- .../mongodb/queries/teacherSurveyCounts.js | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 scripts/analytics/mongodb/queries/teacherSurveyCounts.js diff --git a/scripts/analytics/mongodb/queries/teacherSurveyCounts.js b/scripts/analytics/mongodb/queries/teacherSurveyCounts.js new file mode 100644 index 000000000..2bae4a745 --- /dev/null +++ b/scripts/analytics/mongodb/queries/teacherSurveyCounts.js @@ -0,0 +1,25 @@ + // Print out teacher survey counts by day + +// Usage: +// mongo
:/