XForms/Select1 Multi-Column
Appearance
< XForms
Motivation
[edit | edit source]You want to select one item from multiple column of items.
Method
[edit | edit source]To do this we must unselect all of the column not selected so that only one column has a value in the output.
Source Code
[edit | edit source]<html xmlns="http://www.w3.org/1999/xhtml" xmlns:ev="http://www.w3.org/2001/xml-events" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xf="http://www.w3.org/2002/xforms">
<head>
<title>Select1 Multi Column</title>
<style type="text/css"><![CDATA[
@namespace xf url("http://www.w3.org/2002/xforms");
body {
font-family: Helvetica, sans-serif;
font-size: 10pt;
}
/* vertical align the selectors in each column. I am not sure why none of these CSS selectors work */
.state-selector tr td {
vertical-align:text-top;
align: top;
valign: top;
}
/* this is also not working */
.state-selector xf\:label {
font-weight: bold;
}
]]>
</style>
<xf:model>
<xf:instance xmlns="" id="cols">
<data>
<col-1/>
<col-2/>
<col-3/>
<cols/>
</data>
</xf:instance>
<!-- this concatenates the three column values -->
<xf:bind nodeset="cols" calculate="concat(../col-1, ../col-2, ../col-3)"/>
<!-- this is where we log the events -->
<xf:instance id="log">
<data xmlns="">
<event/>
</data>
</xf:instance>
<xf:action ev:event="xforms-ready">
<xf:insert nodeset="instance('log')/event" at="last()" position="after"/>
<xf:setvalue ref="instance('log')/event[last()]" value="'xforms-ready'"/>
</xf:action>
</xf:model>
</head>
<body>
<p>Select1 Multi Column</p>
<table border="1">
<tr>
<td valign="top">
<xf:select1 ref="col-1" appearance="full">
<xf:item>
<xf:label>Red</xf:label>
<xf:value>red</xf:value>
</xf:item>
<xf:item>
<xf:label>Orange</xf:label>
<xf:value>orange</xf:value>
</xf:item>
<xf:action ev:event="DOMActivate">
<xf:setvalue ref="instance('cols')/col-2" value="''"/>
<xf:setvalue ref="instance('cols')/col-3" value="''"/>
<xf:insert nodeset="instance('log')/event" at="last()" position="after"/>
<xf:setvalue ref="instance('log')/event[last()]" value="'col 1 xforms-value-changed'"/>
</xf:action>
</xf:select1>
</td>
<td valign="top">
<xf:select1 ref="col-2" appearance="full">
<xf:item>
<xf:label>Yellow</xf:label>
<xf:value>yellow</xf:value>
</xf:item>
<xf:item>
<xf:label>Green</xf:label>
<xf:value>green</xf:value>
</xf:item>
<xf:action ev:event="DOMActivate">
<xf:setvalue ref="instance('cols')/col-1" value="''"/>
<xf:setvalue ref="instance('cols')/col-3" value="''"/>
<xf:insert nodeset="instance('log')/event" at="last()" position="after"/>
<xf:setvalue ref="instance('log')/event[last()]" value="'col 2 xforms-value-changed'"/>
</xf:action>
</xf:select1>
</td>
<td valign="top">
<xf:select1 ref="col-3" appearance="full">
<xf:item>
<xf:label>Blue</xf:label>
<xf:value>blue</xf:value>
</xf:item>
<xf:item>
<xf:label>Indigo</xf:label>
<xf:value>indigo</xf:value>
</xf:item>
<xf:action ev:event="DOMActivate">
<xf:setvalue ref="instance('cols')/col-1" value="''"/>
<xf:setvalue ref="instance('cols')/col-2" value="''"/>
<xf:insert nodeset="instance('log')/event" at="last()" position="after"/>
<xf:setvalue ref="instance('log')/event[last()]" value="'col 3 xforms-value-changed'"/>
</xf:action>
</xf:select1>
</td>
</tr>
</table>
<xf:trigger>
<xf:label>Clear</xf:label>
<xf:action ev:event="DOMActivate">
<xf:setvalue ref="col-1" value="''"/>
<xf:setvalue ref="col-2" value="''"/>
<xf:setvalue ref="col-3" value="''"/>
<xf:insert nodeset="instance('log')/event" at="last()" position="after"/>
<xf:setvalue ref="instance('log')/event[last()]" value="'clear'"/>
</xf:action>
</xf:trigger>
<br/>
<xf:trigger>
<xf:label>refresh</xf:label>
<xf:action ev:event="refresh">
<xf:setvalue ref="col-1" value="''"/>
<xf:setvalue ref="col-2" value="''"/>
<xf:setvalue ref="col-3" value="''"/>
<xf:insert nodeset="instance('log')/event" at="last()" position="after"/>
<xf:setvalue ref="instance('log')/event[last()]" value="'refresh'"/>
</xf:action>
</xf:trigger>
<br/>
<xf:output ref="cols">
<xf:label>Color selected: </xf:label>
</xf:output>
<br/>
<xf:output ref="col-1">
<xf:label>Column 1: </xf:label>
</xf:output>
<br/>
<xf:output ref="col-2">
<xf:label>Column 2: </xf:label>
</xf:output>
<br/>
<xf:output ref="col-3">
<xf:label>Column 3: </xf:label>
</xf:output>
<br/>
<div id="log">
<span>
<b>Event Log</b>
</span>
<xf:repeat id="results-repeat" nodeset="instance('log')/event">
<xf:output ref="."/>
</xf:repeat>
</div>
</body>
</html>