From 4ca472f2cb56a633609d5b1ee550a67722dd6d4b Mon Sep 17 00:00:00 2001 From: Dobie Wollert Date: Wed, 26 Jun 2013 03:54:22 -0700 Subject: [PATCH] Added support for tags --- app/controllers/home.js | 2 +- app/controllers/tags.js | 50 +++++++++++++++++++ app/model/tag.js | 11 +++++ app/views/tag.jade | 105 ++++++++++++++++++++++++++++++++++++++++ config/auth.js | 11 ++++- config/routes.js | 8 ++- package.json | 4 +- public/js/directives.js | 3 +- public/tags/app.js | 37 ++++++++++++++ 9 files changed, 225 insertions(+), 6 deletions(-) create mode 100644 app/controllers/tags.js create mode 100644 app/model/tag.js create mode 100644 app/views/tag.jade create mode 100644 public/tags/app.js diff --git a/app/controllers/home.js b/app/controllers/home.js index 103c778..aeccfc5 100644 --- a/app/controllers/home.js +++ b/app/controllers/home.js @@ -5,6 +5,6 @@ module.exports = function(piler) { js: piler.js.renderTags(), css: piler.css.renderTags() }); - } + }, }; }; \ No newline at end of file diff --git a/app/controllers/tags.js b/app/controllers/tags.js new file mode 100644 index 0000000..ea9176e --- /dev/null +++ b/app/controllers/tags.js @@ -0,0 +1,50 @@ +var mongoose = require('mongoose'), + Tag = mongoose.model('Tag'); + +module.exports = function(piler) { + return { + index: function(req, res, next) { + + host = String(req.headers.host); + host = host.split(':')[0]; + + if (host != 'n.atlb.co') { + return next(); + } + + if (!req.user) { + req.session.redirectUrl = req.url + } + + var path = req.path.slice(1); + + Tag.findById(path) + .populate('client', 'name identifier address') + .exec(function(err, result) { + var payload = { + user: req.user, + id: path, + tag: result || undefined, + }; + + res.render('tag.jade', { + css: piler.css.renderTags(), + payload: payload + }); + }) + }, + post: function(req, res) { + + var tag_id = req.body.tag_id; + delete req.body.tag_id; + + Tag.findByIdAndUpdate(tag_id, req.body, { upsert: true }, function(err, result) { + if (err) { + res.json(500, err); + } else { + res.json(result); + } + }); + } + } +} \ No newline at end of file diff --git a/app/model/tag.js b/app/model/tag.js new file mode 100644 index 0000000..678c0a3 --- /dev/null +++ b/app/model/tag.js @@ -0,0 +1,11 @@ +var mongoose = require('mongoose'), + Schema = mongoose.Schema, + ObjectId = Schema.ObjectId; + +var tagSchema = new Schema({ + _id: String, + client: { type: ObjectId, ref: 'Client' }, + data: {} +}, { versionKey: false }) + +var Tag = module.exports = mongoose.model('Tag', tagSchema); diff --git a/app/views/tag.jade b/app/views/tag.jade new file mode 100644 index 0000000..f55c27f --- /dev/null +++ b/app/views/tag.jade @@ -0,0 +1,105 @@ +doctype 5 +html(lang="en", ng-app="tags", ng-controller="tags.PageCtrl") + head + title Atlantic Biomedical + !{css} + script(type='text/javascript') + window.payload = !{JSON.stringify(payload)}; + body + script(type='text/javascript', src='//ajax.googleapis.com/ajax/libs/angularjs/1.1.4/angular.js') + script(type='text/javascript', src='//ajax.googleapis.com/ajax/libs/angularjs/1.1.4/angular-resource.js') + script(type='text/javascript', src='//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js') + script(type='text/javascript', src='/js/lib/select2.js') + script(type='text/javascript', src='/js/lib/bootstrap-datepicker.js') + script(type='text/javascript', src='/js/lib/moment.js') + script(type='text/javascript', src='/js/directives.js') + script(type='text/javascript', src='/tags/app.js') + + error-panel + .navbar + .navbar-inner + a.brand(href='/', target='_self') Atlantic Biomedical + progress-panel + ul.nav.pull-right(ng-show='user') + li(ng-show='user.name') + a(href='#') + i.icon-user + | {{user.name.first}} {{user.name.last}} + li.photo(ng-show='user.picture', ns-show='user.picture') + img(ng-src='{{user.picture}}?sz=50') + .navbar.navbar-secondary + .navbar-inner + ul.nav + li + a(href='http://www.atlanticbiomedical.com') + i.icon-wrench + | Contact Us + .container-fluid + h1(ng-show='tag') Device Tag + h1(ng-hide='tag') Create Tag + div(ng-hide='user') + dl.dl-horizontal(ng-show='tag') + dt Client + dd  {{payload.tag.client.name}} ({{payload.tag.client.identifier}}) + dt Device + dd  {{tag.device}} + dt Make + dd  {{tag.make}} + dt Model + dd  {{tag.model}} + dt Serial Number + dd  {{tag.serialNumber}} + dt Purchase Date + dd  {{tag.purchaseDate}} + dt Test + dd  {{tag.test}} + dt Room # + dd  {{tag.roomNumber}} + + a.btn.btn-primary(href='/auth', ng-show='tag') + | Edit Tag + + a.btn.btn-primary(href='/auth', ng-hide='tag') + | Create Tag + + div(ng-show='user') + form.form-horizontal + .control-group + label.control-label Client + .controls + select(ng-model='client', required='required', ng-options='client._id as client.name + " (" + client.identifier + ")" for client in clients') + + + + + + .control-group + label.control-label Device + .controls + input.text(ng-model='tag.device') + .control-group + label.control-label Make + .controls + input.text(ng-model='tag.make') + .control-group + label.control-label Model + .controls + input.text(ng-model='tag.model') + .control-group + label.control-label Serial Number + .controls + input.text(ng-model='tag.serialNumber') + .control-group + label.control-label Purchase Date + .controls + input.text(type='date', ng-model='tag.purchaseDate') + .control-group + label.control-label Test + .controls + input.text(ng-model='tag.test') + .control-group + label.control-label Room # + .controls + input.text(ng-model='tag.roomNumber') + .control-group + button.btn.btn-primary(ng-click='save()') Save diff --git a/config/auth.js b/config/auth.js index 5e535aa..089d58b 100644 --- a/config/auth.js +++ b/config/auth.js @@ -9,19 +9,28 @@ module.exports = function(app, passport) { app.get('/auth/callback', function(req, res, next) { passport.authenticate('google', function(err, user, info) { + var redirectUrl = '/'; + if (err) { return next(err); } if (!user) { return res.redirect('/login/error'); } + if (req.session.redirectUrl) { + redirectUrl = req.session.redirectUrl; + req.session.redirectUrl = null; + } + req.logIn(user, function(err) { if (err) { return next(err); } - return res.redirect('/'); }); + + res.redirect(redirectUrl); })(req, res, next); }); return { requiresUiLogin: function(req, res, next) { if (!req.isAuthenticated()) { + req.session.redirectUrl = req.url; return res.redirect('/login'); } next(); diff --git a/config/routes.js b/config/routes.js index dd1e359..bc86fd7 100644 --- a/config/routes.js +++ b/config/routes.js @@ -48,12 +48,16 @@ module.exports = function(app, auth, piler, calendar, config) { var messages = require('../app/controllers/messages')(config); app.post('/api/messages/send', messages.send); + var tags = require('../app/controllers/tags')(piler); + app.post('/api/tags', tags.post); + var login = require('../app/controllers/login')(piler); app.get('/login', login.login); app.get('/login/error', login.error); app.get('/logout', login.logout); var home = require('../app/controllers/home')(piler); - app.get('/', auth.requiresUiLogin, home.index); - app.get('*', auth.requiresUiLogin, home.index); + + app.get('/', tags.index, auth.requiresUiLogin, home.index); + app.get('*', tags.index, auth.requiresUiLogin, home.index); }; diff --git a/package.json b/package.json index 2c2970d..6678c2e 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,9 @@ "jade": "", "googleapis": "", "sprintf": "", - "emailjs": "" + "emailjs": "", + "moment": "", + "async": "" }, "devDependencies": { "supervisor": "" diff --git a/public/js/directives.js b/public/js/directives.js index 0909b39..ddad90a 100644 --- a/public/js/directives.js +++ b/public/js/directives.js @@ -141,7 +141,7 @@ angular.module('biomed.directives', []) var isTouch = 'ontouchstart' in window && !window.navigator.userAgent.match(/PhantomJS/i); return { - restrict: 'A', + restrict: 'AC', require: '?ngModel', link: function postLink(scope, element, attrs, controller) { @@ -310,6 +310,7 @@ angular.module('biomed.directives', []) var options = {}; return { + restrict: 'AC', require: '?ngModel', compile: function (tElm, tAttrs) { var watch, diff --git a/public/tags/app.js b/public/tags/app.js new file mode 100644 index 0000000..31543d3 --- /dev/null +++ b/public/tags/app.js @@ -0,0 +1,37 @@ +var tags = {} + +angular.module('tags', ['ngResource', 'biomed.directives']) + .factory("Tag", function($resource) { + return $resource('/api/tags'); + }) + .factory("Clients", function($resource) { + return $resource('/api/clients/:id/:cmd', + { id: "@id", cmd: "@cmd" }, + { + index: { method: 'GET', params: {}, isArray: true }, + }); + }) +tags.PageCtrl = function($scope, $window, Tag, Clients) { + console.log($window.payload) + + var payload = $scope.payload = $window.payload; + + $scope.tag = payload.tag ? payload.tag.data : undefined; + + if (payload.user) { + $scope.user = payload.user; + $scope.clients = Clients.index(function() { + if (payload.tag && payload.tag.client) { + $scope.client = payload.tag.client._id; + } + }); + } + + $scope.save = function() { + Tag.save({ + tag_id: $window.payload.id, + client: $scope.client, + data: $scope.tag + }); + } +}