climate-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From jo...@apache.org
Subject svn commit: r1562255 [16/19] - in /incubator/climate/trunk/ocw-ui: ./ frontend/ frontend/app/ frontend/app/css/ frontend/app/css/lib/ frontend/app/font/ frontend/app/img/ frontend/app/js/ frontend/app/js/controllers/ frontend/app/js/directives/ fronten...
Date Tue, 28 Jan 2014 22:18:20 GMT
Added: incubator/climate/trunk/ocw-ui/frontend/app/js/services/EvaluationSettings.js
URL: http://svn.apache.org/viewvc/incubator/climate/trunk/ocw-ui/frontend/app/js/services/EvaluationSettings.js?rev=1562255&view=auto
==============================================================================
--- incubator/climate/trunk/ocw-ui/frontend/app/js/services/EvaluationSettings.js (added)
+++ incubator/climate/trunk/ocw-ui/frontend/app/js/services/EvaluationSettings.js Tue Jan 28 22:18:16 2014
@@ -0,0 +1,38 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *    http: *www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+**/
+
+// EvaluationSettings gives controllers access to the user's selected evaluation settings.
+App.Services.service('evaluationSettings', function() {
+	var settings = {
+		'metrics': [ 
+			{'name': 'bias', 'select': true},
+		],
+		'temporal': {
+			'options': ['daily', 'monthly', 'yearly'],
+			'selected': 'monthly',
+		},
+		'spatialSelect': '',
+	};
+
+	return {
+		getSettings: function() {
+			return settings;
+		}
+	};
+});		

Propchange: incubator/climate/trunk/ocw-ui/frontend/app/js/services/EvaluationSettings.js
------------------------------------------------------------------------------
    svn:executable = *

Added: incubator/climate/trunk/ocw-ui/frontend/app/js/services/RegionSelectParams.js
URL: http://svn.apache.org/viewvc/incubator/climate/trunk/ocw-ui/frontend/app/js/services/RegionSelectParams.js?rev=1562255&view=auto
==============================================================================
--- incubator/climate/trunk/ocw-ui/frontend/app/js/services/RegionSelectParams.js (added)
+++ incubator/climate/trunk/ocw-ui/frontend/app/js/services/RegionSelectParams.js Tue Jan 28 22:18:16 2014
@@ -0,0 +1,37 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *    http: *www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+**/
+
+// RegionSelectParams gives controllers access to the user selected evaluation region. 
+App.Services.service('regionSelectParams', function() {
+	var parameters = {
+		"areValid" : true,
+		"latMin"   : "",
+		"latMax"   : "",
+		"lonMin"   : "",
+		"lonMax"   : "",
+		"start"    : "",
+		"end"      : "",
+	};
+
+	return {
+		getParameters: function() {
+			return parameters;
+		},
+	};
+});

Added: incubator/climate/trunk/ocw-ui/frontend/app/js/services/SelectedDatasetInformation.js
URL: http://svn.apache.org/viewvc/incubator/climate/trunk/ocw-ui/frontend/app/js/services/SelectedDatasetInformation.js?rev=1562255&view=auto
==============================================================================
--- incubator/climate/trunk/ocw-ui/frontend/app/js/services/SelectedDatasetInformation.js (added)
+++ incubator/climate/trunk/ocw-ui/frontend/app/js/services/SelectedDatasetInformation.js Tue Jan 28 22:18:16 2014
@@ -0,0 +1,49 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *    http: *www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+**/
+
+// Service for giving controllers access to the information on datasets that 
+// the user has selected for evaluation.
+App.Services.service('selectedDatasetInformation', function() {
+	var datasets = [];
+
+	return {
+		getDatasets: function() {
+			return datasets;
+		},
+		getDatasetCount: function() {
+			return datasets.length;
+		},
+		// TODO: Define the structure of the objects that are added with addDataset.
+		addDataset: function(dataset) {
+			// All datasets need a shouldDisplay attribute that is used when rendering
+			// the overlays on the map!
+			dataset.shouldDisplay = false;
+			// The regrid attribute indicates which dataset should be used for spatial regridding
+			dataset.regrid = false;
+
+			datasets.push(dataset);
+		},
+		removeDataset: function(index) {
+			datasets.splice(index, 1);
+		},
+		clearDatasets: function() {
+			datasets.length = 0;
+		},
+	};
+});

