Files
Facilitor/APPL/Shared/selector.inc
Jos Groot Lipman 6d00747c5f FSN#36009 Multiselect ingeklapt beginnen
svn path=/Website/trunk/; revision=28789
2016-04-07 07:35:05 +00:00

255 lines
11 KiB
C++

<% /*
$Revision$
$Id$
File: selector.inc
Description: Algemene interface functie om een selectveld te maken
Deze moet je kunnen includen en aanroepen.
Resulteert dan uiteindelijk in een selectbox aangemaakt die gevuld wordt door een query.
Het resultaat heeft de vorm "[<td>label</td><td>]selectveld[</td>]"
of voor mobile "[<label>label</label>]selectveld"
of [<td>label</td><td>]inputveld[</td>].
Indien geen initiële waarde is meegegeven, dan wordt standaard -1 genomen.
parameters: fieldName: veldnaam van het selectveld. Dit veld wordt gesubmit.
sql: sql query die zorg voor de inhoud van het selectveld. (SELECT key, omschrijving FROM ... WHERE ...)
params: object met meegegeven parameters.
initKey: initiële key waarde van de select die ingevuld moet worden.
label: label dat voor het selectveld wordt weergegeven.
onChange: onchange op het selectveld.
readonly: geeft aan of het selectveld readonly weergegeven moet worden (true|false(default)).
multi multi selectveld
trclass: wordt ook op de <tr> gezet
size handig bij multi selectveld
moreinfo: geeft een extra informatie button achter het selectveld. Klikken hierop geeft informatie over de geselecteerde waarde
extraParamValue: Voegt een extra value parameter toe aan de waarden (<option>)
extraParamValueInit: Initiele waarden voor de extra value parameters
emptyKey: De key voor de emptyOption (default -1)
emptyOption: De tekst voor een lege waarde bovenaan in de lijst
?Bij 'multi' doet hij dat alleen bij een lege listbox
selectjustone Als er 1 waarde in de lijst is, selecteer deze dan en voeg geen lege waarde toe
initEmpty Moet de lege waarde altijd geselecteerd zijn (meestal voor filters) of kies een single optie altijd gelijk
required Voegt de class 'required' toe aan het veld
mobile Format for HTML5
titleCol kolom waarin de tooltip tekst voor de option staat
tooltipsql als titleCol bestaat, kan er nog een opsomming van gegevens volgens deze sql worden toegevoegd aan de tooltip
maxrows Maximum aantal regels dat wordt opgehaald in tooltipsql
Resultaat: { justone: true // als dat zo is
initKey: 1234, // als justone
initText: "sdfsd" // als justone
}
Note: de combinatie van readonly en multi is (nog) niet ondersteund
*/ %>
<%
FCLTHeader.Requires({ plugins: ["jQuery"] });
// Functie kijkt of de waarde pvalue voorkomt in de array parray
function valueInArray(parray, pvalue, pmulti)
{
// TODO return $.inArray()
if (pmulti && parray.length > 1) // parray is nu een array met waarden
{
for (i = 0; i < parray.length; i++)
{
if (parray[i] == pvalue) return true;
}
}
else
{
return (parray[0] == pvalue)
}
return false
}
function FCLTselector(fieldName, sql, params)
{
var result = {};
if (!(params.initKey && params.initKey > 0) && params.readonly && params.suppressEmpty) return;
if (typeof params=="undefined") params = {};
params.id = params.id || fieldName;
if (params.multi) { // Zet bij multi de default size op 4 regels.
if (!params.size) {
params.size = 4;
}
}
if (params.label)
{
if (!params.mobile) { // mobile zit niet in een table
%><tr <%=params.trclass? "class='" + params.trclass + "'" : ""%>><td class="label"><%
}
%><label class='selector' for="<%=fieldName%><%=params.readonly? "_ro" : ""%>"><%=params.label%>:</label>
<%=params.moreinfo ? "<span class='labelextra'><img class='details' src='" + rooturl + "/appl/Pictures/detail.png' onclick='" + params.moreinfo + "'></span>" : ""%>
<%
if (!params.mobile) { // mobile zit niet in een table
%></td><td><%
}
}
if (!params.readonly)
{ // TODO: class van fld overnemen voor de width is niet helemaal jofel
if (!params.mobile) {
%> <!--[if lt IE 8]><div id='req_<%=fieldName%>' class='fld<%=fieldName%> <%=params.required? " required" : ""%>'><![endif]--><%
}
%><select class="fld<%=fieldName%><%=params.required? " required" : ""%> <%=params.extraclass? " " + params.extraclass : ""%>"
name="<%=fieldName%>"
id="<%=params.id%>"
<%=params.multi && params.initKey && String(params.initKey).split(",").length>1? " multiple" : ""%>
<%=params.multi? " fcltmulti=1" : ""%>
<%=params.disable? " disabled" : ""%>
<%=params.onChange? " onchange='" + safe.htmlattr(params.onChange) + "'" : ""%>
<%=params.onDblClick? " onDblClick='" + safe.htmlattr(params.onDblClick) + "'" : "" /* LET OP DAT HTML-HAAKJE HIERACHTER */ %>>
<% result = FCLTselectorOptions(sql, params) %>
</select><%
if (!params.mobile) {
%><!--[if lt IE 8]></div><![endif]--><%
}
}
else
{ // we moeten hier wat ingewikkeld doen omdat we wel de key hebben van de te tonen waarde, maar niet de waarde zelf
// NB: in het geval van een readonly/multi listbox toont-ie maar 1 waarde.
var initstr = "";
if (sql && sql != "")
{
var oRs = Oracle.Execute(sql);
while (!oRs.eof)
{
if (params.initKey == oRs(0).value)
{
initstr = oRs(1).value;
}
oRs.MoveNext();
}
oRs.close();
}
%>
<span id="<%=fieldName%>_ro" class="readonly fld<%=fieldName%>"><%=safe.html(initstr)%></span>
<%
}
if (params.moreinfo && !params.label) {
%><img class='details' src='<%= rooturl %>/appl/Pictures/detail.png' onclick='<%=params.moreinfo%>'><%
}
if (params.label && !params.mobile)
{
%></td></tr><%
}
return result;
}
// Levert alleen de <options> van de selector op
function FCLTselectorOptions(sql, params)
{
var result = { n_records: 0 };
if (typeof params.required == "boolean" && params.required)
params.required = 1;
else if (typeof params.required == "boolean" && !params.required)
params.required = 0;
// Else aanroep vanuit Shared/loadRKenmerk.asp waar params.required een number is
var required_class = "";
if (params.required)
{
required_class = " required";
if (params.required > 1)
required_class += params.required; // checkRequiredGroup() hoeft hier niet. wordt alleen gebruikt bij kenmerken
}
if (!("emptyKey" in params))
params.emptyKey = -1;
// Indien geen initiële waarde is meegegeven, dan wordt standaard -1 genomen.
if (typeof params.initKey == "undefined") // pas op: activiteit_key is wel eens 0
params.initKey = params.emptyKey;
// Indien multi dan kan initKey een string van waarden bevatten
// Maak daarom van initKey een array met waarden
params.initKey = String("" + params.initKey);
params.initKey = params.initKey.split(",");
if (sql && sql != "")
{
var oRs = Oracle.Execute(sql);
// Check of er slechts 1 resultaat is: dan wil ik die automatisch gekozen hebben in plaats van een evt. lege waarde
var justone = false;
var noresults = false;
if (!oRs.eof)
{
if (params.multi && params.selectfirstone)
params.initKey[0] = oRs(0).value;
oRs.MoveNext();
if (oRs.eof)
justone = true;
oRs.MoveFirst();
}
else
noresults = true;
result.justone = justone;
var hasEmpty = false;
if (params.extraParamValue)
{
var extraPV = params.extraParamValue.split(",");
if (params.extraParamValueInit)
var extraPVI = params.extraParamValueInit.split(",");
}
// TODO: als required en initKey dan hoeft emptyoption er natuurlijk niet bij zou ik zeggen
if ((((params.emptyOption || params.emptyOption == "") && !(justone && params.required == 1)) || params.initEmpty) && !(params.selectjustone && justone))
{ var hasEmpty = true; // afgeleide var voor het gemak
%>
<option value="<%=params.emptyKey%>" <%=params.required? " class='" + required_class + "'" : ""%> <%=valueInArray(params.initKey, params.emptyKey, params.multi)? " selected" : ""%>
<% if (params.extraParamValue && params.extraParamValueInit)
{
for (var i = 0; i < extraPV.length; i++)
{ %>
<%=" " + extraPV[i].replace(/^\s+|\s+$/g,"")%>="<%=safe.htmlattr(extraPVI[i]? extraPVI[i].replace(/^\s+|\s+$/g,"") : "")%>" <% /* replace is for trim spaces */ %>
<% }
} /* LET OP DAT HTML-HAAKJE HIERACHTER */ %>>
<%=!noresults && params.emptyOption? safe.html(params.emptyOption) : ""%></option>
<% }
while (!oRs.eof)
{
result.n_records ++;
if (justone & !hasEmpty)
{
result.initKey = oRs(0).value;
result.initText = oRs(1).value;
}
%> <option value="<%=safe.htmlattr(oRs(0).value)%>" <%=valueInArray(params.initKey, oRs(0).value, params.multi) || (justone && !hasEmpty)? " selected " : ""%>
<% if (params.titleCol)
{
title = oRs(params.titleCol).value;
if (params.tooltipsql)
{
var ttsql = params.tooltipsql + oRs(0).value + " ORDER BY 2"; // de key voor deze option waarop aanvullende gegevens van toepassing zijn
if (params.maxrows)
{
ttsql = "SELECT * FROM (" + ttsql + ") WHERE ROWNUM <= " + params.maxrows;
}
var oRst = Oracle.Execute(ttsql);
while (!oRst.eof)
{
title += "\n" + oRst(0).value; // elk gevonden record op een nieuwe regel
oRst.MoveNext();
}
oRst.close();
}
Response.Write(" title='" + safe.htmlattr(title) + "'");
}
if (params.extraParamValue)
{
for (var i = 0; i < extraPV.length; i++)
{ %>
<%=extraPV[i].replace(/^\s+|\s+$/g,"")%>="<%=safe.htmlattr(oRs(extraPV[i].replace(/^\s+|\s+$/g,"")).value)%>" <% /* replace is for trim spaces */ %>
<% }
} /* LET OP DAT HTML-HAAKJE HIERACHTER */ %>><%=safe.html(oRs(1).value)%></option>
<% oRs.MoveNext();
}
oRs.close();
}
return result;
}
%>