source: main/trunk/ibisph-view/src/main/webapp/xslt/html/SelectionsList.xslt @ 19868

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

view - updated expandable list css and xslt.

File size: 18.3 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        xmlns:xs  ="http://www.w3.org/2001/XMLSchema"
7
8        exclude-result-prefixes="ibis xs"
9>
10
11        <ibis:doc>
12                <name>html/SelectionsList</name>
13                <summary>
14                        Basic templates that convert a SELECTIONS, SELECTION structure to
15                        a nested UL/LI list structure.  This list's selection structure 
16                        creation is optionally dependent on the SELECTION AUTHORITY and
17                        the user's Authorities.  If the SELECTION has an AUTHORITY then a
18                        matching userAuthorities/AUTHORITY is required for the selection
19                        to be included in the output.
20
21                        2/22/2013 - Code was based on apply-templates with a "mode".  This
22                        approach was implemented so that other SELECTION handlers could be
23                        plugged into the base list processing.  However, after going through
24                        usage, the code really boils down to 2 types; basic which is a simple
25                        UL/LI/A structure, and expandable which adds an HTML input and label
26                        elements for expansion control.  The main difference between the lists
27                        is the CSS that is applied.
28
29                        ID NOTE: did have code that generated nested id but the xslt generate-id
30                        does the same thing and no value is added by our own nesting (other than
31                        visual HTML code inspection).  The problem was that multiple lists on the
32                        same page could have same ID which results in incorrect containers being
33                        opened/closed.  Also had code that would use a NAME element for the ID
34                        but this is also problematic as menus and selection lists could have the
35                        same name/ID (no way to check uniqueness) which again resulted in incorrect
36                        behavior (when clicking on body selections and a menu would open up).  So
37                        as of 2/22/13 the ID can be supplied but if no value it is simply the xslt
38                        generate-id value.
39                </summary>
40                <description>
41                        XML______   HTML__  Notes____________________
42                    SELECTIONS    UL    [DESCRIPTION]=title, [ADDITIONAL_CLASSES]=class
43                          SELECTION     LI  [ADDITIONAL_CLASSES]=class
44                            SELECTIONS    UL
45                                  SELECTION     LI
46
47                        General/basic selections list HTML structure (no controlType specified)
48                        ul.[containerClass]
49                                li
50                                        [Help.content template - if SELECTIONS/HELP exists]
51
52                                        [A   [TITLE]=text, [DESC]=title, [URL]=href - if href]
53                                        [DIV [TITLE]=text, [DESC]=title - if NO href]
54
55                                        [A class=OffPage [NAME]=name - if NAME - this is a jump to]
56
57                                        [H# with SELECTIONS/TITLE - if containerTitleFlag is true and sub selections]
58                                        ul
59                                                li
60
61                        Expandable/input clickable selections list HTML structure (controlType specified)
62                        ul.[ExpandableList, containerClass]
63                                li
64                                        [Help.content template - if SELECTIONS/HELP exists]
65
66                                        - if sub selections -
67                                        [INPUT type="checkbox" id="xyz.#"
68                                        [LABEL for="xyz.#"  - if sub selections
69                                                [A   [TITLE]=text, [DESC]=title, [NAME]=name, [URL]=href - if href]
70                                                [DIV [TITLE]=text, [DESC]=title - if NO href]
71
72                                        - else if NO sub selections -
73                                        [A   [TITLE]=text, [DESC]=title, [URL]=href - if href]
74                                        [DIV [TITLE]=text, [DESC]=title - if NO href]
75
76                                        [A class=OffPage [NAME]=name - if NAME - this is a jump to]
77
78                                        [H# with SELECTIONS/TITLE - if containerTitleFlag is true and sub selections]
79                                        ul
80                                                li
81
82                  </description>
83
84        </ibis:doc>
85
86
87        <xsl:param name="SelectionsList.defaultShowDescription" select="false()" 
88                ibis:doc="Global param that allows an adopter to set the default value
89                        of the SelectionsList.processSelections's showDescription so that
90                        text blocks can be shown on selection lists. If true the XSLT code
91                        creates a div/block of 'DESCRIPTION' text within the selection.   
92                "
93        />
94
95
96        <xsl:template name="SelectionsList.processSelections" 
97                ibis:doc="Creates the UL/LI selections list HTML structure.  This code
98                        is recursively called via the processSelection template when a sub
99                        SELECTIONS element exists.  This template handles creation of a UL
100                        container (based on the supplied SELECTIONS element structure) then
101                        loops through and processes the sub SELECTION elements.
102                "
103        >
104                <xsl:param name="selections" 
105                        ibis:doc="SELECTIONS structure to be processed.  Note that the
106                                selections passed in should actually be select=SELECTIONS/*.
107                                This is consistent with all other variable/param elment naming.
108                                See xsd for SELECTIONS structuring.
109                        "
110                />
111                <xsl:param name="containerID" 
112                        ibis:doc="Optional HTML ID attribute value that is only used for the
113                                outer most UL container e.g. it is not propigated to lower levels.
114                        "
115                />
116                <xsl:param name="containerClass" 
117                        ibis:doc="Optional CSS class for the first/outer most UL container   
118                                element.  This is NOT propigated to lower sub level UL containers.
119                        "
120                />
121                <xsl:param name="showSelectionsTitle" select="false()" 
122                        ibis:doc="true = create an HTML H* block of 'SELECTIONS/TITLE' text
123                                before the UL list of selections.  Default=false - no H title -
124                                relies on the current container SELECTION's TITLE.
125                        "
126                />
127                <xsl:param name="controlType" 
128                        ibis:doc="Optional param that controls the type of control to build.
129                                Default is blank which results in a straight UL/LI/UL/LI... type
130                                list structure.  Valid values are 'checkbox' which results in
131                                a structure that when combined with the proper css provides
132                                multiple expandable selections.  'radio' is similar but only
133                                opens 1 expandable selections container at a time.
134                        "
135                />
136                <xsl:param name="titleLevel" as="xs:integer" select="2"
137                        ibis:doc="Optional level that controls the HTML h element for SELECTIONS/TITLE
138                                elements.  Default is '2' which results in SELECTIONS/TITLE values being
139                                placed within an HTML 'H2' elemenet.  This value is incremented for each
140                                successive SELECTIONS level.
141                        "
142                />
143                <xsl:param name="showDescription" select="$SelectionsList.defaultShowDescription" 
144                        ibis:doc="Optional boolean flag that if true will tell the XSLT code
145                                create a block of 'DESCRIPTION' text within the selection.   
146                        "
147                />
148                <xsl:param name="selectedSelectionName" 
149                        ibis:doc="Optional selection name value that if matches the
150                                SELECTION/NAME then the control is checked.
151                        "
152                />
153                <xsl:param name="additionalClassesIfSelectedSelectionName" select="'On'"
154                        ibis:doc="Optional additional LI class attribute to be added to any
155                                SELECTION/ADDITIONAL_CLASSES when the selectedSelectionName param
156                                matches a SELECTION/NAME.  Default=On
157                        "
158                />
159                <xsl:param name="show" select="exists($selections/SHOW)"/>
160
161                <!-- normalize the selections param to a list of SELECTION elements (in case of SELECTIONS being passed in). -->
162                <xsl:variable name="selections" select="if(exists($selections/SELECTIONS))then $selections/SELECTIONS else $selections"/>
163<!--
164<xsl:message select="$show"/>
165-->
166                <!--
167                        Name for the input that is only used for radio input controls.
168                        Not using the NAME but using the generate ID for uniqueness.
169                        For radio selections the INPUT NAME="###" must be the same
170                        to work correctly - as such it is generated based on the main
171                        containing SELECTIONS element.  Note that this value needs to
172                        be set before the loop so it applies to all radio inputs.
173                -->
174                <xsl:variable name="inputName" select="
175                        if($controlType = 'radio')then
176                                concat('inputControlGroupName.', generate-id($selections[1]))
177                        else
178                                ''
179                "/>
180
181<!--
182<xsl:message select="concat('~~~~~~~~~~~~ SelectionsList.xslt title level:', $titleLevel)"/>
183                <xsl:message select="'$selections:'"/>
184                <xsl:message select="$selections"/>
185<xsl:message select="$selections/SELECTION"/>
186-->
187                <xsl:if test="boolean($showSelectionsTitle) and (0 != string-length($selections/TITLE))">
188                        <xsl:element name="h{$titleLevel}">
189                                <xsl:attribute name="title" select="
190                                        if(string-length($selections/DESCRIPTION) != 0) then $selections/DESCRIPTION
191                                        else $selections/TITLE"
192                                />
193                                <xsl:value-of select="$selections/TITLE"/>
194                        </xsl:element>
195                </xsl:if>
196
197                <xsl:if test="exists($selections/SELECTION)">
198                <ul>
199                        <xsl:if test="string-length($containerID) != 0">
200                                <xsl:attribute name="id" select="$containerID"/>
201                        </xsl:if>
202                        <xsl:if test="string-length($selections/DESCRIPTION) != 0">
203                                <xsl:attribute name="title" select="$selections/DESCRIPTION"/>
204                        </xsl:if>
205                        <xsl:if test="exists($selections/ADDITIONAL_CLASSES) or (string-length($containerClass) != 0)">
206                                <xsl:attribute name="class" select="concat($containerClass, ' ', $selections/ADDITIONAL_CLASSES)"/>
207                        </xsl:if>
208                        <xsl:if test="exists($selections/STYLE)">
209                                <xsl:attribute name="style" select="$selections/STYLE"/>
210                        </xsl:if>
211
212                        <!--
213                                Could have done an apply-template instead of looping but
214                                looping was used for position() to build the nested ID which
215                                is not used any more but might be in the future.  This code is
216                                kept as it allows sorting and easier down stream titleLevel
217                                values.  It also allows this code to handle the li container
218                                and the setting of the basic attributes.
219                        -->
220                        <xsl:for-each select="$selections/SELECTION[ibis:hasAuthority(AUTHORITY)]">
221                                <xsl:variable name="additionalClasses">
222                                        <xsl:if test="exists(current()/ADDITIONAL_CLASSES)">
223                                                <xsl:value-of select="current()/ADDITIONAL_CLASSES"/>
224                                        </xsl:if>
225                                        <xsl:if test="((string-length($selectedSelectionName) != 0) and ($selectedSelectionName = current()/NAME))">
226                                                <xsl:value-of select="$additionalClassesIfSelectedSelectionName"/>
227                                        </xsl:if>
228                                </xsl:variable>
229
230                                <li>
231                                        <xsl:if test="string-length($additionalClasses) != 0">
232                                                <xsl:attribute name="class" select="$additionalClasses"/>
233                                        </xsl:if>
234                                        <xsl:if test="exists(current()/STYLE)">
235                                                <xsl:attribute name="style" select="current()/STYLE"/>
236                                        </xsl:if>
237
238                                        <xsl:variable name="href" select="
239                                                        if(string-length(current()/URL) != 0)then
240                                                                current()/URL
241                                                        else if(string-length(current()/LOCAL_URL) != 0)then
242                                                                concat($ibis.contextPath, current()/LOCAL_URL)
243                                                        else
244                                                                ''
245                                                "
246                                        />
247
248                                        <xsl:apply-templates select="current()/HELP" mode="Help.element"/>
249
250                                        <xsl:choose>
251                                                <xsl:when test="exists(current()/SELECTIONS) and (0 != string-length($controlType))">
252                                                        <xsl:call-template name="SelectionsList.processExpandableSelection">
253                                                                <xsl:with-param name="selection"  select="current()"/>
254                                                                <xsl:with-param name="href"       select="$href"/>
255                                                                <xsl:with-param name="inputType"  select="$controlType"/>
256                                                                <xsl:with-param name="inputName"  select="$inputName"/>
257                                                                <xsl:with-param name="show"       select="
258                                                                                $show or
259                                                                                ((0 != string-length($selectedSelectionName))
260                                                                                and
261                                                                                ($selectedSelectionName = current()/NAME))
262                                                                        "
263                                                                />
264                                                        </xsl:call-template>
265                                                </xsl:when>
266                                                <xsl:otherwise>
267                                                        <xsl:call-template name="SelectionsList.processSelection">
268                                                                <xsl:with-param name="selection"  select="current()"/>
269                                                                <xsl:with-param name="href"       select="$href"/>
270                                                                <xsl:with-param name="isLeafNode" select="exists(current()/SELECTIONS)"/>
271                                                                <xsl:with-param name="titleLevel" select="$titleLevel + 1"/>
272                                                        </xsl:call-template>
273                                                </xsl:otherwise>
274                                        </xsl:choose>
275
276                                        <xsl:if test="(string-length(NAME) != 0)">
277                                                <a id="{NAME}" class="OffPage"/>
278                                        </xsl:if>
279
280                                        <!-- finish up by recursing down if sub selections or show
281                                                the description if no sub selections and desc flag.
282                                        -->
283                                        <xsl:choose>
284                                                <xsl:when test="exists(current()/SELECTIONS)">
285                                                        <xsl:call-template name="SelectionsList.processSelections">
286                                                                <xsl:with-param name="selections"             select="current()/SELECTIONS"/>
287                                                                <xsl:with-param name="showDescription"        select="$showDescription"/>
288                                                                <xsl:with-param name="titleLevel"             select="$titleLevel + 1"/>
289                                                                <xsl:with-param name="showSelectionsTitle"    select="$showSelectionsTitle"/>
290                                                                <xsl:with-param name="controlType"            select="$controlType"/>
291                                                                <xsl:with-param name="selectedSelectionName"  select="$selectedSelectionName"/>
292                                                        </xsl:call-template>
293                                                </xsl:when>
294                                                <xsl:when test="($showDescription and boolean(current()/DESCRIPTION/text()))">
295                                                        <div class="Description"><xsl:value-of select="current()/DESCRIPTION"/></div>
296                                                </xsl:when>
297                                        </xsl:choose>
298
299                                </li>
300                        </xsl:for-each>
301                </ul>
302                </xsl:if>
303        </xsl:template>
304
305
306
307        <xsl:template name="SelectionsList.processSelection"
308                ibis:doc="Basic selection content handler.  Produces an HTML link with
309                        title as the text.  The idea is to have other SELECTION handlers
310                        that provide specific implementations.
311                "
312        >
313                <xsl:param name="selection"/>
314                <xsl:param name="title" select="$selection/TITLE"/>
315                <xsl:param name="titleLevel" as="xs:integer" select="-1"/>
316                <xsl:param name="href"/>
317                <xsl:param name="isLeafNode" select="false()"/>
318
319                <xsl:choose>
320                        <xsl:when test="0 != string-length($href)">
321                                <a href="{$href}" title="{
322                                        if(exists($selection/DESCRIPTION))then
323                                                normalize-space($selection/DESCRIPTION)
324                                        else if(string-length($href) != 0)then
325                                                concat('Page link for: ', $title)
326                                        else if(exists($selection/SELECTIONS))then
327                                                concat('Selections container for: ', $title)
328                                        else
329                                                concat('Inactive selection item: ', $title)
330                                        }"
331                                ><xsl:value-of select="$title"/></a>
332                        </xsl:when>
333                        <xsl:when test="exists($selection/CONTENT)">
334                                <xsl:apply-templates select="$selection/CONTENT/(text() | *)" mode="ibis.copy"/>
335                        </xsl:when>
336                        <xsl:when test="(0 &lt; $titleLevel) and (0 != string-length($title))">
337                                <xsl:element name="h{$titleLevel}"><xsl:value-of select="$title"/></xsl:element>
338                        </xsl:when>
339                        <xsl:otherwise><xsl:value-of select="$title"/></xsl:otherwise>
340                </xsl:choose>
341        </xsl:template>
342
343
344
345        <xsl:template name="SelectionsList.processExpandableSelection"
346                ibis:doc="selection/control/title handling"
347        >
348                <xsl:param name="selection"/>
349                <xsl:param name="title"     select="$selection/TITLE"/>
350                <xsl:param name="inputType" select="'checkbox'"/>
351                <xsl:param name="inputName"/>
352                <xsl:param name="href"/>
353                <xsl:param name="id"        select="concat('ExpandableListInputControl.', generate-id(.))"/>
354                <xsl:param name="show"/>
355
356                <xsl:call-template name="SelectionsList.inputControl">
357                        <xsl:with-param name="inputType" select="$inputType"/>
358                        <xsl:with-param name="inputName" select="$inputName"/>
359                        <xsl:with-param name="inputID"   select="$id"/>
360                        <xsl:with-param name="title"     select="$title"/>
361                        <xsl:with-param name="description" select="concat('Show/hide selection list control for ', $title)"/>
362                        <xsl:with-param name="show"      select="$show or exists($selection/SELECTIONS/SHOW)"/>
363                </xsl:call-template>
364        </xsl:template>
365
366
367
368        <xsl:template name="SelectionsList.inputControl">
369                <xsl:param name="inputType"/>
370                <xsl:param name="inputName"/>
371                <xsl:param name="inputID"/>
372                <xsl:param name="inputClass" select="'Control'"/>
373                <xsl:param name="labelClass"/>
374                <xsl:param name="title"/>
375                <xsl:param name="titleLevel"/>
376                <xsl:param name="description" select="concat('Show/hide the ', $title, ' selections')"/>
377                <xsl:param name="show" select="false()"/>
378                <xsl:param name="showOnHover" select="false()"/>
379
380                <!-- the "showing" attribute is the mech to close an open radio menu.
381                        onchange="this.setAttribute('showing', this.checked); console.log('on change, checked:' + this.checked + ', showing: ' + this.getAttribute('showing'));"
382                        onclick="if(this.getAttribute('showing')) this.checked=false;  this.setAttribute('showing', this.checked);  console.log('on click, checked:' + this.checked + ', showing: ' + this.getAttribute('showing')); "
383                        onchange only fires on actual radio clicked - doesn't fire on all other radio buttons...
384                        onchange="console.log('on change, id: ' + this.getAttribute('id') + ', checked:' + this.checked + ', showing: ' + this.getAttribute('showing'));  this.setAttribute('showing', this.checked);"
385                -->
386                <xsl:variable name="inputName" select="if($inputType = 'radio')then $inputName else $inputID"/>
387                <input id="{$inputID}" type="{$inputType}" showing="{$show}" 
388                        onclick="if('true'==this.getAttribute('showing')) this.checked=false; this.setAttribute('showing', this.checked);"
389                >
390                        <xsl:if test="0 != string-length($inputName)">
391                                <xsl:attribute name="name" select="$inputName"/>
392                        </xsl:if>
393                        <xsl:if test="0 != string-length($inputClass)">
394                                <xsl:attribute name="class" select="$inputClass"/>
395                        </xsl:if>
396                        <xsl:if test="$show">
397                                <xsl:attribute name="checked" select="'checked'"/>
398                        </xsl:if>
399                </input>
400
401                <xsl:variable name="labelContent">
402                        <label for="{$inputID}" title="{$description}">
403                                <xsl:if test="0 != string-length($labelClass)">
404                                        <xsl:attribute name="class" select="$labelClass"/>
405                                </xsl:if>
406                                <xsl:if test="not($showOnHover)">
407                                        <xsl:attribute name="onmouseover">var di=document.getElementById('<xsl:value-of select="$inputID"/>'); di.setAttribute('showing', di.checked);</xsl:attribute>
408                                </xsl:if>
409                                <xsl:value-of select="$title"/>
410                        </label>
411                </xsl:variable>
412                <xsl:if test="0 != string-length($titleLevel)">
413                        <xsl:element name="h{$titleLevel}">
414                                <xsl:copy-of select="$labelContent"/>
415                        </xsl:element>
416                </xsl:if>
417                <xsl:if test="0 = string-length($titleLevel)">
418                        <xsl:copy-of select="$labelContent"/>
419                </xsl:if>
420<!--
421                <label for="{$inputID}" onmouseover="var di=document.getElementById('{$inputID}'); di.setAttribute('showing', di.checked);"><xsl:value-of select="TITLE"/></label>
422                <label for="{$inputID}" onmouseover="console.log( $('#{$inputID}').prop('checked') )"><xsl:value-of select="TITLE"/></label>
423                <label for="{$inputID}" onmouseover="$('#{$inputID}').prop('checked').attr('showing',true);"><xsl:value-of select="TITLE"/></label>
424                <label for="{$inputID}">
425                        <xsl:if test="exists(URL) or exists(LOCAL_URL)">
426                                <a title=""
427                                        href="{if(exists(URL))then URL else if(exists(LOCAL_URL)) then concat($ibis.contextPath, LOCAL_URL) else ''}"
428                                        ><xsl:value-of select="TITLE"/></a>
429                        </xsl:if>
430                        <xsl:if test="not(URL) and not(LOCAL_URL)">
431                                <xsl:value-of select="TITLE"/>
432                        </xsl:if>
433                </label>
434-->
435        </xsl:template>
436
437</xsl:stylesheet>
438<!-- ============================= End of File ============================= -->
439
Note: See TracBrowser for help on using the repository browser.