Added: incubator/climate/trunk/ocw-ui/frontend/app/partials/main.html
URL: http://svn.apache.org/viewvc/incubator/climate/trunk/ocw-ui/frontend/app/partials/main.html?rev=1562255&view=auto
==============================================================================
--- incubator/climate/trunk/ocw-ui/frontend/app/partials/main.html (added)
+++ incubator/climate/trunk/ocw-ui/frontend/app/partials/main.html Tue Jan 28 22:18:16 2014
@@ -0,0 +1,239 @@
+
+<!-- Modal for evaluation settings -->
+  <bootstrap-modal modal-id="evaluationSettings">
+  <div class="modal-header">
+    <button class="close">&times;</button>
+    <h3>Settings</h3>
+  </div>
+  <div class="modal-body" ng-controller="SettingsCtrl">
+    <h4>Select the metrics you would like to run.</h4>
+    <div ng-repeat="metric in settings.metrics">
+      <label><input type="checkbox" ng-model="metric.select"> {{metric.name}}</label>
+    </div>
+    <hr />
+    <h4>Select how you would like to temporally re-grid the datasets.</h4>
+    <select ng-model="settings.temporal.selected" ng-options="opt for opt in settings.temporal.options"></select>
+    <hr />
+    <h4>Select which dataset to use as the grid base.</h4>
+    <select ng-model="settings.spatialSelect" ng-options="dataset as dataset.name for dataset in datasets"></select>
+    <hr />
+    <h4>Select a file which will define the bounds of subregions.</h4>
+    <form class="form-inline" autocomplete="off">
+      <input id="subregionFileInput" predictive-file-browser-input ng-model="settings.subregionFile" type="text" class="input-xlarge" autocomplete="off" />
+    </form>
+  </div>
+  <div class="modal-footer">
+    <a href="#" class="btn btn-warning close">Close</a>
+  </div>
+  </bootstrap-modal>
+<!-- END - Modal for evaluation settings -->
+
+  <div class="row-fluid">
+    <div class="span12">
+      <div class="row-fluid">
+        <div class="span6">
+          <!--Dataset Select Controls-->
+          <div ng-controller="DatasetSelectCtrl">
+            <div class="row-fluid">
+	            <div class="span1 offset10">
+	              <button class="btn btn-link no-color-link" ng-click="clearDatasets()" ng-disabled="shouldDisableClearButton()">
+	                <span tooltip-placement="left" tooltip-popup-delay="700" tooltip="Clear Datasets">
+	                  <i class="icon-trash icon-2x"></i>
+	                </span>
+	              </button>
+	            </div>
+	            <div class="span1">
+	              <button class="btn btn-link no-color-link" ng-click="open()">
+	                <span tooltip-placement="left" tooltip-popup-delay="700" tooltip="Add Dataset">
+	                  <i class="icon-plus icon-2x"></i>
+	                </span>
+	              </button>
+	            </div>
+            </div>
+            <!-- Modal for dataset selection -->
+            <div modal="datasetSelect" close="close()" options="opts">
+              <div class="modal-header">
+                <h3>Dataset Select</h3>
+              </div>
+              <div class="modal-body">
+                <tabset>
+                  <tab ng-repeat="tab in templates" heading="{{tab.title}}" active="tab.active" disabled="tab.disabled">
+                    <div ng-include src="tab.url"></div>
+                  </tab>
+                  <li class="pull-right">Queued Datasets: {{datasetCount.length}}</li>
+                </tabset>
+              </div>
+              <div class="modal-footer">
+                <button class="btn btn-warning cancel" ng-click="close()">Close</button>
+              </div>
+            </div>
+            <!-- END - Modal for dataset selection -->
+            <div class="row-fluid">
+              <div class="span12">
+              <hr />
+              </div>
+            </div>
+          </div>
+          <!--Dataset display-->
+          <div ng-controller="DatasetDisplayCtrl" id="datasetDiv">
+              <div ng-repeat="dataset in datasets">
+                <div class="row-fluid">
+                  <!--Data section-->
+                  <div class="span8 offset1 muted">
+                    {{dataset.name}}
+                  </div>
+                  <div class="span1 offset2">
+                    <span tooltip-placement="left" tooltip-popup-delay="700" tooltip="Remove Dataset">  
+                      <a class="no-color-link" href="#" ng-click="removeDataset($index)">
+                        <i class="icon-remove"></i>
+                      </a>
+                    </span>
+                  </div>
+                </div>
+                <!--Time Values!-->
+                <div class="row-fluid">
+                  <!--Dataset Info Section-->
+                  <div class="span9">
+                    <div class="row-fluid">
+                      <div class="span2 offset1 text-center">Start:</div>
+                      <div class="span2">
+                        <div class="span2 text-center">{{dataset.timeVals.start | ISODateToMiddleEndian}}</div>
+                      </div>
+                      <div class="span2 text-center">End:</div>
+                      <div class="span2">
+                        <div class="span2 text-center">{{dataset.timeVals.end | ISODateToMiddleEndian}}</div>
+                      </div>
+                    </div>
+                    <!--Lat/Long Values!-->
+                    <div class="row-fluid">
+                      <div class="span2 offset1 text-center">North:</div>
+                      <div class="span2 text-center">
+                        {{dataset.latlonVals.latMax}}
+                      </div>
+                      <div class="span2 text-center">West:</div>
+                      <div class="span2 text-center">
+                        {{dataset.latlonVals.lonMin}}
+                      </div>
+                    </div>
+                    <div class="row-fluid">
+                      <div class="span2 offset1 text-center">South:</div>
+                      <div class="span2 text-center">
+                        {{dataset.latlonVals.latMin}}
+                      </div>
+                      <div class="span2 text-center">East:</div>
+                      <div class="span2 text-center">
+                        {{dataset.latlonVals.lonMax}}
+                      </div>
+                    </div>
+                  </div>
+                  <!--Preview Map Section-->
+                  <div class="span3">
+                    <!--If the dataset is global we show a picture of a globe instead of the actual map-->
+                    <div ng-hide="dataset.latlonVals.lonMin == -180 && dataset.latlonVals.lonMax == 180 && 
+                                  dataset.latlonVals.latMin == -90 && dataset.latlonVals.latMax == 90" 
+                                  preview-map="dataset" index="$index"></div>
+                    <div ng-show="dataset.latlonVals.lonMin == -180 && dataset.latlonVals.lonMax == 180 &&
+                                  dataset.latlonVals.latMin == -90 && dataset.latlonVals.latMax == 90">
+                      <img src="img/globe.png" class="preview-map">
+                    </div>
+                  </div>
+                </div>
+                <div class="row-fluid">
+                  <div class="span6 offset3"><hr /></div>
+                </div>
+              </div>
+            </div>
+        </div>
+        <div class="span6">
+          <!--Map-->
+          <div class="row-fluid"  ng-controller="WorldMapCtrl">
+            <div class="span12">
+              <leaflet-map id="map"></leaflet-map>
+            </div>
+          </div>
+          
+          <!--Timeline-->
+          <div class="row-fluid">
+            <div class="span12" ng-controller="TimelineCtrl">
+              <div class="timeline"></div>
+            </div>
+          </div>
+          
+          <div class="row-fluid">
+            <div class="span12" ng-controller="ParameterSelectCtrl">
+              <div class="row-fluid">
+                <div class="span2 text-center">Start Date:</div>
+                <div class="span4">
+                  <form>
+                    <!--This styling HAD to be done inline. Using a class wouldn't work and for some -->
+                    <!--reason the input boxes refused to be 100% wide when their span size was set.-->
+                    <input ng-disabled="shouldDisableControls()" on-blur="checkParameters();" ng-model="displayParams.start" ui-date="datepickerSettings" ui-date-format="yy-mm-dd" type="text" class="text-center span4" style="width:100%" />
+                  </form>
+                </div>
+                <div class="span2 text-center">End Date:</div>
+                <div class="span4">
+                  <form>
+                    <!--This styling HAD to be done inline. Using a class wouldn't work and for some -->
+                    <!--reason the input boxes refused to be 100% wide when their span size was set.-->
+                    <input ng-disabled="shouldDisableControls()" on-blur="checkParameters();" ng-model="displayParams.end" ui-date="datepickerSettings" ui-date-format="yy-mm-dd" type="text" class="text-center span4" style="width:100%"/>
+                  </form>
+                </div>
+              </div>
+              <div class="row-fluid">
+                <div class="span2 text-center">North:</div>
+                <div class="span4">
+                  <form action="">
+                    <input ng-disabled="shouldDisableControls()" ng-model="displayParams.latMax"  on-blur="checkParameters();" type="text" class="span4 text-center" style="width:100%"/>
+                  </form>
+                </div>
+                <div class="span2 text-center">South:</div>
+                <div class="span4">
+                  <form action="">
+                    <!--This styling HAD to be done inline. Using a class wouldn't work and for some -->
+                    <!--reason the input boxes refused to be 100% wide when their span size was set.-->
+                    <input ng-disabled="shouldDisableControls()" ng-model="displayParams.latMin" on-blur="checkParameters();" type="text" class="span4 text-center" style="width:100%"/>
+                  </form>
+                </div>
+              </div>
+              <div class="row-fluid">
+                <div class="span2 text-center">East:</div>
+                <div class="span4">
+                  <form>
+                    <!--This styling HAD to be done inline. Using a class wouldn't work and for some -->
+                    <!--reason the input boxes refused to be 100% wide when their span size was set.-->
+                    <input ng-disabled="shouldDisableControls()" ng-model="displayParams.lonMax" on-blur="checkParameters();" type="text" class="span4 text-center" style="width:100%"/>
+                  </form>
+                </div>
+                <div class="span2 text-center">West:</div>
+                <div class="span4">
+                  <form>
+                    <!--This styling HAD to be done inline. Using a class wouldn't work and for some -->
+                    <!--reason the input boxes refused to be 100% wide when their span size was set.-->
+                    <input ng-disabled="shouldDisableControls()" ng-model="displayParams.lonMin" on-blur="checkParameters();"; type="text" class="span4 text-center" style="width:100%"/>
+                  </form>
+                </div>
+              </div>
+              <div class="row-fluid">
+                <div class="span2 offset6">
+                  <button class="btn btn-link no-color-link pull-right" bootstrap-modal-open="evaluationSettings">
+                    <span tooltip-placement="left" tooltip-popup-delay="700" tooltip="Settings">
+                      <span class="icon-stack">
+                        <i class="icon-check-empty icon-stack-base"></i>
+                        <i class="icon-cogs"></i>
+                      </span>
+                    </span>
+                  </button>
+                </div>
+                <div class="span4">
+                  <button ng-click="runEvaluation()" ng-disabled="shouldDisableEvaluateButton()" class="btn btn-block btn-primary">
+                    <div ng-hide="runningEval">Evaluate</div>
+                    <div ng-show="runningEval"><i class="icon-spinner icon-spin"></i></div>
+                  </button>
+                </div>
+              </div>
+            </div>
+          </div>
+        </div>
+        </div>
+    </div>
+  </div>

