├── .dockerignore ├── .gitignore ├── .gitlab-ci.yml ├── .gitmodules ├── Dockerfile ├── Gruntfile.js ├── LICENSE.md ├── README.md ├── app.js ├── app ├── lib │ ├── animation.js │ ├── api.js │ ├── apiauth.js │ ├── apiroutes.js │ ├── apiutils.js │ ├── collaboration.js │ ├── moduleloader.js │ ├── passport.js │ ├── plotting.js │ ├── plottingapi.js │ ├── polyfills.js │ ├── proxy.js │ ├── python.py │ ├── redissetup.js │ ├── requestlogger.js │ ├── routes.js │ ├── settings.js │ ├── settingsapi.js │ ├── settingsroutes.js │ ├── user.js │ └── utils.js ├── modules │ └── .gitkeep ├── package.json ├── readme.md └── scripts │ └── animation-timestamper.js ├── build-whitelist.sh ├── cleanup.sh ├── config_examples ├── config.js ├── global-config-server.js ├── markdown │ └── provider │ │ └── PML.md ├── nginx.conf ├── proxy-whitelist.txt ├── vectorLayers.json └── view.json ├── docker-compose.yml ├── docker-debug.sh ├── docker-install.sh ├── docker-readme.md ├── docker-run.sh ├── gisportal ├── html ├── application │ └── .gitkeep ├── audio │ ├── ringtone.mp3 │ └── ringtone.ogg ├── favicon │ ├── android-icon-144x144.png │ ├── android-icon-192x192.png │ ├── android-icon-36x36.png │ ├── android-icon-48x48.png │ ├── android-icon-72x72.png │ ├── android-icon-96x96.png │ ├── apple-icon-114x114.png │ ├── apple-icon-120x120.png │ ├── apple-icon-144x144.png │ ├── apple-icon-152x152.png │ ├── apple-icon-180x180.png │ ├── apple-icon-57x57.png │ ├── apple-icon-60x60.png │ ├── apple-icon-72x72.png │ ├── apple-icon-76x76.png │ ├── apple-icon-precomposed.png │ ├── apple-icon.png │ ├── b0ca35a34665ede409fd52fc4a44f9bc.ico.zip │ ├── browserconfig.xml │ ├── favicon-16x16.png │ ├── favicon-32x32.png │ ├── favicon-96x96.png │ ├── favicon.ico │ ├── manifest.json │ ├── ms-icon-144x144.png │ ├── ms-icon-150x150.png │ ├── ms-icon-310x310.png │ └── ms-icon-70x70.png ├── fonts │ ├── Apache License.txt │ ├── OpenSans-Bold.ttf │ ├── OpenSans-BoldItalic.ttf │ ├── OpenSans-ExtraBold.ttf │ ├── OpenSans-ExtraBoldItalic.ttf │ ├── OpenSans-Italic.ttf │ ├── OpenSans-Light-webfont.eot │ ├── OpenSans-Light-webfont.svg │ ├── OpenSans-Light-webfont.ttf │ ├── OpenSans-Light-webfont.woff │ ├── OpenSans-Light.ttf │ ├── OpenSans-LightItalic.ttf │ ├── OpenSans-Regular-webfont.eot │ ├── OpenSans-Regular-webfont.svg │ ├── OpenSans-Regular-webfont.ttf │ ├── OpenSans-Regular-webfont.woff │ ├── OpenSans-Regular.ttf │ ├── OpenSans-Semibold.ttf │ ├── OpenSans-SemiboldItalic.ttf │ ├── opensans-semibold-webfont.eot │ ├── opensans-semibold-webfont.svg │ ├── opensans-semibold-webfont.ttf │ ├── opensans-semibold-webfont.woff │ ├── streamline-24px-filled-in.eot │ ├── streamline-24px-filled-in.svg │ ├── streamline-24px-filled-in.ttf │ ├── streamline-24px-filled-in.woff │ ├── streamline-24px.eot │ ├── streamline-24px.svg │ ├── streamline-24px.ttf │ └── streamline-24px.woff ├── images │ ├── gritter-light.png │ ├── gritter-long-light.png │ ├── gritter-long.png │ ├── gritter.png │ ├── ie-spacer.gif │ └── trees.jpg ├── img │ ├── PML-MAP-2.png │ ├── PML-MAP-2@2x.png │ ├── PML-MAP-3.jpg │ ├── PML_LOGO.png │ ├── Red-signin_Long_base_20dp.png │ ├── Red-signin_Long_hover_20dp.png │ ├── Red-signin_Long_press_20dp.png │ ├── ajax-loader-green.gif │ ├── ajax-loader.gif │ ├── ajax-loading-halo-1.gif │ ├── baselayer-BingMapsAerial.jpg │ ├── baselayer-BingMapsAerialWithLabels.jpg │ ├── baselayer-BingMapsOS.jpg │ ├── baselayer-BingMapsRoad.jpg │ ├── baselayer-BlackMarble.jpg │ ├── baselayer-BlueMarble.jpg │ ├── baselayer-EOX.jpg │ ├── baselayer-EOXs2cloudless.jpg │ ├── baselayer-GEBCO.jpg │ ├── baselayer-OSM.jpg │ ├── baselayer-none.jpg │ ├── checkbox.svg │ ├── cross.png │ ├── google_default.jpg │ ├── homepage-slides │ │ ├── opec1.jpg │ │ ├── opec2.jpg │ │ ├── opec3.jpg │ │ ├── opec4.jpg │ │ ├── opec5.jpg │ │ ├── opec6.jpg │ │ └── opec7.jpg │ ├── icons │ │ ├── analyse.png │ │ ├── analyse@2.png │ │ ├── analyse@2_light.png │ │ ├── analyse_light.png │ │ ├── analyse_light@2.png │ │ ├── arrow-back.png │ │ ├── arrow-back@2.png │ │ ├── arrow-back_light.png │ │ ├── arrow-back_light@2.png │ │ ├── arrow.svg │ │ ├── checkbox.svg │ │ ├── close.svg │ │ ├── details.png │ │ ├── details.svg │ │ ├── details@2.png │ │ ├── details_light.png │ │ ├── details_light@2.png │ │ ├── download.svg │ │ ├── dustbin.svg │ │ ├── graph.svg │ │ ├── hide.png │ │ ├── hide.svg │ │ ├── hide@2.png │ │ ├── hide_light.png │ │ ├── hide_light@2.png │ │ ├── line.svg │ │ ├── loading.png │ │ ├── loading@2.png │ │ ├── loading_light.png │ │ ├── loading_light@2.png │ │ ├── map.svg │ │ ├── options.svg │ │ ├── polygon.svg │ │ ├── remove.svg │ │ ├── reorder.png │ │ ├── reorder@2.png │ │ ├── reorder_light.png │ │ ├── reorder_light@2.png │ │ ├── satellite.png │ │ ├── scalebar.png │ │ ├── scalebar.svg │ │ ├── scalebar@2.png │ │ ├── scalebar_light.png │ │ ├── scalebar_light@2.png │ │ ├── select-rect.svg │ │ ├── settings.png │ │ ├── settings@2.png │ │ ├── settings_light.png │ │ ├── settings_light@2.png │ │ ├── share.svg │ │ ├── show.png │ │ ├── show.svg │ │ ├── show@2.png │ │ ├── show_light.png │ │ ├── show_light@2.png │ │ ├── transfer.svg │ │ ├── watch.svg │ │ ├── zoom-in.svg │ │ └── zoom-out.svg │ ├── logo.png │ ├── providers │ │ ├── cefas.png │ │ ├── dmi.png │ │ ├── hcmr.gif │ │ ├── metu.png │ │ ├── ogs.png │ │ └── pml.png │ ├── s.mp3 │ ├── sign-in-with-google.png │ ├── sign-in-with-microsoft.png │ └── yahoo_signin_btn.png ├── js-libs │ ├── OpenLayers3 │ │ ├── ol-debug.js │ │ ├── ol.css │ │ └── ol.js │ ├── OpenLayers7 │ │ ├── ol-ext.min.css │ │ ├── ol.css │ │ ├── ol.js │ │ └── ol.js.map │ ├── fuse │ │ └── fuse.js │ ├── jquery-nouislider │ │ ├── jquery.nouislider.js │ │ └── jquery.nouislider.min.js │ ├── jquery.add-clear.js │ ├── jstorage.js │ ├── modernizr.js │ ├── moment.js │ ├── pikaday │ │ ├── pikaday.css │ │ ├── pikaday.jquery.js │ │ └── pikaday.js │ ├── swipe │ │ └── swipe.js │ ├── tooltipster │ │ ├── css │ │ │ ├── plugins │ │ │ │ └── tooltipster │ │ │ │ │ └── sideTip │ │ │ │ │ ├── themes │ │ │ │ │ ├── tooltipster-sideTip-borderless.min.css │ │ │ │ │ ├── tooltipster-sideTip-light.min.css │ │ │ │ │ ├── tooltipster-sideTip-noir.min.css │ │ │ │ │ ├── tooltipster-sideTip-punk.min.css │ │ │ │ │ └── tooltipster-sideTip-shadow.min.css │ │ │ │ │ └── tooltipster-sideTip.min.css │ │ │ ├── themes │ │ │ │ ├── tooltipster-light.css │ │ │ │ ├── tooltipster-noir.css │ │ │ │ ├── tooltipster-punk.css │ │ │ │ └── tooltipster-shadow.scss │ │ │ └── tooltipster.scss │ │ ├── demo │ │ │ ├── index.html │ │ │ ├── map.png │ │ │ ├── reset.css │ │ │ └── style.css │ │ ├── doc │ │ │ ├── css │ │ │ │ ├── prettify.css │ │ │ │ ├── reset.css │ │ │ │ └── style.css │ │ │ ├── images │ │ │ │ ├── browser-chrome.png │ │ │ │ ├── browser-firefox.png │ │ │ │ ├── browser-ie.png │ │ │ │ ├── browser-opera.png │ │ │ │ ├── browser-safari.png │ │ │ │ ├── favicon.png │ │ │ │ ├── icons │ │ │ │ │ ├── icomoon.eot │ │ │ │ │ ├── icomoon.svg │ │ │ │ │ ├── icomoon.ttf │ │ │ │ │ ├── icomoon.woff │ │ │ │ │ └── icomoond41d.eot │ │ │ │ ├── large-background.jpg │ │ │ │ ├── pattern-navy.png │ │ │ │ ├── social.jpg │ │ │ │ ├── spiderman.png │ │ │ │ └── tooltipster.svg │ │ │ └── js │ │ │ │ ├── jquery.jgfeed.js │ │ │ │ ├── lang-css.js │ │ │ │ ├── prettify.js │ │ │ │ └── scripts.js │ │ └── js │ │ │ ├── tooltipster.bundle.js │ │ │ └── tooltipster.bundle.min.js │ └── webrtc_adapter │ │ ├── adapter.js │ │ └── utils.js ├── login.js ├── plots │ └── .gitkeep └── point_data_template.csv ├── install.py ├── package.json ├── plotting ├── .gitignore ├── README.md ├── data_extractor │ ├── .gitignore │ ├── README.md │ ├── __init__.py │ ├── analysis_types │ │ ├── __init__.py │ │ ├── basic_stats.py │ │ ├── hovmoller_stats.py │ │ ├── image_stats.py │ │ ├── scatter_stats.py │ │ └── transect_stats.py │ ├── data_extractor_cli.py │ ├── extraction_utils │ │ ├── __init__.py │ │ ├── analysis_utils.py │ │ ├── debug.py │ │ ├── scatter_utils.py │ │ ├── transect_utils.py │ │ ├── wcs_extraction.py │ │ └── wcs_raw_extraction.py │ ├── extractors │ │ ├── __init__.py │ │ ├── basic_extraction.py │ │ ├── extractor.py │ │ ├── hovmoller_extraction.py │ │ ├── irregular_extraction.py │ │ ├── scatter_extraction.py │ │ ├── single_test_extraction.py │ │ └── transect_extraction.py │ ├── tests │ │ ├── __init__.py │ │ └── example_track.csv │ └── transect_output_test.json ├── palettes.py ├── plots.py ├── plotting │ ├── __init__.py │ ├── debug.py │ ├── logger.py │ └── status.py └── testing │ ├── data │ ├── data-image-hor.json │ ├── data-image-vert.json │ ├── data-image.json │ ├── extract_request1.json │ ├── extract_request2.json │ ├── extract_request3.json │ ├── hovmoller_request1.json │ ├── hovmoller_request2.json │ ├── hovmoller_request3.json │ ├── oldplotexample.json │ ├── oldplotexample1.json │ ├── oldplotexample2.json │ ├── temperature-format-url.json │ ├── temperature-format.json │ ├── temperature.json │ ├── testrequest1.json │ ├── testrequest2.json │ ├── testscatter1.json │ ├── testscatter1.json: │ ├── testscatter2.json │ ├── timeseries-sos.json │ ├── timeseries-sos2.json │ ├── transect1.csv │ ├── transect1.json │ └── transect2.json │ ├── dataconversion.py │ ├── irreg_hov_test.json │ ├── irregular_test.json │ └── palette-green.json ├── src ├── css │ └── scss │ │ ├── _add-layers-form.scss │ │ ├── _alerts.scss │ │ ├── _animation.scss │ │ ├── _collaboration.scss │ │ ├── _colours-blue.scss │ │ ├── _colours-marine-eo.scss │ │ ├── _colours-modellers.scss │ │ ├── _colours-petrel.scss │ │ ├── _colours.scss │ │ ├── _compare.scss │ │ ├── _edit-groups.scss │ │ ├── _export.scss │ │ ├── _fonts.scss │ │ ├── _grid.scss │ │ ├── _history.scss │ │ ├── _icons.scss │ │ ├── _indicators.scss │ │ ├── _jquery.nouislider.scss │ │ ├── _main.scss │ │ ├── _mapcontrols.scss │ │ ├── _metadata-panel.scss │ │ ├── _notify.scss │ │ ├── _nv.d3.scss │ │ ├── _overlay.scss │ │ ├── _panel-slideout.scss │ │ ├── _panel.scss │ │ ├── _plot.scss │ │ ├── _popup.scss │ │ ├── _reset.scss │ │ ├── _scalebar.scss │ │ ├── _share.scss │ │ ├── _start.scss │ │ ├── _streamline-filled-in.scss │ │ ├── _streamline.scss │ │ ├── _tables.scss │ │ ├── _timeline.scss │ │ ├── _type.scss │ │ ├── _user.scss │ │ ├── _vector.scss │ │ ├── _walkthrough.scss │ │ ├── gisportal-marine-eo.scss │ │ ├── gisportal.scss │ │ ├── gisportal_blue.scss │ │ ├── gisportal_modellers.scss │ │ ├── gisportal_petrel.scss │ │ └── login.scss ├── index.html ├── js │ ├── API.js │ ├── EventManager.js │ ├── Plot.js │ ├── PlotEditor.js │ ├── PlotStatus.js │ ├── addLayersForm.js │ ├── analytics.js │ ├── autoLayer.js │ ├── collaboration-event-bindings.js │ ├── collaboration.js │ ├── comparison.js │ ├── configure.js │ ├── ddslick.js │ ├── editLayersForm.js │ ├── editgroups.js │ ├── geolocationFilter.js │ ├── gisportal.js │ ├── graphing.js │ ├── impact.js │ ├── indicators.js │ ├── layer.js │ ├── loading.js │ ├── login.js │ ├── map-settings.js │ ├── notify.js │ ├── notify_settings.js │ ├── panel-slideout.js │ ├── panels.js │ ├── portal.js │ ├── projectSpecific.js │ ├── refine.js │ ├── scalebar.js │ ├── selectiontools.js │ ├── share.js │ ├── templates.js │ ├── timeline.js │ ├── ui.js │ ├── user.js │ ├── user_feedback.js │ ├── utils.js │ ├── vector_layer.js │ ├── vector_styles.js │ ├── view.js │ ├── walkthrough-event-bindings.js │ ├── walkthrough.js │ └── webrtc_control.js └── templates │ ├── active-plot-component.mst │ ├── active-plot.mst │ ├── add-indicator-dropdown.mst │ ├── add-layers-form.mst │ ├── add-layers-paginator.mst │ ├── add-layers-table.mst │ ├── add-layers-validation.mst │ ├── browseIndicators.mst │ ├── categories.mst │ ├── category-filter-selectlist.mst │ ├── category-filter-tabs.mst │ ├── category-filter.mst │ ├── category-simple-selectlist.mst │ ├── collaboration-home.mst │ ├── collaboration-invite.mst │ ├── collaboration-message.mst │ ├── collaboration-messenger.mst │ ├── collaboration-person-local.mst │ ├── collaboration-person-remote.mst │ ├── collaboration-status.mst │ ├── collaboration-video.mst │ ├── collaboration.mst │ ├── edit-group-form.mst │ ├── edit-groups-table.mst │ ├── edit-layers-table.mst │ ├── export-raw.mst │ ├── graph.mst │ ├── indicator.mst │ ├── map-settings.mst │ ├── plot-data.mst │ ├── plot-popup.mst │ ├── plot-status.mst │ ├── refine.mst │ ├── scalebar-preview.mst │ ├── scalebar.mst │ ├── server-form.mst │ ├── share-logged-out.mst │ ├── start.mst │ ├── tab-analysis.mst │ ├── tab-details.mst │ ├── tab-dimensions.mst │ ├── tab-vectorstyles.mst │ ├── terms-and-conditions-text.mst │ ├── tooltip-layerordermove.mst │ ├── tooltip-next-previous.mst │ ├── tooltip-refine-external-details.mst │ ├── tooltip-refinedetails.mst │ ├── tooltip-scalebar.mst │ ├── user-feedback-popup.mst │ ├── user.mst │ ├── vector-style-ui.mst │ ├── walkthrough-controls.mst │ ├── walkthrough-form.mst │ ├── walkthrough-management-table.mst │ ├── webrtc-inbound-call.mst │ └── webrtc-outbound-call.mst ├── test ├── app │ └── lib │ │ ├── animation.js │ │ ├── api.js │ │ ├── apiauth.js │ │ ├── apiutils.js │ │ ├── moduleloader.js │ │ ├── requestlogger.js │ │ └── utils.js ├── frontend.js ├── mocha.opts └── setup.js ├── test_dependencies ├── app │ └── modules │ │ └── test │ │ └── index.js ├── config │ └── site_settings │ │ └── 127.0.0.1:6789 │ │ ├── config-server.js │ │ ├── rsg.pml.ac.uk-thredds-wms-CCI_ALL-v3.0-5DAY.json │ │ ├── rsg.pml.ac.uk-thredds-wms-CCI_ALL-v3.0-DAILY.json │ │ └── user_a.user@pml.ac.uk │ │ └── rsg.pml.ac.uk-thredds-wms-CCI_ALL-v3.0-MONTHLY.json ├── expected │ ├── get_cache_layers.json │ ├── get_cache_servers.json │ └── plotting │ │ └── animation │ │ ├── cd1ae320a55777f114ee6177bd409728c0954716-plot.html │ │ ├── cd1ae320a55777f114ee6177bd409728c0954716-request.json │ │ ├── cd1ae320a55777f114ee6177bd409728c0954716-status.json │ │ ├── cd1ae320a55777f114ee6177bd409728c0954716-video.mp4 │ │ └── cd1ae320a55777f114ee6177bd409728c0954716-video.webm ├── init.js ├── resources │ └── plotting │ │ └── animation │ │ ├── 2eb07c2130bf866a984ec65a488a13184d162bd4_2015-11-01T00-00:00.000Z.png │ │ ├── 2eb07c2130bf866a984ec65a488a13184d162bd4_2015-12-01T00-00:00.000Z.png │ │ └── cd1ae320a55777f114ee6177bd409728c0954716-request.json └── uploads │ └── testFileUpload.txt ├── uploads ├── .gitkeep ├── archive │ └── .gitkeep └── cache │ └── .gitkeep └── views ├── authorised.jade ├── collaboration-dashboard.jade ├── collaboration-index.jade ├── dashboard.jade ├── index.jade └── login.jade /.dockerignore: -------------------------------------------------------------------------------- 1 | .git* 2 | node_modules/* 3 | .sass-cache 4 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.orig 2 | *.pyc 3 | .DS_Store 4 | .vscode 5 | tags 6 | .sass-cache/* 7 | .tern-project 8 | .trunk 9 | config/* 10 | html/GISportal.js 11 | html/GISportal.min.js 12 | html/all_templates.mst 13 | html/application/* 14 | html/css/* 15 | html/index.html 16 | html/plots/* 17 | !html/plots/.gitkeep 18 | jsconfig.json 19 | node_modules 20 | logs/* 21 | typings.json 22 | typings/* 23 | 24 | uploads/* 25 | !uploads/.gitkeep 26 | !uploads/archive/ 27 | !uploads/cache/ 28 | 29 | uploads/archive/* 30 | !uploads/archive/.gitkeep 31 | 32 | uploads/cache/* 33 | !uploads/cache/.gitkeep 34 | 35 | app/modules/* 36 | !app/modules/.gitkeep 37 | -------------------------------------------------------------------------------- /.gitlab-ci.yml: -------------------------------------------------------------------------------- 1 | image: pmlrsg/gisportal-host 2 | 3 | stages: 4 | - build 5 | 6 | job1: 7 | only: 8 | - master 9 | - dev 10 | - testing 11 | stage: build 12 | script: 13 | - node --version 14 | - npm --version 15 | - npm install --silent --depth 0 16 | - grunt 17 | - /usr/bin/redis-server --daemonize yes 18 | - npm test 19 | -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "src/libs/nvd3"] 2 | path = src/libs/nvd3 3 | url = https://github.com/pmlrsg/nvd3 4 | -------------------------------------------------------------------------------- /app/lib/apiroutes.js: -------------------------------------------------------------------------------- 1 | /** 2 | * This module provides the routes for the API. 3 | */ 4 | 5 | var express = require('express'); 6 | var api = require('./api.js'); 7 | var apiAuth = require('./apiauth.js'); 8 | 9 | var router = express.Router(); 10 | var apiRouter = express.Router({ 11 | mergeParams: true 12 | }); 13 | 14 | module.exports = router; 15 | 16 | /** 17 | * Declares the api route to use the token authentication and apiRouter 18 | */ 19 | router.use('/api/1/:token/', apiAuth.authenticateToken, apiRouter); 20 | 21 | /** 22 | * Refresh the api user's cache file for the provided WMS url. Admins may refresh global cache files or other user's 23 | * cache files by specifying a username. 24 | * Query parameters: 25 | * url: WMSurl to refresh 26 | * user: usename of the cache file owner or 'global' 27 | */ 28 | apiRouter.get('/refresh_wms_cache', apiAuth.denyGuest, api.refresh_wms_cache); 29 | 30 | apiRouter.get('/refresh_all_wms_cache', apiAuth.requireAdmin, api.refresh_all_wms_cache); 31 | 32 | /** 33 | * Get all the cache files the user has access to in a JSON string. 34 | */ 35 | apiRouter.get('/get_cache', api.get_cache); 36 | 37 | /** 38 | * Get the important details of each cache file (server) the user has access to with or without a summary of their layers in a JSON string. 39 | */ 40 | apiRouter.get('/get_cache_:type', api.get_cache_list); 41 | -------------------------------------------------------------------------------- /app/lib/apiutils.js: -------------------------------------------------------------------------------- 1 | /** 2 | * This module provides functions shared by different parts of the api and api modules 3 | */ 4 | 5 | var apiAuth = require('./apiauth.js'); 6 | var settingsApi = require('./settingsapi.js'); 7 | var utils = require('./utils.js'); 8 | 9 | var apiUtils = {}; 10 | module.exports = apiUtils; 11 | 12 | apiUtils.getCache = function(req) { 13 | var username = apiAuth.getUsername(req); 14 | var domain = utils.getDomainName(req); // Gets the given domain 15 | var permission = apiAuth.getAccessLevel(req, domain); 16 | return settingsApi.get_cache(username, domain, permission); 17 | }; 18 | 19 | apiUtils.findServerURL = function(req, serverName, cache) { 20 | if (!cache && req) { 21 | cache = apiUtils.getCache(req); 22 | } 23 | if (cache) { 24 | for (var i = 0; i < cache.length; i++) { 25 | if (cache[i].serverName == serverName) { 26 | return cache[i].wmsURL; 27 | } 28 | } 29 | } 30 | }; 31 | -------------------------------------------------------------------------------- /app/lib/moduleloader.js: -------------------------------------------------------------------------------- 1 | var fs = require('fs'); 2 | var path = require('path'); 3 | 4 | var moduleLoader = {}; 5 | module.exports = moduleLoader; 6 | 7 | moduleLoader.loadModules = function() { 8 | var directories = getDirectories('../modules'); 9 | var modules = {}; 10 | for (var i = 0; i < directories.length; i++) { 11 | var modName = path.basename(directories[i]); 12 | modules[modName] = require(directories[i]); 13 | } 14 | return modules; 15 | }; 16 | 17 | function getDirectories(srcpath) { 18 | var absPath = path.resolve(__dirname, srcpath); 19 | var dir = fs.readdirSync(absPath).filter(function(file) { 20 | var filePath = path.join(absPath, file); 21 | return fs.statSync(filePath).isDirectory(); 22 | }); 23 | for (var i = 0; i < dir.length; i++) { 24 | dir[i] = path.join(absPath, dir[i]); 25 | } 26 | return dir; 27 | } 28 | -------------------------------------------------------------------------------- /app/lib/passport.js: -------------------------------------------------------------------------------- 1 | 2 | var passport = require('passport'); 3 | var GoogleStrategy = require('passport-google-oauth').OAuth2Strategy; 4 | const SamlStrategy = require('passport-saml').Strategy 5 | 6 | module.exports = passport; 7 | 8 | passport.init = function(config) { 9 | console.log(); 10 | console.log("List of domains with authentication settings:"); 11 | for(var domain in config){ 12 | if(config[domain].auth){ 13 | console.log(domain.replace(/_/g, "/")); 14 | // Google OAuth 15 | if(config[domain].auth.google) { 16 | passport.use(domain+'_google',new GoogleStrategy({ 17 | clientID: config[domain].auth.google.clientid, 18 | clientSecret: config[domain].auth.google.clientsecret, 19 | callbackURL: config[domain].auth.google.callback, 20 | scope: config[domain].auth.google.scope, 21 | prompt: config[domain].auth.google.prompt 22 | }, 23 | function(token, tokenSecret, profile, done) { 24 | return done(null, profile); 25 | } 26 | )); 27 | } 28 | // SAML 29 | if(config[domain].auth.saml) { 30 | passport.use(domain+'_saml', new SamlStrategy({ 31 | entryPoint: config[domain].auth.saml.entryPoint, 32 | issuer: config[domain].auth.saml.issuer, 33 | callbackUrl: config[domain].auth.saml.callbackUrl, 34 | cert: config[domain].auth.saml.cert 35 | }, 36 | function (profile, done) { 37 | return done(null, profile) 38 | } 39 | )) 40 | } 41 | 42 | } 43 | } 44 | console.log(); 45 | 46 | passport.serializeUser(function(user, done) { 47 | done(null, user); 48 | }); 49 | 50 | passport.deserializeUser(function(user, done) { 51 | done(null, user); 52 | }); 53 | }; 54 | 55 | -------------------------------------------------------------------------------- /app/lib/polyfills.js: -------------------------------------------------------------------------------- 1 | if (!String.prototype.startsWith) { 2 | String.prototype.startsWith = function(searchString, position) { 3 | position = position || 0; 4 | return this.substr(position, searchString.length) === searchString; 5 | }; 6 | } 7 | 8 | if (!String.prototype.endsWith) { 9 | String.prototype.endsWith = function(searchString, position) { 10 | var subjectString = this.toString(); 11 | if (typeof position !== 'number' || !isFinite(position) || Math.floor(position) !== position || position > subjectString.length) { 12 | position = subjectString.length; 13 | } 14 | position -= searchString.length; 15 | var lastIndex = subjectString.lastIndexOf(searchString, position); 16 | return lastIndex !== -1 && lastIndex === position; 17 | }; 18 | } 19 | 20 | if (!String.prototype.includes) { 21 | String.prototype.includes = function(search, start) { 22 | 'use strict'; 23 | if (typeof start !== 'number') { 24 | start = 0; 25 | } 26 | 27 | if (start + search.length > this.length) { 28 | return false; 29 | } else { 30 | return this.indexOf(search, start) !== -1; 31 | } 32 | }; 33 | } -------------------------------------------------------------------------------- /app/lib/python.py: -------------------------------------------------------------------------------- 1 | import argparse 2 | 3 | 4 | 5 | parser = argparse.ArgumentParser() 6 | parser.add_argument("-t", "--type", action="store", dest="extract_type", help="Extraction type to perform", required=True, choices=["basic","irregular","trans-lat","trans-long","trans-time"]) 7 | parser.add_argument("-o", "--output", action="store", dest="output", help="Choose the output type (only json is currently available)", required=False, choices=["json"], default="json") 8 | parser.add_argument("-url", "--wcs_url", action="store", dest="wcs_url", help="The URL of the Web Coverage Service to get data from", required=False) 9 | parser.add_argument("-var", "--variable", action="store", dest="wcs_variable", help="The variable/coverage to request from WCS", required=False) 10 | parser.add_argument("-v", "--debug", action="store_true", dest="debug", help="a debug flag - if passed there will be a tonne of log output and all interim files will be saved", required=False) 11 | parser.add_argument("-d", "--depth", action="store", dest="depth", help="an optional depth parameter for sending to WCS", required=False, default=0) 12 | parser.add_argument("-g", "--geom", action="store", dest="geom", help="A string representation of teh polygon to extract", required=False, default="POLYGON((-28.125 43.418,-19.512 43.77,-18.809 34.453,-27.07 34.629,-28.125 43.418))") 13 | parser.add_argument("-time", action="store", dest="time", help="A time string for in the format startdate/enddate or a single date", required=False) 14 | args = parser.parse_args() 15 | 16 | print args 17 | 18 | print args.extract_type -------------------------------------------------------------------------------- /app/lib/redissetup.js: -------------------------------------------------------------------------------- 1 | 2 | var redis = {}; 3 | 4 | module.exports = redis; 5 | 6 | redis.startRedis = function(app, config) { 7 | // Redis config 8 | var url = require('url'); 9 | var redis = require('redis'); 10 | 11 | var redisConfig = url.parse(config.redisURL); 12 | var redisClient = redis.createClient(redisConfig.port, redisConfig.hostname); 13 | 14 | redisClient 15 | .on('error', function(err) { 16 | console.log('Error connecting to redis %j', err); 17 | }).on('connect', function() { 18 | console.log('Connected to redis.'); 19 | }).on('ready', function() { 20 | console.log('Redis client ready.'); 21 | }); 22 | 23 | return redisClient; 24 | }; -------------------------------------------------------------------------------- /app/modules/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/app/modules/.gitkeep -------------------------------------------------------------------------------- /app/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "collaboration-suite", 3 | "description": "real-time collaboration tools for GIS Portal", 4 | "version": "0.0.1", 5 | "dependencies": { 6 | "express": "~4.8.5", 7 | "socket.io": "~1.3.5", 8 | "cookie": "~0.1.2", 9 | "connect": "~3.1.1", 10 | "cookie-parser": "~1.3.2", 11 | "express-sessions": "~1.0.5", 12 | "express-session": "~1.7.6", 13 | "passport": "~0.2.0", 14 | "passport-google": "~0.3.0", 15 | "passport-google-oauth": "~0.1.5", 16 | "redis": "~0.12.1", 17 | "connect-redis": "~2.0.0", 18 | "jade": "~1.10.0" 19 | }, 20 | "engines": { 21 | "node": ">= 0.8.0", 22 | "npm": ">= 1.0" 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /app/scripts/animation-timestamper.js: -------------------------------------------------------------------------------- 1 | var async = require('async'); 2 | var Jimp = require('jimp'); 3 | 4 | // Create queue 5 | var queue = async.queue(processImage, 2); 6 | 7 | // Preload fonts 8 | var fontB = null; 9 | var fontW = null; 10 | Jimp.loadFont(Jimp.FONT_SANS_16_BLACK).then(function(font) { 11 | fontB = font; 12 | }); 13 | Jimp.loadFont(Jimp.FONT_SANS_16_WHITE).then(function(font) { 14 | fontW = font; 15 | }); 16 | 17 | process.on('message', function(options) { 18 | // Add each image received to the queue 19 | queue.push(options, imageDone); 20 | }); 21 | 22 | /** 23 | * Process an image to stamp it's ID (time) in the corner 24 | * @param {object} options The image options 25 | * @param {Function} next Function to call on completion or error 26 | */ 27 | function processImage(options, next) { 28 | if (fontB === null || fontW === null) { 29 | // If the fonts aren't ready yet then wait and try again 30 | setTimeout(function() { 31 | processImage(options, next); 32 | }, 50); 33 | return; 34 | } 35 | 36 | Jimp.read(options.tempPath, function(err, image) { 37 | if (err) { 38 | // Convert err to string as it is an unusual object type 39 | err = err.toString(); 40 | return next(err, options); 41 | } 42 | image.print(fontB, 10, 10, options.id); 43 | image.print(fontW, 11, 11, options.id); 44 | image.write(options.tempPath, function(err) { 45 | if (err) { 46 | err = err.toString(); 47 | } 48 | return next(err, options); 49 | }); 50 | }); 51 | } 52 | 53 | /** 54 | * When an image has been processed, send it's details back to the parent process 55 | * @param {string} err An error string or null 56 | * @param {object} options The image options 57 | */ 58 | function imageDone(err, options) { 59 | if (err) { 60 | queue.kill(); 61 | options.err = err; 62 | } 63 | process.send(options); 64 | } -------------------------------------------------------------------------------- /build-whitelist.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # 3 | # This script will find all domains used by configs and append them to the proxy whitelist. 4 | # If the whitelist doesn't exist at server startup, this script is run by the server after copying in the default whitelist 5 | 6 | find -L ./config -name "*.json"\ 7 | -not -name "*overview.json"\ 8 | -not -name "*_walkthrough.json"\ 9 | -not -name "*vectorLayers.json"\ 10 | -not -name "*dictionary.json"\ 11 | -not -name "members.json"\ 12 | | sed "s|-.*$||g"\ 13 | | sed "s|.*/||g"\ 14 | | sed 's|$|/**|'\ 15 | | sort\ 16 | | uniq\ 17 | >> ./config/proxy-whitelist.txt 18 | -------------------------------------------------------------------------------- /config_examples/global-config-server.js: -------------------------------------------------------------------------------- 1 | global.config = { 2 | // the port that the node application will run on 3 | appPort: 6789, 4 | // redis connection settings 5 | redisURL: 'http://localhost:6379/' , 6 | session : { 7 | secret : 'SECRET', 8 | age : 0 9 | } 10 | }; 11 | -------------------------------------------------------------------------------- /config_examples/markdown/provider/PML.md: -------------------------------------------------------------------------------- 1 | **Provider:** [Plymouth Marine Laboratory](http://www.pml.ac.uk/) 2 | 3 | Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc id nulla vel nisl pretium faucibus. Vivamus pellentesque semper sapien at maximus. Nam quis massa ullamcorper, ornare urna ac, condimentum leo. Nam ultricies placerat risus et pretium. Donec sagittis vel dolor a feugiat. Sed sapien erat, vulputate efficitur condimentum id, egestas ut leo. Pellentesque in ullamcorper metus, in mattis magna. 4 | 5 | **Regional Summary:** Global 6 | 7 | Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc id nulla vel nisl pretium faucibus. Vivamus pellentesque semper sapien at maximus. Nam quis massa ullamcorper, ornare urna ac, condimentum leo. Nam ultricies placerat risus et pretium. Donec sagittis vel dolor a feugiat. Sed sapien erat, vulputate efficitur condimentum id, egestas ut leo. Pellentesque in ullamcorper metus, in mattis magna. 8 | 9 | **Contact:** Stefano Ciavatta, 10 | [example@pml.ac.uk](mailto:example@pml.ac.uk) 11 | 12 | 13 | -------------------------------------------------------------------------------- /config_examples/nginx.conf: -------------------------------------------------------------------------------- 1 | upstream node_servers { 2 | server localhost:6789; 3 | } 4 | 5 | server { 6 | listen *:80; 7 | 8 | location /. { ## Disable .htaccess and other hidden files 9 | return 404; 10 | } 11 | 12 | location / { 13 | try_files @uri @location_node; 14 | } 15 | 16 | error_page 403 /403.html; 17 | error_page 401 /403.html; 18 | location = /403.html { 19 | root /etc/nginx/html; 20 | internal; 21 | } 22 | 23 | location @location_node { 24 | proxy_pass http://node_servers; 25 | proxy_http_version 1.1; 26 | proxy_set_header Upgrade $http_upgrade; 27 | proxy_set_header Connection "upgrade"; 28 | 29 | proxy_redirect off; 30 | proxy_set_header Host $host; 31 | proxy_set_header X-Real-IP $remote_addr; 32 | proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 33 | proxy_set_header X-Forwarded-Host $server_name; 34 | } 35 | 36 | } 37 | -------------------------------------------------------------------------------- /config_examples/proxy-whitelist.txt: -------------------------------------------------------------------------------- 1 | oceancolour.org/** 2 | rsg.pml.ac.uk/** 3 | vortices.npm.ac.uk/** 4 | wci.earth2observe.eu/** 5 | -------------------------------------------------------------------------------- /config_examples/view.json: -------------------------------------------------------------------------------- 1 | { 2 | "_comment":"THESE FILES GOES INTO THE DOMAIN CONFIG FOLDER INSIDE ITS OWN 'VIEWS' FOLDER", 3 | 4 | 5 | 6 | 7 | 8 | "_comment":"The title of the view for the user to see", 9 | "title": "Example View", 10 | 11 | "_comment":"The bounds of the area you would like the view to zoom to (Must be in degrees)", 12 | "bounds": [-10.723,49.219,2.637,62.402], 13 | 14 | "_comment":"The date you would like the view to load", 15 | "date": "2009-11-22", 16 | 17 | "_comment":"Would you like to display lat/lon graticules?", 18 | "graticules": false, 19 | 20 | "_comment":"Would you like to display different border lines? (0 if none)", 21 | "borders": "countries_all_black", 22 | 23 | "_comment":"Would you like to display a different basemap?", 24 | "baseMap": false, 25 | 26 | "_comment":"Would you like to display a different projection? (Will only be displayed if compatible with the basemap", 27 | "projection": "EPSG:4326", 28 | 29 | "_comment":"Set to true if you would like to prevent the user from dragging the map", 30 | "noPan": true, 31 | 32 | "_comment":"Set to true if you would like to prevent the user from zooming in and out of the map", 33 | "noZoom": true, 34 | 35 | "_comment":"This refines the layers you want to list", 36 | "layerListFilter": [ 37 | { 38 | "tags":{ 39 | "data_provider":"CEH", 40 | "interval":"Daily" 41 | } 42 | }, 43 | { 44 | "tags":{ 45 | "data_provider":"CNRS" 46 | } 47 | } 48 | ], 49 | 50 | "_comment":"This refines the layers you want to load (Know that if you have a list filter the load filter will have to match layers in the filtered)", 51 | "layerLoadFilter": [ 52 | { 53 | "tags":{ 54 | "data_provider":"CEH", 55 | "interval":"Daily" 56 | }, 57 | "urlName":"SWnet" 58 | }, 59 | { 60 | "tags":{ 61 | "data_provider":"CNRS", 62 | "interval":"Daily" 63 | }, 64 | "urlName":"SWnet" 65 | } 66 | ] 67 | } -------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '3.1' 2 | 3 | services: 4 | 5 | gisportal: 6 | container_name: gisportal 7 | #image: container.pml.space/web-development/e-shape/dive-frontend 8 | build: gisportal 9 | ports: 10 | - "80:6789" 11 | - "9229:9229" 12 | volumes: 13 | - /usr/share/GISportal:/var/portal/GISportal/config 14 | 15 | 16 | -------------------------------------------------------------------------------- /docker-debug.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # 3 | # This script is the ENTRYPOINT for the docker container; it starts a Redis daemon and 4 | # fires up node inspector for debugging. 5 | # 6 | 7 | # Add the plotting and extractor paths to python 8 | export PYTHONPATH="$PYTHONPATH:/app/GISportal/plotting:/app/GISportal/plotting/data_extractor" 9 | 10 | # build the app from the source files 11 | cd /app/GISportal 12 | grunt 13 | 14 | npm -g install node-inspector 15 | 16 | #start redis 17 | /usr/bin/redis-server --daemonize yes; 18 | 19 | # start the app 20 | node-debug --web-host 0.0.0.0 /app/GISportal/app.js 21 | -------------------------------------------------------------------------------- /docker-install.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # 3 | # This runs the initial setup script, so must be run from docker interactively, e.g. 4 | # 5 | # docker run -v /usr/share/GISportal:/app/GISportal/config -it pmlrsg/gisportal /app/GISportal/docker-install.sh 6 | # 7 | export SOURCE="docker" 8 | cd /app/GISportal/ 9 | ./install.sh 10 | 11 | -------------------------------------------------------------------------------- /docker-run.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # 3 | # This script is the ENTRYPOINT for the docker container; it starts a Redis daemon and 4 | # fires up node. 5 | # 6 | 7 | # Add the plotting and extractor paths to python 8 | export PYTHONPATH="$PYTHONPATH:/var/portal/GISportal/plotting:/var/portal/GISportal/plotting/data_extractor" 9 | 10 | # build the app from the source files 11 | cd /var/portal/GISportal 12 | #grunt 13 | 14 | #start redis 15 | /usr/bin/redis-server --daemonize yes; 16 | 17 | source /var/portal/.nvm/nvm.sh 18 | 19 | # start the app 20 | while true 21 | do 22 | #/usr/bin/node /var/portal/GISportal/app.js > /var/portal/GISportal/config/app.log 23 | #nvm run v10.24.1 --inspect-brk=0.0.0.0 /var/portal/GISportal/app.js >> /var/portal/GISportal/config/app.log 24 | nvm run v10.24.1 /var/portal/GISportal/app.js >> /var/portal/GISportal/config/app.log 25 | #nvm run v6.17.1 /var/portal/GISportal/app.js >> /var/portal/GISportal/config/app.log 26 | sleep 600 27 | done 28 | -------------------------------------------------------------------------------- /gisportal: -------------------------------------------------------------------------------- 1 | . -------------------------------------------------------------------------------- /html/application/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/application/.gitkeep -------------------------------------------------------------------------------- /html/audio/ringtone.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/audio/ringtone.mp3 -------------------------------------------------------------------------------- /html/audio/ringtone.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/audio/ringtone.ogg -------------------------------------------------------------------------------- /html/favicon/android-icon-144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/favicon/android-icon-144x144.png -------------------------------------------------------------------------------- /html/favicon/android-icon-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/favicon/android-icon-192x192.png -------------------------------------------------------------------------------- /html/favicon/android-icon-36x36.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/favicon/android-icon-36x36.png -------------------------------------------------------------------------------- /html/favicon/android-icon-48x48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/favicon/android-icon-48x48.png -------------------------------------------------------------------------------- /html/favicon/android-icon-72x72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/favicon/android-icon-72x72.png -------------------------------------------------------------------------------- /html/favicon/android-icon-96x96.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/favicon/android-icon-96x96.png -------------------------------------------------------------------------------- /html/favicon/apple-icon-114x114.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/favicon/apple-icon-114x114.png -------------------------------------------------------------------------------- /html/favicon/apple-icon-120x120.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/favicon/apple-icon-120x120.png -------------------------------------------------------------------------------- /html/favicon/apple-icon-144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/favicon/apple-icon-144x144.png -------------------------------------------------------------------------------- /html/favicon/apple-icon-152x152.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/favicon/apple-icon-152x152.png -------------------------------------------------------------------------------- /html/favicon/apple-icon-180x180.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/favicon/apple-icon-180x180.png -------------------------------------------------------------------------------- /html/favicon/apple-icon-57x57.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/favicon/apple-icon-57x57.png -------------------------------------------------------------------------------- /html/favicon/apple-icon-60x60.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/favicon/apple-icon-60x60.png -------------------------------------------------------------------------------- /html/favicon/apple-icon-72x72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/favicon/apple-icon-72x72.png -------------------------------------------------------------------------------- /html/favicon/apple-icon-76x76.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/favicon/apple-icon-76x76.png -------------------------------------------------------------------------------- /html/favicon/apple-icon-precomposed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/favicon/apple-icon-precomposed.png -------------------------------------------------------------------------------- /html/favicon/apple-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/favicon/apple-icon.png -------------------------------------------------------------------------------- /html/favicon/b0ca35a34665ede409fd52fc4a44f9bc.ico.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/favicon/b0ca35a34665ede409fd52fc4a44f9bc.ico.zip -------------------------------------------------------------------------------- /html/favicon/browserconfig.xml: -------------------------------------------------------------------------------- 1 | 2 | #ffffff -------------------------------------------------------------------------------- /html/favicon/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/favicon/favicon-16x16.png -------------------------------------------------------------------------------- /html/favicon/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/favicon/favicon-32x32.png -------------------------------------------------------------------------------- /html/favicon/favicon-96x96.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/favicon/favicon-96x96.png -------------------------------------------------------------------------------- /html/favicon/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/favicon/favicon.ico -------------------------------------------------------------------------------- /html/favicon/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "App", 3 | "icons": [ 4 | { 5 | "src": "\/android-icon-36x36.png", 6 | "sizes": "36x36", 7 | "type": "image\/png", 8 | "density": "0.75" 9 | }, 10 | { 11 | "src": "\/android-icon-48x48.png", 12 | "sizes": "48x48", 13 | "type": "image\/png", 14 | "density": "1.0" 15 | }, 16 | { 17 | "src": "\/android-icon-72x72.png", 18 | "sizes": "72x72", 19 | "type": "image\/png", 20 | "density": "1.5" 21 | }, 22 | { 23 | "src": "\/android-icon-96x96.png", 24 | "sizes": "96x96", 25 | "type": "image\/png", 26 | "density": "2.0" 27 | }, 28 | { 29 | "src": "\/android-icon-144x144.png", 30 | "sizes": "144x144", 31 | "type": "image\/png", 32 | "density": "3.0" 33 | }, 34 | { 35 | "src": "\/android-icon-192x192.png", 36 | "sizes": "192x192", 37 | "type": "image\/png", 38 | "density": "4.0" 39 | } 40 | ] 41 | } -------------------------------------------------------------------------------- /html/favicon/ms-icon-144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/favicon/ms-icon-144x144.png -------------------------------------------------------------------------------- /html/favicon/ms-icon-150x150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/favicon/ms-icon-150x150.png -------------------------------------------------------------------------------- /html/favicon/ms-icon-310x310.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/favicon/ms-icon-310x310.png -------------------------------------------------------------------------------- /html/favicon/ms-icon-70x70.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/favicon/ms-icon-70x70.png -------------------------------------------------------------------------------- /html/fonts/OpenSans-Bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/fonts/OpenSans-Bold.ttf -------------------------------------------------------------------------------- /html/fonts/OpenSans-BoldItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/fonts/OpenSans-BoldItalic.ttf -------------------------------------------------------------------------------- /html/fonts/OpenSans-ExtraBold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/fonts/OpenSans-ExtraBold.ttf -------------------------------------------------------------------------------- /html/fonts/OpenSans-ExtraBoldItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/fonts/OpenSans-ExtraBoldItalic.ttf -------------------------------------------------------------------------------- /html/fonts/OpenSans-Italic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/fonts/OpenSans-Italic.ttf -------------------------------------------------------------------------------- /html/fonts/OpenSans-Light-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/fonts/OpenSans-Light-webfont.eot -------------------------------------------------------------------------------- /html/fonts/OpenSans-Light-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/fonts/OpenSans-Light-webfont.ttf -------------------------------------------------------------------------------- /html/fonts/OpenSans-Light-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/fonts/OpenSans-Light-webfont.woff -------------------------------------------------------------------------------- /html/fonts/OpenSans-Light.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/fonts/OpenSans-Light.ttf -------------------------------------------------------------------------------- /html/fonts/OpenSans-LightItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/fonts/OpenSans-LightItalic.ttf -------------------------------------------------------------------------------- /html/fonts/OpenSans-Regular-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/fonts/OpenSans-Regular-webfont.eot -------------------------------------------------------------------------------- /html/fonts/OpenSans-Regular-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/fonts/OpenSans-Regular-webfont.ttf -------------------------------------------------------------------------------- /html/fonts/OpenSans-Regular-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/fonts/OpenSans-Regular-webfont.woff -------------------------------------------------------------------------------- /html/fonts/OpenSans-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/fonts/OpenSans-Regular.ttf -------------------------------------------------------------------------------- /html/fonts/OpenSans-Semibold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/fonts/OpenSans-Semibold.ttf -------------------------------------------------------------------------------- /html/fonts/OpenSans-SemiboldItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/fonts/OpenSans-SemiboldItalic.ttf -------------------------------------------------------------------------------- /html/fonts/opensans-semibold-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/fonts/opensans-semibold-webfont.eot -------------------------------------------------------------------------------- /html/fonts/opensans-semibold-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/fonts/opensans-semibold-webfont.ttf -------------------------------------------------------------------------------- /html/fonts/opensans-semibold-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/fonts/opensans-semibold-webfont.woff -------------------------------------------------------------------------------- /html/fonts/streamline-24px-filled-in.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/fonts/streamline-24px-filled-in.eot -------------------------------------------------------------------------------- /html/fonts/streamline-24px-filled-in.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/fonts/streamline-24px-filled-in.ttf -------------------------------------------------------------------------------- /html/fonts/streamline-24px-filled-in.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/fonts/streamline-24px-filled-in.woff -------------------------------------------------------------------------------- /html/fonts/streamline-24px.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/fonts/streamline-24px.eot -------------------------------------------------------------------------------- /html/fonts/streamline-24px.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/fonts/streamline-24px.ttf -------------------------------------------------------------------------------- /html/fonts/streamline-24px.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/fonts/streamline-24px.woff -------------------------------------------------------------------------------- /html/images/gritter-light.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/images/gritter-light.png -------------------------------------------------------------------------------- /html/images/gritter-long-light.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/images/gritter-long-light.png -------------------------------------------------------------------------------- /html/images/gritter-long.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/images/gritter-long.png -------------------------------------------------------------------------------- /html/images/gritter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/images/gritter.png -------------------------------------------------------------------------------- /html/images/ie-spacer.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/images/ie-spacer.gif -------------------------------------------------------------------------------- /html/images/trees.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/images/trees.jpg -------------------------------------------------------------------------------- /html/img/PML-MAP-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/img/PML-MAP-2.png -------------------------------------------------------------------------------- /html/img/PML-MAP-2@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/img/PML-MAP-2@2x.png -------------------------------------------------------------------------------- /html/img/PML-MAP-3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/img/PML-MAP-3.jpg -------------------------------------------------------------------------------- /html/img/PML_LOGO.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/img/PML_LOGO.png -------------------------------------------------------------------------------- /html/img/Red-signin_Long_base_20dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/img/Red-signin_Long_base_20dp.png -------------------------------------------------------------------------------- /html/img/Red-signin_Long_hover_20dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/img/Red-signin_Long_hover_20dp.png -------------------------------------------------------------------------------- /html/img/Red-signin_Long_press_20dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/img/Red-signin_Long_press_20dp.png -------------------------------------------------------------------------------- /html/img/ajax-loader-green.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/img/ajax-loader-green.gif -------------------------------------------------------------------------------- /html/img/ajax-loader.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/img/ajax-loader.gif -------------------------------------------------------------------------------- /html/img/ajax-loading-halo-1.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/img/ajax-loading-halo-1.gif -------------------------------------------------------------------------------- /html/img/baselayer-BingMapsAerial.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/img/baselayer-BingMapsAerial.jpg -------------------------------------------------------------------------------- /html/img/baselayer-BingMapsAerialWithLabels.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/img/baselayer-BingMapsAerialWithLabels.jpg -------------------------------------------------------------------------------- /html/img/baselayer-BingMapsOS.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/img/baselayer-BingMapsOS.jpg -------------------------------------------------------------------------------- /html/img/baselayer-BingMapsRoad.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/img/baselayer-BingMapsRoad.jpg -------------------------------------------------------------------------------- /html/img/baselayer-BlackMarble.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/img/baselayer-BlackMarble.jpg -------------------------------------------------------------------------------- /html/img/baselayer-BlueMarble.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/img/baselayer-BlueMarble.jpg -------------------------------------------------------------------------------- /html/img/baselayer-EOX.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/img/baselayer-EOX.jpg -------------------------------------------------------------------------------- /html/img/baselayer-EOXs2cloudless.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/img/baselayer-EOXs2cloudless.jpg -------------------------------------------------------------------------------- /html/img/baselayer-GEBCO.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/img/baselayer-GEBCO.jpg -------------------------------------------------------------------------------- /html/img/baselayer-OSM.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/img/baselayer-OSM.jpg -------------------------------------------------------------------------------- /html/img/baselayer-none.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/img/baselayer-none.jpg -------------------------------------------------------------------------------- /html/img/checkbox.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /html/img/cross.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/img/cross.png -------------------------------------------------------------------------------- /html/img/google_default.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/img/google_default.jpg -------------------------------------------------------------------------------- /html/img/homepage-slides/opec1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/img/homepage-slides/opec1.jpg -------------------------------------------------------------------------------- /html/img/homepage-slides/opec2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/img/homepage-slides/opec2.jpg -------------------------------------------------------------------------------- /html/img/homepage-slides/opec3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/img/homepage-slides/opec3.jpg -------------------------------------------------------------------------------- /html/img/homepage-slides/opec4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/img/homepage-slides/opec4.jpg -------------------------------------------------------------------------------- /html/img/homepage-slides/opec5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/img/homepage-slides/opec5.jpg -------------------------------------------------------------------------------- /html/img/homepage-slides/opec6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/img/homepage-slides/opec6.jpg -------------------------------------------------------------------------------- /html/img/homepage-slides/opec7.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/img/homepage-slides/opec7.jpg -------------------------------------------------------------------------------- /html/img/icons/analyse.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/img/icons/analyse.png -------------------------------------------------------------------------------- /html/img/icons/analyse@2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/img/icons/analyse@2.png -------------------------------------------------------------------------------- /html/img/icons/analyse@2_light.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/img/icons/analyse@2_light.png -------------------------------------------------------------------------------- /html/img/icons/analyse_light.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/img/icons/analyse_light.png -------------------------------------------------------------------------------- /html/img/icons/analyse_light@2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/img/icons/analyse_light@2.png -------------------------------------------------------------------------------- /html/img/icons/arrow-back.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/img/icons/arrow-back.png -------------------------------------------------------------------------------- /html/img/icons/arrow-back@2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/img/icons/arrow-back@2.png -------------------------------------------------------------------------------- /html/img/icons/arrow-back_light.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/img/icons/arrow-back_light.png -------------------------------------------------------------------------------- /html/img/icons/arrow-back_light@2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/img/icons/arrow-back_light@2.png -------------------------------------------------------------------------------- /html/img/icons/arrow.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /html/img/icons/checkbox.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /html/img/icons/close.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 14 | 16 | 18 | 19 | 21 | image/svg+xml 22 | 24 | 25 | 26 | 27 | 28 | 30 | 34 | 38 | 39 | 40 | -------------------------------------------------------------------------------- /html/img/icons/details.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/img/icons/details.png -------------------------------------------------------------------------------- /html/img/icons/details@2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/img/icons/details@2.png -------------------------------------------------------------------------------- /html/img/icons/details_light.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/img/icons/details_light.png -------------------------------------------------------------------------------- /html/img/icons/details_light@2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/img/icons/details_light@2.png -------------------------------------------------------------------------------- /html/img/icons/hide.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/img/icons/hide.png -------------------------------------------------------------------------------- /html/img/icons/hide@2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/img/icons/hide@2.png -------------------------------------------------------------------------------- /html/img/icons/hide_light.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/img/icons/hide_light.png -------------------------------------------------------------------------------- /html/img/icons/hide_light@2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/img/icons/hide_light@2.png -------------------------------------------------------------------------------- /html/img/icons/loading.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/img/icons/loading.png -------------------------------------------------------------------------------- /html/img/icons/loading@2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/img/icons/loading@2.png -------------------------------------------------------------------------------- /html/img/icons/loading_light.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/img/icons/loading_light.png -------------------------------------------------------------------------------- /html/img/icons/loading_light@2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/img/icons/loading_light@2.png -------------------------------------------------------------------------------- /html/img/icons/remove.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /html/img/icons/reorder.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/img/icons/reorder.png -------------------------------------------------------------------------------- /html/img/icons/reorder@2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/img/icons/reorder@2.png -------------------------------------------------------------------------------- /html/img/icons/reorder_light.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/img/icons/reorder_light.png -------------------------------------------------------------------------------- /html/img/icons/reorder_light@2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/img/icons/reorder_light@2.png -------------------------------------------------------------------------------- /html/img/icons/satellite.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/img/icons/satellite.png -------------------------------------------------------------------------------- /html/img/icons/scalebar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/img/icons/scalebar.png -------------------------------------------------------------------------------- /html/img/icons/scalebar.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /html/img/icons/scalebar@2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/img/icons/scalebar@2.png -------------------------------------------------------------------------------- /html/img/icons/scalebar_light.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/img/icons/scalebar_light.png -------------------------------------------------------------------------------- /html/img/icons/scalebar_light@2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/img/icons/scalebar_light@2.png -------------------------------------------------------------------------------- /html/img/icons/settings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/img/icons/settings.png -------------------------------------------------------------------------------- /html/img/icons/settings@2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/img/icons/settings@2.png -------------------------------------------------------------------------------- /html/img/icons/settings_light.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/img/icons/settings_light.png -------------------------------------------------------------------------------- /html/img/icons/settings_light@2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/img/icons/settings_light@2.png -------------------------------------------------------------------------------- /html/img/icons/show.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/img/icons/show.png -------------------------------------------------------------------------------- /html/img/icons/show.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /html/img/icons/show@2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/img/icons/show@2.png -------------------------------------------------------------------------------- /html/img/icons/show_light.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/img/icons/show_light.png -------------------------------------------------------------------------------- /html/img/icons/show_light@2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/img/icons/show_light@2.png -------------------------------------------------------------------------------- /html/img/icons/watch.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /html/img/icons/zoom-in.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /html/img/icons/zoom-out.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /html/img/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/img/logo.png -------------------------------------------------------------------------------- /html/img/providers/cefas.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/img/providers/cefas.png -------------------------------------------------------------------------------- /html/img/providers/dmi.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/img/providers/dmi.png -------------------------------------------------------------------------------- /html/img/providers/hcmr.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/img/providers/hcmr.gif -------------------------------------------------------------------------------- /html/img/providers/metu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/img/providers/metu.png -------------------------------------------------------------------------------- /html/img/providers/ogs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/img/providers/ogs.png -------------------------------------------------------------------------------- /html/img/providers/pml.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/img/providers/pml.png -------------------------------------------------------------------------------- /html/img/s.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/img/s.mp3 -------------------------------------------------------------------------------- /html/img/sign-in-with-google.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/img/sign-in-with-google.png -------------------------------------------------------------------------------- /html/img/sign-in-with-microsoft.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/img/sign-in-with-microsoft.png -------------------------------------------------------------------------------- /html/img/yahoo_signin_btn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/img/yahoo_signin_btn.png -------------------------------------------------------------------------------- /html/js-libs/pikaday/pikaday.jquery.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * Pikaday jQuery plugin. 3 | * 4 | * Copyright © 2013 David Bushell | BSD & MIT license | https://github.com/dbushell/Pikaday 5 | */ 6 | 7 | (function (root, factory) 8 | { 9 | 'use strict'; 10 | 11 | if (typeof exports === 'object') { 12 | // CommonJS module 13 | factory(require('jquery'), require('../pikaday')); 14 | } else if (typeof define === 'function' && define.amd) { 15 | // AMD. Register as an anonymous module. 16 | define(['jquery', 'pikaday'], factory); 17 | } else { 18 | // Browser globals 19 | factory(root.jQuery, root.Pikaday); 20 | } 21 | }(this, function ($, Pikaday) 22 | { 23 | 'use strict'; 24 | 25 | $.fn.pikaday = function() 26 | { 27 | var args = arguments; 28 | 29 | if (!args || !args.length) { 30 | args = [{ }]; 31 | } 32 | 33 | return this.each(function() 34 | { 35 | var self = $(this), 36 | plugin = self.data('pikaday'); 37 | 38 | if (!(plugin instanceof Pikaday)) { 39 | if (typeof args[0] === 'object') { 40 | var options = $.extend({}, args[0]); 41 | options.field = self[0]; 42 | self.data('pikaday', new Pikaday(options)); 43 | } 44 | } else { 45 | if (typeof args[0] === 'string' && typeof plugin[args[0]] === 'function') { 46 | plugin[args[0]].apply(plugin, Array.prototype.slice.call(args,1)); 47 | 48 | if (args[0] === 'destroy') { 49 | self.removeData('pikaday'); 50 | } 51 | } 52 | } 53 | }); 54 | }; 55 | 56 | })); 57 | -------------------------------------------------------------------------------- /html/js-libs/tooltipster/css/plugins/tooltipster/sideTip/themes/tooltipster-sideTip-borderless.min.css: -------------------------------------------------------------------------------- 1 | .tooltipster-sidetip.tooltipster-borderless .tooltipster-box{border:none;background:#1b1b1b;background:rgba(10,10,10,.9)}.tooltipster-sidetip.tooltipster-borderless.tooltipster-bottom .tooltipster-box{margin-top:8px}.tooltipster-sidetip.tooltipster-borderless.tooltipster-left .tooltipster-box{margin-right:8px}.tooltipster-sidetip.tooltipster-borderless.tooltipster-right .tooltipster-box{margin-left:8px}.tooltipster-sidetip.tooltipster-borderless.tooltipster-top .tooltipster-box{margin-bottom:8px}.tooltipster-sidetip.tooltipster-borderless .tooltipster-arrow{height:8px;margin-left:-8px;width:16px}.tooltipster-sidetip.tooltipster-borderless.tooltipster-left .tooltipster-arrow,.tooltipster-sidetip.tooltipster-borderless.tooltipster-right .tooltipster-arrow{height:16px;margin-left:0;margin-top:-8px;width:8px}.tooltipster-sidetip.tooltipster-borderless .tooltipster-arrow-background{display:none}.tooltipster-sidetip.tooltipster-borderless .tooltipster-arrow-border{border:8px solid transparent}.tooltipster-sidetip.tooltipster-borderless.tooltipster-bottom .tooltipster-arrow-border{border-bottom-color:#1b1b1b;border-bottom-color:rgba(10,10,10,.9)}.tooltipster-sidetip.tooltipster-borderless.tooltipster-left .tooltipster-arrow-border{border-left-color:#1b1b1b;border-left-color:rgba(10,10,10,.9)}.tooltipster-sidetip.tooltipster-borderless.tooltipster-right .tooltipster-arrow-border{border-right-color:#1b1b1b;border-right-color:rgba(10,10,10,.9)}.tooltipster-sidetip.tooltipster-borderless.tooltipster-top .tooltipster-arrow-border{border-top-color:#1b1b1b;border-top-color:rgba(10,10,10,.9)}.tooltipster-sidetip.tooltipster-borderless.tooltipster-bottom .tooltipster-arrow-uncropped{top:-8px}.tooltipster-sidetip.tooltipster-borderless.tooltipster-right .tooltipster-arrow-uncropped{left:-8px} -------------------------------------------------------------------------------- /html/js-libs/tooltipster/css/plugins/tooltipster/sideTip/themes/tooltipster-sideTip-light.min.css: -------------------------------------------------------------------------------- 1 | .tooltipster-sidetip.tooltipster-light .tooltipster-box{border-radius:3px;border:1px solid #ccc;background:#ededed}.tooltipster-sidetip.tooltipster-light .tooltipster-content{color:#666}.tooltipster-sidetip.tooltipster-light .tooltipster-arrow{height:9px;margin-left:-9px;width:18px}.tooltipster-sidetip.tooltipster-light.tooltipster-left .tooltipster-arrow,.tooltipster-sidetip.tooltipster-light.tooltipster-right .tooltipster-arrow{height:18px;margin-left:0;margin-top:-9px;width:9px}.tooltipster-sidetip.tooltipster-light .tooltipster-arrow-background{border:9px solid transparent}.tooltipster-sidetip.tooltipster-light.tooltipster-bottom .tooltipster-arrow-background{border-bottom-color:#ededed;top:1px}.tooltipster-sidetip.tooltipster-light.tooltipster-left .tooltipster-arrow-background{border-left-color:#ededed;left:-1px}.tooltipster-sidetip.tooltipster-light.tooltipster-right .tooltipster-arrow-background{border-right-color:#ededed;left:1px}.tooltipster-sidetip.tooltipster-light.tooltipster-top .tooltipster-arrow-background{border-top-color:#ededed;top:-1px}.tooltipster-sidetip.tooltipster-light .tooltipster-arrow-border{border:9px solid transparent}.tooltipster-sidetip.tooltipster-light.tooltipster-bottom .tooltipster-arrow-border{border-bottom-color:#ccc}.tooltipster-sidetip.tooltipster-light.tooltipster-left .tooltipster-arrow-border{border-left-color:#ccc}.tooltipster-sidetip.tooltipster-light.tooltipster-right .tooltipster-arrow-border{border-right-color:#ccc}.tooltipster-sidetip.tooltipster-light.tooltipster-top .tooltipster-arrow-border{border-top-color:#ccc}.tooltipster-sidetip.tooltipster-light.tooltipster-bottom .tooltipster-arrow-uncropped{top:-9px}.tooltipster-sidetip.tooltipster-light.tooltipster-right .tooltipster-arrow-uncropped{left:-9px} -------------------------------------------------------------------------------- /html/js-libs/tooltipster/css/plugins/tooltipster/sideTip/themes/tooltipster-sideTip-noir.min.css: -------------------------------------------------------------------------------- 1 | .tooltipster-sidetip.tooltipster-noir .tooltipster-box{border-radius:0;border:3px solid #000;background:#fff}.tooltipster-sidetip.tooltipster-noir .tooltipster-content{color:#000}.tooltipster-sidetip.tooltipster-noir .tooltipster-arrow{height:11px;margin-left:-11px;width:22px}.tooltipster-sidetip.tooltipster-noir.tooltipster-left .tooltipster-arrow,.tooltipster-sidetip.tooltipster-noir.tooltipster-right .tooltipster-arrow{height:22px;margin-left:0;margin-top:-11px;width:11px}.tooltipster-sidetip.tooltipster-noir .tooltipster-arrow-background{border:11px solid transparent}.tooltipster-sidetip.tooltipster-noir.tooltipster-bottom .tooltipster-arrow-background{border-bottom-color:#fff;top:4px}.tooltipster-sidetip.tooltipster-noir.tooltipster-left .tooltipster-arrow-background{border-left-color:#fff;left:-4px}.tooltipster-sidetip.tooltipster-noir.tooltipster-right .tooltipster-arrow-background{border-right-color:#fff;left:4px}.tooltipster-sidetip.tooltipster-noir.tooltipster-top .tooltipster-arrow-background{border-top-color:#fff;top:-4px}.tooltipster-sidetip.tooltipster-noir .tooltipster-arrow-border{border-width:11px}.tooltipster-sidetip.tooltipster-noir.tooltipster-bottom .tooltipster-arrow-uncropped{top:-11px}.tooltipster-sidetip.tooltipster-noir.tooltipster-right .tooltipster-arrow-uncropped{left:-11px} -------------------------------------------------------------------------------- /html/js-libs/tooltipster/css/plugins/tooltipster/sideTip/themes/tooltipster-sideTip-punk.min.css: -------------------------------------------------------------------------------- 1 | .tooltipster-sidetip.tooltipster-punk .tooltipster-box{border-radius:5px;border:none;border-bottom:3px solid #f71169;background:#2a2a2a}.tooltipster-sidetip.tooltipster-punk.tooltipster-top .tooltipster-box{margin-bottom:7px}.tooltipster-sidetip.tooltipster-punk .tooltipster-content{color:#fff;padding:8px 16px}.tooltipster-sidetip.tooltipster-punk .tooltipster-arrow-background{display:none}.tooltipster-sidetip.tooltipster-punk.tooltipster-bottom .tooltipster-arrow-border{border-bottom-color:#2a2a2a}.tooltipster-sidetip.tooltipster-punk.tooltipster-left .tooltipster-arrow-border{border-left-color:#2a2a2a}.tooltipster-sidetip.tooltipster-punk.tooltipster-right .tooltipster-arrow-border{border-right-color:#2a2a2a}.tooltipster-sidetip.tooltipster-punk.tooltipster-top .tooltipster-arrow-border{border-top-color:#f71169} -------------------------------------------------------------------------------- /html/js-libs/tooltipster/css/plugins/tooltipster/sideTip/themes/tooltipster-sideTip-shadow.min.css: -------------------------------------------------------------------------------- 1 | .tooltipster-sidetip.tooltipster-shadow .tooltipster-box{border:none;border-radius:5px;background:#fff;box-shadow:0 0 10px 6px rgba(0,0,0,.1)}.tooltipster-sidetip.tooltipster-shadow.tooltipster-bottom .tooltipster-box{margin-top:6px}.tooltipster-sidetip.tooltipster-shadow.tooltipster-left .tooltipster-box{margin-right:6px}.tooltipster-sidetip.tooltipster-shadow.tooltipster-right .tooltipster-box{margin-left:6px}.tooltipster-sidetip.tooltipster-shadow.tooltipster-top .tooltipster-box{margin-bottom:6px}.tooltipster-sidetip.tooltipster-shadow .tooltipster-content{color:#8d8d8d}.tooltipster-sidetip.tooltipster-shadow .tooltipster-arrow{height:6px;margin-left:-6px;width:12px}.tooltipster-sidetip.tooltipster-shadow.tooltipster-left .tooltipster-arrow,.tooltipster-sidetip.tooltipster-shadow.tooltipster-right .tooltipster-arrow{height:12px;margin-left:0;margin-top:-6px;width:6px}.tooltipster-sidetip.tooltipster-shadow .tooltipster-arrow-background{display:none}.tooltipster-sidetip.tooltipster-shadow .tooltipster-arrow-border{border:6px solid transparent}.tooltipster-sidetip.tooltipster-shadow.tooltipster-bottom .tooltipster-arrow-border{border-bottom-color:#fff}.tooltipster-sidetip.tooltipster-shadow.tooltipster-left .tooltipster-arrow-border{border-left-color:#fff}.tooltipster-sidetip.tooltipster-shadow.tooltipster-right .tooltipster-arrow-border{border-right-color:#fff}.tooltipster-sidetip.tooltipster-shadow.tooltipster-top .tooltipster-arrow-border{border-top-color:#fff}.tooltipster-sidetip.tooltipster-shadow.tooltipster-bottom .tooltipster-arrow-uncropped{top:-6px}.tooltipster-sidetip.tooltipster-shadow.tooltipster-right .tooltipster-arrow-uncropped{left:-6px} -------------------------------------------------------------------------------- /html/js-libs/tooltipster/css/themes/tooltipster-light.css: -------------------------------------------------------------------------------- 1 | .tooltipster-light { 2 | border-radius: 5px; 3 | border: 1px solid #cccccc; 4 | background: #ededed; 5 | color: #666666; 6 | } 7 | .tooltipster-light .tooltipster-content { 8 | font-family: Arial, sans-serif; 9 | font-size: 14px; 10 | line-height: 16px; 11 | padding: 8px 10px; 12 | } -------------------------------------------------------------------------------- /html/js-libs/tooltipster/css/themes/tooltipster-noir.css: -------------------------------------------------------------------------------- 1 | .tooltipster-noir { 2 | border-radius: 0px; 3 | border: 3px solid #2c2c2c; 4 | background: #fff; 5 | color: #2c2c2c; 6 | } 7 | .tooltipster-noir .tooltipster-content { 8 | font-family: 'Georgia', serif; 9 | font-size: 14px; 10 | line-height: 16px; 11 | padding: 8px 10px; 12 | } -------------------------------------------------------------------------------- /html/js-libs/tooltipster/css/themes/tooltipster-punk.css: -------------------------------------------------------------------------------- 1 | .tooltipster-punk { 2 | border-radius: 5px; 3 | border-bottom: 3px solid #f71169; 4 | background: #2a2a2a; 5 | color: #fff; 6 | } 7 | .tooltipster-punk .tooltipster-content { 8 | font-family: 'Courier', monospace; 9 | font-size: 14px; 10 | line-height: 16px; 11 | padding: 8px 10px; 12 | } -------------------------------------------------------------------------------- /html/js-libs/tooltipster/css/themes/tooltipster-shadow.scss: -------------------------------------------------------------------------------- 1 | .tooltipster-shadow { 2 | border-radius: 5px; 3 | background: #fff; 4 | box-shadow: 0px 0px 14px rgba(0,0,0,0.3); 5 | color: #2c2c2c; 6 | } 7 | .tooltipster-shadow .tooltipster-content { 8 | font-family: 'Arial', sans-serif; 9 | font-size: 14px; 10 | line-height: 16px; 11 | padding: 8px 10px; 12 | } -------------------------------------------------------------------------------- /html/js-libs/tooltipster/demo/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 19 | 20 | 21 | 22 |
23 | Google 24 |
25 | 26 |
27 | 28 |
29 | 30 | 31 | 32 | 33 |
34 | 35 | 36 | -------------------------------------------------------------------------------- /html/js-libs/tooltipster/demo/map.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/js-libs/tooltipster/demo/map.png -------------------------------------------------------------------------------- /html/js-libs/tooltipster/demo/reset.css: -------------------------------------------------------------------------------- 1 | @charset "UTF-8"; 2 | 3 | html, body, div, span, applet, object, iframe, 4 | h1, h2, h3, h4, h5, h6, p, blockquote, pre, 5 | a, abbr, acronym, address, big, cite, code, 6 | del, dfn, em, img, ins, kbd, q, s, samp, 7 | small, strike, strong, sub, sup, tt, var, 8 | b, u, i, center, 9 | dl, dt, dd, ol, ul, li, 10 | fieldset, form, label, legend, 11 | table, caption, tbody, tfoot, thead, tr, th, td, 12 | article, aside, canvas, details, embed, 13 | figure, figcaption, footer, header, hgroup, 14 | menu, nav, output, ruby, section, summary, 15 | time, mark, audio, video { 16 | margin: 0; 17 | padding: 0; 18 | border: 0; 19 | font-size:100%; 20 | vertical-align: baseline; 21 | } 22 | /* HTML5 display-role reset for older browsers */ 23 | article, aside, details, figcaption, figure, 24 | footer, header, hgroup, menu, nav, section { 25 | display: block; 26 | } 27 | body { 28 | line-height: 1; 29 | } 30 | ol, ul { 31 | list-style: none; 32 | } 33 | blockquote, q { 34 | quotes: none; 35 | } 36 | blockquote:before, blockquote:after, 37 | q:before, q:after { 38 | content: ''; 39 | content: none; 40 | } 41 | table { 42 | border-collapse: collapse; 43 | border-spacing: 0; 44 | } 45 | 46 | -------------------------------------------------------------------------------- /html/js-libs/tooltipster/demo/style.css: -------------------------------------------------------------------------------- 1 | /* Main */ 2 | 3 | body { 4 | background-color: #dcdcdc; 5 | color: #0b0b0b; 6 | font-size: 16px; 7 | line-height: 22px; 8 | } 9 | 10 | .container, #container { 11 | width: 978px; 12 | margin: 10px auto; 13 | padding: 60px; 14 | box-shadow: 0px 0px 10px rgba(0,0,0,0.2); 15 | background: #fff; 16 | text-align: left; 17 | display: block; 18 | overflow: hidden; 19 | } 20 | 21 | .item { 22 | width: 200px; 23 | float: left; 24 | padding: 10px; 25 | margin: 10px; 26 | background: #000; 27 | color: #fff; 28 | } -------------------------------------------------------------------------------- /html/js-libs/tooltipster/doc/css/prettify.css: -------------------------------------------------------------------------------- 1 | /* Pretty printing styles. Used with prettify.js. */ 2 | 3 | /* SPAN elements with the classes below are added by prettyprint. */ 4 | .pln { color: #000 } /* plain text */ 5 | 6 | @media screen { 7 | .str { color: #080 } /* string content */ 8 | .kwd { color: #008 } /* a keyword */ 9 | .com { color: #800 } /* a comment */ 10 | .typ { color: #606 } /* a type name */ 11 | .lit { color: #066 } /* a literal value */ 12 | /* punctuation, lisp open bracket, lisp close bracket */ 13 | .pun, .opn, .clo { color: #660 } 14 | .tag { color: #008 } /* a markup tag name */ 15 | .atn { color: #606 } /* a markup attribute name */ 16 | .atv { color: #080 } /* a markup attribute value */ 17 | .dec, .var { color: #606 } /* a declaration; a variable name */ 18 | .fun { color: red } /* a function name */ 19 | } 20 | 21 | /* Use higher contrast and text-weight for printable form. */ 22 | @media print, projection { 23 | .str { color: #060 } 24 | .kwd { color: #006; font-weight: bold } 25 | .com { color: #600; font-style: italic } 26 | .typ { color: #404; font-weight: bold } 27 | .lit { color: #044 } 28 | .pun, .opn, .clo { color: #440 } 29 | .tag { color: #006; font-weight: bold } 30 | .atn { color: #404 } 31 | .atv { color: #060 } 32 | } 33 | 34 | /* Specify class=linenums on a pre to get line numbering */ 35 | ol.linenums { margin-top: 0; margin-bottom: 0 } /* IE indents via margin-left */ 36 | li.L0, 37 | li.L1, 38 | li.L2, 39 | li.L3, 40 | li.L5, 41 | li.L6, 42 | li.L7, 43 | li.L8 { list-style-type: none } 44 | /* Alternate shading for lines */ 45 | li.L1, 46 | li.L3, 47 | li.L5, 48 | li.L7, 49 | li.L9 { background: #eee } 50 | -------------------------------------------------------------------------------- /html/js-libs/tooltipster/doc/css/reset.css: -------------------------------------------------------------------------------- 1 | @charset "UTF-8"; 2 | 3 | html, body, div, span, applet, object, iframe, 4 | h1, h2, h3, h4, h5, h6, p, blockquote, pre, 5 | a, abbr, acronym, address, big, cite, code, 6 | del, dfn, em, img, ins, kbd, q, s, samp, 7 | small, strike, strong, sub, sup, tt, var, 8 | b, u, i, center, 9 | dl, dt, dd, ol, ul, li, 10 | fieldset, form, label, legend, 11 | table, caption, tbody, tfoot, thead, tr, th, td, 12 | article, aside, canvas, details, embed, 13 | figure, figcaption, footer, header, hgroup, 14 | menu, nav, output, ruby, section, summary, 15 | time, mark, audio, video { 16 | margin: 0; 17 | padding: 0; 18 | border: 0; 19 | font-size:100%; 20 | vertical-align: baseline; 21 | } 22 | /* HTML5 display-role reset for older browsers */ 23 | article, aside, details, figcaption, figure, 24 | footer, header, hgroup, menu, nav, section { 25 | display: block; 26 | } 27 | body { 28 | line-height: 1; 29 | } 30 | ol, ul { 31 | list-style: none; 32 | } 33 | blockquote, q { 34 | quotes: none; 35 | } 36 | blockquote:before, blockquote:after, 37 | q:before, q:after { 38 | content: ''; 39 | content: none; 40 | } 41 | table { 42 | border-collapse: collapse; 43 | border-spacing: 0; 44 | } 45 | 46 | -------------------------------------------------------------------------------- /html/js-libs/tooltipster/doc/images/browser-chrome.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/js-libs/tooltipster/doc/images/browser-chrome.png -------------------------------------------------------------------------------- /html/js-libs/tooltipster/doc/images/browser-firefox.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/js-libs/tooltipster/doc/images/browser-firefox.png -------------------------------------------------------------------------------- /html/js-libs/tooltipster/doc/images/browser-ie.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/js-libs/tooltipster/doc/images/browser-ie.png -------------------------------------------------------------------------------- /html/js-libs/tooltipster/doc/images/browser-opera.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/js-libs/tooltipster/doc/images/browser-opera.png -------------------------------------------------------------------------------- /html/js-libs/tooltipster/doc/images/browser-safari.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/js-libs/tooltipster/doc/images/browser-safari.png -------------------------------------------------------------------------------- /html/js-libs/tooltipster/doc/images/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/js-libs/tooltipster/doc/images/favicon.png -------------------------------------------------------------------------------- /html/js-libs/tooltipster/doc/images/icons/icomoon.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/js-libs/tooltipster/doc/images/icons/icomoon.eot -------------------------------------------------------------------------------- /html/js-libs/tooltipster/doc/images/icons/icomoon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | This is a custom SVG font generated by IcoMoon. 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /html/js-libs/tooltipster/doc/images/icons/icomoon.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/js-libs/tooltipster/doc/images/icons/icomoon.ttf -------------------------------------------------------------------------------- /html/js-libs/tooltipster/doc/images/icons/icomoon.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/js-libs/tooltipster/doc/images/icons/icomoon.woff -------------------------------------------------------------------------------- /html/js-libs/tooltipster/doc/images/icons/icomoond41d.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/js-libs/tooltipster/doc/images/icons/icomoond41d.eot -------------------------------------------------------------------------------- /html/js-libs/tooltipster/doc/images/large-background.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/js-libs/tooltipster/doc/images/large-background.jpg -------------------------------------------------------------------------------- /html/js-libs/tooltipster/doc/images/pattern-navy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/js-libs/tooltipster/doc/images/pattern-navy.png -------------------------------------------------------------------------------- /html/js-libs/tooltipster/doc/images/social.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/js-libs/tooltipster/doc/images/social.jpg -------------------------------------------------------------------------------- /html/js-libs/tooltipster/doc/images/spiderman.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/js-libs/tooltipster/doc/images/spiderman.png -------------------------------------------------------------------------------- /html/js-libs/tooltipster/doc/js/jquery.jgfeed.js: -------------------------------------------------------------------------------- 1 | /* 2 | * jGFeed 1.0 - Google Feed API abstraction plugin for jQuery 3 | * 4 | * Copyright (c) 2009 jQuery HowTo 5 | * 6 | * Licensed under the GPL license: 7 | * http://www.gnu.org/licenses/gpl.html 8 | * 9 | * URL: 10 | * http://jquery-howto.blogspot.com 11 | * 12 | * Author URL: 13 | * http://me.boo.uz 14 | * 15 | */ 16 | (function($){ 17 | $.extend({ 18 | jGFeed : function(url, fnk, num, key){ 19 | // Make sure url to get is defined 20 | if(url == null) return false; 21 | // Build Google Feed API URL 22 | var gurl = "http://ajax.googleapis.com/ajax/services/feed/load?v=1.0&callback=?&q="+url+"?"; 23 | if(num != null) gurl += "&num="+num; 24 | if(key != null) gurl += "&key="+key; 25 | // AJAX request the API 26 | $.getJSON(gurl, function(data){ 27 | if(typeof fnk == 'function') 28 | fnk.call(this, data.responseData.feed); 29 | else 30 | return false; 31 | }); 32 | } 33 | }); 34 | })(jQuery); -------------------------------------------------------------------------------- /html/login.js: -------------------------------------------------------------------------------- 1 | let providers = {} 2 | -------------------------------------------------------------------------------- /html/plots/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/html/plots/.gitkeep -------------------------------------------------------------------------------- /html/point_data_template.csv: -------------------------------------------------------------------------------- 1 | Latitude,Longitude,Date,data_point 2 | 22.43134,-69.169922,03/03/2015 12:00,15 3 | -------------------------------------------------------------------------------- /plotting/.gitignore: -------------------------------------------------------------------------------- 1 | *.pyc 2 | -------------------------------------------------------------------------------- /plotting/README.md: -------------------------------------------------------------------------------- 1 | See https://github.com/pmlrsg/GISportal for details 2 | -------------------------------------------------------------------------------- /plotting/data_extractor/.gitignore: -------------------------------------------------------------------------------- 1 | *.pyc 2 | -------------------------------------------------------------------------------- /plotting/data_extractor/README.md: -------------------------------------------------------------------------------- 1 | See https://github.com/pmlrsg/GISportal for details 2 | -------------------------------------------------------------------------------- /plotting/data_extractor/__init__.py: -------------------------------------------------------------------------------- 1 | import os, sys 2 | sys.path.append(os.path.join(os.path.dirname(__file__))) -------------------------------------------------------------------------------- /plotting/data_extractor/analysis_types/__init__.py: -------------------------------------------------------------------------------- 1 | from basic_stats import BasicStats 2 | from transect_stats import TransectStats 3 | from hovmoller_stats import HovmollerStats 4 | from image_stats import ImageStats 5 | from scatter_stats import ScatterStats -------------------------------------------------------------------------------- /plotting/data_extractor/analysis_types/basic_stats.py: -------------------------------------------------------------------------------- 1 | import netCDF4 as netCDF 2 | from extraction_utils import basic 3 | import json 4 | 5 | class BasicStats(object): 6 | """docstring for BasicStats""" 7 | def __init__(self, filename, variable, isLog=False): 8 | super(BasicStats, self).__init__() 9 | self.filename = filename 10 | self.variable = variable 11 | self.isLog = isLog 12 | 13 | 14 | def process(self): 15 | #print "running basic processing on %s" % self.filename 16 | 17 | netcdf_file = netCDF.Dataset(self.filename, "r") 18 | return json.dumps(basic(netcdf_file, self.variable, isLog=self.isLog)) 19 | 20 | 21 | #netcdf_variable = netcdf_file[variable] 22 | 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /plotting/data_extractor/analysis_types/hovmoller_stats.py: -------------------------------------------------------------------------------- 1 | import netCDF4 as netCDF 2 | from extraction_utils import basic, hovmoller 3 | import json 4 | 5 | class HovmollerStats(object): 6 | """docstring for BasicStats""" 7 | def __init__(self, filename, xVariable, yVariable, dataVariable): 8 | super(HovmollerStats, self).__init__() 9 | self.filename = filename 10 | self.xVariable = xVariable 11 | self.yVariable = yVariable 12 | self.dataVariable = dataVariable 13 | 14 | 15 | def process(self): 16 | #print "running basic processing on %s" % self.filename 17 | #print "gettingdata from %s" % self.filename 18 | netcdf_file = netCDF.Dataset(self.filename, "r") 19 | #print netcdf_file.variables[self.dataVariable][:] 20 | return json.dumps(hovmoller(netcdf_file, self.xVariable, self.yVariable, self.dataVariable)) 21 | 22 | 23 | #netcdf_variable = netcdf_file[variable] 24 | 25 | 26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /plotting/data_extractor/analysis_types/scatter_stats.py: -------------------------------------------------------------------------------- 1 | import netCDF4 as netCDF 2 | from extraction_utils import basic_scatter 3 | import json 4 | 5 | class ScatterStats(object): 6 | """docstring for BasicStats""" 7 | def __init__(self, filenames): 8 | super(ScatterStats, self).__init__() 9 | 10 | 11 | self.variable1, self.variable2 = filenames.keys() 12 | self.filename1 = filenames[self.variable1] 13 | self.filename2 = filenames[self.variable2] 14 | 15 | def process(self): 16 | print "running basic processing on %s & %s" % (self.filename1, self.filename2) 17 | 18 | netcdf_file1 = netCDF.Dataset(self.filename1, "r") 19 | netcdf_file2 = netCDF.Dataset(self.filename2, "r") 20 | 21 | return json.dumps(basic_scatter(netcdf_file1, self.variable1, netcdf_file2, self.variable2)) 22 | 23 | 24 | #netcdf_variable = netcdf_file[variable] 25 | 26 | 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /plotting/data_extractor/extraction_utils/__init__.py: -------------------------------------------------------------------------------- 1 | from wcs_extraction import WCSHelper 2 | from wcs_raw_extraction import WCSRawHelper 3 | from analysis_utils import * 4 | from debug import Debug 5 | from transect_utils import * 6 | 7 | -------------------------------------------------------------------------------- /plotting/data_extractor/extraction_utils/debug.py: -------------------------------------------------------------------------------- 1 | class Debug(object): 2 | """docstring for Debug""" 3 | def __init__(self, isOn): 4 | super(Debug, self).__init__() 5 | self.isOn = isOn 6 | 7 | def log(self, message): 8 | if(self.isOn): 9 | print message 10 | -------------------------------------------------------------------------------- /plotting/data_extractor/extraction_utils/scatter_utils.py: -------------------------------------------------------------------------------- 1 | def test_time_axis(filenames): 2 | return "hmmmm" 3 | -------------------------------------------------------------------------------- /plotting/data_extractor/extraction_utils/transect_utils.py: -------------------------------------------------------------------------------- 1 | import csv 2 | import datetime 3 | 4 | 5 | def get_transect_bounds(_csv): 6 | #print _csv 7 | with open(_csv, "rb") as csvfile: 8 | data = csv.DictReader(csvfile, delimiter=',') 9 | lats = [] 10 | lons = [] 11 | for row in data: 12 | lats.append(float(row['Latitude'])) 13 | lons.append(float(row['Longitude'])) 14 | #print (min(lons),min(lats),max(lons),max(lats)) 15 | return (min(lons),min(lats),max(lons),max(lats)) 16 | 17 | 18 | def get_transect_times(_csv): 19 | with open(_csv, "rb") as csvfile: 20 | data = csv.DictReader(csvfile, delimiter=',') 21 | dates = [] 22 | for row in data: 23 | date = row['Date'] 24 | try: 25 | dates.append(datetime.datetime.strptime(date, '%d/%m/%Y %H:%M:%S')) 26 | except ValueError: 27 | try: 28 | dates.append(datetime.datetime.strptime(date, '%d/%m/%Y %H:%M')) 29 | except ValueError: 30 | dates.append(datetime.datetime.strptime(date, "%d/%m/%Y")) 31 | return "%s/%s" % (min(dates), max(dates)) 32 | 33 | def getCsvDict(_csv): 34 | ret = {} 35 | ret['Lat'] = [] 36 | ret['Lon'] = [] 37 | ret['Date'] = [] 38 | with open(_csv, "rb") as csvfile: 39 | data = csv.DictReader(csvfile, delimiter=',') 40 | for row in data: 41 | for key in row: 42 | 43 | ret[key].append(row[key]) 44 | #print ret 45 | return ret -------------------------------------------------------------------------------- /plotting/data_extractor/extraction_utils/wcs_extraction.py: -------------------------------------------------------------------------------- 1 | from owslib.wcs import WebCoverageService 2 | import logging 3 | 4 | class WCSHelper(object): 5 | """docstring for WCSHelper""" 6 | def __init__(self, url, dates, variable, bbox, single=False): 7 | super(WCSHelper, self).__init__() 8 | self.url = url 9 | self.single = single 10 | self.dates = dates 11 | self.variable = variable 12 | self.bbox = bbox 13 | self.owslib_log = logging.getLogger('owslib') 14 | self.owslib_log.setLevel(logging.DEBUG) 15 | self.wcs = WebCoverageService(url, version="1.0.0") 16 | 17 | def __repr__(self): 18 | return str(self.wcs) 19 | 20 | def getData(self): 21 | #print '-'*20 22 | #print self.bbox 23 | #print self.dates 24 | if self.single : 25 | output = self.wcs.getCoverage(identifier=self.variable, time=[self.dates], bbox=self.bbox, format="NetCDF3") 26 | else: 27 | output = self.wcs.getCoverage(identifier=self.variable, time=self.dates, bbox=self.bbox, format="NetCDF3") 28 | return output 29 | 30 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /plotting/data_extractor/extractors/__init__.py: -------------------------------------------------------------------------------- 1 | from extractor import Extractor 2 | from basic_extraction import BasicExtractor 3 | from irregular_extraction import IrregularExtractor 4 | from transect_extraction import TransectExtractor 5 | from single_test_extraction import SingleExtractor 6 | from scatter_extraction import ScatterExtractor -------------------------------------------------------------------------------- /plotting/data_extractor/extractors/basic_extraction.py: -------------------------------------------------------------------------------- 1 | from . import Extractor 2 | from extraction_utils import WCSHelper, WCSRawHelper 3 | import tempfile 4 | import uuid 5 | 6 | class BasicExtractor(Extractor): 7 | """docstring for BasicExtractor""" 8 | def __init__(self, wcs_url, extract_dates, extract_area=None, extract_variable=None, extract_depth=None, outdir="/tmp"): 9 | super(BasicExtractor, self).__init__(wcs_url, extract_dates, extract_area=extract_area, extract_variable=extract_variable, extract_depth=extract_depth, outdir=outdir) 10 | 11 | def getData(self): 12 | wcs_extractor = WCSRawHelper(self.wcs_url, self.extract_dates, self.extract_variable, self.extract_area, self.extract_depth) 13 | data = wcs_extractor.getData() 14 | fname = self.outdir+str(uuid.uuid4())+".nc" 15 | with open(fname, 'w') as outfile: 16 | outfile.write(data.read()) 17 | return fname -------------------------------------------------------------------------------- /plotting/data_extractor/extractors/extractor.py: -------------------------------------------------------------------------------- 1 | from extraction_utils import WCSHelper 2 | import tempfile 3 | import uuid 4 | 5 | 6 | class Extractor(object): 7 | """base Extractor class providing basic functions""" 8 | def __init__(self, wcs_url, extract_dates, extract_area=None, extract_variable=None, extract_depth=None, outdir="/tmp/"): 9 | super(Extractor, self).__init__() 10 | self.wcs_url = wcs_url 11 | self.extract_dates = extract_dates 12 | self.extract_area = extract_area 13 | self.extract_variable = extract_variable 14 | self.extract_depth= extract_depth 15 | self.outdir = outdir 16 | 17 | def __repr__(self): 18 | return "< "+str(self.__class__)+" "+self.wcs_url+" , ["+",".join(self.extract_dates)+"] >" 19 | 20 | 21 | def getData(self): 22 | pass 23 | 24 | def metadataBlock(self): 25 | ret = {} 26 | ret['variable'] = self.extract_variable 27 | ret['extract_dates'] = self.extract_dates 28 | ret['extract_area'] = self.extract_area 29 | ret['wcs_url'] = self.wcs_url 30 | 31 | return ret -------------------------------------------------------------------------------- /plotting/data_extractor/extractors/hovmoller_extraction.py: -------------------------------------------------------------------------------- 1 | from . import Extractor 2 | from ..extraction_utils import WCSHelper 3 | import tempfile 4 | import uuid 5 | 6 | 7 | class HovmollerExtractor(Extractor): 8 | """docstring for HovmollerExtractor""" 9 | def __init__(self, wcs_url, extract_dates,extract_area=None, extract_variable=None , extract_depth=None, outdir="/tmp"): 10 | super(HovmollerExtractor, self).__init__(wcs_url, extract_dates, extract_area=extract_area, extract_variable=extract_variable, extract_depth=extract_depth, outdir=outdir) 11 | 12 | 13 | 14 | def getData(self): 15 | print "="*20 16 | print self.extract_area 17 | wcs_extractor = WCSHelper(self.wcs_url, self.extract_dates, self.extract_variable, self.extract_area, self.depth) 18 | data = wcs_extractor.getData() 19 | fname = self.outdir+str(uuid.uuid4())+".nc" 20 | with open(fname, 'w') as outfile: 21 | outfile.write(data.read()) 22 | return fname -------------------------------------------------------------------------------- /plotting/data_extractor/extractors/irregular_extraction.py: -------------------------------------------------------------------------------- 1 | from extraction_utils import create_mask 2 | from . import Extractor 3 | from extraction_utils import WCSRawHelper, basic 4 | import tempfile 5 | import uuid 6 | from analysis_types import BasicStats 7 | 8 | 9 | class IrregularExtractor(Extractor): 10 | """docstring for IrregularExtractor""" 11 | def __init__(self, wcs_url, extract_dates, extract_area=None, extract_variable=None, extract_depth=None, masking_polygon=None, outdir="/tmp"): 12 | super(IrregularExtractor, self).__init__(wcs_url, extract_dates, extract_area=extract_area, extract_variable=extract_variable,extract_depth=extract_depth, outdir=outdir) 13 | 14 | self.masking_polygon = masking_polygon 15 | 16 | def getData(self, dest=None): 17 | #print self.wcs_url 18 | wcs_extractor = WCSRawHelper(self.wcs_url, self.extract_dates, self.extract_variable, self.extract_area, self.extract_depth) 19 | data = wcs_extractor.getData() 20 | uuid_filename = str(uuid.uuid4())+".nc" 21 | if dest: 22 | fname = dest+uuid_filename 23 | else: 24 | fname = self.outdir+uuid_filename 25 | with open(fname, 'w') as outfile: 26 | outfile.write(data.read()) 27 | mask, data,_,_ = create_mask(self.masking_polygon,fname,self.extract_variable) 28 | #return basic(data, self.extract_variable, filename=fname) 29 | if dest: 30 | return uuid_filename 31 | return fname 32 | 33 | 34 | -------------------------------------------------------------------------------- /plotting/data_extractor/extractors/scatter_extraction.py: -------------------------------------------------------------------------------- 1 | from . import Extractor 2 | from extraction_utils import WCSHelper, WCSRawHelper 3 | import tempfile 4 | import uuid 5 | 6 | 7 | class ScatterExtractor(Extractor): 8 | """docstring for BasicExtractor""" 9 | def __init__(self, wcs_url, wcs_url_2,extract_dates, extract_area=None, extract_variable=None, extract_variable_2=None, extract_depth=None, outdir="/tmp"): 10 | super(ScatterExtractor, self).__init__(wcs_url, extract_dates, extract_area=extract_area, extract_variable=extract_variable, extract_depth=extract_depth, outdir=outdir) 11 | self.second_var = extract_variable_2 12 | self.wcs_url_2 = wcs_url_2 13 | 14 | 15 | def getData(self): 16 | #print "="*20 17 | #print self.extract_area 18 | # print self.wcs_url 19 | # print self.wcs_url_2 20 | wcs_extractor = WCSRawHelper(self.wcs_url, self.extract_dates, self.extract_variable, self.extract_area) 21 | data = wcs_extractor.getData() 22 | fname_one = self.outdir+str(uuid.uuid4())+".nc" 23 | with open(fname_one, 'w') as outfile: 24 | outfile.write(data.read()) 25 | wcs_extractor = WCSRawHelper(self.wcs_url_2, self.extract_dates, self.second_var, self.extract_area) 26 | data = wcs_extractor.getData() 27 | fname_two = self.outdir+str(uuid.uuid4())+".nc" 28 | with open(fname_two, 'w') as outfile: 29 | outfile.write(data.read()) 30 | #print "getting data for %s and %s" % (self.extract_variable, self.second_var) 31 | #print {self.extract_variable :fname_one, self.second_var : fname_two } 32 | return {self.extract_variable :fname_one, self.second_var : fname_two } 33 | # -------------------------------------------------------------------------------- /plotting/data_extractor/extractors/single_test_extraction.py: -------------------------------------------------------------------------------- 1 | from . import Extractor 2 | from extraction_utils import WCSHelper, WCSRawHelper 3 | import tempfile 4 | import uuid 5 | import time 6 | import os 7 | import json 8 | from extraction_utils import sizeof_fmt 9 | 10 | 11 | class SingleExtractor(Extractor): 12 | """docstring for BasicExtractor""" 13 | def __init__(self, wcs_url, extract_dates, extract_area=None, extract_variable=None, extract_depth=None, outdir="/tmp/"): 14 | super(SingleExtractor, self).__init__(wcs_url, extract_dates, extract_area=extract_area, extract_variable=extract_variable, extract_depth=extract_depth, outdir=outdir) 15 | 16 | 17 | 18 | def getData(self): 19 | #print "="*20 20 | #print self.extract_dates 21 | start_time = time.time() 22 | wcs_extractor = WCSRawHelper(self.wcs_url, self.extract_dates, self.extract_variable, self.extract_area, self.extract_depth,single=True) 23 | data = wcs_extractor.getData() 24 | fname = self.outdir+str(uuid.uuid4())+".nc" 25 | with open(fname, 'w') as outfile: 26 | outfile.write(data.read()) 27 | stop_time = time.time() 28 | ret = {} 29 | ret['time_diff'] = stop_time - start_time 30 | ret['file_size'] = os.stat(fname).st_size 31 | return json.dumps(ret) -------------------------------------------------------------------------------- /plotting/data_extractor/tests/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/plotting/data_extractor/tests/__init__.py -------------------------------------------------------------------------------- /plotting/data_extractor/tests/example_track.csv: -------------------------------------------------------------------------------- 1 | Latitude,Longitude,Date 2 | 50.78,-1.13,14/09/2010 20:00 3 | 50.67,-1.03,14/09/2010 20:49 4 | 50.54,-1.02,14/09/2010 22:15 5 | 50.42,-2.46,15/09/2010 03:17 6 | 50.09,-3.77,15/09/2010 09:23 7 | 49.74,-5.24,15/09/2010 16:05 8 | 37.72,-25.66,21/09/2010 00:27 9 | 36.25,-32.76,23/09/2010 07:32 10 | 36.25,-32.76,24/09/2010 19:32 11 | 34.88,-35.78,25/09/2010 04:39 12 | 33.46,-38.68,25/09/2010 23:26 13 | 31.15,-40.92,26/09/2010 19:38 14 | 28.80,-43.18,27/09/2010 16:10 15 | 16.91,-25.02,03/10/2010 09:26 16 | 0.00,-17.75,08/10/2010 12:00 17 | -7.97,-14.42,10/10/2010 21:36 18 | -7.97,-14.42,16/10/2010 21:36 19 | -18.50,-25.10,21/10/2010 00:31 20 | -18.50,-25.10,22/10/2010 00:31 21 | -28.42,-25.00,24/10/2010 15:55 22 | -------------------------------------------------------------------------------- /plotting/plotting/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/plotting/plotting/__init__.py -------------------------------------------------------------------------------- /plotting/plotting/debug.py: -------------------------------------------------------------------------------- 1 | from __future__ import print_function 2 | import sys 3 | 4 | # Set the default logging verbosity to lowest. 5 | verbosity = 0 6 | plot_hash = None 7 | 8 | def debug(level, msg): 9 | if verbosity >= level: 10 | if plot_hash: 11 | print("{}: {}".format(plot_hash[:8], msg), file=sys.stderr) 12 | else: 13 | print(msg, file=sys.stderr) 14 | #END debug 15 | -------------------------------------------------------------------------------- /plotting/plotting/logger.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime, date 2 | import os 3 | import errno 4 | 5 | log_dir = "" 6 | plot_hash = "" 7 | plot_type = "" 8 | 9 | num_points = 0 10 | 11 | def log_complete(successful): 12 | if log_dir: 13 | make_sure_path_exists(log_dir) 14 | _datetime = datetime.now().strftime("%Y-%m-%dT%H:%M:%S") 15 | _date = date.today().strftime("%Y-%m-%d") 16 | if successful: 17 | status = "complete" 18 | else: 19 | status = "failed" 20 | line = ",".join(map(str, [_datetime, plot_hash, plot_type, status, num_points])) + "\n" 21 | with open (log_dir + "/" + _date + ".csv", "a") as f: 22 | f.write(line) 23 | 24 | def make_sure_path_exists(path): 25 | try: 26 | os.makedirs(path) 27 | except OSError as exception: 28 | if exception.errno != errno.EEXIST: 29 | raise 30 | -------------------------------------------------------------------------------- /plotting/testing/data/temperature-format-url.json: -------------------------------------------------------------------------------- 1 | { 2 | "coverages": ["SST"], 3 | "type": "timeseries", 4 | "SST": {"url": 5 | "values":{"Date":[ 6 | "2013-11-16T00:00:00" 7 | ], 8 | "Max": [ 9 | 19.27879524230957 10 | ], 11 | "Mean": [ 12 | 12.045310460974147 13 | ], 14 | "Median": [ 15 | 11.87871265411377 16 | ], 17 | "Min": [ 18 | 4.485976696014403 19 | ], 20 | "Standard Deviation": [ 21 | 3.3710469141333177 22 | ] 23 | } 24 | "scale": "linear", 25 | "units": "(degrees C)" 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /plotting/testing/data/temperature-format.json: -------------------------------------------------------------------------------- 1 | { 2 | "coverages": ["SST"], 3 | "type": "timeseries", 4 | "SST": {"values":{"Date":[ 5 | "2013-11-16T00:00:00" 6 | ], 7 | "Max": [ 8 | 19.27879524230957 9 | ], 10 | "Mean": [ 11 | 12.045310460974147 12 | ], 13 | "Median": [ 14 | 11.87871265411377 15 | ], 16 | "Min": [ 17 | 4.485976696014403 18 | ], 19 | "Standard Deviation": [ 20 | 3.3710469141333177 21 | ] 22 | } 23 | "scale": "linear", 24 | "units": "(degrees C)" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /plotting/testing/data/timeseries-sos.json: -------------------------------------------------------------------------------- 1 | { 2 | "plot": { 3 | "type": "timeseries-sos", 4 | "title": "Penlee Point Air Temperature (test)", 5 | "style": "boxfill/rainbow", 6 | "downloadTypes": [{ 7 | "key": "csv", 8 | "label": "CSV" 9 | }, { 10 | "key": "png", 11 | "label": "PNG" 12 | }, { 13 | "key": "meta-data", 14 | "label": "Meta Data" 15 | }, { 16 | "key": "logos", 17 | "label": "Logos" 18 | }, { 19 | "key": "svg", 20 | "label": "SVG" 21 | }], 22 | "xAxis": { 23 | "scale": "linear", 24 | "label": "Date/Time", 25 | "ticks": "auto", 26 | "weight": "auto", 27 | "tickFormat": "%d/%m/%Y" 28 | }, 29 | "y1Axis": { 30 | "scale": "linear", 31 | "label": "Air Pressure (millibars)", 32 | "ticks": "auto", 33 | "weight": "auto", 34 | "tickFormat": "auto" 35 | }, 36 | "data": { 37 | "series": [{ 38 | "data_source": { 39 | "observed_property": "http://mmisw.org/ont/cf/parameter/air_pressure", 40 | "offering": "PenleeMetData", 41 | "feature": "penlee", 42 | "t_bounds": [ 43 | "2015-01-02T13:50:00.000Z", 44 | "2016-09-08T11:00:00.000Z" 45 | ], 46 | "threddsUrl": "http://10.7.0.36:8080/sensorweb/service" 47 | }, 48 | "label": "1) Penlee Point Air Temperature (deg C)", 49 | "yAxis": 1, 50 | "type": "line", 51 | "meta": "Metadata goes here" 52 | }] 53 | }, 54 | "is_standalone": true 55 | }, 56 | "style": { 57 | "logos": [] 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /plotting/testing/data/transect1.csv: -------------------------------------------------------------------------------- 1 | Latitude,Longitude,Date 2 | 50.78,-1.13,14/09/2010 20:00 3 | 50.67,-1.03,14/09/2010 20:49 4 | 50.54,-1.02,14/09/2010 22:15 5 | 50.42,-2.46,15/09/2010 03:17 6 | 50.09,-3.77,15/09/2010 09:23 7 | 49.74,-5.24,15/09/2010 16:05 8 | 37.72,-25.66,21/09/2010 00:27 9 | 36.25,-32.76,23/09/2010 07:32 10 | 36.25,-32.76,24/09/2010 19:32 11 | 34.88,-35.78,25/09/2010 04:39 12 | 33.46,-38.68,25/09/2010 23:26 13 | 31.15,-40.92,26/09/2010 19:38 14 | 28.80,-43.18,27/09/2010 16:10 15 | 16.91,-25.02,03/10/2010 09:26 16 | 0.00,-17.75,08/10/2010 12:00 17 | -7.97,-14.42,10/10/2010 21:36 18 | -7.97,-14.42,16/10/2010 21:36 19 | -18.50,-25.10,21/10/2010 00:31 20 | -18.50,-25.10,22/10/2010 00:31 21 | -28.42,-25.00,24/10/2010 15:55 22 | -------------------------------------------------------------------------------- /plotting/testing/dataconversion.py: -------------------------------------------------------------------------------- 1 | import json 2 | import numpy as np 3 | import pandas as pd 4 | 5 | # Temp hack to read data from CSV as the JSON is a really bad format 6 | 7 | def convert_timeseries(infile, outfile, scale="linear", units="(degrees C)", coverage="SST"): 8 | 9 | df= pd.read_csv(infile) 10 | 11 | jdata = { 'type': 'timeseries', 12 | 'coverage': coverage, 13 | 'units': units, 14 | 'scale': scale, 15 | 16 | 'Date': df.Date.values.tolist(), 17 | 'Min': df.Min.values.tolist(), 18 | 'Max': df.Max.values.tolist(), 19 | 'Mean': df.Mean.values.tolist(), 20 | 'Median': df.Median.values.tolist(), 21 | 'Standard Deviation': df['Standard Deviation'].values.tolist() 22 | } 23 | 24 | with open(outfile, 'w') as outfile: 25 | json.dump(jdata, outfile) 26 | 27 | outfile.close() 28 | 29 | #END convert_timeseries 30 | 31 | # Convert an old JSON file to the new format 32 | def convert_hovmoller(infile, outfile, scale="linear", units="mgm^-3"): 33 | with open(infile) as json_file: 34 | json_data = json.load(json_file) 35 | 36 | # Flip the data around so it is right way up. 37 | data = np.transpose(json_data['output']['data']) 38 | latlon = np.array(data[1]).astype(np.float).tolist() 39 | values = np.array(data[2]).astype(np.float).tolist() 40 | 41 | jdata = {'type': json_data['type'], 42 | 'coverage': json_data['coverage'], 43 | 'units': units, 44 | 'scale': scale, 45 | 'Date': data[0].tolist(), 46 | 'LatLon': latlon, 47 | 'Value': values 48 | } 49 | 50 | with open(outfile, 'w') as outfile: 51 | json.dump(jdata, outfile) 52 | 53 | json_file.close() 54 | outfile.close() 55 | 56 | #END convert_hovmoller 57 | -------------------------------------------------------------------------------- /src/css/scss/_alerts.scss: -------------------------------------------------------------------------------- 1 | 2 | /** 3 | * Alerts 4 | * Taken from bootstrap 5 | * (no we cant include the whole bootstrap library because it ruins the other CSS) 6 | */ 7 | 8 | 9 | .alert { 10 | padding: 15px; 11 | margin-bottom: 20px; 12 | border: 1px solid transparent; 13 | border-radius: 4px 14 | } 15 | 16 | .alert h4 { 17 | margin-top: 0; 18 | color: inherit 19 | } 20 | 21 | .alert .alert-link { 22 | font-weight: 700 23 | } 24 | 25 | .alert>p,.alert>ul { 26 | margin-bottom: 0 27 | } 28 | 29 | .alert>p+p { 30 | margin-top: 5px 31 | } 32 | 33 | .alert-dismissable,.alert-dismissible { 34 | padding-right: 35px 35 | } 36 | 37 | .alert-dismissable .close,.alert-dismissible .close { 38 | position: relative; 39 | top: -2px; 40 | right: -21px; 41 | color: inherit 42 | } 43 | 44 | .alert-success { 45 | color: #3c763d; 46 | background-color: #dff0d8; 47 | border-color: #d6e9c6 48 | } 49 | 50 | .alert-success hr { 51 | border-top-color: #c9e2b3 52 | } 53 | 54 | .alert-success .alert-link { 55 | color: #2b542c 56 | } 57 | 58 | .alert-info { 59 | color: #31708f; 60 | background-color: #d9edf7; 61 | border-color: #bce8f1 62 | } 63 | 64 | .alert-info hr { 65 | border-top-color: #a6e1ec 66 | } 67 | 68 | .alert-info .alert-link { 69 | color: #245269 70 | } 71 | 72 | .alert-warning { 73 | color: #8a6d3b; 74 | background-color: #fcf8e3; 75 | border-color: #faebcc 76 | } 77 | 78 | .alert-warning hr { 79 | border-top-color: #f7e1b5 80 | } 81 | 82 | .alert-warning .alert-link { 83 | color: #66512c 84 | } 85 | 86 | .alert-danger { 87 | color: #900; 88 | background-color: #f2dede; 89 | border-color: #ebccd1 90 | } 91 | 92 | .alert-danger hr { 93 | border-top-color: #e4b9c0 94 | } 95 | 96 | .alert-danger .alert-link { 97 | color: #843534 98 | } 99 | -------------------------------------------------------------------------------- /src/css/scss/_animation.scss: -------------------------------------------------------------------------------- 1 | 2 | /*------------------------------------*\ 3 | Animation 4 | \*------------------------------------*/ 5 | 6 | @keyframes rotation { 7 | from { transform: rotate(0deg); } 8 | to { transform: rotate(359deg); } 9 | } 10 | 11 | .jiggly:before { 12 | -webkit-animation: jiggle 0.5s infinite; 13 | } 14 | @-moz-keyframes jiggle { 15 | 0% { 16 | -moz-transform: rotate(-10deg); 17 | } 18 | 50% { 19 | -moz-transform: rotate(10deg); 20 | } 21 | } 22 | 23 | @-webkit-keyframes jiggle { 24 | 0% { 25 | -webkit-transform: rotate(-10deg); 26 | } 27 | 50% { 28 | -webkit-transform: rotate(10deg); 29 | } 30 | } -------------------------------------------------------------------------------- /src/css/scss/_colours-blue.scss: -------------------------------------------------------------------------------- 1 | $splash-color : #383A25; 2 | $secondary-background : #627fa7; 3 | $primary-purple : #102161; 4 | $button-primary : rgba(1, 102, 118, 1); 5 | $button-color: #111111; 6 | $panel-headfoot : #274978; 7 | $panel-content-header : #41618E; 8 | $analysis-button: #808080; 9 | $panel-container-background: rgba(239, 237, 241, 0.5); 10 | $selector-text: #556782; 11 | $dev-warning: #900 none repeat scroll 0% 0%; 12 | $slider-body: rgba(1, 102, 118, 0.7); 13 | $slider-handles: rgba(1, 102, 118, 1); 14 | $timeline-base : rgba(1, 102, 118, 0.5); 15 | $timeline-lozenge : #76012c; 16 | $timeline-text : rgba(1, 102, 118, 0.7); 17 | $timeline-stroke : rgba(1, 102, 118, 1); 18 | $icon-underline : white; 19 | $general-border: rgba(0, 60, 69, 0.5); 20 | $start-btn-background: #627fa7; 21 | 22 | $panel-solid-background: #efedf1; 23 | $panel-solid-color: #111111; 24 | $footer-shadow: 0px -1px 5px -2px #000000; 25 | $popup-background: white; 26 | $popup-color: #111111; 27 | $popup-shadow: drop-shadow(0 1px 4px rgba(0, 0, 0, 0.2)); 28 | $popup-arrow: white; 29 | $popup-border: 1px solid #cccccc; 30 | $map-background:#1a1a1a; 31 | $timeline-background: white; 32 | $timeline-color: #111111; 33 | $button-top-actions: #fafafa; -------------------------------------------------------------------------------- /src/css/scss/_colours-marine-eo.scss: -------------------------------------------------------------------------------- 1 | $splash-color : #383A25; 2 | $secondary-background : #3183b3; 3 | $primary-purple : #32273D; 4 | $button-primary : #3183b3; 5 | $button-color: #FFFFFF; 6 | $panel-headfoot : rgba(38,70,83,.8); 7 | $panel-content-header : #59476D; 8 | $analysis-button: #808080; 9 | $panel-container-background: rgba(38, 70, 83, 0.8); 10 | $selector-text: #8a7b9b; 11 | $dev-warning: #900 none repeat scroll 0% 0%; 12 | $slider-body: #D8D3DD; 13 | $slider-handles: #B1A7BC; 14 | $timeline-base: #D8D3DD; 15 | $timeline-lozenge:#3183b3; 16 | $timeline-text:#B1A7BC; 17 | $timeline-stroke:#59476D; 18 | $general-border: #D8D3DD; 19 | $start-btn-background: #3183b3; 20 | 21 | $panel-solid-background: transparent; 22 | $panel-solid-color: #efedf1; 23 | $footer-shadow: none; 24 | $popup-background: rgba(38, 70, 83, 0.8); 25 | $popup-color: white; 26 | $popup-shadow: 0 11px 15px -7px rgba(0,0,0,.2),0 24px 38px 3px rgba(0,0,0,.14),0 9px 46px 8px rgba(0,0,0,.12); 27 | $popup-arrow: rgba(38, 70, 83, 0.8); 28 | $popup-border: none; 29 | $map-background: rgba(38, 70, 83, 0.8); 30 | $timeline-background: #34515c; 31 | $timeline-color: white; 32 | $button-top-actions: #fafafa; -------------------------------------------------------------------------------- /src/css/scss/_colours-modellers.scss: -------------------------------------------------------------------------------- 1 | $splash-color : #383A25; 2 | $secondary-background : #627fa7; 3 | $primary-purple : #203c63; 4 | $button-primary : rgba(1, 102, 118, 1); 5 | $button-color: #111111; 6 | $panel-headfoot : #274978; 7 | $panel-content-header : #41618E; 8 | $analysis-button: #808080; 9 | $panel-container-background: rgba(239, 237, 241, 0.5); 10 | $selector-text: #8a7b9b; 11 | $dev-warning: #900 none repeat scroll 0% 0%; 12 | $slider-body: rgba(1, 102, 118, 0.7); 13 | $slider-handles: rgba(1, 102, 118, 1); 14 | $timeline-base : #91A9C9; 15 | $timeline-lozenge : #102161; 16 | $timeline-text : black; 17 | $timeline-stroke : rgba(1, 102, 118, 1); 18 | $icon-underline : white; 19 | $general-border: rgba(0, 60, 69, 0.5); 20 | $start-btn-background: #627fa7; 21 | 22 | $panel-solid-background: #efedf1; 23 | $panel-solid-color: #111111; 24 | $footer-shadow: 0px -1px 5px -2px #000000; 25 | $popup-background: white; 26 | $popup-color: #111111; 27 | $popup-shadow: drop-shadow(0 1px 4px rgba(0, 0, 0, 0.2)); 28 | $popup-arrow: white; 29 | $popup-border: 1px solid #cccccc; 30 | $map-background:#1a1a1a; 31 | $timeline-background: white; 32 | $timeline-color: #111111; 33 | $button-top-actions: #fafafa; -------------------------------------------------------------------------------- /src/css/scss/_colours-petrel.scss: -------------------------------------------------------------------------------- 1 | $splash-color : #383A25; 2 | $secondary-background : #6f8a91; 3 | $primary-purple : #2c353b; 4 | $button-primary : #F75C03; 5 | $button-color: #111111; 6 | $panel-headfoot : #2c353b; 7 | $panel-content-header : #53676c; 8 | $analysis-button: #B80C09; 9 | $panel-container-background: rgba(239, 237, 241, 0.5); 10 | $selector-text: #2f2f2f; 11 | $dev-warning: #900 none repeat scroll 0% 0%; 12 | $slider-body: #93a7ac; 13 | $slider-handles: #6e888f; 14 | $timeline-base: #c4d0d2; 15 | $timeline-lozenge:#F75C03; 16 | $timeline-text:#93a7ac; 17 | $timeline-stroke:#53676c; 18 | $general-border: #c9d4d7; 19 | $start-btn-background: #F75C03; 20 | 21 | $panel-solid-background: #f5f5f5; 22 | $panel-solid-color: #111111; 23 | $footer-shadow: 0px -1px 5px -2px #000000; 24 | $popup-background: white; 25 | $popup-color: #111111; 26 | $popup-shadow: drop-shadow(0 1px 4px rgba(0, 0, 0, 0.2)); 27 | $popup-arrow: white; 28 | $popup-border: 1px solid #cccccc; 29 | $map-background:#1a1a1a; 30 | $timeline-background: white; 31 | $timeline-color: #111111; 32 | $button-top-actions: #fafafa; -------------------------------------------------------------------------------- /src/css/scss/_colours.scss: -------------------------------------------------------------------------------- 1 | $splash-color : #383A25; 2 | $secondary-background : #B1A7BC; 3 | $primary-purple : #32273D; 4 | $button-primary : #A19D63; 5 | $button-color: #111111; 6 | $panel-headfoot : #32253F; 7 | $panel-content-header : #59476D; 8 | $analysis-button: #808080; 9 | $panel-container-background: rgba(239, 237, 241, 0.5); 10 | $selector-text: #8a7b9b; 11 | $dev-warning: #900 none repeat scroll 0% 0%; 12 | $slider-body: #D8D3DD; 13 | $slider-handles: #B1A7BC; 14 | $timeline-base: #D8D3DD; 15 | $timeline-lozenge:#A19D63; 16 | $timeline-text:#B1A7BC; 17 | $timeline-stroke:#59476D; 18 | $general-border: #D8D3DD; 19 | $start-btn-background: #A19D63; 20 | 21 | $panel-solid-background: #efedf1; 22 | $panel-solid-color: #111111; 23 | $footer-shadow: 0px -1px 5px -2px #000000; 24 | $popup-background: white; 25 | $popup-color: #111111; 26 | $popup-shadow: drop-shadow(0 1px 4px rgba(0, 0, 0, 0.2)); 27 | $popup-arrow: white; 28 | $popup-border: 1px solid #cccccc; 29 | $map-background:#1a1a1a; 30 | $timeline-background: white; 31 | $timeline-color: #111111; 32 | $button-top-actions: #fafafa; -------------------------------------------------------------------------------- /src/css/scss/_edit-groups.scss: -------------------------------------------------------------------------------- 1 | div.js-edit-groups-html { 2 | width: 1250px; 3 | max-width:90%; 4 | max-height:90%; 5 | overflow:auto; 6 | 7 | table { 8 | width: 100%; 9 | 10 | .icon-btn { 11 | color: black; 12 | } 13 | } 14 | 15 | .js-create-group-btn { 16 | margin-top: 5px; 17 | margin-bottom: 5px; 18 | } 19 | } 20 | 21 | textarea.edit-group-members { 22 | min-height: 100px; 23 | min-width: 100%; 24 | max-width: 100%; 25 | } -------------------------------------------------------------------------------- /src/css/scss/_export.scss: -------------------------------------------------------------------------------- 1 | /*------------------------------------*\ 2 | Export 3 | \*------------------------------------*/ 4 | 5 | /* Ugh, way too over specified */ 6 | .js-tab-analysis .grid-list.panel-list li.export-button { 7 | align-items: center; 8 | padding: 9px; 9 | } 10 | 11 | .export { 12 | background-color: rgba(0,0,0,0.8); 13 | } 14 | 15 | .export-container { 16 | background-color: $primary-purple; 17 | color: #f7f6f8; 18 | padding: 25px; 19 | } 20 | 21 | .export li { 22 | padding-bottom: 5px; 23 | } 24 | 25 | .export a { 26 | color: #fff; 27 | } 28 | 29 | .export .text-button { 30 | color: #fff; 31 | float: right; 32 | } 33 | -------------------------------------------------------------------------------- /src/css/scss/_fonts.scss: -------------------------------------------------------------------------------- 1 | /*------------------------------------*\ 2 | Fonts 3 | This is where font faces are defined. 4 | You may be looking for type.css 5 | \*------------------------------------*/ 6 | 7 | @font-face { 8 | font-family: 'Open Sans'; 9 | src: url("../fonts/OpenSans-Regular-webfont.eot"); 10 | src: url("../fonts/OpenSans-Regular-webfont?#iefix") format("embedded-opentype"), url("../fonts/OpenSans-Regular-webfont.woff") format("woff"), url("../fonts/OpenSans-Regular-webfont.ttf") format("truetype"), url("../fonts/OpenSans-Regular-webfont.svg#OpenSans") format("svg"); 11 | font-weight: 400; 12 | font-style: normal; 13 | } 14 | 15 | @font-face { 16 | font-family: 'Open Sans'; 17 | src: url("../fonts/OpenSans-Light-webfont.eot"); 18 | src: url("../fonts/OpenSans-Light-webfont?#iefix") format("embedded-opentype"), url("../fonts/OpenSans-Light-webfont.woff") format("woff"), url("../fonts/OpenSans-Light-webfont.ttf") format("truetype"), url("../fonts/OpenSans-Light-webfont.svg#OpenSans") format("svg"); 19 | font-weight: 300; 20 | font-style: normal; 21 | } 22 | 23 | @font-face { 24 | font-family: 'Open Sans'; 25 | src: url("../fonts/opensans-semibold-webfont.eot"); 26 | src: url("../fonts/opensans-semibold-webfont?#iefix") format("embedded-opentype"), url("../fonts/opensans-semibold-webfont.woff") format("woff"), url("../fonts/opensans-semibold-webfont.ttf") format("truetype"), url("../fonts/opensans-semibold-webfont.svg#pensans") format("svg"); 27 | font-weight: 600; 28 | font-style: normal; 29 | } 30 | -------------------------------------------------------------------------------- /src/css/scss/_grid.scss: -------------------------------------------------------------------------------- 1 | /*------------------------------------*\ 2 | Grid 3 | \*------------------------------------*/ 4 | 5 | .grid-list.panel-list li, 6 | .grid 7 | { 8 | display: flex; 9 | align-items: center; 10 | flex-flow: row wrap; 11 | min-height: 40px; 12 | } 13 | 14 | .js-tab-analysis .grid-list.panel-list li { 15 | align-items: flex-start; 16 | border-bottom: 1px solid #e0dce4; 17 | } 18 | 19 | .grid-list.panel-list li { 20 | flex-flow: row; 21 | } 22 | 23 | 24 | .grid-cell { 25 | margin-right: 1%; 26 | line-height: 1.5; 27 | align-items: center; 28 | word-wrap: break-word; 29 | } 30 | 31 | .icon-column { 32 | width: 40px; 33 | } 34 | 35 | /* 36 | .grid-cell:first-child { 37 | margin-left: 15px; 38 | } 39 | .grid-cell:last-child { 40 | margin-right: 15px; 41 | } 42 | */ 43 | 44 | .grid-cell.fill { 45 | flex: 1; 46 | flex-basis: 100%; 47 | -ms-flex-preferred-size: 0px; 48 | margin-bottom: 10px; 49 | } 50 | 51 | @media only screen and (min-width : 1270px) { 52 | .grid-list.panel-list li, 53 | .grid { 54 | flex-flow: initial; 55 | } 56 | 57 | .reorder-before { 58 | margin-right: 15px; 59 | order: -1; 60 | } 61 | 62 | .fill { 63 | flex-basis: initial; 64 | marign: 0; 65 | } 66 | } 67 | 68 | -------------------------------------------------------------------------------- /src/css/scss/_history.scss: -------------------------------------------------------------------------------- 1 | /*------------------------------------*\ 2 | History Panel 3 | \*------------------------------------*/ 4 | 5 | 6 | #historyPanel .graphJob { 7 | 8 | background: white; 9 | border-style: none; 10 | border: 1px solid $general-border; 11 | border-radius: 0; 12 | color: $selector-text; 13 | display: block; 14 | text-align: left; 15 | text-indent: 1px; 16 | text-overflow: ''; 17 | line-height: 33px; 18 | padding-left: 10px; 19 | text-transform: capitalize; 20 | margin-top: 9px; 21 | width: 100%; 22 | } 23 | 24 | .saved, .not-saved, .loading-image{ 25 | width: 16px; 26 | height: 16px; 27 | display: inline-block; 28 | } 29 | 30 | .saved:before, .not-saved:before{ 31 | content: "\e09d"; 32 | cursor: pointer; 33 | } 34 | 35 | .not-saved{ 36 | font-family: "streamline-24px" !important; 37 | } 38 | .saved, not-saved:hover{ 39 | font-family: "streamline-24px-filled-in" !important; 40 | } -------------------------------------------------------------------------------- /src/css/scss/_metadata-panel.scss: -------------------------------------------------------------------------------- 1 | .metadata-slideout p { 2 | padding:10px; 3 | } 4 | .metadata-slideout strong { 5 | display:block; 6 | font-weight: bold !important; 7 | 8 | } 9 | 10 | .metadata-box { 11 | background:#fbfafb; 12 | margin-top:15px; 13 | } 14 | -------------------------------------------------------------------------------- /src/css/scss/_reset.scss: -------------------------------------------------------------------------------- 1 | /* http://meyerweb.com/eric/tools/css/reset/ 2 | v2.0 | 20110126 3 | License: none (public domain) 4 | */ 5 | 6 | html, body, div, span, applet, object, iframe, 7 | h1, h2, h3, h4, h5, h6, p, blockquote, pre, 8 | a, abbr, acronym, address, big, cite, code, 9 | del, dfn, em, img, ins, kbd, q, s, samp, 10 | small, strike, strong, sub, tt, var, 11 | b, u, center, 12 | dl, dt, dd, ol, ul, li, 13 | fieldset, form, label, legend, 14 | table, caption, tbody, tfoot, thead, tr, th, td, 15 | article, aside, canvas, details, embed, 16 | figure, figcaption, footer, header, hgroup, 17 | menu, nav, output, ruby, section, summary, 18 | time, mark, audio, video { 19 | margin: 0; 20 | padding: 0; 21 | border: 0; 22 | font-size: inherit; 23 | font: inherit; 24 | vertical-align: baseline; 25 | font-weight: inherit !important; 26 | } 27 | /* HTML5 display-role reset for older browsers */ 28 | article, aside, details, figcaption, figure, 29 | footer, header, hgroup, menu, nav, section { 30 | display: block; 31 | } 32 | body { 33 | height: 100%; 34 | width: 100%; 35 | overflow: hidden; 36 | position: fixed; 37 | line-height: 1; 38 | } 39 | ol, ul { 40 | list-style: none; 41 | } 42 | blockquote, q { 43 | quotes: none; 44 | } 45 | blockquote:before, blockquote:after, 46 | q:before, q:after { 47 | content: ''; 48 | content: none; 49 | } 50 | table { 51 | border-collapse: collapse; 52 | border-spacing: 0; 53 | } 54 | b, 55 | strong{ 56 | font-weight:bold !important; 57 | } -------------------------------------------------------------------------------- /src/css/scss/_share.scss: -------------------------------------------------------------------------------- 1 | /*------------------------------------*\ 2 | Share 3 | \*------------------------------------*/ 4 | 5 | .share-map-button { 6 | background: #fff; 7 | border-top: 1px solid #e0dce4; 8 | padding: 9px; 9 | 10 | display: flex; 11 | align-items: center; 12 | } 13 | 14 | .share-map-button label, 15 | .export-button label { 16 | flex: 1; 17 | } 18 | 19 | .share { 20 | 21 | } 22 | 23 | /*.share-container { 24 | background-color: $primary-purple; 25 | color: #f7f6f8; 26 | padding: 25px; 27 | } 28 | 29 | .share-container .js-close-share { 30 | color: #f7f6f8; 31 | float: right; 32 | } 33 | */ 34 | .js-shareurl { 35 | padding: 5px; 36 | margin-top: 5px; 37 | width: 100%; 38 | } 39 | 40 | #share-map { 41 | cursor: pointer; 42 | } 43 | 44 | #share-map span{ 45 | position: relative; 46 | top: 3px; 47 | font-size: 16px; 48 | } -------------------------------------------------------------------------------- /src/css/scss/_start.scss: -------------------------------------------------------------------------------- 1 | /*------------------------------------*\ 2 | Start Page 3 | \*------------------------------------*/ 4 | 5 | .start { 6 | background-repeat: no-repeat; 7 | background-position: center center; 8 | background-size: cover; 9 | z-index: 1000; 10 | overflow-y: auto; 11 | } 12 | .start-dev { 13 | background-color: $splash-color; 14 | } 15 | 16 | .start-container { 17 | background: $primary-purple; 18 | color: #f7f6f8; 19 | padding: 0px; 20 | } 21 | 22 | .intro-text { 23 | padding: 25px; 24 | padding-bottom: 10px; 25 | } 26 | 27 | .intro-text p { 28 | padding-bottom: 10px; 29 | } 30 | 31 | .intro-text a{ 32 | color: white; 33 | } 34 | 35 | .start-nav { 36 | background: $primary-purple; 37 | padding: 20px 15px; 38 | text-align: right; 39 | } 40 | 41 | .homepageSlider{ 42 | width: 100%; 43 | height: 400px; 44 | position: relative; 45 | overflow: hidden; 46 | } 47 | 48 | .homepageSlider-wrap{ 49 | position: relative; 50 | height: 100%; 51 | width: 100%; 52 | } 53 | 54 | .homepageSlider-wrap div{ 55 | height: 100%; 56 | width: 100%; 57 | background-size: cover; 58 | background-position: center center; 59 | float:left; 60 | position: relative; 61 | } 62 | 63 | .browse-not-compatible{ 64 | display: none; 65 | z-index: 1000; 66 | 67 | position: absolute; 68 | top: 50%; 69 | left: 50%; 70 | 71 | margin-left: -200px; 72 | margin-top: -84px; 73 | 74 | height: 168px; 75 | width: 400px; 76 | 77 | color: white; 78 | padding: 26px 15px; 79 | background: $primary-purple; 80 | } 81 | .browse-not-compatible h3{ 82 | text-align: center; 83 | font-size: 30px; 84 | } 85 | -------------------------------------------------------------------------------- /src/css/scss/_tables.scss: -------------------------------------------------------------------------------- 1 | /*------------------------------------*\ 2 | Tables 3 | \*------------------------------------*/ 4 | table { 5 | padding-top: 20px; 6 | padding-bottom: 20px; 7 | } 8 | 9 | tr { 10 | border-bottom: 1px solid #e0dce4; 11 | } 12 | 13 | tr:first-child { 14 | border-top: 1px solid #e0dce4; 15 | } 16 | 17 | table.stripe tr:nth-child(even) { 18 | background-color: #fbfafb; 19 | } 20 | 21 | td { 22 | /*height: 40px; if tables are broken this is why*/ 23 | /*line-height: 1.5; 24 | padding-left: 15px; 25 | vertical-align: middle;*/ 26 | /* user-select: initial;*/ 27 | } 28 | 29 | table.layers-form-table{ 30 | border-collapse: separate; 31 | } 32 | 33 | table.layers-form-table td{ 34 | padding: 5px; 35 | white-space:nowrap 36 | } 37 | 38 | table.layers-form-table th{ 39 | font-weight: bold; 40 | } -------------------------------------------------------------------------------- /src/css/scss/_type.scss: -------------------------------------------------------------------------------- 1 | /*------------------------------------*\ 2 | Type 3 | This is where the type styles are 4 | defined. You may be looking for 5 | fonts.css 6 | \*------------------------------------*/ 7 | 8 | body { 9 | font-family: 'Open Sans', sans-serif; 10 | font-size: 13px; 11 | font-size: 0.8125rem; /* 13/16 = 0.8125 */ 12 | line-height: 1.5; 13 | } 14 | 15 | h3 { 16 | font-size: 15px; 17 | font-size: 0.9375rem; /* 15/16=0.9275 */ 18 | font-weight: 600; 19 | } 20 | 21 | h4 { 22 | font-size: 14px; 23 | font-size: 0.875rem; /* 14/16=0.875 */ 24 | font-weight: 600; 25 | } 26 | 27 | .bold { font-weight: 600; } 28 | 29 | /* Start Screen */ 30 | 31 | .intro-text, 32 | .share-container h2, 33 | .overlay-container h2, 34 | .export-container h2 { 35 | color: #f7f6f8; 36 | font-size: 20px; 37 | font-size: 1.25rem; /* 24/16 = 1.5 */ 38 | font-weight: 300; 39 | } 40 | 41 | .examples a { 42 | color: #f7f6f8; 43 | } 44 | 45 | /* Buttons */ 46 | 47 | .brand { 48 | /* Font was falling back to Arial, not sure why 49 | so for now explicitly making Open Sans */ 50 | font-family: 'Open Sans', sans-serif; 51 | font-size: 14px; 52 | font-size: 0.875rem; /* 18/16 = 1.125 */ 53 | font-weight: 600; 54 | text-decoration: none; 55 | } 56 | 57 | /* Panel */ 58 | 59 | .panel-tab-name { 60 | color: $selector-text; 61 | font-size: 13px; 62 | font-size: 0.8125rem; /* 13/16=0.8125 */ 63 | font-weight: 600; 64 | text-align: center; 65 | } 66 | 67 | .number { 68 | font-size: 24px; 69 | font-size: 1.5rem; 70 | text-align: center; 71 | } 72 | 73 | .bbox-info dt { 74 | color: #545454; 75 | } 76 | -------------------------------------------------------------------------------- /src/css/scss/_user.scss: -------------------------------------------------------------------------------- 1 | 2 | .userHolder {padding-bottom: 20px;} 3 | .userHolder p {margin: 7px 0px;} 4 | 5 | .userHolder .name { 6 | font-weight: bold; 7 | } 8 | .userHolder .email { 9 | font-style: italic; 10 | } 11 | .userHolder .logout { 12 | text-align: right; 13 | margin-top: 10px; 14 | } 15 | 16 | .userHolder .avatar { 17 | width: 75px; 18 | height: auto; 19 | border-radius: 50%; 20 | float: left; 21 | margin-right: 10px; 22 | } 23 | 24 | .userHolder ul li { 25 | list-style: square inside; 26 | margin-left: 8px; 27 | } 28 | 29 | body.login { 30 | background: #efedf1; 31 | text-align: center; 32 | } 33 | 34 | .userLogin { 35 | width: 500px; 36 | text-align: left; 37 | border: 1px solid #ccc; 38 | background: #fff; 39 | margin: 40px auto; 40 | padding: 20px; 41 | border-radius: 7px; 42 | } 43 | 44 | .loginButton-google { 45 | width: 200px; 46 | cursor: pointer; 47 | height: auto; 48 | padding-top: 10px 49 | } 50 | 51 | .loginButton-saml { 52 | width: 197px; 53 | height: auto; 54 | cursor: pointer; 55 | padding: 10px 0 0 3px; 56 | } 57 | 58 | .error { 59 | color: #842029; 60 | background-color: #f8d7da; 61 | border-color: #f5c2c7; 62 | position: relative; 63 | padding: 1rem 1rem; 64 | margin-bottom: 1rem; 65 | border: 1px solid transparent; 66 | border-radius: .25rem; 67 | } -------------------------------------------------------------------------------- /src/css/scss/_vector.scss: -------------------------------------------------------------------------------- 1 | .legend-colour-block { 2 | width: 40px; 3 | height: 40px; 4 | } 5 | 6 | .legend-table td:first-child{ 7 | padding-right:25px; 8 | } -------------------------------------------------------------------------------- /src/css/scss/gisportal-marine-eo.scss: -------------------------------------------------------------------------------- 1 | @import "_colours-marine-eo.scss"; 2 | @import "_alerts.scss"; 3 | @import "_animation.scss"; 4 | @import "_export.scss"; 5 | @import "_fonts.scss"; 6 | @import "_main.scss"; 7 | @import "_plot.scss"; 8 | @import "_grid.scss"; 9 | @import "_history.scss"; 10 | @import "_icons.scss"; 11 | @import "_jquery.nouislider.scss"; 12 | @import "_indicators.scss"; 13 | @import "_compare.scss"; 14 | 15 | @import "_mapcontrols.scss"; 16 | @import "_metadata-panel.scss"; 17 | @import "_nv.d3.scss"; 18 | @import "_overlay.scss"; 19 | @import "_panel.scss"; 20 | @import "_panel-slideout.scss"; 21 | @import "_add-layers-form.scss"; 22 | @import "_edit-groups.scss"; 23 | @import "_popup.scss"; 24 | @import "_reset.scss"; 25 | @import "_scalebar.scss"; 26 | @import "_share.scss"; 27 | @import "_start.scss"; 28 | @import "_streamline.scss"; 29 | @import "_streamline-filled-in.scss"; 30 | @import "_tables.scss"; 31 | @import "_timeline.scss"; 32 | @import "_type.scss"; 33 | @import "_walkthrough.scss"; 34 | @import "_vector.scss"; 35 | 36 | @import "_collaboration.scss"; 37 | @import "_notify.scss"; 38 | @import "_user.scss"; 39 | 40 | 41 | @import "../../../html/js-libs/tooltipster/css/tooltipster.scss"; 42 | @import "../../../html/js-libs/tooltipster/css/themes/tooltipster-shadow.scss"; 43 | 44 | -------------------------------------------------------------------------------- /src/css/scss/gisportal.scss: -------------------------------------------------------------------------------- 1 | @import "_colours.scss"; 2 | @import "_alerts.scss"; 3 | @import "_animation.scss"; 4 | @import "_export.scss"; 5 | @import "_fonts.scss"; 6 | @import "_main.scss"; 7 | @import "_plot.scss"; 8 | @import "_grid.scss"; 9 | @import "_history.scss"; 10 | @import "_icons.scss"; 11 | @import "_jquery.nouislider.scss"; 12 | @import "_indicators.scss"; 13 | @import "_compare.scss"; 14 | 15 | @import "_mapcontrols.scss"; 16 | @import "_metadata-panel.scss"; 17 | @import "_nv.d3.scss"; 18 | @import "_overlay.scss"; 19 | @import "_panel.scss"; 20 | @import "_panel-slideout.scss"; 21 | @import "_add-layers-form.scss"; 22 | @import "_edit-groups.scss"; 23 | @import "_popup.scss"; 24 | @import "_reset.scss"; 25 | @import "_scalebar.scss"; 26 | @import "_share.scss"; 27 | @import "_start.scss"; 28 | @import "_streamline.scss"; 29 | @import "_streamline-filled-in.scss"; 30 | @import "_tables.scss"; 31 | @import "_timeline.scss"; 32 | @import "_type.scss"; 33 | @import "_walkthrough.scss"; 34 | @import "_vector.scss"; 35 | 36 | @import "_collaboration.scss"; 37 | @import "_notify.scss"; 38 | @import "_user.scss"; 39 | 40 | 41 | @import "../../../html/js-libs/tooltipster/css/tooltipster.scss"; 42 | @import "../../../html/js-libs/tooltipster/css/themes/tooltipster-shadow.scss"; 43 | 44 | -------------------------------------------------------------------------------- /src/css/scss/gisportal_blue.scss: -------------------------------------------------------------------------------- 1 | @import "_colours-blue.scss"; 2 | @import "_alerts.scss"; 3 | @import "_animation.scss"; 4 | @import "_export.scss"; 5 | @import "_fonts.scss"; 6 | @import "_main.scss"; 7 | @import "_plot.scss"; 8 | @import "_grid.scss"; 9 | @import "_history.scss"; 10 | @import "_icons.scss"; 11 | @import "_jquery.nouislider.scss"; 12 | @import "_indicators.scss"; 13 | @import "_compare.scss"; 14 | 15 | @import "_mapcontrols.scss"; 16 | @import "_metadata-panel.scss"; 17 | @import "_nv.d3.scss"; 18 | @import "_overlay.scss"; 19 | @import "_panel.scss"; 20 | @import "_panel-slideout.scss"; 21 | @import "_add-layers-form.scss"; 22 | @import "_popup.scss"; 23 | @import "_reset.scss"; 24 | @import "_scalebar.scss"; 25 | @import "_share.scss"; 26 | @import "_start.scss"; 27 | @import "_streamline.scss"; 28 | @import "_streamline-filled-in.scss"; 29 | @import "_tables.scss"; 30 | @import "_timeline.scss"; 31 | @import "_type.scss"; 32 | @import "_walkthrough.scss"; 33 | @import "_vector.scss"; 34 | 35 | @import "_collaboration.scss"; 36 | @import "_notify.scss"; 37 | @import "_user.scss"; 38 | 39 | 40 | @import "../../../html/js-libs/tooltipster/css/tooltipster.scss"; 41 | @import "../../../html/js-libs/tooltipster/css/themes/tooltipster-shadow.scss"; 42 | -------------------------------------------------------------------------------- /src/css/scss/gisportal_modellers.scss: -------------------------------------------------------------------------------- 1 | @import "_colours-modellers.scss"; 2 | @import "_alerts.scss"; 3 | @import "_animation.scss"; 4 | @import "_export.scss"; 5 | @import "_fonts.scss"; 6 | @import "_main.scss"; 7 | @import "_plot.scss"; 8 | @import "_grid.scss"; 9 | @import "_history.scss"; 10 | @import "_icons.scss"; 11 | @import "_jquery.nouislider.scss"; 12 | @import "_indicators.scss"; 13 | @import "_compare.scss"; 14 | 15 | @import "_mapcontrols.scss"; 16 | @import "_metadata-panel.scss"; 17 | @import "_nv.d3.scss"; 18 | @import "_overlay.scss"; 19 | @import "_panel.scss"; 20 | @import "_panel-slideout.scss"; 21 | @import "_add-layers-form.scss"; 22 | @import "_popup.scss"; 23 | @import "_reset.scss"; 24 | @import "_scalebar.scss"; 25 | @import "_share.scss"; 26 | @import "_start.scss"; 27 | @import "_streamline.scss"; 28 | @import "_streamline-filled-in.scss"; 29 | @import "_tables.scss"; 30 | @import "_timeline.scss"; 31 | @import "_type.scss"; 32 | @import "_walkthrough.scss"; 33 | @import "_vector.scss"; 34 | 35 | @import "_collaboration.scss"; 36 | @import "_notify.scss"; 37 | @import "_user.scss"; 38 | 39 | 40 | @import "../../../html/js-libs/tooltipster/css/tooltipster.scss"; 41 | @import "../../../html/js-libs/tooltipster/css/themes/tooltipster-shadow.scss"; 42 | -------------------------------------------------------------------------------- /src/css/scss/gisportal_petrel.scss: -------------------------------------------------------------------------------- 1 | @import "_colours-petrel.scss"; 2 | @import "_alerts.scss"; 3 | @import "_animation.scss"; 4 | @import "_export.scss"; 5 | @import "_fonts.scss"; 6 | @import "_main.scss"; 7 | @import "_plot.scss"; 8 | @import "_grid.scss"; 9 | @import "_history.scss"; 10 | @import "_icons.scss"; 11 | @import "_jquery.nouislider.scss"; 12 | @import "_indicators.scss"; 13 | @import "_compare.scss"; 14 | 15 | @import "_mapcontrols.scss"; 16 | @import "_metadata-panel.scss"; 17 | @import "_nv.d3.scss"; 18 | @import "_overlay.scss"; 19 | @import "_panel.scss"; 20 | @import "_panel-slideout.scss"; 21 | @import "_add-layers-form.scss"; 22 | @import "_edit-groups.scss"; 23 | @import "_popup.scss"; 24 | @import "_reset.scss"; 25 | @import "_scalebar.scss"; 26 | @import "_share.scss"; 27 | @import "_start.scss"; 28 | @import "_streamline.scss"; 29 | @import "_streamline-filled-in.scss"; 30 | @import "_tables.scss"; 31 | @import "_timeline.scss"; 32 | @import "_type.scss"; 33 | @import "_walkthrough.scss"; 34 | @import "_vector.scss"; 35 | 36 | @import "_collaboration.scss"; 37 | @import "_notify.scss"; 38 | @import "_user.scss"; 39 | 40 | 41 | @import "../../../html/js-libs/tooltipster/css/tooltipster.scss"; 42 | @import "../../../html/js-libs/tooltipster/css/themes/tooltipster-shadow.scss"; 43 | 44 | -------------------------------------------------------------------------------- /src/css/scss/login.scss: -------------------------------------------------------------------------------- 1 | @import "_colours.scss"; 2 | @import "_main.scss"; 3 | @import "_fonts.scss"; 4 | @import "_type.scss"; 5 | @import "_user.scss"; -------------------------------------------------------------------------------- /src/js/loading.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Code for the loading icon 3 | * Can be used anyway buy calling gisportal.loading.increment() 4 | * when the code starts loading and gisportal.loading.decrement() 5 | * when the code stops loading. 6 | */ 7 | 8 | gisportal.loading = {}; 9 | gisportal.loading.counter = 0; 10 | gisportal.loading.loadingElement = jQuery(''); 11 | gisportal.loading.loadingTimeout = null; 12 | 13 | 14 | /** 15 | * Increases the counter of how many things are currently loading 16 | */ 17 | gisportal.loading.increment = function(){ 18 | gisportal.loading.counter++; 19 | gisportal.loading.updateLoadingIcon(); 20 | }; 21 | 22 | /** 23 | * Decreases the counter of how many things are currently loading 24 | */ 25 | gisportal.loading.decrement = function(){ 26 | gisportal.loading.counter--; 27 | gisportal.loading.updateLoadingIcon(); 28 | }; 29 | 30 | /** 31 | * Either show or hide the loading icon. 32 | * A delay is added to show because layers can update in a few milliseconds causing a horrible flash 33 | */ 34 | gisportal.loading.updateLoadingIcon = function(){ 35 | 36 | if( gisportal.loading.loadingTimeout !== null ) 37 | return ; 38 | 39 | gisportal.loading.loadingTimeout = setTimeout(function(){ 40 | gisportal.loading.loadingTimeout = null; 41 | if( gisportal.loading.counter > 0 ){ 42 | gisportal.loading.loadingElement.show(); 43 | 44 | }else{ 45 | gisportal.loading.loadingElement.hide(); 46 | } 47 | }, gisportal.loading.counter ? 300 : 600); 48 | }; 49 | -------------------------------------------------------------------------------- /src/js/login.js: -------------------------------------------------------------------------------- 1 | let providers = {} 2 | -------------------------------------------------------------------------------- /src/js/portal.js: -------------------------------------------------------------------------------- 1 | /** 2 | * portal.js 3 | * This file is the entry point to the GIS Portal. 4 | * It should only have a call to gisportal.main() 5 | * This function is held in gisportal.js 6 | */ 7 | 8 | $(document).ready(function() { 9 | 10 | // IE 9 Fix for missing console 11 | if (!window.console) window.console = {}; 12 | if (!window.console.log) window.console.log = function () { }; 13 | if (!window.console.info) window.console.info = function () { }; 14 | $.ajax({ 15 | url: gisportal.middlewarePath + '/settings/config', 16 | dataType: 'script', 17 | success: function(script){ 18 | eval(script); // jshint ignore:line 19 | gisportal.main(); 20 | } 21 | }); 22 | }); 23 | -------------------------------------------------------------------------------- /src/js/user_feedback.js: -------------------------------------------------------------------------------- 1 | // Unique session ID which is posted to UserVioice 2 | // When a request is made you can go into the 3 | // state's database and retrieve the information 4 | window.session_id = (new Date()).getTime() + "-" + Math.floor( Math.random() * 1000000 ); 5 | 6 | $(function(){ 7 | // When a user clients the user voice icon store the state 8 | $('body').on('click', '.uv-icon', function(){ 9 | $.ajax({ 10 | method: 'POST', 11 | url: gisportal.stateLocation, 12 | data: { 13 | state: JSON.stringify(gisportal.getState()), 14 | session_id: window.session_id 15 | } 16 | }); 17 | }); 18 | }); 19 | 20 | UserVoice=window.UserVoice||[]; 21 | 22 | // Set the ID 23 | UserVoice.push(['setCustomFields',{ 'Session ID': window.session_id }]); 24 | 25 | // Set colors 26 | UserVoice.push(['set', { 27 | accent_color: '#448dd6', 28 | trigger_color: 'white', 29 | trigger_background_color: 'rgba(46, 49, 51, 0.6)' 30 | }]); 31 | 32 | 33 | // Add default trigger to the bottom-right corner of the window: 34 | UserVoice.push(['addTrigger', { mode: 'contact', trigger_position: 'bottom-right' }]); 35 | 36 | // Autoprompt for Satisfaction and SmartVote (only displayed under certain conditions) 37 | UserVoice.push(['autoprompt', {}]); -------------------------------------------------------------------------------- /src/templates/active-plot-component.mst: -------------------------------------------------------------------------------- 1 | 2 |
3 | 4 | Indicator: {{indicatorObj.descriptiveName}} 5 | {{#if bbox}} 6 |
7 | BBox: 8 | {{truncate bbox 18}} 9 | {{/if}} 10 | {{#if elevation}} 11 |
12 | Depth: 13 | {{round elevation 2}} {{indicatorObj.elevationUnits}} 14 | {{/if}} 15 | 19 |
20 | Axis Label : 21 |
22 | 23 | 24 | 25 |
26 | 27 | -------------------------------------------------------------------------------- /src/templates/add-indicator-dropdown.mst: -------------------------------------------------------------------------------- 1 | {{#each layers}} 2 |
  • {{truncate descriptiveName 36}}
  • 3 | {{/each}} 4 |
  • 5 |
  • New Indicator
  • -------------------------------------------------------------------------------- /src/templates/add-layers-paginator.mst: -------------------------------------------------------------------------------- 1 |
    2 | 16 |
    17 | 18 |
    19 | 20 | 21 |
    -------------------------------------------------------------------------------- /src/templates/add-layers-table.mst: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | {{#each this}} 13 | {{#if userDefined}} 14 | 15 | 16 | 17 | 18 | 19 | 20 | {{/if}} 21 | {{/each}} 22 | 23 | {{! 24 | 25 | 38 | }} 39 |
    LayerDisplay TitleIndicator Type(s)Abstract
    {{displayTitle}}
    26 |
    27 | 36 |
    37 |
    40 |
    41 | 42 |
    -------------------------------------------------------------------------------- /src/templates/add-layers-validation.mst: -------------------------------------------------------------------------------- 1 | {{#each this}} 2 |

    {{@key}} {{this}}

    3 | {{/each}} -------------------------------------------------------------------------------- /src/templates/browseIndicators.mst: -------------------------------------------------------------------------------- 1 | {{! List of used variables for this template: 2 | id - The indicator id 3 | name - The name to be shown for the indicator 4 | }} 5 | {{#unless empty_search}} 6 | {{#each indicators}} 7 |
  • 8 | {{name}} 9 |
  • 10 | {{else}} 11 |
  • 12 | No results for "{{search_term}}" 13 |
  • 14 | {{/each}} 15 | {{/unless}} -------------------------------------------------------------------------------- /src/templates/categories.mst: -------------------------------------------------------------------------------- 1 | {{! List of used variables for this template: 2 | category - The category 3 | name - The name to be shown for the category 4 | }} 5 | 6 |
    7 | 19 |
    20 | 21 | -------------------------------------------------------------------------------- /src/templates/category-filter-selectlist.mst: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/templates/category-filter.mst: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /src/templates/category-simple-selectlist.mst: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/templates/collaboration-home.mst: -------------------------------------------------------------------------------- 1 |
    2 | 3 | 4 | 5 |
    6 | 7 |
    8 |

    Invite People

    9 |

    Copy the address in the text field below and paste into an email, Skype chat or IRC channel to invite people to your room.

    10 | 11 |

    Press Ctrl+C (or ⌘+C on a Mac) to copy

    12 |
    13 | 14 |

    Connected people in this room:

    15 | 16 | {{#people}} 17 |
    18 |

    {{name}}

    19 | {{#presenter}}
    {{/presenter}} 20 | {{#diverged}}
    {{/diverged}} 21 |
    22 | {{/people}} -------------------------------------------------------------------------------- /src/templates/collaboration-invite.mst: -------------------------------------------------------------------------------- 1 |

    You have been invited to join a collaboration session{{#if from}} by {{from}}{{/if}}

    2 |
    3 | 4 | -------------------------------------------------------------------------------- /src/templates/collaboration-message.mst: -------------------------------------------------------------------------------- 1 |
    2 |
    3 | {{#if image}} 4 | 5 | {{/if}} 6 |

    {{{message}}}

    7 |
    8 |
    -------------------------------------------------------------------------------- /src/templates/collaboration-messenger.mst: -------------------------------------------------------------------------------- 1 |
    2 |
    3 | 4 |
    5 |
    6 | 7 | 8 |
    9 |
    -------------------------------------------------------------------------------- /src/templates/collaboration-person-local.mst: -------------------------------------------------------------------------------- 1 |
  • 2 |

    You

    3 | 4 | 5 | 6 | 7 |
  • -------------------------------------------------------------------------------- /src/templates/collaboration-person-remote.mst: -------------------------------------------------------------------------------- 1 |
  • 2 | 3 |

    {{person.name}}

    4 | 5 | 6 | 7 |
  • -------------------------------------------------------------------------------- /src/templates/collaboration-status.mst: -------------------------------------------------------------------------------- 1 |
    2 | Initialising connection... -------------------------------------------------------------------------------- /src/templates/collaboration-video.mst: -------------------------------------------------------------------------------- 1 | {{#if compatable}} 2 | {{#unless insecure}} 3 |
    4 | 5 |
    6 | 7 |

    People With Audio/Video Enabled:

    8 | 9 | 10 | {{else}} 11 |

    Audio/Video is not available on insecure origins.

    12 | {{/unless}} 13 | {{else}} 14 |

    Audio/Video is not available on this browser.

    15 | {{/if}} -------------------------------------------------------------------------------- /src/templates/collaboration.mst: -------------------------------------------------------------------------------- 1 |
    2 | 3 |
    4 |
    5 | -------------------------------------------------------------------------------- /src/templates/edit-group-form.mst: -------------------------------------------------------------------------------- 1 |
    2 | Edit Group 3 | 4 |
    5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /src/templates/edit-groups-table.mst: -------------------------------------------------------------------------------- 1 |
    2 | Groups 3 | 4 |
    5 | {{#if this}} 6 | 7 | 8 | 9 | 10 | 11 | 12 | {{#each this}} 13 | 14 | 15 | 22 | 23 | 24 | 25 | {{/each}} 26 |
    Group NameMembersEdit
    {{groupName}} 16 |
      17 | {{#each members}} 18 |
    • {{this}}
    • 19 | {{/each}} 20 |
    21 |
    27 | {{else}} 28 | No groups found. 29 | {{/if}} 30 | 31 | -------------------------------------------------------------------------------- /src/templates/edit-layers-table.mst: -------------------------------------------------------------------------------- 1 |
    2 | Server List 3 | 4 |
    5 | {{#if this}} 6 | 7 | 8 | 10 | {{#if admin}}{{/if}} 11 | 12 | 13 | 14 | 15 | {{#each server_list}} 16 | 17 | 18 | 19 | {{#if ../admin}}{{/if}} 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 39 | 43 | {{/each}} 44 |
    9 | Server NameOwnerProviderCache Time StampConfigure Tools
    {{serverName}}{{owner}}{{provider}}{{timeStamp}}
    45 | {{else}} 46 | There are currently no servers available for you to configure. Please close this form and add an external WMS URL to add it to your portal. 47 | {{/if}} -------------------------------------------------------------------------------- /src/templates/export-raw.mst: -------------------------------------------------------------------------------- 1 |
    2 | Download netCDF 3 | 4 |
    5 |
    6 |

    The NetCDF file that you download can be visualised by several free software packages, for instance on linux based systems you can use ncview and on windows based systems you can use QGIS. For more information about the data format and available software take a look at the unidata help pages

    7 |
    8 | 9 | 10 |
    11 |
    12 | 13 | 14 |
    -------------------------------------------------------------------------------- /src/templates/graph.mst: -------------------------------------------------------------------------------- 1 |
    2 |

    {{title}} ({{units}})

    3 |
    4 | 5 | 6 |
    -------------------------------------------------------------------------------- /src/templates/map-settings.mst: -------------------------------------------------------------------------------- 1 | 2 |

    Display Options

    3 | 4 | -------------------------------------------------------------------------------- /src/templates/plot-data.mst: -------------------------------------------------------------------------------- 1 |
    2 |

    Metadata:

    3 | {{#each data}} 4 |

    {{label}}

    5 | {{{meta}}} 6 | {{/each}} 7 |
    -------------------------------------------------------------------------------- /src/templates/plot-popup.mst: -------------------------------------------------------------------------------- 1 |
    2 |
    3 | Plot 4 | 5 | 6 |
    7 | {{{html}}} 8 | {{#if (eq plotType 'animation')}} 9 | 13 | {{else}} 14 |
    15 | Download 16 |
    17 | {{/if}} 18 |
    -------------------------------------------------------------------------------- /src/templates/plot-status.mst: -------------------------------------------------------------------------------- 1 |
    2 |
    3 | {{#if id}} 4 | {{#if saved}} 5 |
    6 | {{else}} 7 |
    8 | {{/if}} 9 | {{else}} 10 |
    11 | {{/if}} 12 |
    13 |

    {{call 'title'}}

    14 |
    15 |
    16 |
    17 | {{!-- Using helpers from templates.js:134 18 | Equivilent to: 19 | if state != 'complete' and state != 'failed' --}} 20 | {{#if (and 21 | (ne (call 'state') 'complete') 22 | (ne (call 'state') 'failed') 23 | )}} 24 |
    25 | 26 |
    27 | {{/if}} 28 | {{#if_equals (call 'state') 'complete' }} 29 |
    30 |
    31 | 32 | {{#unless ../noCopyEdit}} 33 | 34 | {{/unless}} 35 | 36 |
    37 | {{/if_equals}} 38 | {{#if_equals (call 'state') 'failed' }} 39 |
    40 |
    41 | The plot could not be built. Downstream error.
    42 | 43 | Full error message 44 |
    45 | {{/if_equals}} 46 |
    47 |
    -------------------------------------------------------------------------------- /src/templates/refine.mst: -------------------------------------------------------------------------------- 1 |

    There are now {{indicatorCount}} {{indicatorName}} indicators to choose from. Use the select lists below to refine your selection

    2 | {{#refine}} 3 |
    4 | 5 | {{cat}} 6 | {{tag}} 7 | 8 |
    9 | {{/refine}} 10 | 11 | -------------------------------------------------------------------------------- /src/templates/scalebar-preview.mst: -------------------------------------------------------------------------------- 1 |
    2 | 3 | {{#if scalePoints}} 4 | {{scale_point ../id 0 true}} 5 | {{scale_point ../id 1 true}} 6 | {{scale_point ../id 2 true}} 7 | {{scale_point ../id 3 true}} 8 | {{scale_point ../id 4 true}} 9 | {{/if}} -------------------------------------------------------------------------------- /src/templates/scalebar.mst: -------------------------------------------------------------------------------- 1 | {{#if hasDate}}

    {{niceSelectedDateTime}}

    {{/if}} 2 | {{#if units}}

    Scale - {{units}}

    {{/if}} 3 |
    4 |
    5 | 6 | {{{scalebar_overlay_text colorbands minScaleVal maxScaleVal log}}} 7 |
    8 | {{#if legendSettings.scalePoints}} 9 | {{#scalePoints}} 10 | {{nicePrint}} 11 | {{/scalePoints}} 12 | {{/if}} 13 |
    -------------------------------------------------------------------------------- /src/templates/server-form.mst: -------------------------------------------------------------------------------- 1 | 2 |
    3 | {{server_name}} 4 | 5 |
    6 | 7 |
    8 |
    9 |
    10 | 11 |
    12 |
    13 | 14 |
    15 |
    16 | 17 |
    18 |
    19 |
    20 |
    21 |
    22 |
    23 | 24 |
    25 |
    26 | 27 |
    28 |
    29 | 30 |
    31 |
    32 | 33 |
    34 |
    37 |
    38 |
    39 |
    -------------------------------------------------------------------------------- /src/templates/share-logged-out.mst: -------------------------------------------------------------------------------- 1 |

    Sign in to access more features

    2 |

    Sign in with

    3 | {{#providers}} 4 | 5 | {{/providers}} 6 | -------------------------------------------------------------------------------- /src/templates/start.mst: -------------------------------------------------------------------------------- 1 |
    2 |
    3 | {{{startHTML}}} 4 |
    5 | {{#if impactCollection}} 6 |
    7 | {{/if}} 8 | {{#if homepageSlides}} 9 |
    10 |
    11 | {{#each homepageSlides}} 12 |
    13 | {{/each}} 14 |
    15 |
    16 | {{/if}} 17 | 18 | 25 |
    26 | -------------------------------------------------------------------------------- /src/templates/tab-vectorstyles.mst: -------------------------------------------------------------------------------- 1 | 2 |
    3 |

    vector styles

    4 |
    5 |
    6 |
    7 | -------------------------------------------------------------------------------- /src/templates/terms-and-conditions-text.mst: -------------------------------------------------------------------------------- 1 |

    Terms and Conditions

    2 | 3 | Use by you of the data (which includes model outputs and simulations) 4 | on this site is entirely at your own risk. This data is 5 | provided “as is” without any warranty of any kind, either expressed or 6 | implied, including without limitation, any implied warranties as to its 7 | merchantability or its suitability for any use. All implied conditions 8 | relating to the quality or suitability of the data and the medium on 9 | which it is provided, and all liabilities arising from the supply of the 10 | data (including any liability arising in negligence) are excluded to the 11 | fullest extent permitted by law.
    12 |
    13 | In using the data you agree to acknowledge use of the data in the 14 | acknowledgment section of any resulting publication. -------------------------------------------------------------------------------- /src/templates/tooltip-layerordermove.mst: -------------------------------------------------------------------------------- 1 | Click and hold the indicator name and drag up or down, let go to set the new order -------------------------------------------------------------------------------- /src/templates/tooltip-next-previous.mst: -------------------------------------------------------------------------------- 1 |
    2 | 10 |
    -------------------------------------------------------------------------------- /src/templates/tooltip-refine-external-details.mst: -------------------------------------------------------------------------------- 1 | {{#if name}} 2 |
    3 |
    Title
    4 |
    {{{name}}}
    5 |
    6 | {{/if}} 7 | {{#if firstDate}} 8 |
    9 |
    Date Range
    10 |
    {{{firstDate}}} - {{lastDate}}
    11 |
    12 | {{/if}} 13 | {{#if exBoundingBox}} 14 | {{#with exBoundingBox}} 15 |
    16 |
    Bounding Box
    17 |
    {{round NorthBoundLatitude 2}} N, {{round EastBoundLongitude 2}} E, {{round SouthBoundLatitude 2}} S, {{round WestBoundLongitude 2}} W
    18 |
    19 | {{/with}} 20 | {{/if}} 21 | {{#if abstract}} 22 |
    23 |
    Abstract
    24 |
    {{{dotdotdot abstract}}}
    25 |
    26 | {{/if}} 27 | {{#if serverName}} 28 |
    29 |
    Server Name
    30 |
    {{{serverName}}}
    31 |
    32 | {{/if}} 33 | {{#if owner}} 34 |
    35 |
    Owner
    36 |
    {{{owner}}}
    37 |
    38 | {{/if}} 39 | -------------------------------------------------------------------------------- /src/templates/tooltip-refinedetails.mst: -------------------------------------------------------------------------------- 1 |
    2 |
    Provider
    3 |
    {{provider}}
    4 |
    5 |
    6 |
    Date Range
    7 |
    {{dateStart}} » {{dateEnd}}
    8 |
    9 | {{#tags}} 10 |
    11 |
    {{name}}
    12 |
    {{value}}
    13 |
    14 | {{/tags}} 15 | {{#if owner}} 16 |
    17 |
    Owner
    18 |
    {{{owner}}}
    19 |
    20 | {{/if}} 21 | -------------------------------------------------------------------------------- /src/templates/tooltip-scalebar.mst: -------------------------------------------------------------------------------- 1 | Click on the scale bar to edit the scale range or layer style. -------------------------------------------------------------------------------- /src/templates/user-feedback-popup.mst: -------------------------------------------------------------------------------- 1 | {{message}} 2 | {{#if string_error}} 3 |
    4 |

    Invalid string, you can only use 'a-z', 'A-Z', '0-9', ' ', '_' and the string cannot start with a digit or excede 100 characters.

    5 | {{/if}} 6 |
    7 | 8 |
    9 | 10 | 11 |
    12 |
    -------------------------------------------------------------------------------- /src/templates/vector-style-ui.mst: -------------------------------------------------------------------------------- 1 |
    2 |
    3 |

    Current property : {{currentProperty}}

    4 | {{#if defaultProps }} 5 | 11 | {{/if}} 12 | 13 | 14 | {{#each legend}} 15 | 16 | 17 | 18 | 19 | 20 | {{/each}} 21 |
    {{unit}}
    {{ option }}
    22 |
    23 | 24 | 25 | 26 |
    27 | 28 |
    29 |
    -------------------------------------------------------------------------------- /src/templates/walkthrough-management-table.mst: -------------------------------------------------------------------------------- 1 |
    2 | Walkthrough List 3 | 4 | 5 | 6 | 7 |
    8 | {{#if this}} 9 | 10 | 11 | 12 | 13 | 14 | 15 | {{#each this}} 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | {{/each}} 24 |
    TitleOwnerTools
    {{title}}{{owner}}
    25 | {{else}} 26 | There are currently no walkthroughs available for you to configure. You either are not an admin, or there are no walkthroughs recorded on this portal yet. 27 | {{/if}} -------------------------------------------------------------------------------- /src/templates/webrtc-inbound-call.mst: -------------------------------------------------------------------------------- 1 |

    Incoming call{{#if caller}} from {{caller}}{{/if}}

    2 |
    3 | 4 | 5 |
    -------------------------------------------------------------------------------- /src/templates/webrtc-outbound-call.mst: -------------------------------------------------------------------------------- 1 |

    Calling{{#if callee}} {{callee}}{{/if}}...

    2 |
    3 | 4 |
    -------------------------------------------------------------------------------- /test/app/lib/moduleloader.js: -------------------------------------------------------------------------------- 1 | var chai = require('chai'); 2 | var fs = require('fs-extra'); 3 | 4 | var moduleLoader = require(global.test.appPath + '/app/lib/moduleloader.js'); 5 | var testModule = require(global.test.dependPath + '/app/modules/test'); 6 | 7 | var expect = chai.expect; 8 | 9 | describe('moduleloader', function() { 10 | describe('loadModules', function() { 11 | var moduleSource = global.test.dependPath + '/app/modules/test'; 12 | var moduleDestination = global.test.appPath + '/app/modules/test'; 13 | var moduleExists = false; 14 | 15 | it('should load test module correctly', function(done) { 16 | try { 17 | if (fs.statSync(moduleDestination).isDirectory) { 18 | console.error(); 19 | console.error(' ----------------------------------------------------------- '); 20 | console.error('| Error: app/modules/test already exists! |'); 21 | console.error('| Please move the folder to pass the moduleLoader test. |'); 22 | console.error(' ----------------------------------------------------------- '); 23 | console.error(); 24 | moduleExists = true; 25 | expect.fail(); 26 | done(); 27 | } 28 | } catch (e) { 29 | fs.copy(moduleSource, moduleDestination, { 30 | clobber: false 31 | }, function() { 32 | var modules = moduleLoader.loadModules(); 33 | expect(modules.test).to.deep.equal(testModule); 34 | done(); 35 | }); 36 | } 37 | }); 38 | 39 | after(function(done) { 40 | if (!moduleExists) { 41 | fs.remove(moduleDestination, function() { 42 | done(); 43 | }); 44 | } else { 45 | done(); 46 | } 47 | }); 48 | }); 49 | }); 50 | -------------------------------------------------------------------------------- /test/mocha.opts: -------------------------------------------------------------------------------- 1 | --recursive 2 | --require ./test_dependencies/init.js 3 | --colors 4 | --check-leaks 5 | --trace-deprecation 6 | --globals mocks,test 7 | -------------------------------------------------------------------------------- /test/setup.js: -------------------------------------------------------------------------------- 1 | var fs = require('fs-extra'); 2 | var httpMocks = require('node-mocks-http'); 3 | var eventEmitter = require('events').EventEmitter; 4 | 5 | before(function() { 6 | global.mocks = { 7 | createReq: function() { 8 | return httpMocks.createRequest({ 9 | headers: { 10 | host: '127.0.0.1:6789' 11 | }, 12 | ip: '127.0.0.1', 13 | session: { 14 | passport: false 15 | } 16 | }); 17 | }, 18 | createRes: function() { 19 | return httpMocks.createResponse({ 20 | eventEmitter: eventEmitter 21 | }); 22 | } 23 | }; 24 | }); 25 | 26 | after(function() { 27 | if (!global.test.configExists) { 28 | fs.removeSync(global.test.configDir); 29 | } 30 | var logDir = global.test.appPath + '/logs/test'; 31 | fs.removeSync(logDir); 32 | }); -------------------------------------------------------------------------------- /test_dependencies/app/modules/test/index.js: -------------------------------------------------------------------------------- 1 | var test = { 2 | testVar: 'Hello World!', 3 | rocketTest: 'Hello Mars!' 4 | }; 5 | 6 | module.exports = test; -------------------------------------------------------------------------------- /test_dependencies/config/site_settings/127.0.0.1:6789/config-server.js: -------------------------------------------------------------------------------- 1 | GLOBAL.config['127.0.0.1:6789'] = { 2 | auth: { 3 | google: { 4 | scope: 'https://www.googleapis.com/auth/userinfo.email', 5 | clientid: '771978882869-ov72e4gql205io6pprvr0eja7q3o0j91.apps.googleusercontent.com', 6 | clientsecret: 'kZBX8GjpLsIO0cGBfJ1np5rx', 7 | callback: 'http://127.0.0.1:6789/app/user/auth/google/callback', 8 | prompt: 'select_account' 9 | } 10 | }, 11 | admins: ['an.admin@pml.ac.uk', 'nik@pml.ac.uk'], 12 | tokens: { 13 | 'zxc': 'guest', 14 | 'asd': 'a.user@pml.ac.uk', 15 | 'qwe': 'an.admin@pml.ac.uk' 16 | }, 17 | logDir: 'logs/test', 18 | cssFile: "GISportal" 19 | }; -------------------------------------------------------------------------------- /test_dependencies/expected/get_cache_servers.json: -------------------------------------------------------------------------------- 1 | [{"wmsURL":"http://rsg.pml.ac.uk/thredds/wms/CCI_ALL-v3.0-5DAY?","wcsURL":"http://rsg.pml.ac.uk/thredds/wcs/CCI_ALL-v3.0-5DAY","serverName":"rsg.pml.ac.uk-thredds-wms-CCI_ALL-v3.0-5DAY","contactInfo":{"person":"Remote Sensing Group","email":"rsgweb@pml.ac.uk","address":"","phone":"","position":""},"provider":"Plymouth Marine Laboratory","timeStamp":"2017-01-13T15:55:34.062Z","owner":"127.0.0.1:6789"},{"wmsURL":"http://rsg.pml.ac.uk/thredds/wms/CCI_ALL-v3.0-DAILY?","wcsURL":"http://rsg.pml.ac.uk/thredds/wcs/CCI_ALL-v3.0-DAILY","serverName":"rsg.pml.ac.uk-thredds-wms-CCI_ALL-v3.0-DAILY","contactInfo":{"person":"Remote Sensing Group","email":"rsgweb@pml.ac.uk","address":"","phone":"","position":""},"provider":"Plymouth Marine Laboratory","timeStamp":"2017-01-13T15:53:22.707Z","owner":"127.0.0.1:6789"},{"wmsURL":"http://rsg.pml.ac.uk/thredds/wms/CCI_ALL-v3.0-MONTHLY?","wcsURL":"http://rsg.pml.ac.uk/thredds/wcs/CCI_ALL-v3.0-MONTHLY","serverName":"rsg.pml.ac.uk-thredds-wms-CCI_ALL-v3.0-MONTHLY","contactInfo":{"person":"Remote Sensing Group","email":"rsgweb@pml.ac.uk","address":"","phone":"","position":""},"provider":"Plymouth Marine Laboratory","timeStamp":"2017-01-13T15:56:30.276Z","owner":"a.user@pml.ac.uk"}] -------------------------------------------------------------------------------- /test_dependencies/expected/plotting/animation/cd1ae320a55777f114ee6177bd409728c0954716-plot.html: -------------------------------------------------------------------------------- 1 |
    -------------------------------------------------------------------------------- /test_dependencies/expected/plotting/animation/cd1ae320a55777f114ee6177bd409728c0954716-request.json: -------------------------------------------------------------------------------- 1 | {"plot":{"type":"animation","title":"Plymouth_Marine_Laboratory: Mass Concentration of Chlorophyll a in Sea Water","style":"boxfill/alg","downloadTypes":[{"key":"csv","label":"CSV"},{"key":"png","label":"PNG"},{"key":"meta-data","label":"Meta Data"},{"key":"logos","label":"Logos"},{"key":"svg","label":"SVG"}],"matchup_log":false,"framerate":1,"xAxis":{"scale":"linear","label":"Date/Time","ticks":"auto","weight":"auto","tickFormat":",.2f"},"y1Axis":{"scale":"log","label":"Mass Concentration of Chlorophyll a in Sea Water (milligram m-3)","ticks":"auto","weight":"auto","tickFormat":"auto"},"data":{"series":[{"handler":"OPEC_SERVICE_WCS","data_source":{"coverage":"chlor_a","layer_id":"chlor_a__Plymouth_Marine_Laboratory2","t_bounds":["2015-11-01","2015-12-01"],"bbox":"-179.9791717529297,-89.97916412353516,179.9791717529297,89.97916412353516","threddsUrl":"https://rsg.pml.ac.uk/thredds/wcs/CCI_ALL-v3.0-MONTHLY","wmsUrl":"https://rsg.pml.ac.uk/thredds/wms/CCI_ALL-v3.0-MONTHLY?","wmsParams":{"LAYERS":"chlor_a","TRANSPARENT":true,"wrapDateLine":true,"SRS":"EPSG:4326","VERSION":"1.1.1","STYLES":"boxfill/alg","NUMCOLORBANDS":255,"time":"2015-12-01T00:00:00.000Z","colorscalerange":"0.01,67","logscale":true},"timesSlices":["2015-11-01T00:00:00.000Z","2015-12-01T00:00:00.000Z"]},"label":"1) Mass Concentration of Chlorophyll a in Sea Water - Plymouth Marine Laboratory","yAxis":1,"type":"line","meta":"Region: undefined
    Confidence: undefined
    Provider: Plymouth_Marine_Laboratory
    Interval: undefined
    Bounding Box: -179.9791717529297,-89.97916412353516,179.9791717529297,89.97916412353516
    "}]}},"style":{"logos":[]}} -------------------------------------------------------------------------------- /test_dependencies/expected/plotting/animation/cd1ae320a55777f114ee6177bd409728c0954716-status.json: -------------------------------------------------------------------------------- 1 | {"job_id":"cd1ae320a55777f114ee6177bd409728c0954716","completed":true,"message":"","traceback":"","state":"complete","percentage":100,"minutes_remaining":0} -------------------------------------------------------------------------------- /test_dependencies/expected/plotting/animation/cd1ae320a55777f114ee6177bd409728c0954716-video.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/test_dependencies/expected/plotting/animation/cd1ae320a55777f114ee6177bd409728c0954716-video.mp4 -------------------------------------------------------------------------------- /test_dependencies/expected/plotting/animation/cd1ae320a55777f114ee6177bd409728c0954716-video.webm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/test_dependencies/expected/plotting/animation/cd1ae320a55777f114ee6177bd409728c0954716-video.webm -------------------------------------------------------------------------------- /test_dependencies/init.js: -------------------------------------------------------------------------------- 1 | var fs = require('fs-extra'); 2 | var path = require('path'); 3 | 4 | global.test = { 5 | appPath: path.join(__dirname, '../'), 6 | dependPath: path.join(__dirname, '../test_dependencies/'), 7 | expectedPath: path.join(__dirname, '../test_dependencies/expected/') 8 | }; 9 | 10 | fs.mkdirsSync(global.test.appPath + '/config/site_settings'); 11 | 12 | var configSource = global.test.dependPath + '/config/site_settings/127.0.0.1\:6789'; 13 | var configDestination = global.test.appPath + '/config/site_settings/127.0.0.1\:6789'; 14 | 15 | try { 16 | if (fs.statSync(configDestination).isDirectory()) { 17 | global.test.configExists = true; 18 | console.error(' ---------------------------------------------------------------- '); 19 | console.error('| Error: config/site_settings/127.0.0.1:6789 already exists! |'); 20 | console.error('| Please move the folder to run the tests. |'); 21 | console.error(' ---------------------------------------------------------------- '); 22 | console.error(); 23 | process.exit(1); 24 | } 25 | } catch (e) { 26 | fs.copySync(configSource, configDestination, { 27 | clobber: false 28 | }); 29 | global.test.configExists = false; 30 | global.test.configDir = configDestination; 31 | } 32 | -------------------------------------------------------------------------------- /test_dependencies/resources/plotting/animation/2eb07c2130bf866a984ec65a488a13184d162bd4_2015-11-01T00-00:00.000Z.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/test_dependencies/resources/plotting/animation/2eb07c2130bf866a984ec65a488a13184d162bd4_2015-11-01T00-00:00.000Z.png -------------------------------------------------------------------------------- /test_dependencies/resources/plotting/animation/2eb07c2130bf866a984ec65a488a13184d162bd4_2015-12-01T00-00:00.000Z.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/test_dependencies/resources/plotting/animation/2eb07c2130bf866a984ec65a488a13184d162bd4_2015-12-01T00-00:00.000Z.png -------------------------------------------------------------------------------- /test_dependencies/resources/plotting/animation/cd1ae320a55777f114ee6177bd409728c0954716-request.json: -------------------------------------------------------------------------------- 1 | {"plot":{"type":"animation","title":"Plymouth_Marine_Laboratory: Mass Concentration of Chlorophyll a in Sea Water","style":"boxfill/alg","downloadTypes":[{"key":"csv","label":"CSV"},{"key":"png","label":"PNG"},{"key":"meta-data","label":"Meta Data"},{"key":"logos","label":"Logos"},{"key":"svg","label":"SVG"}],"matchup_log":false,"framerate":1,"xAxis":{"scale":"linear","label":"Date/Time","ticks":"auto","weight":"auto","tickFormat":",.2f"},"y1Axis":{"scale":"log","label":"Mass Concentration of Chlorophyll a in Sea Water (milligram m-3)","ticks":"auto","weight":"auto","tickFormat":"auto"},"data":{"series":[{"handler":"OPEC_SERVICE_WCS","data_source":{"coverage":"chlor_a","layer_id":"chlor_a__Plymouth_Marine_Laboratory2","t_bounds":["2015-11-01","2015-12-01"],"bbox":"-179.9791717529297,-89.97916412353516,179.9791717529297,89.97916412353516","threddsUrl":"https://rsg.pml.ac.uk/thredds/wcs/CCI_ALL-v3.0-MONTHLY","wmsUrl":"https://rsg.pml.ac.uk/thredds/wms/CCI_ALL-v3.0-MONTHLY?","wmsParams":{"LAYERS":"chlor_a","TRANSPARENT":true,"wrapDateLine":true,"SRS":"EPSG:4326","VERSION":"1.1.1","STYLES":"boxfill/alg","NUMCOLORBANDS":255,"time":"2015-12-01T00:00:00.000Z","colorscalerange":"0.01,67","logscale":true},"timesSlices":["2015-11-01T00:00:00.000Z","2015-12-01T00:00:00.000Z"]},"label":"1) Mass Concentration of Chlorophyll a in Sea Water - Plymouth Marine Laboratory","yAxis":1,"type":"line","meta":"Region: undefined
    Confidence: undefined
    Provider: Plymouth_Marine_Laboratory
    Interval: undefined
    Bounding Box: -179.9791717529297,-89.97916412353516,179.9791717529297,89.97916412353516
    "}]}},"style":{"logos":[]}} -------------------------------------------------------------------------------- /test_dependencies/uploads/testFileUpload.txt: -------------------------------------------------------------------------------- 1 | Hello World! 2 | -------------------------------------------------------------------------------- /uploads/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/uploads/.gitkeep -------------------------------------------------------------------------------- /uploads/archive/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/uploads/archive/.gitkeep -------------------------------------------------------------------------------- /uploads/cache/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmlrsg/GISportal/02f429a0d9ae0faf52ee44a01eb9d006699f8a9a/uploads/cache/.gitkeep -------------------------------------------------------------------------------- /views/authorised.jade: -------------------------------------------------------------------------------- 1 | doctype html 2 | html(lang="en") 3 | head 4 | title= pageTitle 5 | link(rel='stylesheet', href='../css/GISportal.css') 6 | script(type='text/javascript' src='//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js') 7 | script(type='text/javascript') 8 | | try { 9 | | var p = window.opener.top; 10 | | if (p.collaboration.userAuthorised()) { 11 | | window.close(); 12 | | } 13 | | } catch(e) { 14 | | window.top.location='/'; } 15 | body 16 | div.collabIframe 17 | h3 You're logged in 18 | p 19 | a(href='javascript:void(0)' onclick="javascript:window.close()") Close this window 20 | -------------------------------------------------------------------------------- /views/collaboration-index.jade: -------------------------------------------------------------------------------- 1 | div.collabHolder 2 | h3 Collaboration 3 | p To begin using the collaboration tools in this portal you will need to be logged in 4 | p   5 | 6 | if google 7 | div 8 | a(href="/app/user/auth/google") 9 | img(src="/img/sign-in-with-google.png", class="loginButton-google js-google-auth-button") 10 | if saml 11 | div 12 | a(href="/app/user/auth/saml") 13 | img(class="loginButton-saml js-saml-auth-button")&attributes({'src': saml.loginButton}) -------------------------------------------------------------------------------- /views/dashboard.jade: -------------------------------------------------------------------------------- 1 | div.userHolder 2 | h3: b User Dashboard 3 | p You are now logged in 4 | 5 | div.userDetails 6 | img(src=userPicture class='avatar') 7 | div.name= displayName 8 | div.email= userEmail 9 | p.logout 10 | a(href='javascript:void(0)').logout.logoutButton Logout 11 | 12 | div.clearfix 13 | -------------------------------------------------------------------------------- /views/index.jade: -------------------------------------------------------------------------------- 1 | div.userHolder 2 | h3: b User Dashboard 3 | p By choosing to login in you will be able to: 4 | ul 5 | li Add and save your own data layers 6 | li Share your view of the map with colleagues using the collaboration features 7 | li Save and share plots that you create 8 | 9 | if google 10 | div 11 | img(src="/img/sign-in-with-google.png", class="loginButton-google js-google-auth-button") 12 | if saml 13 | div 14 | img(class="loginButton-saml js-saml-auth-button")&attributes({'src': saml.loginButton}) 15 | div(class="clearfix") -------------------------------------------------------------------------------- /views/login.jade: -------------------------------------------------------------------------------- 1 | 2 | html(lang="en") 3 | head 4 | title User Login 5 | link(rel="stylesheet", type="text/css", href="../../css/login.css") 6 | script(type="text/javascript", src="../../login.js") 7 | link(rel="icon", type="image/png", href="../../favicon/favicon-32x32.png") 8 | body(class="login") 9 | div.userLogin 10 | h1 User Login 11 | if (messageText) 12 | div()&attributes({'class': messageStatus}) 13 | | #{messageText} 14 | p You are required to login before being allowed access to this application 15 | if google 16 | div 17 | a(href="/app/user/auth/google") 18 | img(src="/img/sign-in-with-google.png", class="loginButton-google") 19 | if saml 20 | div 21 | a(href="/app/user/auth/saml") 22 | img(class="loginButton-saml")&attributes({'src': saml.loginButton}) --------------------------------------------------------------------------------