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

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

view - More xslt updates kendo working but needs polish.

File size: 15.7 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
48                <xsl:variable name="datasetRecords" select="$indicator/DATASETS/DATASET[NAME = $indicatorView/DATASET_NAMES/DATASET_NAME]/RECORDS/RECORD"/>
49                <xsl:variable name="measure"     select="$indicatorView/MEASURE"/>
50                <xsl:variable name="measureName" select="$measure/NAME"/>
51                <xsl:variable name="recordArrayDimensions">
52                        <xsl:if test="1 &lt; count($indicatorView/DIMENSIONS/DIMENSION[USAGE='series']/VALUES/VALUE)">
53                        <DIMENSION>
54                                <NAME>SERIES</NAME>
55                                <TITLE><xsl:value-of select="$indicatorView/DIMENSIONS/DIMENSION[USAGE='series']/TITLE"/></TITLE>
56                                <USAGE>series</USAGE>
57                        </DIMENSION>
58                        </xsl:if>
59                        <DIMENSION>
60                                <NAME>CATEGORY</NAME>
61                                <xsl:copy-of select="$indicatorView/DIMENSIONS/DIMENSION[USAGE='category']/TITLE"/>
62                        </DIMENSION>
63                </xsl:variable>
64
65                <script type="text/javascript">
66                        var kendoDatasourceRecords =
67                        <xsl:call-template name="Interactive.getIndicatorViewJSONDataRecords">
68                                <xsl:with-param name="indicatorView"  select="$indicatorView"/>
69                                <xsl:with-param name="datasetRecords" select="$datasetRecords"/>
70                                <xsl:with-param name="valueFormatPattern" select="$indicator/VALUE_TYPE/XSLT_FORMAT_PATTERN/text()"/>
71                        </xsl:call-template>
72                        ;
73
74                        var kendoDataSource = new kendo.data.DataSource(
75                                <xsl:call-template name="Kendo.dataSourceConstructorJSON">
76                                        <xsl:with-param name="javascriptRecordArrayVariableName" select="'kendoDatasourceRecords'"/>
77                                        <xsl:with-param name="recordArrayDimensionFieldNames" select="$recordArrayDimensions/DIMENSION/NAME"/>
78                                        <xsl:with-param name="recordArrayMeasureFieldNames"   select="$measure/NAME"/>
79                                        <xsl:with-param name="kendoDatasourceSortOrderFieldNames" select="'CATEGORYSortOrder'"/>
80                                </xsl:call-template>
81                        );
82
83
84
85
86
87
88
89                        <xsl:variable name="hasLowerLimit"  select="exists($datasetRecords[string-length(LOWER_CONFIDENCE_VALUE) != 0])"/>
90                        <xsl:variable name="hasUpperLimit"  select="exists($datasetRecords[string-length(UPPER_CONFIDENCE_VALUE) != 0])"/>
91                        <xsl:variable name="hasNumerator"   select="exists($datasetRecords[string-length(NUMERATOR)!= 0])"/>
92                        <xsl:variable name="hasDenominator" select="exists($datasetRecords[string-length(DENOMINATOR) != 0])"/>
93                        <xsl:variable name="hasLabel"       select="exists($datasetRecords[string-length(LABEL) != 0])"/>
94                        var kendoGridConstructorJSON = $.extend
95                        (true, {}
96                                ,<xsl:call-template name="Kendo.gridsJSON"/>
97                                ,<xsl:call-template name="Kendo.namedGridJSON">
98                                        <xsl:with-param name="gridConfigurationName" select="'indicatorProfiles'"/>
99                                </xsl:call-template>
100                                ,<xsl:call-template name="Kendo.requestGridJSON">
101                                        <xsl:with-param name="javascriptDataSourceVariableName" select="'kendoDataSource'"/>
102<xsl:with-param name="recordArrayDimensions" select="$recordArrayDimensions"/>
103<xsl:with-param name="measures" select="$measure"/>
104                                        <xsl:with-param name="gridMeasures">
105                                                <!-- Mesaure Value Type Elements Structure:
106                                                        GRID_MEASURE
107                                                                MEASURE_NAME
108                                                                COLUMNS
109                                                                        COLUMN
110                                                                                KENDO_DATASOURCE_FIELD_NAME
111                                                                                TITLE
112                                                                                TOTAL_VALUE             ~~ not avail for IP's
113                                                                                XSLT_FORMAT_PATTERN
114                                                                                [INFO_FIELD_FLAG]
115                                                -->
116                                                <GRID_MEASURE>
117                                                        <MEASURE_NAME><xsl:value-of select="$measureName"/></MEASURE_NAME>
118                                                        <COLUMNS>
119                                                                <COLUMN>
120                                                                        <TITLE><xsl:value-of select="$measure/TITLE"/></TITLE>
121                                                                        <KENDO_DATASOURCE_FIELD_NAME><xsl:value-of select="$measureName"/></KENDO_DATASOURCE_FIELD_NAME>
122<xsl:copy-of select="$indicatorFormatPattern"/>
123                                                                </COLUMN>
124                                                <xsl:if test="$hasLowerLimit">
125                                                                <COLUMN>
126                                                                        <TITLE>Lower 95% CI</TITLE>
127                                                                        <KENDO_DATASOURCE_FIELD_NAME><xsl:value-of select="$measureName"/>LowerLimit</KENDO_DATASOURCE_FIELD_NAME>
128                                                                        <xsl:copy-of select="$valueFormatPattern"/>
129                                                                </COLUMN>
130                                                </xsl:if>
131                                                <xsl:if test="$hasUpperLimit">
132                                                                <COLUMN>
133                                                                        <TITLE>Upper 95% CI</TITLE>
134                                                                        <KENDO_DATASOURCE_FIELD_NAME><xsl:value-of select="$measureName"/>UpperLimit</KENDO_DATASOURCE_FIELD_NAME>
135                                                                        <xsl:copy-of select="$valueFormatPattern"/>
136                                                                </COLUMN>
137                                                </xsl:if>
138                                                <xsl:if test="$hasNumerator">
139                                                                <COLUMN>
140                                                                        <TITLE>Numerator</TITLE>
141                                                                        <KENDO_DATASOURCE_FIELD_NAME><xsl:value-of select="$measureName"/>Numerator</KENDO_DATASOURCE_FIELD_NAME>
142                                                                        <xsl:copy-of select="$Interactive.numerDenomXSLTFormatPattern"/>
143                                                                </COLUMN>
144                                                </xsl:if>
145                                                <xsl:if test="$hasDenominator">
146                                                                <COLUMN>
147                                                                        <TITLE>Denominator</TITLE>
148                                                                        <KENDO_DATASOURCE_FIELD_NAME><xsl:value-of select="$measureName"/>Denominator</KENDO_DATASOURCE_FIELD_NAME>
149                                                                        <xsl:copy-of select="$Interactive.numerDenomXSLTFormatPattern"/>
150                                                                </COLUMN>
151                                                </xsl:if>
152                                                <xsl:if test="$hasLabel">
153                                                                <COLUMN>
154                                                                        <TITLE>Other</TITLE>
155                                                                        <KENDO_DATASOURCE_FIELD_NAME><xsl:value-of select="$measureName"/>Label</KENDO_DATASOURCE_FIELD_NAME>
156                                                                        <INFO_FIELD_FLAG/>
157                                                                </COLUMN>
158                                                </xsl:if>
159                                                        </COLUMNS>
160                                                </GRID_MEASURE>
161                                        </xsl:with-param>
162                                </xsl:call-template>
163                        );
164
165
166
167
168
169                        var kendoChartConstructorJSON = $.extend
170                        (true, {}
171                                ,<xsl:call-template name="Kendo.chartsJSON"/>
172                                ,<xsl:call-template name="Kendo.namedChartJSON">
173                                        <xsl:with-param name="chartName" select="if(string-length($ChartName) != 0) then $ChartName else $indicatorView/CHART_NAME"/>
174                                </xsl:call-template>
175                                ,<xsl:call-template name="Kendo.requestChartJSON">
176                                        <xsl:with-param name="javascriptDataSourceVariableName" select="'kendoDataSource'"/>
177<xsl:with-param name="seriesName"           select="'SERIES'"/>
178<xsl:with-param name="categoryName"         select="'CATEGORY'"/>
179                                        <xsl:with-param name="measure"                  select="$measure"/>
180
181                                        <xsl:with-param name="title"                select="ibis:getCompleteIndicatorViewTitle($indicatorView)"/>
182                                        <xsl:with-param name="seriesTitle"          select="$indicatorView/DATASET_SERIES/TITLE"/>
183                                        <xsl:with-param name="categoryTitle"        select="$indicatorView/DATASET_CATEGORY/LABEL"/>
184                                        <xsl:with-param name="valueTitle"           select="$indicatorView/MEASURE/TITLE"/>
185
186                                        <xsl:with-param name="includeLimits"        select="$hasLowerLimit"/>
187                                        <xsl:with-param name="includeNumerator"     select="$hasNumerator"/>
188                                        <xsl:with-param name="includeDenominator"   select="$hasDenominator"/>
189                                </xsl:call-template>
190                        );
191//console.debug("%o", kendoChartConstructorJSON);
192//console.log(JSON.stringify(kendoChartConstructorJSON,null,2)); 
193
194                        var $kendoGrid;
195                        var $kendoChart;
196                        var $leafletMap;
197                        $(document).ready(function()
198                        {
199                                $kendoGrid  = $("#grid").kendoGrid (kendoGridConstructorJSON);
200                                $kendoChart = $("#chart").kendoChart(kendoChartConstructorJSON);
201                                kendoDataSource.read();         // have to have after grid and chart because .autoBind = false.
202
203// var firstSlot = $kendoChart.getKendoChart()._plotArea.axes[0].getSlot(0);
204// alert("first slot width" + firstSlot.width());
205<!--
206                        <xsl:if test="$LeafletMap.showMap">
207                                var leafletMapConstructorJSON = $.extend
208                                (true, {}
209                                        ,{localURLWebappPrefix: "<xsl:value-of select="$ibis.urlPrefix"/>"}
210                                        ,<xsl:call-template name="LeafletMap.mapsJSON"/>
211                                        ,<xsl:call-template name="LeafletMap.namedMapJSON"/>
212                                        ,<xsl:call-template name="LeafletMap.choroplethJSON">
213                                                <xsl:with-param name="javascriptRecordArrayVariableName" select="'kendoDataRecords'"/>
214<xsl:with-param name="geoIDFieldName" select="cleanedCategoryDimensionName"/>
215                                                <xsl:with-param name="geoTypeTitle"   select="$indicatorView/DATASET_CATEGORY/LABEL"/>
216                                                <xsl:with-param name="legendTitle"    select="$indicatorView/Y_TITLE"/>
217                                                <xsl:with-param name="reverseColors"  select="(string-length($indicatorView/TARGET_VALUE) != 0) and ($indicatorView/TARGET_VALUE = 1)"/>
218                                        </xsl:call-template>
219                                );
220                                $leafletMap = $("#map").leaflet(leafletMapConstructorJSON);
221
222                                <xsl:call-template name="LeafletMap.mapsJavaScript"/>
223                                <xsl:call-template name="LeafletMap.namedMapJavaScript"/>
224                        </xsl:if>
225-->
226                        }); //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ End of Function ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
227
228                        <xsl:call-template name="Kendo.chartsJavaScript"/>
229                        <xsl:call-template name="Kendo.namedChartJavaScript"/>
230                        <xsl:call-template name="Kendo.gridsJavaScript"/>
231                        <xsl:call-template name="Kendo.namedGridJavaScript"/>
232                </script>
233        </xsl:template>
234
235
236
237        <xsl:template name="Interactive.getIndicatorViewJSONDataRecords"
238                ibis:doc="Produces an indicator view records JSON data list.
239
240                        This builds a matrix of dataset records based on the dimensions and
241                        dimension values specified in the view.  The new record dimensions
242                        are converted from actual dimension names to 'series', 'category', and
243                        'constant' - due to IPVs being able to have different/multiple dimensions
244                        per dimension grouping.
245
246                        NOTES:
247                        - Missing values must be coded as 'null' - blank does not work.
248                        - For Kendo datasource can org records based on category with mult
249                          series and measures on the row or if using the Kendo group can
250                          organize in the typical IBIS struct. 
251                        - If mult measures then need to control group via script and some
252                          UI control.
253                        - For grid need to turn off certain columns from displaying.
254                        - IP's ALL have their Geos as categories...
255                "
256        >
257                <xsl:param name="indicatorView" ibis:doc="indicator view element
258                        that contains all the SERIES, CATEGORY, VALUE elements to be converted."
259                />
260                <xsl:param name="datasetRecords"     select="$indicator/DATASETS/DATASET[NAME = $indicatorView/DATASET_NAMES/DATASET_NAME]/RECORDS"/>
261                <xsl:param name="valueFormatPattern" select="$indicator/VALUE_TYPE/XSLT_FORMAT_PATTERN/text()"/>
262
263                <xsl:variable name="seriesDimensions"   select="$indicatorView/DIMENSIONS/DIMENSION[USAGE='series']"/>
264                <xsl:variable name="categoryDimensions" select="$indicatorView/DIMENSIONS/DIMENSION[USAGE='category']"/>
265                <xsl:variable name="constantDimensions" select="$indicatorView/DIMENSIONS/DIMENSION[USAGE='constant']"/>
266                <xsl:variable name="measureName"        select="$indicatorView/MEASURE/NAME"/>
267
268<xsl:text>[</xsl:text>
269                <xsl:for-each select="$seriesDimensions">
270                        <xsl:sort select="SORT_ORDER" order="ascending" data-type="number"/>
271                        <xsl:sort select="NAME"       order="ascending" data-type="text"/>
272                        <xsl:variable name="seriesDimension" select="."/>
273
274                        <xsl:for-each select="$seriesDimension/VALUES/VALUE">
275                                <xsl:sort select="SORT_ORDER" order="ascending" data-type="number"/>
276                                <xsl:variable name="seriesDimensionValue" select="."/>
277                                <xsl:variable name="seriesValuePosition"  select="position()"/>
278
279                                <xsl:for-each select="$categoryDimensions">
280                                        <xsl:sort select="SORT_ORDER" order="ascending" data-type="number"/>
281                                        <xsl:sort select="NAME"       order="ascending" data-type="text"/>
282                                        <xsl:variable name="categoryDimension" select="."/>
283
284                                        <xsl:for-each select="$categoryDimension/VALUES/VALUE">
285                                                <xsl:sort select="SORT_ORDER" order="ascending" data-type="number"/>
286                                                <xsl:variable name="categoryDimensionValue" select="."/>
287                                                <xsl:variable name="categoryValuePosition" select="position()"/>
288
289                                                <xsl:variable name="record" select="
290                                                        $datasetRecords[
291                                                                ((DIMENSIONS/DIMENSION/NAME  = $seriesDimension/NAME)
292                                                                        and
293                                                                 (DIMENSIONS/DIMENSION/VALUE = $seriesDimensionValue/VALUE))
294                                                                and
295                                                                ((DIMENSIONS/DIMENSION/NAME  = $categoryDimension/NAME)
296                                                                        and
297                                                                 (DIMENSIONS/DIMENSION/VALUE = $categoryDimensionValue/VALUE))
298                                                        ]"
299                                                />
300
301<xsl:if test="($seriesValuePosition != 1) or ($categoryValuePosition != 1)">,</xsl:if>
302{
303        rowID:<xsl:value-of select="concat($seriesValuePosition, '.', $categoryValuePosition)"/>
304        ,"SERIES":"<xsl:value-of select="concat($seriesDimension/NAME, '.', $seriesDimensionValue/VALUE)"/>"
305        ,"SERIESTitle":"<xsl:value-of select="$seriesDimensionValue/TITLE"/>"
306        ,"SERIESSortOrder":<xsl:value-of select="$seriesDimensionValue/SORT_ORDER"/>
307        ,"CATEGORY":"<xsl:value-of select="concat($categoryDimension/NAME, '.', $categoryDimensionValue/VALUE)"/>"
308        ,"CATEGORYTitle":"<xsl:value-of select="$categoryDimensionValue/TITLE"/>"
309        ,"CATEGORYSortOrder":<xsl:value-of select="$categoryDimensionValue/SORT_ORDER"/>
310        ,"<xsl:value-of select="$measureName"/>":<xsl:value-of                  select="ibis:getJavaScriptValue($record/VALUE)"/>
311        ,"<xsl:value-of select="$measureName"/>Title":"<xsl:value-of            select="ibis:getFormattedNumber($record/VALUE, $valueFormatPattern)"/>"
312        ,"<xsl:value-of select="$measureName"/>LowerLimit":<xsl:value-of        select="ibis:getJavaScriptValue($record/LOWER_CONFIDENCE_VALUE)"/>
313        ,"<xsl:value-of select="$measureName"/>LowerLimitTitle":"<xsl:value-of  select="ibis:getFormattedValue($record/LOWER_CONFIDENCE_VALUE, $valueFormatPattern, 'n/a')"/>"
314        ,"<xsl:value-of select="$measureName"/>UpperLimit":<xsl:value-of        select="ibis:getJavaScriptValue($record/UPPER_CONFIDENCE_VALUE)"/>
315        ,"<xsl:value-of select="$measureName"/>UpperLimitTitle":"<xsl:value-of  select="ibis:getFormattedValue($record/UPPER_CONFIDENCE_VALUE, $valueFormatPattern, 'n/a')"/>"
316        ,"<xsl:value-of select="$measureName"/>Numerator":<xsl:value-of         select="ibis:getJavaScriptValue($record/NUMERATOR)"/>
317        ,"<xsl:value-of select="$measureName"/>NumeratorTitle":"<xsl:value-of   select="ibis:getFormattedValue($record/NUMERATOR, $Interactive.numerDenomXSLTFormatPattern, 'n/a')"/>"
318        ,"<xsl:value-of select="$measureName"/>Denominator":<xsl:value-of       select="ibis:getJavaScriptValue($record/DENOMINATOR)"/>
319        ,"<xsl:value-of select="$measureName"/>DenominatorTitle":"<xsl:value-of select="ibis:getFormattedValue($record/DENOMINATOR, $Interactive.numerDenomXSLTFormatPattern, 'n/a')"/>"
320        ,"<xsl:value-of select="$measureName"/>Label":"<xsl:value-of select="$record/LABEL"/>"
321        ,"<xsl:value-of select="$measureName"/>Note":"<xsl:value-of  select="$record/NOTE"/>"
322}
323                                        </xsl:for-each>
324                                </xsl:for-each>
325                        </xsl:for-each>
326                </xsl:for-each>
327<xsl:text>]</xsl:text>
328
329        </xsl:template>
330
331</xsl:stylesheet>
332<!-- ============================= End of File ============================= -->
Note: See TracBrowser for help on using the repository browser.