Added: incubator/climate/trunk/ocw-ui/frontend/app/partials/modelSelect.html
URL: http://svn.apache.org/viewvc/incubator/climate/trunk/ocw-ui/frontend/app/partials/modelSelect.html?rev=1562255&view=auto
==============================================================================
--- incubator/climate/trunk/ocw-ui/frontend/app/partials/modelSelect.html (added)
+++ incubator/climate/trunk/ocw-ui/frontend/app/partials/modelSelect.html Tue Jan 28 22:18:16 2014
@@ -0,0 +1,86 @@
+<!--
+ ~ Licensed to the Apache Software Foundation (ASF) under one
+ ~ or more contributor license agreements.  See the NOTICE file
+ ~ distributed with this work for additional information
+ ~ regarding copyright ownership.  The ASF licenses this file
+ ~ to you under the Apache License, Version 2.0 (the
+ ~ "License"); you may not use this file except in compliance
+ ~ with the License.  You may obtain a copy of the License at
+ ~
+ ~    http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing,
+ ~ software distributed under the License is distributed on an
+ ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ ~ KIND, either express or implied.  See the License for the
+ ~ specific language governing permissions and limitations
+ ~ under the License.
+-->
+
+<div class="container">
+  <div class="row">
+    <div class="span10 offset1 columns">
+      <div class="row">
+        <div class="span10">
+          <center>
+            <form id="modelSelectorForm">
+              <input type="file" name="modelSelector">
+            </form>
+          </center>
+        </div>
+      </div>
+      <div class="row">
+        <div class="span10 offset2">
+          <form class="form-horizontal" id="parameterSelectorForm">
+            <div class="control-group">
+              <label class="control-label" for="paramSelect">Parameter Value</label>
+              <div class="controls">
+                <select id="paramSelect">
+                  <option ng-repeat="param in modelParameters">
+                    {{param.text}}
+                  </option>
+                </select>
+              </div>
+            </div>
+            <div class="control-group">
+              <label class="control-label" for="latSelect">Latitude Variable</label>
+              <div class="controls">
+                <select id="latSelect">
+                  <option ng-repeat="lat in latVariables">
+                    {{lat.text}}
+                  </option>
+                </select>
+              </div>
+            </div>
+            <div class="control-group">
+              <label class="control-label" for="lonSelect">Longitude Variable</label>
+              <div class"controls">
+                <select id="lonSelect">
+                  <option ng-repeat="lon in lonVariables">
+                    {{lon.text}}
+                  </option>
+                </select>
+              </div>
+            </div>
+            <div class="control-group">
+              <label class="control-label" for="dateTimeSelect">Date/Time Variable</label>
+              <div class="controls">
+                <select id="dateTimeSelect">
+                  <option ng-repeat="dateTime in dateTimeVariables">
+                    {{dateTime.text}}
+                  </option>
+                </select>
+              </div>
+            </div>
+            <div class="control-group">
+              <div class="controls">
+                <button type="submit" class="btn btn-warn">Cancel</button>
+                <button type="submit" class="btn">Add Model</button>
+              </div>
+            </div>
+          </form>
+        </div>
+      </div>
+    </div>
+  </div>
+</div>

