From cc3bd1537ecfa26496b70ee041877430d2a76849 Mon Sep 17 00:00:00 2001 From: Will Moore Date: Wed, 6 Apr 2016 09:56:56 +0100 Subject: [PATCH 001/103] js and tree.py initial work on loading annotations via json --- .../webclient/javascript/ome.general_tab.js | 88 +++++++++++++ .../annotations/metadata_general.html | 66 ++++++---- .../webclient/base/base_container.html | 1 + .../tools/OmeroWeb/omeroweb/webclient/tree.py | 121 ++++++++++++++++++ .../tools/OmeroWeb/omeroweb/webclient/urls.py | 3 + .../OmeroWeb/omeroweb/webclient/views.py | 15 +++ 6 files changed, 266 insertions(+), 28 deletions(-) create mode 100644 components/tools/OmeroWeb/omeroweb/webclient/static/webclient/javascript/ome.general_tab.js diff --git a/components/tools/OmeroWeb/omeroweb/webclient/static/webclient/javascript/ome.general_tab.js b/components/tools/OmeroWeb/omeroweb/webclient/static/webclient/javascript/ome.general_tab.js new file mode 100644 index 00000000000..c8263f2dfad --- /dev/null +++ b/components/tools/OmeroWeb/omeroweb/webclient/static/webclient/javascript/ome.general_tab.js @@ -0,0 +1,88 @@ +// Copyright (C) 2016 University of Dundee & Open Microscopy Environment. +// All rights reserved. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. + +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + + +var TagPane = function TagPane($element) { + + var $header = $element.children('h1'), + $body = $element.children('div'), + $tags_container = $("#tags_container"); + + + + var initEvents = function initEvents() { + + $header.click(function(){ + $header.toggleClass('closed'); + $body.slideToggle(); + + var expanded = !$header.hasClass('closed'); + setExpanded(expanded); + + render(); + }); + + // Handle events on objects we will load later... + // $element.on( "click", "tr", function() { + // console.log( $( this ).text() ); + // }); + }; + + + var render = function render() { + + console.log('render', $tags_container.is(":visible"), $tags_container.is(":empty")); + + if ($tags_container.is(":visible") && $tags_container.is(":empty")) { + + $tags_container.html("Loading tags..."); + + + } + }; + + + // We use the "#metadata_general" element to store this data since + // it is not reloaded on selection change. + var setExpanded = function setExpanded(expanded) { + var open_panes = $("#metadata_general").data('open_panes') || []; + if (expanded && open_panes.indexOf('tags') === -1) { + open_panes.push("tags"); + } + if (!expanded && open_panes.indexOf('tags') > -1) { + open_panes = open_panes.reduce(function(l, item){ + if (item !== 'tags') l.push(item); + return l; + }, []); + } + $("#metadata_general").data('open_panes', open_panes); + }; + + var getExpanded = function getExpanded() { + var open_panes = $("#metadata_general").data('open_panes') || []; + return open_panes.indexOf('tags') > -1; + }; + + + initEvents(); + + if (getExpanded()) { + $header.toggleClass('closed'); + $body.show(); + } + + render(); +}; diff --git a/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/annotations/metadata_general.html b/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/annotations/metadata_general.html index 2d1f53da535..9ef81cb1bb3 100644 --- a/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/annotations/metadata_general.html +++ b/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/annotations/metadata_general.html @@ -4,7 +4,7 @@ {% load common_tags %} {% comment %} -

+
+

Tags

