source: main/trunk/ibisph-view/src/main/webapp/xslt/html/indicator/profile/interactive/Interactive.xslt @ 13530

Last change on this file since 13530 was 13530, checked in by Garth Braithwaite, 3 years ago

db, java, xslt - cleaned up the dims to iv sql. Based inserts on actual IVV records because had duplicates. Also based on active records which does not quite line up with production NM data but it appears to check out.

File size: 18.4 KB
Line 
1<?xml version="1.0" encoding="ISO-8859-1"?>
2
3<xsl:stylesheet version="2.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
10        <ibis:doc>
11                <name>html/indicator/profile/Interactive</name>
12                <summary>Provides IP Kendo Datasource, grid, chart script generation</summary>
13                <description>
14                        Provides an API template that can be used to create list
15                        data value tables based on the INDICATOR_VIEW_VALUES elements.
16                </description>
17
18                <author>Garth Braithwaite</author>
19                <company>Software Technology Group/CDC/Utah Department of Health</company>
20        </ibis:doc>
21
22
23        <xsl:param name="Interactive.invalidJavaScriptCharsToStrip" select="'.-+%$#@^*()=/'"/>
24        <xsl:param name="Interactive.numerDenomXSLTFormatPattern">
25                <XSLT_FORMAT_PATTERN>,##0.##</XSLT_FORMAT_PATTERN>
26        </xsl:param>
27
28
29
30        <xsl:template name="Interactive.leafletKendoScript" 
31                ibis:doc="Main page.xslt call - provides the kendo and leaflet javascript"
32        >
33                <xsl:param name="indicatorView"/>
34
35<xsl:param name="valueFormatPattern" select="$indicator/VALUE_TYPE/XSLT_FORMAT_PATTERN"/>
36<xsl:param name="indicatorFormatPattern" select="$indicator/VALUE_TYPE/FORMAT_PATTERN"/>
37<xsl:message select="$indicatorFormatPattern"/>
38
39                <xsl:if test="$LeafletMap.showMap">
40                        <xsl:call-template name="LeafletMap.choroplethJavaScript"/>
41                </xsl:if>
42                <!-- tried doing jsonp tech but callback func must be defined before doing the script jsonp
43                        so you'd have the variable = null, call back, end of script, include jsonp, then contructor
44                        script.  Very messy - decided just to do simple var and include it.
45                -->
46
47                <xsl:variable name="seriesTitle">
48                        <xsl:choose>
49                                <xsl:when test="0 != string-length($indicatorView/SUBSTITUTE_SERIES_TITLE)">
50                                        <xsl:value-of select="SUBSTITUTE_SERIES_TITLE"/>
51                                </xsl:when>
52                                <xsl:otherwise>
53                                        <xsl:call-template name="Interactive.csvDimensionsTitleList">
54                                                <xsl:with-param name="dimensions" select="$indicatorView/DIMENSIONS/DIMENSION[USAGE='series']"/>
55                                        </xsl:call-template>
56                                </xsl:otherwise>
57                        </xsl:choose>
58                </xsl:variable>
59                <xsl:variable name="categoryTitle">
60                        <xsl:choose>
61                                <xsl:when test="0 != string-length($indicatorView/SUBSTITUTE_SERIES_TITLE)">
62                                        <xsl:value-of select="SUBSTITUTE_CATEGORY_TITLE"/>
63                                </xsl:when>
64                                <xsl:otherwise>
65                                        <xsl:call-template name="Interactive.csvDimensionsTitleList">
66                                                <xsl:with-param name="dimensions" select="$indicatorView/DIMENSIONS/DIMENSION[USAGE='category']"/>
67                                        </xsl:call-template>
68                                </xsl:otherwise>
69                        </xsl:choose>
70                </xsl:variable>
71
72                <xsl:variable name="datasetRecords" select="$indicator/DATASETS/DATASET[NAME = $indicatorView/DATASET_NAMES/DATASET_NAME]/RECORDS/RECORD"/>
73
74                <xsl:variable name="datasetRecords" select="$indicator/DATASETS/DATASET[NAME = $indicatorView/DATASET_NAMES/DATASET_NAME]/RECORDS/RECORD"/>
75                <xsl:variable name="measure"     select="$indicatorView/MEASURE"/>
76                <xsl:variable name="measureName" select="$measure/NAME"/>
77                <xsl:variable name="recordArrayDimensions">
78                        <xsl:if test="1 &lt; count($indicatorView/DIMENSIONS/DIMENSION[USAGE='series']/VALUES/VALUE)">
79                        <DIMENSION>
80                                <NAME>SERIES</NAME>
81                                <TITLE><xsl:value-of select="$indicatorView/DIMENSIONS/DIMENSION[USAGE='series']/TITLE"/></TITLE>
82                                <USAGE>series</USAGE>
83                        </DIMENSION>
84                        </xsl:if>
85                        <DIMENSION>
86                                <NAME>CATEGORY</NAME>
87                                <xsl:copy-of select="$indicatorView/DIMENSIONS/DIMENSION[USAGE='category']/TITLE"/>
88                        </DIMENSION>
89                </xsl:variable>
90
91                <script type="text/javascript">
92                        var kendoDatasourceRecords =
93                        <xsl:call-template name="Interactive.getIndicatorViewJSONDataRecords">
94                                <xsl:with-param name="indicatorView"  select="$indicatorView"/>
95                                <xsl:with-param name="datasetRecords" select="$datasetRecords"/>
96                                <xsl:with-param name="valueFormatPattern" select="$indicator/VALUE_TYPE/XSLT_FORMAT_PATTERN/text()"/>
97                        </xsl:call-template>
98                        ;
99
100                        var kendoDataSource = new kendo.data.DataSource(
101                                <xsl:call-template name="Kendo.dataSourceConstructorJSON">
102                                        <xsl:with-param name="javascriptRecordArrayVariableName" select="'kendoDatasourceRecords'"/>
103                                        <xsl:with-param name="recordArrayDimensionFieldNames" select="$recordArrayDimensions/DIMENSION/NAME"/>
104                                        <xsl:with-param name="recordArrayMeasureFieldNames"   select="$measure/NAME"/>
105                                        <xsl:with-param name="kendoDatasourceSortOrderFieldNames" select="'CATEGORYSortOrder'"/>
106                                </xsl:call-template>
107                        );
108
109
110
111
112
113
114
115                        <xsl:variable name="hasLowerLimit"  select="exists($datasetRecords[string-length(LOWER_CONFIDENCE_VALUE) != 0])"/>
116                        <xsl:variable name="hasUpperLimit"  select="exists($datasetRecords[string-length(UPPER_CONFIDENCE_VALUE) != 0])"/>
117                        <xsl:variable name="hasNumerator"   select="exists($datasetRecords[string-length(NUMERATOR)!= 0])"/>
118                        <xsl:variable name="hasDenominator" select="exists($datasetRecords[string-length(DENOMINATOR) != 0])"/>
119                        <xsl:variable name="hasLabel"       select="exists($datasetRecords[string-length(LABEL) != 0])"/>
120                        var kendoGridConstructorJSON = $.extend
121                        (true, {}
122                                ,<xsl:call-template name="Kendo.gridsJSON"/>
123                                ,<xsl:call-template name="Kendo.namedGridJSON">
124                                        <xsl:with-param name="gridConfigurationName" select="'indicatorProfiles'"/>
125                                </xsl:call-template>
126                                ,<xsl:call-template name="Kendo.requestGridJSON">
127                                        <xsl:with-param name="javascriptDataSourceVariableName" select="'kendoDataSource'"/>
128<xsl:with-param name="recordArrayDimensions" select="$recordArrayDimensions"/>
129<xsl:with-param name="measures" select="$measure"/>
130                                        <xsl:with-param name="gridMeasures">
131                                                <!-- Mesaure Value Type Elements Structure:
132                                                        GRID_MEASURE
133                                                                MEASURE_NAME
134                                                                COLUMNS
135                                                                        COLUMN
136                                                                                KENDO_DATASOURCE_FIELD_NAME
137                                                                                TITLE
138                                                                                TOTAL_VALUE             ~~ not avail for IP's
139                                                                                XSLT_FORMAT_PATTERN
140                                                                                [INFO_FIELD_FLAG]
141                                                -->
142                                                <GRID_MEASURE>
143                                                        <MEASURE_NAME><xsl:value-of select="$measureName"/></MEASURE_NAME>
144                                                        <COLUMNS>
145                                                                <COLUMN>
146                                                                        <TITLE><xsl:value-of select="$measure/TITLE"/></TITLE>
147                                                                        <KENDO_DATASOURCE_FIELD_NAME><xsl:value-of select="$measureName"/></KENDO_DATASOURCE_FIELD_NAME>
148<xsl:copy-of select="$indicatorFormatPattern"/>
149                                                                </COLUMN>
150                                                <xsl:if test="$hasLowerLimit">
151                                                                <COLUMN>
152                                                                        <TITLE>Lower 95% CI</TITLE>
153                                                                        <KENDO_DATASOURCE_FIELD_NAME><xsl:value-of select="$measureName"/>LowerLimit</KENDO_DATASOURCE_FIELD_NAME>
154                                                                        <xsl:copy-of select="$valueFormatPattern"/>
155                                                                </COLUMN>
156                                                </xsl:if>
157                                                <xsl:if test="$hasUpperLimit">
158                                                                <COLUMN>
159                                                                        <TITLE>Upper 95% CI</TITLE>
160                                                                        <KENDO_DATASOURCE_FIELD_NAME><xsl:value-of select="$measureName"/>UpperLimit</KENDO_DATASOURCE_FIELD_NAME>
161                                                                        <xsl:copy-of select="$valueFormatPattern"/>
162                                                                </COLUMN>
163                                                </xsl:if>
164                                                <xsl:if test="$hasNumerator">
165                                                                <COLUMN>
166                                                                        <TITLE>Numerator</TITLE>
167                                                                        <KENDO_DATASOURCE_FIELD_NAME><xsl:value-of select="$measureName"/>Numerator</KENDO_DATASOURCE_FIELD_NAME>
168                                                                        <xsl:copy-of select="$Interactive.numerDenomXSLTFormatPattern"/>
169                                                                </COLUMN>
170                                                </xsl:if>
171                                                <xsl:if test="$hasDenominator">
172                                                                <COLUMN>
173                                                                        <TITLE>Denominator</TITLE>
174                                                                        <KENDO_DATASOURCE_FIELD_NAME><xsl:value-of select="$measureName"/>Denominator</KENDO_DATASOURCE_FIELD_NAME>
175                                                                        <xsl:copy-of select="$Interactive.numerDenomXSLTFormatPattern"/>
176                                                                </COLUMN>
177                                                </xsl:if>
178                                                <xsl:if test="$hasLabel">
179                                                                <COLUMN>
180                                                                        <TITLE>Other</TITLE>
181                                                                        <KENDO_DATASOURCE_FIELD_NAME><xsl:value-of select="$measureName"/>Label</KENDO_DATASOURCE_FIELD_NAME>
182                                                                        <INFO_FIELD_FLAG/>
183                                                                </COLUMN>
184                                                </xsl:if>
185                                                        </COLUMNS>
186                                                </GRID_MEASURE>
187                                        </xsl:with-param>
188                                </xsl:call-template>
189                        );
190
191
192
193
194
195                        var kendoChartConstructorJSON = $.extend
196                        (true, {}
197                                ,<xsl:call-template name="Kendo.chartsJSON"/>
198                                ,<xsl:call-template name="Kendo.namedChartJSON">
199                                        <xsl:with-param name="chartName" select="if(string-length($ChartName) != 0) then $ChartName else $indicatorView/CHART_NAME"/>
200                                </xsl:call-template>
201                                ,<xsl:call-template name="Kendo.requestChartJSON">
202                                        <xsl:with-param name="javascriptDataSourceVariableName" select="'kendoDataSource'"/>
203<xsl:with-param name="seriesName"           select="'SERIES'"/>
204<xsl:with-param name="categoryName"         select="'CATEGORY'"/>
205                                        <xsl:with-param name="measure"                  select="$measure"/>
206
207                                        <xsl:with-param name="title"                select="ibis:getCompleteIndicatorViewTitle($indicatorView)"/>
208                                        <xsl:with-param name="seriesTitle"          select="$seriesTitle"/>
209                                        <xsl:with-param name="categoryTitle"        select="$categoryTitle"/>
210                                        <xsl:with-param name="valueTitle"           select="$indicatorView/MEASURE/TITLE"/>
211
212                                        <xsl:with-param name="includeLimits"        select="$hasLowerLimit"/>
213                                        <xsl:with-param name="includeNumerator"     select="$hasNumerator"/>
214                                        <xsl:with-param name="includeDenominator"   select="$hasDenominator"/>
215                                </xsl:call-template>
216                        );
217//console.debug("%o", kendoChartConstructorJSON);
218//console.log(JSON.stringify(kendoChartConstructorJSON,null,2)); 
219
220                        var $kendoGrid;
221                        var $kendoChart;
222                        var $leafletMap;
223                        $(document).ready(function()
224                        {
225                                $kendoGrid  = $("#grid").kendoGrid (kendoGridConstructorJSON);
226                                $kendoChart = $("#chart").kendoChart(kendoChartConstructorJSON);
227                                kendoDataSource.read();         // have to have after grid and chart because .autoBind = false.
228
229// var firstSlot = $kendoChart.getKendoChart()._plotArea.axes[0].getSlot(0);
230// alert("first slot width" + firstSlot.width());
231<!--
232                        <xsl:if test="$LeafletMap.showMap">
233                                var leafletMapConstructorJSON = $.extend
234                                (true, {}
235                                        ,{localURLWebappPrefix: "<xsl:value-of select="$ibis.urlPrefix"/>"}
236                                        ,<xsl:call-template name="LeafletMap.mapsJSON"/>
237                                        ,<xsl:call-template name="LeafletMap.namedMapJSON"/>
238                                        ,<xsl:call-template name="LeafletMap.choroplethJSON">
239                                                <xsl:with-param name="javascriptRecordArrayVariableName" select="'kendoDataRecords'"/>
240<xsl:with-param name="geoIDFieldName" select="cleanedCategoryDimensionName"/>
241                                                <xsl:with-param name="geoTypeTitle"   select="$indicatorView/DATASET_CATEGORY/LABEL"/>
242                                                <xsl:with-param name="legendTitle"    select="$indicatorView/Y_TITLE"/>
243                                                <xsl:with-param name="reverseColors"  select="(string-length($indicatorView/TARGET_VALUE) != 0) and ($indicatorView/TARGET_VALUE = 1)"/>
244                                        </xsl:call-template>
245                                );
246                                $leafletMap = $("#map").leaflet(leafletMapConstructorJSON);
247
248                                <xsl:call-template name="LeafletMap.mapsJavaScript"/>
249                                <xsl:call-template name="LeafletMap.namedMapJavaScript"/>
250                        </xsl:if>
251-->
252                        }); //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ End of Function ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
253
254                        <xsl:call-template name="Kendo.chartsJavaScript"/>
255                        <xsl:call-template name="Kendo.namedChartJavaScript"/>
256                        <xsl:call-template name="Kendo.gridsJavaScript"/>
257                        <xsl:call-template name="Kendo.namedGridJavaScript"/>
258                </script>
259        </xsl:template>
260
261
262
263        <xsl:template name="Interactive.getIndicatorViewJSONDataRecords"
264                ibis:doc="Produces an indicator view records JSON data list.
265
266                        This builds a matrix of dataset records based on the dimensions and
267                        dimension values specified in the view.  The new record dimensions
268                        are converted from actual dimension names to 'series', 'category', and
269                        'constant' - due to IPVs being able to have different/multiple dimensions
270                        per dimension grouping.
271
272                        NOTES:
273                        - Missing values must be coded as 'null' - blank does not work.
274                        - For Kendo datasource can org records based on category with mult
275                          series and measures on the row or if using the Kendo group can
276                          organize in the typical IBIS struct. 
277                        - If mult measures then need to control group via script and some
278                          UI control.
279                        - For grid need to turn off certain columns from displaying.
280                        - IP's ALL have their Geos as categories...
281                "
282        >
283                <xsl:param name="indicatorView" ibis:doc="indicator view element
284                        that contains all the SERIES, CATEGORY, VALUE elements to be converted."
285                />
286                <xsl:param name="datasetRecords"     select="$indicator/DATASETS/DATASET[NAME = $indicatorView/DATASET_NAMES/DATASET_NAME]/RECORDS"/>
287                <xsl:param name="valueFormatPattern" select="$indicator/VALUE_TYPE/XSLT_FORMAT_PATTERN/text()"/>
288
289                <xsl:variable name="seriesDimensions"   select="$indicatorView/DIMENSIONS/DIMENSION[USAGE='series']"/>
290                <xsl:variable name="categoryDimensions" select="$indicatorView/DIMENSIONS/DIMENSION[USAGE='category']"/>
291                <xsl:variable name="constantDimensions" select="$indicatorView/DIMENSIONS/DIMENSION[USAGE='constant']"/>
292                <xsl:variable name="measureName"        select="$indicatorView/MEASURE/NAME"/>
293
294<!--
295<xsl:message select="count($seriesDimensions/VALUES/VALUE)"/>
296<xsl:message select="'series dims: '"/>
297<xsl:message select="'cat dims: '"/>
298<xsl:message select="$categoryDimensions"/>
299-->
300
301<xsl:text>[</xsl:text>
302                <xsl:for-each select="$seriesDimensions">
303                        <xsl:sort select="SORT_ORDER" order="ascending" data-type="number"/>
304                        <xsl:sort select="NAME"       order="ascending" data-type="text"/>
305                        <xsl:variable name="seriesDimension" select="."/>
306                        <xsl:variable name="seriesPosition"  select="position()"/>
307
308                        <xsl:for-each select="$seriesDimension/VALUES/VALUE">
309                                <xsl:sort select="SORT_ORDER" order="ascending" data-type="number"/>
310                                <xsl:variable name="seriesDimensionValue" select="."/>
311                                <xsl:variable name="seriesValuePosition"  select="position()"/>
312
313                                <xsl:for-each select="$categoryDimensions">
314                                        <xsl:sort select="SORT_ORDER" order="ascending" data-type="number"/>
315                                        <xsl:sort select="NAME"       order="ascending" data-type="text"/>
316                                        <xsl:variable name="categoryDimension" select="."/>
317                                        <xsl:variable name="categoryPosition"  select="position()"/>
318
319                                        <xsl:for-each select="$categoryDimension/VALUES/VALUE">
320                                                <xsl:sort select="SORT_ORDER" order="ascending" data-type="number"/>
321                                                <xsl:variable name="categoryDimensionValue" select="."/>
322                                                <xsl:variable name="categoryValuePosition" select="position()"/>
323
324                                                <xsl:variable name="record" select="
325                                                        $datasetRecords[
326                                                                (DIMENSIONS/DIMENSION/NAME  = $seriesDimension/NAME)
327                                                                        and
328                                                                 (DIMENSIONS/DIMENSION/VALUE = $seriesDimensionValue/VALUE)
329                                                                ][
330                                                                (DIMENSIONS/DIMENSION/NAME  = $categoryDimension/NAME)
331                                                                        and
332                                                                 (DIMENSIONS/DIMENSION/VALUE = $categoryDimensionValue/VALUE)
333                                                                ]"
334                                                />
335
336<!--
337<xsl:message select="'seriesDimension:'"/>
338<xsl:message select="$seriesDimension"/>
339
340<xsl:message select="concat('current series: ', $seriesDimension/NAME,    ':', $seriesDimensionValue/VALUE[1], ' value position: ', $seriesValuePosition)"/>
341<xsl:message select="concat('current cat: ',    $categoryDimension/NAME,  ':', $categoryDimensionValue/VALUE, ', category value position: ', $categoryValuePosition)"/>
342<xsl:message select="$seriesDimensionValue"/>
343<xsl:message select="."/>
344<xsl:message select="'end'"/>
345<xsl:message select="count($record)"/>
346
347<xsl:message select="concat('series value position: ', $seriesValuePosition, ', category value position: ', position())"/>
348
349<xsl:message select="$datasetRecords[1]/DIMENSIONS/DIMENSION/NAME"/>
350<xsl:message select="$datasetRecords[1]/DIMENSIONS/DIMENSION/VALUE"/>
351<xsl:message select="$datasetRecords[1]/VALUE"/>
352<xsl:message select="$record"/>
353-->
354
355<xsl:if test="($categoryValuePosition != 1) or ($categoryPosition != 1) or ($seriesValuePosition != 1) or ($seriesPosition != 1)">,</xsl:if>
356{
357        rowID:<xsl:value-of select="concat($seriesValuePosition, '.', $categoryValuePosition)"/>
358        ,"SERIES":"<xsl:value-of select="concat($seriesDimension/NAME, '.', $seriesDimensionValue/VALUE)"/>"
359        ,"SERIESTitle":"<xsl:value-of select="$seriesDimensionValue/TITLE"/>"
360        ,"SERIESSortOrder":<xsl:value-of select="$seriesDimensionValue/SORT_ORDER"/>
361        ,"CATEGORY":"<xsl:value-of select="concat($categoryDimension/NAME, '.', $categoryDimensionValue/VALUE)"/>"
362        ,"CATEGORYTitle":"<xsl:value-of select="$categoryDimensionValue/TITLE"/>"
363        ,"CATEGORYSortOrder":<xsl:value-of select="$categoryDimensionValue/SORT_ORDER"/>
364        ,"<xsl:value-of select="$measureName"/>":<xsl:value-of                  select="ibis:getJavaScriptValue($record/VALUE)"/>
365        ,"<xsl:value-of select="$measureName"/>Title":"<xsl:value-of            select="ibis:getFormattedNumber($record/VALUE, $valueFormatPattern)"/>"
366        ,"<xsl:value-of select="$measureName"/>LowerLimit":<xsl:value-of        select="ibis:getJavaScriptValue($record/LOWER_CONFIDENCE_VALUE)"/>
367        ,"<xsl:value-of select="$measureName"/>LowerLimitTitle":"<xsl:value-of  select="ibis:getFormattedValue($record/LOWER_CONFIDENCE_VALUE, $valueFormatPattern, 'n/a')"/>"
368        ,"<xsl:value-of select="$measureName"/>UpperLimit":<xsl:value-of        select="ibis:getJavaScriptValue($record/UPPER_CONFIDENCE_VALUE)"/>
369        ,"<xsl:value-of select="$measureName"/>UpperLimitTitle":"<xsl:value-of  select="ibis:getFormattedValue($record/UPPER_CONFIDENCE_VALUE, $valueFormatPattern, 'n/a')"/>"
370        ,"<xsl:value-of select="$measureName"/>Numerator":<xsl:value-of         select="ibis:getJavaScriptValue($record/NUMERATOR)"/>
371        ,"<xsl:value-of select="$measureName"/>NumeratorTitle":"<xsl:value-of   select="ibis:getFormattedValue($record/NUMERATOR, $Interactive.numerDenomXSLTFormatPattern, 'n/a')"/>"
372        ,"<xsl:value-of select="$measureName"/>Denominator":<xsl:value-of       select="ibis:getJavaScriptValue($record/DENOMINATOR)"/>
373        ,"<xsl:value-of select="$measureName"/>DenominatorTitle":"<xsl:value-of select="ibis:getFormattedValue($record/DENOMINATOR, $Interactive.numerDenomXSLTFormatPattern, 'n/a')"/>"
374        ,"<xsl:value-of select="$measureName"/>Label":"<xsl:value-of select="$record/LABEL"/>"
375        ,"<xsl:value-of select="$measureName"/>Note":"<xsl:value-of  select="$record/NOTE"/>"
376}
377                                        </xsl:for-each>
378                                </xsl:for-each>
379                        </xsl:for-each>
380                </xsl:for-each>
381<xsl:text>]</xsl:text>
382
383        </xsl:template>
384
385
386        <xsl:template name="Interactive.csvDimensionsTitleList"
387                ibis:doc="Internal template which builds a comma separated values
388                        (CSV) list of dimension titles. 
389                "
390        >
391                <xsl:param name="dimensions" ibis:doc="dimensions to look up value titles from."/>
392
393                <xsl:for-each select="distinct-values($dimensions/TITLE)">
394                        <xsl:if test="position() != 1">, </xsl:if>
395                        <xsl:value-of select="current()"/>
396                </xsl:for-each>
397        </xsl:template>
398
399</xsl:stylesheet>
400<!-- ============================= End of File ============================= -->
Note: See TracBrowser for help on using the repository browser.