Added: incubator/climate/trunk/ocw-ui/frontend/app/partials/results.detail.html
URL: http://svn.apache.org/viewvc/incubator/climate/trunk/ocw-ui/frontend/app/partials/results.detail.html?rev=1562255&view=auto
==============================================================================
--- incubator/climate/trunk/ocw-ui/frontend/app/partials/results.detail.html (added)
+++ incubator/climate/trunk/ocw-ui/frontend/app/partials/results.detail.html Tue Jan 28 22:18:16 2014
@@ -0,0 +1,11 @@
+<div>
+  <h2>{{result}}</h2>
+  <div class="row-fluid text-center">
+    <div class="{{alertClass}}">{{alertMessage}}</div>
+    <ul>
+      <li ng-repeat="figure in figures">
+        <img class="result-figures" ng-src="{{baseURL}}/static/evalResults{{figure}}" alt="" />
+      </li>
+    </ul>
+  </div>
+</div>

Added: incubator/climate/trunk/ocw-ui/frontend/app/partials/results.html
URL: http://svn.apache.org/viewvc/incubator/climate/trunk/ocw-ui/frontend/app/partials/results.html?rev=1562255&view=auto
==============================================================================
--- incubator/climate/trunk/ocw-ui/frontend/app/partials/results.html (added)
+++ incubator/climate/trunk/ocw-ui/frontend/app/partials/results.html Tue Jan 28 22:18:16 2014
@@ -0,0 +1,15 @@
+<div class="row">
+  <div class="span3">
+    <div id="results-sidebar" class="pa-sidebar well well-small">
+      <ul class="nav nav-list">
+        <li id="results-sidebar-header" class="nav-header">Latest Run Results</li>
+        <li ng-repeat="result in results"
+            ng-class="{ active: $state.includes('results.detail') && $stateParams.resultId == result }">
+          <a href="#/results/{{result.replace('/', '')}}" >{{result}}</a>
+        </li>
+      </ul>
+      <div ui-view="menu"></div>
+    </div>
+  </div>
+  <div class="span9" ui-view ng-animate="{enter:'fade-enter'}"></div>
+</div>

Added: incubator/climate/trunk/ocw-ui/frontend/app/partials/results.list.html
URL: http://svn.apache.org/viewvc/incubator/climate/trunk/ocw-ui/frontend/app/partials/results.list.html?rev=1562255&view=auto
==============================================================================
--- incubator/climate/trunk/ocw-ui/frontend/app/partials/results.list.html (added)
+++ incubator/climate/trunk/ocw-ui/frontend/app/partials/results.list.html Tue Jan 28 22:18:16 2014
@@ -0,0 +1,3 @@
+<h4>Select one of your previous runs. If none are displayed, please return
+  to the main page and start one!</h4>
+