-
+ +
diff --git a/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/base/base_container.html b/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/base/base_container.html index a5b074e9725..c72fecb299a 100644 --- a/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/base/base_container.html +++ b/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/base/base_container.html @@ -69,6 +69,7 @@ + diff --git a/components/tools/OmeroWeb/omeroweb/webclient/tree.py b/components/tools/OmeroWeb/omeroweb/webclient/tree.py index c271e9d96dc..55d8777a419 100644 --- a/components/tools/OmeroWeb/omeroweb/webclient/tree.py +++ b/components/tools/OmeroWeb/omeroweb/webclient/tree.py @@ -1651,3 +1651,124 @@ def marshal_discussions(conn, member_id=-1, owner_id=-1, for e in qs.projection(q, params, service_opts): discussions.append(_marshal_discussion(conn, e[0:4])) return discussions + + +def _marshal_annotation(conn, annotation, link=None): + ''' Given an OMERO annotation, marshals it into a dictionary. + @param conn OMERO gateway. + @type conn L{omero.gateway.BlitzGateway} + @param row The Dataset row to marshal + @type row L{list} + ''' + ann = {} + ownerId = annotation.details.owner.id.val + perms = {} + perms['canEdit'] = annotation.details.permissions.canEdit() + perms['canAnnotate'] = annotation.details.permissions.canAnnotate() + perms['canDelete'] = annotation.details.permissions.canDelete() + perms['canLink'] = annotation.details.permissions.canLink() + + ann['id'] = annotation.id.val + ann['ns'] = unwrap(annotation.ns) + ann['owner'] = {'id': ownerId} + creation = annotation.details.creationEvent._time + ann['date'] = _marshal_date(unwrap(creation)) + ann['permsCss'] = \ + parse_permissions_css(perms, ownerId, conn) + + if link is not None: + ann['link'] = {} + ann['link']['id'] = link.id.val + ann['link']['owner'] = {'id': link.details.owner.id.val} + ann['link']['parent'] = {'id': link.parent.id.val} + linkCreation = link.details.creationEvent._time + ann['link']['date'] = _marshal_date(unwrap(linkCreation)) + + annClass = annotation.__class__.__name__ + ann['type'] = annClass + if annClass in ['TagAnnotationI', 'CommentAnnotationI']: + ann['textValue'] = unwrap(annotation.textValue) + if annClass == 'LongAnnotationI': + ann['longValue'] = unwrap(annotation.longValue) + if annClass == 'FileAnnotationI' and annotation.file: + print annotation.file + ann['file'] = {} + ann['file']['id'] = annotation.file.id.val + ann['file']['name'] = unwrap(annotation.file.name) + ann['file']['size'] = unwrap(annotation.file.size) + ann['file']['path'] = unwrap(annotation.file.path) + return ann + + +def init_params(group_id, page, limit): + params = omero.sys.ParametersI() + # Paging + if page is not None and page > 0: + params.page((page-1) * limit, limit) + return params + + +def _marshal_exp_obj(experimenter): + exp = {} + exp['id'] = experimenter.id.val + exp['omeName'] = experimenter.omeName.val + exp['firstName'] = unwrap(experimenter.firstName) + exp['lastName'] = unwrap(experimenter.lastName) + return exp + + +def marshal_annotations(conn, image_ids=None, dataset_ids=None, ann_type=None, + group_id=-1, page=1, limit=settings.PAGE): + + annotations = [] + qs = conn.getQueryService() + service_opts = deepcopy(conn.SERVICE_OPTS) + + # Set the desired group context + if group_id is None: + group_id = -1 + service_opts.setOmeroGroup(group_id) + + where_clause = ['pa.id in (:ids)'] + # if experimenter_id is not None and experimenter_id != -1: + # params.addId('eid', rlong(experimenter_id)) + # where_clause.append('dataset.details.owner.id = :eid') + if ann_type == 'tag': + where_clause.append('ch.class=TagAnnotation') + if ann_type == 'file': + where_clause.append('ch.class=FileAnnotation') + if ann_type == 'comment': + where_clause.append('ch.class=CommentAnnotation') + if ann_type == 'rating': + where_clause.append('ch.class=LongAnnotation') + + dtypes = ["Dataset", "Image"] + obj_ids = [dataset_ids, image_ids] + + experimenters = {} + + for dtype, ids in zip(dtypes, obj_ids): + if ids is None or len(ids) == 0: + continue + params = init_params(group_id, page, limit) + params.addIds(ids) + q = """ + select oal from %sAnnotationLink as oal + join fetch oal.details.creationEvent + left outer join fetch oal.child as ch + left outer join fetch oal.parent as pa + join fetch ch.details.creationEvent + left outer join fetch ch.file as file + where %s + """ % (dtype, ' and '.join(where_clause)) + + for link in qs.findAllByQuery(q, params, service_opts): + ann = link.child + d = _marshal_annotation(conn, ann, link) + annotations.append(d) + exp = _marshal_exp_obj(link.details.owner) + experimenters[exp['id']] = exp + exp = _marshal_exp_obj(ann.details.owner) + experimenters[exp['id']] = exp + + return annotations, experimenters.values() diff --git a/components/tools/OmeroWeb/omeroweb/webclient/urls.py b/components/tools/OmeroWeb/omeroweb/webclient/urls.py index 41e42416441..98b1ce035c1 100644 --- a/components/tools/OmeroWeb/omeroweb/webclient/urls.py +++ b/components/tools/OmeroWeb/omeroweb/webclient/urls.py @@ -315,6 +315,9 @@ url(r'^api/tags/$', views.api_tags_and_tagged_list, name='api_tags_and_tagged'), + url(r'^api/annotations/$', views.api_annotations, + name='api_annotations'), + url(r'^api/shares/$', views.api_share_list, name='api_shares'), diff --git a/components/tools/OmeroWeb/omeroweb/webclient/views.py b/components/tools/OmeroWeb/omeroweb/webclient/views.py index 8df7c07bd9d..5197f958e09 100755 --- a/components/tools/OmeroWeb/omeroweb/webclient/views.py +++ b/components/tools/OmeroWeb/omeroweb/webclient/views.py @@ -1111,6 +1111,21 @@ def api_tags_and_tagged_list_DELETE(request, conn=None, **kwargs): return HttpJsonResponse('') +@login_required() +def api_annotations(request, conn=None, **kwargs): + + r = request.GET or request.POST + + image_ids = r.getlist('image') + dataset_ids = r.getlist('dataset') + + ann_type = r.get('type', None) + + annotations, experimenters = tree.marshal_annotations(conn, image_ids, dataset_ids, ann_type=ann_type) + + return HttpJsonResponse({'annotations': annotations, 'experimenters': experimenters}) + + @login_required() def api_share_list(request, conn=None, **kwargs): # Get parameters From 8e9a9c5de744fbe442d411c9eb752fb93283a62b Mon Sep 17 00:00:00 2001 From: Will Moore Date: Wed, 6 Apr 2016 14:35:13 +0100 Subject: [PATCH 002/103] Rendering of tags with underscore template --- .../webclient/javascript/ome.general_tab.js | 33 ++++++++++++++++++- .../annotations/metadata_general.html | 10 +++--- .../webclient/annotations/tag_underscore.html | 22 +++++++++++++ .../webclient/base/base_container.html | 5 ++- .../tools/OmeroWeb/omeroweb/webclient/tree.py | 19 ++++++----- 5 files changed, 72 insertions(+), 17 deletions(-) create mode 100644 components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/annotations/tag_underscore.html diff --git a/components/tools/OmeroWeb/omeroweb/webclient/static/webclient/javascript/ome.general_tab.js b/components/tools/OmeroWeb/omeroweb/webclient/static/webclient/javascript/ome.general_tab.js index c8263f2dfad..851010f9e93 100644 --- a/components/tools/OmeroWeb/omeroweb/webclient/static/webclient/javascript/ome.general_tab.js +++ b/components/tools/OmeroWeb/omeroweb/webclient/static/webclient/javascript/ome.general_tab.js @@ -15,12 +15,14 @@ // along with this program. If not, see . -var TagPane = function TagPane($element) { +var TagPane = function TagPane($element, objects) { var $header = $element.children('h1'), $body = $element.children('div'), $tags_container = $("#tags_container"); + var tmplText = $('#tag_template').html(); + var tagTmpl = _.template(tmplText); var initEvents = function initEvents() { @@ -50,6 +52,35 @@ var TagPane = function TagPane($element) { $tags_container.html("Loading tags..."); + var request = objects.map(function(o){ + return o.replace("-", "="); + }); + console.log(request); + + $.getJSON("/webclient/api/annotations/?type=tag&" + request, function(data){ + + // manipulate data... + // make an object of eid: experimenter + var experimenters = data.experimenters.reduce(function(prev, exp){ + prev[exp.id + ""] = exp; + return prev; + }, {}); + + // Populate experimenters within tags + var tags = data.annotations.map(function(tag){ + tag.owner = experimenters[tag.owner.id]; + if (tag.link && tag.link.owner) { + tag.link.owner = experimenters[tag.link.owner.id]; + } + tag.textValue = _.escape(tag.textValue); + return tag; + }); + console.log(tags); + + var html = tagTmpl({'tags': tags}); + // html = _.escape(html); + $tags_container.html(html); + }); } }; diff --git a/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/annotations/metadata_general.html b/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/annotations/metadata_general.html index 9ef81cb1bb3..6ea82590009 100644 --- a/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/annotations/metadata_general.html +++ b/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/annotations/metadata_general.html @@ -29,7 +29,9 @@ // Delegate to sub-views to handle content of each collapsible panel - new TagPane($("#tagsPane")); + var dataModel = ["{{ manager.obj_type }}-{{ manager.obj_id }}"]; + console.log(dataModel); + new TagPane($("#tagsPane"), dataModel); var linkify = function(input) { @@ -907,11 +909,7 @@

{% endif %} -
- {% with tags=manager.tag_annotations %} - {% include "webclient/annotations/tags.html" %} - {% endwith %} -
+

diff --git a/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/annotations/tag_underscore.html b/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/annotations/tag_underscore.html new file mode 100644 index 00000000000..6fd2c805f21 --- /dev/null +++ b/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/annotations/tag_underscore.html @@ -0,0 +1,22 @@ + +<% _.each(tags, function(tag) { %> + + +
+ + <%= tag.textValue %> + + + <% if (tag.link.permissions.canDelete) { %> + + X + + <% } %> +
+ +
+ +<% }) %> \ No newline at end of file diff --git a/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/base/base_container.html b/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/base/base_container.html index c72fecb299a..b5fa92bd436 100644 --- a/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/base/base_container.html +++ b/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/base/base_container.html @@ -53,13 +53,16 @@ - + + diff --git a/components/tools/OmeroWeb/omeroweb/webclient/tree.py b/components/tools/OmeroWeb/omeroweb/webclient/tree.py index 55d8777a419..8f820c40100 100644 --- a/components/tools/OmeroWeb/omeroweb/webclient/tree.py +++ b/components/tools/OmeroWeb/omeroweb/webclient/tree.py @@ -1662,19 +1662,16 @@ def _marshal_annotation(conn, annotation, link=None): ''' ann = {} ownerId = annotation.details.owner.id.val - perms = {} - perms['canEdit'] = annotation.details.permissions.canEdit() - perms['canAnnotate'] = annotation.details.permissions.canAnnotate() - perms['canDelete'] = annotation.details.permissions.canDelete() - perms['canLink'] = annotation.details.permissions.canLink() - ann['id'] = annotation.id.val ann['ns'] = unwrap(annotation.ns) ann['owner'] = {'id': ownerId} creation = annotation.details.creationEvent._time ann['date'] = _marshal_date(unwrap(creation)) - ann['permsCss'] = \ - parse_permissions_css(perms, ownerId, conn) + p = annotation.details.permissions + ann['permissions'] = {'canDelete': p.canDelete(), + 'canAnnotate': p.canAnnotate(), + 'canLink': p.canLink(), + 'canEdit': p.canEdit()} if link is not None: ann['link'] = {} @@ -1683,6 +1680,11 @@ def _marshal_annotation(conn, annotation, link=None): ann['link']['parent'] = {'id': link.parent.id.val} linkCreation = link.details.creationEvent._time ann['link']['date'] = _marshal_date(unwrap(linkCreation)) + p = link.details.permissions + ann['link']['permissions'] = {'canDelete': p.canDelete(), + 'canAnnotate': p.canAnnotate(), + 'canLink': p.canLink(), + 'canEdit': p.canEdit()} annClass = annotation.__class__.__name__ ann['type'] = annClass @@ -1691,7 +1693,6 @@ def _marshal_annotation(conn, annotation, link=None): if annClass == 'LongAnnotationI': ann['longValue'] = unwrap(annotation.longValue) if annClass == 'FileAnnotationI' and annotation.file: - print annotation.file ann['file'] = {} ann['file']['id'] = annotation.file.id.val ann['file']['name'] = unwrap(annotation.file.name) From 95d0bb98ce67364dec317c537a571bd5738cff20 Mon Sep 17 00:00:00 2001 From: Will Moore Date: Wed, 6 Apr 2016 23:35:19 +0100 Subject: [PATCH 003/103] Tags display and update working for single objects --- .../webclient/javascript/ome.general_tab.js | 29 ++++++++++++------- .../annotations/metadata_general.html | 13 +++++---- .../webclient/annotations/tag_underscore.html | 8 +++++ .../tools/OmeroWeb/omeroweb/webclient/tree.py | 10 +++++-- .../OmeroWeb/omeroweb/webclient/views.py | 14 +++++++-- 5 files changed, 53 insertions(+), 21 deletions(-) diff --git a/components/tools/OmeroWeb/omeroweb/webclient/static/webclient/javascript/ome.general_tab.js b/components/tools/OmeroWeb/omeroweb/webclient/static/webclient/javascript/ome.general_tab.js index 851010f9e93..86dcb01cd46 100644 --- a/components/tools/OmeroWeb/omeroweb/webclient/static/webclient/javascript/ome.general_tab.js +++ b/components/tools/OmeroWeb/omeroweb/webclient/static/webclient/javascript/ome.general_tab.js @@ -25,7 +25,7 @@ var TagPane = function TagPane($element, objects) { var tagTmpl = _.template(tmplText); - var initEvents = function initEvents() { + var initEvents = (function initEvents() { $header.click(function(){ $header.toggleClass('closed'); @@ -34,23 +34,27 @@ var TagPane = function TagPane($element, objects) { var expanded = !$header.hasClass('closed'); setExpanded(expanded); - render(); - }); + if (expanded && $tags_container.is(":empty")) { + this.render(); + } + }.bind(this)); // Handle events on objects we will load later... // $element.on( "click", "tr", function() { // console.log( $( this ).text() ); // }); - }; + }).bind(this); - var render = function render() { + this.render = function render() { - console.log('render', $tags_container.is(":visible"), $tags_container.is(":empty")); + console.log('render', $tags_container.is(":visible")); - if ($tags_container.is(":visible") && $tags_container.is(":empty")) { + if ($tags_container.is(":visible")) { - $tags_container.html("Loading tags..."); + if ($tags_container.is(":empty")) { + $tags_container.html("Loading tags..."); + } var request = objects.map(function(o){ return o.replace("-", "="); @@ -73,13 +77,18 @@ var TagPane = function TagPane($element, objects) { tag.link.owner = experimenters[tag.link.owner.id]; } tag.textValue = _.escape(tag.textValue); + tag.description = _.escape(tag.description); return tag; }); console.log(tags); + // Update html... var html = tagTmpl({'tags': tags}); - // html = _.escape(html); $tags_container.html(html); + + // Finish up... + OME.filterAnnotationsAddedBy(); + $(".tooltip", $tags_container).tooltip_init(); }); } @@ -115,5 +124,5 @@ var TagPane = function TagPane($element, objects) { $body.show(); } - render(); + this.render(); }; diff --git a/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/annotations/metadata_general.html b/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/annotations/metadata_general.html index 6ea82590009..e365e4a5c1a 100644 --- a/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/annotations/metadata_general.html +++ b/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/annotations/metadata_general.html @@ -30,8 +30,12 @@ // Delegate to sub-views to handle content of each collapsible panel var dataModel = ["{{ manager.obj_type }}-{{ manager.obj_id }}"]; + {% if manager.well.getWellSample.image %} + dataModel = ["image-{{ manager.well.getWellSample.image.id }}"]; + {% endif %} + console.log(dataModel); - new TagPane($("#tagsPane"), dataModel); + var tagPane = new TagPane($("#tagsPane"), dataModel); var linkify = function(input) { @@ -321,11 +325,8 @@ $('#add_tags_form').ajaxForm({ success: function(data) { $("#add_tags_form").dialog( "close" ); // hide in case it was submitted via 'Enter' - // update the list of tags - var $tag = $(data.trim()); - $("#tags_container").empty().append($tag).hide_if_empty(); - $(".tooltip", $tag).tooltip_init(); - OME.filterAnnotationsAddedBy(); + // Re-render tag pane... + tagPane.render(); } }); diff --git a/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/annotations/tag_underscore.html b/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/annotations/tag_underscore.html index 6fd2c805f21..2a2a1c2d0d4 100644 --- a/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/annotations/tag_underscore.html +++ b/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/annotations/tag_underscore.html @@ -15,6 +15,14 @@ X <% } %> + + diff --git a/components/tools/OmeroWeb/omeroweb/webclient/tree.py b/components/tools/OmeroWeb/omeroweb/webclient/tree.py index 8f820c40100..efab7b6f168 100644 --- a/components/tools/OmeroWeb/omeroweb/webclient/tree.py +++ b/components/tools/OmeroWeb/omeroweb/webclient/tree.py @@ -1718,7 +1718,9 @@ def _marshal_exp_obj(experimenter): return exp -def marshal_annotations(conn, image_ids=None, dataset_ids=None, ann_type=None, +def marshal_annotations(conn, project_ids=None, dataset_ids=None, + image_ids=None, screen_ids=None, plate_ids=None, + run_ids=None, ann_type=None, group_id=-1, page=1, limit=settings.PAGE): annotations = [] @@ -1743,8 +1745,10 @@ def marshal_annotations(conn, image_ids=None, dataset_ids=None, ann_type=None, if ann_type == 'rating': where_clause.append('ch.class=LongAnnotation') - dtypes = ["Dataset", "Image"] - obj_ids = [dataset_ids, image_ids] + dtypes = ["Project", "Dataset", "Image", + "Screen", "Plate", "PlateAcquisition"] + obj_ids = [project_ids, dataset_ids, image_ids, + screen_ids, plate_ids, run_ids] experimenters = {} diff --git a/components/tools/OmeroWeb/omeroweb/webclient/views.py b/components/tools/OmeroWeb/omeroweb/webclient/views.py index 5197f958e09..64d3b0b95af 100755 --- a/components/tools/OmeroWeb/omeroweb/webclient/views.py +++ b/components/tools/OmeroWeb/omeroweb/webclient/views.py @@ -1118,12 +1118,22 @@ def api_annotations(request, conn=None, **kwargs): image_ids = r.getlist('image') dataset_ids = r.getlist('dataset') + project_ids = r.getlist('project') + screen_ids = r.getlist('screen') + plate_ids = r.getlist('plate') + run_ids = r.getlist('acquisition') ann_type = r.get('type', None) - annotations, experimenters = tree.marshal_annotations(conn, image_ids, dataset_ids, ann_type=ann_type) + anns, exps = tree.marshal_annotations(conn, project_ids=project_ids, + dataset_ids=dataset_ids, + image_ids=image_ids, + screen_ids=screen_ids, + plate_ids=plate_ids, + run_ids=run_ids, + ann_type=ann_type) - return HttpJsonResponse({'annotations': annotations, 'experimenters': experimenters}) + return HttpJsonResponse({'annotations': anns, 'experimenters': exps}) @login_required() From 083620b12d25ce5b96853d9d440140f0772d4a3e Mon Sep 17 00:00:00 2001 From: Will Moore Date: Thu, 7 Apr 2016 16:46:54 +0100 Subject: [PATCH 004/103] Basic working display of file annotations --- .../webclient/static/webclient/css/layout.css | 2 +- .../webclient/javascript/ome.general_tab.js | 112 +++++++++++++++++- .../annotations/fileanns_underscore.html | 14 +++ .../annotations/metadata_general.html | 16 ++- ...g_underscore.html => tags_underscore.html} | 0 .../webclient/base/base_container.html | 7 +- 6 files changed, 138 insertions(+), 13 deletions(-) create mode 100644 components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/annotations/fileanns_underscore.html rename components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/annotations/{tag_underscore.html => tags_underscore.html} (100%) diff --git a/components/tools/OmeroWeb/omeroweb/webclient/static/webclient/css/layout.css b/components/tools/OmeroWeb/omeroweb/webclient/static/webclient/css/layout.css index c50546b447b..e08ec558a4a 100644 --- a/components/tools/OmeroWeb/omeroweb/webclient/static/webclient/css/layout.css +++ b/components/tools/OmeroWeb/omeroweb/webclient/static/webclient/css/layout.css @@ -442,7 +442,7 @@ border-bottom: solid 1px hsl(210,20%,85%) !important; } .lnfiles:empty { - display: none; + opacity: 0.1; } .myRating img, .addRating img{ cursor: pointer; diff --git a/components/tools/OmeroWeb/omeroweb/webclient/static/webclient/javascript/ome.general_tab.js b/components/tools/OmeroWeb/omeroweb/webclient/static/webclient/javascript/ome.general_tab.js index 86dcb01cd46..429b5602123 100644 --- a/components/tools/OmeroWeb/omeroweb/webclient/static/webclient/javascript/ome.general_tab.js +++ b/components/tools/OmeroWeb/omeroweb/webclient/static/webclient/javascript/ome.general_tab.js @@ -21,7 +21,7 @@ var TagPane = function TagPane($element, objects) { $body = $element.children('div'), $tags_container = $("#tags_container"); - var tmplText = $('#tag_template').html(); + var tmplText = $('#tags_template').html(); var tagTmpl = _.template(tmplText); @@ -126,3 +126,113 @@ var TagPane = function TagPane($element, objects) { this.render(); }; + + + +var FileAnnsPane = function FileAnnsPane($element, objects) { + + var $header = $element.children('h1'), + $body = $element.children('div'), + $fileanns_container = $("#fileanns_container"); + + var tmplText = $('#fileanns_template').html(); + var filesTempl = _.template(tmplText); + + + var initEvents = (function initEvents() { + + $header.click(function(){ + $header.toggleClass('closed'); + $body.slideToggle(); + + var expanded = !$header.hasClass('closed'); + setExpanded(expanded); + + if (expanded && $fileanns_container.is(":empty")) { + this.render(); + } + }.bind(this)); + }).bind(this); + + + this.render = function render() { + + console.log('render files', $fileanns_container.is(":visible")); + + if ($fileanns_container.is(":visible")) { + + if ($fileanns_container.is(":empty")) { + $fileanns_container.html("Loading attachments..."); + } + + var request = objects.map(function(o){ + return o.replace("-", "="); + }); + console.log(request); + + $.getJSON("/webclient/api/annotations/?type=file&" + request, function(data){ + + // manipulate data... + // make an object of eid: experimenter + var experimenters = data.experimenters.reduce(function(prev, exp){ + prev[exp.id + ""] = exp; + return prev; + }, {}); + + // Populate experimenters within tags + var tags = data.annotations.map(function(f){ + f.owner = experimenters[f.owner.id]; + if (f.link && f.link.owner) { + f.link.owner = experimenters[f.link.owner.id]; + } + f.textValue = _.escape(f.textValue); + f.description = _.escape(f.description); + f.file.size = f.file.size.filesizeformat(); + return f; + }); + console.log(tags); + + // Update html... + var html = filesTempl({'files': tags}); + $fileanns_container.html(html); + + // Finish up... + OME.filterAnnotationsAddedBy(); + $(".tooltip", $fileanns_container).tooltip_init(); + }); + + } + }; + + + // We use the "#metadata_general" element to store this data since + // it is not reloaded on selection change. + var setExpanded = function setExpanded(expanded) { + var open_panes = $("#metadata_general").data('open_panes') || []; + if (expanded && open_panes.indexOf('tags') === -1) { + open_panes.push("tags"); + } + if (!expanded && open_panes.indexOf('tags') > -1) { + open_panes = open_panes.reduce(function(l, item){ + if (item !== 'tags') l.push(item); + return l; + }, []); + } + $("#metadata_general").data('open_panes', open_panes); + }; + + var getExpanded = function getExpanded() { + var open_panes = $("#metadata_general").data('open_panes') || []; + return open_panes.indexOf('tags') > -1; + }; + + + initEvents(); + + if (getExpanded()) { + $header.toggleClass('closed'); + $body.show(); + } + + this.render(); +}; diff --git a/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/annotations/fileanns_underscore.html b/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/annotations/fileanns_underscore.html new file mode 100644 index 00000000000..039cca8668a --- /dev/null +++ b/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/annotations/fileanns_underscore.html @@ -0,0 +1,14 @@ + +<% _.each(files, function(file) { %> +
  • + + + + <%= file.file.name %> + <%= file.file.size %> + + +
  • + +<% }) %> \ No newline at end of file diff --git a/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/annotations/metadata_general.html b/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/annotations/metadata_general.html index e365e4a5c1a..009e56384aa 100644 --- a/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/annotations/metadata_general.html +++ b/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/annotations/metadata_general.html @@ -34,8 +34,8 @@ dataModel = ["image-{{ manager.well.getWellSample.image.id }}"]; {% endif %} - console.log(dataModel); var tagPane = new TagPane($("#tagsPane"), dataModel); + var fileannsPane = new FileAnnsPane($("#fileannsPane"), dataModel); var linkify = function(input) { @@ -47,7 +47,7 @@ }; $("#comments_container").hide_if_empty(); - $("#fileanns_container").hide_if_empty(); + // $("#fileanns_container").hide_if_empty(); // $("#tags_container").hide_if_empty(); {% if manager.canEdit %} @@ -947,10 +947,11 @@

    +
    +

    Attachments

    - diff --git a/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/annotations/tag_underscore.html b/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/annotations/tags_underscore.html similarity index 100% rename from components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/annotations/tag_underscore.html rename to components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/annotations/tags_underscore.html diff --git a/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/base/base_container.html b/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/base/base_container.html index b5fa92bd436..d0dd8d3f092 100644 --- a/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/base/base_container.html +++ b/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/base/base_container.html @@ -60,8 +60,11 @@ - + From 251ed87028abc47c7f9f254d12a8620b90fc297d Mon Sep 17 00:00:00 2001 From: Will Moore Date: Thu, 7 Apr 2016 17:25:33 +0100 Subject: [PATCH 005/103] Add canDownload to fileann.permissions json --- .../webclient/annotations/fileanns_underscore.html | 6 +++--- components/tools/OmeroWeb/omeroweb/webclient/tree.py | 12 +++++++----- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/annotations/fileanns_underscore.html b/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/annotations/fileanns_underscore.html index 039cca8668a..06d2e9a9ea4 100644 --- a/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/annotations/fileanns_underscore.html +++ b/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/annotations/fileanns_underscore.html @@ -3,10 +3,10 @@
  • - - + <%= file.file.name %> - <%= file.file.size %> + (<%= file.file.size %>)
  • diff --git a/components/tools/OmeroWeb/omeroweb/webclient/tree.py b/components/tools/OmeroWeb/omeroweb/webclient/tree.py index efab7b6f168..bf007721dba 100644 --- a/components/tools/OmeroWeb/omeroweb/webclient/tree.py +++ b/components/tools/OmeroWeb/omeroweb/webclient/tree.py @@ -1667,11 +1667,11 @@ def _marshal_annotation(conn, annotation, link=None): ann['owner'] = {'id': ownerId} creation = annotation.details.creationEvent._time ann['date'] = _marshal_date(unwrap(creation)) - p = annotation.details.permissions - ann['permissions'] = {'canDelete': p.canDelete(), - 'canAnnotate': p.canAnnotate(), - 'canLink': p.canLink(), - 'canEdit': p.canEdit()} + perms = annotation.details.permissions + ann['permissions'] = {'canDelete': perms.canDelete(), + 'canAnnotate': perms.canAnnotate(), + 'canLink': perms.canLink(), + 'canEdit': perms.canEdit()} if link is not None: ann['link'] = {} @@ -1698,6 +1698,8 @@ def _marshal_annotation(conn, annotation, link=None): ann['file']['name'] = unwrap(annotation.file.name) ann['file']['size'] = unwrap(annotation.file.size) ann['file']['path'] = unwrap(annotation.file.path) + ann['permissions']['canDownload'] = not perms.isRestricted( + omero.constants.permissions.BINARYACCESS) return ann From c8d70a73763dc66819e4a0f56a8fbacbe9477e91 Mon Sep 17 00:00:00 2001 From: Will Moore Date: Fri, 8 Apr 2016 10:35:24 +0100 Subject: [PATCH 006/103] Add OMERO constants as js variables for isOriginalMetadata() --- .../OmeroWeb/omeroweb/webclient/decorators.py | 7 ++++ .../webclient/javascript/ome.general_tab.js | 25 +++++++----- .../annotations/fileanns_underscore.html | 39 +++++++++++++++---- .../templates/webclient/data/containers.html | 7 ++++ 4 files changed, 62 insertions(+), 16 deletions(-) diff --git a/components/tools/OmeroWeb/omeroweb/webclient/decorators.py b/components/tools/OmeroWeb/omeroweb/webclient/decorators.py index d0d3c1a1459..d19c00f5feb 100644 --- a/components/tools/OmeroWeb/omeroweb/webclient/decorators.py +++ b/components/tools/OmeroWeb/omeroweb/webclient/decorators.py @@ -26,6 +26,7 @@ import logging import omeroweb.decorators +from omero import constants from django.http import HttpResponse from django.conf import settings @@ -115,6 +116,12 @@ def prepare_context(self, request, context, *args, **kwargs): return conn = kwargs['conn'] + # omero constants + context['omero'] = {'constants': {'namespaces': { + 'NSCOMPANIONFILE': constants.namespaces.NSCOMPANIONFILE, + 'ORIGINALMETADATA': constants.annotation.file.ORIGINALMETADATA + }}} + context.setdefault('ome', {}) # don't overwrite existing ome context['ome']['eventContext'] = conn.getEventContext context['ome']['user'] = conn.getUser diff --git a/components/tools/OmeroWeb/omeroweb/webclient/static/webclient/javascript/ome.general_tab.js b/components/tools/OmeroWeb/omeroweb/webclient/static/webclient/javascript/ome.general_tab.js index 429b5602123..15ad5afe574 100644 --- a/components/tools/OmeroWeb/omeroweb/webclient/static/webclient/javascript/ome.general_tab.js +++ b/components/tools/OmeroWeb/omeroweb/webclient/static/webclient/javascript/ome.general_tab.js @@ -155,6 +155,12 @@ var FileAnnsPane = function FileAnnsPane($element, objects) { }).bind(this); + var isOriginalMetadata = function isOriginalMetadata(ann) { + return (ann.ns === omero.constants.namespaces.NSCOMPANIONFILE && + ann.file.name === omero.constants.annotation.file.ORIGINALMETADATA); + } + + this.render = function render() { console.log('render files', $fileanns_container.is(":visible")); @@ -180,20 +186,21 @@ var FileAnnsPane = function FileAnnsPane($element, objects) { }, {}); // Populate experimenters within tags - var tags = data.annotations.map(function(f){ - f.owner = experimenters[f.owner.id]; - if (f.link && f.link.owner) { - f.link.owner = experimenters[f.link.owner.id]; + var tags = data.annotations.map(function(ann){ + ann.owner = experimenters[ann.owner.id]; + if (ann.link && ann.link.owner) { + ann.link.owner = experimenters[ann.link.owner.id]; } - f.textValue = _.escape(f.textValue); - f.description = _.escape(f.description); - f.file.size = f.file.size.filesizeformat(); - return f; + ann.textValue = _.escape(ann.textValue); + ann.description = _.escape(ann.description); + ann.file.size = ann.file.size.filesizeformat(); + ann.isOriginalMetadata = isOriginalMetadata(ann); + return ann; }); console.log(tags); // Update html... - var html = filesTempl({'files': tags}); + var html = filesTempl({'anns': tags}); $fileanns_container.html(html); // Finish up... diff --git a/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/annotations/fileanns_underscore.html b/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/annotations/fileanns_underscore.html index 06d2e9a9ea4..73fff8eea11 100644 --- a/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/annotations/fileanns_underscore.html +++ b/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/annotations/fileanns_underscore.html @@ -1,14 +1,39 @@ -<% _.each(files, function(file) { %> +<% _.each(anns, function(ann) { %>
  • - + data-added-by="<%= ann.link.owner.id %>"> + - <%= file.file.name %> - (<%= file.file.size %>) + href="<% if (ann.permissions.canDownload) { print('/webclient/annotation/' + ann.id)} else {print('#') } %>"> + <%= ann.file.name %> + (<%= ann.file.size %>) - + + + +
    + + <% if (ann.link.permissions.canDelete) { %> + - + <% } %> + + <% if (ann.permissions.canDelete) { %> + × + <% } %> + +
  • <% }) %> \ No newline at end of file diff --git a/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/data/containers.html b/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/data/containers.html index 69a10b4e537..b2bd94b7835 100644 --- a/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/data/containers.html +++ b/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/data/containers.html @@ -55,6 +55,13 @@ + From 66e1dd851e37fc64b7e4e6a6cc5e63d95a1aaccf Mon Sep 17 00:00:00 2001 From: Will Moore Date: Thu, 14 Apr 2016 12:12:42 +0100 Subject: [PATCH 012/103] Fix hardcoded urls and Comments images etc --- .../webclient/javascript/ome.general_tab.js | 20 ++++++++++++------- .../annotations/comments_underscore.html | 4 ++-- .../annotations/fileanns_underscore.html | 6 +++--- .../annotations/tags_underscore.html | 2 +- 4 files changed, 19 insertions(+), 13 deletions(-) diff --git a/components/tools/OmeroWeb/omeroweb/webclient/static/webclient/javascript/ome.general_tab.js b/components/tools/OmeroWeb/omeroweb/webclient/static/webclient/javascript/ome.general_tab.js index 92fa3087a81..0d1a933860e 100644 --- a/components/tools/OmeroWeb/omeroweb/webclient/static/webclient/javascript/ome.general_tab.js +++ b/components/tools/OmeroWeb/omeroweb/webclient/static/webclient/javascript/ome.general_tab.js @@ -81,7 +81,7 @@ window.TagPane = function TagPane($element, objects) { return o.replace("-", "="); }); - $.getJSON("/webclient/api/annotations/?type=tag&" + request, function(data){ + $.getJSON(WEBCLIENT.URLS.webindex + "api/annotations/?type=tag&" + request, function(data){ // manipulate data... // make an object of eid: experimenter @@ -103,7 +103,7 @@ window.TagPane = function TagPane($element, objects) { console.log(tags); // Update html... - var html = tagTmpl({'tags': tags}); + var html = tagTmpl({'tags': tags, 'webindex': WEBCLIENT.URLS.webindex}); $tags_container.html(html); // Finish up... @@ -173,7 +173,7 @@ window.FileAnnsPane = function FileAnnsPane($element, objects) { return o.replace("-", "="); }); - $.getJSON("/webclient/api/annotations/?type=file&" + request, function(data){ + $.getJSON(WEBCLIENT.URLS.webindex + "api/annotations/?type=file&" + request, function(data){ var checkboxesAreVisible = $( "#fileanns_container input[type=checkbox]:visible" @@ -204,7 +204,7 @@ window.FileAnnsPane = function FileAnnsPane($element, objects) { // Update html... var html = ""; if (anns.length > 0) { - html = filesTempl({'anns': anns}); + html = filesTempl({'anns': anns, 'webindex': WEBCLIENT.URLS.webindex}); } $fileanns_container.html(html); @@ -275,7 +275,7 @@ window.CommentsPane = function CommentsPane($element, objects) { return o.replace("-", "="); }); - $.getJSON("/webclient/api/annotations/?type=comment&" + request, function(data){ + $.getJSON(WEBCLIENT.URLS.webindex + "api/annotations/?type=comment&" + request, function(data){ // manipulate data... @@ -292,16 +292,22 @@ window.CommentsPane = function CommentsPane($element, objects) { ann.link.owner = experimenters[ann.link.owner.id]; } ann.textValue = _.escape(ann.textValue); - // ann.description = _.escape(ann.description); return ann; }); + // Show most recent comments at the top + anns.sort(function(a, b) { + return a.date < b.date; + }); + console.log(anns); // Update html... var html = ""; if (anns.length > 0) { - html = commentsTempl({'anns': anns}); + html = commentsTempl({'anns': anns, + 'static': WEBCLIENT.URLS.static_webclient, + 'webindex': WEBCLIENT.URLS.webindex}); } $comments_container.html(html); diff --git a/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/annotations/comments_underscore.html b/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/annotations/comments_underscore.html index abd0db5062d..658039ba74f 100644 --- a/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/annotations/comments_underscore.html +++ b/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/annotations/comments_underscore.html @@ -18,8 +18,8 @@ <% if (ann.permissions.canDelete) { %> <% } %> diff --git a/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/annotations/fileanns_underscore.html b/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/annotations/fileanns_underscore.html index 73fff8eea11..50149695905 100644 --- a/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/annotations/fileanns_underscore.html +++ b/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/annotations/fileanns_underscore.html @@ -4,7 +4,7 @@ data-added-by="<%= ann.link.owner.id %>"> + href="<% if (ann.permissions.canDownload) { print(webindex + 'annotation/' + ann.id)} else {print('#') } %>"> <%= ann.file.name %> (<%= ann.file.size %>) @@ -25,12 +25,12 @@ <% if (ann.link.permissions.canDelete) { %> - + href='<%= webindex %>action/remove/file/<%= ann.id %>/'>- <% } %> <% if (ann.permissions.canDelete) { %> × + href="<%= webindex %>action/delete/file/<%= ann.id %>/"> × <% } %>
    diff --git a/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/annotations/tags_underscore.html b/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/annotations/tags_underscore.html index 2a2a1c2d0d4..3401dad041d 100644 --- a/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/annotations/tags_underscore.html +++ b/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/annotations/tags_underscore.html @@ -11,7 +11,7 @@ <% if (tag.link.permissions.canDelete) { %> + url='<%= webindex %>action/remove/tag/<%= tag.id %>/'> X <% } %> From 1798e778dc7f125946374fae60c97f3e0e816c94 Mon Sep 17 00:00:00 2001 From: Will Moore Date: Thu, 14 Apr 2016 22:25:44 +0100 Subject: [PATCH 013/103] Map Annotations loaded via json --- .../OmeroWeb/omeroweb/webclient/decorators.py | 7 +- .../webclient/javascript/ome.general_tab.js | 119 +++++++++++++++++- .../annotations/comments_underscore.html | 4 +- .../webclient/annotations/mapannotations.html | 46 +------ .../annotations/mapanns_underscore.html | 57 +++++++++ .../annotations/metadata_general.html | 7 +- .../webclient/base/base_container.html | 3 + .../templates/webclient/data/containers.html | 15 ++- .../tools/OmeroWeb/omeroweb/webclient/tree.py | 10 +- 9 files changed, 209 insertions(+), 59 deletions(-) create mode 100644 components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/annotations/mapanns_underscore.html diff --git a/components/tools/OmeroWeb/omeroweb/webclient/decorators.py b/components/tools/OmeroWeb/omeroweb/webclient/decorators.py index d19c00f5feb..c8f7158cc6f 100644 --- a/components/tools/OmeroWeb/omeroweb/webclient/decorators.py +++ b/components/tools/OmeroWeb/omeroweb/webclient/decorators.py @@ -117,10 +117,11 @@ def prepare_context(self, request, context, *args, **kwargs): conn = kwargs['conn'] # omero constants - context['omero'] = {'constants': {'namespaces': { + context['omero'] = {'constants': { 'NSCOMPANIONFILE': constants.namespaces.NSCOMPANIONFILE, - 'ORIGINALMETADATA': constants.annotation.file.ORIGINALMETADATA - }}} + 'ORIGINALMETADATA': constants.annotation.file.ORIGINALMETADATA, + 'NSCLIENTMAPANNOTATION': constants.metadata.NSCLIENTMAPANNOTATION + }} context.setdefault('ome', {}) # don't overwrite existing ome context['ome']['eventContext'] = conn.getEventContext diff --git a/components/tools/OmeroWeb/omeroweb/webclient/static/webclient/javascript/ome.general_tab.js b/components/tools/OmeroWeb/omeroweb/webclient/static/webclient/javascript/ome.general_tab.js index 0d1a933860e..3e2de3d8fb3 100644 --- a/components/tools/OmeroWeb/omeroweb/webclient/static/webclient/javascript/ome.general_tab.js +++ b/components/tools/OmeroWeb/omeroweb/webclient/static/webclient/javascript/ome.general_tab.js @@ -152,10 +152,6 @@ window.FileAnnsPane = function FileAnnsPane($element, objects) { }).bind(this); - var isOriginalMetadata = function isOriginalMetadata(ann) { - return (ann.ns === OMERO.constants.namespaces.NSCOMPANIONFILE && - ann.file.name === OMERO.constants.annotation.file.ORIGINALMETADATA); - }; var isNotCompanionFile = function isNotCompanionFile(ann) { return ann.ns !== OMERO.constants.namespaces.NSCOMPANIONFILE; }; @@ -232,6 +228,121 @@ window.FileAnnsPane = function FileAnnsPane($element, objects) { +window.MapAnnsPane = function MapAnnsPane($element, objects) { + + var $header = $element.children('h1'), + $body = $element.children('div'), + $mapAnnContainer = $("#mapAnnContainer"); + + var tmplText = $('#mapanns_template').html(); + var mapAnnsTempl = _.template(tmplText); + + + var initEvents = (function initEvents() { + + $header.click(function(){ + console.log('cic'); + $header.toggleClass('closed'); + $body.slideToggle(); + + var expanded = !$header.hasClass('closed'); + setExpanded('maps', expanded); + + if (expanded && $mapAnnContainer.is(":empty")) { + this.render(); + } + }.bind(this)); + }).bind(this); + + + var isClientMapAnn = function(ann) { + return ann.ns === OMERO.constants.metadata.NSCLIENTMAPANNOTATION; + }; + var isMyClientMapAnn = function(ann) { + return isClientMapAnn(ann) && ann.owner.id == WEBCLIENT.USER.id; + }; + + + this.render = function render() { + + if ($mapAnnContainer.is(":visible")) { + + if ($mapAnnContainer.is(":empty")) { + $mapAnnContainer.html("Loading key value annotations..."); + } + + var request = objects.map(function(o){ + return o.replace("-", "="); + }); + + $.getJSON(WEBCLIENT.URLS.webindex + "api/annotations/?type=map&" + request, function(data){ + + // manipulate data... + // make an object of eid: experimenter + var experimenters = data.experimenters.reduce(function(prev, exp){ + prev[exp.id + ""] = exp; + return prev; + }, {}); + + // Populate experimenters within anns + var anns = data.annotations.map(function(ann){ + ann.owner = experimenters[ann.owner.id]; + if (ann.link && ann.link.owner) { + ann.link.owner = experimenters[ann.link.owner.id]; + } + return ann; + }); + + // Sort map anns into 3 lists... + var client_map_annotations = []; + var my_client_map_annotations = []; + var map_annotations = []; + + anns.forEach(function(ann){ + if (isMyClientMapAnn(ann)) { + my_client_map_annotations.push(ann); + } else if (isClientMapAnn(ann)) { + client_map_annotations.push(ann); + } else { + map_annotations.push(ann); + } + }); + + console.log(my_client_map_annotations); + console.log(client_map_annotations); + console.log(map_annotations); + + // Update html... + var html = ""; + if (my_client_map_annotations.length === 0) { + my_client_map_annotations = [{}]; // placeholder + } + html = mapAnnsTempl({'anns': my_client_map_annotations, + 'showTableHead': true, 'showNs': false, 'clientMapAnn': true}); + html = html + mapAnnsTempl({'anns': client_map_annotations, + 'showTableHead': false, 'showNs': false, 'clientMapAnn': true}); + html = html + mapAnnsTempl({'anns': map_annotations, + 'showTableHead': false, 'showNs': true, 'clientMapAnn': false}); + $mapAnnContainer.html(html); + + // Finish up... + OME.filterAnnotationsAddedBy(); + $(".tooltip", $mapAnnContainer).tooltip_init(); + }); + } + }; + + + initEvents(); + + if (getExpanded('maps')) { + $header.toggleClass('closed'); + $body.show(); + } + + this.render(); +}; + diff --git a/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/annotations/comments_underscore.html b/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/annotations/comments_underscore.html index 658039ba74f..a6d2118a2c8 100644 --- a/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/annotations/comments_underscore.html +++ b/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/annotations/comments_underscore.html @@ -2,10 +2,10 @@
    - <%= ann.owner.firstName %> <%= ann.owner.lastName %> -
    +
    diff --git a/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/annotations/mapannotations.html b/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/annotations/mapannotations.html index 8ba6e642e9d..df066da67d5 100644 --- a/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/annotations/mapannotations.html +++ b/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/annotations/mapannotations.html @@ -340,7 +340,7 @@ }); // Select (and Start editing?) when you click a td - $( ".keyValueTable tbody" ).on( "click", "td", function(event) { + $("#mapAnnContainer").on( "click", ".keyValueTable tbody td", function(event) { var $td = $(event.target); // ignore clicks on other elements, e.g. if ($td[0].tagName.toLowerCase() != "td") return; @@ -357,7 +357,7 @@ // Handle keys when editing // Start editing when you click a td - $( ".editableKeyValueTable tbody" ).on( "keydown", "input", function(event) { + $("#mapAnnContainer").on( "keydown", ".editableKeyValueTable tbody input", function(event) { var $td = $(event.target).parent(); switch (event.which) { @@ -387,7 +387,7 @@ if (event.which == 9) return false }); - $( ".keyValueTable tbody" ).on( "blur", "input", function(event) { + $("#mapAnnContainer").on( "blur", ".keyValueTable tbody input", function(event) { saveEdit(); }); @@ -425,42 +425,4 @@
    -
    - -{% if manager.my_client_map_annotations %} - {% for ma in manager.my_client_map_annotations %} - {% with canEdit=ma.canEdit showTableHead=True %} - {% include "webclient/annotations/mapannotation.html" %} - {% endwith %} - {% endfor %} -{% elif manager.canAnnotate %} - - {% with canEdit=True %} - {% include "webclient/annotations/mapannotation.html" %} - {% endwith %} -{% endif %} - -{% if manager.client_map_annotations %} - -{% if manager.canAnnotate %} - -
    -{% endif %} - -{% for ma in manager.client_map_annotations %} - {% with canEdit=ma.canEdit %} - {% include "webclient/annotations/mapannotation.html" %} - {% endwith %} -{% endfor %} -{% endif %} - -{% if manager.map_annotations %} -
    -{% for ma in manager.map_annotations %} - {% with canEdit=False showNs=True %} - {% include "webclient/annotations/mapannotation.html" %} - {% endwith %} -{% endfor %} -{% endif %} - -
    +
    diff --git a/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/annotations/mapanns_underscore.html b/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/annotations/mapanns_underscore.html new file mode 100644 index 00000000000..5d12d45de22 --- /dev/null +++ b/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/annotations/mapanns_underscore.html @@ -0,0 +1,57 @@ +<% _.each(anns, function(ann) { %> + + + data-annId="<%= ann.id %>" + data-added-by="<%= ann.owner.id %>" + <% } else { %> + data-added-by="<%= WEBCLIENT.USER.id %>" + <% } %> + class="keyValueTable + <% if (!ann.id || (ann.permissions.canEdit && clientMapAnn)){ %> editableKeyValueTable <% } %> + "> + + + + + <% if (showTableHead) { %> + + + + + <% } %> + + <% if (showNs && ann.ns) { %> + + + + <% } %> + + + + <% if (ann.id) { %> + <% _.each(ann.values, function(row) { %> + + + + + <% }) %> + <% } else { %> + + + + + <% } %> +
    + <% if (ann.id) { %> + Added by: <%= ann.owner.firstName %> <%= ann.owner.lastName %> + + + <% } %> +
    KeyValue
    <%= ann.ns.slice(0, 50) %>
    <% print(_.escape(row['0'])) %><% print(_.escape(row['1'])) %>
    Add KeyAdd Value
    + +<% }) %> diff --git a/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/annotations/metadata_general.html b/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/annotations/metadata_general.html index 6b6e66b956b..a9744c3e531 100644 --- a/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/annotations/metadata_general.html +++ b/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/annotations/metadata_general.html @@ -37,6 +37,7 @@ var tagPane = new TagPane($("#tagsPane"), dataModel); var fileannsPane = new FileAnnsPane($("#fileannsPane"), dataModel); var commentsPane = new CommentsPane($("#commentsPane"), dataModel); + var mapAnnsPane = new MapAnnsPane($("#mapAnnsPane"), dataModel); var linkify = function(input) { @@ -915,14 +916,16 @@

    -

    +
    +

    Key-Value Pairs

    -
    + +
    diff --git a/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/base/base_container.html b/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/base/base_container.html index 694f2ed52e2..41c6f24fb0a 100644 --- a/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/base/base_container.html +++ b/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/base/base_container.html @@ -69,6 +69,9 @@ + diff --git a/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/data/containers.html b/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/data/containers.html index b2bd94b7835..fa309358989 100644 --- a/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/data/containers.html +++ b/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/data/containers.html @@ -57,10 +57,17 @@ // OMERO constants if (OMERO === undefined) {var OMERO = {};} - OMERO['constants'] = {'namespaces': { - 'NSCOMPANIONFILE': "{{ omero.constants.namespaces.NSCOMPANIONFILE }}", - 'ORIGINALMETADATA': "{{ omero.constants.namespaces.ORIGINALMETADATA }}" - }} + OMERO['constants'] = { + 'namespaces': { + 'NSCOMPANIONFILE': "{{ omero.constants.NSCOMPANIONFILE }}" + }, + 'annotation': { + 'file': {'ORIGINALMETADATA': "{{ omero.constants.ORIGINALMETADATA }}"} + }, + 'metadata': { + 'NSCLIENTMAPANNOTATION': "{{ omero.constants.NSCLIENTMAPANNOTATION }}" + } + }; // Variables used by static files, particularly ome.tree.js for jstree setup var WEBCLIENT = {}; diff --git a/components/tools/OmeroWeb/omeroweb/webclient/tree.py b/components/tools/OmeroWeb/omeroweb/webclient/tree.py index bf007721dba..4a6c3fb3694 100644 --- a/components/tools/OmeroWeb/omeroweb/webclient/tree.py +++ b/components/tools/OmeroWeb/omeroweb/webclient/tree.py @@ -1690,9 +1690,12 @@ def _marshal_annotation(conn, annotation, link=None): ann['type'] = annClass if annClass in ['TagAnnotationI', 'CommentAnnotationI']: ann['textValue'] = unwrap(annotation.textValue) - if annClass == 'LongAnnotationI': + elif annClass == 'LongAnnotationI': ann['longValue'] = unwrap(annotation.longValue) - if annClass == 'FileAnnotationI' and annotation.file: + elif annClass == 'MapAnnotationI': + kvs = [[kv.name, kv.value] for kv in annotation.getMapValue()] + ann['values'] = kvs + elif annClass == 'FileAnnotationI' and annotation.file: ann['file'] = {} ann['file']['id'] = annotation.file.id.val ann['file']['name'] = unwrap(annotation.file.name) @@ -1746,6 +1749,8 @@ def marshal_annotations(conn, project_ids=None, dataset_ids=None, where_clause.append('ch.class=CommentAnnotation') if ann_type == 'rating': where_clause.append('ch.class=LongAnnotation') + if ann_type == 'map': + where_clause.append('ch.class=MapAnnotation') dtypes = ["Project", "Dataset", "Image", "Screen", "Plate", "PlateAcquisition"] @@ -1762,6 +1767,7 @@ def marshal_annotations(conn, project_ids=None, dataset_ids=None, q = """ select oal from %sAnnotationLink as oal join fetch oal.details.creationEvent + join fetch oal.details.owner left outer join fetch oal.child as ch left outer join fetch oal.parent as pa join fetch ch.details.creationEvent From 84d0ebf10dd07f36612b486711d1df6ce05bd633 Mon Sep 17 00:00:00 2001 From: Will Moore Date: Thu, 14 Apr 2016 23:32:07 +0100 Subject: [PATCH 014/103] Handle canAnnotate() for map annotations --- .../webclient/javascript/ome.general_tab.js | 34 ++++++++++++------- .../annotations/metadata_general.html | 16 +++++---- 2 files changed, 32 insertions(+), 18 deletions(-) diff --git a/components/tools/OmeroWeb/omeroweb/webclient/static/webclient/javascript/ome.general_tab.js b/components/tools/OmeroWeb/omeroweb/webclient/static/webclient/javascript/ome.general_tab.js index 3e2de3d8fb3..64f484836a6 100644 --- a/components/tools/OmeroWeb/omeroweb/webclient/static/webclient/javascript/ome.general_tab.js +++ b/components/tools/OmeroWeb/omeroweb/webclient/static/webclient/javascript/ome.general_tab.js @@ -38,11 +38,13 @@ var getExpanded = function getExpanded(name) { }; -window.TagPane = function TagPane($element, objects) { +window.TagPane = function TagPane($element, opts) { var $header = $element.children('h1'), $body = $element.children('div'), - $tags_container = $("#tags_container"); + $tags_container = $("#tags_container"), + objects = opts.selected, + canAnnotate = opts.canAnnotate; var tmplText = $('#tags_template').html(); var tagTmpl = _.template(tmplText); @@ -126,11 +128,13 @@ window.TagPane = function TagPane($element, objects) { -window.FileAnnsPane = function FileAnnsPane($element, objects) { +window.FileAnnsPane = function FileAnnsPane($element, opts) { var $header = $element.children('h1'), $body = $element.children('div'), - $fileanns_container = $("#fileanns_container"); + $fileanns_container = $("#fileanns_container"), + objects = opts.selected, + canAnnotate = opts.canAnnotate; var tmplText = $('#fileanns_template').html(); var filesTempl = _.template(tmplText); @@ -228,11 +232,13 @@ window.FileAnnsPane = function FileAnnsPane($element, objects) { -window.MapAnnsPane = function MapAnnsPane($element, objects) { +window.MapAnnsPane = function MapAnnsPane($element, opts) { var $header = $element.children('h1'), $body = $element.children('div'), - $mapAnnContainer = $("#mapAnnContainer"); + $mapAnnContainer = $("#mapAnnContainer"), + objects = opts.selected, + canAnnotate = opts.canAnnotate; var tmplText = $('#mapanns_template').html(); var mapAnnsTempl = _.template(tmplText); @@ -314,11 +320,13 @@ window.MapAnnsPane = function MapAnnsPane($element, objects) { // Update html... var html = ""; - if (my_client_map_annotations.length === 0) { - my_client_map_annotations = [{}]; // placeholder - } - html = mapAnnsTempl({'anns': my_client_map_annotations, + if (canAnnotate) { + if (my_client_map_annotations.length === 0) { + my_client_map_annotations = [{}]; // placeholder + } + html = mapAnnsTempl({'anns': my_client_map_annotations, 'showTableHead': true, 'showNs': false, 'clientMapAnn': true}); + } html = html + mapAnnsTempl({'anns': client_map_annotations, 'showTableHead': false, 'showNs': false, 'clientMapAnn': true}); html = html + mapAnnsTempl({'anns': map_annotations, @@ -346,11 +354,13 @@ window.MapAnnsPane = function MapAnnsPane($element, objects) { -window.CommentsPane = function CommentsPane($element, objects) { +window.CommentsPane = function CommentsPane($element, opts) { var $header = $element.children('h1'), $body = $element.children('div'), - $comments_container = $("#comments_container"); + $comments_container = $("#comments_container"), + objects = opts.selected, + canAnnotate = opts.canAnnotate; var tmplText = $('#comments_template').html(); var commentsTempl = _.template(tmplText); diff --git a/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/annotations/metadata_general.html b/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/annotations/metadata_general.html index a9744c3e531..f9265f02b4c 100644 --- a/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/annotations/metadata_general.html +++ b/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/annotations/metadata_general.html @@ -29,15 +29,19 @@ // Delegate to sub-views to handle content of each collapsible panel - var dataModel = ["{{ manager.obj_type }}-{{ manager.obj_id }}"]; + var selectedObjs = ["{{ manager.obj_type }}-{{ manager.obj_id }}"]; {% if manager.well.getWellSample.image %} - dataModel = ["image-{{ manager.well.getWellSample.image.id }}"]; + selectedObjs = ["image-{{ manager.well.getWellSample.image.id }}"]; {% endif %} + var annPaneData = { + 'selected': selectedObjs, + 'canAnnotate': {% if manager.canAnnotate %}true{% else %}false{% endif %} + } - var tagPane = new TagPane($("#tagsPane"), dataModel); - var fileannsPane = new FileAnnsPane($("#fileannsPane"), dataModel); - var commentsPane = new CommentsPane($("#commentsPane"), dataModel); - var mapAnnsPane = new MapAnnsPane($("#mapAnnsPane"), dataModel); + var tagPane = new TagPane($("#tagsPane"), annPaneData); + var fileannsPane = new FileAnnsPane($("#fileannsPane"), annPaneData); + var commentsPane = new CommentsPane($("#commentsPane"), annPaneData); + var mapAnnsPane = new MapAnnsPane($("#mapAnnsPane"), annPaneData); var linkify = function(input) { From a292d239822faa047f9441af05238a8db3246f20 Mon Sep 17 00:00:00 2001 From: Will Moore Date: Fri, 15 Apr 2016 13:19:32 +0100 Subject: [PATCH 015/103] Ratings pane --- .../webclient/static/webclient/css/layout.css | 2 +- .../webclient/javascript/ome.general_tab.js | 106 ++++++++++++++++++ .../annotations/metadata_general.html | 35 ++---- .../annotations/ratings_underscore.html | 20 ++++ .../webclient/base/base_container.html | 3 + .../tools/OmeroWeb/omeroweb/webclient/tree.py | 1 + 6 files changed, 138 insertions(+), 29 deletions(-) create mode 100644 components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/annotations/ratings_underscore.html diff --git a/components/tools/OmeroWeb/omeroweb/webclient/static/webclient/css/layout.css b/components/tools/OmeroWeb/omeroweb/webclient/static/webclient/css/layout.css index e08ec558a4a..9356a85e240 100644 --- a/components/tools/OmeroWeb/omeroweb/webclient/static/webclient/css/layout.css +++ b/components/tools/OmeroWeb/omeroweb/webclient/static/webclient/css/layout.css @@ -430,7 +430,7 @@ } /* Rating */ - #rating_annotations { + #rating_annotations ul { border-color: transparent; } .rating { diff --git a/components/tools/OmeroWeb/omeroweb/webclient/static/webclient/javascript/ome.general_tab.js b/components/tools/OmeroWeb/omeroweb/webclient/static/webclient/javascript/ome.general_tab.js index 64f484836a6..bd24487ee53 100644 --- a/components/tools/OmeroWeb/omeroweb/webclient/static/webclient/javascript/ome.general_tab.js +++ b/components/tools/OmeroWeb/omeroweb/webclient/static/webclient/javascript/ome.general_tab.js @@ -352,6 +352,112 @@ window.MapAnnsPane = function MapAnnsPane($element, opts) { }; +window.RatingsPane = function RatingsPane($element, opts) { + + var $header = $element.children('h1'), + $body = $element.children('div'), + $rating_annotations = $("#rating_annotations"), + objects = opts.selected, + canAnnotate = opts.canAnnotate; + + var tmplText = $('#ratings_template').html(); + var ratingsTempl = _.template(tmplText); + + + var initEvents = (function initEvents() { + + $header.click(function(){ + $header.toggleClass('closed'); + $body.slideToggle(); + + var expanded = !$header.hasClass('closed'); + setExpanded('ratings', expanded); + + if (expanded && $rating_annotations.is(":empty")) { + this.render(); + } + }.bind(this)); + }).bind(this); + + + var isClientMapAnn = function(ann) { + return ann.ns === OMERO.constants.metadata.NSCLIENTMAPANNOTATION; + }; + var isMyClientMapAnn = function(ann) { + return isClientMapAnn(ann) && ann.owner.id == WEBCLIENT.USER.id; + }; + + + this.render = function render() { + + if ($rating_annotations.is(":visible")) { + + if ($rating_annotations.is(":empty")) { + $rating_annotations.html("Loading ratings..."); + } + + var request = objects.map(function(o){ + return o.replace("-", "="); + }); + + $.getJSON(WEBCLIENT.URLS.webindex + "api/annotations/?type=rating&" + request, function(data){ + + // manipulate data... + // make an object of eid: experimenter + // var experimenters = data.experimenters.reduce(function(prev, exp){ + // prev[exp.id + ""] = exp; + // return prev; + // }, {}); + + // // Populate experimenters within anns + // var anns = data.annotations.map(function(ann){ + // ann.owner = experimenters[ann.owner.id]; + // if (ann.link && ann.link.owner) { + // ann.link.owner = experimenters[ann.link.owner.id]; + // } + // return ann; + // }); + var anns = data.annotations; + console.log(anns); + + var sum = anns.reduce(function(prev, ann){ + return prev + ann.longValue; + }, 0); + var myRatings = anns.filter(function(ann){ + return ann.owner.id == WEBCLIENT.USER.id; + }); + var myRating = myRatings.length > 0 ? myRatings[0].longValue : 0; + var average = Math.round(sum/anns.length); + console.log('myRating', myRating); + + // Update html... + var html = ""; + if (anns.length > 0) { + html = ratingsTempl({'anns': anns, + 'myRating': myRating, + 'average': average, + 'count': anns.length, + 'static': WEBCLIENT.URLS.static_webclient}); + } + $rating_annotations.html(html); + + // Finish up... + OME.filterAnnotationsAddedBy(); + $(".tooltip", $rating_annotations).tooltip_init(); + }); + } + }; + + + initEvents(); + + if (getExpanded('ratings')) { + $header.toggleClass('closed'); + $body.show(); + } + + this.render(); +}; window.CommentsPane = function CommentsPane($element, opts) { diff --git a/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/annotations/metadata_general.html b/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/annotations/metadata_general.html index f9265f02b4c..7cd669bab87 100644 --- a/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/annotations/metadata_general.html +++ b/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/annotations/metadata_general.html @@ -42,6 +42,7 @@ var fileannsPane = new FileAnnsPane($("#fileannsPane"), annPaneData); var commentsPane = new CommentsPane($("#commentsPane"), annPaneData); var mapAnnsPane = new MapAnnsPane($("#mapAnnsPane"), annPaneData); + var ratingsPane = new RatingsPane($("#ratingsPane"), annPaneData); var linkify = function(input) { @@ -900,7 +901,7 @@

    -

    +

    Tags


    diff --git a/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/annotations/fileanns_underscore.html b/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/annotations/fileanns_underscore.html index 50149695905..1a06098cba5 100644 --- a/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/annotations/fileanns_underscore.html +++ b/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/annotations/fileanns_underscore.html @@ -1,7 +1,7 @@ <% _.each(anns, function(ann) { %>
  • + data-added-by=""> @@ -10,15 +10,34 @@
    From 26dc4236fa5e7ead4c22d30a833dbca369e70eb3 Mon Sep 17 00:00:00 2001 From: Will Moore Date: Tue, 19 Apr 2016 22:23:34 +0100 Subject: [PATCH 033/103] Remove duplicated file_ann code from batch_annotate.html This is all now covered by the FileAnnsPane --- .../webclient/annotations/batch_annotate.html | 65 ------------------- 1 file changed, 65 deletions(-) diff --git a/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/annotations/batch_annotate.html b/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/annotations/batch_annotate.html index 8c7b53ba658..8b27f36443e 100644 --- a/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/annotations/batch_annotate.html +++ b/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/annotations/batch_annotate.html @@ -167,71 +167,6 @@ }); - // set-up the attachment selection form to use AJAX. (requires jquery.form.js plugin) - if ($("#choose_attachments_form").length === 0) { - $("
    {% csrf_token %}") - .hide().appendTo('body'); - } - $('#choose_attachments_form').ajaxForm({ - beforeSubmit: function(data) { - $("#choose_attachments_form").dialog( "close" ); - $("#fileann_spinner").show(); - }, - success: function(data) { - $("#fileann_spinner").hide(); - // update the list of file annotations and hide actions - var $fileanns = $($.trim(data)); - $fileanns.filter(".file_ann_wrapper").each(function(){ - $("#"+$(this).attr("id")).remove(); // if this File already exists, remove it - $("#fileanns_container").prepend( this ).show(); - }); - $fileanns.tooltip({ - items: '.file_ann_wrapper', - content: function() { - return $("span.tooltip_html", $(this)).html(); - }, - track: true, - show: false, - hide: false - }); - show_batch_msg("File Annotation(s) added to Objects"); - OME.filterAnnotationsAddedBy(); - OME.fileAnnotationCheckboxDynamicallyAdded(); - }, - error: function(data){ - $("#fileann_spinner").hide(); - alert("Upload failed [" + data.status + " " + data.statusText + "]"); - } - }); - // prepare dialog for choosing file to attach... - $("#choose_attachments_form").dialog({ - autoOpen: false, - resizable: true, - height: 400, - width:420, - modal: true, - buttons: { - "Accept": function() { - // simply submit the form (AJAX handling set-up above) - $("#choose_attachments_form").submit(); - $( this ).dialog( "close" ); - }, - "Cancel": function() { - $( this ).dialog( "close" ); - } - } - }); - // show dialog for choosing file to attach... - $("#choose_file_anns").click(function() { - // show dialog first, then do the AJAX call to load files... - var attach_form = $( "#choose_attachments_form" ); - attach_form.dialog( "open" ); - // load form via AJAX... - var load_url = $(this).attr('href'); - attach_form.load(load_url); - return false; - }); - $(".tooltip_title").tooltip({ items: '.tooltip_title', content: function() { From b83882caf3adb354ec3a7f4f54dca17bf4655820 Mon Sep 17 00:00:00 2001 From: Will Moore Date: Tue, 19 Apr 2016 23:43:58 +0100 Subject: [PATCH 034/103] Comments working in batch_annotate panel --- .../ome.right_panel_comments_pane.js | 17 ++- .../ome.right_panel_fileanns_pane.js | 2 +- .../javascript/ome.right_panel_tags_pane.js | 2 +- .../webclient/annotations/batch_annotate.html | 142 +++++++----------- 4 files changed, 64 insertions(+), 99 deletions(-) diff --git a/components/tools/OmeroWeb/omeroweb/webclient/static/webclient/javascript/ome.right_panel_comments_pane.js b/components/tools/OmeroWeb/omeroweb/webclient/static/webclient/javascript/ome.right_panel_comments_pane.js index 4a5b378a2eb..fb162ab13e7 100644 --- a/components/tools/OmeroWeb/omeroweb/webclient/static/webclient/javascript/ome.right_panel_comments_pane.js +++ b/components/tools/OmeroWeb/omeroweb/webclient/static/webclient/javascript/ome.right_panel_comments_pane.js @@ -23,6 +23,7 @@ var CommentsPane = function CommentsPane($element, opts) { objects = opts.selected, index = opts.index, canAnnotate = opts.canAnnotate; + var self = this; var tmplText = $('#comments_template').html(); var commentsTempl = _.template(tmplText); @@ -70,12 +71,7 @@ var CommentsPane = function CommentsPane($element, opts) { if ($.trim(textArea.val()).length === 0) return false; }, success: function(html) { - var $comment = $($.trim(html)); - OME.linkify_element($comment); - $('#comments_container').prepend( $comment ).show(); - var textArea = $('#add_comment_form textarea'); - textArea.val(''); - OME.filterAnnotationsAddedBy(); + self.render(); }, }); @@ -91,6 +87,7 @@ var CommentsPane = function CommentsPane($element, opts) { var request = objects.map(function(o){ return o.replace("-", "="); }); + request = request.join("&"); $.getJSON(WEBCLIENT.URLS.webindex + "api/annotations/?type=comment&" + request, function(data){ @@ -114,7 +111,13 @@ var CommentsPane = function CommentsPane($element, opts) { // Show most recent comments at the top anns.sort(function(a, b) { - return a.date < b.date; + return a.date < b.date ? 1 : -1; + }); + + // Remove duplicates (same comment on multiple objects) + anns = anns.filter(function(ann, idx){ + // already sorted, so just compare with last item + return (idx === 0 || anns[idx - 1].id !== ann.id); }); // Update html... diff --git a/components/tools/OmeroWeb/omeroweb/webclient/static/webclient/javascript/ome.right_panel_fileanns_pane.js b/components/tools/OmeroWeb/omeroweb/webclient/static/webclient/javascript/ome.right_panel_fileanns_pane.js index 6b39280d83d..8ad44e98929 100644 --- a/components/tools/OmeroWeb/omeroweb/webclient/static/webclient/javascript/ome.right_panel_fileanns_pane.js +++ b/components/tools/OmeroWeb/omeroweb/webclient/static/webclient/javascript/ome.right_panel_fileanns_pane.js @@ -111,7 +111,7 @@ var FileAnnsPane = function FileAnnsPane($element, opts) { }; var compareParentName = function(a, b){ - return a.parent.name > b.parent.name; + return a.parent.name.toLowerCase() > b.parent.name.toLowerCase() ? 1 : -1; }; diff --git a/components/tools/OmeroWeb/omeroweb/webclient/static/webclient/javascript/ome.right_panel_tags_pane.js b/components/tools/OmeroWeb/omeroweb/webclient/static/webclient/javascript/ome.right_panel_tags_pane.js index aaa3d7bb69c..751f1a87a08 100644 --- a/components/tools/OmeroWeb/omeroweb/webclient/static/webclient/javascript/ome.right_panel_tags_pane.js +++ b/components/tools/OmeroWeb/omeroweb/webclient/static/webclient/javascript/ome.right_panel_tags_pane.js @@ -43,7 +43,7 @@ var TagPane = function TagPane($element, opts) { }).bind(this); var compareParentName = function(a, b){ - return a.parent.name > b.parent.name; + return a.parent.name.toLowerCase() > b.parent.name.toLowerCase() ? 1 : -1; }; this.render = function render() { diff --git a/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/annotations/batch_annotate.html b/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/annotations/batch_annotate.html index 8b27f36443e..a3ab6bbb180 100644 --- a/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/annotations/batch_annotate.html +++ b/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/annotations/batch_annotate.html @@ -63,6 +63,7 @@ var tagPane = new TagPane($("#tagsPane"), annPaneData); var fileannsPane = new FileAnnsPane($("#fileannsPane"), annPaneData); + var commentsPane = new CommentsPane($("#commentsPane"), annPaneData); // show a link to the current objects @@ -76,33 +77,6 @@ $("#link_info_popup").hide(); }); - // handle submit of Add Comment form - $("#add_comment_form").ajaxForm({ - beforeSubmit: function(data) { - var textArea = $('#add_comment_form textarea'); - if ($.trim(textArea.val()).length == 0) { - show_batch_msg("Comment field was empty"); - return false; - } - $("#comment_spinner").show(); - }, - success: function(html) { - $("#comment_spinner").hide(); - var $comment = $($.trim(html)); - $('#comments_container').prepend( $comment ).show(); - $(".removeComment", $comment).hide(); - var textArea = $('#add_comment_form textarea'); - textArea.val(''); - show_batch_msg("Comment added to Objects"); - OME.filterAnnotationsAddedBy(); - }, - error: function(html) { - show_batch_msg(html); - $("#comment_spinner").hide(); - } - }); - - $(".dropdown_menu .menu_launch").click(function(e){ $(this).parent().find('ul').css('visibility', 'visible'); @@ -396,77 +370,65 @@

    -

    - Attachments -

    -
    -
    - - - - + +
    +

    + Comments +

    + +
    - - - - {% if not annotationBlocked %} -
    - -

    {% trans "Comment:" %}

    - -
    {% csrf_token %} - - - - - - - - - - - - - - -
    {{ form_comment.image }}
    {{ form_comment.dataset }}
    {{ form_comment.project }}
    {{ form_comment.screen }}
    {{ form_comment.plate }}
    {{ form_comment.acquisition }}
    {{ form_comment.well }}
    {{ form_comment.comment }}
    - - -
    -
    - -
    - {% for tann in manager.text_annotations %} - {% include "webclient/annotations/comment.html" %} - {% endfor %} -
    - -
    - -
    - {% endif %} -

    {% endblock %} From 5dc550ebbacd546d8f3a7b2bfd4c885140f05aaa Mon Sep 17 00:00:00 2001 From: Will Moore Date: Wed, 20 Apr 2016 11:22:29 +0100 Subject: [PATCH 035/103] Remove old ome.general_tab.js script --- .../webclient/templates/webclient/base/base_container.html | 1 - 1 file changed, 1 deletion(-) diff --git a/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/base/base_container.html b/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/base/base_container.html index dafa3a554ca..56a6a07b060 100644 --- a/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/base/base_container.html +++ b/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/base/base_container.html @@ -87,7 +87,6 @@ - From 047e1739f5dd857f46a9289a34d6357c19e0dd50 Mon Sep 17 00:00:00 2001 From: William Moore Date: Wed, 20 Apr 2016 22:14:49 +0100 Subject: [PATCH 036/103] Fix Robot tests for right panel --- components/tests/ui/resources/web/tree.txt | 10 +++++----- .../ui/testcases/web/center_right_panel_tests.txt | 12 ++++++++---- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/components/tests/ui/resources/web/tree.txt b/components/tests/ui/resources/web/tree.txt index c0c73a47251..221c59cd179 100644 --- a/components/tests/ui/resources/web/tree.txt +++ b/components/tests/ui/resources/web/tree.txt @@ -283,11 +283,11 @@ Wait Until Right Panel Loads Everything Wait Until Right Panel Loads ${containerType} ${containerId} Wait Until Element Is Visible xpath=//*[@id="general_tab"]/h1[contains(text(),'${containerType} Details')] - Wait Until Element Is Visible xpath=//*[@id="general_tab"]/h1[contains(text(),'Tags')] - Wait Until Element Is Visible xpath=//*[@id="general_tab"]/h1[contains(text(),'Key-Value Pairs')] - Wait Until Element Is Visible xpath=//*[@id="general_tab"]/h1[contains(text(),'Attachments')] - Wait Until Element Is Visible xpath=//*[@id="general_tab"]/h1[contains(text(),'Ratings')] - Wait Until Element Is Visible xpath=//*[@id="general_tab"]/h1[contains(text(),'Comments')] + Wait Until Element Is Visible xpath=//*[@id="general_tab"]/div/h1[contains(text(),'Tags')] + Wait Until Element Is Visible xpath=//*[@id="general_tab"]/div/h1[contains(text(),'Key-Value Pairs')] + Wait Until Element Is Visible xpath=//*[@id="general_tab"]/div/h1[contains(text(),'Attachments')] + Wait Until Element Is Visible xpath=//*[@id="general_tab"]/div/h1[contains(text(),'Ratings')] + Wait Until Element Is Visible xpath=//*[@id="general_tab"]/div/h1[contains(text(),'Comments')] Run Keyword If '${containerType}' == 'Project' Wait Until Element Is Visible ${detailsPane}//th[contains(text(),'Creation Date:')] Run Keyword If '${containerType}' == 'Dataset' Wait Until Element Is Visible ${detailsPane}//th[contains(text(),'Creation Date:')] Run Keyword If '${containerType}' == 'Image' Check Right Panel Image diff --git a/components/tests/ui/testcases/web/center_right_panel_tests.txt b/components/tests/ui/testcases/web/center_right_panel_tests.txt index 543e505f231..400afc95e37 100644 --- a/components/tests/ui/testcases/web/center_right_panel_tests.txt +++ b/components/tests/ui/testcases/web/center_right_panel_tests.txt @@ -34,21 +34,25 @@ Wait Until Right Panel Loads For MultiSelection Wait Until Element Is Visible xpath=//*[@id="metadata_general"]//div/button[contains(@title, 'Download Image as...')] Wait Until Element Is Visible xpath=//*[@id="show_link_btn"]/span - Wait Until Element Is Visible xpath=//*[@id="metadata_general"]//div/h2[contains(text(), 'Annotations')] + Wait Until Element Is Visible xpath=//*[@id="metadata_general"]//div/h1[contains(text(), 'Attachments')] Wait Until Element Is Visible xpath=//*[@id="annotationFilter"] Wait Until Element Is Visible xpath=//*[@id="metadata_general"]//div/h2[contains(text(), 'Rating')] Wait Until Element Is Visible xpath=//*[@id="add_rating"]/span - Wait Until Element Is Visible xpath=//*[@id="metadata_general"]//div/h2[contains(text(), 'Tags')] + Wait Until Element Is Visible xpath=//*[@id="metadata_general"]//div/h1[contains(text(), 'Tags')] + Click Element xpath=//*[@id="metadata_general"]//div/h1[contains(text(), 'Tags')] Wait Until Element Is Visible xpath=//*[@id="launch_tags_form"]/span - Wait Until Element Is Visible xpath=//*[@id="metadata_general"]//div/h2[contains(text(), 'Attach')] + Wait Until Element Is Visible xpath=//*[@id="metadata_general"]//div/h1[contains(text(), 'Attachments')] + Click Element xpath=//*[@id="metadata_general"]//div/h1[contains(text(), 'Attachments')] Wait Until Element Is Visible xpath=//*[@id="metadata_general"]//div/input[contains(@title, 'Select Files for Scripts')] Wait Until Element Is Visible xpath=//*[@id="choose_file_anns"]/span - Wait Until Element Is Visible xpath=//*[@id="metadata_general"]//div/h2[contains(text(), 'Comment')] + Wait Until Element Is Visible xpath=//*[@id="metadata_general"]//div/h1[contains(text(), 'Comments')] + Click Element xpath=//*[@id="metadata_general"]//div/h1[contains(text(), 'Comments')] Wait Until Element Is Visible xpath=//*[@id="id_comment"] + Click Element xpath=//*[@id="id_comment"] Wait Until Element Is Visible xpath=//*[@id="add_comment_form"]//td/input[contains(@value, 'Add Comment')] Element Should Not Be Visible xpath=//*[@id="general_tab"] From 905c85023f7b0bdfede5c1b56098bfc2938f3bad Mon Sep 17 00:00:00 2001 From: William Moore Date: Wed, 20 Apr 2016 22:27:18 +0100 Subject: [PATCH 037/103] Fixing more Robot batch annotate tests --- components/tests/ui/testcases/web/forms_test.txt | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/components/tests/ui/testcases/web/forms_test.txt b/components/tests/ui/testcases/web/forms_test.txt index 3303c2232e2..8a18898316b 100644 --- a/components/tests/ui/testcases/web/forms_test.txt +++ b/components/tests/ui/testcases/web/forms_test.txt @@ -144,11 +144,15 @@ Test Batch Annotate Wait Until Page Contains Element id=batch_ann_title # Comment Form + Click Element xpath=//*[@id="metadata_general"]//div/h1[contains(text(), 'Comments')] + Wait Until Element Is Visible id=id_comment Input Text comment test add comment Click Button Add Comment Wait Until Page Contains test add comment # Tags + Click Element xpath=//*[@id="metadata_general"]//div/h1[contains(text(), 'Tags')] + Wait Until Element Is Visible id=launch_tags_form Click Element launch_tags_form Wait Until Page Contains Element id_tag # Wait for tag panel being loded @@ -160,6 +164,8 @@ Test Batch Annotate Wait Until Page Contains Element xpath=//div[@class='tag']/a[contains(text(), testSeleniumTag${pid})] ${WAIT} # Files + Click Element xpath=//*[@id="metadata_general"]//div/h1[contains(text(), 'Attachments')] + Wait Until Element Is Visible id=choose_file_anns Click Element choose_file_anns Wait Until Page Contains Element id_files Click Element xpath=//select[@id='id_files']/option # just pick first file From 2a80c9b683a07df02c318f285c95137d2e3223a6 Mon Sep 17 00:00:00 2001 From: William Moore Date: Wed, 20 Apr 2016 23:28:55 +0100 Subject: [PATCH 038/103] Fix display of Tables data for Well --- .../annotations/metadata_general.html | 35 +++++++++++++------ 1 file changed, 25 insertions(+), 10 deletions(-) diff --git a/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/annotations/metadata_general.html b/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/annotations/metadata_general.html index a8ed96ee8b8..68a8df4af9e 100644 --- a/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/annotations/metadata_general.html +++ b/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/annotations/metadata_general.html @@ -495,17 +495,33 @@ hide: false }); } - // Load tables if tables tab is open - if (open_panes.indexOf("tables") > -1) { - loadBulkAnnotations(wellsUrl, wellId, showBulkAnnTooltip); - loadBulkAnnotations(linksUrl, wellId, showBulkAnnTooltip); - } // If user opens tables tab, also load tables $('.can-collapse.closed[data-name="tables"]').click(function(){ + var $header = $(this), + $body = $header.next(); + + $header.toggleClass('closed'); + $body.slideToggle(); + + var expanded = !$header.hasClass('closed'); + OME.setPaneExpanded('tables', expanded); + + if (expanded && $("#bulk_annotations_table").is(":empty")) { + loadBulkAnnotations(wellsUrl, wellId, showBulkAnnTooltip); + loadBulkAnnotations(linksUrl, wellId, showBulkAnnTooltip); + } + }); + + // Load tables if tables tab is open + if (OME.getPaneExpanded("tables")) { + $('.can-collapse.closed[data-name="tables"]') + .toggleClass('closed') + .next().slideToggle(); loadBulkAnnotations(wellsUrl, wellId, showBulkAnnTooltip); loadBulkAnnotations(linksUrl, wellId, showBulkAnnTooltip); - }); + } + {% endif %} }); @@ -815,15 +831,14 @@

    {% if manager.well %} -

    +

    Tables

    -
    + From 5b5f661873906a47283fdcefc3c3ed7fb4fafe00 Mon Sep 17 00:00:00 2001 From: William Moore Date: Thu, 21 Apr 2016 22:36:21 +0100 Subject: [PATCH 039/103] Rating working on batch_annotation panel --- .../ome.right_panel_ratings_pane.js | 7 +-- .../webclient/annotations/batch_annotate.html | 47 ++++--------------- 2 files changed, 10 insertions(+), 44 deletions(-) diff --git a/components/tools/OmeroWeb/omeroweb/webclient/static/webclient/javascript/ome.right_panel_ratings_pane.js b/components/tools/OmeroWeb/omeroweb/webclient/static/webclient/javascript/ome.right_panel_ratings_pane.js index 56680ce1c92..f3b423c49f2 100644 --- a/components/tools/OmeroWeb/omeroweb/webclient/static/webclient/javascript/ome.right_panel_ratings_pane.js +++ b/components/tools/OmeroWeb/omeroweb/webclient/static/webclient/javascript/ome.right_panel_ratings_pane.js @@ -62,6 +62,7 @@ var RatingsPane = function RatingsPane($element, opts) { var request = objects.map(function(o){ return o.replace("-", "="); }); + request = request.join("&"); $.getJSON(WEBCLIENT.URLS.webindex + "api/annotations/?type=rating&" + request, function(data){ @@ -74,12 +75,6 @@ var RatingsPane = function RatingsPane($element, opts) { }); var myRating = myRatings.length > 0 ? myRatings[0].longValue : 0; var average = Math.round(sum/anns.length); - console.log('myRating', myRating); - - // Manual UI update... - // if (myRating) { - // $("#add_rating").hide(); - // }; // Update html... var html = ratingsTempl({'anns': anns, diff --git a/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/annotations/batch_annotate.html b/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/annotations/batch_annotate.html index a3ab6bbb180..edf8001b14b 100644 --- a/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/annotations/batch_annotate.html +++ b/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/annotations/batch_annotate.html @@ -64,6 +64,7 @@ var tagPane = new TagPane($("#tagsPane"), annPaneData); var fileannsPane = new FileAnnsPane($("#fileannsPane"), annPaneData); var commentsPane = new CommentsPane($("#commentsPane"), annPaneData); + var ratingsPane = new RatingsPane($("#ratingsPane"), annPaneData); // show a link to the current objects @@ -306,44 +307,14 @@

    {{ annotationBlocked }}

    - -
    - -

    {% trans "Rating" %}

    - - {% if not annotationBlocked %} - 0 %}style="display:none"{% endif %} class="btn silver btn_add"> - {% endif %} - - - -
    - (avg: - {{ ratings.average }} - / {{ ratings.count }} - votes) -
    -
    +
    +

    + Ratings +

    + +
    From 3b956e7ea827431ac70623e6cd862d84a86ff7c8 Mon Sep 17 00:00:00 2001 From: William Moore Date: Thu, 21 Apr 2016 23:11:42 +0100 Subject: [PATCH 040/103] Move ratings jQuery code to RatingsPane to avoid duplication --- .../ome.right_panel_ratings_pane.js | 47 +++++++++++-- .../webclient/annotations/batch_annotate.html | 61 ----------------- .../annotations/metadata_general.html | 66 ------------------- 3 files changed, 42 insertions(+), 132 deletions(-) diff --git a/components/tools/OmeroWeb/omeroweb/webclient/static/webclient/javascript/ome.right_panel_ratings_pane.js b/components/tools/OmeroWeb/omeroweb/webclient/static/webclient/javascript/ome.right_panel_ratings_pane.js index f3b423c49f2..e29fa045994 100644 --- a/components/tools/OmeroWeb/omeroweb/webclient/static/webclient/javascript/ome.right_panel_ratings_pane.js +++ b/components/tools/OmeroWeb/omeroweb/webclient/static/webclient/javascript/ome.right_panel_ratings_pane.js @@ -21,8 +21,14 @@ var RatingsPane = function RatingsPane($element, opts) { $body = $element.children('div'), $rating_annotations = $("#rating_annotations"), objects = opts.selected, + index = opts.index, canAnnotate = opts.canAnnotate; + var request = objects.map(function(o){ + return o.replace("-", "="); + }); + request = request.join("&"); + var tmplText = $('#ratings_template').html(); var ratingsTempl = _.template(tmplText); @@ -43,6 +49,42 @@ var RatingsPane = function RatingsPane($element, opts) { }).bind(this); + $("#rating_annotations").on("click", ".myRating img", function(event){ + var $rating = $(this), + clickX = event.pageX - $rating.offset().left; + var r = (clickX/ $rating.width()) * 5; + r = parseInt(Math.ceil(r), 10); + setRating(r, $rating); + }); + + $("#rating_annotations").on("click", ".removeRating", function(event){ + var $liMyRating = $(this).parent(), + $ratingimg = $liMyRating.find('img'); + setRating(0, $ratingimg); + }); + + var setRating = function(rating, $rating) { + // update rating + if ($rating) { + var rating_src = WEBCLIENT.URLS.static_webclient + "image/rating" + rating + ".png"; + $rating.attr('src', rating_src); + } + // update rating annotation + var rating_url = WEBCLIENT.URLS.webindex + "annotate_rating/?" + request + "&index=" + index; + rating_url += "&rating=" + rating; + $.post(rating_url, function(data) { + // update summary + $("#ratingsAverage").text(data.average); + $("#ratingsCount").text(data.count); + if (data.count > 0) { + $("#ratingsSummary").show(); + } else { + $("#ratingsSummary").hide(); + } + }); + }; + + var isClientMapAnn = function(ann) { return ann.ns === OMERO.constants.metadata.NSCLIENTMAPANNOTATION; }; @@ -59,11 +101,6 @@ var RatingsPane = function RatingsPane($element, opts) { $rating_annotations.html("Loading ratings..."); } - var request = objects.map(function(o){ - return o.replace("-", "="); - }); - request = request.join("&"); - $.getJSON(WEBCLIENT.URLS.webindex + "api/annotations/?type=rating&" + request, function(data){ var anns = data.annotations; diff --git a/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/annotations/batch_annotate.html b/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/annotations/batch_annotate.html index edf8001b14b..7e9fa28904b 100644 --- a/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/annotations/batch_annotate.html +++ b/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/annotations/batch_annotate.html @@ -178,67 +178,6 @@ OME.filterAnnotationsAddedBy(); }); - // Rating - // NB: similar functionality on metadata_general.html - $("#add_rating").click(function(){ - $(".myRating").toggle(); - }); - - $("#rating_annotations").on("click", ".myRating img", function(event){ - var $rating = $(this), - clickX = event.pageX - $rating.offset().left; - var r = (clickX/ $rating.width()) * 5; - r = parseInt(Math.ceil(r)); - setRating(r, $rating); - }); - // $(".addRating img").click(function(event){ - // var $rating = $(this), - // $ratingli = $rating.parent().parent(), - // clickX = event.pageX - $rating.offset().left; - // var r = (clickX/ $rating.width()) * 5; - // r = parseInt(Math.ceil(r)); - // var $newR = $ratingli.clone().prependTo("#rating_annotations"); - // $newR.removeClass('addRating').addClass('myRating'); - // $ratingli.hide(); - - // setRating(r, $newR.find('img')); - // }); - $("#rating_annotations").on("click", ".removeRating", function(event){ - event.preventDefault(); - var $liMyRating = $(this).parent(), - $ratingimg = $liMyRating.find('img'); - $liMyRating.hide(); - setRating(0, $ratingimg); - }); - - var setRating = function(rating, $rating) { - // update rating - if ($rating) { - var rating_src = "{% static 'webclient/image/rating0.png' %}".replace("0.png", rating+".png"); - $rating.attr('src', rating_src); - } - $(".ratingCount").text("{{ obj_labels|length }}"); - // hide the [+] button if we have set a rating - if (rating > 0) { - $("#add_rating").hide() - } else { - $("#add_rating").show() - } - // update rating annotation - var rating_url = "{% url 'annotate_rating' %}?{{ obj_string }}&index={{ index }}" - rating_url += "&rating=" + rating; - $.post(rating_url, function(data) { - // update summary - $("#ratingsAverage").text(data.average); - $("#ratingsCount").text(data.count); - if (data.count > 0) { - $("#ratingsSummary").show(); - } else { - $("#ratingsSummary").hide(); - } - }); - } - OME.initToolbarDropdowns(); }); diff --git a/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/annotations/metadata_general.html b/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/annotations/metadata_general.html index 68a8df4af9e..3a431134d53 100644 --- a/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/annotations/metadata_general.html +++ b/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/annotations/metadata_general.html @@ -401,72 +401,6 @@ {% endif %} - // --- Rating ---- - {% if manager.canAnnotate %} - $("#rating_annotations").on("click", ".myRating img", function(event){ - var $rating = $(this), - clickX = event.pageX - $rating.offset().left; - var r = (clickX/ $rating.width()) * 5; - r = parseInt(Math.ceil(r)); - setRating(r, $rating); - }); - {% endif %} - - $("#rating_annotations").on("click", ".removeRating", function(event){ - var $liMyRating = $(this).parent(), - $ratingimg = $liMyRating.find('img'); - setRating(0, $ratingimg); - }); - - var setRating = function(rating, $rating) { - // update rating - if ($rating) { - var rating_src = "{% static 'webclient/image/rating0.png' %}".replace("0.png", rating+".png"); - $rating.attr('src', rating_src); - } - // update rating annotation - var rating_url = "{% url 'annotate_rating' %}?{{manager.obj_type}}={{ manager.obj_id }}&index={{ index }}" - rating_url += "&rating=" + rating; - $.post(rating_url, function(data) { - // update summary - $("#ratingsAverage").text(data.average); - $("#ratingsCount").text(data.count); - if (data.count > 0) { - $("#ratingsSummary").show(); - } else { - $("#ratingsSummary").hide(); - } - }); - } - - // Handle click on collapsible panes - var open_panes = []; - // $('#metadata_general .can-collapse').click(function () { - // $(this).toggleClass('closed').next().slideToggle(); - // // remember which panes are expanded - // var open = []; - // $('#metadata_general .can-collapse').each(function(){ - // var $this = $(this); - // if (!$this.hasClass('closed') && $this.attr('data-name')) { - // open.push($this.attr('data-name')); - // } - // }); - // $("#metadata_general").data('open_panes', open); - // }); - // // Expand any previously opened panes - // var open_panes = $("#metadata_general").data('open_panes'); - // if (open_panes === undefined) { - // open_panes = ["details"]; // by default, just 'details' is open - // } - - // open_panes.forEach(function(name) { - // // remove 'defclose' flag from open panes - // $('#metadata_general .can-collapse[data-name="' + name + '"]').removeClass('defclose'); - // }); - // // Any panes that still have 'defclose' flag, we close - // $('.can-collapse.defclose').removeClass('defclose').addClass('closed').next().hide(); - - // For wells, we try to load Bulk table annotations attached to parent Screen / Plate // loading just the row we need for the current well. From 91f06e4345d94aa5a981aa550491122da2590b56 Mon Sep 17 00:00:00 2001 From: William Moore Date: Thu, 21 Apr 2016 23:42:03 +0100 Subject: [PATCH 041/103] Only allow rating update if canAnnotate --- .../webclient/javascript/ome.right_panel_comments_pane.js | 1 + .../webclient/javascript/ome.right_panel_ratings_pane.js | 4 ++-- .../templates/webclient/annotations/batch_annotate.html | 5 +++-- .../templates/webclient/annotations/metadata_general.html | 2 +- 4 files changed, 7 insertions(+), 5 deletions(-) diff --git a/components/tools/OmeroWeb/omeroweb/webclient/static/webclient/javascript/ome.right_panel_comments_pane.js b/components/tools/OmeroWeb/omeroweb/webclient/static/webclient/javascript/ome.right_panel_comments_pane.js index fb162ab13e7..1e0674bf7b7 100644 --- a/components/tools/OmeroWeb/omeroweb/webclient/static/webclient/javascript/ome.right_panel_comments_pane.js +++ b/components/tools/OmeroWeb/omeroweb/webclient/static/webclient/javascript/ome.right_panel_comments_pane.js @@ -71,6 +71,7 @@ var CommentsPane = function CommentsPane($element, opts) { if ($.trim(textArea.val()).length === 0) return false; }, success: function(html) { + $("#id_comment").val(""); self.render(); }, }); diff --git a/components/tools/OmeroWeb/omeroweb/webclient/static/webclient/javascript/ome.right_panel_ratings_pane.js b/components/tools/OmeroWeb/omeroweb/webclient/static/webclient/javascript/ome.right_panel_ratings_pane.js index e29fa045994..831d132f3ac 100644 --- a/components/tools/OmeroWeb/omeroweb/webclient/static/webclient/javascript/ome.right_panel_ratings_pane.js +++ b/components/tools/OmeroWeb/omeroweb/webclient/static/webclient/javascript/ome.right_panel_ratings_pane.js @@ -49,7 +49,7 @@ var RatingsPane = function RatingsPane($element, opts) { }).bind(this); - $("#rating_annotations").on("click", ".myRating img", function(event){ + $("#rating_annotations.canAnnotate").on("click", ".myRating img", function(event){ var $rating = $(this), clickX = event.pageX - $rating.offset().left; var r = (clickX/ $rating.width()) * 5; @@ -57,7 +57,7 @@ var RatingsPane = function RatingsPane($element, opts) { setRating(r, $rating); }); - $("#rating_annotations").on("click", ".removeRating", function(event){ + $("#rating_annotations.canAnnotate").on("click", ".removeRating", function(event){ var $liMyRating = $(this).parent(), $ratingimg = $liMyRating.find('img'); setRating(0, $ratingimg); diff --git a/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/annotations/batch_annotate.html b/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/annotations/batch_annotate.html index 7e9fa28904b..dfba16e83c7 100644 --- a/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/annotations/batch_annotate.html +++ b/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/annotations/batch_annotate.html @@ -250,8 +250,9 @@

    {{ annotationBlocked }}

    Ratings

    - diff --git a/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/annotations/metadata_general.html b/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/annotations/metadata_general.html index 3a431134d53..b9bc20beeff 100644 --- a/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/annotations/metadata_general.html +++ b/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/annotations/metadata_general.html @@ -811,7 +811,7 @@

    Ratings

    From 10ab955d14a4b306d3e56a309ffc47b2bc2a3d56 Mon Sep 17 00:00:00 2001 From: William Moore Date: Fri, 22 Apr 2016 10:01:49 +0100 Subject: [PATCH 042/103] Use '-' icon for Remove Tag --- .../webclient/static/webclient/css/dusty.css | 2 +- .../static/webclient/image/icon_tag_remove.png | Bin 0 -> 2813 bytes .../webclient/annotations/tags_underscore.html | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) create mode 100644 components/tools/OmeroWeb/omeroweb/webclient/static/webclient/image/icon_tag_remove.png diff --git a/components/tools/OmeroWeb/omeroweb/webclient/static/webclient/css/dusty.css b/components/tools/OmeroWeb/omeroweb/webclient/static/webclient/css/dusty.css index 78871dc8302..047a44c674c 100755 --- a/components/tools/OmeroWeb/omeroweb/webclient/static/webclient/css/dusty.css +++ b/components/tools/OmeroWeb/omeroweb/webclient/static/webclient/css/dusty.css @@ -512,7 +512,7 @@ button::-moz-focus-inner { margin-left:5px; overflow:hidden; display:block !important; - background:url(../image/icon_tag_delete.png) center center no-repeat; + background:url(../image/icon_tag_remove.png) center center no-repeat; text-indent:-99px; } diff --git a/components/tools/OmeroWeb/omeroweb/webclient/static/webclient/image/icon_tag_remove.png b/components/tools/OmeroWeb/omeroweb/webclient/static/webclient/image/icon_tag_remove.png new file mode 100644 index 0000000000000000000000000000000000000000..a7da64a5d0120d23698d57b1a0752912f0537931 GIT binary patch literal 2813 zcmVKLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z0000eNklT+At_q P00000NkvXXu0mjf literal 0 HcmV?d00001 diff --git a/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/annotations/tags_underscore.html b/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/annotations/tags_underscore.html index 44b9500d3a4..d69eefb9cff 100644 --- a/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/annotations/tags_underscore.html +++ b/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/annotations/tags_underscore.html @@ -12,7 +12,7 @@ <% if (tag.canRemove) { %> - X + - <% } %> From 57956e5009737a0928f0e75bc24e0b865c2cbac1 Mon Sep 17 00:00:00 2001 From: William Moore Date: Fri, 22 Apr 2016 10:12:35 +0100 Subject: [PATCH 043/103] Use longer dash '-' for Attachment remove button --- .../templates/webclient/annotations/fileanns_underscore.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/annotations/fileanns_underscore.html b/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/annotations/fileanns_underscore.html index 1a06098cba5..67908dab879 100644 --- a/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/annotations/fileanns_underscore.html +++ b/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/annotations/fileanns_underscore.html @@ -44,7 +44,7 @@ <% if (ann.link.permissions.canDelete) { %> - + href='<%= webindex %>action/remove/file/<%= ann.id %>/'>– <% } %> <% if (ann.permissions.canDelete) { %> From fa19bc12e2d6007f4785a2333b16a0e9656e2dc6 Mon Sep 17 00:00:00 2001 From: William Moore Date: Fri, 22 Apr 2016 12:53:34 +0100 Subject: [PATCH 044/103] Fix wrapping of long keys/values in bulk annotation tables See card at https://trello.com/c/fkEgcmXD/56-omero-web-can-t-resize-image-information-box --- .../omeroweb/webclient/static/webclient/css/layout.css | 5 ++++- .../templates/webclient/annotations/metadata_general.html | 2 +- .../webgateway/static/webgateway/css/omero_image.css | 2 -- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/components/tools/OmeroWeb/omeroweb/webclient/static/webclient/css/layout.css b/components/tools/OmeroWeb/omeroweb/webclient/static/webclient/css/layout.css index 9356a85e240..ec4ac382aaa 100644 --- a/components/tools/OmeroWeb/omeroweb/webclient/static/webclient/css/layout.css +++ b/components/tools/OmeroWeb/omeroweb/webclient/static/webclient/css/layout.css @@ -980,7 +980,10 @@ - + /* Bulk Annotations */ + .bulk_annotations_table td { + white-space: normal !important; + } diff --git a/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/annotations/metadata_general.html b/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/annotations/metadata_general.html index b9bc20beeff..61fa0634704 100644 --- a/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/annotations/metadata_general.html +++ b/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/annotations/metadata_general.html @@ -772,7 +772,7 @@

    -
    +
  • diff --git a/components/tools/OmeroWeb/omeroweb/webgateway/static/webgateway/css/omero_image.css b/components/tools/OmeroWeb/omeroweb/webgateway/static/webgateway/css/omero_image.css index d5e6691d9cb..898d9f6f368 100644 --- a/components/tools/OmeroWeb/omeroweb/webgateway/static/webgateway/css/omero_image.css +++ b/components/tools/OmeroWeb/omeroweb/webgateway/static/webgateway/css/omero_image.css @@ -419,8 +419,6 @@ img.figure-box-hide { } td.title { - width: 1%; - white-space: nowrap; text-align: right; font-weight: bold; } From be8b5e18c5b77eb3beb97d409457f6be7e00df11 Mon Sep 17 00:00:00 2001 From: William Moore Date: Fri, 22 Apr 2016 15:32:31 +0100 Subject: [PATCH 045/103] Fixing Robot tests for Tagging and Batch annotate --- .../ui/testcases/web/center_right_panel_tests.txt | 5 +++-- components/tests/ui/testcases/web/tagging_test.txt | 12 ++++++++---- .../webclient/annotations/tags_underscore.html | 3 +-- 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/components/tests/ui/testcases/web/center_right_panel_tests.txt b/components/tests/ui/testcases/web/center_right_panel_tests.txt index 400afc95e37..8d027586669 100644 --- a/components/tests/ui/testcases/web/center_right_panel_tests.txt +++ b/components/tests/ui/testcases/web/center_right_panel_tests.txt @@ -37,8 +37,9 @@ Wait Until Right Panel Loads For MultiSelection Wait Until Element Is Visible xpath=//*[@id="metadata_general"]//div/h1[contains(text(), 'Attachments')] Wait Until Element Is Visible xpath=//*[@id="annotationFilter"] - Wait Until Element Is Visible xpath=//*[@id="metadata_general"]//div/h2[contains(text(), 'Rating')] - Wait Until Element Is Visible xpath=//*[@id="add_rating"]/span + Wait Until Element Is Visible xpath=//*[@id="metadata_general"]//div/h1[contains(text(), 'Ratings')] + Click Element xpath=//*[@id="metadata_general"]//div/h1[contains(text(), 'Ratings')] + Wait Until Element Is Visible xpath=//*[@id="rating_annotations"] Wait Until Element Is Visible xpath=//*[@id="metadata_general"]//div/h1[contains(text(), 'Tags')] Click Element xpath=//*[@id="metadata_general"]//div/h1[contains(text(), 'Tags')] diff --git a/components/tests/ui/testcases/web/tagging_test.txt b/components/tests/ui/testcases/web/tagging_test.txt index 680e43c48cc..fbcc017c38a 100644 --- a/components/tests/ui/testcases/web/tagging_test.txt +++ b/components/tests/ui/testcases/web/tagging_test.txt @@ -24,7 +24,7 @@ Test Tag Click Element xpath=//h1[@data-name='tags'] Click Element launch_tags_form Wait Until Page Contains Element id_tag - Sleep 5 # allow tags to load + Wait Until Page Contains Element xpath=//div[contains(@class,'ui-progressbar')][@aria-valuenow='100'] ${WAIT} Input Text id_tag robotTagTest${pid}TagOne Click Element id_add_new_tag Click Dialog Button Save @@ -36,7 +36,7 @@ Test Tag Wait Until Page Contains Element xpath=//div[@class='tag']/a[contains(text(), 'robotTagTest${pid}TagOne')] 10 Click Element launch_tags_form Wait Until Page Contains Element id_tag - Sleep 5 # allow tags to load + Wait Until Page Contains Element xpath=//div[contains(@class,'ui-progressbar')][@aria-valuenow='100'] ${WAIT} # Create a second Tag Input Text id_tag robotTagTest${pid}TagTwo Click Element id_add_new_tag @@ -54,9 +54,11 @@ Test Tag Go To ${WELCOME URL}?show=project-${projectId}|project-${pId} Wait Until Page Contains Element id=batch_ann_title + Click Element xpath=//h1[@data-name='tags'] + Wait Until Element Is Visible launch_tags_form Click Element launch_tags_form Wait Until Page Contains Element id_tag - Sleep 5 # allow tags to load + Wait Until Page Contains Element xpath=//div[contains(@class,'ui-progressbar')][@aria-valuenow='100'] ${WAIT} # Tags created above should be available to add to second Project Wait Until Page Contains Element xpath=//div[@id='id_all_tags']/div[contains(text(),'robotTagTest${pid}TagOne')] @@ -82,7 +84,7 @@ Test Tag # Open Tag dialog again... Click Element launch_tags_form Wait Until Page Contains Element id_tag - Sleep 5 # allow tags to load + Wait Until Page Contains Element xpath=//div[contains(@class,'ui-progressbar')][@aria-valuenow='100'] ${WAIT} # Same tag as before should be on right Wait Until Page Contains Element xpath=//div[@id='id_selected_tags']/div[contains(text(),'robotTagTest${pid}TagOne')] Page Should Not Contain Element xpath=//div[@id='id_selected_tags']/div[contains(text(),'robotTagTest${pid}TagTwo')] @@ -96,6 +98,8 @@ Test Tag # After Save, Tags Two and Three should be added, Tag One removed # Seems we need a proper refresh here to be sure that TagOne is removed. Go To ${WELCOME URL}?show=project-${projectId}|project-${pId} + Wait Until Element Is Visible xpath=//h1[@data-name='tags'] + Click Element xpath=//h1[@data-name='tags'] Wait Until Page Contains Element xpath=//div[@class='tag']/a[contains(text(), 'robotTagTest${pid}TagThree')] 10 Page Should Contain Element xpath=//div[@class='tag']/a[contains(text(), 'robotTagTest${pid}TagTwo')] Page Should Not Contain Element xpath=//div[@class='tag']/a[contains(text(), 'robotTagTest${pid}TagOne')] diff --git a/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/annotations/tags_underscore.html b/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/annotations/tags_underscore.html index d69eefb9cff..edf781b2733 100644 --- a/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/annotations/tags_underscore.html +++ b/components/tools/OmeroWeb/omeroweb/webclient/templates/webclient/annotations/tags_underscore.html @@ -19,8 +19,7 @@