Merge commit

This commit is contained in:
Kenneth Jao 2016-10-09 23:00:40 -04:00
commit dc69f67f85
8 changed files with 149 additions and 119 deletions

View File

@ -6,22 +6,22 @@
meteor-base@1.0.4 # Packages every Meteor app needs to have meteor-base@1.0.4 # Packages every Meteor app needs to have
mobile-experience@1.0.4 # Packages for a great mobile UX mobile-experience@1.0.4 # Packages for a great mobile UX
mongo@1.1.12 # The database Meteor supports right now mongo@1.1.12_1 # The database Meteor supports right now
blaze-html-templates@1.0.4 # Compile .html files into Meteor Blaze views blaze-html-templates@1.0.4 # Compile .html files into Meteor Blaze views
reactive-var@1.0.10 # Reactive variable for tracker reactive-var@1.0.10 # Reactive variable for tracker
jquery # Helpful client-side library jquery@1.11.9 # Helpful client-side library
tracker@1.1.0 # Meteor's client-side reactive programming library tracker@1.1.0 # Meteor's client-side reactive programming library
standard-minifier-css@1.2.0 # CSS minifier run for production mode standard-minifier-css@1.2.0_1 # CSS minifier run for production mode
standard-minifier-js@1.2.0 # JS minifier run for production mode standard-minifier-js@1.2.0_1 # JS minifier run for production mode
es5-shim@4.6.14 # ECMAScript 5 compatibility for older browsers. es5-shim@4.6.14_1 # ECMAScript 5 compatibility for older browsers.
ecmascript@0.5.8 # Enable ECMAScript2015+ syntax in app code ecmascript@0.5.8_1 # Enable ECMAScript2015+ syntax in app code
fortawesome:fontawesome fortawesome:fontawesome
session@1.1.6 session@1.1.6
proyk:meteor-cookies proyk:meteor-cookies
aldeed:simple-schema aldeed:simple-schema
accounts-google accounts-google@1.0.10
accounts-ui@1.1.9 accounts-ui@1.1.9
iron:router iron:router
ongoworks:security ongoworks:security
@ -31,9 +31,8 @@ rzymek:fullcalendar
momentjs:moment momentjs:moment
eternicode:bootstrap-datepicker eternicode:bootstrap-datepicker
shell-server@0.2.1 shell-server@0.2.1
http@1.2.9 http@1.2.9_1
underscore underscore@1.0.9
houston:admin
ahref:dragula ahref:dragula
harrison:papa-parse harrison:papa-parse
pfafman:filesaver pfafman:filesaver
@ -41,3 +40,7 @@ flemay:less-autoprefixer
natestrauser:select2 natestrauser:select2
juliancwirko:s-alert juliancwirko:s-alert
juliancwirko:s-alert-stackslide juliancwirko:s-alert-stackslide
aldeed:collection2
dburles:collection-helpers
twbs:bootstrap
yogiben:admin

View File

@ -1 +1 @@
METEOR@1.4.1.1 METEOR@1.4.1.2

View File

