255 lines
11 KiB
C++
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? " multiple" : ""%>
|
|
<%=params.multi && params.size? " size=" + params.size : ""%>
|
|
<%=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;
|
|
}
|
|
%> |