Added: incubator/climate/trunk/ocw-ui/frontend/app/partials/selectObservation.html
URL: http://svn.apache.org/viewvc/incubator/climate/trunk/ocw-ui/frontend/app/partials/selectObservation.html?rev=1562255&view=auto
==============================================================================
--- incubator/climate/trunk/ocw-ui/frontend/app/partials/selectObservation.html (added)
+++ incubator/climate/trunk/ocw-ui/frontend/app/partials/selectObservation.html Tue Jan 28 22:18:16 2014
@@ -0,0 +1,58 @@
+<!--
+ ~ Licensed to the Apache Software Foundation (ASF) under one
+ ~ or more contributor license agreements.  See the NOTICE file
+ ~ distributed with this work for additional information
+ ~ regarding copyright ownership.  The ASF licenses this file
+ ~ to you under the Apache License, Version 2.0 (the
+ ~ "License"); you may not use this file except in compliance
+ ~ with the License.  You may obtain a copy of the License at
+ ~
+ ~    http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing,
+ ~ software distributed under the License is distributed on an
+ ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ ~ KIND, either express or implied.  See the License for the
+ ~ specific language governing permissions and limitations
+ ~ under the License.
+-->
+
+<div ng-controller="ObservationSelectCtrl">
+  <form class="form-inline" autocomplete="off">
+    <input id="observationFileInput" predictive-file-browser-input ng-model="filePathInput" type="text" class="input-xlarge" autocomplete="off" />
+    <button class="btn" ng-click="uploadLocalFile()" ng-disabled="shouldDisableLoadButton()">
+      <div ng-hide="loadingFile">Parse File</div>
+      <div ng-show="loadingFile"><i class="icon-spinner icon-spin"></i></div>
+    </button>
+  </form>
+
+  <div class="row">
+    <div class="span2 text-center">
+      Evaluation Variable
+    </div>
+    <div class="span3">
+      <select ng-model="paramSelect" ng-options="param for param in params"></select>
+    </div>
+    <div class="span2 text-center">
+      Latitude Variable
+    </div>
+    <div class="span3">
+      <select ng-model="latsSelect" ng-options="lat for lat in lats"></select>
+    </div>
+    <div class="span2 text-center">
+      Longitude Variable
+    </div>
+    <div class="span3">
+      <select ng-model="lonsSelect" ng-options="lon for lon in lons"></select>
+    </div>
+    <div class="span2 text-center">
+      Date/Time Variable
+    </div>
+    <div class="span3">
+      <select ng-model="timeSelect" ng-options="time for time in times"></select>
+    </div>
+  </div>
+
+  <button class="btn btn-primary pull-left" ng-click="addDataSet()">Add Dataset</button>
+  <div class="pull-left small-alert" ng-show="fileAdded">Successfully added dataset...</div>
+</div>
\ No newline at end of file

Added: incubator/climate/trunk/ocw-ui/frontend/app/partials/selectRcmed.html
URL: http://svn.apache.org/viewvc/incubator/climate/trunk/ocw-ui/frontend/app/partials/selectRcmed.html?rev=1562255&view=auto
==============================================================================
--- incubator/climate/trunk/ocw-ui/frontend/app/partials/selectRcmed.html (added)
+++ incubator/climate/trunk/ocw-ui/frontend/app/partials/selectRcmed.html Tue Jan 28 22:18:16 2014
@@ -0,0 +1,44 @@
+<!--
+ ~ Licensed to the Apache Software Foundation (ASF) under one
+ ~ or more contributor license agreements.  See the NOTICE file
+ ~ distributed with this work for additional information
+ ~ regarding copyright ownership.  The ASF licenses this file
+ ~ to you under the Apache License, Version 2.0 (the
+ ~ "License"); you may not use this file except in compliance
+ ~ with the License.  You may obtain a copy of the License at
+ ~
+ ~    http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing,
+ ~ software distributed under the License is distributed on an
+ ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ ~ KIND, either express or implied.  See the License for the
+ ~ specific language governing permissions and limitations
+ ~ under the License.
+-->
+
+<div ng-controller="RcmedSelectionCtrl">
+  <div class="row">
+    <div class="span5">
+    Select the RCMED dataset that you would like use.
+    </div>
+  </div>
+  <div class="row">
+    <div class="span4">
+      <select ng-change="dataSelectUpdated()" class="span5" ng-model="datasetSelection" ng-options="obs as obs.longname for obs in availableObs"></select>
+    </div>
+  </div>
+  <div class="row">
+    <div class="span5">
+    Select the dataset parameter that you would like to test.
+    </div>
+  </div>
+  <div class="row">
+    <div class="span4">
+      <select class="span3" ng-model="parameterSelection" ng-options="param as param.shortname for param in retrievedObsParams"></select>
+    </div>
+  </div>
+
+  <button class="btn btn-primary pull-left" ng-click="addObservation()">Add Observation</button>
+  <div class="pull-left small-alert" ng-show="fileAdded">Successfully added dataset...</div>
+</div>
\ No newline at end of file

Added: incubator/climate/trunk/ocw-ui/frontend/config/karma-e2e.conf.js
URL: http://svn.apache.org/viewvc/incubator/climate/trunk/ocw-ui/frontend/config/karma-e2e.conf.js?rev=1562255&view=auto
==============================================================================
--- incubator/climate/trunk/ocw-ui/frontend/config/karma-e2e.conf.js (added)
+++ incubator/climate/trunk/ocw-ui/frontend/config/karma-e2e.conf.js Tue Jan 28 22:18:16 2014
@@ -0,0 +1,40 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+**/
+basePath = '../';
+
+files = [
+  ANGULAR_SCENARIO,
+  ANGULAR_SCENARIO_ADAPTER,
+  'test/e2e/**/*.js'
+];
+
+autoWatch = false;
+
+browsers = ['Chrome'];
+
+singleRun = true;
+
+proxies = {
+  '/': 'http://localhost:8000/'
+};
+
+junitReporter = {
+  outputFile: 'test_out/e2e.xml',
+  suite: 'e2e'
+};

Propchange: incubator/climate/trunk/ocw-ui/frontend/config/karma-e2e.conf.js
------------------------------------------------------------------------------
    svn:executable = *

