Changeset 5671 for cowsclient


Ignore:
Timestamp:
27/08/09 16:13:25 (10 years ago)
Author:
pnorton
Message:

Added the YUI 2.7.0 library to the repository.

Added a combobox to the wcs download page that displays some pre-entered wcs url's.

Also improved the LegendContainer? so that it now uses the url provided in the capabilities response.

Location:
cowsclient/trunk
Files:
461 added
8 edited

Legend:

Unmodified
Added
Removed
  • cowsclient/trunk/cowsclient/controllers/wcsdown.py

    r5668 r5671  
    1111 
    1212import paste 
    13 import simplejson as json 
    1413 
    1514from cowsclient.lib.base import BaseController, g, response, config, request, c, session, render 
     
    1817 
    1918from cowsclient.lib.wmc_util import proxyFix, resetProxy 
    20  
     19import cowsclient.lib.utils as utils 
    2120from cowsclient.model.date_time_options import DateTimeOptionsBuilder 
    2221  
     
    3433        params = self._getParams() 
    3534 
     35        #get the list of default WCS endpoints 
     36        c.defaultWCSEndpoints =  utils.toJSON(utils.readEndpoints().get('WCS',None)) 
    3637         
    3738        log.debug("params = %s" % (params,)) 
     
    6869            builder = DateTimeOptionsBuilder(timepositions) 
    6970            options = builder.buildOptions() 
    70             log.debug("options = %s" % (options,)) 
    71             c.timedata = json.dumps(options).replace('"', '\\"')  
     71            #log.debug("options = %s" % (options,)) 
     72            c.timedata = utils.toJSON(options)  
    7273             
    7374        c.crs = crs 
  • cowsclient/trunk/cowsclient/controllers/wmsviz.py

    r5626 r5671  
    2121import urlparse 
    2222from cStringIO import StringIO 
     23 
    2324try: 
    2425    from PIL import Image, ImageChops 
    2526except: 
    2627    import Image, ImageChops 
     28     
    2729import logging 
    2830log = logging.getLogger(__name__) 
  • cowsclient/trunk/cowsclient/public/js/capabilities.js

    r5626 r5671  
    9797        var reqs = this._getRequestsFromNode(standardReqs); 
    9898        var extendedReqs = WMSC.traverseWMSDom(this.dom, ['Capability', '_ExtendedCapabilities', 'Request']); 
    99         reqs = reqs.concat(this._getRequestsFromNode(extendedReqs)); 
     99        if (extendedReqs != null) { 
     100            reqs = reqs.concat(this._getRequestsFromNode(extendedReqs)); 
     101        } 
    100102        return reqs; 
    101103    }, 
  • cowsclient/trunk/cowsclient/public/js/layerInformation.js

    r5645 r5671  
    198198                                     'click', this._onGetFigureClick, this); 
    199199         
    200         WMSC.log("this._getFigureHandler = " + this._getFigureHandler); 
    201200        div.appendChild(this._getFigureButton); 
    202201        return div; 
  • cowsclient/trunk/cowsclient/public/js/legendContainer.js

    r5626 r5671  
    66                        this.legendDiv = document.getElementById(legendDivId); 
    77                        this.legendRetriever = new LegendRetriever(); 
    8                         this.currentWMCLayer = null; 
    9                         this.currentOLLayer = null; 
    108                }, 
    119 
     
    2422             */ 
    2523            onLayerChanged: function(e) { 
    26                   
    27             this.clearLegend(); 
    28              
    29             this.currentWMCLayer = e.wmcLayer; 
    30             this.currentOLLayer = e.olLayer; 
    31              
    32             if (this.currentWMCLayer != null && this.currentOLLayer != null) { 
    33                 var style = this.currentOLLayer.params['STYLES']; 
    34  
    35                 var url = this.currentWMCLayer.getLegendURL(style); 
    36                 if (url != null) { 
    37                          
    38                         //!TODO:  Should use the retieved url, not re-make it 
    39                         url = this.currentOLLayer.getFullRequestString({ 
    40                                         REQUEST: 'GetLegend', 
    41                         }); 
    42                          
    43                         this.loadNewLegend(url); 
    44                 } 
    45             } 
     24            this.setLegendForLayer(e.olLayer, e.wmcLayer); 
    4625            }, 
    4726             
     
    5130             */ 
    5231            onLayerPropertyChanged: function(e) { 
    53                  
    54                 if (e.layer == null) { 
    55                          
    56                         this.clearLegend(); 
    57                          
    58                 } else { 
    59                         var url = e.layer.getFullRequestString({ 
    60                                         REQUEST: 'GetLegend', 
    61                         }); 
    62                          
    63                         this.loadNewLegend(url); 
    64  
    65                 } 
     32                this.setLegendForLayer(e.layer, e.wmcLayer); 
    6633                }, 
     34                 
     35                 
     36                setLegendForLayer: function(olLayer, wmcLayer) { 
     37                     
     38                    var legendLoaded = false; 
     39                     
     40                    if (wmcLayer != null && olLayer != null) { 
     41                 
     42                var style = olLayer.params['STYLES']; 
     43                var url = wmcLayer.getLegendURL(style); 
     44                 
     45                WMSC.log("Legend url = " + url); 
     46                 
     47                if (url != null) { 
     48                     
     49                    // add the current openlayers layer parameters 
     50                    // to the GetLegend url 
     51                    url = addParamsToUrl(url, olLayer.params) 
     52                                     
     53                    this.loadNewLegend(url); 
     54                     
     55                    legendLoaded = true; 
     56                } 
     57            } 
     58                     
     59                    if (legendLoaded == false) { 
     60                        this.clearLegend(); 
     61                    } 
     62                }, 
     63                 
    6764                 
    6865                /** 
     
    7269                 */ 
    7370                loadNewLegend: function(url) { 
    74                 var onSuccessFn = this.setLegend.bindAsEventListener(this) 
     71                                 
     72            WMSC.log("getting legend url = " + url); 
     73             
     74                    var onSuccessFn = this.setLegend.bindAsEventListener(this) 
    7575                this.legendRetriever.getLegend(url, onSuccessFn)                         
    7676                }, 
     
    8181                 */ 
    8282                setLegend: function (xhr) { 
    83 //                      WMSC.log("setting legend at" +new Date()); 
     83                        WMSC.log("setting legend at" +new Date()); 
    8484                this.legendDiv.innerHTML = ''; 
    8585                var legendHTML =xhr.responseText; 
  • cowsclient/trunk/cowsclient/public/js/utils.js

    r5668 r5671  
    147147    return input; 
    148148}; 
     149 
     150/** 
     151 * Adds the yahoo YUI components to an input, span and div element to create a 
     152 * combobox. The element should be layed out like: 
     153 *  
     154 *  <container element> 
     155 *    <input id="inputId" type="text" ><//input> <span id="toggleId"><//span> 
     156 *      <div id="optionsContainerId"><//div> 
     157 *  </container element> 
     158 *  
     159 * @param {String} inputId the id of the input box to be used 
     160 * @param {String} toggleId the id of the element to be used as a button 
     161 * @param {String} optionsContainerId the id of the div to contain the options 
     162 * @param {Array}  the options for the combobox 
     163 * @param {function} [changeHandler] on text changed event handler 
     164 */ 
     165makeCombobox = function(inputId, toggleId, optionsContainerId, dataList, changeHandler ) { 
     166 
     167    // Instantiate AutoCompletes 
     168    var oConfigs = { 
     169        prehighlightClassName: "yui-ac-prehighlight", 
     170        useShadow: true, 
     171        queryDelay: 0, 
     172        minQueryLength: 0, 
     173        animVert: .01 
     174    } 
     175 
     176    var DS = new YAHOO.util.LocalDataSource(dataList); 
     177     
     178    var AC = new YAHOO.widget.AutoComplete(inputId, optionsContainerId, DS, oConfigs); 
     179     
     180    if (changeHandler != null) { 
     181        AC.textboxChangeEvent.subscribe(changeHandler); 
     182    } 
     183     
     184    var lToggler = document.getElementById(toggleId); 
     185    var oPushButtonL = new YAHOO.widget.Button({container:lToggler}); 
     186    var toggleL = function(e) { 
     187        YAHOO.util.Event.stopEvent(e); 
     188        if(!YAHOO.util.Dom.hasClass(lToggler, "open")) { 
     189            YAHOO.util.Dom.addClass(lToggler, "open") 
     190        } 
     191 
     192        // Is open 
     193        if(AC.isContainerOpen()) { 
     194            AC.collapseContainer(); 
     195        } 
     196        // Is closed 
     197        else { 
     198            AC.getInputEl().focus(); // Needed to keep widget active 
     199            setTimeout(function() { // For IE 
     200                AC.sendQuery(""); 
     201            },0); 
     202        } 
     203    } 
     204    //oPushButtonL.on("click", toggleL); 
     205    oPushButtonL.on("mousedown", toggleL); 
     206    AC.containerCollapseEvent.subscribe(function(){YAHOO.util.Dom.removeClass(lToggler, "open")}); 
     207 
     208}; 
     209 
     210/** 
     211 * Adds additional parameters onto the end of a url string, if the string already 
     212 * has a parameter with the same name set, the additional parameter is ignored. 
     213 *  
     214 * @param {String} url The url to add the parameters to 
     215 * @param {Object} params An object whos attributes correspond to the params to  
     216 *      be added, so that params[paramName] = paramValue. 
     217 */ 
     218addParamsToUrl = function(url, params) { 
     219     
     220     
     221     
     222    // build a list of uppercase params already on the url 
     223    var urlParams = getParamsFromURL(url); 
     224 
     225    existingParams = [] 
     226    for (pName in urlParams){ 
     227        existingParams.push(pName.toUpperCase()); 
     228    } 
     229     
     230    //check the existing params to see if we will be adding the first param 
     231    var first = true; 
     232    if (existingParams.length > 0) { 
     233        first = false; 
     234    } 
     235     
     236    var paramsStr = ""; 
     237    for (var p in params) { 
     238         
     239        // if the paramer is already on the list then ignore it 
     240        if ( isValueInList(p.toUpperCase(), existingParams) ) { 
     241            continue; 
     242        } 
     243         
     244        // build up a string of the new parameters  
     245        if (first == true) { 
     246            paramsStr += "?"; 
     247            first = false; 
     248        } 
     249        else { 
     250            paramsStr += "&"; 
     251        } 
     252         
     253        paramsStr += p + "=" + params[p];     
     254    } 
     255     
     256    return url + paramsStr; 
     257}; 
     258 
     259/** 
     260 * finds out if a list contains a particular value 
     261 *  
     262 * @param {javascript primative} value The javascript primative object to search for 
     263 * @param {Array} list The list of values to search 
     264 * @returns bool indicating if the value was found 
     265 */ 
     266isValueInList = function(value, list) { 
     267    var included = false; 
     268     
     269    for (var i=0; i<list.length; i++) { 
     270        if (value == list[i]) { 
     271            included = true; 
     272            break; 
     273        } 
     274    }     
     275     
     276    return included; 
     277}; 
     278 
     279 
     280/** 
     281 * Gets the parameters form a given url. 
     282 *  
     283 * @param {String} url The url to retrive the parameters from 
     284 * @returns An object where the attributes correspond to the parameters found 
     285 *      (like a dictionary, obj[paramName] = paramValue) 
     286 */ 
     287getParamsFromURL = function(url) { 
     288    var params = {}; 
     289    if (url.indexOf('?') > 0) { 
     290        var paramsStr = url.substr(url.indexOf('?') + 1); 
     291         
     292        for (var i=0; i<2000;i++){ 
     293             
     294            var pName = paramsStr.substring(0, paramsStr.indexOf('=')); 
     295            var pValue = paramsStr.substring(paramsStr.indexOf('=') + 1, paramsStr.indexOf('&')); 
     296            params[pName] = pValue; 
     297             
     298            if (paramsStr.indexOf('&') < 0) { break; } 
     299             
     300            paramsStr = paramsStr.substr(paramsStr.indexOf('&') + 1); 
     301        } 
     302    } 
     303     
     304    return params; 
     305} 
  • cowsclient/trunk/cowsclient/public/test/utils_test.html

    r5626 r5671  
    44 
    55    <script src="../js/utils.js"></script> 
     6         
     7    <script type="text/javascript"> 
    68 
     9        function init() { 
    710     
    8     <script defer="defer" type="text/javascript"> 
    9  
    10     function init() { 
    11  
    12                 console.log("started at" +new Date()); 
    13  
    14                 var form = document.getElementById('a_form'); 
    15  
    16  
    17                 descList = ['a','b','c','d','e']; 
    18                 valList = ['1','2','3','4','5',]; 
    19                  
    20                 var sb = buildSelectBox('test', descList, valList, '2'); 
    21                 form.appendChild(sb); 
    22  
    23         console.log("Finished."); 
    24          
    25         } 
    26  
    27    
     11                console.log("started at" +new Date()); 
     12     
     13                var form = document.getElementById('a_form'); 
     14     
     15                descList = ['a','b','c','d','e']; 
     16                valList = ['1','2','3','4','5',]; 
     17                 
     18                var sb = buildSelectBox('test', descList, valList, '2'); 
     19                form.appendChild(sb); 
     20     
     21            //testing the addParamsToUrl 
     22             
     23            var url = document.getElementById('original_url').textContent; 
     24             
     25            var paramsStr = document.getElementById('params').textContent; 
     26            var items = paramsStr.split(','); 
     27            var params = {}; 
     28            for (var i=0; i<items.length; i++) { 
     29                var parts = items[i].split('_'); 
     30                params[parts[0]] = parts[1]; 
     31            } 
     32     
     33            document.getElementById('new_url').innerHTML = addParamsToUrl(url, params); 
     34             
     35            console.log("Finished."); 
     36             
     37        } 
     38     
     39       
    2840     
    2941    </script> 
     
    3547        </form> 
    3648     
     49    Original URL : <span id="original_url">http://labs.metacarta.com/wms?version=1.1.1&service=WMS&request=GetLegendGraphic&layer=coastline_01&format=image/png</span> <br /> 
     50    Params : <span id="params">FORMAT_image/png,VERSION_1.3.0,CRS_CRS:84,TRANSPARENT_true,SERVICE_WMS,REQUEST_GetMap,STYLES_,EXCEPTIONS_application/vnd.ogc.se_inimage_LAYERS_coastline_02,SRS_EPSG:4326</span> <br /> 
     51    New URL : <span id="new_url"></span> <br /> 
     52     
    3753</body> 
    3854 
  • cowsclient/trunk/cowsclient/templates/wcsdown.html

    r5668 r5671  
    6767<head> 
    6868 
     69 
     70<!-- YUI imports for autocomplete --> 
     71 
     72<link rel="stylesheet" type="text/css" href="$g.server/js/yui_2.7.0b/fonts/fonts.css" /> 
     73<link rel="stylesheet" type="text/css" href="$g.server/js/yui_2.7.0b/button/assets/skins/sam/button.css" /> 
     74<link rel="stylesheet" type="text/css" href="$g.server/js/yui_2.7.0b/autocomplete/assets/skins/sam/autocomplete.css" /> 
     75 
     76<script type="text/javascript" src="$g.server/js/yui_2.7.0b/yahoo-dom-event/yahoo-dom-event.js"></script> 
     77<script type="text/javascript" src="$g.server/js/yui_2.7.0b/animation/animation.js"></script> 
     78<script type="text/javascript" src="$g.server/js/yui_2.7.0b/element/element.js"></script> 
     79<script type="text/javascript" src="$g.server/js/yui_2.7.0b/button/button.js"></script> 
     80<script type="text/javascript" src="$g.server/js/yui_2.7.0b/datasource/datasource.js"></script> 
     81<script type="text/javascript" src="$g.server/js/yui_2.7.0b/autocomplete/autocomplete.js"></script> 
     82<script type="text/javascript" src="$g.server/js/yui_2.7.0b/event/event.js"></script> 
     83 
     84<!--script type="text/javascript" src="$g.server/js/yui/build/datasource/datasource.js"></script--> 
     85<!-- End of autocomplete imports --> 
     86 
     87 
     88 
     89<link rel="stylesheet" type="text/css" href="$g.server/layout/wcdown.css" /> 
     90 
     91 
    6992<script src="$g.server/js/json2.js"></script> 
    7093<script src="$g.server/js/splitSelect.js"></script> 
     
    7295<script src="$g.server/js/utils.js"></script> 
    7396 
     97 
     98 
     99 
    74100<script type="text/javascript"> 
    75101 
    76 downloadAction ="$g.server/wcsdown/download"; 
    77 refreshAction = "$g.server/wcsdown"; 
    78  
    79 timedata = JSON.parse("${c.timedata}"); 
     102var downloadAction ="$g.server/wcsdown/download"; 
     103var refreshAction = "$g.server/wcsdown"; 
     104 
     105<py:if test="c.layer != None"> 
     106    var timedata = JSON.parse("${c.timedata}"); 
     107</py:if> 
     108 
     109var defaultEndpoints = JSON.parse("${c.defaultWCSEndpoints}"); 
     110 
     111WMSC.log("defaultEndpoints = " + defaultEndpoints); 
    80112 
    81113function init() { 
    82114 
    83     var startTime = new SplitSelect('time_container', 'time', timedata, 'Start Time:'); 
    84     startTime.build(); 
    85  
    86     var endTime = new SplitSelect('time_end_container', 'time_end', timedata, 'End Time:'); 
    87     endTime.build(); 
    88      
    89     setSingleTime('${c.singleTimePoint}' == 'true'); 
     115    <py:if test="c.layer != None"> 
     116        var startTime = new SplitSelect('time_container', 'time', timedata, 'Start Time:'); 
     117        startTime.build(); 
     118     
     119        var endTime = new SplitSelect('time_end_container', 'time_end', timedata, 'End Time:'); 
     120        endTime.build(); 
     121         
     122        setSingleTime('${c.singleTimePoint}' == 'true'); 
     123    </py:if> 
     124 
     125 
     126    // build endpoint autocomplete 
     127    makeCombobox("endpoint", "endpoint_toggle", "endpoint_options", defaultEndpoints, onEndpointChange); 
    90128} 
    91129 
     
    106144 
    107145function onEndpointChange() { 
     146    WMSC.log("Endpoint changed"); 
    108147    selectLayerValue(""); 
    109148    refresh(); 
     
    154193</head> 
    155194 
    156 <body onload="init()" onunload="cleanup()"> 
     195<body onload="init()" onunload="cleanup()" class="yui-skin-sam"> 
    157196    <h1>test</h1> 
     197     
    158198     
    159199    <span> 
     
    161201    </span> 
    162202     
    163     <form id="download_form" method="get" >  
    164  
    165         ${makeTextInput('endpoint', label='Endpoint:', default=c.endpoint, onChange='onEndpointChange();')} 
    166          
    167         ${makeSelectInput('layer', c.layers, label='Layer:', default=c.layer, onChange='onLayerChange();')} 
    168          
    169         <py:if test="c.layer != None"> 
    170          
    171             ${makeSelectInput('format', c.supportedFormats, label='Format:')} 
    172              
    173             ${makeSelectInput('crs', c.supportedCRS, label='CRS:', default=c.crs)} 
    174              
    175             ${makeTextInput('bbox', label='Bounding Box:', default=c.bboxLimits )} 
    176              
    177             <h4>Dimensions</h4> 
    178              
    179             <div> 
    180                 <label for="single_time">Single Time Point:</label> 
    181                 <input type="checkbox" id="single_time" name="single_time" value='true' onClick="setSingleTime(this.checked);"></input> 
     203    <div id="download_form_container"> 
     204        <form id="download_form" method="get" >  
     205     
     206            <!-- ${makeTextInput('endpoint', label='Endpoint:', default=c.endpoint, onChange='onEndpointChange();')} --> 
     207             
     208            <!--  
     209            <div id="lunch_autocomplete"> 
     210                <input id="lInput" type="text"></input> <span id="toggleL"></span> 
     211                <div id="lContainer"></div> 
    182212            </div> 
    183              
    184             <div id="time_container"> </div> 
    185             <div id="time_end_container"> </div> 
    186              
    187         </py:if> 
    188          
    189         <input type="button" value="Download" onClick="onDownloadClick();"></input> 
    190          
    191         <input type="button" value="Refresh" onClick="onRefreshClick();"></input> 
    192  
    193     </form> 
     213             --> 
     214     
     215            <div id="endpoint_container"> 
     216                <label for="endpoint">Endpoint:</label> 
     217                <div id="endpoint_autocomplete" style="display:inline;"> 
     218                    <input id="endpoint" name="endpoint" type="text" value="${c.endpoint}"></input> <span id="endpoint_toggle"></span> 
     219                    <div id="endpoint_options"></div> 
     220                </div > 
     221            </div> 
     222             
     223             
     224            ${makeSelectInput('layer', c.layers, label='Layer:', default=c.layer, onChange='onLayerChange();')} 
     225             
     226            <py:if test="c.layer != None"> 
     227             
     228                ${makeSelectInput('format', c.supportedFormats, label='Format:')} 
     229                 
     230                ${makeSelectInput('crs', c.supportedCRS, label='CRS:', default=c.crs)} 
     231                 
     232                ${makeTextInput('bbox', label='Bounding Box:', default=c.bboxLimits )} 
     233                 
     234                <h4>Dimensions</h4> 
     235                 
     236                <div> 
     237                    <label for="single_time">Single Time Point:</label> 
     238                    <input type="checkbox" id="single_time" name="single_time" value='true' onClick="setSingleTime(this.checked);"></input> 
     239                </div> 
     240                 
     241                <div id="time_container"> </div> 
     242                <div id="time_end_container"> </div> 
     243                 
     244            </py:if> 
     245             
     246            <input type="button" value="Download" onClick="onDownloadClick();"></input> 
     247             
     248            <input type="button" value="Refresh" onClick="onRefreshClick();"></input> 
     249     
     250        </form> 
     251    </div> 
    194252     
    195253 
Note: See TracChangeset for help on using the changeset viewer.