From f7bd53a2313eeebf0a4b41e0b859bd660196cd4d Mon Sep 17 00:00:00 2001 From: James Case Date: Thu, 19 Jan 2017 02:11:05 -0500 Subject: [PATCH 01/26] Adds initial cut at reworked home page navigation using status routes. --- Gruntfile.js | 3 +- bower.json | 4 +- .../asset_management/SiteStatusModel.js | 125 +++++ .../js/models/science/ArrayStatusModel.js | 438 +++++++++--------- .../ArrayContentSummaryItem.html | 47 +- .../js/views/common/DropdownUserView.js | 2 +- .../views/home/array_content/array_content.js | 101 ++-- .../home/array_content/status_content.js | 4 +- .../static/js/views/home/tile_map/tile_map.js | 369 ++++++++------- ooiui/templates/common/home.html | 207 ++++----- 10 files changed, 746 insertions(+), 554 deletions(-) create mode 100644 ooiui/static/js/models/asset_management/SiteStatusModel.js diff --git a/Gruntfile.js b/Gruntfile.js index c91cd0993..a4b4c622a 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -10,7 +10,7 @@ module.exports = function(grunt) { ], "ooiui/static/js/partials/compiled/home.js": [ "ooiui/static/js/partials/home/array_content/ArrayContentSummaryItem.html", - "ooiui/static/js/partials/home/array_content/ArrayStatusSummaryItem.html", + //"ooiui/static/js/partials/home/array_content/ArrayStatusSummaryItem.html", "ooiui/static/js/partials/home/array_content/PlatformTable.html", "ooiui/static/js/partials/home/array_content/PlatformTableItem.html" ], @@ -966,6 +966,7 @@ module.exports = function(grunt) { 'ooiui/static/js/models/asset_management/PlatformDeploymentModel.js', 'ooiui/static/js/models/science/ArrayModel.js', 'ooiui/static/js/models/science/ArrayStatusModel.js', + 'ooiui/static/js/models/asset_management/SiteStatusModel.js', 'ooiui/static/js/models/science/StreamModel.js', 'ooiui/static/js/models/common/MessageModel.js', 'ooiui/static/js/models/common/LoginModel.js', diff --git a/bower.json b/bower.json index 93c219cff..b1521fcd4 100644 --- a/bower.json +++ b/bower.json @@ -66,7 +66,9 @@ "requirejs": "~2.2.0", "moment-range": "^2.2.0", "jQRangeSlider": "https://github.com/maka-io/jQRangeSlider.git#master", - "visavail": "https://github.com/flrs/visavail.git#master" + "visavail": "https://github.com/flrs/visavail.git#master", + "mapbox-gl-js": "https://github.com/mapbox/mapbox-gl-js.git#0.17.0", + "mapbox.js": "2.4.0" }, "resolutions": { "jquery": "~2.1.1", diff --git a/ooiui/static/js/models/asset_management/SiteStatusModel.js b/ooiui/static/js/models/asset_management/SiteStatusModel.js new file mode 100644 index 000000000..0d1c6e437 --- /dev/null +++ b/ooiui/static/js/models/asset_management/SiteStatusModel.js @@ -0,0 +1,125 @@ +/* Created by Jim Case + * + * @defaults + * id: The full object identification path. may be left out in response. + * name: The name of the document + * url: The downlaod URL of the ojbect. + * + */ + +/* { + "depth": null, + "display_name": "Oregon Slope Base Shallow Profiler Mooring", + "latitude": 44.52897, + "longitude": -125.38966, + "maxdepth": 2905.0, + "mindepth": 5.0, + "reason": null, + "reference_designator": "RS01SBPS", + "status": "notTracked", + "uid": "ATAPL-68870-001-0143", + "waterDepth": null + },*/ +var SiteStatusModel = Backbone.Model.extend({ + defaults: { + depth: null, + display_name: "", + latitude: null, + longitude: null, + maxdepth: null, + mindepth: null, + reason: null, + reference_designator: "", + status: "", + uid: "", + waterDepth: null + }, + toGeoJSON: function() { + var attrs = _.clone(this.attributes), + newArray = [attrs.longitude.toFixed(5), attrs.latitude.toFixed(5)]; + + var geoJSON = { + "type": "Feature", + "properties": { + "description": ""+attrs.display_name+"", + "code": attrs.reference_designator, + "title": attrs.display_name, + "marker-symbol": (attrs.reference_designator.indexOf('GL') > -1) ? 'airfield_icon' : 'harbor_icon', + "depth": attrs.depth, + "status": attrs.status + }, + "geometry": { + "type": "Point", + "coordinates": newArray + } + + }; + return geoJSON; + } +}); + +/* Created by M@Campbell + * + * Simple collection. + * + */ + +var SiteStatusCollection = Backbone.Collection.extend({ + model: SiteStatusModel, +/* url: function(reference_designator) { + // if the constructor contains a searchId, modify the url. + var url = '/api/uframe/status/sites/'; + console.log(this); + return (reference_designator) ? url + reference_designator || "" : url; + },*/ + toGeoJSON: function() { + var geoJSONified = this.map(function(model) { + return model.toGeoJSON(); + }); + return geoJSONified; + }, + parse: function(response) { + console.log(response); + 'use strict'; + // if the response is valid, return the results object + if (response) { return response.sites; } else { return []; } + }, + sortByField: function(field, direction){ + var sorted = _.sortBy(this.models, function(model){ + return model.get(field); + }); + + if(direction === 'descending'){ + sorted = sorted.reverse() + } + + this.models = sorted; + }, + byGliders: function() { + var filtered = this.filter(function (platform) { + if (platform.get('reference_designator') !== "") { + return platform.get('reference_designator').indexOf('GL') > -1; + } + }); + return new PlatformCollection(filtered); + }, + byMoorings: function() { + var filtered = this.filter(function (platform) { + if (platform.get('reference_designator') !== "" && platform.get('reference_designator').length === 8) { + return platform.get('reference_designator').indexOf('GL') < 0; + } + }); + return new PlatformCollection(filtered); + }, + byArray: function(array) { + var filtered = this.filter(function (platform) { + if (platform.get('reference_designator') !== "" && (platform.get('reference_designator').length === 14 || + platform.get('reference_designator').indexOf('GL') > -1) || platform.get('reference_designator').length === 8) { + return platform.get('reference_designator').substr(0,2) === array; + } + }); + return new PlatformCollection(filtered); + }, + initialize: function () { + } +}); diff --git a/ooiui/static/js/models/science/ArrayStatusModel.js b/ooiui/static/js/models/science/ArrayStatusModel.js index 5faf1e912..7fe2388cb 100644 --- a/ooiui/static/js/models/science/ArrayStatusModel.js +++ b/ooiui/static/js/models/science/ArrayStatusModel.js @@ -1,6 +1,6 @@ "use strict"; /* - * ooiui/static/js/models/science/ArrayModel.js + * ooiui/static/js/models/science/ArrayStatusModel.js * Model definitions for Arrays * * Dependencies @@ -12,236 +12,238 @@ * Usage */ -var GetArrayStatus = function(array_code) { - //console.log(array_code); - //console.log(platform_ref_des); - var output = "Fetching Status Failed"; - $.ajax('/api/uframe/status/arrays', { - type: 'GET', - dataType: 'json', - timeout: 5000, - async: false, - success: function (resp) { - console.log('Success getting array status'); - console.log(resp); - var result = $.grep(resp.arrays, function(e){ return e.reference_designator == array_code; }); - //console.log('result'); - //console.log(result); - if (result.length == 0) { - //console.log('No Status Returned'); - output = "No Status Returned"; - } else if (result.length == 1) { - // access the foo property using result[0].foo - //console.log('Found: ' + platform_ref_des); - //console.log(result[0].status); - output = result[0].status.legend; - } else { - // multiple items found - //console.log('Multiple Status Returned'); - output = 'Multiple Status Returned'; - } - }, - - error: function( req, status, err ) { - console.log(req); - } - }); - return output; +/*var GetArrayStatus = function(array_code) { + //console.log(array_code); + //console.log(platform_ref_des); + var output = "Fetching Status Failed"; + $.ajax('/api/uframe/status/arrays', { + type: 'GET', + dataType: 'json', + timeout: 5000, + async: false, + success: function (resp) { + // console.log('Success getting array status'); + // console.log(resp); + var result = $.grep(resp.arrays, function(e){ return e.reference_designator == array_code; }); + //console.log('result'); + //console.log(result); + if (result.length == 0) { + //console.log('No Status Returned'); + output = "No Status Returned"; + } else if (result.length == 1) { + // access the foo property using result[0].foo + //console.log('Found: ' + platform_ref_des); + //console.log(result[0].status); + output = result[0].status.legend; + } else { + // multiple items found + //console.log('Multiple Status Returned'); + output = 'Multiple Status Returned'; + } + }, + + error: function( req, status, err ) { + console.log(req); + } + }); + return output; }; var GetPlatformStatus = function(array_code, platform_ref_des) { - //console.log(array_code); - //console.log(platform_ref_des); - var output = {"status": "Fetching Status Failed", "mindepth": 0.0, "maxdepth": 0.0}; - $.ajax('/api/uframe/status/sites/' + array_code, { - type: 'GET', - dataType: 'json', - timeout: 5000, - async: false, - success: function (resp) { - //console.log('success getting platform status: ' + platform_ref_des); - //console.log(resp); - //console.log(resp.sites); - //var theStatus = $.map(resp.sites, function(val) { - // return val.reference_designator == platform_ref_des ? val.status : 'No Status Returned'; - //}); - //console.log(theStatus); - //return theStatus - var result = $.grep(resp.sites, function(e){ return e.reference_designator == platform_ref_des; }); - //console.log('result'); - //console.log(result); - if (result.length == 0) { - //console.log('No Status Returned'); - output.status = "No Status Returned"; - output.mindepth = "Unavailable"; - output.maxdepth = "Unavailable"; - } else if (result.length == 1) { - // access the foo property using result[0].foo - //console.log('Found: ' + platform_ref_des); - //console.log(result[0].status); - output.status = result[0].status; - output.mindepth = result[0].mindepth; - output.maxdepth = result[0].maxdepth; - } else { - // multiple items found - //console.log('Multiple Status Returned'); - output.status = 'Multiple Status Returned'; - output.mindepth = "Unavailable"; - output.maxdepth = "Unavailable"; - } - - }, - - error: function( req, status, err ) { - console.log(req); - } - }); - return output; + //console.log(array_code); + //console.log(platform_ref_des); + var output = {"status": "Fetching Status Failed", "mindepth": 0.0, "maxdepth": 0.0}; + $.ajax('/api/uframe/status/sites/' + array_code, { + type: 'GET', + dataType: 'json', + timeout: 5000, + async: false, + success: function (resp) { + var result = $.grep(resp.sites, function(e){ return e.reference_designator == platform_ref_des; }); + + if (result.length == 0) { + //console.log('No Status Returned'); + output.status = "No Status Returned"; + output.mindepth = "Unavailable"; + output.maxdepth = "Unavailable"; + } else if (result.length == 1) { + // access the foo property using result[0].foo + //console.log('Found: ' + platform_ref_des); + //console.log(result[0].status); + output.status = result[0].status; + output.mindepth = result[0].mindepth; + output.maxdepth = result[0].maxdepth; + } else { + // multiple items found + //console.log('Multiple Status Returned'); + output.status = 'Multiple Status Returned'; + output.mindepth = "Unavailable"; + output.maxdepth = "Unavailable"; + } + }, + + error: function( req, status, err ) { + console.log(req); + } + }); + return output; }; var GetSitesStatus = function(array_code) { - //console.log(array_code); - //console.log(platform_ref_des); - - var allSitesStatus = []; - - $.ajax('/api/uframe/status/sites/' + array_code, { - type: 'GET', - dataType: 'json', - timeout: 500, - async: false, - success: function (resp) { - - // console.log('resp'); - // console.log(resp); - var theSites = resp.sites; - _.each(theSites, function(site){ - var output = {}; - output.geometry = {}; - output.geometry.coordinates = [null,null]; - output.geometry.type = "Point"; - output.properties = {}; - // console.log('site'); - // console.log(site); - output.geometry.coordinates = [site.longitude, site.latitude]; - output.properties['code'] = site.reference_designator; - output.properties['depth'] = site.depth; - output.properties['waterDepth'] = site.waterDepth; - output.properties['mindepth'] = site.mindepth; - output.properties['maxdepth'] = site.maxdepth; - output.properties['description'] = site.display_name; - output.properties['marker-symbol'] = "harbor_icon"; - output.properties['title'] = site.display_name; - output.properties['status'] = site.status; - - // console.log('output before push'); - // console.log(output); - - allSitesStatus.push(output); - // console.log('allSitesStatus'); - // console.log(allSitesStatus); - }); - - }, - - error: function( req, status, err ) { - console.log(req); - } - }); - return allSitesStatus; -}; + //console.log(array_code); + //console.log(platform_ref_des); + + var allSitesStatus = []; + + $.ajax('/api/uframe/status/sites/' + array_code, { + type: 'GET', + dataType: 'json', + timeout: 500, + async: false, + success: function (resp) { + + // console.log('resp'); + // console.log(resp); + var theSites = resp.sites; + _.each(theSites, function(site){ + var output = {}; + output.geometry = {}; + output.geometry.coordinates = [null,null]; + output.geometry.type = "Point"; + output.properties = {}; + // console.log('site'); + // console.log(site); + output.geometry.coordinates = [site.longitude, site.latitude]; + output.properties['code'] = site.reference_designator; + output.properties['depth'] = site.depth; + output.properties['waterDepth'] = site.waterDepth; + output.properties['mindepth'] = site.mindepth; + output.properties['maxdepth'] = site.maxdepth; + output.properties['description'] = site.display_name; + output.properties['marker-symbol'] = "harbor_icon"; + output.properties['title'] = site.display_name; + output.properties['status'] = site.status; + + output.type = "Feature"; + + // console.log('output before push'); + // console.log(output); + + allSitesStatus.push(output); + // console.log('allSitesStatus'); + // console.log(allSitesStatus); + }); -var ArrayStatusModel = OOI.RelationalModel.extend({ - urlRoot: '/api/array', - defaults: { - id: null, - array_code: null, - array_name: null, - display_name: null, - geo_location: [], - description: null - }, - parse: function(data) { - // we have the cabled array at the same location as the coastal endurance, - // the cabled array is a bit farther off set from the endurance. - var attrs = _.clone(data), - cabledArray = [[[45.8305, -128.7533]]]; - - if (attrs.array_code.indexOf('RS') > -1) { - attrs.geo_location.coordinates = cabledArray; - } - return data; }, - // geoJSON - toGeoJSON: function() { - var attrs = _.clone(this.attributes), - coorArray = attrs.geo_location.coordinates, - newArray = [coorArray[0][0][1], coorArray[0][0][0]], - polyArray = []; - - - - // mapbox GL expects lng, lat - if (coorArray[0][0].length > 0) { - _.each(coorArray[0], function(item) { - polyArray.push([item[1], item[0]]); - }); - } - - if (attrs.array_code.indexOf('RS') > -1) { - newArray = [-128.7533, 45.8305]; - } - - if (!attrs.platforms) { - attrs.platforms = []; - } else { - _.each(attrs.platforms, function(platform) { - platform.properties.title = platform.properties.title.replace(attrs.display_name, ''); - var statusReturn = GetPlatformStatus(attrs.array_code, platform.properties.code); - //console.log(statusReturn); - platform.properties.status = statusReturn.status; - platform.properties.mindepth = statusReturn.mindepth; - platform.properties.maxdepth = statusReturn.maxdepth; - }); - } - - //console.log(attrs.platforms); - - var geoJSON = { - "type": "Feature", - "properties": { - "description": ""+attrs.array_name+"", - "code": attrs.array_code, - "title": attrs.array_name, - "marker-symbol": 'dot', - "platforms": attrs.platforms, - "status": GetArrayStatus(attrs.array_code) - }, - "geometry": { - "type": "Point", - "coordinates": newArray - } - - }; - return geoJSON; + + error: function( req, status, err ) { + console.log(req); } + }); + return allSitesStatus; +};*/ + + +/* { + "display_name": "Global Southern Ocean", + "latitude": -54.0814, + "longitude": -89.6652, + "reason": null, + "reference_designator": "GS", + "status": { + "count": 0, + "legend": { + "degraded": 0, + "failed": 0, + "notTracked": 0, + "operational": 0, + "removedFromService": 0 + } + } + },*/ +var ArrayStatusModel = OOI.RelationalModel.extend({ + urlRoot: '/api/uframe/status/arrays', + defaults: { + display_name: "", + latitude: null, + longitude: null, + reason: "", + reference_designator: "", + status: {}, + count: null, + legend: {}, + platforms: [] + }, + parse: function(data) { + // we have the cabled array at the same location as the coastal endurance, + // the cabled array is a bit farther off set from the endurance. + var attrs = _.clone(data), + cabledArrayLat = 45.8305, + cabledArrayLon = -128.7533; + + if (attrs.reference_designator.indexOf('RS') > -1) { + attrs.latitude = cabledArrayLat; + attrs.longtiude = cabledArrayLon; + } + + attrs.code = attrs.reference_designator; + return data; + }, + // geoJSON + toGeoJSON: function() { + var attrs = _.clone(this.attributes), + newArray = [attrs.longitude, attrs.latitude]; + + if (attrs.reference_designator.indexOf('RS') > -1) { + newArray = [-128.7533, 45.8305]; + } + + var geoJSON = { + "type": "Feature", + "properties": { + "description": ""+attrs.display_name+"", + "code": attrs.reference_designator, + "title": attrs.display_name, + "marker-symbol": 'dot', + "platforms": attrs.platforms + //"platforms": GetSitesStatus(attrs.reference_designator) + }, + "geometry": { + "type": "Point", + "coordinates": newArray + } + + }; + return geoJSON; + } }); var ArrayStatusCollection = Backbone.Collection.extend({ - url: '/api/array', - model: ArrayStatusModel, - parse: function(response) { - if (response) { - return response.arrays; - } - return []; - }, - toGeoJSON: function() { - var geoJSONified = this.map(function(model) { - return model.toGeoJSON(); - }); - return geoJSONified; + url: '/api/uframe/status/arrays', + model: ArrayStatusModel, + parse: function(response) { + if (response) { + return response.arrays; + } + return []; + }, + toGeoJSON: function() { + var geoJSONified = this.map(function(model) { + return model.toGeoJSON(); + }); + return geoJSONified; + }, + sortByField: function(field, direction){ + var sorted = _.sortBy(this.models, function(model){ + return model.get(field); + }); + + if(direction === 'descending'){ + sorted = sorted.reverse() } + + this.models = sorted; + } }); diff --git a/ooiui/static/js/partials/home/array_content/ArrayContentSummaryItem.html b/ooiui/static/js/partials/home/array_content/ArrayContentSummaryItem.html index 01c89e5b1..50d45035a 100644 --- a/ooiui/static/js/partials/home/array_content/ArrayContentSummaryItem.html +++ b/ooiui/static/js/partials/home/array_content/ArrayContentSummaryItem.html @@ -1,3 +1,9 @@ +<% +console.log('in arraycontentsummaryitem'); +console.log(this); +console.log('properties'); +console.log(properties); +%>

<%= properties.description %>

@@ -6,7 +12,7 @@

<%= properties.description %><
@@ -122,19 +128,22 @@

<%= properties.description %><

**Note: Several of the Endurance Array platforms are connected to the seafloor cable and provide near real-time streaming data, but they are not found in the list of Cabled Array platforms below. They are considered part of the Endurance Array because the platforms are located at Endurance sites and have a focus on coastal processes. Information on Coastal Endurance cabled platforms can be found in the Endurance Array section, or can be accessed in the data catalog by doing a text search on the word 'cabled'.

+ <% //console.log('This is the RS array trying to print out'); %>

<% } %>