@ -1,16 +1,19 @@
accounts-base@1.2.11 accounts-base@1.2.11
accounts-google@1.0.10 accounts-google@1.0.10
accounts-oauth@1.1.13 accounts-oauth@1.1.13
accounts-password@1.3.0
accounts-ui@1.1.9 accounts-ui@1.1.9
accounts-ui-unstyled@1.1.12 accounts-ui-unstyled@1.1.12
ahref:dragula@3.5.4 ahref:dragula@3.5.4
alanning:roles@1.2.15 alanning:roles@1.2.15
aldeed:autoform@5.5.1
aldeed:collection2@2.5.0
aldeed:simple-schema@1.5.3 aldeed:simple-schema@1.5.3
aldeed:tabular@1.4.2
aldeed:template-extension@4.0.0
allow-deny@1.0.5 allow-deny@1.0.5
autoupdate@1.3.11 autoupdate@1.3.11
babel-compiler@6.9.1 babel-compiler@6.9.1_1
babel-runtime@0.1.11 babel-runtime@0.1.11_1
base64@1.0.9 base64@1.0.9
binary-heap@1.0.9 binary-heap@1.0.9
blaze@2.1.9 blaze@2.1.9
@ -24,7 +27,7 @@ check@1.2.3
coffeescript@1.2.4_1 coffeescript@1.2.4_1
cosmos:browserify@0.9.4 cosmos:browserify@0.9.4
dandv:caret-position@2.1.1 dandv:caret-position@2.1.1
dburles:mongo-collection-instances@0.3.5 dburles:collection-helpers@1.0.4
ddp@1.2.5 ddp@1.2.5
ddp-client@1.3.1 ddp-client@1.3.1
ddp-common@1.2.6 ddp-common@1.2.6
@ -32,11 +35,11 @@ ddp-rate-limiter@1.0.5
ddp-server@1.3.10 ddp-server@1.3.10
deps@1.0.12 deps@1.0.12
diff-sequence@1.0.6 diff-sequence@1.0.6
ecmascript@0.5.8 ecmascript@0.5.8_1
ecmascript-runtime@0.3.14 ecmascript-runtime@0.3.14_1
ejson@1.0.12 ejson@1.0.12
email@1.1.17 email@1.0.16
es5-shim@4.6.14 es5-shim@4.6.14_1
eternicode:bootstrap-datepicker@1.6.0_3 eternicode:bootstrap-datepicker@1.6.0_3
fastclick@1.0.12 fastclick@1.0.12
flemay:less-autoprefixer@1.2.0 flemay:less-autoprefixer@1.2.0
@ -45,10 +48,9 @@ geojson-utils@1.0.9
google@1.1.14 google@1.1.14
harrison:papa-parse@1.1.1 harrison:papa-parse@1.1.1
hot-code-push@1.0.4 hot-code-push@1.0.4
houston:admin@2.0.7
html-tools@1.0.11 html-tools@1.0.11
htmljs@1.0.11 htmljs@1.0.11
http@1.2.9 http@1.2.9_1
id-map@1.0.8 id-map@1.0.8
iron:controller@1.0.12 iron:controller@1.0.12
iron:core@1.0.11 iron:core@1.0.11
@ -61,28 +63,29 @@ iron:url@1.0.11
jquery@1.11.9 jquery@1.11.9
juliancwirko:s-alert@3.2.0 juliancwirko:s-alert@3.2.0
juliancwirko:s-alert-stackslide@3.1.3 juliancwirko:s-alert-stackslide@3.1.3
lai:collection-extensions@0.2.1_1
launch-screen@1.0.12 launch-screen@1.0.12
less@2.7.5 less@2.7.5
livedata@1.0.18 livedata@1.0.18
localstorage@1.0.11 localstorage@1.0.11
logging@1.1.15 logging@1.1.15_1
mdg:validation-error@0.5.1 mdg:validation-error@0.5.1
meteor@1.2.17 meteor@1.2.17_1
meteor-base@1.0.4 meteor-base@1.0.4
meteorhacks:meteorx@1.4.1
meteorhacks:unblock@1.1.0
mfactory:admin-lte@0.0.2
minifier-css@1.2.14 minifier-css@1.2.14
minifier-js@1.2.14 minifier-js@1.2.14_1
minimongo@1.0.17 minimongo@1.0.17
mizzao:autocomplete@0.5.1 mizzao:autocomplete@0.5.1
mobile-experience@1.0.4 mobile-experience@1.0.4
mobile-status-bar@1.0.12 mobile-status-bar@1.0.12
modules@0.7.6 modules@0.7.6_1
modules-runtime@0.7.6 modules-runtime@0.7.6_1
momentjs:moment@2.15.1 momentjs:moment@2.15.1
mongo@1.1.12 mongo@1.1.12_1
mongo-id@1.0.5 mongo-id@1.0.5
natestrauser:select2@4.0.3 natestrauser:select2@4.0.3
npm-bcrypt@0.9.1
npm-mongo@1.5.49 npm-mongo@1.5.49
oauth@1.1.11 oauth@1.1.11
oauth2@1.1.10 oauth2@1.1.10
@ -92,31 +95,33 @@ ordered-dict@1.0.8
pfafman:filesaver@1.3.2 pfafman:filesaver@1.3.2
promise@0.8.7 promise@0.8.7
proyk:meteor-cookies@0.0.1 proyk:meteor-cookies@0.0.1
raix:handlebar-helpers@0.2.5
random@1.0.10 random@1.0.10
rate-limit@1.0.5 rate-limit@1.0.5
reactive-dict@1.1.8 reactive-dict@1.1.8
reactive-var@1.0.10 reactive-var@1.0.10
reload@1.1.10 reload@1.1.10
retry@1.0.8 retry@1.0.8
reywood:publish-composite@1.4.2
routepolicy@1.0.11 routepolicy@1.0.11
rzymek:fullcalendar@2.7.2 rzymek:fullcalendar@2.7.2
service-configuration@1.0.10 service-configuration@1.0.10
session@1.1.6 session@1.1.6
sha@1.0.8
shell-server@0.2.1 shell-server@0.2.1
spacebars@1.0.13 spacebars@1.0.13
spacebars-compiler@1.0.13 spacebars-compiler@1.0.13
srp@1.0.9
standard-minifier-css@1.2.1 standard-minifier-css@1.2.1
standard-minifier-js@1.2.0 standard-minifier-js@1.2.0_1
templating@1.2.15 templating@1.2.15
templating-compiler@1.2.15 templating-compiler@1.2.15
templating-runtime@1.2.15 templating-runtime@1.2.15
templating-tools@1.0.5 templating-tools@1.0.5
tmeasday:paginated-subscription@0.2.4
tracker@1.1.0 tracker@1.1.0
twbs:bootstrap@3.3.6
ui@1.0.12 ui@1.0.12
underscore@1.0.9 underscore@1.0.9
url@1.0.10 url@1.0.10
webapp@1.3.11 webapp@1.3.11_1
webapp-hashing@1.0.9 webapp-hashing@1.0.9
yogiben:admin@1.2.8
zimme:active-route@2.3.2

