var renaming and commenting, main.js

This commit is contained in:
Kenneth Jao 2016-08-30 18:49:33 -04:00
parent 2dc29d0f16
commit cd72662cb6
2 changed files with 228 additions and 251 deletions

View File

@ -805,6 +805,10 @@ input, textarea {
font-size: 75%;
}
#commentRestrict {
font-weight: 400;
}
#commentSubmit {
margin-bottom: 0;
padding: 2%;
@ -832,6 +836,7 @@ input, textarea {
.doneUser {
padding: 12%;
background-color: rgba(0,0,0,0.1);
overflow-y: auto;
-webkit-transition: background-color 0.4s ease;
-moz-transition: background-color 0.4s ease;

View File

@ -5,6 +5,7 @@ import {
import './main.html';
var load = true;
var calCreWork = null;
var openValues = {
"menu": "-25%",
@ -42,14 +43,13 @@ var ref = {
};
// Reactive variables.
Session.set("calendarclasses", null); //
Session.set("calendarClasses", null); //
Session.set("sidebar", null);
Session.set("newWork",null);
Session.set("currentWork",null);
Session.set("currentReadableWork",null);
Session.set("modifying",null);
Session.set("noclass",null);
Session.set("calCreWork",null);
Session.set("calWorkDate",null);
Session.set("classDisp",[]);
Session.set("classDispHover",null);
@ -73,52 +73,54 @@ Template.registerHelper('overlayDim', (part) => { // Gets size of the overlay co
return width + height + margin + bg;
});
Template.registerHelper('myClasses', () => {
if (Meteor.user().profile.classes === undefined || Meteor.user().profile.classes.length === 0) {
Session.set("noclass",true);
Template.registerHelper('myClasses', () => { // Gets all classes and respective works.
if (Meteor.user().profile.classes === undefined || Meteor.user().profile.classes.length === 0) { // Null checking.
Session.set("noclass",true); // Makes sure to display nothing.
return [];
} else {
var array = [];
var courses = Meteor.user().profile.classes;
var classDisp = Session.get("classDisp");
var classDisp = Session.get("classDisp"); // Get sidebar class filter.
var hide = Meteor.user().profile.preferences.timeHide;
for(var i = 0; i < courses.length; i++) {
for(var i = 0; i < courses.length; i++) { // For each user class.
found = classes.findOne({_id:courses[i]});
found.subscribers = found.subscribers.length;
found.mine = true;
if(found.admin === Meteor.userId()) {
if(found.admin === Meteor.userId()) { // If user owns this class.
found.box = " owned";
found.mine = false;
}
if(classDisp.indexOf(courses[i]) !== -1) found.selected = true;
if(classDisp.indexOf(courses[i]) !== -1) found.selected = true; // Filter selected.
array.push(found);
var thisWork = work.find({class: courses[i]}).fetch();
if(classDisp.length !== 0 && classDisp.indexOf(found._id) === -1) {
if(classDisp.length !== 0 && classDisp.indexOf(found._id) === -1) { // Filter classes based on filter.
array[i].thisClassWork = [];
continue;
}
for(var j = 0; j < thisWork.length; j++) {
if(hide !== 0) {
for(var j = 0; j < thisWork.length; j++) { // For each work in class.
if(hide !== 0) { // Time to hide isn't never.
var due = (moment(thisWork[j].dueDate))["_d"];
var today = (moment().subtract(hide,'days'))["_d"];
if(today > due) {
var offset = (moment().subtract(hide,'days'))["_d"];
if(offset > due) { // If due is before hide days before today
thisWork[j] = "no";
j = 0;
}
}
if(thisWork[j] !== "no" && Meteor.user().profile.preferences.done) {
if(thisWork[j].done.indexOf(Meteor.userId()) !== -1) {
if(thisWork[j] !== "no" && Meteor.user().profile.preferences.done) { // If done filter is true
if(thisWork[j].done.indexOf(Meteor.userId()) !== -1) { // If user marked this work done.
thisWork[j] = "no";
j = 0;
}
}
}
while(thisWork.indexOf("no") !== -1) thisWork.splice(thisWork.indexOf("no"),1);
while(thisWork.indexOf("no") !== -1) thisWork.splice(thisWork.indexOf("no"),1); // Splice all filtered works.
for(var j = 0; j < thisWork.length; j++) {
thisWork[j].realDate = thisWork[j].dueDate;
thisWork[j].dueDate = moment(thisWork[j].dueDate).calendar(null, {
sameDay: '[Today]',
nextDay: '[Tomorrow]',
@ -128,14 +130,14 @@ Template.registerHelper('myClasses', () => {
sameElse: 'MMMM Do'
});
if(thisWork[j].dueDate === "Today") {
if(thisWork[j].dueDate === "Today") { // Font weight based on date proximity.
thisWork[j].cardDate = "600";
} else if(thisWork[j].dueDate === "Tomorrow") {
thisWork[j].cardDate = "400";
}
thisWork[j].typeColor = workColors[thisWork[j].type];
var hoverHighlight = Session.get("classDispHover");
var hoverHighlight = Session.get("classDispHover"); // Highlight/scale related class works on hover.
if(hoverHighlight !== null && hoverHighlight === found._id) {
thisWork[j].scale = "-ms-transform: scale(1.12)-webkit-transform: scale(1.12);transform: scale(1.12)";
} else {
@ -145,13 +147,13 @@ Template.registerHelper('myClasses', () => {
array[i].thisClassWork = thisWork;
}
Session.set("noclass",false);
Session.set("calendarclasses", Meteor.user().profile.classes);
Session.set("calendarClasses", array);
return array;
}
});
Template.registerHelper('pref', (val) => {
if(Object.keys(Meteor.user().profile.preferences).length !== Object.keys(defaults).length) {
Template.registerHelper('pref', (val) => { // Obtains all user preferences.
if(Object.keys(Meteor.user().profile.preferences).length !== Object.keys(defaults).length) { // Invalid preference checking.
var array = Meteor.user().profile;
array.preferences = defaults;
serverData = array;
@ -169,10 +171,10 @@ Template.registerHelper('pref', (val) => {
});
Template.main.helpers({
schoolName() { // Finds the name of the user's school
schoolName() { // Finds the name of the user's school.
return " - " + Meteor.user().profile.school;
},
iconColor(icon) { //Sets the color of the user's icon
iconColor(icon) { // Sidebar status color
if (Session.get("sidebar") === icon + "Container") {
return themeColors[Meteor.user().profile.preferences.theme].statusIcons;
} else if (Session.get("sidebar") === "both") {
@ -181,19 +183,19 @@ Template.main.helpers({
return;
}
},
defaultMode() { //Loads the defaults for a new/uncustomized user
defaultMode() { //Loads the default display mode for user.
if(load) {
Session.set("mode",Meteor.user().profile.preferences.mode);
load = false;
}
return;
},
bgSrc() { // Adjusts for different, larger screen sizes
bgSrc() { // Adjusts for different, larger screen sizes.
var dim = [window.innerWidth, window.innerHeight];
var pic = "Backgrounds/"+themeColors[Meteor.user().profile.preferences.theme].background;
return pic;
},
menuStatus() {
menuStatus() { // Status of of menu sidebar.
if (Session.get("sidebar") === "menuContainer") {
return "0%";
} else if (Session.get("sidebar") === "both") {
@ -202,7 +204,7 @@ Template.main.helpers({
return openValues.menu;
}
},
optionsStatus() {
optionsStatus() { // Status of options sidebar.
if (Session.get("sidebar") === "optionsContainer") {
return "0%";
} else if (Session.get("sidebar") === "both") {
@ -211,14 +213,14 @@ Template.main.helpers({
return openValues.options;
}
},
modeStatus(status) {
modeStatus(status) { // Color status of display modes.
if (status === Session.get("mode")) {
return themeColors[Meteor.user().profile.preferences.theme].highlightText;
} else {
return;
}
},
currMode(name) {
currMode(name) { // Status of display mode.
var mode = Session.get("mode");
if (name === mode) {
return true;
@ -226,7 +228,7 @@ Template.main.helpers({
return false;
}
},
calendarOptions() { // Sets up and modifies the calendar code
calendarOptions() { // Settings for the calendar, including work displaying.
return {
id: "fullcalendar",
height: window.innerHeight * 0.8,
@ -238,57 +240,42 @@ Template.main.helpers({
},
events: function(start, end, timezone, callback) {
var events = [];
var cursor = work.find({class: {$in: Session.get("calendarclasses")}});
var classDisp = Session.get("classDisp");
var hide = Meteor.user().profile.preferences.timeHide;
cursor.forEach(function(current) {
var disp = true;
if(classDisp.length !== 0 && classDisp.indexOf(current.class) === -1) disp = false;
var userClasses = Session.get("calendarClasses");
if(hide !== 0) {
var due = (moment(current.dueDate))["_d"];
var today = (moment().subtract(hide,'days'))["_d"];
if(today > due) {
disp = false;
}
}
if(Meteor.user().profile.preferences.done && current.done.indexOf(Meteor.userId()) !== -1) disp = false;
for(var i = 0; i < userClasses.length; i++) {
var works = userClasses[i].thisClassWork;
for(var j = 0; j < works.length; j++) {
var work = works[j];
var currClass = classes.findOne({_id: work.class})
var inRole = false;
var inRole = false;
var currClass = classes.findOne({_id: current.class})
if(Meteor.userId() === work.creator ||
Roles.userIsInRole(Meteor.userId(), ['superadmin', 'admin']) ||
currClass.moderators.indexOf(Meteor.userId()) !== -1 ||
currClass.banned.indexOf(Meteor.userId()) !== -1
) inRole = true;
if(Meteor.userId() === current.creator ||
Roles.userIsInRole(Meteor.userId(), ['superadmin', 'admin']) ||
currClass.moderators.indexOf(Meteor.userId()) !== -1 ||
currClass.banned.indexOf(Meteor.userId()) !== -1
) inRole = true;
backgroundColor = workColors[current.type];
title = current.name;
duedate = current.dueDate.toISOString().slice(0, 10);
if(disp) {
events.push({
id: current._id,
start: duedate,
title: title,
backgroundColor: backgroundColor,
id: work._id,
start: work.realDate.toISOString().slice(0, 10),
title: work.name,
backgroundColor: workColors[work.type],
borderColor: "#444",
startEditable: inRole,
className: "workevent "+current.class,
});
className: "workevent "+work.class,
})
}
});
}
callback(events);
},
eventDrop: function(event, delta, revertFunc) {
eventDrop: function(event, delta, revertFunc) { // When user drops from click-dragging.
var current = work.findOne({_id:event.id});
var date = event.start.format().split("-");
current.dueDate = new Date(date[0],parseInt(date[1])-1,date[2],11,59,59);
serverData = current;
sendData("editWork");
},
eventClick: function(event, jsEvent, view) {
eventClick: function(event, jsEvent, view) { // On-click for work.
Session.set("newWork",false);
var thisWork = work.findOne({_id:event.id})
Session.set("currentWork",thisWork);
@ -296,9 +283,9 @@ Template.main.helpers({
Session.set("currentReadableWork",thisReadWork);
openDivFade(document.getElementsByClassName("overlay")[0]);
},
dayClick: function(date, jsEvent, view) {
dayClick: function(date, jsEvent, view) { // On-click for each day.
if(jsEvent.target.className.includes("fc-past")) return;
Session.set("calCreWork",true);
calCreWork = true;
Session.set("calWorkDate",date.format());
Session.set("sidebar","menuContainer");
}
@ -316,8 +303,8 @@ Template.main.helpers({
var height = window.innerHeight * 0.76;
return "width:" + width.toString() + "px;height:" + height.toString() + "px;margin-left:" + (0.5 * window.innerWidth - 0.5 * width).toString() + "px;margin-top:" + (0.47 * window.innerHeight - 0.5 * height).toString() + "px";
},
calCreWork() {
if(Session.get("calCreWork")) {
calCreWork() { // Display instructions for creating a work.
if(calCreWork) {
var div = document.getElementById("calCreWork");
div.style.setProperty("display","inline-block","important");
div.style.setProperty("opacity","0","important");
@ -332,7 +319,7 @@ Template.main.helpers({
return;
}
},
highlight() { // Lets someone highlight a section of the calendar
highlight() { // Calendar highlight/scale option.
var hoverHighlight = Session.get("classDispHover");
var works = document.getElementsByClassName("workevent");
var work = $('.workevent');
@ -359,22 +346,22 @@ Template.main.helpers({
}
return;
},
workCenter() { // Dimensions the work center
workCenter() { // Centers work overlay.
var w = window.innerWidth * 0.3;
var h = window.innerHeight * 0.7;
return "width:"+w.toString()+"px;height:"+h.toString()+"px;margin-left:"+-0.5*w.toString()+"px;margin-top:"+-0.5*h.toString()+"px";
},
commentDim() {
commentDim() { // Dimensions of comment container.
var work = Session.get("currentWork");
if(Session.get("newWork") === null || work === null) return;
if(Session.get("newWork") || work.comments.length <= 3) return;
return 0.23*window.innerHeight.toString() + "px";
},
work(value) {
work(value) { // Returns the specified work value.
if(Session.get("currentWork") === null) return;
return Session.get("currentReadableWork")[value];
},
workType() {
workType() { // Returns color for respective work type.
if(Session.get("currentWork") === null) return;
if(Session.get("currentWork").type === undefined) return;
type = Session.get("currentWork").type;
@ -384,13 +371,13 @@ Template.main.helpers({
return workColors[type];
}
},
commentLength() {
commentLength() { // Returns characters left for comment length.
return Session.get("commentRestrict");
},
newWork() {
newWork() { // If user is creating a new work.
return Session.get("newWork");
},
inRole() {
inRole() { // Checks correct permissions.
if(Session.get("newWork")) {
return true;
} else {
@ -405,75 +392,31 @@ Template.main.helpers({
});
Template.main.events({
'click .fa-bars' () {
var side = Session.get("sidebar");
if (side === "menuContainer") {
Session.set("sidebar", null);
} else if (side === "optionsContainer") {
Session.set("sidebar", "both");
} else if (side === "both") {
Session.set("sidebar", "optionsContainer");
} else {
Session.set("sidebar", "menuContainer");
}
},
'click .fa-cog' () {
var side = Session.get("sidebar");
if (side === "optionsContainer") {
Session.set("sidebar", null);
} else if (side === "menuContainer") {
Session.set("sidebar", "both");
} else if (side === "both") {
Session.set("sidebar", "menuContainer");
} else {
Session.set("sidebar", "optionsContainer");
}
},
'click .classes' () {
if (Session.get("mode") === "classes") return;
var modeHolder = document.getElementById("mainBody");
closeDivFade(modeHolder);
setTimeout(function() {
Session.set("mode", "classes");
openDivFade(modeHolder);
}, 300);
Session.set("sidebar",null);
},
'click .calendar' () { // Applies on a click of the calendar. First checks if the mode is currently the calendar, and then sets it to that if it isn't.
if (Session.get("mode") === "calendar") return;
var modeHolder = document.getElementById("mainBody");
closeDivFade(modeHolder);
setTimeout(function() {
Session.set("mode", "calendar");
openDivFade(modeHolder);
}, 300);
Session.set("sidebar",null);
},
'click' (event) {
'click' (event) { // Closes respective divs when clicking outside of them. Order matters.
var e = event.target.className;
var sessval = Session.get("modifying");
var modifyingInput = Session.get("modifying");
if (event.target.id !== sessval &&
event.target.id !== sessval + "a" &&
if (event.target.id !== modifyingInput && // Input for dropdown closing.
event.target.id !== modifyingInput + "a" &&
!Session.equals("modifying", null) &&
!event.target.parentNode.className.includes("workOptions") &&
!event.target.parentNode.className.includes("prefOptions")) {
closeInput(sessval);
closeInput(modifyingInput);
}
if (e !== Session.get("sidebar") &&
if (e !== Session.get("sidebar") && // Sidebar closing.
!e.includes("fa-cog") &&
!e.includes("fa-bars") &&
!document.getElementById("menuContainer").contains(event.target) &&
!document.getElementById("optionsContainer").contains(event.target) &&
!(event.target.className.includes("fc-day") && !event.target.className.includes("fc-past"))) {
if(Session.get("calCreWork")) {
Session.set("calCreWork",false);
if(calCreWork) {
calCreWork = false;
}
Session.set("sidebar",null);
}
if(e === "overlay") {
if(e === "overlay") { // Overlay closing.
closeDivFade(document.getElementsByClassName("overlay")[0]);
if(!Session.get("newWork")) {
if(getHomeworkFormData() === null) return;
@ -486,10 +429,9 @@ Template.main.events({
Session.set("currentReadableWork",null);
$('.req').css("color","");
Session.set("commentRestrict",null);
}
if (!event.target.className.includes("radio") &&
if (!event.target.className.includes("radio") && // Dropdown closing.
!event.target.parentNode.className.includes("workOptions") &&
!event.target.parentNode.className.includes("prefOptions") &&
event.target.readOnly !== true) {
@ -505,14 +447,59 @@ Template.main.events({
}
}
},
'click .creWork' (event) {
// MAIN MENU BUTTONS
'click .fa-bars' () { // Click menu button.
var side = Session.get("sidebar");
if (side === "menuContainer") {
Session.set("sidebar", null);
} else if (side === "optionsContainer") {
Session.set("sidebar", "both");
} else if (side === "both") {
Session.set("sidebar", "optionsContainer");
} else {
Session.set("sidebar", "menuContainer");
}
},
'click .fa-cog' () { // Click settings button.
var side = Session.get("sidebar");
if (side === "optionsContainer") {
Session.set("sidebar", null);
} else if (side === "menuContainer") {
Session.set("sidebar", "both");
} else if (side === "both") {
Session.set("sidebar", "menuContainer");
} else {
Session.set("sidebar", "optionsContainer");
}
},
'click .classes' () { // Click classes mode button.
if (Session.get("mode") === "classes") return;
var modeHolder = document.getElementById("mainBody");
closeDivFade(modeHolder);
setTimeout(function() {
Session.set("mode", "classes");
openDivFade(modeHolder);
}, 300);
Session.set("sidebar",null); // Closes all sidebars.
},
'click .calendar' () { // Click calendar mode button.
if (Session.get("mode") === "calendar") return;
var modeHolder = document.getElementById("mainBody");
closeDivFade(modeHolder);
setTimeout(function() {
Session.set("mode", "calendar");
openDivFade(modeHolder);
}, 300);
Session.set("sidebar",null); // Closes all sidebars.
},
'click .creWork' (event) { // Cick add work button.
if(event.target.className !== "creWork") {
var attr = event.target.parentNode.getAttribute("classid");
} else {
var attr = event.target.getAttribute("classid");
}
Session.set("newWork", true);
Session.set("currentReadableWork",
Session.set("currentReadableWork", // Default readable work.
{
name:"Name | Click here to edit...",
class:attr,
@ -523,19 +510,42 @@ Template.main.events({
Session.set("currentWork",{class:attr});
openDivFade(document.getElementsByClassName("overlay")[0]);
},
'click .change' (event) {
'click .workCard' (event) { // Display work information on work card click.
var dom = event.target;
while(event.target.className !== "workCard") event.target = event.target.parentNode;
workid = event.target.getAttribute("workid");
Session.set("newWork",false);
var thisWork = work.findOne({_id:workid});
Session.set("currentWork",thisWork);
var thisReadWork = formReadable(thisWork);
Session.set("currentReadableWork",thisReadWork);
if(!Session.get("newWork") && !document.getElementById("optionsContainer").contains(event.target)) {
var currClass = classes.findOne({_id: Session.get("currentWork")["class"]});
if(!(Meteor.userId() === Session.get("currentWork").creator ||
if(!(Meteor.userId() === Session.get("currentWork").creator || // If user has permission.
Roles.userIsInRole(Meteor.userId(), ['superadmin', 'admin']) ||
currClass.moderators.indexOf(Meteor.userId()) !== -1 ||
currClass.banned.indexOf(Meteor.userId()) !== -1)) {
var inputs = $('#editWork .change').css("cursor","default");
};
}
openDivFade(document.getElementsByClassName("overlay")[0]);
},
// HANDLING INPUT CHANGING
'click .change' (event) { // Click changable inputs. Creates an input where the span is.
if(!Session.get("newWork") && !document.getElementById("optionsContainer").contains(event.target)) {
var currClass = classes.findOne({_id: Session.get("currentWork")["class"]});
if(!(Meteor.userId() === Session.get("currentWork").creator || // If user has permission.
Roles.userIsInRole(Meteor.userId(), ['superadmin', 'admin']) ||
currClass.moderators.indexOf(Meteor.userId()) !== -1 ||
currClass.banned.indexOf(Meteor.userId()) !== -1
)) return;
}
// CSS and DOM manipulation.
var ele = event.target;
var sessval = Session.get("modifying");
if (ele.id !== sessval && sessval !== null) closeInput(sessval);
var modifyingInput = Session.get("modifying");
if (ele.id !== modifyingInput && modifyingInput !== null) closeInput(modifyingInput);
Session.set("modifying", ele.id);
var dim = ele.getBoundingClientRect();
@ -585,7 +595,7 @@ Template.main.events({
ele.parentNode.appendChild(span);
}
},
'click .radio' (event) {
'click .radio' (event) { // Click dropdown input. Opens the dropdown menu.
if(!Session.get("newWork") && !document.getElementById("optionsContainer").contains(event.target)) {
var currClass = classes.findOne({_id: Session.get("currentWork")["class"]});
if(!(Meteor.userId() === Session.get("currentWork").creator ||
@ -602,7 +612,7 @@ Template.main.events({
var radio = "workOptions";
}
try {
for (var i = 0; i < document.getElementsByClassName(radio).length; i++) {
for (var i = 0; i < document.getElementsByClassName(radio).length; i++) { // Close any previously open menus.
var curr = document.getElementsByClassName(radio)[i];
if(curr.childNodes[1] !== op.parentNode.parentNode.childNodes[3].childNodes[1]) {
closeDivFade(document.getElementsByClassName(radio)[i]);
@ -611,58 +621,49 @@ Template.main.events({
} catch (err) {}
openDivFade(op.parentNode.parentNode.childNodes[3]);
},
'click .workOptionText' (event) {
var sessval = Session.get("modifying");
'click .workOptionText' (event) { // Click each work setting
var modifyingInput = Session.get("modifying");
var p = event.target;
var input = p.parentNode.parentNode.childNodes[1].childNodes[5];
input.value = p.childNodes[0].nodeValue;
try {
closeInput(sessval);
closeInput(modifyingInput);
} catch (err) {}
closeDivFade(p.parentNode);
input.focus();
},
'click .prefOptionText' (event) {
var sessval = Session.get("modifying");
'click .prefOptionText' (event) { // Click each preferences setting.
var modifyingInput = Session.get("modifying");
var p = event.target;
var input = p.parentNode.parentNode.childNodes[1].childNodes[5];
input.value = p.childNodes[0].nodeValue;
try {
closeInput(sessval);
closeInput(modifyingInput);
} catch (err) {}
closeDivFade(p.parentNode);
input.focus();
},
'keydown' (event) {
var sessval = Session.get("modifying");
if (event.keyCode == 13 && sessval != "workDesc") {
'keydown' (event) { // Enter to close input.
var modifyingInput = Session.get("modifying");
if (event.keyCode == 13 && modifyingInput != "workDesc") {
try {
closeInput(sessval);
closeInput(modifyingInput);
} catch (err) {}
}
if (sessval !== null && event.keyCode !== 13) {
var restrict = document.getElementById(sessval).getAttribute("restrict");
if (restrict !== null) {
var num = parseInt(restrict) - event.target.value.length;
var restext = document.getElementById("restrict");
if (num === 1) {
restext.childNodes[0].nodeValue = num.toString() + " character left";
restext.style.setProperty("color", "#999", "important");
} else if (num <= 0) {
var input = document.getElementById(sessval + "a");
input.value = input.value.substring(0, parseInt(restrict));
restext.childNodes[0].nodeValue = "0 characters left";
restext.style.setProperty("color", "#FF1A1A", "important");
} else {
restext.childNodes[0].nodeValue = num.toString() + " characters left";
restext.style.setProperty("color", "#999", "important");
}
}
}
},
'click #commentSubmit' (event) {
'focus #workDatea' () { // Open date picker.
$('#workDatea').datepicker({
format: 'DD, MM d, yyyy',
startDate: 'd',
todayHighlight: true,
todayBtn: true,
autoclose: true
});
},
// WORK OVERLAY BUTTONS
'click #commentSubmit' (event) { // Click to submit a comment.
workId = Session.get("currentWork")._id;
var input = document.getElementById('workComment');
comment = input.value;
@ -676,10 +677,9 @@ Template.main.events({
Session.set("currentReadableWork",thisReadWork);
});
}
},
'click #workSubmit' () { // Apples on the work submit button. If the current value, then terminate. Otherwise, create a new work or edit the current piece of work
if(getHomeworkFormData() === null) return;
'click #workSubmit' () { // Click submit work to create a work.
if(getHomeworkFormData() === null) return; // Makes sure to check valid homework.
serverData = Session.get("currentWork");
if(Session.get("newWork")) {
sendData("createWork");
@ -689,48 +689,40 @@ Template.main.events({
Session.set("newWork",null);
closeDivFade(document.getElementsByClassName("overlay")[0]);
},
'focus .op' (event) {
event.target.click();
},
'click .workCard' (event) {
var dom = event.target;
while(event.target.className !== "workCard") event.target = event.target.parentNode;
workid = event.target.getAttribute("workid");
Session.set("newWork",false);
var thisWork = work.findOne({_id:workid});
Session.set("currentWork",thisWork);
var thisReadWork = formReadable(thisWork);
Session.set("currentReadableWork",thisReadWork);
if(!Session.get("newWork") && !document.getElementById("optionsContainer").contains(event.target)) {
var currClass = classes.findOne({_id: Session.get("currentWork")["class"]});
if(!(Meteor.userId() === Session.get("currentWork").creator ||
Roles.userIsInRole(Meteor.userId(), ['superadmin', 'admin']) ||
currClass.moderators.indexOf(Meteor.userId()) !== -1 ||
currClass.banned.indexOf(Meteor.userId()) !== -1)) {
var inputs = $('#editWork .change').css("cursor","default");
};
'keydown #workComment' (event) { // Restrict length on comment.
var chars = event.target.value.length;
document.getElementById("commentRestrict").style.color = "#7E7E7E";
if(chars === 0) { // Don't display if nothing in comment.
Session.set("commentRestrict","");
return;
}
if(chars === 200) {
document.getElementById("commentRestrict").style.color = "#FF1A1A"; // Make text red if 0 characters left.
}
Session.set("commentRestrict", "Characters left: " + (200-chars).toString());
openDivFade(document.getElementsByClassName("overlay")[0]);
},
'focus #workDatea' () {
$('#workDatea').datepicker({
format: 'DD, MM d, yyyy',
startDate: 'd',
todayHighlight: true,
todayBtn: true,
autoclose: true
});
'click #markDone' () { // Click done button.
serverData = [Session.get("currentWork")._id, "done"]
sendData("toggleWork");
},
'click .sideClass' (event) {
'click #markConfirm' () { // Click confirm button.
serverData = [Session.get("currentWork")._id, "confirmations"]
sendData("toggleWork");
},
'click #markReport' () { // Click report button.
serverData = [Session.get("currentWork")._id, "reports"]
sendData("toggleWork");
},
// CLASS FILTERS
'click .sideClass' (event) { // Click class list in sidebar.
var div = event.target;
while(div.getAttribute("classid") === null) div = div.parentNode;
var classid = div.getAttribute("classid");
if(Session.get("calCreWork")) {
Session.set("calCreWork",null);
if(calCreWork) { // If creating work from calendar.
calCreWork = null;
Session.set("sidebar",null);
var date = Session.get("calWorkDate").split("-");
@ -746,7 +738,7 @@ Template.main.events({
});
Session.set("currentWork",{class:classid,dueDate:date});
openDivFade(document.getElementsByClassName("overlay")[0]);
} else {
} else { // Normal clicking turns on filter.
var array = Session.get("classDisp");
if(array.indexOf(classid) !== -1) {
array.splice(array.indexOf(classid),1);
@ -754,10 +746,10 @@ Template.main.events({
array.push(classid);
}
Session.set("classDisp",array);
$("#fullcalendar").fullCalendar( 'refetchEvents' );
$("#fullcalendar").fullCalendar( 'refetchEvents' ); // Update calendar events.
}
},
'mouseover .sideClass' (event) {
'mouseover .sideClass' (event) { // Highlight/scale filter on-hover.
if(event.target.className !== "sideClass") {
var div = event.target.parentNode;
} else {
@ -767,32 +759,12 @@ Template.main.events({
var classid = div.getAttribute("classid");
Session.set("classDispHover",classid);
},
'mouseleave .sideClass' (event) {
'mouseleave .sideClass' (event) { // Turn off highlight/scale filter on-leave.
if(event.target.className !== "sideClass") {
var div = event.target.parentNode;
if(div.contains(event.target)) return;
}
Session.set("classDispHover",null);
},
'keydown #workComment' (event) {
var chars = event.target.value.length;
document.getElementById("commentRestrict").style.color = "#CCC";
if(chars === 200) {
document.getElementById("commentRestrict").style.color = "#FF1A1A";
}
Session.set("commentRestrict", "Characters left: " + (200-chars).toString());
},
'click #markDone' () {
serverData = [Session.get("currentWork")._id, "done"]
sendData("toggleWork");
},
'click #markConfirm' () {
serverData = [Session.get("currentWork")._id, "confirmations"]
sendData("toggleWork");
},
'click #markReport' () {
serverData = [Session.get("currentWork")._id, "reports"]
sendData("toggleWork");
}
});
@ -811,7 +783,7 @@ function closeDivFade(div) {
}, 100);
}
function sendData(funcName) {
function sendData(funcName) { // Call Meteor function, and do actions after function is completed depending on function.
Meteor.call(funcName, serverData , function(err,result) {
if((funcName === "editWork" || funcName === "createWork") && Session.get("mode") === "calendar") {
$("#fullcalendar").fullCalendar( 'refetchEvents' );
@ -827,9 +799,9 @@ function sendData(funcName) {
});
}
function closeInput(sessval) {
var input = document.getElementById(sessval + "a");
var span = document.getElementById(sessval);
function closeInput(modifyingInput) { // Close a changeable input and change it back to span.
var input = document.getElementById(modifyingInput + "a");
var span = document.getElementById(modifyingInput);
if(Session.equals("sidebar","optionsContainer") || Session.equals("sidebar","both")) {
var color = "#000";
} else {
@ -841,7 +813,7 @@ function closeInput(sessval) {
var restrict = document.getElementById("restrict");
restrict.parentNode.removeChild(restrict);
} catch (err) {}
if (input.value === "") {
if (input.value === "") { // If input has nothing.
span.childNodes[0].nodeValue = "Click here to edit...";
} else {
span.childNodes[0].nodeValue = input.value;
@ -849,7 +821,7 @@ function closeInput(sessval) {
span.style.display = "initial";
Session.set("modifying", null);
if(Session.equals("sidebar","optionsContainer") || Session.equals("sidebar","both")) {
if(Session.equals("sidebar","optionsContainer") || Session.equals("sidebar","both")) { // Close depending on work or preferences.
serverData = getPreferencesData();
sendData("editProfile");
} else if(!Session.get("newWork")) {
@ -859,7 +831,7 @@ function closeInput(sessval) {
}
}
function getHomeworkFormData() {
function getHomeworkFormData() { // Get all data relating to work creation.
var inputs = document.getElementsByClassName("req");
var stop;
for(var i = 0; i < inputs.length; i++) {
@ -883,7 +855,7 @@ function getHomeworkFormData() {
Session.set("currentReadableWork", readableData);
}
function getPreferencesData() {
function getPreferencesData() { // Get all data relating to preferences.
var profile = Meteor.user().profile;
var options = {
"theme":document.getElementById("prefTheme").childNodes[0].nodeValue.toLowerCase(),
@ -898,11 +870,11 @@ function getPreferencesData() {
var days = ["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"];
var months = ["January","February","March","April","May","June","July","August","September","October","November","December"];
function getReadableDate(date) {
function getReadableDate(date) { // Get readable date from Date constructor.
return days[date.getDay()]+", "+months[date.getMonth()]+" "+date.getDate()+", "+date.getFullYear();
}
function toDate(date) { //Formats the date into the format needed for niceness
function toDate(date) { // Turns formatted date back to Date constructor.
date = date.substring(date.search(",")+2,date.length);
month = months.indexOf(date.substring(0,date.search(" ")));
day = date.substring(date.search(" ")+1,date.search(","));
@ -910,12 +882,12 @@ function toDate(date) { //Formats the date into the format needed for niceness
return new Date(year,month,day,11,59,59);
}
function formReadable(input) {
function formReadable(input) { // Makes work information readable by users.
input.dueDate = getReadableDate(input.dueDate);
input.type = input.type[0].toUpperCase() + input.type.slice(1);
if(!Session.get("newWork")) {
if(input.done.indexOf(Meteor.userId()) !== -1) {
if(input.done.indexOf(Meteor.userId()) !== -1) { // If user marked as done.
input.doneCol = "#27A127";
input.doneText = "Done!";
} else {
@ -923,17 +895,17 @@ function formReadable(input) {
input.doneText = "Mark done";
}
for(var i = 0; i < input.done.length; i++) {
for(var i = 0; i < input.done.length; i++) { // Display users who marked as done.
input.done[i] = {"user":Meteor.users.findOne({_id:input.done[i]}).profile.name};
}
if(input.confirmations.indexOf(Meteor.userId()) !== -1) {
if(input.confirmations.indexOf(Meteor.userId()) !== -1) { // If user confirmed.
input.userConfirm = "#27A127";
} else {
input.userConfirm = "";
}
if(input.reports.indexOf(Meteor.userId()) !== -1) {
if(input.reports.indexOf(Meteor.userId()) !== -1) { // If user reported.
input.userReport = "#FF1A1A";
} else {
input.userReport = "";
@ -944,7 +916,7 @@ function formReadable(input) {
var comments = input.comments;
var resort = [];
if(!Session.get("newWork")) {
if(!Session.get("newWork")) { // Don't display comments if user is creating work.
for(var k = 0; k < comments.length; k++) {
var re = comments.length-k-1;
resort[re] = {"comment":comments[k].comment,"date":null,"user":null};