Added: incubator/climate/trunk/ocw-ui/frontend/config/karma.conf.js
URL: http://svn.apache.org/viewvc/incubator/climate/trunk/ocw-ui/frontend/config/karma.conf.js?rev=1562255&view=auto
==============================================================================
--- incubator/climate/trunk/ocw-ui/frontend/config/karma.conf.js (added)
+++ incubator/climate/trunk/ocw-ui/frontend/config/karma.conf.js Tue Jan 28 22:18:16 2014
@@ -0,0 +1,48 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+**/
+basePath = '../';
+
+files = [
+  JASMINE,
+  JASMINE_ADAPTER,
+  'app/js/lib/jquery/jquery-1.10.1.js',
+  'app/js/lib/jquery/jquery-ui/jquery-ui-1.10.3.min.js',
+  'app/js/lib/bootstrap/bootstrap.js',
+  'app/js/lib/angular/angular.js',
+  'app/js/lib/angular/angular-*.js',
+  'app/js/lib/angular-ui/*.js',
+  'test/lib/angular/angular-mocks.js',
+  'app/js/lib/jquery/jquery-ui/datepicker-wrapper/date.js',
+  'app/js/lib/leaflet/leaflet-0.5.js',
+  'app/js/app.js',
+  'app/js/controllers/*.js',
+  'app/js/directives/*.js',
+  'app/js/services/*.js',
+  'app/js/filters/*.js',
+  'test/unit/**/*.js'
+];
+
+autoWatch = true;
+
+browsers = ['Chrome'];
+
+junitReporter = {
+  outputFile: 'test_out/unit.xml',
+  suite: 'unit'
+};

Propchange: incubator/climate/trunk/ocw-ui/frontend/config/karma.conf.js
------------------------------------------------------------------------------
    svn:executable = *

Added: incubator/climate/trunk/ocw-ui/frontend/scripts/e2e-test.sh
URL: http://svn.apache.org/viewvc/incubator/climate/trunk/ocw-ui/frontend/scripts/e2e-test.sh?rev=1562255&view=auto
==============================================================================
--- incubator/climate/trunk/ocw-ui/frontend/scripts/e2e-test.sh (added)
+++ incubator/climate/trunk/ocw-ui/frontend/scripts/e2e-test.sh Tue Jan 28 22:18:16 2014
@@ -0,0 +1,27 @@
+#!/bin/bash
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#    http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+BASE_DIR=`dirname $0`
+
+echo ""
+echo "Starting Karma Server"
+echo "-------------------------------------------------------------------"
+
+karma start $BASE_DIR/../config/karma-e2e.conf.js $*

Propchange: incubator/climate/trunk/ocw-ui/frontend/scripts/e2e-test.sh
------------------------------------------------------------------------------
    svn:executable = *

Added: incubator/climate/trunk/ocw-ui/frontend/scripts/test.sh
URL: http://svn.apache.org/viewvc/incubator/climate/trunk/ocw-ui/frontend/scripts/test.sh?rev=1562255&view=auto
==============================================================================
--- incubator/climate/trunk/ocw-ui/frontend/scripts/test.sh (added)
+++ incubator/climate/trunk/ocw-ui/frontend/scripts/test.sh Tue Jan 28 22:18:16 2014
@@ -0,0 +1,27 @@
+#!/bin/bash
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#    http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+BASE_DIR=`dirname $0`
+
+echo ""
+echo "Starting Karma Server"
+echo "-------------------------------------------------------------------"
+
+karma start $BASE_DIR/../config/karma.conf.js $*

Propchange: incubator/climate/trunk/ocw-ui/frontend/scripts/test.sh
------------------------------------------------------------------------------
    svn:executable = *

