source: main/trunk/ibisph-view/src/main/webapp/xslt/html/query/module/builder/Page.xslt @ 19867

Last change on this file since 19867 was 19867, checked in by GarthBraithwaite_STG, 2 years ago

view - Split out IP paths so that IP xml can be refed diff from standard xml content. Stubbed out ContentOptions? for IP, CP, and rough query bulder and result page options. css tweaks - buttons, user. Removed unused vert menu css from main css. Added more defensive code for ibis ip view title/dim value title. Removed all the contextNavigation from xslt code.

File size: 16.2 KB
RevLine 
[2554]1<?xml version="1.0" encoding="ISO-8859-1"?>
2
[14712]3<xsl:stylesheet version="3.0" 
[2554]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="../Page.xslt"/>
[17416]10        <xsl:import href="../../../Graphic.xslt"/>
[17938]11        <xsl:import href="../../../../json/Dataset.xslt"/>
12        <xsl:import href="../../../../json/Kendo.xslt"/>
[17416]13        <xsl:import href="../../../../json/LeafletMap.xslt"/>
[2554]14        <xsl:import href="SectionSelections.xslt"/>
15        <xsl:import href="Builder.xslt"/>
16
17
18        <ibis:doc>
[3225]19                <name>html/query/module/builder/Page</name>
[2554]20                <summary>Default core code that produces the query module builder pages</summary>
21                <description>
22                        Creates the module query builder type HTML pages.  The user
23                        steps through a series of questions and answers which are then submitted
24                        to the Query servlet which then builds a URL and accesses/calls the CGI
25                        app to query the SAS datasets.  The pages built with this XSLT are highly
26                        dependent on the selection javascritps, the Query servlet controllers,
27                        and the IBIS-PH module XML data files which control the way the questions
28                        and answers are presented and which define all the name/value pairs passed
29                        to IBISQ CGI app (via the URL).
30
31                        NOTE: SECTION and DIMENSION exclusions are all handled by the
32                        ConfigurationIncludeCriteriaExclude XSLT templates.  It also handles
33                        only including the selected CONFIGURATION.
[15958]34                </description>
[2554]35        </ibis:doc>
36
37
[3687]38        <!-- ~~~~~~~~~~~~~~~~~~~~~~~ PARAMS / VARIABLES ~~~~~~~~~~~~~~~~~~~~~~~~ -->
[2585]39        <xsl:param name="Page.pageTitle" ibis:doc="Page's title text which is based on the 'queryModule/TITLE' element.">
[17645]40                <xsl:value-of select="/QUERY_MODULE/TITLE"/> - <xsl:value-of select="$Page.configuration/TITLE"/> Query Builder
[2585]41        </xsl:param>
[19781]42        <xsl:param name="Page.contentTitle" ibis:doc="Page's content title text which is based on the '$selections.queryModule/TITLE' element.">
[17645]43                Query Builder for <xsl:value-of select="/QUERY_MODULE/TITLE"/> - <xsl:value-of select="$Page.configuration/TITLE"/>
[17255]44<!--
[17502]45                Query Builder for <xsl:value-of select="$Page.configuration/TITLE"/>
46                Query Builder for <xsl:value-of select="concat($Page.configuration/TITLE, '-', /QUERY_MODULE/TITLE)"/>
[2554]47-->
[2585]48        </xsl:param>
[18253]49        <xsl:param name="Page.queryDefinitionFromBuilderPath" select="'query/definition/from/builder'"/>
[2554]50
51
[6298]52        <!-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ TEMPLATES ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
[7005]53        <xsl:template name="Page.specificHeadContent"
[2554]54                ibis:doc="HTML API implementation that provides hook for the
55                        query modules to be able to specify any extra CSS, meta tags, or
56                        javascript functions that need to be included specific to that
57                        module.  The module element '/QUERY_MODULE/CRITERIA/OTHER_HTML_HEAD_CONTENT'
[3154]58                        contents are simply copied into the HTML 'head' element as is.
[2554]59                        This code also handles a special parameter called 'AutoSubmit' which
60                        can be used for testing."
61        >
62                <xsl:if test="exists(/QUERY_MODULE/CRITERIA/OTHER_HTML_HEAD_CONTENT)">
63                        <xsl:apply-templates select="/QUERY_MODULE/CRITERIA/OTHER_HTML_HEAD_CONTENT/text() | /QUERY_MODULE/CRITERIA/OTHER_HTML_HEAD_CONTENT/*" mode="ibis.copy"/>
64                </xsl:if>
65
66                <meta http-equiv="Cache-Control" content="max-age=300"/>
67        </xsl:template>
68
69
70
71        <xsl:template name="Page.specificScript"
[7647]72                ibis:doc="Provides the javascript file links and submit related functions
[2554]73                        for the query module builder pages."
74        >
[18253]75                <script type="text/javascript" src="{$ibis.contextPath}js/InputSelections.js"/>
[3319]76                <script type="text/javascript">
[18253]77                        var saveCriteriaURL = "<xsl:value-of select="concat($ibis.contextPath, $Page.queryDefinitionFromBuilderPath)"/>";
[16458]78                        window.inputSelections = new InputSelections();         // all input elements on the page.
[3319]79
[5356]80                        // <![CDATA[
81                        // init code - jquery way:  $(document).ready(initializeQueryBuilderPage);
[5461]82                        $(document).ready(function()
[3319]83                        {
84                                if(location.href.indexOf("PrinterFriendly") == -1)
85                                {
[16458]86                                        window.inputSelections.registerOnChange();
[9234]87                                        setupStepSelections();
[3319]88                                }
[5461]89                        });
[3319]90
91
[5356]92                        // set all 3 or 4 selection options onchange to this.  Then simply
93                        // get the title values into the InputSelections CSV build and put
94                        // into the display steps SelectedValues element.
95                        function displayOptionsChangeHandler()
96                        {
[17502]97                                var categoryGroupByElement        = document.getElementById("_CategoryGroupByDimensionName");
98                                var selectedCategoryOptionElement = categoryGroupByElement.options[categoryGroupByElement.selectedIndex];
[5356]99
[17502]100                                var seriesGroupByElement  = document.getElementById("_SeriesGroupByDimensionName");
101                                var selectedSeriesGroupBy = ((null != seriesGroupByElement) ? seriesGroupByElement.options[seriesGroupByElement.selectedIndex].value : "");
[5356]102
[17502]103                                var otherGroupByElement   = document.getElementById("_OtherGroupByDimensionName");
104                                var selectedOtherGroupBy  = ((null != otherGroupByElement) ? otherGroupByElement.options[otherGroupByElement.selectedIndex].value : "");
105
106                                var chartNameElement = document.getElementById("chartName");
107                                var selectedChart    = ((null != chartNameElement) ? chartNameElement.options[chartNameElement.selectedIndex].text : "");
108
109                                var mapNameElement   = document.getElementById("mapName");
110                                var selectedMap      = ((null != mapNameElement) ? mapNameElement.options[mapNameElement.selectedIndex].text : "");
111
112                                var showMapSelections =
113                                        (" " >= selectedSeriesGroupBy)
114                                        &&
115                                        (" " >= selectedOtherGroupBy)
116                                        &&
117                                        (" " < selectedCategoryOptionElement.getAttribute("geographyflag"))
118                                ;
119                                if(null != mapNameElement) mapNameElement.disabled = !showMapSelections;
120
121                                var selectedValues = "Grouped By: " + selectedCategoryOptionElement.text;
122                                if(" " < selectedSeriesGroupBy) selectedValues = selectedValues + " x " + seriesGroupByElement.options[seriesGroupByElement.selectedIndex].text;
123                                if(" " < selectedOtherGroupBy)  selectedValues = selectedValues + " x " + otherGroupByElement.options[otherGroupByElement.selectedIndex].text;
124
125                                if( " " < selectedChart) selectedValues = selectedValues + ". Chart: " + selectedChart;
126                                if((" " < selectedMap) && showMapSelections) selectedValues = selectedValues + ". Map: " + selectedMap;
127
[5752]128                                var selectedValuesElement = $("#displayControlSectionSelectedValues");
[5356]129                                selectedValuesElement.html( "(" + selectedValues + ")" );
130                        } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~ End of Function ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
131
132
[3319]133                        // function to check to see if cross1 and cross2 are set the same.  If
134                        // so popup an alert notifying the user that they are both the same.
135                        function isGroupByDimensionsSame()
136                        {
[7287]137                                var categoryGroupByDimensionValue = $("#_CategoryGroupByDimensionName").val();
138                                var seriesGroupByDimensionValue   = $("#_SeriesGroupByDimensionName").val();
139                                if((categoryGroupByDimensionValue != null) && (categoryGroupByDimensionValue == seriesGroupByDimensionValue))
[3319]140                                {
141                                        alert
142                                        (
[7287]143                                                "--Duplicate Category/Series Grouping Selections Notice--\n" +
[3319]144                                                "\nBoth the row and column grouping selections" +
145                                                "\nare set to the same value.  This will work but" +
146                                                "\nprobably will not produce the desired results."+
147                                                "\nIt is recommended that you change one of the"+
148                                                "\nselections before submitting the query."
149                                        );
150                                        return(true);
151                                }               
152                                return(false);
153                        } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~ End of Function ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
154
155
[9234]156                        function setupStepSelections()
157                        {
158                                // fire the change event to show current selections.
159                                var section = $(".ExpandableContent");
160                                for(i=0; i<section.length; i++)
[16458]161                                        window.inputSelections.updateSectionSelectionsTitlesCSV(section[i]);
[9234]162                                displayOptionsChangeHandler();
163                        } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~ End of Function ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
164
165
166                        function resetForm()
167                        {
168                                document.form.reset();
169                                setupStepSelections();
170                        } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~ End of Function ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
171                       
172
[3326]173                        // Main function that pressing the submit button executes.  This
174                        // function's main purpose is to clear unselected values so that
175                        // they are NOT submitted to the server for inclusion in the
176                        // query.  This can be handled on the backend but it would be
177                        // messy and error prone.
[3319]178                        function submitQuery()
179                        {
180                                if(isGroupByDimensionsSame()) return;   // can't return null or false...
[16458]181                                window.inputSelections.clearAllNonSelectedSelections();
182                                if(!window.inputSelections.validateAllTextInputs()) return;
[3687]183
[3326]184                                // submit the page's form contents...
[5356]185                                document.form.submit();
186                        } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~ End of Function ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
187
188
189                        function saveCriteria()
190                        {
[16458]191                                window.inputSelections.clearAllNonSelectedSelections();
192                                if(!window.inputSelections.validateAllTextInputs()) return;
[5356]193                                document.form.action = saveCriteriaURL;
[3319]194                                document.form.submit();
195                        } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~ End of Function ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[3326]196
[3687]197
[3326]198                        // according to: http://www.hunlock.com/blogs/Mastering_The_Back_Button_With_Javascript
199                        // having a window.onbeforeunload tells the browser to NOT cache the
200                        // page so that the back button doesn't impact cleared non selected
201                        // query selection values.  On the modern browsers that were tested
202                        // this never was an issue as modern browsers pick up the "post"
[5353]203                        // and understand to reset the page as it was prior to submitting.
[3326]204                        window.onbeforeunload = function() {}
205
[3319]206                        // ]]>
207                </script>
[2554]208        </xsl:template>
209
210
211
212        <!-- main page content template -->
[19781]213        <xsl:template name="Page.contentBody"
[2554]214                ibis:doc="Main page content template that creates the overview
215                        section, upper steps control bar, all the Q/A steps, the display
216                        step, and the submission control."
217        >
[2585]218                <xsl:param name="sections" select="/QUERY_MODULE/CRITERIA/SECTIONS"/>
[2554]219
[19867]220
221                <div class="ContentOptions">
222                        <h3><xsl:value-of select="'Query Builder Page Options'"/></h3>
223                        <button type="button" accesskey="S" id="submitButton" title="Submit the query and display the result page">
224                                <xsl:attribute name="onclick" select="
225                                        if(exists($Page.configuration/CRITERIA/SUBMIT_JAVASCRIPT_FUNCTION_CALL))
226                                                then $Page.configuration/CRITERIA/SUBMIT_JAVASCRIPT_FUNCTION_CALL
227                                                else 'submitQuery()'
228                                        "
229                                />
230                                Submit
231                                <xsl:call-template name="Help.content">
232                                        <xsl:with-param name="help">
233                                                <TEXT>
234                                                        This submits your query definition.  Once submitted
235                                                        the data will be processed and the result page will
236                                                        be presented.  From the result page you can return
237                                                        to this page and refineany data filtering criteria
238                                                        and data grouping selections.
239                                                </TEXT>
240                                        </xsl:with-param>
241                                </xsl:call-template>
242                        </button>
243
244                        <button type="button" accesskey="M" id="SelectNewMeasure" title="Select a new  query dataset measure"
245                                onclick="location.href='{concat($ibis.contextPath, /QUERY_MODULE/QUERY_CONFIGURATION_SELECTION/LOCAL_URL)}'"
246                        >
247                                Select Query Measure
248                                <xsl:call-template name="Help.content">
249                                        <xsl:with-param name="help">
250                                                <TEXT>
251                                                        Allows you to change the measure to be queried. 
252                                                </TEXT>
253                                        </xsl:with-param>
254                                </xsl:call-template>
255                        </button>
256
257                        <button type="button" accesskey="M" id="SelectNewMeasure" title="Reloads the default query definition"
258                                onclick="location.href='{concat($ibis.contextPath, 'query/builder/', /QUERY_MODULE/REQUEST/CONFIGURATION_PATH, '.html?Reload=x')}'"
259                        >
260                                Reload Selections
261                                <xsl:call-template name="Help.content">
262                                        <xsl:with-param name="help">
263                                                <TEXT>
264                                                        Resets your query definition to the default selections
265                                                        and settings.  This is different from the [Reset] button
266                                                        located at the bottom of the page.  The [Reset] restores
267                                                        immediate page selections made.  This option actually
268                                                        reloads the query definition to it's default state.
269                                                </TEXT>
270                                        </xsl:with-param>
271                                </xsl:call-template>
272                        </button>
273
274                        <button type="button" accesskey="D" id="saveDefinition" 
275                                title="Click this button to save the selections as a saved criteria definition"
276                                onclick="saveCriteria()"
277                        >
278                                Save Query Definition
279                                <xsl:call-template name="Help.content">
280                                        <xsl:with-param name="help">
281                                                <TEXT>
282                                                        Allows you to save your current filtering criteria and
283                                                        display selections.  These saved query definitions can
284                                                        then be ran later and can even be shared with others.
285                                                </TEXT>
286                                        </xsl:with-param>
287                                </xsl:call-template>
288                        </button>
289
290                        <button type="button" accesskey="D" id="saveDefinition" 
291                                title="Click this button to access all query definitions"
292                                onclick="location.href='{concat($ibis.contextPath, 'query/definition/index/MyDefinitions.html')}'"
293                        >
294                                Load Query Definition
295                                <xsl:call-template name="Help.content">
296                                        <xsl:with-param name="help">
297                                                <TEXT>
298                                                        Takes you to a page that shows a list of all of your
299                                                        saved query defintions.  You can then choose several
300                                                        options to run the definition, refine it, or delete it.
301
302                                                        NOTE: you will need to be logged in to be able to see
303                                                        your definitions.
304                                                </TEXT>
305                                        </xsl:with-param>
306                                </xsl:call-template>
307                        </button>
308                </div>
309
[2554]310                <!-- if dup names, then show an error and exit the page.  note the next
311                        match enable the page to be displayed.  Otherwise it simply blows...
312                -->
[17502]313                <xsl:if test="count($Page.configuration/NAME) &gt; 1">
[2554]314                        <div class="Error">
315                                <h2>ERROR: Duplicate Module Configuration Names!!!  Please
[3154]316                                        contact the owners of this system and report this problem.
[2554]317                                        <br/><br/>
318
[17502]319                                        Duplicate Configuration Name: <xsl:value-of select="distinct-values($Page.configuration/NAME)"/>
[2554]320                                </h2>
321                        </div><br/>
322
323                        <xsl:next-match/>
324                        <xsl:message terminate="yes">
[17502]325                                QUERY MODULE ERROR: Duplicate Module Configuration Names: <xsl:value-of select="concat(/QUERY_MODULE/NAME, '/', distinct-values($Page.configuration/NAME))"/>
[2554]326                        </xsl:message>
327                </xsl:if>
328
329
330                <!-- MAIN FORM that contains all user selectable input elements. -->
[3687]331                <form id="form" name="form" method="post" action="{$Builder.postURL}">
[2554]332
333                        <!-- Put in any dynamic IBISQ parameters.  If a HIDDEN_INPUT_FLAG
334                                element exists then this parameter is put into the form as a
335                                hidden so that javascript can modify it's value before
336                                submitting to the servlet.
337                        -->
[3319]338                        <xsl:apply-templates mode="Builder.hiddenInput" select="/QUERY_MODULE//PARAMETERS/PARAMETER[exists(HIDDEN_INPUT_FLAG)]"/>
[2554]339
[8572]340                        <xsl:call-template name="ContentContainer.contentBlockWithDelimitedTitleTextsNodesets">
[8637]341                                <xsl:with-param name="title"                 select="'Overview'"/>
[19863]342                                <xsl:with-param name="additionalClasses"     select="'Overview'"/>
[8637]343                                <xsl:with-param name="contentBlockType"      select="'expandable'"/>
[8572]344                                <xsl:with-param name="expandableContentShow" select="true()"/>
345                                <xsl:with-param name="addWikiAttribute"      select="true()"/>
346                                <xsl:with-param name="titleAndTextsNodeset"  select="/QUERY_MODULE/CRITERIA/OVERVIEWS/OVERVIEW"/>
[6298]347                        </xsl:call-template>
[2554]348
349                        <!-- do the step sections - questions and answers -->
[5342]350                        <xsl:for-each select="/QUERY_MODULE/CRITERIA/SECTIONS/SECTION">
351                                <xsl:call-template name="SectionSelections.expandableContentSection">
352                                        <xsl:with-param name="section"            select="."/>
353                                        <xsl:with-param name="sectionNumber"      select="position()"/>
354                                </xsl:call-template>
355                        </xsl:for-each>
[2554]356
[17255]357                        <!-- show the display options section next -->
[6298]358                        <xsl:call-template name="ContentContainer.expandable">
[7806]359                                <xsl:with-param name="title"       select="concat('Step ', count($sections/SECTION) + 1, ': How to display the data')"/>
[6298]360                                <xsl:with-param name="description" select="'Show/hide display options'"/>
361                                <xsl:with-param name="subTitleContent">
[5752]362                                        <span id="displayControlSectionSelectedValues" class="SelectedValues"/>
[6298]363                                </xsl:with-param>
364                                <xsl:with-param name="accesskey"   select="'D'"/>
365                                <xsl:with-param name="content">
[5752]366                                        <xsl:call-template name="Builder.displayControl"/>
[6298]367                                </xsl:with-param>
368                        </xsl:call-template>
[2554]369
[5342]370                        <!-- finally the finish/submit section -->
[19867]371                        <div style="margin-top: 1rem;">
372                                <xsl:call-template name="Builder.submitControl"/>
373                        </div>
[2554]374
375                </form>
376
377                <xsl:call-template name="Builder.initContent"/>
378        </xsl:template>
379
380</xsl:stylesheet>
381<!-- ============================= End of File ============================= -->
382
Note: See TracBrowser for help on using the repository browser.