From eccf15d9d2f12a10bb2345c472d60248c4d320fd Mon Sep 17 00:00:00 2001 From: Raimo Radczewski Date: Sun, 3 Aug 2014 11:02:43 +0200 Subject: [PATCH 1/5] Added tags as attribute to activityResult --- lib/activityresults/activityresult.js | 1 + test/activityresults/activityresult_model_test.js | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/lib/activityresults/activityresult.js b/lib/activityresults/activityresult.js index 155a6c2bb..bab70059c 100644 --- a/lib/activityresults/activityresult.js +++ b/lib/activityresults/activityresult.js @@ -8,6 +8,7 @@ var ActivityResult = function ActivityResult(data) { this.id = data.id; this.created_by = data.created_by; this.photos = data.photos; + this.tags = data.tags; } this.getPhotoById = function getPhotoById(id) { diff --git a/test/activityresults/activityresult_model_test.js b/test/activityresults/activityresult_model_test.js index 95559bb2d..ece51bae0 100644 --- a/test/activityresults/activityresult_model_test.js +++ b/test/activityresults/activityresult_model_test.js @@ -34,6 +34,10 @@ describe('Activity result', function () { expect(new ActivityResult({created_by: 'me'})).to.have.property('created_by', 'me'); }); + it('should have a field of defined tags for an activityResult', function () { + expect(new ActivityResult({tags: ['1', '2']}).tags).to.be.eql(['1', '2']); + }); + describe('photo subdocument', function () { it('should be retrievable by id', function () { var activityResult = new ActivityResult({ From 2e8a86ccbe75a9db783f13483bb2bc8be0a0b37c Mon Sep 17 00:00:00 2001 From: Raimo Radczewski Date: Sun, 3 Aug 2014 11:05:36 +0200 Subject: [PATCH 2/5] Save tags with activityResult --- lib/activityresults/index.js | 7 +++++- .../activityresults_integration_test.js | 23 +++++++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/lib/activityresults/index.js b/lib/activityresults/index.js index 6239ed73f..2d9d4f90b 100644 --- a/lib/activityresults/index.js +++ b/lib/activityresults/index.js @@ -33,7 +33,12 @@ app.post('/', function (req, res) { if (!activityResultName) { return res.send(BAD_REQUEST); } - activityresultsPersistence.save(new ActivityResult({id: activityResultName, created_by: req.user.member.id }), function (err) { + var tags = req.body.tags; + if (!ld.isArray(tags)) { + tags = [tags]; + } + + activityresultsPersistence.save(new ActivityResult({id: activityResultName, tags: tags, created_by: req.user.member.id }), function (err) { if (err) { return res.send(BAD_REQUEST); } diff --git a/test/activityresults/activityresults_integration_test.js b/test/activityresults/activityresults_integration_test.js index dbc0ec4e6..5548e3f57 100644 --- a/test/activityresults/activityresults_integration_test.js +++ b/test/activityresults/activityresults_integration_test.js @@ -7,6 +7,7 @@ var expect = require('must'); var beans = conf.get('beans'); var activityresultsService = beans.get('activityresultsService'); +var activityresultsPersistence = beans.get('activityresultsPersistence'); var createApp = require('../../testutil/testHelper')('activityresultsApp').createApp; @@ -86,6 +87,28 @@ describe('/activityresults', function () { .expect(303, done); }); + it('should create a new activity result with tags', function (done) { + var theResult; + sinon.stub(activityresultsPersistence, 'save', function (activityResult, callback) { + theResult = activityResult; + callback(null, activityResult); + }); + + var app = createApp(1); + request(app) + .post('/') + .type('form') + .send({ activityResultName: "MyActivityResult", tags: ['myFirstTag', 'mySecondTag'] }) + .expect(303) + .end(function (err) { + if (err) { + done(err); + } + expect(theResult.tags).to.eql(['myFirstTag', 'mySecondTag']); + done(); + }); + }); + it('should reject request without activityResultName parameter', function (done) { request(createApp(1)) .post('/') From 3a9d67091f262533e1f2e758d72bff9c15785706 Mon Sep 17 00:00:00 2001 From: Raimo Radczewski Date: Sun, 3 Aug 2014 11:14:05 +0200 Subject: [PATCH 3/5] Show Tags Input on notFound page --- lib/activityresults/index.js | 5 +---- lib/activityresults/views/notFound.jade | 7 ++++++- test/activityresults/activityresults_integration_test.js | 2 +- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/lib/activityresults/index.js b/lib/activityresults/index.js index 2d9d4f90b..2437ac7c0 100644 --- a/lib/activityresults/index.js +++ b/lib/activityresults/index.js @@ -33,10 +33,7 @@ app.post('/', function (req, res) { if (!activityResultName) { return res.send(BAD_REQUEST); } - var tags = req.body.tags; - if (!ld.isArray(tags)) { - tags = [tags]; - } + var tags = (req.body.tags || "").split(','); activityresultsPersistence.save(new ActivityResult({id: activityResultName, tags: tags, created_by: req.user.member.id }), function (err) { if (err) { diff --git a/lib/activityresults/views/notFound.jade b/lib/activityresults/views/notFound.jade index 867b25368..b3cd1b31f 100644 --- a/lib/activityresults/views/notFound.jade +++ b/lib/activityresults/views/notFound.jade @@ -16,5 +16,10 @@ block content form(role='form',method='POST',action=createUri) +csrf .form-group - input(name='activityResultName',type='hidden',value='#{activityResultName}') + label(for='inputName') Name + input.form-control#inputName(name='activityResultName',type='text',readonly='readonly',value='#{activityResultName}') + .form-group + label(for='inputTag') Tags (comma-separated) + input.form-control#inputTags(name='tags',type='text') + .form-group button.btn.btn-primary(type='submit') Jetzt anlegen diff --git a/test/activityresults/activityresults_integration_test.js b/test/activityresults/activityresults_integration_test.js index 5548e3f57..fc5d8f902 100644 --- a/test/activityresults/activityresults_integration_test.js +++ b/test/activityresults/activityresults_integration_test.js @@ -98,7 +98,7 @@ describe('/activityresults', function () { request(app) .post('/') .type('form') - .send({ activityResultName: "MyActivityResult", tags: ['myFirstTag', 'mySecondTag'] }) + .send({ activityResultName: "MyActivityResult", tags: 'myFirstTag,mySecondTag' }) .expect(303) .end(function (err) { if (err) { From 533efef96c05ba801f7b986d2dc418e5f86fb080 Mon Sep 17 00:00:00 2001 From: Raimo Radczewski Date: Sun, 3 Aug 2014 11:19:50 +0200 Subject: [PATCH 4/5] Incorporated tags in edit_photo view --- lib/activityresults/views/edit_photo.jade | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/lib/activityresults/views/edit_photo.jade b/lib/activityresults/views/edit_photo.jade index 5ed841485..ee76a3be8 100644 --- a/lib/activityresults/views/edit_photo.jade +++ b/lib/activityresults/views/edit_photo.jade @@ -15,15 +15,10 @@ block content .col-md-4 h4 Step #2: Pick a room ul.tag-list - li - input#tag-hopper(type="radio",name="tag",value="hopper") - label.btn.btn-default(for="tag-hopper") # Hopper - li - input#tag-lovelace(type="radio",name="tag",value="lovelace") - label.btn.btn-default(for="tag-lovelace") # Lovelace - li - input#tag-liskov(type="radio",name="tag",value="liskov") - label.btn.btn-default(for="tag-liskov") # Liskov + each availableTag, i in activityResult.tags + li + input(type="radio",name="tag",value=availableTag,id="tag-"+i) + label.btn.btn-default(for="tag-" + i) # #{availableTag} .row .col-md-8 h4 Step #3: What's on that photo? From 174637ff4eac749c492a273fc608b2d47fbe21b0 Mon Sep 17 00:00:00 2001 From: Raimo Radczewski Date: Sun, 3 Aug 2014 11:38:44 +0200 Subject: [PATCH 5/5] Always initialize arrays of ActivityResult model --- lib/activityresults/activityresult.js | 7 +++++-- .../activityresults_integration_edit_test.js | 2 +- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/lib/activityresults/activityresult.js b/lib/activityresults/activityresult.js index bab70059c..0bde8f24b 100644 --- a/lib/activityresults/activityresult.js +++ b/lib/activityresults/activityresult.js @@ -4,11 +4,14 @@ var ld = require('lodash'); var ActivityResult = function ActivityResult(data) { var _this = this; + this.tags = []; + this.photos = []; + if (data) { this.id = data.id; this.created_by = data.created_by; - this.photos = data.photos; - this.tags = data.tags; + this.photos = data.photos || []; + this.tags = data.tags || []; } this.getPhotoById = function getPhotoById(id) { diff --git a/test/activityresults/activityresults_integration_edit_test.js b/test/activityresults/activityresults_integration_edit_test.js index 655e8a4c2..a18a05153 100644 --- a/test/activityresults/activityresults_integration_edit_test.js +++ b/test/activityresults/activityresults_integration_edit_test.js @@ -20,7 +20,7 @@ describe('/activityresults/:result/photo/:photo', function () { var photoId = 'photo_id'; beforeEach(function () { sinon.stub(activityresultsService, 'getActivityResultByName', function (activityResultName, callback) { - callback(null, new ActivityResult({ id: "foo", name: "foobar", created_by: 1, photos: [{id: photoId, title: 'mishka', uploaded_by: 1}]})); + callback(null, new ActivityResult({ id: "foo", name: "foobar", created_by: 1, tags: [], photos: [{id: photoId, title: 'mishka', uploaded_by: 1}]})); }); sinon.stub(activityresultsService, 'addPhotoToActivityResult', function (activityResultName, photo, callback) { callback();