--- a/swtr/static/css/swtmaker.css +++ b/swtr/static/css/swtmaker.css @@ -72,6 +72,7 @@ background: #fff; height: 60px; margin-left: -15px; + display: none; } .ocd-item .text{ margin-top: 3px; --- a/swtr/static/js/img_swtr.js +++ b/swtr/static/js/img_swtr.js @@ -35,7 +35,7 @@ var where = options.where, who = options.who || null; url = swtr.swtstoreURL() + swtr.endpoints.get + '?where=' + - encodeURIComponent(where) + '&access_token=' + swtr.access_token; + encodeURIComponent(where);// '&access_token=' + swtr.access_token; if(who) { url += '&who=' + who; } @@ -100,13 +100,15 @@ update: function() { } }); + swtr.ImgAnnoView = Backbone.View.extend({ - el: $("#img-annotation-wrapper"), + el: $('#img-annotation-wrapper'), events: { - 'change #custom-dropdown ': 'getFormValue', - 'click #setbox': 'showHide' + 'change #custom-dropdown': 'getFormValue', + 'click #toggle-anno-areas': 'toggleAnnoAreas' }, initialize: function(options) { + this.$el = $('#img-annotation-wrapper'); this.listenTo(this.collection, 'add', this.render); // attach event handlers to the anno object anno.addHandler('onAnnotationCreated', this.showSwtHelp); @@ -125,8 +127,15 @@ this.$img = options.$img; options.$img.on('load', this, this.imageLoaded); options.$img.on('error', this, this.onImageLoadError); - this.setImage(options.url); } + if(!options.helpview) { + //TODO: figure out a better way so that everyone can communicate with + //helpview independently + throw new Error('Image annotation view must be passed a reference to the helpview'); + } + this.helpview = options.helpview; + //console.log('initing img annoview; helpview in opts', options.helpview); + this.setImage(options.url); }, render: function(model) { var swt = model.toJSON(); @@ -140,7 +149,7 @@ }, showSwtHelp: function(annotation) { var self = swtr.imgAnnoView;//TODO: figure out how we can bind the scope when this func is called as a callback - swtr.appView.helpview.step(3); + self.helpview.step(3); $('#sweet').show(); }, updateNewAnno: function(annotation) { @@ -260,14 +269,13 @@ }, setImage: function(url) { this.imgURL = url; - console.log(url); + //console.log(url); if(this.$img.attr('src') === this.imgURL) { return; } anno.reset(); - var self = this; swtr.appView.$overlay.show(); - swtr.appView.helpview.step(7); + this.helpview.step(7); this.$img.attr('src', this.imgURL); }, imageLoaded: function(event) { @@ -277,7 +285,7 @@ // reset the collection swtr.sweets.reset(); anno.makeAnnotatable(swtr.imgAnnoView.img); - swtr.imgAnnoView.getExistingAnnotations(); + self.getExistingAnnotations(); }, // when image fails to load - could be because of broken URL or network // issues @@ -285,7 +293,7 @@ var self = event.data; console.log('error while loading image'); swtr.appView.$overlay.hide(); - swtr.appView.helpview.step(8); + self.helpview.step(8); }, initImageAnno: function() { // img is a jquery object which annotorious doesn't accept; instead it @@ -297,7 +305,7 @@ }, getExistingAnnotations: function() { var self = this; - swtr.appView.helpview.step(0); + this.helpview.step(0); swtr.appView.$overlay.show(); swtr.sweets.getAll({ where: this.imgURL, @@ -305,7 +313,7 @@ if(_.isArray(data)) { swtr.sweets.add(data); swtr.appView.$overlay.hide(); - swtr.appView.helpview.step(2); + self.helpview.step(2); } }, error: function(jqxhr, error, statusText) { @@ -313,16 +321,16 @@ console.log('annotations don\'t exist for this image. Create one!'); } swtr.appView.$overlay.hide(); - swtr.appView.helpview.step(2); + self.helpview.step(2); } }); }, - showHide: function() { - if($("#setbox:checked").length) { - $('.annotorious-item-unfocus').css("opacity", "0.5"); + toggleAnnoAreas: function() { + if($('#toggle-anno-areas').is(':checked')) { + $('.annotorious-item-unfocus').css('opacity', '0.5'); } else { - $('.annotorious-item-unfocus').css("opacity", "0"); + $('.annotorious-item-unfocus').css('opacity', '0'); } } }); --- a/swtr/static/js/main.js +++ b/swtr/static/js/main.js @@ -45,8 +45,10 @@ 'click #sweet-cancel': 'cancelSweeting', 'click #post-sweet': 'postSweets' }, - initialize: function() { + initialize: function(opts) { this.template = _.template($('#sweet-template').html()); + this.helpview = opts.helpview; + //this.setElement(opts.el); }, render: function() { $('#sweet-list').html('

