Merge + CSS

This commit is contained in:
Kenneth Jao 2017-01-16 00:14:55 -05:00
commit 5026ead717
7 changed files with 220 additions and 117 deletions

View File

@ -984,4 +984,4 @@ startDragula = function() {
} }
Meteor.call("reorderClasses", final); Meteor.call("reorderClasses", final);
}); });
} };

View File

@ -1,3 +1,4 @@
/* jshint esversion: 6 */
Session.set("settingMode", "manageClass"); Session.set("settingMode", "manageClass");
Session.set("classInfoMode", "general"); Session.set("classInfoMode", "general");
Session.set("notsearching", true); // If user isn't searching Session.set("notsearching", true); // If user isn't searching
@ -5,12 +6,20 @@ Session.set("noclass", null); // If user doesn't have classes.
Session.set("notfound", null); // If no results for autocomplete. Session.set("notfound", null); // If no results for autocomplete.
var filterOpen = [false, true, true, true, true]; var filterOpen = [false, true, true, true, true];
var sidebarMode = [null,null]; var sidebarMode = [null, null];
Template.sidebarMenuPlate.rendered = function(){$(".menuWrapper").slideDown(300);} Template.sidebarMenuPlate.rendered = function() {
Template.sidebarOptionPlate.rendered = function(){$(".menuWrapper").slideDown(300);} $(".menuWrapper").slideDown(300);
Template.sidebarRequestPlate.rendered = function(){$(".menuWrapper").slideDown(300);} };
Template.sidebarCreatePlate.rendered = function(){$(".menuWrapper").slideDown(300);} Template.sidebarOptionPlate.rendered = function() {
$(".menuWrapper").slideDown(300);
};
Template.sidebarRequestPlate.rendered = function() {
$(".menuWrapper").slideDown(300);
};
Template.sidebarCreatePlate.rendered = function() {
$(".menuWrapper").slideDown(300);
};
Template.sidebarMenuPlate.helpers({ Template.sidebarMenuPlate.helpers({
modeStatus(status) { // Color status of display modes. modeStatus(status) { // Color status of display modes.
@ -30,13 +39,13 @@ Template.sidebarMenuPlate.helpers({
}, },
filterOn() { filterOn() {
return Session.get("classDisp").length !== 0 || Session.get("typeFilter").length !== 0; return Session.get("classDisp").length !== 0 || Session.get("typeFilter").length !== 0;
}, }
}); });
Template.sidebarMenuPlate.events({ Template.sidebarMenuPlate.events({
'click .classes' () { // Click classes mode button. 'click .classes' () { // Click classes mode button.
if (Session.equals("mode", "classes")) return; if (Session.equals("mode", "classes")) return;
toggleToMode("classes") toggleToMode("classes");
setTimeout(startDragula, 500); setTimeout(startDragula, 500);
toggleToSidebar(false); toggleToSidebar(false);
}, },
@ -46,8 +55,8 @@ Template.sidebarMenuPlate.events({
toggleToSidebar(false); toggleToSidebar(false);
}, },
'click #filterHead' (event) { 'click #filterHead' (event) {
if(event.target.id === "disableFilter") return; if (event.target.id === "disableFilter") return;
if(!filterOpen[0]) { if (!filterOpen[0]) {
$("#filterWrapper").slideDown(300); $("#filterWrapper").slideDown(300);
} else { } else {
$("#filterWrapper").slideUp(300); $("#filterWrapper").slideUp(300);
@ -55,7 +64,7 @@ Template.sidebarMenuPlate.events({
filterOpen[0] = !filterOpen[0]; filterOpen[0] = !filterOpen[0];
}, },
'click #typeFilterWrapper' () { 'click #typeFilterWrapper' () {
if(!filterOpen[1]) { if (!filterOpen[1]) {
$("#classFilterHolder").slideDown(300); $("#classFilterHolder").slideDown(300);
} else { } else {
$("#classFilterHolder").slideUp(300); $("#classFilterHolder").slideUp(300);
@ -63,7 +72,7 @@ Template.sidebarMenuPlate.events({
filterOpen[1] = !filterOpen[1]; filterOpen[1] = !filterOpen[1];
}, },
'click #classFilterWrapper' () { 'click #classFilterWrapper' () {
if(!filterOpen[2]) { if (!filterOpen[2]) {
$("#classListHolder").slideDown(300); $("#classListHolder").slideDown(300);
} else { } else {
$("#classListHolder").slideUp(300); $("#classListHolder").slideUp(300);
@ -72,7 +81,7 @@ Template.sidebarMenuPlate.events({
}, },
// CLASS FILTERS // CLASS FILTERS
'click .sideClass' (event) { // Click class list in sidebar. 'click .sideClass' (event) { // Click class list in sidebar.
var classid = event.target.getAttribute("classid") var classid = event.target.getAttribute("classid");
var array = Session.get("classDisp"); var array = Session.get("classDisp");
if (array.indexOf(classid) !== -1) { if (array.indexOf(classid) !== -1) {
array.splice(array.indexOf(classid), 1); array.splice(array.indexOf(classid), 1);
@ -156,7 +165,7 @@ Template.sidebarOptionPlate.events({
toggleToMode("createClass"); toggleToMode("createClass");
}, },
'click #settingMode' () { 'click #settingMode' () {
if(!filterOpen[3]) { if (!filterOpen[3]) {
$("#settingModeWrapper").slideDown(300); $("#settingModeWrapper").slideDown(300);
} else { } else {
$("#settingModeWrapper").slideUp(300); $("#settingModeWrapper").slideUp(300);
@ -164,7 +173,7 @@ Template.sidebarOptionPlate.events({
filterOpen[3] = !filterOpen[3]; filterOpen[3] = !filterOpen[3];
}, },
'click #preferencesWrapper' () { 'click #preferencesWrapper' () {
if(!filterOpen[4]) { if (!filterOpen[4]) {
$("#prefCont").slideDown(300); $("#prefCont").slideDown(300);
} else { } else {
$("#prefCont").slideUp(300); $("#prefCont").slideUp(300);
@ -181,16 +190,18 @@ Template.sidebarCreatePlate.events({
Session.set("currentWork", newSetting); Session.set("currentWork", newSetting);
$(".overlay").fadeIn(250); $(".overlay").fadeIn(250);
} }
}) });
Template.registerHelper("classInfo", (info) => { Template.registerHelper("classInfo", (info) => {
var thisClass = classes.findOne({_id:Session.get("classInfo")}); var thisClass = classes.findOne({
_id: Session.get("classInfo")
});
var isYou = Session.equals("classInfo", Meteor.userId()); var isYou = Session.equals("classInfo", Meteor.userId());
switch (info) { switch (info) {
case "name": case "name":
return (isYou) ? "Personal" : thisClass.name; return (isYou) ? "Personal" : thisClass.name;
case "teacher": case "teacher":
return (isYou) ? "None": thisClass.teacher; return (isYou) ? "None" : thisClass.teacher;
case "hour": case "hour":
return (isYou) ? "None" : thisClass.hour; return (isYou) ? "None" : thisClass.hour;
case "category": case "category":
@ -198,17 +209,28 @@ Template.registerHelper("classInfo", (info) => {
case "privacy": case "privacy":
return (isYou) ? true : thisClass.privacy; return (isYou) ? true : thisClass.privacy;
case "admin": case "admin":
return Meteor.users.findOne({_id: (isYou) ? Meteor.userId() : thisClass.admin}); return Meteor.users.findOne({
_id: (isYou) ? Meteor.userId() : thisClass.admin
});
case "code": case "code":
if(isYou) return {exists: false} if (isYou) return {
return (isYou || Meteor.userId() !== this.admin) ? {exists: false} : {exists: true, code: Meteor.call('getCode', thisClass._id)}; exists: false
};
return (isYou || Meteor.userId() !== this.admin) ? {
exists: false
} : {
exists: true,
code: Meteor.call('getCode', thisClass._id)
};
case "mine": case "mine":
return (isYou) ? true : Meteor.userId() === thisClass.admin; return (isYou) ? true : Meteor.userId() === thisClass.admin;
case "moderators": case "moderators":
if (isYou || thisClass.moderators.length === 0) return []; if (isYou || thisClass.moderators.length === 0) return [];
var moderators = []; var moderators = [];
thisClass.moderators.forEach(function(ele) { thisClass.moderators.forEach(function(ele) {
var array = Meteor.users.findOne({_id: ele}); var array = Meteor.users.findOne({
_id: ele
});
array.delete = true; array.delete = true;
moderators.push(array); moderators.push(array);
}); });
@ -217,7 +239,9 @@ Template.registerHelper("classInfo", (info) => {
if (isYou || thisClass.banned.length === 0) return []; if (isYou || thisClass.banned.length === 0) return [];
var banned = []; var banned = [];
thisClass.banned.forEach(function(ele) { thisClass.banned.forEach(function(ele) {
var array = Meteor.users.findOne({_id: ele}); var array = Meteor.users.findOne({
_id: ele
});
array.delete = true; array.delete = true;
banned.push(array); banned.push(array);
}); });
@ -226,7 +250,9 @@ Template.registerHelper("classInfo", (info) => {
if (isYou || thisClass.subscribers.length === 0) return []; if (isYou || thisClass.subscribers.length === 0) return [];
var subscribers = []; var subscribers = [];
thisClass.subscribers.forEach(function(ele) { thisClass.subscribers.forEach(function(ele) {
subscribers.push(Meteor.users.findOne({_id: ele})); subscribers.push(Meteor.users.findOne({
_id: ele
}));
}); });
return subscribers; return subscribers;
case "personal": case "personal":
@ -235,7 +261,7 @@ Template.registerHelper("classInfo", (info) => {
}); });
Template.registerHelper("classInfoMode", (mode, check) => { Template.registerHelper("classInfoMode", (mode, check) => {
if(typeof check === "string") return Session.equals("classInfoMode",mode); if (typeof check === "string") return Session.equals("classInfoMode", mode);
return (Session.equals("classInfoMode", mode)) ? Session.get("user").preferences.theme.modeHighlight + ";background-color:rgba(0,0,0,0.1);" : "rgba(0,0,0,0)"; return (Session.equals("classInfoMode", mode)) ? Session.get("user").preferences.theme.modeHighlight + ";background-color:rgba(0,0,0,0.1);" : "rgba(0,0,0,0)";
}); });
@ -246,15 +272,15 @@ Template.registerHelper("classSelected", () => {
Template.manageClass.events({ Template.manageClass.events({
'click .classBox' (event) { 'click .classBox' (event) {
var classId = event.target.getAttribute("classid"); var classId = event.target.getAttribute("classid");
if(Session.equals("classInfo",classId)) return; if (Session.equals("classInfo", classId)) return;
toggleToClassInfo(classId); toggleToClassInfo(classId);
}, },
'click #classInfoModeWrapper span:first-child' () { 'click #classInfoModeWrapper span:first-child' () {
if(Session.equals("classInfoMode","general")) return; if (Session.equals("classInfoMode", "general")) return;
toggleToClassInfoMode("general"); toggleToClassInfoMode("general");
}, },
'click #classInfoModeWrapper span:last-child' () { 'click #classInfoModeWrapper span:last-child' () {
if(Session.equals("classInfoMode","users")) return; if (Session.equals("classInfoMode", "users")) return;
toggleToClassInfoMode("users"); toggleToClassInfoMode("users");
}, },
'click .infoCard .fa-pencil-square-o' () { 'click .infoCard .fa-pencil-square-o' () {
@ -267,7 +293,7 @@ Template.manageClass.events({
var user = Meteor.users.findOne({ var user = Meteor.users.findOne({
"services.google.email": value "services.google.email": value
}); });
if(!user) { if (!user) {
sAlert.error("Invalid email!", { sAlert.error("Invalid email!", {
effect: 'stackslide', effect: 'stackslide',
position: 'top', position: 'top',
@ -300,19 +326,32 @@ Template.manageClass.events({
Template.joinClass.helpers({ Template.joinClass.helpers({
classes() { // Loads all of the possible classes ( Limit of twenty shown ) ( Sorts by class size ) ( Only your school) classes() { // Loads all of the possible classes ( Limit of twenty shown ) ( Sorts by class size ) ( Only your school)
var array = classes.find({ var array = classes.find({
status: {$eq: true}, status: {
privacy: {$eq: false}, $eq: true
_id: {$nin: Session.get("user").classes},
school: {$eq: Session.get("user").school}
}, },
{sort: {subscribers: -1}}, privacy: {
{limit: 20} $eq: false
).fetch(); },
_id: {
$nin: Session.get("user").classes
},
school: {
$eq: Session.get("user").school
}
}, {
sort: {
subscribers: -1
}
}, {
limit: 20
}).fetch();
for (var i = 0; i < array.length; i++) { for (var i = 0; i < array.length; i++) {
array[i].join = true; array[i].join = true;
array[i].subscribers = array[i].subscribers.length; array[i].subscribers = array[i].subscribers.length;
array[i].teachershort = array[i].teacher.split(" ").slice(1).reduce(function(a,b) { return a+ " " + b;}); array[i].teachershort = array[i].teacher.split(" ").slice(1).reduce(function(a, b) {
return a + " " + b;
});
} }
if (array.length === 0) { if (array.length === 0) {
Session.set("noclass", true); Session.set("noclass", true);
@ -356,21 +395,21 @@ Template.joinClass.helpers({
}, },
notfound() { // Returns if autocomplete has no results. notfound() { // Returns if autocomplete has no results.
return Session.get("notfound"); return Session.get("notfound");
}, }
}); });
Template.joinClass.events({ Template.joinClass.events({
'click .classBox' (event) { 'click .classBox' (event) {
var classId = event.target.getAttribute("classid"); var classId = event.target.getAttribute("classid");
if(Session.equals("classInfo",classId)) return; if (Session.equals("classInfo", classId)) return;
toggleToClassInfo(classId); toggleToClassInfo(classId);
}, },
'click #classInfoModeWrapper span:first-child' () { 'click #classInfoModeWrapper span:first-child' () {
if(Session.equals("classInfoMode","general")) return; if (Session.equals("classInfoMode", "general")) return;
toggleToClassInfoMode("general"); toggleToClassInfoMode("general");
}, },
'click #classInfoModeWrapper span:last-child' () { 'click #classInfoModeWrapper span:last-child' () {
if(Session.equals("classInfoMode","users")) return; if (Session.equals("classInfoMode", "users")) return;
toggleToClassInfoMode("users"); toggleToClassInfoMode("users");
}, },
'input #classSearch' (event) { // Auto-complete updater 'input #classSearch' (event) { // Auto-complete updater
@ -400,7 +439,7 @@ Template.joinClass.events({
}); });
} }
Session.set("autocompleteDivs", divs.sort(function(a, b) { Session.set("autocompleteDivs", divs.sort(function(a, b) {
return b.subscribers - a.subscribers return b.subscribers - a.subscribers;
})); }));
} catch (err) {} } catch (err) {}
}, },
@ -411,12 +450,12 @@ Template.joinClass.events({
$("#confirmOverlay").fadeIn(250); $("#confirmOverlay").fadeIn(250);
}, },
'click #private' () { 'click #private' () {
$("#privateCode").css('display','inline-block'); $("#privateCode").css('display', 'inline-block');
var input = document.getElementById("privateCode"); var input = document.getElementById("privateCode");
input.focus(); input.focus();
if(input.value === "") return; if (input.value === "") return;
Meteor.call("joinPrivateClass", input.value, function(error, result) { Meteor.call("joinPrivateClass", input.value, function(error, result) {
if(result) { if (result) {
sAlert.success("Joined!", { sAlert.success("Joined!", {
effect: 'genie', effect: 'genie',
position: 'bottom-right', position: 'bottom-right',
@ -458,26 +497,29 @@ Template.createClass.helpers({
template: Template.teacherList template: Template.teacherList
}] }]
}; };
}, }
}); });
Template.createClass.events({ Template.createClass.events({
'click #creSubmit' () { 'click #creSubmit' () {
var inputs = document.getElementsByClassName("creInput"); var inputs = document.getElementsByClassName("creInput");
var values = new Object; var values = {};
var required = ["school","name","privacy","category"]; var required = ["school", "name", "privacy", "category"];
var no = []; var no = [];
for(var i = 0; i < inputs.length; i++) { for (var i = 0; i < inputs.length; i++) {
var val = inputs[i].value; var val = inputs[i].value;
var where = inputs[i].getAttribute("form"); var where = inputs[i].getAttribute("form");
if(val === "" && _.contains(required, where)) { if (val === "" && _.contains(required, where)) {
no.push(where); no.push(where);
} }
values[where] = val; values[where] = val;
} }
console.log(values);
if(no.length !== 0) { // Check missing fields. console.log(no);
sAlert.error("Missing " + no.reduce(function(a,b) { return (b === no[no.length-1]) ? a + ", and " + b : a + ", " + b }), { if (no.length > 0) { // Check missing fields.
sAlert.error("Missing " + no.reduce(function(a, b) {
return (b === no[no.length - 1]) ? a + ", and " + b : a + ", " + b;
}), {
effect: 'stackslide', effect: 'stackslide',
position: 'top', position: 'top',
timeout: 3000 timeout: 3000
@ -489,9 +531,10 @@ Template.createClass.events({
values.category.toLowerCase(); values.category.toLowerCase();
values.code = ""; values.code = "";
serverData = values; serverData = values;
if(!teachers.findOne({name: values["teacher"]})) { if (!teachers.findOne({
Meteor.call("createTeacher", values["teacher"], function(error,result) { name: values.teacher
console.log(error); })) {
Meteor.call("createTeacher", values.teacher, values.school, function(error, result) {
if (error !== undefined) { if (error !== undefined) {
sAlert.error(error.message, { sAlert.error(error.message, {
effect: 'stackslide', effect: 'stackslide',
@ -516,7 +559,7 @@ Template.classInfoUsers.events({
var user = Meteor.users.findOne({ var user = Meteor.users.findOne({
"services.google.email": value "services.google.email": value
}); });
if(!user) { if (!user) {
sAlert.error("Invalid email!", { sAlert.error("Invalid email!", {
effect: 'stackslide', effect: 'stackslide',
position: 'top', position: 'top',
@ -534,10 +577,12 @@ Template.classInfoUsers.events({
input.value = ""; input.value = "";
}, },
'click .userDisp .fa' (event) { 'click .userDisp .fa' (event) {
var outerInput = event.target.parentNode.parentNode.parentNode.parentNode.childNodes[1] var outerInput = event.target.parentNode.parentNode.parentNode.parentNode.childNodes[1];
var type = outerInput.childNodes[6].getAttribute("user"); var type = outerInput.childNodes[6].getAttribute("user");
var userid = event.target.parentNode.parentNode.getAttribute("userid"); var userid = event.target.parentNode.parentNode.getAttribute("userid");
if(!Meteor.users.findOne({_id: userid})) { if (!Meteor.users.findOne({
_id: userid
})) {
sAlert.error("Stop hacking, reload the page.", { sAlert.error("Stop hacking, reload the page.", {
effect: 'stackslide', effect: 'stackslide',
position: 'top', position: 'top',
@ -570,29 +615,37 @@ Template.classInfoCode.events({
toggleToMode = function(mode) { toggleToMode = function(mode) {
$("#mainBody").fadeOut(250, function() { $("#mainBody").fadeOut(250, function() {
(Session.equals("sidebarMode", "option")) ? Session.set("settingMode", mode) : Session.set("mode",mode); (Session.equals("sidebarMode", "option")) ? Session.set("settingMode", mode): Session.set("mode", mode);
Session.set("classInfo", null); Session.set("classInfo", null);
$("#mainBody").fadeIn(250); $("#mainBody").fadeIn(250);
}); });
} };
toggleToSidebar = function(sidebar) { toggleToSidebar = function(sidebar) {
try { try {
$("#backgroundOverlay").fadeOut(250); $("#backgroundOverlay").fadeOut(250);
} catch(err) {} } catch (err) {}
if(Session.equals("sidebarMode", sidebar) || !sidebar) { if (Session.equals("sidebarMode", sidebar) || !sidebar) {
$("#menuContainer").hide("slide", {direction: "left"}, 250); $("#menuContainer").hide("slide", {
$("#divCenter").stop().animate({left: '6vh'}, 250, function() { direction: "left"
}, 250);
$("#divCenter").stop().animate({
left: '6vh'
}, 250, function() {
Session.set("sidebarMode", ""); Session.set("sidebarMode", "");
}); });
} else { } else {
$("#menuContainer").show("slide", {direction: "left"}, 250); $("#menuContainer").show("slide", {
$("#divCenter").stop().animate({left: '36vh'}, 250); direction: "left"
}, 250);
$("#divCenter").stop().animate({
left: '36vh'
}, 250);
$(".menuWrapper").fadeOut(200, function() { $(".menuWrapper").fadeOut(200, function() {
Session.set("sidebarMode", sidebar); Session.set("sidebarMode", sidebar);
}); });
} }
} };
toggleToClassInfo = function(classId) { toggleToClassInfo = function(classId) {
$("#changeAdminWrapper").fadeOut(250); $("#changeAdminWrapper").fadeOut(250);
@ -601,11 +654,11 @@ toggleToClassInfo = function(classId) {
Session.set("classInfoMode", "general"); Session.set("classInfoMode", "general");
$(this).fadeIn(250); $(this).fadeIn(250);
}); });
} };
toggleToClassInfoMode = function(mode) { toggleToClassInfoMode = function(mode) {
$("#infoClassCont").fadeOut(250, function() { $("#infoClassCont").fadeOut(250, function() {
Session.set("classInfoMode", mode); Session.set("classInfoMode", mode);
$(this).fadeIn(250); $(this).fadeIn(250);
}); });
} };

View File

@ -2,7 +2,7 @@
width: 100%; width: 100%;
height: 100%; height: 100%;
background-color: #DBDBDB; background-color: #282933;
position: absolute; position: absolute;
top: 0; top: 0;
@ -15,16 +15,17 @@
#newUserWrapper { #newUserWrapper {
width: 25%; width: 25%;
padding: 3%; padding: 2.5%;
margin: auto; margin: auto;
background-color: rgba(255,255,255,0.3); background-color: rgba(255,255,255,0.2);
} }
#newUserWrapper .formDiv { #newUserWrapper .formDiv {
width: 100%; width: 100%;
margin: 0; margin: 0;
padding: 0; padding: 0;
background-color: transparent;
} }
.opTitle { .opTitle {
@ -53,4 +54,3 @@
#basicNext:hover { #basicNext:hover {
background-color: rgba(0,0,0,0.1); background-color: rgba(0,0,0,0.1);
} }

View File

@ -16,7 +16,6 @@ Template.profile.helpers({
Template.profile.events({ Template.profile.events({
'click' (event) { // Closes respective divs when clicking outside of them. Order matters. 'click' (event) { // Closes respective divs when clicking outside of them. Order matters.
console.log("asdf");
var e = event.target.className; var e = event.target.className;
if(modifyingInput !== null && event.target !== document.getElementById(modifyingInput)) { if(modifyingInput !== null && event.target !== document.getElementById(modifyingInput)) {

View File

@ -11,8 +11,10 @@ schools.schema = new SimpleSchema({
teachers.schema = new SimpleSchema({ teachers.schema = new SimpleSchema({
name: {type: String}, name: {type: String},
school: {type: String} school: {type: String},
}) creator: {type: String, optional: true}
});
classes.schema = new SimpleSchema({ classes.schema = new SimpleSchema({
school: {type: String}, school: {type: String},
@ -59,7 +61,13 @@ userSchema = new SimpleSchema({
'profile.school': {type: String, label: "School"}, 'profile.school': {type: String, label: "School"},
'services.google.email': {type: String, label: "Email"}, 'services.google.email': {type: String, label: "Email"},
'services.google.picture': {type: String, label: "Icon URL"}, 'services.google.picture': {type: String, label: "Icon URL"},
'profile.classes': {type: [String], label: "Classes"} 'profile.classes': {type: [String], label: "Classes"},
'profile.complete': {type: Boolean}
});
teachers.schema = new SimpleSchema({
name: {type: String},
school: {type: String}
}); });
schools.attachSchema(schools.schema); schools.attachSchema(schools.schema);
@ -67,3 +75,4 @@ teachers.attachSchema(teachers.schema);
classes.attachSchema(classes.schema); classes.attachSchema(classes.schema);
work.attachSchema(work.schema); work.attachSchema(work.schema);
requests.attachSchema(requests.schema); requests.attachSchema(requests.schema);
teachers.attachSchema(teachers.schema);

View File

@ -1,6 +1,19 @@
function completeProfile() {
if (Meteor.user().profile.school &&
Meteor.user().profile.grade &&
Meteor.user().profile.classes.length > 1 &&
Meteor.user().profile.complete) {
return true;
} else {
return false;
}
}
Router.route('/', { Router.route('/', {
waitOn: function() { waitOn: function() {
if (!Meteor.userId()) { if (!Meteor.userId() || !completeProfile()) {
console.log("hello")
console.log(completeProfile());
this.redirect('/login'); this.redirect('/login');
} else { } else {
return [ return [
@ -28,7 +41,7 @@ Router.route('/login', {
action: function() { action: function() {
if (!Meteor.userId()) { if (!Meteor.userId()) {
this.render("login"); this.render("login");
} else if (!Meteor.user().profile.school) { } else if (!completeProfile()) {
Session.set("user", Meteor.user().profile); Session.set("user", Meteor.user().profile);
this.redirect('/profile'); this.redirect('/profile');
} else { } else {
@ -40,7 +53,7 @@ Router.route('/login', {
Router.route('/profile', { Router.route('/profile', {
waitOn: function() { waitOn: function() {
if (!Meteor.userId()) { if (!Meteor.userId() || completeProfile()) {
this.redirect('/login'); this.redirect('/login');
} else { } else {
return [ return [

View File

@ -26,8 +26,8 @@ Meteor.publish('schools', function() {
}); });
Meteor.publish('teachers', function() { Meteor.publish('teachers', function() {
return teachers.find(); return teachers.find({}, {fields: {name: 1, school: 1}});
}) });
// Returns the code for classes (for debug) // Returns the code for classes (for debug)
@ -129,9 +129,16 @@ Meteor.publish('users', function() {
} }
}); });
// Allows only superadmins to edit collections from client // Allows only superadmins to edit collections from client
Security.permit(['insert', 'update', 'remove']).collections([schools, classes, work]).ifHasRole('superadmin'); Security.permit(['insert', 'update', 'remove']).collections([schools, classes, work]).ifHasRole('superadmin');
Accounts.validateLoginAttempt(function(info) {
var user = info.user;
if(user.banned) throw new Meteor.Error(403, 'You are banned');
return true;
});
var errors = [ var errors = [
"Success.", // 0 "Success.", // 0
@ -153,11 +160,11 @@ var errors = [
["trivial", "This request is too long."], ["trivial", "This request is too long."],
["trivial", "Not a valid work type"], ["trivial", "Not a valid work type"],
["unauthorized", "This class has not been approved yet"], ["unauthorized", "This class has not been approved yet"],
["unauthorized", "Sorry, you are not authorized to complete this action."],
["other", "Error could not be processed"],
["matching", "This teacher already exists!"], ["matching", "This teacher already exists!"],
["trivial", "Please put the full name!"] ["trivial", "Please put the full name!"], // 20
["unauthorized", "Sorry, you are not authorized to complete this action."], // n - 2
["other", "Error could not be processed"] // n - 1
]; ];
function securityCheck(checklist, input) { function securityCheck(checklist, input) {
@ -271,13 +278,17 @@ function securityCheck(checklist, input) {
case 25: case 25:
if (Meteor.userId() === null) error = errors.length - 1; if (Meteor.userId() === null) error = errors.length - 1;
break; break;
// Teacher already exists // New Teacher doesn't already exist
case 26: case 26:
if (teachers.findOne({name: {$eq: input.teacher}, school: {$eq: input.school}})) error = 21; if (teachers.find({name: input.teachername, school: input.school}).fetch().length > 0) error = 19;
break;
// Not banning admin
case 27:
if (Roles.userIsInRole(input.userId, ['superadmin', 'admin'])) error = errors.length - 2;
break; break;
// Incorrect teacher format // Incorrect teacher format
case 27: case 28:
if(input.split(" ").length < 2) error = 22; if (input.teachername.split(" ").length < 2) error = 20;
break; break;
} }
results.push(error); results.push(error);
@ -330,18 +341,6 @@ Meteor.methods({
throw new Meteor.Error(errors[security]); throw new Meteor.Error(errors[security]);
} }
}, },
'createTeacher': function(name) {
teachers.schema.validate({name: name});
var security = securityCheck([26, 27, true],
name);
if(!security) {
teachers.insert({
name: name
});
} else {
throw new Meteor.Error(errors[security]);
}
},
// Class Functions // Class Functions
'createClass': function(input) { 'createClass': function(input) {
classes.schema.validate(input); classes.schema.validate(input);
@ -609,7 +608,8 @@ Meteor.methods({
"description": change.description, "description": change.description,
"banner": change.banner, "banner": change.banner,
"preferences": change.preferences, "preferences": change.preferences,
"name": current.name "name": current.name,
"complete": current.complete
}; };
if (current.description && current.description.length > 50) { if (current.description && current.description.length > 50) {
current.description = current.description.slice(0, 50); current.description = current.description.slice(0, 50);
@ -807,5 +807,34 @@ Meteor.methods({
} else { } else {
throw new Meteor.Error(errors[security]); throw new Meteor.Error(errors[security]);
} }
},
'createTeacher': function(teacherName, schoolName) {
teachers.schema.validate({name: teacherName, school: schoolName});
var security = securityCheck([26, 28, 3, true], {teachername: teacherName, school: schoolName});
if (!security) {
teachers.insert({
name: teacherName,
school: schoolName,
creator: Meteor.userId()
});
} else {
throw new Meteor.Error(errors[security]);
}
},
'ban': function(studentId) {
var security = securityCheck([1, 27, true], {userId: studentId});
if (!security) {
Meteor.users.update({_id: studentId}, {$set: {banned: true}});
} else {
throw new Meteor.Error(errors[security]);
}
},
'unban': function(studentId) {
var security = securityCheck([1, true], {userId: studentId});
if (!security) {
Meteor.users.update({_id: studentId}, {$set: {banned: false}});
} else {
throw new Meteor.Error(errors[security]);
}
} }
}); });