From 3e06890ce45f573cdd58b6edf5a8ceb20942df48 Mon Sep 17 00:00:00 2001 From: lauren-palmer Date: Mon, 12 Sep 2016 14:07:58 -0700 Subject: [PATCH 001/560] Fixed incorrect links to the member node profile from search results. --- metacatui/src/main/webapp/js/templates/resultsItem.html | 2 +- .../main/webapp/js/themes/dataone/templates/resultsItem.html | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/metacatui/src/main/webapp/js/templates/resultsItem.html b/metacatui/src/main/webapp/js/templates/resultsItem.html index 38b1c5240..678491beb 100644 --- a/metacatui/src/main/webapp/js/templates/resultsItem.html +++ b/metacatui/src/main/webapp/js/templates/resultsItem.html @@ -1,5 +1,5 @@ <% if(memberNode && memberNode.logo){ %> - + <% } %>
diff --git a/metacatui/src/main/webapp/js/themes/dataone/templates/resultsItem.html b/metacatui/src/main/webapp/js/themes/dataone/templates/resultsItem.html index d6d8b07fb..3e91be392 100644 --- a/metacatui/src/main/webapp/js/themes/dataone/templates/resultsItem.html +++ b/metacatui/src/main/webapp/js/themes/dataone/templates/resultsItem.html @@ -1,5 +1,5 @@ <% if(memberNode && memberNode.logo){ %> - + <% } %>
From fda90174cce5ca1892a846d3edbc30855cd87b05 Mon Sep 17 00:00:00 2001 From: lauren-palmer Date: Tue, 13 Sep 2016 17:21:09 -0700 Subject: [PATCH 002/560] Multiple improvements to the annotations usability and appearance --- .../src/main/webapp/css/metacatui-common.css | 82 +++++++++++++++++- .../js/templates/annotationPopover.html | 23 +++++ .../js/themes/dataone/css/metacatui.css | 13 ++- .../js/themes/dataone/img/annotator-icons.png | Bin 0 -> 5654 bytes .../src/main/webapp/js/views/AnnotatorView.js | 53 ++++++----- .../src/main/webapp/js/views/MetadataView.js | 2 +- 6 files changed, 144 insertions(+), 29 deletions(-) create mode 100644 metacatui/src/main/webapp/js/templates/annotationPopover.html create mode 100644 metacatui/src/main/webapp/js/themes/dataone/img/annotator-icons.png diff --git a/metacatui/src/main/webapp/css/metacatui-common.css b/metacatui/src/main/webapp/css/metacatui-common.css index 1a50af47b..5475dddae 100644 --- a/metacatui/src/main/webapp/css/metacatui-common.css +++ b/metacatui/src/main/webapp/css/metacatui-common.css @@ -1307,6 +1307,7 @@ img.icon{ } .annotation-target{ height: 0px; + margin-left: 180px; } .annotator-listing > .annotator-checkbox:nth-child(2n), .annotator-listing > .annotator-checkbox:nth-child(3n) { @@ -1326,11 +1327,84 @@ img.icon{ display: none; } .annotation.tag { - padding: .25em .5em; + padding: .35em .75em; margin-right: 5px; - -webkit-border-radius: 2px; - -moz-border-radius: 2px; - border-radius: 2px; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + font-style: normal; + font-weight: 400; + text-shadow: none; + box-shadow: none; + text-align: center; + margin-top: 10px; + margin-bottom: 10px; +} +.annotation-viewer-container .annotation.tag{ + margin-left: 5px; +} +.annotator-tags, +.annotator-viewer .annotator-item, +.annotator-viewer div{ + border-top: 0px; +} +.annotator-tags > .annotator-tag, +.annotator-annotation .annotator-tag{ + display: none; +} +.annotator-viewer div:first-of-type{ + padding-top: 0px; + padding-bottom: 0px; +} +.annotator-widget * { + font-style: normal; + color: #333; +} +.annotator-widget .subtle{ + color: #999; +} +.annotator-widget .smaller{ + font-size: .9em; +} +.annotator-widget .tag-date{ + display: block; + padding-left: 0px; +} +.annotator-viewer .container { + padding-top: 10px; + margin-top: 10px; +} +.annotator-viewer .annotator-controls{ + display: none; +} +.annotation-flag.btn { + border-width: 0px; + margin-bottom: 0px; + margin-right: 10px; + margin-left: -7px; + border-top-left-radius: 0px; + border-bottom-left-radius: 0px; + border: 0px; + padding: 0.42em .75em; + font-size: 1em; + line-height: 0em; + margin-top: -3px; +} +.annotation-flag.btn:hover{ + border-width: 0px; +} +.annotator-editor .annotator-controls{ + background-image: none; + background-color: #FFF; + padding-top: 10px; +} +.annotator-editor .annotator-checkbox, +.annotator-editor #annotator-field-4, +.annotator-editor .annotator-item label[for="annotator-field-4"]{ + display: none !important; +} +.ui-autocomplete.annotator{ + z-index: 9999; } /****************************************** * Images, Maps, and Media diff --git a/metacatui/src/main/webapp/js/templates/annotationPopover.html b/metacatui/src/main/webapp/js/templates/annotationPopover.html new file mode 100644 index 000000000..d8095fa41 --- /dev/null +++ b/metacatui/src/main/webapp/js/templates/annotationPopover.html @@ -0,0 +1,23 @@ +
+ <%=concept.label%> +
+

+ Definition: + <%=concept.desc%> +

+
+ +
+

+ Added by <%=user%> + <%=created.toDateString()%> + <% if(updated){ %> + Updated on + <%=updated.toDateString()%> + + <% } %> +

+
+
\ No newline at end of file diff --git a/metacatui/src/main/webapp/js/themes/dataone/css/metacatui.css b/metacatui/src/main/webapp/js/themes/dataone/css/metacatui.css index 7c1d3699b..4e5c38fcc 100644 --- a/metacatui/src/main/webapp/js/themes/dataone/css/metacatui.css +++ b/metacatui/src/main/webapp/js/themes/dataone/css/metacatui.css @@ -12,7 +12,8 @@ font: 400 14px/20px Helvetica, Arial, "sans serif"; } - a { + a, + .annotator-widget a { color: #1C6E84; font-weight: 600; } @@ -965,7 +966,13 @@ label.control-label{ background-color: #1C6E84; color: #FFF; } - +.btn.annotation-flag{ + background-color: #98d2eb; + color: #FFF; +} +.btn.annotation-flag:hover{ + background-color: #85daff; +} /* Registry CSS -------------------------------------------------- */ @@ -1348,7 +1355,7 @@ label.control-label{ } ul.ui-autocomplete.ui-front{ - z-index: 999; + z-index: 9999; } li.ui-menu-item{ diff --git a/metacatui/src/main/webapp/js/themes/dataone/img/annotator-icons.png b/metacatui/src/main/webapp/js/themes/dataone/img/annotator-icons.png new file mode 100644 index 0000000000000000000000000000000000000000..34c8ac5dfc3d95e8e933e99c8bea8ce0e286d1d8 GIT binary patch literal 5654 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 literal 0 HcmV?d00001 diff --git a/metacatui/src/main/webapp/js/views/AnnotatorView.js b/metacatui/src/main/webapp/js/views/AnnotatorView.js index d17aad135..ef36f7e99 100644 --- a/metacatui/src/main/webapp/js/views/AnnotatorView.js +++ b/metacatui/src/main/webapp/js/views/AnnotatorView.js @@ -4,14 +4,16 @@ define(['jquery', 'annotator', 'underscore', 'backbone', - 'text!templates/annotation.html' + 'text!templates/annotation.html', + 'text!templates/annotationPopover.html' ], function($, $ui, Annotator, _, Backbone, - AnnotationTemplate) { + AnnotationTemplate, + AnnotationPopoverTemplate) { 'use strict'; var AnnotatorView = Backbone.View.extend({ @@ -23,6 +25,7 @@ define(['jquery', template: null, annotationTemplate: _.template(AnnotationTemplate), + annotationPopoverTemplate: _.template(AnnotationPopoverTemplate), rendered: false, @@ -123,11 +126,13 @@ define(['jquery', focus: focus, position: { my: "left top", - at: "right bottom", + at: "left bottom", collision: "fit" } }); + //Change the palceholder text + $(this.$el.data('annotator').plugins.Tags.input).attr("placeholder", "Search for tag terms..."); // set up rejection field this.$el.data('annotator').editor.addField({ @@ -198,22 +203,22 @@ define(['jquery', var created = new Date(annotation.created); var updated = new Date(annotation.updated); var user = annotation.user; // TODO: make more readable - var divId = "viewer-" + annotation.id; - console.log("viewer div length: " + $(viewer.element).find("div[data-id='" + divId + "']").length); - if ($(viewer.element).find("div[data-id='" + divId + "']").length > 0) { + var containerId = "viewer-" + annotation.id; + if ($(viewer.element).find("div[data-id='" + containerId + "']").length > 0) { return; } - $(element).after( - "
", - "

Label: " + concept.label + "

", - "

Definition: " + concept.desc + "

", - "
", - "
", - "

Created: " + created.toDateString() + "

", - "

Updated: " + updated.toDateString() + "

", - "

User: " + user + "

", - "
" - ); + + if(created.valueOf() == updated.valueOf()) updated = null; + + var annotationPopover = view.annotationPopoverTemplate({ + containerId: containerId, + concept: concept, + created: created, + updated: updated, + user: user, + annotation: annotation + }); + $(element).after(annotationPopover); }; appLookupModel.bioportalGetConcepts(conceptUri, renderAnnotation); @@ -313,7 +318,7 @@ define(['jquery', }); }; - var annotatorEl = $(this); + var annotatorEl = (typeof this.$el != "undefined")? this.$el : this; //look up the concept details for each annotation _.each(annotations, function(annotation) { @@ -341,7 +346,7 @@ define(['jquery', return; } - var bubble = $.parseHTML(annotatorEl.data("annotator-view").annotationTemplate({ + var bubble = $.parseHTML($(annotatorEl).data("annotator-view").annotationTemplate({ annotation: annotation, concept: concept, canEdit: canEdit @@ -358,9 +363,15 @@ define(['jquery', $(target).bind("mouseover", hoverAnnotation); $(target).bind("mouseout", hoverAnnotation); - target = $(bubble).find(".annotation-flag").filter("[data-id='" + annotation.id + "']"); + target = $(bubble).filter(".annotation-flag[data-id='" + annotation.id + "']"); $(target).bind("click", flagAnnotation); - target = $(bubble).find(".annotation-delete").filter("[data-id='" + annotation.id + "']"); + + $(target).tooltip({ + trigger: "hover", + title: "Flag this tag as incorrect" + }); + + target = $(bubble).filter(".annotation-delete[data-id='" + annotation.id + "']"); $(target).bind("click", deleteAnnotation); }; diff --git a/metacatui/src/main/webapp/js/views/MetadataView.js b/metacatui/src/main/webapp/js/views/MetadataView.js index bbbaf9cdc..261ff83dc 100644 --- a/metacatui/src/main/webapp/js/views/MetadataView.js +++ b/metacatui/src/main/webapp/js/views/MetadataView.js @@ -1144,7 +1144,7 @@ define(['jquery', } if(matches.length){ - container = matches.parents(".entitydetails").first(); + container = $(matches).parents(".entitydetails").first(); container.attr("data-id", id); return container; } From 46de4a33cc982ee7648e05f275e9ead7bf5abe68 Mon Sep 17 00:00:00 2001 From: lauren-palmer Date: Wed, 14 Sep 2016 17:59:41 -0700 Subject: [PATCH 003/560] Added an AnnotationModel for easier interaction between AnnotatorJS and Backbone. Create custom popover for annotations instead of using the AnnotatorJS viewer (which was having issues with displaying multiple annotations per annotation-target) --- .../main/webapp/js/models/AnnotationModel.js | 35 ++++ .../main/webapp/js/templates/annotation.html | 2 +- .../js/templates/annotationPopover.html | 6 +- .../js/themes/dataone/models/AppModel.js | 8 +- .../src/main/webapp/js/views/AnnotatorView.js | 160 +++++++++++------- 5 files changed, 143 insertions(+), 68 deletions(-) create mode 100644 metacatui/src/main/webapp/js/models/AnnotationModel.js diff --git a/metacatui/src/main/webapp/js/models/AnnotationModel.js b/metacatui/src/main/webapp/js/models/AnnotationModel.js new file mode 100644 index 000000000..3bb6acc4a --- /dev/null +++ b/metacatui/src/main/webapp/js/models/AnnotationModel.js @@ -0,0 +1,35 @@ +/*global define */ +define(['jquery', 'underscore', 'backbone'], + function($, _, Backbone) { + 'use strict'; + + // Annotation Model + // ------------------ + var Annotation = Backbone.Model.extend({ + defaults: { + + }, + + initialize: function(options){ + + }, + + bioportalGetConcepts: function(uri) { + var model = this; + appLookupModel.bioportalGetConcepts(uri, function(concepts){ + model.set("concept", concepts[0]); + }); + }, + + orcidGetConcepts: function(uri) { + var model = this; + appLookupModel.orcidGetConcepts(uri, function(concepts){ + model.set("concept", concepts[0]); + }); + } + + + }); + + return Annotation; +}); \ No newline at end of file diff --git a/metacatui/src/main/webapp/js/templates/annotation.html b/metacatui/src/main/webapp/js/templates/annotation.html index 662541ce5..decaf29e7 100644 --- a/metacatui/src/main/webapp/js/templates/annotation.html +++ b/metacatui/src/main/webapp/js/templates/annotation.html @@ -3,7 +3,7 @@ + title="<%=concept.label %>"> <%=concept.label %> <% diff --git a/metacatui/src/main/webapp/js/templates/annotationPopover.html b/metacatui/src/main/webapp/js/templates/annotationPopover.html index d8095fa41..6b4c3c913 100644 --- a/metacatui/src/main/webapp/js/templates/annotationPopover.html +++ b/metacatui/src/main/webapp/js/templates/annotationPopover.html @@ -1,9 +1,9 @@
- <%=concept.label%> + <%=annotation.concept.label%>

Definition: - <%=concept.desc%> + <%=annotation.concept.desc%>

- Added by <%=user%> + Added by <%=annotation.user%> <%=created.toDateString()%> <% if(updated){ %> Updated on diff --git a/metacatui/src/main/webapp/js/themes/dataone/models/AppModel.js b/metacatui/src/main/webapp/js/themes/dataone/models/AppModel.js index fbbc32b2c..2730b4c72 100644 --- a/metacatui/src/main/webapp/js/themes/dataone/models/AppModel.js +++ b/metacatui/src/main/webapp/js/themes/dataone/models/AppModel.js @@ -35,11 +35,11 @@ define(['jquery', 'underscore', 'backbone'], maxDownloadSize: 3000000000, metcatVersion: "2.7.2", - baseUrl: window.location.origin || (window.location.protocol + "//" + window.location.host), + baseUrl: "https://cn-sandbox-2.test.dataone.org",//window.location.origin || (window.location.protocol + "//" + window.location.host), // the most likely item to change is the Metacat deployment context context: '', d1Service: "/cn/v2", - d1CNBaseUrl: "https://cn.dataone.org", + d1CNBaseUrl: "https://cn-sandbox-2.test.dataone.org", d1CNService: "/cn/v2", viewServiceUrl: null, packageServiceUrl: null, @@ -57,7 +57,7 @@ define(['jquery', 'underscore', 'backbone'], nodeServiceUrl: null, // NOTE: include your bioportal apikey for suggested classes // see: http://bioportal.bioontology.org/account - //bioportalSearchUrl: "https://data.bioontology.org/search?ontologies=ECSO&apikey=24e4775e-54e0-11e0-9d7b-005056aa3316&pagesize=1000&suggest=true&q=", + bioportalSearchUrl: "https://data.bioontology.org/search?ontologies=ECSO&apikey=24e4775e-54e0-11e0-9d7b-005056aa3316&pagesize=1000&suggest=true&q=", //bioportalSearchUrl: null, // use this to deactivate the annotator view //orcidBaseUrl: "https://sandbox.orcid.org", //orcidSearchUrl: null, @@ -71,7 +71,7 @@ define(['jquery', 'underscore', 'backbone'], //signInUrlLdap: null, tokenUrl: null, checkTokenUrl: null, - //annotatorUrl: null, + annotatorUrl: null, prov: true, useSeriesId: true }, diff --git a/metacatui/src/main/webapp/js/views/AnnotatorView.js b/metacatui/src/main/webapp/js/views/AnnotatorView.js index ef36f7e99..7bd845ed4 100644 --- a/metacatui/src/main/webapp/js/views/AnnotatorView.js +++ b/metacatui/src/main/webapp/js/views/AnnotatorView.js @@ -4,6 +4,7 @@ define(['jquery', 'annotator', 'underscore', 'backbone', + 'models/AnnotationModel', 'text!templates/annotation.html', 'text!templates/annotationPopover.html' ], @@ -12,6 +13,7 @@ define(['jquery', Annotator, _, Backbone, + AnnotationModel, AnnotationTemplate, AnnotationPopoverTemplate) { 'use strict'; @@ -28,6 +30,7 @@ define(['jquery', annotationPopoverTemplate: _.template(AnnotationPopoverTemplate), rendered: false, + annotations: [], // Delegated events for creating new items, and clearing completed ones. events: { @@ -54,6 +57,7 @@ define(['jquery', $("body").annotator('destroy'); } + this.annotations = []; }, setUpAnnotator: function() { @@ -193,6 +197,7 @@ define(['jquery', // showing the viewer show the concepts with labels, definitions and audit info this.$el.annotator('subscribe', 'annotationViewerShown', function(viewer, annotations) { console.log("annotationViewerShown: " + viewer); + $(viewer.element).find(".annotator-tag").each(function(index, element) { var conceptUri = $(element).html(); var renderAnnotation = function(concepts) { @@ -253,6 +258,17 @@ define(['jquery', } this.rendered = true; + var view = this; + + //Create a new model for each annotation + _.each(annotations, function(annotation){ + var annModel = new AnnotationModel().set(annotation); + if(Array.isArray(view.annotations)) + view.annotations.push(annModel); + else + view.annotations = [annModel]; + }); + // sort the annotations by xpath annotations = _.sortBy(annotations, function(ann) { return ann.resource; @@ -275,8 +291,7 @@ define(['jquery', // summarize annotation count in citation block $(".citation-container > .controls-well").prepend("" + annotations.length + " annotations"); - - + var flagAnnotation = function(event) { var annotationId = $(event.target).attr("data-id"); console.log("flagging annotation id: " + annotationId); @@ -318,76 +333,28 @@ define(['jquery', }); }; - var annotatorEl = (typeof this.$el != "undefined")? this.$el : this; + var annotatorEl = (typeof this.$el != "undefined")? this.$el : this, + view = $(annotatorEl).data("annotator-view"); //look up the concept details for each annotation - _.each(annotations, function(annotation) { + _.each(this.annotations, function(annotation) { - if (annotation.tags[0]) { - + if (annotation.get("tags")[0]) { // look up concepts where we can - var conceptUri = annotation.tags[0]; - var renderAnnotation = function(concepts) { - - var concept = _.findWhere(concepts, {value: conceptUri}); - - var canEdit = - _.contains(annotation.permissions.admin, appUserModel.get("username")) - || - _.contains(annotation.permissions.update, appUserModel.get("username")) - || - _.contains(annotation.permissions.delete, appUserModel.get("username")); - - // render it in the document - var highlight = $("[data-annotation-id='" + annotation.id + "']"); - var section = $(highlight).closest(".tab-pane").children(".annotation-container"); - if (!section.html()) { - console.log("Highlights not completed yet - cannot render annotation"); - return; - } - - var bubble = $.parseHTML($(annotatorEl).data("annotator-view").annotationTemplate({ - annotation: annotation, - concept: concept, - canEdit: canEdit - }).trim()); - - section.prepend(bubble); - console.log("rendered tag in section: " + section.html()); - - // bind after rendering - var target = $(bubble).filter(".hover-proxy"); - console.log("binding annotation actions for target: " + $(target).size()); - console.log("binding annotation actions for target: " + annotation.id); - - $(target).bind("mouseover", hoverAnnotation); - $(target).bind("mouseout", hoverAnnotation); - - target = $(bubble).filter(".annotation-flag[data-id='" + annotation.id + "']"); - $(target).bind("click", flagAnnotation); - - $(target).tooltip({ - trigger: "hover", - title: "Flag this tag as incorrect" - }); - - target = $(bubble).filter(".annotation-delete[data-id='" + annotation.id + "']"); - $(target).bind("click", deleteAnnotation); - - }; + var conceptUri = annotation.get("tags")[0]; // give time for the highlights to render setTimeout(function() { - // look it up and provide the callback - if (annotation["oa:Motivation"] == "prov:wasAttributedTo") { - appLookupModel.orcidGetConcepts(conceptUri, renderAnnotation); + if (annotation.get("oa:Motivation") == "prov:wasAttributedTo") { + annotation.orcidGetConcepts(conceptUri); } else { - appLookupModel.bioportalGetConcepts(conceptUri, renderAnnotation); + annotation.bioportalGetConcepts(conceptUri); } }, 500); - + + annotation.on("change:concept", view.renderAnnotation, view); } else { // for comments, just render it in the document @@ -404,6 +371,79 @@ define(['jquery', }, + renderAnnotation: function(annotationModel) { + + var canEdit = + _.contains(annotationModel.get("permissions").admin, appUserModel.get("username")) + || + _.contains(annotationModel.get("permissions").update, appUserModel.get("username")) + || + _.contains(annotationModel.get("permissions").delete, appUserModel.get("username")); + + // render it in the document + var highlight = $("[data-annotation-id='" + annotationModel.get("id") + "']"); + var section = $(highlight).closest(".tab-pane").children(".annotation-container"); + if (!section.html()) { + console.log("Highlights not completed yet - cannot render annotation"); + return; + } + + //Render the annotation tag itself + var annotationTag = $.parseHTML(this.annotationTemplate({ + annotation: annotationModel.toJSON(), + concept: annotationModel.get("concept"), + canEdit: canEdit + }).trim()); + section.prepend(annotationTag); + + //Attach the annotation object for later + $(annotationTag).data("annotation", annotationModel); + + var view = this; + + //Create the popover for this element + $(annotationTag).on("mouseover", { view: this }, this.showDetails); + + // bind after rendering + var target = $(annotationTag).filter(".hover-proxy"); + target = $(annotationTag).filter(".annotation-flag[data-id='" + annotation.id + "']"); + $(target).bind("click", flagAnnotation); + + $(target).tooltip({ + trigger: "hover", + title: "Flag this tag as incorrect" + }); + + target = $(annotationTag).filter(".annotation-delete[data-id='" + annotation.id + "']"); + $(target).bind("click", deleteAnnotation); + + }, + + showDetails: function(e){ + var annotation = $(e.target).data("annotation"); + + var created = new Date(annotation.get("created")); + var updated = new Date(annotation.get("updated")); + var containerId = "viewer-" + annotation.get("id"); + + if(created.valueOf() == updated.valueOf()) updated = null; + + var annotationPopover = e.data.view.annotationPopoverTemplate({ + containerId: containerId, + created: created, + updated: updated, + annotation: annotation.toJSON() + }); + $(e.target).popover({ + trigger: "hover", + html: true, + title: "blah",//annotation.get("concept").label, + content: annotationPopover, + placement: "top" + }); + $(e.target).popover("show"); + }, + launchEditor: function(event) { var target = event.target; // select the text to annotate From d16fb5d51530c4b7f761691f7706021b8d59e171 Mon Sep 17 00:00:00 2001 From: lauren-palmer Date: Fri, 16 Sep 2016 10:30:33 -0700 Subject: [PATCH 004/560] More improvements to the annotations, particularly with flagging --- .../src/main/webapp/css/metacatui-common.css | 24 +++++- .../main/webapp/js/models/AnnotationModel.js | 4 +- .../main/webapp/js/templates/annotation.html | 2 +- .../js/templates/annotationPopover.html | 6 +- .../src/main/webapp/js/views/AnnotatorView.js | 77 +++++++++++++------ 5 files changed, 82 insertions(+), 31 deletions(-) diff --git a/metacatui/src/main/webapp/css/metacatui-common.css b/metacatui/src/main/webapp/css/metacatui-common.css index 5475dddae..6907ef1ac 100644 --- a/metacatui/src/main/webapp/css/metacatui-common.css +++ b/metacatui/src/main/webapp/css/metacatui-common.css @@ -1341,7 +1341,8 @@ img.icon{ margin-bottom: 10px; } .annotation-viewer-container .annotation.tag{ - margin-left: 5px; + margin-bottom: 10px; + display: inline-block; } .annotator-tags, .annotator-viewer .annotator-item, @@ -1377,7 +1378,8 @@ img.icon{ .annotator-viewer .annotator-controls{ display: none; } -.annotation-flag.btn { +.annotation-flag.btn, +.annotation-delete.btn { border-width: 0px; margin-bottom: 0px; margin-right: 10px; @@ -1390,9 +1392,18 @@ img.icon{ line-height: 0em; margin-top: -3px; } -.annotation-flag.btn:hover{ +.annotation-flag.btn:hover, +.annotation-delete.btn:hover{ border-width: 0px; } +.annotation-delete.btn-warning { + background-image: inherit; + background-color: #b32d2d; + color: white; +} +.annotation-viewer-container p.warning{ + color: #d00000; +} .annotator-editor .annotator-controls{ background-image: none; background-color: #FFF; @@ -1406,6 +1417,13 @@ img.icon{ .ui-autocomplete.annotator{ z-index: 9999; } +.popover-title { + text-transform: capitalize; +} +.annotation.tag.warning { + background-color: #999; + color: #DDD; +} /****************************************** * Images, Maps, and Media ********************************************/ diff --git a/metacatui/src/main/webapp/js/models/AnnotationModel.js b/metacatui/src/main/webapp/js/models/AnnotationModel.js index 3bb6acc4a..854f8af5c 100644 --- a/metacatui/src/main/webapp/js/models/AnnotationModel.js +++ b/metacatui/src/main/webapp/js/models/AnnotationModel.js @@ -10,6 +10,8 @@ define(['jquery', 'underscore', 'backbone'], }, + //url: appModel.get(""), + initialize: function(options){ }, @@ -27,8 +29,6 @@ define(['jquery', 'underscore', 'backbone'], model.set("concept", concepts[0]); }); } - - }); return Annotation; diff --git a/metacatui/src/main/webapp/js/templates/annotation.html b/metacatui/src/main/webapp/js/templates/annotation.html index decaf29e7..522280b7f 100644 --- a/metacatui/src/main/webapp/js/templates/annotation.html +++ b/metacatui/src/main/webapp/js/templates/annotation.html @@ -26,7 +26,7 @@ <% } else { diff --git a/metacatui/src/main/webapp/js/templates/annotationPopover.html b/metacatui/src/main/webapp/js/templates/annotationPopover.html index 6b4c3c913..8a8409428 100644 --- a/metacatui/src/main/webapp/js/templates/annotationPopover.html +++ b/metacatui/src/main/webapp/js/templates/annotationPopover.html @@ -1,5 +1,9 @@

- <%=annotation.concept.label%> + <%=annotation.concept.label%> + <% if (annotation.reject) { %> +

This annotation has been flagged as incorrect.

+ <% } + %>

Definition: diff --git a/metacatui/src/main/webapp/js/views/AnnotatorView.js b/metacatui/src/main/webapp/js/views/AnnotatorView.js index 7bd845ed4..b9fe87cda 100644 --- a/metacatui/src/main/webapp/js/views/AnnotatorView.js +++ b/metacatui/src/main/webapp/js/views/AnnotatorView.js @@ -34,7 +34,9 @@ define(['jquery', // Delegated events for creating new items, and clearing completed ones. events: { - "click .add-tag" : "launchEditor" + "click .add-tag" : "launchEditor", + "click .annotation-flag" : "flagAnnotation", + "click .annotation-delete" : "deleteAnnotation" }, initialize: function () { @@ -291,24 +293,6 @@ define(['jquery', // summarize annotation count in citation block $(".citation-container > .controls-well").prepend("" + annotations.length + " annotations"); - - var flagAnnotation = function(event) { - var annotationId = $(event.target).attr("data-id"); - console.log("flagging annotation id: " + annotationId); - var annotations = view.$el.data('annotator').plugins.Store.annotations; - var annotation = _.findWhere(annotations, {id: annotationId}); - annotation.reject = !annotation.reject; - view.$el.data('annotator').updateAnnotation(annotation); - - }; - var deleteAnnotation = function(event) { - var annotationId = $(event.target).attr("data-id"); - console.log("deleting annotation id: " + annotationId); - var annotations = view.$el.data('annotator').plugins.Store.annotations; - var annotation = _.findWhere(annotations, {id: annotationId}); - view.$el.data('annotator').deleteAnnotation(annotation); - - }; // define hover action to mimic hovering the highlighted region var hoverAnnotation = function(event) { @@ -406,20 +390,65 @@ define(['jquery', // bind after rendering var target = $(annotationTag).filter(".hover-proxy"); - target = $(annotationTag).filter(".annotation-flag[data-id='" + annotation.id + "']"); - $(target).bind("click", flagAnnotation); + target = $(annotationTag).filter(".annotation-flag[data-id='" + annotationModel.get("id") + "']"); + //$(target).bind("click", this.flagAnnotation); $(target).tooltip({ trigger: "hover", title: "Flag this tag as incorrect" }); - target = $(annotationTag).filter(".annotation-delete[data-id='" + annotation.id + "']"); - $(target).bind("click", deleteAnnotation); + var deleteBtn = $(annotationTag).filter(".annotation-delete"); + $(deleteBtn).tooltip({ + trigger: "hover", + title: "Delete this tag" + }); + + target = $(annotationTag).filter(".annotation-delete[data-id='" + annotationModel.get("id") + "']"); + //$(target).bind("click", this.deleteAnnotation); + + }, + + flagAnnotation : function(e) { + + //Get the flag button + var flagButton = e.target; + if(!$(flagButton).is(".annotation-flag")){ + flagButton = $(flagButton).parents(".annotation-flag"); + } + + //Get the annotation + var annotation = $(flagButton).data("annotation"); + + //If there is no annotation, exit. + if(!annotation) return; + + //Get the annotation object + var anns = this.$el.data("annotator").plugins.Store.annotations; + var annObj = _.findWhere(anns, {id: annotation.get("id")}); + + //Reject it! + annObj.reject = !annObj.reject; + + //Update it + this.$el.data('annotator').updateAnnotation(annObj); + }, + + deleteAnnotation : function(e) { + var annotationId = $(e.target).attr("data-id"); + console.log("deleting annotation id: " + annotationId); + var annotations = view.$el.data('annotator').plugins.Store.annotations; + var annotation = _.findWhere(annotations, {id: annotationId}); + view.$el.data('annotator').deleteAnnotation(annotation); }, showDetails: function(e){ + //Don't show the details for the flag button + if(!$(e.target).is(".annotation.tag")) return; + //Don't execute this code again if we already set up a popover + else if(typeof $(e.target).data("popover") != "undefined") return; + var annotation = $(e.target).data("annotation"); var created = new Date(annotation.get("created")); @@ -437,7 +466,7 @@ define(['jquery', $(e.target).popover({ trigger: "hover", html: true, - title: "blah",//annotation.get("concept").label, + title: annotation.get("concept").label, content: annotationPopover, placement: "top" }); From 9855142f8c194f6b5c96550d16dc57bea9bb178f Mon Sep 17 00:00:00 2001 From: lauren-palmer Date: Fri, 16 Sep 2016 17:08:09 -0700 Subject: [PATCH 005/560] Multiple improvements to the annotation UI --- .../src/main/webapp/css/metacatui-common.css | 22 ++++- .../src/main/webapp/js/models/LookupModel.js | 35 +------ .../main/webapp/js/templates/annotation.html | 2 +- .../js/templates/annotationPopover.html | 13 ++- .../js/themes/dataone/css/metacatui.css | 7 -- .../src/main/webapp/js/views/AnnotatorView.js | 97 ++++++++++++++++--- 6 files changed, 112 insertions(+), 64 deletions(-) diff --git a/metacatui/src/main/webapp/css/metacatui-common.css b/metacatui/src/main/webapp/css/metacatui-common.css index 6907ef1ac..dc0822151 100644 --- a/metacatui/src/main/webapp/css/metacatui-common.css +++ b/metacatui/src/main/webapp/css/metacatui-common.css @@ -1313,7 +1313,8 @@ img.icon{ .annotator-listing > .annotator-checkbox:nth-child(3n) { display: none; } -#annotator-field-0{ +#annotator-field-0, +#annotator-field-5{ display: none; } .annotator-widget span{ @@ -1326,6 +1327,9 @@ img.icon{ .annotator-filter{ display: none; } +.annotator-field p{ + padding: 10px; +} .annotation.tag { padding: .35em .75em; margin-right: 5px; @@ -1387,7 +1391,7 @@ img.icon{ border-top-left-radius: 0px; border-bottom-left-radius: 0px; border: 0px; - padding: 0.42em .75em; + padding: 6px; font-size: 1em; line-height: 0em; margin-top: -3px; @@ -1396,12 +1400,17 @@ img.icon{ .annotation-delete.btn:hover{ border-width: 0px; } -.annotation-delete.btn-warning { +.annotation-delete.btn-warning, +.annotation-flag.btn-warning { background-image: inherit; - background-color: #b32d2d; + background-color: #da4f49; color: white; } -.annotation-viewer-container p.warning{ +.annotation-delete.btn-warning:hover, +.annotation-flag.btn-warning:hover{ + background-color: #f73f3f; +} +.annotation-viewer-container .warning{ color: #d00000; } .annotator-editor .annotator-controls{ @@ -1420,6 +1429,9 @@ img.icon{ .popover-title { text-transform: capitalize; } +.annotation-viewer-container .concept a{ + white-space: pre-wrap; +} .annotation.tag.warning { background-color: #999; color: #DDD; diff --git a/metacatui/src/main/webapp/js/models/LookupModel.js b/metacatui/src/main/webapp/js/models/LookupModel.js index 3966b0d8b..b351f7290 100644 --- a/metacatui/src/main/webapp/js/models/LookupModel.js +++ b/metacatui/src/main/webapp/js/models/LookupModel.js @@ -12,39 +12,8 @@ define(['jquery', 'jqueryui', 'underscore', 'backbone'], }, initialize: function() { - - // Autocomplete widget extension to provide description tooltips. - $.widget( "app.hoverAutocomplete", $.ui.autocomplete, { - - // Set the content attribute as the "item.desc" value. - // This becomes the tooltip content. - _renderItem: function( ul, item ) { - // if we have a label, use it for the title - var title = item.value; - if (item.label) { - title = item.label; - } - // if we have a description, use it for the content - var content = item.value; - if (item.desc) { - content = item.desc; - if (item.desc != item.value) { - content += " (" + item.value + ")"; - } - } - var element = this._super( ul, item ) - .attr( "data-title", title ) - .attr( "data-content", content ); - element.popover( - { - placement: "right", - trigger: "hover", - container: 'body' - - }); - return element; - } - }); + + }, diff --git a/metacatui/src/main/webapp/js/templates/annotation.html b/metacatui/src/main/webapp/js/templates/annotation.html index 522280b7f..7953c3372 100644 --- a/metacatui/src/main/webapp/js/templates/annotation.html +++ b/metacatui/src/main/webapp/js/templates/annotation.html @@ -31,7 +31,7 @@ <% } else { %> -

- Added by <%=annotation.user%> + <% + var creator = annotation.name || annotation.user; + %> + Added by <%=creator%> <%=created.toDateString()%>

diff --git a/metacatui/src/main/webapp/js/themes/arctic/models/Map.js b/metacatui/src/main/webapp/js/themes/arctic/models/Map.js index ea8a11fbb..8fbb59354 100644 --- a/metacatui/src/main/webapp/js/themes/arctic/models/Map.js +++ b/metacatui/src/main/webapp/js/themes/arctic/models/Map.js @@ -15,10 +15,10 @@ define(['jquery', 'underscore', 'backbone', 'gmaps'], //The options for the map using the Google Maps API MapOptions syntax mapOptions: (gmaps)? - { zoom: 3, - minZoom: 3, + { zoom: 2, + minZoom: 2, maxZoom: 16, - center: new google.maps.LatLng(71, -98), + center: new google.maps.LatLng(45, -98), disableDefaultUI: true, zoomControl: true, zoomControlOptions: { diff --git a/metacatui/src/main/webapp/js/themes/dataone/models/Search.js b/metacatui/src/main/webapp/js/themes/dataone/models/Search.js index 150b8e900..ada31e121 100644 --- a/metacatui/src/main/webapp/js/themes/dataone/models/Search.js +++ b/metacatui/src/main/webapp/js/themes/dataone/models/Search.js @@ -39,7 +39,7 @@ define(['jquery', 'underscore', 'backbone', 'models/SolrResult'], submitter: [], username: [], attribute: [], - //annotation: [], + annotation: [], additionalCriteria: [], dataSource: [], id: [], From ba6dc64695c8e64b295ba27e61b8960e426e34c3 Mon Sep 17 00:00:00 2001 From: lauren-palmer Date: Tue, 27 Sep 2016 09:45:50 -0700 Subject: [PATCH 007/560] Display tooltips for annotation tags --- .../src/main/webapp/css/metacatui-common.css | 7 +++++ .../main/webapp/js/templates/annotation.html | 29 ++++++++++--------- .../src/main/webapp/js/views/AnnotatorView.js | 7 ++--- 3 files changed, 25 insertions(+), 18 deletions(-) diff --git a/metacatui/src/main/webapp/css/metacatui-common.css b/metacatui/src/main/webapp/css/metacatui-common.css index dc0822151..44ee3071d 100644 --- a/metacatui/src/main/webapp/css/metacatui-common.css +++ b/metacatui/src/main/webapp/css/metacatui-common.css @@ -1410,6 +1410,13 @@ img.icon{ .annotation-flag.btn-warning:hover{ background-color: #f73f3f; } +.annotation-flag.btn-success { + background-color: #5bb75b; + color: #FFF; +} +.annotation-flag.btn-success:hover{ + background-color: #66ce66; +} .annotation-viewer-container .warning{ color: #d00000; } diff --git a/metacatui/src/main/webapp/js/templates/annotation.html b/metacatui/src/main/webapp/js/templates/annotation.html index 7953c3372..de7c71f39 100644 --- a/metacatui/src/main/webapp/js/templates/annotation.html +++ b/metacatui/src/main/webapp/js/templates/annotation.html @@ -19,26 +19,29 @@ <% } -if (canEdit) { - - if (annotation.reject) { - %> - - <% - } else { - %> - - <% - } -} -%> +<% } %> diff --git a/metacatui/src/main/webapp/js/views/AnnotatorView.js b/metacatui/src/main/webapp/js/views/AnnotatorView.js index e9b69e127..a2da2e497 100644 --- a/metacatui/src/main/webapp/js/views/AnnotatorView.js +++ b/metacatui/src/main/webapp/js/views/AnnotatorView.js @@ -451,17 +451,14 @@ define(['jquery', target = $(annotationTag).filter(".annotation-flag[data-id='" + annotationModel.get("id") + "']"); //$(target).bind("click", this.flagAnnotation); - $(target).tooltip({ - trigger: "hover", - title: "Flag as incorrect" - }); - var deleteBtn = $(annotationTag).filter(".annotation-delete"); $(deleteBtn).tooltip({ trigger: "hover", title: "Delete" }); + $(annotationTag).filter(".tooltip-this").tooltip(); + target = $(annotationTag).filter(".annotation-delete[data-id='" + annotationModel.get("id") + "']"); //$(target).bind("click", this.deleteAnnotation); From 66c73cd87e9b22880a6a2dcf68d66b0a2a7ebd5c Mon Sep 17 00:00:00 2001 From: lauren-palmer Date: Tue, 27 Sep 2016 09:46:55 -0700 Subject: [PATCH 008/560] Add optional test corpus filtering --- .../src/main/webapp/js/themes/dataone/models/Search.js | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/metacatui/src/main/webapp/js/themes/dataone/models/Search.js b/metacatui/src/main/webapp/js/themes/dataone/models/Search.js index ada31e121..a9210108d 100644 --- a/metacatui/src/main/webapp/js/themes/dataone/models/Search.js +++ b/metacatui/src/main/webapp/js/themes/dataone/models/Search.js @@ -40,6 +40,7 @@ define(['jquery', 'underscore', 'backbone', 'models/SolrResult'], username: [], attribute: [], annotation: [], + //test_corpus_sm: "F", additionalCriteria: [], dataSource: [], id: [], @@ -220,6 +221,8 @@ define(['jquery', 'underscore', 'backbone', 'models/SolrResult'], //----All other filters with a basic name:value pair pattern---- var otherFilters = ["attribute", "formatType", "rightsHolder", "submitter"]; + if(this.filterIsAvailable("test_corpus_sm")) otherFilters.push("test_corpus_sm"); + //Start the query string var query = ""; @@ -410,8 +413,11 @@ define(['jquery', 'underscore', 'backbone', 'models/SolrResult'], // Does this need to be wrapped in quotes? if(model.needsQuotes(filterValue)) filterValue = "%22" + encodeURIComponent(filterValue) + "%22"; else filterValue = encodeURIComponent(filterValue); + + //Get the field name + var fieldName = model.fieldNameMap[filterName] || filterName; - query += "+" + model.fieldNameMap[filterName] + ":" + filterValue; + query += "+" + fieldName + ":" + filterValue; } } }); From c54eef1c7806a5a7cedf4ee7d703fa78287b6c48 Mon Sep 17 00:00:00 2001 From: leinfelder Date: Tue, 27 Sep 2016 12:12:39 -0700 Subject: [PATCH 009/560] add function for expanding free-text search terms using the ontology in bioportal. --- .../src/main/webapp/js/models/LookupModel.js | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/metacatui/src/main/webapp/js/models/LookupModel.js b/metacatui/src/main/webapp/js/models/LookupModel.js index b351f7290..133d86ef0 100644 --- a/metacatui/src/main/webapp/js/models/LookupModel.js +++ b/metacatui/src/main/webapp/js/models/LookupModel.js @@ -67,6 +67,39 @@ define(['jquery', 'jqueryui', 'underscore', 'backbone'], }); }, + bioportalExpand: function(term, response) { + + // make sure we have something to lookup + if (!appModel.get('bioportalSearchUrl')) { + response(null); + return; + } + + var terms = []; + + var query = appModel.get('bioportalSearchUrl') + term; + $.get(query, function(data, textStatus, xhr) { + + _.each(data.collection, function(obj) { + // use the preferred label + var prefLabel = obj['prefLabel']; + terms.push(prefLabel); + + // add the synonyms + var synonyms = obj['synonym']; + if (synonyms) { + _.each(synonyms, function(synonym) { + terms.push(synonym); + } + } + + }); + + response(terms); + + }); + }, + bioportalGetConcepts: function(uri, callback) { var concepts = this.get('concepts')[uri]; From 5f2632f887c68df308cb729df47f1755324cd612 Mon Sep 17 00:00:00 2001 From: leinfelder Date: Tue, 27 Sep 2016 12:29:37 -0700 Subject: [PATCH 010/560] add synonyms to autocomplete choices so we can display them in the UI. Also add place-holder for retrieving child concepts of our matches (not implemented). --- .../src/main/webapp/js/models/LookupModel.js | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/metacatui/src/main/webapp/js/models/LookupModel.js b/metacatui/src/main/webapp/js/models/LookupModel.js index 133d86ef0..f73e0db85 100644 --- a/metacatui/src/main/webapp/js/models/LookupModel.js +++ b/metacatui/src/main/webapp/js/models/LookupModel.js @@ -32,12 +32,35 @@ define(['jquery', 'jqueryui', 'underscore', 'backbone'], _.each(data.collection, function(obj) { var choice = {}; choice.label = obj['prefLabel']; + var synonyms = obj['synonym']; + if (synonyms) { + choice.synonyms = []; + _.each(synonyms, function(synonym) { + choice.synonyms.push(synonym); + } + } choice.filterLabel = obj['prefLabel']; choice.value = obj['@id']; if (obj['definition']) { choice.desc = obj['definition'][0]; } + + // TODO: process the children recursively + var childrenUrl = obj['links']['children']; + if (false) { + //if (childrenUrl) { + + $.get(childrenUrl, function(data, textStatus, xhr) { + + _.each(data.collection, function(obj) { + // it is the same response format as above + + }) + }); + + } + // mark items that we know we have matches for if (allValues) { var matchingChoice = _.findWhere(allValues, {value: choice.value}); From cea56f79955f44b0684e91cd0ea184bac3b28578 Mon Sep 17 00:00:00 2001 From: lauren-palmer Date: Tue, 27 Sep 2016 13:05:22 -0700 Subject: [PATCH 011/560] Added 'Add nested dataset' sequence diagram and mockup --- .../editor/use-cases/add-a-nested-dataset.rst | 76 ++++++++++++++++++ .../images/add-nested-dataset-mockup.png | Bin 0 -> 207126 bytes .../add-nested-dataset-sequence-diagram.png | Bin 0 -> 61036 bytes 3 files changed, 76 insertions(+) create mode 100644 metacatui/docs/design/editor/use-cases/images/add-nested-dataset-mockup.png create mode 100644 metacatui/docs/design/editor/use-cases/images/add-nested-dataset-sequence-diagram.png diff --git a/metacatui/docs/design/editor/use-cases/add-a-nested-dataset.rst b/metacatui/docs/design/editor/use-cases/add-a-nested-dataset.rst index 477f997fc..57e59bfaa 100644 --- a/metacatui/docs/design/editor/use-cases/add-a-nested-dataset.rst +++ b/metacatui/docs/design/editor/use-cases/add-a-nested-dataset.rst @@ -5,6 +5,82 @@ Scenario -------- As a scientist, I want to add a nested dataset to an existing dataset folder so I can easily organize related data. + +Mockup Image +------------ + +.. image:: images/add-nested-dataset-mockup.png + +Technical Sequence Diagram +--------------------------- +.. @startuml images/add-nested-dataset-sequence-diagram.png + + !include ../plantuml-styles.txt + skinparam SequenceGroupBorderColor #AAAAAA + skinparam SequenceGroupBorderThickness #AAAAAA + + actor "Scientist" + participant EMLView as EMLView <> + participant DataPackageView as DataPackageView <> + participant DataItemView as DataItemView <> + participant DataPackage as DataPackage <> + participant EML as EML <> + participant Router as Router <> + + EMLView -> DataPackage : on("new-folder", handleNewFolder) + DataPackageView -> DataItemView : listenTo("add-folder", addFolder) + + Scientist -> DataItemView : clicks on "Add a folder" + + DataPackageView -> DataPackageView : addFolder() + activate DataPackageView + DataPackageView -> DataPackage : new() + + activate DataPackage + DataPackage -> EML : new() + activate EML + EML --> DataPackage : newEML + deactivate EML + DataPackage -> DataPackage : add(newEML) + DataPackage --> DataPackageView : newPackage + deactivate DataPackage + + DataPackageView -> DataItemView : new(newPackage) + deactivate DataPackageView + + activate DataItemView + DataItemView -> DataItemView : render() + DataItemView -> DataItemView : on("blur #titleText", handleChange()) + DataItemView --> Scientist: shows new folder row + note right + We highlight and focus the + title for the scientist to change + end note + deactivate DataItemView + + activate Scientist + Scientist -> DataItemView : Enters title + deactivate Scientist + + activate DataItemView + DataItemView -> DataItemView : handleChange() + DataItemView -> EML : set("title", title) + activate EML + DataItemView -> EML : getParent() + EML --> DataItemView : dataPackage + deactivate EML + DataItemView -> DataPackage : trigger("new-folder") + deactivate DataItemView + + DataPackage -> EMLView : handleNewFolder(dataPackage) + activate EMLView + EMLView -> Router : navigate("#view/{pid}", dataPackage) + deactivate EMLView + + @enduml + +.. image:: images/add-nested-dataset-sequence-diagram.png + diff --git a/metacatui/docs/design/editor/use-cases/images/add-nested-dataset-mockup.png b/metacatui/docs/design/editor/use-cases/images/add-nested-dataset-mockup.png new file mode 100644 index 0000000000000000000000000000000000000000..c329026a71cfb2225075943063a3230e93cb2222 GIT binary patch literal 207126 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

sf} zc&h4Pz9Y)}o3qJ>gpQ7tUZei7`0({{o%SJ{HeA)IavD(eXa8&R-V~w1X1?YK1K7po zJ;epGs4Ys6_0wP@$Hh218#6_%Z=yC{ADt}h)et;|bUwh&_O>o3)G%oxnt4&XOZWiZ zvh@Q+tWhxBrOH&$0iPaz&v!h_(mjj=x7i}83Td1+T&P`j%yk=OlOd5bWchsYMlEms z$xn`>{@}8(>B`el7Oia8g(SCm7)vmBxU&!M+c~fMUqf)Z{P;Fd1LHOXBI@TOfb_J) z1tu(kA@PrpB>9*_1QoMB&A-rur%!^?aoJi|{Mp17fmBUhT^-nIVWJ`?4`g#6enVDf zy;Z76=(Xp0r3Z&Mn1LuSmE`T8lYvw(@2v6Qj(%d=>`YHyvC#Pdh(@AznpYera)Vvl zR`Y*k0&cFQuj6bQMy0h=y}iH2JoDwxc{qc8O8X4&7VAB_;k&t>^7IHC!JpFuXe0J0 z5UkN;OKQY_8rR)WU4HWA3Mii0G#w2be>Jdo6-{biMXGQvxsVhMAGHp9m8EK8 z^eJnEDFfyv7l$#eG03lb7G?v13+`T*?%p8&(QSWn(j-_n)A{|==%bjm&T~g$7p}Ko zY-qYKC$$re>HVFUT~x1AxbzSFVa>C5AoK>jGX1%D^3oNC`j@*RUxq-$x=jaAslv1 zuvwy`QaA=ZL78NCF#!a8;tG)Y~`L!7_~km@FL zlh2WW+nOWV(T|qvk6I`+R|=OPY|+nsbV%b2853 z>5|Ug4gJlpBv+7J@ak4EZmHl4PHD)43ShNwTh~9nvQPSF>~c%%$o0$!uX0`-!xnpBgjAH&hSL4a6ETl zR(H50Z|v~^J{7R~P~6A9M2UK@`KaMw9#*IG7_om|9?FnX`l?>W^_vZGlKOB~42$S&4L#YV$&(Pg%d5E>VG*)N zx!5jvZ%pQsQ!VeH9 zVQvD6aG2r7LAxHuDoyPGPa9l z61187bdta3Itt^-4rcdxb^&G(t@sfD$J)K@=BOmw)w0rZukklUwDABA{Haotup2Rk z;@)03fRKDVOy>r7Uq~dCOh5uIuZq5m`!O4F*prJI!C9c zDMb`@=&A1gLHPc5-hL!1Ycr7~4(&%QUfll6><$}7cl>yIqWbZ|v3y;@rTP1i$UE3* z#seI7WY%T}*<#Xo)z(hUTuWl~80E-D&G4!^Ns2Dq>(bL!8^?n|S}PbPoPunbw$q6G z86~&L^pD+j9IL*)d2tF(yc<0(3mpa3vkptP8UfbUYz5Hm$6iW&RL>=qib?Kj=$^Y(oR>si-&JDE z|K*;K+6TpuHM4+A)*aNVt8O9RPRr6BiiajIG??%9H3bE<(wt{2u+2u` zvL$x=;&W3{G0d%O`Iw0@z+A}pazDwVr3_%FUgW-u*#0z>7 z%7t7Rg8kHSg9ocu}*WohqRbWg(` zd>-I8rDIM&hyasy(CqI2o8zgLvhTe9TRnr zxcu78b#>9cN&JxR!G}W|DvXYWGiFylP|f#*GWFiVF?q2O%vWv8;pt65T7*YqdbK#J z%vax_LZiAKeN@OYASUoAX1jFjN+_3!noi8{!{k0PcM^U*1-k0Mh({)AtwiY|r8H3@ zWo#x*){^4-3TKN2uYwp7iK5do3^+OYpp$ z(M0OYX&r1{+{_E%o+imWNDono0WuGdxIZtVe4Y2kr&*T2`KP{EU-mb#BMoQ z^P@&0-a9sIH!5MmC5uHoitG|T?6~kh+3}QLlkQ@W^L7u7KTOKqtap|9V3#k7QJHsU zc(|n?Pl#UJR-+Y`HJ1InlIPV@&@Alo%j0CV-praI2>#^FqqCKpHcsY7bOpICSl^4u zpX(Q#o^Jf6z`l7!0;277e_MHm98+sJbURQ0)=S|YZQLNfM#5h`xqPLJOzQYO z+wrJaLtJxyh;M*nW5(ISOp|6{0Sj}JJ$e>MhlmH>?|pYu)drlXiz%?fq8kj@`+s|er5gy~?$ z9nPZ*W?-q42XZmTuGGO(12gA(j=(rzuF$DDWO)ZoU~DkjLDkMuMjSktiEg{WIPPoG z$W7vFG+W;s(ngv`%YD;oDE%*g7`dx#eX}tvz3$ds$S)du<@9nSItqV;^bDjlv z=!RuLx6993`|Ud{;WLU81i8kRN?}8Dp_vXed6zC<-uP6Yq3*VObQSaJ7F@XeDkgus z69|e-2Pp2`&*p5y!cQ`rsaL&UV(RvTNhMPB3MhY-;i(mllY2IUl*ngK^?4`p-&o9#C-jAMz+7RNK< z1r4jv#iI(A1d_P?itL+yXCorj{}QAx~Q_{&b>b$8=#;y+!QLnC$7$v9Qy~}5{eUIM3dQVL>eiB~{ zN82a!HAX$QiP5%ca=Rom!9MQ+z1oYub0$<-BCA%lk9YkV^Ld9%sp1D-R)633JmFdi z47SVtvNZA{^e0YxTp>+V#zBq^&7Oy~S~8rZCGA8L7I2w&nDOFoGj@hhikmy+=@z|P`tdMf z-x5$CfzX#MKILb?!81QgD;s|oMDN*0U8SYH$wKQ)EQI%qzgO5twW5n%nHlk}U;hT> zYf9^jSCWliT3+rQ1{JU2=c{$ZkomN?C6t0GsYTxf6Ud}qpq8N@e&a*HY5#hpKDhHD zxiOkjQzCL-Y|f4`IlZo67douviI zyn{W`_nB2&It!b{)#z`mN6o=z#{$2X<8_9z3A#C0I~1p+=b6kpz>dDoEqzUYWy(rC z6Lc=ste)aM0oq((S??s;97T9=b(@RAv7ds7l5q`~#?Nipz!+`E!5zCXnKi(<@_+_9 zXFMe(&zC0vX8o7Qz=b$B}FQI>LRL(G`WkxW_U6`VoRL&#aJl9NWM9ZqlyYx z#Jt64&OaK&LpNXnZ$rhF$UCO_QGxK`Z&u!Vo85#ASKXxg1{Ch+jV7MIO&yV{0Fjd> zB7X(E-&fy4MFp~^rlvsF9gTLAv;Yb9mLLjfg3b-MKB2II=ZcvVjg9W*H~a>AM-pC` zn5TK*;3FFoDpcj(6 zN#Um>rAD~_yv={{N$EUVPYU@x*Wqlyh>jF1S^fK+ts4q+8*KC*>b^sy_{1FNI&l5o zv+jU=q5JO8>Pr2vYYxxK(?--D2%828J$gdJ{lqKEVcw0hJ z;#6W!t+&09A3A6r9z{^|Y+NbC5_a)^+PIoQ*Qem~aGqoQ(Fx%5+-^vmE&X`Fb$mRZ zUHAYL#C@HRG#^Ge>Agvr$w(&hDUNVbg>+PS>e;#Qr^PA2YoXaCU~JZ7$E)W=jQV%Bp#1bzp`JYPuirRw*!ZQSfGlAakH3o= zcdimxRE!FguR$~|#w)U%P{lNkjn2s{;m&gp!ug^H3#W@;dY~U8kHw@?ioBL{0dH$s-zxbM*GhFI>gsbNj})eg4i+ff%tf@}2Ag}wU&*I%WLLuJlAkA4O81_pc<1a( z8PkhY|?~@qg8W<0Bf^FLP^A zDM*2owPlm?pn-{ZH3zRQv6R{_iuKMbQ6g)3o#ZsntH*ec@^H+;mRpU=x{S?be#XNj z&1_6+wpR?~b3{!A%&$D+b+y}6Rd%$VStH?9Tz_{!klmZW&4WbAqCyVBAO+OZ-=Mu?lwO0A{^U>8|Phm66#Wce|` z1^9FwFILaDScJkR_vIwzM_mRP41_q>zh7ue0vYSFrf-u@MJfY2k@_ifKafoDc5(Bm z>SFwloTZ^;59qVMa#F>WpQ~n zGD6tOV;DXcCi||U#MOQTR~@7zZ$k#?&vFlsV~2SWoTIL@iKS5lQu=DFkWF z;y-1STiL^U1!Jfeww z9mh?CLKbHzBD}Yu*b6aIDU}#*?@GEwX|k6wHB1h6BQsp0$3zn4Ij?TYn?yE&Mbo4d zVhj@r_K*!bUJ))h5v1Om6||WQx~P;@E*uanF>pKgPT^BS4O%xhNw(BM6&>P~$-owH zoYt_wd+z$`^Y@JA;d?`AFPIi+>}4Lm9*%OPY3hq=KkzOe(Koe$7;>=xRL<}EN+a$o ztG_(T5lUg9hqU~eV)|NV{o8^i@3J3nse^hI!P!wtL~?$f0K(+60X#@*lKb~3fRi( z+#p<&Ps96a$`un^PT)tGX9;q1#l`gzkF&0mf$HU1Z@>>^zFN%8Ek>nBv`BT0`GKT> zZU=J@k@SGFyh9Dq1G-DYUo$dsv*cCt2^n)n#pkZr;Jn$nA6=~(FoZN0MK*qf0f({M zYO+w)ZP#7}rSSN>3rTFHlTpUW_n#P{n$3*8HA_e)6zgZm*$cj#Q*zxN^wz@6cobBf zy8*g$IWDO72s?gBoCG45r~9=U;+NhV$A6*P-?JQQ$q&_OD^G{-R{0f+;EWyZQ%o;u zYb!+-kJIR%LN{DRhk9}g(_3~ZsxSs!9_GUf#*EK`BB}8TwKE59as+r!SRBm_zco?Wn_QckB+Y$ruZyV8(I6s+Ie{9#J z%WHl=_V>)NgMGA~w^T8FZ>u*2dHw>00eqRqi9m%nWJa3WSbOYX{$|C%vD#RKvxI3)S9S%| zy427SS0Z{qKHeJJnuf-8fA9WJbg)kk0v4*?{`$aFs`Ghbl9-4v{885RwsOEsv=L~Qt{PEJTNPS7 z?l5`1^%zMHwbnN{3a8Dw!Ws5cNU}ORm=K$^vpOm<5|%uw$f2;t+XqMa(b74=CUTJf z8u(7jRdD1%7DqXggk&9`EaEC~o5q~#*1)}LrfUo?08o(7q^XLAMj8=BPg@Q z6baR2ybf}t9aD4taGry1>Fwd^Ef$P|a0iZ9N;EiR>})1#Iv-#r&U~DH7WCe{a+1pF zHja|(oOX4GQP1fdAgEMFG3OtTz$=dRFs_uHwrAe+D=@%rjRF zPP{TG_-t|(N2_u%At&08!#{jRSzplE+{f%?l0JE8BCw}|sB!tV2&-B)uRjSVWqiPB z#!0ey7=uFZdvNW!Ry9p#o)An3`~JL|?4zQ6f%5X@9^#6!da!L9FrwJ-;<-umX3`p~ zu?7X_CeG(U%P&Ss$~uFedkQZIGurXp_ERe~y*_UD#xhLFYNWm-Kx(G<+?^rciDK^% zi?;Ua=AEAPfd?L73g#$<=)y#{?mtV69hUH1((9s*3xif!-}O;@ArkbEgOYyyiV(?N zd?hi=D=TM>o9lY%Ph)2E1w>mu&oPf*6XbVMA88czF=bsKe>u75nU^F}gG ztS#fN6@uVLS=8K@K8_VP=yWLO*u4Uf6h2ngnFhM^?Yp8EE`Vvr85(f&Fx=Qb9c=ig z?{+7dM|}f-Dbn50?4O)uPGaEw2=zrlwzP_(XckI@gMgOn0~WW{wmyt*8D|+MXSiln zUez|HdU1uUwSmVKy*V9Q8QXee75%0qqM%Ni@MzbFVmkZI$Z4}5Wv`iRH}iGPS|`el z1HbhKSjT0@r>y)3-vk>@CdQ-YCi8OQHfv1k9xI1tbcev^c~7j|RNUZj<27)mHDW|< zudDByt1>2$y_>H^IdFxr$m1bTf&?5+;U_7pD-3$a?uG#I3ka*U8{AGUDki^&T+4kc zf;bQ9bKVrhX?f_`%qG)t7>&y9tR8c18BH>Is7nZwmve@$QAhfOa^Ry_j`IbSiP<*OP0I!B_2 z_cLDn2LCFR^hRQ6dCIm5$(+t?{fPLS=BTd>A@E48Brl`z-+=)0{@p}|zKD_)Ms{-1 z{Zwa-j|O0_>8`hXh5AMpGru~sZ?9=6HSY1QR3#LPPwb{sOCR4$d@#|qy!GNeTUJ$o zh%ZyXH?m5Jn>gGmDBj)nlyzPz1A`l4*ZDrlCoKTCUNzyoJk{$(1msQII%5{qrMQnd zFA>Azt3H7%8ygD^=ia|uayM<(eT695EnE`&talEg@?F63^rYen`ZQ=!#ad0_IS6Z&FEEG(XtGWrib+om7WG==Rl;Rh4049OtDVPm> zaUlPNHBfXOAxTQ%X_SJ4T5jTQ=iQxd@h9F_x=Gp^5Lx&E%VwL5yT38X`|Ozt6A>Wq z*oeuuG&au6$-$EJ0g5@p%tzoHaK}f??f95Xy*eM$*dS3gE6Dti^eBr7t}lNOu}K9kL%H8fWq1=<4U z2>t@oR$=<)foZPAB3TzCas_#C>sKK zBij30m44s?)*}TU9N8Ly6KRS%@I*3Xv7dncHH#y~3=@lKktbyUw1G4hq9wG>)GaH2 z6;k-ocU+Cw&5d}kkacgWp(v^j@9ZH~5BwNgcpT$=LVd(< zkHQ$6ufC1y2}&BAXCtks=^&;N&k{R(^z08Ip0glL9Q?riC(=_o6*;S2|BM%$iT=GM z*)q@4R7E9?M5**hR1M-jaVCygO53{-+`qI!rU=mKnT$7>xn4Wp$x$xINW?``JG-Rs{`cEDI! z7>v+DxUszkq37V>umFVxTK@k2a-`q|40zyZ6be;aTe(raik*F64qP7M;BvDy@~(|e z)Q*3EHc5AaIcOcAqIkGokwR9^SUl5)d#&e5e|C0u##z-%T7YH|N)&vEjf>+l9}xoo z1P4jv7Acv9_Tg3p+`5Xr;;pr%j^TSqCZWD{(bm)&YQ9f4%CIpW2C;dcj|I?02njpnpXyMfbS&bdDeW^9dD2b&6hDl&$3M4i;1my!p0&v(AI7Z z6_4w7y8@{?>rX-x3yZqFA@!bkZZ<(djGs1YCQ{w9w`vP~M`RJ8eNmuHA|WN6KSrdd zd-7nL?moZB#WOay*kYyOVrXZhYxy2m^{S=DB#M`-puw!4B>TKjAeKv6C>@aOy<5$z zs7D{K?(FO!ow0ahQY)bL$Ik&KP$Wgdma-eMR0x#f_=h(rRuL-u-R^zxMNt$h;Gj@( zmXf;wunby&-`}jDj+2AKz9_A%%pM@w01Ict`~X;6tu-+*F`#Y{pp!eUX%+)v1~8;R z3M&Di3(u~?k7wUQ3ZAGt-5(bh69d$kMpE5Tz%D@E#Fzjuu$5KA_IFZ%J#NX_>ycxw(srOZG?X+jj_?nXQh6f|0zl{|^d1S@!I0_s66&&!+M3-^|R$&h@`8 zA@ctLQ-2VJZPi~_urzkL{dKic|F%GXKAMwfdkuLI=;H$reX_uk{JA10KtW&DMTl?6 znaTR|`J8;y%*>;+e*N>=0~mG}`RfvT{Qp49ZvRyTf&Ffqvl{!qex(XaZSdFSuJJ!h z4gP=Ci~*1^*@}*daa>G*W#T*#ABy^WJe9CS_wTxTdH}pr0Z%9p2#b43{nvSg=bx?v zwfX<9|C7!Hcet~TjgL=b^o|p}hLadxqI^xyMeeTEIaqgW_zYHbJua8K_up42v4Wor z*ZBhNXAy8X8pOQxgzP2%N`R|1nD#qYpjWFnxPWN&pG%1eNYdXT4uJ}3npC>zH05B7 zb_Pfl|0@joC+>#K)^V#|Pilbj|9KRmQgpT+TVfGY=B@_>d;k5<8-ugFpo`uD?|&aM z68(Q;Zk;W@F#tr&x|rO}%)})3*D6vv0~12zvJg}6HYvnuwQ8Sma7PWx)dGZj_l+DU z%dxGPIIcqBKkFO$0UMQsq`?+u=HYNt{UzNE@2m0g>hHF{hNDn|M&0n!Zc>4IlN-Ee zg{0WtNJgKnQ}^(0jat+mh9@_bzl@zT*VNqD(!A9~b%B`JXn~l8g(*n|1h-jK z@^b%UVKU)o*5yHfPt~OW7gHvJp)&S7Q`1&^Yc<>(IdQlp*ZelSI#~#CgV4xz&}5$B z0$uTc%2L2FzT~$#qvt#JtFZ4xtg6{k9O&03A(mKcz81CHJeE;inTVng zC_aJ;TF-8*4jYD!tz?KX4+;jpEd1*sRbUOlew5Z-3p0>NTew`b8#9XOWd`JZvRW?Y z0Ibw+C3vcI8DE+?;6@ZNk$A?!$nd{ygzWjB*~(yfO_1zyu zqzc!5k3Zk?l6aj!8#Tc#7W?860KI5q#zH!5L^q~?VCzjqJ9&_RjOv?a&gEX$kAQS}w)g_9v~ zsIU0D$XlZBg#6cajJW+%=UU$n!rV+Itpslq9nEQ%nCQ_)T!wT=ip+(D!UW5$IsSV4 zK5)`H%K4D|q0i~iU zZXK(DpL%1Yh|=k_g#xaj?egoIcINYaP;E?0OWUzvYBK*Q48L7Wzz0kgjIK-U?4Ry_ zlm77Vs*t9->tYlW(!|IXvC%wkYwBllg=%w^=Bn?QX{X+NZ}0~2 zi)%q;WdZT%kmPsZ*sRd9RdwrMeDt3ma0^SJx7QJ%RlOVLJ$rrD4vcYk{dR7><;LMh zUTt!BKH%T=k0b;J-qd7eXBR2Uy@f4Y`sYf<+IcyInq@trX#KJ)|7qU==;Cjvp95{1 z>@b(lDf8_+$f5NEBLT+vG^Vz4ON_sPl@2m5rUcsNMPzh=ys@J_HfEG7aqy7&C^_76 zFtDf1hJI{b*)5ufO@@>=j(3A0eBt7CMw7nl7wnt8Tp5V`!l;Wy+(3=mEA9@`zb4El z5AY)P*#_hM$B!Q6(gx=j?96jmtc52XZL@)4DA`w-{y|8C`K6BEzgT6ajAfLwtzMa`5zwR#`mMi5o@0rG;p2AOAR$|n%;s<&jr1)0`vR=?X zGHnSYQ|x9H11H&kFI}*q3Gtg6t0K+`d&;Xo`_B0qdMA}F#V-WbfR0?sl;+ue)zNhz z^6l=ZgGDk;37FqR{6UGi54eNwwzW|lDbfWrDe8QGgbZVE3O&~WRd5CglCVIIc_k|m zOG>GW;T$03#>Pg;0yt2H#>N;LI1WvWjp^LB`j>CZAnNKgZ~GkP=5lj#8aByXRaF(7 z&!@Tf%n_M(f{^`QVY?_RgR;WxTY<&E%fqu#cc3LHqcn7#z^{3Iyh8c|zWRWjK3Uvy z57g+wz}PK$?qW?zRjqG5`jY^M^Y1G{wt-zrCg&)(7|fdah8l@Uqe!9<8y#?x$y$G*;~zke#s zGbR7fc&JK>m59dPYrf1YFycde{i39jX_<*0;?!htHI%RvneP7n^|^2Q51*4bgBtXq zsVMH8YF{?OhiDudLFJUFn={NG_+m(d`ATDU#sCk2-pUN$ZT4OVo6U` zeF>O;v^=tB!bPMQBy_hf&~{u%b)dp0l`>sPs;3m(a2JcxKKj*6doX?*!)|LjXpt25 zjapSzRX{fc8llhhlKNixPlg2c9~EW-_}d7hgJ%E!^XE-IDx|RIhBR|qfN}`!r3YfY zSSdL?!@lq&@J>hTkFWc?u!6$S4LYf(UESSI0_nmkgpVkb`~wE(oQ{_f{2@@wDk>Rh z719$>UHyAeH3KPSm#nZU48<{Xv8^62R>v=!?28P@Ogm@fLK?WMU$ z;e0^m>Uk(WT_j`Bc_=`%rAT)PuWq+bnvIPOv=*2?P$_GmFjAz~0!rZR+p-i8c2u;I zzd-p6XLML@RtS^_9^Zvao71+yeqM5Mte=@k+FYxu@L?=_7g%B-o4ks{%-RO%!eN5P zy+PG%6OzS%!ELao{hH*&RA{I4ms5%X`YpScOpMB%FNg5{GJwJ7K@2amqdv
-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%0D3$G10Zw2jeo+$`PpG7^z_i+RM#u^1Bl+| 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 b+XOC@8kdAT)5+vNR;{yozvZ8~{QJKFnl(h8 literal 0 HcmV?d00001 diff --git a/metacatui/docs/design/editor/use-cases/images/add-nested-dataset-sequence-diagram.png b/metacatui/docs/design/editor/use-cases/images/add-nested-dataset-sequence-diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..b12011ae8c24b4df8dca9aec793e0e346b11c29b GIT binary patch literal 61036 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 literal 0 HcmV?d00001 From 49c3590d52a6403cf9f1aaa4cb3c3f8a6898d28a Mon Sep 17 00:00:00 2001 From: leinfelder Date: Tue, 27 Sep 2016 15:30:03 -0700 Subject: [PATCH 012/560] fix syntax issues --- .../src/main/webapp/js/models/LookupModel.js | 42 +++++++++++++++---- 1 file changed, 35 insertions(+), 7 deletions(-) diff --git a/metacatui/src/main/webapp/js/models/LookupModel.js b/metacatui/src/main/webapp/js/models/LookupModel.js index f73e0db85..310cce9ae 100644 --- a/metacatui/src/main/webapp/js/models/LookupModel.js +++ b/metacatui/src/main/webapp/js/models/LookupModel.js @@ -37,7 +37,7 @@ define(['jquery', 'jqueryui', 'underscore', 'backbone'], choice.synonyms = []; _.each(synonyms, function(synonym) { choice.synonyms.push(synonym); - } + }); } choice.filterLabel = obj['prefLabel']; choice.value = obj['@id']; @@ -45,16 +45,44 @@ define(['jquery', 'jqueryui', 'underscore', 'backbone'], choice.desc = obj['definition'][0]; } - - // TODO: process the children recursively + // process the children - just one level var childrenUrl = obj['links']['children']; - if (false) { - //if (childrenUrl) { + if (childrenUrl) { $.get(childrenUrl, function(data, textStatus, xhr) { _.each(data.collection, function(obj) { - // it is the same response format as above + var choice = {}; + choice.label = obj['prefLabel']; + var synonyms = obj['synonym']; + if (synonyms) { + choice.synonyms = []; + _.each(synonyms, function(synonym) { + choice.synonyms.push(synonym); + }); + } + choice.filterLabel = obj['prefLabel']; + choice.value = obj['@id']; + if (obj['definition']) { + choice.desc = obj['definition'][0]; + } + + // mark items that we know we have matches for + if (allValues) { + var matchingChoice = _.findWhere(allValues, {value: choice.value}); + if (matchingChoice) { + choice.label = "*" + choice.label; + + // remove it from the local value - why have two? + if (localValues) { + localValues = _.reject(localValues, function(obj) { + return obj.value == matchingChoice.value; + }); + } + } + } + + availableTags.push(choice); }) }); @@ -113,7 +141,7 @@ define(['jquery', 'jqueryui', 'underscore', 'backbone'], if (synonyms) { _.each(synonyms, function(synonym) { terms.push(synonym); - } + }); } }); From e024de87e798c2442cef2ca477bd6e58b6f60cc0 Mon Sep 17 00:00:00 2001 From: lauren-palmer Date: Tue, 27 Sep 2016 16:02:37 -0700 Subject: [PATCH 013/560] Add back hoverAutocomplete initialization, but in the AppView --- .../src/main/webapp/js/views/AnnotatorView.js | 8 +-- metacatui/src/main/webapp/js/views/AppView.js | 37 ++++++++++++ .../main/webapp/js/views/DataCatalogView.js | 56 ++++++++++++++++++- 3 files changed, 96 insertions(+), 5 deletions(-) diff --git a/metacatui/src/main/webapp/js/views/AnnotatorView.js b/metacatui/src/main/webapp/js/views/AnnotatorView.js index a2da2e497..d39bd0ffd 100644 --- a/metacatui/src/main/webapp/js/views/AnnotatorView.js +++ b/metacatui/src/main/webapp/js/views/AnnotatorView.js @@ -123,7 +123,7 @@ define(['jquery', this.$el.annotator().annotator('addPlugin', 'Tags'); // Initialize the autocomplete widget extension to provide description tooltips. - $.widget( "app.hoverAutocomplete", $.ui.autocomplete, { + $.widget( "app.semHoverAutocomplete", $.ui.autocomplete, { // Set the content attribute as the "item.desc" value. // This becomes the tooltip content. @@ -175,7 +175,7 @@ define(['jquery', }); - this.$el.data('annotator').plugins.Tags.input.hoverAutocomplete({ + this.$el.data('annotator').plugins.Tags.input.semHoverAutocomplete({ source: appLookupModel.bioportalSearch, position: { my: "left top", @@ -225,7 +225,7 @@ define(['jquery', // change the autocomplete depending on type of element being annotated var type = $(resourceElem).attr('type'); if (type == "orcid_sm" || type == "party") { - view.$el.data('annotator').plugins.Tags.input.hoverAutocomplete({ + view.$el.data('annotator').plugins.Tags.input.semHoverAutocomplete({ source: appLookupModel.orcidSearch, //focus: focus }); @@ -233,7 +233,7 @@ define(['jquery', $.extend(annotation, {"field": "orcid_sm"}); } else { - view.$el.data('annotator').plugins.Tags.input.hoverAutocomplete({ + view.$el.data('annotator').plugins.Tags.input.semHoverAutocomplete({ source: appLookupModel.bioportalSearch, //focus: focus }); diff --git a/metacatui/src/main/webapp/js/views/AppView.js b/metacatui/src/main/webapp/js/views/AppView.js index cedb4bdc3..6c96fb17a 100644 --- a/metacatui/src/main/webapp/js/views/AppView.js +++ b/metacatui/src/main/webapp/js/views/AppView.js @@ -84,6 +84,8 @@ define(['jquery', this.listenTo(appModel, "change:title", this.changeTitle); this.listenForActivity(); + + this.initializeWidgets(); }, //Changes the web document's title @@ -379,6 +381,41 @@ define(['jquery', }, + initializeWidgets: function(){ + // Autocomplete widget extension to provide description tooltips. + $.widget( "app.hoverAutocomplete", $.ui.autocomplete, { + + // Set the content attribute as the "item.desc" value. + // This becomes the tooltip content. + _renderItem: function( ul, item ) { + // if we have a label, use it for the title + var title = item.value; + if (item.label) { + title = item.label; + } + // if we have a description, use it for the content + var content = item.value; + if (item.desc) { + content = item.desc; + if (item.desc != item.value) { + content += " (" + item.value + ")"; + } + } + var element = this._super( ul, item ) + .attr( "data-title", title ) + .attr( "data-content", content ); + element.popover( + { + placement: "right", + trigger: "hover", + container: 'body' + + }); + return element; + } + }); + }, + /********************** Utilities ********************************/ // Various utility functions to use across the app // /************ Function to add commas to large numbers ************/ diff --git a/metacatui/src/main/webapp/js/views/DataCatalogView.js b/metacatui/src/main/webapp/js/views/DataCatalogView.js index 73e34e4e0..a234b47ae 100644 --- a/metacatui/src/main/webapp/js/views/DataCatalogView.js +++ b/metacatui/src/main/webapp/js/views/DataCatalogView.js @@ -1433,7 +1433,61 @@ define(['jquery', }); } - $('#annotation_input').hoverAutocomplete({ + + //Set up the hover autocomplete for semantics pick lists + $.widget( "app.semHoverAutocomplete", $.ui.autocomplete, { + + // Set the content attribute as the "item.desc" value. + // This becomes the tooltip content. + _renderItem: function( ul, item ) { + // if we have a label, use it for the title + var title = item.value; + if (item.label) { + title = item.label; + } + + // if we have a description, use it for the content + var content = '

" + + //Set up the popover + var element = this._super( ul, item ); + element.popover({ + placement: "right", + trigger: "manual", + container: 'body', + title: title, + html: true, + content: content + }) + .on("mouseenter", function () { + var _this = this; + $(this).popover("show"); + $(".popover").on("mouseleave", function () { + $(_this).popover('hide'); + }); + }) + .on("mouseleave", function () { + var _this = this; + setTimeout(function () { + if (!$(".popover:hover").length) { + $(_this).popover("hide"); + } + }, 300); + }); + return element; + } + }); + + + $('#annotation_input').semHoverAutocomplete({ source: function (request, response) { var term = $.ui.autocomplete.escapeRegex(request.term) From 4d9157f92c65d65c613435929662f5282f6e6e0b Mon Sep 17 00:00:00 2001 From: lauren-palmer Date: Tue, 27 Sep 2016 16:18:50 -0700 Subject: [PATCH 014/560] Add API key to bioportal search in lookupmodel --- metacatui/src/main/webapp/js/models/LookupModel.js | 2 +- .../src/main/webapp/js/themes/dataone/models/AppModel.js | 7 ++++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/metacatui/src/main/webapp/js/models/LookupModel.js b/metacatui/src/main/webapp/js/models/LookupModel.js index 310cce9ae..870a0fab0 100644 --- a/metacatui/src/main/webapp/js/models/LookupModel.js +++ b/metacatui/src/main/webapp/js/models/LookupModel.js @@ -49,7 +49,7 @@ define(['jquery', 'jqueryui', 'underscore', 'backbone'], var childrenUrl = obj['links']['children']; if (childrenUrl) { - $.get(childrenUrl, function(data, textStatus, xhr) { + $.get(childrenUrl + "?apikey=" + appModel.get("bioportalAPIKey"), function(data, textStatus, xhr) { _.each(data.collection, function(obj) { var choice = {}; diff --git a/metacatui/src/main/webapp/js/themes/dataone/models/AppModel.js b/metacatui/src/main/webapp/js/themes/dataone/models/AppModel.js index 2730b4c72..f518fe885 100644 --- a/metacatui/src/main/webapp/js/themes/dataone/models/AppModel.js +++ b/metacatui/src/main/webapp/js/themes/dataone/models/AppModel.js @@ -57,7 +57,8 @@ define(['jquery', 'underscore', 'backbone'], nodeServiceUrl: null, // NOTE: include your bioportal apikey for suggested classes // see: http://bioportal.bioontology.org/account - bioportalSearchUrl: "https://data.bioontology.org/search?ontologies=ECSO&apikey=24e4775e-54e0-11e0-9d7b-005056aa3316&pagesize=1000&suggest=true&q=", + bioportalAPIKey: "24e4775e-54e0-11e0-9d7b-005056aa3316", + bioportalSearchUrl: null, //bioportalSearchUrl: null, // use this to deactivate the annotator view //orcidBaseUrl: "https://sandbox.orcid.org", //orcidSearchUrl: null, @@ -179,6 +180,10 @@ define(['jquery', 'underscore', 'backbone'], if(this.get("d1CNBaseUrl").indexOf("cn.dataone.org") > -1) this.set("googleAnalyticsKey", "UA-15017327-17"); + //Set up the bioportal search URL + if((typeof this.get("bioportalAPIKey") == "string") && this.get("bioportalAPIKey").length) + this.set("bioportalSearchUrl", "https://data.bioontology.org/search?ontologies=ECSO&apikey=" + this.get("bioportalAPIKey") + "&pagesize=1000&suggest=true&q=") + this.on("change:pid", this.changePid); }, From ad56824f84f2fd72a18c7fdc9b8cf633f1b983b5 Mon Sep 17 00:00:00 2001 From: lauren-palmer Date: Tue, 27 Sep 2016 16:20:51 -0700 Subject: [PATCH 015/560] Remove jquerysidr library which is not in use --- metacatui/src/main/webapp/components/jquery.sidr.min.js | 4 ---- metacatui/src/main/webapp/js/app.js | 5 ----- 2 files changed, 9 deletions(-) delete mode 100644 metacatui/src/main/webapp/components/jquery.sidr.min.js diff --git a/metacatui/src/main/webapp/components/jquery.sidr.min.js b/metacatui/src/main/webapp/components/jquery.sidr.min.js deleted file mode 100644 index c0e3deb49..000000000 --- a/metacatui/src/main/webapp/components/jquery.sidr.min.js +++ /dev/null @@ -1,4 +0,0 @@ -/*! Sidr - v1.2.1 - 2013-11-06 - * https://github.com/artberri/sidr - * Copyright (c) 2013 Alberto Varela; Licensed MIT */ -(function(e){var t=!1,i=!1,n={isUrl:function(e){var t=RegExp("^(https?:\\/\\/)?((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.)+[a-z]{2,}|((\\d{1,3}\\.){3}\\d{1,3}))(\\:\\d+)?(\\/[-a-z\\d%_.~+]*)*(\\?[;&a-z\\d%_.~+=-]*)?(\\#[-a-z\\d_]*)?$","i");return t.test(e)?!0:!1},loadContent:function(e,t){e.html(t)},addPrefix:function(e){var t=e.attr("id"),i=e.attr("class");"string"==typeof t&&""!==t&&e.attr("id",t.replace(/([A-Za-z0-9_.\-]+)/g,"sidr-id-$1")),"string"==typeof i&&""!==i&&"sidr-inner"!==i&&e.attr("class",i.replace(/([A-Za-z0-9_.\-]+)/g,"sidr-class-$1")),e.removeAttr("style")},execute:function(n,s,a){"function"==typeof s?(a=s,s="sidr"):s||(s="sidr");var r,d,l,c=e("#"+s),u=e(c.data("body")),f=e("html"),p=c.outerWidth(!0),g=c.data("speed"),h=c.data("side"),m=c.data("displace"),v=c.data("onOpen"),y=c.data("onClose"),x="sidr"===s?"sidr-open":"sidr-open "+s+"-open";if("open"===n||"toggle"===n&&!c.is(":visible")){if(c.is(":visible")||t)return;if(i!==!1)return o.close(i,function(){o.open(s)}),void 0;t=!0,"left"===h?(r={left:p+"px"},d={left:"0px"}):(r={right:p+"px"},d={right:"0px"}),u.is("body")&&(l=f.scrollTop(),f.css("overflow-x","hidden").scrollTop(l)),m?u.addClass("sidr-animating").css({width:u.width(),position:"absolute"}).animate(r,g,function(){e(this).addClass(x)}):setTimeout(function(){e(this).addClass(x)},g),c.css("display","block").animate(d,g,function(){t=!1,i=s,"function"==typeof a&&a(s),u.removeClass("sidr-animating")}),v()}else{if(!c.is(":visible")||t)return;t=!0,"left"===h?(r={left:0},d={left:"-"+p+"px"}):(r={right:0},d={right:"-"+p+"px"}),u.is("body")&&(l=f.scrollTop(),f.removeAttr("style").scrollTop(l)),u.addClass("sidr-animating").animate(r,g).removeClass(x),c.animate(d,g,function(){c.removeAttr("style").hide(),u.removeAttr("style"),e("html").removeAttr("style"),t=!1,i=!1,"function"==typeof a&&a(s),u.removeClass("sidr-animating")}),y()}}},o={open:function(e,t){n.execute("open",e,t)},close:function(e,t){n.execute("close",e,t)},toggle:function(e,t){n.execute("toggle",e,t)},toogle:function(e,t){n.execute("toggle",e,t)}};e.sidr=function(t){return o[t]?o[t].apply(this,Array.prototype.slice.call(arguments,1)):"function"!=typeof t&&"string"!=typeof t&&t?(e.error("Method "+t+" does not exist on jQuery.sidr"),void 0):o.toggle.apply(this,arguments)},e.fn.sidr=function(t){var i=e.extend({name:"sidr",speed:200,side:"left",source:null,renaming:!0,body:"body",displace:!0,onOpen:function(){},onClose:function(){}},t),s=i.name,a=e("#"+s);if(0===a.length&&(a=e("
").attr("id",s).appendTo(e("body"))),a.addClass("sidr").addClass(i.side).data({speed:i.speed,side:i.side,body:i.body,displace:i.displace,onOpen:i.onOpen,onClose:i.onClose}),"function"==typeof i.source){var r=i.source(s);n.loadContent(a,r)}else if("string"==typeof i.source&&n.isUrl(i.source))e.get(i.source,function(e){n.loadContent(a,e)});else if("string"==typeof i.source){var d="",l=i.source.split(",");if(e.each(l,function(t,i){d+='
'+e(i).html()+"
"}),i.renaming){var c=e("
").html(d);c.find("*").each(function(t,i){var o=e(i);n.addPrefix(o)}),d=c.html()}n.loadContent(a,d)}else null!==i.source&&e.error("Invalid Sidr Source");return this.each(function(){var t=e(this),i=t.data("sidr");i||(t.data("sidr",s),"ontouchstart"in document.documentElement?(t.bind("touchstart",function(e){e.originalEvent.touches[0],this.touched=e.timeStamp}),t.bind("touchend",function(e){var t=Math.abs(e.timeStamp-this.touched);200>t&&(e.preventDefault(),o.toggle(s))})):t.click(function(e){e.preventDefault(),o.toggle(s)}))})}})(jQuery); \ No newline at end of file diff --git a/metacatui/src/main/webapp/js/app.js b/metacatui/src/main/webapp/js/app.js index f9c96c12b..cffc6e2ef 100644 --- a/metacatui/src/main/webapp/js/app.js +++ b/metacatui/src/main/webapp/js/app.js @@ -31,7 +31,6 @@ require.config({ jquery: '../components/jquery', jqueryui: '../components/jquery-ui-1.10.3.custom.min', jqueryform: '../components/jquery.form', - jquerysidr: '../components/jquery.sidr.min', underscore: '../components/underscore-min', backbone: '../components/backbone-min', bootstrap: '../components/bootstrap.min', @@ -68,10 +67,6 @@ require.config({ annotator: { exports: 'Annotator' }, - jquerysidr: { - deps: ['jquery'], - exports: 'jquerysidr' - }, jws: { exports: 'JWS', deps: ['jsrasign'], From 56e8603a8071f275266ef0dbacc2a1aaaacfdbd7 Mon Sep 17 00:00:00 2001 From: leinfelder Date: Tue, 27 Sep 2016 17:36:07 -0700 Subject: [PATCH 016/560] include synonyms when showing concept details in search and annotator views --- metacatui/src/main/webapp/js/models/LookupModel.js | 13 +++++++++++-- .../main/webapp/js/templates/annotationPopover.html | 10 ++++++++++ .../src/main/webapp/js/views/DataCatalogView.js | 9 +++++++++ 3 files changed, 30 insertions(+), 2 deletions(-) diff --git a/metacatui/src/main/webapp/js/models/LookupModel.js b/metacatui/src/main/webapp/js/models/LookupModel.js index 870a0fab0..8b578a505 100644 --- a/metacatui/src/main/webapp/js/models/LookupModel.js +++ b/metacatui/src/main/webapp/js/models/LookupModel.js @@ -47,13 +47,14 @@ define(['jquery', 'jqueryui', 'underscore', 'backbone'], // process the children - just one level var childrenUrl = obj['links']['children']; - if (childrenUrl) { + if (false) { + //if (childrenUrl) { $.get(childrenUrl + "?apikey=" + appModel.get("bioportalAPIKey"), function(data, textStatus, xhr) { _.each(data.collection, function(obj) { var choice = {}; - choice.label = obj['prefLabel']; + choice.label = "--" + obj['prefLabel']; var synonyms = obj['synonym']; if (synonyms) { choice.synonyms = []; @@ -179,6 +180,14 @@ define(['jquery', 'jqueryui', 'underscore', 'backbone'], if (obj['definition']) { concept.desc = obj['definition'][0]; } + // add the synonyms + var synonyms = obj['synonym']; + if (synonyms) { + concept.synonyms = []; + _.each(synonyms, function(synonym) { + concept.synonyms.push(synonym); + }); + } concepts.push(concept); diff --git a/metacatui/src/main/webapp/js/templates/annotationPopover.html b/metacatui/src/main/webapp/js/templates/annotationPopover.html index 67bb45080..87f4bf8b9 100644 --- a/metacatui/src/main/webapp/js/templates/annotationPopover.html +++ b/metacatui/src/main/webapp/js/templates/annotationPopover.html @@ -5,6 +5,16 @@ <% } %>
+ <% if (annotation.concept.synonyms) { %> +

+ Synonyms: + <% + _.each(annotation.concept.synonyms, function(synonym) { + print(synonym, "
"); + }); + %> +

+ <% } %>

Definition: <%=annotation.concept.desc%> diff --git a/metacatui/src/main/webapp/js/views/DataCatalogView.js b/metacatui/src/main/webapp/js/views/DataCatalogView.js index a234b47ae..078f166ca 100644 --- a/metacatui/src/main/webapp/js/views/DataCatalogView.js +++ b/metacatui/src/main/webapp/js/views/DataCatalogView.js @@ -1450,6 +1450,15 @@ define(['jquery', var content = '

'; if (item.desc) { content += '' + item.label + ''; + if (item.synonyms) { + content += '

Synonyms: '; + _.each(item.synonyms, function(synonym) { + content += synonym + "
"; + }); + + content += '

'; + + } if (item.desc != item.value) { content += '

Definition: ' + item.desc + '

'; content += '

Concept URI: ' + item.value + '

'; From 52b2c36ad13cff459d865c72424b7260450e5eda Mon Sep 17 00:00:00 2001 From: leinfelder Date: Thu, 29 Sep 2016 16:19:19 -0700 Subject: [PATCH 017/560] only use the first person from the accounts lookup when showing annotation details. --- metacatui/src/main/webapp/js/models/AnnotationModel.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/metacatui/src/main/webapp/js/models/AnnotationModel.js b/metacatui/src/main/webapp/js/models/AnnotationModel.js index 6532df0b1..b19b29a44 100644 --- a/metacatui/src/main/webapp/js/models/AnnotationModel.js +++ b/metacatui/src/main/webapp/js/models/AnnotationModel.js @@ -43,8 +43,8 @@ define(['jquery', 'underscore', 'backbone'], url: appModel.get("accountsUrl") + encodeURIComponent(username), type: "GET", success: function(data, textStatus, xhr){ - var lastName = $(data).find("person").find("familyName").text(), - firstName = $(data).find("person").find("givenName").text(); + var lastName = $(data).find("person").first().find("familyName").text(), + firstName = $(data).find("person").first().find("givenName").text(); model.set("name", firstName + " " + lastName); From d2e19e24766fcc0a5421cd049b715e73e39faa8c Mon Sep 17 00:00:00 2001 From: leinfelder Date: Fri, 30 Sep 2016 16:13:41 -0700 Subject: [PATCH 018/560] do not display the annotation adder for arbitrary text selections. https://github.com/DataONEorg/sem-prov-design/issues/212 --- .../src/main/webapp/js/themes/dataone/css/metacatui.css | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/metacatui/src/main/webapp/js/themes/dataone/css/metacatui.css b/metacatui/src/main/webapp/js/themes/dataone/css/metacatui.css index 232143e2d..5d64683c0 100644 --- a/metacatui/src/main/webapp/js/themes/dataone/css/metacatui.css +++ b/metacatui/src/main/webapp/js/themes/dataone/css/metacatui.css @@ -966,6 +966,12 @@ label.control-label{ background-color: #1C6E84; color: #FFF; } + +.annotator-adder { + opacity: 0.0; + pointer-events: none; + +} /* Registry CSS -------------------------------------------------- */ From 31bd5eabc619a5df13591470c4d14d6df5e6dd7f Mon Sep 17 00:00:00 2001 From: leinfelder Date: Fri, 30 Sep 2016 16:39:32 -0700 Subject: [PATCH 019/560] show tag icon next to attributes that have one or more annotations. https://github.com/DataONEorg/sem-prov-design/issues/211 --- metacatui/src/main/webapp/js/views/AnnotatorView.js | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/metacatui/src/main/webapp/js/views/AnnotatorView.js b/metacatui/src/main/webapp/js/views/AnnotatorView.js index d39bd0ffd..e3f633c77 100644 --- a/metacatui/src/main/webapp/js/views/AnnotatorView.js +++ b/metacatui/src/main/webapp/js/views/AnnotatorView.js @@ -425,6 +425,15 @@ define(['jquery', // render it in the document var highlight = $("[data-annotation-id='" + annotationModel.get("id") + "']"); var section = $(highlight).closest(".tab-pane").children(".annotation-container"); + var tab = $(highlight).closest(".tab-pane"); + //console.log("tab: " + tab); + var tabControl = $("a[href='#" + $(tab).attr("id") + "'"); + //console.log("tabControl: " + tabControl); + var icons = $(tabControl).find(".icon-tag"); + if ($(icons).size() == 0) { + tabControl.prepend("") + } + if (!section.html()) { console.log("Highlights not completed yet - cannot render annotation"); return; From 0c25bdf9c2a02023cd5bf8a28ce96d8c9629c032 Mon Sep 17 00:00:00 2001 From: leinfelder Date: Tue, 4 Oct 2016 19:24:20 -0700 Subject: [PATCH 020/560] use BioPortal batch endpoint for looking up concept details for annotations on a page before rendering. Note: using JSON.stringify() which may not be supported on all browsers. Note2: BP service seems to be limiting batch responses to 10 classes. I've asked them if there is a way to request more in a batch. https://github.com/DataONEorg/sem-prov-design/issues/208 --- .../src/main/webapp/js/models/LookupModel.js | 63 +++++++++++++++++++ .../js/themes/dataone/models/AppModel.js | 1 + .../src/main/webapp/js/views/AnnotatorView.js | 24 ++++++- 3 files changed, 87 insertions(+), 1 deletion(-) diff --git a/metacatui/src/main/webapp/js/models/LookupModel.js b/metacatui/src/main/webapp/js/models/LookupModel.js index 8b578a505..9a03147c1 100644 --- a/metacatui/src/main/webapp/js/models/LookupModel.js +++ b/metacatui/src/main/webapp/js/models/LookupModel.js @@ -102,6 +102,7 @@ define(['jquery', 'jqueryui', 'underscore', 'backbone'], return obj.value == matchingChoice.value; }); } + //availableTags.push(choice); } } @@ -197,6 +198,68 @@ define(['jquery', 'jqueryui', 'underscore', 'backbone'], callback(concepts); }); }, + + bioportalGetConceptsBatch: function(uris, callback) { + + // make sure we have something to lookup + if (!appModel.get('bioportalBatchUrl')) { + return; + } + // prepare the request JSON + var batchData = {}; + batchData["http://www.w3.org/2002/07/owl#Class"] = {}; + batchData["http://www.w3.org/2002/07/owl#Class"]["display"] = "prefLabel,synonym,definition"; + batchData["http://www.w3.org/2002/07/owl#Class"]["collection"] = []; + _.each(uris, function(uri) { + var item = {}; + item["class"] = uri; + item["ontology"] = "http://data.bioontology.org/ontologies/ECSO"; + batchData["http://www.w3.org/2002/07/owl#Class"]["collection"].push(item); + }); + + var url = appModel.get('bioportalBatchUrl'); + var model = this; + $.ajax(url, + { + method: "POST", + //url: url, + data: JSON.stringify(batchData), + contentType: "application/json", + headers: { + "Authorization": "apikey token="+ appModel.get("bioportalAPIKey") + }, + error: function(e) { + alert(e); + }, + success: function(data, textStatus, xhr) { + + _.each(data["http://www.w3.org/2002/07/owl#Class"], function(obj) { + var concept = {}; + concept.label = obj['prefLabel']; + concept.value = obj['@id']; + if (obj['definition']) { + concept.desc = obj['definition'][0]; + } + // add the synonyms + var synonyms = obj['synonym']; + if (synonyms) { + concept.synonyms = []; + _.each(synonyms, function(synonym) { + concept.synonyms.push(synonym); + }); + } + + var conceptList = []; + conceptList.push(concept); + model.get('concepts')[concept.value] = conceptList; + + }); + + callback.apply(); + } + }); + + }, orcidGetConcepts: function(uri, callback) { diff --git a/metacatui/src/main/webapp/js/themes/dataone/models/AppModel.js b/metacatui/src/main/webapp/js/themes/dataone/models/AppModel.js index f518fe885..f2229d7b3 100644 --- a/metacatui/src/main/webapp/js/themes/dataone/models/AppModel.js +++ b/metacatui/src/main/webapp/js/themes/dataone/models/AppModel.js @@ -59,6 +59,7 @@ define(['jquery', 'underscore', 'backbone'], // see: http://bioportal.bioontology.org/account bioportalAPIKey: "24e4775e-54e0-11e0-9d7b-005056aa3316", bioportalSearchUrl: null, + bioportalBatchUrl: "https://data.bioontology.org/batch", //bioportalSearchUrl: null, // use this to deactivate the annotator view //orcidBaseUrl: "https://sandbox.orcid.org", //orcidSearchUrl: null, diff --git a/metacatui/src/main/webapp/js/views/AnnotatorView.js b/metacatui/src/main/webapp/js/views/AnnotatorView.js index e3f633c77..b083bc136 100644 --- a/metacatui/src/main/webapp/js/views/AnnotatorView.js +++ b/metacatui/src/main/webapp/js/views/AnnotatorView.js @@ -296,11 +296,33 @@ define(['jquery', this.$el.annotator('subscribe', 'annotationCreated', this.reindexPid); this.$el.annotator('subscribe', 'annotationUpdated', this.reindexPid); this.$el.annotator('subscribe', 'annotationDeleted', this.handleDelete); - this.$el.annotator('subscribe', 'annotationsLoaded', this.renderAnnotations); + this.$el.annotator('subscribe', 'annotationsLoaded', this.preRenderAnnotations); }, + preRenderAnnotations : function(annotations) { + + var uris = []; + + //look up the concept details in a batch + _.each(annotations, function(annotation) { + if (annotation.tags[0]) { + // look up concepts where we can + var conceptUri = annotation.tags[0]; + uris.push(conceptUri); + } + }); + + // now look them up and render when finished + var annotatorEl = (typeof this.$el != "undefined")? this.$el : this, + view = $(annotatorEl).data("annotator-view"); + appLookupModel.bioportalGetConceptsBatch( + uris, + function() {view.renderAnnotations(annotations);}); + + }, + renderAnnotations : function(annotations) { // keep from duplicating From 3e2b7ef2494f0d015f27d193c7b38013bfba22dd Mon Sep 17 00:00:00 2001 From: leinfelder Date: Wed, 5 Oct 2016 12:16:55 -0700 Subject: [PATCH 021/560] add all descendants to term expansion. https://github.com/DataONEorg/sem-prov-design/issues/214 --- .../src/main/webapp/js/models/LookupModel.js | 25 ++++++++++++++++--- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/metacatui/src/main/webapp/js/models/LookupModel.js b/metacatui/src/main/webapp/js/models/LookupModel.js index 9a03147c1..ef9596e64 100644 --- a/metacatui/src/main/webapp/js/models/LookupModel.js +++ b/metacatui/src/main/webapp/js/models/LookupModel.js @@ -144,12 +144,29 @@ define(['jquery', 'jqueryui', 'underscore', 'backbone'], _.each(synonyms, function(synonym) { terms.push(synonym); }); - } - + } + // process the descendants + var descendantsUrl = obj['links']['descendants']; + //if (false) { + if (descendantsUrl) { + + $.get(childrenUrl + "?apikey=" + appModel.get("bioportalAPIKey"), function(data, textStatus, xhr) { + _.each(data.collection, function(obj) { + var prefLabel = obj['prefLabel']; + var synonyms = obj['synonym']; + if (synonyms) { + _.each(synonyms, function(synonym) { + terms.push(synonym); + }); + } + }); + + // callback + response(terms); + }); + } }); - response(terms); - }); }, From 11b380139320364dfc6fca680188d66520a16324 Mon Sep 17 00:00:00 2001 From: leinfelder Date: Wed, 5 Oct 2016 16:38:35 -0700 Subject: [PATCH 022/560] put flagging/delete controls in a dropdown. still needs a Lauren polish :). https://github.com/DataONEorg/sem-prov-design/issues/209 --- .../main/webapp/js/templates/annotation.html | 43 +++++++++++++------ 1 file changed, 30 insertions(+), 13 deletions(-) diff --git a/metacatui/src/main/webapp/js/templates/annotation.html b/metacatui/src/main/webapp/js/templates/annotation.html index de7c71f39..5491dac86 100644 --- a/metacatui/src/main/webapp/js/templates/annotation.html +++ b/metacatui/src/main/webapp/js/templates/annotation.html @@ -1,7 +1,7 @@ <% if (concept) { %> <%=concept.label %> @@ -19,29 +19,46 @@ <% } +%> + From 64ce9ec682d8722358743413ab4e042b93bd4d59 Mon Sep 17 00:00:00 2001 From: lauren-palmer Date: Thu, 6 Oct 2016 10:17:17 -0700 Subject: [PATCH 023/560] Merge changes to download button from 1.12 branch --- .../webapp/js/templates/downloadButton.html | 2 +- .../main/webapp/js/views/PackageTableView.js | 27 +++++++------------ 2 files changed, 11 insertions(+), 18 deletions(-) diff --git a/metacatui/src/main/webapp/js/templates/downloadButton.html b/metacatui/src/main/webapp/js/templates/downloadButton.html index c2d6f4a79..4391b9af5 100644 --- a/metacatui/src/main/webapp/js/templates/downloadButton.html +++ b/metacatui/src/main/webapp/js/templates/downloadButton.html @@ -14,7 +14,7 @@ if((typeof tooLarge !== "undefined") && tooLarge){ className += " tooltip-this disabled"; - attributes += ' disabled data-title="This file is too large to download. Please contact us about how to access this data." data-position="top" data-trigger="hover"'; + attributes += ' disabled data-title="This dataset is too large to download as a package. Please download the files individually or contact us for alternate data access." data-position="top" data-trigger="hover"'; } %> diff --git a/metacatui/src/main/webapp/js/views/PackageTableView.js b/metacatui/src/main/webapp/js/views/PackageTableView.js index ca32e60dc..b01228cbb 100644 --- a/metacatui/src/main/webapp/js/views/PackageTableView.js +++ b/metacatui/src/main/webapp/js/views/PackageTableView.js @@ -338,23 +338,16 @@ define(['jquery', 'underscore', 'backbone', 'models/PackageModel', 'text!templat //Download button cell var downloadBtnCell = $(document.createElement("td")).addClass("download-btn btn-container"); - if(memberModel.get("size") < appModel.get("maxDownloadSize")){ - var downloadButtonHTML = this.downloadButtonTemplate({ - href: url, - fileName: entityName, - id: memberModel.get("id"), - isPublic: memberModel.get("isPublic"), - }); - var downloadButton = $.parseHTML(downloadButtonHTML.trim()); - - if(appUserModel.get("loggedIn") && !memberModel.get("isPublic")) - $(downloadButton).on("click", null, this, this.download); - } - else{ - var downloadButton = $.parseHTML(this.downloadButtonTemplate({ - tooLarge: true - }).trim()); - } + var downloadButtonHTML = this.downloadButtonTemplate({ + href: url, + fileName: entityName, + id: memberModel.get("id"), + isPublic: memberModel.get("isPublic"), + }); + var downloadButton = $.parseHTML(downloadButtonHTML.trim()); + + if(appUserModel.get("loggedIn") && !memberModel.get("isPublic")) + $(downloadButton).on("click", null, this, this.download); $(downloadBtnCell).append(downloadButton); $(tr).append(downloadBtnCell); From 6e5fdbb81bdc1e37a32abce41fde740a21f7c87c Mon Sep 17 00:00:00 2001 From: leinfelder Date: Thu, 6 Oct 2016 15:27:11 -0700 Subject: [PATCH 024/560] include bioportal tree view component. not yet used. https://github.com/DataONEorg/sem-prov-design/issues/210 --- .../bioportal/jquery.ncbo.tree-2.0.2.js | 421 ++++++++++++++++++ .../bioportal/jquery.ncbo.tree-2.0.2.min.js | 1 + .../components/bioportal/jquery.ncbo.tree.css | 323 ++++++++++++++ .../bioportal/jquery.ncbo.tree.min.css | 1 + metacatui/src/main/webapp/js/app.js | 4 + .../src/main/webapp/js/templates/appHead.html | 1 + .../src/main/webapp/js/views/AnnotatorView.js | 2 + 7 files changed, 753 insertions(+) create mode 100644 metacatui/src/main/webapp/components/bioportal/jquery.ncbo.tree-2.0.2.js create mode 100644 metacatui/src/main/webapp/components/bioportal/jquery.ncbo.tree-2.0.2.min.js create mode 100644 metacatui/src/main/webapp/components/bioportal/jquery.ncbo.tree.css create mode 100644 metacatui/src/main/webapp/components/bioportal/jquery.ncbo.tree.min.css diff --git a/metacatui/src/main/webapp/components/bioportal/jquery.ncbo.tree-2.0.2.js b/metacatui/src/main/webapp/components/bioportal/jquery.ncbo.tree-2.0.2.js new file mode 100644 index 000000000..6da0c8112 --- /dev/null +++ b/metacatui/src/main/webapp/components/bioportal/jquery.ncbo.tree-2.0.2.js @@ -0,0 +1,421 @@ +/* +* jQuery SimpleTree Drag&Drop plugin +* Update on 22th May 2008 +* Version 0.3 +* +* Licensed under BSD +* Copyright (c) 2008, Peter Panov , IKEEN Group http://www.ikeen.com +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the Peter Panov, IKEEN Group nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY Peter Panov, IKEEN Group ``AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL Peter Panov, IKEEN Group BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +(function($) { + var NCBOTree = function(element, opt) { + var _this = this; + var OPTIONS; + var ROOT_ID = "roots"; + var mousePressed = false; + var $TREE_CONTAINER; + var TREE; + var ROOT; + var startingRoot; + + OPTIONS = { + autoclose: false, + beforeExpand: false, + afterExpand: false, + afterExpandError: false, + afterSelect: false, + afterJumpToClass: false, + timeout: 999999, + treeClass: "ncboTree", + autocompleteClass: "ncboAutocomplete", + width: 350, + ncboAPIURL: "http://data.bioontology.org", + ncboUIURL: "http://bioportal.bioontology.org", + apikey: null, + ontology: null, + startingClass: null, + startingRoot: ROOT_ID, + defaultRoot: ROOT_ID + }; + + OPTIONS = $.extend(OPTIONS, opt); + + // Required options + if (OPTIONS.apikey == null) + throw new Error("You must provide an API Key for NCBO Tree Widget to operate"); + + if (OPTIONS.ontology == null) + throw new Error("You must provide an ontology id for NCBO Tree Widget to operate"); + + this.options = function() { + return OPTIONS; + } + + this.jumpToClass = function(cls, callback) { + ROOT.html($("").html("Loading...").css("font-size", "smaller")); + $.ajax({ + url: determineHTTPS(OPTIONS.ncboAPIURL) + "/ontologies/" + OPTIONS.ontology + "/classes/" + encodeURIComponent(cls) + "/tree", + data: {apikey: OPTIONS.apikey, display: "prefLabel,hasChildren", no_context: true}, + contentType: 'json', + crossDomain: true, + success: function(roots) { + roots = findRootNode(roots); + ROOT.html(formatNodes(roots)); + setTreeNodes(ROOT, false); + + if (typeof callback == 'function') { + callback(); + } + + _this.selectClass(cls); + if (typeof OPTIONS.afterJumpToClass == 'function') { + OPTIONS.afterJumpToClass(cls); + } + $TREE_CONTAINER.trigger("afterJumpToClass", cls); + } + }); + } + + this.selectClass = function(cls) { + var foundClass = $(TREE.find("a[data-id='" + encodeURIComponent(cls) + "']")); + $(TREE.find("a.active")[0]).removeClass("active"); + foundClass.addClass("active"); + } + + this.selectedClass = function() { + var cls = $(TREE.find("a.active")[0]); + if (cls.length == 0) { + return null; + } else { + return { + id: decodeURIComponent(cls.data("id")), + prefLabel: cls.html(), + URL: cls.attr("href") + }; + } + } + + this.changeOntology = function(ont) { + var newTree = $("
    ").append($("
  • ").addClass("root")); + $TREE_CONTAINER.html(""); + TREE = newTree; + OPTIONS.ontology = ont; + _this.init(); + } + + // format the nodes to match what simpleTree is expecting + var formatNodes = function(nodes) { + var holder = $(""); + var ul = $("
      ") + + // Sort by prefLabel + nodes.sort(function(a, b) { + var aName = a.prefLabel.toLowerCase(); + var bName = b.prefLabel.toLowerCase(); + return ((aName < bName) ? -1 : ((aName > bName) ? 1 : 0)); + }); + + $.each(nodes, function(index, node) { + var li = $("
    • "); + var a = $("").attr("href", determineHTTPS(node.links.self)).html(node.prefLabel); + a.attr("data-id", encodeURIComponent(node["@id"])); + + ul.append(li.append(a)); + + var hasChildrenNotExpanded = typeof node.children !== 'undefined' && node.hasChildren && node.children.length == 0; + if (node.hasChildren && typeof node.children === 'undefined' || hasChildrenNotExpanded) { + var ajax_ul = $("
        ").addClass("ajax"); + var ajax_li = $("
      • "); + var ajax_a = $("").attr("href", node.links.children); + li.append(ajax_ul.append(ajax_li.append(ajax_a))); + } else if (typeof node.children !== 'undefined' && node.children.length > 0) { + var child_ul = formatNodes(node.children); + li.attr("class", "folder-open") + li.append(child_ul); + } + }); + + holder.append(ul) + return holder.html(); + } + + var findRootNode = function(nodes) { + var startingRoot = (OPTIONS.startingRoot == OPTIONS.defaultRoot) ? null : OPTIONS.startingRoot; + if (startingRoot == null) {return nodes;} + + var foundNode = false; + var searchQueue = nodes; + + while (searchQueue.length > 0 || foundNode == false) { + var node = searchQueue.shift(); + if (node["@id"] == startingRoot) { + foundNode = [node]; + } else if (typeof node.children !== 'undefined' && node.children.length > 0) { + searchQueue = searchQueue.concat(node.children); + } + } + + return foundNode; + } + + var closeNearby = function(obj) { + $(obj).siblings().filter('.folder-open, .folder-open-last').each(function() { + var childUl = $('>ul',this); + var className = this.className; + this.className = className.replace('open', 'close'); + childUl.hide(); + }); + }; + + var nodeToggle = function(obj) { + var childUl = $('>ul',obj); + if (childUl.is(':visible')) { + obj.className = obj.className.replace('open','close'); + childUl.hide(); + } else { + obj.className = obj.className.replace('close','open'); + childUl.show(); + if (OPTIONS.autoclose) + closeNearby(obj); + if (childUl.is('.ajax')) + setAjaxNodes(childUl, obj.id); + } + }; + + var setAjaxNodes = function(node, parentId, successCallback, errorCallback) { + if (typeof OPTIONS.beforeExpand == 'function') { + OPTIONS.beforeExpand(node); + } + $TREE_CONTAINER.trigger("beforeExpand", node); + + var url = determineHTTPS($.trim($('a', node).attr("href"))); + if (url) { + $.ajax({ + type: "GET", + url: url, + data: {apikey: OPTIONS.apikey, display: "prefLabel,hasChildren", no_context: true}, + crossDomain: true, + contentType: 'json', + timeout: OPTIONS.timeout, + success: function(response) { + var nodes = formatNodes(response.collection) + node.removeAttr('class'); + node.html(nodes); + $.extend(node, {url:url}); + setTreeNodes(node, true); + if (typeof OPTIONS.afterExpand == 'function') { + OPTIONS.afterExpand(node); + } + $TREE_CONTAINER.trigger("afterExpand", node); + if (typeof successCallback == 'function') { + successCallback(node); + } + }, + error: function(response) { + if (typeof OPTIONS.afterExpandError == 'function') { + OPTIONS.afterExpandError(node); + } + if (typeof errorCallback == 'function') { + errorCallback(node); + } + $TREE_CONTAINER.trigger("afterExpandError", node); + } + }); + } + }; + + var setTreeNodes = function(obj, useParent) { + obj = useParent ? obj.parent() : obj; + $('li>a', obj).addClass('text').bind('selectstart', function() { + return false; + }).click(function() { + var parent = $(this).parent(); + var selectedNode = $(this); + $('.active', TREE).attr('class', 'text'); + if (this.className == 'text') { + this.className = 'active'; + } + if (typeof OPTIONS.afterSelect == 'function') { + OPTIONS.afterSelect(decodeURIComponent(selectedNode.data("id")), selectedNode.text(), selectedNode); + } + $TREE_CONTAINER.trigger("afterSelect", [decodeURIComponent(selectedNode.data("id")), selectedNode.text(), selectedNode]); + return false; + }).bind("contextmenu",function() { + $('.active', TREE).attr('class', 'text'); + if (this.className == 'text') { + this.className = 'active'; + } + if (typeof OPTIONS.afterContextMenu == 'function') { + OPTIONS.afterContextMenu(parent); + } + return false; + }).mousedown(function(event) { + mousePressed = true; + cloneNode = $(this).parent().clone(); + var LI = $(this).parent(); + return false; + }); + + $('li', obj).each(function(i) { + var className = this.className; + var open = false; + var cloneNode=false; + var LI = this; + var childNode = $('>ul',this); + if (childNode.size() > 0) { + var setClassName = 'folder-'; + if (className && className.indexOf('open') >= 0) { + setClassName = setClassName + 'open'; + open = true; + } else { + setClassName = setClassName+'close'; + } + this.className = setClassName + ($(this).is(':last-child') ? '-last' : ''); + + if (!open || className.indexOf('ajax') >= 0) + childNode.hide(); + + setTrigger(this); + } else { + var setClassName = 'doc'; + this.className = setClassName + ($(this).is(':last-child') ? '-last' : ''); + } + }).before('
      •  
      • ') + .filter(':last-child') + .after('
      • '); + }; + + var setTrigger = function(node) { + $('>a',node).before(''); + var trigger = $('>.trigger', node); + trigger.click(function(event) { + nodeToggle(node); + }); + // TODO: $.browser was removed in jQuery 1.9, check IE compatability + // if (!$.browser.msie) { + // trigger.css('float','left'); + // } + }; + + var determineHTTPS = function(url) { + return url.replace("http:", ('https:' == document.location.protocol ? 'https:' : 'http:')); + } + + var initAutocomplete = function() { + // Add the autocomplete + var autocompleteContainer = $("
        ").addClass(OPTIONS.autocompleteClass).addClass("ncboTree"); + var input = $("") + .addClass(OPTIONS.autocompleteClass) + .css("width", OPTIONS.width) + .attr("placeholder", "Search for class..."); + autocompleteContainer.append(input); + input.NCBOAutocomplete({ + url: OPTIONS.ncboAPIURL + "/search", + searchParameter: "q", + resultAttribute: "collection", + property: "prefLabel", + searchTextSuffix: "*", + searchFromRoot: startingRoot, + onSelect: function(item, searchInput) { + _this.jumpToClass(item["@id"]); + searchInput.val(""); + }, + minCharacters: 3, + additionalParameters: { + apikey: OPTIONS.apikey, + no_context: true, + ontologies: OPTIONS.ontology + } + }); + $TREE_CONTAINER.append(autocompleteContainer); + } + + // Populate roots and init tree + this.init = function() { + $TREE_CONTAINER = element; + TREE = $("
          ").append($("
        • ").addClass("root")); + ROOT = $('.root', TREE); + TREE.css("width", OPTIONS.width).addClass(OPTIONS.treeClass); + $TREE_CONTAINER.html(""); + + // Only set starting root when something other than roots is selected + startingRoot = (OPTIONS.startingRoot == OPTIONS.defaultRoot) ? null : OPTIONS.startingRoot; + + initAutocomplete(); + $TREE_CONTAINER.append(TREE); + + if (OPTIONS.startingClass !== null) { + _this.jumpToClass(OPTIONS.startingClass); + OPTIONS.startingClass = null; + } else { + ROOT.html($("").html("Loading...").css("font-size", "smaller")); + $.ajax({ + url: determineHTTPS(OPTIONS.ncboAPIURL) + "/ontologies/" + OPTIONS.ontology + "/classes/" + encodeURIComponent(OPTIONS.startingRoot), + data: {apikey: OPTIONS.apikey, display: "prefLabel,hasChildren", no_context: true}, + contentType: 'json', + crossDomain: true, + success: function(roots) { + // Flatten potentially nested arrays + roots = $.map([roots], function(n) { + return n; + }); + ROOT.html(formatNodes(roots)); + setTreeNodes(ROOT, false); + } + }); + } + }; + } + + // Returns the original object(s) so they can be chained + $.fn.NCBOTree = function(options) { + return this.each(function() { + var $this = $(this); + + // Return early if this element already has a plugin instance + if ($this.data('NCBOTree')) return; + + // pass options to plugin constructor + var ncboTree = new NCBOTree($this, options); + this.NCBOTree = ncboTree; + + // Add the autocomplete code + $.ajax({ + url: ncboTree.options().ncboUIURL.replace("http:", ('https:' == document.location.protocol ? 'https:' : 'http:')) + "/widgets/jquery.ncbo.autocomplete.js", + type: "GET", + crossDomain: true, + dataType: "script", + success: function() { + ncboTree.init(); + + // Store plugin object in this element's data + $this.data('NCBOTree', ncboTree); + } + }); + }); + } + +}(jQuery)); \ No newline at end of file diff --git a/metacatui/src/main/webapp/components/bioportal/jquery.ncbo.tree-2.0.2.min.js b/metacatui/src/main/webapp/components/bioportal/jquery.ncbo.tree-2.0.2.min.js new file mode 100644 index 000000000..7c2a0ad4f --- /dev/null +++ b/metacatui/src/main/webapp/components/bioportal/jquery.ncbo.tree-2.0.2.min.js @@ -0,0 +1 @@ +!function(t){var e=function(e,a){var n,o,s,r,i,l=this,c="roots",d=!1;if(n={autoclose:!1,beforeExpand:!1,afterExpand:!1,afterExpandError:!1,afterSelect:!1,afterJumpToClass:!1,timeout:999999,treeClass:"ncboTree",autocompleteClass:"ncboAutocomplete",width:350,ncboAPIURL:"http://data.bioontology.org",ncboUIURL:"http://bioportal.bioontology.org",apikey:null,ontology:null,startingClass:null,startingRoot:c,defaultRoot:c},n=t.extend(n,a),null==n.apikey)throw new Error("You must provide an API Key for NCBO Tree Widget to operate");if(null==n.ontology)throw new Error("You must provide an ontology id for NCBO Tree Widget to operate");this.options=function(){return n},this.jumpToClass=function(e,a){r.html(t("").html("Loading...").css("font-size","smaller")),t.ajax({url:y(n.ncboAPIURL)+"/ontologies/"+n.ontology+"/classes/"+encodeURIComponent(e)+"/tree",data:{apikey:n.apikey,display:"prefLabel,hasChildren",no_context:!0},contentType:"json",crossDomain:!0,success:function(t){t=f(t),r.html(p(t)),C(r,!1),"function"==typeof a&&a(),l.selectClass(e),"function"==typeof n.afterJumpToClass&&n.afterJumpToClass(e),o.trigger("afterJumpToClass",e)}})},this.selectClass=function(e){var a=t(s.find("a[data-id='"+encodeURIComponent(e)+"']"));t(s.find("a.active")[0]).removeClass("active"),a.addClass("active")},this.selectedClass=function(){var e=t(s.find("a.active")[0]);return 0==e.length?null:{id:decodeURIComponent(e.data("id")),prefLabel:e.html(),URL:e.attr("href")}},this.changeOntology=function(e){var a=t("
            ").append(t("
          • ").addClass("root"));o.html(""),s=a,n.ontology=e,l.init()};var p=function(e){var a=t(""),n=t("
              ");return e.sort(function(t,e){var a=t.prefLabel.toLowerCase(),n=e.prefLabel.toLowerCase();return n>a?-1:a>n?1:0}),t.each(e,function(e,a){var o=t("
            • "),s=t("").attr("href",y(a.links.self)).html(a.prefLabel);s.attr("data-id",encodeURIComponent(a["@id"])),n.append(o.append(s));var r="undefined"!=typeof a.children&&a.hasChildren&&0==a.children.length;if(a.hasChildren&&"undefined"==typeof a.children||r){var i=t("
                ").addClass("ajax"),l=t("
              • "),c=t("").attr("href",a.links.children);o.append(i.append(l.append(c)))}else if("undefined"!=typeof a.children&&a.children.length>0){var d=p(a.children);o.attr("class","folder-open"),o.append(d)}}),a.append(n),a.html()},f=function(t){var e=n.startingRoot==n.defaultRoot?null:n.startingRoot;if(null==e)return t;for(var a=!1,o=t;o.length>0||0==a;){var s=o.shift();s["@id"]==e?a=[s]:"undefined"!=typeof s.children&&s.children.length>0&&(o=o.concat(s.children))}return a},u=function(e){t(e).siblings().filter(".folder-open, .folder-open-last").each(function(){var e=t(">ul",this),a=this.className;this.className=a.replace("open","close"),e.hide()})},h=function(e){var a=t(">ul",e);a.is(":visible")?(e.className=e.className.replace("open","close"),a.hide()):(e.className=e.className.replace("close","open"),a.show(),n.autoclose&&u(e),a.is(".ajax")&&m(a,e.id))},m=function(e,a,s,r){"function"==typeof n.beforeExpand&&n.beforeExpand(e),o.trigger("beforeExpand",e);var i=y(t.trim(t("a",e).attr("href")));i&&t.ajax({type:"GET",url:i,data:{apikey:n.apikey,display:"prefLabel,hasChildren",no_context:!0},crossDomain:!0,contentType:"json",timeout:n.timeout,success:function(a){var r=p(a.collection);e.removeAttr("class"),e.html(r),t.extend(e,{url:i}),C(e,!0),"function"==typeof n.afterExpand&&n.afterExpand(e),o.trigger("afterExpand",e),"function"==typeof s&&s(e)},error:function(t){"function"==typeof n.afterExpandError&&n.afterExpandError(e),"function"==typeof r&&r(e),o.trigger("afterExpandError",e)}})},C=function(e,a){e=a?e.parent():e,t("li>a",e).addClass("text").bind("selectstart",function(){return!1}).click(function(){var e=(t(this).parent(),t(this));return t(".active",s).attr("class","text"),"text"==this.className&&(this.className="active"),"function"==typeof n.afterSelect&&n.afterSelect(decodeURIComponent(e.data("id")),e.text(),e),o.trigger("afterSelect",[decodeURIComponent(e.data("id")),e.text(),e]),!1}).bind("contextmenu",function(){return t(".active",s).attr("class","text"),"text"==this.className&&(this.className="active"),"function"==typeof n.afterContextMenu&&n.afterContextMenu(parent),!1}).mousedown(function(e){d=!0,cloneNode=t(this).parent().clone();t(this).parent();return!1}),t("li",e).each(function(e){var a=this.className,n=!1,o=t(">ul",this);if(o.size()>0){var s="folder-";a&&a.indexOf("open")>=0?(s+="open",n=!0):s+="close",this.className=s+(t(this).is(":last-child")?"-last":""),(!n||a.indexOf("ajax")>=0)&&o.hide(),g(this)}else{var s="doc";this.className=s+(t(this).is(":last-child")?"-last":"")}}).before('
              •  
              • ').filter(":last-child").after('
              • ')},g=function(e){t(">a",e).before('');var a=t(">.trigger",e);a.click(function(t){h(e)})},y=function(t){return t.replace("http:","https:"==document.location.protocol?"https:":"http:")},v=function(){var e=t("
                ").addClass(n.autocompleteClass).addClass("ncboTree"),a=t("").addClass(n.autocompleteClass).css("width",n.width).attr("placeholder","Search for class...");e.append(a),a.NCBOAutocomplete({url:n.ncboAPIURL+"/search",searchParameter:"q",resultAttribute:"collection",property:"prefLabel",searchTextSuffix:"*",searchFromRoot:i,onSelect:function(t,e){l.jumpToClass(t["@id"]),e.val("")},minCharacters:3,additionalParameters:{apikey:n.apikey,no_context:!0,ontologies:n.ontology}}),o.append(e)};this.init=function(){o=e,s=t("
                  ").append(t("
                • ").addClass("root")),r=t(".root",s),s.css("width",n.width).addClass(n.treeClass),o.html(""),i=n.startingRoot==n.defaultRoot?null:n.startingRoot,v(),o.append(s),null!==n.startingClass?(l.jumpToClass(n.startingClass),n.startingClass=null):(r.html(t("").html("Loading...").css("font-size","smaller")),t.ajax({url:y(n.ncboAPIURL)+"/ontologies/"+n.ontology+"/classes/"+encodeURIComponent(n.startingRoot),data:{apikey:n.apikey,display:"prefLabel,hasChildren",no_context:!0},contentType:"json",crossDomain:!0,success:function(e){e=t.map([e],function(t){return t}),r.html(p(e)),C(r,!1)}}))}};t.fn.NCBOTree=function(a){return this.each(function(){var n=t(this);if(!n.data("NCBOTree")){var o=new e(n,a);this.NCBOTree=o,t.ajax({url:o.options().ncboUIURL.replace("http:","https:"==document.location.protocol?"https:":"http:")+"/widgets/jquery.ncbo.autocomplete.js",type:"GET",crossDomain:!0,dataType:"script",success:function(){o.init(),n.data("NCBOTree",o)}})}})}}(jQuery); \ No newline at end of file diff --git a/metacatui/src/main/webapp/components/bioportal/jquery.ncbo.tree.css b/metacatui/src/main/webapp/components/bioportal/jquery.ncbo.tree.css new file mode 100644 index 000000000..d0bfceaea --- /dev/null +++ b/metacatui/src/main/webapp/components/bioportal/jquery.ncbo.tree.css @@ -0,0 +1,323 @@ +/******************** +## TREE VIEW +*********************/ +div.tree_error { + background: none repeat scroll 0 0 lightYellow; + font-weight: 600; + padding: 5px 10px; +} +.expansion_error { + color: red; + font-size: x-small; + font-style: oblique; + padding: 0 3px; +} +.ncboTree { + margin:0; + padding:0; + font-family: sans-serif; +} +.ncboTree li { + list-style: none; + margin:0; + padding:0 0 0 22px; + line-height: 14px; +} +.ncboTree li span { + display:inline; + clear: left; + white-space: nowrap; +} +.ncboTree ul { + margin:0; + padding:0; +} +.ncboTree .root ul { + margin:0; +} +.ncboTree .root { + margin-left:-16px !important; +} +.ncboTree .line { + padding:0; + line-height: 3px; + height:3px; + font-size:3px; + background: 0 0 no-repeat transparent url(data:image/gif;base64,R0lGODlhUAAUAIABAICAgP///yH5BAEAAAEALAAAAABQABQAAAI0jI+py+0PG4i02ouz3mryD4bi+HjkiabqYq7uC2NtTNd2MN/6Tub8D5QFh8SKr4hEHpOQAgA7); +} +.ncboTree .line-last { + padding:0; + line-height: 3px; + height:3px; + font-size:3px; + background: 0 0 no-repeat transparent url(data:image/gif;base64,R0lGODlhAQABAID/AMDAwAAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==); +} +.ncboTree .line-over { + padding:0; + line-height: 3px; + height:3px; + font-size:3px; + background: 0 0 no-repeat transparent url(data:image/gif;base64,R0lGODlhUAAUAMQfAICAgEVFRUZHRoKBgUlISKKionl6enJycmRkY2tra/Ly81JSUpGRkaqqq8rLyrOzstnZ2cLDwk1NTfv8+/f39+zt7Lq7u+fn5lhYV////15eXuDg4NLS0omKipqamf///yH5BAEAAB8ALAAAAABQABQAAAV44CeOH0CSQXCubOu+cAwHAvFJ3/Jhn/Yhn8Tn8DF8Bp/Oh/HxfAqfxufxsXwiH8eH84F8Np/Lp/JRfCifyScjM7FSsrh8Tq/b73Q3fs/v+/9zeoCDhIWGMIKHiouMeImNkJGSJI+TlpeFlZibnHeanaChL5+ipZshADs=); +} +.ncboTree .line-over-last { + padding:0; + line-height: 3px; + height:3px; + font-size:3px; + background: 0 0 no-repeat transparent url(data:image/gif;base64,R0lGODlhUAAUAMQeAEVFRWtra+fn5k1NTWRkY3l6enJycklISMrLyvLy8////5qamV5eXvf397q7u1hYV8LDwkZHRoKBgbOzspGRkVJSUtnZ2eDg4Ozt7Pv8+6qqq9LS0omKiqKiov///wAAACH5BAEAAB4ALAAAAABQABQAAAVooCeOZOkBgKmubOu+8AhEhzd4lfd4jEd4AY/BU/BIPBwPxbPwdDwaz8Tj8EA8CM/GY/FcPAIPxpPwNDwZjyK2QrHf8Lh8Tq/b7/i8fs/v+/+AgYKDhIWGh4iJiouMjY6PkJGSk5SViSEAOw==); +} +.ncboTree .folder-open { + background: 0 -2px no-repeat #fff url(data:image/gif;base64,R0lGODlhEQC6BOYAAICAgP//nHueu8aaGfn7+f/4k8TExP/////bdf/vif/kf///mQQCBMS+uaVzDcyZNM/PvNrYyuzs6OTe1s3Nzevz+7fG18mWMfr7/MuYM///paBuCJpoAsXFxZ5sBpxqBNDc58+iJqRyDPfwiZlnAf/XhMzLx6NxC7q6tNe4QLqHIsiVMJKvx523zad1D9q/bLB+GL/M2/r7+n2fvLOBG36gvb2KJfDkesKPKuKzQ7WCHf/rhMmgIbeEH6JwCsaaGv3VcOLBUKx6FNHR0fH097e3t////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAEYALAAAAAARALoEAAf/gEaCg4SFhoMAh4qLi4mMRkQgLTMClQIWiiwyBJydAooCnaKfh6GiFROkhqEMra0Rn4mOggIVFRK4E7CguhEQvyaqhQIQDcYNKA3ChDE1lpaYj7OP1IfT1diC19nV29zS39ze4Yrj5Ibm54Tp6trt4O+N8fLz1vX294Xs7fvq/ef/yAUMN/BbQXH59CVctxBRQ3cPD2aTiI1it4dGLFLTCK8hR0Yf6XnEGLIcyZMRUY5MyXKly4Ul8b1MGBOdSpg3aebMV1NhS5w/dQblufNeT4ZDjRatd9RhUqZL5zWFOJPoU6lR403NmPXd1q9d+YX1NxZgWYFnCaY1uBbhVa1t/yfGrTj34luvdTfm7Qi0qtK7YgGTFWyWMFrDahGzVezWL1TGciHTlWzXMVbKejHzFWoZrmaQe0F/Ftm3NGfTVjvjHW2StUzUf1UHlj2YdmHbh3En1r2Yd2PYj31HFj6ZeGXgl41nVr45NXLPzEVHJ326unPrsZ+vnt6a+2vswbXPFl+b/G3zudHvVt+b/W/wyd0Pl1+c/nH40O0v1988O/7t/EkXIHXXFeifgeH9N56C5TF4noPpQbiehO1R+B6C8Vk4n4b1cXgfhvl5uJ+I/SUIIoAkCpgigQe2aKKLGZ64oIwN0vigjRHiOKGOFfJ4IYwh+rihkB0S+SGQKBo5ov+SJcaI5IxP1hjljVPmWOWOV/aY5Y8vdumkl0FuOaSYRZJ5JJhJmrmkmk2GiSaUb0oZJ5VzWlknlndqmSeXX/bppp9p7jmmoGUSeiagcCIqp6J0Mmqno3hCqqekfP5paaCUDpppoZseemminy4aaqOjPlpqpKdOmmqlmK6qqaucwuppq7SCWquot5Kaq6m7otqrqr+yauuwuBKrq7G8IuurssAyK2yx0B4bbbLTLltts9c+K+221HJrrbfYgqttt+R+W264545r7rrosqtuu/C+K++rwdLrrL3Z4iuuvuny666/8QI8b6z1EnyvwfkivK/C/TL8r8MBQzzwrAdTnLBYxQtj3LDGD3McsccTr2moyJ2SLKvJBYMs8MoSs6xyyzC/LDPKFdN8sc0Z47yxzh3z/LHPIbeZMtAuEx2z0TMLXbPSNzOds9M7Q92z1D9THTRGWGetdTiBAAA7); +} +.ncboTree .folder-open-last { + background: 0 -2px no-repeat #fff url(data:image/gif;base64,R0lGODlhEQAWAOYAAP/bdf/vif/kf///mQQCBMS+uaVzDc/PvICAgNrYysyZNM3Nzevz++zs6OTe1smWMcXFxbfG15poAp5sBv//pZxqBPr7/MuYM6BuCLWCHX6gvdHR0cKPKuLBULB+GJlnAdq/bPfwiaRyDLe3t7eEH7q6tOKzQ7/M28mgIciVMNDc58+iJvr7+qx6FPDkeszLx7OBG5Kvx/3VcLqHIp23zb2KJcaaGqNxC6JwCv/rhH2fvNe4QP/XhPH096d1D8TExP/4k/n7+caaGXueu///nP///////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAEYALAAAAAARABYAAAdcgEaCg4SFhoMIh4qLi4mMj4c9KjQ6Q5ZDEYoxLEGdnkOKQ56joIeiowwOpYaiBK6uCaCJjoJDDAwNuQ6xobsJB8Avq4VDBwXHBSUFw4QnGpeXmZDT1NXW19jZ1oEAOw==); +} +.ncboTree .folder-close-last { + background: 0 -2px no-repeat #fff url(data:image/gif;base64,R0lGODlhEgAWAOYAAOvr6//bdf//nP/vif/kf//4k//UbwQCBO/v78S+ufv7+9u3UoCAgNrYysyZNMHBwevz++Tk5M/PvOTe1smWMcKPKpxqBLB+GLOBG72KJaBuCP//uuzs6LfG17e3t5lnAbWCHdu3caNxC55sBsuYM7qHIsCNKLq6tMiVMKx6FMbGxp23zceUL/r7+q58Fr/M26VzDbeEH6d1D32fvKt5E/H0936gvZKvx6h2EJpoAqampszLx8WSLdDc57a2tvn7+Xueu///////mf///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAEMALAAAAAASABYAAAdfgEOCg4SFhoQMh4qLjEOJjZCHNT0rM0CXQB2LNy0/np9Ai0CfB6CipD8QE6GKowevrw2hiY+DQBAQHAccE7KivQ0HEhI7rIdAEgnKCScJxoYvNpiYmpHW19jZ2tvc2YEAOw==); +} +.ncboTree .folder-close { + background: 0 -2px no-repeat #fff url(data:image/gif;base64,R0lGODlhEgC+BOYAAICAgP//mXueu/n7+f///7a2tuvr6//Ub//4k///nP/vif/bdf/kfwQCBPv7++/v78S+udu3UtrYysyZNOTe1sHBwc/PvOTk5Ovz++zs6Nu3cbB+GLqHIrfG16BuCJlnAf//usmWMcKPKrWCHcuYM5xqBL2KJbOBG55sBqNxC7e3t8iVMJ23zcCNKKt5E6h2ELq6tL/M26ampreEH/H098bGxn6gvczLx8WSLceUL658Fn2fvPr7+qVzDad1D6x6FJKvx5poAtDc5////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAEMALAAAAAASAL4EAAf/gEOCg4SFhoQAh4qLjEOJjUM0Qiw7ApYCHYtAPAOdngKLAp4Nn6GjAxgUoIqiDa6uEqCJj4MCGBgZDRkUsaG8Eg0WFjerhwIWEMkQMBDFhjE2l5eZkLSQ14fW2NuC2tzY3t/V4t/h5Ivm59nq4OzX6e6D8PGO9Izz8fju+uz86v7nAJITKI5gOXvoECoyyI3hNoftFBqC+E7iRIuFKI7DKI9jR4/1QGpsNPIeyJAeSyYUeVLlwpYwWcpMGZPmTI4u193EmPPiTos9M9bEOZRnUaBHJQZFlFTh0o82oxL9qbQpwqfdrNrDinKqVKNUnWqlx7Xs2Hxn96Xtt/Zf24Bv/wfGLTj3YNirdRvmfbg34lekd7f2rRiY7OCNf6sWRrtYbWO2j91GhjtZbmW6l+0mFptZb2e+n/16HQ12M97QhE0LRo2YNGDVhlmTPDxbtknbK2Ez1u2YN2TfkoFTFm6ZOGbjml0rRu6ZOWjnoksr5ww99fTT1VtL3/76+urstcHfFp/be2zyL3GnR6+TvU/3QtW3N7+bfm/7v/EH1z+cf3H/xwGYHHfLCdicgc8hGF13BFKnoHUNYvegdgxWWGCE300YnobjcVgehud5uJ6I84FYn4n3oZifivux2J+L/8EYoIwDWuggjQfimKCOC15oo4Q8QvhjhkFS6OORNw4ZYv+RGzLZoZMfKnmilClSuaKVLWL5opYxcjmjlzUiCSSYOZK5o5k9JikmkWgKueaSbRqp5pxjvjmlnVXieaWeWfK5pZ9dAvqloGHSySahZSJ6pqJp1mkonIy6+eidk+ZZ6Z6X9pnpn5sG2umgnxbq6KiHhpqoqYui2mippEKqqqStUhqrpbNiWqumt3Kaq6e7gtqrqKwG6+qvpxKbqrGrDiusrMvS2qytz+Iara7T8lqtr9cCq+y2zHLrrLfQgiutuNSSa6252KKrbbfsfttuuO+OG2+5855bb7r3ruvuvvDyK6+/9AJsr8D4Eqxvvwj/m3DACw/ccMEPH6zwxAxT7LBixRBjLHHFHF/cccYfb+zxyCCTLHLJKJ+scrHZsqyuy/nCbLDMEdOssc0h42yyzinzvPKxLQP9stAxEz2z0TUjfbPSOTO9s9M9Q/1zskVTfbTVSWO9tNZNn+T112CHLTY3gQAAOw==); +} +.ncboTree .doc { + background: 0 -1px no-repeat #fff url(data:image/gif;base64,R0lGODlhEgC4BOYAAICAgNvt/3V4o+Hw/+n1/+vr67e3t7a2tv///8nk/4ep3NHp/3SAsvj7/+32//v7++/v78HBwf39/djr//P5/8Df/8Ph//7//+Tk5Gdtnvz9/213qIGVw2lwotvn98bGxoyu33J8rpOq0n2Jto+z5fT09X+OvMDA//n5+W96rOTx/4SbyvX6/2t0pf7+/nN+sIqo2fb6/9jl9s7T/2Vqml5hkPf399nh7ZK877rd/83m/3qDsJS/8lWn7ZCjy87n/5G46oeh0v///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAEIALAAAAAASALgEAAf/gEKCg4SFhoQAh4qLjEKJjZCNj5GUhpOVmI6aiZyZjJeekaChkqSVo6aKqKmWrJCrroOwsZq0qra3uK26hbOxvq7ArMKpxKbGpMihyp7Mmc6Y0Ke8vdSI1rLYgtKU3KLatdjer+Djpdrmn+Xr6Ozi7tbpi/K57+339vnx8NT0h/679PXjxwtgNXz7EA5UWJCgLoPXGD50iAtiNokVKdqyuE0jLY7hEgpsiHGjx18ng6UctrJYy2Mvk8VcNrNZzWc3o+WcVvLjzm4/v/VEOVRlUZZHXSaFuVRmU5pPbUbFOVVnVZ4jJ14FulVo1oxdyYU999XkWHVn5wUVW9Zn2noi/+MubEuUrlG7SPEq1cuUr1O/UAFLFUyVsFXDWOWSRMyVsVfFWh2zhQxWMlnKZi2j1az27b+1l+didssZrujTi0fXVX2XdV7Xe2H3lf2XdmDbg3EX1n2Yd2LUkX03Fv4YeGXik41nRh46tXLSzDdH71z6s+eA00073x78+WrvrcG/Fh+b/GzztdHfVp+b/W73veH/5n5c/nD7xekvx59cP3T+zXXn33cDhlfgeAeWl+B5C6bX4HoPthfhexPGV+F8AmZY34X3cZifhvt52B+I/4kY4IYkEpiigSsi2KKCLzIYo4MzQlijhDdSmKOFO2KI4o8h9tihkB8CWSKRIxqpov+SLDLpopMwQimjlDRSaaOVOGKpo5Y8culjkF4OGWaRYJZ55JhJmrmkmk2y+aSbUcI5pZxV0nmlnVniuaWeXfL55Zl+ihkomYAWuqahbSL6pqJxMjqno3VCeqekeVK6p6V9YvrnoZwm2uminzYa6qOjRlrqpKdWmuqlq2ba6qaexgqqrKLSSqqtpuKKqq6q8sqqr64CC+usxNZa7K3H5prsrsv22uyvzwYb7bDGVoustcpiy6y2znILrbfSgkvtteRmW+6253ab7rfrhtvuuObGi6686tLLrr3u4gvvvPzW2++9/+Yb8L7+FgywwQIjTPDBDCfc8MIORwzxxIJqWvETqxcLm/G0G4vb8bsfgyPyyNQEAgA7); +} +.ncboTree .doc-last { + background: 0 -1px no-repeat #fff url(data:image/gif;base64,R0lGODlhEgAWAOYAANvt/3V4o+Hw/+n1/4CAgOvr67e3t7a2ttHp/8nk/4ep3HSAsu32//v7++/v7/j7/8HBweTk5Njr/8Df/8Ph//39/fP5//7//5S/8pCjy4GVw1Wn7brd/2lwooqo2dvn98bGxn2Jtv7+/n+OvISbynJ8rvT09fn5+c7T//f39+Tx/8DA/5G46mdtnm13qM7n/296rHN+sJK872Vqmtjl9s3m/2t0pfX6/3qDsIeh0oyu3/z9/15hkI+z5fb6/9nh7ZOq0v///////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAEIALAAAAAASABYAAAcpgEKCg4SFhoQEh4qLjEKJjZCNj5GUhpOVmI6aiZyZnp+goaKjpKWmg4EAOw==); +} +.ncboTree .doc a.active { + padding-left: 4px; + margin-left: -4px; +} +.ncboTree .ajax { + background: no-repeat 0 0 #ffffff url(data:image/gif;base64,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); + height: 16px; + display:none; +} +.ncboTree .ajax li { + display:none; + margin:0; + padding:0; +} +.ncboTree .trigger { + display:inline; + margin-left:-28px; + width: 28px; + height: 11px; + cursor:pointer; +} +.ncboTree .text { + cursor: default; +} +.ncboTree .active { + cursor: default; + background-color: #B9D5E4; + font-weight: bold; + padding-top: 1px; + padding-right: 4px; + padding-bottom: 1px; + padding-left: 0px; + line-height: 16px; +} +.ncboTree a, .ncboTree a:hover { + text-decoration: none; + color: black; + font-size: 11pt; +} +.ncboTree a:hover { + cursor: pointer; +} + +/* + * jQuery UI CSS Framework 1.8.7 + * + * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Theming/API + */ + +/* Layout helpers +----------------------------------*/ +.ncboAutocomplete .ui-front { z-index: 100; } +.ncboAutocomplete .ui-helper-hidden { display: none; } +.ncboAutocomplete .ui-helper-hidden-accessible { position: absolute !important; clip: rect(1px 1px 1px 1px); clip: rect(1px,1px,1px,1px); } +.ncboAutocomplete .ui-helper-reset { margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; } +.ncboAutocomplete .ui-helper-clearfix:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; } +.ncboAutocomplete .ui-helper-clearfix { display: inline-block; } +/* required comment for clearfix to work in Opera \*/ +* html .ncboAutocomplete .ui-helper-clearfix { height:1%; } +.ncboAutocomplete .ui-helper-clearfix { display:block; } +/* end clearfix */ +.ncboAutocomplete .ui-helper-zfix { width: 100%; height: 100%; top: 0; left: 0; position: absolute; opacity: 0; filter:Alpha(Opacity=0); } + + +/* Interaction Cues +----------------------------------*/ +.ncboAutocomplete .ui-state-disabled { cursor: default !important; } + + +/* Icons +----------------------------------*/ + +/* states and images */ +.ncboAutocomplete .ui-icon { display: block; text-indent: -99999px; overflow: hidden; background-repeat: no-repeat; } + + +/* Misc visuals +----------------------------------*/ + +/* Overlays */ +.ncboAutocomplete .ui-widget-overlay { position: fixed; top: 0; left: 0; width: 100%; height: 100%; } + +.jsonSuggest a { + font-size: .8em; +} + +.jsonSuggest a:hover { + cursor: pointer; + font-size: .8em; +} + +/* + * jQuery UI CSS Framework 1.8.7 + * + * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Theming/API + * + * To view and modify this theme, visit http://jqueryui.com/themeroller/?ctl=themeroller + */ + + +/* Component containers +----------------------------------*/ +.ncboAutocomplete .ui-widget { font-family: Arial,sans-serif; font-size: 1em; } +.ncboAutocomplete .ui-widget .ui-widget { font-size: 1em; } +.ncboAutocomplete .ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-family: Arial,sans-serif; font-size: 1em; } +.ncboAutocomplete .ui-widget-content { border: 1px solid #B6B6B6; background: #ffffff; color: #4F4F4F; } +.ncboAutocomplete .ui-widget-content a { color: #4F4F4F; } +.ncboAutocomplete .ui-widget-header { border: 1px solid #B6B6B6; color: #4F4F4F; font-weight: bold; } +.ncboAutocomplete .ui-widget-header { + background: #ededed 0 0 repeat-x; /* Old browsers */ + background: -moz-linear-gradient(top, #ededed 0%, #c4c4c4 100%); /* FF3.6+ */ + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#ededed), color-stop(100%,#c4c4c4)); /* Chrome,Safari4+ */ + background: -webkit-linear-gradient(top, #ededed 0%,#c4c4c4 100%); /* Chrome10+,Safari5.1+ */ + background: -o-linear-gradient(top, #ededed 0%,#c4c4c4 100%); /* Opera11.10+ */ + background: -ms-linear-gradient(top, #ededed 0%,#c4c4c4 100%); /* IE10+ */ + background: linear-gradient(top, #ededed 0%,#c4c4c4 100%); /* W3C */ +} +.ncboAutocomplete .ui-widget-header a { color: #4F4F4F; } + +/* Interaction states +----------------------------------*/ +.ncboAutocomplete .ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { border: 1px solid #B6B6B6; font-weight: normal; color: #4F4F4F; } +.ncboAutocomplete .ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { + background: #ededed 0 0 repeat-x; /* Old browsers */ + background: -moz-linear-gradient(top, #ededed 0%, #c4c4c4 100%); /* FF3.6+ */ + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#ededed), color-stop(100%,#c4c4c4)); /* Chrome,Safari4+ */ + background: -webkit-linear-gradient(top, #ededed 0%,#c4c4c4 100%); /* Chrome10+,Safari5.1+ */ + background: -o-linear-gradient(top, #ededed 0%,#c4c4c4 100%); /* Opera11.10+ */ + background: -ms-linear-gradient(top, #ededed 0%,#c4c4c4 100%); /* IE10+ */ + background: linear-gradient(top, #ededed 0%,#c4c4c4 100%); /* W3C */ + -webkit-box-shadow: 0 1px 0 rgba(255,255,255,0.6) inset; + -moz-box-shadow: 0 1px 0 rgba(255,255,255,0.6) inset; + box-shadow: 0 1px 0 rgba(255,255,255,0.6) inset; +} +.ncboAutocomplete .ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited { color: #4F4F4F; text-decoration: none; } +.ncboAutocomplete .ui-state-hover, .ui-widget-content .ui-state-hover, .ui-widget-header .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus, .ui-widget-header .ui-state-focus { border: 1px solid #9D9D9D; font-weight: normal; color: #313131; } +.ncboAutocomplete .ui-state-hover a, .ui-state-hover a:hover { color: #313131; text-decoration: none; } +.ncboAutocomplete .ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active { + outline: none; + color: #1c4257; border: 1px solid #7096ab; + background: #ededed 0 -50px repeat-x; /* Old browsers */ + background: -moz-linear-gradient(top, #b9e0f5 0%, #92bdd6 100%); /* FF3.6+ */ + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#b9e0f5), color-stop(100%,#92bdd6)); /* Chrome,Safari4+ */ + background: -webkit-linear-gradient(top, #b9e0f5 0%,#92bdd6 100%); /* Chrome10+,Safari5.1+ */ + background: -o-linear-gradient(top, #b9e0f5 0%,#92bdd6 100%); /* Opera11.10+ */ + background: -ms-linear-gradient(top, #b9e0f5 0%,#92bdd6 100%); /* IE10+ */ + background: linear-gradient(top, #b9e0f5 0%,#92bdd6 100%); /* W3C */ + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; +} +.ncboAutocomplete .ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #313131; text-decoration: none; } +.ncboAutocomplete .ui-widget :active { outline: none; } + +/* Icons +----------------------------------*/ + +/* Misc visuals +----------------------------------*/ + +/* + * jQuery UI Autocomplete 1.8.7 + * + * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Autocomplete#theming + */ +.ncboAutocomplete .ui-autocomplete { + position: absolute; cursor: default; z-index: 3; + -moz-border-radius: 0; + -webkit-border-radius: 0; + border-radius: 0; + -moz-box-shadow: 0 1px 5px rgba(0,0,0,0.3); + -webkit-box-shadow: 0 1px 5px rgba(0,0,0,0.3); + box-shadow: 0 1px 5px rgba(0,0,0,0.3); +} + +/* workarounds */ +* html .ncboAutocomplete .ui-autocomplete { width:1px; } /* without this, the menu expands to 100% in IE6 */ + +/* + * jQuery UI Menu 1.8.7 + * + * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Menu#theming + */ +.ncboAutocomplete .ui-menu { + list-style:none; + padding: 2px; + margin: 0; + display:block; + float: left; +} +.ncboAutocomplete .ui-menu .ui-menu { + margin-top: -3px; +} +.ncboAutocomplete .ui-menu .ui-menu-item { + margin:0; + padding: 0; + zoom: 1; + float: left; + clear: left; + width: 100%; +} +.ncboAutocomplete .ui-menu .ui-menu-item a { + text-decoration:none; + display:block; + padding:.2em .4em; + line-height:1.5; + zoom:1; +} +.ncboAutocomplete .ui-menu .ui-menu-item a.ui-state-focus, +.ncboAutocomplete .ui-menu .ui-menu-item a.ui-state-hover, +.ncboAutocomplete .ui-menu .ui-menu-item a.ui-state-active { + font-weight: normal; + margin: -1px; + background: #5f83b9; + color: #FFFFFF; + text-shadow: 0px 1px 1px #234386; + border-color: #466086; + -moz-border-radius: 0; + -webkit-border-radius: 0; + border-radius: 0; +} diff --git a/metacatui/src/main/webapp/components/bioportal/jquery.ncbo.tree.min.css b/metacatui/src/main/webapp/components/bioportal/jquery.ncbo.tree.min.css new file mode 100644 index 000000000..7323dddfa --- /dev/null +++ b/metacatui/src/main/webapp/components/bioportal/jquery.ncbo.tree.min.css @@ -0,0 +1 @@ +div.tree_error{background:none repeat scroll 0 0 lightYellow;font-weight:600;padding:5px 10px}.expansion_error{color:red;font-size:x-small;font-style:oblique;padding:0 3px}.ncboTree{margin:0;padding:0;font-family:sans-serif}.ncboTree li{list-style:none;margin:0;padding:0 0 0 22px;line-height:14px}.ncboTree li span{display:inline;clear:left;white-space:nowrap}.ncboTree ul{margin:0;padding:0}.ncboTree .root ul{margin:0}.ncboTree .root{margin-left:-16px !important}.ncboTree .line{padding:0;line-height:3px;height:3px;font-size:3px;background:0 0 no-repeat transparent url(data:image/gif;base64,R0lGODlhUAAUAIABAICAgP///yH5BAEAAAEALAAAAABQABQAAAI0jI+py+0PG4i02ouz3mryD4bi+HjkiabqYq7uC2NtTNd2MN/6Tub8D5QFh8SKr4hEHpOQAgA7)}.ncboTree .line-last{padding:0;line-height:3px;height:3px;font-size:3px;background:0 0 no-repeat transparent url(data:image/gif;base64,R0lGODlhAQABAID/AMDAwAAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==)}.ncboTree .line-over{padding:0;line-height:3px;height:3px;font-size:3px;background:0 0 no-repeat transparent url(data:image/gif;base64,R0lGODlhUAAUAMQfAICAgEVFRUZHRoKBgUlISKKionl6enJycmRkY2tra/Ly81JSUpGRkaqqq8rLyrOzstnZ2cLDwk1NTfv8+/f39+zt7Lq7u+fn5lhYV////15eXuDg4NLS0omKipqamf///yH5BAEAAB8ALAAAAABQABQAAAV44CeOH0CSQXCubOu+cAwHAvFJ3/Jhn/Yhn8Tn8DF8Bp/Oh/HxfAqfxufxsXwiH8eH84F8Np/Lp/JRfCifyScjM7FSsrh8Tq/b73Q3fs/v+/9zeoCDhIWGMIKHiouMeImNkJGSJI+TlpeFlZibnHeanaChL5+ipZshADs=)}.ncboTree .line-over-last{padding:0;line-height:3px;height:3px;font-size:3px;background:0 0 no-repeat transparent url(data:image/gif;base64,R0lGODlhUAAUAMQeAEVFRWtra+fn5k1NTWRkY3l6enJycklISMrLyvLy8////5qamV5eXvf397q7u1hYV8LDwkZHRoKBgbOzspGRkVJSUtnZ2eDg4Ozt7Pv8+6qqq9LS0omKiqKiov///wAAACH5BAEAAB4ALAAAAABQABQAAAVooCeOZOkBgKmubOu+8AhEhzd4lfd4jEd4AY/BU/BIPBwPxbPwdDwaz8Tj8EA8CM/GY/FcPAIPxpPwNDwZjyK2QrHf8Lh8Tq/b7/i8fs/v+/+AgYKDhIWGh4iJiouMjY6PkJGSk5SViSEAOw==)}.ncboTree .folder-open{background:0 -2px no-repeat #fff url(data:image/gif;base64,R0lGODlhEQC6BOYAAICAgP//nHueu8aaGfn7+f/4k8TExP/////bdf/vif/kf///mQQCBMS+uaVzDcyZNM/PvNrYyuzs6OTe1s3Nzevz+7fG18mWMfr7/MuYM///paBuCJpoAsXFxZ5sBpxqBNDc58+iJqRyDPfwiZlnAf/XhMzLx6NxC7q6tNe4QLqHIsiVMJKvx523zad1D9q/bLB+GL/M2/r7+n2fvLOBG36gvb2KJfDkesKPKuKzQ7WCHf/rhMmgIbeEH6JwCsaaGv3VcOLBUKx6FNHR0fH097e3t////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAEYALAAAAAARALoEAAf/gEaCg4SFhoMAh4qLi4mMRkQgLTMClQIWiiwyBJydAooCnaKfh6GiFROkhqEMra0Rn4mOggIVFRK4E7CguhEQvyaqhQIQDcYNKA3ChDE1lpaYj7OP1IfT1diC19nV29zS39ze4Yrj5Ibm54Tp6trt4O+N8fLz1vX294Xs7fvq/ef/yAUMN/BbQXH59CVctxBRQ3cPD2aTiI1it4dGLFLTCK8hR0Yf6XnEGLIcyZMRUY5MyXKly4Ul8b1MGBOdSpg3aebMV1NhS5w/dQblufNeT4ZDjRatd9RhUqZL5zWFOJPoU6lR403NmPXd1q9d+YX1NxZgWYFnCaY1uBbhVa1t/yfGrTj34luvdTfm7Qi0qtK7YgGTFWyWMFrDahGzVezWL1TGciHTlWzXMVbKejHzFWoZrmaQe0F/Ftm3NGfTVjvjHW2StUzUf1UHlj2YdmHbh3En1r2Yd2PYj31HFj6ZeGXgl41nVr45NXLPzEVHJ326unPrsZ+vnt6a+2vswbXPFl+b/G3zudHvVt+b/W/wyd0Pl1+c/nH40O0v1988O/7t/EkXIHXXFeifgeH9N56C5TF4noPpQbiehO1R+B6C8Vk4n4b1cXgfhvl5uJ+I/SUIIoAkCpgigQe2aKKLGZ64oIwN0vigjRHiOKGOFfJ4IYwh+rihkB0S+SGQKBo5ov+SJcaI5IxP1hjljVPmWOWOV/aY5Y8vdumkl0FuOaSYRZJ5JJhJmrmkmk2GiSaUb0oZJ5VzWlknlndqmSeXX/bppp9p7jmmoGUSeiagcCIqp6J0Mmqno3hCqqekfP5paaCUDpppoZseemminy4aaqOjPlpqpKdOmmqlmK6qqaucwuppq7SCWquot5Kaq6m7otqrqr+yauuwuBKrq7G8IuurssAyK2yx0B4bbbLTLltts9c+K+221HJrrbfYgqttt+R+W264545r7rrosqtuu/C+K++rwdLrrL3Z4iuuvuny666/8QI8b6z1EnyvwfkivK/C/TL8r8MBQzzwrAdTnLBYxQtj3LDGD3McsccTr2moyJ2SLKvJBYMs8MoSs6xyyzC/LDPKFdN8sc0Z47yxzh3z/LHPIbeZMtAuEx2z0TMLXbPSNzOds9M7Q92z1D9THTRGWGetdTiBAAA7)}.ncboTree .folder-open-last{background:0 -2px no-repeat #fff url(data:image/gif;base64,R0lGODlhEQAWAOYAAP/bdf/vif/kf///mQQCBMS+uaVzDc/PvICAgNrYysyZNM3Nzevz++zs6OTe1smWMcXFxbfG15poAp5sBv//pZxqBPr7/MuYM6BuCLWCHX6gvdHR0cKPKuLBULB+GJlnAdq/bPfwiaRyDLe3t7eEH7q6tOKzQ7/M28mgIciVMNDc58+iJvr7+qx6FPDkeszLx7OBG5Kvx/3VcLqHIp23zb2KJcaaGqNxC6JwCv/rhH2fvNe4QP/XhPH096d1D8TExP/4k/n7+caaGXueu///nP///////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAEYALAAAAAARABYAAAdcgEaCg4SFhoMIh4qLi4mMj4c9KjQ6Q5ZDEYoxLEGdnkOKQ56joIeiowwOpYaiBK6uCaCJjoJDDAwNuQ6xobsJB8Avq4VDBwXHBSUFw4QnGpeXmZDT1NXW19jZ1oEAOw==)}.ncboTree .folder-close-last{background:0 -2px no-repeat #fff url(data:image/gif;base64,R0lGODlhEgAWAOYAAOvr6//bdf//nP/vif/kf//4k//UbwQCBO/v78S+ufv7+9u3UoCAgNrYysyZNMHBwevz++Tk5M/PvOTe1smWMcKPKpxqBLB+GLOBG72KJaBuCP//uuzs6LfG17e3t5lnAbWCHdu3caNxC55sBsuYM7qHIsCNKLq6tMiVMKx6FMbGxp23zceUL/r7+q58Fr/M26VzDbeEH6d1D32fvKt5E/H0936gvZKvx6h2EJpoAqampszLx8WSLdDc57a2tvn7+Xueu///////mf///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAEMALAAAAAASABYAAAdfgEOCg4SFhoQMh4qLjEOJjZCHNT0rM0CXQB2LNy0/np9Ai0CfB6CipD8QE6GKowevrw2hiY+DQBAQHAccE7KivQ0HEhI7rIdAEgnKCScJxoYvNpiYmpHW19jZ2tvc2YEAOw==)}.ncboTree .folder-close{background:0 -2px no-repeat #fff url(data:image/gif;base64,R0lGODlhEgC+BOYAAICAgP//mXueu/n7+f///7a2tuvr6//Ub//4k///nP/vif/bdf/kfwQCBPv7++/v78S+udu3UtrYysyZNOTe1sHBwc/PvOTk5Ovz++zs6Nu3cbB+GLqHIrfG16BuCJlnAf//usmWMcKPKrWCHcuYM5xqBL2KJbOBG55sBqNxC7e3t8iVMJ23zcCNKKt5E6h2ELq6tL/M26ampreEH/H098bGxn6gvczLx8WSLceUL658Fn2fvPr7+qVzDad1D6x6FJKvx5poAtDc5////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAEMALAAAAAASAL4EAAf/gEOCg4SFhoQAh4qLjEOJjUM0Qiw7ApYCHYtAPAOdngKLAp4Nn6GjAxgUoIqiDa6uEqCJj4MCGBgZDRkUsaG8Eg0WFjerhwIWEMkQMBDFhjE2l5eZkLSQ14fW2NuC2tzY3t/V4t/h5Ivm59nq4OzX6e6D8PGO9Izz8fju+uz86v7nAJITKI5gOXvoECoyyI3hNoftFBqC+E7iRIuFKI7DKI9jR4/1QGpsNPIeyJAeSyYUeVLlwpYwWcpMGZPmTI4u193EmPPiTos9M9bEOZRnUaBHJQZFlFTh0o82oxL9qbQpwqfdrNrDinKqVKNUnWqlx7Xs2Hxn96Xtt/Zf24Bv/wfGLTj3YNirdRvmfbg34lekd7f2rRiY7OCNf6sWRrtYbWO2j91GhjtZbmW6l+0mFptZb2e+n/16HQ12M97QhE0LRo2YNGDVhlmTPDxbtknbK2Ez1u2YN2TfkoFTFm6ZOGbjml0rRu6ZOWjnoksr5ww99fTT1VtL3/76+urstcHfFp/be2zyL3GnR6+TvU/3QtW3N7+bfm/7v/EH1z+cf3H/xwGYHHfLCdicgc8hGF13BFKnoHUNYvegdgxWWGCE300YnobjcVgehud5uJ6I84FYn4n3oZifivux2J+L/8EYoIwDWuggjQfimKCOC15oo4Q8QvhjhkFS6OORNw4ZYv+RGzLZoZMfKnmilClSuaKVLWL5opYxcjmjlzUiCSSYOZK5o5k9JikmkWgKueaSbRqp5pxjvjmlnVXieaWeWfK5pZ9dAvqloGHSySahZSJ6pqJp1mkonIy6+eidk+ZZ6Z6X9pnpn5sG2umgnxbq6KiHhpqoqYui2mippEKqqqStUhqrpbNiWqumt3Kaq6e7gtqrqKwG6+qvpxKbqrGrDiusrMvS2qytz+Iara7T8lqtr9cCq+y2zHLrrLfQgiutuNSSa6252KKrbbfsfttuuO+OG2+5855bb7r3ruvuvvDyK6+/9AJsr8D4Eqxvvwj/m3DACw/ccMEPH6zwxAxT7LBixRBjLHHFHF/cccYfb+zxyCCTLHLJKJ+scrHZsqyuy/nCbLDMEdOssc0h42yyzinzvPKxLQP9stAxEz2z0TUjfbPSOTO9s9M9Q/1zskVTfbTVSWO9tNZNn+T112CHLTY3gQAAOw==)}.ncboTree .doc{background:0 -1px no-repeat #fff url(data:image/gif;base64,R0lGODlhEgC4BOYAAICAgNvt/3V4o+Hw/+n1/+vr67e3t7a2tv///8nk/4ep3NHp/3SAsvj7/+32//v7++/v78HBwf39/djr//P5/8Df/8Ph//7//+Tk5Gdtnvz9/213qIGVw2lwotvn98bGxoyu33J8rpOq0n2Jto+z5fT09X+OvMDA//n5+W96rOTx/4SbyvX6/2t0pf7+/nN+sIqo2fb6/9jl9s7T/2Vqml5hkPf399nh7ZK877rd/83m/3qDsJS/8lWn7ZCjy87n/5G46oeh0v///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAEIALAAAAAASALgEAAf/gEKCg4SFhoQAh4qLjEKJjZCNj5GUhpOVmI6aiZyZjJeekaChkqSVo6aKqKmWrJCrroOwsZq0qra3uK26hbOxvq7ArMKpxKbGpMihyp7Mmc6Y0Ke8vdSI1rLYgtKU3KLatdjer+Djpdrmn+Xr6Ozi7tbpi/K57+339vnx8NT0h/679PXjxwtgNXz7EA5UWJCgLoPXGD50iAtiNokVKdqyuE0jLY7hEgpsiHGjx18ng6UctrJYy2Mvk8VcNrNZzWc3o+WcVvLjzm4/v/VEOVRlUZZHXSaFuVRmU5pPbUbFOVVnVZ4jJ14FulVo1oxdyYU999XkWHVn5wUVW9Zn2noi/+MubEuUrlG7SPEq1cuUr1O/UAFLFUyVsFXDWOWSRMyVsVfFWh2zhQxWMlnKZi2j1az27b+1l+didssZrujTi0fXVX2XdV7Xe2H3lf2XdmDbg3EX1n2Yd2LUkX03Fv4YeGXik41nRh46tXLSzDdH71z6s+eA00073x78+WrvrcG/Fh+b/GzztdHfVp+b/W73veH/5n5c/nD7xekvx59cP3T+zXXn33cDhlfgeAeWl+B5C6bX4HoPthfhexPGV+F8AmZY34X3cZifhvt52B+I/4kY4IYkEpiigSsi2KKCLzIYo4MzQlijhDdSmKOFO2KI4o8h9tihkB8CWSKRIxqpov+SLDLpopMwQimjlDRSaaOVOGKpo5Y8culjkF4OGWaRYJZ55JhJmrmkmk2y+aSbUcI5pZxV0nmlnVniuaWeXfL55Zl+ihkomYAWuqahbSL6pqJxMjqno3VCeqekeVK6p6V9YvrnoZwm2uminzYa6qOjRlrqpKdWmuqlq2ba6qaexgqqrKLSSqqtpuKKqq6q8sqqr64CC+usxNZa7K3H5prsrsv22uyvzwYb7bDGVoustcpiy6y2znILrbfSgkvtteRmW+6253ab7rfrhtvuuObGi6686tLLrr3u4gvvvPzW2++9/+Yb8L7+FgywwQIjTPDBDCfc8MIORwzxxIJqWvETqxcLm/G0G4vb8bsfgyPyyNQEAgA7)}.ncboTree .doc-last{background:0 -1px no-repeat #fff url(data:image/gif;base64,R0lGODlhEgAWAOYAANvt/3V4o+Hw/+n1/4CAgOvr67e3t7a2ttHp/8nk/4ep3HSAsu32//v7++/v7/j7/8HBweTk5Njr/8Df/8Ph//39/fP5//7//5S/8pCjy4GVw1Wn7brd/2lwooqo2dvn98bGxn2Jtv7+/n+OvISbynJ8rvT09fn5+c7T//f39+Tx/8DA/5G46mdtnm13qM7n/296rHN+sJK872Vqmtjl9s3m/2t0pfX6/3qDsIeh0oyu3/z9/15hkI+z5fb6/9nh7ZOq0v///////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAEIALAAAAAASABYAAAcpgEKCg4SFhoQEh4qLjEKJjZCNj5GUhpOVmI6aiZyZnp+goaKjpKWmg4EAOw==)}.ncboTree .doc a.active{padding-left:4px;margin-left:-4px}.ncboTree .ajax{background:no-repeat 0 0 #fff url(data:image/gif;base64,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);height:16px;display:none}.ncboTree .ajax li{display:none;margin:0;padding:0}.ncboTree .trigger{display:inline;margin-left:-28px;width:28px;height:11px;cursor:pointer}.ncboTree .text{cursor:default}.ncboTree .active{cursor:default;background-color:#b9d5e4;font-weight:bold;padding-top:1px;padding-right:4px;padding-bottom:1px;padding-left:0;line-height:16px}.ncboTree a,.ncboTree a:hover{text-decoration:none;color:black;font-size:11pt}.ncboTree a:hover{cursor:pointer}.ncboAutocomplete .ui-front{z-index:100}.ncboAutocomplete .ui-helper-hidden{display:none}.ncboAutocomplete .ui-helper-hidden-accessible{position:absolute !important;clip:rect(1px 1px 1px 1px);clip:rect(1px,1px,1px,1px)}.ncboAutocomplete .ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ncboAutocomplete .ui-helper-clearfix:after{content:".";display:block;height:0;clear:both;visibility:hidden}.ncboAutocomplete .ui-helper-clearfix{display:inline-block}/*\*/* html .ncboAutocomplete .ui-helper-clearfix{height:1%}.ncboAutocomplete .ui-helper-clearfix{display:block}/**/.ncboAutocomplete .ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ncboAutocomplete .ui-state-disabled{cursor:default !important}.ncboAutocomplete .ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ncboAutocomplete .ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.jsonSuggest a{font-size:.8em}.jsonSuggest a:hover{cursor:pointer;font-size:.8em}.ncboAutocomplete .ui-widget{font-family:Arial,sans-serif;font-size:1em}.ncboAutocomplete .ui-widget .ui-widget{font-size:1em}.ncboAutocomplete .ui-widget input,.ui-widget select,.ui-widget textarea,.ui-widget button{font-family:Arial,sans-serif;font-size:1em}.ncboAutocomplete .ui-widget-content{border:1px solid #b6b6b6;background:#fff;color:#4f4f4f}.ncboAutocomplete .ui-widget-content a{color:#4f4f4f}.ncboAutocomplete .ui-widget-header{border:1px solid #b6b6b6;color:#4f4f4f;font-weight:bold}.ncboAutocomplete .ui-widget-header{background:#ededed 0 0 repeat-x;background:-moz-linear-gradient(top,#ededed 0,#c4c4c4 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0,#ededed),color-stop(100%,#c4c4c4));background:-webkit-linear-gradient(top,#ededed 0,#c4c4c4 100%);background:-o-linear-gradient(top,#ededed 0,#c4c4c4 100%);background:-ms-linear-gradient(top,#ededed 0,#c4c4c4 100%);background:linear-gradient(top,#ededed 0,#c4c4c4 100%)}.ncboAutocomplete .ui-widget-header a{color:#4f4f4f}.ncboAutocomplete .ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default{border:1px solid #b6b6b6;font-weight:normal;color:#4f4f4f}.ncboAutocomplete .ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default{background:#ededed 0 0 repeat-x;background:-moz-linear-gradient(top,#ededed 0,#c4c4c4 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0,#ededed),color-stop(100%,#c4c4c4));background:-webkit-linear-gradient(top,#ededed 0,#c4c4c4 100%);background:-o-linear-gradient(top,#ededed 0,#c4c4c4 100%);background:-ms-linear-gradient(top,#ededed 0,#c4c4c4 100%);background:linear-gradient(top,#ededed 0,#c4c4c4 100%);-webkit-box-shadow:0 1px 0 rgba(255,255,255,0.6) inset;-moz-box-shadow:0 1px 0 rgba(255,255,255,0.6) inset;box-shadow:0 1px 0 rgba(255,255,255,0.6) inset}.ncboAutocomplete .ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited{color:#4f4f4f;text-decoration:none}.ncboAutocomplete .ui-state-hover,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-hover,.ui-state-focus,.ui-widget-content .ui-state-focus,.ui-widget-header .ui-state-focus{border:1px solid #9d9d9d;font-weight:normal;color:#313131}.ncboAutocomplete .ui-state-hover a,.ui-state-hover a:hover{color:#313131;text-decoration:none}.ncboAutocomplete .ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active{outline:0;color:#1c4257;border:1px solid #7096ab;background:#ededed 0 -50px repeat-x;background:-moz-linear-gradient(top,#b9e0f5 0,#92bdd6 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0,#b9e0f5),color-stop(100%,#92bdd6));background:-webkit-linear-gradient(top,#b9e0f5 0,#92bdd6 100%);background:-o-linear-gradient(top,#b9e0f5 0,#92bdd6 100%);background:-ms-linear-gradient(top,#b9e0f5 0,#92bdd6 100%);background:linear-gradient(top,#b9e0f5 0,#92bdd6 100%);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.ncboAutocomplete .ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#313131;text-decoration:none}.ncboAutocomplete .ui-widget :active{outline:0}.ncboAutocomplete .ui-autocomplete{position:absolute;cursor:default;z-index:3;-moz-border-radius:0;-webkit-border-radius:0;border-radius:0;-moz-box-shadow:0 1px 5px rgba(0,0,0,0.3);-webkit-box-shadow:0 1px 5px rgba(0,0,0,0.3);box-shadow:0 1px 5px rgba(0,0,0,0.3)}* html .ncboAutocomplete .ui-autocomplete{width:1px}.ncboAutocomplete .ui-menu{list-style:none;padding:2px;margin:0;display:block;float:left}.ncboAutocomplete .ui-menu .ui-menu{margin-top:-3px}.ncboAutocomplete .ui-menu .ui-menu-item{margin:0;padding:0;zoom:1;float:left;clear:left;width:100%}.ncboAutocomplete .ui-menu .ui-menu-item a{text-decoration:none;display:block;padding:.2em .4em;line-height:1.5;zoom:1}.ncboAutocomplete .ui-menu .ui-menu-item a.ui-state-focus,.ncboAutocomplete .ui-menu .ui-menu-item a.ui-state-hover,.ncboAutocomplete .ui-menu .ui-menu-item a.ui-state-active{font-weight:normal;margin:-1px;background:#5f83b9;color:#fff;text-shadow:0 1px 1px #234386;border-color:#466086;-moz-border-radius:0;-webkit-border-radius:0;border-radius:0} \ No newline at end of file diff --git a/metacatui/src/main/webapp/js/app.js b/metacatui/src/main/webapp/js/app.js index cffc6e2ef..0c44f205e 100644 --- a/metacatui/src/main/webapp/js/app.js +++ b/metacatui/src/main/webapp/js/app.js @@ -44,6 +44,7 @@ require.config({ nGeohash: '../components/geohash/main', fancybox: '../components/fancybox/jquery.fancybox.pack', //v. 2.1.5 annotator: '../components/annotator/v1.2.10/annotator-full', + bioportal: '../components/bioportal/jquery.ncbo.tree-2.0.2.min', clipboard: '../components/clipboard.min', //Have a null fallback for our d3 components for browsers that don't support SVG d3: d3URL, @@ -67,6 +68,9 @@ require.config({ annotator: { exports: 'Annotator' }, + bioportal: { + exports: 'Bioportal' + }, jws: { exports: 'JWS', deps: ['jsrasign'], diff --git a/metacatui/src/main/webapp/js/templates/appHead.html b/metacatui/src/main/webapp/js/templates/appHead.html index 155cd00d5..5e2d507eb 100644 --- a/metacatui/src/main/webapp/js/templates/appHead.html +++ b/metacatui/src/main/webapp/js/templates/appHead.html @@ -9,6 +9,7 @@ + diff --git a/metacatui/src/main/webapp/js/views/AnnotatorView.js b/metacatui/src/main/webapp/js/views/AnnotatorView.js index b083bc136..cde9df9e1 100644 --- a/metacatui/src/main/webapp/js/views/AnnotatorView.js +++ b/metacatui/src/main/webapp/js/views/AnnotatorView.js @@ -2,6 +2,7 @@ define(['jquery', 'jqueryui', 'annotator', + 'bioportal', 'underscore', 'backbone', 'models/AnnotationModel', @@ -11,6 +12,7 @@ define(['jquery', function($, $ui, Annotator, + Bioportal, _, Backbone, AnnotationModel, From 500f953e31bc6d3ef010caa9dab197d707b5c8c1 Mon Sep 17 00:00:00 2001 From: leinfelder Date: Thu, 6 Oct 2016 15:30:04 -0700 Subject: [PATCH 025/560] remove child handling block - too many requests when uncommented. --- .../src/main/webapp/js/models/LookupModel.js | 45 ------------------- 1 file changed, 45 deletions(-) diff --git a/metacatui/src/main/webapp/js/models/LookupModel.js b/metacatui/src/main/webapp/js/models/LookupModel.js index ef9596e64..0af329252 100644 --- a/metacatui/src/main/webapp/js/models/LookupModel.js +++ b/metacatui/src/main/webapp/js/models/LookupModel.js @@ -45,51 +45,6 @@ define(['jquery', 'jqueryui', 'underscore', 'backbone'], choice.desc = obj['definition'][0]; } - // process the children - just one level - var childrenUrl = obj['links']['children']; - if (false) { - //if (childrenUrl) { - - $.get(childrenUrl + "?apikey=" + appModel.get("bioportalAPIKey"), function(data, textStatus, xhr) { - - _.each(data.collection, function(obj) { - var choice = {}; - choice.label = "--" + obj['prefLabel']; - var synonyms = obj['synonym']; - if (synonyms) { - choice.synonyms = []; - _.each(synonyms, function(synonym) { - choice.synonyms.push(synonym); - }); - } - choice.filterLabel = obj['prefLabel']; - choice.value = obj['@id']; - if (obj['definition']) { - choice.desc = obj['definition'][0]; - } - - // mark items that we know we have matches for - if (allValues) { - var matchingChoice = _.findWhere(allValues, {value: choice.value}); - if (matchingChoice) { - choice.label = "*" + choice.label; - - // remove it from the local value - why have two? - if (localValues) { - localValues = _.reject(localValues, function(obj) { - return obj.value == matchingChoice.value; - }); - } - } - } - - availableTags.push(choice); - - }) - }); - - } - // mark items that we know we have matches for if (allValues) { var matchingChoice = _.findWhere(allValues, {value: choice.value}); From f442ab8a9a3c19f6b2c96a7e6ab714beb229a90d Mon Sep 17 00:00:00 2001 From: leinfelder Date: Thu, 6 Oct 2016 15:59:26 -0700 Subject: [PATCH 026/560] use emphasis instead of asterisk to indicate matched concept. https://github.com/DataONEorg/sem-prov-design/issues/217 --- metacatui/src/main/webapp/css/metacatui-common.css | 3 +++ metacatui/src/main/webapp/js/models/LookupModel.js | 3 ++- metacatui/src/main/webapp/js/views/DataCatalogView.js | 3 +++ 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/metacatui/src/main/webapp/css/metacatui-common.css b/metacatui/src/main/webapp/css/metacatui-common.css index 44ee3071d..4ad223893 100644 --- a/metacatui/src/main/webapp/css/metacatui-common.css +++ b/metacatui/src/main/webapp/css/metacatui-common.css @@ -25,6 +25,9 @@ .strong{ font-weight: bold; } +.emphasis{ + font-style: italic; +} .large{ font-size: 1.5em; padding: 1em; diff --git a/metacatui/src/main/webapp/js/models/LookupModel.js b/metacatui/src/main/webapp/js/models/LookupModel.js index 0af329252..54b603e93 100644 --- a/metacatui/src/main/webapp/js/models/LookupModel.js +++ b/metacatui/src/main/webapp/js/models/LookupModel.js @@ -49,7 +49,8 @@ define(['jquery', 'jqueryui', 'underscore', 'backbone'], if (allValues) { var matchingChoice = _.findWhere(allValues, {value: choice.value}); if (matchingChoice) { - choice.label = "*" + choice.label; + //choice.label = "*" + choice.label; + choice.match = true; // remove it from the local value - why have two? if (localValues) { diff --git a/metacatui/src/main/webapp/js/views/DataCatalogView.js b/metacatui/src/main/webapp/js/views/DataCatalogView.js index 078f166ca..593ce9f9f 100644 --- a/metacatui/src/main/webapp/js/views/DataCatalogView.js +++ b/metacatui/src/main/webapp/js/views/DataCatalogView.js @@ -1468,6 +1468,9 @@ define(['jquery', //Set up the popover var element = this._super( ul, item ); + if (item.match) { + element.addClass("emphasis"); + } element.popover({ placement: "right", trigger: "manual", From fbbd8e0bc3670a5b3b0ade2e743c5e5dff47fd8b Mon Sep 17 00:00:00 2001 From: leinfelder Date: Thu, 6 Oct 2016 16:39:45 -0700 Subject: [PATCH 027/560] rework CSS for the dropdown button for flagging an annotation. https://github.com/DataONEorg/sem-prov-design/issues/209 --- .../src/main/webapp/css/metacatui-common.css | 8 ++------ .../main/webapp/js/templates/annotation.html | 10 +++++++--- .../src/main/webapp/js/views/AnnotatorView.js | 17 ++++++++++------- 3 files changed, 19 insertions(+), 16 deletions(-) diff --git a/metacatui/src/main/webapp/css/metacatui-common.css b/metacatui/src/main/webapp/css/metacatui-common.css index 4ad223893..c3d9ce480 100644 --- a/metacatui/src/main/webapp/css/metacatui-common.css +++ b/metacatui/src/main/webapp/css/metacatui-common.css @@ -1301,8 +1301,9 @@ img.icon{ margin-left: 180px; } .annotation-container .add-tag{ + margin-left: 10px; margin-top: 10px; - margin-bottom: 10px; + margin-bottom: 20px; text-shadow: none; } .annotation-attribute-name{ @@ -1334,8 +1335,6 @@ img.icon{ padding: 10px; } .annotation.tag { - padding: .35em .75em; - margin-right: 5px; -webkit-border-radius: 4px; -moz-border-radius: 4px; border-radius: 4px; @@ -1344,11 +1343,8 @@ img.icon{ text-shadow: none; box-shadow: none; text-align: center; - margin-top: 10px; - margin-bottom: 10px; } .annotation-viewer-container .annotation.tag{ - margin-bottom: 10px; display: inline-block; } .annotator-tags, diff --git a/metacatui/src/main/webapp/js/templates/annotation.html b/metacatui/src/main/webapp/js/templates/annotation.html index 5491dac86..d5adfd116 100644 --- a/metacatui/src/main/webapp/js/templates/annotation.html +++ b/metacatui/src/main/webapp/js/templates/annotation.html @@ -1,11 +1,13 @@ +
                  + <% if (concept) { %> - <%=concept.label %> - + <% } else if (annotation.tags[0]) { %> @@ -20,12 +22,13 @@ <% } %> -
                  +
                  diff --git a/metacatui/src/main/webapp/js/views/AnnotatorView.js b/metacatui/src/main/webapp/js/views/AnnotatorView.js index cde9df9e1..d443e2070 100644 --- a/metacatui/src/main/webapp/js/views/AnnotatorView.js +++ b/metacatui/src/main/webapp/js/views/AnnotatorView.js @@ -471,28 +471,30 @@ define(['jquery', }).trim()); section.prepend(annotationTag); + // this is what we really want to attach to + var target = $(annotationTag).find(".hover-proxy"); + //Attach the annotation object for later - $(annotationTag).data("annotation", annotationModel); + $(target).data("annotation", annotationModel); var view = this; //Create the popover for this element - $(annotationTag).on("mouseover", { view: this }, this.showDetails); + $(target).on("mouseover", { view: this }, this.showDetails); // bind after rendering - var target = $(annotationTag).filter(".hover-proxy"); - target = $(annotationTag).filter(".annotation-flag[data-id='" + annotationModel.get("id") + "']"); + //target = $(annotationTag).find(".annotation-flag[data-id='" + annotationModel.get("id") + "']"); //$(target).bind("click", this.flagAnnotation); - var deleteBtn = $(annotationTag).filter(".annotation-delete"); + var deleteBtn = $(annotationTag).find(".annotation-delete"); $(deleteBtn).tooltip({ trigger: "hover", title: "Delete" }); - $(annotationTag).filter(".tooltip-this").tooltip(); + $(annotationTag).find(".tooltip-this").tooltip(); - target = $(annotationTag).filter(".annotation-delete[data-id='" + annotationModel.get("id") + "']"); + //target = $(annotationTag).find(".annotation-delete[data-id='" + annotationModel.get("id") + "']"); //$(target).bind("click", this.deleteAnnotation); }, @@ -556,6 +558,7 @@ define(['jquery', html: true, title: annotation.get("concept").label, content: annotationPopover, + container: 'body', placement: "top" }).on("mouseenter", function () { var _this = this; From 7fe1aa6a78a84f5b79b91cd4c23b2fff17827eda Mon Sep 17 00:00:00 2001 From: leinfelder Date: Fri, 7 Oct 2016 13:49:48 -0700 Subject: [PATCH 028/560] merge MDQ view into master --- .../src/main/webapp/css/metacatui-common.css | 88 ++++ .../src/main/webapp/js/routers/router.js | 18 + .../src/main/webapp/js/templates/mdqRun.html | 390 ++++++++++++++++++ .../main/webapp/js/templates/mdqSuites.html | 12 + .../js/themes/default/css/metacatui.css | 1 - .../main/webapp/js/views/DonutChartView.js | 55 ++- .../src/main/webapp/js/views/MdqRunView.js | 293 +++++++++++++ 7 files changed, 853 insertions(+), 4 deletions(-) create mode 100644 metacatui/src/main/webapp/js/templates/mdqRun.html create mode 100644 metacatui/src/main/webapp/js/templates/mdqSuites.html create mode 100644 metacatui/src/main/webapp/js/views/MdqRunView.js diff --git a/metacatui/src/main/webapp/css/metacatui-common.css b/metacatui/src/main/webapp/css/metacatui-common.css index c3d9ce480..5aa39c74b 100644 --- a/metacatui/src/main/webapp/css/metacatui-common.css +++ b/metacatui/src/main/webapp/css/metacatui-common.css @@ -784,6 +784,94 @@ img.icon{ width: calc(100% - 214px); } +/* MDQ */ + +#mdqResult .alert [data-toggle="collapse"]:after +{ + /*content: "\e072"; "play" icon */ + content: "-"; + float: right; + color: #b0c5d8; + font-size: 18px; + line-height: 22px; +} +#mdqResult .alert [data-toggle="collapse"].collapsed:after +{ + content: "+"; +} + +.mdq .popover { + max-width: 50%; +} + +#mdqResult .progress { + margin-bottom: 10px; + margin-top: 0px; +} + +#mdqResult .progress-bar-success { + opacity: 0.50; +} + +#mdqTypeSummary { + float: right; + width: 75%; +} + +#mdqResult #data-chart { + height: 220px; + width: 250px; + margin:0px; +} + +#mdqResult .panel-heading { + overflow: auto; +} + +/* different colors for each pie slice */ +#mdqResult .donut.data > g:nth-child(1) .donut-arc { + fill: #dff0d8; +} +#mdqResult .donut.data > g:nth-child(1) .donut-arc-label, +#mdqResult .donut.data > g:nth-child(1) .donut-arc.active { + fill: #468847; +} + +#mdqResult .donut.data > g:nth-child(2) .donut-arc { + fill: #fcf8e3; +} +#mdqResult .donut.data > g:nth-child(2) .donut-arc-label, +#mdqResult .donut.data > g:nth-child(2) .donut-arc.active { + fill: #c09853; +} + +#mdqResult .donut.data > g:nth-child(3) .donut-arc { + fill: #f2dede; +} +#mdqResult .donut.data > g:nth-child(3) .donut-arc-label, +#mdqResult .donut.data > g:nth-child(3) .donut-arc.active { + fill: #b94a48; +} + +#mdqResult .donut.data > g:nth-child(4) .donut-arc { + fill: #d9edf7; +} +#mdqResult .donut.data > g:nth-child(4) .donut-arc-label, +#mdqResult .donut.data > g:nth-child(4) .donut-arc.active { + fill: #3a87ad; +} + +#mdqResult .donut-labels{ + opacity: 0.0; +} + +#mdqResult .donut-arc.active + .donut-labels, +#mdqResult .donut-arc.active + .donut-labels .donut-arc-count.rotated{ + opacity: 1; + font-weight: bold; +} + + /* Prov chart popovers */ .prov-chart .popover{ min-width: 300px; diff --git a/metacatui/src/main/webapp/js/routers/router.js b/metacatui/src/main/webapp/js/routers/router.js index 63b594d41..93f8df59b 100644 --- a/metacatui/src/main/webapp/js/routers/router.js +++ b/metacatui/src/main/webapp/js/routers/router.js @@ -25,6 +25,7 @@ function ($, _, Backbone) { 'signup' : 'renderLdap', // use ldapweb for registration 'account(/:stage)' : 'renderLdap', // use ldapweb for different stages 'share(/:stage/*pid)' : 'renderRegistry', // registry page + 'mdq(/s=:suiteId)(/:pid)' : 'renderMdqRun', // MDQ page 'api(/:anchorId)' : 'renderAPI' // API page }, @@ -131,6 +132,23 @@ function ($, _, Backbone) { this.renderText(options); }, + renderMdqRun: function (suiteId, pid) { + this.routeHistory.push("mdq"); + + if (!appView.mdqRunView) { + require(["views/MdqRunView"], function(MdqRunView) { + appView.mdqRunView = new MdqRunView(); + appView.mdqRunView.suiteId = suiteId; + appView.mdqRunView.pid = pid; + appView.showView(appView.mdqRunView); + }); + } else { + appView.mdqRunView.suiteId = suiteId; + appView.mdqRunView.pid = pid; + appView.showView(appView.mdqRunView); + } + }, + renderTools: function (anchorId) { this.routeHistory.push("tools"); appModel.set('anchorId', anchorId); diff --git a/metacatui/src/main/webapp/js/templates/mdqRun.html b/metacatui/src/main/webapp/js/templates/mdqRun.html new file mode 100644 index 000000000..ac4d82501 --- /dev/null +++ b/metacatui/src/main/webapp/js/templates/mdqRun.html @@ -0,0 +1,390 @@ +<% if (typeof objectIdentifier === 'undefined') { %> + +
                  +
                  +

                  Upload Metadata document for QC

                  +
                  +
                  +
                  + + +
                  +
                  +
                  + +<% } %> + +
                  + +<% if (typeof result !== 'undefined') { %> + +
                  +
                  + +
                  +

                  Metadata Quality report for <%= objectIdentifier %>

                  + + +

                  + After running your metadata package against our standard set of metadata, data, and congruency checks, + we have found the following potential issues. + Please assist us in improving the discoverability and reusability of your research data by addressing the issues below. +

                  +
                  + +
                  + +
                  + +
                  + + <% + var types = _.keys(groupedByType); + _.each(types, function(type) { + var results = groupedByType[type]; + var total = results.length; + var success = 0; + _.each(results, function(result) { + if (result.status == "SUCCESS") { + success++; + } + }); + var width = (success/total) * 100; + width = width.toFixed(0); + + %> + <%=type%>: <%=width%>% complete +
                  +
                  + +
                  +
                  + <% + + }); + + %> + +
                  + +
                  +
                  + <% + + var total = result.length; + if (groupedResults.BLUE) { + total = total - groupedResults.BLUE.length; + } + + %> + + <% if (groupedResults.GREEN) { %> + + + +
                  +
                    + + <% + _.each(groupedResults.GREEN, function(result) { + %> + +
                  • + + + <% + _.each(result.output, function(output) { + %> + <% if (output.type && output.type.includes('image')) { %> + + + <% } else { %> + <%- output.value %> + <% } %> + <% + }); + %> +
                    + + <%= result.check.name %> + <%= result.status %> + <%= result.check.level %> + <%= result.check.type %> +
                    + <%= result.check.description %> + + + + + + + + + + + +
                  • + <% + }); + %> + +
                  +
                  + + <% } %> + + + + <% if (groupedResults.ORANGE) { %> + + + +
                  +
                    + + <% + _.each(groupedResults.ORANGE, function(result) { + %> + +
                  • + + + <% + _.each(result.output, function(output) { + %> + <% if (output.type && output.type.includes('image')) { %> + + + <% } else { %> + <%- output.value %> + <% } %> + <% + }); + %> +
                    + + <%= result.check.name %> + <%= result.status %> + <%= result.check.level %> + <%= result.check.type %> +
                    + <%= result.check.description %> + + + + + + + + + + + +
                  • + <% + }); + %> + +
                  +
                  + + <% } %> + + <% if (groupedResults.RED) { %> + + + +
                  +
                    + + <% + _.each(groupedResults.RED, function(result) { + %> + +
                  • + + + <% + _.each(result.output, function(output) { + %> + <% if (output.type && output.type.includes('image')) { %> + + + <% } else { %> + <%- output.value %> + <% } %> + <% + }); + %> +
                    + + <%= result.check.name %> + <%= result.status %> + <%= result.check.level %> + <%= result.check.type %> +
                    + <%= result.check.description %> + + + + + + + + + + + +
                  • + <% + }); + %> + +
                  +
                  + + <% } %> + + <% if (groupedResults.BLUE) { %> + + +
                  +
                    + + + <% + _.each(groupedResults.BLUE, function(result) { + %> +
                  • + + + <% + _.each(result.output, function(output) { + %> + <% if (output.type && output.type.includes('image')) { %> + + + <% } else { %> + <%- output.value %> + <% } %> + <% + }); + %> +
                    + + <%= result.check.name %> + <%= result.status %> + <%= result.check.level %> + <%= result.check.type %> +
                    + <%= result.check.description %> + + + + + + + + + +
                  • + <% + }); + %> + +
                  +
                  + + <% } %> + + +
                  + +
                  + +<% } %> +
                  \ No newline at end of file diff --git a/metacatui/src/main/webapp/js/templates/mdqSuites.html b/metacatui/src/main/webapp/js/templates/mdqSuites.html new file mode 100644 index 000000000..80aeddffc --- /dev/null +++ b/metacatui/src/main/webapp/js/templates/mdqSuites.html @@ -0,0 +1,12 @@ +

                  +Suite: + +

                  \ No newline at end of file diff --git a/metacatui/src/main/webapp/js/themes/default/css/metacatui.css b/metacatui/src/main/webapp/js/themes/default/css/metacatui.css index 4c7c45fcd..f4b0166fe 100644 --- a/metacatui/src/main/webapp/js/themes/default/css/metacatui.css +++ b/metacatui/src/main/webapp/js/themes/default/css/metacatui.css @@ -1800,7 +1800,6 @@ svg .default{ width: 100%; } - .donut-title-count{ font-size: 24px; } diff --git a/metacatui/src/main/webapp/js/views/DonutChartView.js b/metacatui/src/main/webapp/js/views/DonutChartView.js index 061f47fe8..217549685 100644 --- a/metacatui/src/main/webapp/js/views/DonutChartView.js +++ b/metacatui/src/main/webapp/js/views/DonutChartView.js @@ -34,6 +34,7 @@ define(['jquery', 'underscore', 'backbone', 'd3'], this.total = options.total || 0; this.formatLabel=options.formatLabel || function(d){ return d } this.data = this.formatDonutData(options.data, options.total) || [{label: "", count: 0, perc: 0}]; + this.keepOrder = options.keepOrder || false; this.drawLabels = (this.data) }, @@ -86,10 +87,22 @@ define(['jquery', 'underscore', 'backbone', 'd3'], * Draw the arcs * ======================================================================== */ - + + // sort or not + var theData = donut.value( + function(d) { + return d.perc + }); + if (this.keepOrder) { + theData = donut.value( + function(d) { + return d.perc + }).sort(null); + } //Set up a group for each arc we will create - var arcs = vis.selectAll("g.arc") - .data(donut.value(function(d) { return d.perc })) //connect data to this group + var arcs = + vis.selectAll("g.arc") + .data(theData) //connect data to this group .enter().append("svg:g") .attr("class", "donut-arc-group") .attr("transform", @@ -339,6 +352,42 @@ define(['jquery', 'underscore', 'backbone', 'd3'], return counts; } + //Check if the data is preformatted + if((typeof counts[0] == "object") && (typeof counts[0].label != "undefined") && (typeof counts[0].count != "undefined")){ + //If there are no percentages in the formatted data, find the total and set the percentage of each arc + if(typeof counts[0].perc == "undefined"){ + var countNums = _.pluck(counts, "count"); + var sum = 0; + _.each(counts, function(c){ + sum += c.count; + }); + + _.each(counts, function(thisCount){ + thisCount.perc = thisCount.count/sum; + }); + } + + return counts; + } + + //Check if the data is preformatted + if((typeof counts[0] == "object") && (typeof counts[0].label != "undefined") && (typeof counts[0].count != "undefined")){ + //If there are no percentages in the formatted data, find the total and set the percentage of each arc + if(typeof counts[0].perc == "undefined"){ + var countNums = _.pluck(counts, "count"); + var sum = 0; + _.each(counts, function(c){ + sum += c.count; + }); + + _.each(counts, function(thisCount){ + thisCount.perc = thisCount.count/sum; + }); + } + + return counts; + } + var newArray = []; var otherPercent = 0; var otherCount = 0; diff --git a/metacatui/src/main/webapp/js/views/MdqRunView.js b/metacatui/src/main/webapp/js/views/MdqRunView.js new file mode 100644 index 000000000..f6f9d0c53 --- /dev/null +++ b/metacatui/src/main/webapp/js/views/MdqRunView.js @@ -0,0 +1,293 @@ +/*global define */ +define(['jquery', 'underscore', 'backbone', 'd3', 'DonutChart', 'text!templates/mdqRun.html', 'text!templates/mdqSuites.html', 'text!templates/loading.html'], + function($, _, Backbone, d3, DonutChart, MdqRunTemplate, SuitesTemplate, LoadingTemplate) { + 'use strict'; + + // Build the Footer view of the application + var MdqRunView = Backbone.View.extend({ + + el: '#Content', + + events: { + "click input[type='submit']" : "submitForm", + "change #suiteId" : "switchSuite" + }, + + suitesUrl: "/mdq-webapp/webapi/suites/", + + url: null, + + pid: null, + + suiteId: null, + + loadingTemplate: _.template(LoadingTemplate), + + template: _.template(MdqRunTemplate), + + suitesTemplate: _.template(SuitesTemplate), + + + initialize: function () { + + }, + + switchSuite: function(event) { + console.log("Switching Suite"); + + var select = $(event.target); + + var suiteId = $(select).val(); + + uiRouter.navigate("mdq/s=" + suiteId + "/" + this.pid, {trigger: true}); + + return false; + }, + + render: function () { + + // use the requested suite if provided + if (!this.suiteId) { + this.suiteId = "arctic.data.center.suite.1"; + } + this.url = this.suitesUrl + this.suiteId + "/run"; + + var viewRef = this; + + if (this.pid) { + + this.showLoading(); + + // fetch the metadata contents by the pid + var xhr = new XMLHttpRequest(); + xhr.onreadystatechange = function(){ + if (this.readyState == 4 && this.status == 200){ + //this.response is what you're looking for + //handler(this.response); + console.log(this.response, typeof this.response); + var documentBlob = this.response; + // send to MDQ as blob + var formData = new FormData(); + formData.append('document', documentBlob); + console.log("Submitting Blob to MDQ"); + viewRef.showResults(formData); + } + } + var url = appModel.get("objectServiceUrl") + this.pid; + xhr.open('GET', url); + xhr.responseType = 'blob'; + xhr.withCredentials = true; + xhr.setRequestHeader("Authorization", "Bearer " + appUserModel.get("token")); + xhr.send(); + + } else { + this.$el.html(this.template({})); + } + + }, + + showLoading: function() { + this.$el.html(this.loadingTemplate()); + }, + + show: function() { + var view = this; + this.$el.hide(); + this.$el.fadeIn({duration: "slow"}); + }, + + // lookup the suites we can run + showAvailableSuites: function() { + var viewRef = this; + + try { + var args = { + url: this.suitesUrl, + type: 'GET', + success: function(data, textStatus, xhr) { + viewRef.$el.find('#suites').append( + viewRef.suitesTemplate( + { + suiteId: viewRef.suiteId, + suiteIds: data + })); + //Initialize all popover elements + //$('.popover-this').popover(); + } + }; + $.ajax(args); + } catch (error) { + console.log(error.stack); + } + }, + + submitForm: function(event) { + console.log("Submitting form to MDQ"); + + var form = $(event.target).parents("form"); + + var formData = new FormData($(form)[0]); + + this.showResults(formData); + + return false; + + }, + + // do the work of sending the data and rendering the results + showResults: function(formData) { + var viewRef = this; + + try { + var args = { + url: this.url, + cache: false, + data: formData, + contentType: false, //"multipart/form-data", + processData: false, + type: 'POST', + success: function(data, textStatus, xhr) { + var groupedResults = viewRef.groupResults(data.result); + var groupedByType = viewRef.groupByType(data.result); + + data = _.extend(data, + { + objectIdentifier: viewRef.pid, + suiteId: viewRef.suiteId, + groupedResults: groupedResults, + groupedByType: groupedByType + }); + + viewRef.$el.html(viewRef.template(data)); + viewRef.drawScoreChart(data.result, groupedResults); + viewRef.showAvailableSuites(); + viewRef.show(); + //Initialize all popover elements + $('.popover-this').popover(); + } + }; + $.ajax(args); + } catch (error) { + console.log(error.stack); + } + }, + + groupResults: function(results) { + var groupedResults = _.groupBy(results, function(result) { + var color; + + // simple cases + // always blue for info and skip + if (result.check.level == 'INFO') { + color = 'BLUE'; + return color; + } + if (result.status == 'SKIP') { + color = 'BLUE'; + return color; + } + // always green for success + if (result.status == 'SUCCESS') { + color = 'GREEN'; + return color; + } + + // handle failures and warnings + if (result.status == 'FAILURE') { + color = 'RED'; + if (result.check.level == 'OPTIONAL') { + color = 'ORANGE'; + } + } + if (result.status == 'ERROR') { + color = 'ORANGE'; + if (result.check.level == 'REQUIRED') { + color = 'RED'; + } + } + //console.log("result color:" + color); + return color; + + }); + + // make sure we have everything, even if empty + if (!groupedResults.BLUE) { + groupedResults.BLUE = []; + } + if (!groupedResults.GREEN) { + groupedResults.GREEN = []; + } + if (!groupedResults.ORANGE) { + groupedResults.ORANGE = []; + } + if (!groupedResults.RED) { + groupedResults.RED = []; + } + + var total = results.length; + if (groupedResults.BLUE) { + total = total - groupedResults.BLUE.length; + } + + return groupedResults; + }, + + groupByType: function(results) { + var groupedResults = _.groupBy(results, function(result) { + return result.check.type || "uncategorized"; + }); + + return groupedResults; + }, + + drawScoreChart: function(results, groupedResults){ + + var dataCount = results.length; + + + var data = [ + {label: "Pass", count: groupedResults.GREEN.length, perc: groupedResults.GREEN.length/results.length }, + {label: "Warn", count: groupedResults.ORANGE.length, perc: groupedResults.ORANGE.length/results.length}, + {label: "Fail", count: groupedResults.RED.length, perc: groupedResults.RED.length/results.length}, + {label: "Info", count: groupedResults.BLUE.length, perc: groupedResults.BLUE.length/results.length}, + ]; + /* + var data = [ + "Pass", groupedResults.GREEN.length, + "Warning", groupedResults.ORANGE.length, + "Fail", groupedResults.RED.length, + "Info", groupedResults.BLUE.length, + ]; + */ + + var svgClass = "data"; + + //If d3 isn't supported in this browser or didn't load correctly, insert a text title instead + if(!d3){ + this.$('.format-charts-data').html("

                  " + appView.commaSeparateNumber(dataCount) + " data files

                  "); + + return; + } + + //Draw a donut chart + var donut = new DonutChart({ + id: "data-chart", + data: data, + total: dataCount, + titleText: "checks", + titleCount: dataCount, + svgClass: svgClass, + countClass: "data", + height: 250, + width: 250, + keepOrder: true, + formatLabel: function(name) { + return name; + } + }); + this.$('.format-charts-data').html(donut.render().el); + } + + }); + return MdqRunView; +}); From a4a8e140a965ec9888481b7a53b040fd23039b25 Mon Sep 17 00:00:00 2001 From: leinfelder Date: Fri, 7 Oct 2016 14:06:37 -0700 Subject: [PATCH 029/560] add MDQ link from main metadata view --- .../src/main/webapp/js/templates/metadataControls.html | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/metacatui/src/main/webapp/js/templates/metadataControls.html b/metacatui/src/main/webapp/js/templates/metadataControls.html index f4a491fbb..568f907ef 100644 --- a/metacatui/src/main/webapp/js/templates/metadataControls.html +++ b/metacatui/src/main/webapp/js/templates/metadataControls.html @@ -1,6 +1,9 @@
                • The content was removed because it was invalid.
                • " + "
                "; this.hideLoading(); - MetacatUI.appView.showAlert(msg, "alert-error", this.$el, null, {remove: true}); + MetacatUI.appView.showAlert(msg, "alert-error", this.$("#editor-body"), null, {remove: true}); }, From 58cc76b124a90e6df014e862d2ddb94059874aae Mon Sep 17 00:00:00 2001 From: laurenwalker Date: Thu, 12 Oct 2017 14:59:13 -0400 Subject: [PATCH 428/560] Make sure the MetacatUI.rootDataPackage.packageModel uploadStatus gets set back to "q" (queued) when there are validation errors preventing it from being saved. Closes #291 --- metacatui/src/main/webapp/js/collections/DataPackage.js | 1 + 1 file changed, 1 insertion(+) diff --git a/metacatui/src/main/webapp/js/collections/DataPackage.js b/metacatui/src/main/webapp/js/collections/DataPackage.js index 5aa56b705..8081070ae 100644 --- a/metacatui/src/main/webapp/js/collections/DataPackage.js +++ b/metacatui/src/main/webapp/js/collections/DataPackage.js @@ -544,6 +544,7 @@ define(['jquery', 'underscore', 'backbone', 'rdflib', "uuid", "md5", return model.get("uploadStatus"); } ), "e") ) { this.packageModel.set("changed", false); + this.packageModel.set("uploadStatus", "q"); this.trigger("cancelSave"); return; } From 9a4b6b52d98ab6f415e7f9b4a49c8dee2b41070f Mon Sep 17 00:00:00 2001 From: laurenwalker Date: Thu, 12 Oct 2017 15:26:22 -0400 Subject: [PATCH 429/560] Change #share routes to #submit Closes #298 --- metacatui/src/main/webapp/js/routers/router.js | 3 ++- metacatui/src/main/webapp/js/templates/about.html | 6 +++--- metacatui/src/main/webapp/js/templates/editMetadata.html | 2 +- metacatui/src/main/webapp/js/templates/insertProgress.html | 2 +- metacatui/src/main/webapp/js/templates/navbar.html | 4 ++-- metacatui/src/main/webapp/js/templates/noResults.html | 2 +- .../src/main/webapp/js/themes/arctic/routers/router.js | 3 ++- .../src/main/webapp/js/themes/arctic/templates/about.html | 6 +++--- .../webapp/js/themes/arctic/templates/insertProgress.html | 2 +- .../main/webapp/js/themes/arctic/templates/mainContent.html | 2 +- .../src/main/webapp/js/themes/arctic/templates/navbar.html | 4 ++-- .../main/webapp/js/themes/arctic/templates/noResults.html | 2 +- metacatui/src/main/webapp/js/themes/goa/routers/router.js | 3 ++- .../src/main/webapp/js/themes/goa/templates/navbar.html | 2 +- .../src/main/webapp/js/themes/knb/templates/about.html | 6 +++--- .../main/webapp/js/themes/knb/templates/mainContent.html | 2 +- .../src/main/webapp/js/themes/knb/templates/navbar.html | 6 +++--- .../src/main/webapp/js/themes/nceas/models/AppModel.js | 2 +- metacatui/src/main/webapp/js/themes/nceas/routers/router.js | 3 ++- metacatui/src/main/webapp/js/views/EditorView.js | 4 ++-- metacatui/src/main/webapp/js/views/NavbarView.js | 2 +- 21 files changed, 36 insertions(+), 32 deletions(-) diff --git a/metacatui/src/main/webapp/js/routers/router.js b/metacatui/src/main/webapp/js/routers/router.js index 08459d77a..01e102268 100644 --- a/metacatui/src/main/webapp/js/routers/router.js +++ b/metacatui/src/main/webapp/js/routers/router.js @@ -26,6 +26,7 @@ function ($, _, Backbone) { "signinsuccess" : "renderSignInSuccess", "signinldaperror" : "renderLdapSignInError", 'share(/*pid)' : 'renderEditor', // registry page + 'submit(/*pid)' : 'renderEditor', // registry page 'quality(/s=:suiteId)(/:pid)' : 'renderMdqRun', // MDQ page 'api(/:anchorId)' : 'renderAPI' // API page }, @@ -139,7 +140,7 @@ function ($, _, Backbone) { package identifier will be queried and then rendered. */ renderEditor: function (pid) { - this.routeHistory.push("share"); + this.routeHistory.push("submit"); if( ! MetacatUI.appView.editorView ){ require(['views/EditorView'], function(EditorView) { diff --git a/metacatui/src/main/webapp/js/templates/about.html b/metacatui/src/main/webapp/js/templates/about.html index 8e6d7f2a1..a44b31009 100644 --- a/metacatui/src/main/webapp/js/templates/about.html +++ b/metacatui/src/main/webapp/js/templates/about.html @@ -46,13 +46,13 @@

                Submitting your data is easy. Here are two ways to get started:

                - + KNB Online Data Registry Form

                On the web

                -

                Upload your data on this website using a simple online form.

                -

                Upload now

                +

                Upload your data on this website using a simple online form.

                +

                Upload now

                diff --git a/metacatui/src/main/webapp/js/templates/editMetadata.html b/metacatui/src/main/webapp/js/templates/editMetadata.html index e919743f9..c3fbf93a5 100644 --- a/metacatui/src/main/webapp/js/templates/editMetadata.html +++ b/metacatui/src/main/webapp/js/templates/editMetadata.html @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/metacatui/src/main/webapp/js/templates/insertProgress.html b/metacatui/src/main/webapp/js/templates/insertProgress.html index 15107d7d5..d80dd7e66 100644 --- a/metacatui/src/main/webapp/js/templates/insertProgress.html +++ b/metacatui/src/main/webapp/js/templates/insertProgress.html @@ -33,7 +33,7 @@

                Thank you for your submission

                -
                Your submission could not be completed. Please try again or +
                Your submission could not be completed. Please try again or contact us at <%=MetacatUI.appModel.get("emailContact")%> for assistance.
                diff --git a/metacatui/src/main/webapp/js/templates/navbar.html b/metacatui/src/main/webapp/js/templates/navbar.html index 1eaee84a6..19cbc5246 100644 --- a/metacatui/src/main/webapp/js/templates/navbar.html +++ b/metacatui/src/main/webapp/js/templates/navbar.html @@ -28,7 +28,7 @@ '
                -
                Your submission could not be completed. Please try again or +
                Your submission could not be completed. Please try again or contact us at <%=MetacatUI.appModel.get("emailContact")%> for assistance.
                diff --git a/metacatui/src/main/webapp/js/themes/arctic/templates/mainContent.html b/metacatui/src/main/webapp/js/themes/arctic/templates/mainContent.html index 192ea91df..484add143 100644 --- a/metacatui/src/main/webapp/js/themes/arctic/templates/mainContent.html +++ b/metacatui/src/main/webapp/js/themes/arctic/templates/mainContent.html @@ -9,7 +9,7 @@

                Store and confidently share.

                Store up to 5GB of data for free. Arctica also supports DOIs to permanently publish your data sets.

                - Share your data + Share your data
                diff --git a/metacatui/src/main/webapp/js/themes/arctic/templates/navbar.html b/metacatui/src/main/webapp/js/themes/arctic/templates/navbar.html index 86b62ae20..a567c404f 100644 --- a/metacatui/src/main/webapp/js/themes/arctic/templates/navbar.html +++ b/metacatui/src/main/webapp/js/themes/arctic/templates/navbar.html @@ -35,12 +35,12 @@
              • History
            • -
            • Submit Data
            • +
            • Submit Data
            • <% if (loggedIn) { %>
          • -
          • Share
          • +
          • Submit
          • Tools
          • <% } else { %> -
          • Sign In
          • +
          • Sign In
          • <% } %>
          diff --git a/metacatui/src/main/webapp/js/themes/nceas/models/AppModel.js b/metacatui/src/main/webapp/js/themes/nceas/models/AppModel.js index 8550f0cf2..46822127a 100644 --- a/metacatui/src/main/webapp/js/themes/nceas/models/AppModel.js +++ b/metacatui/src/main/webapp/js/themes/nceas/models/AppModel.js @@ -66,7 +66,7 @@ define(['jquery', 'underscore', 'backbone'], accountsUrl: null }, - defaultView: "share", + defaultView: "submit", initialize: function() { diff --git a/metacatui/src/main/webapp/js/themes/nceas/routers/router.js b/metacatui/src/main/webapp/js/themes/nceas/routers/router.js index fe833e876..c807f9569 100644 --- a/metacatui/src/main/webapp/js/themes/nceas/routers/router.js +++ b/metacatui/src/main/webapp/js/themes/nceas/routers/router.js @@ -15,7 +15,8 @@ function ($, _, Backbone) { 'signup' : 'renderLdap', // use ldapweb for registration "signinldaperror" : "renderLdapSignInError", 'external(/*url)' : 'renderExternal', // renders the content of the given url in our UI - 'share(/*pid)' : 'renderEditor' // metadata Editor + 'share(/*pid)' : 'renderEditor', // metadata Editor + 'submit(/*pid)' : 'renderEditor' // metadata Editor }, initialize: function(){ diff --git a/metacatui/src/main/webapp/js/views/EditorView.js b/metacatui/src/main/webapp/js/views/EditorView.js index 4d853bb02..13d96840c 100644 --- a/metacatui/src/main/webapp/js/views/EditorView.js +++ b/metacatui/src/main/webapp/js/views/EditorView.js @@ -479,7 +479,7 @@ define(['underscore', if(savedObject.type != "DataPackage") return; //Change the URL to the new id - MetacatUI.uiRouter.navigate("#share/" + this.model.get("id"), { trigger: false, replace: true }); + MetacatUI.uiRouter.navigate("#submit/" + this.model.get("id"), { trigger: false, replace: true }); this.toggleControls(); @@ -572,7 +572,7 @@ define(['underscore', view.model = null; //Update the URL - MetacatUI.uiRouter.navigate("#share/" + view.pid, { trigger: false, replace: true }); + MetacatUI.uiRouter.navigate("#submit/" + view.pid, { trigger: false, replace: true }); //Render the new model view.render(); diff --git a/metacatui/src/main/webapp/js/views/NavbarView.js b/metacatui/src/main/webapp/js/views/NavbarView.js index 195993eab..364bf8f0a 100644 --- a/metacatui/src/main/webapp/js/views/NavbarView.js +++ b/metacatui/src/main/webapp/js/views/NavbarView.js @@ -96,7 +96,7 @@ define(['jquery', 'underscore', 'backbone', 'views/SignInView', 'text!templates/ MetacatUI.appView.showView(MetacatUI.appView.registryView); //Otherwise, just navigate to it else - MetacatUI.uiRouter.navigate("share", { trigger: true }); + MetacatUI.uiRouter.navigate("submit", { trigger: true }); }, hideDropdown: function(){ From 71df20cb0e0f8caed309915c4d1e04748dd9fa41 Mon Sep 17 00:00:00 2001 From: laurenwalker Date: Thu, 12 Oct 2017 15:27:45 -0400 Subject: [PATCH 430/560] Started some changes to KNB styling for the Editor Related to #278 --- metacatui/src/main/webapp/css/metacatui-common.css | 5 +++++ metacatui/src/main/webapp/js/themes/knb/css/metacatui.css | 6 ++++++ 2 files changed, 11 insertions(+) diff --git a/metacatui/src/main/webapp/css/metacatui-common.css b/metacatui/src/main/webapp/css/metacatui-common.css index e316fbcd2..1aeb74fe9 100644 --- a/metacatui/src/main/webapp/css/metacatui-common.css +++ b/metacatui/src/main/webapp/css/metacatui-common.css @@ -3199,6 +3199,11 @@ Editor View height: 15px; margin-bottom: 5px; } +.editor-view { + margin: 0px; + width: 100%; + max-width: 100%; +} .Editor #Content { padding-top: 70px; max-width: 100%; diff --git a/metacatui/src/main/webapp/js/themes/knb/css/metacatui.css b/metacatui/src/main/webapp/js/themes/knb/css/metacatui.css index 7bcbaa684..f781643cb 100644 --- a/metacatui/src/main/webapp/js/themes/knb/css/metacatui.css +++ b/metacatui/src/main/webapp/js/themes/knb/css/metacatui.css @@ -173,7 +173,13 @@ div.row-fluid > a[name] { margin: 35px auto auto auto; } + +/* Editor +-------------------------------------------------- */ +.Editor #Content { + padding-top: 0px; +} /* MDQ -------------------------------------------------- */ From 79bd1a4486bdcbfa06c6413199128722fb082ead Mon Sep 17 00:00:00 2001 From: laurenwalker Date: Mon, 16 Oct 2017 17:49:48 -0400 Subject: [PATCH 431/560] Merge changes from 1.14 branch to the profile view, and add some minor adjustments/fixes --- .../src/main/webapp/css/metacatui-common.css | 34 ++- .../src/main/webapp/js/models/AppModel.js | 2 +- .../src/main/webapp/js/models/NodeModel.js | 7 + metacatui/src/main/webapp/js/models/Stats.js | 220 +++++++++++++++- .../src/main/webapp/js/templates/profile.html | 66 +++-- .../webapp/js/themes/arctic/css/metacatui.css | 1 + .../js/themes/arctic/models/AppModel.js | 2 +- .../js/themes/dataone/css/metacatui.css | 1 + .../js/themes/default/css/metacatui.css | 2 +- .../main/webapp/js/views/CircleBadgeView.js | 40 ++- .../main/webapp/js/views/DataCatalogView.js | 2 +- .../src/main/webapp/js/views/LineChartView.js | 69 +++-- .../src/main/webapp/js/views/StatsView.js | 238 +++++++++++++++++- .../src/main/webapp/js/views/UserView.js | 25 +- 14 files changed, 639 insertions(+), 70 deletions(-) diff --git a/metacatui/src/main/webapp/css/metacatui-common.css b/metacatui/src/main/webapp/css/metacatui-common.css index 1aeb74fe9..a1f9e24df 100644 --- a/metacatui/src/main/webapp/css/metacatui-common.css +++ b/metacatui/src/main/webapp/css/metacatui-common.css @@ -2420,6 +2420,13 @@ address.email-container:before{ stroke: #CCC; fill: #CCC; } +.profile .circle-badge circle.no-activity{ + stroke: #CCC; + fill: transparent; +} +.profile .circle-badge text.no-activity{ + fill: #CCC; +} .profile .chart-title{ float: left; } @@ -2430,14 +2437,22 @@ address.email-container:before{ } .profile .stripe{ clear: both; + min-height: 200px; +} +.profile .chart-title{ + height: 100%; } .profile .chart-title.uploads{ width: 100%; } +.profile .quick-stats, +.profile .quick-stats .badge-container{ + height: 280px; +}s .profile .downloads .chart-title, .profile .uploads .chart-title{ width: 100%; - min-width: 300px; + min-width: 250px; } .profile #downloads-title, .profile #uploads-title{ @@ -2455,9 +2470,25 @@ address.email-container:before{ padding-bottom: 20px; padding-top: 20px; } +.profile .packages p { + color: #333; +} +.no-activity .profile .packages p{ + color: inherit; +} .temporal-coverage-chart{ width: calc(100% - 300px); } +.profile .circle-badge circle{ + fill: transparent; +} +.profile .quick-stats .circle-badge .count{ + font-size: 27px; +} +.profile .quick-stats .circle-badge .title{ + font-size: 18px; +} + /**** Bar Charts ******/ .bar-chart .bar-label.bg{ fill: rgba(0,0,0,0.8); @@ -3131,6 +3162,7 @@ input.subtle:focus .jump-width-input{ transition: width 1000s; } +.nav .input-submit{ margin-left: 10px; height: 1em; diff --git a/metacatui/src/main/webapp/js/models/AppModel.js b/metacatui/src/main/webapp/js/models/AppModel.js index 9bd4d9cf4..f220caa53 100644 --- a/metacatui/src/main/webapp/js/models/AppModel.js +++ b/metacatui/src/main/webapp/js/models/AppModel.js @@ -130,7 +130,7 @@ define(['jquery', 'underscore', 'backbone'], } if(typeof this.get("d1LogServiceUrl") != "undefined") - this.set('d1LogServiceUrl', this.get('d1CNBaseUrl') + this.get('d1CNService') + '/query/logsolr/'); + this.set('d1LogServiceUrl', this.get('d1CNBaseUrl') + this.get('d1CNService') + '/query/logsolr/?'); this.set("nodeServiceUrl", this.get("d1CNBaseUrl") + this.get("d1CNService") + "/node/"); this.set('resolveServiceUrl', this.get('d1CNBaseUrl') + this.get('d1CNService') + '/resolve/'); diff --git a/metacatui/src/main/webapp/js/models/NodeModel.js b/metacatui/src/main/webapp/js/models/NodeModel.js index 8b41d9e40..18702b59a 100644 --- a/metacatui/src/main/webapp/js/models/NodeModel.js +++ b/metacatui/src/main/webapp/js/models/NodeModel.js @@ -173,6 +173,13 @@ define(['jquery', 'underscore', 'backbone'], } }); + }, + + /* + * Returns true if the given nodeId is a Coordinating Node + */ + isCN: function(nodeId){ + return _.findWhere(this.get("coordinators"), { identifier: nodeId }); } }); diff --git a/metacatui/src/main/webapp/js/models/Stats.js b/metacatui/src/main/webapp/js/models/Stats.js index f84fd9556..3b17bcdaa 100644 --- a/metacatui/src/main/webapp/js/models/Stats.js +++ b/metacatui/src/main/webapp/js/models/Stats.js @@ -12,6 +12,7 @@ define(['jquery', 'underscore', 'backbone', 'models/LogsSearch'], metadataCount: 0, dataCount: 0, + totalCount: 0, metadataFormatIDs: [], //Uses same structure as Solr facet counts: ["text/csv", 5] dataFormatIDs: [], //Uses same structure as Solr facet counts: ["text/csv", 5] @@ -22,6 +23,11 @@ define(['jquery', 'underscore', 'backbone', 'models/LogsSearch'], metadataUploadDates: null, dataUploadDates: null, + //Number of updates to content for each time period + firstUpdate: 0, + dataUpdateDates: null, + metadataUpdateDates: null, + downloads: 0, metadataDownloads: null, dataDownloads: null, @@ -91,12 +97,16 @@ define(['jquery', 'underscore', 'backbone', 'models/LogsSearch'], this.listenToOnce(this, 'change:lastEndDate', this.getCollectionYearFacets); this.listenToOnce(this, 'change:dataCount', this.getDataFormatIDs); this.listenToOnce(this, 'change:metadataCount', this.getMetadataFormatIDs); + this.listenToOnce(this, 'change:firstUpload', this.getUpdateDates); this.getFirstBeginDate(); + this.getFirstUpload(); + this.getFormatTypes(); - this.getUploads(); + this.getDownloadDates(); + this.getMdqStatsTotal(); //this.getDataDownloadDates(); //this.getMetadataDownloadDates(); @@ -229,6 +239,8 @@ define(['jquery', 'underscore', 'backbone', 'models/LogsSearch'], "&group=true" + "&group.field=formatType" + "&group.limit=0" + + "&stats=true" + + "&stats.field=size" + "&sort=formatType%20desc" + "&wt=json"; @@ -258,6 +270,8 @@ define(['jquery', 'underscore', 'backbone', 'models/LogsSearch'], //Store falsey data model.set('dataCount', 0); model.set('metadataCount', 0); + model.set("totalCount", 0); + model.trigger("change:totalCount"); model.set('metadataFormatIDs', ["", 0]); model.set('dataFormatIDs', ["", 0]); @@ -268,6 +282,10 @@ define(['jquery', 'underscore', 'backbone', 'models/LogsSearch'], model.set('metadataCount', formats[0].doclist.numFound); model.set('dataCount', formats[1].doclist.numFound); } + + //Get the total size of all the files in the index + var totalSize = data.stats.stats_fields.size.sum; + model.set("totalSize", totalSize); } } @@ -329,11 +347,192 @@ define(['jquery', 'underscore', 'backbone', 'models/LogsSearch'], } }, + /* + * getUpdateDates will get the number of newest-version science metadata and data + * objects uploaded in each month + */ + getUpdateDates: function(){ + + //If the node model hasn't been retrieved yet, then wait - because we need to know + //if the first update date should be based on the DataONE time frame (started in 2012) + //or a metacat timeframe (as early as 2001) + if( !MetacatUI.nodeModel.get("coordinators").length ){ + this.listenToOnce(MetacatUI.nodeModel, "change:coordinators", this.getUpdateDates); + return; + } + + // If there has never been an update, there are no dates to get + if( !this.get("firstUpload") ){ + this.set('firstUpdate', null); + + this.set("metadataUpdateDates", []); + this.set("dataUpdateDates", []); + + return; + } + + var model = this; + + var now = new Date(); + + var dataQuery = "q=" + model.get('query') + + "+-obsoletedBy:*+formatType:DATA"; + + var metadataQuery = "q=" + model.get('query') + + "+-obsoletedBy:*+formatType:METADATA"; + + var firstPossibleUpdate = MetacatUI.nodeModel.isCN(MetacatUI.nodeModel.get("currentMemberNode"))? + this.firstPossibleDataONEDate : model.get("firstUpload"); + + var facets = "&rows=1" + + "&sort=dateUploaded+asc" + + "&facet=true" + + "&facet.missing=true" + //Include months that have 0 uploads + "&facet.limit=-1" + + "&facet.range=dateUploaded" + + "&facet.range.start=" + firstPossibleUpdate + + "&facet.range.end=" + now.toISOString() + + "&facet.range.gap=%2B1MONTH" + + "&wt=json"; + + //Run the query + var requestSettings = { + url: MetacatUI.appModel.get('queryServiceUrl') + metadataQuery + facets, + dataType: "json", + type: "GET", + success: function(data, textStatus, xhr) { + + if( !data.response.numFound ){ + model.set('firstUpdate', null); + + model.set("metadataUpdateDates", []); + + } + else{ + // Save the earliest dateUploaded and total found in our model + model.set('firstUpdate', data.response.docs[0].dateUploaded); + + //Remove all the empty facet counts at the beginning of the array + var updateDates = data.facet_counts.facet_ranges.dateUploaded.counts; + + while(updateDates[1] == 0){ + + updateDates.splice(0, 2); + + } + + //Save the dateUploaded facets for metadata objects + model.set("metadataUpdateDates", updateDates); + } + + var requestSettings = { + url: MetacatUI.appModel.get('queryServiceUrl') + dataQuery + facets, + type: 'GET', + dataType: "json", + success: function(data, textStatus, xhr) { + if( !data.response.numFound ){ + model.set("dataUpdateDates", []); + } + else{ + + // Save the earliest dateUploaded and total found in our model + if(data.response.docs[0].dateUploaded < model.set("firstUpdate")) + model.set('firstUpdate', data.response.docs[0].dateUploaded); + + //Remove all the empty facet counts at the beginning of the array + var updateDates = data.facet_counts.facet_ranges.dateUploaded.counts; + + while(updateDates[1] == 0){ + + updateDates.splice(0, 2); + + } + + //Save the dateUploaded facets for data objects + model.set("dataUpdateDates", updateDates); + } + } + } + + $.ajax(_.extend(requestSettings, MetacatUI.appUserModel.createAjaxSettings())); + } + } + + $.ajax(_.extend(requestSettings, MetacatUI.appUserModel.createAjaxSettings())); + + }, + + /* + * Gets the earliest dateUploaded from the solr index + */ + getFirstUpload: function(){ + //If the node model hasn't been retrieved yet, then wait - because we need to know + //if the first update date should be based on the DataONE time frame (started in 2012) + //or a metacat timeframe (as early as 2001) + if( !MetacatUI.nodeModel.get("coordinators").length ){ + this.listenToOnce(MetacatUI.nodeModel, "change:coordinators", this.getFirstUpload); + return; + } + + var now = new Date(), + model = this, + firstPossibleUpload = MetacatUI.nodeModel.isCN(MetacatUI.appModel.get("nodeId") || MetacatUI.nodeModel.get("currentMemberNode"))? + this.firstPossibleDataONEDate : this.firstPossibleUpload; + + //Get the earliest upload date + var query = "q=" + this.get('query') + + "+formatType:(METADATA OR DATA)" + //Weeds out resource maps and annotations + "+dateUploaded:[" + firstPossibleUpload + "%20TO%20" + now.toISOString() + "]" + //Weeds out badly formatted dates + "+-obsoletes:*"+ //Only count one version of a revision chain + "&fl=dateUploaded" + + "&rows=1" + + "&sort=dateUploaded+asc" + + "&wt=json"; + + //Run the query + var requestSettings = { + url: MetacatUI.appModel.get('queryServiceUrl') + query, + type: "GET", + dataType: "json", + success: function(data, textStatus, xhr) { + if(!data.response.numFound){ + //Save some falsey values if none are found + model.set('totalUploads', 0); + model.trigger("change:totalUploads"); + + model.set('firstUpload', null); + + model.set("dataUploads", 0); + model.set("metadataUploads", 0); + model.set('metadataUploadDates', []); + model.set('dataUploadDates', []); + } + else{ + // Save the earliest dateUploaded and total found in our model + model.set('firstUpload', data.response.docs[0].dateUploaded); + model.set('totalUploads', data.response.numFound); + + //model.getUploadDates(); + } + } + } + + $.ajax(_.extend(requestSettings, MetacatUI.appUserModel.createAjaxSettings())); + + }, + /** * getUploads will get the files uploaded statistics */ getUploads: function() { + if( !this.get("firstUpload") ){ + this.set('totalUploads', 0); + this.trigger("change:totalUploads"); + + return; + } + var model = this; var now = new Date(); @@ -555,7 +754,11 @@ define(['jquery', 'underscore', 'backbone', 'models/LogsSearch'], */ getDataDownloadDates: function(){ - if(!MetacatUI.appModel.get("d1LogServiceUrl")) return; + if(!MetacatUI.appModel.get("d1LogServiceUrl")){ + this.set("downloads", 0); + this.trigger("change:downloads"); + return; + } var model = this; @@ -589,7 +792,12 @@ define(['jquery', 'underscore', 'backbone', 'models/LogsSearch'], }, getMetadataDownloadDates: function(){ - if(!MetacatUI.appModel.get("d1LogServiceUrl")) return; + if(!MetacatUI.appModel.get("d1LogServiceUrl")){ + this.set("downloads", 0); + this.trigger("change:downloads"); + + return; + } var model = this; @@ -624,7 +832,11 @@ define(['jquery', 'underscore', 'backbone', 'models/LogsSearch'], }, getDownloadDates: function(){ - if(!MetacatUI.appModel.get("d1LogServiceUrl")) return; + if(!MetacatUI.appModel.get("d1LogServiceUrl")){ + this.set("downloads", 0); + this.trigger("change:downloads"); + return; + } var model = this; diff --git a/metacatui/src/main/webapp/js/templates/profile.html b/metacatui/src/main/webapp/js/templates/profile.html index 96781ba57..18ad067bd 100644 --- a/metacatui/src/main/webapp/js/templates/profile.html +++ b/metacatui/src/main/webapp/js/templates/profile.html @@ -4,24 +4,41 @@

          <%=title%>

          <% if(typeof description == "string"){ %>

          <%=description%>

          <% } %> -
          -
          -
          -

          Metadata quality metrics

          -

          A summary of the MDQ scores are included below

          -
          -
          +
          +
          +
          +
          +
          +

          + The total number of publicly-available metadata records. + Only the latest version of each metadata record is counted. + A "dataset" here is defined by a single metadata record which + may be packaged with one or more data files. +

          +
          +
          +
          +
          +
          +

          + The sum of all publicly-available metadata and data files + in this repository. Only the latest version of each file is + included. +

          +
          -
          -
          -

          Downloads

          -

          The number of individual metadata and data files downloaded over time. These download counts are partially - COUNTER compliant, meaning that downloads from some Internet robots and - repeat downloads within a certain time window are excluded.

          +
          +
          +
          +

          Downloads

          +

          The number of individual metadata and data files downloaded over time. These download counts are partially + COUNTER compliant, meaning that downloads from some Internet robots and + repeat downloads within a certain time window are excluded.

          +
          @@ -29,13 +46,14 @@

          Downloads

          -
          -
          -

          Uploads

          -

          The number of individual metadata and data files uploaded over time. Only the most recent version of each file is counted.

          +
          +

          Latest Updates

          +

          When datasets were last updated, separated by content type (science metadata or data).

          +
          +
          + +
          -
          -
          @@ -64,5 +82,15 @@

          Time period of data

          +
          \ No newline at end of file diff --git a/metacatui/src/main/webapp/js/themes/arctic/css/metacatui.css b/metacatui/src/main/webapp/js/themes/arctic/css/metacatui.css index 101a302b0..072fb95e6 100644 --- a/metacatui/src/main/webapp/js/themes/arctic/css/metacatui.css +++ b/metacatui/src/main/webapp/js/themes/arctic/css/metacatui.css @@ -1003,6 +1003,7 @@ svg .packages, .profile .packages{ color: #146660; fill: #146660; + stroke: #146660; } .profile .bar-label.packages{ fill: inherit; diff --git a/metacatui/src/main/webapp/js/themes/arctic/models/AppModel.js b/metacatui/src/main/webapp/js/themes/arctic/models/AppModel.js index ed60a1182..1c3144e6c 100644 --- a/metacatui/src/main/webapp/js/themes/arctic/models/AppModel.js +++ b/metacatui/src/main/webapp/js/themes/arctic/models/AppModel.js @@ -106,7 +106,7 @@ define(['jquery', 'underscore', 'backbone'], this.set('viewServiceUrl', this.get('baseUrl') + this.get('context') + this.get('d1Service') + '/views/metacatui/'); this.set('publishServiceUrl', this.get('baseUrl') + this.get('context') + this.get('d1Service') + '/publish/'); this.set('authServiceUrl', this.get('baseUrl') + this.get('context') + this.get('d1Service') + '/isAuthorized/'); - this.set('queryServiceUrl', this.get('baseUrl') + this.get('context') + this.get('d1Service') + '/query/solr/'); + this.set('queryServiceUrl', this.get('baseUrl') + this.get('context') + this.get('d1Service') + '/query/solr/?'); this.set('metaServiceUrl', this.get('baseUrl') + this.get('context') + this.get('d1Service') + '/meta/'); this.set('objectServiceUrl', this.get('baseUrl') + this.get('context') + this.get('d1Service') + '/object/'); this.set('registryServiceUrl', this.get('baseUrl') + this.get('context') + '/cgi-bin/register-dataset.cgi'); diff --git a/metacatui/src/main/webapp/js/themes/dataone/css/metacatui.css b/metacatui/src/main/webapp/js/themes/dataone/css/metacatui.css index 1691722ca..9162030b3 100644 --- a/metacatui/src/main/webapp/js/themes/dataone/css/metacatui.css +++ b/metacatui/src/main/webapp/js/themes/dataone/css/metacatui.css @@ -1728,6 +1728,7 @@ svg .packages, .profile .packages{ color: #FF6633; fill: #FF6633; + stroke: #FF6633; } .profile .bar-label.packages{ diff --git a/metacatui/src/main/webapp/js/themes/default/css/metacatui.css b/metacatui/src/main/webapp/js/themes/default/css/metacatui.css index ca9dc5db2..fdc047a89 100644 --- a/metacatui/src/main/webapp/js/themes/default/css/metacatui.css +++ b/metacatui/src/main/webapp/js/themes/default/css/metacatui.css @@ -1472,7 +1472,7 @@ li.ui-menu-item > a:hover, } .mapMode #results-container { width: 40%; - width: calc(100% - 33% - 229px); + width: calc(66.66% - 227px); overflow-x: hidden; overflow-y: scroll; -webkit-transform: translate3d(0,0,1); diff --git a/metacatui/src/main/webapp/js/views/CircleBadgeView.js b/metacatui/src/main/webapp/js/views/CircleBadgeView.js index 0f5801425..acc5b27c9 100644 --- a/metacatui/src/main/webapp/js/views/CircleBadgeView.js +++ b/metacatui/src/main/webapp/js/views/CircleBadgeView.js @@ -32,6 +32,8 @@ define(['jquery', 'underscore', 'backbone', 'd3'], this.useGlobalR = options.useGlobalR || false; this.className = options.className || ""; this.margin = options.margin || 20; + this.titlePlacement = options.titlePlacement || null; + this.height = options.height || null; }, // http://stackoverflow.com/questions/9651167/svg-not-rendering-properly-as-a-backbone-view @@ -123,6 +125,9 @@ define(['jquery', 'underscore', 'backbone', 'd3'], var svg = d3.select(this.el) .attr("class", "circle-badge " + this.className); + if(this.height) + svg.attr("height", this.height); + //Draw the circles var circle = svg.selectAll("circle") .data(this.data) @@ -166,20 +171,39 @@ define(['jquery', 'underscore', 'backbone', 'd3'], .selectAll("text") .data(this.data) .enter().append("svg:text") - .text(function(d){ return MetacatUI.appView.commaSeparateNumber(d.count) || 0; }) + .text(function(d){ return typeof d.count == "string" ? d.count : MetacatUI.appView.commaSeparateNumber(d.count) || 0; }) .attr("transform", function(d, i){ - return "translate(" + d.x + "," + (d.r+12) + ")"; + + var y = (viewRef.titlePlacement == "inside")? d.r-12 : d.r+12; + + return "translate(" + d.x + "," + y + ")"; }) .attr("class", function(d){ return d.className + " count"; }) .attr("text-anchor", "middle"); if(this.title){ - //Draw the title next to the circles at the end - svg.append("text") - .text(this.title) - .attr("class", "title") - .attr("transform", function(d, i){ return "translate(" + (viewRef.data[viewRef.data.length-1].x + viewRef.data[viewRef.data.length-1].r + viewRef.margin) + "," + (viewRef.data[viewRef.data.length-1].r + 5) + ")"; }) - .attr("text-anchor", "left"); + + if(this.titlePlacement == "inside"){ + + //Draw the title next to the circles at the end + var title = svg.append("text") + .data(this.data) + .text(this.title) + .attr("class", "title") + .attr("text-anchor", "middle") + .attr("transform", function(d, i){ + return "translate(" + d.x + "," + (d.r + 30) + ")"; + }); + + } + else{ + //Draw the title next to the circles at the end + svg.append("text") + .text(this.title) + .attr("class", "title") + .attr("transform", function(d, i){ return "translate(" + (viewRef.data[viewRef.data.length-1].x + viewRef.data[viewRef.data.length-1].r + viewRef.margin) + "," + (viewRef.data[viewRef.data.length-1].r + 5) + ")"; }) + .attr("text-anchor", "left"); + } } return this; diff --git a/metacatui/src/main/webapp/js/views/DataCatalogView.js b/metacatui/src/main/webapp/js/views/DataCatalogView.js index 289db1911..09215a34c 100644 --- a/metacatui/src/main/webapp/js/views/DataCatalogView.js +++ b/metacatui/src/main/webapp/js/views/DataCatalogView.js @@ -2668,7 +2668,7 @@ define(['jquery', this.$results.html('

          No results found.

          '); if(MetacatUI.theme == "arctic"){ //When we get new results, check if the user is searching for their own datasets and display a message - if((MetacatUI.appView.dataCatalogView.searchModel.getQuery() == MetacatUI.appUserModel.get("searchModel").getQuery()) && !MetacatUI.appSearchResults.length){ + if((MetacatUI.appView.dataCatalogView && MetacatUI.appView.dataCatalogView.searchModel.getQuery() == MetacatUI.appUserModel.get("searchModel").getQuery()) && !MetacatUI.appSearchResults.length){ $("#no-results-found").after("

          Where are my data sets?

          If you are a previous ACADIS Gateway user, " + "you will need to take additional steps to access your data sets in the new NSF Arctic Data Center." + "Send us a message at support@arcticdata.io with your old ACADIS " + diff --git a/metacatui/src/main/webapp/js/views/LineChartView.js b/metacatui/src/main/webapp/js/views/LineChartView.js index 9da7fa674..398126b00 100644 --- a/metacatui/src/main/webapp/js/views/LineChartView.js +++ b/metacatui/src/main/webapp/js/views/LineChartView.js @@ -44,11 +44,11 @@ define(['jquery', 'underscore', 'backbone', 'd3'], this.frequency = options.frequency || 1; //Use 0 to not add any points if(!options.data) this.frequency = 0; //If no data is provided, do not draw any points (otherwise, one point at 0,0 will be drawn) this.yLabel = options.yLabel || ""; - this.labelValue = options.labelValue || "Value: "; - this.labelWidth = options.labelWidth || 130; + this.labelValue = options.labelValue || ""; + this.labelWidth = options.labelWidth || (this.labelValue.length * 7) + (this.yLabel.length * 7) + 60; this.radius = options.radius || 6; this.width = options.width || 650; - this.height = options.height || 250; + this.height = options.height || 300; this.formatFromSolrFacets = options.formatFromSolrFacets || false; this.cumulative = options.cumulative || false; @@ -112,7 +112,7 @@ define(['jquery', 'underscore', 'backbone', 'd3'], if(!this.data) return this; - var margin = {top: 20, right: 50, bottom: 30, left: 80}; + var margin = {top: 20, right: 50, bottom: 50, left: 80}; this.margin = margin; this.width = this.width - margin.left - margin.right; this.height = this.height - margin.top - margin.bottom; @@ -120,27 +120,42 @@ define(['jquery', 'underscore', 'backbone', 'd3'], var min = d3.min(this.data, function(d) { return d.count; }), max = d3.max(this.data, function(d) { return d.count; }), difference = max - min; + + //Format the data + this.data.forEach(function(d) { + d.date = viewRef.parseDate(d.date); + d.count = +d.count; + }); + //Set the y scale /*if((difference > 30000) || ((min < 10) && (difference > 10000))){ this.y = d3.scale.log() - .range([this.height, 0]); + .range([this.height, 0]) + .domain([1, max]); + var log = true; this.className += " log-scale"; } else{*/ this.y = d3.scale.linear() - .range([this.height, 0]); + .range([this.height, 0]) + .domain([0, max]); var log = false; //} - this.x = d3.time.scale().range([0, this.width]); - + //Set the x scale + this.x = d3.time.scale() + .range([0, this.width]) + .domain(d3.extent(this.data, function(d) { return d.date; })); + + //Set up the x axis var xAxis = d3.svg.axis() .scale(this.x) .orient("bottom") .ticks(this.xTicks) .tickFormat(this.xTickFormat); + //Set up the y axis var yAxis = d3.svg.axis() .scale(this.y) .orient("left") @@ -155,15 +170,6 @@ define(['jquery', 'underscore', 'backbone', 'd3'], .attr("height", this.height + margin.top + margin.bottom) .append("g") .attr("transform", "translate(" + margin.left + "," + margin.top + ")"); - - this.data.forEach(function(d) { - d.date = viewRef.parseDate(d.date); - d.count = +d.count; - }); - - this.x = this.x.domain(d3.extent(this.data, function(d) { return d.date; })); - if(log) this.y = this.y.domain([1, max]); //y axis is always 1 - max y value - else this.y = this.y.domain([0, max]); /* * ======================================================================== @@ -179,6 +185,12 @@ define(['jquery', 'underscore', 'backbone', 'd3'], .attr("class", "y axis") .call(yAxis); + svg.selectAll(".x.axis .tick text") + .style("text-anchor", 'end') + .attr("dx", "-.8em") + .attr("dy", ".15em") + .attr("transform", "rotate(-65)"); + /* * ======================================================================== * Draw the y-axis title @@ -202,7 +214,6 @@ define(['jquery', 'underscore', 'backbone', 'd3'], var line = d3.svg.line() .x(function(d) { return viewRef.x(d.date); }) .y(function(d) { return viewRef.y(d.count); }); - //.interpolate("linear"); svg.append("path") @@ -382,7 +393,7 @@ define(['jquery', 'underscore', 'backbone', 'd3'], //Don't let our label bleed off the edge if(xPos < 0) xPos = xPos + labelWidth; - return xPos + labelXPadding;; }) + return xPos + labelXPadding; }) .attr("y", function(d, i){ var yPos = viewRef.y(d.count) + viewRef.radius; //Don't let our label bleed off the edge @@ -397,7 +408,7 @@ define(['jquery', 'underscore', 'backbone', 'd3'], labels.append("text") .text(function(d, i){ - return viewRef.labelValue + MetacatUI.appView.commaSeparateNumber(d.count); + return viewRef.labelValue + MetacatUI.appView.commaSeparateNumber(d.count) + " " + viewRef.yLabel; }) .attr("x", function(d, i){ var xPos = viewRef.x(d.date) - (labelWidth/2); @@ -443,15 +454,23 @@ define(['jquery', 'underscore', 'backbone', 'd3'], //Format the data for a cumulative time series chart //We will take only the first 10 characters of the date //To make it a cumulative chart, we will keep adding to the count - var uploadData = []; - var lastCount = 0; + var newData = []; + var totalCount = 0; + for(var i=0; i < counts.length; i+=2){ - uploadData.push({date: counts[i].substr(0, 10), count: lastCount + counts[i+1]}); - if(this.cumulative) lastCount += counts[i+1]; + if(this.cumulative) + totalCount += counts[i+1]; + else + totalCount = counts[i+1]; + + newData.push({ + date: counts[i].substr(0, 10), + count: totalCount + }); } - return uploadData; + return newData; } }); diff --git a/metacatui/src/main/webapp/js/views/StatsView.js b/metacatui/src/main/webapp/js/views/StatsView.js index 741308268..7933e20f4 100644 --- a/metacatui/src/main/webapp/js/views/StatsView.js +++ b/metacatui/src/main/webapp/js/views/StatsView.js @@ -30,21 +30,27 @@ define(['jquery', 'underscore', 'backbone', 'd3', 'LineChart', 'BarChart', 'Donu //Only trigger the functions that draw SVG charts if d3 loaded correctly if(d3){ - this.listenTo(MetacatUI.statsModel, 'change:dataUploadDates', this.drawUploadChart); + //this.listenTo(MetacatUI.statsModel, 'change:dataUploadDates', this.drawUploadChart); this.listenTo(MetacatUI.statsModel, 'change:temporalCoverage', this.drawCoverageChart); this.listenTo(MetacatUI.statsModel, 'change:metadataDownloadDates', this.drawDownloadsChart); this.listenTo(MetacatUI.statsModel, 'change:dataDownloadDates', this.drawDownloadsChart); this.listenTo(MetacatUI.statsModel, 'change:downloadDates', this.drawDownloadsChart); + this.listenTo(MetacatUI.statsModel, "change:dataUpdateDates", this.drawUpdatesChart); + this.listenTo(MetacatUI.statsModel, "change:totalSize", this.drawTotalSize); + this.listenTo(MetacatUI.statsModel, 'change:metadataCount', this.drawTotalCount); + this.listenTo(MetacatUI.statsModel, 'change:dataFormatIDs', this.drawDataCountChart); + this.listenTo(MetacatUI.statsModel, 'change:metadataFormatIDs', this.drawMetadataCountChart); + + //this.listenTo(MetacatUI.statsModel, 'change:dataUploads', this.drawUploadTitle); } - this.listenTo(MetacatUI.statsModel, 'change:dataUploads', this.drawUploadTitle); this.listenTo(MetacatUI.statsModel, 'change:downloads', this.drawDownloadTitle); - this.listenTo(MetacatUI.statsModel, 'change:dataFormatIDs', this.drawDataCountChart); - this.listenTo(MetacatUI.statsModel, 'change:metadataFormatIDs', this.drawMetadataCountChart); this.listenTo(MetacatUI.statsModel, 'change:lastEndDate', this.drawCoverageChartTitle); // mdq this.listenTo(MetacatUI.statsModel, 'change:mdqStats', this.drawMdqStats); + + this.listenTo(MetacatUI.statsModel, "change:totalCount", this.showNoActivity); // set the header type MetacatUI.appModel.set('headerType', 'default'); @@ -177,6 +183,41 @@ define(['jquery', 'underscore', 'backbone', 'd3', 'LineChart', 'BarChart', 'Donu this.$('.format-charts-metadata').html(donut.render().el); }, + drawFirstUpload: function(){ + + var className = ""; + + if( !MetacatUI.statsModel.get("firstUpload") ){ + var chartData = [{ + count: "N/A", + className: "packages no-activity" + }]; + } + else{ + var firstUpload = new Date(MetacatUI.statsModel.get("firstUpload")), + readableDate = firstUpload.toDateString(); + + readableDate = readableDate.substring(readableDate.indexOf(" ") + 1); + + var chartData = [{ + count: readableDate, + className: "packages" + }]; + } + + //Create the circle badge + var dateBadge = new CircleBadge({ + id: "first-upload-badge", + data: chartData, + title: "first upload", + titlePlacement: "inside", + useGlobalR: true, + globalR: 100 + }); + + this.$("#first-upload").html(dateBadge.render().el); + }, + //drawUploadChart will get the upload stats from the stats model and draw a time series cumulative chart drawUploadChart: function(){ //Get the width of the chart by using the parent container width @@ -310,6 +351,151 @@ define(['jquery', 'underscore', 'backbone', 'd3', 'LineChart', 'BarChart', 'Donu this.$('#uploads-title').prepend(uploadChartTitle.render().el); }, + /* + * drawTotalCount - draws a simple count of total metadata files/datasets + */ + drawTotalCount: function(){ + + var className = ""; + + if( !MetacatUI.statsModel.get("metadataCount") && !MetacatUI.statsModel.get("dataCount") ) + className += " no-activity"; + + var chartData = [{ + count: MetacatUI.statsModel.get("metadataCount"), + className: "packages" + className + }]; + + //Create the circle badge + var countBadge = new CircleBadge({ + id: "total-datasets-title", + data: chartData, + title: "datasets", + titlePlacement: "inside", + useGlobalR: true, + globalR: 100, + height: 220 + }); + + this.$('#total-datasets').html(countBadge.render().el); + }, + + /* + * drawTotalSize draws a CircleBadgeView with the total file size of + * all current metadata and data files + */ + drawTotalSize: function(){ + + if( !MetacatUI.statsModel.get("totalSize") ){ + var chartData = [{ + count: "0 bytes", + className: "packages no-activity" + }]; + + } + else{ + var chartData = [{ + count: this.bytesToSize( MetacatUI.statsModel.get("totalSize") ), + className: "packages" + }]; + } + + //Create the circle badge + var sizeBadge = new CircleBadge({ + id: "total-size-title", + data: chartData, + title: "of content", + titlePlacement: "inside", + useGlobalR: true, + globalR: 100, + height: 220 + }); + + this.$('#total-size').html(sizeBadge.render().el); + }, + + /* + * drawUpdatesChart - draws a line chart representing the latest updates over time + */ + drawUpdatesChart: function(){ + + //If there was no first upload, draw a blank chart and exit + if(!MetacatUI.statsModel.get('firstUpdate')){ + + var lineChartView = new LineChart( + { id: "updates-chart", + yLabel: "files updated", + frequency: 0, + cumulative: false, + width: this.$('.metadata-updates-chart').width() + }); + + this.$('.metadata-updates-chart').html(lineChartView.render().el); + + return; + } + + //Set the frequency of our points + var frequency = 12; + + //If there isn't a lot of points to graph, draw points more frequently on the line + if(MetacatUI.statsModel.get("metadataUpdateDates").length < 40) frequency = 1; + + //Create the line chart for metadata updates + var metadataLineChart = new LineChart( + { data: MetacatUI.statsModel.get('metadataUpdateDates'), + formatFromSolrFacets: true, + cumulative: false, + id: "updates-chart", + className: "metadata", + yLabel: "metadata files updated", + // frequency: frequency, + radius: 2, + width: this.$('.metadata-updates-chart').width(), + labelDate: "M-y" + }); + + this.$('.metadata-updates-chart').html(metadataLineChart.render().el); + + //Only draw the data updates chart if there was at least one uploaded + if(MetacatUI.statsModel.get("dataCount")){ + //Create the line chart for data updates + var dataLineChart = new LineChart( + { data: MetacatUI.statsModel.get('dataUpdateDates'), + formatFromSolrFacets: true, + cumulative: false, + id: "updates-chart", + className: "data", + yLabel: "data files updated", + // frequency: frequency, + radius: 2, + width: this.$('.data-updates-chart').width(), + labelDate: "M-y" + }); + + this.$('.data-updates-chart').html(dataLineChart.render().el); + + } + else{ + //Create the line chart for data updates + var dataLineChart = new LineChart( + { data: null, + formatFromSolrFacets: true, + cumulative: false, + id: "updates-chart", + className: "data no-activity", + yLabel: "data files updated", + // frequency: frequency, + radius: 2, + width: this.$('.data-updates-chart').width(), + labelDate: "M-y" + }); + + this.$('.data-updates-chart').html(dataLineChart.render().el); + } + + }, + /* * drawDownloadsChart - draws a line chart representing the downloads over time */ @@ -563,6 +749,50 @@ define(['jquery', 'underscore', 'backbone', 'd3', 'LineChart', 'BarChart', 'Donu }, + /* + * Shows that this person/group/node has no activity + */ + showNoActivity: function(){ + this.$(".show-loading .loading").remove(); + + this.$el.addClass("no-activity"); + }, + + /** + * Convert number of bytes into human readable format + * + * @param integer bytes Number of bytes to convert + * @param integer precision Number of digits after the decimal separator + * @return string + */ + bytesToSize: function(bytes, precision){ + var kilobyte = 1024; + var megabyte = kilobyte * 1024; + var gigabyte = megabyte * 1024; + var terabyte = gigabyte * 1024; + + if(typeof bytes === "undefined") var bytes = this.get("size"); + + if ((bytes >= 0) && (bytes < kilobyte)) { + return bytes + ' B'; + + } else if ((bytes >= kilobyte) && (bytes < megabyte)) { + return (bytes / kilobyte).toFixed(precision) + ' KB'; + + } else if ((bytes >= megabyte) && (bytes < gigabyte)) { + return (bytes / megabyte).toFixed(precision) + ' MB'; + + } else if ((bytes >= gigabyte) && (bytes < terabyte)) { + return (bytes / gigabyte).toFixed(precision) + ' GB'; + + } else if (bytes >= terabyte) { + return (bytes / terabyte).toFixed(precision) + ' TB'; + + } else { + return bytes + ' B'; + } + }, + onClose: function () { //Clear the template this.$el.html(""); diff --git a/metacatui/src/main/webapp/js/views/UserView.js b/metacatui/src/main/webapp/js/views/UserView.js index 5e0ef5bb2..5392e1ca6 100644 --- a/metacatui/src/main/webapp/js/views/UserView.js +++ b/metacatui/src/main/webapp/js/views/UserView.js @@ -355,8 +355,7 @@ define(['jquery', 'underscore', 'backbone', 'clipboard', 'collections/UserGroup' insertStats: function(){ if(this.model.noActivity && this.statsView){ this.statsView.$el.addClass("no-activity"); - this.$("#total-upload-container").text("0"); - this.$("#total-download-container").text("0"); + this.$("#total-download-wrapper, section.downloads").hide(); return; } @@ -365,11 +364,16 @@ define(['jquery', 'underscore', 'backbone', 'clipboard', 'collections/UserGroup' //Insert a couple stats into the profile this.listenToOnce(MetacatUI.statsModel, "change:firstUpload", this.insertFirstUpload); + this.listenToOnce(MetacatUI.statsModel, "change:totalUploads", function(){ view.$("#total-upload-container").text(MetacatUI.appView.commaSeparateNumber(MetacatUI.statsModel.get("totalUploads"))); }); + MetacatUI.statsModel.once("change:downloads", function(){ - view.$("#total-download-container").text(MetacatUI.appView.commaSeparateNumber(this.get("downloads"))); + if( !this.get("downloads") ) + view.$("#total-download-wrapper, section.downloads").hide(); + else + view.$("#total-download-container").text(MetacatUI.appView.commaSeparateNumber(this.get("downloads"))); }); //Create a base query for the statistics @@ -470,8 +474,19 @@ define(['jquery', 'underscore', 'backbone', 'clipboard', 'collections/UserGroup' // Get the first upload or first operational date if(this.model.get("type") == "node"){ - var node = _.findWhere(MetacatUI.nodeModel.get("members"), {identifier: "urn:node:" + this.model.get("username") }), - firstUpload = node.memberSince? new Date(node.memberSince.substring(0, node.memberSince.indexOf("T"))) : new Date(); + + //Get the member node object + var node = _.findWhere(MetacatUI.nodeModel.get("members"), {identifier: "urn:node:" + this.model.get("username") }); + + //If there is no memberSince date, then hide this statistic and exit + if( !node.memberSince ){ + this.$("#first-upload-container, #first-upload-year-container").hide(); + return; + } + else{ + var firstUpload = node.memberSince? new Date(node.memberSince.substring(0, node.memberSince.indexOf("T"))) : new Date(); + } + } else{ var firstUpload = new Date(MetacatUI.statsModel.get("firstUpload")); From 66a17203d14a0d5c1e985803e3c7d4a79adf8c99 Mon Sep 17 00:00:00 2001 From: laurenwalker Date: Thu, 19 Oct 2017 18:49:28 -0400 Subject: [PATCH 432/560] Merge changes from 1.14 branch --- metacatui/src/main/webapp/css/metacatui-common.css | 11 ++++++++++- metacatui/src/main/webapp/js/models/Stats.js | 11 +++++++++-- .../main/webapp/js/themes/arctic/routers/router.js | 4 ++-- .../main/webapp/js/themes/dataone/routers/router.js | 2 +- .../main/webapp/js/themes/default/css/metacatui.css | 7 +++++++ metacatui/src/main/webapp/js/views/SignInView.js | 12 +++++++++++- 6 files changed, 40 insertions(+), 7 deletions(-) diff --git a/metacatui/src/main/webapp/css/metacatui-common.css b/metacatui/src/main/webapp/css/metacatui-common.css index a1f9e24df..9200eec40 100644 --- a/metacatui/src/main/webapp/css/metacatui-common.css +++ b/metacatui/src/main/webapp/css/metacatui-common.css @@ -271,6 +271,9 @@ header .citation { .btn.download.complete.btn-primary{ color: white; } +.downloading.icon-spin.hidden{ + display: none; +} /****************************************** ** Notifications and Alerts *** @@ -499,6 +502,7 @@ img.icon{ } .result-row .tooltip{ z-index: 99999; + min-width: 100px; } .result-row .info-icons .label { background-color: #FFF; @@ -514,6 +518,10 @@ img.icon{ .result-row .tooltip-inner{ font-size: 1.2em; } +.result-row .download-icon-placeholder{ + width: 16px; + display: inline-block; +} /****************************************** ** Provenance flow-charts *** ******************************************/ @@ -2083,7 +2091,7 @@ table.download-contents .name{ } table.download-contents .btn-container, table.download-contents .btn-container .btn{ - width: 115px; + width: 140px; } .download-contents.service .btn-container .btn{ width: 135px; @@ -2622,6 +2630,7 @@ svg .no-activity, } .list-group-header.list-group-item{ background-color: #ECF1F5; + min-width: auto; } .panel>.list-group .list-group-item.active{ border-left-width: 5px; diff --git a/metacatui/src/main/webapp/js/models/Stats.js b/metacatui/src/main/webapp/js/models/Stats.js index 3b17bcdaa..0a844ef24 100644 --- a/metacatui/src/main/webapp/js/models/Stats.js +++ b/metacatui/src/main/webapp/js/models/Stats.js @@ -255,12 +255,14 @@ define(['jquery', 'underscore', 'backbone', 'models/LogsSearch'], if(formats.length == 1){ //Only one format type was found if(formats[0].groupValue == "METADATA"){ //That one format type is metadata - model.set('metadataCount', formats[0].doclist.numFound); model.set('dataCount', 0); + model.trigger("change:dataCount"); + model.set('metadataCount', formats[0].doclist.numFound); model.set('dataFormatIDs', ["", 0]); }else{ model.set('dataCount', formats[0].doclist.numFound); model.set('metadataCount', 0); + model.trigger("change:metadataCount"); model.set('metadataFormatIDs', ["", 0]); } } @@ -269,9 +271,14 @@ define(['jquery', 'underscore', 'backbone', 'models/LogsSearch'], //Store falsey data model.set('dataCount', 0); - model.set('metadataCount', 0); + model.trigger("change:dataCount"); + model.set("totalCount", 0); model.trigger("change:totalCount"); + + model.set('metadataCount', 0); + model.trigger("change:metadataCount"); + model.set('metadataFormatIDs', ["", 0]); model.set('dataFormatIDs', ["", 0]); diff --git a/metacatui/src/main/webapp/js/themes/arctic/routers/router.js b/metacatui/src/main/webapp/js/themes/arctic/routers/router.js index 3a28e4d06..6f34fc7bb 100644 --- a/metacatui/src/main/webapp/js/themes/arctic/routers/router.js +++ b/metacatui/src/main/webapp/js/themes/arctic/routers/router.js @@ -171,7 +171,7 @@ function ($, _, Backbone) { var seriesId; //Check for a seriesId - if(MetacatUI.appModel.get("useSeriesId") && (pid.indexOf("version:") > -1)){ + if(pid.indexOf("version:") > -1){ seriesId = pid.substr(0, pid.indexOf(", version:")); pid = pid.substr(pid.indexOf(", version: ") + ", version: ".length); @@ -321,7 +321,7 @@ function ($, _, Backbone) { if(!MetacatUI.appView.signInView){ require(['views/SignInView'], function(SignInView){ - MetacatUI.appView.signInView = new SignInView({ el: "#Content"}); + MetacatUI.appView.signInView = new SignInView({ el: "#Content", fullPage: true}); MetacatUI.appView.showView(MetacatUI.appView.signInView); }); } diff --git a/metacatui/src/main/webapp/js/themes/dataone/routers/router.js b/metacatui/src/main/webapp/js/themes/dataone/routers/router.js index fadcd2a82..b82460bb9 100644 --- a/metacatui/src/main/webapp/js/themes/dataone/routers/router.js +++ b/metacatui/src/main/webapp/js/themes/dataone/routers/router.js @@ -316,7 +316,7 @@ function ($, _, Backbone) { if(!MetacatUI.appView.signInView){ require(["views/SignInView"], function(SignInView){ - MetacatUI.appView.signInView = new SignInView({ el: "#Content"}); + MetacatUI.appView.signInView = new SignInView({ el: "#Content", fullPage: true }); MetacatUI.appView.showView(MetacatUI.appView.signInView); }); } diff --git a/metacatui/src/main/webapp/js/themes/default/css/metacatui.css b/metacatui/src/main/webapp/js/themes/default/css/metacatui.css index fdc047a89..056275377 100644 --- a/metacatui/src/main/webapp/js/themes/default/css/metacatui.css +++ b/metacatui/src/main/webapp/js/themes/default/css/metacatui.css @@ -1865,6 +1865,13 @@ svg .title{ fill: #445200; } +.no-activity .donut > g:first-child .donut-arc, +.no-activity .donut > g .donut-arc-label, +.no-activity .donut > g .donut-title-text, +.no-activity .donut > g .donut-title-count{ + fill: #CCC; +} + .donut.default .donut-labels{ visibility: hidden; diff --git a/metacatui/src/main/webapp/js/views/SignInView.js b/metacatui/src/main/webapp/js/views/SignInView.js index a57e3d7d9..af2a44c96 100644 --- a/metacatui/src/main/webapp/js/views/SignInView.js +++ b/metacatui/src/main/webapp/js/views/SignInView.js @@ -16,10 +16,20 @@ define(['jquery', 'underscore', 'backbone', 'fancybox', 'text!templates/login.ht ldapError: false, + /* Set to true if this SignInView is the only thing on the page */ + fullPage: false, + + /* Set to true if this SignInView is in a modal window */ + inPlace: false, + + /*A message to display at the top of the view */ + topMessage: "", + initialize: function(options){ if(typeof options !== "undefined"){ this.inPlace = options.inPlace; this.topMessage = options.topMessage; + this.fullPage = options.fullPage; } }, @@ -88,7 +98,7 @@ define(['jquery', 'underscore', 'backbone', 'fancybox', 'text!templates/login.ht else{ //If it's a full-page sign-in view, then empty it first - if(this.el == MetacatUI.appView.el){ + if(this.el == MetacatUI.appView.el || this.fullPage){ this.$el.empty(); var container = document.createElement("div"); container.className = "container login"; From 114e31bd02a39d369026b6eea3e1c0cc9c8323e2 Mon Sep 17 00:00:00 2001 From: laurenwalker Date: Fri, 20 Oct 2017 15:53:28 -0400 Subject: [PATCH 433/560] Moved all these to token login, including the default theme. LDAP login will not be supported in 2.0.0 unless it is the ecoinformatics LDAP that is built into the DataONE portal. Changed the SignInView to use Backbone modal windows instead of Fancybox, which is an extra unneeded library for that view. If a logged-in user navigates to #signin, either directly or after being redirected from the DataONE portal, we will redirect them to their profile. --- .../src/main/webapp/css/metacatui-common.css | 171 ++++-------------- metacatui/src/main/webapp/index.html | 2 +- .../src/main/webapp/js/models/UserModel.js | 1 - .../src/main/webapp/js/routers/router.js | 32 +++- .../src/main/webapp/js/templates/login.html | 57 +++--- .../webapp/js/templates/loginButtons.html | 4 +- .../src/main/webapp/js/templates/navbar.html | 2 +- .../webapp/js/themes/arctic/css/metacatui.css | 7 - .../webapp/js/themes/arctic/routers/router.js | 33 +++- .../js/themes/arctic/templates/altHeader.html | 15 -- .../js/themes/arctic/templates/navbar.html | 2 +- .../js/themes/dataone/css/metacatui.css | 19 +- .../js/themes/dataone/templates/login.html | 135 +++++++------- .../webapp/js/themes/goa/routers/router.js | 34 +++- .../js/themes/goa/templates/navbar.html | 2 +- .../webapp/js/themes/knb/css/metacatui.css | 8 +- .../js/themes/knb/templates/altHeader.html | 4 +- .../js/themes/knb/templates/navbar.html | 2 +- .../webapp/js/themes/nceas/routers/router.js | 16 +- .../src/main/webapp/js/views/SignInView.js | 23 ++- 20 files changed, 251 insertions(+), 318 deletions(-) diff --git a/metacatui/src/main/webapp/css/metacatui-common.css b/metacatui/src/main/webapp/css/metacatui-common.css index 9200eec40..363d1d2a8 100644 --- a/metacatui/src/main/webapp/css/metacatui-common.css +++ b/metacatui/src/main/webapp/css/metacatui-common.css @@ -1290,133 +1290,12 @@ img.icon{ /****************************************** ************ Popup Login ************** ******************************************/ -.fancybox-inline{ - background-color: #FFF; - padding: 20px; - display: none; -} -.fancybox-inline h2 { - font-size: 1.2em; - text-align: center; -} -.fancybox-inline h3.subtitle{ - font-size: 1em; - font-weight: lighter; - line-height: 1.5em; - font-style: italic; -} -.fancybox-inline h4{ - font-size: 1em; -} -.fancybox-inline > form .input-group, .fancybox-inline form .btn { - max-width: 296px; - left: 22%; - position: relative; -} -.fancybox-inline > form input{ - width: 90%; - width: calc(100% - 20px); - margin-bottom: 5px; -} -.fancybox-inline > form select{ - width: calc(100% - 6px); - margin-bottom: 5px; -} -.fancybox-inline > form input.btn{ - width: 95%; - width: calc(100% - 5px); - margin-top: 20px; -} -.fancybox-inline .divider-text{ - position: absolute; - top: 50%; - left: 40%; - background-color: white; - padding: 5px; - color: #AAA; -} + .nav.list-group > .list-group-item img.icon{ width: 32px; height: auto; padding: 16px; } -.fancybox-inline .notification { - min-height: 150px; -} -.fancybox-inline { - min-width: 550px; - padding: 5px; -} -.fancybox-inline h3{ - font-size: .9em; - font-weight: normal; - margin-top: 0px; - line-height: 1.1em; -} -.fancybox-inline .well ul{ - font-size: .9em; - list-style: none; - margin-left: 0px; -} -.fancybox-inline .well ul li{ - border-bottom: 1px solid #DDD; - padding: 3px; - font-size: .9em; -} -.fancybox-inline > .row-fluid > .span7{ - border-left: 1px solid #DDD; - padding-left: 20px; -} -.fancybox-inline .btn.ldap{ - width: 220px; - left: 0; -} -.orcid-signin a > span{ - padding: 11px; - display: inline-block; - height: 1.5em; - color: #8FAF10; - border-top-right-radius: 4px; - border-bottom-right-radius: 4px; - border-left-width: 0px; - border: 1px solid #aacf14; - border-left-width: 0px; -} -.orcid-signin a { - padding: 0px; - border-radius: 4px; - padding-left: 0px; -} -.fancybox-inline .signin{ - display: inline-block; - width: auto; - padding: 0px; - margin-bottom: 10px; -} -.fancybox-inline .orcid-signin a:hover, -.fancybox-inline .orcid-signin a:hover > img{ - background-color: #aacf14; - cursor: pointer; - transition: all 500ms; - -} -.fancybox-inline .orcid-signin a:hover > span{ - color: white; -} -.fancybox-inline .well{ - border-color: #CCC; -} -.fancybox-inline .span12 .well .btn{ - width: 300px; - margin-left: auto; - margin-right: auto; - display: block; - margin-bottom: 20px; -} -.fancybox-inline .remember{ - height: 1.2em; - overflow: hidden; -} .scroll-y{ overflow-y: scroll; -webkit-transform: translate3d(0,0,0); @@ -1431,26 +1310,9 @@ img.icon{ margin-right: 10px; margin-left: 30%; } -.orcid-signin img { - height: 1.5em; - background-color: #FFF; - padding: 11px; - border-radius: 4px; - border: 1px solid #aacf14; - display: inline-block; - margin-right: -4px; - margin-top: -1px; - border-bottom-right-radius: 0px; - border-top-right-radius: 0px; - border-right-width: 0px; -} #signInPopup .orcid-signin { margin-top: 10%; } -.fancybox-inline > .row-fluid > .span6:first-child { - border-right: 1px solid #CCC; - min-height: 265px; -} .modal.container{ padding: 20px 20px 40px 20px; } @@ -1458,6 +1320,37 @@ img.icon{ width: auto; margin-bottom: 20px; } +.sign-in.modal .close { + font-size: 2em; +} +/** The ORCID Sign In button **/ +.orcid-btn{ + border: 1px solid #aacf14; + border-radius: 4px; + -moz-border-radius: 4px; + -webkit-border-radius: 4px; + background-color: #FFF; + padding: 15px 20px; + color: #aacf14; + text-decoration: none; + margin-bottom: 10px; + margin-top: 10px; + display: inline-block; + font-weight: bold; +} +.orcid-btn img { + height: 1.5em; + margin-right: 5px; +} +.orcid-btn:hover{ + background-color: #aacf14; + transition: all 500ms; + text-decoration: none; +} +.orcid-btn:hover > span{ + color: #FFF; + text-decoration: none; +} /****************************************** ** The Metadata and MetadataIndex View ** ******************************************/ diff --git a/metacatui/src/main/webapp/index.html b/metacatui/src/main/webapp/index.html index b109db57a..bbedd3ba4 100644 --- a/metacatui/src/main/webapp/index.html +++ b/metacatui/src/main/webapp/index.html @@ -12,7 +12,7 @@ diff --git a/metacatui/src/main/webapp/js/models/UserModel.js b/metacatui/src/main/webapp/js/models/UserModel.js index 112d66b7c..b6e3caed9 100644 --- a/metacatui/src/main/webapp/js/models/UserModel.js +++ b/metacatui/src/main/webapp/js/models/UserModel.js @@ -531,7 +531,6 @@ define(['jquery', 'underscore', 'backbone', 'jws', 'models/Search', "collections }, getToken: function(customCallback) { - var tokenUrl = MetacatUI.appModel.get('tokenUrl'); var model = this; diff --git a/metacatui/src/main/webapp/js/routers/router.js b/metacatui/src/main/webapp/js/routers/router.js index 01e102268..8627b2357 100644 --- a/metacatui/src/main/webapp/js/routers/router.js +++ b/metacatui/src/main/webapp/js/routers/router.js @@ -22,7 +22,7 @@ function ($, _, Backbone) { 'external(/*url)' : 'renderExternal', // renders the content of the given url in our UI 'logout' : 'logout', // logout the user 'signout' : 'logout', // logout the user - 'signin' : 'renderTokenSignIn', // logout the user + 'signin' : 'renderSignIn', // logout the user "signinsuccess" : "renderSignInSuccess", "signinldaperror" : "renderLdapSignInError", 'share(/*pid)' : 'renderEditor', // registry page @@ -341,13 +341,13 @@ function ($, _, Backbone) { renderMyProfile: function(section, subsection){ if(MetacatUI.appUserModel.get("checked") && !MetacatUI.appUserModel.get("loggedIn")) - this.renderTokenSignIn(); + this.renderSignIn(); else if(!MetacatUI.appUserModel.get("checked")){ this.listenToOnce(MetacatUI.appUserModel, "change:checked", function(){ if(MetacatUI.appUserModel.get("loggedIn")) this.renderProfile(MetacatUI.appUserModel.get("username"), section, subsection); else - this.renderTokenSignIn(); + this.renderSignIn(); }); } else if(MetacatUI.appUserModel.get("checked") && MetacatUI.appUserModel.get("loggedIn")){ @@ -374,18 +374,34 @@ function ($, _, Backbone) { } }, - renderTokenSignIn: function(){ - this.routeHistory.push("signin"); + renderSignIn: function(){ + var router = this; + + //If there is no SignInView yet, create one if(!MetacatUI.appView.signInView){ require(['views/SignInView'], function(SignInView){ - MetacatUI.appView.signInView = new SignInView({ el: "#Content"}); - MetacatUI.appView.showView(MetacatUI.appView.signInView); + MetacatUI.appView.signInView = new SignInView({ el: "#Content", fullPage: true }); + router.renderSignIn(); }); + + return; } - else{ + + //If the user status has been checked and they are already logged in, we will forward them to their profile + if( MetacatUI.appUserModel.get("checked") && MetacatUI.appUserModel.get("loggedIn") ){ + this.navigate("my-profile", { trigger: true }); + return; + } + //If the user status has been checked and they are NOT logged in, show the SignInView + else if( MetacatUI.appUserModel.get("checked") && !MetacatUI.appUserModel.get("loggedIn") ){ + this.routeHistory.push("signin"); MetacatUI.appView.showView(MetacatUI.appView.signInView); } + //If the user status has not been checked yet, wait for it + else if( !MetacatUI.appUserModel.get("checked") ){ + this.listenToOnce(MetacatUI.appUserModel, "change:checked", this.renderSignIn); + } }, renderSignInSuccess: function(){ diff --git a/metacatui/src/main/webapp/js/templates/login.html b/metacatui/src/main/webapp/js/templates/login.html index cb56ddebd..c5bd9b8c4 100644 --- a/metacatui/src/main/webapp/js/templates/login.html +++ b/metacatui/src/main/webapp/js/templates/login.html @@ -3,19 +3,20 @@ else var linkAttr = ''; %> -

          -
          -

          Sign Up

          -
          -
          - <% if(signInUrlOrcid) { %> -

          There's no need to create a new account - just use your existing ORCID account now or create a new one.

          - - <% } %> -
          + + +
          \ No newline at end of file diff --git a/metacatui/src/main/webapp/js/templates/loginButtons.html b/metacatui/src/main/webapp/js/templates/loginButtons.html index e38a35009..d1546eafe 100644 --- a/metacatui/src/main/webapp/js/templates/loginButtons.html +++ b/metacatui/src/main/webapp/js/templates/loginButtons.html @@ -1,3 +1,3 @@ - + or - Sign up + Sign up diff --git a/metacatui/src/main/webapp/js/templates/navbar.html b/metacatui/src/main/webapp/js/templates/navbar.html index 19cbc5246..ee91b1d92 100644 --- a/metacatui/src/main/webapp/js/templates/navbar.html +++ b/metacatui/src/main/webapp/js/templates/navbar.html @@ -38,7 +38,7 @@ ); } else { print( - '' + '' ); } %> diff --git a/metacatui/src/main/webapp/js/themes/arctic/css/metacatui.css b/metacatui/src/main/webapp/js/themes/arctic/css/metacatui.css index 072fb95e6..13e15d55a 100644 --- a/metacatui/src/main/webapp/js/themes/arctic/css/metacatui.css +++ b/metacatui/src/main/webapp/js/themes/arctic/css/metacatui.css @@ -1979,13 +1979,6 @@ MDQ items color: #FFF; background-color: #00AAFF; } - - -#signinPopup{ - width: auto; - min-width: 210px; - max-width: 210px; -} /*-------------- DOCUMENTATION CSS -----------------------------*/ /* ---------------------------------------------------- */ diff --git a/metacatui/src/main/webapp/js/themes/arctic/routers/router.js b/metacatui/src/main/webapp/js/themes/arctic/routers/router.js index 6f34fc7bb..0d66a873c 100644 --- a/metacatui/src/main/webapp/js/themes/arctic/routers/router.js +++ b/metacatui/src/main/webapp/js/themes/arctic/routers/router.js @@ -16,7 +16,7 @@ function ($, _, Backbone) { 'my-profile(/s=:section)(/s=:subsection)' : 'renderMyProfile', 'external(/*url)' : 'renderExternal', // renders the content of the given url in our UI 'signout' : 'logout', - 'signin' : 'renderTokenSignIn', + 'signin' : 'renderSignIn', "signinsuccess" : "renderSignInSuccess", 'share(/*pid)' : 'renderEditor', // registry page 'submit(/*pid)' : 'renderEditor', // registry page @@ -241,13 +241,13 @@ function ($, _, Backbone) { renderMyProfile: function(section, subsection){ if(MetacatUI.appUserModel.get("checked") && !MetacatUI.appUserModel.get("loggedIn")) - this.renderTokenSignIn(); + this.renderSignIn(); else if(!MetacatUI.appUserModel.get("checked")){ this.listenToOnce(appUserModel, "change:checked", function(){ if(MetacatUI.appUserModel.get("loggedIn")) this.renderProfile(MetacatUI.appUserModel.get("username"), section, subsection); else - this.renderTokenSignIn(); + this.renderSignIn(); }); } else if(MetacatUI.appUserModel.get("checked") && MetacatUI.appUserModel.get("loggedIn")){ @@ -316,18 +316,35 @@ function ($, _, Backbone) { } }, - renderTokenSignIn: function(){ - this.routeHistory.push("signin"); + + renderSignIn: function(){ + + var router = this; + //If there is no SignInView yet, create one if(!MetacatUI.appView.signInView){ require(['views/SignInView'], function(SignInView){ - MetacatUI.appView.signInView = new SignInView({ el: "#Content", fullPage: true}); - MetacatUI.appView.showView(MetacatUI.appView.signInView); + MetacatUI.appView.signInView = new SignInView({ el: "#Content", fullPage: true }); + router.renderSignIn(); }); + + return; } - else{ + + //If the user status has been checked and they are already logged in, we will forward them to their profile + if( MetacatUI.appUserModel.get("checked") && MetacatUI.appUserModel.get("loggedIn") ){ + this.navigate("my-profile", { trigger: true }); + return; + } + //If the user status has been checked and they are NOT logged in, show the SignInView + else if( MetacatUI.appUserModel.get("checked") && !MetacatUI.appUserModel.get("loggedIn") ){ + this.routeHistory.push("signin"); MetacatUI.appView.showView(MetacatUI.appView.signInView); } + //If the user status has not been checked yet, wait for it + else if( !MetacatUI.appUserModel.get("checked") ){ + this.listenToOnce(MetacatUI.appUserModel, "change:checked", this.renderSignIn); + } }, renderSignInSuccess: function(){ diff --git a/metacatui/src/main/webapp/js/themes/arctic/templates/altHeader.html b/metacatui/src/main/webapp/js/themes/arctic/templates/altHeader.html index 04edade64..e69de29bb 100644 --- a/metacatui/src/main/webapp/js/themes/arctic/templates/altHeader.html +++ b/metacatui/src/main/webapp/js/themes/arctic/templates/altHeader.html @@ -1,15 +0,0 @@ -
          - -
          diff --git a/metacatui/src/main/webapp/js/themes/arctic/templates/navbar.html b/metacatui/src/main/webapp/js/themes/arctic/templates/navbar.html index a567c404f..0b28ab17f 100644 --- a/metacatui/src/main/webapp/js/themes/arctic/templates/navbar.html +++ b/metacatui/src/main/webapp/js/themes/arctic/templates/navbar.html @@ -49,7 +49,7 @@
        • <% } else { %>
        • - +
        • <% } %>
        diff --git a/metacatui/src/main/webapp/js/themes/dataone/css/metacatui.css b/metacatui/src/main/webapp/js/themes/dataone/css/metacatui.css index 9162030b3..4745e824d 100644 --- a/metacatui/src/main/webapp/js/themes/dataone/css/metacatui.css +++ b/metacatui/src/main/webapp/js/themes/dataone/css/metacatui.css @@ -702,21 +702,14 @@ table th.btn-container .btn{ .navbar .nav>li>.dropdown-menu:after{ display: none; } + /** The login form from the navbar **/ -.fancybox-inline{ - width: 315px; -} -.fancybox-inline > a{ - color: rgb(102, 0, 51); -} -.fancybox-inline .alert{ - width: auto; - width: calc(100% - 73px); - margin-left: auto; - margin-right: auto; - margin-bottom: 10px; - font-size: .9em; +.sign-in .divider-text { + margin-top: 30px; + font-weight: bold; } + + .list-group > .divider { list-style: none; border-bottom: 1px solid #DDD; diff --git a/metacatui/src/main/webapp/js/themes/dataone/templates/login.html b/metacatui/src/main/webapp/js/themes/dataone/templates/login.html index f1add9177..9853f4aaf 100644 --- a/metacatui/src/main/webapp/js/themes/dataone/templates/login.html +++ b/metacatui/src/main/webapp/js/themes/dataone/templates/login.html @@ -3,86 +3,83 @@ else var linkAttr = ''; %> -
      diff --git a/metacatui/src/main/webapp/js/themes/knb/css/metacatui.css b/metacatui/src/main/webapp/js/themes/knb/css/metacatui.css index f781643cb..858dfff9f 100644 --- a/metacatui/src/main/webapp/js/themes/knb/css/metacatui.css +++ b/metacatui/src/main/webapp/js/themes/knb/css/metacatui.css @@ -889,11 +889,6 @@ img[src*="gstatic.com/"], img[src*="googleapis.com/"] { float: right; } - #signupPopup { - max-width: 350px; - min-width: 350px; - } - .dropdown-header { display: block; padding: 3px 20px; @@ -1172,6 +1167,9 @@ svg .packages, color: #0E69A1; fill: #0E69A1; } +.profile .quick-stats circle{ + stroke: #0E69A1; +} .profile .bar-label.packages{ fill: inherit; } diff --git a/metacatui/src/main/webapp/js/themes/knb/templates/altHeader.html b/metacatui/src/main/webapp/js/themes/knb/templates/altHeader.html index 15a07f9d7..fcb72a70c 100644 --- a/metacatui/src/main/webapp/js/themes/knb/templates/altHeader.html +++ b/metacatui/src/main/webapp/js/themes/knb/templates/altHeader.html @@ -7,7 +7,7 @@
@@ -17,7 +17,7 @@

Store, share, and collaborate.

diff --git a/metacatui/src/main/webapp/js/themes/knb/templates/navbar.html b/metacatui/src/main/webapp/js/themes/knb/templates/navbar.html index 004a9aea5..e53d2f996 100644 --- a/metacatui/src/main/webapp/js/themes/knb/templates/navbar.html +++ b/metacatui/src/main/webapp/js/themes/knb/templates/navbar.html @@ -36,7 +36,7 @@ <% } else { %> -
  • Sign In
  • +
  • Sign In
  • <% } %> diff --git a/metacatui/src/main/webapp/js/themes/nceas/routers/router.js b/metacatui/src/main/webapp/js/themes/nceas/routers/router.js index c807f9569..5ca575a53 100644 --- a/metacatui/src/main/webapp/js/themes/nceas/routers/router.js +++ b/metacatui/src/main/webapp/js/themes/nceas/routers/router.js @@ -12,7 +12,7 @@ function ($, _, Backbone) { 'view/*pid' : 'renderMetadata', // metadata page 'logout' : 'logout', // logout the user 'signout' : 'logout', // logout the user - 'signup' : 'renderLdap', // use ldapweb for registration + 'signup' : 'renderTokenSignIn', // use ldapweb for registration "signinldaperror" : "renderLdapSignInError", 'external(/*url)' : 'renderExternal', // renders the content of the given url in our UI 'share(/*pid)' : 'renderEditor', // metadata Editor @@ -145,6 +145,20 @@ function ($, _, Backbone) { } }, + renderTokenSignIn: function(){ + this.routeHistory.push("signin"); + + if(!MetacatUI.appView.signInView){ + require(['views/SignInView'], function(SignInView){ + MetacatUI.appView.signInView = new SignInView({ el: "#Content"}); + MetacatUI.appView.showView(MetacatUI.appView.signInView); + }); + } + else{ + MetacatUI.appView.showView(MetacatUI.appView.signInView); + } + }, + logout: function (param) { //Clear our browsing history when we log out this.routeHistory.length = 0; diff --git a/metacatui/src/main/webapp/js/views/SignInView.js b/metacatui/src/main/webapp/js/views/SignInView.js index af2a44c96..fae024fbf 100644 --- a/metacatui/src/main/webapp/js/views/SignInView.js +++ b/metacatui/src/main/webapp/js/views/SignInView.js @@ -1,7 +1,7 @@ /*global define */ -define(['jquery', 'underscore', 'backbone', 'fancybox', 'text!templates/login.html', 'text!templates/alert.html', 'text!templates/loginButtons.html', 'text!templates/loginOptions.html'], - function($, _, Backbone, fancybox, LoginTemplate, AlertTemplate, LoginButtonsTemplate, LoginOptionsTemplate) { +define(['jquery', 'underscore', 'backbone', 'text!templates/login.html', 'text!templates/alert.html', 'text!templates/loginButtons.html', 'text!templates/loginOptions.html'], + function($, _, Backbone, LoginTemplate, AlertTemplate, LoginButtonsTemplate, LoginOptionsTemplate) { 'use strict'; var SignInView = Backbone.View.extend({ @@ -126,7 +126,12 @@ define(['jquery', 'underscore', 'backbone', 'fancybox', 'text!templates/login.ht window.location.href.replace("#signinldaperror", "") : window.location.href })); + this.setUpPopup(); } + + //Open the Sign In modal window + if(this.fullPage) + $("#signinPopup").modal("show"); //If there is an error message in the URL, it means authentication has failed if(this.ldapError){ @@ -151,9 +156,9 @@ define(['jquery', 'underscore', 'backbone', 'fancybox', 'text!templates/login.ht //If this is a full-page sign-in view, then take the from and insert it into the page if(this.$el.attr("id") == "Content") $("#Content").html( $("#ldap-login").html() ); - //Else, just show the login in the fancybox modal window + //Else, just show the login in the modal window else{ - $.fancybox.open("#SignIn"); + $("#signinPopup").modal("show"); } //Show the LDAP login form @@ -163,15 +168,15 @@ define(['jquery', 'underscore', 'backbone', 'fancybox', 'text!templates/login.ht setUpPopup: function(){ var view = this; - //Initialize the fancybox elements - this.$(".fancybox").fancybox({ - transitionIn: "elastic", - afterShow: function(){ + //Initialize the modal elements + $("#signupPopup, #signinPopup").modal({ + show: false, + shown: function(){ //Update the sign-in URLs so we are redirected back to the previous page after authentication $("a.update-sign-in-url").attr("href", MetacatUI.appModel.get("signInUrl") + encodeURIComponent(window.location.href)); $("a.update-orcid-sign-in-url").attr("href", MetacatUI.appModel.get("signInUrlOrcid") + encodeURIComponent(window.location.href)); - $("a.update-ldap-sign-in-url").attr("href", MetacatUI.appModel.get("signInUrlLdap") + encodeURIComponent(window.location.href)); + } }); }, From 2954a76728f4b49cbaeb453f0a5f7a0e8a6d00c7 Mon Sep 17 00:00:00 2001 From: laurenwalker Date: Fri, 20 Oct 2017 16:54:48 -0400 Subject: [PATCH 434/560] Add a start message to the data package table at the top of the Editor to get users started in the right direction. --- .../src/main/webapp/css/metacatui-common.css | 14 ++++++++++ .../main/webapp/js/models/DataONEObject.js | 3 +++ .../webapp/js/templates/dataPackageStart.html | 13 ++++++++++ .../src/main/webapp/js/views/DataItemView.js | 5 +++- .../main/webapp/js/views/DataPackageView.js | 26 ++++++++++++++++--- .../src/main/webapp/js/views/EditorView.js | 2 +- 6 files changed, 57 insertions(+), 6 deletions(-) create mode 100644 metacatui/src/main/webapp/js/templates/dataPackageStart.html diff --git a/metacatui/src/main/webapp/css/metacatui-common.css b/metacatui/src/main/webapp/css/metacatui-common.css index 363d1d2a8..d649b70b9 100644 --- a/metacatui/src/main/webapp/css/metacatui-common.css +++ b/metacatui/src/main/webapp/css/metacatui-common.css @@ -3320,6 +3320,20 @@ ul.side-nav-items { .data-package-item.remove-preview .type-icon{ opacity: .3; } +.data-package-item.message-row td{ + padding-top: 150px; +} +.data-package-item.message-row:hover td{ + background-color: #FFF; +} +.data-package-item.message-row h2{ + font-size: 2.1em; +} +.data-package-item.message-row button{ + font-size: 1.2em; + margin-top: 10px; + display: block; +} /* Editor package table status column */ .data-package-item .status{ width: 60px; diff --git a/metacatui/src/main/webapp/js/models/DataONEObject.js b/metacatui/src/main/webapp/js/models/DataONEObject.js index 3a0c9c47d..25beb1adf 100644 --- a/metacatui/src/main/webapp/js/models/DataONEObject.js +++ b/metacatui/src/main/webapp/js/models/DataONEObject.js @@ -90,6 +90,9 @@ define(['jquery', 'underscore', 'backbone', 'uuid', 'collections/ObjectFormats', }, initialize: function(attrs, options) { + if(typeof attrs == "undefined") var attrs = {}; + if(typeof options == "undefined") var options = {}; + this.on("change:size", this.bytesToSize); if(attrs.size) this.bytesToSize(); diff --git a/metacatui/src/main/webapp/js/templates/dataPackageStart.html b/metacatui/src/main/webapp/js/templates/dataPackageStart.html new file mode 100644 index 000000000..e242d054d --- /dev/null +++ b/metacatui/src/main/webapp/js/templates/dataPackageStart.html @@ -0,0 +1,13 @@ + + +

    Add files to start your dataset

    + + + + + + + \ No newline at end of file diff --git a/metacatui/src/main/webapp/js/views/DataItemView.js b/metacatui/src/main/webapp/js/views/DataItemView.js index 1e9501a3f..baf8d25d3 100644 --- a/metacatui/src/main/webapp/js/views/DataItemView.js +++ b/metacatui/src/main/webapp/js/views/DataItemView.js @@ -43,8 +43,11 @@ define(['underscore', 'jquery', 'backbone', 'models/DataONEObject', /* Initialize the object - post constructor */ initialize: function(options) { + if(typeof options == "undefined") var options = {}; + + this.model = options.model || new DataONEObject(); this.id = this.model.get("id"); - + }, /* Render the template into the DOM */ diff --git a/metacatui/src/main/webapp/js/views/DataPackageView.js b/metacatui/src/main/webapp/js/views/DataPackageView.js index 66e1f3273..9f5021206 100644 --- a/metacatui/src/main/webapp/js/views/DataPackageView.js +++ b/metacatui/src/main/webapp/js/views/DataPackageView.js @@ -8,9 +8,9 @@ define([ 'models/metadata/ScienceMetadata', 'models/metadata/eml211/EML211', 'views/DataItemView', 'text!templates/dataPackage.html', - 'text!templates/loading.html'], + 'text!templates/dataPackageStart.html'], function($, _, Backbone, DataPackage, DataONEObject, ScienceMetadata, EML211, DataItemView, - DataPackageTemplate) { + DataPackageTemplate, DataPackageStartTemplate) { 'use strict'; /* @@ -26,13 +26,14 @@ define([ id: "data-package-table", events: { - "click .toggle-rows" : "toggleRows" // Show/hide rows associated with event's metadata row - + "click .toggle-rows" : "toggleRows", // Show/hide rows associated with event's metadata row + "click .message-row .addFiles" : "handleAddFiles" }, subviews: {}, template: _.template(DataPackageTemplate), + startMessageTemplate: _.template(DataPackageStartTemplate), // Models waiting for their parent folder to be rendered, hashed by parent id: // {'parentid': [model1, model2, ...]} @@ -74,6 +75,18 @@ define([ // Render the current set of models in the DataPackage this.addAll(); + + //If this is a new data package, then display a message and button + if((this.dataPackage.length == 1 && this.dataPackage.models[0].isNew()) || !this.dataPackage.length){ + + var messageRow = this.startMessageTemplate(); + + this.$("tbody").append(messageRow); + + this.listenTo(this.dataPackage, "add", function(){ + this.$(".message-row").remove(); + }); + } return this; }, @@ -180,6 +193,11 @@ define([ }, + handleAddFiles: function(e){ + //Pass this on to the DataItemView for the root data package + this.$(".data-package-item.folder").first().data("view").handleAddFiles(e); + }, + /* * Close subviews as needed */ diff --git a/metacatui/src/main/webapp/js/views/EditorView.js b/metacatui/src/main/webapp/js/views/EditorView.js index 13d96840c..5eeb1d3d3 100644 --- a/metacatui/src/main/webapp/js/views/EditorView.js +++ b/metacatui/src/main/webapp/js/views/EditorView.js @@ -280,7 +280,7 @@ define(['underscore', view.emlView.resizeTOC(); } }); - $packageTableContainer.css("height", "200px"); + $packageTableContainer.css("height", "500px"); var table = this.dataPackageView.$el; this.listenTo(this.dataPackageView, "addOne", function(){ From 3e5c8b36a59cc38058de429c869a34cbb122292c Mon Sep 17 00:00:00 2001 From: laurenwalker Date: Fri, 20 Oct 2017 17:44:16 -0400 Subject: [PATCH 435/560] Move the title to the Overview section and remove the content editable table cell for metadata titles Closes #308 --- .../src/main/webapp/js/models/AppModel.js | 3 +- .../main/webapp/js/templates/dataItem.html | 6 +-- .../templates/metadata/metadataOverview.html | 7 ++++ .../js/themes/arctic/models/AppModel.js | 3 +- .../webapp/js/themes/knb/models/AppModel.js | 3 +- .../webapp/js/themes/nceas/models/AppModel.js | 3 +- .../src/main/webapp/js/views/DataItemView.js | 10 +++-- .../webapp/js/views/metadata/EML211View.js | 40 +++++++++++-------- 8 files changed, 48 insertions(+), 27 deletions(-) diff --git a/metacatui/src/main/webapp/js/models/AppModel.js b/metacatui/src/main/webapp/js/models/AppModel.js index f220caa53..90a36bd49 100644 --- a/metacatui/src/main/webapp/js/models/AppModel.js +++ b/metacatui/src/main/webapp/js/models/AppModel.js @@ -48,7 +48,8 @@ define(['jquery', 'underscore', 'backbone'], samplingDescription: false, studyExtentDescription: false, taxonCoverage: false, - temporalCoverage: true + temporalCoverage: true, + title: true }, baseUrl: window.location.origin || (window.location.protocol + "//" + window.location.host), diff --git a/metacatui/src/main/webapp/js/templates/dataItem.html b/metacatui/src/main/webapp/js/templates/dataItem.html index 5c3975b5c..8f6430012 100644 --- a/metacatui/src/main/webapp/js/templates/dataItem.html +++ b/metacatui/src/main/webapp/js/templates/dataItem.html @@ -13,8 +13,8 @@ - data-category="title" <% } %> > - <% if(uploadStatus != "l" && uploadStatus != "p"){ %> + + <% if(uploadStatus != "l" && uploadStatus != "p" && type != "Metadata"){ %>
    <% } else { %>
    @@ -24,7 +24,7 @@ <% } else if ( typeof fileName != "undefined" && fileName) { %> <%= fileName %> <% } else if(type == "Metadata"){ %> - Untitled dataset: Add a descriptive title for your dataset + Untitled dataset <% } else { %> <%= id %> <% } %> diff --git a/metacatui/src/main/webapp/js/templates/metadata/metadataOverview.html b/metacatui/src/main/webapp/js/templates/metadata/metadataOverview.html index fddb66776..4b99a40d3 100644 --- a/metacatui/src/main/webapp/js/templates/metadata/metadataOverview.html +++ b/metacatui/src/main/webapp/js/templates/metadata/metadataOverview.html @@ -1,5 +1,12 @@

    Overview

    +
    +
    Title
    +

    A brief but meaningful title for this dataset. A good title includes the topic, geographic location, dates, and scale of the data.

    +

    +
    +
    +
    Abstract

    Short summary of the purpose and content of this data set.

    diff --git a/metacatui/src/main/webapp/js/themes/arctic/models/AppModel.js b/metacatui/src/main/webapp/js/themes/arctic/models/AppModel.js index 1c3144e6c..db5f0b4c6 100644 --- a/metacatui/src/main/webapp/js/themes/arctic/models/AppModel.js +++ b/metacatui/src/main/webapp/js/themes/arctic/models/AppModel.js @@ -48,7 +48,8 @@ define(['jquery', 'underscore', 'backbone'], samplingDescription: false, studyExtentDescription: false, taxonCoverage: false, - temporalCoverage: true + temporalCoverage: true, + title: true }, baseUrl: window.location.origin || (window.location.protocol + "//" + window.location.host), diff --git a/metacatui/src/main/webapp/js/themes/knb/models/AppModel.js b/metacatui/src/main/webapp/js/themes/knb/models/AppModel.js index f7ec7fb4c..1e3b411e4 100644 --- a/metacatui/src/main/webapp/js/themes/knb/models/AppModel.js +++ b/metacatui/src/main/webapp/js/themes/knb/models/AppModel.js @@ -48,7 +48,8 @@ define(['jquery', 'underscore', 'backbone'], samplingDescription: false, studyExtentDescription: false, taxonCoverage: false, - temporalCoverage: true + temporalCoverage: true, + title: true }, baseUrl: window.location.origin || (window.location.protocol + "//" + window.location.host), diff --git a/metacatui/src/main/webapp/js/themes/nceas/models/AppModel.js b/metacatui/src/main/webapp/js/themes/nceas/models/AppModel.js index 46822127a..722f1b9db 100644 --- a/metacatui/src/main/webapp/js/themes/nceas/models/AppModel.js +++ b/metacatui/src/main/webapp/js/themes/nceas/models/AppModel.js @@ -35,7 +35,8 @@ define(['jquery', 'underscore', 'backbone'], samplingDescription: false, studyExtentDescription: false, taxonCoverage: false, - temporalCoverage: true + temporalCoverage: true, + title: true }, baseUrl: "https://knb.ecoinformatics.org", diff --git a/metacatui/src/main/webapp/js/views/DataItemView.js b/metacatui/src/main/webapp/js/views/DataItemView.js index baf8d25d3..af15f0ba7 100644 --- a/metacatui/src/main/webapp/js/views/DataItemView.js +++ b/metacatui/src/main/webapp/js/views/DataItemView.js @@ -24,7 +24,7 @@ define(['underscore', 'jquery', 'backbone', 'models/DataONEObject', /* Events this view listens to */ events: { "focusout .name" : "updateName", - "click .name" : "emptyName", + //"click .name" : "emptyName", /* "click .rename" : "rename", */ "click .duplicate" : "duplicate", // Edit dropdown, duplicate scimeta/rdf "click .addFolder" : "handleAddFolder", // Edit dropdown, add nested scimeta/rdf @@ -282,7 +282,7 @@ define(['underscore', 'jquery', 'backbone', 'models/DataONEObject', // Don't set the title if it hasn't changed or is empty if (enteredText !== "" && currentTitle !== enteredText && - enteredText !== "Untitled dataset: Add a descriptive title for your dataset") { + enteredText !== "Untitled dataset") { // Set the new title, upgrading any title attributes // that aren't Arrays into Arrays if ((Array.isArray(title) && title.length < 2) || typeof title == "string") { @@ -666,7 +666,11 @@ define(['underscore', 'jquery', 'backbone', 'models/DataONEObject', hideSaving: function(){ this.$("button").prop("disabled", false); this.$(".disable-layer").remove(); - this.$(".name > div").prop("contenteditable", true); + + //Make the name cell editable again + if(this.model.get("type") != "Metadata") + this.$(".name > div").prop("contenteditable", true); + this.$el.removeClass("error-saving"); }, diff --git a/metacatui/src/main/webapp/js/views/metadata/EML211View.js b/metacatui/src/main/webapp/js/views/metadata/EML211View.js index 1a44a4eed..eaa41bbcb 100644 --- a/metacatui/src/main/webapp/js/views/metadata/EML211View.js +++ b/metacatui/src/main/webapp/js/views/metadata/EML211View.js @@ -191,12 +191,10 @@ define(['underscore', 'jquery', 'backbone', var overviewEl = this.$container.find(".overview"); $(overviewEl).html(this.overviewTemplate()); - // pubDate - // BDM: This isn't a createBasicText call because that helper - // assumes multiple values for the category - // TODO: Consider a re-factor of createBasicText - var pubDateInput = $(overviewEl).find("input.pubDate").val(this.model.get("pubDate")); - + //Title + var titleEl = this.createBasicTextFields("title", "Example: Greater Yellowstone Rivers from 1:126,700 U.S. Forest Service Visitor Maps (1961-1983)", false); + $(overviewEl).find(".title-container").append(titleEl); + //Abstract _.each(this.model.get("abstract"), function(abs){ var abstractEl = this.createEMLText(abs, edit, "abstract"); @@ -236,6 +234,13 @@ define(['underscore', 'jquery', 'backbone', //Funding this.renderFunding(); + + // pubDate + // BDM: This isn't a createBasicText call because that helper + // assumes multiple values for the category + // TODO: Consider a re-factor of createBasicText + var pubDateInput = $(overviewEl).find("input.pubDate").val(this.model.get("pubDate")); + //Initialize all the tooltips this.$(".tooltip-this").tooltip(); @@ -1276,15 +1281,12 @@ define(['underscore', 'jquery', 'backbone', /* * Creates and returns an array of basic text input field for editing */ - createBasicTextFields: function(category, placeholder, appendNew){ + createBasicTextFields: function(category, placeholder){ var textContainer = $(document.createElement("div")).addClass("text-container"), modelValues = this.model.get(category), textRow; // Holds the DOM for each field - - if(typeof appendNew === "undefined") - var appendNew = true; - + //Format as an array if(!Array.isArray(modelValues) && modelValues) modelValues = [modelValues]; @@ -1301,7 +1303,7 @@ define(['underscore', 'jquery', 'backbone', textContainer.append(textRow); //At the end, append an empty input for the user to add a new one - if(i+1 == allModelValues.length && appendNew) { + if(i+1 == allModelValues.length && category != "title") { var newRow = $($(document.createElement("div")).addClass("basic-text-row")); newRow.append(input.clone().addClass("new").attr("placeholder", placeholder || "Add a new " + category)); textContainer.append(newRow); @@ -1349,19 +1351,20 @@ define(['underscore', 'jquery', 'backbone', var position = $(e.target).parents("div.text-container").first().children("div").index($(e.target).parent()); currentValue[position] = value; model.set(category, currentValue); - model.trigger("change"); + model.trigger("change:" + category); } //Update the model if the current value is a string else if(typeof currentValue == "string"){ model.set(category, [currentValue, value]); - model.trigger("change"); + model.trigger("change:" + category); } else if(!currentValue) { model.set(category, [value]); + model.trigger("change:" + category); } //Add another blank text input - if($(e.target).is(".new") && value != ''){ + if($(e.target).is(".new") && value != '' && category != "title"){ $(e.target).removeClass("new"); this.addBasicText(e); } @@ -1390,11 +1393,14 @@ define(['underscore', 'jquery', 'backbone', var category = $(e.target).attr("data-category"), allBasicTexts = $(".basic-text.new[data-category='" + category + "']"); - //Only show one new keyword row at a time + //Only show one new row at a time if((allBasicTexts.length == 1) && !allBasicTexts.val()) return; else if(allBasicTexts.length > 1) return; + //We are only supporting one title right now + else if(category == "title") + return; //Add another blank text input var newRow = $(document.createElement("div")).addClass("basic-text-row"); @@ -1407,7 +1413,7 @@ define(['underscore', 'jquery', 'backbone', $(e.target).parent().after(newRow); - $(e.target).after(this.createRemoveButton(null, 'alternateIdentifier', '.basic-text-row', "div.text-container")); + $(e.target).after(this.createRemoveButton(null, category, '.basic-text-row', "div.text-container")); }, previewTextRemove: function(e){ From bb54be1a95c4b186d4269060a11626125e1a237b Mon Sep 17 00:00:00 2001 From: laurenwalker Date: Mon, 23 Oct 2017 14:32:21 -0400 Subject: [PATCH 436/560] Show the required red asterisk icon in the Editor vertical navigation / table of contents Closes #302 --- .../src/main/webapp/js/templates/dataItem.html | 2 +- .../src/main/webapp/js/templates/metadata/eml.html | 6 ++++++ .../main/webapp/js/views/metadata/EML211View.js | 14 ++++++++++++-- 3 files changed, 19 insertions(+), 3 deletions(-) diff --git a/metacatui/src/main/webapp/js/templates/dataItem.html b/metacatui/src/main/webapp/js/templates/dataItem.html index 8f6430012..d4f4356e0 100644 --- a/metacatui/src/main/webapp/js/templates/dataItem.html +++ b/metacatui/src/main/webapp/js/templates/dataItem.html @@ -57,7 +57,7 @@ <% } else if( type != "Metadata" && numAttributes > 0 && hasAttributeChanges && entityIsValid ) { %> <% } else if( type != "Metadata" && !entityIsValid ) { %> - + <% } else if( uploadStatus == "c" ) { %> <% } else if( uploadStatus == "e" ) { %> diff --git a/metacatui/src/main/webapp/js/templates/metadata/eml.html b/metacatui/src/main/webapp/js/templates/metadata/eml.html index 5c5f8cbd6..fcd9d0989 100644 --- a/metacatui/src/main/webapp/js/templates/metadata/eml.html +++ b/metacatui/src/main/webapp/js/templates/metadata/eml.html @@ -5,36 +5,42 @@ Overview +
  • People +
  • Dates +
  • Locations +
  • Taxa +
  • Methods +