From a466b437f6d746701ac46d79cd86ceeeaa271bf4 Mon Sep 17 00:00:00 2001 From: AlasdairSwan Date: Mon, 27 Mar 2017 15:24:24 -0400 Subject: [PATCH] ECOM-7386 Added a program progress circle to program details page --- .../components/views/progress_circle_view.js | 96 +++++++ .../components/progress_circle_view_spec.js | 112 +++++++++ .../static/common/js/spec/main_requirejs.js | 1 + .../progress_circle_segment.underscore | 8 + .../progress_circle_view.underscore | 15 ++ .../program-certificate-micromasters.gif | Bin 0 -> 25032 bytes ...m-certificate-professional-certificate.gif | Bin 0 -> 27976 bytes .../programs/program-certificate-xseries.gif | Bin 0 -> 24096 bytes .../views/certificate_list_view.js | 35 +++ .../views/program_details_sidebar_view.js | 124 ++++++--- .../views/program_details_view_2017.js | 13 +- .../program_details_sidebar_view_spec.js | 127 ++++++++++ lms/static/lms/js/spec/main.js | 1 + lms/static/sass/_build-learner-dashboard.scss | 1 + .../sass/elements/_progress-circle.scss | 66 +++++ lms/static/sass/views/_program-details.scss | 236 +++++++++++++----- .../certificate_list.underscore | 13 + .../course_card_2017.underscore | 2 +- .../program_details_sidebar.underscore | 10 + .../program_details_view_2017.underscore | 11 +- 20 files changed, 762 insertions(+), 109 deletions(-) create mode 100644 common/static/common/js/components/views/progress_circle_view.js create mode 100644 common/static/common/js/spec/components/progress_circle_view_spec.js create mode 100644 common/static/common/templates/components/progress_circle_segment.underscore create mode 100644 common/static/common/templates/components/progress_circle_view.underscore create mode 100644 lms/static/images/programs/program-certificate-micromasters.gif create mode 100644 lms/static/images/programs/program-certificate-professional-certificate.gif create mode 100644 lms/static/images/programs/program-certificate-xseries.gif create mode 100644 lms/static/js/learner_dashboard/views/certificate_list_view.js create mode 100644 lms/static/js/spec/learner_dashboard/program_details_sidebar_view_spec.js create mode 100644 lms/static/sass/elements/_progress-circle.scss create mode 100644 lms/templates/learner_dashboard/certificate_list.underscore create mode 100644 lms/templates/learner_dashboard/program_details_sidebar.underscore diff --git a/common/static/common/js/components/views/progress_circle_view.js b/common/static/common/js/components/views/progress_circle_view.js new file mode 100644 index 0000000000..fbcac9c036 --- /dev/null +++ b/common/static/common/js/components/views/progress_circle_view.js @@ -0,0 +1,96 @@ +(function(define) { + 'use strict'; + + define(['backbone', + 'jquery', + 'underscore', + 'gettext', + 'text!../../../templates/components/progress_circle_view.underscore', + 'text!../../../templates/components/progress_circle_segment.underscore' + ], + function( + Backbone, + $, + _, + gettext, + progressViewTpl, + progressSegmentTpl + ) { + return Backbone.View.extend({ + x: 22, + y: 22, + radius: 16, + degrees: 180, + strokeWidth: 1.2, + + viewTpl: _.template(progressViewTpl), + segmentTpl: _.template(progressSegmentTpl), + + initialize: function() { + var progress = this.model.get('progress'); + + this.model.set({ + totalCourses: progress.completed + progress.in_progress + progress.not_started + }); + + this.render(); + }, + + render: function() { + var data = $.extend({}, this.model.toJSON(), { + circleSegments: this.getProgressSegments(), + x: this.x, + y: this.y, + radius: this.radius, + strokeWidth: this.strokeWidth + }); + + this.$el.html(this.viewTpl(data)); + }, + + getDegreeIncrement: function(total) { + return 360 / total; + }, + + getOffset: function(total) { + return 100 - ((1 / total) * 100); + }, + + getProgressSegments: function() { + var progressHTML = [], + total = this.model.get('totalCourses'), + segmentDash = 2 * Math.PI * this.radius, + degreeInc = this.getDegreeIncrement(total), + data = { + // Remove strokeWidth to show a gap between the segments + dashArray: segmentDash - this.strokeWidth, + degrees: this.degrees, + offset: this.getOffset(total), + x: this.x, + y: this.y, + radius: this.radius, + strokeWidth: this.strokeWidth + }, + i, + segmentData; + + for (i = 0; i < total; i++) { + segmentData = $.extend({}, data, { + classList: (i >= this.model.get('progress').completed) ? 'incomplete' : 'complete', + degrees: data.degrees + (i * degreeInc) + }); + + // Want the incomplete segments to have no gaps + if (segmentData.classList === 'incomplete' && (i + 1) < total) { + segmentData.dashArray = segmentDash; + } + + progressHTML.push(this.segmentTpl(segmentData)); + } + + return progressHTML.join(''); + } + }); + } + ); +}).call(this, define || RequireJS.define); diff --git a/common/static/common/js/spec/components/progress_circle_view_spec.js b/common/static/common/js/spec/components/progress_circle_view_spec.js new file mode 100644 index 0000000000..d0eb70f417 --- /dev/null +++ b/common/static/common/js/spec/components/progress_circle_view_spec.js @@ -0,0 +1,112 @@ +define([ + 'backbone', + 'jquery', + 'edx-ui-toolkit/js/utils/spec-helpers/spec-helpers', + 'common/js/components/views/progress_circle_view' +], function(Backbone, $, SpecHelpers, ProgressCircleView) { + 'use strict'; + + describe('Progress Circle View', function() { + var view = null, + context = { + title: 'XSeries Progress', + label: 'Earned Certificates', + progress: { + completed: 2, + in_progress: 1, + not_started: 3 + } + }, + testCircle, + testText, + initView, + getProgress, + testProgress; + + testCircle = function(progress) { + var $circle = view.$('.progress-circle'); + + expect($circle.find('.complete').length).toEqual(progress.completed); + expect($circle.find('.incomplete').length).toEqual(progress.in_progress + progress.not_started); + }; + + testText = function(progress) { + var $numbers = view.$('.numbers'), + total = progress.completed + progress.in_progress + progress.not_started; + + expect(view.$('.progress-heading').html()).toEqual('XSeries Progress'); + expect(parseInt($numbers.find('.complete').html(), 10)).toEqual(progress.completed); + expect(parseInt($numbers.find('.total').html(), 10)).toEqual(total); + }; + + getProgress = function(x, y, z) { + return { + completed: x, + in_progress: y, + not_started: z + }; + }; + + testProgress = function(x, y, z) { + var progress = getProgress(x, y, z); + + view = initView(progress); + view.render(); + + testCircle(progress); + testText(progress); + }; + + initView = function(progress) { + var data = $.extend({}, context, { + progress: progress + }); + + return new ProgressCircleView({ + el: '.js-program-progress', + model: new Backbone.Model(data) + }); + }; + + beforeEach(function() { + setFixtures('
'); + }); + + afterEach(function() { + view.remove(); + }); + + it('should exist', function() { + var progress = getProgress(2, 1, 3); + + view = initView(progress); + view.render(); + expect(view).toBeDefined(); + }); + + it('should render the progress circle based on the passed in model', function() { + var progress = getProgress(2, 1, 3); + + view = initView(progress); + view.render(); + testCircle(progress); + }); + + it('should render the progress text based on the passed in model', function() { + var progress = getProgress(2, 1, 3); + + view = initView(progress); + view.render(); + testText(progress); + }); + + SpecHelpers.withData({ + 'should render the progress text with only completed courses': [5, 0, 0], + 'should render the progress text with only in progress courses': [0, 4, 0], + 'should render the progress circle with only not started courses': [0, 0, 5], + 'should render the progress text with no completed courses': [0, 2, 3], + 'should render the progress text with no in progress courses': [2, 0, 7], + 'should render the progress text with no not started courses': [2, 4, 0] + }, testProgress); + }); +}); diff --git a/common/static/common/js/spec/main_requirejs.js b/common/static/common/js/spec/main_requirejs.js index 2090414313..c277968e2f 100644 --- a/common/static/common/js/spec/main_requirejs.js +++ b/common/static/common/js/spec/main_requirejs.js @@ -164,6 +164,7 @@ 'common/js/spec/components/paginated_view_spec.js', 'common/js/spec/components/paging_header_spec.js', 'common/js/spec/components/paging_footer_spec.js', + 'common/js/spec/components/progress_circle_view_spec.js', 'common/js/spec/components/search_field_spec.js', 'common/js/spec/components/view_utils_spec.js', 'common/js/spec/utils/edx.utils.validate_spec.js' diff --git a/common/static/common/templates/components/progress_circle_segment.underscore b/common/static/common/templates/components/progress_circle_segment.underscore new file mode 100644 index 0000000000..9dd2545b54 --- /dev/null +++ b/common/static/common/templates/components/progress_circle_segment.underscore @@ -0,0 +1,8 @@ + + diff --git a/common/static/common/templates/components/progress_circle_view.underscore b/common/static/common/templates/components/progress_circle_view.underscore new file mode 100644 index 0000000000..11f86fd1cd --- /dev/null +++ b/common/static/common/templates/components/progress_circle_view.underscore @@ -0,0 +1,15 @@ +<% if (title) { %> +

<%- title %>

+<% } %> +
+ +
+
+ <%- progress.completed %>/<%- totalCourses %> +
+
<% if (label) { %><%- label %><% } %>
+
+
diff --git a/lms/static/images/programs/program-certificate-micromasters.gif b/lms/static/images/programs/program-certificate-micromasters.gif new file mode 100644 index 0000000000000000000000000000000000000000..2185027ae6f6de2bc0d2062f9d73c3a6b7636afb GIT binary patch literal 25032 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 F06SZ16ZrrD literal 0 HcmV?d00001 diff --git a/lms/static/js/learner_dashboard/views/certificate_list_view.js b/lms/static/js/learner_dashboard/views/certificate_list_view.js new file mode 100644 index 0000000000..0e009d1868 --- /dev/null +++ b/lms/static/js/learner_dashboard/views/certificate_list_view.js @@ -0,0 +1,35 @@ +(function(define) { + 'use strict'; + define(['backbone', + 'jquery', + 'underscore', + 'gettext', + 'text!../../../templates/learner_dashboard/certificate_list.underscore' + ], + function( + Backbone, + $, + _, + gettext, + certificateTpl + ) { + return Backbone.View.extend({ + tpl: _.template(certificateTpl), + + initialize: function(options) { + this.title = options.title || false; + this.render(); + }, + + render: function() { + var data = { + title: this.title, + certificateList: this.collection.toJSON() + }; + + this.$el.html(this.tpl(data)); + } + }); + } + ); +}).call(this, define || RequireJS.define); diff --git a/lms/static/js/learner_dashboard/views/program_details_sidebar_view.js b/lms/static/js/learner_dashboard/views/program_details_sidebar_view.js index c7bd481dbc..275b3f7219 100644 --- a/lms/static/js/learner_dashboard/views/program_details_sidebar_view.js +++ b/lms/static/js/learner_dashboard/views/program_details_sidebar_view.js @@ -1,47 +1,97 @@ (function(define) { 'use strict'; - define(['backbone', - 'jquery', - 'underscore', - 'gettext', - 'js/learner_dashboard/views/explore_new_programs_view', - 'js/learner_dashboard/views/certificate_view', - 'text!../../../templates/learner_dashboard/sidebar.underscore' - ], - function( - Backbone, - $, - _, - gettext, - NewProgramsView, - CertificateView, - sidebarTpl - ) { - return Backbone.View.extend({ - el: '.sidebar', + define([ + 'backbone', + 'jquery', + 'underscore', + 'gettext', + 'edx-ui-toolkit/js/utils/html-utils', + 'edx-ui-toolkit/js/utils/string-utils', + 'common/js/components/views/progress_circle_view', + 'js/learner_dashboard/views/certificate_list_view', + 'text!../../../templates/learner_dashboard/program_details_sidebar.underscore' + ], + function( + Backbone, + $, + _, + gettext, + HtmlUtils, + StringUtils, + ProgramProgressView, + CertificateView, + sidebarTpl + ) { + return Backbone.View.extend({ + tpl: HtmlUtils.template(sidebarTpl), - tpl: _.template(sidebarTpl), + initialize: function(options) { + this.courseModel = options.courseModel || {}; + this.certificateCollection = options.certificateCollection || []; + this.programCertificate = this.getProgramCertificate(); + this.render(); + }, - initialize: function(data) { - this.context = data.context; - }, + render: function() { + var data = $.extend({}, this.model.toJSON(), { + programCertificate: this.programCertificate ? + this.programCertificate.toJSON() : {} + }); - render: function() { - this.$el.html(this.tpl(this.context)); - this.postRender(); - }, + HtmlUtils.setHtml(this.$el, this.tpl(data)); + this.postRender(); + }, - postRender: function() { - this.newProgramsView = new NewProgramsView({ - context: this.context - }); + postRender: function() { + if (!this.programCertificate) { + this.progressModel = new Backbone.Model({ + title: StringUtils.interpolate( + gettext('{type} Progress'), + {type: this.model.get('type')} + ), + label: gettext('Earned Certificates'), + progress: { + completed: this.courseModel.get('completed').length, + in_progress: this.courseModel.get('in_progress').length, + not_started: this.courseModel.get('not_started').length + } + }); - this.newCertificateView = new CertificateView({ - context: this.context - }); - } - }); - } + this.programProgressView = new ProgramProgressView({ + el: '.js-program-progress', + model: this.progressModel + }); + } + + if (this.certificateCollection.length) { + this.certificateView = new CertificateView({ + el: '.js-course-certificates', + collection: this.certificateCollection, + title: gettext('Earned Certificates') + }); + } + }, + + getProgramCertificate: function() { + var certificate = this.certificateCollection.findWhere({type: 'program'}), + base = '/static/images/programs/program-certificate-'; + + if (certificate) { + certificate.set({ + img: base + this.getType() + '.gif' + }); + } + + return certificate; + }, + + getType: function() { + var type = this.model.get('type').toLowerCase(); + + return type.replace(/\s+/g, '-'); + } + }); + } ); }).call(this, define || RequireJS.define); diff --git a/lms/static/js/learner_dashboard/views/program_details_view_2017.js b/lms/static/js/learner_dashboard/views/program_details_view_2017.js index 79e3a371a6..e4e0a8c1a5 100644 --- a/lms/static/js/learner_dashboard/views/program_details_view_2017.js +++ b/lms/static/js/learner_dashboard/views/program_details_view_2017.js @@ -34,6 +34,7 @@ this.options = options; this.programModel = new Backbone.Model(this.options.programData); this.courseData = new Backbone.Model(this.options.courseData); + this.certificateCollection = new Backbone.Collection(this.options.certificateData); this.completedCourseCollection = new CourseCardCollection( this.courseData.get('completed') || [], this.options.userPreferences @@ -61,7 +62,7 @@ remainingCount: remainingCount, completedCount: completedCount }; - data = $.extend(data, this.options.programData); + data = $.extend(data, this.programModel.toJSON()); HtmlUtils.setHtml(this.$el, this.tpl(data)); this.postRender(); }, @@ -99,10 +100,12 @@ }).render(); } - new SidebarView({ - el: '.sidebar', - context: this.options - }).render(); + this.sidebarView = new SidebarView({ + el: '.js-program-sidebar', + model: this.programModel, + courseModel: this.courseData, + certificateCollection: this.certificateCollection + }); } }); } diff --git a/lms/static/js/spec/learner_dashboard/program_details_sidebar_view_spec.js b/lms/static/js/spec/learner_dashboard/program_details_sidebar_view_spec.js new file mode 100644 index 0000000000..d4f9408e65 --- /dev/null +++ b/lms/static/js/spec/learner_dashboard/program_details_sidebar_view_spec.js @@ -0,0 +1,127 @@ +define([ + 'backbone', + 'js/learner_dashboard/views/program_details_sidebar_view' +], function(Backbone, ProgramSidebarView) { + 'use strict'; + + describe('Program Progress View', function() { + /* jslint maxlen: 500 */ + var view = null, + // Don't bother linting the format of the test data + /* eslint-disable */ + data = { + programData: {"subtitle": "Explore water management concepts and technologies.", "overview": "\u003ch3\u003eXSeries Program Overview\u003c/h3\u003e\n\u003cp\u003eSafe water supply and hygienic water treatment are prerequisites for the well-being of communities all over the world. This Water XSeries, offered by the water management experts of TU Delft, will give you a unique opportunity to gain access to world-class knowledge and expertise in this field.\u003c/p\u003e\n\u003cp\u003eThis 3-course series will cover questions such as: How does climate change affect water cycle and public safety? How to use existing technologies to treat groundwater and surface water so we have safe drinking water? How do we take care of sewage produced in the cities on a daily basis? You will learn what are the physical, chemical and biological processes involved; carry out simple experiments at home; and have the chance to make a basic design of a drinking water treatment plant\u003c/p\u003e", "weeks_to_complete": null, "corporate_endorsements": [], "video": null, "type": "XSeries", "applicable_seat_types": ["verified", "professional", "credit"], "max_hours_effort_per_week": null, "transcript_languages": ["en-us"], "expected_learning_items": [], "uuid": "988e7ea8-f5e2-4d2e-998a-eae4ad3af322", "title": "Water Management", "languages": ["en-us"], "subjects": [{"card_image_url": "https://stage.edx.org/sites/default/files/subject/image/card/engineering.jpg", "name": "Engineering", "subtitle": "Learn about engineering and more from the best universities and institutions around the world.", "banner_image_url": "https://stage.edx.org/sites/default/files/engineering-1440x210.jpg", "slug": "engineering", "description": "Enroll in an online introduction to engineering course or explore specific areas such as structural, mechanical, electrical, software or aeronautical engineering. EdX offers free online courses in thermodynamics, robot mechanics, aerodynamics and more from top engineering universities."}, {"card_image_url": "https://stage.edx.org/sites/default/files/subject/image/card/biology.jpg", "name": "Biology \u0026 Life Sciences", "subtitle": "Learn about biology and life sciences and more from the best universities and institutions around the world.", "banner_image_url": "https://stage.edx.org/sites/default/files/plant-stomas-1440x210.jpg", "slug": "biology-life-sciences", "description": "Take free online biology courses in genetics, biotechnology, biochemistry, neurobiology and other disciplines. Courses include Fundamentals of Neuroscience from Harvard University, Molecular Biology from MIT and an Introduction to Bioethics from Georgetown."}, {"card_image_url": "https://stage.edx.org/sites/default/files/subject/image/card/science.jpg", "name": "Science", "subtitle": "Learn about science and more from the best universities and institutions around the world.", "banner_image_url": "https://stage.edx.org/sites/default/files/neuron-1440x210.jpg", "slug": "science", "description": "Science is one of the most popular subjects on edX and online courses range from beginner to advanced levels. Areas of study include neuroscience, genotyping, DNA methylation, innovations in environmental science, modern astrophysics and more from top universities and institutions worldwide."}, {"card_image_url": "https://stage.edx.org/sites/default/files/subject/image/card/physics.jpg", "name": "Physics", "subtitle": "Learn about physics and more from the best universities and institutions around the world.", "banner_image_url": "https://stage.edx.org/sites/default/files/header-bg-physics.png", "slug": "physics", "description": "Find online courses in quantum mechanics and magnetism the likes of MIT and Rice University or get an introduction to the violent universe from Australian National University."}, {"card_image_url": "https://stage.edx.org/sites/default/files/subject/image/card/engery.jpg", "name": "Energy \u0026 Earth Sciences", "subtitle": "Learn about energy and earth sciences and more from the best universities and institutions around the world.", "banner_image_url": "https://stage.edx.org/sites/default/files/energy-1440x210.jpg", "slug": "energy-earth-sciences", "description": "EdX\u2019s online Earth sciences courses cover very timely and important issues such as climate change and energy sustainability. Learn about natural disasters and our ability to predict them. Explore the universe with online courses in astrophysics, space plasmas and fusion energy."}, {"card_image_url": "https://stage.edx.org/sites/default/files/subject/image/card/environmental-studies.jpg", "name": "Environmental Studies", "subtitle": "Learn about environmental studies, and more from the best universities and institutions around the world.", "banner_image_url": "https://stage.edx.org/sites/default/files/environment-studies-1440x210.jpg", "slug": "environmental-studies", "description": "Take online courses in environmental science, natural resource management, environmental policy and civic ecology. Learn how to solve complex problems related to pollution control, water treatment and environmental sustainability with free online courses from leading universities worldwide."}, {"card_image_url": "https://stage.edx.org/sites/default/files/subject/image/card/health.jpg", "name": "Health \u0026 Safety", "subtitle": "Learn about health and safety and more from the best universities and institutions around the world.", "banner_image_url": "https://stage.edx.org/sites/default/files/health-and-safety-1440x210.jpg", "slug": "health-safety", "description": "From public health initiatives to personal wellbeing, find online courses covering a wide variety of health and medical subjects. Enroll in free courses from major universities on topics like epidemics, global healthcare and the fundamentals of clinical trials."}, {"card_image_url": "https://stage.edx.org/sites/default/files/subject/image/card/electronics.jpg", "name": "Electronics", "subtitle": "Learn about electronics and more from the best universities and institutions around the world.", "banner_image_url": "https://stage.edx.org/sites/default/files/electronics-a-1440x210.jpg", "slug": "electronics", "description": "The online courses in electrical engineering explore computation structures, electronic interfaces and the principles of electric circuits. Learn the engineering behind drones and autonomous robots or find out how organic electronic devices are changing the way humans interact with machines."}], "individual_endorsements": [], "staff": [{"family_name": "Smets", "uuid": "6078b3dd-ade4-457d-9262-7439a5f4b07e", "bio": "Dr. Arno H.M. Smets is Professor in Solar Energy in the Photovoltaics Material and Devices group at the faculty of Electrical Engineering, Mathematics and Computer Science, Delft University of Technology. From 2005-2010 he worked at the Research Center for Photovoltaics at the National Institute of Advanced Industrial Science and Technology (AIST) in Tsukuba Japan. His research work is focused on processing of thin silicon films, innovative materials and new concepts for photovoltaic applications. He is lecturer for BSc and MSc courses on Photovoltaics and Sustainable Energy at TU Delft. His online edX course on Solar Energy attracted over 150,000 students worldwide. He is co-author of the book \u003cem\u003e\u201cSolar Energy. The physics and engineering of photovoltaic conversion technologies and systems.\u201d\u003c/em\u003e", "profile_image": {}, "profile_image_url": "https://stage.edx.org/sites/default/files/person/image/arno-smets_x110.jpg", "given_name": "Arno", "urls": {"blog": null, "twitter": null, "facebook": null}, "position": {"organization_name": "Delft University of Technology", "title": "Professor, Electrical Engineering, Mathematics and Computer Science"}, "works": [], "slug": "arno-smets"}, {"family_name": "van de Giesen", "uuid": "0e28153f-4e9f-4080-b56f-43480600ecd7", "bio": "Since July 2004, Nick van de Giesen has held the Van Kuffeler Chair of Water Resources Management of the Faculty of Civil Engineering and Geosciences. He teaches Integrated Water Resources Management and Water Management. His main interests are the modeling of complex water resources systems and the development of science-based decision support systems. The interaction between water systems and their users is the core theme in both research portfolio and teaching curriculum. Since 1 April 2009, he is chairman of the \u003ca href=\"http://www.environment.tudelft.nl\"\u003eDelft Research Initiative Environment\u003c/a\u003e.", "profile_image": {}, "profile_image_url": "https://stage.edx.org/sites/default/files/person/image/giesen_vd_nick_110p.jpg", "given_name": "Nick", "urls": {"blog": null, "twitter": null, "facebook": null}, "position": null, "works": [], "slug": "nick-van-de-giesen"}, {"family_name": "Russchenberg", "uuid": "8a94bdb9-ac44-4bc1-a3d2-306f391682b4", "bio": "Herman Russchenberg is engaged in intensive and extensive research into the causes of climate change. His own research involves investigating the role played by clouds and dust particles in the atmosphere, but he is also head of the TU Delft Climate Institute, established in March 2012 to bring together TU Delft researchers working on all aspects of climate and climate change. Russchenberg started out in the faculty of Electrical Engineering, conducting research into the influence of the atmosphere (rain, clouds) on satellite signals. After obtaining his PhD in 1992, he shifted his attention to the physics of water vapour, water droplets, dust particles, sunlight, radiation and emissions in the atmosphere. He is now based in the faculty of Civil Engineering and Geosciences.", "profile_image": {}, "profile_image_url": "https://stage.edx.org/sites/default/files/person/image/russchenberg_herman_110p.jpg", "given_name": "Herman", "urls": {"blog": null, "twitter": null, "facebook": null}, "position": null, "works": [], "slug": "herman-russchenberg"}, {"family_name": "Savenije", "uuid": "4ebdcd93-bb4e-4c0c-9faf-4e513b1a2e33", "bio": "Prof. Savenije was born in 1952 in the Netherlands and studied at the Delft University of Technology, in the Netherlands, where he obtained his MSc in 1977 in Hydrology. As a young graduate hydrologist he worked for six years in Mozambique where he developed a theory on salt intrusion in estuaries and studied the hydrology of international rivers. From 1985-1990 he worked as an international consultant mostly in Asia and Africa. He joined academia in 1990 to complete his PhD in 1992. In 1994 he was appointed Professor of Water Resources Management at the IHE (now UNESCO-IHE, Institute for Water Education) in Delft, the Netherlands. Since 1999, he is Professor of Hydrology at the Delft University of Technology, where he is the head of the Water Resources Section. He is President of the International Association of Hydrological Sciences and Executive Editor of the journal Hydrology and Earth System Sciences.", "profile_image": {}, "profile_image_url": "https://stage.edx.org/sites/default/files/person/image/savenije_hubert_110p.jpg", "given_name": "Hubert", "urls": {"blog": null, "twitter": null, "facebook": null}, "position": null, "works": [], "slug": "hubert-savenije"}, {"family_name": "Stive", "uuid": "a7364bab-8e9c-4265-bd14-598afac1f086", "bio": "Marcel Stive studied Civil engineering at the Delft University of Technology, where he graduated in 1977 and received his doctorate in 1988. After graduating in 1977 Stive started working at WL-Delft Hydraulics, where he worked until 1992. In 1992 he became a professor at the Polytechnic University of Catalonia in Barcelona, Spain. In 1994 her returned to WL-Delft Hydraulics and at the same time began to work as a professor of Coastal Morphodynamics at the Delft University of Technology. Since 2001 Stive is a professor of Coastal Engineering at Delft University of Technology and he is the scientific director of the Water Research Centre Delft since 2003.", "profile_image": {}, "profile_image_url": "https://stage.edx.org/sites/default/files/person/image/stive_marcel_110p.jpg", "given_name": "Marcel", "urls": {"blog": null, "twitter": null, "facebook": null}, "position": {"organization_name": "TU Delft", "title": "Professor"}, "works": [], "slug": "marcel-stive"}, {"family_name": "Rietveld", "uuid": "1b70c71d-20cc-487d-be10-4b31baeff559", "bio": "\u003cp\u003eLuuk Rietveld is professor of Urban Water Cycle Technology at Delft University of Technology. After finalizing his studies in Civil Engineering at Delft University of Technology in 1987, he worked, until 1991, as lecturer/researcher in Sanitary Engineering at the Eduardo Mondlane University, Maputo, Mozambique. Between 1991 and 1994, he was employed at the Management Centre for International Co-operation, and since 1994 he has had an appointment at the Department of Water Management of Delft University of Technology. In 2005, he defended his PhD thesis entitled \"Improving Operation of Drinking Water Treatment through Modelling\".\u003c/p\u003e\n\u003cp\u003eLuuk Rietveld\u2019s main research interests are modelling and optimisation of processes in the urban water cycle, and technological innovations in drinking water treatment and water reclamation for industrial purposes. In addition, he has extensive experience in education, in various cultural contexts, and is interested to explore the use of new ways of teaching through activated and blended learning and MOOCs.\u003c/p\u003e", "profile_image": {}, "profile_image_url": "https://stage.edx.org/sites/default/files/person/image/rietveld_luuk_110p.jpg", "given_name": "Luuk", "urls": {"blog": null, "twitter": null, "facebook": null}, "position": null, "works": [], "slug": "luuk-rietveld-0"}, {"family_name": "van Halem", "uuid": "4ce9ef2a-19e9-46de-9f34-5d755f26736a", "bio": "Doris van Halem is a tenure track Assistant Professor within the Department of Water Management, section Sanitary Engineering of Delft University of Technology. She graduated from Delft University of Technology in Civil Engineering and Geosciences with a cum laude MSc degree (2007). During her studies she developed an interest in global drinking water challenges, illustrated by her internships in Sri Lanka and Benin, resulting in an MSc thesis \u201cCeramic silver impregnated pot filter for household drinking water treatment in developing countries\u201d. In 2011 she completed her PhD research (with honours) on subsurface iron and arsenic removal for drinking water supply in Bangladesh under the guidance of prof. J.C. van Dijk (TU Delft) and prof. dr. G.L. Amy (Unesco-IHE). Currently she supervises BSc, MSc and PhD students, focusing on inorganic constituent behaviour and trace compound removal during soil passage and drinking water treatment - with a particular interest in smart, pro-poor drinking water solutions.", "profile_image": {}, "profile_image_url": "https://stage.edx.org/sites/default/files/person/image/doris_van_halem_1.jpg", "given_name": "Doris", "urls": {"blog": null, "twitter": null, "facebook": null}, "position": {"organization_name": "Delft University of Technology", "title": "Assistant Professor, Sanitary Engineering"}, "works": [], "slug": "doris-van-halem-0"}, {"family_name": "Grefte", "uuid": "463c3f1a-95fc-45aa-b7c0-d01b14126f02", "bio": "Anke Grefte is project manager open, online and blended education for the Faculty of Civil Engineering and Geosciences, Delft University of Technology. She graduated from Delft University of Technology in Civil Engineering with a master\u2019s thesis entitled \"Behaviour of particles in a drinking water distribution network; test rig results\". For this thesis Anke was awarded the Gijs Oskam award for best young researcher. In November 2013, she finished her Ph.D. research on the removal of Natural Organic Matter (NOM) fractions by ion exchange and the impact on drinking water treatment processes and biological stability.", "profile_image": {}, "profile_image_url": "https://stage.edx.org/sites/default/files/person/image/grefte_anke_110p.jpg", "given_name": "Anke", "urls": {"blog": null, "twitter": null, "facebook": null}, "position": null, "works": [], "slug": "anke-grefte-0"}, {"family_name": "Lier", "uuid": "349aa2cc-0107-4632-ad10-869f23966049", "bio": "Jules van Lier is full professor of Environmental Engineering and Wastewater Treatment at the Sanitary Engineering Section of Delft University of Technology and has a 1 day per week posted position at the Unesco-IHE Institute for Water Education, also in Delft Jules van Lier accomplished his PhD on Thermophilic Anaerobic Wastewater Treatment under the supervision of Prof. Gatze Lettinga (1995) at Wageningen University. Throughout his career he has been involved as a senior researcher / project manager in various (inter)national research projects, working on cost-effective water treatment for resource recovery (water, nutrients, biogas, elements). His research projects are focused on closing water cycles in industries and sewage water recovery for irrigated agriculture. The further development of anaerobic treatment technology is his prime focus. In addition to university work he is an Executive Board Member and Scientific Advisor to the LeAF Foundation; regional representative for Western Europe Anaerobic Digestion Specialist group of the International Water Association (IWA); editor of scientific journals (e.g Water Science Technology and Advances in Environmental Research and Development); member of the Paques Technological Advisory Commission; and member of the Advisory Board of World-Waternet, Amsterdam.", "profile_image": {}, "profile_image_url": "https://stage.edx.org/sites/default/files/person/image/lier_van_jules_110p.jpg", "given_name": "Jules van", "urls": {"blog": null, "twitter": null, "facebook": null}, "position": {"organization_name": "Delft University of Technology", "title": "Professor, Sanitary Engineering"}, "works": [], "slug": "jules-van-lier"}, {"family_name": "Kreuk", "uuid": "c1e50a84-1b09-47b5-b704-5e16309d0cba", "bio": "Merle de Kreuk is a wastewater Associate Professor at the Sanitary Engineering department of the Delft University of Technology. Her research focus is on (municipal and industrial) wastewater treatment systems and anaerobic processes, aiming to link the world of Biotechnology to the Civil Engineering, as well as fundamental research to industrial applications. Her main research topics are hydrolysis processes in anaerobic treatment and granule formation and deterioration. Merle\u2019s PhD and Post-Doc research involved the development of aerobic granular sludge technology and up scaling the technology from a three litre lab scale reactor to the full scale Nereda\u00ae process\u00ae. The first application of aerobic granular sludge technology in the Netherlands was opened in May 2012, and currently many more installations are being built, due to its compactness, low energy use and good effluent characteristics. Her previous work experience also involved the position of water treatment technology innovator at Water authority Hollandse Delta on projects such as the Energy Factory in which 14 water authorities cooperated to develop an energy producing sewage treatment plant.", "profile_image": {}, "profile_image_url": "https://stage.edx.org/sites/default/files/person/image/kreuk_de_merle_110p.jpg", "given_name": "Merle de", "urls": {"blog": null, "twitter": null, "facebook": null}, "position": {"organization_name": "Delft University of Technology", "title": "Associate Professor, Sanitary Engineering"}, "works": [], "slug": "merle-de-kreuk"}], "marketing_slug": "water-management", "marketing_url": "https://stage.edx.org/xseries/water-management", "status": "active", "credit_redemption_overview": "These courses can be taken in any order.", "card_image_url": "https://stage.edx.org/sites/default/files/card/images/waterxseries_course0.png", "faq": [], "price_ranges": [{"currency": "USD", "max": 15.0, "total": 35.0, "min": 10.0}], "banner_image": {"small": {"url": "https://d385l2sek0vys7.cloudfront.net/media/programs/banner_images/988e7ea8-f5e2-4d2e-998a-eae4ad3af322.small.jpg", "width": 435, "height": 145}, "large": {"url": "https://d385l2sek0vys7.cloudfront.net/media/programs/banner_images/988e7ea8-f5e2-4d2e-998a-eae4ad3af322.large.jpg", "width": 1440, "height": 480}, "medium": {"url": "https://d385l2sek0vys7.cloudfront.net/media/programs/banner_images/988e7ea8-f5e2-4d2e-998a-eae4ad3af322.medium.jpg", "width": 726, "height": 242}, "x-small": {"url": "https://d385l2sek0vys7.cloudfront.net/media/programs/banner_images/988e7ea8-f5e2-4d2e-998a-eae4ad3af322.x-small.jpg", "width": 348, "height": 116}}, "authoring_organizations": [{"description": "Delft University of Technology is the largest and oldest technological university in the Netherlands. Our research is inspired by the desire to increase fundamental understanding, as well as by societal challenges. We encourage our students to be independent thinkers so they will become engineers capable of solving complex problems. Our students have chosen Delft University of Technology because of our reputation for quality education and research.", "tags": ["charter", "contributor"], "name": "Delft University of Technology (TU Delft)", "homepage_url": null, "key": "DelftX", "certificate_logo_image_url": null, "marketing_url": "https://stage.edx.org/school/delftx", "logo_image_url": "https://stage.edx.org/sites/default/files/school/image/banner/delft_logo_200x101_0.png", "uuid": "c484a523-d396-4aff-90f4-bb7e82e16bf6"}], "job_outlook_items": [], "credit_backing_organizations": [], "weeks_to_complete_min": 4, "weeks_to_complete_max": 8, "min_hours_effort_per_week": null}, + courseData: { + "completed": [{"owners": [{"uuid": "c484a523-d396-4aff-90f4-bb7e82e16bf6", "key": "DelftX", "name": "Delft University of Technology (TU Delft)"}], "uuid": "4ce7a648-3172-475a-84f3-9f843b2157f3", "title": "Introduction to Water and Climate", "image": {"src": "https://stage.edx.org/sites/default/files/course/image/promoted/wc_home_378x225.jpg", "height": null, "description": null, "width": null}, "key": "Delftx+CTB3300WCx", "course_runs": [{"upgrade_url": null, "image": {"src": "https://stage.edx.org/sites/default/files/course/image/promoted/wc_home_378x225.jpg", "height": null, "description": null, "width": null}, "max_effort": null, "is_enrollment_open": true, "course": "Delftx+CTB3300WCx", "content_language": "en-us", "eligible_for_financial_aid": true, "seats": [{"sku": "18AC1BC", "credit_hours": null, "price": "0.00", "currency": "USD", "upgrade_deadline": null, "credit_provider": null, "type": "honor"}, {"sku": "86A734B", "credit_hours": null, "price": "10.00", "currency": "USD", "upgrade_deadline": null, "credit_provider": null, "type": "verified"}], "course_url": "/courses/course-v1:Delftx+CTB3300WCx+2015_T3/", "availability": "Archived", "transcript_languages": ["en-us"], "staff": [{"family_name": "van de Giesen", "uuid": "0e28153f-4e9f-4080-b56f-43480600ecd7", "bio": "Since July 2004, Nick van de Giesen has held the Van Kuffeler Chair of Water Resources Management of the Faculty of Civil Engineering and Geosciences. He teaches Integrated Water Resources Management and Water Management. His main interests are the modeling of complex water resources systems and the development of science-based decision support systems. The interaction between water systems and their users is the core theme in both research portfolio and teaching curriculum. Since 1 April 2009, he is chairman of the \u003ca href=\"http://www.environment.tudelft.nl\"\u003eDelft Research Initiative Environment\u003c/a\u003e.", "profile_image": {}, "profile_image_url": "https://stage.edx.org/sites/default/files/person/image/giesen_vd_nick_110p.jpg", "given_name": "Nick", "urls": {"blog": null, "twitter": null, "facebook": null}, "position": null, "works": [], "slug": "nick-van-de-giesen"}, {"family_name": "Russchenberg", "uuid": "8a94bdb9-ac44-4bc1-a3d2-306f391682b4", "bio": "Herman Russchenberg is engaged in intensive and extensive research into the causes of climate change. His own research involves investigating the role played by clouds and dust particles in the atmosphere, but he is also head of the TU Delft Climate Institute, established in March 2012 to bring together TU Delft researchers working on all aspects of climate and climate change. Russchenberg started out in the faculty of Electrical Engineering, conducting research into the influence of the atmosphere (rain, clouds) on satellite signals. After obtaining his PhD in 1992, he shifted his attention to the physics of water vapour, water droplets, dust particles, sunlight, radiation and emissions in the atmosphere. He is now based in the faculty of Civil Engineering and Geosciences.", "profile_image": {}, "profile_image_url": "https://stage.edx.org/sites/default/files/person/image/russchenberg_herman_110p.jpg", "given_name": "Herman", "urls": {"blog": null, "twitter": null, "facebook": null}, "position": null, "works": [], "slug": "herman-russchenberg"}, {"family_name": "Savenije", "uuid": "4ebdcd93-bb4e-4c0c-9faf-4e513b1a2e33", "bio": "Prof. Savenije was born in 1952 in the Netherlands and studied at the Delft University of Technology, in the Netherlands, where he obtained his MSc in 1977 in Hydrology. As a young graduate hydrologist he worked for six years in Mozambique where he developed a theory on salt intrusion in estuaries and studied the hydrology of international rivers. From 1985-1990 he worked as an international consultant mostly in Asia and Africa. He joined academia in 1990 to complete his PhD in 1992. In 1994 he was appointed Professor of Water Resources Management at the IHE (now UNESCO-IHE, Institute for Water Education) in Delft, the Netherlands. Since 1999, he is Professor of Hydrology at the Delft University of Technology, where he is the head of the Water Resources Section. He is President of the International Association of Hydrological Sciences and Executive Editor of the journal Hydrology and Earth System Sciences.", "profile_image": {}, "profile_image_url": "https://stage.edx.org/sites/default/files/person/image/savenije_hubert_110p.jpg", "given_name": "Hubert", "urls": {"blog": null, "twitter": null, "facebook": null}, "position": null, "works": [], "slug": "hubert-savenije"}, {"family_name": "Stive", "uuid": "a7364bab-8e9c-4265-bd14-598afac1f086", "bio": "Marcel Stive studied Civil engineering at the Delft University of Technology, where he graduated in 1977 and received his doctorate in 1988. After graduating in 1977 Stive started working at WL-Delft Hydraulics, where he worked until 1992. In 1992 he became a professor at the Polytechnic University of Catalonia in Barcelona, Spain. In 1994 her returned to WL-Delft Hydraulics and at the same time began to work as a professor of Coastal Morphodynamics at the Delft University of Technology. Since 2001 Stive is a professor of Coastal Engineering at Delft University of Technology and he is the scientific director of the Water Research Centre Delft since 2003.", "profile_image": {}, "profile_image_url": "https://stage.edx.org/sites/default/files/person/image/stive_marcel_110p.jpg", "given_name": "Marcel", "urls": {"blog": null, "twitter": null, "facebook": null}, "position": {"organization_name": "TU Delft", "title": "Professor"}, "works": [], "slug": "marcel-stive"}], "announcement": "2015-06-09T00:00:00Z", "end": "2015-11-04T12:00:00Z", "uuid": "a36f5673-6637-11e6-a8e3-22000bdde520", "title": "Introduction to Water and Climate", "certificate_url": "/certificates/a37c59143d9d422eb6ab11e1053b8eb5", "enrollment_start": null, "start": "2015-09-01T04:00:00Z", "min_effort": null, "short_description": "Explore how climate change, water availability, and engineering innovation are key challenges for our planet.", "hidden": false, "level_type": "Intermediate", "type": "verified", "enrollment_open_date": "Jan 01, 1900", "marketing_url": "https://stage.edx.org/course/introduction-water-climate-delftx-ctb3300wcx-0", "is_course_ended": true, "instructors": [], "full_description": "\u003cp\u003eWater is essential for life on earth and of crucial importance for society. Cycling across the planet and the atmosphere, it also has a major influence on our climate.\u003c/p\u003e\n\u003cp\u003eWeekly modules are hosted by four different professors, all of them being international experts in their field. The course consists of knowledge clips, movies, exercises, discussion and homework assignments. It finishes with an examination.\u003c/p\u003e\n\u003cp\u003eThis course combined with the courses \"Introduction to Drinking Water Treatment\" (new edition to start in January 2016) and \"Introduction to the Treatment of Urban Sewage\" (new edition to start in April 2016) forms the Water XSeries, Faculty of Civil Engineering and Geosciences, TU Delft.\u003c/p\u003e\n\u003cp\u003e\u003cem\u003e\u003cstrong\u003eLICENSE\u003c/strong\u003e\u003cbr /\u003e\nThe course materials of this course are Copyright Delft University of Technology and are licensed under a Creative Commons Attribution-NonCommercial-ShareAlike (CC-BY-NC-SA) 4.0 International License.\u003c/em\u003e\u003c/p\u003e", "key": "course-v1:Delftx+CTB3300WCx+2015_T3", "enrollment_end": null, "reporting_type": "mooc", "advertised_start": null, "mobile_available": true, "modified": "2017-04-06T12:26:52.594942Z", "is_enrolled": false, "pacing_type": "instructor_paced", "video": {"src": "http://www.youtube.com/watch?v=dJEhwq0sXiQ", "image": {"src": "https://stage.edx.org/sites/default/files/course/image/featured-card/wc_home_378x225.jpg", "width": null, "description": null, "height": null}, "description": null}}]}, {"owners": [{"uuid": "c484a523-d396-4aff-90f4-bb7e82e16bf6", "key": "DelftX", "name": "Delft University of Technology (TU Delft)"}], "uuid": "a0aade38-7a50-4afb-97cd-2214c572cc86", "title": "Urban Sewage Treatment", "image": {"src": "https://stage.edx.org/sites/default/files/course/image/promoted/sewage_home_378x225.jpg", "height": null, "description": null, "width": null}, "key": "DelftX+CTB3365STx", "course_runs": [{"upgrade_url": null, "image": {"src": "https://stage.edx.org/sites/default/files/course/image/promoted/sewage_home_378x225.jpg", "height": null, "description": null, "width": null}, "max_effort": null, "is_enrollment_open": true, "course": "DelftX+CTB3365STx", "content_language": "en-us", "eligible_for_financial_aid": true, "seats": [{"sku": "01CDD4F", "credit_hours": null, "price": "0.00", "currency": "USD", "upgrade_deadline": null, "credit_provider": null, "type": "honor"}, {"sku": "B4F253D", "credit_hours": null, "price": "10.00", "currency": "USD", "upgrade_deadline": null, "credit_provider": null, "type": "verified"}], "course_url": "/courses/course-v1:Delftx+CTB3365STx+1T2016/", "availability": "Archived", "transcript_languages": ["en-us"], "staff": [{"family_name": "Lier", "uuid": "349aa2cc-0107-4632-ad10-869f23966049", "bio": "Jules van Lier is full professor of Environmental Engineering and Wastewater Treatment at the Sanitary Engineering Section of Delft University of Technology and has a 1 day per week posted position at the Unesco-IHE Institute for Water Education, also in Delft Jules van Lier accomplished his PhD on Thermophilic Anaerobic Wastewater Treatment under the supervision of Prof. Gatze Lettinga (1995) at Wageningen University. Throughout his career he has been involved as a senior researcher / project manager in various (inter)national research projects, working on cost-effective water treatment for resource recovery (water, nutrients, biogas, elements). His research projects are focused on closing water cycles in industries and sewage water recovery for irrigated agriculture. The further development of anaerobic treatment technology is his prime focus. In addition to university work he is an Executive Board Member and Scientific Advisor to the LeAF Foundation; regional representative for Western Europe Anaerobic Digestion Specialist group of the International Water Association (IWA); editor of scientific journals (e.g Water Science Technology and Advances in Environmental Research and Development); member of the Paques Technological Advisory Commission; and member of the Advisory Board of World-Waternet, Amsterdam.", "profile_image": {}, "profile_image_url": "https://stage.edx.org/sites/default/files/person/image/lier_van_jules_110p.jpg", "given_name": "Jules van", "urls": {"blog": null, "twitter": null, "facebook": null}, "position": {"organization_name": "Delft University of Technology", "title": "Professor, Sanitary Engineering"}, "works": [], "slug": "jules-van-lier"}, {"family_name": "Kreuk", "uuid": "c1e50a84-1b09-47b5-b704-5e16309d0cba", "bio": "Merle de Kreuk is a wastewater Associate Professor at the Sanitary Engineering department of the Delft University of Technology. Her research focus is on (municipal and industrial) wastewater treatment systems and anaerobic processes, aiming to link the world of Biotechnology to the Civil Engineering, as well as fundamental research to industrial applications. Her main research topics are hydrolysis processes in anaerobic treatment and granule formation and deterioration. Merle\u2019s PhD and Post-Doc research involved the development of aerobic granular sludge technology and up scaling the technology from a three litre lab scale reactor to the full scale Nereda\u00ae process\u00ae. The first application of aerobic granular sludge technology in the Netherlands was opened in May 2012, and currently many more installations are being built, due to its compactness, low energy use and good effluent characteristics. Her previous work experience also involved the position of water treatment technology innovator at Water authority Hollandse Delta on projects such as the Energy Factory in which 14 water authorities cooperated to develop an energy producing sewage treatment plant.", "profile_image": {}, "profile_image_url": "https://stage.edx.org/sites/default/files/person/image/kreuk_de_merle_110p.jpg", "given_name": "Merle de", "urls": {"blog": null, "twitter": null, "facebook": null}, "position": {"organization_name": "Delft University of Technology", "title": "Associate Professor, Sanitary Engineering"}, "works": [], "slug": "merle-de-kreuk"}], "announcement": "2015-07-24T00:00:00Z", "end": "2016-07-01T22:30:00Z", "uuid": "a36f70c1-6637-11e6-a8e3-22000bdde520", "title": "Introduction to the Treatment of Urban Sewage", "certificate_url": "/certificates/bed3980e67ca40f0b31e309d9dfe9e7e", "enrollment_start": null, "start": "2016-04-12T04:00:00Z", "min_effort": null, "short_description": "Learn about urban water services, focusing on basic sewage treatment technologies.", "hidden": false, "level_type": "Intermediate", "type": "verified", "enrollment_open_date": "Jan 01, 1900", "marketing_url": "https://stage.edx.org/course/introduction-treatment-urban-sewage-delftx-ctb3365stx-0", "is_course_ended": true, "instructors": [], "full_description": "\u003cp\u003eThis course will focus on basic technologies for the treatment of urban sewage. Unit processes involved in the treatment chain will be described as well as the physical, chemical and biological processes involved. There will be an emphasis on water quality and the functionality of each unit process within the treatment chain. After the course one should be able to recognise the process units, describe their function and make simple design calculations on urban sewage treatment plants.\u003c/p\u003e\n\u003cp\u003eThe course consists of 6 modules:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eSewage treatment plant overview. In this module you will learn what major pollutants are present in the sewage and why we need to treat sewage prior to discharge to surface waters. The functional units will be briefly discussed\u003c/li\u003e\n\u003cli\u003ePrimary treatment. In this module you learn how coarse material, sand \u0026 grit are removed from the sewage and how to design primary clarification tanks\u003c/li\u003e\n\u003cli\u003eBiological treatment. In this module you learn the basics of the carbon, nitrogen and phosphorous cycle and how biological processes are used to treat the main pollutants of concern.\u003c/li\u003e\n\u003cli\u003eActivated sludge process. In this module you learn the design principles of conventional activated sludge processes including the secondary clarifiers and aeration demand of aeration tanks.\u003c/li\u003e\n\u003cli\u003eNitrogen and phosphorus removal. In this module you learn the principles of biological nitrogen removal as well as phosphorus removal by biological and/or chemical means.\u003c/li\u003e\n\u003cli\u003eSludge treatment. In this module you will the design principles of sludge thickeners, digesters and dewatering facilities for the concentration and stabilisation of excess sewage sludge. Potentials for energy recovery via the produced biogas will be discussed as well as the direct anaerobic treatment of urban sewage in UASB reactors when climate conditions allow.\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eThis course in combination with the courses \"\u003ca href=\"https://www.edx.org/course/introduction-water-climate-delftx-ctb3300wcx-0\"\u003eIntroduction to Water and Climate\u003c/a\u003e\" and \"\u003ca href=\"https://www.edx.org/course/introduction-drinking-water-treatment-delftx-ctb3365dwx-0\"\u003eIntroduction to Drinking Water Treatment\u003c/a\u003e\" forms the Water XSeries, by DelftX.\u003c/p\u003e\n\u003chr /\u003e\n\u003cp\u003e\u003cstrong\u003e\u003cem\u003eLICENSE\u003c/em\u003e\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003cem\u003eThe course materials of this course are Copyright Delft University of Technology and are licensed under a Creative Commons Attribution-NonCommercial-ShareAlike (CC-BY-NC-SA) 4.0 International License.\u003c/em\u003e\u003c/p\u003e", "key": "course-v1:Delftx+CTB3365STx+1T2016", "enrollment_end": null, "reporting_type": "mooc", "advertised_start": null, "mobile_available": true, "modified": "2017-04-06T12:26:52.679900Z", "is_enrolled": true, "pacing_type": "instructor_paced", "video": {"src": "http://www.youtube.com/watch?v=pcSsOE-F4e8", "image": {"src": "https://stage.edx.org/sites/default/files/course/image/featured-card/sewage_home_378x225.jpg", "width": null, "description": null, "height": null}, "description": null}}]}], + "in_progress": [], "uuid": "988e7ea8-f5e2-4d2e-998a-eae4ad3af322", + "not_started": [{"owners": [{"uuid": "c484a523-d396-4aff-90f4-bb7e82e16bf6", "key": "DelftX", "name": "Delft University of Technology (TU Delft)"}], "uuid": "51275d00-1f3f-462f-8231-ce42821cc1dd", "title": "Solar Energy", "image": {"src": "https://stage.edx.org/sites/default/files/course/image/promoted/solar-energy_378x225.jpg", "height": null, "description": null, "width": null}, "key": "DelftX+ET3034TUx", "course_runs": [{"upgrade_url": null, "image": {"src": "https://stage.edx.org/sites/default/files/course/image/promoted/solar-energy_378x225.jpg", "height": null, "description": null, "width": null}, "max_effort": null, "is_enrollment_open": true, "course": "DelftX+ET3034TUx", "content_language": null, "eligible_for_financial_aid": true, "seats": [{"sku": "E433FA8", "credit_hours": null, "price": "0.00", "currency": "USD", "upgrade_deadline": null, "credit_provider": null, "type": "honor"}], "course_url": "/courses/DelftX/ET3034TUx/2013_Fall/", "availability": "Archived", "transcript_languages": [], "staff": [{"family_name": "Smets", "uuid": "6078b3dd-ade4-457d-9262-7439a5f4b07e", "bio": "Dr. Arno H.M. Smets is Professor in Solar Energy in the Photovoltaics Material and Devices group at the faculty of Electrical Engineering, Mathematics and Computer Science, Delft University of Technology. From 2005-2010 he worked at the Research Center for Photovoltaics at the National Institute of Advanced Industrial Science and Technology (AIST) in Tsukuba Japan. His research work is focused on processing of thin silicon films, innovative materials and new concepts for photovoltaic applications. He is lecturer for BSc and MSc courses on Photovoltaics and Sustainable Energy at TU Delft. His online edX course on Solar Energy attracted over 150,000 students worldwide. He is co-author of the book \u003cem\u003e\u201cSolar Energy. The physics and engineering of photovoltaic conversion technologies and systems.\u201d\u003c/em\u003e", "profile_image": {}, "profile_image_url": "https://stage.edx.org/sites/default/files/person/image/arno-smets_x110.jpg", "given_name": "Arno", "urls": {"blog": null, "twitter": null, "facebook": null}, "position": {"organization_name": "Delft University of Technology", "title": "Professor, Electrical Engineering, Mathematics and Computer Science"}, "works": [], "slug": "arno-smets"}], "announcement": "2013-05-08T00:00:00Z", "end": "2013-12-06T10:30:00Z", "uuid": "f33a9660-b5d0-47a9-9bfa-a326d9ed4ef2", "title": "Solar Energy", "certificate_url": null, "enrollment_start": null, "start": "2013-09-16T04:00:00Z", "min_effort": null, "short_description": "Discover the power of solar energy and design a complete photovoltaic system.", "hidden": false, "level_type": null, "type": "honor", "enrollment_open_date": "Jan 01, 1900", "marketing_url": "https://stage.edx.org/course/solar-energy-delftx-et3034tux", "is_course_ended": true, "instructors": [], "full_description": "", "key": "DelftX/ET3034TUx/2013_Fall", "enrollment_end": null, "reporting_type": "mooc", "advertised_start": null, "mobile_available": false, "modified": "2017-04-06T12:26:54.345710Z", "is_enrolled": false, "pacing_type": "instructor_paced", "video": {"src": "http://www.youtube.com/watch?v=LLiNzrIubF0", "image": null, "description": null}}]}, {"owners": [{"uuid": "c484a523-d396-4aff-90f4-bb7e82e16bf6", "key": "DelftX", "name": "Delft University of Technology (TU Delft)"}], "uuid": "7c430382-d477-4bac-9c29-f36c24f1935f", "title": "Drinking Water Treatment", "image": {"src": "https://stage.edx.org/sites/default/files/course/image/promoted/drinking_water_home_378x225.jpg", "height": null, "description": null, "width": null}, "key": "DelftX+CTB3365DWx", "course_runs": [{"upgrade_url": null, "image": {"src": "https://stage.edx.org/sites/default/files/course/image/promoted/drinking_water_home_378x225.jpg", "height": null, "description": null, "width": null}, "max_effort": null, "is_enrollment_open": true, "course": "DelftX+CTB3365DWx", "content_language": "en-us", "eligible_for_financial_aid": true, "seats": [{"sku": "74AC06B", "credit_hours": 100, "price": "15.00", "currency": "USD", "upgrade_deadline": "2016-04-30T00:00:00Z", "credit_provider": "mit", "type": "credit"}, {"sku": "0BBAE34", "credit_hours": null, "price": "0.00", "currency": "USD", "upgrade_deadline": null, "credit_provider": null, "type": "honor"}, {"sku": "8E52FAE", "credit_hours": null, "price": "10.00", "currency": "USD", "upgrade_deadline": "2016-03-25T01:06:00Z", "credit_provider": null, "type": "verified"}], "course_url": "/courses/course-v1:DelftX+CTB3365DWx+1T2016/", "availability": "Current", "transcript_languages": ["en-us"], "staff": [{"family_name": "Rietveld", "uuid": "1b70c71d-20cc-487d-be10-4b31baeff559", "bio": "\u003cp\u003eLuuk Rietveld is professor of Urban Water Cycle Technology at Delft University of Technology. After finalizing his studies in Civil Engineering at Delft University of Technology in 1987, he worked, until 1991, as lecturer/researcher in Sanitary Engineering at the Eduardo Mondlane University, Maputo, Mozambique. Between 1991 and 1994, he was employed at the Management Centre for International Co-operation, and since 1994 he has had an appointment at the Department of Water Management of Delft University of Technology. In 2005, he defended his PhD thesis entitled \"Improving Operation of Drinking Water Treatment through Modelling\".\u003c/p\u003e\n\u003cp\u003eLuuk Rietveld\u2019s main research interests are modelling and optimisation of processes in the urban water cycle, and technological innovations in drinking water treatment and water reclamation for industrial purposes. In addition, he has extensive experience in education, in various cultural contexts, and is interested to explore the use of new ways of teaching through activated and blended learning and MOOCs.\u003c/p\u003e", "profile_image": {}, "profile_image_url": "https://stage.edx.org/sites/default/files/person/image/rietveld_luuk_110p.jpg", "given_name": "Luuk", "urls": {"blog": null, "twitter": null, "facebook": null}, "position": null, "works": [], "slug": "luuk-rietveld-0"}, {"family_name": "van Halem", "uuid": "4ce9ef2a-19e9-46de-9f34-5d755f26736a", "bio": "Doris van Halem is a tenure track Assistant Professor within the Department of Water Management, section Sanitary Engineering of Delft University of Technology. She graduated from Delft University of Technology in Civil Engineering and Geosciences with a cum laude MSc degree (2007). During her studies she developed an interest in global drinking water challenges, illustrated by her internships in Sri Lanka and Benin, resulting in an MSc thesis \u201cCeramic silver impregnated pot filter for household drinking water treatment in developing countries\u201d. In 2011 she completed her PhD research (with honours) on subsurface iron and arsenic removal for drinking water supply in Bangladesh under the guidance of prof. J.C. van Dijk (TU Delft) and prof. dr. G.L. Amy (Unesco-IHE). Currently she supervises BSc, MSc and PhD students, focusing on inorganic constituent behaviour and trace compound removal during soil passage and drinking water treatment - with a particular interest in smart, pro-poor drinking water solutions.", "profile_image": {}, "profile_image_url": "https://stage.edx.org/sites/default/files/person/image/doris_van_halem_1.jpg", "given_name": "Doris", "urls": {"blog": null, "twitter": null, "facebook": null}, "position": {"organization_name": "Delft University of Technology", "title": "Assistant Professor, Sanitary Engineering"}, "works": [], "slug": "doris-van-halem-0"}, {"family_name": "Grefte", "uuid": "463c3f1a-95fc-45aa-b7c0-d01b14126f02", "bio": "Anke Grefte is project manager open, online and blended education for the Faculty of Civil Engineering and Geosciences, Delft University of Technology. She graduated from Delft University of Technology in Civil Engineering with a master\u2019s thesis entitled \"Behaviour of particles in a drinking water distribution network; test rig results\". For this thesis Anke was awarded the Gijs Oskam award for best young researcher. In November 2013, she finished her Ph.D. research on the removal of Natural Organic Matter (NOM) fractions by ion exchange and the impact on drinking water treatment processes and biological stability.", "profile_image": {}, "profile_image_url": "https://stage.edx.org/sites/default/files/person/image/grefte_anke_110p.jpg", "given_name": "Anke", "urls": {"blog": null, "twitter": null, "facebook": null}, "position": null, "works": [], "slug": "anke-grefte-0"}], "announcement": "2015-07-24T00:00:00Z", "end": "2017-07-20T21:30:00Z", "uuid": "a36ed16a-6637-11e6-a8e3-22000bdde520", "title": "Introduction to Drinking Water Treatment", "certificate_url": null, "enrollment_start": "2016-06-15T00:00:00Z", "start": "2016-01-12T05:00:00Z", "min_effort": null, "short_description": "Learn about urban water services, focusing on conventional technologies for drinking water treatment.", "hidden": false, "level_type": "Intermediate", "type": "credit", "enrollment_open_date": "Jun 15, 2016", "marketing_url": "https://stage.edx.org/course/introduction-drinking-water-treatment-delftx-ctb3365dwx-0", "is_course_ended": false, "instructors": [], "full_description": "\u003cp\u003eThis course focuses on conventional technologies for drinking water treatment. Unit processes, involved in the treatment chain, are discussed as well as the physical, chemical and biological processes involved. The emphasis is on the effect of treatment on water quality and the dimensions of the unit processes in the treatment chain. After the course one should be able to recognise the process units, describe their function, and make basic calculations for a preliminary design of a drinking water treatment plant.\u003c/p\u003e\n\u003cp\u003eThe course consists of 4 modules:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eIntroduction to drinking water treatment. In this module you learn to describe the important disciplines, schemes and evaluation criteria involved in the design phase.\u003c/li\u003e\n\u003cli\u003eWater quality. In this module you learn to identify the drinking water quality parameters to be improved and explain what treatment train or scheme is needed.\u003c/li\u003e\n\u003cli\u003eGroundwater treatment. In this module you learn to calculate the dimensions of the groundwater treatment processes and draw groundwater treatment schemes.\u003c/li\u003e\n\u003cli\u003eSurface water treatment. In this module you learn to calculate the dimensions of the surface water treatment processes and draw surface water treatment schemes.\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eThis course in combination with the courses \"\u003ca href=\"https://www.edx.org/course/introduction-water-climate-delftx-ctb3300wcx-0\"\u003eIntroduction to Water and Climate\u003c/a\u003e\" and \"\u003ca href=\"https://www.edx.org/course/introduction-treatment-urban-sewage-delftx-ctb3365stx\"\u003eIntroduction to the Treatment of Urban Sewage\u003c/a\u003e\" forms the Water XSeries, by DelftX.\u003c/p\u003e\n\u003chr /\u003e\n\u003cp\u003e\u003cstrong\u003e\u003cem\u003eLICENSE\u003c/em\u003e\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003cem\u003eThe course materials of this course are Copyright Delft University of Technology and are licensed under a Creative Commons Attribution-NonCommercial-ShareAlike (CC-BY-NC-SA) 4.0 International License.\u003c/em\u003e\u003c/p\u003e", "key": "course-v1:DelftX+CTB3365DWx+1T2016", "enrollment_end": null, "reporting_type": "mooc", "advertised_start": null, "mobile_available": true, "modified": "2017-04-06T12:26:52.652365Z", "is_enrolled": false, "pacing_type": "instructor_paced", "video": {"src": "http://www.youtube.com/watch?v=0xPZXLHtRJw", "image": {"src": "https://stage.edx.org/sites/default/files/course/image/featured-card/h20_new_378x225.jpg", "width": null, "description": null, "height": null}, "description": null}}]}]}, + certificateData: [ + { + "url": "/certificates/a37c59143d9d422eb6ab11e1053b8eb5", "type": "course", "title": "Introduction to Water and Climate" + }, { + "url": "/certificates/bed3980e67ca40f0b31e309d9dfe9e7e", "type": "course", "title": "Introduction to the Treatment of Urban Sewage" + } + ], + urls: {"program_listing_url": "/dashboard/programs/", "commerce_api_url": "/api/commerce/v0/baskets/", "track_selection_url": "/course_modes/choose/"}, + userPreferences: {"pref-lang": "en"} + }, + /* eslint-enable */ + programModel, + courseData, + certificateCollection, + testCircle, + testText, + initView; + + testCircle = function(progress) { + var $circle = view.$('.progress-circle'), + incomplete = progress.in_progress.length + progress.not_started.length; + + expect($circle.find('.complete').length).toEqual(progress.completed.length); + expect($circle.find('.incomplete').length).toEqual(incomplete); + }; + + testText = function(progress) { + var $numbers = view.$('.numbers'), + total = progress.completed.length + progress.in_progress.length + progress.not_started.length; + + expect(view.$('.progress-heading').html()).toEqual('XSeries Progress'); + expect(parseInt($numbers.find('.complete').html(), 10)).toEqual(progress.completed.length); + expect(parseInt($numbers.find('.total').html(), 10)).toEqual(total); + }; + + initView = function() { + return new ProgramSidebarView({ + el: '.js-program-sidebar', + model: programModel, + courseModel: courseData, + certificateCollection: certificateCollection + }); + }; + + beforeEach(function() { + setFixtures('
'); + programModel = new Backbone.Model(data.programData); + courseData = new Backbone.Model(data.courseData); + certificateCollection = new Backbone.Collection(data.certificateData); + }); + + afterEach(function() { + view.remove(); + }); + + it('should exist', function() { + view = initView(); + expect(view).toBeDefined(); + }); + + it('should render the progress view if there is no program certificate', function() { + view = initView(); + testCircle(data.courseData); + testText(data.courseData); + }); + + it('should render the program certificate if earned', function() { + var $certLink, + programCert = { + url: '/program-cert', + type: 'program', + title: 'And Justice For All...' + }, + altText = 'Open the certificate you earned for the ' + programCert.title + ' program.'; + + certificateCollection.add(programCert); + view = initView(); + expect(view.$('.progress-circle-wrapper')[0]).not.toBeInDOM(); + $certLink = view.$('.program-cert-link'); + expect($certLink[0]).toBeInDOM(); + expect($certLink.attr('href')).toEqual(programCert.url); + expect($certLink.find('.program-cert').attr('alt')).toEqual(altText); + expect(view.$('.certificate-heading')).toHaveText('Your XSeries Certificate'); + }); + + it('should render the course certificate list', function() { + var $certificates; + + view = initView(); + $certificates = view.$('.certificate-list .certificate'); + + expect(view.$('.course-list-heading').html()).toEqual('Earned Certificates'); + expect($certificates).toHaveLength(certificateCollection.length); + $certificates.each(function(i, el) { + var $link = $(el).find('.certificate-link'), + model = certificateCollection.at(i); + + expect($link.attr('href')).toEqual(model.get('url')); + expect($link.html()).toEqual(model.get('title')); + }); + }); + + it('should not render the course certificate view if no certificates have been earned', function() { + certificateCollection.reset(); + view = initView(); + expect(view).toBeDefined(); + expect(view.$('.js-course-certificates')).toBeEmpty(); + }); + }); +}); diff --git a/lms/static/lms/js/spec/main.js b/lms/static/lms/js/spec/main.js index ca87daaf26..3d0949089f 100644 --- a/lms/static/lms/js/spec/main.js +++ b/lms/static/lms/js/spec/main.js @@ -743,6 +743,7 @@ 'js/spec/learner_dashboard/program_card_view_spec.js', 'js/spec/learner_dashboard/sidebar_view_spec.js', 'js/spec/learner_dashboard/program_details_header_spec.js', + 'js/spec/learner_dashboard/program_details_sidebar_view_spec.js', 'js/spec/learner_dashboard/course_card_view_spec.js', 'js/spec/learner_dashboard/course_enroll_view_spec.js', 'js/spec/learner_dashboard/course_enroll_view_spec_2017.js', diff --git a/lms/static/sass/_build-learner-dashboard.scss b/lms/static/sass/_build-learner-dashboard.scss index e37c4dadf6..622d7d49e5 100644 --- a/lms/static/sass/_build-learner-dashboard.scss +++ b/lms/static/sass/_build-learner-dashboard.scss @@ -6,5 +6,6 @@ @import 'elements/course-card'; @import 'elements/program-card'; @import 'elements-v2/icons'; +@import 'elements/progress-circle'; @import 'views/program-details'; @import 'views/program-list'; diff --git a/lms/static/sass/elements/_progress-circle.scss b/lms/static/sass/elements/_progress-circle.scss new file mode 100644 index 0000000000..2ca098a228 --- /dev/null +++ b/lms/static/sass/elements/_progress-circle.scss @@ -0,0 +1,66 @@ +$progress-title-color: $blue-d1 !default; +$progress-complete-color: $blue-u1 !default; +$progress-incomplete-color: $gray-l3 !default; +$progress-complete-number-color: $blue-d1 !default; +$progress-incomplete-number-color: $gray !default; +$progress-number-label-color: palette(grayscale, base) !default; + +.program-progress { + width: 300px; + margin: 0 auto 30px; + + @media(min-width: $bp-screen-md) { + margin-left: 0; + } +} + +.progress-heading { + color: $progress-title-color; + text-align: center; + margin-bottom: 0; + font: { + size: 1.1em; + weight: 700; + } +} + +.progress-circle-wrapper { + position: relative; + margin-top: -20px; + width: 300px; + height: 300px; + + .progress-label { + position: absolute; + width: 100%; + top: 92px; + text-align: center; + } + + .numbers { + font-size: 3em; + color: $progress-incomplete-number-color; + + .complete { + color: $progress-complete-number-color; + } + } + + .label { + font: { + size: 1.1em; + weight: 600; + } + color: $progress-number-label-color; + } +} + +.progress-circle { + .complete { + stroke: $progress-complete-color; + } + + .incomplete { + stroke: $progress-incomplete-color; + } +} diff --git a/lms/static/sass/views/_program-details.scss b/lms/static/sass/views/_program-details.scss index 02dbf1039b..0afa514dab 100644 --- a/lms/static/sass/views/_program-details.scss +++ b/lms/static/sass/views/_program-details.scss @@ -47,8 +47,8 @@ } .crumb { + @include float(left); position: relative; - float: left; font-size: font-size(x-small); line-height: line-height(x-small); color: palette(grayscale, dark); @@ -78,14 +78,18 @@ } // CSS for April 2017 version of Program Details Page - .program-details { .window-wrap { background-color: $white; } -} -.program-details-wrapper { + .wrapper-footer { + @include clearfix(); + clear: both; + } +} + +.program-details-wrapper { .program-details-header { background-color: $light-gray4; display: flex; @@ -93,14 +97,20 @@ font-family: 'Open Sans'; font-weight: normal; flex-wrap: wrap; - padding-top: 40px; - padding-bottom: 35px; - margin-left: 10px; - margin-right: 10px; + padding: 40px 10px 35px; @media(min-width: $bp-screen-md) { - margin-left: 30px; - margin-right: 80px; + padding: { + left: 30px; + right: 30px; + } + } + + @media(min-width: $lms-max-width) { + padding: { + left: calc(((100% - 1180px) / 2) + 30px); + right: calc(((100% - 1180px) / 2) + 30px); + } } .hd-1 { @@ -111,7 +121,7 @@ } .program-details-icon { - margin-left: 3px; + @include margin-left(3px); margin-top: 10px; height: auto; @@ -177,7 +187,7 @@ margin-top: auto; margin-bottom: auto; @media(min-width: $bp-screen-md) { - margin: 10px 0 0 0; + @include margin-right(10px 0 0 0); } } @@ -187,8 +197,8 @@ width: 30%; .orgs .org-logo { + @include margin-left(2.5%); width: 46.5%; - margin-left: 2.5%; height: auto; } } @@ -197,26 +207,49 @@ width: 25%; } } - } .program-details-content { + width: 100%; + margin-bottom: 30px; + padding: 30px 10px; + @media(min-width: $bp-screen-md) { - margin-left: 30px; + @include float(left); + padding: { + left: 30px; + right: 30px; + } + width: calc( 100% - 330px ); + position: relative; + } + + @media(min-width: $bp-screen-lg) { + width: calc( 100% - 510px ); + max-width: 700px; + } + + @media(min-width: $lms-max-width) { + @include margin-left(calc((100% - 1180px) / 2)); } - margin-left: 10px; } + .course-list-heading { font-family: "Open Sans"; font-weight: bold; + text-transform: uppercase; color: palette(primary, dark); font-size: 0.9375em; line-height: normal; - margin-top: 10px; - margin-bottom: 0; + padding-bottom: 5px; + border-bottom: 3px solid $divider-color; + margin: { + top: 10px; + bottom: 20px; + } .status { - margin-right: 7px; + @include margin-right(7px); } } @@ -225,27 +258,9 @@ } .course-list-headings { - width: 700px; - - .divider { - margin-left: 0; - margin-bottom: 20px; - background-color: $divider-color; - margin-top: 5px; - height: 3px; - width: 315px; - @media(min-width: $bp-screen-sm) { - width: 550px; - } - @media(min-width: $bp-screen-md) { - width: 700px; - } - border: none; - } - .motivating-section { + @include margin-left(15px); font-size: 0.9375em; - margin-left: 15px; width: 310px; @media(min-width: $bp-screen-sm) { width: auto; @@ -264,11 +279,7 @@ } .program-heading { - @media(min-width: $bp-screen-md) { - width: 70%; - } - width: 90%; - margin-top: 40px; + width: 100%; margin-bottom: 40px; .program-heading-title { @@ -313,17 +324,17 @@ /* IE11 CSS styles */ @media(min-width: $bp-screen-md) and (-ms-high-contrast: none), (-ms-high-contrast: active) { - float: right; + @include float(right); } } } .select-choice { + @include margin-right(2px); font-family: "Open Sans"; font-weight: bold; font-size: 0.9375em; color: palette(grayscale, base); margin-top: 6px; - margin-right: 2px; display: block; @media(min-width: $bp-screen-md) { @@ -339,21 +350,19 @@ } } .run-select { + @include margin-right(10px); width: 95%; @media(min-width: $bp-screen-sm) { width: 300px; } height: 34px; padding: 0; - margin-right: 10px; } } .program-course-card { - @media(min-width: $bp-screen-md) { - width: 100%; - } - + width: 100%; + padding: 15px; margin-bottom: 10px; @media(min-width: $bp-screen-md) { @@ -363,12 +372,6 @@ .section { display: flex; justify-content: space-between; - margin-right: 40px; - margin-left: 15px; - - @media(min-width: $bp-screen-sm) { - margin-left: 20px; - } @media(min-width: $bp-screen-md) { flex-wrap: wrap; @@ -400,9 +403,12 @@ .course-meta-container { display: flex; flex-direction: column; + flex-wrap: wrap; @media(min-width: $bp-screen-md) { width: 100%; + flex-direction: row; + justify-content: space-between; } } @@ -417,6 +423,10 @@ } } + .course-certificate { + width: 100%; + } + .upgrade-message { flex-wrap: wrap; @@ -432,7 +442,7 @@ /* IE11 CSS styles */ @media(min-width: $bp-screen-md) and (-ms-high-contrast: none), (-ms-high-contrast: active) { - float: right; + @include float(right); } } @@ -495,6 +505,109 @@ font-size: 0.9375em; } } + } +} + +.program-sidebar { + padding: 30px 10px; + + @media(min-width: $bp-screen-md) { + @include float(right); + width: 300px; + padding-right: 30px; + position: relative; + } + + @media(min-width: $bp-screen-lg) { + width: 450px; + + .program-progress { + @include margin-left(50px); + } + } + + @media(min-width: $lms-max-width) { + @include margin-right(calc((100% - 1180px) / 2)); + } +} + +.certificate-heading { + margin-bottom: 10px; + + @media(min-width: $bp-screen-md) { + @include margin-right(30px); + } + + @media(min-width: $bp-screen-lg) { + @include margin-left(10px); + @include margin-right(0); + } +} + +.program-cert-link { + display: inline-block; + + &:active, + &:focus, + &:hover { + .program-cert { + border-color: $blue-d1; + } + } +} + +.program-cert { + width: 100%; + border: 1px solid $divider-color; + + @media(min-width: $bp-screen-md) { + width: calc(100% - 30px); + } + + @media(min-width: $bp-screen-lg) { + width: 100%; + } +} + +.certificate-list { + @include margin(0, 0, 0, 10px); + list-style: none; + + .certificate { + display: flex; + flex-direction: row; + padding: 5px 0 10px; + } + + .certificate-link { + @include margin-left(20px); + color: $black; + font: { + size: 1.1em; + weight: 600; + } + + @media(min-width: $bp-screen-md) { + font-size: 0.9em; + } + + @media(min-width: $bp-screen-lg) { + font-size: 1.1em; + } + + &:active, + &:focus, + &:hover { + .sample-cert { + border-color: $blue-d1; + } + } + } + + .sample-cert { + width: 120px; + border: 3px solid $gray-l3; + border-radius: 5px; .expired-notification { display: inline-block; @@ -511,7 +624,7 @@ } .expired-icon { - float: left; + @include float(left); color: palette(primary, dark); } @@ -520,5 +633,12 @@ padding-left: 10px; } + @media(min-width: $bp-screen-md) { + width: 100px; + } + + @media(min-width: $bp-screen-lg) { + width: 120px; + } } } diff --git a/lms/templates/learner_dashboard/certificate_list.underscore b/lms/templates/learner_dashboard/certificate_list.underscore new file mode 100644 index 0000000000..6d38a0d5e6 --- /dev/null +++ b/lms/templates/learner_dashboard/certificate_list.underscore @@ -0,0 +1,13 @@ +
+ <% if (title) { %> +

<%- title %>

+ <% } %> + +
diff --git a/lms/templates/learner_dashboard/course_card_2017.underscore b/lms/templates/learner_dashboard/course_card_2017.underscore index d64c1511e8..c7a8b8c668 100644 --- a/lms/templates/learner_dashboard/course_card_2017.underscore +++ b/lms/templates/learner_dashboard/course_card_2017.underscore @@ -20,7 +20,7 @@
-
+
diff --git a/lms/templates/learner_dashboard/program_details_sidebar.underscore b/lms/templates/learner_dashboard/program_details_sidebar.underscore new file mode 100644 index 0000000000..10b3a4eb89 --- /dev/null +++ b/lms/templates/learner_dashboard/program_details_sidebar.underscore @@ -0,0 +1,10 @@ + + diff --git a/lms/templates/learner_dashboard/program_details_view_2017.underscore b/lms/templates/learner_dashboard/program_details_view_2017.underscore index 866cb8b884..1c879d3526 100644 --- a/lms/templates/learner_dashboard/program_details_view_2017.underscore +++ b/lms/templates/learner_dashboard/program_details_view_2017.underscore @@ -1,6 +1,5 @@
-
-
+
<% if (inProgressCount === totalCount) { %>

<%- gettext('Congratulations!') %>

@@ -29,7 +28,6 @@ <%- gettext('COURSES IN PROGRESS') %> <%- inProgressCount %> -
<% } %> @@ -39,7 +37,6 @@ <%- gettext('REMAINING COURSES') %> <%- remainingCount %> -
<% } %> @@ -48,7 +45,6 @@ <%- gettext('COMPLETED COURSES') %> <%- completedCount %> -
<% if (completedCount) { %>
<% } else { %> @@ -59,6 +55,5 @@ <% } %> - - - + +