Commit 241c9bb1 by Don Mitchell

Checkpoint to rebase

parent a9233dfd
CMS.Models.Location = Backbone.Models.extend({
defaults: {
tag: "",
name: "",
course: "",
category: "",
name: ""
},
toUrl: function(overrides) {
return
(overrides['tag'] ? overrides['tag'] : this.get('tag')) + "://" +
(overrides['name'] ? overrides['name'] : this.get('name')) + "/" +
(overrides['course'] ? overrides['course'] : this.get('course')) + "/" +
(overrides['category'] ? overrides['category'] : this.get('category')) + "/" +
(overrides['name'] ? overrides['name'] : this.get('name')) + "/";
},
_tagPattern = /[^:]+/g,
_fieldPattern = new RegExp('[^/]+','g'),
parse: function(payload) {
if (payload instanceof Array) {
return {
tag: payload[0],
name: payload[1],
course: payload[2],
category: payload[3],
name: payload[4]
}
}
else if (payload instanceof String) {
var foundTag = this._tagPattern.exec(payload);
if (foundTag) {
this._fieldPattern.lastIndex = this._tagPattern.lastIndex;
return {
tag: foundTag,
name: this._fieldPattern.exec(payload),
course: this._fieldPattern.exec(payload),
category: this._fieldPattern.exec(payload),
name: this._fieldPattern.exec(payload)
}
}
else return null;
}
else {
return payload;
}
}
});
CMS.Models.CourseRelative = Backbone.Models.extend({
defaults: {
course_location : null, // must never be null, but here to doc the field
idx : null // the index making it unique in the containing collection (no implied sort)
}
});
CMS.Models.CourseRelativeCollection = Backbone.Collections.extend({
model : CourseRelative
});
\ No newline at end of file
CMS.Models.Settings.CourseDetails = Backbone.Models.extend({
defaults: {
location : null, # a Location model, required
start_date: null,
end_date: null,
milestones: null, # a CourseRelativeCollection
syllabus: null,
overview: "",
statement: "",
intro_video: null,
requirements: "",
effort: null, # an int or null
textbooks: null, # a CourseRelativeCollection
prereqs: null, # a CourseRelativeCollection
faqs: null # a CourseRelativeCollection
},
// When init'g from html script, ensure you pass {parse: true} as an option (2nd arg to reset)
parse: function(attributes) {
if (attributes['location']) {
attributes.location = new CMS.Models.Location(attributes.location);
};
if (attributes['milestones']) {
attributes.milestones = new CMS.Models.CourseRelativeCollection(attributes.milestones);
};
if (attributes['textbooks']) {
attributes.textbooks = new CMS.Models.CourseRelativeCollection(attributes.textbooks);
};
if (attributes['prereqs']) {
attributes.prereqs = new CMS.Models.CourseRelativeCollection(attributes.prereqs);
};
if (attributes['faqs']) {
attributes.faqs = new CMS.Models.CourseRelativeCollection(attributes.faqs);
};
},
urlRoot: function() {
// TODO impl
}
});
CMS.Models.Settings.CourseSettings = Backbone.Model.extend({
// a container for the models representing the n possible tabbed states
defaults: {
courseLocation: null,
// NOTE: keep these sync'd w/ the data-section names in settings-page-menu
details: null,
faculty: null,
grading: null,
problems: null,
discussions: null
}
// write getters which get the relevant sub model from the server if not already loaded
})
\ No newline at end of file
CMS.Views.Settings.Main = Backbone.View.extend({
// Model class is CMS.Models.Settings.CourseSettings
// allow navigation between the tabs
events: {
'click .settings-page-menu a': "showSettingsTab"
},
initialize: function() {
// load templates
},
render: function() {
// create any necessary subviews and put them onto the page
},
currentTab: null,
showSettingsTab: function(e) {
this.currentTab = $(e.target).attr('data-section');
$('.settings-page-section > section').hide();
$('.settings-' + this.currentTab).show();
$('.settings-page-menu .is-shown').removeClass('is-shown');
$(e.target).addClass('is-shown');
// fetch model for the tab if not loaded already
if (!this.model.has(this.currentTab)) {
// TODO disable screen until fetch completes?
this.model.retrieve(this.currentTab, function() { this.render(); });
}
}
})
\ No newline at end of file
.settings {
.settings-overview {
@extend .window;
@include clearfix;
display: table;
width: 100%;
// layout
.sidebar {
display: table-cell;
float: none;
width: 20%;
padding: 30px 0 30px 20px;
@include border-radius(3px 0 0 3px);
background: $lightGrey;
}
.main-column {
display: table-cell;
float: none;
width: 80%;
padding: 30px 40px 30px 60px;
}
.settings-page-menu {
a {
display: block;
padding-left: 20px;
line-height: 52px;
&.is-shown {
background: #fff;
@include border-radius(5px 0 0 5px);
}
}
}
.settings-page-section {
> .alert {
display: none;
&.is-shown {
display: block;
}
}
> section {
display: none;
margin-bottom: 40px;
&.is-shown {
display: block;
}
&:last-child {
border-bottom: none;
}
> .title {
margin-bottom: 30px;
font-size: 28px;
font-weight: 300;
color: $blue;
}
> section {
margin-bottom: 100px;
@include clearfix;
header {
@include clearfix;
border-bottom: 1px solid $mediumGrey;
margin-bottom: 20px;
padding-bottom: 10px;
h3 {
color: $darkGrey;
float: left;
margin: 0 40px 0 0;
text-transform: uppercase;
}
.detail {
float: right;
marign-top: 3px;
color: $mediumGrey;
font-size: 13px;
}
}
&:last-child {
padding-bottom: 0;
border-bottom: none;
}
}
}
}
// form basics
label, .label {
padding: 0;
border: none;
background: none;
font-size: 15px;
font-weight: 400;
&.check-label {
display: inline;
margin-left: 10px;
}
&.ranges {
margin-bottom: 20px;
}
}
input, textarea {
@include transition(all 1s ease-in-out);
@include box-sizing(border-box);
font-size: 15px;
&.long {
width: 100%;
}
&.tall {
height: 200px;
}
&.short {
width: 25%;
}
&.date {
}
&:focus {
@include linear-gradient(tint($blue, 80%), tint($blue, 90%));
border-color: $blue;
outline: 0;
}
&:disabled {
color: $darkGrey;
background: $lightGrey;
}
}
.input-default {
color: $darkGrey;
background: $lightGrey;
}
::-webkit-input-placeholder {
color: $mediumGrey;
font-size: 13px;
}
:-moz-placeholder {
color: $mediumGrey;
font-size: 13px;
}
.field.ui-status {
> .input {
display: block !important;
margin-bottom: 15px;
}
.ui-status-input-checkbox, .ui-status-input-radio {
position: absolute;
top: -9999px;
left: -9999px;
}
label {
cursor: pointer;
}
.ui-status-input-checkbox ~ label, .ui-status-input-radio ~ label {
position: relative;
left: -30px;
display: inline-block;
z-index: 100;
margin: 0 0 0 5px;
padding-left: 30px;
color: $offBlack;
opacity: 0.50;
cursor: pointer;
@include transition(opacity 0.25s ease-in-out);
&:before {
display: inline-block;
margin-right: 10px;
}
&:after {
display: inline-block;
margin-left: 10px;
}
~ .tip {
margin-top: 0;
@include transition(color 0.25s ease-in-out);
}
}
.ui-status-indic {
position: relative;
top: 2px;
z-index: 10;
display: inline-block;
height: 15px;
width: 15px;
border: 2px;
background: $offBlack;
opacity: 0.50;
@include border-radius(50px);
@include box-sizing(border-box);
@include transition(opacity 0.25s ease-in-out);
}
.ui-status-input-checkbox:checked ~ label, .ui-status-input-radio:checked ~ label {
opacity: 0.99;
&:after {
}
&:before {
}
~ .tip {
color: $darkGrey;
}
}
.ui-status-input-checkbox:checked ~ .ui-status-indic, .ui-status-input-radio:checked ~ .ui-status-indic {
opacity: 0.99;
}
}
.tip {
color: $mediumGrey;
font-size: 13px;
}
// form layouts
.row {
margin-bottom: 30px;
padding-bottom: 30px;
border-bottom: 1px solid $lightGrey;
&:last-child {
margin-bottom: 0;
padding-bottom: 0;
border-bottom: none;
}
// structural labels, not semantic labels per se
> label, .label {
display: inline-block;
vertical-align: top;
}
// tips
.tip-inline {
display: inline-block;
margin-left: 10px;
}
.tip-stacked {
display: block;
margin-top: 10px;
}
// structural field, not semantic fields per se
.field {
display: inline-block;
width: 100%;
> input, > textarea, .input {
display: inline-block;
&:last-child {
margin-bottom: 0;
}
.group {
input, textarea {
margin-bottom: 5px;
}
.label, label {
font-size: 13px;
}
}
// multi-field
&.multi {
display: block;
background: tint($lightGrey, 50%);
padding: 15px;
@include border-radius(4px);
@include box-sizing(border-box);
.group {
margin-bottom: 10px;
&:last-child {
margin-bottom: 0;
}
input, .input, textarea {
}
}
}
// multi stacked
&.multi-stacked {
.group {
input, .input, textarea {
width: 100%;
}
}
}
// multi-field inline
&.multi-inline {
@include clearfix;
.group {
float: left;
margin-right: 20px;
&:nth-child(2) {
margin-right: 0;
}
.input, input, textarea {
width: 100%;
}
}
.remove-item {
float: right;
}
}
}
// input-list
.input-list {
.input {
margin-bottom: 15px;
padding-bottom: 15px;
border-bottom: 1px dotted $lightGrey;
&:last-child {
border: 0;
}
}
}
// enumerated inputs
&.enum {
}
}
// layout - aligned label/field pairs
&.row-col2 {
> label, .label {
width: 200px;
}
.field {
width: 400px;
}
&.multi-inline {
@include clearfix;
.group {
width: 170px;
}
}
}
}
// editing controls - adding
.new-item, .replace-item {
clear: both;
display: block;
margin-top: 10px;
padding-bottom: 10px;
@include grey-button;
@include box-sizing(border-box);
}
// editing controls - removing
.remove-item {
clear: both;
display: block;
opacity: 0.75;
font-size: 13px;
text-align: right;
@include transition(opacity 0.25s ease-in-out);
&:hover {
color: $blue;
opacity: 0.99;
}
}
// editing controls - preview
.input-existing {
display: block !important;
.current {
width: 100%;
margin: 10px 0;
padding: 15px;
@include box-sizing(border-box);
@include border-radius(5px);
background: tint($blue, 80%);
}
}
// specific sections
.settings-details {
}
.settings-faculty {
.settings-faculty-members {
> header {
display: none;
}
.field .multi {
display: block;
margin-bottom: 40px;
padding: 20px;
background: tint($lightGrey, 50%);
@include border-radius(4px);
@include box-sizing(border-box);
}
.course-faculty-list-item {
.row {
&:nth-child(4) {
padding-bottom: 0;
border-bottom: none;
}
}
}
#course-faculty-bio-input {
margin-bottom: 0;
}
.new-course-faculty-item {
}
.current-faculty-photo {
height: 115px;
width: 115px;
overflow: hidden;
img {
display: block;
min-height: 100%;
max-width: 100%;
}
}
}
}
.settings-grading {
.course-grading-gradeweight, .course-grading-totalassignments, .course-grading-totalassignmentsdroppable {
input {
width: 73px;
}
}
}
.settings-handouts {
}
.settings-problems {
> section {
&.is-shown {
display: block;
}
}
}
.settings-discussions {
}
// states
label.is-focused {
color: $blue;
@include transition(color 1s ease-in-out);
}
// extras/abbreviations
// .settings-extras {
// > header {
// cursor: pointer;
// &.active {
// }
// }
// > div {
// display: none;
// @include transition(display 0.25s ease-in-out);
// &.is-shown {
// display: block;
// }
// }
// }
// misc
.divide {
display: none;
}
}
h3 {
margin-bottom: 30px;
font-size: 15px;
font-weight: 700;
color: $blue;
}
.grade-controls {
@include clearfix;
}
.new-grade-button {
position: relative;
float: left;
display: block;
width: 29px;
height: 29px;
margin: 4px 10px 0 0;
border-radius: 20px;
border: 1px solid $darkGrey;
@include linear-gradient(top, rgba(255, 255, 255, 0.8), rgba(255, 255, 255, 0));
background-color: #d1dae3;
@include box-shadow(0 1px 0 rgba(255, 255, 255, .3) inset);
color: #6d788b;
.plus-icon {
position: absolute;
top: 50%;
left: 50%;
margin-left: -6px;
margin-top: -6px;
}
}
.grade-slider {
float: right;
width: 95%;
height: 80px;
.grade-bar {
position: relative;
width: 100%;
height: 50px;
background: $lightGrey;
.increments {
position: relative;
li {
position: absolute;
top: 52px;
width: 30px;
margin-left: -15px;
font-size: 9px;
text-align: center;
&.increment-0 {
left: 0;
}
&.increment-10 {
left: 10%;
}
&.increment-20 {
left: 20%;
}
&.increment-30 {
left: 30%;
}
&.increment-40 {
left: 40%;
}
&.increment-50 {
left: 50%;
}
&.increment-60 {
left: 60%;
}
&.increment-70 {
left: 70%;
}
&.increment-80 {
left: 80%;
}
&.increment-90 {
left: 90%;
}
&.increment-100 {
left: 100%;
}
}
}
.grades {
position: relative;
li {
position: absolute;
top: 0;
height: 50px;
text-align: right;
&:hover,
&.is-dragging {
.remove-button {
display: block;
}
}
&.is-dragging {
}
.remove-button {
display: none;
position: absolute;
top: -17px;
right: 1px;
height: 17px;
font-size: 10px;
}
&:nth-child(1) {
background: #4fe696;
}
&:nth-child(2) {
background: #ffdf7e;
}
&:nth-child(3) {
background: #ffb657;
}
&:nth-child(4) {
background: #fb336c;
}
&:nth-child(5) {
background: #ef54a1;
}
.letter-grade {
display: block;
margin: 10px 15px 0 0;
font-size: 16px;
font-weight: 700;
line-height: 14px;
}
.range {
display: block;
margin-right: 15px;
font-size: 10px;
line-height: 12px;
}
.drag-bar {
position: absolute;
top: 0;
right: -1px;
height: 50px;
width: 2px;
background-color: #fff;
@include box-shadow(-1px 0 3px rgba(0,0,0,0.1));
cursor: ew-resize;
@include transition(none);
&:hover {
width: 6px;
right: -2px;
}
}
}
}
}
}
}
\ No newline at end of file
<%inherit file="base.html" />
<%block name="bodyclass">settings</%block>
<%block name="title">Settings</%block>
<%namespace name='static' file='static_content.html'/>
<%block name="jsextra">
<link rel="stylesheet" type="text/css" href="${static.url('js/vendor/timepicker/jquery.timepicker.css')}" />
<script src="${static.url('js/vendor/timepicker/jquery.timepicker.js')}"></script>
<script src="${static.url('js/vendor/timepicker/datepair.js')}"></script>
<script src="${static.url('js/vendor/date.js')}"></script>
<script type="text/javascript" src="${static.url('js/template_loader.js')}"></script>
<script type="text/javascript" src="${static.url('js/models/course_relative.js')}"></script>
<script type="text/javascript" src="${static.url('js/models/settings/course_details.js')}"></script>
<script type="text/javascript" src="${static.url('js/models/settings/course_settings.js')}"></script>
<script type="text/javascript" src="${static.url('js/views/settings/main_settings_view.js')}"></script>
<script type="text/javascript">
$(document).ready(function(){
var settingsModel = new CMS.Models.Settings.CourseSettings({
courseLocation: new CMS.Models.Location('${context_course.location}',{parse:true}),
details: new CMS.Models.Settings.CourseDetails(${course_details|n},{parse:true})
});
var editor = new CMS.Views.CourseInfoEdit({
el: $('.main-wrapper'),
model : settingsModel)
});
editor.render();
});
// TODO move most of this into view handlers
var $body;
var $gradeBar;
var $draggingBar;
var barOrigin;
var barWidth;
var gradeThresholds;
var GRADES = ['A', 'B', 'C', 'D', 'E'];
$(" :input, textarea").focus(function() {
$("label[for='" + this.id + "']").addClass("is-focused");
}).blur(function() {
$("label").removeClass("is-focused");
});
(function() {
$body = $('body');
$gradeBar = $('.grade-bar');
gradeThresholds = [100, 80, 70];
$('.settings-extra header').bind('click', showSettingsExtras);
$body.on('mousedown', '.drag-bar', startDragBar);
$('.new-grade-button').bind('click', addNewGrade);
$body.on('click', '.remove-button', removeGrade);
$('.set-date').datepicker({ 'dateFormat': 'm/d/yy' });
})();
function addNewGrade(e) {
e.preventDefault();
var $newGradeBar = $('<li style="width: 10%;"><span class="letter-grade" contenteditable>' + GRADES[$('.grades li').length] + '</span><span class="range"></span><a href="#" class="drag-bar"></a><a href="#" class="remove-button">remove</a></li>');
$('.grades').append($newGradeBar);
}
function removeGrade(e) {
e.preventDefault();
var index = $(this).closest('li').index();
gradeThresholds.splice(index, 1);
$(this).closest('li').remove();
}
function showSettingsExtras(e) {
e.preventDefault();
$(this).toggleClass('active');
$(this).siblings.toggleClass('is-shown');
}
function startDragBar(e) {
e.preventDefault();
barOrigin = $gradeBar.offset().left;
barWidth = $gradeBar.width();
$draggingBar = $(e.target).closest('li').addClass('is-dragging');
$body.bind('mousemove', moveBar);
$body.bind('mouseup', stopDragBar);
}
function moveBar(e) {
var barIndex = $draggingBar.index();
var min = gradeThresholds[barIndex + 1] || 0;
var max = gradeThresholds[barIndex - 1] || 100;
var percentage = Math.min(Math.max((e.pageX - barOrigin) / barWidth * 100, min), max);
$draggingBar.css('width', percentage + '%');
gradeThresholds[$draggingBar.index()] = Math.round(percentage);
renderGradeRanges();
}
function stopDragBar(e) {
$draggingBar.removeClass('is-dragging');
$body.unbind('mousemove', moveBar);
$body.unbind('mouseup', stopDragBar);
}
function renderGradeRanges() {
$('.range').each(function(i) {
var min = gradeThresholds[i + 1] + 1 || 0;
var max = gradeThresholds[i];
$(this).text(min + '-' + max);
});
}
</script>
</%block>
<%block name="content">
<!-- -->
<div class="main-wrapper">
<div class="inner-wrapper">
<h1>Settings</h1>
<article class="settings-overview">
<div class="sidebar">
<nav class="settings-page-menu">
<ul>
<li><a href="#" class="is-shown" data-section="details">Course Details</a></li>
<li><a href="#" data-section="faculty">Faculty</a></li>
<li><a href="#" data-section="grading">Grading</a></li>
<li><a href="#" data-section="problems">Problems</a></li>
<li><a href="#" data-section="discussions">Discussions</a></li>
</ul>
</nav>
</div>
<div class="settings-page-section main-column">
<section class="settings-details is-shown">
<h2 class="title">Course Details</h2>
<section class="settings-details-basic">
<header>
<h3>Basic Information</h3>
<span class="detail">The nuts and bolts of your course</span>
</header>
<div class="row row-col2">
<label for="course-name-input">Course Name:</label>
<div class="field">
<div class="input">
<input type="text" class="long" id="course-name-input" disabled="disabled">
</div>
</div>
</div>
<div class="row row-col2">
<label for="course-organization-input">Organization:</label>
<div class="field">
<div class="input">
<input type="text" class="long" id="course-organization-input" disabled="disabled">
</div>
</div>
</div>
<div class="row row-col2">
<label for="course-number-input">Course Number:</label>
<div class="field">
<div class="input">
<input type="text" class="short" id="course-number-input" disabled="disabled">
<span class="tip tip-inline">e.g. 101x</span>
</div>
</div>
</div>
</section><!-- .settings-details-basic -->
<hr class="divide" />
<section class="settings-details-schedule">
<header>
<h3>Course Schedule</h3>
<span class="detail">Important steps and segments of your your course</span>
</header>
<div class="row row-col2">
<label for="course-start-date-input">Course Start Date:</label>
<div class="field">
<div class="input">
<input type="text" class="start-date date set-date" id="course-start-date-input" placeholder="MM/DD/YYYY">
<span class="tip tip-inline">First day the class begins</span>
</div>
</div>
</div>
<div class="row row-col2">
<label for="course-end-date-input">Course End Date:</label>
<div class="field">
<div class="input">
<input type="text" class="end-date date set-date" id="course-end-date-input" placeholder="MM/DD/YYYY">
<span class="tip tip-inline">Last day the class begins</span>
</div>
</div>
</div>
<div class="row row-col2">
<h4 class="label">Milestones:</h4>
<div class="field enum">
<ul class="input-list course-milestone-list">
<li class="input input-existing multi multi-inline course-milestone-list-item">
<div class="group">
<label for="course-milestone-1-date-input">Milestone Date</label>
<input type="text" id="course-milestone-1-date-input" class="course-milestone-date-input date set-date" placeholder="MM/DD/YYYY">
</div>
<div class="group">
<label for="course-milestone-1-name-input">Milestone Name</label>
<input type="text" class="course-milestone-name-input" id="course-milestone-1-name-input">
</div>
<a href="#" class="remove-item remove-milestone-data"><span class="delete-icon"></span> Delete Milestone</a>
</li>
<li class="input multi multi-inline course-milestone-list-item">
<div class="group">
<label for="course-milestone-2-date-input">Milestone Date</label>
<input type="text" class="course-milestone-date-input date set-date" id="course-milestone-2-date-input" placeholder="MM/DD/YYYY">
</div>
<div class="group">
<label for="course-milestone-2-name-input">Milestone Name</label>
<input type="text" class="course-milestone-name-input" id="course-milestone-2-name-input">
</div>
</li>
</ul>
<a href="#" class="new-item new-course-milestone-item add-milestone-data">
<span class="plus-icon"></span>New Course Milestone
</a>
</div>
</div>
<div class="row row-col2">
<label for="course-syllabus-input">Course Syllabus</label>
<div class="field">
<div class="input input-existing">
<div class=" current current-course-syllabus">
<span class="pdf doc-filename">CS184x_syllabus.pdf</span>
</div>
<a href="#" class="remove-item remove-course-syllabus remove-doc-data"><span class="delete-icon"></span> Delete Syllabus</a>
<span class="tip tip-inline">PDF formatting preferred</span>
</div>
<div class="input">
<a href="#" class="new-item new-course-syllabus add-syllabus-data" id="course-syllabus-input">
<span class="upload-icon"></span>Upload Syllabus
</a>
<span class="tip tip-inline">PDF formatting preferred</span>
</div>
</div>
</div>
</section><!-- .settings-details-schedule -->
<hr class="divide" />
<section class="setting-details-marketing">
<header>
<h3>Introducing Your Course</h3>
<span class="detail">Information for perspective students</span>
</header>
<div class="row row-col2">
<label for="course-overview">Course Overview:</label>
<div class="field">
<div class="input">
<textarea class="long tall" input="course-overview"></textarea>
<span class="tip tip-stacked">Detailed summary of concepts and lessons covered</span>
</div>
</div>
</div>
<div class="row row-col2">
<label for="course-shortdescription">Course Statement:</label>
<div class="field">
<div class="input">
<textarea class="long" id="course-shortdescription"></textarea>
<span class="tip tip-stacked">1-2 sentences used to introduce your class to perspective students</span>
</div>
</div>
</div>
<div class="row row-col2">
<label for="course-introduction-video">Introduction Video:</label>
<div class="field">
<div class="input input-existing">
<div class=" current current-course-introduction-video">
<iframe width="400" height="225" src="http://www.youtube.com/embed/6F0pR-ANmXY" frameborder="0" allowfullscreen></iframe>
</div>
<a href="#" class="remove-item remove-course-introduction-video remove-video-data"><span class="delete-icon"></span> Delete Video</a>
</div>
<div class="input">
<a href="#" class="new-item new-course-introduction-video add-video-data" id="course-introduction-video">
<span class="upload-icon"></span>Upload Video
</a>
<span class="tip tip-inline">Video restrictions go here</span>
</div>
</div>
</div>
</section><!-- .settings-details-marketing -->
<hr class="divide" />
<section class="settings-details-requirements">
<header>
<h3>Requirements</h3>
<span class="detail">Expectations of the students taking this course</span>
</header>
<div class="row row-col2">
<label for="course-requirements">Requirements:</label>
<div class="field">
<div class="input">
<textarea class="long tall" id="course-requirements"></textarea>
<span class="tip tip-stacked">Supplies, software, and set-up that students will need</span>
</div>
</div>
</div>
<div class="row row-col2">
<label for="course-effort">Hours of Effort per Week:</label>
<div class="field">
<div class="input">
<input type="text" class="short" id="course-effort" placeholder="HH:MM">
<span class="tip tip-inline">Time students should spend on all course work</span>
</div>
</div>
</div>
<div class="row row-col2">
<h4 class="label">Textbooks:</h4>
<div class="field enum">
<ul class="input-list course-textbooks-list">
<li class="input input-existing multi multi-stacked course-textbooks-list-item">
<div class="group">
<label for="course-textbooks-1-name-input">Textbook Name</label>
<input type="text" class="course-textbooks-name-input" id="course-textbooks-1-name-input" placeholder="">
</div>
<div class="group optional">
<label for="course-textbooks-1-link-input">Textbook Link</label>
<input type="text" class="course-textbooks-link-input" id="course-textbooks-1-link-input">
</div>
<a href="#" class="remove-item remove-textbooks-data"><span class="delete-icon"></span> Delete Textbook</a>
</li>
<li class="input multi multi-stacked course-textbooks-list-item">
<div class="group">
<label for="course-textbooks-2-name-input">Textbook Name</label>
<input type="text" class="course-textbooks-name-input" id="course-textbooks-2-name-input">
</div>
<div class="group optional">
<label for="course-textbooks-2-link-input">Textbook Link</label>
<input type="text" class="course-textbooks-link-input" id="course-textbooks-2-link-input">
</div>
</li>
</ul>
<a href="#" class="new-item new-course-textbooks-item add-textbooks-data">
<span class="plus-icon"></span>New Textbook
</a>
</div>
</div>
<div class="row row-col2">
<h4 class="label">Prerequisites:</h4>
<div class="field enum">
<ul class="input-list course-prerequisites-list">
<li class="input input-existing multi multi-stacked course-prerequisites-list-item">
<div class="group">
<label for="course-prerequisites-1-name-input">Prerequisite</label>
<input type="text" class="course-prerequisites-name-input" id="course-prerequisites-1-name-input">
</div>
<div class="group">
<label for="course-prerequisites-1-link-input">Prerequisite Link</label>
<input type="text" class="course-prerequisites-link-input" id="course-prerequisites-1-link-input">
</div>
<a href="#" class="remove-item remove-prerequisite-data"><span class="delete-icon"></span> Delete Prerequisite</a>
</li>
<li class="input multi multi-stacked course-prerequisites-list-item">
<div class="group">
<label for="course-prerequisites-2-name-input">Prerequisite</label>
<input type="text" class="course-prerequisites-name-input" id="course-prerequisites-2-name-input">
</div>
<div class="group">
<label for="course-prerequisites-2-link-input">Prerequisite Link</label>
<input type="text" class="course-prerequisites-link-input" id="course-prerequisites-2-link-input">
</div>
</li>
</ul>
<a href="#" class="new-item new-course-prerequisite-item add-prerequisite-data">
<span class="plus-icon"></span>New Prerequisite
</a>
</div>
</div>
</section>
<hr class="divide" />
<section class="settings-details-more">
<header>
<h3>More Information</h3>
<span class="detail">Other helpful information about the course</span>
</header>
<div class="row row-col2">
<h4 class="label">FAQs:</h4>
<div class="field enum">
<ul class="input-list course-faq-list">
<li class="input multi multi-stacked course-faq-list-item">
<div class="group">
<label for="course-faq-1-question-input">Question</label>
<input type="text" class="long course-faq-question-input" id="course-faq-1-question-input">
</div>
<div class="group optional">
<label for="course-faq-1-answer-input">Answer</label>
<textarea class="long tall course-faq-answer-input" id="course-faq-1-answer-input"></textarea>
</div>
<a href="#" class="remove-item remove-faq-data"><span class="delete-icon"></span> Delete Question &amp; Answer</a>
</li>
<li class="input multi multi-stacked course-faq-list-item">
<div class="group">
<label for="course-faq-2-question-input">Question</label>
<input type="text" class="long course-faq-question-input" id="course-faq-2-question-input">
</div>
<div class="group optional">
<label for="course-faq-2-answer-input">Answer</label>
<textarea class="long tall course-faq-answer-input" id="course-faq-2-answer-input"></textarea>
</div>
<a href="#" class="remove-item remove-faq-data"><span class="delete-icon"></span> Delete Question &amp; Answer</a>
</li>
</ul>
<a href="#" class="new-item new-course-faq-item add-faq-data">
<span class="plus-icon"></span>New Question &amp; Answer
</a>
</div>
</div>
</section>
</section><!-- .settings-details -->
<section class="settings-faculty">
<h2 class="title">Faculty</h2>
<section class="settings-faculty-members">
<header>
<h3>Faculty Members</h3>
<span class="detail">Individuals instructing and help with this course</span>
</header>
<div class="row">
<div class="field enum">
<ul class="input-list course-faculty-list">
<li class="input input-existing multi course-faculty-list-item">
<div class="row row-col2">
<label for="course-faculty-firstname-input">Faculty First Name:</label>
<div class="field">
<input type="text" class="long" id="course-faculty-firstname-input">
</div>
</div>
<div class="row row-col2">
<label for="course-faculty-lastname-input">Faculty Last Name:</label>
<div class="field">
<input type="text" class="long" id="course-faculty-lastname-input">
</div>
</div>
<div class="row row-col2">
<label for="course-faculty-photo-input">Faculty Photo</label>
<div class="field">
<div class="input">
<a href="#" class="new-item new-faculty-photo add-faculty-photo-data" id="course-faculty-photo-input">
<span class="upload-icon"></span>Upload Faculty Photo
</a>
<span class="tip tip-inline">Max size: 30KB</span>
</div>
<div class="input input-existing">
<div class=" current current-faculty-photo">
<img src="http://dummyimage.com/800x600/4d494d/686a82.gif&text=faculty+photo" alt="Faculty Photo" />
</div>
<a href="#" class="remove-item remove-faculty-photo remove-video-data"><span class="delete-icon"></span> Delete Faculty Photo</a>
</div>
</div>
</div>
<div class="row row-col2">
<label for="course-faculty-bio-input">Faculty Bio:</label>
<div class="field">
<textarea class="long tall" id="course-faculty-bio-input"></textarea>
<span class="tip tip-stacked">A brief description of your education, experience, and expertise</span>
</div>
</div>
<a href="#" class="remove-item remove-faculty-data"><span class="delete-icon"></span> Delete Faculty Member</a>
</li>
<li class="input multi course-faculty-list-item">
<div class="row row-col2">
<label for="course-faculty-firstname-input">Faculty First Name:</label>
<div class="field">
<input type="text" class="long" id="course-faculty-firstname-input">
</div>
</div>
<div class="row row-col2">
<label for="course-faculty-lastname-input">Faculty Last Name:</label>
<div class="field">
<input type="text" class="long" id="course-faculty-lastname-input">
</div>
</div>
<div class="row row-col2">
<label for="course-faculty-photo-input">Faculty Photo</label>
<div class="field">
<div class="input">
<a href="#" class="new-item new-faculty-photo add-faculty-photo-data" id="course-faculty-photo-input">
<span class="upload-icon"></span>Upload Faculty Photo
</a>
<span class="tip tip-inline">Max size: 30KB</span>
</div>
<div class="input input-existing">
<div class=" current current-course-faculty-photo">
</div>
<a href="#" class="replace-item replace-faculty-photo add-faculty-photo-data" id="course-faculty-photo-input">
<span class="upload-icon"></span>Upload Faculty Photo
</a>
<span class="tip tip-inline">Max size: 30KB</span>
</div>
</div>
</div>
<div class="row row-col2">
<label for="course-faculty-bio-input">Faculty Bio:</label>
<div class="field">
<div clas="input">
<textarea class="long tall" id="course-faculty-bio-input"></textarea>
<span class="tip tip-stacked">A brief description of your education, experience, and expertise</span>
</div>
</div>
</div>
</li>
</ul>
<a href="#" class="new-item new-course-faculty-item add-faculty-data">
<span class="plus-icon"></span>New Faculty Member
</a>
</div>
</div>
</section>
</section><!-- .settings-staff -->
<section class="settings-grading">
<h2 class="title">Grading</h2>
<section class="settings-grading-range">
<header>
<h3>Overall Grade Range</h3>
<span class="detail">Course grade ranges and their values</span>
</header>
<div class="row">
<div class="grade-controls">
<a href="#" class="new-grade-button"><span class="plus-icon"></span></a>
<div class="grade-slider">
<div class="grade-bar">
<ol class="increments">
<li class="increment-0">0</li>
<li class="increment-10">10</li>
<li class="increment-20">20</li>
<li class="increment-30">30</li>
<li class="increment-40">40</li>
<li class="increment-50">50</li>
<li class="increment-60">60</li>
<li class="increment-70">70</li>
<li class="increment-80">80</li>
<li class="increment-90">90</li>
<li class="increment-100">100</li>
</ol>
<ol class="grades">
<li class="bar-a" style="width: 100%;">
<span class="letter-grade" contenteditable>A</span>
<span class="range">81-100</span>
<a href="#" class="remove-button">remove</a>
</li>
<li class="bar-b" style="width: 80%;">
<span class="letter-grade" contenteditable>B</span>
<span class="range">71-80</span>
<a href="#" class="drag-bar"></a>
<a href="#" class="remove-button">remove</a>
</li>
<li class="bar-c" style="width: 70%;">
<span class="letter-grade" contenteditable>C</span>
<span class="range">0-70</span>
<a href="#" class="drag-bar"></a>
<a href="#" class="remove-button">remove</a>
</li>
<li class="bar-fail" style="width: 50%;">
<span class="letter-grade" contenteditable>F</span>
<span class="range">0-50</span>
<a href="#" class="drag-bar"></a>
<a href="#" class="remove-button">remove</a>
</li>
</ol>
</div>
</div>
</div>
</div>
</section>
<section class="settings-grading-general">
<header>
<h3>General Grading</h3>
<span class="detail">Deadlines and Requirements</span>
</header>
<div class="row row-col2">
<label for="course-grading-graceperiod">General Assignment Deadline:</label>
<div class="field">
<div class="input">
<input type="text" id="course-grading-duetime" placeholder="HH:MM">
<span class="tip tip-stacked">Boston, MA Local Time (UTC/GMT -5 hours)</span>
<span class="tip tip-stacked"><a href="http://www.worldtimeserver.com/convert_time_in_UTC.aspx">Convert to your time zone</a></span>
</div>
</div>
</div>
<div class="row row-col2">
<label for="course-grading-graceperiod">Deadline Grace Period:</label>
<div class="field">
<div class="input">
<input type="text" class="short" id="course-grading-graceperiod">
<span class="tip tip-inline">e.g. +5 minutes</span>
</div>
</div>
</div>
</section>
<section class="settings-grading-lessonexercises">
<header>
<h3>Lesson Exercises</h3>
<span class="detail">Grading in-lesson question &amp; problems</span>
</header>
<div class="row row-col2">
<label for="course-grading-lessonexercises-gradeweight">Weight of Total Grade:</label>
<div class="field">
<div class="input course-grading-gradeweight">
<input type="text" class="short" id="course-grading-lessonexercises-gradeweight">
<span class="tip tip-inline">e.g. 25%</span>
</div>
</div>
</div>
<div class="row row-col2">
<label for="course-grading-lessonexercises-totalassignments">Total Number:</label>
<div class="field">
<div class="input course-grading-totalassignments">
<input type="text" class="short" id="course-grading-lessonexercises-totalassignments">
<span class="tip tip-inline">total exercises assigned</span>
</div>
</div>
</div>
<div class="row row-col2">
<label for="course-grading-lessonexercises-totalassignmentsdroppable">Number of Droppable:</label>
<div class="field">
<div class="input course-grading-totalassignmentsdroppable">
<input type="text" class="short" id="course-grading-lessonexercises-totalassignmentsdroppable">
<span class="tip tip-inline">total exercises that won't be graded</span>
</div>
</div>
</div>
</section>
<section class="settings-grading-labs">
<header>
<h3>Labs</h3>
<span class="detail">Grading in-lesson question &amp; problems</span>
</header>
<div class="row row-col2">
<label for="course-grading-labs-gradeweight">Weight of Total Grade:</label>
<div class="field">
<div class="input course-grading-gradeweight">
<input type="text" class="short course-grading-gradeweight" id="course-grading-labs-gradeweight">
<span class="tip tip-inline">e.g. 25%</span>
</div>
</div>
</div>
<div class="row row-col2">
<label for="course-grading-labs-totalassignments">Total Number:</label>
<div class="field">
<div class="input course-grading-totalassignments">
<input type="text" class="short course-grading-totalassignments" id="course-grading-labs-totalassignments">
<span class="tip tip-inline">total labs assigned</span>
</div>
</div>
</div>
<div class="row row-col2">
<label for="course-grading-labs-totalassignmentsdroppable">Number of Droppable:</label>
<div class="field">
<div class="input course-grading-totalassignmentsdroppable">
<input type="text" class="short course-grading-labs-totalassignmentsdroppable" id="course-grading-labs-totalassignmentsdroppable">
<span class="tip tip-inline">total labs that won't be graded</span>
</div>
</div>
</div>
</section>
<section class="settings-grading-exams">
<header>
<h3>Exams</h3>
<span class="detail">Grading in-lesson question &amp; problems</span>
</header>
<div class="row row-col2">
<label for="course-grading-exams-gradeweight">Weight of Total Grade:</label>
<div class="field">
<div class="input course-grading-gradeweight">
<input type="text" class="short course-grading-gradeweight" id="course-grading-exams-gradeweight">
<span class="tip tip-inline">e.g. 50%</span>
</div>
</div>
</div>
<div class="row row-col2">
<label for="course-grading-exams-totalassignments">Total Number:</label>
<div class="field">
<div class="input course-grading-totalassignments">
<input type="text" class="short course-grading-totalassignments" id="course-grading-exams-totalassignments">
<span class="tip tip-inline">total exams held</span>
</div>
</div>
</div>
<div class="row row-col2">
<label for="course-grading-exams-totalassignmentsdroppable">Number of Droppable:</label>
<div class="field">
<div class="input course-grading-totalassignmentsdroppable">
<input type="text" class="short course-grading-exams-totalassignmentsdroppable" id="course-grading-labs-totalassignmentsdroppable">
<span class="tip tip-inline">total exams that won't be graded</span>
</div>
</div>
</div>
</section>
</section><!-- .settings-grading -->
<section class="settings-problems">
<h2 class="title">Problems</h2>
<section class="settings-problems-general">
<header>
<h3>General Settings</h3>
<span class="detail">Course-wide settings for all problems</span>
</header>
<div class="row row-col2">
<h4 class="label">Problem Randomization:</h4>
<div class="field ui-status">
<div class="input">
<input checked="checked" type="radio" class="ui-status-input ui-status-input-radio" name="problems-general-randomization" id="problems-general-randomization-always" value="Always">
<div class="ui-status-indic ui-status-indic-problems-general-randomization"></div>
<label for="problems-general-randomization-always">Always</label>
<span class="tip tip-stacked"><strong>randomize all</strong> problems</span>
</div>
<div class="input">
<input type="radio" class="ui-status-input ui-status-input-radio" name="problems-general-randomization" id="problems-general-randomization-never" value="Never">
<div class="ui-status-indic ui-status-indic-problems-general-randomization"></div>
<label for="problems-general-randomization-never">Never</label>
<span class="tip tip-stacked"><strong>do not randomize</strong> problems</span>
</div>
<div class="input">
<input type="radio" class="ui-status-input ui-status-input-radio" name="problems-general-randomization" id="problems-general-randomization-perstudent" value="Per Student">
<div class="ui-status-indic ui-status-indic-problems-general-randomization"></div>
<label for="problems-general-randomization-perstudent">Per Student</label>
<span class="tip tip-stacked">randomize problems <strong>per student</strong></span>
</div>
</div>
</div>
<div class="row row-col2">
<h4 class="label">Show Answers:</h4>
<div class="field ui-status">
<div class="input">
<input checked="checked" type="radio" class="ui-status-input ui-status-input-radio" name="problems-general-showanswer" id="problems-general-showanswer-always" value="Always">
<div class="ui-status-indic ui-status-indic-problems-general-showanswer"></div>
<label for="problems-general-showanswer-always">Always</label>
<span class="tip tip-stacked">Answers will be shown after the number of attempts has been met</span>
</div>
<div class="input">
<input type="radio" class="ui-status-input ui-status-input-radio" name="problems-general-showanswer" id="problems-general-showanswer-never" value="Never">
<div class="ui-status-indic ui-status-indic-problems-general-showanswer"></div>
<label for="problems-general-showanswer-never">Never</label>
<span class="tip tip-stacked">Answers will never be shown, regardless of attempts</span>
</div>
</div>
</div>
<div class="row row-col2">
<label for="problems-general-attempts">Number of Attempts: </label>
<div class="field">
<div class="input">
<input type="text" class="short" id="problems-general-attempts" placeholder="0 or higher" value="0">
<span class="tip tip-inline">To set infinite atttempts, use "0"</span>
</div>
</div>
</div>
</section><!-- .settings-problems-general -->
<section class="settings-problems-lessonexercises settings-extras">
<header>
<h3>Lesson Exercises</h3>
<span class="detail">In-lesson question &amp; problem specific rules</span>
</header>
<div class="row row-col2">
<h4 class="label">Problem Randomization:</h4>
<div class="field ui-status">
<div class="input">
<input checked="checked" type="radio" class="ui-status-input ui-status-input-radio" name="problems-lessonexercises-randomization" id="problems-lessonexercises-randomization-always" value="Always">
<div class="ui-status-indic ui-status-indic-problems-lessonexercises-randomization"></div>
<label for="problems-lessonexercises-randomization-always">Always</label>
<span class="tip tip-stacked"><strong>randomize all</strong> problems</span>
</div>
<div class="input">
<input type="radio" class="ui-status-input ui-status-input-radio" name="problems-lessonexercises-randomization" id="problems-lessonexercises-randomization-never" value="Never">
<div class="ui-status-indic ui-status-indic-problems-lessonexercises-randomization"></div>
<label for="problems-lessonexercises-randomization-never">Never</label>
<span class="tip tip-stacked"><strong>do not randomize</strong> problems</span>
</div>
<div class="input">
<input type="radio" class="ui-status-input ui-status-input-radio" name="problems-lessonexercises-randomization" id="problems-lessonexercises-randomization-perstudent" value="Per Student">
<div class="ui-status-indic ui-status-indic-problems-lessonexercises-randomization"></div>
<label for="problems-lessonexercises-randomization-perstudent">Per Student</label>
<span class="tip tip-stacked">randomize problems <strong>per student</strong></span>
</div>
</div>
</div>
<div class="row row-col2">
<h4 class="label">Show Answers:</h4>
<div class="field ui-status">
<div class="input">
<input checked="checked" type="radio" class="ui-status-input ui-status-input-radio" name="problems-lessonexercises-showanswer" id="problems-lessonexercises-showanswer-always" value="Always">
<div class="ui-status-indic ui-status-indic-problems-lessonexercises-showanswer"></div>
<label for="problems-lessonexercises-showanswer-always">Always</label>
<span class="tip tip-stacked">Answers will be shown after the number of attempts has been met</span>
</div>
<div class="input">
<input type="radio" class="ui-status-input ui-status-input-radio" name="problems-lessonexercises-showanswer" id="problems-lessonexercises-showanswer-never" value="Never">
<div class="ui-status-indic ui-status-indic-problems-lessonexercises-showanswer"></div>
<label for="problems-lessonexercises-showanswer-never">Never</label>
<span class="tip tip-stacked">Answers will never be shown, regardless of attempts</span>
</div>
</div>
</div>
<div class="row row-col2">
<label for="problems-lessonexercises-attempts">Number of Attempts: </label>
<div class="field">
<div class="input">
<input type="text" class="short" id="problems-lessonexercises-attempts" placeholder="0 or higher" value="0">
<span class="tip tip-inline">To set infinite atttempts, use "0"</span>
</div>
</div>
</div>
</section><!-- .settings-problems-lessonexercises -->
<section class="settings-problems-labs settings-extras">
<header>
<h3>Labs</h3>
<span class="detail">Exploratory assignment-specific rules</span>
</header>
<div class="row row-col2">
<h4 class="label">Problem Randomization:</h4>
<div class="field ui-status">
<div class="input">
<input checked="checked" type="radio" class="ui-status-input ui-status-input-radio" name="problems-labs-randomization" id="problems-labs-randomization-always" value="Always">
<div class="ui-status-indic ui-status-indic-problems-labs-randomization"></div>
<label for="problems-labs-randomization-always">Always</label>
<span class="tip tip-stacked"><strong>randomize all</strong> problems</span>
</div>
<div class="input">
<input type="radio" class="ui-status-input ui-status-input-radio" name="problems-labs-randomization" id="problems-labs-randomization-never" value="Never">
<div class="ui-status-indic ui-status-indic-problems-labs-randomization"></div>
<label for="problems-labs-randomization-never">Never</label>
<span class="tip tip-stacked"><strong>do not randomize</strong> problems</span>
</div>
<div class="input">
<input type="radio" class="ui-status-input ui-status-input-radio" name="problems-labs-randomization" id="problems-labs-randomization-perstudent" value="Per Student">
<div class="ui-status-indic ui-status-indic-problems-labs-randomization"></div>
<label for="problems-labs-randomization-perstudent">Per Student</label>
<span class="tip tip-stacked">randomize problems <strong>per student</strong></span>
</div>
</div>
</div>
<div class="row row-col2">
<h4 class="label">Show Answers:</h4>
<div class="field ui-status">
<div class="input">
<input checked="checked" type="radio" class="ui-status-input ui-status-input-radio" name="problems-labs-showanswer" id="problems-labs-showanswer-always" value="Always">
<div class="ui-status-indic ui-status-indic-problems-labs-showanswer"></div>
<label for="problems-labs-showanswer-always">Always</label>
<span class="tip tip-stacked">Answers will be shown after the number of attempts has been met</span>
</div>
<div class="input">
<input type="radio" class="ui-status-input ui-status-input-radio" name="problems-labs-showanswer" id="problems-labs-showanswer-never" value="Never">
<div class="ui-status-indic ui-status-indic-problems-labs-showanswer"></div>
<label for="problems-labs-showanswer-never">Never</label>
<span class="tip tip-stacked">Answers will never be shown, regardless of attempts</span>
</div>
</div>
</div>
<div class="row row-col2">
<label for="problems-labs-attempts">Number of Attempts: </label>
<div class="field">
<div class="input">
<input type="text" class="short" id="problems-labs-attempts" placeholder="0 or higher" value="0">
<span class="tip tip-inline">To set infinite atttempts, use "0"</span>
</div>
</div>
</div>
</section><!-- .settings-problems-labs -->
<section class="settings-problems-exams settings-extras">
<header>
<h3>Exams</h3>
<span class="detail">Mid-term and final exam-specific rules</span>
</header>
<div class="row row-col2">
<h4 class="label">Problem Randomization:</h4>
<div class="field ui-status">
<div class="input">
<input checked="checked" type="radio" class="ui-status-input ui-status-input-radio" name="problems-exams-randomization" id="problems-exams-randomization-always" value="Aways">
<div class="ui-status-indic ui-status-indic-problems-exams-randomization"></div>
<label for="problems-exams-randomization-always">Always</label>
<span class="tip tip-stacked"><strong>randomize all</strong> problems</span>
</div>
<div class="input">
<input type="radio" class="ui-status-input ui-status-input-radio" name="problems-exams-randomization" id="problems-exams-randomization-never" value="Never">
<div class="ui-status-indic ui-status-indic-problems-exams-randomization"></div>
<label for="problems-exams-randomization-never">Never</label>
<span class="tip tip-stacked"><strong>do not randomize</strong> problems</span>
</div>
<div class="input">
<input type="radio" class="ui-status-input ui-status-input-radio" name="problems-exams-randomization" id="problems-exams-randomization-perstudent" value="Per Student">
<div class="ui-status-indic ui-status-indic-problems-exams-randomization"></div>
<label for="problems-exams-randomization-perstudent">Per Student</label>
<span class="tip tip-stacked">randomize problems <strong>per student</strong></span>
</div>
</div>
</div>
<div class="row row-col2">
<h4 class="label">Show Answers:</h4>
<div class="field ui-status">
<div class="input">
<input checked="checked" type="radio" class="ui-status-input ui-status-input-radio" name="problems-exams-showanswer" id="problems-exams-showanswer-always" value="Always">
<div class="ui-status-indic ui-status-indic-problems-exams-showanswer"></div>
<label for="problems-exams-showanswer-always">Always</label>
<span class="tip tip-stacked">Answers will be shown after the number of attempts has been met</span>
</div>
<div class="input">
<input type="radio" class="ui-status-input ui-status-input-radio" name="problems-exams-showanswer" id="problems-exams-showanswer-never" value="Never">
<div class="ui-status-indic ui-status-indic-problems-exams-showanswer"></div>
<label for="problems-exams-showanswer-never">Never</label>
<span class="tip tip-stacked">Answers will never be shown, regardless of attempts</span>
</div>
</div>
</div>
<div class="row row-col2">
<label for="problems-exams-attempts">Number of Attempts: </label>
<div class="field">
<div class="input">
<input type="text" class="short" id="problems-exams-attempts" placeholder="0 or higher" value="0">
<span class="tip tip-inline">To set infinite atttempts, use "0"</span>
</div>
</div>
</div>
</section><!-- .settings-problems-exams -->
</section><!-- .settings-problems -->
<section class="settings-discussions">
<h2 class="title">Discussions</h2>
<section class="settings-discussions-general">
<header>
<h3>General Settings</h3>
<span class="detail">Course-wide settings for online discussion</span>
</header>
<div class="row row-col2">
<h4 class="label">Anonymous Discussions:</h4>
<div class="field ui-status">
<div class="input">
<input type="radio" class="ui-status-input ui-status-input-radio" name="discussions-anonymous" id="discussions-anonymous-allow" value="Allow">
<div class="ui-status-indic ui-status-indic-discussions-anonymous-allow"></div>
<label for="discussions-anonymous-allow">Allow</label>
<span class="tip tip-stacked">Students and faculty <strong>will be able to post anonymously</strong></span>
</div>
<div class="input">
<input checked="checked" type="radio" class="ui-status-input ui-status-input-radio" name="discussions-anonymous" id="discussions-anonymous-dontallow" value="Do Not Allow">
<div class="ui-status-indic ui-status-indic-discussions-anonymous-dontallow"></div>
<label for="discussions-anonymous-dontallow">Do not allow</label>
<span class="tip tip-stacked"><strong>Posting anonymously is not allowed</strong>. Any previous anonymous posts <strong>will be reverted to non-anonymous</strong></span>
</div>
</div>
</div>
</section><!-- .settings-discussions-general -->
<section class="settings-discussions-categories">
<div class="row row-col2">
<h4 class="label">Discussion Categories</h4>
<div class="field enum">
<ul class="input-list course-discussions-categories-list">
<li class="input input-existing input-default course-discussions-categories-list-item">
<div class="group">
<label for="course-discussions-categories-1-name-input">Category Name: </label>
<input type="text" class="course-discussions-categories-name-input" id="course-discussions-categories-1-name-input" placeholder="" value="General" disabled="disabled">
</div>
</li>
<li class="input input-existing input-default course-discussions-categories-list-item">
<div class="group">
<label for="course-discussions-categories-2-name-input">Category Name: </label>
<input type="text" class="course-discussions-categories-name-input" id="course-discussions-categories-2-name-input" placeholder="" value="Feedback" disabled="disabled">
</div>
</li>
<li class="input input-existing input-default course-discussions-categories-list-item">
<div class="group">
<label for="course-discussions-categories-3-name-input">Category Name: </label>
<input type="text" class="course-discussions-categories-name-input" id="course-discussions-categories-3-name-input" placeholder="" value="Troubleshooting" disabled="disabled">
</div>
</li>
<li class="input input-existing course-discussions-categories-list-item">
<div class="group">
<label for="course-discussions-categories-4-name-input">Category Name: </label>
<input type="text" class="course-discussions-categories-name-input" id="course-discussions-categories-4-name-input" placeholder="" value="Study Groups">
</div>
</li>
<li class="input input-existing course-discussions-categories-list-item">
<div class="group">
<label for="course-discussions-categories-5-name-input">Category Name: </label>
<input type="text" class="course-discussions-categories-name-input" id="course-discussions-categories-5-name-input" placeholder="" value="Lectures">
</div>
<a href="#" class="remove-item remove-course-discussions-categories-data"><span class="delete-icon"></span> Delete Discussion Category</a>
</li>
<li class="input course-discussions-categories-list-item">
<div class="group">
<label for="course-discussions-categories-6-name-input">Category Name: </label>
<input type="text" class="course-discussions-categories-name-input" id="course-discussions-categories-6-name-input" placeholder="">
</div>
<a href="#" class="remove-item remove-course-discussions-categories-data"><span class="delete-icon"></span> Delete Discussion Category</a>
</li>
</ul>
<a href="#" class="new-item new-course-discussions-categories-item add-categories-data">
<span class="plus-icon"></span>New Discussion Category
</a>
</div>
</div>
<div class="row row-col2">
<h4 class="label">Create Discussion Categories per Unit</h4>
<div class="field ui-status">
<div class="input">
<input type="radio" class="ui-status-input ui-status-input-radio" name="discussions-categories-perunit" id="discussions-categories-perunit-allow" value="Allow" disabled="disabled">
<div class="ui-status-indic ui-status-indic-discussions-categories-perunit-allow"></div>
<label for="discussions-categories-perunit-allow">Allow</label>
<span class="tip tip-stacked">This option is automatically set currently</span>
</div>
</div>
</div>
</section>
</section><!-- .settings-discussions -->
</div>
</article>
</div>
</div>
</%block>
class CourseRelativeMember:
def __init__(self, location, idx):
self.course_location = location # a Location obj
self.idx = idx # which milestone this represents. Hopefully persisted # so we don't have race conditions
### ??? If 2+ courses use the same textbook or other asset, should they point to the same db record?
class linked_asset(CourseRelativeMember):
"""
Something uploaded to our asset lib which has a name/label and location. Here it's tracked by course and index, but
we could replace the label/url w/ a pointer to a real asset and keep the join info here.
"""
def __init__(self, location, idx):
CourseRelativeMember.__init__(self, location, idx)
self.label = ""
self.url = None
class summary_detail_pair(CourseRelativeMember):
"""
A short text with an arbitrary html descriptor used for paired label - details elements.
"""
def __init__(self, location, idx):
CourseRelativeMember.__init__(self, location, idx)
self.summary = ""
self.detail = ""
\ No newline at end of file
from common.djangoapps.models.course_relative import CourseRelativeMember
### A basic question is whether to break the details into schedule, intro, requirements, and misc sub objects
class CourseDetails:
def __init__(self, location):
self.course_location = location # a Location obj
self.start_date = None
self.end_date = None
self.milestones = []
self.syllabus = None # a pdf file asset
self.overview = "" # html to render as the overview
self.statement = ""
self.intro_video = None # a video pointer
self.requirements = "" # html
self.effort = None # int hours/week
self.textbooks = [] # linked_asset
self.prereqs = [] # linked_asset
self.faqs = [] # summary_detail_pair
@classmethod
def fetch(cls, course_location):
"""
Fetch the course details for the given course from persistence and return a CourseDetails model.
"""
course = cls(course_location)
# TODO implement
return course
class CourseMilestone(CourseRelativeMember):
def __init__(self, location, idx):
CourseRelativeMember.__init__(self, location, idx)
self.date = None
self.description = ""
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment