diff --git a/SE_API/API.py b/SE_API/API.py index 387ba41..136e6b0 100644 --- a/SE_API/API.py +++ b/SE_API/API.py @@ -29,6 +29,7 @@ from SE_API.UserRoutes import user_routes from SE_API.CampusRoutes import campus_routes from SE_API.CourseRoutes import course_routes from SE_API.ProjectRoutes import project_routes +from SE_API.TaskRoutes import task_routes @@ -49,6 +50,7 @@ app.register_blueprint(user_routes) app.register_blueprint(campus_routes) app.register_blueprint(course_routes) app.register_blueprint(project_routes) +app.register_blueprint(task_routes) auto = Autodoc(app) diff --git a/SE_API/CampusRoutes.py b/SE_API/CampusRoutes.py index c52fe9c..67dd8b2 100644 --- a/SE_API/CampusRoutes.py +++ b/SE_API/CampusRoutes.py @@ -66,7 +66,7 @@ def create_campus(token): #check if name already exists try: query = Campus.all() - query.filter("title = ", payload['title']) + query.filter("title =", payload['title']) for c in query.run(limit=1): return forbidden("Campus with same name already exists") except Exception as e: @@ -86,7 +86,6 @@ def create_campus(token): - @campus_routes.route('/api/campuses/getAll/', methods=['GET']) @auto.doc() def get_campuses(token): @@ -124,7 +123,11 @@ def get_campuses(token): query = Campus.all() for c in query.run(): arr.append(dict(json.loads(c.to_JSON()))) + print "ARR:" print arr + for c in arr: + print"c:" + print c if len(arr) != 0: return Response(response=json.dumps(arr), status=200, @@ -137,6 +140,63 @@ def get_campuses(token): return forbidden("Invalid Token") +@campus_routes.route('/api/campuses/deleteCampus//', methods=['DELETE']) +@auto.doc() +def deleteCampus(token,campusName): + """ + This Call will delete a specific campus +
+ Route Parameters
+ - seToken: 'seToken' + - title: 'campusName' +
+
+ Payload
+ - NONE
+
+
+ Response +
+ 202 - Deleted campus +
+ 204 - No Matching Campus Found +
+ ....
+ {
+ ...
+ }req
+ + ]
+ 400 - Bad Request +
+ 403 - Invalid token or not a lecturer!
+ """ + + if not is_lecturer(token): #todo: change to lecturer id + return forbidden("Invalid token or not a lecturer!") + + + user = get_user_by_token(token) + query = Campus.all() + query.filter('master_user_id =',user.key().id()) + + try: + query.filter('title =', campusName) + except Exception as e: + print e + return bad_request("invalid campus title attribute") + + + for c in query.run(): + db.delete(c) + db.save + return accepted("campus deleted") + + + return bad_request("no such campus found") + + + @campus_routes.route('/api/campuses/help') def documentation(): diff --git a/SE_API/CourseRoutes.py b/SE_API/CourseRoutes.py index 51a54a4..93c2db6 100644 --- a/SE_API/CourseRoutes.py +++ b/SE_API/CourseRoutes.py @@ -7,6 +7,8 @@ from GithubAPI.GithubAPI import GitHubAPI_Keys from google.appengine.ext import db import requests import datetime +from operator import itemgetter + from flask import Flask, request, render_template, redirect, abort, Response @@ -16,6 +18,8 @@ from flask.ext.autodoc import Autodoc # DB Models from models.Course import Course +from models.Campus import Campus +from models.Message import Message #Validation Utils Libs from SE_API.Validation_Utils import * @@ -27,6 +31,10 @@ course_routes = Blueprint("course_routes", __name__) auto = Autodoc() + +#---------------------------------------------------------- +# POST +#---------------------------------------------------------- @course_routes.route('/api/courses/create/', methods=['POST']) @auto.doc() def create_course(token): @@ -92,8 +100,6 @@ def create_course(token): print e return bad_request() - - db.put(course) db.save return Response(response=course.to_JSON(), @@ -102,6 +108,63 @@ def create_course(token): + +@course_routes.route('/api/courses/createMessage/', methods=['POST']) +@auto.doc() +def createMessage(token): + """ + This call will create a new Message in the DB +
+ Route Parameters
+ - seToken: 'seToken' +
+
+ Payload
+ - JSON Object, Example:
+ {
+ 'courseName': 'Advance Math',
+ 'message': 'The lecture today is canceled'
+ }
+
+
+ Response +
+ 201 - Created +
+ 400 - Bad Request +
+ 403 - Invalid token or not a lecturer + """ + if not request.data: + return bad_request("no data") + if not is_lecturer(token): #todo: change to lecturer id + return forbidden("Invalid token or not a lecturer!") + + user = get_user_by_token(token) + + #try to parse payload + try: + payload = json.loads(request.data) + except Exception as e: + return bad_request("here") + + try: + msg = Message(courseName=payload['courseName'], message=payload['message'], msgDate=datetime.datetime.now()) + except Exception as e: + print e + return bad_request("there") + + db.save(msg) + db.save + return created() + + + +#---------------------------------------------------------- +# GET +#---------------------------------------------------------- + + @course_routes.route('/api/courses/getCourseByCampusName/', methods=["GET"]) @auto.doc() def getCourseByCampusName(name): @@ -132,7 +195,7 @@ def getCourseByCampusName(name): """ arr = [] query = Course.all() - query.filter("campusName = ", name) + query.filter("campusName=", name) for c in query.run(): arr.append(dict(json.loads(c.to_JSON()))) @@ -146,6 +209,184 @@ def getCourseByCampusName(name): status=200, mimetype="application/json") +@course_routes.route('/api/courses/getMessagesByCourseName/', methods=["GET"]) +@auto.doc() +def getMessagesByCourseName(name): + """ + >This Call will return an array of all courses in a given campus +
+ Route Parameters
+ - name: 'campus name' +
+
+ Payload
+ - NONE +
+
+ Response +
+ 200 - JSON Example:
+ + {
+ 'courseName': 'Advance Math',
+ 'campusName': 'JCE',
+ 'startDate': '2015-14-3'
+ 'endDate': '2015-29-6'
+ 'taskFlag': 'False'
+ } +
+
+ """ + arr = [] + query = Message.all() + query.filter("courseName = ", name) + + for m in query.run(): + msgDic = dict(json.loads(m.to_JSON())) + #add a key 'forSortDate' for sorting dates + msgTime = datetime.datetime(msgDic['date']['year'], msgDic['date']['month'], msgDic['date']['day'], msgDic['date']['hour'], msgDic['date']['minute']) + msgDic['forSortDate'] = msgTime + arr.append(msgDic) + + arr = sorted(arr, key=itemgetter('forSortDate'), reverse=False) + for i in arr: + del i['forSortDate'] + print arr + + if len(arr) != 0: + return Response(response=json.dumps(arr), + status=200, + mimetype="application/json") + else: + return Response(response=[], + status=200, + mimetype="application/json") + +#---------------------------------------------------------- +# PUT +#---------------------------------------------------------- + + + + +#---------------------------------------------------------- +# DELETE +#---------------------------------------------------------- +@course_routes.route('/api/courses/deleteCourse//', methods=['DELETE']) +@auto.doc() +def deleteCourse(token,courseName): + """ + This Call will delete a specific course +
+ Route Parameters
+ - seToken: 'seToken' + - title: 'courseName' +
+
+ Payload
+ - NONE
+
+
+ Response +
+ 202 - Deleted campus +
+ 204 - No Matching Campus Found +
+ ....
+ {
+ ...
+ }req
+ + ]
+ 400 - Bad Request +
+ 403 - Invalid token or not a lecturer!
+ """ + + if not is_lecturer(token): #todo: change to lecturer id + return forbidden("Invalid token or not a lecturer!") + + + user = get_user_by_token(token) + query = Course.all() + query.filter('master_id =',user.key().id()) + + try: + query.filter('courseName =', courseName) + except Exception as e: + print e + return bad_request("invalid course title attribute") + + + for c in query.run(): + db.delete(c) + db.save + return accepted("course deleted") + + + return bad_request("no such course or not owner of course") + + +@course_routes.route('/api/courses/deleteCoursesByCampus//', methods=['DELETE']) +@auto.doc() +def deleteCoursesByCampus(token,campusName): + """ + This Call will delete a specific campus's courses +
+ Route Parameters
+ - seToken: 'seToken' + - title: 'campusName' +
+
+ Payload
+ - NONE
+
+
+ Response +
+ 202 - Deleted campus +
+ 204 - No Matching Campus Found +
+ ....
+ {
+ ...
+ }req
+ + ]
+ 400 - Bad Request +
+ 403 - Invalid token or not a lecturer!
+ """ + + if not is_lecturer(token): #todo: change to lecturer id + return forbidden("Invalid token or not a lecturer!") + + + user = get_user_by_token(token) + campus = get_campus_by_campusName(campusName) + if campus is None: + return bad_request("Not a campus!") + + #check user is owner of campus + if campus.master_user_id != user.key().id(): + return forbidden("lecturer is not owner of campus!") + + query = Course.all() + + try: + query.filter('campusName =', campusName) + except Exception as e: + print e + return bad_request("invalid course title attribute") + + for c in query.run(): + db.delete(c) + db.save + + return no_content() + @course_routes.route('/api/courses/help') def documentation(): diff --git a/SE_API/ProjectRoutes.py b/SE_API/ProjectRoutes.py index 18d2fb1..57afe8d 100644 --- a/SE_API/ProjectRoutes.py +++ b/SE_API/ProjectRoutes.py @@ -41,7 +41,7 @@ def create_project(token): {
'projectName': 'Advance Math',
'courseName': 'JCE',
- 'logo_url': 'http://location.domain.com/image.jpg'
+ 'logo_url': 'http://location.domain.com/image.jpg',
'gitRepository': 'http://location.git.com/somthing'
}

@@ -57,10 +57,12 @@ def create_project(token): if not request.data: return bad_request() payload = json.loads(request.data) - if not is_lecturer(token): #todo: change to lecturer id - return forbidden("Invalid token or not a lecturer!") + #if not is_lecturer(token): #todo: change to lecturer id + # return forbidden("Invalid token or not a lecturer!") user = get_user_by_token(token) + if user is None: + return bad_request("Wrong user Token") #todo: check legality diff --git a/SE_API/TaskRoutes.py b/SE_API/TaskRoutes.py new file mode 100644 index 0000000..de1ebff --- /dev/null +++ b/SE_API/TaskRoutes.py @@ -0,0 +1,238 @@ +__author__ = 'Aran' + +from flask import Blueprint +import json +from GithubAPI.GithubAPI import GitHubAPI_Keys + +from google.appengine.ext import db +import requests +import datetime +from operator import itemgetter + +from flask import Flask, request, render_template, redirect, abort, Response + +from flask.ext.github import GitHub +from flask.ext.cors import CORS, cross_origin +from flask.ext.autodoc import Autodoc + +# DB Models +from models.Task import Task +from models.Course import Course + +#Validation Utils Libs +from SE_API.Validation_Utils import * +from SE_API.Respones_Utils import * + + + + +task_routes = Blueprint("task_routes", __name__) +auto = Autodoc() + +@task_routes.route('/api/tasks/create/', methods=['POST']) +@auto.doc() +def create_task(token): + """ + This call will create a new Task in the DB +
+ Route Parameters
+ - seToken: 'seToken' +
+
+ Payload
+ - JSON Object, Example:
+ {
+ 'title' : self.title,
+ 'courseName' : self.course,
+ 'description' : self.description,
+ 'dueDate' : self.dueDate,
+ 'isClose' : self.membersId,
+ 'isDone' : self.isDone,
+ 'taskGrade' : self.taskGrade
+ }
+
+
+ Response +
+ 201 - Created +
+ 400 - Bad Request +
+ 403 - Invalid token or not a lecturer + """ + if not request.data: + return bad_request() + payload = json.loads(request.data) + if not is_lecturer(token): #todo: change to lecturer id + return forbidden("Invalid token or not a lecturer!") + + user = get_user_by_token(token) + #TODO: add seconds and minutes + #check the user(lecturer) is owner of the course + # try: + # arr = [] + # query = Course.all() + # query.filter('courseName =',payload['courseName']) + # for t in query.run(): + # arr.append(dict(json.loads(t.to_JSON()))) + # if len(arr) == 0: + # return bad_request("No such course") + # except Exception as e: + # print e + # return bad_request("Missing courseName") + + + #todo: check legality + #create Task object + try: + #parse dueDate + try: + date = datetime.date(payload['dueDate']['year'],payload['dueDate']['month'],payload['dueDate']['day']) + except Exception: + return bad_request("invalid dueDate format") + #TODO: add time. now, its only date + + task = Task(title=payload['title'], courseName=payload['courseName'], description=payload['description'], dueDate=date) + + #parse isClose + try: + task.isClose = payload['isClose'] + except Exception: + pass + + #parse isDone + try: + task.isDone = payload['isDone'] + except Exception: + pass + + #parse taskGrade + try: + task.taskGrade = payload['taskGrade'] + except Exception: + pass + + except Exception as e: + print e + return bad_request() + + db.put(task) + db.save + return created() + + + +@task_routes.route('/api/tasks/getClosestTask/', methods=["GET"]) +@auto.doc() +def getClosestTask(courseName): + """ + >This Call will return an array of all projects in a given course +
+ Route Parameters
+ - name: 'course name' +
+
+ Payload
+ - NONE +
+
+ Response +
+ 200 - JSON Example:
+ + {
+ 'projectName': 'Advance Math',
+ 'courseName': 'JCE',
+ 'grade': 98,
+ 'logo_url': 'http://location.domain.com/image.jpg',
+ 'gitRepository': 'http://location.git.com/somthing',
+ 'membersId': ['bob', 'dylan', 'quentin', 'terentino']
+ } +
+
+ """ + #get all tasks for a specific course + arr = [] + query = Task.all() + query.filter("courseName =", courseName) + index = -1 + count = -1 + closestDate = datetime.date(3000,1,1) + for t in query.run(): + count+=1 + if t.dueDate < closestDate: + closestDate = t.dueDate + index = count + arr.append(dict(json.loads(t.to_JSON()))) + + print arr + if len(arr) != 0: + return Response(response=json.dumps(arr[index]), + status=200, + mimetype="application/json") + else: + return no_content("no Tasks") + + + + +@task_routes.route('/api/tasks/getAllTasks/', methods=["GET"]) +@auto.doc() +def getAllTasks(courseName): + """ + >This Call will return an array of all projects in a given course +
+ Route Parameters
+ - name: 'course name' +
+
+ Payload
+ - NONE +
+
+ Response +
+ 200 - JSON Example:
+ + {
+ 'projectName': 'Advance Math',
+ 'courseName': 'JCE',
+ 'grade': 98,
+ 'logo_url': 'http://location.domain.com/image.jpg',
+ 'gitRepository': 'http://location.git.com/somthing',
+ 'membersId': ['bob', 'dylan', 'quentin', 'terentino']
+ } +
+
+ """ + + arr = [] + query = Task.all() + query.filter("courseName = ", courseName) + + for t in query.run(): + taskDic =dict(json.loads(t.to_JSON())) + #add a key 'forSortDate' for sorting dates + taskTime = datetime.datetime(taskDic['dueDate']['year'], taskDic['dueDate']['month'], taskDic['dueDate']['day']) + taskDic['forSortDate'] = taskTime + arr.append(taskDic) + + #sort array by date, and remove added key + arr = sorted(arr, key=itemgetter('forSortDate'), reverse=False) + for i in arr: + del i['forSortDate'] + + if len(arr) != 0: + return Response(response=json.dumps(arr), + status=200, + mimetype="application/json") + else: + return Response(response=[], + status=200, + mimetype="application/json") + + + +@task_routes.route('/api/tasks/help') +def documentation(): + return auto.html() \ No newline at end of file diff --git a/SE_API/Validation_Utils.py b/SE_API/Validation_Utils.py index 90df681..56da380 100644 --- a/SE_API/Validation_Utils.py +++ b/SE_API/Validation_Utils.py @@ -13,6 +13,14 @@ def get_user_by_token(token): return u return None +def get_campus_by_campusName(campusName): + query = Campus.all() + query.filter("title = ", campusName) + + for u in query.run(limit = 1): + return u + return None + def get_campus_by_suffix(suffix): query = Campus.all() query.filter("email_ending = ", suffix) diff --git a/models/Message.py b/models/Message.py new file mode 100644 index 0000000..fa1a456 --- /dev/null +++ b/models/Message.py @@ -0,0 +1,23 @@ +import json + +__author__ = 'Aran' +from google.appengine.ext import db + +class Message(db.Model): + courseName = db.StringProperty(required=True) + message = db.StringProperty(required=True) + msgDate = db.DateTimeProperty(required=True) + + def to_JSON(self): + data = { + 'courseName' : self.courseName, + 'message' : self.message, + 'date' : { + 'year': self.msgDate.year, + 'month': self.msgDate.month, + 'day': self.msgDate.day, + 'hour': self.msgDate.hour, + 'minute': self.msgDate.minute + } + } + return json.dumps(data) diff --git a/models/Task.py b/models/Task.py index 20119cc..e51ac40 100644 --- a/models/Task.py +++ b/models/Task.py @@ -1,24 +1,32 @@ import json - +import time __author__ = 'Aran' from google.appengine.ext import db + class Task(db.Model): title = db.StringProperty(required=True) - description = db.StringProperty(required=True) + courseName = db.StringProperty(required=True) + description = db.StringProperty(required=True,default=" ") dueDate = db.DateProperty(required=True) - isProject = db.BooleanProperty(required=True) - isClose = db.BooleanProperty(required=True) - isDone = db.BooleanProperty(required=True) - taskGrade = db.IntegerProperty(required=True) + #isProject = db.BooleanProperty(required=False) + isClose = db.BooleanProperty(required=True, default=False) + isDone = db.BooleanProperty(required=True, default=False) + taskGrade = db.IntegerProperty(required=True, default=0) def to_JSON(self): data = {'title' : self.title, + 'courseName' : self.courseName, 'description' : self.description, - 'dueDate' : self.dueDate, - 'isProject' : self.isProject, - 'isClose' : self.membersId, + 'dueDate' : { + 'year': self.dueDate.year, + 'month': self.dueDate.month, + 'day': self.dueDate.day + }, + #'isProject' : self.isProject, + 'isClose' : self.isClose, 'isDone' : self.isDone, 'taskGrade' : self.taskGrade, } return json.dumps(data) + diff --git a/templates/css/theme.css b/templates/css/theme.css index 45b271e..00e4f28 100644 --- a/templates/css/theme.css +++ b/templates/css/theme.css @@ -33,9 +33,9 @@ md-list .md-button { https://github.com/google/material-design-icons */ -/*p { +p { margin-left: 2em; -}*/ +} .menuBtn { background: transparent url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2ZXJzaW9uPSIxLjEiIHg9IjBweCIgeT0iMHB4IiB3aWR0aD0iMjRweCIgaGVpZ2h0PSIyNHB4IiB2aWV3Qm94PSIwIDAgMjQgMjQiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDI0IDI0IiB4bWw6c3BhY2U9InByZXNlcnZlIj4KPGcgaWQ9IkhlYWRlciI+CiAgICA8Zz4KICAgICAgICA8cmVjdCB4PSItNjE4IiB5PSItMjIzMiIgZmlsbD0ibm9uZSIgd2lkdGg9IjE0MDAiIGhlaWdodD0iMzYwMCIvPgogICAgPC9nPgo8L2c+CjxnIGlkPSJMYWJlbCI+CjwvZz4KPGcgaWQ9Ikljb24iPgogICAgPGc+CiAgICAgICAgPHJlY3QgZmlsbD0ibm9uZSIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0Ii8+CiAgICAgICAgPHBhdGggZD0iTTMsMThoMTh2LTJIM1YxOHogTTMsMTNoMTh2LTJIM1YxM3ogTTMsNnYyaDE4VjZIM3oiIHN0eWxlPSJmaWxsOiNmM2YzZjM7Ii8+CiAgICA8L2c+CjwvZz4KPGcgaWQ9IkdyaWQiIGRpc3BsYXk9Im5vbmUiPgogICAgPGcgZGlzcGxheT0iaW5saW5lIj4KICAgIDwvZz4KPC9nPgo8L3N2Zz4=) no-repeat center center; @@ -76,21 +76,28 @@ body.noscroll margin-top: 1em; margin-right: 1em; position: center; + -webkit-border-radius: 30%; -moz-border-radius: 30%; border-radius: 30%; + + } -.avatar img { - border-radius: 40px; - position:center; - width: 80px; - height: 80px; - margin: 6px; - -webkit-box-shadow: 2px 2px 5px 0px rgba(0,0,0,0.75); - -moz-box-shadow: 2px 2px 5px 0px rgba(0,0,0,0.75); - box-shadow: 2px 2px 5px 0px rgba(0,0,0,0.75); -} +/*.avatar { + background: rgba(0, 0, 0, 0.2); + }*/ + + .avatar img { + border-radius: 40px; + position:center; + width: 80px; + height: 80px; + margin: 6px; /*centers the image in the parent element */ + -webkit-box-shadow: 2px 2px 5px 0px rgba(0,0,0,0.75); + -moz-box-shadow: 2px 2px 5px 0px rgba(0,0,0,0.75); + box-shadow: 2px 2px 5px 0px rgba(0,0,0,0.75); + } /* Added BY devMatan */ @@ -104,8 +111,14 @@ body.noscroll }*/ -.campusAvatar img -{ + .campusAvatar img + { +/* + margin-top: 1em; + margin-right: 1em; + position: center; + */ + border-radius: 40px; position:center; width: 80px; @@ -144,24 +157,9 @@ body.noscroll margin-bottom: 10px; } -.feed +.md-avatar img { - overflow-y: scroll; - height: 350px; - /*width: 100%;*/ -} - -/*.feedMessages -{ - overflow: scroll; - height: 300px; - width: 100%; -} -.feedTasks -{ - overflow: scroll; - height: 300px; - width: 100%; + /*TODO*/ } .feedContent @@ -169,7 +167,7 @@ body.noscroll padding-left: 6%; font-size: 15px; display:table; -}*/ +} .md-no-sticky { @@ -183,6 +181,7 @@ body.noscroll border-radius: 150px; -webkit-border-radius: 150px; -moz-border-radius: 150px; + /*background: url(http://i61.tinypic.com/v86f7.png) no-repeat;*/ box-shadow: 0 0 8px rgba(0, 0, 0, .8); -webkit-box-shadow: 0 0 8px rgba(0, 0, 0, .8); -moz-box-shadow: 0 0 8px rgba(0, 0, 0, .8); @@ -257,6 +256,7 @@ body.noscroll -moz-border-radius: 100px; border-radius: 50px; width: 30%; + /*top: -40px;*/ position: relative; z-index: 50; } @@ -282,17 +282,8 @@ body.noscroll font-weight: bold; cursor: pointer; } - - .se-menu li:active{ - background-color: #B2B2B2; - text-shadow:#e0e0e0 1px 1px 0; - font-weight: bold; - } - - .se-menu .selected{ + .se-menu li .selected{ background-color: #E2E2E2; - text-shadow:#e0e0e0 1px 1px 0; - font-weight: bold; } .user-box{ @@ -302,6 +293,7 @@ body.noscroll .user-box img{ width: 100%; border: 4px #7f7f7f solid; + -webkit-border-radius: 5px; -moz-border-radius: 5px; border-radius: 5px; @@ -350,70 +342,26 @@ body.noscroll } -/* Colors*/ -.gray{ - background:#f5f5f5; -} -.aliceblue { - background: aliceblue; -} - .green { - background: #b9f6ca; -} - .yellow { - background: #ffff8d; -} - .blue { - background: #84ffff; -} - .purple { - background: #b388ff; -} - .red { - background: #ff8a80; -} -/* End Colors */ - -.whiteframedemoBasicUsage md-whiteframe { - background: #fff; - margin: 20px; - padding: 20px; +/* md-list-item .md-no-style.md-button, md-list-item.md-no-proxy.md-button { + font-size: inherit; + height: inherit; + text-align: left; + text-transform: none; + width: 100%; + white-space: normal; } -.tasksContent -{ - padding-left: 4px; - padding-right: 4px; - margin: 5px; - background-color: aliceblue; - overflow: scroll; - height:250; - width:500; -} -.messagesContent -{ - padding-left: 4px; - padding-right: 4px; - margin: 5px; - background-color: #f5f5f5; - overflow: scroll; - height:250; - width:500; -} -p.tasksFeed -{ - padding-left: 4px; - margin: 5px; - width:500; - height: auto; - background-color: aliceblue; - -} -p.messagesFeed -{ - padding-left: 4px; - margin: 5px; - width:500; - height: auto; - background-color: #f5f5f5; -} \ No newline at end of file +md-list-item, md-list-item .md-list-item-inner { + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-justify-content: flex-start; + -ms-flex-pack: start; + justify-content: flex-start; + -webkit-align-items: center; + -ms-flex-align: center; + align-items: center; + min-height: 48px; + }*/ + +/*End Effects for MD*/ diff --git a/templates/js/app.js b/templates/js/app.js index 3a9b514..86cbcc1 100644 --- a/templates/js/app.js +++ b/templates/js/app.js @@ -2,7 +2,7 @@ var DEBUG = true; var welcome = angular.module('welcome', ['ngMaterial', 'seHub.services', 'ngRoute' , 'ngCookies']); -var app = angular.module('SeHub', ['ngMaterial', 'ngRoute', 'seHub.services', 'ngCookies', 'chart.js']); +var app = angular.module('SeHub', ['ngMaterial', 'ngRoute', 'seHub.services', 'ngCookies']); welcome.config(function($mdThemingProvider) { @@ -41,11 +41,8 @@ app.config(['$routeProvider', '$locationProvider', .when('/Settings', { templateUrl: 'templates/views/settings.html', controller: 'settingsController' - }) - .when('/tasks', { - templateUrl: 'templates/views/tasks.html', - controller: 'tasksController' }); + } ]); diff --git a/templates/js/controllers/homeController.js b/templates/js/controllers/homeController.js index 2e1b19d..009a4f5 100644 --- a/templates/js/controllers/homeController.js +++ b/templates/js/controllers/homeController.js @@ -1,51 +1,71 @@ angular.module('SeHub') .controller('homeController', ['$scope', '$cookies', '$cookieStore', '$window', '$location', '$mdToast', '$mdDialog', 'apiService', '$rootScope', function ($scope, $cookies, $cookieStore, $window, $location, $mdToast, $mdDialog, apiService ,$rootScope) { - $scope.isStudent = false; - $scope.addMsg = false; - $scope.msgToPost = ""; - $scope.oldText = ""; + var imagePath = $scope.user.avatar_url; + $scope.phones = [ + { type: 'Home', number: '(972) 865-82861' }, + { type: 'Cell', number: '(972) 5251-32309' }, + ]; - var imagePath = $scope.user.avatar_url; - $scope.phones = [ - { type: 'Home', number: '(972) 865-82861' }, - { type: 'Cell', number: '(972) 5251-32309' }, - ]; + $scope.messages = [ + { + face : imagePath, + what: 'I need to go to luna-park', + who: 'Matan Bar Yosef', + when: '3:08PM', + notes: " Lets do something" + }, + { + face : imagePath, + what: 'Lets Lets Lets', + who: 'Matan Bar Yosef', + when: '4:33PM', + notes: " Lets go drink something" + }, + { + face : imagePath, + what: 'Let me tell you a secret', + who: 'Sagi Dayan', + when: '4:15PM', + notes: " I am S'ein" + }, + { + face : imagePath, + what: 'Listen to this!', + who: 'Aran Zaiger', + when: '6:15PM', + notes: " I am gaylord ultima!!" + }, + { + face : imagePath, + what: 'Hi?', + who: 'Etye Meyer', + when: '7:45AM', + notes: " I am mega gaylord ultima" + } + ]; - if($scope.user.isLecturer) - { - $scope.isStudent = false; - console.log("Lecturer Mode!"); - } - else - { - $scope.isStudent = true; - console.log("Student Mode!"); - } + $scope.tasks = [ + { + ExNum: '1', + dueDate: '23/06/15', + notes: " Build A Game: Scrabble" + }, + { + ExNum: '3', + dueDate: '30/06/15', + notes: " Static Array" + }, + { + ExNum: '4', + dueDate: '07/07/15', + notes: " Dynamic Array" + }, + ]; - $scope.addMessageClicked = function() - { - $scope.addMsg = true; // Reveal the "POST" Button - } - $scope.postMessageClicked = function(msg) // Posting the message itself - { - if(msg != null) - { - $scope.prevText = "- " + msg; - implementText = document.getElementById("msg").value; - $scope.prevText += "

"; - document.getElementById("bindText").innerHTML += $scope.prevText; - } - document.getElementById("msg").value = ''; - $scope.prevText = ''; - } - $scope.clearAllClicked = function() // Clear Screen from text - { - document.getElementById("bindText").innerHTML = ""; - } - // animation - $scope.isEnterd = top.setIsEnterd; + // animation + $scope.isEnterd = top.setIsEnterd; }]); \ No newline at end of file diff --git a/templates/js/controllers/mainController.js b/templates/js/controllers/mainController.js index f2eb0b4..1f175ab 100644 --- a/templates/js/controllers/mainController.js +++ b/templates/js/controllers/mainController.js @@ -53,7 +53,7 @@ angular.module('SeHub') "title": "Tasks", "icon": "fa fa-clipboard", "style": "", - "route": "/tasks" + "route": "/campuses" }, { "title": "Settings", "icon": "fa fa-cogs", diff --git a/templates/js/controllers/newTasksController.js b/templates/js/controllers/newTasksController.js new file mode 100644 index 0000000..3766a2f --- /dev/null +++ b/templates/js/controllers/newTasksController.js @@ -0,0 +1,23 @@ +angular.module('SeHub').controller('newTasksController', ['$scope', + function($scope) { + + + + $scope.componentTypes = [{ + "type": "textbox" + }, { + "type": "textarea" + }, { + "type": "checkbox" + }]; + + + + $scope.task = []; + + $scope.addComponent = function(){ + $scope.task.push($scope.newComp); + $scope.newComp = {}; + } + } +]); \ No newline at end of file diff --git a/templates/js/controllers/registerController.js b/templates/js/controllers/registerController.js index 6ce4d08..071096c 100644 --- a/templates/js/controllers/registerController.js +++ b/templates/js/controllers/registerController.js @@ -83,7 +83,7 @@ angular.module('SeHub') console.log("DONE - 200"); $mdDialog.show($mdDialog.alert().title('E-mail Verification').content('A verification e-mail has been sent to your email address.') .ariaLabel('Email verification alert dialog').ok('Got it!').targetEvent(ev)); // Pop-up alert for e-mail verification - // TODO ADD- delete cookies and redirect only after pressed 'Got it' + // TODO ADD delete cookies and redirect only after pressed 'Got it' $cookieStore.remove("com.sehub.www"); // Removing the cookies $window.location.href = 'http://se-hub.appspot.com'; // Reference to 'welcome' page }).error(function() @@ -117,6 +117,8 @@ angular.module('SeHub') var result = /^([\w-]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$/i; if (!result.test(email)) // TODO Fix when success to show mdDialog until 'Got it' clicked { + console.log(email + ", Error in email, should alert"); + // alert('Please provide a valid e-mail address'); $mdDialog.show($mdDialog.alert().title('Error - E-mail Verification').content('An error has occured in your e-mail address.') .ariaLabel('Email verification error alert dialog').ok('Got it!').targetEvent(email)); } diff --git a/templates/js/controllers/settingsController.js b/templates/js/controllers/settingsController.js index 35c9531..81a4a98 100644 --- a/templates/js/controllers/settingsController.js +++ b/templates/js/controllers/settingsController.js @@ -35,13 +35,7 @@ angular.module('SeHub') $scope.profileMode = "Save Profile"; $scope.profileModeIcon = "fa fa-floppy-o"; } else { - apiService.updateUser(token, $scope.user).success(function(data) { - console.info('User Saved'); - dataService.userBrodcast($scope.user); - - }).error(function(e) { - console.error('Fail To Save User'); - }); + dataService.userBrodcast($scope.user); $scope.profileMode = "Edit Profile"; $scope.profileModeIcon = "fa fa-pencil"; } @@ -80,14 +74,5 @@ angular.module('SeHub') }]; - $scope.labels = ['Commits', 'Issues Assigned', 'Messages', 'Open Tasks']; - $scope.series = ['Project A', 'Project B']; - - $scope.data = [ - [54, 3, 15, 3], - [28, 48, 40, 3] - ]; - - } ]); \ No newline at end of file diff --git a/templates/views/home.html b/templates/views/home.html index cd2fc49..7b2fc30 100644 --- a/templates/views/home.html +++ b/templates/views/home.html @@ -22,93 +22,47 @@ -
- -
-
- -

Messages

-
-
-
- -

Tasks

-
-
+ + +
+
+ Messages + +
+ {{item.who}} + + +
+

+ +

{{ item.who }}

+
{{ item.what }}
+
{{ item.notes }}
+
{{ item.when }}
+
+
+
-
-
- -

-
-
-
- -

- For Task 3 Press: Task #3 -

- For Task 4 Press: Task #4 -

- For Task 5 Press: Task #5 -

- For Task 6 Press: Task #6 -

- For Task 7 Press: Task #7 -

- For Task 8 Press: Task #8 -

-
-
-
-
- Add Message -
-
-
- Post - Clear All -
-
- - - - -
- -
-
- -
-
- -

Messages

-
-
-
- -

Tasks

-
-
-
-
-
- -

-
-
-
- -

- For Task 3 Press: Task #3 -

- For Task 4 Press: Task #4 -

- For Task 5 Press: Task #5 -

- -
-
-
-
-
+
+
+
+
+ + + + Tasks + + +
+ +
Ex: {{ item.ExNum }}
+
Task Title: {{ item.notes }}
+
Due Date: {{ item.dueDate }}
+
+
+
+
+
+
+
\ No newline at end of file diff --git a/templates/views/index.html b/templates/views/index.html index f1fef9e..c683489 100644 --- a/templates/views/index.html +++ b/templates/views/index.html @@ -6,10 +6,6 @@ - - - - @@ -83,14 +79,6 @@ - - - - - - - - diff --git a/templates/views/newTask.html b/templates/views/newTask.html new file mode 100644 index 0000000..434eeca --- /dev/null +++ b/templates/views/newTask.html @@ -0,0 +1,48 @@ +
+
+
+

+ Task Info: +

+
+ +
+ +
+

+ Add A component: +

+
+
+ Select Type: + + {{component.type}} + +
+
+ + + + +
+
+ + Mandatory?: {{ newComp.isMandatory}} + +
+
+
+ Add Component +
+ +
+ +

+ Task Preview: +

+

{{task.toString()}}

+
+ +
\ No newline at end of file diff --git a/templates/views/settings.html b/templates/views/settings.html index 8121fb4..7f07403 100644 --- a/templates/views/settings.html +++ b/templates/views/settings.html @@ -55,8 +55,6 @@
-