These are your sweet annotations!

'); @@ -61,7 +63,7 @@ how: JSON.stringify(this.getHumanReadableParts(swt.get('how'))) })); }, this); - $(this.el).fadeIn(300); + this.$el.fadeIn(300); }, getHumanReadableParts: function(how) { var human_readable_json = {}; @@ -90,42 +92,27 @@ this.collection.remove(notPosted); }, postSweets: function() { - console.log("postSWr"); var appView = swtr.appView; - appView.helpview.step(5); + this.helpview.step(5); appView.$overlay.show(); try { this.collection.post({ success: function(collection, response) { console.log(collection, response); swtr.sweets.set(collection); - //TODO: move this to a annotation view or something -// anno.removeAll(); - // _.each(swtr.sweets.models, function(swt) { - // if(!_.has(swt.get('how'), 'editable')) { - // swt.get('how')['editable'] = false; - // //console.log(swt.get('how').text.Comment); - // swt.get('how').text = swtr.imgAnnoView.createPopupText(swt.get('how')); - // //console.log(swt.get('how')); - // swt.get('how').text += '\n - by ' + swt.get('who'); - // } - // //console.log(swt.get('how')); - // anno.addAnnotation(swt.get('how')); - // }); - //console.log(swtr.sweets.toJSON()); - swtr.appView.$overlay.hide(); - swtr.appView.helpview.step(6); + appView.$overlay.hide(); + this.helpview.step(6); }, error: function(jqxhr, error, text) { console.log(jqxhr, error, text); - swtr.appView.$overlay.hide(); - swtr.appView.helpview.step(10); + appView.$overlay.hide(); + this.helpview.step(10); } }); } catch(e) { if(e.message == 'Access Token is required to sweet') { appView.$overlay.hide(); - appView.helpview.step(9); + this.helpview.step(9); } } this.cleanUp(); @@ -133,7 +120,7 @@ }, cleanUp: function() { //console.log('cleaning up'); - $(this.el).hide(); + this.$el.hide(); } }); @@ -162,6 +149,7 @@ // pluck uniq tags of sweets var tags = _.chain(this.collection.pluck('how')).pluck('tags').flatten(). uniq().value(); + // render them as filter controls _.each(tags, function(tag) { if(tag) { @@ -229,45 +217,12 @@ anno.addAnnotation(swt.get('how')); }); } - }, - filterSweet: function(event) { - /*if(!event.currentTarget.checked) { - var results = this.collection.filter(function(model) { - if(model.get('who') != event.currentTarget.name) - return model; - }); - if(results.length) { - _.each(results, function(result) { - anno.removeAnnotation(result.get('how')); - }); - } - else { // if results is empty then remove all anno. - anno.removeAll(); - } - } - else { - results = this.collection.filter(function(model) { - if(model.get('who') == event.currentTarget.name) - return model; - }); - _.each(results, function(result) { - anno.addAnnotation(result.get('how')); - }); - - } - // if(results) { - // anno.removeAll(); - // } - // swtr.annoView.collection = results; - // swtr.annoView.renderWith();*/ } }); var AppView = Backbone.View.extend({ el: $('body'), events: { - 'click #user-input-submit': 'submitUserInput', - 'click #sweet': 'sweet', 'click #sign-in': 'signIn', //'mouseup .annotorious-editor-button-save': 'addnew_anno' }, @@ -275,11 +230,9 @@ // initialize components this.source = 'none'; //this.helpview = new HelpView(); - this.sweetsview = new SweetsView({collection: swtr.sweets}); // cache jquery selected elements which are used frequently this.$overlay = $('#app-overlay'); - this.$img = $('#annotatable-img'); //this.helpview.step(1); // initialize the oauth stuff @@ -290,76 +243,105 @@ scopes: 'email,sweet' }); }, + signIn: function(event) { + event.preventDefault(); + if(swtr.who === 'Guest') { + this.oauth.authorize(); + } + return false; + }, + userLoggedIn: function(username) { + swtr.who = username; + var text = 'Signed in as ' + swtr.who + ''; + $('#signinview').html(text); + }, + userLoggedOut: function() { + swtr.who = 'Guest'; + $('#signinview').html('Logged out'); + } + }); + + var PlayAreaView = Backbone.View.extend({ + id: '#play-page-container', + events: { + 'click #user-input-submit': 'submitUserInput', + 'click #sweet': 'sweet' + }, + initialize: function() { + this.template = _.template($('#play-page-template').html()); + this.helpview = new HelpView(); + this.render(); + this.sweetsview = new SweetsView({ + el: $('#sweet-list-wrapper'), + collection: swtr.sweets, + helpview: this.helpview + }); + this.$img = $('#annotatable-img'); + this.helpview.step(1); + }, + render: function() { + this.$el.html(this.template()); + $('#play-page').html(this.$el); + }, submitUserInput: function(event) { event.preventDefault(); var input = $('#user-input').val(); - if(this.source === 'ocd') { - this.loadOCDSearch(input); - } - else if (this.source === 'none') { - this.loadURL(input); - } + this.loadURL(input); }, + getSweets: function() { + console.log('getSweets'); + var annos = _.filter(anno.getAnnotations(), function(anno) { + return (!_.has(anno, 'editable') || anno.editable === true); + }); + + _.each(annos, function(anno) { + swtr.sweets.add({ + who: swtr.who, + where: anno.src, + // remove the text field; we don't want to store that in the sweets + how: _.omit(anno, 'text') + }); + }); + }, + showSweets: function() { + console.log('showSweets'); + this.sweetsview.render(); + }, + sweet: function() { + console.log('sweeting'); + this.getSweets(); + this.showSweets(); + return false; + }, // load a URL for annotation (can be of image or html resource for now) loadURL: function(url, type) { //console.log('loadURL()'); - if(this.source !== 'ocd') { - $('#ocd-results').hide(); - } - $('#img-annotation-wrapper').show(); if(!url || !url.match(/http/)) { this.helpview.step(13); return false; } // if type is given explicitly; we load it as such. if(type === 'image') { - if(swtr.imgAnnoView) { - swtr.imgAnnoView.setImage(url); - } - else { - swtr.imgAnnoView = new swtr.ImgAnnoView({ - collection:swtr.sweets, - img: this.$img[0], - $img: this.$img, - url: url - }); - } + this.initImageAnno(url); return false; } // else try to find what resource is the URL.. // if url has an image extension then load the image annotation if(url.match(/.jpg|.jpeg|.png|.gif|.bmp|.svg/)) { - if(swtr.imgAnnoView) { - swtr.imgAnnoView.setImage(url); - } - else { - swtr.imgAnnoView = new swtr.ImgAnnoView({collection:swtr.sweets, - img: this.$img[0], - $img: this.$img, - url: url}); - } - + this.initImageAnno(url); return false; } // else check with our /media-type endpoint to see what type of resource // it is else { this.helpview.step(12); - this.$overlay.show(); + swtr.appView.$overlay.show(); var self = this; $.get('/media-type', {where: url}, function(response) { //console.log(response); - self.$overlay.hide(); + self.appView.$overlay.hide(); if(response.type === 'image') { - if(swtr.imgAnnoView) { - swtr.imgAnnoView.setImage(url); - } - else { - swtr.imgAnnoView = new swtr.ImgAnnoView({collection:swtr.sweets, - img: self.$img[0], - $img: self.$img, - url: url}); - } + this.initImageAnno(url); } else { window.location.href = '/annotate?where=' + url; @@ -367,56 +349,26 @@ }); } }, - getSweets: function() { - var annos = _.filter(anno.getAnnotations(), function(anno) { - return (!_.has(anno, 'editable') || anno.editable === true); - }); - - _.each(annos, function(anno) { - swtr.sweets.add({ - who: swtr.who, - where: anno.src, - // remove the text field; we don't want to store that in the sweets - how: _.omit(anno, 'text') + initImageAnno: function(url) { + if(swtr.imgAnnoView) { + swtr.imgAnnoView.setImage(url); + } + else { + swtr.imgAnnoView = new swtr.ImgAnnoView({ + collection: swtr.sweets, + img: this.$img[0], + $img: this.$img, + url: url, + helpview: this.helpview }); - }); + } }, - showSweets: function() { - this.sweetsview.render(); - }, - sweet: function() { - this.getSweets(); - this.showSweets(); - return false; - }, - signIn: function(event) { - event.preventDefault(); - this.oauth.authorize(); - return false; - }, - userLoggedIn: function(username) { - swtr.who = username; - var text = 'Signed in as ' + swtr.who + ''; - $('#signinview').html(text); - }, - userLoggedOut: function() { - swtr.who = 'Guest'; - $('#signinview').html('Logged out'); + destroy: function() { + this.helpview.remove(); + this.remove(); } }); - - var PlayAreaView = Backbone.View.extend({ - el: $('#play-page'), - events: { - }, - initialize: function() { - this.render(); - }, - render: function() { - } - }); - var SearchView = Backbone.View.extend({ id: 'search-page-container', events: { @@ -564,29 +516,30 @@ //console.log('onImgClick'); event.preventDefault(); // TODO: init the image anno - this.highlightImg(event); + this.drawCoverOnImg(event); //swtr.appView.loadURL(url, 'image'); return false; }, - highlightImg: function(event) { + drawCoverOnImg: function(event) { //console.log('highlightImg'); var elem = $(event.currentTarget).parent().parent(); // if .ocd-item-cover exists return if(elem.find('.ocd-item-cover').length) { + $(elem.find('.ocd-item-cover')[0]).slideDown(); return; } //console.log(elem); elem.prepend(this.cover_template()); - $(elem.find('.ocd-item-cover')[0]).slideDown('slow'); + $(elem.find('.ocd-item-cover')[0]).slideDown(); }, onCoverCloseClick: function(event) { var elem = $(event.currentTarget).parent(); - elem.slideUp('slow'); - elem.remove(); + elem.slideUp(); }, onMarkClick: function(event) { var url = $(event.currentTarget).parent().parent(). find('img').attr('src'); + //TODO: load the image in the play area/workbench console.log('load image anno', url); }, search: function(data, cb) { @@ -718,17 +671,18 @@ initialize: function() { var self = this; swtr.LDs = new LDSwts(); - swtr.LDs.getAll({what: 'img-anno', - success: function(data) { - swtr.LDs.add(data); - if(!swtr.tagCloudView) { - swtr.tagCloudView = new TagCloudView({collection: swtr.LDs}); - } - }}); + swtr.LDs.getAll({ + what: 'img-anno', + success: function(data) { + swtr.LDs.add(data); + if(!swtr.tagCloudView) { + swtr.tagCloudView = new TagCloudView({collection: swtr.LDs}); + } + } + }); }, destroy: function() { this.remove(); - } }); @@ -742,7 +696,6 @@ this.user_tag_el = $('#user-tag-cloud'); this.tags_tag_el = $('#tags-tag-cloud'); this.render(); - }, userTagClicked: function(e) { console.log(e); @@ -766,7 +719,6 @@ .fontSize(function(d) { return d.size; }) .on("end", this.draw) .start(); - }, draw: function (words) { var fill = d3.scale.category20(); @@ -783,7 +735,6 @@ .attr("transform", function(d) { return "translate(" + [d.x, d.y] + ")";}) .text(function(d) { return d.text; }); - }, renderTagsTagCloud: function() { var sweetsWithTags = swtr.LDs.filter(function(k) { @@ -805,7 +756,6 @@ .fontSize(function(d) { return d.size; }) .on("end", this.drawTags) .start(); - }, drawTags: function(words) { var fill = d3.scale.category20(); @@ -824,7 +774,6 @@ }) .text(function(d) {console.log(d); return d.text; }); } - }); var AppRouter = Backbone.Router.extend({ @@ -836,7 +785,7 @@ }, components: { 'linked-data': LDView, - 'play': DummyView, + 'play': PlayAreaView, 'search': SearchView }, home: function() { --- a/swtr/templates/index.html +++ b/swtr/templates/index.html @@ -86,73 +86,18 @@ -
- -
-
-
-
- - -
- -
-
-
-
-
- -
-
-
-
- -
-
-
-
-
-
-
-
-
-
- -
-
-
- {% if url %} - Annotation Workbench - {% else %} - Annotation Workbench - {% endif %} -
-
+
-
- -
- - -
-
+ +
-
- -
-
-
@@ -225,6 +170,61 @@
  • Related Links: <%= Links %>
  • + +