const cssList = [{places: [`*`], css: ` .fi-tick{ cursor: pointer; border-radius: 50%; transition: background 0.5s, transform 0.3s; background-color: black; } .fi-tick.ticked{ transform: scale(1.2); background-color: green; } .hiddenTask { opacity: 0.2; } .MBPMenu { position: fixed; background: #000033; min-width: 100px; min-height: 100px; box-shadow: 3px 3px 5px #cccccc; } .MBPsection { height: 45px; display: flex; flex-direction: row; justify-content: space-between; padding: 15px 15px; color: white; border-bottom: white 1px solid; } .MBPsection:hover { background-color: #333333; transition: background-color 0.5s; } .MBPColorPicker { padding: 8px; color: white; text-align: center; } .MBPColor { width: 30px; height: 30px; border: white 1px solid; cursor: pointer; margin: 2px; box-sizing: border-box; } .MBPColorSelected { border: white 4px solid; } .MBPColorSection { display: flex; flex-direction: row; justify-content: space-between; } .MBPtable, .MBPth, .MBPtd { border: 1px solid black; border-collapse: collapse; } .MBPth, .MBPtd { padding: 15px; } .MBPth { text-align: left; } .MBPtable { border-spacing: 5px; } `}, {places: [`dashboard`], css: ` /* .agenda a{ text-decoration: none !important; } .agenda .line:not(.default){ background-color: #eef5fe; padding: 15px; margin-bottom: 0px !important; margin-top: 0px !important; border-bottom: white solid 5px; position: relative; cursor: pointer; transition: transform 0.1s; -webkit-touch-callout: none; *//* iOS Safari *//* -webkit-user-select: none; /* Safari *//* -khtml-user-select: none; /* Konqueror HTML *//* -moz-user-select: none; /* Firefox *//* -ms-user-select: none; /* Internet Explorer/Edge *//* user-select: none; /* Non-prefixed version, currently supported by Chrome and Opera *//* } .agenda .line:not(.default).urgent{ background-color: #fff5fa; } .agenda .line:not(.default).approaching{ background-color: #fefeee; } .agenda .line:not(.default).relaxed{ background-color: #eefeee; } .agenda .line:not(.default) .author{ float: left; margin: 0px; margin-right: 15px; } .agenda .line:not(.default):hover{ transform: scale(1.003); } .agenda .line:not(.default) .details{ display: inline-block; width: calc(100% - 70px;) } .agenda .line:not(.default) .date-badge .day{ color: black; } .agenda .line:not(.default) .details .title{ font-size: 16px; line-height: 38px; display: inline-block; } .agenda .line:not(.default) small{ font-size: 13px; line-height: 38px; color: black; margin-left: 15px; float: left; min-width: 200px; margin-right: 40px; } .agenda .line:not(.default) .timeLeft{ position: absolute; top:0px; right:13px; font-size: 15px; line-height: 38px; color: black; text-decoration: none; } .agenda .line:not(.default) .details .title a{ color: black !important; } .agenda .line:not(.default) .dropboxAlert{ font-size: 13px; padding: 5px; border-radius: 5px; background-color: #773333; color: white; margin-left: 5px; position: absolute; right: 13px; bottom: 13px; display: inline-block; } .agenda .line:not(.default) .dropboxAlert.finished{ background-color: #337733; } .agenda .line:not(.default) .label-and-due{ line-height: 44px; position: relative; display: block; min-width: 210px; margin-right: 15px; margin-left: 35px; } .agenda .line:not(.default) .label-and-due .labels-set{ display: block; } .agenda .line:not(.default) .label-and-due .due{ color: black; font-size: 14px; display: block; margin-left: 6px; } .agenda .line:not(.default) .label-and-due .label{ font-size: 11px; padding: 5px; border-radius: 5px; color: white; margin-left: 5px; display: inline-block; } .agenda .line:not(.default) .label-and-due svg{ display: none; } .timetable-wrapper #timetable .class-wrapper{ filter: brightness(38%); } .two-weeks-calendar>tbody>tr>.day>ul>li.blur{ filter: saturate(20%); } .startGame{ position: absolute; top: 68px; right: 280px; width: 10px; height: 10px; cursor: pointer; } .gameDiv{ position: absolute; background-color: #343434ee; right: 280px; top: 116px; opacity: 0; transition: opacity 0.3s; } */ `}]; const themes = { default: { css: ``, js: ``, }, darkthemeColor: { css: `body{ background-color: #2A2A2F; color: white; } .btn{ } .btn.btn-light .svg{ border-color: white; fill: white !important; } .btn-light:not(.preserve-icon-color) svg path, .btn-secondary:not(.preserve-icon-color) svg path{ fill: white; } .btn-light:hover:not(.preserve-icon-color) svg path, .btn-light.hover:not(.preserve-icon-color) svg path, .btn-light:active:not(.preserve-icon-color) svg path, .btn-light.active:not(.preserve-icon-color) svg path, .btn-light:focus:not(.preserve-icon-color) svg path, .btn-light.focus:not(.preserve-icon-color) svg path, .btn-light:focus:active:not(.preserve-icon-color) svg path, .btn-light:focus.active:not(.preserve-icon-color) svg path, .btn-secondary:hover:not(.preserve-icon-color) svg path, .btn-secondary.hover:not(.preserve-icon-color) svg path, .btn-secondary:active:not(.preserve-icon-color) svg path, .btn-secondary.active:not(.preserve-icon-color) svg path, .btn-secondary:focus:not(.preserve-icon-color) svg path, .btn-secondary.focus:not(.preserve-icon-color) svg path, .btn-secondary:focus:active:not(.preserve-icon-color) svg path, .btn-secondary:focus.active:not(.preserve-icon-color) svg path{ fill: white; } .btn.btn-light{ color: white; background-color: #4A4A4A; border: none; background-image: none !important; } .btn.btn-light:hover{ background-color: #4A4A4A !important; } .btn-submit, .form-actions input[type="submit"], .form-actions button[type="submit"], .btn-main{ color: white; background-color: #4A4A4A; border: none; background-image: none !important; } .btn-submit:hover, .form-actions input:hover[type="submit"], .form-actions button:hover[type="submit"], .btn-submit.hover, .form-actions input.hover[type="submit"], .form-actions button.hover[type="submit"], .btn-main:hover, .btn-main.hover{ background-color: #4A4A4A !important; } .content-block{ background-color: #343434 !important; color: white; } .table-striped>tbody>tr, .table-fusion>tbody>tr{ background-color: #343434; } .table-responsive{ border-top: 13px solid #2A2A2F; } .table-striped>tbody>tr:nth-of-type(odd), .table-fusion>tbody>tr:nth-of-type(odd){ background-color: #343434; } .table-hover>tbody>tr:hover, .table-fusion>tbody>tr:hover{ background-color: #2c2c2c; } .two-weeks-calendar tbody td.day.today{ background-color: #4A4A4A; } .panel{ background-color: #4A4A4A; color: white; border: none; } .agenda .line:not(.default) .details .title a{ color: white !important; } .agenda .line:not(.default) .label-and-due .due{ color: white; } .agenda .line:not(.default) .timeLeft{ color: white; } .agenda .line:not(.default) small{ color: white; } .agenda .line:not(.default){ border: none; margin-bottom: 5px !important; } .agenda .line:not(.default).urgent{ background-color: #2A2A2F; } .agenda .line:not(.default).approaching{ background-color: #2A2A2F; } .agenda .line:not(.default).relaxed{ background-color: #2A2A2F; } main .content-wrapper .content-block .content-block-header{ background-color: #000f27; } .two-weeks-calendar tbody td.day{ border: none; } .table>thead>tr>th, .table-fusion>thead>tr>th{ border: none; } .table>tbody>tr:last-of-type>td, .table-fusion>tbody>tr:last-of-type>td{ border-bottom: 13px solid #2A2A2F; } .panel-default>.panel-heading{ background-color: #4A4A4A; color: white; border: none; } main .sidebar section .section-title{ color: white !important; text-shadow: none; } .sidebar .panel-sidebar .panel-default>.panel-heading{ background-image: none; color: white; border: none; } .sidebar .panel-sidebar .panel-default>.panel-body{ background-color: #4A4A4A; color: white; } .panel-body>.content-block{ background: none !important; } .school-logo img{ /* filter: saturate(0%); */ } a{ color: #00f1ff; } .table>thead>tr>th, .table-fusion>thead>tr>th, .table>thead>tr>td, .table-fusion>thead>tr>td, .table>tbody>tr>th, .table-fusion>tbody>tr>th, .table>tbody>tr>td, .table-fusion>tbody>tr>td, .table>tfoot>tr>th, .table-fusion>tfoot>tr>th, .table>tfoot>tr>td, .table-fusion>tfoot>tr>td{ border: none; } .sidebar .nav-sc h4 span{ color: #00f1ff; } .navbar-default{ background-color: #0e0e0e; border: none; } .navbar-default .navbar-nav>li>a{ color: white; } .navbar-default .navbar-brand, .navbar-default a.school-name{ color: white; } #menu .nav-menu li>a{ color: white; } .fc th, .fc td{ border-color: #282828; } .period-classes.class-wrapper{ background: /* top, transparent black, faked with gradient */ linear-gradient( rgba(0, 0, 0, 0.7), rgba(0, 0, 0, 0.7) ), /* bottom, image */ } } .text-muted{ color: #d2d2d2; } .redactor-styles{ color: white; } .content-block-header .nav-tabs>li>a{ background-color: #002258; } .content-block-header .nav-tabs>li.active>a, .content-block-header .nav-tabs>li.active>a:hover, .content-block-header .nav-tabs>li.active>a:focus{ background-color: #00313e; color: white; } .date-badge .day{ color: black; } .highcharts-background{ } .highcharts-root .highcharts-legend-item text{ fill: white !important; } .fc-unthemed .fc-today{ background-color: #4A4A4A !important; } input.form-control, input.form-control:focus, select.form-control, select.form-control:focus, textarea.form-control, textarea.form-control:focus{ background-color: #2A2A2F !important; color: white; border: none; } label.checkbox{ color: white; } .form-actions{ background-color: #343434; border: none; } .notePanel .panel-heading{ background-color: #000f27; } .notePanel .panel-heading.default{ background-color: #343434; color: white; } .messagesPopup{ background-color: #0e0e0e; } .pagination>li>a, .pagination>li>span, .pagination>li>a:hover, .pagination>li>span:hover{ background-color: #4A4A4A; color: white; } .pagination>.active>a, .pagination>.active>a:hover, .pagination>.active>a:focus, .pagination>.active>span, .pagination>.active>span:hover, .pagination>.active>span:focus{ background-color: #001d4a; border: none; } .table-responsive{ border: none; margin-top: 15px; } .message{ border: none; color: white; } .message .header{ background-color: #2A2A2F; color: white; border: none; } .message .header strong{ color: #dddddd; } .message .body{ background-color: #2A2A2F; } .activity-tile .description, .activity-tile .cas-activity-calendar{ color: white; } .progress{ background-color: #636363; } .nav-tabs>li.active>a, .nav-tabs>li.active>a:hover, .nav-tabs>li.active>a:focus{ background-color: #00313e; color: white; } .nav-tabs>li>a, .nav-tabs>li>a:hover, .nav-tabs>li>a:focus{ background-color: #4A4A4A; color: white; } .help-block{ color: white; } label{ color: white; } .checkbox label, .radio label, label.radio-inline, label.checkbox-inline, .form-inline label{ color: white; } .total-commander .file{ border: none; background-color: #444444; } .total-commander .file:nth-of-type(odd){ background-color: #343434; } .total-commander .file:hover{ background-color: #222222; } main .content-wrapper .content-block .content-panel, .form-actions{ background: none; } main .content-wrapper .content-block .content-panel{ border: none; } .popover{ background-color: #0e0e0e; border: none; border-radius: 0px; } .popover-title{ background: none; border: none; } .popover.right>.arrow{ border-right: none; } .popover.right>.arrow:after{ border-right-color: #0e0e0e; } *:not(.round):not(.fi-tick){ border-radius: 0px !important; } .btn, .form-actions input[type="submit"], .form-actions button[type="submit"], .pill{ border-radius: 0px !important; } .openContent{ background-color: #2A2A2F; } .checkboxBox:hover{ background-color: #292929; } .timetable-wrapper #timetable .class-wrapper{ filter: brightness(50%); } .timetable-wrapper #timetable .class-wrapper .period-duration{ color: #000; } .timetable-wrapper #timetable .class-wrapper .class-name a{ color: #000; } .messenger .search{ background-color: #343434; color: white; border: none; } .messenger .messageInput{ background-color: #343434; color: white; border: none; } .messenger .userMessage .text{ background-color: #343434; } .messenger .contact{ background-color: #343434; } .manageBacPlus-setupPopup{ background-color: #2a2a2a; } .redactor-box.redactor-styles-on{ background-color: rgba(0,0,0,0); } .plugin{ background-color: #333333; box-shadow: none; } .developerPlugin{ background-color: #111111; } .nextClassDiv{ color: white; } .nextClassDiv:hover{ background-color: #000000; color: white; } `, js: `let background = document.getElementsByClassName("highcharts-background")[0]; if(background != null){ let darkmode = () => { background.setAttribute("fill", "#343434"); } setInterval(darkmode, 10); darkmode(); } `, }, darkthemePlain: { css: `body{ background-color: rgba(31,31,31,1); color: white; } .btn{ } .btn.btn-light .svg{ border-color: white; fill: #fff !important; } .btn-light:not(.preserve-icon-color) svg path, .btn-secondary:not(.preserve-icon-color) svg path{ fill: white; } .btn-light:hover:not(.preserve-icon-color) svg path, .btn-light.hover:not(.preserve-icon-color) svg path, .btn-light:active:not(.preserve-icon-color) svg path, .btn-light.active:not(.preserve-icon-color) svg path, .btn-light:focus:not(.preserve-icon-color) svg path, .btn-light.focus:not(.preserve-icon-color) svg path, .btn-light:focus:active:not(.preserve-icon-color) svg path, .btn-light:focus.active:not(.preserve-icon-color) svg path, .btn-secondary:hover:not(.preserve-icon-color) svg path, .btn-secondary.hover:not(.preserve-icon-color) svg path, .btn-secondary:active:not(.preserve-icon-color) svg path, .btn-secondary.active:not(.preserve-icon-color) svg path, .btn-secondary:focus:not(.preserve-icon-color) svg path, .btn-secondary.focus:not(.preserve-icon-color) svg path, .btn-secondary:focus:active:not(.preserve-icon-color) svg path, .btn-secondary:focus.active:not(.preserve-icon-color) svg path{ fill: white; } .btn.btn-light{ color: white; background-color: #4A4A4A; border: none; background-image: none !important; } .btn.btn-light:hover{ background-color: #4A4A4A !important; } .btn-submit, .form-actions input[type="submit"], .form-actions button[type="submit"], .btn-main{ color: white; background-color: #4A4A4A; border: none; background-image: none !important; } .btn-submit:hover, .form-actions input:hover[type="submit"], .form-actions button:hover[type="submit"], .btn-submit.hover, .form-actions input.hover[type="submit"], .form-actions button.hover[type="submit"], .btn-main:hover, .btn-main.hover{ background-color: #4A4A4A !important; } .content-block{ background-color: #343434 !important; color: white; } .table-striped>tbody>tr, .table-fusion>tbody>tr{ background-color: #343434; } .table-responsive{ border-top: 13px solid #2A2A2F; } .table-striped>tbody>tr:nth-of-type(odd), .table-fusion>tbody>tr:nth-of-type(odd){ background-color: #343434; } .table-hover>tbody>tr:hover, .table-fusion>tbody>tr:hover{ background-color: #2c2c2c; } .two-weeks-calendar tbody td.day.today{ background-color: #4A4A4A; } .panel{ background-color: #4A4A4A; color: white; border: none; } .agenda .line:not(.default) .details .title a{ color: white !important; } .agenda .line:not(.default) .label-and-due .due{ color: white; } .agenda .line:not(.default) .timeLeft{ color: white; } .agenda .line:not(.default) small{ color: white; } .agenda .line:not(.default){ border: none; margin-bottom: 5px !important; } .agenda .line:not(.default).urgent{ background-color: #2A2A2F; } .agenda .line:not(.default).approaching{ background-color: #2A2A2F; } .agenda .line:not(.default).relaxed{ background-color: #2A2A2F; } main .content-wrapper .content-block .content-block-header{ background: rgba(51, 51, 51, 1); box-shadow: 0 1px 3px rgba(0,0,0,0.12), 0 1px 2px rgba(0,0,0,0.24); } .two-weeks-calendar tbody td.day{ border: none; } .table>thead>tr>th, .table-fusion>thead>tr>th{ border: none; } thead { background-color: rgba(77,77,77,1); color: #fff; } .table>tbody>tr:last-of-type>td, .table-fusion>tbody>tr:last-of-type>td{ border-bottom: 13px solid #2A2A2F; } .panel-default { border-radius: 0 !important; } .panel-default>.panel-heading{ background-color: #4A4A4A; color: white; border: none; } main .sidebar section .section-title{ color: white !important; text-shadow: none; } .sidebar .panel-sidebar .panel-default>.panel-heading{ background-image: none; color: white; border: none; } .sidebar .panel-sidebar .panel-default>.panel-body{ background-color: #4A4A4A; color: white; } .panel-body>.content-block{ background: none !important; } .school-logo img{ /* filter: saturate(0%); */ } a{ color: #00f1ff; } .table>thead>tr>th, .table-fusion>thead>tr>th, .table>thead>tr>td, .table-fusion>thead>tr>td, .table>tbody>tr>th, .table-fusion>tbody>tr>th, .table>tbody>tr>td, .table-fusion>tbody>tr>td, .table>tfoot>tr>th, .table-fusion>tfoot>tr>th, .table>tfoot>tr>td, .table-fusion>tfoot>tr>td{ border: none; } .sidebar .nav-sc h4 span{ color: #00f1ff; } .navbar-default{ background-color: rgba(51,51,51,1); box-shadow: 0 1px 3px rgba(0,0,0,0.12), 0 1px 2px rgba(0,0,0,0.24); transition: all 0.3s cubic-bezier(.25,.8,.25,1); border: none; } .navbar-default:hover { box-shadow: 0 3px 6px rgba(0,0,0,0.16), 0 3px 6px rgba(0,0,0,0.23); } .navbar-default .navbar-nav>li>a{ color: white; } .navbar-default .navbar-nav>li>a:hover { color: #fff; } .navbar-default .navbar-brand, .navbar-default a.school-name{ color: white; } .navbar-default .navbar-brand:hover, .navbar-default a.school-name:hover { color: #fff; } #menu { background-color: rgba(51,51,51,1); } #menu .nav-menu li.title { color: #fff; } #menu .nav-menu li>a:hover, #menu .nav-menu li>a:active, #menu .nav-menu li>a.active, #menu .nav-menu li>a:focus { background-color: rgba(68, 68, 68, 1); color: #fff; } #menu .nav-menu li>a { color: #e0e0e0; } #menu .nav-menu li>a:hover { color: #fff; } #menu-trigger.active::after { display: none; } .fc th, .fc td{ border-color: #282828; } .period-classes.class-wrapper{ background: /* top, transparent black, faked with gradient */ linear-gradient( rgba(0, 0, 0, 0.7), rgba(0, 0, 0, 0.7) ), /* bottom, image */ } } .text-muted{ color: #d2d2d2; } .redactor-styles{ color: white; } .content-block-header .nav-tabs>li>a{ background-color: #002258; } .content-block-header .nav-tabs>li.active>a, .content-block-header .nav-tabs>li.active>a:hover, .content-block-header .nav-tabs>li.active>a:focus{ background-color: #00313e; color: white; } .date-badge .day{ color: black; } .highcharts-background{ } .highcharts-root .highcharts-legend-item text{ fill: white !important; } .fc-unthemed .fc-today{ background-color: #4A4A4A !important; } input.form-control, input.form-control:focus, select.form-control, select.form-control:focus, textarea.form-control, textarea.form-control:focus{ background-color: #2A2A2F !important; color: white; border: none; } label.checkbox{ color: white; } .form-actions{ background-color: #343434; border: none; } .notePanel .panel-heading { background: rgba(51, 51, 51, 1); } .notePanel .panel-heading.default{ background-color: #343434; color: white; } .messagesPopup{ background-color: #0e0e0e; } .pagination>li>a, .pagination>li>span, .pagination>li>a:hover, .pagination>li>span:hover{ background-color: #4A4A4A; color: white; } .pagination>.active>a, .pagination>.active>a:hover, .pagination>.active>a:focus, .pagination>.active>span, .pagination>.active>span:hover, .pagination>.active>span:focus{ background-color: #001d4a; border: none; } .table-responsive{ border: none; margin-top: 15px; } .message{ border: none; color: white; } .message .header{ background-color: #2A2A2F; color: white; border: none; } .message .header strong{ color: #dddddd; } .message .body{ background-color: #2A2A2F; } .activity-tile .description, .activity-tile .cas-activity-calendar{ color: white; } .progress{ background-color: #636363; } .nav-tabs>li.active>a, .nav-tabs>li.active>a:hover, .nav-tabs>li.active>a:focus{ background-color: #00313e; color: white; } .nav-tabs>li>a, .nav-tabs>li>a:hover, .nav-tabs>li>a:focus{ background-color: #4A4A4A; color: white; } .help-block{ color: white; } label{ color: white; } .checkbox label, .radio label, label.radio-inline, label.checkbox-inline, .form-inline label{ color: white; } .total-commander .file{ border: none; background-color: #444444; } .total-commander .file:nth-of-type(odd){ background-color: #343434; } .total-commander .file:hover{ background-color: #222222; } main .content-wrapper .content-block .content-panel, .form-actions{ background: none; } main .content-wrapper .content-block .content-panel{ border: none; } .popover{ background-color: #0e0e0e; border: none; border-radius: 0px; } .popover-title{ background: none; border: none; } .popover.right>.arrow{ border-right: none; } .popover.right>.arrow:after{ border-right-color: #0e0e0e; } *:not(.round):not(.fi-tick){ border-radius: 0px !important; } .btn, .form-actions input[type="submit"], .form-actions button[type="submit"], .pill{ border-radius: 0px !important; } .openContent{ background-color: #2A2A2F; } .checkboxBox:hover{ background-color: #292929; } .timetable-wrapper #timetable .class-wrapper{ filter: brightness(50%); } .timetable-wrapper #timetable .class-wrapper .period-duration{ color: #000; } .timetable-wrapper #timetable .class-wrapper .class-name a{ color: #000; } .messenger .search{ background-color: #343434; color: white; border: none; } .messenger .messageInput{ background-color: #343434; color: white; border: none; } .messenger .userMessage .text{ background-color: #343434; } .messenger .contact{ background-color: #343434; } .redactor-box.redactor-styles-on{ background-color: rgba(0,0,0,0); } .plugin{ background-color: #333333; box-shadow: none; } .developerPlugin{ background-color: #111111; } .nextClassDiv{ color: white; } .nextClassDiv:hover{ background-color: #000000; color: white; } `, js: `let background = document.getElementsByClassName("highcharts-background")[0]; if(background != null){ let darkmode = () => { background.setAttribute("fill", "#343434"); } setInterval(darkmode, 10); darkmode(); } `, }, modernTheme: { css: ` body{ --light: #fff4f4; --green: #0F9D58; --red: #DB4437; --blue: #4285F4; --yellow: #F4B400; background-color: white; } #menu{ background-color: white !important; color: black; } #menu path{ fill: black !important; } #menu .nav-menu li.parent>ul li{ background-color: white !important; color: black !important; } #menu .nav-menu li>a{ color: black !important; } #menu li>a.active, #menu .nav-menu li>a:active, #menu .nav-menu li>a:focus, #menu .nav-menu li>a:hover{ color: black !important; } #menu .nav-menu li.title{ color: black; } #menu>ul>li>a{ color: black !important; padding: 10px !important; border-radius: 5px; } .narrow #menu>ul>li>a{ margin: 10px !important; } #menu svg path{ fill: black; } #menu li>a.active, #menu .nav-menu li>a:active, #menu .nav-menu li>a:focus, #menu .nav-menu li>a:hover{ background-color: var(--blue) !important; color: white !important; } main .content-wrapper .content-block{ box-shadow: none; } main .sidebar+.content-wrapper{ /* margin-left: 235px; */ } main .content-wrapper .content-block{ margin-top: 0px; } tbody td.day{ background-color: white; border: none !important; } tbody td.day.today{ background-color: var(--light) !important; } tbody td.day ul li{ padding: 8px !important; font-size: 13px; } tbody td.day ul li img{ width: 16px; height: auto; } #menu-trigger.active::after{ border-bottom-color: rgba(0,0,0,0) !important; } .btn.btn-light{ background-image: none; background-color: var(--green) !important; color: white !important; border: none !important; font-size: 15px !important; box-shadow: none; } .btn.btn-light svg path{ fill: white; } .btn-light:hover:not(.preserve-icon-color) svg path, .btn-light.hover:not(.preserve-icon-color) svg path, .btn-light:active:not(.preserve-icon-color) svg path, .btn-light.active:not(.preserve-icon-color) svg path, .btn-light:focus:not(.preserve-icon-color) svg path, .btn-light.focus:not(.preserve-icon-color) svg path, .btn-light:focus:active:not(.preserve-icon-color) svg path, .btn-light:focus.active:not(.preserve-icon-color) svg path, .btn-secondary:hover:not(.preserve-icon-color) svg path, .btn-secondary.hover:not(.preserve-icon-color) svg path, .btn-secondary:active:not(.preserve-icon-color) svg path, .btn-secondary.active:not(.preserve-icon-color) svg path, .btn-secondary:focus:not(.preserve-icon-color) svg path, .btn-secondary.focus:not(.preserve-icon-color) svg path, .btn-secondary:focus:active:not(.preserve-icon-color) svg path, .btn-secondary:focus.active:not(.preserve-icon-color) svg path{ fill: white; } .agenda .line:not(.default).relaxed{ background-color: #beffc0; } .openContent{ background: none; box-shadow: 0px 0px 10px #cccccc; } .btn-light:not(.preserve-icon-color) .fa, .btn-secondary:not(.preserve-icon-color) .fa{ color: white !important; } .agenda .line:not(.default) .date-badge .day{ color: black !important; } .agenda .line:not(.default).approaching{ background-color: #ffebb1; } .agenda .line:not(.default).urgent{ background-color: #ffb0a9; } .fc button.fc-state-active{ color: black !important; } .notePanel .panel-heading{ background-color: var(--green); } .notePanel{ border: none; border-radius: 0px; box-shadow: 0px 0px 10px #cccccc; } .panel-default>.panel-heading{ border: none; } .panel-heading{ border-bottom: 0px; } .panel-default{ border: none; } main .content-wrapper .content-block .content-block-header{ background-color: var(--blue); } input:checked + .slider{ background-color: var(--blue); } .form-control{ border: black 1px solid; border-radius: 0px; background-color: white; } .form-control:focus{ border-color: var(--green); } .table>thead>tr>th, .table-fusion>thead>tr>th, .table>thead>tr>td, .table-fusion>thead>tr>td, .table>tbody>tr>th, .table-fusion>tbody>tr>th, .table>tbody>tr>td, .table-fusion>tbody>tr>td, .table>tfoot>tr>th, .table-fusion>tfoot>tr>th, .table>tfoot>tr>td, .table-fusion>tfoot>tr>td{ background-color: white; border-color: black !important; } .table>thead>tr>th, .table-fusion>thead>tr>th{ border-bottom: none !important; } .progress-bar-warning{ background-color: var(--red); } .progress-bar-success{ background-color: var(--green); } main .content-wrapper .content-block hr.divider{ border-top-color: black; } .message .header{ border: none; background-color: white; } .message{ border-color: black; } .message .header::after{ border-right: none; } #menu:not(.narrow) li.quick-add a{ background-color: white !important; } #menu .nav-menu{ background-color: #ffffff; } `, js: `let ICSimg = document.getElementsByClassName("school-logo")[0]; if(ICSimg != null){ ICSimg.children[0].src = "https://zubatomic.com/projects/managebac/themes/modernICS" } `, }, rainbowTheme: { css: `*{ filter: contrast(110%) hue-rotate(140deg) saturate(140%); } `, js: ``, }, }; const metadataName = "1958222 SAVEFILE - DO NOT DELETE (Managebac Plus)"; const school = window.location.href.split("//")[1].split("/")[0]; let _metadata; let _metadataId; let _tasks; let _classes; let PAGEDOM = {}; const colors = [ { title: "Deadline", bg: "#91181B", text: "white", }, { title: "Exam", bg: "rgb(255, 71, 68)", text: "white", }, { title: "Test", bg: "rgb(255, 173, 58)", text: "white", }, { title: "Quiz", bg: "rgb(255, 241, 0)", text: "black", }, { title: "Event", bg: "#090", text: "white", }, { title: "Paper", bg: "#A2C400", text: "white", }, { title: "Presentation", bg: "#c383ff", text: "white" }, { title: "Meeting", bg: "rgb(51, 51, 204)", text: "white", }, { title: "Homework", bg: "#2175C6", text: "white", }, ]; console.log("Init..."); function init(){ console.log("Attempting start..."); try { collectDOM(); //Try to collect DOM prematurely getClasses(); } catch (e) { } pushScriptLifecylce(); putChecker(); setInterval(() => { if(document.getElementById("managebacPlusChecker199328") == null){ putChecker(); setTimeout(setupAll); } }, 100); setupAll(); } function putChecker(){ let checker = document.createElement("DIV"); checker.id = "managebacPlusChecker199328"; checker.style.display = "none"; document.body.appendChild(checker); } function setupAll(){ console.log("Starting"); if(window.location.pathname == "/login") return; checkUpdates(); initializePageLifecycle(); } let updateMetadataQueue = []; let updateMetadataSaturated = false; function updateMetadata(content){ if (content != null) { updateMetadataQueue.push(content); _metadata = content; } if (updateMetadataQueue.length == 0) { return; } if (updateMetadataSaturated) { return; } let newContent = updateMetadataQueue.shift(); updateMetadataSaturated = true; pushScript(` window.temporaryFunctionManagebacPlus = Turbolinks.visit; Turbolinks.visit = () => { //as soon as this is called, ignore and then set it. Turbolinks.visit = temporaryFunctionManagebacPlus; }; $.post("https://${school}/student/events/${_metadataId}", { "utf8": "✓", "_method": "patch", "event[name]": "${metadataName}", "event[where]": "", "event[notes]": \`${JSON.stringify(newContent)}\`, "event[start_at]": "September 6, 2018", "event[start_at(1i)]": "2018", "event[start_at(2i)]": "9", "event[start_at(3i)]": "6", "event[start_at(4i)]": "00", "event[start_at(5i)]": "00", "event[all_day]": 0, "commit": "Save Changes" }, respond);`, res => { updateMetadataSaturated = false; updateMetadata(); }); } function getMetadata(callback) { getAllTasks(data => { let existingMetadata = data.find(task => task.title == metadataName); if(!existingMetadata){ createMetadataTask(); } else { _metadata = toJSON(existingMetadata.description, {}); _metadataId = existingMetadata.id; chrome.storage.local.set({taskMetadata: existingMetadata.id}, () => { callback(); }); } }); } function toJSON(text, ifError) { let json; try{ json = JSON.parse(text); }catch(e){ json = ifError; } return json; } function createMetadataTask(){ pushScript(`$.post("https://${school}/student/events", { "utf8": "✓", "event[name]": "${metadataName}", "event[where]": "", "event[notes]": "", "event[start_at]": "September 6, 2018", "event[start_at(1i)]": "2018", "event[start_at(2i)]": "9", "event[start_at(3i)]": "6", "event[start_at(4i)]": "00", "event[start_at(5i)]": "00", "event[all_day]": 0, "commit": "Add Event" }, res => respond(res));`, () => { navigateTo("/student"); }); } let pushScriptId = 0; let pushScriptHandlers = []; function pushScriptLifecylce() { let signals = document.getElementsByClassName("MBPSignal"); if (signals.length > 0) { let signal = signals[0]; let scriptId = parseInt(signal.id.substring(9)); let message = signal.innerHTML; let callback = pushScriptHandlers[scriptId]; pushScriptHandlers[scriptId] = null; signal.parentElement.removeChild(signal); callback(message); pushScriptLifecylce(); //there may be more signals to process on this cycle } else { setTimeout(pushScriptLifecylce, 100); } } function pushScript(script, callback){ if (!callback) { callback = () => {}; } let scriptTag = document.createElement("script"); scriptTag.innerHTML = ` (() => { function respond(msg) { //console.log("Script ${pushScriptId} responds with ", msg); let signal = document.createElement("signal"); signal.id = "MBPSignal${pushScriptId}"; signal.classList.add("MBPSignal"); signal.innerHTML = msg; document.head.appendChild(signal); } ${script} })(); `; document.head.appendChild(scriptTag); pushScriptHandlers.push(callback ? callback : null); pushScriptId++; } function navigateTo(url) { pushScript(` navigateTo("${url}"); `); } function getClasses(){ _classes = []; let classesDom; try{ classesDom = PAGEDOM.navMenuChildren.classes.children[1].children; }catch(e){ console.log("Unkown error. Left hand side classes menu not found"); } for(let i = 0; i < classesDom.length-1; i++){ classDom = classesDom[i]; let aDom = classDom.children[0]; let classLink = aDom.href; let linkParts = classLink.split("/"); let classId = linkParts[5]; let spanDom = aDom.children[aDom.children.length-1]; let className = spanDom.innerHTML.trim(); _classes.push({ name: className, id: classId, }); } } function getAllTasks(callback){ fetch('https://'+school+'/student/events.json?start=2012-08-27&end=2050-10-08') .then( function(response) { response.json().then(function(data) { // console.log(data); data.map(task => { let urlParts = task.url.split("/"); let classMeta = null; if(!task.url.startsWith("/student/events")){ let classId = urlParts[urlParts.length - 3]; task.classId = classId; classMeta = getClassById(classId); } task.classMeta = classMeta; let type = "personal"; if(task.url.indexOf("/classes/") != -1) type = "class"; if(task.url.indexOf("/ib/") != -1) type = "ib"; if(task.url.indexOf("/groups/") != -1) type = "group"; task.type = type; return task; }); _tasks = data; callback(data); }); } ) .catch(e => { console.error(e); }); } function getClassById(id){ return _classes.find(c => c.id == id); } function checkUpdates(){ checkUpdate(latestVersion => { chrome.storage.local.get(["currentVersion"], v => { let currentVersion = v.currentVersion; if(currentVersion != latestVersion){ fetchUpdate(done => { chrome.storage.local.set({currentVersion: latestVersion}, a => { console.log("UPDATE COMPLETE"); window.location.reload(); }); }); } }); }); } function checkUpdate(callback){ console.log("CHECKING UPDATES..."); $.get("https://zubatomic.com/projects/managebac/version", {}, res => { let latestVersion = res.split(";")[0]; callback(latestVersion); }); } function fetchUpdate(callback){ console.log("Updating..."); $.get("https://zubatomic.com/projects/managebac/mainRelay", {}, res => { console.log("FETCHED 1/3"); chrome.storage.local.set({mainCode: res}, function() { console.log("STORED 1/3"); }); $.get("https://zubatomic.com/projects/managebac/popupRelay", {}, res2 => { console.log("FETCHED 2/3"); chrome.storage.local.set({popupCode: res2}, function() { console.log("STORED 2/3"); }); $.get("https://zubatomic.com/projects/managebac/optionPageRelay", {}, res3 => { console.log("FETCHED 3/3"); chrome.storage.local.set({optionPageCode: res3}, function() { console.log("STORED 3/3"); }); callback(); }); }); }); } function editMetadata(callback) { let copyMetadata = JSON.parse(JSON.stringify(_metadata)); callback(copyMetadata); updateMetadata(copyMetadata); } function assure(obj, prop, def) { if (def == null) def = {}; if (obj[prop] == null) { obj[prop] = def; } } function getPageName(location, params) { if(location == "/student" || location == "/student/"){ return "dashboard"; } if(location.startsWith("/student/calendar")) { return "calendar"; } if(location.endsWith("core_tasks") || locations.endsWith("core_tasks/")) { return "core_tasks"; } } function initializePageLifecycle() { console.log("Initializing LifeCycle"); console.log("Catche: ", {_classes, _metadata, _metadataId, _tasks}); let location = window.location.pathname; let getParamsRaw = window.location.search.substr(1).split("&"); let getParams = {}; getParamsRaw.forEach(raw => { getParams[raw.split("=")[0]] = raw.split("=")[1]; }); let pageName = getPageName(location, getParams); pushCss(pageName); setupPopupSystem(); collectDOM(pageName, location, getParams); pushDOM(pageName, location, getParams); getMetadata(() => { vitalizeDOM(pageName, location, getParams); }); } function setupPopupSystem() { document.body.onclick = evt => { if (previousMenu) { previousMenu.parentElement.removeChild(previousMenu); previousMenu = null; } } } const g = { c: className => { return Array.from(document.getElementsByClassName(className)); }, id: id => { return document.getElementById(id); } } function ticked(id) { assure(_metadata, "events"); assure(_metadata.events, id) assure(_metadata.events[id], "ticked", false); return _metadata.events[id].ticked; } function toggleTick(id) { editMetadata(meta => { assure(meta, "events"); assure(meta.events, id) assure(meta.events[id], "ticked", false); meta.events[id].ticked = !meta.events[id].ticked; }); } function getColor(id) { assure(_metadata, "events"); assure(_metadata.events, id); let colorBg = _metadata.events[id].color; if (colorBg == null) { return null; } let color = colors.find(c => c.bg == colorBg); if (color == null) { color = { title: "Custom color", bg: colorBg, text: "white", } } return color; } function setColor(id, color) { editMetadata(meta => { assure(meta, "events"); assure(meta.events, id); assure(meta.events[id], "color", color) meta.events[id].color = color; }) } function createButton(title, href) { let elm = document.createElement("A"); elm.classList.add("btn"); elm.classList.add("btn-light"); if (href) elm.href = href; elm.innerHTML = ` ${title} `; return elm; } let previousMenu = null; function putContextMenu(elm, x, y) { if (previousMenu) { previousMenu.parentElement.removeChild(previousMenu); } let parent = document.createElement("DIV"); previousMenu = parent; parent.classList.add("MBPMenu"); parent.style.left = `${x}px`; parent.style.top = `${y}px`; parent.onclick = evt => { evt.stopPropagation(); } document.body.appendChild(parent); parent.appendChild(elm); } let pages = { dashboard: { collectDOM: params => { PAGEDOM.dashboardHeader = g.c("widget-header")[0]; PAGEDOM.upcomingHeader = g.c("widget-header")[1]; PAGEDOM.timetableCalendarButton = PAGEDOM.dashboardHeader.children[0].children[1].lastElementChild; PAGEDOM.timetableCalendarButton.onclick = evt => { setTimeout(() => { pages.dashboard.collectDOM(); pages.dashboard.pushDOM(); pages.dashboard.vitalizeDOM(); }, 1000); } PAGEDOM.tasks = g.c("event-with-tip").map(info_tip => { return { parent: info_tip.parentElement, } }); }, pushDOM: params => { if (PAGEDOM.tasks.length > 0) { let pipe = document.createElement("span"); pipe.classList.add("pipe"); PAGEDOM.dashboardHeader.children[0].children[1].insertBefore(pipe, PAGEDOM.dashboardHeader.children[0].children[1].firstChild) let toggleButton = createButton("Toggle ticked tasks"); PAGEDOM.toggleButton = toggleButton; PAGEDOM.dashboardHeader.children[0].children[1].insertBefore(toggleButton, PAGEDOM.dashboardHeader.children[0].children[1].firstChild) } PAGEDOM.tasks.forEach(task => { let checkImg = document.createElement("IMG"); checkImg.src = "https://zubatomic.com/projects/managebac/tick"; checkImg.classList.add("fi"); checkImg.classList.add("fi-tick"); task.checkImg = checkImg; task.parent.appendChild(checkImg); task.originalColor = { bg: task.parent.style.backgroundColor, text: task.parent.style.color, }; if (_metadata) { let color = getColor(task.parent.getAttribute("event_id")); if (color != null) { task.parent.style.backgroundColor = color.bg; task.parent.style.color = color.text; } } }) }, vitalizeDOM: params => { function revitalizeTasks() { PAGEDOM.tasks.forEach(task => { let taskMeta = _tasks.find(t => t.id == task.parent.getAttribute("event_id")); if (ticked(taskMeta.id)) { task.checkImg.classList.add("ticked"); } else { task.checkImg.classList.remove("ticked"); } if (ticked(taskMeta.id)) { if (PAGEDOM.toggleButton.classList.contains("active")) { task.parent.classList.add("hiddenTask"); } else { task.parent.classList.remove("hiddenTask"); } } else { task.parent.classList.remove("hiddenTask"); } let color = getColor(taskMeta.id); if (color == null) { color = task.originalColor; } task.parent.style.backgroundColor = color.bg; task.parent.style.color = color.text; }) } if (PAGEDOM.toggleButton) { PAGEDOM.toggleButton.onclick = evt => { PAGEDOM.toggleButton.classList.toggle("active"); revitalizeTasks(); } } PAGEDOM.tasks.forEach(task => { let taskMeta = _tasks.find(t => t.id == task.parent.getAttribute("event_id")); task.checkImg.onclick = evt => { toggleTick(taskMeta.id); task.checkImg.classList.toggle("ticked"); revitalizeTasks(); } task.parent.oncontextmenu = evt => { evt.preventDefault(); let parent = document.createElement("DIV"); let tickedCheckbox = document.createElement("DIV"); tickedCheckbox.classList.add("MBPsection"); let checkbox = document.createElement("INPUT"); if (ticked(taskMeta.id)) { checkbox.checked = "checked"; } checkbox.onclick = evt => { toggleTick(taskMeta.id); revitalizeTasks(); } checkbox.type="checkbox"; checkbox.classList.add("boolean"); let text = document.createElement("DIV"); text.innerHTML = "Ticked?"; tickedCheckbox.appendChild(text); tickedCheckbox.appendChild(checkbox); let colorPicker = document.createElement("DIV"); colorPicker.classList.add("MBPColorPicker"); let title = document.createElement("DIV"); title.innerHTML = "Change color:"; title.style.marginBottom = "6px"; colorPicker.appendChild(title); let selectedColor; //changes let currentSection; colors.forEach((color, i) => { if (i % 3 == 0) { if (currentSection) colorPicker.appendChild(currentSection); currentSection = document.createElement("DIV"); currentSection.classList.add("MBPColorSection") } let thisColor = document.createElement("DIV"); thisColor.style.backgroundColor = color.bg; thisColor.title = color.title; thisColor.classList.add("MBPColor"); if (getColor(taskMeta.id) != null && getColor(taskMeta.id).bg == color.bg) { thisColor.classList.add("MBPColorSelected"); selectedColor = thisColor; } currentSection.appendChild(thisColor); thisColor.onclick = evt => { let wasSelected = thisColor.classList.contains("MBPColorSelected"); if (selectedColor) { selectedColor.classList.remove("MBPColorSelected"); } if (wasSelected) { thisColor.classList.remove("MBPColorSelected"); setColor(taskMeta.id, null); } else { thisColor.classList.add("MBPColorSelected"); selectedColor = thisColor; setColor(taskMeta.id, color.bg); } revitalizeTasks(); }; }); colorPicker.appendChild(currentSection); parent.appendChild(tickedCheckbox); parent.appendChild(colorPicker); putContextMenu(parent, evt.clientX, evt.clientY); } }); revitalizeTasks(); } }, core_tasks: { collectDOM: params => { PAGEDOM.classId = window.location.pathname.substring("/student/classes/".length).split("/")[0]; PAGEDOM.scores = g.c("label-score").map(scoreDOM => { return { exactScore: eval(scoreDOM.innerHTML), overallScore: scoreDOM.nextElementSibling.innerHTML, worth: scoreDOM.parentElement.nextElementSibling.innerHTML.trim(), category: scoreDOM.parentElement.nextElementSibling.nextElementSibling.innerHTML, id: parseInt(scoreDOM.parentElement.parentElement.parentElement.parentElement.parentElement.id.substring(10)), } }); PAGEDOM.weightings = g.c("list-item").filter((_, i) => i>0).map(weightingDOM => { return { category: weightingDOM.children[0].children[0].innerHTML.trim(), weight: parseInt(weightingDOM.children[1].innerHTML.trim()) / 100, } }); PAGEDOM.headerTitle = g.c("header-tile")[0]; }, pushDOM: params => { function getAverage(allScores) { let totalAvailable = 0; let categoryScores = PAGEDOM.weightings.map(weighting => { let scores = allScores.filter(score => score.category == weighting.category); let total = scores.map(score => score.exactScore).reduce((a, b) => a+b, 0); if (scores.length > 0) { totalAvailable += weighting.weight; } return total / scores.length * weighting.weight; }).filter(weighting => !isNaN(weighting)); let averageGrade = categoryScores.reduce((a, b) => a+b, 0) / totalAvailable; return averageGrade; } function getRawAverage(allScores) { let total = allScores.map(score => score.exactScore).reduce((a, b) => a+b, 0); return total / allScores.length; } function displayGrade(decimal) { if (isNaN(decimal)) { return "No data"; } return Math.round(decimal * 10000) / 100 + "%"; } let averageWithEverything = getAverage(PAGEDOM.scores); let averageWithSummative = getAverage(PAGEDOM.scores.filter(s => s.worth == "Summative")); let div = document.createElement("h3"); div.innerHTML = `Your average grade is: ${displayGrade(averageWithSummative)}`; div.style.marginBottom = "15px"; let moreCalculations = document.createElement("table"); moreCalculations.classList.add("MBPTable"); moreCalculations.innerHTML = ` Both Summative & Formative Only Summative Using teacher's weightings ${displayGrade(averageWithEverything)} ${displayGrade(averageWithSummative)} Raw average ${displayGrade(getRawAverage(PAGEDOM.scores))} ${displayGrade(getRawAverage(PAGEDOM.scores.filter(s => s.worth == "Summative")))} `; PAGEDOM.headerTitle.parentElement.insertBefore(div, PAGEDOM.headerTitle.nextElementSibling); PAGEDOM.headerTitle.parentElement.insertBefore(moreCalculations, div.nextElementSibling); }, vitalizeDOM: params => { } } } function pushCss(placeName){ if(placeName == null) placeName = "null"; cssList.forEach(css => { if(css.places.includes(placeName.toLowerCase()) || css.places.includes("*")){ let styleDom = document.createElement("STYLE"); styleDom.innerHTML = css.css; document.head.appendChild(styleDom); } }); } function collectDOM(pageName, location, params) { PAGEDOM = {}; PAGEDOM.navMenu = document.getElementsByClassName("nav-menu")[0]; PAGEDOM.navMenuChildren = {}; let navMenuChildren = PAGEDOM.navMenu.children; for(let i = 0; i < navMenuChildren.length; i++){ let elm = navMenuChildren[i]; if(elm.classList.contains("quick-add")){ PAGEDOM.navMenuChildren.quickAdd = elm; }else if(elm.innerHTML.toLowerCase().trim() == "general"){ PAGEDOM.navMenuChildren.generalLi = elm; }else if(elm.innerHTML.toLowerCase().trim() == "academics"){ PAGEDOM.navMenuChildren.academicsLi = elm; }else if(elm.innerHTML.toLowerCase().trim() == "managebac plus"){ PAGEDOM.navMenuChildren.managebacPlusLi = elm; }else if(elm.children.length > 0){ if(elm.children[0].children.length > 0){ let lastChildText = elm.children[0].children[elm.children[0].children.length-1].innerHTML.toLowerCase().trim(); if(lastChildText == "dashboard") PAGEDOM.navMenuChildren.dashboard = elm; if(lastChildText == "calendar") PAGEDOM.navMenuChildren.calendar = elm; if(lastChildText == "ib manager" || lastChildText == "year groups"){ PAGEDOM.navMenuChildren.ibManager = elm; PAGEDOM.navMenuChildren.yearGroups = elm; } if(lastChildText == "blog") PAGEDOM.navMenuChildren.blog = elm; if(lastChildText == "timetables") PAGEDOM.navMenuChildren.timetables = elm; if(lastChildText == "classes") PAGEDOM.navMenuChildren.classes = elm; if(lastChildText == "portfolio") PAGEDOM.navMenuChildren.portfolio = elm; if(lastChildText == "reports") PAGEDOM.navMenuChildren.reports = elm; if(lastChildText == "reflections") PAGEDOM.navMenuChildren.reflections = elm; if(lastChildText == "groups") PAGEDOM.navMenuChildren.groups = elm; if(lastChildText == "community") PAGEDOM.navMenuChildren.community = elm; if(lastChildText == "plugins") PAGEDOM.navMenuChildren.plugins = elm; } } } if (pages[pageName]) { pages[pageName].collectDOM(params); } } function pushDOM(pageName, location, params) { console.log("Pushing DOM..."); let notices = g.c("notice"); notices.forEach(notice => { if(notice.innerHTML.includes("Event was successfully updated.")) { notice.parentElement.removeChild(notice); } }) if (pages[pageName]) { pages[pageName].pushDOM(params); } } function vitalizeDOM(pageName, location, params) { console.log("Vitalizing DOM..."); console.log("Catche: ", {_classes, _metadata, _metadataId, _tasks}); let sidebar = document.getElementsByClassName("sidebar")[0]; sidebar.onclick = evt => { editMetadata(meta => { assure(meta, "count", -1); meta.count++; }); } if (pages[pageName]) { pages[pageName].vitalizeDOM(params); } } setTimeout(init, 0);