View File

@ -13,6 +13,8 @@ Calendar mode organizes work by due date rather than by class. Pressing on a dat
Class mode allows you to organize work by the class it belongs to. Class mode allows you to organize work by the class it belongs to.
##### Work ##### Work
Every piece of work has a confirmed:reported ratio. This is the ratio of the number of people who confirm the presence of the work to the number of people who believe that this is a false report. The creator of a work can edit fields after creation by clicking on details needed to be changed. Lastly, by marking a work as done, it is hidden from view. To disable this, go to preferences. Every piece of work has a confirmed:reported ratio. This is the ratio of the number of people who confirm the presence of the work to the number of people who believe that this is a false report. The creator of a work can edit fields after creation by clicking on details needed to be changed. Lastly, by marking a work as done, it is hidden from view. To disable this, go to preferences.
##### Filters
In the left sidebar, you find options for filtering. These include filtering by class or type of assignment.
### Profile Page ### Profile Page
On this page, it is possible to edit profile details as well as create, join, and leave classes. On this page, it is possible to edit profile details as well as create, join, and leave classes.
#### Creating a class #### Creating a class

View File

@ -4,6 +4,7 @@ import {
} from 'meteor/templating'; } from 'meteor/templating';
import './main.html'; import './main.html';
import './main.css';
var load = true; var load = true;
var calWorkOpen = null; var calWorkOpen = null;
@ -34,10 +35,10 @@ var defaultWork = {
}; };
// Reactive variables. // Reactive variables.
Session.set("user",{}); // Stores user preferences. Session.set("user", {}); // Stores user preferences.
Session.set("calendarClasses", []); // Stores calendar classes. Session.set("calendarClasses", []); // Stores calendar classes.
Session.set("sidebar", null); // Status of sidebar. Session.set("sidebar", null); // Status of sidebar.
Session.set("requests",false); // Status of requests. Session.set("requests", false); // Status of requests.
Session.set("newWork", null); // If user creating new work. Session.set("newWork", null); // If user creating new work.
Session.set("currentWorkId",null); // Stores current work Id. Session.set("currentWorkId",null); // Stores current work Id.
Session.set("currentWork",null); Session.set("currentWork",null);
@ -47,7 +48,7 @@ Session.set("noclass", null); // If user does not have classes.
Session.set("calCreWork", null); // If user is creating a work from calendar. Session.set("calCreWork", null); // If user is creating a work from calendar.
Session.set("classDisp", []); // Stores current filter for classes. Session.set("classDisp", []); // Stores current filter for classes.
Session.set("typeFilter", []); // Stores type filters for classes. Session.set("typeFilter", []); // Stores type filters for classes.
Session.set("typeFilterHover",null); // Stores current hovered type filter. Session.set("typeFilterHover", null); // Stores current hovered type filter.
Session.set("classDispHover", null); // Stores current hovered class filter. Session.set("classDispHover", null); // Stores current hovered class filter.
Session.set("refetchEvents", null); // Stores whether to get calendar events again. Session.set("refetchEvents", null); // Stores whether to get calendar events again.
Session.set("commentRestrict", ""); // Stores text for comment character restriction. Session.set("commentRestrict", ""); // Stores text for comment character restriction.
@ -67,14 +68,14 @@ Template.profile.rendered = function() {
}; };
Template.registerHelper('userProfile', () => { Template.registerHelper('userProfile', () => {
if(Meteor.user() === undefined || Meteor.user() === null) return; if (Meteor.user() === undefined || Meteor.user() === null) return;
Session.set("user", Meteor.user().profile); Session.set("user", Meteor.user().profile);
return; return;
}); });
Template.registerHelper('screen', (multiplier, fraction) => { Template.registerHelper('screen', (multiplier, fraction) => {
if(typeof multiplier !== "string") return screen.width.toString() + "px"; if (typeof multiplier !== "string") return screen.width.toString() + "px";
if(typeof fraction !== "string") return (screen.width * parseFloat(multiplier)).toString() + "px"; if (typeof fraction !== "string") return (screen.width * parseFloat(multiplier)).toString() + "px";
return ((screen.width) * parseFloat(multiplier) / parseFloat(fraction)).toString() + "px"; return ((screen.width) * parseFloat(multiplier) / parseFloat(fraction)).toString() + "px";
}); });
@ -97,8 +98,8 @@ Template.registerHelper('overlayDim', (part) => { // Gets size of the overlay co
}); });
Template.registerHelper('myClasses', () => { // Gets all classes and respective works. Template.registerHelper('myClasses', () => { // Gets all classes and respective works.
if(Session.get("user").classes.length === 0) { // Null checking. if (Session.get("user").classes.length === 0) { // Null checking.
Session.set("noclass",true); // Makes sure to display nothing. Session.set("noclass", true); // Makes sure to display nothing.
return []; return [];
} else { } else {
var array = []; var array = [];
@ -159,7 +160,7 @@ Template.registerHelper('myClasses', () => { // Gets all classes and respective
thisWork[j] = "no"; thisWork[j] = "no";
} }
if(thisWork[j] !== "no" && Session.get("user").preferences.hideReport && (thisWork[j].confirmations.length/thisWork[j].reports.length) <= 0.9) { if (thisWork[j] !== "no" && Session.get("user").preferences.hideReport && (thisWork[j].confirmations.length / thisWork[j].reports.length) <= 0.9) {
thisWork[j] = "no"; thisWork[j] = "no";
} }
@ -188,13 +189,15 @@ Template.registerHelper('myClasses', () => { // Gets all classes and respective
thisWork[j].confirmationLength = thisWork[j].confirmations.length; // Counts the number of confirmations and reports for a particular work. thisWork[j].confirmationLength = thisWork[j].confirmations.length; // Counts the number of confirmations and reports for a particular work.
thisWork[j].reportLength = thisWork[j].reports.length; thisWork[j].reportLength = thisWork[j].reports.length;
thisWork[j].creator = Meteor.users.findOne({_id: thisWork[j].creator}).profile.name; thisWork[j].creator = Meteor.users.findOne({
_id: thisWork[j].creator
}).profile.name;
var conf = thisWork[j].confirmations.length; var conf = thisWork[j].confirmations.length;
var repo = thisWork[j].reports.length; var repo = thisWork[j].reports.length;
var ratio = conf / repo; var ratio = conf / repo;
var normalColor = Session.get("user").preferences.theme["text"]; var normalColor = Session.get("user").preferences.theme["text"];
if (Math.abs(conf - repo)) { if (Math.abs(conf - repo)) {
if ((conf+repo) <= 1) { if ((conf + repo) <= 1) {
thisWork[j].doneRatio = normalColor; thisWork[j].doneRatio = normalColor;
} else { } else {
thisWork[j].doneRatio = "#F9F906"; thisWork[j].doneRatio = "#F9F906";
@ -228,21 +231,19 @@ Template.registerHelper('commentLength', () => { // Returns characters left for
}); });
function startDragula() { function startDragula() {
dragula([document.querySelector('#classesMode'), document.querySelector('#nonexistant')], dragula([document.querySelector('#classesMode'), document.querySelector('#nonexistant')], {
{ moves: function(el, container, handle) {
moves: function(el, container, handle) { // return handle.classList.contains("classInfo") || handle.classList.contains("mainClassName");
// return handle.classList.contains("classInfo") || handle.classList.contains("mainClassName"); return _.intersection(["classInfo", "mainClassName", "mainClassHour", "mainClassTeacher"], handle.classList).length > 0;
return _.intersection(["classInfo", "mainClassName", "mainClassHour", "mainClassTeacher"], handle.classList).length > 0; }
} })
})
.on('out', function(el) { .on('out', function(el) {
var els = document.getElementsByClassName("classWrapper"); var els = document.getElementsByClassName("classWrapper");
var final = []; var final = [];
for(var i = 0; i < els.length; i++) { for (var i = 0; i < els.length; i++) {
var classid = els[i].getElementsByClassName("creWork")[0].getAttribute("classid"); var classid = els[i].getElementsByClassName("creWork")[0].getAttribute("classid");
final.push(classid); final.push(classid);
} }
Meteor.call("reorderClasses", final);
}); });
} }
@ -250,7 +251,7 @@ Template.main.helpers({
themeName() { themeName() {
var vals = _.values(themeColors); var vals = _.values(themeColors);
var curtheme = Session.get("user").preferences.theme; var curtheme = Session.get("user").preferences.theme;
for(var i = 0; i < vals.length; i++) { for (var i = 0; i < vals.length; i++) {
if (_.isEqual(vals[i], curtheme)) { if (_.isEqual(vals[i], curtheme)) {
var name = _.keys(themeColors)[i]; var name = _.keys(themeColors)[i];
return name.charAt(0).toUpperCase() + name.slice(1); return name.charAt(0).toUpperCase() + name.slice(1);
@ -259,13 +260,13 @@ Template.main.helpers({
return "Custom"; return "Custom";
}, },
schoolName() { // Finds the name of the user's school. schoolName() { // Finds the name of the user's school.
if(Session.get("user").school === undefined || Session.get("user").school === null) return; if (Session.get("user").school === undefined || Session.get("user").school === null) return;
return " - " + Session.get("user").school; return " - " + Session.get("user").school;
}, },
iconColor(icon) { // Sidebar status color iconColor(icon) { // Sidebar status color
if (Session.equals("sidebar",icon + "Container")) { if (Session.equals("sidebar", icon + "Container")) {
return Session.get("user").preferences.theme.statusIcons; return Session.get("user").preferences.theme.statusIcons;
} else if (Session.equals("sidebar","both")) { } else if (Session.equals("sidebar", "both")) {
return Session.get("user").preferences.theme.statusIcons; return Session.get("user").preferences.theme.statusIcons;
} else { } else {
return; return;
@ -278,12 +279,12 @@ Template.main.helpers({
return Session.get("user").name; return Session.get("user").name;
}, },
defaultMode() { //Loads the default display mode for user. defaultMode() { //Loads the default display mode for user.
if(load) Session.set("mode",Session.get("user").preferences.mode); if (load) Session.set("mode", Session.get("user").preferences.mode);
load = false; load = false;
return; return;
}, },
bgSrc() { // Returns background. bgSrc() { // Returns background.
return "Backgrounds/"+ Session.get("user").preferences.theme.background; return "Backgrounds/" + Session.get("user").preferences.theme.background;
}, },
menuStatus() { // Status of of menu sidebar. menuStatus() { // Status of of menu sidebar.
if (Session.equals("sidebar", "menuContainer")) { if (Session.equals("sidebar", "menuContainer")) {
@ -308,11 +309,11 @@ Template.main.helpers({
return openValues.requests; return openValues.requests;
}, },
modeStatus(status) { // Color status of display modes. modeStatus(status) { // Color status of display modes.
if (!Session.equals("mode",status)) return; if (!Session.equals("mode", status)) return;
return Session.get("user").preferences.theme.modeHighlight; return Session.get("user").preferences.theme.modeHighlight;
}, },
currMode(name) { // Status of display mode. currMode(name) { // Status of display mode.
return Session.equals("mode",name); return Session.equals("mode", name);
}, },
calendarOptions() { // Settings for the calendar, including work displaying. calendarOptions() { // Settings for the calendar, including work displaying.
return { return {
@ -371,10 +372,10 @@ Template.main.helpers({
Session.set("currentWorkId", event.id); Session.set("currentWorkId", event.id);
openDivFade(document.getElementsByClassName("overlay")[0]); openDivFade(document.getElementsByClassName("overlay")[0]);
}, },
eventMouseover: function (event, jsEvent, view) { eventMouseover: function(event, jsEvent, view) {
this.style.boxShadow = "inset 0 0 0 99999px rgba(255,255,255,0.2)"; this.style.boxShadow = "inset 0 0 0 99999px rgba(255,255,255,0.2)";
}, },
eventMouseout: function (event, jsEvent, view) { eventMouseout: function(event, jsEvent, view) {
this.style.boxShadow = ""; this.style.boxShadow = "";
}, },
dayClick: function(date, jsEvent, view) { // On-click for each day. dayClick: function(date, jsEvent, view) { // On-click for each day.
@ -402,25 +403,25 @@ Template.main.helpers({
highlight() { // Calendar highlight/scale option. highlight() { // Calendar highlight/scale option.
var hoverHighlight = Session.get("classDispHover"); var hoverHighlight = Session.get("classDispHover");
var typeHighlight = Session.get("typeFilterHover"); var typeHighlight = Session.get("typeFilterHover");
if(Session.equals("mode","classes")) { if (Session.equals("mode", "classes")) {
$(".workCard").toggleClass("scaled",false); $(".workCard").toggleClass("scaled", false);
try { try {
$(".workCard[classid=\'"+hoverHighlight+"\']").toggleClass("scaled",true); $(".workCard[classid=\'" + hoverHighlight + "\']").toggleClass("scaled", true);
$(".workCard[type=\'"+typeHighlight+"\']").toggleClass("scaled",true); $(".workCard[type=\'" + typeHighlight + "\']").toggleClass("scaled", true);
} catch(err) {} } catch (err) {}
} else { } else {
$(".workevent").toggleClass("scaled",false); $(".workevent").toggleClass("scaled", false);
try { try {
$("."+hoverHighlight).toggleClass("scaled",true); $("." + hoverHighlight).toggleClass("scaled", true);
$("."+typeHighlight).toggleClass("scaled",true); $("." + typeHighlight).toggleClass("scaled", true);
} catch(err) {} } catch (err) {}
} }
return; return;
}, },
work(value) { // Returns the specified work value. work(value) { // Returns the specified work value.
if (Session.equals("currentWork", null)) return; if (Session.equals("currentWork", null)) return;
if (Session.get("newWork")) { if (Session.get("newWork")) {
return defaultWork[value]; return defaultWork[value];
} else { } else {
return formReadable(Session.get("currentWork"),value); return formReadable(Session.get("currentWork"),value);
} }
@ -434,8 +435,8 @@ Template.main.helpers({
types() { types() {
var types = Object.keys(workColors); var types = Object.keys(workColors);
var array = []; var array = [];
for(var i = 0; i < types.length; i++) { for (var i = 0; i < types.length; i++) {
array.push({ array.push({
"type": types[i], "type": types[i],
"typeName": types[i][0].toUpperCase() + types[i].slice(1), "typeName": types[i][0].toUpperCase() + types[i].slice(1),
"selected": _.contains(Session.get("typeFilter"), types[i]) "selected": _.contains(Session.get("typeFilter"), types[i])
@ -533,8 +534,8 @@ Template.main.events({
modifyingInput = null; modifyingInput = null;
} }
if(!document.getElementById("userDropdown").contains(event.target)) closeDivFade(document.getElementById("userDropdown")); if (!document.getElementById("userDropdown").contains(event.target)) closeDivFade(document.getElementById("userDropdown"));
if(!document.getElementById("requests").contains(event.target)) Session.set("requests",false); if (!document.getElementById("requests").contains(event.target)) Session.set("requests", false);
}, },
// MAIN MENU BUTTONS // MAIN MENU BUTTONS
'click .fa-bars' () { // Click menu button. 'click .fa-bars' () { // Click menu button.
@ -562,7 +563,7 @@ Template.main.events({
} }
}, },
'click #requests .fa-question' () { 'click #requests .fa-question' () {
Session.set("requests",!Session.get("requests")); Session.set("requests", !Session.get("requests"));
}, },
'click .classes' () { // Click classes mode button. 'click .classes' () { // Click classes mode button.
if (Session.equals("mode", "classes")) return; if (Session.equals("mode", "classes")) return;
@ -599,7 +600,7 @@ Template.main.events({
openDivFade(document.getElementsByClassName("overlay")[0]); openDivFade(document.getElementsByClassName("overlay")[0]);
}, },
'click #dropdown' (event) { 'click #dropdown' (event) {
if(document.getElementById("userDropdown").style.display === "block") return; if (document.getElementById("userDropdown").style.display === "block") return;
setTimeout(function() { setTimeout(function() {
openDivFade(document.getElementById("userDropdown")); openDivFade(document.getElementById("userDropdown"));
}, 300); }, 300);
@ -608,6 +609,7 @@ Template.main.events({
var dom = event.target; var dom = event.target;
while (event.target.className !== "workCard") event.target = event.target.parentNode; while (event.target.className !== "workCard") event.target = event.target.parentNode;
var workid = event.target.getAttribute("workid"); var workid = event.target.getAttribute("workid");
var thisWork = work.findOne({ var thisWork = work.findOne({
_id: workid _id: workid
}); });
@ -630,7 +632,7 @@ Template.main.events({
}, },
'click #requestSubmit' () { 'click #requestSubmit' () {
var area = document.getElementById("requestArea"); var area = document.getElementById("requestArea");
if(area.value === "") return; if (area.value === "") return;
var array = {}; var array = {};
array.content = area.value; array.content = area.value;
array.info = { array.info = {
@ -638,13 +640,13 @@ Template.main.events({
"userInfo": Meteor.user(), "userInfo": Meteor.user(),
"userClasses": Session.get("calendarClasses") "userClasses": Session.get("calendarClasses")
}; };
Meteor.call("createRequest", array, function(err,result) { Meteor.call("createRequest", array, function(err, result) {
area.value = "Request sent!"; area.value = "Request sent!";
setTimeout(function(){ setTimeout(function() {
document.getElementById("requests").style.marginBottom = "-15.5vw"; document.getElementById("requests").style.marginBottom = "-15.5vw";
area.value = ""; area.value = "";
Session.set("commentRestrict",null); Session.set("commentRestrict", null);
},750); }, 750);
}); });
}, },
// HANDLING INPUT CHANGING // HANDLING INPUT CHANGING
@ -707,7 +709,7 @@ Template.main.events({
}, },
'click #workComment' (event) { 'click #workComment' (event) {
var restrict = event.target.maxLength; var restrict = event.target.maxLength;
Session.set("commentRestrict",restrict-event.target.value.length.toString() + " characters left"); Session.set("commentRestrict", restrict - event.target.value.length.toString() + " characters left");
var text = document.getElementById("commentrestrict"); var text = document.getElementById("commentrestrict");
text.style.display = "initial"; text.style.display = "initial";
text.style.color = "#7E7E7E"; text.style.color = "#7E7E7E";
@ -720,11 +722,15 @@ Template.main.events({
var works = userClasses[i].thisClassWork; var works = userClasses[i].thisClassWork;
for (var j = 0; j < works.length; j++) { for (var j = 0; j < works.length; j++) {
var work = works[j]; var work = works[j];
var workclass = classes.findOne({_id: work.class}); var workclass = classes.findOne({
_id: work.class
});
if (work.description == defaultWork.description) work.description = ""; if (work.description == defaultWork.description) work.description = "";
if (work.dueDate == defaultWork.dueDate) continue; if (work.dueDate == defaultWork.dueDate) continue;
if (work.name == defaultWork.name) work.name = ""; if (work.name == defaultWork.name) work.name = "";
if (workclass === undefined) workclass = {name: "Personal"}; if (workclass === undefined) workclass = {
name: "Personal"
};
events.push([ events.push([
workclass.name + ": " + work.name, workclass.name + ": " + work.name,
work.realDate.toLocaleDateString(), work.realDate.toLocaleDateString(),
@ -735,8 +741,13 @@ Template.main.events({
} }
var JSONevents = JSON.stringify(events); var JSONevents = JSON.stringify(events);
var CSVevents = Papa.unparse({fields: ["Subject", "Start Date", "Description", "All Day Event"], data: JSONevents}); var CSVevents = Papa.unparse({
var eventBlob = new Blob([CSVevents], {type: "data:text/csv;charset=utf-8"}); fields: ["Subject", "Start Date", "Description", "All Day Event"],
data: JSONevents
});
var eventBlob = new Blob([CSVevents], {
type: "data:text/csv;charset=utf-8"
});
saveAs(eventBlob, "hourglass.csv"); saveAs(eventBlob, "hourglass.csv");
}, },
'keydown input' (event) { // Enter to close input. 'keydown input' (event) { // Enter to close input.
@ -751,12 +762,12 @@ Template.main.events({
var restrict = event.target.maxLength; var restrict = event.target.maxLength;
var chars = restrict - event.target.value.length; var chars = restrict - event.target.value.length;
var text; var text;
if(event.target.id === "workComment") { if (event.target.id === "workComment") {
text = document.getElementById("commentrestrict"); text = document.getElementById("commentrestrict");
} else if(event.target.id === "requestArea") { } else if (event.target.id === "requestArea") {
text = document.getElementById("requestrestrict"); text = document.getElementById("requestrestrict");
} else { } else {
text = document.getElementById(Session.get("modifying")+"restrict"); text = document.getElementById(Session.get("modifying") + "restrict");
} }
text.style.color = "#7E7E7E"; text.style.color = "#7E7E7E";
if (chars === restrict) { // Don't display if nothing in comment. if (chars === restrict) { // Don't display if nothing in comment.
@ -826,7 +837,7 @@ Template.main.events({
var date = calWorkDate.split("-"); var date = calWorkDate.split("-");
date = new Date(date[0], parseInt(date[1]) - 1, date[2], 11, 59, 59); date = new Date(date[0], parseInt(date[1]) - 1, date[2], 11, 59, 59);
Session.set("newWork", true); Session.set("newWork", true);
Session.get("currentWorkId",classid); Session.get("currentWorkId", classid);
openDivFade(document.getElementsByClassName("overlay")[0]); openDivFade(document.getElementsByClassName("overlay")[0]);
} else { // Normal clicking turns on filter. } else { // Normal clicking turns on filter.
var array = Session.get("classDisp"); var array = Session.get("classDisp");
@ -881,14 +892,14 @@ Template.main.events({
} }
while (div.getAttribute("type") === null) div = div.parentNode; while (div.getAttribute("type") === null) div = div.parentNode;
var type = div.getAttribute("type"); var type = div.getAttribute("type");
Session.set("typeFilterHover", type); Session.set("typeFilterHover", type);
}, },
'mouseleave .sideFilter' (event) { 'mouseleave .sideFilter' (event) {
if (event.target.className !== "sideFilter") { if (event.target.className !== "sideFilter") {
var div = event.target.parentNode; var div = event.target.parentNode;
if (div.contains(event.target)) return; if (div.contains(event.target)) return;
} }
Session.set("typeFilterHover", null); Session.set("typeFilterHover", null);
} }
}); });
@ -921,10 +932,10 @@ function closeInput() { // Close a changeable input and change it back to span.
color = "#BEBEBE"; color = "#BEBEBE";
} }
span.style.color = color; span.style.color = color;
Session.set("commentRestrict",""); Session.set("commentRestrict", "");
try { try {
input.parentNode.removeChild(input); input.parentNode.removeChild(input);
document.getElementById(modifyingInput+"restrict").style.display = "none"; document.getElementById(modifyingInput + "restrict").style.display = "none";
} catch (err) {} } catch (err) {}
if (input.value === "") { // If input has nothing. if (input.value === "") { // If input has nothing.
span.childNodes[0].nodeValue = "Click here to edit..."; span.childNodes[0].nodeValue = "Click here to edit...";
@ -1005,13 +1016,17 @@ function toDate(date) { // Turns formatted date back to Date constructor.
} }
function formReadable(input, val) { // Makes work information readable by users. function formReadable(input, val) { // Makes work information readable by users.
if(input) switch (val) {
switch(val) { case "typeColor":
case "typeColor": return input.typeColor = workColors[input.type]; return input.typeColor = workColors[input.type];
case "name": return input.name; case "name":
case "dueDate": return getReadableDate(input.dueDate); return input.name;
case "description": return input.description; case "dueDate":
case "type": return input.type[0].toUpperCase() + input.type.slice(1); return getReadableDate(input.dueDate);
case "description":
return input.description;
case "type":
return input.type[0].toUpperCase() + input.type.slice(1);
case "comments": case "comments":
var comments = input.comments; var comments = input.comments;
var resort = []; var resort = [];
@ -1023,7 +1038,7 @@ function formReadable(input, val) { // Makes work information readable by users.
"date": null, "date": null,
"user": null, "user": null,
"avatar": null, "avatar": null,
"email":null "email": null
}; };
var user = Meteor.users.findOne({ var user = Meteor.users.findOne({
_id: comments[k].user _id: comments[k].user
@ -1050,19 +1065,19 @@ function formReadable(input, val) { // Makes work information readable by users.
return input.done; return input.done;
case "doneCol": case "doneCol":
if (Session.get("newWork")) return ""; if (Session.get("newWork")) return "";
if (!_.contains(input.done,Meteor.userId())) return ""; if (!_.contains(input.done, Meteor.userId())) return "";
return "#27A127"; return "#27A127";
case "doneText": case "doneText":
if (Session.get("newWork")) return ""; if (Session.get("newWork")) return "";
if (!_.contains(input.done,Meteor.userId())) return "Mark done"; if (!_.contains(input.done, Meteor.userId())) return "Mark done";
return "Done!"; return "Done!";
case "userConfirm": case "userConfirm":
if(!_.contains(input.confirmations, Meteor.userId())) return ""; if (!_.contains(input.confirmations, Meteor.userId())) return "";
return "#27A127"; return "#27A127";
case "confirmations": case "confirmations":
return input.confirmations.length; return input.confirmations.length;
case "userReport": case "userReport":
if(!_.contains(input.reports, Meteor.userId())) return ""; if (!_.contains(input.reports, Meteor.userId())) return "";
return "#FF1A1A"; return "#FF1A1A";
case "reports": case "reports":
return input.reports.length; return input.reports.length;

View File

@ -426,7 +426,7 @@ Template.profile.events({
serverData = [user._id, classid]; serverData = [user._id, classid];
confirm = "changeAdmin"; confirm = "changeAdmin";
Session.set("confirmText", "Are you really sure?"); Session.set("confirmText", "Are you really sure?");
openDivFade(document.getElementsByClassName("overlay")[0]) openDivFade(document.getElementsByClassName("overlay")[0]);
document.getElementById("createdClasses").style.marginRight = "-40%"; document.getElementById("createdClasses").style.marginRight = "-40%";
}, },
// OVERLAY BUTTONS // OVERLAY BUTTONS

View File

@ -1,3 +1,13 @@
AdminConfig = {
name: 'Hourglass',
collections: {
schools: {},
classes: {},
work: {},
requests: {}
}
};
themeColors = { themeColors = {
"light": { "light": {
"background": "White.jpg", "background": "White.jpg",
@ -93,4 +103,4 @@ options = {
] ]
} }
serverData = null; serverData = null;

View File

@ -6,9 +6,6 @@ import {
Mongo Mongo
} from 'meteor/mongo'; } from 'meteor/mongo';
Houston.add_collection(Meteor.users);
Houston.add_collection(Houston._admins);
// Defines who the admins are - not added // Defines who the admins are - not added
var superadmins = [ var superadmins = [
"ybq987@gmail.com", "ybq987@gmail.com",
@ -28,9 +25,7 @@ for (var i = 0; i < superadmins.length; i++) {
}); });
if (superadmin !== undefined && !(Roles.userIsInRole(superadmin._id, 'superadmin'))) { if (superadmin !== undefined && !(Roles.userIsInRole(superadmin._id, 'superadmin'))) {
Roles.addUsersToRoles(superadmin._id, 'superadmin'); Roles.addUsersToRoles(superadmin._id, 'superadmin');
Houston._admins.insert({ Roles.addUsersToRoles(superadmin._id, 'admin');
user_id: superadmin._id
});
} }
} }
@ -528,11 +523,11 @@ Meteor.methods({
var prof = Meteor.user().profile; var prof = Meteor.user().profile;
var found = classes.findOne({ var found = classes.findOne({
_id: change, _id: change,
status: true
}); });
if (Meteor.user() !== null && if (Meteor.user() !== null &&
found !== null && found !== null &&
pass === found.code && pass === found.code &&
(found.status || found.admin === Meteor.userId()) &&
!_.contains(prof.classes, change)) { !_.contains(prof.classes, change)) {
var foundsubs = found.subscribers; var foundsubs = found.subscribers;
classes.update({ classes.update({