diff --git a/app.js b/app.js index 9d43283..4b3ce02 100644 --- a/app.js +++ b/app.js @@ -11,6 +11,7 @@ var projects = require('./routes/projects'); var events = require('./routes/events'); var members = require('./routes/members'); var about = require('./routes/about'); +var dashboard = require('./routes/dashboard'); var app = express(); @@ -53,6 +54,7 @@ app.use('/projects/', projects); app.use('/', events); app.use('/members', members); app.use('/about', about); +app.use('/dashboard', dashboard); // catch 404 and forward to error handler app.use(function(req, res, next) { diff --git a/public/images/projects/cs website/.DS_Store b/public/images/projects/cs website/.DS_Store index 42a5f59..5008ddf 100644 Binary files a/public/images/projects/cs website/.DS_Store and b/public/images/projects/cs website/.DS_Store differ diff --git a/routes/TEMP_schema.js b/routes/TEMP_schema.js index cf90048..a6ed23e 100644 --- a/routes/TEMP_schema.js +++ b/routes/TEMP_schema.js @@ -1,86 +1,13 @@ //This will act as temporary database placeholder - - -function Project( id, title, description, description_short, status, post, milestones, links, images ) -{ - this.id = id; - this.title = title; - this.description = description; - this.description_short = description_short; - this.status = status; - this.post = post; - this.milestones = milestones; - this.links = links; - this.images = images; -} - -function Member( id, first_name, last_name, bio, bio_short, links, email, languages ) -{ - this.id = id; - this.first_name = first_name; - this.last_name = last_name; - this.bio = bio; - this.bio_short = bio_short; - this.links = links; - this.email = email; - this.languages = languages; -} - -function ProjectsMembers( id, project_id, member_id, role, assignedArea ) -{ - this.id = id; - this.project_id = project_id; - this.member_id = member_id; - this.role = role; - - this.assignedArea = assignedArea; -} - -function ProjectAreaRequests( id, project_id, title, description, project_interest, nPositions, assets, author_id) -{ - this.id = id; - this.project_id = project_id; - this.title = title; - this.description = description; - this.project_interest = project_interest; - this.nPositions = nPositions; - this.assets = assets; - this.author_id = author_id; -} - -function ProjectEvent( id, project_id, title, description, description_short, location, date_range, media) -{ - this.id = id; - this.project_id = project_id; - this.title = title; - this.description = description; - this.description_short = description_short; - this.location = location; - this.date_range = date_range; - this.media = media; -} - -function Event( id, title, description, description_short, location, date_range, media) -{ - this.id = id; - this.title = title; - this.description = description; - this.description_short = description_short; - this.location = location; - this.date_range = date_range; - this.media = media; -} - -function ClubOfficers( id, member_id, position_title, swatch) -{ - this.id = id; - this.member_id = member_id; - this.position_title = position_title; - this.swatch = swatch; -} +var Project = require('./modules/projects') +var Member = require('./modules/members') +var ProjectsMembers = require('./modules/projectsmembers') +var ProjectAreaRequest = require('./modules/ProjectAreaRequest') +var ProjectEvent = require('./modules/ProjectEvent') +var NonProjectEvent = require('./modules/NonProjectEvent') //9 -var projects = [ +var _projects = [ new Project(1,'CS Website', 'Not only will this new website show off each of our projects, tasks and quick links to all of our resources and tools the club is using, but it will also become a hub for our new and current members to digest a project and become a great help! Any new top news, upcoming event, and project updates will be posted to our site for everyone to view. My vision in this website is for everyone, members, programmers, and potental members to stay informed about progress and details in every project. Members and potental members can comment and give feedback to any project as a comment feed in each project. Each project contains a detailed description about goals, requirments, and the platform as well as images, list of participating members, and a timeline of events and achivements. As for members, a club member can create a profile and fill in a picture, short and long bios, and show off any work done outside of the club. Quick links will show all of the projects, listed on the website, each member has participated in. As for the About and Contact Us pages, egeryone will have the opprotunuty to ask how to join the club and learn about what we do.', 'A new website to showoff what we do as a club', @@ -231,7 +158,7 @@ var projects = [ ]; //25 -var members = [ +var _members = [ new Member(2, 'Erick', 'Sanchez', 'Began programming since GameMaker was installed on the computer of my 8th grade English class. Made a game from complete scratch and messing around with my friends watching me make a face follow the cursor then something shooting at the face! And this is how Face Game was made, a simple concept turned into something amusing. This game was a hit for too many students during English D: But I expanded to the iPhone, the Mac World! And I\'ll never go back, to PC *cough*. I planned to recreate the Face Game on the iOS with all new faces and cooler stuff because it\'s on the phone. Butt I was too intrested in making other iOS apps and created a few utilities enough to make myself noticed for a client. I programmed and designed an application for a client, George Moskoff. George was the sole creator of Kids-Self Evaluation. This app is sold on the iPhone AppStore. I learned to making my own apps to sell on the AppStore, Mulah, iLogs, Assigned, and whatever else comes out of my head :)', 'Making apps on the iPhone and on other platforms.', @@ -481,16 +408,16 @@ var members = [ ) ]; -var members_projects = [ +var _members_projects = [ //Micromouse - new ProjectsMembers( 15 , 0 , 9 , 'Co-Lead Developer' ), - new ProjectsMembers( 0 , 0 , 0 , 'Co-Lead Developer' ), - new ProjectsMembers( 3 , 0 , 1 , 'Co-Lead Developer' ), + new ProjectsMembers( 15 , 0 , 9 , 'Co-Lead Developer', true ), + new ProjectsMembers( 0 , 0 , 0 , 'Co-Lead Developer', true ), + new ProjectsMembers( 3 , 0 , 1 , 'Co-Lead Developer', true ), new ProjectsMembers( 4 , 0 , 2 , 'Programmer' ), new ProjectsMembers( 5 , 0 , 3 , 'Programmer' ), //CS Website - new ProjectsMembers( 6 , 1 , 2 , 'Project Manager' ), - new ProjectsMembers( 1 , 1 , 0 , 'Lead Developer' ), + new ProjectsMembers( 6 , 1 , 2 , 'Project Manager', true ), + new ProjectsMembers( 1 , 1 , 0 , 'Lead Developer', true ), new ProjectsMembers( 49 , 1 , 23 , 'Programmer' ), new ProjectsMembers( 33 , 1 , 16 , 'Programmer' ), new ProjectsMembers( 34 , 1 , 19 , 'Programmer' ), @@ -499,19 +426,19 @@ var members_projects = [ new ProjectsMembers( 12 , 1 , 8 , 'Programmer' ), new ProjectsMembers( 26 , 1 , 13 , 'Programmer' ), //2D Platformer - new ProjectsMembers( 10 , 2 , 2 , 'Project Manager' ), + new ProjectsMembers( 10 , 2 , 2 , 'Project Manager', true ), //Function Fighters - new ProjectsMembers( 2 , 3 , 1 , 'Project Manager & AI Player' ), + new ProjectsMembers( 2 , 3 , 1 , 'Project Manager & AI Player', true ), new ProjectsMembers( 9 , 3 , 3 , 'Beta Tester, AI Player' ), new ProjectsMembers( 43 , 3 , 14 , 'AI Player' ), new ProjectsMembers( 7 , 3 , 2 , 'AI Player' ), new ProjectsMembers( 8 , 3 , 4 , 'AI Player' ), new ProjectsMembers( 36 , 3 , 19 , 'AI Player' ), //Quad-Copter - new ProjectsMembers( 14 , 4 , 9 , 'Lead Developer' ), - new ProjectsMembers( 13 , 4 , 3 , 'Developer' ), + new ProjectsMembers( 14 , 4 , 9 , 'Lead Developer', true ), + new ProjectsMembers( 13 , 4 , 3 , 'Developer', true ), //Line Follower - new ProjectsMembers( 17 , 5 , 4 , 'Project Manager' ), + new ProjectsMembers( 17 , 5 , 4 , 'Project Manager', true ), new ProjectsMembers( 18 , 5 , 1 , 'Lead Developer' ), new ProjectsMembers( 19 , 5 , 3 , 'Developer' ), new ProjectsMembers( 25 , 5 , 10 , 'Programmer' ), @@ -521,11 +448,11 @@ var members_projects = [ new ProjectsMembers( 23 , 5 , 12 , 'Programmer' ), new ProjectsMembers( 21 , 5 , 2 , 'Programmer' ), //Retailer - new ProjectsMembers( 28 , 6 , 2 , 'Project Manager' ), + new ProjectsMembers( 28 , 6 , 2 , 'Project Manager', true ), new ProjectsMembers( 29 , 6 , 14 , 'Developer' ), new ProjectsMembers( 39 , 6 , 18 , 'Programmer' ), //srjc-scheduler - new ProjectsMembers( 30 , 7 , 0 , 'Project Founder' ), + new ProjectsMembers( 30 , 7 , 0 , 'Project Founder', true ), new ProjectsMembers( 31 , 7 , 1 , 'Developer' ), new ProjectsMembers( 50 , 7 , 20 , 'Developer' ), new ProjectsMembers( 32 , 7 , 2 , 'Programmer' ), @@ -533,18 +460,18 @@ var members_projects = [ new ProjectsMembers( 35 , 7 , 19 , 'Programmer' ), new ProjectsMembers( 47 , 7 , 11 , 'Programmer' ), //Dreamscape - new ProjectsMembers( 36 , 8 , 15 , 'Project Manager' ), + new ProjectsMembers( 36 , 8 , 15 , 'Project Manager', true ), new ProjectsMembers( 37 , 8 , 2 , 'Programmer' ), new ProjectsMembers( 40 , 8 , 17 , 'Programmer' ), new ProjectsMembers( 42 , 8 , 14 , 'Programmer' ), //Club App - new ProjectsMembers( 38 , 9 , 2 , 'Project Manager' ), + new ProjectsMembers( 38 , 9 , 2 , 'Project Manager', true ), new ProjectsMembers( 49 , 9 , 20 , 'Developer' ), new ProjectsMembers( 46 , 9 , 19 , 'Programmer' ), new ProjectsMembers( 45 , 9 , 16 , 'Programmer' ), new ProjectsMembers( 48 , 9 , 11 , 'Programmer' ), //ShortLink - new ProjectsMembers( 51 , 10 , 12 , 'Project Manager'), + new ProjectsMembers( 51 , 10 , 12 , 'Project Manager', true ), new ProjectsMembers( 52 , 10 , 2 , 'Developer') ]; //50 @@ -558,9 +485,9 @@ var members_projects = [ //11 -var project_area_requests = [ +var _project_area_requests = [ //CS Website - new ProjectAreaRequests( 0, 1,"Front-End Developers", + new ProjectAreaRequest( 0, 1,"Front-End Developers", "Help program and design the front-end of our website. This will not only help mask and structure our website, but also help make this site responsive to all platforms.", ":4", 3, [ @@ -569,7 +496,7 @@ var project_area_requests = [ ], 2 ), - new ProjectAreaRequests( 1, 1,"Back-End Developers", + new ProjectAreaRequest( 1, 1,"Back-End Developers", "Check out MongoDB for our technologies for backend", ":3", 2, [ @@ -578,7 +505,7 @@ var project_area_requests = [ 2 ), //function-fighters - new ProjectAreaRequests( 2, 3,"AI Players", + new ProjectAreaRequest( 2, 3,"AI Players", "", "Welcome!:2", "∞", [ @@ -587,7 +514,7 @@ var project_area_requests = [ 1 ), //Line-Follower - new ProjectAreaRequests( 11, 5,"Hardware Designers", + new ProjectAreaRequest( 11, 5,"Hardware Designers", "", ":3", 0, [ @@ -597,7 +524,7 @@ var project_area_requests = [ 2 ), //Retailer - new ProjectAreaRequests( 3, 6,"Game Developers", + new ProjectAreaRequest( 3, 6,"Game Developers", "", ":5", 4, [ @@ -605,7 +532,7 @@ var project_area_requests = [ ], 2 ), - new ProjectAreaRequests( 4, 6,"Graphic/Asset Designers", + new ProjectAreaRequest( 4, 6,"Graphic/Asset Designers", "", ":3", 1, [ @@ -614,7 +541,7 @@ var project_area_requests = [ ], 2 ), - new ProjectAreaRequests( 5, 6,"Back-End Developer", + new ProjectAreaRequest( 5, 6,"Back-End Developer", "", ":1", 1, [], @@ -623,7 +550,7 @@ var project_area_requests = [ ]; //0 -var project_events = [ +var _project_events = [ new ProjectEvent( 0, 5,'RoboGames—Line Follower', 'description', 'Robotics competition for our line follower project.', @@ -636,8 +563,8 @@ var project_events = [ ) ] -var events = [ - new Event(0, '2017 Make-a-thon', +var _events = [ + new NonProjectEvent(0, '2017 Make-a-thon', 'description', 'Rohnert Park\'s Make-a-thon event!', 'Rohnert Park, CA', @@ -648,7 +575,7 @@ var events = [ {caption: 'The Teams', image: '2017 make-a-thon/club.jpg', url: 'http://drive.google.com/uc?export=view&id=0B3wyRcLxpH4jcU93OTJUdlRpNG8'} ] ), - new Event( 1,'Hackathon', + new NonProjectEvent( 1,'Hackathon', 'description', '', 'San Fransisco, CA', @@ -657,7 +584,7 @@ var events = [ {caption: 'Developer Week', image: 'dev-week/hackathon-1.png', url: 'http://www.developerweek.com/hackathon/'} ] ), - new Event( 2,' Keysight Trip', + new NonProjectEvent( 2,' Keysight Trip', 'Check out this trip at the weekly meeting!', '', '1400 Fountaingrove Pkwy, Santa Rosa, CA 95403', @@ -667,7 +594,7 @@ var events = [ ] //Global instances for icons -var services = { +var _services = { noone: { name: 'Link', @@ -712,7 +639,15 @@ var services = { } }; -var club_officers = +function ClubOfficers( id, member_id, position_title, swatch) +{ + this.id = id; + this.member_id = member_id; + this.position_title = position_title; + this.swatch = swatch; +} + +var _club_officers = [ new ClubOfficers( 0, 2, 'President', "#055B75"), new ClubOfficers( 1, 1, 'Vice
President', "#0D94BD"), @@ -723,12 +658,113 @@ var club_officers = ]; module.exports = { - projects, - members, - members_projects, - project_area_requests, - project_events, - events, - services, - club_officers + projects: _projects, + members: _members, + members_projects: _members_projects, + project_area_requests: _project_area_requests, + project_events: _project_events, + events: _events, + services: _services, + club_officers: _club_officers }; + +var helper = require('./helper_methods') + +Project.prototype.isProjectAdmin = function(member) +{ + for ( var link of _members_projects) { + if (link.project_id == this.id) { + if (link.member_id == member.id) { + return (link.admin == true ? true : false); + } + } + } + + return false; +} + +Project.prototype.isProjectMember = function(member) +{ + var isFound = false; + + for ( var link of _members_projects) { + if (link.project_id == this.id) { + if (link.member_id == member.id) { + isFound = true; + } + } + } + + return isFound; +} + +Project.prototype.findProjectMembers = function() +{ + var members = []; + + for( var member_project of _members_projects ) + { + if ( member_project.project_id == this.id ) + { + var potentialMember = helper.findIdInCollection(member_project.member_id, _members); + + if (potentialMember !== undefined ) { + potentialMember.role = member_project.role; + members.push( potentialMember); + } + } + } + + return members; +} + +Project.prototype.findProjectAreaRequests = function() +{ + var requests = []; + + for ( var area_request of _project_area_requests ) + { + if (this.id == area_request.project_id) + { + requests.push(area_request); + } + } + + return requests; +} + +Project.prototype.findProjectEvents = function() +{ + var events = []; + + for ( var event of _project_events ) + { + if (this.id == event.project_id) + { + events.push(event); + } + } + + return events; +} + +Member.prototype.findProjectsForMember = function() +{ + var projects = []; + + for ( var member_project of _members_projects ) + { + if ( member_project.member_id == this.id ) + { + var potentialProject = helper.findIdInCollection(member_project.project_id, _projects); + + if (potentialProject !== undefined ) { + potentialProject.role = member_project.role; + projects.push( potentialProject); + } + } + + } + + return projects; +} \ No newline at end of file diff --git a/routes/dashboard.js b/routes/dashboard.js new file mode 100644 index 0000000..5b8bac7 --- /dev/null +++ b/routes/dashboard.js @@ -0,0 +1,110 @@ +var express = require('express'); +var tempDB = require('./TEMP_schema'); +var helper = require('./helper_methods'); +var router = express.Router(); + +var login = null; + +login = { + id: 1, + token: "123456789", + member: tempDB.members[0], + first_name: "Erick", + last_name: "Sanchez", + isAdmin: true +} + +login.name = login.first_name + ' ' + login.last_name; + +router.get('/', function(req, res, next) { + var navbar = { + active: 'dashboard', + links: [] + }; + + var projects = tempDB.projects; + + var myProjects = []; + + for ( var project of projects ) { + if (project.isProjectAdmin(login.member)) + myProjects.push(project); + } + + for ( var project of myProjects) { + project.members = project.findProjectMembers(); + } + + res.render('dashboard', {dashboard: [], title: 'CS Dashboard', token: login, navbar: navbar, my_projects: myProjects, my_events: helper.findAllEvents().upcoming_events, helper: helper}); +}); + +router.get('/projects', function(req, res, next) { + var navbar = { + active: 'projects', + links: [] + }; + + var projects = tempDB.projects; + + for ( var project of projects) { + project.members = project.findProjectMembers(); + project.admin = project.isProjectAdmin(login.member); + project.isMember = project.isProjectMember(login.member); + } + + projects.sort(function(a,b) { + if (a.admin == true && b.admin == false) + return -1; + if (b.admin == true && a.admin == false ) + return 1; + + return 0; + }); + + res.render('dashboard-projects', {dashboard: [], title: 'CS Dashboard - Projects', projects: projects, token: login, navbar: navbar, helper: helper}); + +}); + +router.get('/projects/:projectID', function(req, res, next) { + var navbar = { + active: 'projects', + links: [] + }; + + var project = helper.findIdInCollection(req.params.projectID, tempDB.projects); + + if (project.isProjectAdmin(login.member) || login.isAdmin) + navbar.links.push({name: "Edit", url: "edit/" + req.params.projectID}); + + if (project.isProjectMember(login.member)) { + if (login.isAdmin) + navbar.links.push({name: "Unjoin", url: "#"}); + } else { + if (login.isAdmin) + navbar.links.push({name: "Join", url: "#"}); + else + navbar.links.push({name: "Request to Join", url: "#"}); + } + + navbar.links.push({name: "List of Projects", url: "/dashboard/projects", active: true}); + + res.render('dashboard-project', {dashboard: ['hideSidebar'], title: 'Edit Project', project: project, token: login, navbar: navbar, helper: helper}); +}); + +router.get('/projects/edit/:projectID', function(req, res, next) { + + var project = helper.findIdInCollection(req.params.projectID, tempDB.projects); + + var navbar = { + active: 'projects', + links: [ + {name: "Go Back", url: "/dashboard/projects/" + project.id}, + {name: "Add a Member", url: ""}, + {name: "Save Changes", url: "#", active: true} + ] + }; + + res.render('dashboard-project-edit', {dashboard: ['hideSidebar'], title: 'Edit Project', project: project, token: login, navbar: navbar, helper: helper}); +}); + +module.exports = router; diff --git a/routes/events.js b/routes/events.js index e2aaede..15664ee 100644 --- a/routes/events.js +++ b/routes/events.js @@ -29,13 +29,12 @@ router.get('/events/:eventID', function(req, res, next) { links: [] }; - var event = helper.findProjectEventForID(tempDB.events, req.params.eventID); + var event = helper.findIdInCollection(req.params.eventID, tempDB.events); res.render('event', { title: 'CS Club - Events', event: event, navbar: navbar }); }); - /* GET Project Event Page. */ router.get('/project-events/:eventID', function(req, res, next) { var navbar = { @@ -43,8 +42,8 @@ router.get('/project-events/:eventID', function(req, res, next) { links: [] }; - var event = helper.findProjectEventForID(tempDB.project_events, req.params.eventID); - event.project = helper.findProjectForID(tempDB.projects, event.project_id); + var event = helper.findIdInCollection(req.params.eventID, tempDB.project_events); + event.project = helper.findIdInCollection(event.project_id, tempDB.projects); res.render('event', { title: 'CS Club - Events', event: event, navbar: navbar }); }); diff --git a/routes/helper_methods.js b/routes/helper_methods.js index bd6827b..0f77454 100644 --- a/routes/helper_methods.js +++ b/routes/helper_methods.js @@ -1,6 +1,19 @@ var tempDB = require('./TEMP_schema'); var pluralize = require('pluralize'); +function findIdInCollection(id,collection) +{ + var found = undefined; + for (var item of collection) { + if (id == item.id) { + found = item; + break; + } + } + + return found; +} + var trimURL = function trimURL(url) { var start = -1, end = -1, length = url.length, i = 0; while ( i < length) { @@ -16,116 +29,6 @@ var trimURL = function trimURL(url) { return url.substring(start, end); } -function findProjectForID( projects, id ) -{ - var found; - for( var project of projects) - { - if (project.id == id) - found = project; - } - - return found; - -} - -function findProjectMembers( project ) -{ - var members = []; - - for( var member_project of tempDB.members_projects ) - { - if ( member_project.project_id == project.id ) - { - var potentialMember = findMemberForID(tempDB.members,member_project.member_id); - - if (potentialMember !== undefined ) { - potentialMember.role = member_project.role; - members.push( potentialMember); - } - } - } - - return members; -} - -function findProjectAreaRequests( project ) -{ - var requests = []; - - for ( var area_request of tempDB.project_area_requests ) - { - if (project.id == area_request.project_id) - { - requests.push(area_request); - } - } - - return requests; -} - -function findProjectEvents( project ) -{ - var events = []; - - for ( var event of tempDB.project_events ) - { - if (project.id == event.project_id) - { - events.push(event); - } - } - - return events; -} - -function findProjectEventForID( events, id ) -{ - var found; - for ( var event of events) - { - if (event.id == id) - found = event; - } - - return found; - -} - -function findProjectsForMember( member ) -{ - var projects = []; - - for ( var member_project of tempDB.members_projects ) - { - if ( member_project.member_id == member.id ) - { - var potentialProject = findProjectForID(tempDB.projects,member_project.project_id); - - if (potentialProject !== undefined ) { - potentialProject.role = member_project.role; - projects.push( potentialProject); - } - } - - } - - return projects; -} - -function findMemberForID( members, id ) -{ - var found; - for( var member of members) - { - if (member.id == id) - found = member; - } - - return found; - -} - function findAllEvents() { var events = tempDB.project_events.concat(tempDB.events); @@ -215,13 +118,7 @@ function replaceColorTitle(project_interest) } module.exports = { - findProjectForID, - findProjectMembers, - findProjectAreaRequests, - findProjectEvents, - findProjectEventForID, - findProjectsForMember, - findMemberForID, + findIdInCollection, findAllEvents, findClubOfficers, replaceColorIntensity, diff --git a/routes/index.js b/routes/index.js index 1cf1797..d5bdc9e 100644 --- a/routes/index.js +++ b/routes/index.js @@ -32,12 +32,12 @@ router.get('/', function(req, res, next) { var projects = tempDB.projects; for ( var project of projects) { - project.members= helper.findProjectMembers(project); - project.areaRequests= helper.findProjectAreaRequests(project); + project.members= project.findProjectMembers(); + project.areaRequests= project.findProjectAreaRequests(); for ( var request of project.areaRequests) { request.project_interest_color = helper.replaceColorIntensity({interest: request.project_interest}); } - project.events = helper.findProjectEvents( project); + project.events = project.findProjectEvents(); } res.render('index', { title: 'CS Club', projects: projects, navbar: navbar, canidates: results, helper: helper}); @@ -101,7 +101,7 @@ router.get('/join/submit', function(req, res, next) { var projects = tempDB.projects.slice(0,4); for ( var project of projects) { - project.members= helper.findProjectMembers(project); + project.members= project.findProjectMembers(); } res.render('submit', { title: 'CS Club', results: recipient, club_officers: helper.findClubOfficers(), popular_projects: projects, upcoming_events: helper.findAllEvents().upcoming_events, navbar: navbar, helper: helper}); diff --git a/routes/members.js b/routes/members.js index c2e91e3..f538e0d 100644 --- a/routes/members.js +++ b/routes/members.js @@ -23,7 +23,7 @@ router.get('/', function(req, res, next) { for ( var member of members) { - member.numberOfProjects = helper.findProjectsForMember( member).length; + member.numberOfProjects = member.findProjectsForMember().length; } res.render('members', { title: 'CS Club - Members (' + members.length + ')', members: members, officers: tempDB.club_officers, navbar: navbar, helper: helper}); @@ -31,9 +31,9 @@ router.get('/', function(req, res, next) { /* GET member page. */ router.get('/:memberID', function(req, res, next) { - var member = helper.findMemberForID(tempDB.members,req.params.memberID); + var member = helper.findIdInCollection(req.params.memberID, tempDB.members); - member.projects = helper.findProjectsForMember(member); + member.projects = member.findProjectsForMember(); var navbar = { active: 'members', diff --git a/routes/modules/NonProjectEvent.js b/routes/modules/NonProjectEvent.js new file mode 100644 index 0000000..74ddeb5 --- /dev/null +++ b/routes/modules/NonProjectEvent.js @@ -0,0 +1,10 @@ +module.exports = function Event( id, title, description, description_short, location, date_range, media) +{ + this.id = id; + this.title = title; + this.description = description; + this.description_short = description_short; + this.location = location; + this.date_range = date_range; + this.media = media; +} \ No newline at end of file diff --git a/routes/modules/ProjectAreaRequest.js b/routes/modules/ProjectAreaRequest.js new file mode 100644 index 0000000..d3f4e9e --- /dev/null +++ b/routes/modules/ProjectAreaRequest.js @@ -0,0 +1,11 @@ +module.exports = function ProjectAreaRequests( id, project_id, title, description, project_interest, nPositions, assets, author_id) +{ + this.id = id; + this.project_id = project_id; + this.title = title; + this.description = description; + this.project_interest = project_interest; + this.nPositions = nPositions; + this.assets = assets; + this.author_id = author_id; +} \ No newline at end of file diff --git a/routes/modules/ProjectEvent.js b/routes/modules/ProjectEvent.js new file mode 100644 index 0000000..e504047 --- /dev/null +++ b/routes/modules/ProjectEvent.js @@ -0,0 +1,11 @@ +module.exports = function ProjectEvent( id, project_id, title, description, description_short, location, date_range, media) +{ + this.id = id; + this.project_id = project_id; + this.title = title; + this.description = description; + this.description_short = description_short; + this.location = location; + this.date_range = date_range; + this.media = media; +} \ No newline at end of file diff --git a/routes/modules/members.js b/routes/modules/members.js new file mode 100644 index 0000000..70230ac --- /dev/null +++ b/routes/modules/members.js @@ -0,0 +1,11 @@ +module.exports = function Member( id, first_name, last_name, bio, bio_short, links, email, languages ) +{ + this.id = id; + this.first_name = first_name; + this.last_name = last_name; + this.bio = bio; + this.bio_short = bio_short; + this.links = links; + this.email = email; + this.languages = languages; +} \ No newline at end of file diff --git a/routes/modules/projects.js b/routes/modules/projects.js new file mode 100644 index 0000000..88231d4 --- /dev/null +++ b/routes/modules/projects.js @@ -0,0 +1,12 @@ +module.exports = function Project( id, title, description, description_short, status, post, milestones, links, images ) +{ + this.id = id; + this.title = title; + this.description = description; + this.description_short = description_short; + this.status = status; + this.post = post; + this.milestones = milestones; + this.links = links; + this.images = images; +} diff --git a/routes/modules/projectsmembers.js b/routes/modules/projectsmembers.js new file mode 100644 index 0000000..9ed1de6 --- /dev/null +++ b/routes/modules/projectsmembers.js @@ -0,0 +1,10 @@ +module.exports = function ProjectsMembers( id, project_id, member_id, role, admin, assignedArea ) +{ + this.id = id; + this.project_id = project_id; + this.member_id = member_id; + this.admin = admin; + this.role = role; + + this.assignedArea = assignedArea; +} \ No newline at end of file diff --git a/routes/projects.js b/routes/projects.js index cdc5865..731b8f5 100644 --- a/routes/projects.js +++ b/routes/projects.js @@ -23,7 +23,7 @@ router.get('/', function(req, res, next) { var archviedProjects = []; for ( var project of projects) { - project.members= helper.findProjectMembers(project); + project.members= project.findProjectMembers(); if (navbar.links.length < 4) navbar.links.push({name: project.title, url: '/projects/' + project.id}); if (project.status == "Archived" || project.satus == "Completed" || project.status == "Resigned" || project.status == "") @@ -38,8 +38,6 @@ router.get('/', function(req, res, next) { } } - console.log({top: topProjects, secondary: secondaryProjects, archvied: archviedProjects}); - res.render('projects', { title: 'CS Club | Projects' , list_of_projects: {top: topProjects, secondary: secondaryProjects, archived: archviedProjects}, helper: helper, navbar: navbar}); }); @@ -52,7 +50,7 @@ router.get('/:projectID', function(req, res, next) { links: [] }; - var project = helper.findProjectForID( projects, req.params.projectID); + var project = helper.findIdInCollection( req.params.projectID, projects); for ( var p of projects) { if (navbar.links.length < 4) @@ -60,7 +58,7 @@ router.get('/:projectID', function(req, res, next) { } navbar.links.push({name: "List of Projects", url: '/projects'}); - project.members = helper.findProjectMembers( project ); + project.members = project.findProjectMembers(); project.team = {project_managers: [], members: []}; for (var member of project.members) { if (member.role.includes("Project Founder") | member.role.includes("Project Manager") | member.role.includes("Sub-Project Manager")) @@ -103,9 +101,9 @@ router.get('/:projectID', function(req, res, next) { return 0; }); - project.areaRequests= helper.findProjectAreaRequests(project); + project.areaRequests= project.findProjectAreaRequests(); for ( var request of project.areaRequests) { - request.author = helper.findMemberForID( project.members, request.author_id); + request.author = helper.findIdInCollection( request.author_id, project.members); var project_interest = {interest: request.project_interest, title: 'undefined', value: '0'}; request.project_interest_color = helper.replaceColorIntensity(project_interest); request.project_interest_title = helper.replaceColorTitle(project_interest); @@ -113,7 +111,9 @@ router.get('/:projectID', function(req, res, next) { asset.experience_color = helper.replaceColorIntensity({value: asset.experience}); } } - project.events = helper.findProjectEvents( project); + // console.log("DEBUG: "+ JSON.stringify(project, null, 4)); + + project.events = project.findProjectEvents(); res.render('project', { title: 'CS Club' , project: project, services: tempDB.services, navbar: navbar, helper: helper}); }); @@ -129,7 +129,7 @@ router.get('/:projectID/photo-gallery', function(req, res, next) { ] }; - var project = helper.findProjectForID( tempDB.projects, req.params.projectID); + var project = helper.findIdInCollection( req.params.projectID, tempDB.projects); res.render('project_photo-gallery', { title: 'CS Club', project: project, navbar: navbar }); }); diff --git a/sass/assets/tables.scss b/sass/assets/tables.scss index 45421a0..ed70bff 100644 --- a/sass/assets/tables.scss +++ b/sass/assets/tables.scss @@ -10,6 +10,7 @@ } } a.cell { + text-decoration: none; :hover { background-color: $highlighted; } diff --git a/sass/main.scss b/sass/main.scss index db4808a..d94046b 100644 --- a/sass/main.scss +++ b/sass/main.scss @@ -83,6 +83,7 @@ p.header { @import 'partials/members_page'; @import 'partials/member_page'; @import 'partials/about'; +@import 'partials/dashboard'; @import 'imported'; @@ -116,6 +117,11 @@ p.header { background: $lightgray; } +img.img-avatar { + margin: 15px 10px; + border-radius: 50%; +} + #atoms { .member-cell { width: 100%; diff --git a/sass/partials/_dashboard.scss b/sass/partials/_dashboard.scss new file mode 100644 index 0000000..aa5e38f --- /dev/null +++ b/sass/partials/_dashboard.scss @@ -0,0 +1,48 @@ +#dashboard-page { + .sidebar { + padding-right: 0; + p.name { + text-align: center; + } + .navbar { + padding-top: $margin-md; + } + .list-group .list-group-item { + text-align: left; + } + + } + #dashboard { + } + #projects-page { + .disabled { + cursor: not-allowed; + color: $gray-darkgray; + background-color: $highlighted; + } + .project-cell { + @extend .cell; + .project-controls { + a { + @extend .btn, .btn-primary; + margin: auto $margin-sm; + } + a.remove { + @extend .btn-danger; + } + } + } + } + #project-page { + .image-cell { + @extend .cell; + img { + height: 64px; + width: 64px; + } + a { + text-align: left; + } + } + } +} diff --git a/views/TEMPLATE.jade b/views/TEMPLATE.jade index 887d8bd..40931ec 100644 --- a/views/TEMPLATE.jade +++ b/views/TEMPLATE.jade @@ -1,4 +1,4 @@ extends layout block content - #PLACEHOLDER-page.content + #PLACEHOLDER-page.content diff --git a/views/dashboard-project-edit.jade b/views/dashboard-project-edit.jade new file mode 100644 index 0000000..bf0e4af --- /dev/null +++ b/views/dashboard-project-edit.jade @@ -0,0 +1,42 @@ +extends layout-dashboard + +block view + #project-edit-page.content + .row + .col-md-2.hidden-sm-down + p.header= project.title + p= project.description_short + .col-md-10 + form(action="" method="POST") + .form-group.row + label(for="title").col-2.col-form-label Title + .col-10 + input(type="text" id="title" name="title" value= project.title).form-control + .form-group.row + label(for="description") Description + .col-12 + textarea(id="description" name="description" placeholder="e.g." rows="3" value= project.description).form-control + .form-group.row + label(for="description_short").col-2.col-form-label Short Description + .col-10 + input(type="text" id="description_short" name="description_short" value= project.description_short).form-control + .form-group.row + label(for="status").col-2.col-form-label Status + .col-10 + input(type="text" id="status" name="status" value= project.status).form-control + .form-group.row + label(for="post").col-2.col-form-label Post + .col-10 + input(type="text" id="post" name="post" value= project.post).form-control + .form-group.row + label(for="milestones").col-2.col-form-label Milestones + .col-10 + input(type="text" id="milestones" name="milestones" value= project.milestones).form-control + .form-group.row + label(for="links").col-2.col-form-label Links + .col-10 + input(type="text" id="links" name="links" value= project.links).form-control + .form-group.row + label(for="images").col-2.col-form-label Images + .col-10 + input(type="text" id="images" name="images" value= project.images).form-control \ No newline at end of file diff --git a/views/dashboard-project.jade b/views/dashboard-project.jade new file mode 100644 index 0000000..cd32e29 --- /dev/null +++ b/views/dashboard-project.jade @@ -0,0 +1,31 @@ +extends layout-dashboard + +block view + #project-page.content + .row + .col-md-2.hidden-sm-down + p.header Metadata + p= "Number of Members: " + project.findProjectMembers().length + .col-md-10 + h1= project.title + p= "Description: " + project.description + p= "Short: " + project.description_short + p= "Status: " + project.status + p= "Post: " + project.post + p= "Milestones: " + //- each stone in project.milestones + p= "Links: " + each link, name in project.links + a(href=link target="_blank").cell + .context + p.pull-xs-right= link + p= name + p= "Images: " + each image in project.images + .image-cell + .context + - var source = "/images/projects/"+project.title.toLowerCase()+"/images/"+image; + a(href=source target="_blank").thumb.pull-xs-right + img(src=source) + p= image + p 12k \ No newline at end of file diff --git a/views/dashboard-projects.jade b/views/dashboard-projects.jade new file mode 100644 index 0000000..6a9cb44 --- /dev/null +++ b/views/dashboard-projects.jade @@ -0,0 +1,20 @@ +extends layout-dashboard + +block view + #projects-page.content + p My Projects + - for (var i = 0; i < projects.length; i += 1) + - var project = projects[i]; + - var lastProject = (i != 0) ? projects[i -1] : undefined; + - var canCRUD = token.role == 1 || project.admin == true; + - if (i == 0 && project.admin == false || i != 0 && project.admin == false && lastProject.admin == true) + p Other projects + .project-cell + .context + .project-controls.pull-xs-right + a(href= "projects/" + project.id) view + a(href= "projects/edit/" + project.id class= canCRUD ? "" : "disabled") admin + a(class= project.isMember ? "remove" : "")= project.isMember ? "Unjoin" : "Join" + p.header= project.title + p= helper.pluralize('member', project.members.length, true) + p= project.description_short diff --git a/views/dashboard.jade b/views/dashboard.jade new file mode 100644 index 0000000..46523f0 --- /dev/null +++ b/views/dashboard.jade @@ -0,0 +1,17 @@ +extends layout-dashboard + +block view + #dashboard.content + h3 My Projects + each project in my_projects + a(href='dashboard/projects/'+ project.id).cell + .context + p.header= project.title + p= helper.pluralize('member', project.members.length, true) + p= project.description_short + h3 My Teammates + h3 My Events + each event in my_events + a.cell + .context + p= event.title diff --git a/views/layout-dashboard.jade b/views/layout-dashboard.jade new file mode 100644 index 0000000..572988c --- /dev/null +++ b/views/layout-dashboard.jade @@ -0,0 +1,22 @@ +extends layout + +block content + #dashboard-page.content + .row + .sidebar(class= dashboard.includes('hideSidebar') ? "hidden-xs-up" : "col-lg-2 col-md-3") + .hidden-sm-down + h2 Welcome + img.img-avatar(src='http://placehold.it/64x64/77cb6f') + p.name= token.name + .btn-group(role="group" aria-label="Basic example") + button.btn.btn-secondary(type="button") msg + button.btn.btn-secondary(type="button") dir + button.btn.btn-secondary(type="button") act + .navbar.list-group + a(href="/dashboard" class=navbar.active == 'dashboard' ? 'active' : '').list-group-item Home Page + a(href="/dashboard/projects" class=navbar.active == 'projects' ? 'active' : '').list-group-item Projects + a(href="/dashboard/events" class=navbar.active == 'events' ? 'active' : '').list-group-item Events + a(href="/dashboard/members" class=navbar.active == 'members' ? 'active' : '').list-group-item Members + a(href="/").list-group-item.disabled Sign Out + .view(class= dashboard.includes('hideSidebar') ? "col-xs-12" : "col-lg-10 col-md-9") + block view diff --git a/views/layout.jade b/views/layout.jade index b114273..fdff462 100644 --- a/views/layout.jade +++ b/views/layout.jade @@ -11,10 +11,16 @@ html(ng-app="csApp") //script(src="/angular/angular.js") body - include ./partials/_navbar + - if (dashboard == undefined) + include ./partials/_navbar + - else + include ./partials/_navbar-dashboard .container-fluid .starter-template(style="padding: 3rem 1.5rem 1rem;") block content - include ./partials/_footer + - if (dashboard == undefined) + include ./partials/_footer + - else + include ./partials/_footer-dashboard script(src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js") script(src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-alpha.2/js/bootstrap.min.js" crossorigin="anonymous") diff --git a/views/partials/_footer-dashboard.jade b/views/partials/_footer-dashboard.jade new file mode 100644 index 0000000..9998ed3 --- /dev/null +++ b/views/partials/_footer-dashboard.jade @@ -0,0 +1 @@ +#footer-dashboard diff --git a/views/partials/_navbar-dashboard.jade b/views/partials/_navbar-dashboard.jade new file mode 100644 index 0000000..c1d13af --- /dev/null +++ b/views/partials/_navbar-dashboard.jade @@ -0,0 +1,30 @@ +mixin links() + li.nav-item + a.nav-link(href='/') View Website + +.hidden-sm-down + nav.navbar.navbar-fixed-top.navbar-dark.bg-inverse + .nbw2 + .navbar-wrapper + a.navbar-brand(href='/dashboard')= title + ul.nav.navbar-nav.pull-xs-right + mixin links() +.hidden-md-up + nav.navbar-mobile.navbar-fixed-top.navbar-dark.bg-inverse + .nbw2 + .navbar-wrapper + a(href='/') + img.thumb(src='/images/icons/logo-64@2x.png' style="width: 52px; height: 52px;") + button(class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navBar-collapse" aria-controls="navBar-collapse" aria-expanded="false" aria-label="navBar-control") + span(aria-hidden="false").glyphicon.glyphicon-menu-hamburger Menu + .navbar-mobile-secondary.collapse(id="navBar-collapse") + mixin links() + +.hidden-sm-down + nav.navbar.navbar-fixed-top.navbar-dark.navbar-secondary + .nbw2 + .navbar-wrapper + ul.nav.navbar-nav.pull-xs-right + each link, index in navbar.links + li.nav-item(class= link.active === true ? 'active' : '') + a.nav-link(href=link.url)= link.name