Added: incubator/climate/trunk/ocw-ui/frontend/scripts/web-server.js
URL: http://svn.apache.org/viewvc/incubator/climate/trunk/ocw-ui/frontend/scripts/web-server.js?rev=1562255&view=auto
==============================================================================
--- incubator/climate/trunk/ocw-ui/frontend/scripts/web-server.js (added)
+++ incubator/climate/trunk/ocw-ui/frontend/scripts/web-server.js Tue Jan 28 22:18:16 2014
@@ -0,0 +1,313 @@
+#!/usr/bin/env node
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+**/
+
+var util = require('util'),
+    http = require('http'),
+    fs = require('fs'),
+    url = require('url'),
+    events = require('events');
+
+var DEFAULT_PORT = 8000;
+
+function main(argv) {
+  new HttpServer({
+    'GET': createServlet(StaticServlet),
+    'HEAD': createServlet(StaticServlet)
+  }).start(Number(argv[2]) || DEFAULT_PORT);
+}
+
+function escapeHtml(value) {
+  return value.toString().
+    replace('<', '&lt;').
+    replace('>', '&gt;').
+    replace('"', '&quot;');
+}
+
+function createServlet(Class) {
+  var servlet = new Class();
+  return servlet.handleRequest.bind(servlet);
+}
+
+/**
+ * An Http server implementation that uses a map of methods to decide
+ * action routing.
+ *
+ * @param {Object} Map of method => Handler function
+ */
+function HttpServer(handlers) {
+  this.handlers = handlers;
+  this.server = http.createServer(this.handleRequest_.bind(this));
+}
+
+HttpServer.prototype.start = function(port) {
+  this.port = port;
+  this.server.listen(port);
+  util.puts('Http Server running at http://localhost:' + port + '/');
+};
+
+HttpServer.prototype.parseUrl_ = function(urlString) {
+  var parsed = url.parse(urlString);
+  parsed.pathname = url.resolve('/', parsed.pathname);
+  return url.parse(url.format(parsed), true);
+};
+
+HttpServer.prototype.handleRequest_ = function(req, res) {
+  var logEntry = req.method + ' ' + req.url;
+  if (req.headers['user-agent']) {
+    logEntry += ' ' + req.headers['user-agent'];
+  }
+  util.puts(logEntry);
+  req.url = this.parseUrl_(req.url);
+  var handler = this.handlers[req.method];
+  if (!handler) {
+    res.writeHead(501);
+    res.end();
+  } else {
+    handler.call(this, req, res);
+  }
+};
+
+/**
+ * Handles static content.
+ */
+function StaticServlet() {}
+
+StaticServlet.MimeMap = {
+  'txt': 'text/plain',
+  'html': 'text/html',
+  'css': 'text/css',
+  'xml': 'application/xml',
+  'json': 'application/json',
+  'js': 'application/javascript',
+  'jpg': 'image/jpeg',
+  'jpeg': 'image/jpeg',
+  'gif': 'image/gif',
+  'png': 'image/png',
+  'svg': 'image/svg+xml'
+};
+
+StaticServlet.prototype.handleRequest = function(req, res) {
+  var self = this;
+  var path = ('./' + req.url.pathname).replace('//','/').replace(/%(..)/g, function(match, hex){
+    return String.fromCharCode(parseInt(hex, 16));
+  });
+  var parts = path.split('/');
+  if (parts[parts.length-1].charAt(0) === '.')
+    return self.sendForbidden_(req, res, path);
+  if (~path.indexOf("dirlist"))
+    return self.getDirList_(req, res, path);
+  fs.stat(path, function(err, stat) {
+    if (err)
+      return self.sendMissing_(req, res, path);
+    if (stat.isDirectory())
+      return self.sendDirectory_(req, res, path);
+    return self.sendFile_(req, res, path);
+  });
+}
+
+StaticServlet.prototype.sendError_ = function(req, res, error) {
+  res.writeHead(500, {
+      'Content-Type': 'text/html'
+  });
+  res.write('<!doctype html>\n');
+  res.write('<title>Internal Server Error</title>\n');
+  res.write('<h1>Internal Server Error</h1>');
+  res.write('<pre>' + escapeHtml(util.inspect(error)) + '</pre>');
+  util.puts('500 Internal Server Error');
+  util.puts(util.inspect(error));
+};
+
+StaticServlet.prototype.sendMissing_ = function(req, res, path) {
+  path = path.substring(1);
+  res.writeHead(404, {
+      'Content-Type': 'text/html'
+  });
+  res.write('<!doctype html>\n');
+  res.write('<title>404 Not Found</title>\n');
+  res.write('<h1>Not Found</h1>');
+  res.write(
+    '<p>The requested URL ' +
+    escapeHtml(path) +
+    ' was not found on this server.</p>'
+  );
+  res.end();
+  util.puts('404 Not Found: ' + path);
+};
+
+StaticServlet.prototype.sendForbidden_ = function(req, res, path) {
+  path = path.substring(1);
+  res.writeHead(403, {
+      'Content-Type': 'text/html'
+  });
+  res.write('<!doctype html>\n');
+  res.write('<title>403 Forbidden</title>\n');
+  res.write('<h1>Forbidden</h1>');
+  res.write(
+    '<p>You do not have permission to access ' +
+    escapeHtml(path) + ' on this server.</p>'
+  );
+  res.end();
+  util.puts('403 Forbidden: ' + path);
+};
+
+StaticServlet.prototype.sendRedirect_ = function(req, res, redirectUrl) {
+  res.writeHead(301, {
+      'Content-Type': 'text/html',
+      'Location': redirectUrl
+  });
+  res.write('<!doctype html>\n');
+  res.write('<title>301 Moved Permanently</title>\n');
+  res.write('<h1>Moved Permanently</h1>');
+  res.write(
+    '<p>The document has moved <a href="' +
+    redirectUrl +
+    '">here</a>.</p>'
+  );
+  res.end();
+  util.puts('301 Moved Permanently: ' + redirectUrl);
+};
+
+StaticServlet.prototype.getDirList_ = function(req, res, path) {
+  res.writeHead(200, {
+	'Content-Type': 'json'
+  });
+
+  // Grab the passed path value
+  var pathQuery = url.parse(req.url, true).query.path
+  // Using the supplied path, grab directory information
+  var dirList = fs.readdirSync(pathQuery);
+
+  // Filter out any hidden files or current/previous directory references
+  dirList = dirList.filter(function(item, index, array) {
+	return (item[0] !== ".");
+  });
+  
+  // Generate the full path names for all the items found when 'ls'-ing 
+  // the passed directory.
+  dirList = dirList.map(function(item, index, array) {
+    var temp = item; 
+
+	// Make sure the path is joined properly. Sometimes there will be a trailing
+	// '/' in the path and sometimes there won't. Don't want to end up with '//'.
+    if (pathQuery[pathQuery.length - 1] === "/") {
+      temp = pathQuery + item;
+    } else {
+  	  temp = pathQuery + "/" + item;
+    }
+  
+	// We want the directories that are found to have a trailing '/'. Let's make sure
+	// that we do that!
+    var ret = temp;
+    if (fs.existsSync(temp + "/")) {
+     ret = temp + "/";
+    }  
+
+    return ret;
+  });
+  
+  // Sort all the results alphabetically ignoring case.
+  dirList = dirList.sort(function(a, b) {
+    if (a.toLowerCase() < b.toLowerCase()) return -1;
+    if (a.toLowerCase() > b.toLowerCase()) return 1;
+    return 0;
+  });
+
+  res.write(JSON.stringify(dirList));
+  res.end();
+}
+
+StaticServlet.prototype.sendFile_ = function(req, res, path) {
+  var self = this;
+  var file = fs.createReadStream(path);
+  res.writeHead(200, {
+    'Content-Type': StaticServlet.
+      MimeMap[path.split('.').pop()] || 'text/plain'
+  });
+  if (req.method === 'HEAD') {
+    res.end();
+  } else {
+    file.on('data', res.write.bind(res));
+    file.on('close', function() {
+      res.end();
+    });
+    file.on('error', function(error) {
+      self.sendError_(req, res, error);
+    });
+  }
+};
+
+StaticServlet.prototype.sendDirectory_ = function(req, res, path) {
+  var self = this;
+  if (path.match(/[^\/]$/)) {
+    req.url.pathname += '/';
+    var redirectUrl = url.format(url.parse(url.format(req.url)));
+    return self.sendRedirect_(req, res, redirectUrl);
+  }
+  fs.readdir(path, function(err, files) {
+    if (err)
+      return self.sendError_(req, res, error);
+
+    if (!files.length)
+      return self.writeDirectoryIndex_(req, res, path, []);
+
+    var remaining = files.length;
+    files.forEach(function(fileName, index) {
+      fs.stat(path + '/' + fileName, function(err, stat) {
+        if (err)
+          return self.sendError_(req, res, err);
+        if (stat.isDirectory()) {
+          files[index] = fileName + '/';
+        }
+        if (!(--remaining))
+          return self.writeDirectoryIndex_(req, res, path, files);
+      });
+    });
+  });
+};
+
+StaticServlet.prototype.writeDirectoryIndex_ = function(req, res, path, files) {
+  path = path.substring(1);
+  res.writeHead(200, {
+    'Content-Type': 'text/html'
+  });
+  if (req.method === 'HEAD') {
+    res.end();
+    return;
+  }
+  res.write('<!doctype html>\n');
+  res.write('<title>' + escapeHtml(path) + '</title>\n');
+  res.write('<style>\n');
+  res.write('  ol { list-style-type: none; font-size: 1.2em; }\n');
+  res.write('</style>\n');
+  res.write('<h1>Directory: ' + escapeHtml(path) + '</h1>');
+  res.write('<ol>');
+  files.forEach(function(fileName) {
+    if (fileName.charAt(0) !== '.') {
+      res.write('<li><a href="' +
+        escapeHtml(fileName) + '">' +
+        escapeHtml(fileName) + '</a></li>');
+    }
+  });
+  res.write('</ol>');
+  res.end();
+};
+
+// Must be last,
+main(process.argv);

