source: main/branches/3.0.0/ibisph-view/src/main/webapp/xslt/html/query/module/builder/Page.xslt @ 25073

Last change on this file since 25073 was 25073, checked in by GarthBraithwaite_STG, 4 months ago

300 - turned map selection off if series geo. This was set at some point but maybe didn't get committed???

File size: 20.0 KB
Line 
1<?xml version="1.0" encoding="ISO-8859-1"?>
2
3<xsl:stylesheet version="3.0" 
4        xmlns:xsl ="http://www.w3.org/1999/XSL/Transform" 
5        xmlns:ibis="http://www.ibisph.org"
6
7        exclude-result-prefixes="ibis"
8>
9        <xsl:import href="../../../../xml/Interactive.xslt"/>
10        <xsl:import href="../../../DataViz.xslt"/>
11        <xsl:import href="../../definition/ApplyCriteria.xslt"/>
12        <xsl:import href="../Page.xslt"/>
13        <xsl:import href="SectionSelections.xslt"/>
14        <xsl:import href="Builder.xslt"/>
15
16        <ibis:doc>
17                <name>html/query/module/builder/Page</name>
18                <summary>Default core code that produces the query module builder pages</summary>
19                <description>
20                        Creates the module query builder type HTML pages.  The user
21                        steps through a series of questions and answers which are then submitted
22                        to the Query servlet which then builds a URL and accesses/calls the CGI
23                        app to query the SAS datasets.  The pages built with this XSLT are highly
24                        dependent on the selection javascritps, the Query servlet controllers,
25                        and the IBIS-PH module XML data files which control the way the questions
26                        and answers are presented and which define all the name/value pairs passed
27                        to IBISQ CGI app (via the URL).
28
29                        NOTE: SECTION and DIMENSION exclusions are all handled by the
30                        ConfigurationIncludeCriteriaExclude XSLT templates.  It also handles
31                        only including the selected CONFIGURATION.
32                </description>
33        </ibis:doc>
34
35
36        <xsl:param name="ApplyQueryDefinition" ibis:doc="access to the apply def to show user???"/>
37        <xsl:param name="Page.applyQueryDefinition" select="$ApplyQueryDefinition"/>
38
39
40        <!-- ~~~~~~~~~~~~~~~~~~~~~~~ PARAMS / VARIABLES ~~~~~~~~~~~~~~~~~~~~~~~~ -->
41        <xsl:param name="Page.pageTitle" ibis:doc="Page's title text which is based on the 'queryModule/TITLE' element.">
42                <xsl:value-of select="/QUERY_MODULE/TITLE"/> - <xsl:value-of select="$QueryModule.configuration/TITLE"/> Query Builder
43        </xsl:param>
44        <xsl:param name="Page.contentTitle" ibis:doc="Page's content title text which is based on the '$selections.queryModule/TITLE' element.">
45                Query Builder for <xsl:value-of select="/QUERY_MODULE/TITLE"/> - <xsl:value-of select="$QueryModule.configuration/TITLE"/>
46<!--
47                Query Builder for <xsl:value-of select="$QueryModule.configuration/TITLE"/>
48                Query Builder for <xsl:value-of select="concat($QueryModule.configuration/TITLE, '-', /QUERY_MODULE/TITLE)"/>
49-->
50        </xsl:param>
51
52
53        <xsl:param name="Page.jumpToSubmitQueryHelpContent">
54                Jumps to the bottom of the page where the submit button is located.
55        </xsl:param>
56
57        <xsl:param name="Page.viewApplyCriteriaDetailsHelpContent">
58                The Apply Criteria feature is enabled.  Click this button to view the
59                currently selected criteria that is tried to be applied to this and
60                future queryable datasets.
61        </xsl:param>
62
63
64        <xsl:param name="Page.submitFormURL" 
65                select="concat($Page.queryBaseRequestPath, 'submit/', $QueryModule.request/CONFIGURATION_PATH, '.html')"
66                ibis:doc="Mechanism implemented so secure query can have a different result page."
67        />
68
69
70
71        <!-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ TEMPLATES ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
72        <xsl:template name="Page.specificHeadContent"
73                ibis:doc="HTML API implementation that provides hook for the
74                        query modules to be able to specify any extra CSS, meta tags, or
75                        javascript functions that need to be included specific to that
76                        module.  The module element '/QUERY_MODULE/CRITERIA/OTHER_HTML_HEAD_CONTENT'
77                        contents are simply copied into the HTML 'head' element as is.
78                        This code also handles a special parameter called 'AutoSubmit' which
79                        can be used for testing."
80        >
81                <xsl:if test="exists(/QUERY_MODULE/CRITERIA/OTHER_HTML_HEAD_CONTENT)">
82                        <xsl:apply-templates select="/QUERY_MODULE/CRITERIA/OTHER_HTML_HEAD_CONTENT/text() | /QUERY_MODULE/CRITERIA/OTHER_HTML_HEAD_CONTENT/*" mode="ibis.copy"/>
83                </xsl:if>
84
85                <meta http-equiv="Cache-Control" content="max-age=300"/>
86        </xsl:template>
87
88
89
90        <xsl:template name="Page.specificScript"
91                ibis:doc="Provides the javascript file links and submit related functions
92                        for the query module builder pages."
93        >
94                <script type="text/javascript" src="js/InputSelections.js"/>
95                <script type="text/javascript">
96                        window.inputSelections = new InputSelections();         // all input elements on the page.
97
98                        // <![CDATA[
99                        // init code - jquery way:  $(document).ready(initializeQueryBuilderPage);
100                        $(document).ready(function()
101                        {
102                                if(-1 == location.href.indexOf("PrinterFriendly"))
103                                {
104                                        window.inputSelections.registerOnChange();
105                                        setupStepSelections();
106                                }
107                        });
108
109
110                        // set all 3 or 4 selection options onchange to this.  Then simply
111                        // get the title values into the InputSelections CSV build and put
112                        // into the display steps SelectedValues element.
113                        function displayOptionsChangeHandler()
114                        {
115                                var categoryGroupByElement        = document.getElementById("_CategoryGroupByDimensionName");
116                                var selectedCategoryOptionElement = categoryGroupByElement.options[categoryGroupByElement.selectedIndex];
117
118                                var seriesGroupByElement  = document.getElementById("_SeriesGroupByDimensionName");
119                                var selectedSeriesOptionElement = seriesGroupByElement.options[seriesGroupByElement.selectedIndex];
120                                var selectedSeriesGroupBy = ((null != seriesGroupByElement) ? seriesGroupByElement.options[seriesGroupByElement.selectedIndex].value : "");
121
122                                var otherGroupByElement   = document.getElementById("_OtherGroupByDimensionName");
123                                var selectedOtherGroupBy  = ((null != otherGroupByElement) ? otherGroupByElement.options[otherGroupByElement.selectedIndex].value : "");
124
125                                var selectedValues = "Grouped By: " + selectedCategoryOptionElement.text;
126                                if(" " < selectedSeriesGroupBy) selectedValues = selectedValues + " x " + seriesGroupByElement.options[seriesGroupByElement.selectedIndex].text;
127                                if(" " < selectedOtherGroupBy)  selectedValues = selectedValues + " x " + otherGroupByElement.options[otherGroupByElement.selectedIndex].text;
128
129                                var chartNameElement = document.getElementById("chartName");
130                                var selectedChart    = ((null != chartNameElement) ? chartNameElement.options[chartNameElement.selectedIndex].text : "");
131                                if( " " < selectedChart) selectedValues = selectedValues + ". Chart: " + selectedChart;
132
133                                var mapSelectionRowElement = document.getElementById("mapSelectionRow");
134                                if(null != mapSelectionRowElement)
135                                {
136                                        var selectedValuesElement = $("#displayControlSectionSelectedValues");
137                                        selectedValuesElement.html( "(" + selectedValues + ")" );
138
139                                        var showMapSelections = (" " < selectedCategoryOptionElement.getAttribute("geographyflag"));
140                                        var mapNameElement = document.getElementById("mapName");
141                                        if(showMapSelections)
142                                        {
143                                                var selectedMap = mapNameElement.options[mapNameElement.selectedIndex].text;
144                                                selectedValues  = selectedValues + ". Map: " + selectedMap;
145                                        }
146                                        else
147                                        {
148                                                mapNameElement.value = "None";
149                                        }
150
151                                        mapSelectionRowElement.style.opacity    = (showMapSelections ? "1" : "0");
152                                        mapSelectionRowElement.style.visibility = (showMapSelections ? "visible" : "collapse");
153
154                                        // can't disable as won't post the value.  readonly doesn't
155                                        // give any visual clues.  easiest is to simply hide it for now...
156                                        // mapSelectionRowElement.disabled = !showMapSelections;
157                                }
158
159                                var selectedValuesElement = $("#displayControlSectionSelectedValues");
160                                selectedValuesElement.html( "(" + selectedValues + ")" );
161                        } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~ End of Function ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
162
163
164                        // function to check to see if cross1 and cross2 are set the same.  If
165                        // so popup an alert notifying the user that they are both the same.
166                        function isGroupByDimensionsSame()
167                        {
168                                var categoryGroupByDimensionValue = $("#_CategoryGroupByDimensionName").val();
169                                var seriesGroupByDimensionValue   = $("#_SeriesGroupByDimensionName").val();
170                                if((categoryGroupByDimensionValue != null) && (categoryGroupByDimensionValue == seriesGroupByDimensionValue))
171                                {
172                                        alert
173                                        (
174                                                "--Duplicate Category/Series Grouping Selections Notice--\n" +
175                                                "\nBoth the row and column grouping selections" +
176                                                "\nare set to the same value.  This will work but" +
177                                                "\nprobably will not produce the desired results."+
178                                                "\nIt is recommended that you change one of the"+
179                                                "\nselections before submitting the query."
180                                        );
181                                        return(true);
182                                }               
183                                return(false);
184                        } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~ End of Function ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
185
186
187                        function setupStepSelections()
188                        {
189                                // fire the change event to show current selections.
190                                var section = $(".ExpandableContent");
191                                for(i=0; i<section.length; i++)
192                                        window.inputSelections.updateSectionSelectionsTitlesCSV(section[i]);
193                                displayOptionsChangeHandler();
194                        } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~ End of Function ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
195
196
197                        function resetForm()
198                        {
199                                if( confirm("Are you sure you want to reset all of selection changes made on the current page?") )
200                                {
201                                        document.form.reset();
202                                        setupStepSelections();
203                                }
204                        } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~ End of Function ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
205                       
206
207                        // Main function that pressing the submit button executes.  This
208                        // function's main purpose is to clear unselected values so that
209                        // they are NOT submitted to the server for inclusion in the
210                        // query.  This can be handled on the backend but it would be
211                        // messy and error prone.
212                        function submitQuery()
213                        {
214                                if(isGroupByDimensionsSame()) return;   // can't return null or false...
215                                window.inputSelections.clearAllNonSelectedSelections();
216                                if(!window.inputSelections.validateAllTextInputs()) return;
217
218                                // submit the page's form contents...
219                                document.form.submit();
220                        } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~ End of Function ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
221
222                        function gotoSubmitButton()
223                        {
224                                document.getElementById('submitButton').focus();
225                        } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~ End of Function ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
226
227                        // according to: http://www.hunlock.com/blogs/Mastering_The_Back_Button_With_Javascript
228                        // having a window.onbeforeunload tells the browser to NOT cache the
229                        // page so that the back button doesn't impact cleared non selected
230                        // query selection values.  On the modern browsers that were tested
231                        // this never was an issue as modern browsers pick up the "post"
232                        // and understand to reset the page as it was prior to submitting.
233                        window.onbeforeunload = function() {}
234
235                        // ]]>
236                </script>
237        </xsl:template>
238
239
240
241        <!-- main page content template -->
242        <xsl:template name="Page.contentBody"
243                ibis:doc="Main page content template that creates the overview
244                        section, upper steps control bar, all the Q/A steps, the display
245                        step, and the submission control."
246        >
247                <xsl:param name="sections"    select="$QueryModule.queryModule/CRITERIA/SECTIONS"/>
248
249
250                <xsl:call-template name="Page.contentOptions"/>
251
252                <!-- if dup names, then show an error and exit the page.  note the next
253                        match enable the page to be displayed.  Otherwise it simply blows...
254                -->
255                <xsl:if test="1 lt count($QueryModule.configuration/NAME)">
256                        <div class="Error">
257                                <h2>ERROR: Duplicate Module Configuration Names!!!  Please
258                                        contact the owners of this system and report this problem.
259                                        <br/><br/>
260
261                                        Duplicate Configuration Name: <xsl:value-of select="distinct-values($QueryModule.configuration/NAME)"/>
262                                </h2>
263                        </div><br/>
264
265                        <xsl:next-match/>
266                        <xsl:message terminate="yes">
267                                QUERY MODULE ERROR: Duplicate Module Configuration Names: <xsl:value-of select="concat($QueryModule.queryModule/NAME, '/', distinct-values($QueryModule.configuration/NAME))"/>
268                        </xsl:message>
269                </xsl:if>
270
271
272                <xsl:call-template name="ContentContainer.overviews">
273                        <xsl:with-param name="overviews" select="$QueryModule.queryModule/CRITERIA/OVERVIEWS/OVERVIEW"/>
274                </xsl:call-template>
275
276
277                <!-- MAIN FORM that contains all user selectable input elements. -->
278                <form id="form" name="form" method="post" action="{$Page.submitFormURL}">
279
280                        <!-- Put in any dynamic IBISQ parameters.  If a HIDDEN_INPUT_FLAG
281                                element exists then this parameter is put into the form as a
282                                hidden so that javascript can modify it's value before
283                                submitting to the servlet.
284                        -->
285                        <xsl:apply-templates mode="Builder.hiddenInput" select="$QueryModule.queryModule//PARAMETERS/PARAMETER[exists(HIDDEN_INPUT_FLAG)]"/>
286
287                        <!-- do the step sections - questions and answers -->
288                        <xsl:for-each select="$QueryModule.queryModule/CRITERIA/SECTIONS/SECTION">
289                                <xsl:call-template name="SectionSelections.expandableContentSection">
290                                        <xsl:with-param name="section"            select="."/>
291                                        <xsl:with-param name="sectionNumber"      select="position()"/>
292                                </xsl:call-template>
293                        </xsl:for-each>
294
295                        <xsl:call-template name="ContentContainer.expandable">
296                                <xsl:with-param name="title"       select="concat('Step ', count($sections/SECTION) + 1, ': How to display the data')"/>
297                                <xsl:with-param name="description" select="'Show/hide display options'"/>
298                                <xsl:with-param name="subTitleContent">
299                                        <span id="displayControlSectionSelectedValues" class="SelectedValues"/>
300                                </xsl:with-param>
301                                <xsl:with-param name="accesskey"   select="'D'"/>
302                                <xsl:with-param name="content">
303                                        <xsl:call-template name="Builder.displayControl"/>
304                                </xsl:with-param>
305                                <xsl:with-param name="show" select="true()"/>
306                        </xsl:call-template>
307
308                        <!-- finally the finish/submit section -->
309                        <div style="margin-top: 1rem;">
310                                <xsl:call-template name="Builder.submitControl"/>
311                        </div>
312
313                </form>
314
315                <xsl:call-template name="Page.usageAgreementDialog"/>
316                <xsl:if test="$ApplyCriteria.isSet">
317                        <xsl:call-template name="Page.applyCriteriaDialog"/>
318                </xsl:if>
319
320        </xsl:template>
321
322
323        <xsl:template name="Page.contentOptions">
324                <div class="ContentOptions">
325                        <h3><xsl:value-of select="'Query Builder Page Options'"/></h3>
326                        <div class="Container Buttons">
327                                <button type="button" accesskey="J" id="gotoSubmitButton" onclick="gotoSubmitButton()">
328                                        Jump to Submit
329                                        <xsl:call-template name="Help.popup">
330                                                <xsl:with-param name="content" select="$Page.jumpToSubmitQueryHelpContent"/>
331                                        </xsl:call-template>
332                                </button>
333
334                                <xsl:if test="$ApplyCriteria.isSet">
335                                <button type="button" accesskey="A" id="viewAppliedDefinitionButton" 
336                                        onclick="window.applyCriteriaDialog.center().open()"
337                                >
338                                        Applied Criteria Enabled
339                                        <xsl:call-template name="Help.popup">
340                                                <xsl:with-param name="content" select="$Page.viewApplyCriteriaDetailsHelpContent"/>
341                                        </xsl:call-template>
342                                </button>
343                                </xsl:if>
344
345                                <xsl:if test="exists($QueryModule.result) or exists($QueryModule.queryModule/DEVELOPMENT_FLAG)">
346                                        <button type="button" accesskey="L" id="defaultQueryButton" 
347                                                onclick="location.href='{$Page.queryBaseRequestPath}builder/{$QueryModule.request/CONFIGURATION_PATH}.html?Reload=x'"
348                                        >
349                                                Load Default Selections
350                                                <xsl:call-template name="Help.popup">
351                                                        <xsl:with-param name="content" select="$Page.loadDefaultQueryHelpContent"/>
352                                                </xsl:call-template>
353                                        </button>
354
355                                        <xsl:if test="exists($QueryModule.queryModule/QUERY_CONFIGURATION_SELECTION)">
356                                                <button type="button" accesskey="D" id="changeQueryDataset" 
357                                                        onclick="location.href='{$QueryModule.queryModule/QUERY_CONFIGURATION_SELECTION/LOCAL_URL}'"
358                                                >
359                                                        Select New Measure
360                                                        <xsl:call-template name="Help.popup">
361                                                                <xsl:with-param name="content" select="$Page.changeDatasetMeasureHelpContent"/>
362                                                        </xsl:call-template>
363                                                </button>
364                                        </xsl:if>
365                                </xsl:if>
366
367                                <xsl:if test="exists($QueryModule.queryModule/METADATA_LOCAL_URL)">
368                                <button type="button" accesskey="M" id="metadataButton" 
369                                        onclick="location.href='{$QueryModule.queryModule/METADATA_LOCAL_URL}'"
370                                >
371                                        View Meta Data
372                                        <xsl:call-template name="Help.popup">
373                                                <xsl:with-param name="content" select="'Show the metadata page associated with this dataset.'"/>
374                                        </xsl:call-template>
375                                </button>
376                                </xsl:if>
377
378
379                                <xsl:if test="exists($QueryModule.queryModule/DEVELOPMENT_FLAG)">
380                                        <button type="button" accesskey="X" id="viewXMLButton" 
381                                                onclick="location.href='query/configuration/{$QueryModule.queryModule/REQUEST/CONFIGURATION_PATH}.xml'"
382                                        >
383                                                View Module XML
384                                        </button>
385
386                                        <xsl:if test="exists($QueryModule.request/QUERY_APPLICATION_URL) and ('post' != $QueryModule.queryModule/QUERY_APPLICATION_HTTP_REQUEST_TYPE)">
387                                        <button type="button" accesskey="Q" id="viewIBISQButton" 
388                                                onclick="location.href='{$QueryModule.request/QUERY_APPLICATION_URL}'"
389                                        >
390                                                Get IBISQ XML
391                                        </button>
392                                        </xsl:if>
393                                </xsl:if>
394                        </div>
395                </div>
396        </xsl:template>
397
398
399        <xsl:template name="Page.applyCriteriaDialog">
400                <xsl:param name="queryModule"/>
401
402                <div id="applyCriteriaDialog" class="DialogWindow">
403                        <div class="Content">
404                                <p>
405                                You currently have the Apply Query Criteria set.  This remains in
406                                effect for the remainder of your session/visit to this site or until
407                                you "Clear Apply Critera" (option available on the query result page). 
408                                Shown below are your current selections that the system will try to apply.
409                                </p>
410
411                                <h3>Current Apply Criteria Query Definition</h3>
412                                <table id="applyCriteria" class="Info"
413                                        summary="The first column is a title of that type of selection with
414                                                the next column showing a list of selected values.
415                                        "
416                                        caption="Result table that shows selected dimensions and group by selections."
417                                >
418                                        <xsl:call-template name="QueryModule.selectedDimensionsCriteriaTableRows">
419                                                <xsl:with-param name="selectedDimensions" select="$ApplyCriteria.queryDefinition//SELECTED_DIMENSIONS"/>
420                                        </xsl:call-template>
421
422                                        <xsl:call-template name="QueryModule.dataGroupedByTableRow">
423                                                <xsl:with-param name="rowDimensionTitle"   select="ibis:getDimensionTitle($QueryModule.dimensions/DIMENSION[NAME=$ApplyCriteria.queryDefinition/REQUEST/ACTUAL_GROUP_BY/CATEGORY_DIMENSION_NAME])"/>
424                                                <xsl:with-param name="colDimensionTitle"   select="ibis:getDimensionTitle($QueryModule.dimensions/DIMENSION[NAME=$ApplyCriteria.queryDefinition/REQUEST/ACTUAL_GROUP_BY/SERIES_DIMENSION_NAME])"/>
425                                                <xsl:with-param name="otherDimensionTitle" select="ibis:getDimensionTitle($QueryModule.dimensions/DIMENSION[NAME=$ApplyCriteria.queryDefinition/REQUEST/ACTUAL_GROUP_BY/OTHER_DIMENSION_NAME])"/>
426                                        </xsl:call-template>
427                                        <xsl:call-template name="QueryModule.selectedVisualizationTableRow">
428                                                <xsl:with-param name="request" select="$ApplyCriteria.queryDefinition/REQUEST"/>
429                                        </xsl:call-template>
430                                </table>
431
432                                <button type="button" id="applyCriteriaCloseButton" 
433                                        onclick="window.applyCriteriaDialog.close()" 
434                                        title="Closes this dialog window."
435                                >Close</button>
436                               
437                        </div>
438                </div>
439
440                <script type="text/javascript">
441                        // <![CDATA[
442                        $(document).ready(function()
443                        {
444                                window.applyCriteriaDialog =
445                                        $("#applyCriteriaDialog").kendoWindow({
446                                                title: "Apply Dataset Query Definition"
447                                                ,visible: false
448                                                ,width: "600px"
449                                                ,resizable: true
450                                                ,modal: true
451                                        }).data("kendoWindow");
452                        }); //~~~~~~~~~~~~~~~~~~~~ End of Ready Function ~~~~~~~~~~~~~~~~~~~
453                        // ]]>
454                </script>
455        </xsl:template>
456
457
458        <xsl:template name="Page.groupedSelectOptions">
459                <xsl:param name="groupTitle"/>
460                <xsl:param name="links"/>
461                <xsl:param name="requestPrefix"/>
462                <xsl:param name="requestSuffix" select="'.html'"/>
463                <xsl:if test="0 != count($links)">
464                        <optgroup label="{$groupTitle}">
465                                <xsl:for-each select="$links">
466                                        <xsl:sort select="SORT_ORDER" data-type="number" order="ascending"/>
467                                        <xsl:sort select="TITLE" data-type="text" order="ascending"/>
468                                        <option value="{LOCAL_URL/text() | URL/text()}">
469                                                <xsl:value-of select="TITLE"/>
470                                        </option>
471                                </xsl:for-each>
472                        </optgroup>
473                </xsl:if>
474        </xsl:template>
475
476</xsl:stylesheet>
477<!-- ============================= End of File ============================= -->
478
Note: See TracBrowser for help on using the repository browser.