- <% if (properties.platforms.length > 0) { %> +

Sites Select a site to find out more.

- + - <% _.each(properties.platforms, function(platform) { %> + + <% _.each(this.model.attributes.platforms, function(platform) { %> + <% //console.log(platform); %> + @@ -154,10 +186,7 @@

<%= properties.description %><

NavigationSite NameDepth (meters)LatitudeLongitude
NavigationStatusSite NameDeployment DepthLatitudeLongitude
    @@ -142,9 +151,32 @@

    <%= properties.description %><
  •  
+
    + <% //console.log(platform.properties.status); %> + + <% if(platform.properties.status == "failed") { %> +
  • + <% } else if(platform.properties.status == "degraded") { %> +
  • + <% } else if(platform.properties.status == "removedFromService") { %> +
  • + <% } else if(platform.properties.status == "notTracked") { %> +
  • + <% } else if(platform.properties.status == "Fetching Status Failed") { %> +
  • + <% } else if(platform.properties.status == "No Status Returned") { %> +
  • + <% } else if(platform.properties.status == "operational") { %> +
  • + <% } else { %> +
  • + <% } %> +
+
- <%= platform.properties.depth %>
- <% } else { %> -

Site list for this research array is currently unavailable.

- <% } %>
Close
diff --git a/ooiui/static/js/views/common/DropdownUserView.js b/ooiui/static/js/views/common/DropdownUserView.js index 9b2d7765c..9884c7e26 100644 --- a/ooiui/static/js/views/common/DropdownUserView.js +++ b/ooiui/static/js/views/common/DropdownUserView.js @@ -22,7 +22,7 @@ var DropdownUserView = Backbone.View.extend({ login: function() { var self = this; var loginview = new LoginView({ - model: self.model, + model: self.model }); $('body').append(loginview.el); loginview.isHidden = true; // allow the dialog to be hidden diff --git a/ooiui/static/js/views/home/array_content/array_content.js b/ooiui/static/js/views/home/array_content/array_content.js index 5a2ce8f25..f951fd59c 100644 --- a/ooiui/static/js/views/home/array_content/array_content.js +++ b/ooiui/static/js/views/home/array_content/array_content.js @@ -14,6 +14,8 @@ var ParentView = Backbone.View.extend({ // object in the partial you are referencing the ArrayModel's .toGeoJSON() method // return, and not the actual model. // e.g. properties.description NOT this.model.attributes. . . + // console.log('ParentView render'); + // console.log(this.model); this.$el.html(this.template(this.model.toGeoJSON())); } else { this.$el.html(this.template()); @@ -102,37 +104,54 @@ var ArrayContentSummary = ParentView.extend({ } }); }, - render: function() { - var arrayContentContext = this; - - //console.log('arrayCollection'); - //console.log(this.collection.arrayCollection); - - var arrayContentSummaryItem = this.collection.arrayCollection.map(function(model) { - // lets get all the platforms for this particular array... - var platforms = arrayContentContext - .collection - .platformCollection - .byArray(model.attributes.array_code); - - // then we can set an object on the array model, so we have a geoJSON - // representation of all of the array's platforms, with lng/lat - model.set({platforms: platforms.toGeoJSON()}); - - // finally, return the array content summary, which will also contain - // it's platforms to be displayed after the array is inspected. - //console.log('render arrays'); - //console.log(model); - return (new ArrayContentSummaryItem({model: model})).render().el; - }); - - // prepend the arrays to the page. - setTimeout(function() { - arrayContentContext.$el.prepend(arrayContentSummaryItem); - $('.js-expand').css({height: Math.floor(vph/arrayContentContext.collection.arrayCollection.length) - - 2 * arrayContentContext.collection.arrayCollection.length + 'px'}); - }, 300); - } + render: function() { + var arrayContentContext = this; + // console.log('arrayContentContext'); + // console.log(arrayContentContext); + + //console.log('arrayCollection'); + //console.log(this.collection.arrayCollection); + + var arrayContentSummaryItem = this.collection.arrayCollection.map(function(model) { + // lets get all the platforms for this particular array... + /* var platforms = arrayContentContext + .collection + .platformCollection + .byArray(model.attributes.array_code);*/ + //var siteStatusCollection = new SiteStatusCollection(); + arrayContentContext.collection.siteStatusCollection.fetch({async: false, url: '/api/uframe/status/sites/'+model.attributes.reference_designator}).done(function() { + arrayContentContext.collection.siteStatusCollection.sortByField('depth','ascending'); + console.log('arrayContentContext.collection.siteStatusCollection.toGeoJSON()'); + console.log(arrayContentContext.collection.siteStatusCollection.toGeoJSON()); + model.set({platforms: arrayContentContext.collection.siteStatusCollection.toGeoJSON()}); + + }); + //model.set({platforms: model.toGeoJSON().properties.platforms}); + + //console.log('render arrays'); + //console.log(model); + // console.log('model before'); + // console.log(model); + + return (new ArrayContentSummaryItem({model: model})).render().el; + }); + + + + + + // console.log('arrayContentSummaryItem'); + // console.log(arrayContentSummaryItem); + // console.log('arrayContentContext.$el'); + // console.log(arrayContentContext.$el); + + // prepend the arrays to the page. + setTimeout(function() { + arrayContentContext.$el.prepend(arrayContentSummaryItem); + $('.js-expand').css({height: Math.floor(vph/arrayContentContext.collection.arrayCollection.length) - + 2 * arrayContentContext.collection.arrayCollection.length + 'px'}); + }, 300); + } }); var ArrayContentSummaryItem = ParentView.extend({ @@ -196,8 +215,10 @@ var ArrayContentSummaryItem = ParentView.extend({ // _flyBye and flyFly are controls that interact directly with the global map variable. // because of this, the ArrayContentSummary Item is tightly coupled to the VectorMap _toggleActive: function(event) { - var el = $('#'+this.model.attributes.array_code); + var el = $('#'+this.model.attributes.reference_designator); //toggle current one class + console.log('toggle active'); + console.log(el); el.toggleClass('active'); //remove any existing actives @@ -206,7 +227,7 @@ var ArrayContentSummaryItem = ParentView.extend({ } }, _toggleOthers: function(event) { - var el = $('#'+this.model.attributes.array_code), + var el = $('#'+this.model.attributes.reference_designator), arrayEl = $('.js-array'); _.each(arrayEl, function(item) { @@ -243,15 +264,17 @@ var ArrayContentSummaryItem = ParentView.extend({ map._showPlatformView(); event.stopImmediatePropagation(); //flyFlyContext.originalZoom; + console.log('flyFlyContext.model.attributes.reference_designator'); + console.log(flyFlyContext.model.attributes.reference_designator); $.when(this._toggleActive(event)).done(function() { $.when(flyFlyContext._toggleOthers(event)).done(function() { - var el = $('#'+flyFlyContext.model.attributes.array_code), + var el = $('#'+flyFlyContext.model.attributes.reference_designator), table = '#' + el.attr('id') + ' > .js-platform-table'; $(table).slideToggle(); // give the impression that the page has changed, change the title. - bannerTitle = flyFlyContext.model.attributes.array_name; + bannerTitle = flyFlyContext.model.attributes.display_name; banner.changeTitle({bannerTitle}); }); }); @@ -283,11 +306,11 @@ var ArrayContentSummaryItem = ParentView.extend({ // map._setPlatformView(); var loc = [ - this.model.attributes.geo_location.coordinates[0][0][0], - this.model.attributes.geo_location.coordinates[0][0][1] + flyFlyContext.model.attributes.latitude, + flyFlyContext.model.attributes.longitude ], - code = this.model.attributes.array_code, - name = this.model.attributes.array_name; + code = flyFlyContext.model.attributes.reference_designator, + name = flyFlyContext.model.attributes.display_name; if (code === 'CE') { if ( !_compareGeoLoc(map.getCenter(), loc) ) { diff --git a/ooiui/static/js/views/home/array_content/status_content.js b/ooiui/static/js/views/home/array_content/status_content.js index 02da186fe..76bc7e2c3 100644 --- a/ooiui/static/js/views/home/array_content/status_content.js +++ b/ooiui/static/js/views/home/array_content/status_content.js @@ -28,7 +28,7 @@ var ParentView = Backbone.View.extend({ } }); -var ArrayContentSummary = ParentView.extend({ +var ArrayContentStatusSummary = ParentView.extend({ events: { 'mouseover .js-expand': '_highlightArray', 'mouseout .js-expand': '_lowlightArray', @@ -331,5 +331,5 @@ var ArrayContentSummaryItem = ParentView.extend({ } } }, 500, true), - template: JST['ooiui/static/js/partials/home/array_content/ArrayStatusSummaryItem.html'] + template: JST['ooiui/static/js/partials/home/array_content/ArrayStatusdfgdfSummaryItem.html'] }); diff --git a/ooiui/static/js/views/home/tile_map/tile_map.js b/ooiui/static/js/views/home/tile_map/tile_map.js index e1a094227..f8700b049 100644 --- a/ooiui/static/js/views/home/tile_map/tile_map.js +++ b/ooiui/static/js/views/home/tile_map/tile_map.js @@ -1,183 +1,200 @@ var TileMap = Backbone.View.extend({ - initialize: function() { - // The geoJSON data, d3.json(); - return this; - }, - _onBeforeRender: function() { - try { - - var map = L.map(this.id, { - zoomControl: false - }).setView([15.8, -90], 2); - // Commenting this out for now until security and web mapping service performance are resolved -/* L.tileLayer.wms('http://gmrt.marine-geo.org/cgi-bin/mapserv?map=/public/mgg/web/gmrt.marine-geo.org/htdocs/services/map/wms_merc.map&', { - max_zoom: 13, - layers: 'topo', - format: 'image/png', - transparent: true, - crs: L.CRS.EPSG4326, - attribution: 'Global Multi-Resolution Topography (GMRT), Version 3.2' - }) - .addTo(map);*/ - - L.tileLayer('https://server.arcgisonline.com/ArcGIS/rest/services/Ocean_Basemap/MapServer/tile/{z}/{y}/{x}', { - attribution: 'Tiles © Esri — Sources: GEBCO, NOAA, CHS, OSU, UNH, CSUMB, National Geographic, DeLorme, NAVTEQ, and Esri', maxZoom: 13}) - .addTo(map); - - map.dragging.disable(); - map.touchZoom.disable(); - map.doubleClickZoom.disable(); - map.scrollWheelZoom.disable(); - map.keyboard.disable(); - - // add some methods that can be useful to our map object. - map._resizeMap = this._resizeMap; - map._setArrayView = this._setArrayView; - - map._hidePlatformView = this._hidePlatformView; - map._showPlatformView = this._showPlatformView; - return map; - - } catch (error) { - console.log(error); - debugger; + initialize: function() { + // The geoJSON data, d3.json(); + return this; + }, + _onBeforeRender: function() { + try { + + var map = L.map(this.id, { + zoomControl: false + }).setView([15.8, -90], 2); + // Commenting this out for now until security and web mapping service performance are resolved + L.tileLayer.wms('http://gmrt.marine-geo.org/cgi-bin/mapserv?map=/public/mgg/web/gmrt.marine-geo.org/htdocs/services/map/wms_merc.map&', { + max_zoom: 13, + layers: 'topo', + format: 'image/png', + transparent: true, + crs: L.CRS.EPSG4326, + attribution: 'Global Multi-Resolution Topography (GMRT), Version 3.2' + }).addTo(map); + + /* L.tileLayer('https://server.arcgisonline.com/ArcGIS/rest/services/Ocean_Basemap/MapServer/tile/{z}/{y}/{x}', { + attribution: 'Tiles © Esri — Sources: GEBCO, NOAA, CHS, OSU, UNH, CSUMB, National Geographic, DeLorme, NAVTEQ, and Esri', maxZoom: 13}) + .addTo(map);*/ + + /*map.dragging.disable(); + map.touchZoom.disable(); + map.doubleClickZoom.disable(); + map.scrollWheelZoom.disable(); + map.keyboard.disable();*/ + + // add some methods that can be useful to our map object. + map._resizeMap = this._resizeMap; + map._setArrayView = this._setArrayView; + + map._hidePlatformView = this._hidePlatformView; + map._showPlatformView = this._showPlatformView; + return map; + + } catch (error) { + console.log(error); + debugger; + } + }, + _resizeMap: function() { + 'use strict'; + // This can be used to redraw the map. It is a bit strange, as it causes the + // map to flash for a second. + // + // This hook will allow more advanced options to be done before the map is actually + // resized. e.g. resize the map frame first so the focus persists. + map.resize(); + }, + _setArrayView: function() { + 'use strict'; + // When we're in the array view, we don't want to show all the platforms + map.setView([30, -70], 2); + + }, + _showPlatformView: function() { + 'use strict'; + // When we're in the platform view, we don't want to see any array icons. + _.each(map._layers, function(platform) { + // console.log('platform'); + // console.log(platform); + if(!_.isUndefined(platform.feature)){ + // console.log('platform.feature.properties.code.length'); + // console.log(platform.feature.properties.code.length); + + if(platform._icon && platform.feature.properties.code.length > 2){ + platform._icon.style.opacity = 1; + platform._icon.style.zIndexOffset = 10000000; + // platform._icon.className = "leaflet-marker-icon mydivicon leaflet-zoom-animated leaflet-clickable" + } + if(platform._icon && platform.feature.properties.code.length < 3){ + // console.log('Are we turning off the arrays or not?'); + $(platform._icon).hide(); + platform._icon.style.opacity = 0; + platform._icon.style.zIndex = -1; + // platform._icon.className = "leaflet-marker-icon mydivicon-nopointer leaflet-zoom-animated" + } + } + }); + }, + _hidePlatformView: function() { + 'use strict'; + // When we're in the platform view, we don't want to see any array icons. + _.each(map._layers, function(platform) { + if(!_.isUndefined(platform.feature)) { + // console.log('platform.feature.properties.code.length'); + // console.log(platform.feature.properties.code.length); + if (platform._icon && platform.feature.properties.code.length > 2) { + platform._icon.style.opacity = 0; + platform._icon.style.zIndex = -1; + // platform._icon.className = "leaflet-marker-icon mydivicon-nopointer leaflet-zoom-animated" } - }, - _resizeMap: function() { - 'use strict'; - // This can be used to redraw the map. It is a bit strange, as it causes the - // map to flash for a second. - // - // This hook will allow more advanced options to be done before the map is actually - // resized. e.g. resize the map frame first so the focus persists. - map.resize(); - }, - _setArrayView: function() { - 'use strict'; - // When we're in the array view, we don't want to show all the platforms - map.setView([15.8, -90], 2); - - }, - _showPlatformView: function() { - 'use strict'; - // When we're in the platform view, we don't want to see any array icons. - _.each(map._layers, function(platform) { - - if(!_.isUndefined(platform.feature)){ - // console.log('platform.feature.properties.code.length'); - // console.log(platform.feature.properties.code.length); - - if(platform._icon && platform.feature.properties.code.length > 2){ - platform._icon.style.opacity = 1; - platform._icon.style.zIndexOffset = 10000000; - // platform._icon.className = "leaflet-marker-icon mydivicon leaflet-zoom-animated leaflet-clickable" - } - if(platform._icon && platform.feature.properties.code.length < 3){ - // console.log('Are we turning off the arrays or not?'); - $(platform._icon).hide(); - platform._icon.style.opacity = 0; - platform._icon.style.zIndex = -1; - // platform._icon.className = "leaflet-marker-icon mydivicon-nopointer leaflet-zoom-animated" - } + if (platform._icon && platform.feature.properties.code.length < 3) { + $(platform._icon).show(); + platform._icon.style.opacity = 1; + platform._icon.style.zIndexOffset = 10000000; + // platform._icon.className = "leaflet-marker-icon mydivicon leaflet-zoom-animated leaflet-clickable" + } + } + }); + }, + render: function() { + try { + var renderContext = this; + console.log('renderContext'); + console.log(renderContext); + var arrayIcon = new L.divIcon({className: 'mydivicon', iconSize: [20, 20], opacity: 1}); + var platformIcon = new L.divIcon({className: 'mydivicon-platform', iconSize: [20, 20], opacity: 1}); + + // global + map = this._onBeforeRender(); + + $.when(map).done(function() { + var arrayData = []; + var platformData = []; + _.each(renderContext.collection.arrayCollection.toGeoJSON(), function(geoJSON) { + console.log('geoJSON in array'); + console.log(geoJSON); + arrayData.push(geoJSON); + + console.log('platform data inside arrayCollection toGeoJSON'); + console.log(geoJSON.properties.platforms); + + + _.each(geoJSON.properties.platforms, function(geoJSON) { + console.log('geoJSON in platform'); + console.log(geoJSON); + + if (geoJSON.properties.code.indexOf('MOAS') == -1) { + platformData.push(geoJSON); } + }); }); - }, - _hidePlatformView: function() { - 'use strict'; - // When we're in the platform view, we don't want to see any array icons. - _.each(map._layers, function(platform) { - if(!_.isUndefined(platform.feature)) { - // console.log('platform.feature.properties.code.length'); - // console.log(platform.feature.properties.code.length); - if (platform._icon && platform.feature.properties.code.length > 2) { - platform._icon.style.opacity = 0; - platform._icon.style.zIndex = -1; - // platform._icon.className = "leaflet-marker-icon mydivicon-nopointer leaflet-zoom-animated" - } - if (platform._icon && platform.feature.properties.code.length < 3) { - $(platform._icon).show(); - platform._icon.style.opacity = 1; - platform._icon.style.zIndexOffset = 10000000; - // platform._icon.className = "leaflet-marker-icon mydivicon leaflet-zoom-animated leaflet-clickable" - } + + /* var platformData = []; + _.each(renderContext.collection.arrayCollection.toGeoJSON(), function(geoJSON) { + if (geoJSON.properties.code.indexOf('MOAS') == -1) { + platformData.push(geoJSON); + } + });*/ + + L.geoJson(arrayData, { + + pointToLayer: function(feature, latlng) { + return new L.Marker(latlng, {icon: arrayIcon, zIndexOffset: 1000000}); + }, + onEachFeature: function (feature, layer) { + if(!_.isUndefined(feature.properties)) { + layer.on('click', function (event) { + $('#' + feature.properties.code + ' .js-expand').trigger('click'); + }); + layer.on('mouseover', function (event) { + $('#' + feature.properties.code + ' .js-expand').css("border", "4px solid orange"); + }); + layer.on('mouseout', function (event) { + $('#' + feature.properties.code + ' .js-expand').css("border", ""); + }); } - }); - }, - render: function() { - try { - var renderContext = this; - // console.log(renderContext); - var arrayIcon = new L.divIcon({className: 'mydivicon', iconSize: [20, 20], opacity: 1}); - var platformIcon = new L.divIcon({className: 'mydivicon-platform', iconSize: [20, 20], opacity: 1}); - - // global - map = this._onBeforeRender(); - - $.when(map).done(function() { - var arrayData = []; - _.each(renderContext.collection.arrayCollection.toGeoJSON(), function(geoJSON) { - arrayData.push(geoJSON); - }); - - var platformData = []; - _.each(renderContext.collection.platformCollection.toGeoJSON(), function(geoJSON) { - if (geoJSON.properties.code.indexOf('MOAS') == -1) { - platformData.push(geoJSON); - } - }); - - L.geoJson(arrayData, { - - pointToLayer: function(feature, latlng) { - return new L.Marker(latlng, {icon: arrayIcon, zIndexOffset: 1000000}); - }, - onEachFeature: function (feature, layer) { - if(!_.isUndefined(feature.properties)) { - layer.on('click', function (event) { - $('#' + feature.properties.code + ' .js-expand').trigger('click'); - }); - layer.on('mouseover', function (event) { - $('#' + feature.properties.code + ' .js-expand').css("border", "4px solid orange"); - }); - layer.on('mouseout', function (event) { - $('#' + feature.properties.code + ' .js-expand').css("border", ""); - }); - } - } - }).addTo(map); - - L.geoJson(platformData, { - - pointToLayer: function(feature, latlng) { - return new L.Marker(latlng, {icon: platformIcon}); - }, - onEachFeature: function (feature, layer) { - if(!_.isUndefined(feature.properties)) { - layer.on('mouseover', function (event) { - $('#' + feature.properties.code.substring(0, 2) + ' table tbody tr[data-code="' + feature.properties.code + '"]').css("border", "4px solid orange"); - }); - - layer.on('mouseout', function (event) { - $('#' + feature.properties.code.substring(0, 2) + ' table tbody tr[data-code="' + feature.properties.code + '"]').css("border", ""); - }); - } - } - - }).addTo(map); - - map._hidePlatformView(); - - - //map.on('click', function (e) { - // map.setView([15.8, -90], 2); - // $('.js-array').removeClass('active'); - // $('.js-array').fadeIn(); - // $('.js-platform-table').css('display', 'none'); - //}); - }); - } catch (error) { - console.log(error); - debugger; - } + } + }).addTo(map); + + L.geoJson(platformData, { + + pointToLayer: function(feature, latlng) { + return new L.Marker(latlng, {icon: platformIcon}); + }, + onEachFeature: function (feature, layer) { + if(!_.isUndefined(feature.properties)) { + layer.on('mouseover', function (event) { + $('#' + feature.properties.code.substring(0, 2) + ' table tbody tr[data-code="' + feature.properties.code + '"]').css("border", "4px solid orange"); + }); + + layer.on('mouseout', function (event) { + $('#' + feature.properties.code.substring(0, 2) + ' table tbody tr[data-code="' + feature.properties.code + '"]').css("border", ""); + }); + } + } + + }).addTo(map); + + map._hidePlatformView(); + + + //map.on('click', function (e) { + // map.setView([15.8, -90], 2); + // $('.js-array').removeClass('active'); + // $('.js-array').fadeIn(); + // $('.js-platform-table').css('display', 'none'); + //}); + }); + } catch (error) { + console.log(error); + debugger; } + } }); diff --git a/ooiui/templates/common/home.html b/ooiui/templates/common/home.html index 510887fc9..3c9d39706 100644 --- a/ooiui/templates/common/home.html +++ b/ooiui/templates/common/home.html @@ -1,7 +1,7 @@ {% extends "common/base.html" %} {% block title %} -OOI - Home + OOI - Home {% endblock %} {% block beforebootstrap %} @@ -9,95 +9,91 @@ {% endblock %} {% block head %} - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + {% endblock %} {%block body %} -
+
-
+
-
+
-
-
-
-

Research Arrays Select an array on the map or choose from the list.

-
-
-
- +
+
+
+

Research Arrays Select an array on the map or choose from the list.

+
+
+ +
-
- - - + } + }); + {% endblock %} From 58cd8c129fe09aa17c71d0935494ec4a4e21068e Mon Sep 17 00:00:00 2001 From: James Case Date: Thu, 26 Jan 2017 13:37:38 -0500 Subject: [PATCH 02/26] Interim updates to status main page navigation. --- Gruntfile.js | 1 + .../asset_management/PlatformsStatusModel.js | 174 ++++++++++++++++++ .../platforms/GenericPlatFormStatusView.js | 1 + .../js/views/science/plot/PlotControlView.js | 4 +- ooiui/templates/common/platformStatus.html | 15 +- 5 files changed, 189 insertions(+), 6 deletions(-) create mode 100644 ooiui/static/js/models/asset_management/PlatformsStatusModel.js diff --git a/Gruntfile.js b/Gruntfile.js index a4b4c622a..a8b499ce2 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -1915,6 +1915,7 @@ module.exports = function(grunt) { ], "ooiui/static/js/compiled/genericPlatFormsStatus.js": [ 'ooiui/static/js/models/asset_management/PlatformStatusModel.js', + 'ooiui/static/js/models/asset_management/PlatformsStatusModel.js', 'ooiui/static/js/models/science/StreamStatusModel.js', 'ooiui/static/js/views/platforms/GenericPlatFormStatusView.js', 'ooiui/static/js/views/platforms/GenericPlatFormTableView.js' diff --git a/ooiui/static/js/models/asset_management/PlatformsStatusModel.js b/ooiui/static/js/models/asset_management/PlatformsStatusModel.js new file mode 100644 index 000000000..45e2800d5 --- /dev/null +++ b/ooiui/static/js/models/asset_management/PlatformsStatusModel.js @@ -0,0 +1,174 @@ +/* Created by Jim Case + * + * @defaults + * id: The full object identification path. may be left out in response. + * name: The name of the document + * url: The downlaod URL of the ojbect. + * + */ + +/*{ + "platforms": [ + { + "header": { + "code": "SF", + "status": "degraded", + "title": "Shallow Profiler" + }, + "items": [ + { + "depth": null, + "display_name": "CTD", + "end": "2017-01-19T00:35:00.965Z", + "latitude": 44.52897, + "longitude": -125.38966, + "maxdepth": 200.0, + "mindepth": 5.0, + "reason": null, + "reference_designator": "RS01SBPS-SF01A-2A-CTDPFA102", + "start": "2017-01-18T00:00:00.474Z", + "status": "notTracked", + "uid": "ATAPL-66662-00002", + "waterDepth": null + }, + { + "depth": null, + "display_name": "3-Wavelength Fluorometer", + "end": "2017-01-08T23:59:58.407Z", + "latitude": 44.52897, + "longitude": -125.38966, + "maxdepth": 200.0, + "mindepth": 5.0, + "reason": null, + "reference_designator": "RS01SBPS-SF01A-3A-FLORTD101", + "start": "2017-01-08T00:00:00.759Z", + "status": "notTracked", + "uid": "ATAPL-58322-00009", + "waterDepth": null + } + ] + } + ] + }*/ + +var PlatformsHeaderModel = Backbone.Model.extend({ + defaults: { + code: "", + status: "", + title: "" + } +}); + +var PlatformsInstrumentModel = Backbone.Model.extend({ + defaults: { + depth: null, + display_name: "", + end: "", + latitude: null, + longitude: null, + maxdepth: null, + mindepth: null, + reason: "", + reference_designator: "", + start: "", + status: "", + uid: "", + waterDepth: null + } +}); +var PlatformsStatusModel = Backbone.Model.extend({ + defaults: { + header: PlatformsHeaderModel, + items: PlatformsInstrumentModel + }, + toGeoJSON: function() { + // console.log('in toGeoJSON'); + // console.log(this.attributes); + var items = _.clone(this.attributes); + var geoJSONArray = []; + _.each(this.attributes.items, function(attrs) { + // console.log('attrs'); + // console.log(attrs); + var newArray = [attrs.longitude.toFixed(5), attrs.latitude.toFixed(5)]; + + var geoJSON = { + "type": "Feature", + "properties": { + "description": ""+attrs.display_name+"", + "code": attrs.reference_designator, + "title": attrs.display_name, + "marker-symbol": (attrs.reference_designator.indexOf('GL') > -1) ? 'airfield_icon' : 'harbor_icon', + "depth": attrs.depth, + "status": attrs.status + }, + "geometry": { + "type": "Point", + "coordinates": newArray + } + + }; + geoJSONArray.push(geoJSON); + }); + + + + + return geoJSONArray; + } +}); + + +var PlatformsStatusCollection = Backbone.Collection.extend({ + model: PlatformsStatusModel, + + toGeoJSON: function() { + var geoJSONified = this.map(function(model) { + return model.toGeoJSON(); + }); + return geoJSONified; + }, + parse: function(response) { + console.log(response); + 'use strict'; + // if the response is valid, return the results object + if (response) { return response.platforms; } else { return []; } + }, + sortByField: function(field, direction){ + var sorted = _.sortBy(this.models, function(model){ + return model.get(field); + }); + + if(direction === 'descending'){ + sorted = sorted.reverse() + } + + this.models = sorted; + }, + byGliders: function() { + var filtered = this.filter(function (platform) { + if (platform.get('reference_designator') !== "") { + return platform.get('reference_designator').indexOf('GL') > -1; + } + }); + return new PlatformCollection(filtered); + }, + byMoorings: function() { + var filtered = this.filter(function (platform) { + if (platform.get('reference_designator') !== "" && platform.get('reference_designator').length === 8) { + return platform.get('reference_designator').indexOf('GL') < 0; + } + }); + return new PlatformCollection(filtered); + }, + byArray: function(array) { + var filtered = this.filter(function (platform) { + if (platform.get('reference_designator') !== "" && (platform.get('reference_designator').length === 14 || + platform.get('reference_designator').indexOf('GL') > -1) || platform.get('reference_designator').length === 8) { + return platform.get('reference_designator').substr(0,2) === array; + } + }); + return new PlatformCollection(filtered); + }, + initialize: function () { + } +}); diff --git a/ooiui/static/js/views/platforms/GenericPlatFormStatusView.js b/ooiui/static/js/views/platforms/GenericPlatFormStatusView.js index baa7a9ee9..d5af27e9e 100644 --- a/ooiui/static/js/views/platforms/GenericPlatFormStatusView.js +++ b/ooiui/static/js/views/platforms/GenericPlatFormStatusView.js @@ -52,6 +52,7 @@ var GenericPlatFormStatus = Backbone.View.extend({ var self = this; this.streamCollection = this.collection.streamCollection.sort('display_name'); this.platformCollection = this.collection.platformCollection; + this.platformStatusCollection = this.collection.platformStatusCollection; this.platformLat = this.streamCollection.options.searchLat; this.platformLng = this.streamCollection.options.searchLng; this.platformId = this.streamCollection.options.searchId; diff --git a/ooiui/static/js/views/science/plot/PlotControlView.js b/ooiui/static/js/views/science/plot/PlotControlView.js index 3855e4925..77a2038ba 100644 --- a/ooiui/static/js/views/science/plot/PlotControlView.js +++ b/ooiui/static/js/views/science/plot/PlotControlView.js @@ -264,8 +264,8 @@ var PlotControlView = Backbone.View.extend({ //special case for interpolated plot if (selectedDataCollection == 2){ - ooi.trigger('plot:error', {title: "Unavailable Plot Selection", message:"Interpolated plotting is currently unavailable. If the problem persists, please email helpdesk@oceanobservatories.org"} ); - return null; + //ooi.trigger('plot:error', {title: "Unavailable Plot Selection", message:"Interpolated plotting is currently unavailable. If the problem persists, please email helpdesk@oceanobservatories.org"} ); + //return null; referenceCount = 2; } diff --git a/ooiui/templates/common/platformStatus.html b/ooiui/templates/common/platformStatus.html index eadc831e7..836705de4 100644 --- a/ooiui/templates/common/platformStatus.html +++ b/ooiui/templates/common/platformStatus.html @@ -16,8 +16,7 @@ - - + @@ -31,8 +30,7 @@ - - + @@ -112,6 +110,15 @@ var platformCollection = new PlatformCollection(); + var platformsStatusCollection = new PlatformsStatusCollection(); + + platformsStatusCollection.fetch({async: false, url: '/api/uframe/status/platforms/'+atob(platformId)}).done(function() { + console.log('platformsStatusCollection'); + console.log(platformsStatusCollection); + console.log('platformsStatusCollection.toGeoJSON()'); + console.log(platformsStatusCollection.toGeoJSON()); + }); + var platform = new GenericPlatFormStatus({ el: $('#page-content-wrapper'), collection: {streamCollection, platformCollection} From 3292e5ebb6ebaa9535acbd057e3152c34187fe22 Mon Sep 17 00:00:00 2001 From: James Case Date: Mon, 30 Jan 2017 23:47:01 -0500 Subject: [PATCH 03/26] Various updates supporting Sprint 5 tasks. --- bower.json | 5 +- ooiui/core/routes/common.py | 4 + ooiui/core/routes/science.py | 25 +- ooiui/static/css/common/toc_menu.css | 5 +- ooiui/static/css/custom/custom.css | 84 +++- .../static/css/data_catalog/data_catalog.css | 6 +- ooiui/static/img/down-arrow.png | Bin 0 -> 6907 bytes .../img/logos-banners/iris_logo_shadow.png | Bin 0 -> 9349 bytes ooiui/static/img/uparrow.png | Bin 0 -> 7494 bytes .../static/js/models/common/UserFormModel.js | 8 +- ooiui/static/js/models/science/SeriesModel.js | 91 +++- ooiui/static/js/models/science/StreamModel.js | 6 +- .../asset_filters/InstrumentFilter.html | 5 +- .../stream_filters/StreamParameterFilter.html | 2 +- .../ArrayContentSummaryItem.html | 2 +- .../array_content/ArrayStatusSummaryItem.html | 4 +- ooiui/static/js/views/c2/CommandDialogView.js | 2 +- .../views/home/array_content/array_content.js | 4 +- .../static/js/views/home/tile_map/tile_map.js | 33 +- .../js/views/platforms/tile_map/tile_map.js | 8 +- .../js/views/science/plot/XYPlotView.js | 198 +++++++- ooiui/static/kmz/OOI_Glider_Lines.kml | 306 ++++++++++++ .../asset_management/asset_management.html | 2 +- ooiui/templates/asset_management/cruises.html | 2 +- ooiui/templates/common/home.html | 1 + ooiui/templates/common/statusTree.html | 459 ++++++++++++++++++ ooiui/templates/science/data_access.html | 327 +++++++++++-- 27 files changed, 1483 insertions(+), 106 deletions(-) create mode 100644 ooiui/static/img/down-arrow.png create mode 100644 ooiui/static/img/logos-banners/iris_logo_shadow.png create mode 100644 ooiui/static/img/uparrow.png create mode 100644 ooiui/static/kmz/OOI_Glider_Lines.kml create mode 100644 ooiui/templates/common/statusTree.html diff --git a/bower.json b/bower.json index b1521fcd4..f7b9d43cb 100644 --- a/bower.json +++ b/bower.json @@ -47,7 +47,7 @@ "bootstrap-table": "1.6.0", "jquery.browser": "~0.0.7", "bootstrap-editable-table": "~1.0.1", - "jqtree": "~1.0.0", + "jqtree": "~1.3.7", "x-editable": "~1.5.1", "showdown": "~0.5.0", "leaflet.wms": "https://github.com/cgalvarino/leaflet.wms.git#62b489f0f9b83f375f330f0ed60adbc0ce40918c", @@ -68,7 +68,8 @@ "jQRangeSlider": "https://github.com/maka-io/jQRangeSlider.git#master", "visavail": "https://github.com/flrs/visavail.git#master", "mapbox-gl-js": "https://github.com/mapbox/mapbox-gl-js.git#0.17.0", - "mapbox.js": "2.4.0" + "mapbox.js": "2.4.0", + "leaflet-plugins": "" }, "resolutions": { "jquery": "~2.1.1", diff --git a/ooiui/core/routes/common.py b/ooiui/core/routes/common.py index 0d5d31c07..89eef0253 100644 --- a/ooiui/core/routes/common.py +++ b/ooiui/core/routes/common.py @@ -202,6 +202,10 @@ def statusUI(): def statusN(): return render_template('common/statusN.html', tracking=app.config['GOOGLE_ANALYTICS']) +@app.route('/statustree') +def statusTree(): + return render_template('common/statusTree.html', tracking=app.config['GOOGLE_ANALYTICS']) + @app.route('/api/organization', methods=['GET']) def get_organization(): diff --git a/ooiui/core/routes/science.py b/ooiui/core/routes/science.py index 91838dd68..926ed52ef 100644 --- a/ooiui/core/routes/science.py +++ b/ooiui/core/routes/science.py @@ -158,10 +158,10 @@ def getUframeMultiStreamInterp(): ''' try: # Parse the parameters - stream1 = request.args['stream1'] - stream2 = request.args['stream2'] - instr1 = request.args['instrument1'] - instr2 = request.args['instrument2'] + ref_des1 = request.args['ref_des1'] + ref_des2 = request.args['ref_des2'] + instr1 = request.args['instr1'] + instr2 = request.args['instr2'] var1 = request.args['var1'] var2 = request.args['var2'] startdate = request.args['startdate'] @@ -169,7 +169,11 @@ def getUframeMultiStreamInterp(): # Build the URL params = '?startdate=%s&enddate=%s' % (startdate, enddate) - data_url = "/".join([app.config['SERVICES_URL'], 'uframe/get_multistream', stream1, stream2, instr1, instr2, var1, var2 + params]) + # http://localhost:4000/uframe/get_multistream/CP05MOAS-GL340-03-CTDGVM000/CP05MOAS-GL340-02-FLORTM000/telemetered_ctdgv_m_glider_instrument/ + # telemetered_flort_m_glider_instrument/sci_water_pressure/sci_flbbcd_chlor_units?startdate=2015-05-07T02:49:22.745Z&enddate=2015-06-28T04:00:41.282Z + data_url = "/".join([app.config['SERVICES_URL'], 'uframe/get_multistream', ref_des1, ref_des2, instr1, instr2, var1, var2 + params]) + + print data_url # Get the response response = requests.get(data_url, params=request.args) @@ -245,6 +249,17 @@ def status_arrays(): @app.route('/api/uframe/status/sites/') def status_sites(array_code): + if request.args: + array_code = request.args['node'] + response = requests.get(app.config['SERVICES_URL'] + '/uframe/status/sites/%s' % array_code, params=request.args) + return response.text, response.status_code + +@app.route('/api/uframe/status/sites') +def status_sites_tree(): + if request.args: + array_code = request.args['node'] + else: + return "Bad node parameter", 400 response = requests.get(app.config['SERVICES_URL'] + '/uframe/status/sites/%s' % array_code, params=request.args) return response.text, response.status_code diff --git a/ooiui/static/css/common/toc_menu.css b/ooiui/static/css/common/toc_menu.css index 61aad8377..aaf93d754 100644 --- a/ooiui/static/css/common/toc_menu.css +++ b/ooiui/static/css/common/toc_menu.css @@ -140,9 +140,12 @@ label.platform > font, label.assembly > font, label.instrument > font { padding-left: 0px; margin-right: 0px; margin-left: 0px; - width: 1520px; + /*width: 1520px;*/ + max-width: 100% !important; + width: auto !important; border-color: transparent; background-color: transparent; + min-height: 600px; } label.instrument > span { display: block; diff --git a/ooiui/static/css/custom/custom.css b/ooiui/static/css/custom/custom.css index 8adf721a7..20d7975b8 100644 --- a/ooiui/static/css/custom/custom.css +++ b/ooiui/static/css/custom/custom.css @@ -46,11 +46,11 @@ li { /* ~panel style~ */ .panel { - border: none; + /*border: none;*/ } .panel-body { - border: none; + /*border: none;*/ } .panel-heading.panel-search.pull-right { @@ -175,6 +175,7 @@ color: #000; text-decoration: none; line-height: .9; font-weight: 300; + white-space: normal; } .btn-default:hover { @@ -308,4 +309,83 @@ div#events-scroll-body { /* alt light blue #D1DAF5 rgb(209,218,245) */ /* alt light blue2 #7F9BDA */ +.jqtree-notTracked { + background-color: lightgrey; + cursor: pointer; + color: #000; +} + +.jqtree-notTracked:hover { + border:2px solid; + color: purple; +} +.jqtree-failed { + background-color: indianred; + cursor: pointer; +} + +.ui-jqgrid .ui-jqgrid-htable th div +{ + height: auto; + overflow: hidden; + padding-right: 4px; + padding-top: 2px; + position: relative; + vertical-align: text-top; + white-space: normal !important; +} + +th.ui-th-column div { + white-space: normal !important; + height: auto !important; + padding: 2px; +} + +#filterScrollContainer { + white-space: normal !important; + max-width: 33% !important; +} + +div.ui-rangeSlider-label-value { + font-size: 10pt; +} + +a.back-to-top { + display: none; + width: 60px; + height: 60px; + text-indent: -9999px; + font-size: 20pt; + position: fixed; + z-index: 999; + right: 20px; + bottom: 90px; + background: #27AE61 url("/img/uparrow.png") no-repeat center 20%; + -webkit-border-radius: 30px; + -moz-border-radius: 30px; + border-radius: 30px; + background-size: contain; +} + +a.back-to-bottom { + display: none; + width: 60px; + height: 60px; + text-indent: -9999px; + font-size: 20pt; + position: fixed; + z-index: 999; + right: 20px; + bottom: 20px; + background: #27AE61 url("/img/uparrow.png") no-repeat center 20%; + -webkit-transform: rotate(180deg); + -moz-transform: rotate(180deg); + -ms-transform: rotate(180deg); + -o-transform: rotate(180deg); + transform: rotate(180deg); + -webkit-border-radius: 30px; + -moz-border-radius: 30px; + border-radius: 30px; + background-size: contain; +} diff --git a/ooiui/static/css/data_catalog/data_catalog.css b/ooiui/static/css/data_catalog/data_catalog.css index a93638dd8..e1ad4c28c 100644 --- a/ooiui/static/css/data_catalog/data_catalog.css +++ b/ooiui/static/css/data_catalog/data_catalog.css @@ -1,7 +1,7 @@ body, html { - margin: 0; - /* overflow: hidden; */ - height:100%; + margin: 0; + /* overflow: hidden; */ + height:100%; } #element::-webkit-scrollbar { display: none; diff --git a/ooiui/static/img/down-arrow.png b/ooiui/static/img/down-arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..bc0db4f38b9963a92a08c699b8a36ff25cf5c863 GIT binary patch literal 6907 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 literal 0 HcmV?d00001 diff --git a/ooiui/static/js/models/common/UserFormModel.js b/ooiui/static/js/models/common/UserFormModel.js index 2259a8b5a..640d0d79a 100644 --- a/ooiui/static/js/models/common/UserFormModel.js +++ b/ooiui/static/js/models/common/UserFormModel.js @@ -4,11 +4,13 @@ * 411, 0, or 1 so exclude numbers like that. */ _.extend(Backbone.Validation.patterns, { - phoneRegex: /^\(?(?![94]11)([2-9]\d{2})\)?[-. ]?(\d{3})[-. ]?(\d{4})(?: ?[Xx] ?(\d+))?$/ + phoneRegex: /^\(?(?![94]11)([2-9]\d{2})\)?[-. ]?(\d{3})[-. ]?(\d{4})(?: ?[Xx] ?(\d+))?$/, + passwordRegex: /^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[a-zA-Z]).{8,}$/ }); _.extend(Backbone.Validation.messages, { - usPhone: 'Invalid US phone number' + usPhone: 'Invalid US phone number', + passwordRegex: 'Password must be at least 8 characters and contain at least one number and one upper case letter.' }); // Define a model with some validation rules @@ -33,7 +35,7 @@ var SignUpModel = Backbone.Model.extend({ pattern: 'email' }, password: { - minLength: 8 + pattern: 'passwordRegex' }, repeatPassword: { equalTo: 'password', diff --git a/ooiui/static/js/models/science/SeriesModel.js b/ooiui/static/js/models/science/SeriesModel.js index c546d9329..e28a865d7 100644 --- a/ooiui/static/js/models/science/SeriesModel.js +++ b/ooiui/static/js/models/science/SeriesModel.js @@ -1,4 +1,4 @@ - "use strict"; +"use strict"; /* * ooiui/static/js/models/science/SeriesModel.js * Model definition for a series that fits into the Highcharts time series charts @@ -6,8 +6,8 @@ * - d3 */ /* -used to manage data in high charts -*/ + used to manage data in high charts + */ var SeriesModel = Backbone.Model.extend({ urlRoot: '#', formatter: d3.format(".2f"), @@ -34,8 +34,8 @@ var SeriesCollection = Backbone.Collection.extend({ }); /* - Data structures that come from uframe -*/ + Data structures that come from uframe + */ var DataSeriesModel = Backbone.Model.extend({ urlRoot: '#', initialize: function(){ @@ -117,23 +117,72 @@ var DataSeriesCollection = Backbone.Collection.extend({ }); var InterpolatedDataSeriesCollection = Backbone.Collection.extend({ - instr1:"telemetered_ctdgv_m_glider_instrument", - instr2:"telemetered_flort_m_glider_instrument", - ref_des1:"CP05MOAS-GL340-03-CTDGVM000", - ref_des2:"CP05MOAS-GL340-02-FLORTM000", - startdate:"2015-05-07T02:49:22.745Z", - enddate:"2015-06-28T04:00:41.282Z", - var1:"sci_water_pressure", - var2:"sci_flbbcd_chlor_units", - xaxislabel: "", - yaxislabel: "", - subtitle: "", + /* instr1:"telemetered_ctdgv_m_glider_instrument", + instr2:"telemetered_flort_m_glider_instrument", + ref_des1:"CP05MOAS-GL340-03-CTDGVM000", + ref_des2:"CP05MOAS-GL340-02-FLORTM000", + startdate:"2013-05-07T02:49:22.745Z", + enddate:"2016-06-28T04:00:41.282Z", + var1:"sci_water_pressure", + var2:"sci_flbbcd_chlor_units", + xaxislabel: "", + yaxislabel: "", + subtitle: "",*/ + +/* defaults: { + instr1:"", + instr2:"", + ref_des1:"", + ref_des2:"", + startdate:"", + enddate:"", + var1:"", + var2:"", + displayName:"", + stream_display_name:"" + },*/ + + initialize: function(models,options) { + console.log('initialize options'); + console.log(options); + if (options && options.instr1){ + this.instr1 = options.instr1; + } + if (options && options.instr2){ + this.instr2 = options.instr2; + } + if (options && options.ref_des1){ + this.ref_des1 = options.ref_des1; + } + if (options && options.ref_des2){ + this.ref_des2 = options.ref_des2; + } + if (options && options.startdate){ + this.startdate = options.startdate; + } + if (options && options.enddate){ + this.enddate = options.enddate; + } + if (options && options.var1){ + this.var1 = options.var1; + } + if (options && options.var2){ + this.var2 = options.var2; + } + if (options && options.displayName){ + this.displayName = options.displayName; + } + if (options && options.stream_display_name){ + this.stream_display_name = options.stream_display_name; + } + }, + url: function() { - var durl = ('/api/get_multistream?instrument1='+ this.instr1 + '&instrument2=' + this.instr2 + - "&stream1=" + this.ref_des1 + "&stream2=" + this.ref_des2 + "&var1=" + this.var1 + - "&var2=" + this.var2 + "&startdate=" + this.startdate + "&enddate=" + this.enddate); - //console.log(durl); + var durl = ('/api/get_multistream?instr1='+ this.instr1 + '&instr2=' + this.instr2 + + "&ref_des1=" + this.ref_des1 + "&ref_des2=" + this.ref_des2 + "&var1=" + this.var1 + + "&var2=" + this.var2 + "&startdate=" + this.startdate + "&enddate=" + this.enddate); + console.log(durl); return durl; }, //eg url: '/api/get_data?instrument=CE05MOAS-GL382-05-CTDGVM000&stream=telemetered_ctdgv_m_glider_instrument&xvars=time,time&yvars=sci_water_pressure,sci_water_cond&startdate=2015-01-21T22:01:48.103Z&enddate=2015-01-22T22:01:48.103Z', @@ -159,6 +208,8 @@ var InterpolatedDataSeriesCollection = Backbone.Collection.extend({ return this.plottype; }, parse: function(response, options) { + console.log('response'); + console.log(response); this.units = response.units; this.title = response.title; this.subtitle = response.subtitle; diff --git a/ooiui/static/js/models/science/StreamModel.js b/ooiui/static/js/models/science/StreamModel.js index 1391408b2..174b6b99c 100644 --- a/ooiui/static/js/models/science/StreamModel.js +++ b/ooiui/static/js/models/science/StreamModel.js @@ -39,7 +39,11 @@ var StreamModel = Backbone.Model.extend({ longitude: "", depth: "", freshness: "", - reference_designator_first14chars:"" + reference_designator_first14chars:"", + iris_enabled: false, + iris_link: "", + rds_enabled: false, + rds_link: "" }, getURL: function(type) { diff --git a/ooiui/static/js/partials/data_catalog/search_sidebar/components/filters/asset_filters/InstrumentFilter.html b/ooiui/static/js/partials/data_catalog/search_sidebar/components/filters/asset_filters/InstrumentFilter.html index 93416a421..0da927328 100644 --- a/ooiui/static/js/partials/data_catalog/search_sidebar/components/filters/asset_filters/InstrumentFilter.html +++ b/ooiui/static/js/partials/data_catalog/search_sidebar/components/filters/asset_filters/InstrumentFilter.html @@ -44,7 +44,7 @@
- +
@@ -55,6 +55,9 @@
+
+ +
diff --git a/ooiui/static/js/partials/data_catalog/search_sidebar/components/filters/stream_filters/StreamParameterFilter.html b/ooiui/static/js/partials/data_catalog/search_sidebar/components/filters/stream_filters/StreamParameterFilter.html index 96f407ef7..175b65a31 100644 --- a/ooiui/static/js/partials/data_catalog/search_sidebar/components/filters/stream_filters/StreamParameterFilter.html +++ b/ooiui/static/js/partials/data_catalog/search_sidebar/components/filters/stream_filters/StreamParameterFilter.html @@ -22,7 +22,7 @@ ['FDCHPA METBKA METBKAHumid FDCMETHumid', 'Humidity'], - ['HYDBBA HYDLFA HYDHydroFloor HYDHydrophoneLarge', 'Hydrophone'], + ['HYDBB HYDLF HYDHydroFloor HYDHydrophoneLarge', 'Hydrophone'], ['MASSPA THSPHA TRHPHA TMPSFA TMPHydroThermal', 'Hydrothermal Vent Chemistry'], diff --git a/ooiui/static/js/partials/home/array_content/ArrayContentSummaryItem.html b/ooiui/static/js/partials/home/array_content/ArrayContentSummaryItem.html index 50d45035a..7cf86ad52 100644 --- a/ooiui/static/js/partials/home/array_content/ArrayContentSummaryItem.html +++ b/ooiui/static/js/partials/home/array_content/ArrayContentSummaryItem.html @@ -12,7 +12,7 @@

<%= properties.description %><
diff --git a/ooiui/static/js/partials/home/array_content/ArrayStatusSummaryItem.html b/ooiui/static/js/partials/home/array_content/ArrayStatusSummaryItem.html index 90ade45da..fac94efcd 100644 --- a/ooiui/static/js/partials/home/array_content/ArrayStatusSummaryItem.html +++ b/ooiui/static/js/partials/home/array_content/ArrayStatusSummaryItem.html @@ -23,7 +23,7 @@

<%= properties.description %>
@@ -156,7 +156,7 @@

<%= properties.description %>
    -
  •    |  
  • +
  •    |  
  •  
diff --git a/ooiui/static/js/views/c2/CommandDialogView.js b/ooiui/static/js/views/c2/CommandDialogView.js index f489e760e..75f82c203 100644 --- a/ooiui/static/js/views/c2/CommandDialogView.js +++ b/ooiui/static/js/views/c2/CommandDialogView.js @@ -654,7 +654,7 @@ var CommandDialogView = Backbone.View.extend({ } // Plotting redirect else if(button.target.id =='plot_c2'||button.target.className.search('chart')>-1){ - var plot_url = '/data_access/#'+ref_des+'/'+that.options.selected_stream_method+'_'+that.options.selected_stream_name.replace(/_/g, '-'); + var plot_url = '/data_access/?search='+ref_des+'/'+that.options.selected_stream_method+'_'+that.options.selected_stream_name.replace(/_/g, '-'); //plotting/#CP05MOAS-GL001-05-PARADM000/_ window.open(plot_url,'_blank'); diff --git a/ooiui/static/js/views/home/array_content/array_content.js b/ooiui/static/js/views/home/array_content/array_content.js index f951fd59c..a9f169278 100644 --- a/ooiui/static/js/views/home/array_content/array_content.js +++ b/ooiui/static/js/views/home/array_content/array_content.js @@ -243,7 +243,7 @@ var ArrayContentSummaryItem = ParentView.extend({ }); }, _flyBye: function(originalZoom) { - map.setView([15.8, -90], originalZoom); + map.setView([6.3, -80], 2.5); // map.setLayoutProperty('rsArray', 'visibility', 'visible'); // map.setLayoutProperty('ceArray', 'visibility', 'visible'); map._hidePlatformView(); @@ -324,7 +324,7 @@ var ArrayContentSummaryItem = ParentView.extend({ if ( !_compareGeoLoc(map.getCenter(), loc) ) { flyFlyContext.originalZoom = map.getZoom(); // map.setLayoutProperty('ceArray', 'visibility', 'none'); - map.setView([loc[0], loc[1]+1],7); + map.setView([loc[0]+1, loc[1]-1],7); } else { this._flyBye(flyFlyContext.originalZoom); } diff --git a/ooiui/static/js/views/home/tile_map/tile_map.js b/ooiui/static/js/views/home/tile_map/tile_map.js index f8700b049..2b6027b51 100644 --- a/ooiui/static/js/views/home/tile_map/tile_map.js +++ b/ooiui/static/js/views/home/tile_map/tile_map.js @@ -8,7 +8,7 @@ var TileMap = Backbone.View.extend({ var map = L.map(this.id, { zoomControl: false - }).setView([15.8, -90], 2); + }).setView([6.3, -80], 2.5); // Commenting this out for now until security and web mapping service performance are resolved L.tileLayer.wms('http://gmrt.marine-geo.org/cgi-bin/mapserv?map=/public/mgg/web/gmrt.marine-geo.org/htdocs/services/map/wms_merc.map&', { max_zoom: 13, @@ -19,15 +19,36 @@ var TileMap = Backbone.View.extend({ attribution: 'Global Multi-Resolution Topography (GMRT), Version 3.2' }).addTo(map); + var track = new L.KML("/kmz/OOI_Glider_Lines.kml", {async: true}); + track.on("loaded", function(e) { + //map.fitBounds(e.target.getBounds()); + }); + map.addLayer(track); + /* L.tileLayer('https://server.arcgisonline.com/ArcGIS/rest/services/Ocean_Basemap/MapServer/tile/{z}/{y}/{x}', { attribution: 'Tiles © Esri — Sources: GEBCO, NOAA, CHS, OSU, UNH, CSUMB, National Geographic, DeLorme, NAVTEQ, and Esri', maxZoom: 13}) .addTo(map);*/ - /*map.dragging.disable(); - map.touchZoom.disable(); - map.doubleClickZoom.disable(); - map.scrollWheelZoom.disable(); - map.keyboard.disable();*/ + map.dragging.disable(); + map.touchZoom.disable(); + map.doubleClickZoom.disable(); + map.scrollWheelZoom.disable(); + map.keyboard.disable(); + + map.on('dragend', function onDragEnd(){ + var width = map.getBounds().getEast() - map.getBounds().getWest(); + var height = map.getBounds().getNorth() - map.getBounds().getSouth(); + + alert ( + 'west:' + map.getBounds().getWest() +'\n'+ + 'east:' + map.getBounds().getEast() +'\n'+ + 'south:' + map.getBounds().getSouth() +'\n'+ + 'north:' + map.getBounds().getNorth() +'\n'+ + 'center:' + map.getCenter() +'\n'+ + 'width:' + width +'\n'+ + 'height:' + height +'\n'+ + 'size in pixels:' + map.getSize() + )}); // add some methods that can be useful to our map object. map._resizeMap = this._resizeMap; diff --git a/ooiui/static/js/views/platforms/tile_map/tile_map.js b/ooiui/static/js/views/platforms/tile_map/tile_map.js index bc5d06a1d..e27e2ef83 100644 --- a/ooiui/static/js/views/platforms/tile_map/tile_map.js +++ b/ooiui/static/js/views/platforms/tile_map/tile_map.js @@ -19,18 +19,18 @@ var TileMap = Backbone.View.extend({ maxZoom: 10 }).setView([this.lat, this.lng], 7); // Commenting this out for now until security and web mapping service performance are resolved -/* L.tileLayer.wms('http://gmrt.marine-geo.org/cgi-bin/mapserv?map=/public/mgg/web/gmrt.marine-geo.org/htdocs/services/map/wms_merc.map&', { + L.tileLayer.wms('http://gmrt.marine-geo.org/cgi-bin/mapserv?map=/public/mgg/web/gmrt.marine-geo.org/htdocs/services/map/wms_merc.map&', { layers: 'topo', format: 'image/png', transparent: true, crs: L.CRS.EPSG4326, attribution: 'Global Multi-Resolution Topography (GMRT), Version 3.2' }) - .addTo(map);*/ + .addTo(map); - L.tileLayer('https://server.arcgisonline.com/ArcGIS/rest/services/Ocean_Basemap/MapServer/tile/{z}/{y}/{x}', { +/* L.tileLayer('https://server.arcgisonline.com/ArcGIS/rest/services/Ocean_Basemap/MapServer/tile/{z}/{y}/{x}', { attribution: 'Tiles © Esri — Sources: GEBCO, NOAA, CHS, OSU, UNH, CSUMB, National Geographic, DeLorme, NAVTEQ, and Esri', maxZoom: 13}) - .addTo(map); + .addTo(map);*/ map.dragging.disable(); map.touchZoom.disable(); diff --git a/ooiui/static/js/views/science/plot/XYPlotView.js b/ooiui/static/js/views/science/plot/XYPlotView.js index 9bcea8053..138ea8389 100644 --- a/ooiui/static/js/views/science/plot/XYPlotView.js +++ b/ooiui/static/js/views/science/plot/XYPlotView.js @@ -39,6 +39,10 @@ var XYPlotView = BasePlot.extend({ }); } + //availableParameters = availableParameters.slice().sort(function(a,b){return a > b}).reduce(function(a,b){if (a.slice(-1)[0] !== b) a.push(b);return a;},[]); + console.log('availableParameters in create axis'); + console.log(availableParameters); + _.each(availableParameters,function(model,i){ //create the axis if (model.get('short_name').indexOf('time') == -1){ @@ -135,6 +139,8 @@ var XYPlotView = BasePlot.extend({ var isY = plotParameters.where({'is_x':true}).length > 1; //figure out the reference axis var referenceParameterModel = isY ? plotParameters.where({'is_y': true})[0] : plotParameters.where({'is_x': true})[0]; + console.log('referenceParameterModel'); + console.log(referenceParameterModel); //get all params not reference var availableParameters = plotParameters.filter(function (model) { return model !== referenceParameterModel; @@ -149,10 +155,15 @@ var XYPlotView = BasePlot.extend({ var qaqc = plotModel.get('qaqc'); //qaqc selection //map the avaiable parameters to the reference + //availableParameters = availableParameters.slice().sort(function(a,b){return a > b}).reduce(function(a,b){if (a.slice(-1)[0] !== b) a.push(b);return a;},[]); + console.log('availableParameters before getting data'); + console.log(availableParameters); + _.each(availableParameters,function(model, i){ // if the dependent variable (y) is an array, we need to produce multiple series (only spkir_abj_cspp_downwelling_vector for now) if (_.isArray(self.getValue(plotData.models[0].get(model.get('short_name')), model.get('short_name')))){ + console.log('inside multiple series'); var shortName = model.get('short_name'); if (shortName.indexOf('spkir') > -1){ // spkir_abj_cspp_downwelling_vector @@ -195,10 +206,10 @@ var XYPlotView = BasePlot.extend({ //will only add QAQC if the reference is time if (qaqc > 0 && dataModel.has(qc_name) && referenceParameterModel.get('short_name').indexOf('time') > -1){ var qaqc_data = dataModel.get(qc_name); - // console.log('qaqc_data'); - // console.log(qaqc_data); - // console.log('qaqc'); - // console.log(qaqc); + console.log('qaqc_data'); + console.log(qaqc_data); + console.log('qaqc'); + console.log(qaqc); var qaqcpass = false; if (qaqc < 10){ if (qaqc_data && Math.pow(2,qaqc-1)){ //PASS @@ -244,6 +255,151 @@ var XYPlotView = BasePlot.extend({ return seriesList; }, + createInterpolatedSeries: function(plotParameters, plotModel, plotData, xAxis, yAxis){ + var self = this; + //create the data series + var seriesCollection = new SeriesCollection(); + //are we cooling at a multiple x or multiple y, fine the base axis + //which is the reference axis + //if x axis > 1 then y is the reference + var isY = plotParameters.where({'is_x':true}).length > 1; + //figure out the reference axis + var referenceParameterModel = isY ? plotParameters.where({'is_x': true})[0] : plotParameters.where({'is_y': true})[0]; + console.log('referenceParameterModel'); + console.log(referenceParameterModel); + //get all params not reference + var availableParameters = plotParameters.filter(function (model) { + return model; + }); + + + //container for the series list + var seriesList = []; + + var enableMarkers = plotModel.get('plotStyle') == 'line' ? false : true; + var plotStyle = plotModel.get('plotStyle') == 'both' ? 'line' : plotModel.get('plotStyle'); + + var qaqc = plotModel.get('qaqc'); //qaqc selection + + //map the avaiable parameters to the reference + //availableParameters = availableParameters.slice().sort(function(a,b){return a > b}).reduce(function(a,b){if (a.slice(-1)[0] !== b) a.push(b);return a;},[]); + console.log('availableParameters before getting data'); + console.log(availableParameters); + + availableParameters = _.uniq(availableParameters, function(item, key, a) {return item.attributes.short_name;}); + + //_.uniq(temp3, function(item, key, a) {return item.attributes.short_name;}); + + console.log('availableParameters after uniq'); + console.log(availableParameters); + + var yAxisCounter = 0; + var xAxisCounter = 0; + _.each(availableParameters,function(model, i){ + + // if the dependent variable (y) is an array, we need to produce multiple series (only spkir_abj_cspp_downwelling_vector for now) + if (_.isArray(self.getValue(plotData.models[0].get(model.get('short_name')), model.get('short_name')))){ + console.log('inside multiple series'); + var shortName = model.get('short_name'); + if (shortName.indexOf('spkir') > -1){ + // spkir_abj_cspp_downwelling_vector + var multipleSeries = self.createMultipleSeries(plotParameters, plotModel, plotData, model, i); + seriesList = seriesList.concat(multipleSeries); + return; + } + } + + + + + + var qc_name = model.get('short_name') + "_qc_results"; + var series = new SeriesModel({ + marker: { + radius : 3, + enabled: enableMarkers + }, + type: plotStyle, + name : model.get('name'), + title : model.get('name'), + units : model.get('units').indexOf('seconds since 1900') > -1 ? 'Time (UTC)' : model.get('units'), + data : [], + yAxis : yAxisCounter, + xAxis : 0 + }); + + + + var data = []; + var qaqcdata = []; + + + plotData.each(function(dataModel){ + var val1, val2; + if (!isY){ + val2 = self.getValue(dataModel.get(referenceParameterModel.get('short_name')),referenceParameterModel.get('short_name')); + val1 = self.getValue(dataModel.get(model.get('short_name')),model.get('short_name')); + }else{ + val1 = self.getValue(dataModel.get(referenceParameterModel.get('short_name')),referenceParameterModel.get('short_name')); + val2 = self.getValue(dataModel.get(model.get('short_name')),model.get('short_name')); + } + data.push([val1,val2]); + + //will only add QAQC if the reference is time + if (qaqc > 0 && dataModel.has(qc_name) && referenceParameterModel.get('short_name').indexOf('time') > -1){ + var qaqc_data = dataModel.get(qc_name); + console.log('qaqc_data'); + console.log(qaqc_data); + console.log('qaqc'); + console.log(qaqc); + var qaqcpass = false; + if (qaqc < 10){ + if (qaqc_data && Math.pow(2,qaqc-1)){ //PASS + qaqcpass = true; + }else{ + qaqcpass = false; + } + }else{ + if (qaqc_data == Math.pow(2,9)){ // PASS + qaqcpass = true; + }else{ + qaqcpass = false; + } + } + + // console.log(qaqcpass); + if (!qaqcpass) + qaqcdata.push({x:val1,y:val2, marker:{lineColor:'#FF0000', lineWidth:1.5}}); + } + }); + + //add qaqc series + if (!_.isEmpty(qaqcdata)){ + // console.log('FAILED QAQC SHOULD SHOW HERE'); + // console.log(qaqcdata); + + seriesList.push(new SeriesModel({ + type : 'scatter', + name : "Failed QAQC: "+ model.get('name'), + qaqc : true, + title : qc_name, + units : '', + color : '#FF0000', + data : qaqcdata, + yAxis : isY ? 0 : i, + xAxis : isY ? i : 0 + }).toJSON()); + } + + if(model.get('short_name') != 'time') { + series.set('data', data); + seriesList.push(series.toJSON()); + yAxisCounter++; + } + }); + + return seriesList; + }, setPlotSize:function(x,y){ //updates the plot size for orientation $('#plot-view').width(x); @@ -252,9 +408,12 @@ var XYPlotView = BasePlot.extend({ render: function(plotParameters, plotModel, plotData){ var self = this; - // console.log(plotParameters); - // console.log(plotModel); - // console.log(plotData); + console.log('plotParameters'); + console.log(plotParameters); + console.log('plotModel'); + console.log(plotModel); + console.log('plotData'); + console.log(plotData); // Set message for data decimation based on returned data model length $('#isDecimated').empty(); @@ -266,7 +425,26 @@ var XYPlotView = BasePlot.extend({ var xAxis = self.createAxis(plotParameters,plotModel, 'x'); var yAxis = self.createAxis(plotParameters,plotModel, 'y'); - var seriesList = self.createSeries(plotParameters, plotModel, plotData); + var seriesList = []; + if(xAxis.length > 1 && yAxis.length > 1){ + seriesList = self.createInterpolatedSeries(plotParameters, plotModel, plotData, xAxis, yAxis); + }else{ + seriesList = self.createSeries(plotParameters, plotModel, plotData); + } + + + //xAxis = xAxis.slice().sort(function(a,b){return a > b}).reduce(function(a,b){if (a.slice(-1)[0] !== b) a.push(b);return a;},[]); + //yAxis = yAxis.slice().sort(function(a,b){return a > b}).reduce(function(a,b){if (a.slice(-1)[0] !== b) a.push(b);return a;},[]); + //seriesList = seriesList.slice().sort(function(a,b){return a > b}).reduce(function(a,b){if (a.slice(-1)[0] !== b) a.push(b);return a;},[]); + + console.log('xAxis'); + console.log(xAxis); + console.log('yAxis'); + console.log(yAxis); + console.log('seriesList'); + console.log(seriesList); + console.log(plotData.displayName); + console.log(plotData.stream_display_name); if (plotModel.get('plotOrientation') == 'horizontal'){ self.setPlotSize('100%','400px'); @@ -369,12 +547,16 @@ var XYPlotView = BasePlot.extend({ }, xAxis: xAxis, yAxis: yAxis, + //options: {yAxis: yAxis}, tooltip: { useHTML: true, shared: false, crosshairs : [true,false], formatter: function () { + //console.log('this tooltip'); + //console.log(this); + var xVal = Highcharts.numberFormat(this.x, 2); if (this.series.xAxis.userOptions.title.shortName.indexOf('time') > -1){ xVal = Highcharts.dateFormat('%Y-%m-%d %H:%M', new Date(this.x)); diff --git a/ooiui/static/kmz/OOI_Glider_Lines.kml b/ooiui/static/kmz/OOI_Glider_Lines.kml new file mode 100644 index 000000000..4d37b5307 --- /dev/null +++ b/ooiui/static/kmz/OOI_Glider_Lines.kml @@ -0,0 +1,306 @@ + + + + OOI Glider Lines + + + + + + + + Endurance + 1 + + La Push Line + #orangeLine + + 0 + + -126,48,0 -124.67,48,0 + + + + + Grays Harbor Line + #orangeLine + + 0 + + -124.2,47,0 -128,47,0 + + + + + Cape Falcon Line + #orangeLine + + 0 + + -124,45.75,0 -126,45.75,0 + + + + + Newport Line + #orangeLine + + 0 + + -124.1,44.6,0 -128,44.6,0 + + + + + Coos Bay Line + #orangeLine + + 0 + + -124.3,43.5,0 -126,43.5,0 + + + + + Offshore Line + #orangeLine + + 0 + + -126,48,0 -126,43.5,0 + + + + + + Pioneer + 1 + + EB Line + #greenLine + + 0 + + -70,40.667,0 + -70,39.833,0 + -70.19,39.833,0 + -70.19,40.0833,0 + -70,40.667,0 + + + + + FZ Line + #redLine + + 0 + + -70.375,40.0833,0 + -71.167,40.0833,0 + -71.167,39.833,0 + -70.375,39.833,0 + -70.375,40.0833,0 + + + + + SS-1 Line + #blueLine + + 0 + + -71.167,39.833,0 + -71.167,39.333,0 + -70.583,39.833,0 + -70,39.333,0 + -70,39.833,0 + -70.583,39.333,0 + -71.167,39.833,0 + + + + + SS-2 Line + #cyanLine + + 0 + + -71.167,39.583,0 + -70.875,39.833,0 + -70.292,39.333,0 + -70,39.583,0 + -70.292,39.833,0 + -70.875,39.333,0 + -71.167,39.583,0 + + + + + GS Line + #grayLine + + 0 + + -70.883,39.9,0 + -70.7071,39.9,0 + -70.707,39.1,0 + -70.883,39.1,0 + -70.883,39.9,0 + + + + + + Global Arrays + 1 + + Argentine Basin + #orangeLine + + 0 + + -42.51,-42.99,0 + -42.89,-42.51,0 + -42.13,-42.51,0 + -42.51,-42.99,0 + + + + + Irminger Sea + #orangeLine + + 0 + + -38.26,60.61,0 + -38.44,60.46,0 + -38.08,60.46,0 + -38.26,60.61,0 + + + + + Station Papa + #orangeLine + + 0 + + -144.8733333333333,50.055,0 + -144.25,49.98,0 + -144.4,50.33000000000001,0 + -144.8733333333333,50.055,0 + + + + + Southern Ocean + #orangeLine + + 0 + + -89.28,-54.47,0 + -88.89,-54.08000000000001,0 + -89.67,-54.08000000000001,0 + -89.28,-54.47,0 + + + + + + diff --git a/ooiui/templates/asset_management/asset_management.html b/ooiui/templates/asset_management/asset_management.html index ef2fb837b..b9b5e697b 100644 --- a/ooiui/templates/asset_management/asset_management.html +++ b/ooiui/templates/asset_management/asset_management.html @@ -458,7 +458,7 @@ // Opens the plotting page var openPlot = function(ref_des){ location.origin = location.protocol + "//" + location.host; - var win = window.open(location.origin+"/data_access/#"+ref_des, '_blank'); + var win = window.open(location.origin+"/data_access/?search="+ref_des, '_blank'); win.focus(); }; diff --git a/ooiui/templates/asset_management/cruises.html b/ooiui/templates/asset_management/cruises.html index fc0bbe63f..4891543b5 100644 --- a/ooiui/templates/asset_management/cruises.html +++ b/ooiui/templates/asset_management/cruises.html @@ -432,7 +432,7 @@ // Opens the plotting page var openPlot = function(ref_des){ location.origin = location.protocol + "//" + location.host; - var win = window.open(location.origin+"/data_access/#"+ref_des, '_blank'); + var win = window.open(location.origin+"/data_access/?search="+ref_des, '_blank'); win.focus(); }; diff --git a/ooiui/templates/common/home.html b/ooiui/templates/common/home.html index 3c9d39706..8bf17c94e 100644 --- a/ooiui/templates/common/home.html +++ b/ooiui/templates/common/home.html @@ -36,6 +36,7 @@ + {% endblock %} {%block body %} diff --git a/ooiui/templates/common/statusTree.html b/ooiui/templates/common/statusTree.html new file mode 100644 index 000000000..040c4353d --- /dev/null +++ b/ooiui/templates/common/statusTree.html @@ -0,0 +1,459 @@ +{% extends "common/base.html" %} + +{% block title %} + OOI - Home +{% endblock %} + +{% block beforebootstrap %} + +{% endblock %} + +{% block head %} + + + + + + + + + + + + + + + + + + + + + + + + + + + +{% endblock %} + +{%block body %} + +
+ +
+ +
+
+
+
+
+

Research Arrays Select an array on the map or choose from the list.

+
+ +{#
#} +
+ + + +
+ +
+
+
+ + + + + + + + + + + +{# #} +{% endblock %} diff --git a/ooiui/templates/science/data_access.html b/ooiui/templates/science/data_access.html index 2b20211b6..eef79d2df 100644 --- a/ooiui/templates/science/data_access.html +++ b/ooiui/templates/science/data_access.html @@ -48,12 +48,18 @@ + + + {% block link %} {{ super() }} @@ -119,7 +125,7 @@

-
+
@@ -131,7 +137,7 @@
+
@@ -275,6 +282,8 @@

+ Back to Top + Back to Bottom
@@ -406,19 +415,32 @@ } }, plotInterpolatedData: function(parameterCollection) { + console.log('plotInterpolatedData'); + console.log(parameterCollection); var self = this; var selectDt = this.views.plotControls.getDateTimeRange(); + self.views.plotContainer.plotParameters = parameterCollection; + var instr1_2 = []; + var vars1_2 = []; + var ref_des1_2 = []; //INTERPOLATED PLOT 1) //get the params var xParams1 = []; var yParams1 = []; + var zParams1 = []; var displayName = parameterCollection.models[0].get('original_model').get('long_display_name'); - var streamName1 = parameterCollection.models[0].get('original_model').get('stream_name'); + var streamName1 = parameterCollection.models[0].get('original_model').get('stream_display_name'); var referenceDesignator1 = parameterCollection.models[0].get('original_model').get('reference_designator'); parameterCollection.each(function(model){ + console.log(model); if (model.get('is_selected')){ - //double check the selected field and add the parameter name to the list + if(model.get('short_name') != 'time'){ + instr1_2.push(model.get('original_model').get('stream_name')); + vars1_2.push(model.get('short_name')); + ref_des1_2.push(model.get('original_model').get('reference_designator')); + } +{# //double check the selected field and add the parameter name to the list if (model.get('is_x')){ xParams1.push(model.get('short_name')); } @@ -427,19 +449,24 @@ } if (model.get('is_z')){ zParams1.push(model.get('short_name')); - } + }#} } }); - //INTERPOLATED PLOT 2) +{# //INTERPOLATED PLOT 2) //get the params var xParams2 = []; var yParams2 = []; - var streamName2 = parameterCollection.models[1].get('original_model').get('stream_name'); + var zParams2 = []; + var streamName2 = parameterCollection.models[1].get('original_model').get('stream_display_name'); var referenceDesignator2 = parameterCollection.models[1].get('original_model').get('reference_designator'); parameterCollection.each(function(model){ if (model.get('is_selected')){ + instr1_2 = model.get('short_name'); + if(instr1 != 'time'){ + vars1_2.push(model.get('original_model').get('stream')); + } //double check the selected field and add the parameter name to the list if (model.get('is_x')){ xParams2.push(model.get('short_name')); @@ -451,21 +478,46 @@ zParams2.push(model.get('short_name')); } } - }); + });#} + + //xParams1 = xParams1.slice().sort(function(a,b){return a > b}).reduce(function(a,b){if (a.slice(-1)[0] !== b) a.push(b);return a;},[]); + //yParams1 = yParams1.slice().sort(function(a,b){return a > b}).reduce(function(a,b){if (a.slice(-1)[0] !== b) a.push(b);return a;},[]); + //xParams2 = xParams2.slice().sort(function(a,b){return a > b}).reduce(function(a,b){if (a.slice(-1)[0] !== b) a.push(b);return a;},[]); + //yParams2 = yParams2.slice().sort(function(a,b){return a > b}).reduce(function(a,b){if (a.slice(-1)[0] !== b) a.push(b);return a;},[]); + +{# console.log('xParams1'); + console.log(xParams1); + console.log('xParams2'); + console.log(xParams2); + console.log('yParams1'); + console.log(yParams1); + console.log('yParams2'); + console.log(yParams2); + console.log('zParams1'); + console.log(zParams1); + console.log('zParams2'); + console.log(zParams2);#} + + console.log('instr1_2'); + console.log(instr1_2); + console.log('vars1_2'); + console.log(vars1_2); + console.log('ref_des1_2'); + console.log(ref_des1_2); //create the interpolated data series collection self.views.plotContainer.plotData = new InterpolatedDataSeriesCollection({}, - { - displayName : displayName, - ref_des1 : referenceDesignator1, - ref_des2 : referenceDesignator2, - instr1 : streamName1, - instr2 : streamName2, - startdate : selectDt.startDate.toISOString(), - enddate : selectDt.endDate.toISOString(), - var1 : xParams1.concat(yParams1), - var2 : xParams2.concat(yParams2) - }); + {instr1 : instr1_2[0], + instr2 : instr1_2[1], + ref_des1 : ref_des1_2[0], + ref_des2 : ref_des1_2[1], + startdate : selectDt.startDate.toISOString(), + enddate : selectDt.endDate.toISOString(), + var1 : vars1_2[0], + var2 : vars1_2[1], + displayName: displayName, + stream_display_name: streamName1} + ); var onDataHandler = function(collection, response, options) { self.views.plotContainer.hideLoading(); @@ -1067,22 +1119,34 @@ } var actionButtons = "
"; - actionButtons += ""; - if (ooi.login.loggedIn()) { - actionButtons += ""; - } else { - actionButtons += ""; + + // Add stream to plot button + if(_.isNull(rowObject.stream_name)) { + actionButtons += ""; + }else{ + actionButtons += ""; } - if (!_.isNull(currentUser) && !_.isUndefined(currentUser.scopes)) { - if ($.inArray("asset_manager", currentUser.scopes) >= 0) { - actionButtons += ""; - } else { - actionButtons += ""; - } - } else { - actionButtons += ""; + // Download Data Button + if(!_.isNull(rowObject.stream_name) && ooi.login.loggedIn()) { + actionButtons += ""; + }else{ + actionButtons += ""; + } + + // Asset management button + actionButtons += ""; + + // IRIS Link + if(rowObject.iris_enabled) { + actionButtons += ""; + }else{ + actionButtons += ""; } + + // Raw Data Server Link + actionButtons += ""; + actionButtons += "
"; return actionButtons; }; @@ -1106,6 +1170,41 @@ ooi.trigger('StreamTableItemView:onClick', {model: dlModel}); }; + // Hides the IRIS modal after clicking the link + var hideModal = function() { + $('button.close').click(); + }; + + // Opens the IRIS external link download + var openIrisDownload = function(ref_des, stream_name, iris_link, dtRange) { + var daWarning = new ModalDialogView(); + + var theMessage = "
"; + theMessage += '

IRIS

'; + theMessage += "You are about to navigate to an external website operated by IRIS."; + theMessage += "

Click Here to Proceed

"; + theMessage += "
"; + daWarning.show({ + message: theMessage, + type: "warning" + }); + }; + + // Opens the IRIS external link download + var openRawDownload = function(ref_des, stream_name, rds_link, dtRange) { + var daWarning = new ModalDialogView(); + + var theMessage = "
"; + //theMessage += '

IRIS

'; + theMessage += "You are about to navigate to an external website operated by OOI for raw data."; + theMessage += "

Click Here to Proceed

"; + theMessage += "
"; + daWarning.show({ + message: theMessage, + type: "warning" + }); + }; + var openAssetManagement = function(ref_des, stream_name) { //assets/list/#CE01ISSP location.origin = location.protocol + "//" + location.host; @@ -1232,6 +1331,83 @@ $("#AllTimesSwitch").bootstrapSwitch('state', true); $("#AllDepthsSwitch").bootstrapSwitch('state', true); + $.fn.scrollBottom = function(scroll){ + if(typeof scroll === 'number'){ + window.scrollTo(0,$(document).height() - $(window).height() - scroll); + return $(document).height() - $(window).height() - scroll; + } else { + return $(document).height() - $(window).height() - $(window).scrollTop(); + } + }; + + var amountScrolled = 200; + + $(window).scroll(function() { + if ( $(window).scrollTop() > amountScrolled) { + $('a.back-to-top').fadeIn('slow'); +{# $('a.back-to-bottom').fadeIn('slow');#} + } else { + $('a.back-to-top').fadeOut('slow'); +{# $('a.back-to-bottom').fadeOut('slow');#} + } + + if ( $(window).scrollBottom() > amountScrolled ) { +{# $('a.back-to-top').fadeIn('slow');#} + $('a.back-to-bottom').fadeIn('slow'); + } else { +{# $('a.back-to-top').fadeOut('slow');#} + $('a.back-to-bottom').fadeOut('slow'); + } + }); + + $('a.back-to-top').click(function() { + $('html, body').animate({ + scrollTop: 0 + }, 700); + return false; + }); + + $('a.back-to-bottom').click(function() { + $('html, body').animate({ + scrollTop: $(document).height() + }, 700); + return false; + }); + + // Fixs the jqGrid tab width based on current window size + var fixjqGridSize = function() { + var jqGridWrapperId = "#gbox_" + $dcGrid.attr('id'); //here be dragons, this is generated by jqGrid. + $dcGrid.setGridWidth($(jqGridWrapperId).parent().width()-20); //perhaps add padding calculation here? + }; + + // Fix the sidebar filter size and jqGrid width on window/browser resize + $(window).resize(function () { + // console.log('setting new grid width'); + fixjqGridSize(); + // Fix scrollable height of filters after DA is added + $('#filterScrollContainer').height(jQuery('#plottingBodyContainer').height()); + {#$('#filterScrollContainer').css({ + "height": "calc(100vh - 165px)", + "overflow-y": "scroll" + })#} + }); + + $('#navGrid select').change(function() { + $('#filterScrollContainer').height(jQuery('#plottingBodyContainer').height()); + }); + + // Fix the jqGrid width after tab selection + $( 'a[data-toggle="tab"]' ).on( 'shown.bs.tab', function( evt ) { + // console.log('shown.bs.tab'); + fixjqGridSize() + }); + +{# $(window).load(function(){ + $('#filterScrollContainer').css({ + "height": "calc(100vh - 165px)", + "overflow-y": "scroll" + }) + });#} $('#EngInstrumentSwitch').on('switchChange.bootstrapSwitch', function () { var theStateEng = $("#EngInstrumentSwitch").bootstrapSwitch('state'); @@ -1437,6 +1613,7 @@ ooi.trigger("TimeRangeFilterView:addToTimeRange", newOptions); ooi.trigger("DepthRangeFilterView:change", depthOptions); combineFilters(); + $('#filterScrollContainer').height(jQuery('#plottingBodyContainer').height()); }; var setArrayFilter = function(searchColumn, searchParam){ @@ -1748,10 +1925,10 @@ .call(chart);#} // Fix scrollable height of filters after DA is added - $('#filterScrollContainer').css({ + {#$('#filterScrollContainer').css({ "height": "calc(100vh - 165px)", "overflow-y": "scroll" - }) + })#} }, datatype : "local", data : collection.toJSON(), @@ -1773,12 +1950,17 @@ 'Longitude', 'Start Time', 'End Time', - 'Unique ID'], + 'Unique ID', + 'IRIS Link', + 'IRIS Enabled', + 'RDS Link', + 'RDS Enabled' + ], colModel : [ { name : 'actions', caption : 'Plot/Download', - width : 110, + width : 170, sortable : false, search : false, align : 'center', @@ -1855,7 +2037,7 @@ index: 'reference_designator', key: false, // rowID = reference_designator editable: false, - {# width: 165,#} + width: 200, sortable: true, sorttype: 'string', searchoptions: {sopt: ['cn', 'eq', 'ne', 'lt', 'le', 'gt', 'ge', 'bw', 'bn', 'in', 'ni', 'ew', 'en', 'nc']}, @@ -1923,6 +2105,7 @@ { name : 'depth', index : 'depth', + width : 85, editable : false, sortable : true, sorttype : 'number', @@ -1950,7 +2133,7 @@ name : 'latitude', index : 'latitude', editable : false, - {# width : 85,#} + width : 85, sortable : true, sorttype : 'string', searchoptions : {sopt:['cn','eq','ne','lt','le','gt','ge','bw','bn','in','ni','ew','en','nc']}, @@ -1963,7 +2146,7 @@ name : 'longitude', index : 'longitude', editable : false, - {# width : 85,#} + width : 85, sortable : true, sorttype : 'string', searchoptions : {sopt:['cn','eq','ne','lt','le','gt','ge','bw','bn','in','ni','ew','en','nc']}, @@ -1976,7 +2159,7 @@ name : 'start', index : 'start', editable : false, - {# width : 85,#} + width : 160, sortable : true, sorttype : 'date', searchoptions : {sopt:['cn','eq','ne','lt','le','gt','ge','bw','bn','in','ni','ew','en','nc']}, @@ -1989,7 +2172,7 @@ name : 'end', index : 'end', editable : false, - {# width : 85,#} + width : 160, sortable : true, sorttype : 'date', searchoptions : {sopt:['cn','eq','ne','lt','le','gt','ge','bw','bn','in','ni','ew','en','nc']}, @@ -2014,6 +2197,66 @@ unformat : function (cellvalue, options, cell) { return $('input', cell).val() || cellvalue; } + }, + { + name: 'iris_link', + index: 'iris_link', + key: false, + hidden : true, + editable: false, + {# width: 165,#} + sortable: true, + sorttype: 'string', + searchoptions: {sopt: ['cn', 'eq', 'ne', 'lt', 'le', 'gt', 'ge', 'bw', 'bn', 'in', 'ni', 'ew', 'en', 'nc']}, + align: 'center', + unformat: function (cellvalue, options, cell) { + return $('input', cell).val() || cellvalue; + } + }, + { + name: 'iris_enabled', // iris_link available, download off, plotting off + index: 'iris_enabled', + key: false, + hidden : true, + editable: false, + {# width: 165,#} + sortable: true, + sorttype: 'string', + searchoptions: {sopt: ['cn', 'eq', 'ne', 'lt', 'le', 'gt', 'ge', 'bw', 'bn', 'in', 'ni', 'ew', 'en', 'nc']}, + align: 'center', + unformat: function (cellvalue, options, cell) { + return $('input', cell).val() || cellvalue; + } + }, + { + name: 'rds_link', + index: 'rds_link', + key: false, + hidden : true, + editable: false, + {# width: 165,#} + sortable: true, + sorttype: 'string', + searchoptions: {sopt: ['cn', 'eq', 'ne', 'lt', 'le', 'gt', 'ge', 'bw', 'bn', 'in', 'ni', 'ew', 'en', 'nc']}, + align: 'center', + unformat: function (cellvalue, options, cell) { + return $('input', cell).val() || cellvalue; + } + }, + { + name: 'rds_enabled', + index: 'rds_enabled', + key: false, + hidden : true, + editable: false, + {# width: 165,#} + sortable: true, + sorttype: 'string', + searchoptions: {sopt: ['cn', 'eq', 'ne', 'lt', 'le', 'gt', 'ge', 'bw', 'bn', 'in', 'ni', 'ew', 'en', 'nc']}, + align: 'center', + unformat: function (cellvalue, options, cell) { + return $('input', cell).val() || cellvalue; + } } ], ondblClickRow: function (id) { @@ -2029,6 +2272,8 @@ if (initialLocationSearch != "") { navSearchParse(initialLocationSearch); } + + $('#filterScrollContainer').height(jQuery('#plottingBodyContainer').height()); }, gridComplete : function() { {# console.log('gridComplete');#} From 29368bd1dadc18b84509e153d8b1824efe017793 Mon Sep 17 00:00:00 2001 From: James Case Date: Tue, 31 Jan 2017 10:37:46 -0500 Subject: [PATCH 04/26] Adds RDS links. Removes IRIS filter. --- .../js/partials/DropdownUserLoggedOut.html | 2 +- .../asset_filters/InstrumentFilter.html | 3 -- ooiui/templates/science/data_access.html | 41 ++++++++++++++++--- 3 files changed, 36 insertions(+), 10 deletions(-) diff --git a/ooiui/static/js/partials/DropdownUserLoggedOut.html b/ooiui/static/js/partials/DropdownUserLoggedOut.html index 72c493efc..a20eed4c7 100644 --- a/ooiui/static/js/partials/DropdownUserLoggedOut.html +++ b/ooiui/static/js/partials/DropdownUserLoggedOut.html @@ -5,7 +5,7 @@