Propchange: incubator/climate/trunk/ocw-ui/frontend/scripts/web-server.js
------------------------------------------------------------------------------
    svn:executable = *

Added: incubator/climate/trunk/ocw-ui/frontend/test/e2e/runner.html
URL: http://svn.apache.org/viewvc/incubator/climate/trunk/ocw-ui/frontend/test/e2e/runner.html?rev=1562255&view=auto
==============================================================================
--- incubator/climate/trunk/ocw-ui/frontend/test/e2e/runner.html (added)
+++ incubator/climate/trunk/ocw-ui/frontend/test/e2e/runner.html Tue Jan 28 22:18:16 2014
@@ -0,0 +1,28 @@
+<!--
+ ~ Licensed to the Apache Software Foundation (ASF) under one
+ ~ or more contributor license agreements.  See the NOTICE file
+ ~ distributed with this work for additional information
+ ~ regarding copyright ownership.  The ASF licenses this file
+ ~ to you under the Apache License, Version 2.0 (the
+ ~ "License"); you may not use this file except in compliance
+ ~ with the License.  You may obtain a copy of the License at
+ ~
+ ~    http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing,
+ ~ software distributed under the License is distributed on an
+ ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ ~ KIND, either express or implied.  See the License for the
+ ~ specific language governing permissions and limitations
+ ~ under the License.
+ -->
+<!doctype html>
+<html lang="en">
+  <head>
+    <title>End2end Test Runner</title>
+    <script src="../lib/angular/angular-scenario.js" ng-autotest></script>
+    <script src="scenarios.js"></script>
+  </head>
+  <body>
+  </body>
+</html>

Propchange: incubator/climate/trunk/ocw-ui/frontend/test/e2e/runner.html
------------------------------------------------------------------------------
    svn:executable = *

Added: incubator/climate/trunk/ocw-ui/frontend/test/e2e/scenarios.js
URL: http://svn.apache.org/viewvc/incubator/climate/trunk/ocw-ui/frontend/test/e2e/scenarios.js?rev=1562255&view=auto
==============================================================================
--- incubator/climate/trunk/ocw-ui/frontend/test/e2e/scenarios.js (added)
+++ incubator/climate/trunk/ocw-ui/frontend/test/e2e/scenarios.js Tue Jan 28 22:18:16 2014
@@ -0,0 +1,63 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+**/
+'use strict';
+
+/* http://docs.angularjs.org/guide/dev_guide.e2e-testing */
+
+describe('my app', function() {
+
+  beforeEach(function() {
+    browser().navigateTo('../../app/index.html');
+  });
+
+
+  it('should automatically redirect to /view1 when location hash/fragment is empty', function() {
+    expect(browser().location().url()).toBe("/view1");
+  });
+
+
+  describe('view1', function() {
+
+    beforeEach(function() {
+      browser().navigateTo('#/view1');
+    });
+
+
+    it('should render view1 when user navigates to /view1', function() {
+      expect(element('[ng-view] p:first').text()).
+        toMatch(/partial for view 1/);
+    });
+
+  });
+
+
+  describe('view2', function() {
+
+    beforeEach(function() {
+      browser().navigateTo('#/view2');
+    });
+
+
+    it('should render view2 when user navigates to /view2', function() {
+      expect(element('[ng-view] p:first').text()).
+        toMatch(/partial for view 2/);
+    });
+
+  });
+});

Propchange: incubator/climate/trunk/ocw-ui/frontend/test/e2e/scenarios.js
------------------------------------------------------------------------------
    svn:executable = *



Mime
View raw message