Adds a dropdown to select the organization. The dropdown will only be activated for users with CourseCreator permission to specific organizations in Studio. Use cases: When FEATURES['ENABLE_CREATOR_GROUP'] = True and the user has CourseCreator permission granted, a dropdown will appear with all specific organizations allowed. In case of all_organizations setting is enabled, all organizations will appear in the dropdown. In case the user is staff, he can create organizations it will work as before
737 lines
13 KiB
SCSS
737 lines
13 KiB
SCSS
// studio - views - user dashboard
|
|
// ====================
|
|
|
|
.view-dashboard {
|
|
|
|
// temp
|
|
.content {
|
|
margin-bottom: ($baseline*5);
|
|
|
|
&:last-child {
|
|
margin-bottom: 0;
|
|
}
|
|
}
|
|
|
|
// ====================
|
|
|
|
// basic layout
|
|
.content-primary,
|
|
.content-supplementary {
|
|
box-sizing: border-box;
|
|
}
|
|
|
|
.content-primary {
|
|
@extend .ui-col-wide;
|
|
}
|
|
|
|
.content-supplementary {
|
|
@extend .ui-col-narrow;
|
|
}
|
|
|
|
// ====================
|
|
|
|
// elements - notices
|
|
.content .notice-incontext {
|
|
width: flexgrid(9, 9);
|
|
|
|
// CASE: notice has actions {
|
|
&.has-actions,
|
|
&.list-notices .notice-item.has-actions {
|
|
.msg,
|
|
.list-actions {
|
|
display: inline-block;
|
|
vertical-align: middle;
|
|
}
|
|
|
|
.msg {
|
|
width: flex-grid(6, 9);
|
|
margin-right: flex-gutter();
|
|
}
|
|
|
|
.list-actions {
|
|
width: flex-grid(3, 9);
|
|
text-align: right;
|
|
margin-top: 0;
|
|
|
|
.action-create-course,
|
|
.action-create-library {
|
|
@extend %btn-primary-green;
|
|
@extend %t-action3;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// elements - course creation rights controls
|
|
.wrapper-creationrights {
|
|
overflow: hidden;
|
|
|
|
.ui-toggle-control {
|
|
@extend %ui-depth2;
|
|
@extend %btn-secondary-gray;
|
|
|
|
@include clearfix();
|
|
|
|
display: block;
|
|
text-align: left;
|
|
|
|
// STATE: hover - syncing up colors with current so transition is smoother
|
|
&:hover {
|
|
background: $gray-d1;
|
|
color: $white;
|
|
}
|
|
|
|
.label {
|
|
@extend %t-action3;
|
|
|
|
float: left;
|
|
width: flex-grid(8, 9);
|
|
margin: 3px flex-gutter() 0 0;
|
|
}
|
|
|
|
.fa-times-circle {
|
|
@extend %t-action1;
|
|
|
|
@include transform(rotate(45deg));
|
|
@include transform-origin(center center);
|
|
@include transition(all $tmg-f1 linear 0s);
|
|
|
|
float: right;
|
|
text-align: right;
|
|
}
|
|
}
|
|
|
|
.ui-toggle-target {
|
|
@extend %ui-depth1;
|
|
|
|
@include transition(opacity $tmg-f1 ease-in-out 0s);
|
|
|
|
position: relative;
|
|
top: -2px;
|
|
display: none;
|
|
opacity: 0;
|
|
}
|
|
|
|
// CASE: when the content area is shown
|
|
&.is-shown {
|
|
.ui-toggle-control {
|
|
@include border-bottom-radius(0);
|
|
|
|
.fa-times-circle {
|
|
@include transform(rotate(90deg));
|
|
@include transform-origin(center center);
|
|
}
|
|
}
|
|
|
|
.ui-toggle-target {
|
|
display: block;
|
|
opacity: 1;
|
|
}
|
|
}
|
|
}
|
|
|
|
// elements - course creation rights controls
|
|
.status-creationrights {
|
|
margin-top: $baseline;
|
|
|
|
.title {
|
|
@extend %t-title7;
|
|
@extend %t-strong;
|
|
|
|
margin-bottom: ($baseline/4);
|
|
color: $gray-d1;
|
|
}
|
|
|
|
.list-actions,
|
|
.form-actions {
|
|
margin-top: ($baseline*0.75);
|
|
|
|
.action-primary {
|
|
@extend %btn-primary-blue;
|
|
@extend %t-action3;
|
|
color: $white;
|
|
}
|
|
|
|
// specific - request button
|
|
// BT: should we abstract these states out for all buttons like this
|
|
.action-request {
|
|
position: relative;
|
|
overflow: hidden;
|
|
|
|
.fa-cog {
|
|
@include transition(all $tmg-f1 ease-in-out $tmg-f1);
|
|
|
|
@extend %t-icon4;
|
|
|
|
position: absolute;
|
|
top: ($baseline/2);
|
|
left: -($baseline);
|
|
visibility: hidden;
|
|
opacity: 0;
|
|
}
|
|
|
|
// state: submitting
|
|
&.is-submitting {
|
|
padding-left: ($baseline*2);
|
|
|
|
.fa-cog {
|
|
left: ($baseline*0.75);
|
|
visibility: visible;
|
|
opacity: 1;
|
|
}
|
|
}
|
|
|
|
// state: has an error
|
|
&.has-error {
|
|
padding-left: ($baseline*2);
|
|
background: $red;
|
|
border-color: $red-d1;
|
|
|
|
.fa-cog {
|
|
left: ($baseline*0.75);
|
|
visibility: visible;
|
|
opacity: 1;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
.status-update {
|
|
.label {
|
|
@extend %cont-text-sr;
|
|
}
|
|
|
|
.value {
|
|
border-radius: ($baseline/4);
|
|
position: relative;
|
|
overflow: hidden;
|
|
padding: ($baseline/5) ($baseline/2);
|
|
background: $gray;
|
|
|
|
.status-indicator {
|
|
position: absolute;
|
|
top: 0;
|
|
left: 0;
|
|
display: block;
|
|
width: 100%;
|
|
height: ($baseline/4);
|
|
opacity: 0.4;
|
|
}
|
|
}
|
|
|
|
.value-formal,
|
|
.value-description {
|
|
border-radius: ($baseline/10);
|
|
display: inline-block;
|
|
vertical-align: middle;
|
|
color: $white;
|
|
}
|
|
|
|
.value-formal {
|
|
@extend %t-title5;
|
|
@extend %t-strong;
|
|
|
|
margin: ($baseline/2);
|
|
|
|
.icon {
|
|
margin-right: ($baseline/4);
|
|
}
|
|
}
|
|
|
|
.value-description {
|
|
@extend %t-copy-sub1;
|
|
|
|
position: relative;
|
|
color: $white;
|
|
opacity: 0.85;
|
|
}
|
|
}
|
|
|
|
// CASE: rights are not requested yet
|
|
&.is-unrequested {
|
|
.title {
|
|
@extend %cont-text-sr;
|
|
}
|
|
}
|
|
|
|
// CASE: status is pending
|
|
&.is-pending {
|
|
.status-update {
|
|
.value {
|
|
background: $orange;
|
|
}
|
|
|
|
.status-indicator {
|
|
background: $orange-d1;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
// CASE: status is denied
|
|
&.is-denied {
|
|
.status-update {
|
|
.value {
|
|
background: $red-l1;
|
|
}
|
|
|
|
.status-indicator {
|
|
background: $red-s1;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// ====================
|
|
|
|
// Course/Library tabs
|
|
#course-index-tabs {
|
|
margin: 0;
|
|
font-size: 1.4rem;
|
|
|
|
li {
|
|
display: inline-block;
|
|
line-height: $baseline*2;
|
|
margin: 0 10px;
|
|
|
|
&.active {
|
|
border-bottom: 4px solid theme-color("primary");
|
|
}
|
|
|
|
&.active,
|
|
&:hover {
|
|
a {
|
|
color: $gray-d2;
|
|
}
|
|
}
|
|
|
|
a {
|
|
color: theme-color("primary");
|
|
cursor: pointer;
|
|
display: inline-block;
|
|
}
|
|
}
|
|
}
|
|
|
|
// ELEM: course listings
|
|
.courses-tab,
|
|
.archived-courses-tab,
|
|
.libraries-tab {
|
|
display: none;
|
|
|
|
&.active {
|
|
display: block;
|
|
}
|
|
}
|
|
|
|
.courses,
|
|
.libraries,
|
|
.archived-courses {
|
|
.title {
|
|
@extend %t-title6;
|
|
|
|
margin-bottom: $baseline;
|
|
border-bottom: 1px solid $gray-l3;
|
|
padding-bottom: ($baseline/2);
|
|
color: $gray-l2;
|
|
}
|
|
|
|
.title {
|
|
@extend %t-title6;
|
|
|
|
margin-bottom: $baseline;
|
|
border-bottom: 1px solid $gray-l3;
|
|
padding-bottom: ($baseline/2);
|
|
color: $gray-l2;
|
|
}
|
|
}
|
|
|
|
.list-courses {
|
|
border-radius: 3px;
|
|
border: 1px solid $gray-l2;
|
|
background: $white;
|
|
box-shadow: 0 1px 1px $shadow-l1;
|
|
|
|
li:last-child {
|
|
margin-bottom: 0;
|
|
}
|
|
}
|
|
|
|
|
|
// UI: course wrappers (needed for status messages)
|
|
.wrapper-course {
|
|
|
|
// CASE: has status
|
|
&.has-status {
|
|
.course-status {
|
|
box-sizing: border-box;
|
|
display: inline-block;
|
|
vertical-align: middle;
|
|
width: flex-grid(3, 9);
|
|
padding-right: ($baseline/2);
|
|
text-align: right;
|
|
|
|
.value {
|
|
.copy,
|
|
.icon {
|
|
display: inline-block;
|
|
vertical-align: middle;
|
|
}
|
|
|
|
.icon {
|
|
@extend %t-icon4;
|
|
|
|
margin-right: ($baseline/2);
|
|
}
|
|
|
|
.copy {
|
|
@extend %t-copy-sub1;
|
|
}
|
|
}
|
|
}
|
|
|
|
.status-message {
|
|
@extend %t-copy-sub1;
|
|
|
|
background-color: $gray-l5;
|
|
box-shadow: 0 2px 2px 0 $shadow inset;
|
|
padding: ($baseline*0.75) $baseline;
|
|
|
|
&.has-actions {
|
|
.copy,
|
|
.status-actions {
|
|
display: inline-block;
|
|
vertical-align: middle;
|
|
}
|
|
|
|
.copy {
|
|
width: 65%;
|
|
margin: 0 $baseline 0 0;
|
|
}
|
|
|
|
.status-actions {
|
|
width: 30%;
|
|
text-align: right;
|
|
|
|
.button {
|
|
@extend %btn-secondary-white;
|
|
|
|
padding: ($baseline/4) ($baseline/2);
|
|
}
|
|
|
|
.icon,
|
|
.button-copy {
|
|
display: inline-block;
|
|
vertical-align: middle;
|
|
}
|
|
|
|
.icon {
|
|
@extend %t-icon4;
|
|
|
|
margin-right: ($baseline/4);
|
|
}
|
|
|
|
.button-copy {
|
|
@extend %t-copy-sub1;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// UI: individual course listings
|
|
.course-item {
|
|
box-sizing: border-box;
|
|
width: flex-grid(9, 9);
|
|
position: relative;
|
|
border-bottom: 1px solid $gray-l2;
|
|
padding: $baseline;
|
|
|
|
// STATE: hover/focus
|
|
&:hover {
|
|
background: $paleYellow;
|
|
}
|
|
|
|
.course-link,
|
|
.course-actions {
|
|
box-sizing: border-box;
|
|
display: inline-block;
|
|
vertical-align: middle;
|
|
}
|
|
|
|
// encompassing course link
|
|
.course-link {
|
|
@extend %ui-depth2;
|
|
|
|
width: flex-grid(6, 9);
|
|
|
|
@include margin-right(flex-gutter());
|
|
}
|
|
|
|
// course title
|
|
.course-title {
|
|
@extend %t-title4;
|
|
|
|
@include margin(0, ($baseline*2), ($baseline/4), 0);
|
|
|
|
font-weight: 300;
|
|
}
|
|
|
|
// course metadata
|
|
.course-metadata {
|
|
@extend %t-copy-sub1;
|
|
|
|
@include transition(opacity $tmg-f1 ease-in-out 0);
|
|
|
|
color: $gray-d2;
|
|
|
|
.metadata-item {
|
|
display: inline-block;
|
|
|
|
& + .metadata-item::before {
|
|
content: "/";
|
|
margin-left: ($baseline/4);
|
|
margin-right: ($baseline/4);
|
|
color: $gray-l4;
|
|
}
|
|
|
|
.label {
|
|
@extend %cont-text-sr;
|
|
}
|
|
}
|
|
|
|
.extra-metadata {
|
|
margin-left: ($baseline/4);
|
|
}
|
|
}
|
|
|
|
.course-actions {
|
|
@extend %ui-depth3;
|
|
|
|
position: static;
|
|
width: flex-grid(3, 9);
|
|
|
|
@include text-align(right);
|
|
|
|
.action {
|
|
display: inline-block;
|
|
vertical-align: middle;
|
|
|
|
@include margin-right($baseline/2);
|
|
|
|
&:last-child {
|
|
@include margin-right(0);
|
|
}
|
|
}
|
|
|
|
.button {
|
|
@extend %t-action3;
|
|
}
|
|
|
|
// view live button
|
|
.view-button {
|
|
box-sizing: border-box;
|
|
padding: ($baseline/2);
|
|
}
|
|
|
|
// course re-run button
|
|
.action-rerun {
|
|
margin-right: $baseline;
|
|
}
|
|
}
|
|
|
|
// CASE: is processing
|
|
&.is-processing {
|
|
.course-status .value {
|
|
color: $gray-l2;
|
|
}
|
|
}
|
|
|
|
// CASE: has an error
|
|
&.has-error {
|
|
.course-status {
|
|
color: $red; // TODO: abstract this out to an error-based color variable
|
|
}
|
|
|
|
~ .status-message {
|
|
background: $red-l1; // TODO: abstract this out to an error-based color variable
|
|
color: $white;
|
|
}
|
|
}
|
|
|
|
// CASE: last course in listing
|
|
&:last-child {
|
|
border-bottom: none;
|
|
}
|
|
}
|
|
|
|
// ====================
|
|
|
|
// CASE: courses that are being processed
|
|
.courses-processing {
|
|
margin-bottom: ($baseline*2);
|
|
border-bottom: 1px solid $gray-l3;
|
|
padding-bottom: ($baseline*2);
|
|
|
|
// TODO: abstract this case out better with normal course listings
|
|
.list-courses {
|
|
border: none;
|
|
background: none;
|
|
box-shadow: none;
|
|
}
|
|
|
|
.wrapper-course {
|
|
@extend %ui-window;
|
|
|
|
position: relative;
|
|
}
|
|
|
|
.course-item {
|
|
border: none;
|
|
|
|
// STATE: hover/focus
|
|
&:hover {
|
|
background: inherit;
|
|
|
|
.course-title {
|
|
color: inherit;
|
|
}
|
|
}
|
|
}
|
|
|
|
// course details (replacement for course-link when a course cannot be linked)
|
|
.course-details {
|
|
@extend %ui-depth2;
|
|
|
|
display: inline-block;
|
|
vertical-align: middle;
|
|
width: flex-grid(6, 9);
|
|
margin-right: flex-gutter();
|
|
}
|
|
}
|
|
|
|
.optimization-form {
|
|
margin-bottom: $baseline;
|
|
|
|
label {
|
|
font-size: 1.4rem;
|
|
}
|
|
|
|
.form-actions {
|
|
margin-top: ($baseline/2);
|
|
}
|
|
}
|
|
|
|
// ====================
|
|
|
|
// ELEM: new user form
|
|
.wrapper-create-course {
|
|
|
|
// CASE: when form is animating
|
|
&.animate {
|
|
|
|
// STATE: shown
|
|
&.is-shown {
|
|
height: ($baseline*26);
|
|
|
|
// STATE: errors
|
|
&.has-errors {
|
|
height: ($baseline*33);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// ====================
|
|
|
|
// course listings
|
|
|
|
.create-course,
|
|
.create-library {
|
|
.row {
|
|
@include clearfix();
|
|
|
|
margin-bottom: ($baseline*0.75);
|
|
}
|
|
|
|
.column {
|
|
float: left;
|
|
width: 48%;
|
|
}
|
|
|
|
.column:first-child {
|
|
margin-right: 4%;
|
|
}
|
|
|
|
label {
|
|
@extend %t-title7;
|
|
@extend %t-strong;
|
|
|
|
display: block;
|
|
}
|
|
|
|
.new-course-org,
|
|
.new-course-number,
|
|
.new-course-name,
|
|
.new-course-run,
|
|
.new-library-org {
|
|
width: 100%;
|
|
}
|
|
|
|
.new-course-org,
|
|
.new-library-org {
|
|
padding: 10px;
|
|
}
|
|
|
|
.course-run-text-direction {
|
|
direction: ltr;
|
|
text-align: right;
|
|
}
|
|
|
|
.placeholder-text-direction {
|
|
direction: rtl;
|
|
}
|
|
|
|
.new-course-name {
|
|
@extend %t-title5;
|
|
@extend %t-light;
|
|
}
|
|
|
|
.new-course-save {
|
|
@include blue-button;
|
|
}
|
|
|
|
.new-course-cancel {
|
|
@include white-button;
|
|
}
|
|
|
|
.item-details {
|
|
padding-bottom: 0;
|
|
}
|
|
|
|
.wrap-error {
|
|
@include transition(all $tmg-f2 ease 0s);
|
|
|
|
height: 0;
|
|
overflow: hidden;
|
|
opacity: 0;
|
|
}
|
|
|
|
.wrap-error.is-shown {
|
|
height: 65px;
|
|
opacity: 1;
|
|
}
|
|
|
|
.message-status {
|
|
@extend %t-strong;
|
|
|
|
display: block;
|
|
margin-bottom: 0;
|
|
padding: ($baseline*0.5) ($baseline*1.5) 8px ($baseline*1.5);
|
|
}
|
|
}
|
|
}
|