Files
Facilitor/APPL/Shared/kenmerk_common.inc
Erik Groener 9cab0739fb FCLT#53283 flex_X_is_URL is deprecated en kan alleen maar '1' zijn==>Opruimen
svn path=/Website/trunk/; revision=38018
2018-05-31 08:26:52 +00:00

2582 lines
123 KiB
C++
Raw Blame History

<% /*
$Revision$
$Id$
File: kenmerk_common.inc
Description:
Context: Used by /XX/kenmerk.inc
Note: Writes flex-props html edit/view code to Response object
Usage: listKenmerk must be called once with an SQL-statement that
fetches all kenmerk-information
The structure of tha SQL should match the predefined structure (column names)
TODO: HTML5-achtige types toevoegen wanneer alle browsers het daar over eens zijn
*/
// FlexFiles.inc functie bepaalNiveau is altijd nodig dus FlexFiles.inc erbij
%><!-- #include file="../shared/FlexFiles.inc" -->
<%
// "jquery-ui.js" en "date.js" zijn alleen nodig als er een datumkenmerk is.
// meestal is die er toch al wel in het hoofdscherm dus voor het gemak doen
// we het hier ook maar voor overige schermen.
if (!this.JSON_Result)
FCLTHeader.Requires({plugins:["jQuery", "kenmerk"], js: ["jquery-ui.js", "date.js"]})
var requiredGroupUsed = new Array(); // Array zorgt voor eenmalige initiele aanroep van checkRequiredGroup(groep) per groep
var addPreview = false;
function kenmerk_write(s)
{
Response.Write(s);
}
// Tel/ zoek de bijlagen in een folder
// Resultaat: array met bijlage namen
function BijlagenList(pModule, pNiveau, pKey, pKenmerk_key, otherKenmerk_path)
{
if (otherKenmerk_path)
var vAttachPath = S("flexFilesPath") + "/" + otherKenmerk_path + "/";
else
{
if (pKey > 0) // anders valt er niets te tellen
var vAttachPath = flexProps(pModule, pKey, String(pKenmerk_key), pNiveau).AttachPath + "/";
}
var lijst = [];
var fso = Server.CreateObject("Scripting.FileSystemObject")
if (vAttachPath)
__Log("Tellen in folder: " + vAttachPath);
if (vAttachPath && fso.FolderExists(vAttachPath))
{
var fso, f, f1, fc, s;
fso = new ActiveXObject("Scripting.FileSystemObject");
f = fso.GetFolder(vAttachPath);
fc = new Enumerator(f.files);
for (; !fc.atEnd(); fc.moveNext())
{
lijst.push(fc.item().Name);
}
}
return lijst;
}
function BijlagenButton(pModule, pNiveau, pKey, tmpfolder, pKenmerk_key,
pReadonly, pRequired, kdim, pregexp, otherKenmerk_path, identify, label, params)
{
// Lever code op voor een BijlagenButton type M (map)
// Let op: F (file) gebeurt verderop in de code
// Module is 'R' voor ruimte, 'M' voor melding enz
// key is de object key
// Parameter otherKenmerk_path is null of bevat het pad van het kenmerk waarvan we
// in een veel later stadium (SaveFlexKenmerken) de folder kopieren (order onder melding)
// of moven (wijzigen type stdmelding of type opdracht)
// Als die is meegegeven en er zitten bestanden in de folder dan wordt de knop
// vooralsnog read-only
/* Bestanden zijn nu te vinden in ...cust/X/flexfiles/[module]/[key]/[kenmerk_key] */
var lijst = BijlagenList(pModule, pNiveau, pKey, pKenmerk_key, otherKenmerk_path);
if (pReadonly)
{ // Indien readonly en lijst.length = 0 dan hoeft het kenmerk (net als bij andere kenmerken) helemaal niet getoond te worden.
var filehtmlarr = [];
var regex = new RegExp(S("flexPreviewExt"));
for (var file in lijst)
{
//var html = "<a href='" + safe.htmlattr(href) + "' target='_new'>" + safe.html(lijst[file]) + "</a>";
if (kdim == 'xxx')
{
var href = protectQS.create(OpenFlexFile(pModule, pNiveau, pKey, pKenmerk_key, lijst[file], { mime_type: "image/png", contentdp: "inline" }));
var html = '<span class="details fldflexM" readonly=1'
+ ' onclick=\'FcltMgr.windowopen("' + safe.jsstring(href) + '")\'>' + safe.html(lijst[file]) + '</span>';
}
else
{
var href = protectQS.create(OpenFlexFile(pModule, pNiveau, pKey, pKenmerk_key, lijst[file]));
var html = '<span class="details fldflexM" readonly=1'
+ ' onclick=\'FcltMgr.windowopen("' + safe.jsstring(href) + '", "File")\'>' + safe.html(lijst[file]) + '</span>';
}
if (regex.test(lijst[file]))
addPreview = true;
filehtmlarr.push(html);
}
var res = filehtmlarr.join("</br>");
}
else
{
if (otherKenmerk_path && lijst.length > 0)
var res = L("lcl_flex_autocopy");
else // pf: op 1 regel tbv mijn syntaxhiliting
{
var res ="<input type='button' isBijlage='1' nBijlagen='" + lijst.length + "'" + identify + " class='bijlage button " + pRequired + "' value='" + label.format(lijst.length) + "'";
var url = rooturl + "/appl/shared/BijlagenForm.asp?module=" + pModule
+ "&key=" + pKey
+ (pNiveau != ""? "&niveau=" + pNiveau : "")
+ "&kenmerk_key=" + pKenmerk_key
+ (params.kenmerk_module? "&kenmerk_module=" + params.kenmerk_module : "");
if (pKey < 0)
{
url += "&tmpfolder=" + tmpfolder;
}
url += "&multi=1";
if (pReadonly) url += "&reado=1";
if (kdim) url += "&extFilter=" + escape(kdim);
if (pregexp) url += "&pregexp=" + escape(pregexp); // P800x600 voor foto van 800x600
var blg = "onBijlagen('" + safe.jsstring(protectQS.create(url)) + "'"
+ ",''" // geen saveUrl
+ ", true" // multi
+ ", this)";
res += " onClick='" + safe.htmlattr(blg) + "'"
+ (!pReadonly ? " onChange='checkKenmerk(this, false,\"M\",0,0,0,0)'" : "");
res += ">";
res += "<i class='fa fa-folder-open fa-fw hasIcon bijlage' onClick='this.previousSibling.click()'></i>";
}
}
return {html: res, count: lijst.length};
}
// Params kan bevatten
// mime_type: "image/png"
// contentdp: "attachment"
function OpenFlexFile(Module, Niveau, Key, Kenmerk_key, fname, params)
{
params = params || {}
// Lever code op voor tonen van een bepaalde flexfile streaming
var s = rooturl + "/appl/shared/BijlagenStream.asp"
s += "?module=" + Module
+ "&key=" + Key
+ (Niveau ? "&niveau=" + Niveau : "")
+ "&kenmerk_key=" + Kenmerk_key
+ "&filename=" + Server.URLencode(fname);
if (params.mime_type)
s += "&mime=" + params.mime_type;
if (params.contentdp)
s += "&contentdp=" + params.contentdp;
return s;
}
function Operand(n)
{
ret_str = "<select class='operand' id='ko" + n + "' name='ko" + n + "'>"
+"<option value='='>=</option> "
+"<option value='&lt;&gt;'>&lt;&gt;</option> "
+"<option value='&lt;'>&lt;</option>"
+"<option value='&gt;'>&gt;</option>"
+"<option value='&lt;='>&lt;=</option>"
+"<option value='&gt;='>&gt;=</option>"
+"<option value='LIKE'>"+L("lcl_operand_like")+"</option>"
+"<option value='NOT LIKE'>"+L("lcl_operand_notlike")+"</option>"
+"<option value='IS NOT NULL'>"+L("lcl_operand_notnull")+"</option>"
+"<option value='IS NULL'>"+L("lcl_operand_null")+"</option>"
+"</select>";
return ret_str;
}
function getDatatypeValue(table, column, checkval)
{
var tsql = "SELECT data_type"
+ ", data_length"
+ ", data_precision"
+ ", data_scale"
+ " FROM user_tab_columns"
+ " WHERE table_name = " + safe.quoted_sql_upper(table)
+ " AND column_name = " + safe.quoted_sql_upper(column);
var oRs_t = Oracle.Execute(tsql);
if (oRs_t("data_type").value == "NUMBER")
{
if (!oRs_t("data_scale").value || oRs_t("data_scale").value > 0)
suggestval = parseFloat(checkval) || 0;
else
suggestval = parseInt(checkval) || 0;
}
else if (oRs_t("data_type").value == "VARCHAR2")
{
suggestval = safe.quoted_sql(checkval);
}
else
{
suggestval = safe.quoted_sql(checkval);
}
oRs_t.close();
return suggestval;
}
function kenmerk_regel(kv_params)
{
var kvhtml = "";
if (kv_params.kv != "")
{
// Schrijf eventueel een tabelregel begin
if (((kv_params.colCount&1) || kv_params.forceNewLine || !kv_params.kenmerk_2col) && !kv_params.formobile && !kv_params.notr)
{
var cls = "trlabel {0}flex{1} ".format(kv_params.module, kv_params.kvolgnr);
if (kv_params.ktype == "L" || kv_params.ktype == "l")
cls += "flexlabel";
if (kv_params.ktype == "l" && !kv_params.readonlyfield)
cls += " flexcollapsable";
kvhtml += ("<tr" + ( (kv_params.ktype == "L" || kv_params.ktype == "l")
? ' id="'+kv_params.nameprefix+'clabel' + kv_params.clabelCounter + '"'
: ''
)
+ ' class="' + cls + '"'
+ ( kv_params.ktype == "l"
? ' onclick="$(\'#'+kv_params.nameprefix+'clabel' + kv_params.clabelCounter + '\').nextUntil($(\'#'+kv_params.nameprefix+'clabel' + (kv_params.clabelCounter + 1) + '\')).toggle();'
+ '$(this).toggleClass(\'flexcollapsed\');'
+ 'FcltMgr.resized(window);"'
: ''
)
+ ">"); // Nu altijd zichtbaar in popup dmodal scherm
}
// Schrijf een tabelcell met het label
if (kv_params.makeCheckbox && kv_params.formobile) // Zie commentaar iets verderop
kv_params.props.label_colspan = 2;
if (kv_params.props.wfbuilder) // Workflow Expression Builder
kvhtml += ("<td>:flex{0}</td>".format(kkey));
if (!kv_params.formobile && !kv_params.nolabel)
kvhtml += ('\n <td class="label' + (kv_params.ktype == 'L' || kv_params.ktype == 'l'? ' flexlabel' : '')+ (kv_params.kenmerk_search? ' flexsearch' : '') + '"'
+ (kv_params.props.label_colspan? ' colspan=' + kv_params.props.label_colspan : '') + '>');
if (!kv_params.nolabel && !kv_params.ishidden)
kvhtml += ((kv_params.formobile && kv_params.ktype == 'l'? '<div data-role="collapsible" data-theme="c" data-content-theme="c"><h3 id="collLabel'+kv_params.clabelCounter+'">' : '')
+ '\n <label for="' + kv_params.nameprefix + kv_params.idCounter + 'val" class="' + (kv_params.ktype == 'L' || kv_params.ktype == 'l'? ' flexlabellabel' : '')
+ (kv_params.isExpression ? ' expression' : '') + '">' + '<span title="' + safe.htmlattr(kv_params.hint) + '">'
+ kv_params.flexkenmerklabel + (kv_params.label_ext ? " "+kv_params.label_ext : "")
+ ( (kv_params.kdim != null && kv_params.kdim != "xxx")
? " [" + kv_params.kdim + "]"
: ""
) + kv_params.val_seperator
+ (kv_params.addPreview ? '<i class="fa fa-lg fa-image preview" id="'+(kv_params.previewParams.length-1)+'" title="'+L("lcl_flex_preview")+'"></i>' : '') + '</span>'
+ (kv_params.hint == null ? '' : '<span title="' + safe.htmlattr(kv_params.hint) + '" class="fa fa-fw fa-question-circle hint"></span>')
+ '</label>'+(kv_params.formobile && kv_params.ktype == 'l' ? '</h3>' : ''));
// labelwaardes (vaak invulinstructie) in apart te stylen span
if (!kv_params.ishidden && kv_params.formobile && (kv_params.ktype == "L" || kv_params.ktype == "l") && kv_params.kv)
{
kvhtml += '\n <span class="flexlabelvalue">' + kv_params.kv + '</span>';
}
// Bij mobile willen we de checkbox en zijn label in dezelfde ene TD hebben met colspan=2.
// jQuery voegt ze namelijk samen tot een enkel interface element en dat past niet altijd
// in de ene TD anders
if ((!kv_params.makeCheckbox || !kv_params.formobile) && !kv_params.formobile)
{
if (!kv_params.nolabel)
kvhtml += ('</td>');
kvhtml += ('\n <td ' + ( (kv_params.ktype == "L" || kv_params.ktype == "l")
? ' class="flexlabel lhint"'
: (kv_params.readonlyfield ? ' class="readonly flexvalue"' : ' class="flexvalue"')
));
if (kv_params.kenmerk_search && (kv_params.ktype != "L" && kv_params.ktype != "l"))
{
kvhtml += ('>');
kvhtml += (Operand(kv_params.idCounter));
}
else
{
if ( kv_params.ktype == "L" || kv_params.ktype == "l" )
if (typeof kv_params.kenmerk_extraTD != "undefined" && kv_params.kenmerk_extraTD)
kvhtml += (' colspan=4>'); // MLD_OPDR heeft TD-tje extra
else
kvhtml += (' colspan=3>');
else
kvhtml += (">");
}
if (kv_params.nolabel && !kv_params.ishidden)
kvhtml += ('\n <label for="' + kv_params.nameprefix + kv_params.idCounter + 'val">'
+ '<span title="' + safe.htmlattr(kv_params.hint) + '">'
+ '</span></label>');
}
// Nu het eerder bepaalde waarde veld, zo nodig onderdrukt bij confidential-situatie
if (!kv_params.ishidden && kv_params.maskeren)
{ // nu verstop ik alles wat we hierboven bepaald hebben. Dat is wat lomp.
kvhtml += ("<span class='confidential'>"+ /* c_maskmarker + */ L("lcl_confidential")+"</span>");
}
else if (kv_params.ishidden)
{
kvhtml += ("<span style='display: none'>" + kv_params.kv + "</span>") || "";
}
else
kvhtml += (kv_params.formobile && (kv_params.ktype=="L" || kv_params.ktype=="l") ? "" : kv_params.kv||"")
if (typeof kv_params.kenmerk_extraTD != "undefined" && kv_params.kenmerk_extraTD && !kv_params.formobile)
kvhtml += '\n </td><td>'; // Extra leeg celletje voor layout MLD_OPDR
if (!kv_params.maskeren && kv_params.flexkenmerkwaarde && kv_params.forceReadonly && kv_params.ktype != "M" && kv_params.ktype != "L" && kv_params.ktype != "l") // check mbt confidential
{
// hidden veld met de *echte* waardes zodat ze wel worden opgeslagen
kvhtml += "\n <input type=hidden id='" + kv_params.nameprefix + kv_params.idCounter + "val' name='" + kv_params.nameprefix + kv_params.idCounter + "val' value='" + safe.htmlattr(kv_params.flexkenmerkwaarde) + "'>";
}
if (!kv_params.maskeren && (kv_params.kenmerk_search || !kv_params.readonlyfield || (kv_params.flexkenmerkwaarde && kv_params.forceReadonly)) && kv_params.ktype != "M" && kv_params.ktype != "L" && kv_params.ktype != "l")
{
// Alleen dan hidden name-velden er bij
kvhtml += "<input type=hidden name='"+kv_params.nameprefix + kv_params.idCounter+"key' id='"+kv_params.nameprefix + kv_params.idCounter+"key' value='"+kv_params.kkey+"'>";
kvhtml += "<input type=hidden name='"+kv_params.nameprefix + kv_params.idCounter+"t' id='"+kv_params.nameprefix + kv_params.idCounter+"t' value='"+kv_params.ktype+"'>";
if (kv_params.isExpression)
{
kvhtml += "<input type=hidden name='"+kv_params.nameprefix + kv_params.idCounter+"e' id='"+kv_params.nameprefix + kv_params.idCounter+"e' value='1'>";
}
}
if (!kv_params.formobile)
{
kvhtml += '</td>';
if (!((kv_params.colCount&1) && kv_params.kenmerk_2col) && !kv_params.notr)
kvhtml += '\n</tr>';
}
}
return kvhtml;
}
// ================================================================================================
// listKenmerk
// Genereer code voor flexkenmerken
//
// Genereer code voor flexkenmerken. Vrij kale code
// <tr><td>lbl1:</td><td>flex1</td><td>lbl2:</td><td>flex2</td></tr> en dat dan herhaald
// (Alleen!) voor bewerkbare velden voegen we ook name's toe die met het formulier gesubmit worden
// params: sql: moet een query met de goede :-) velden bevatten
// sinds kort worden deze By Name gebruikt ipv By volgorde
// module, key: alleen gebruikt voor flexkenmerk 'F' (file) 'E' (encrypted file) en 'M' (map)
// props { fnIsInvisible: optioneel function (volgnr, type) - true betekent onzichtbaar
// fnIsReadonly: optioneel function (volgnr) - true betekent readonly
// fnIsHidden: optioneel function (volgnr, default) - true betekent hidden (onzichtbaar maar wel aanwezig i.v.m. opslaan)
// parentKey: optioneel om flexkenmerken onder op te slaan
// kenmerk_module: optioneel bij ALG: "L", "G", "R" etc.
// multiMode
// hideVervallen: om alleen nu nog geldige waarden te tonen
// defaults { bsn: "12345678", plaats: "Enschede", postcode:"1234AB" } altijd lowercase namen
// prs_key (of obsolete reqId) - key om bij defaultwaarde in ##PRS_PERSLID_KEY## te substitueren
// fnpre en fnpost: functies die voor en na genereren worden aangroepen *mits er kenmerken zijn*
// wfbuilder: toon ook flex-colname :f123 (voor workflow expression builder)
// showConfidential: als true mogen vertrouwelijke waarden getoond worden, anders gemaskeerd
// }
// Qua confidential-maskeren zijn er 2 aspecten:
// 1. zorgen dat de echt waarden niet getoond worden, dat kan lomp als allereerste actie
// maar ik verwacht dat men ooit bv wel de bijlagenaam wil tonen maar dan onklikbaar
// 2. zorgen dat de gemaskeerde waarden niet gesubmit worden, dan dus geen submitvelden opnemen
//
// ================================================================================================
function listKenmerk(sql, module, key, props)
{
var flexcolumns = props.flexcolumns;
var kenmerk_search = props.kenmerk_search;
var kenmerk_colspan = props.kenmerk_colspan;
var kenmerk_extraTD = props.kenmerk_extraTD;
var multiMode = props.multiMode; // TODO: support this!
var hideVervallen = props.hideVervallen;
var prs_key = props.prs_key || props.reqId; // Oude obsolete reqId nog even ondersteunen
var cont_key = props.cont_key;
var nameprefix = props.nameprefix || "k";
var extraserie = props.extraserie || false;
var niveau = props.niveau || "";
var srtdeel_key = props.srtdeelKey;
var requiredbyfield = props.requiredbyfield;
var serie = props.serie || 0;
var parent_list = props.parent_list; // Maak voor deze keys ook bijlagen knop
var formobile = props.mobile;
var notr = props.notr; // Geen tr's toevoegen.
var nolabel = props.nolabel; // Geen labels toevoegen.
var flexstart = props.flexstart || 1; // De kenmerken vanaf de flexstart-ste element tonen {flexstart >= 1 indien meegegeven).
var flexend = props.flexend || -1; // De kenmerken tot het flexend-ste element tonen {flexend >= 1 indien meegegeven}.
var hasfilter = props.hasfilter || false; // De kenmerken kunnen op naam gefilterd worden.
var tmpfolder = props.tmpfolder || "";
var showConfidential= props.showConfidential;
if (formobile) // Ik moet de API2 name weten. TODO Hier nog iets beters voor verzinnen....
{
var api2name = { "ALG": { "L": "locations",
"G": "buildings",
"R": "rooms"
},
"BEZ": "visitors",
"MLD": { "M": "issues",
"O": "orders"
},
"PRS": { "P": "persons",
"A": "departments",
"B": "companies"
},
"INS": { "I": "inspections",
"D": "objects"
// "S": "sleutels"?
},
"RES": "reservations"
}[module] // niveau
if (api2name && typeof api2name == 'object')
api2name = api2name[props.kenmerk_module || props.niveau || "D"]; // kenmerk_module voor ALG, niveau voor INS
if (!api2name)
{
__DoLog(props);
__DoLog("What should api2name be for {0} and {1}?".format(module, props.kenmerk_module));
INTERNAL_ERROR_UNDEFINED_API2NAME;
}
}
var predone = false;
var c_maskmarker = "<i class='fa fa-ban' style='cursor:auto'></i>" // prefix, niet klikbaar
var colCount = 0; // Even/oneven zodat we weten of we links of rechts zitten
var forceNewLine = false; // Bij labels en grote text velden
var val_seperator = '';
var flexkenmerklabel = '';
var previewParams = [];
var idCounter = 1; // We maken alleen name/id-s voor de velden die ook echt bewerkt kunnen worden
var clabelCounter = 0; // Het aantal collapsable labels
var anyDate = false;
var anyTime = false;
var anyTextarea = false;
var anyPreview = false;
var kenmerkidref = new Array(); // Bijhouden welk kenmerk welke id referentie mee heeft gekregen
var dpYearRanges = []; // te gebruiker jaren voor datepicker vastleggen.
var minMax = []; // te gebruiker uren voor timepicker vastleggen.
var allCollapsable = false; // true bij eerste 'l'-label
var inMobileBlock = false; // true van begin mobile-collapse-content tot eind mobile-collapse-content
var kenmerk_2col = (flexcolumns >= 2); // 2 kolommnen voor flexkenmerken als aantal kolommen ingevuld 2 of meer is.
if (module == "INS" && niveau == "S")
{ // Sleutelmodule werkt met srtdeel_key
if (srtdeel_key > 0)
key = srtdeel_key;
}
// Zitten er expressie kenmerken tussen?
var flexExprIncluded = false;
var oRs = Oracle.Execute(sql);
while (!oRs.eof)
{
var kdefault = oRs("kenmerk_default").Value;
if (kdefault && kdefault.match('##EXPR##') != null)
{
flexExprIncluded = true;
break;
}
oRs.MoveNext();
}
oRs.Close();
__Log("Opnieuw dezelfde query is niet supperefficient maar een MoveFirst is problematisch (FSN#39008)");
var oRs = Oracle.Execute(sql);
// ============================================================================================
// Doorloop alle flexkenmerken
if (key < 0 && tmpfolder == "")
tmpfolder = shared.random(32); // voor als nog geen key en wel bijlagen
var prssql = false;
for (i = 1; !oRs.eof; i++)
{
var flexkenmerkwaarde = null;
val_seperator = ':';
var def_val = oRs("kenmerk_default").Value;
var isExpression = false;
addPreview = false;
if (!kenmerk_search && !multiMode)
{
// In multiMode no filling of default values
flexkenmerkwaarde = oRs("kenmerk_waarde").value;
if (def_val && def_val.match('##EXPR##') != null)
isExpression = true;
// For a new value, this default is used. It could be a primitive value (string, number or key) or
// it is suggested to support (later)
// a more sophisticated value, using ##asp-variable## and/or SQL:SELECT in the string.
if (flexkenmerkwaarde != null)
{ //__Log("flexkenmerkwaarde:"+flexkenmerkwaarde);
if (flexkenmerkwaarde == def_val && flexkenmerkwaarde.match('##SQL##') != null)
{
//__Log("flexkenmerkwaarde match");
prssql = true;
flexkenmerkwaarde = flexkenmerkwaarde.substr(flexkenmerkwaarde.indexOf('##SQL##') + 7);
var sql2 = flexkenmerkwaarde.replace("##PRS_PERSLID_KEY##", prs_key).replace("##PRS_CONTACTPERSOON_KEY##", cont_key);
oRsPerslid = Oracle.Execute(sql2);
if (!oRsPerslid.eof)
flexkenmerkwaarde = oRsPerslid(0).value;
else
flexkenmerkwaarde = '';
oRsPerslid.Close();
}
else if (def_val && flexkenmerkwaarde == def_val && def_val.match('##EXPR##') != null)
{
flexkenmerkwaarde = "";
}
}
}
// Meegegeven default verwerken (UWVA Pacta o.a.)
if (props.defaults && oRs("kenmerk_omschrijving").value)
{
var xx = props.defaults[oRs("kenmerk_omschrijving").value.toLowerCase()];
if (typeof xx != "undefined")
{
flexkenmerkwaarde = xx;
if (oRs("kenmerk_kenmerktype").value == "C" || oRs("kenmerk_kenmerktype").value == "N" || oRs("kenmerk_kenmerktype").value == "B")
flexkenmerkwaarde = flexkenmerkwaarde.substr(0, oRs("kenmerk_lengte").value); // Kap de waarde op de maximale lengte af
}
}
// De weer te geven waarde is nu bepaald
var kkey = oRs("kenmerk_key").value;
flexkenmerklabel= Server.HTMLEncode(oRs("kenmerk_omschrijving").value ? oRs("kenmerk_omschrijving").value : ""); // Omschrijving kan leeg gelaten zijn
var ktype = oRs("kenmerk_kenmerktype").value;
var klen = oRs("kenmerk_lengte").value;
if (!klen) klen = 4000;
var kdec = oRs("kenmerk_dec").value;
var kmin = oRs("kenmerk_nmin").value;
var kmax = oRs("kenmerk_nmax").value;
var ksysteem = oRs("kenmerk_systeem").value;
var kvolgnr = "" + oRs("kenmerk_volgnr").value;
var kdim = oRs("kenmerk_dimensie").value; // beperkt bij uploads de extensie
var hint = oRs("kenmerk_hint").value;
var kregexp = oRs("kenmerk_regexp").value;
var kdomein_key = oRs("kenmerkdomein_key").value;
var maskeren = !showConfidential && (ksysteem&4);
var required = oRs("kenmerk_verplicht").value;
if ((props.sqldefaultnotrequired && def_val && def_val.match('##SQL##')) || props.ignorerequired)
required = false;
var reqgroup = oRs("kenmerk_groep").value;
var otherPath = oRs("otherpath").value; // otherKenmerkPath, alleen voor meldingen en facturen (tbv kopieren)
//
// forceReadonly kan gezet zijn: dan is het veld *altijd* readonly en kan alleen
// ingevuld raken doordat een extern proces (importjob?) dat doet of het wordt
// gevuld door de default waarde.
var forceReadonly = oRs("kenmerk_toonbaar").value == 1;
// Velden die de gebruiker niet mag zien zijn we h<><68>l snel klaar mee
// Ook velden waar je niet op kunt zoeken (bv vertrouwelijke) slaan we direct over in zoekmode
// En labels met een readonly-kenmerk tonen we niet als readonly, om invulinstructies in showmode weg te laten
if ( (!kenmerk_search && props.fnIsInvisible && props.fnIsInvisible(kvolgnr, ktype, oRs))
|| (kenmerk_search && (ktype == 'L' || ktype == 'l' || ktype == 'Q' || ktype == 'M' || ktype == 'F' || ktype == 'E') || kvolgnr < 0)
|| (!kenmerk_search && (ktype == 'L' || ktype == 'l') && forceReadonly && props.fnIsReadonly && props.fnIsReadonly(kvolgnr, oRs))
|| (kenmerk_search && (ksysteem&4))
)
{
oRs.MoveNext();
continue; // Onzichtbaar
}
//kenmerk_write( "<!--YY:"+colCount+":"+flexkenmerklabel+"-->");
//kenmerk_write( "<!--YY:"+idCounter+":"+flexkenmerklabel+"-->");
var readonlyfield = forceReadonly; // startwaarde
if (!readonlyfield && !kenmerk_search && props.fnIsReadonly) // Zoeken is natuurlijk nooit readonly
readonlyfield = props.fnIsReadonly(kvolgnr, oRs);
if (readonlyfield || kenmerk_search)
required = false;
var required_class = "";
var required_group = "";
if (required)
{
required_class = " required";
// Indien required afhankelijk is van een gewoon veld dan requiredgroup gebruiken met groep >= 10
if (requiredbyfield && required == 1)
{
required = 10;
}
if (required > 1)
{
if (required == 2)
required_group = reqgroup + "S" + parseInt(serie, 10);
else
required_group = required + "S" + parseInt(serie, 10);
required_class += required_group;
if (!requiredGroupUsed[required_group]) // Array requiredGroupUsed[] zorgt voor eenmalige initiele aanroep van checkRequiredGroup(groep) per groep
{
requiredGroupUsed[required_group] = true;
%> <span id="requiredgeg_<%=nameprefix + idCounter%>" style="display:none"></span>
<script type="text/javascript">
$(function()
{
<% if (required > 9)
{ // Gewone veld ook dezelfde requiredgroup class geven
%>
$("#<%=requiredbyfield%>").addClass("<%=required_class%>");
<% } %>
checkRequiredGroup("<%=required_group%>");
$("#requiredgeg_<%=nameprefix + idCounter%>").remove(); // Na het uitvoeren kan de ready functie weer weg zodat deze niet
});
</script>
<% }
}
}
// Als een parent kenmerk niet toonbaar is (vinkje "Niet te wijzigen" is gezet) en een lege waarde heeft,
// dan moet het parent kenmerk toch getoond worden i.v.m. de afhankelijkheid.
// en het child kenmerk is toonbaar (vinkje "Niet te wijzigen" is niet gezet)
// Afhankelijke child-parent kenmerken kunnen niet beide "niet toonbaar" zijn.
// Dan heeft de afhankelijkheid ook geen zin. Dus daarop ga ik niet controleren. Dat is een configuratie fout.
// Alleen controle of parent niet toonbaar is bij een toonbare child.
var isParent = false;
if (kdomein_key)
{
sqlP = "SELECT ut2.fac_usrtab_parentkey"
+ " FROM fac_kenmerkdomein kd1"
+ " , fac_usrtab ut1"
+ " , fac_usrtab ut2"
+ " WHERE kd1.fac_usrtab_key = ut1.fac_usrtab_key"
+ " AND ut1.fac_usrtab_key = ut2.fac_usrtab_parentkey" // Kenmerk 1 is een parent van een ander kenmerk 2.
+ " AND kd1.fac_kenmerkdomein_key = " + kdomein_key;
var oRs2 = Oracle.Execute(sqlP);
if (!oRs2.eof)
{
isParent = true; // Er is minstens 1 child kenmerk.
// In zoekscherm hoeft de parent dan ook niet readonly te zijn. Je mag er mee zoeken
if (kenmerk_search) readonlyfield = false;
}
oRs2.close();
}
// In het geval van readonly laten we velden zonder waarde helemaal niet zien,
// met uitzondering van Labels.
// Parent kenmerken laten we altijd zien.
// PF vraagt zich af: heeft dit ook gevolg voor print en excel?
// En: voor type M is het altijd nu nog leeg, en die komen dus readonly nooit!
// Voorlopig laat ik die dan altijd maar zien (TODO: evt niet als er 0 bestanden zijn)
if (readonlyfield && !isParent && ktype != 'L' && ktype != 'l' && ktype != 'M' && (!flexkenmerkwaarde || flexkenmerkwaarde=="") &&
(!kenmerk_search && (ktype == 'C' || ktype == 'N' || ktype == 'B' || ktype == 'D' || ktype == 'T' || ktype == 'R' || ktype == 'S')) ) // Als geavanceerd dan maakt het niet uit of het readonly is. Dan moet je het kenmerk gewoon tonen.
{
oRs.MoveNext();
continue;
}
// Als geavanceerd dan maakt het niet uit of het readonly is. Dan moet je het kenmerk gewoon tonen.
if (kenmerk_search && readonlyfield && (ktype == 'C' || ktype == 'N' || ktype == 'B' || ktype == 'D' || ktype == 'T' || ktype == 'R' || ktype == 'S'))
readonlyfield = false;
colCount++; // Nu pas ophogen.
// De kenmerken vanaf de flexstart-ste element tonen.
// De kenmerken tot het flexend-ste element tonen.
if (flexstart > colCount || (flexend >= 0 && flexend < colCount))
{
oRs.MoveNext();
idCounter++;
continue;
}
if( ktype == 'L' || ktype == 'l' )
{
forceNewLine = true;
colCount = 2; // Forceer 'even'
if (inMobileBlock)
kenmerk_write("</div>");
}
else
forceNewLine = false;
if (kenmerk_search || flexkenmerkwaarde != null && flexkenmerkwaarde != "")
allCollapsable = false;
// Eerst de simpele datatypes ('C', 'D' en 'N'). De complexere overrulen kv mogelijk later nog wel.
// De classes-conventie is:
// fldflex+[ktype] voor edit/show en fldSflex+[ktype] voor searchmode
// waarbij type niet perse hoeft als er geen onderscheid is.
// Extra is er nog C50 ipv C voor lange C kenmerken
// Ook class number/float (of currency) toevoegen
var kv = ""; // Het in te voegen veld in HTML, zonder label
var kv_arr = [];
var onchangeExp = "";
// Een flexkenmerk wordt altijd weergegeven volgens het volgende format:
// <tr><td class="label"><label>LABEL</label>:</td><td><input type="text" value='XX'></td></tr>
// Eventueel met 2 kolommen in een rij.
// Er zijn 2 uitzonderingen:
// - een lange tekst wordt een textarea
// - een R wordt een select
// We doen eerst die uitzonderingen
// ==========================================================================================
// =================================================================
// KENMERKTYPE C (Karakter) =================================================================
// =================================================================
// ==========================================================================================
if (ktype == 'C')
{
if (flexExprIncluded && !isExpression)
onchangeExp = ";if (fvalid) calculateFlexExpressions(this"
+ ", \"" + module + "\""
+ ", " + key
+ ", \"" + (props.kenmerk_module || "") + "\""
+ ", \"" + nameprefix + "\""
+ ", \"" + extraserie + "\""
+ ");";
if (klen > 50 && !kenmerk_search)
{
// Groot text veld wordt automatisch textarea
if (readonlyfield || maskeren)
{
if (formobile)
{
kv = "<textarea class='fldflexC50 ' rows=3 readonly tabindex=-1 maxlength='"+klen+"'>" + safe.textarea(flexkenmerkwaarde) + "</textarea>";
}
else
{
kv = "<div class='readonly fldflexC50'>" + safe.html(flexkenmerkwaarde) + "</div>";
}
}
else
{
anyTextarea = true; // straks autogrow code
kv = "<textarea "
+ (kregexp ? " regexp='" + kregexp + "' " : "")
+ " onChange='fvalid=checkKenmerk(this, false,\"" + ktype + "\"," + klen + "," + kdec + "," + kmin + "," + kmax + ")"
+ onchangeExp
+ "'"
+ " onBlur='checkKenmerk(this, true,\"" + ktype + "\"," + klen + "," + kdec + "," + kmin + "," + kmax + ")'"
+ " class='fldflexC50 "
+ (required ? required_class : "")
+ (isExpression? " expression " : "")
+ "'"
+ (required ? " required='required' " : "")
+ (isExpression ? " readonly " : "")
+ " rows=3 "
+ " maxlength='"+klen+"'"
+ " name='" + nameprefix + idCounter + "val' id='" + nameprefix + idCounter + "val' "
//+ "placeholder='"+flexkenmerklabel+"'"
+ ">"
+ safe.textarea(flexkenmerkwaarde)
+ "</textarea>";
}
} else { // klein input veld
if (readonlyfield || maskeren)
{
if (formobile)
{
kv = "<input type='text' class='fldflexC ' readonly tabindex=-1 value='"+ safe.html(flexkenmerkwaarde) +"'>";
}
else
{
kv = "<span"
+ " class='readonly "
+ (kenmerk_search ? "fldSflexC " : "fldflexC ")
+ "'>" + safe.htmlattr(flexkenmerkwaarde) + "</span>";
}
}
else
{
kv = "<input type='text'"
+ (kregexp ? " regexp='" + kregexp + "' " : "")
+ " onChange='fvalid=checkKenmerk(this, false,\"" + ktype + "\"," + klen + "," + kdec + "," + kmin + "," + kmax + ")"
+ onchangeExp
+ "'"
+ " onBlur='checkKenmerk(this, true,\"" + ktype + "\"," + klen + "," + kdec + "," + kmin + "," + kmax + ")'"
+ " id='" + nameprefix + idCounter + "val' name='" + nameprefix + idCounter + "val'"
+ " class='"
+ (kenmerk_search ? "fldSflexC " : "fldflexC ")
+ (required ? required_class : "")
+ (isExpression? " expression " : "")
+ "'"
+ (required ? " required='required' " : "")
+ (isExpression ? " readonly " : "")
//+ " placeholder='"+flexkenmerklabel+"'"
+ " value='" + safe.htmlattr(flexkenmerkwaarde) + "'"
+ " maxlength='" + klen + "'"
+ ">";
}
}
} // C
// Bijhouden welk kenmerk welke id referentie mee heeft gekregen
function idref(idname, waarde)
{
this.idname = idname;
this.waarde = waarde;
}
// Bijhouden van kenmerken. Later kan blijken dat ze parent kenmerken zijn.
// Kenmerkkey alleen is niet uniek bij meerdere bezoekers of factuurregels.
// Daarom nameprefix meenemen want die is per bezoeker of factuurregel wel uniek.
kenmerkidref[nameprefix + kkey] = new idref(nameprefix + idCounter, flexkenmerkwaarde);
var parentkenmerkid = "";
var parentkenmerk_key = -1;
var parentkenmerkwaarde;
if (!readonlyfield && (ktype == 'S' || ktype == 'R'))
{
// Aannames die tot nu toe zijn gemaakt:
// 1) Een kenmerk kan alleen afhankelijk zijn van een kenmerk van hetzelfde type.
// M.a.w. een suggest box kan nu nog alleen afhankelijk zijn van een andere suggestbox (idem geldt voor listbox).
// Als een suggestbox namelijk dezelfde kenmerkdomein gebruikt als een listbox en ze worden beide gelijktijdig gebruikt geeft dat anders problemen.
// 2) Afhankelijke suggestboxen met hetzelfde kenmerkdomein mogen niet voorkomen. Anders kun je niet de juiste afhankelijke suggestbox bepalen.
// Idem geldt dit voor listboxen.
// 3) Als een kenmerk afhankelijk is van een ander kenmerk dan moet de afhankelijke kenmerk een hoger volgnummer hebben (later worden getoond)
// dan het kenmerk waarvan het afhankelijk is.
// 4) Afhankelijkheid van kenmerken werkt alleen voor eigen tabellen (fac_usrtab, fac_usrdata)
// Is er een afhankelijkheid met een ander kenmerk (met een lager volgnummer)?
var sqlDep = "SELECT tfin.kenmerk_key"
+ " FROM fac_usrtab ut1"
+ " , fac_usrtab ut2"
+ " , fac_kenmerkdomein kd1"
+ " , fac_kenmerkdomein kd2"
+ " , (" + sql + ") tfin"
+ " WHERE kd1.fac_kenmerkdomein_key = " + kdomein_key
+ " AND kd1.fac_usrtab_key = ut1.fac_usrtab_key"
+ " AND ut1.fac_usrtab_parentkey = ut2.fac_usrtab_key"
+ " AND ut2.fac_usrtab_key = kd2.fac_usrtab_key"
+ " AND kd2.fac_kenmerkdomein_key = tfin.kenmerkdomein_key"
+ " AND tfin.kenmerk_kenmerktype = " + safe.quoted_sql(ktype)
var oRs2 = Oracle.Execute(sqlDep);
if (!oRs2.eof)
{ // Er is een afhankelijkheid met een ander kenmerk
parentkenmerk_key = oRs2("kenmerk_key").value;
parentkenmerkid = kenmerkidref[nameprefix + parentkenmerk_key].idname;
parentkenmerkwaarde = kenmerkidref[nameprefix + parentkenmerk_key].waarde;
}
oRs2.close();
}
// ==========================================================================================
// ============================================
// KENMERKTYPE R/S (Referentie/readonly Suggest) ============================================
// ============================================
// ==========================================================================================
if (ktype == "R" || ((readonlyfield || maskeren) && ktype == "S")) // Referentie naar andere tabel (listboxje)
{
var wheres = [];
var dsql = "SELECT fac_kenmerkdomein_objectnaam"
+ ", fac_kenmerkdomein_kolomnaam"
+ ", fac_kenmerkdomein_kolomtxt"
+ ", fac_kenmerkdomein_xmlnode"
+ ", fac_kenmerkdomein_verval"
+ ", fac_usrtab_key"
+ " FROM fac_kenmerkdomein"
+ " WHERE fac_kenmerkdomein_key = " + kdomein_key;
var oRs_d = Oracle.Execute(dsql);
var xmlnode = oRs_d("fac_kenmerkdomein_xmlnode").value;
var vervalkolom = oRs_d("fac_kenmerkdomein_verval").value;
if (!readonlyfield && parentkenmerkid != "")
{
if (parentkenmerkwaarde != null)
wheres.push("fac_usrdata_parentkey = " + parentkenmerkwaarde);
else // Parent heeft geen waarde geselecteerd.
wheres.push("fac_usrdata_parentkey IS NOT NULL");
}
if (flexkenmerkwaarde !== null && String(oRs_d("fac_kenmerkdomein_kolomnaam").value).match(/\_key$/i))
{
var vv = parseInt(flexkenmerkwaarde, 10);
if (isNaN(vv))
{ // Kan gebeuren als van een text-kenmerk *achteraf* een referentiekenmerk wordt gemaakt
// Ook: als je bij een referentie kenmerk een foutieve default-waarde (textueel) invult
__DoLog("Ongeldige referentie waarde <em>{0}</em> voor kolom {1}.{2}".format(flexkenmerkwaarde,
oRs_d("fac_kenmerkdomein_objectnaam").value,
oRs_d("fac_kenmerkdomein_kolomnaam").value), "#ff0000");
flexkenmerkwaarde = "-1";
}
else
flexkenmerkwaarde = String(vv);
}
if (oRs_d("fac_kenmerkdomein_objectnaam").Value == "FAC_USRDATA" && oRs_d("fac_usrtab_key").Value)
{
// Deze kunnen we standaard localisen!
var fsql = "SELECT fac_usrdata_key"
+ " , " + lcl.xsql('fac_usrdata_omschr', 'fac_usrdata_key') + " fac_usrdata_omschr"
+ " , fac_usrdata_vervaldatum"
+ " , fac_usrdata_volgnr"
+ " FROM fac_usrdata "
+ " WHERE fac_usrtab_key=" + oRs_d("fac_usrtab_key").Value
+ (!readonlyfield
? " AND fac_usrdata_verwijder IS NULL"
: " AND fac_usrdata_key = " + flexkenmerkwaarde)
+ " AND (fac_usrdata_vervaldatum IS NULL OR fac_usrdata_vervaldatum > SYSDATE)"
+ (kregexp?" AND fac_usrdata_key IN ({0})".format(safe.int_array(kregexp.split(",")).join(",")):"")
+ " UNION "
+ "SELECT fac_usrdata_key"
+ " , " + lcl.xsql('fac_usrdata_omschr', 'fac_usrdata_key') + " ||"
+ " CASE"
+ " WHEN fac_usrdata_vervaldatum < SYSDATE"
+ " THEN " + safe.quoted_sql(L("lcl_inactive_data_suffix"))
+ " END fac_usrdata_omschr"
+ " , fac_usrdata_vervaldatum"
+ " , fac_usrdata_volgnr"
+ " FROM fac_usrdata "
+ " WHERE fac_usrtab_key = " + oRs_d("fac_usrtab_key").Value
+ " AND fac_usrdata_key = " + flexkenmerkwaarde;
}
else
{
var fsql = "SELECT " + oRs_d("fac_kenmerkdomein_kolomnaam").Value
+ "," + oRs_d("fac_kenmerkdomein_kolomtxt").Value + " fac_kenmerkdomein_omschr"
+ "," + (vervalkolom
? vervalkolom
: "NULL"
) + " x"
+ " FROM " + oRs_d("fac_kenmerkdomein_objectnaam").Value
+ " WHERE (" + vervalkolom + " IS NULL OR " + vervalkolom + " > SYSDATE)"
+ (readonlyfield
? " AND " + oRs_d("fac_kenmerkdomein_kolomnaam").Value + " = " + safe.quoted_sql(flexkenmerkwaarde)
: "")
+ " UNION "
+ "SELECT " + oRs_d("fac_kenmerkdomein_kolomnaam").Value
+ "," + oRs_d("fac_kenmerkdomein_kolomtxt").Value
+ (vervalkolom
? " || CASE WHEN " + vervalkolom + " < SYSDATE THEN " + safe.quoted_sql(L("lcl_inactive_data_suffix")) + " END"
: ""
) + " fac_kenmerkdomein_omschr"
+ "," + (vervalkolom
? vervalkolom
: "NULL"
) + " x"
+ " FROM " + oRs_d("fac_kenmerkdomein_objectnaam").Value
+ " WHERE " + oRs_d("fac_kenmerkdomein_kolomnaam").Value + " = " + safe.quoted_sql(flexkenmerkwaarde);
}
fsql += (oRs_d("fac_kenmerkdomein_objectnaam").Value == "FAC_USRDATA")
? " ORDER BY fac_usrdata_volgnr, 2"
: " ORDER BY 2, 1";
oRs_d.close();
var oRs2 = Oracle.Execute(fsql);
var c0 = "";
var c1 = "";
var inactiveval = false;
if (!oRs2.eof)
{
c0 = oRs2(0); // for performance this is better, it seems (-JGL).
c1 = oRs2(1);
inactiveval = (oRs2(2).Value != null && oRs2(2).Value<new Date());
}
// Performance optimalisation: Instead of building the string by appending
// we build it in an array first and finally 'join' it.
var builder = new Array();
var maxLen = 0;
var kvv = "";
while (!oRs2.eof)
{
if (readonlyfield)
{
if (c0.value == flexkenmerkwaarde)
{
kvv = c1.value;
break; // Rap klaar. Kan efficienter met een WHERE?
}
}
else
{
if (c1.value != null && String(c1.value.length) > maxLen)
maxLen = String(c1.value).length;
appender = '<option value="' + c0.value + '"'
+ (c0.value == flexkenmerkwaarde?' selected' : '') + '>' + safe.html(c1.value) + '</option>';
builder[builder.length] = appender;
}
oRs2.MoveNext();
}
if (kvv == '') kvv += builder.join(' ');
if (kvv == '') kvv = ' '; // Zodat readonly/print in ieder geval het label getoond wordt.
oRs2.close();
if (readonlyfield || maskeren)
{
var showdetail = (formobile ? "" : (xmlnode? ' details' : '') );
var clickdetail = (formobile ? "" : (xmlnode? ' onClick="xmlNodeDetails(' + flexkenmerkwaarde + ', \'' + xmlnode + '\')"' : '') );
if (ktype == "R")
kv = '<input class="fldflexR'
+ showdetail
+ (inactiveval? ' inactive' : '')
+ '" type="text" readonly tabindex=-1 value="' + safe.htmlattr(kvv) + '"'
+ clickdetail
+ '>';
else
kv = '<input class="fldflexS'
+ showdetail
+ (inactiveval ? ' inactive' : '')
+ '" type="text" readonly tabindex=-1 value="' + safe.htmlattr(kvv) + '"'
+ clickdetail
+ '>';
}
else
{
// is dus impliciet ook type R
if (flexExprIncluded && !isExpression)
onchangeExp = "calculateFlexExpressions(this"
+ ", \"" + module + "\""
+ ", " + key
+ ", \"" + (props.kenmerk_module || "") + "\""
+ ", \"" + nameprefix + "\""
+ ", \"" + extraserie + "\""
+ ");";
kv = "<select id='" + nameprefix + idCounter + "val' name='" + nameprefix + idCounter + "val'"
+ " class='"
+ (kenmerk_search ? "fldSflexR " : "fldflexR ")
+ (required ? required_class : "")
+ "'"
//+ " placeholder='"+flexkenmerklabel+"'"
+ (required ? " required='required' " : "")
+ (required > 1
? " onChange='checkRequiredGroup(\"" + required_group + "\");" + onchangeExp + "'"
: (flexExprIncluded && !isExpression? " onChange='" + onchangeExp + "'" : ""))
+ ">"
+ "<option value='-1' " + (required? " class='" + required_class + "'" : "") + "><!--lege waarde--></option>"
+ kvv
+ "</select>";
}
if (!readonlyfield && parentkenmerkid != "" && !maskeren)
{ %>
<script type="text/javascript">
function onChangeRKenmerkParent<%=parentkenmerkid%>()
{ // Functie wordt aangeroepen door een eventuele parent waarvan deze listbox afhankelijk is
var className = $("#<%=parentkenmerkid%>val")[0].className;
if (className.match(/required\d/g) && className.match(/required\d/g).length > 0)
{ // Select hoort binnen een required groep.
var group = $("#<%=parentkenmerkid%>val")[0].className.match(/required\d*S\d*/g)[0].substr(8);
checkRequiredGroup(group);
}
$("#<%=nameprefix + idCounter%>val").
load(rooturl + "/appl/Shared/loadRKenmerk.asp",
{ init_key: $("#<%=nameprefix + idCounter%>val").val(),
kdomein_key: <%=kdomein_key%>,
parent_key: $("#<%=parentkenmerkid%>val").val(),
required: <%=required? required : 0%>,
hideVervallen: <%=hideVervallen? 1 : 0%> });
}
$(function()
{
// Op de onChange van de parent moet deze listbox opnieuw gevuld worden.
// onchange van de parent koppelen aan de functie die deze actie uitvoert.
$("#<%=parentkenmerkid%>val")[0].onchange = function() {onChangeRKenmerkParent<%=parentkenmerkid%>();}
});
</script><%
}
}
// ==========================================================================================
// ===================================================================
// KENMERKTYPE F/E (File) ===================================================================
// ===================================================================
// ==========================================================================================
var lijst = [];
// mobile doen we heel anders, tenzij het signature is. Die doen we nog old-school
if (formobile && kdim != 'xxx' && (ktype == 'F' || ktype == 'E' || ktype == 'M'))
{
var lijst = BijlagenList(module, niveau, key, kkey, otherPath); // die hebben we dan nodig
var filehtmlarr = [];
for (var i = 0; i < lijst.length; i++)
{
if (device.isapp()) // Daar vooralsnog niet clickable omdat je niet terug kunt
{
var html = safe.html(lijst[i]); // even niet klikbaar, in de app kun je niet terug dan.
}
else
{
var href = HTTP.urlzelfnoroot() + protectQS.create(OpenFlexFile(module, niveau, key, kkey, lijst[i]));
var html = '<a class="details fldflexM" data-role="button"'
+ ' href=\"' + safe.htmlattr(href) + '" target="_blank" data-ajax="false">' + safe.html(lijst[i]) + '</a>';
}
filehtmlarr.push(html);
}
var kv = filehtmlarr.join("</br>");
if (!lijst.length && !readonlyfield)
{
kv += '<span id="attachments_form">';
kv += ' <span class="attachments_form">';
kv += ' <span class="attachments_fields">';
kv += ' </span>';
kv += ' <span class="add_attachment" style="">';
kv += ' <label for="attachments'+kkey+'" data-role="button" data-icon="cloud">' + L("lcl_select_file") + (kdim? "(" + safe.html(kdim) + ")":"") + "</label>"
kv += ' <input type="file"';
kv += ' name="attachments'+kkey+'"';
kv += ' id="attachments'+kkey+'"';
kv += ' class="file_selector filedrop"';
if (ktype == 'M')
kv += ' multiple="multiple"';
kv += ' onchange="addInputFiles(this);"';
//kv += ' data-max-file-size="5242880"';
//kv += ' data-max-file-size-message="This file cannot be uploaded because it exceeds the maximum allowed file size (5 MB)"';
kv += ' data-max-concurrent-uploads="2"';
kv += ' data-upload-path="{0}/api2/{1}/{2}/attachments/{3}/"'.format(rooturl, api2name, key<0?0:key, kkey);
kv += ' data-role="none"'; // zorg dat jQuery er verder af blijft, hij wordt toch hidden
kv += ' data-param="attachments"';
kv += ' data-description="true"';
//kv += ' data-description-placeholder="Optional description"';
//kv += ' (Maximum size: 5 MB)';
kv += ' />';
kv += ' </span>';
kv += ' </span>';
kv += '</span>';
kv += ' <script>$("label[data-role=button]").button()'; // waarom gaat dit niet vanzelf?
kv += '</script>';
}
}
else if (ktype == 'F' || ktype == 'E') // single File of Encrypted, reguliere GUI
{
// Bedoeling is: toon de filenaam in een inputfield.
// In showmode/readonly kun je er op klikken als-ie bestaat, in editmode
// moet je de change button gebruiken om te wijzigen en is niet klikbaar.
// De echte waarde bewaren we in een hidden veld. Die wordt dan ook gesubmit
var fld = nameprefix + idCounter + "val";
// Er is redundantie: de bestandsnaam zit in de database en staat in de folder
// door bijvoorbeeld niet op Ok te drukken na vervanging van het bestand
// kan er inconsistentie ontstaan. Lastig tegen te gaan dus maar detecteren en melden.
var missing = false;
if (flexkenmerkwaarde && ktype != 'M')
{
var fso = new ActiveXObject("Scripting.FileSystemObject");
if (otherPath)
var vAttachPath = S("flexFilesPath") + "/" + otherPath;
else
{
// JGL: Zou dit niet moeten/ kunnen via bijvoorbeeld iets als flexProps(module, key, String(kkey), niveau).AttachPath + "/";
var vAttachPath = S("flexFilesPath") + "/" + module + "/" + subfolderKey(bepaalNiveau(module, niveau), key) + "/" + kkey;
}
missing = !fso.FileExists(vAttachPath + "/" + flexkenmerkwaarde);
if (missing)
__Log(vAttachPath + "/" + flexkenmerkwaarde + " is missing");
}
// Mobile heeft een compleet eigen BijlagenForm.asp
if (kdim == 'xxx')
var url = rooturl + "/appl/shared/BijlagenSignature.asp"
else
var url = rooturl + "/appl/shared/BijlagenForm.asp"
url += "?module=" + module
+ "&key=" + key
+ (niveau != ""? "&niveau=" + niveau : "")
+ "&kenmerk_key=" + kkey
+ "&mobile=" + (formobile ? 1 : 0)
+ (props.kenmerk_module? "&kenmerk_module=" + props.kenmerk_module : "");
// nooit if (pReadonly) url += "&reado=1";
// nooit url += "&multi=1";
if (kdim) url += "&extFilter=" + escape(kdim);
if (kregexp) url += "&pregexp=" + escape(kregexp); // P800x600 voor foto van 800x600
if (ktype == "E") url += "&encrypt=1";
if (key < 0)
url += "&tmpfolder=" + tmpfolder;
var saveUrl = "";
if (props.parentKey > 0 && ktype != 'M')
{
// Voor de zekerheid slaan we wijziging van de bestandsnaam direct op.
// op het filesysteem is het namelijk ook al 'gecommit'
var saveUrl= rooturl + "/appl/shared/AjaxSaveFlex.asp";
if (module=="MLD" && niveau == "O")
saveUrl += "?module=OPDR";
else if (module=="FIN" && niveau == "R")
saveUrl += "?module=FINR";
else
saveUrl += "?module="+module;
saveUrl += "&parentKey="+props.parentKey;
saveUrl += "&kenmerkKey=" + kkey;
if (props.kenmerk_module)
saveUrl += "&kenmerk_module="+props.kenmerk_module;
};
var func = "onBijlagen";
if (formobile)
func = "onBijlagenMobile";
var blg = func + "('" + safe.jsstring(protectQS.create(url)) + "'"
+ ",'" + (saveUrl?safe.jsstring(protectQS.create(saveUrl)):"") + "'"
+ ", false"
+ ", $('#" + fld + "')[0]"
+ ")";
if (!readonlyfield || flexkenmerkwaarde)
{
kv = "<input type='text'"
+ (readonlyfield
? " readonly tabindex=-1 "
: " id='" + fld + "' name='" + fld + "' ")
+ "class='"
+ (kenmerk_search
? "fldSflex" + ktype + " "
: "fldflex" + ktype + " ")
+ (missing ? " missing " : " details ")
+ "'"
+ (required ? " required='required' " : "")
+ (required > 1
? " onChange='checkRequiredGroup(\"" + required_group + "\")'"
: "")
//+ " placeholder='"+flexkenmerklabel+"'"
+ " value='" + safe.htmlattr(flexkenmerkwaarde) + "' "
+ (!flexkenmerkwaarde?" style=display:none":"");
// + ">"; //komt later
var kvClick="";
if (otherPath) // Even niet klikbaar
kvClick = " title='" + L("lcl_flex_autocopy") +"' ";
else if (readonlyfield && flexkenmerkwaarde && !missing && !maskeren) // rechtstreeks openen
{
if (kdim == 'xxx')
var fnclick = "parent.FcltMgr.windowopen('" + protectQS.create(OpenFlexFile(module, niveau, key, kkey, flexkenmerkwaarde, { mime_type: "image/png", contentdp: "inline" })) + "')";
else
var fnclick = "parent.FcltMgr.windowopen('" + protectQS.create(OpenFlexFile(module, niveau, key, kkey, flexkenmerkwaarde)) + "', 'File')";
kvClick = " onclick='" + safe.htmlattr(fnclick) + "'";
}
else if (readonlyfield && flexkenmerkwaarde && missing) // Waarschuwen
kvClick = " title='" + safe.htmlattr(L("lcl_flex_filenotfoundRO")) + "'";
else
{
kvClick = " onClick='" + safe.htmlattr(blg) + "'"; // klik altijd naar bijlagenform
if (missing)
{
kvClick += " title='" + safe.htmlattr(L("lcl_flex_filenotfound")) + "'";
}
else
kvClick += " title='" + L("lcl_change") + "'";
}
// Om te saven doet de gebruiker maar rightclick/Saveas
kv += kvClick + ">"; // hier tag afsluiten
}
if (!readonlyfield && !otherPath) // Altijd aanwezig
{
kv += "<input type='button' "
+ "class='bijlage1 button " + (required? required_class : "") + "' "
+ "isBijlage='1' nBijlagen='"+(flexkenmerkwaarde?1:0)+"' "
+ "value='" + L("lcl_add") + "'"
+ (flexkenmerkwaarde?" style='display:none' ": " ")
+ "onClick=\"" + blg + "\""
+">";
}
if (kdim == 'xxx')
{
if (!missing && flexkenmerkwaarde)
kv += "<img class='kenmerk' src=' " + protectQS.create(OpenFlexFile(module, niveau, key, kkey, flexkenmerkwaarde, { mime_type: "image/png", contentdp: "inline" })) + "'>";
else
kv += "<img class='kenmerk' style='display:none'>";
}
}
// ==========================================================================================
// ======================================================================
// KENMERKTYPE M (Map) ======================================================================
// ======================================================================
// ==========================================================================================
else if (ktype == 'M') // Map met bestanden is altijd heel simpel
{
var requiredfield = (required ? required_class : "");
var identify = " id='" + nameprefix + idCounter + "val' name='" + nameprefix + idCounter + "val'";
var res = BijlagenButton(module, niveau, key, tmpfolder, kkey, readonlyfield,
requiredfield, kdim, kregexp, otherPath, identify, L("lcl_appendixes_teller"), props)
kv = res.html;
if (res.count > 0)
allCollapsable = false;
if (parent_list)
{
for (pp in parent_list)
{ // JGL: parent_list is alleen bij workflowmeldingen in *show*mode.
// Meeste parameters hieronder zullen dan ook don't care zijn
var res = BijlagenButton(parent_list[pp].module, niveau, parent_list[pp].key,
tmpfolder, kkey, readonlyfield, requiredfield, kdim, kregexp, otherPath, identify, parent_list[pp].label, props)
if (res.count > 0)
{
allCollapsable = false;
kv_arr.push({label: parent_list[pp].label.format(L("mld_workflowrule_step_prev")), waarde: res.html}); // parent komt ervoor
}
}
}
addPreview &= !nolabel && !maskeren && readonlyfield;
if (addPreview)
previewParams.push(protectQS.create("../Shared/BijlagenPreview.asp?key="+key+"&kenmerk_key="+kkey+"&module="+module+"&niveau="+niveau));
}
var makeCheckbox = false;
if ((ktype == 'N' || ktype == 'B') && klen == 1 && kmin == 0 && kmax == 1 && (kdec == 0 || !kdec))
{
makeCheckbox = true;
if (formobile) // Daar staat de tekst achter het vinkje
val_seperator = '';
}
// ==========================================================================================
// =====================================================================
// KENMERKTYPE T (Time) =====================================================================
// =====================================================================
// ==========================================================================================
if (ktype == 'T')
{
if (kmin === null)
{
switch(module)
{
case "BEZ": kmin = S("vis_t1"); break;
case "PRS": kmin = S("prs_t1"); break;
case "RES": kmin = S("res_t1"); break;
default: kmin = S("fac_t_startofworkday"); break;
}
}
if (kmax === null)
{
switch(module)
{
case "BEZ": kmax = S("vis_t2"); break;
case "PRS": kmax = S("prs_t2"); break;
case "RES": kmax = S("res_t2"); break;
default: kmax = S("fac_t_endofworkday"); break;
}
}
if (parseFloat(kmin) % 1 != 0) kmin = Math.floor(kmin) + ":" + parseInt(parseFloat(kmin) % 1 * 60, 10);
if (parseFloat(kmax) % 1 != 0) kmax = Math.floor(kmax) + ":" + parseInt(parseFloat(kmax) % 1 * 60, 10);
kmin = String(kmin);
kmax = String(kmax);
if (kmin.indexOf(":") == -1) kmin += ":00";
if (kmax.indexOf(":") == -1) kmax += ":00";
if (kmin.split(":")[0].length == 1) kmin = "0" + kmin; // pad
if (kmax.split(":")[0].length == 1) kmax = "0" + kmax; // pad
minMax.push({id: idCounter, kmin: kmin, kmax: kmax});
kv = "<input type='text'"
+ (!readonlyfield && kregexp ? " regexp='" + kregexp + "' " : "")
+ (!readonlyfield
? " onChange='fvalid=checkKenmerk(this, false,\"" + ktype + "\"," + klen + "," + kdec + ",\"" + kmin + "\",\"" + kmax + "\")"
+ onchangeExp
+ "' "
: "")
+ (!readonlyfield ? " onBlur='checkKenmerk(this, true,\"" + ktype + "\"," + klen + "," + kdec + ",\"" + kmin + "\",\"" + kmax + "\")' " : "")
+ (readonlyfield || maskeren
? " readonly tabindex=-1 "
: " id='" + nameprefix + idCounter + "val' name='" + nameprefix + idCounter + "val' ")
+ " class='"
+ (kenmerk_search ? "fldSflexT " : "fldflexT ")
+ (required ? required_class : "")
+ (isExpression? " expression " : "")
+ "'"
+ (required ? " required='required' " : "")
+ (isExpression? " readonly " : "")
+ " value='" + safe.htmlattr(flexkenmerkwaarde) + "'"
+ ">";
if (!readonlyfield && !isExpression && !maskeren)
kv += "<i class=\"fa fa-clock-o fa-fw flex timeklikker\"></i>";
anyTime |= !readonlyfield;
}
// ===========================================================================
// De uitzonderingen hebben we nu gehad, alle overige types beginnen hetzelfde
// ===========================================================================
// JGL: Wat zijn de overige types nog van CNDRSXFEMLlQB ?
// Volgens mij NDXLlQB waarbij L en l nog overruled worden.
if (kv == "" && ktype != "M" && ktype != "F" && ktype != "E" && !makeCheckbox)
{ // Ook lege folders met bestanden en een enkele bestandsnaam krijgen we via de query mee. Maar deze niet tonen.
// Ooit meer HTML-types toepassen (number, float)
if (flexExprIncluded && (ktype == "N" || ktype == "D" || ktype == "S") && !isExpression)
onchangeExp = ";if (fvalid) calculateFlexExpressions(this"
+ ", \"" + module + "\""
+ ", " + key
+ ", \"" + (props.kenmerk_module || "") + "\""
+ ", \"" + nameprefix + "\""
+ ", \"" + extraserie + "\""
+ ");";
kv = "<input type='text'"
+ (!readonlyfield && kregexp ? " regexp='" + kregexp + "' " : "")
+ (!readonlyfield
? " onChange='fvalid=checkKenmerk(this, false,\"" + ktype + "\"," + klen + "," + kdec + "," + kmin + "," + kmax + ")"
+ onchangeExp
+ "' "
: "")
+ (!readonlyfield ? " onBlur='checkKenmerk(this, true,\"" + ktype + "\"," + klen + "," + kdec + "," + kmin + "," + kmax + ")' " : "")
+ (readonlyfield || maskeren
? " readonly tabindex=-1 "
: " id='" + nameprefix + idCounter + "val' name='" + nameprefix + idCounter + "val' ");
}
//
// LET OP: kv is nu een "OPEN" variabele, die nog minstens een sluithaak nodig heeft!
//
// ==========================================================================================
// ===============================================
// KENMERKTYPE N (Numeriek) of B (Berekening) ===============================================
// ===============================================
// ==========================================================================================
if (ktype == "N" || ktype == "B")
{
// Checkbox of numeriek/berekening input veld.
if (makeCheckbox) // deze doen we compleet hier
{
if (readonlyfield || ktype == "B" || maskeren) // Berekening input veld is altijd readonly.
{
if (formobile)
{
kv = "<input type='text' class='fldflexc ' readonly tabindex=-1 value='" + (flexkenmerkwaarde == 1? L("lcl_check_1") : L("lcl_check_0")) + "'>";
}
else
{
kv = "<span"
+ " class='readonly "
+ (kenmerk_search ? "fldSflexC" : "fldflexC") // Is nu tekstveld
+ "'>" + (flexkenmerkwaarde == 1? L("lcl_check_1") : L("lcl_check_0")) + "</span>";
}
}
else
{
kv = "<input type='checkbox' class='"
+ (kenmerk_search ? "fldCSflexN " : "fldCflexN ")
+ (required ? required_class : "")
+ "'"
+ " onChange='checkKenmerk(this, false,\"" + ktype + "\"," + klen + "," + kdec + "," + kmin + "," + kmax + ")' "
+ " onBlur='checkKenmerk(this, true,\"" + ktype + "\"," + klen + "," + kdec + "," + kmin + "," + kmax + ")' "
+ (flexkenmerkwaarde == 1
? " checked"
: "")
+ " id='" + nameprefix + idCounter + "val' name='" + nameprefix + idCounter + "val' "
+ ">"
+ "<input type='hidden' id='has_" + nameprefix + idCounter + "val' name='has_" + nameprefix + idCounter + "val' value='1'>";
}
}
else
{
// geen checkbox (noot PF: de readonly hiervan wordt kennelijk elders behandeld)
kv += " class='"
+ (kenmerk_search ? "fldSflexN " : "fldflexN ")
+ (required ? required_class : "")
+ (kdec > 0 ? " float " : " number ")
+ (isExpression? " expression " : "")
+ "'"
+ (required ? " required='required' " : "")
+ (isExpression ? " readonly " : "")
+ " value='" + (kdec > 0 && flexkenmerkwaarde? safe.displayfloat(parseFloat(flexkenmerkwaarde), kdec) : safe.html(flexkenmerkwaarde)) + "'"
+ " maxlength='" + ((kmin >= 0? 0 : 1) + (kdec > 0? 1 : 0) + klen) + "'"
+ ">";
}
}
// ==========================================================================================
// =====================================================================
// KENMERKTYPE D (Date) =====================================================================
// =====================================================================
// ==========================================================================================
if (ktype == 'D')
{
kv += " class='"
+ (kenmerk_search ? "fldSflexD " : "fldflexD ")
+ (required ? required_class : "")
+ (isExpression? " expression " : "")
+ "'"
+ (required ? " required='required' " : "")
+ (isExpression? " readonly " : "")
+ " value='" + safe.htmlattr(flexkenmerkwaarde) + "'"
+ ">";
if (!readonlyfield && !isExpression && !maskeren)
kv += "<i class=\"fa fa-calendar fa-fw dateklikker\" onclick=\"$('#" + nameprefix + idCounter + "val').datepicker('show')\"></i>";
// Als er voor een datumveld geen kmin en kmax is ingevuld dan is de yearRange default -10 tot +10 jaar vanaf geselecteerd jaar.
// Is een van beiden ingevuld dan wordt de andere op 10 jaar vanaf geselecteerde jaar gezet (deze verschuift met selectie).
// Een opgegeven waarde is het aantal jaren voor of na het huidige jaar (waarde < 1000), of een jaartal (waarde > 1000).
if (kmin || kmax)
{
range_val = (kmin ? ((Math.abs(kmin)<1000) ? "c"+(kmin>0?"+"+kmin:kmin) : Math.abs(kmin)) : "c-10") + ":"
+ (kmax ? ((Math.abs(kmax)<1000) ? "c"+(kmax>0?"+"+kmax:kmax) : Math.abs(kmax)) : "c+10");
field_id = nameprefix + idCounter + "val";
dpYearRanges.push({id: field_id, range: range_val});
}
anyDate |= !readonlyfield;
}
// ==========================================================================================
// =========================================================
// KENMERKTYPE X (Bestandsnaam/url) =========================================================
// =========================================================
// ==========================================================================================
if (ktype == 'X')
{
var viewpath = flexkenmerkwaarde;
if (readonlyfield || maskeren) // Je mag er wel op klikken
if (flexkenmerkwaarde)
kv = '<input class="details fldflexX" onclick=\'openDoc("' + safe.jsstring(viewpath) + '")\' value="' + safe.htmlattr(flexkenmerkwaarde) + '">';
else
kv = "";
else if (flexkenmerkwaarde) // Tekstveld met 'view' button er achter plakken
kv += " class='fldflexX"
+ (required ? required_class : "")
+ "'"
+ " value='" + safe.htmlattr(flexkenmerkwaarde) + "'"
+ (required ? " required='required' " : "")
+ "><i class='fileopen details fa fa fa-folder-open' "
+ " onClick='openDoc(\"" + safe.jsstring(viewpath) + "\");'></i>";
else if (!kenmerk_search) // !flexkenmerkwaarde // Browse button for new er achter plakken
kv = "<input class='fldflexX"
+ (required ? required_class : "")
+ "'"
+ (required ? " required='required' " : "")
+ (required > 1
? " onChange='checkRequiredGroup(\"" + required_group + "\")'"
: "")
+ " type='text' "
+ "name='" + nameprefix + idCounter + "val' "
+ "value='" + safe.htmlattr(flexkenmerkwaarde) + "'"
+ ">";
else
kv += ">";
}
// ==========================================================================================
// ==================================================================
// KENMERKTYPE S (Suggest) ==================================================================
// ==================================================================
// ==========================================================================================
// readonlyfield/maskeren is bij "R" al meegenomen
if (ktype == "S" && !readonlyfield && !maskeren) // Referentie naar andere tabel (suggest box)
{
// Huidige waarde opzoeken
var dsql = "SELECT fac_kenmerkdomein_objectnaam "
+ " , fac_kenmerkdomein_kolomnaam "
+ " , fac_kenmerkdomein_kolomtxt "
+ " , fac_kenmerkdomein_verval"
+ " , fac_usrtab_key "
+ " FROM fac_kenmerkdomein "
+ " WHERE fac_kenmerkdomein_key = " + kdomein_key;
var oRs_d = Oracle.Execute(dsql);
var vervalkolom = oRs_d("fac_kenmerkdomein_verval").Value;
var suggestval = getDatatypeValue(oRs_d("fac_kenmerkdomein_objectnaam").value, oRs_d("fac_kenmerkdomein_kolomnaam").value, flexkenmerkwaarde);
if (oRs_d("fac_kenmerkdomein_objectnaam").value == "FAC_USRDATA" && oRs_d("fac_usrtab_key").value)
{
var fsql = "SELECT fac_usrdata_key"
+ ", " + lcl.xsql('fac_usrdata_omschr', 'fac_usrdata_key')
+ " || CASE WHEN fac_usrdata_vervaldatum < SYSDATE THEN " + safe.quoted_sql(L("lcl_inactive_data_suffix")) + " END"
+ " fac_usrdata_omschr"
+ ", fac_usrdata_vervaldatum"
+ " FROM fac_usrdata "
+ " WHERE " + oRs_d("fac_kenmerkdomein_kolomnaam").Value + " = " + suggestval;
fsql += " AND fac_usrtab_key = " + oRs_d("fac_usrtab_key").Value
+ " AND fac_usrdata_verwijder IS NULL"
} else {
var fsql = "SELECT " + oRs_d("fac_kenmerkdomein_kolomnaam").Value
+ "," + oRs_d("fac_kenmerkdomein_kolomtxt").Value
+ (vervalkolom
? " || CASE WHEN " + vervalkolom + " < SYSDATE THEN " + safe.quoted_sql(L("lcl_inactive_data_suffix")) + " END"
: ""
) + " fac_kenmerkdomein_omschr"
+ "," + (vervalkolom
? vervalkolom
: "NULL"
) + " x"
+ " FROM " + oRs_d("fac_kenmerkdomein_objectnaam").Value
+ " WHERE " + oRs_d("fac_kenmerkdomein_kolomnaam").Value + " = " + suggestval;
}
oRs_d.close();
var oRs2 = Oracle.Execute(fsql);
var currval = "";
//var inactiveval = false;
if (!oRs2.eof)
{
currval = oRs2(1).value;
//inactiveval = (oRs2(2).value != null); // zie opmerking hieronder
}
oRs2.close();
%> <script type="text/javascript">
<% if (parentkenmerkid != "")
{ %>
function onChangeSKenmerkParent<%=parentkenmerkid%>(parentkey, parenttxt)
{ // Functie wordt aangeroepen door een eventuele parent waarvan deze suggest afhankelijk is
// setValue(key, txt, doonChange, checkExist, extraParam, lastTry)
var presentkey = $("#<%=nameprefix + idCounter%>val").val();
var presenttxt = $("#Suggest<%=nameprefix + idCounter%>_show").val()
Suggest<%=nameprefix + idCounter%>.setValue(presentkey, presenttxt, false, true, null, true);
// Indien suggestbox verplicht is en maar <20><>n mogelijke waarde heeft, dan deze selecteren
if ($("#Suggest<%=nameprefix + idCounter%>_show").hasClass("required")) Suggest<%=nameprefix + idCounter%>.CheckJustOne();
var className = $("#Suggest<%=parentkenmerkid%>_show")[0].className;
if (className.match(/required\d/g) && className.match(/required\d/g).length > 0)
{ // Suggest hoort binnen een required groep.
var group = $("#Suggest<%=parentkenmerkid%>_show")[0].className.match(/required\d*S\d*/g)[0].substr(8);
checkRequiredGroup(group);
}
}
<% } %>
<% if (required)
{ %>
function onChangeSKenmerk<%=nameprefix + idCounter%>(parentkey, txt)
{
checkRequiredGroup("<%=required_group%>");
}
<% } %>
$(function()
{
if ($("#execDone<%=nameprefix + idCounter%>").val() == 0)
{ // Alleen initieel uitvoeren. Niet bij overzichten als "Geavanceerd" kenmerken worden gekopieerd naar div binnen form. Want waarde kan veranderd/ingevuld zijn.
Suggest<%=nameprefix + idCounter%> = new Suggest({objectName: "Suggest<%=nameprefix + idCounter%>",
queryField: $("#Suggest<%=nameprefix + idCounter%>_show")[0],
queryUrl: rooturl + "/appl/shared/Suggest/SuggestKenmerkDomein.asp?kenmerkdomein_key=<%=kdomein_key%>",
initKey: '<%=flexkenmerkwaarde%>',
keyField: $("#<%=nameprefix + idCounter%>val")[0],
fieldReadonly: <%=readonlyfield? "true" : "false"%>
<% if (parentkenmerkid != "")
{ %>
,urlAdd: [{ urlParam: "parent_key", field: "<%=parentkenmerkid%>val" }]
<% } %>
});
<% if (parentkenmerkid != "")
{ %>
// Op de onChange van de parent moet deze suggestbox geleegd worden.
// sgonchange van de parent koppelen aan de functie die deze actie uitvoert.
$("#Suggest<%=parentkenmerkid%>_show").attr("sgonChange", "onChangeSKenmerkParent<%=parentkenmerkid%>");
<% } %>
$("#execDone<%=nameprefix + idCounter%>").val(1); // Het is nu 1 keer uitgevoerd. Nu niet meer uitvoeren.
}
});
</script><%
kv = "<input type='text' "
+ (kregexp ? " regexp='" + kregexp + "' " : "")
+ "id='Suggest" + nameprefix + idCounter + "_show' "
+ "name='Suggest" + nameprefix + idCounter + "_show' "
+ "value='" + safe.htmlattr(currval) + "' "
+ "class='" + (kenmerk_search ? "fldflexS" : "fldSflexS")
+ (required ? required_class : "") + "'"
// zo wordt het veld rood, ongeacht de waarde, wat verwarrend is, dus niet + (inactiveval ? " inactive " : "")
+ (required ? " required='required' " : "")
+ (required > 1
? " sgonChange='onChangeSKenmerk" + nameprefix + idCounter + "'"
: "")
+ ">"
+ "<input type='hidden' id='" + nameprefix + idCounter + "val' name='" + nameprefix + idCounter + "val'>"
+ "<input type='hidden' id='execDone" + nameprefix + idCounter + "' name='execDone" + nameprefix + idCounter + "' value='0'>";
}
// ==========================================================================================
// ====================================================================
// KENMERKTYPE L (Label) ====================================================================
// ====================================================================
// ==========================================================================================
if (ktype == "L" || ktype == "l")
{ // Label line
allCollapsable = (ktype == "l"); // opnieuw beginnen met zoeken
inMobileBlock = (formobile && ktype == "l"); // op dit moment zitten we in een mobile-collapse-content-block
flexkenmerklabel = oRs("kenmerk_omschrijving").Value; // was: 1
clabelCounter++;
val_seperator = '';
kv = def_val;
// suggestie voor UWVA#20007: if required then collapsable
}
// ==========================================================================================
// Alles bepaald, te tonen waarde/veld in kv, nu positioneren enzo in kvhtml
// ==========================================================================================
if (!predone && props.fnpre && (kv || (ktype == 'L' || ktype == 'l')))
{
predone = true;
props.fnpre();
}
kenmerk_write("\n<!-- Kenmerk {0}:{1} -->\n".format(kkey, ktype));
// KENMERKTYPE Q (spacer) ===================================================================
// Alleen echt nuttig bij 2-koloms layout
if (ktype == 'Q')
{
// PF: deze implementatie lijkt me discutabel; is forceNewLine niet beter?
if (((colCount&1) || !kenmerk_2col) && !formobile && !notr)
kenmerk_write('<tr>');
else if (!((colCount&1) && kenmerk_2col) && !formobile && !notr)
kenmerk_write('\n</tr>');
oRs.MoveNext();
continue; // Teller is wel opgehoogd: volgende komt vanzelf op nieuwe regel
}
flexkenmerklabel = (maskeren ? c_maskmarker + "&nbsp;" + flexkenmerklabel : flexkenmerklabel);
var kvhtml = ""; // hierin bouwen we de html op
var kdefault = oRs("kenmerk_default").Value;
var ishidden = (props.fnIsHidden && props.fnIsHidden(kvolgnr, kdefault));
kv_arr.push({label: "", waarde: kv});
for(kv_i=0; kv_i< kv_arr.length; kv_i++)
{
var kv_params = { colCount: colCount
, forceNewLine: forceNewLine
, kenmerk_2col: kenmerk_2col
, formobile: formobile
, notr: notr
, module: module
, kvolgnr: kvolgnr
, ktype: ktype
, kkey: kkey
, kdim: kdim
, readonlyfield: readonlyfield
, forceReadonly: forceReadonly
, nameprefix: nameprefix
, clabelCounter: clabelCounter
, makeCheckbox: makeCheckbox
, formobile: formobile
, nolabel: nolabel
, kenmerk_search: kenmerk_search
, ishidden: ishidden
, idCounter: idCounter
, isExpression: isExpression
, hint: hint
, flexkenmerklabel: flexkenmerklabel
, flexkenmerkwaarde: flexkenmerkwaarde
, val_seperator: val_seperator
, addPreview: addPreview
, previewParams: previewParams
, props: props
, kenmerk_extraTD: kenmerk_extraTD
, maskeren: maskeren
, kv: kv_arr[kv_i].waarde
, label_ext: kv_arr[kv_i].label
};
kvhtml = kenmerk_regel(kv_params);
// En hier schrijven we het hele veld dan naar de pagina
kenmerk_write (kvhtml);
idCounter++; // Nu ophogen
}
oRs.MoveNext();
// Collapse code er achteraan als de *volgende* een ander label is
if (!ishidden && (inMobileBlock || (!formobile && allCollapsable)) && (oRs.Eof || oRs("kenmerk_kenmerktype").value.toUpperCase() == 'L')) // einde huidige label
{
if (formobile)
{
kenmerk_write('</div>');
inMobileBlock = false;
if (!allCollapsable) // the current collapseBlock should be expanded
kenmerk_write('<script> $(function(){ $("#collLabel'+clabelCounter+'").trigger("click"); });</script>');
}
else
kenmerk_write('<script>$(function(){$("#' + nameprefix + 'clabel' + clabelCounter + '").addClass("flexcollapsed").nextUntil($("#' + nameprefix + 'clabel' + (clabelCounter + 1) + '")).hide();})</script>');
allCollapsable = false;
}
}
oRs.close();
// All fields are done here
if (!ishidden && inMobileBlock || (!formobile && allCollapsable)) // allerlaatste ook nog
{
if (formobile)
{
kenmerk_write('</div>');
if (!allCollapsable) // the current collapseBlock should be expanded
kenmerk_write('<script> $(function(){ $("#collLabel'+clabelCounter+'").trigger("click"); });</script>');
}
else
kenmerk_write('<script>$(function(){$("#' + nameprefix + 'clabel' + clabelCounter + '").addClass("flexcollapsed").nextUntil($("#' + nameprefix + 'clabel' + (clabelCounter + 1) + '")).hide();})</script>');
}
var counterName = (extraserie? nameprefix + "_all" : "k_all");
if (!formobile)
{
if (!notr)
kenmerk_write('<tr>');
kenmerk_write('<td>');
}
if (key < 0)
kenmerk_write("<input type='hidden' name='ktmpfolder" + serie + "' id='ktmpfolder" + serie + "' value='" + tmpfolder + "'>");
kenmerk_write('<input type="hidden" id="' + counterName + '" name="' + counterName + '" value="' + (idCounter - 1) + '">');
kenmerk_write('<input type="hidden" id="k_flexsql" name="k_flexsql" value="' + (prssql? 1 : 0) + '">');
if (!formobile)
{
kenmerk_write('</td>');
if (!notr)
kenmerk_write('\n</tr>');
}
if (predone && props.fnpost)
props.fnpost();
// Eventuele scripts moeten buiten de </table>
if (anyTextarea && !kenmerk_search)
{
%><script>
$(function()
{
$('textarea').resize(function () { FcltMgr.resized(window) } );
if ($.fn.autogrow) // Niet bij mobile
$('textarea').autogrow();
});
</script><%
}
// Add preview links for bijlagen
if (previewParams.length && !kenmerk_search)
{
%><script>
$(function()
{
<% for (var i = 0; i < previewParams.length; i++)
{ %>
$("i.preview#<%=i%>").on("click", function() { FcltMgr.openModalDetail("<%=previewParams[i]%>", "<%=L("lcl_flex_preview")%>") });
<% } %>
});
</script><%
}
// Bij kenmerk_search doen de load_kenmerk's geen FCLTHeader.Generate en dus hebben
// we date.js niet gegarandeerd. .fldSflexD werd echter hieronder toch al niet
// meegenomen dus komen we er mee weg gewoon hier geen kalenders te doen
if (anyDate && !kenmerk_search)
{
// FCLTHeader.Requires is hier te laat
%><script type="text/javascript">
// Zie ook calendar.inc. Delen code was iets te lastig
$(function()
{
if (typeof Modernizr == "undefined" || !Modernizr.inputtypes.date)
{
if ($.datepicker)
{
// jQuery datepicker
$(".fldflexD").not("[readonly]").datepicker({
// buttonImage: "../pictures/calendar2.png",
// buttonImageOnly: true,
showOn: "none",
duration: 'fast',
dateFormat: 'dd-mm-yy', // zo verwacht de flex-code het.
changeYear: true,
changeMonth: true,
duration: 'fast',
beforeShow: function(input, inst) { setTimeout("FcltMgr.resized(window)", 100) },
dayNames: calendar_names.days,
dayNamesMin: calendar_names.daysMin,
dayNamesShort: calendar_names.daysMin,
firstDay: 1,
monthNamesShort: calendar_names.monthsShort,
monthNames: calendar_names.months,
showWeek: true
});
<%
for (i=0; i < dpYearRanges.length; i++)
{
fld_id = dpYearRanges[i].id;
fld_val = dpYearRanges[i].range;
%>
$("#<%=fld_id%>").datepicker("option", "yearRange", "<%=fld_val%>");
<%
}
%>
}
}
else
{
// Native datepicker
$(".fldflexD").not("[readonly]").each(function() {
// Make this a native datepicker
$(this).attr("type", "date");
// Native, so change date format from [DD-MM-YYYY] -> [YYYY-MM-DD] (native format)
$(this).val($(this).attr("value").split("-").reverse().join("-"));
// Change hidden type field from 'D' to 'DN'
var nativeId = $(this).attr("id").slice(0, -3);
$("input:hidden#"+nativeId+"t").val("DN");
});
}
});
</script><%
}
if (anyTime && !kenmerk_search)
{
// FCLTHeader.Requires is hier te laat
%><script type="text/javascript">
$(function()
{
if (typeof Modernizr == "undefined" || !Modernizr.inputtypes.time)
{
// Kan niet achteraf
var minMax = [];
<% for (i=0; i < minMax.length; i++)
{ %>
minMax[<%=minMax[i].id%>] = {"kmin": "<%=minMax[i].kmin%>", "kmax": "<%=minMax[i].kmax%>"}; <%
} %>
$(".fldflexT").not("[readonly]").each(function() {
$(this).timePicker({
step: 15,
startTime : minMax[$(this).attr("id").slice(1, -3)].kmin,
endTime : minMax[$(this).attr("id").slice(1, -3)].kmax,
columns : <%=S("timepickercolumns")%>,
onChange : function () {
$timeInput = $(this).parents("div.time-holder").prev("input.fldflexT")
$timeInput.removeClass("bad");
$timeInput.trigger("change");
}
});
});
}
else
{
// Native timepicker
$(".fldflexT").not("[readonly]").each(function() {
// Make this a native timepicker
$(this).attr("type", "time");
});
}
});
</script><%
}
if (hasfilter)
{
%>
<script>
$(function ()
{
$("#insFlex2 .fcltblockhead").append("<input id='autofilter' type='text' placeholder='"+L("lcl_autofilter")+"'>");
$("#autofilter")
.click(function(e) {e.stopPropagation()})
.keyup(function(e) {
if (e.which == 27) {
$("#autofilter").val("");
}
delayed(200, doFilter);
})
});
function delayed(delay, fn)
{
if (window.timerID)
clearTimeout(window.timerID);
window.timerID = setTimeout(fn, delay);
}
function doFilter(deze)
{
var deze = $("#autofilter");
var valThis = deze.val().toLowerCase();
$('#insFlex2List table.fcltblocktab>tbody>tr.trlabel').each(function() {
var text = $(this).find("td.flexsearch>label>span").text().toLowerCase();
$(this).toggle(text.indexOf(valThis) > -1);
});
}
</script>
<%
}
if (formobile && clabelCounter)
{ %>
<script>
$(function ()
{
for (var i = 0; i <= <%=clabelCounter%>; i++)
{
if ($("h3#collLabel"+i).next("div.ui-collapsible-content") &&
$("h3#collLabel"+i).next("div.ui-collapsible-content").children().length == 0)
{
// Change empty collapsable mobile labels back to regular labels
$("h3#collLabel"+i).unwrap()
.contents().unwrap();
}
}
});
</script>
<% }
if (multiMode)
{ %>
<script type="text/javascript">
$(function()
{ // Alleen een vinkboxje voor de flexkenmerken toevoegen.
$("[class^='fldflex'], [class^='fldSflex']").not(".fldtime").each(
function()
{
if ($(this).hasClass('flddate'))
var cb_name = "check_" + $(this).attr("id").substr("show_".length);
else if ($(this).hasClass('suggest'))
var cb_name = "check_" + $(this).attr("id").substr(0, $(this).attr("id").length-5);
else
var cb_name = "check_" + $(this).attr("name");
var cb = $("<input type='checkbox'>").attr("name", cb_name);
var td = $("<td class='multi_cb'></td>").append(cb);
$(this).closest("tr").find("td.label").before(td);
// Zetten vinkje als je waarde invult
if ($(this).hasClass('suggest'))
{ // Suggest veld: Functie putCheckmarkSuggest() aan sgonchange koppelen.
this.setAttribute("sgonchange", "putCheckmarkSuggest");
}
else
{ // Andere velden dan suggest veld.
$(this).change(function()
{
if ($(this).is(":checkbox"))
var isgevuld = $(this).is(":checked")
else
var isgevuld = $(this).val();
$("input[type=checkbox][name=" + cb_name + "]").prop("checked", isgevuld);
});
}
// Wissen waarde als je vinkje weghaalt
cb.change(function(deze) {
return function() {
if (!$(this).is(":checked"))
$(deze).val("");
else if ($(deze).hasClass("required"))
// Vinkje is aangevinkt en waarde is leeg.
// Als het veld verplicht is het vinkje er weer afhalen.
$(this).prop("checked", false);
}
}(this));
});
});
</script>
<% }
if (props.getTmpfolder)
return tmpfolder;
}
// Ondersteunende filehandlingfuncties ============================================================
// Hernoem folders onder basepath
// Flexsql levert twee velden op: oude key en nieuwe key
function RenameFlexFolders(basepath, flexsql)
{
var basepath = S("flexFilesPath") + "/" + basepath + "/";
var oRs = Oracle.Execute(flexsql);
while (!oRs.Eof)
{
var vAttachPath = basepath + oRs(0).value;
var vAttachPath2 = basepath + oRs(1).value;
MoveFlexfiles(vAttachPath, vAttachPath2);
oRs.MoveNext();
}
}
// Kopieer folders van oldbasepath naar newbasepath
// Flexsql levert twee velden op: oude key en nieuwe key
function CopyFlexFolders(oldbasepath, newbasepath, flexsql)
{
var fso = Server.CreateObject("Scripting.FileSystemObject")
var oldbasepath = S("flexFilesPath") + "\\" + oldbasepath + "\\";
var newbasepath = S("flexFilesPath") + "\\" + newbasepath + "\\";
var oRs = Oracle.Execute(flexsql);
while (!oRs.Eof)
{
vAttachPath = oldbasepath + oRs(0).value;
vAttachPath2 = newbasepath + oRs(1).value;
__Log("Kopie " + vAttachPath + " Naar " + vAttachPath2);
try
{
if (fso.FolderExists(vAttachPath))
{
__Log("xAbout to copy " + vAttachPath + "\\*.* to " + vAttachPath2 + "\\");
CreateFullPath(vAttachPath2);
fso.CopyFile(vAttachPath+"\\*.*", vAttachPath2, false); // Don't overwrite
}
}
catch(ee)
{
__SafeDoLog("Copying files from " + vAttachPath + "<br>to " + vAttachPath2 + " failed:<br>" + ee.description, "#FFFF00");
}
oRs.MoveNext();
}
fso = null;
}
// ================================================================================================
// Save de kenmerken die we met listKenmerk hebben aangemaakt
//
// kenmerkTable : "mld_kenmerkopdr"
// kenmerkParentKey : "mld_opdr_key"
// kenmerkWaarde : "mld_kenmerkopdr_waarde"
// kenmerkKey : "mld_kenmerk_key"
// currentKenmerkenSQL : Voor maken array met kenmerk_keys die voor dit object al in de database waren
// als tracking dan moet ook tweede parameter de oude waarde opleveren
// RequestQ : true voor QueryString, false voor Form
// moduleName : optional "ALG_ONRGOED_NIVEAU"
// moduleVal : optional "R"
// isNew : optional, true als het object nieuw is
// flexPath : die gebruiken we dan om tijdelijke folder te hernoemen bijv. "ALG/R"
// tracking : optional, dan tracken we als !isNew
// - allKenmerkenSQL is dan ook verplicht met strak-gedefinieerde kolommen
// - module is dan ook verplicht
//
// In listKenmerk hebben we al gezorgd dat er alleen waarden gesubmit worden van velden die we
// ook echt mochten wijzigen. kk en kv zullen er dan ook altijd beide zijn
// Nieuw is dat we af moeten blijven van confidential kenmerken, dat zijn kenmerken die
// vertrouwelijk zijn (systeem&4) gedefinieerd en voor deze user afgeschermd zijn (confidential)
// ================================================================================================
// Let op: de voorkeur is het gebruik van saveFlexKenmerken(parentKey, params)
// voor backward compatibilitiet mag je het nog uitschrijven.
// bez_edit_bezoekers_save, cnt_contract_save en mld_opdr_save gebruiken al de nieuwe methode
function saveFlexKenmerken(parentKey, kenmerkTable /* eigenlijk: Params */,
// deprecated: */
kenmerkParentKey,
kenmerkWaarde, kenmerkKey, currentKenmerkenSQL, RequestQ,
moduleName, moduleVal,
isNew, flexPath,
multiMode) // TODO: support multiMode!
{
if (typeof kenmerkTable == "object")
{
var kenmerkParams = kenmerkTable;
}
else // oldstyle
{
var kenmerkParams = { kenmerkTable: kenmerkTable,
kenmerkParentKey : kenmerkParentKey,
kenmerkWaarde: kenmerkWaarde,
kenmerkKey: kenmerkKey,
currentKenmerkenSQL: currentKenmerkenSQL,
requestQF: RequestQ?Request.QueryString:Request.Form,
moduleName: moduleName, moduleVal: moduleVal,
isNew: isNew, flexPath: flexPath,
multiMode: multiMode
}
}
var flexdata = kenmerkParams.flexdata;
if (!flexdata)
{
// Maak alsnog het flexdata object: backwards compatible!
var params = {};
if (kenmerkParams.extraserie) params.extraserie = kenmerkParams.extraserie;
if (kenmerkParams.nameprefix) params.nameprefix = kenmerkParams.nameprefix;
if (kenmerkParams.multiMode) params.multiMode = kenmerkParams.multiMode;
if (kenmerkParams.flexPath) params.flexPath = kenmerkParams.flexPath;
flexdata = flexkenmerken2jsondata(params);
}
return _saveFlexKenmerken(parentKey, kenmerkParams, flexdata);
}
function _saveFlexKenmerken(parentKey, params, flexdata) // TODO: support multiMode!
{
var kenmerk_keys = new Array(); // kenmerk table is used to check whether a kenmerk already exists or not.
if (params.currentKenmerkenSQL) // JGL: Is volgens mij altijd wel aanwezig
{
// FSN#18613/ PNBR#22893 Foute kenmerken opruimen
// Kunnen met name onstaan als iemand bijvoorbeeld de stdmelding wijzigt van een melding,
// srtactiviteit van een reservering etc.
// params.currentKenmerkenSQL bevat alle geldige kenmerkwaarden (ongeacht autorisatie)
if (!params.noFlexCleanup)
{
var sqldelete = "DELETE FROM " + params.kenmerkTable
+ " WHERE " + params.kenmerkParentKey + " = " + parentKey
+ " AND " + params.kenmerkKey + " NOT IN (SELECT " + params.kenmerkKey + " FROM (" + params.currentKenmerkenSQL + "))";
if (params.moduleName) // voorzichtig
sqldelete += " AND " + params.moduleName + " = " + safe.quoted_sql(params.moduleVal);
Oracle.Execute(sqldelete);
}
// Nu oude kenmerken verzamelen in kenmerk_keys
var oRs = Oracle.Execute(params.currentKenmerkenSQL);
while (!oRs.eof)
{
kenmerk_keys[oRs(params.kenmerkKey).value] = oRs(params.kenmerkWaarde).value; // kenmerkwaarde moet oldval bevatten
oRs.MoveNext();
}
oRs.Close();
}
if (params.isNew && !params.noAttachments) // uploads oude stijl
{
var ktmpfolder = getFParam("ktmpfolder" + (params.tmpfolderNum? params.tmpfolderNum : 0), "");
if (ktmpfolder)
{
var tmp_folder = "__NEW__" + user_key + "_" + safe.filename(ktmpfolder);
vAttachPath = S("flexFilesPath") + "/" + params.flexPath + tmp_folder;
var flexPathArray = params.flexPath.split("/"); // MLD/M => MLD (0) en M (1)
vAttachPath2 = S("flexFilesPath") + "/" + flexPathArray[0] + "/" + subfolderKey(bepaalNiveau(params.moduleName, flexPathArray[1]), parentKey);
// Niet van toepassing: we doen altijd een hele folder hieronder.
// MoveFlexfiles(vAttachPath, vAttachPath2)
var fso = Server.CreateObject("Scripting.FileSystemObject");
if (fso.FolderExists(vAttachPath))
{
__Log("Hernoem " + vAttachPath + " naar " + vAttachPath2);
CreateFullPath(vAttachPath2); // het 1000-tal was er misschien nog niet.
try
{
fso.MoveFolder(vAttachPath + "/*.*", vAttachPath2);
fso.DeleteFolder(vAttachPath);
}
catch (ee)
{
__DoLog("MoveFolder " + vAttachPath + " naar " + vAttachPath2 + " nog mislukt: " + ee.description);
}
}
fso = null;
}
}
// Uploads nieuwe stijl
if (params.isNew)
{
for (var i = 1; i < 100; i++)
{
if (getFParam("attachments[" + i + "][filename]", "")) // de originele filenaam, doen we niets mee
{
// elk nieuw bestand zit in een eigen flexfiles\MLD\M__NEW__81968_mG5Yj9duWAwuK16XYYbKwoS3RfJOYCL6\2961
var ktmpfolder = getFParam("attachments[" + i + "][token]", "");
if (ktmpfolder)
{
var tmp_folder = "__NEW__" + user_key + "_" + safe.filename(ktmpfolder);
var vAttachPathSource = S("flexFilesPath") + "/" + params.flexPath + tmp_folder;
var flexPathArray = params.flexPath.split("/"); // MLD/M => MLD (0) en M (1)
var vAttachPathTarget = S("flexFilesPath") + "/" + flexPathArray[0] + "/"
+ subfolderKey(bepaalNiveau(params.moduleName, flexPathArray[1]), parentKey);
var fso = Server.CreateObject("Scripting.FileSystemObject");
if (fso.FolderExists(vAttachPathSource))
{
if (!fso.FolderExists(vAttachPathTarget)) // nieuwe hoofdfolder is er nog niet
CreateFullPath(vAttachPathTarget); // het 1000-tal was er misschien ook nog niet.
// nu bestaat voor een melding 1021481 de folder flexfiles\MLD\M1021___\M1021481
// Misschien bestaat flexfiles\MLD\M1021___\M1021481\2803 ook al
try
{
var oFolder = fso.GetFolder(vAttachPathSource); // Doorloop de kenmerk keys (zal er *eentje* zijn)
var fc1 = new Enumerator(oFolder.SubFolders);
for (; !fc1.atEnd(); fc1.moveNext())
{
var folder = fc1.item(); // folder.Name is eigenlijk kenmerk_key
var fromFolder = vAttachPathSource + "/" + folder.Name;
var toFolder = vAttachPathTarget + "/" + folder.Name;
if (!fso.FolderExists(toFolder)) // kenmerkfolder is er nog niet
CreateFullPath(toFolder);
__Log("Verplaats inhoud " + fromFolder + "/*.* naar " + toFolder + "/");
fso.MoveFile (fromFolder + "/*.*", toFolder + "/");
}
fso.DeleteFolder(vAttachPathSource);
}
catch (ee)
{
__DoLog("MoveFlexfiles " + vAttachPathSource + " naar " + vAttachPathTarget + " mislukt: " + ee.description);
}
}
fso = null;
}
}
}
}
var trackarray = []; // eventuele tracking
var hasExpression = false;
for (kenmerkkey in flexdata)
{
var flex = flexdata[kenmerkkey];
var vold = kenmerk_keys[flex.id]? kenmerk_keys[flex.id] : "";
hasExpression = hasExpression || flex.expr == 1;
var vnew = flex.value || "";
// tracking?
if (!params.isNew && params.tracking)
{
if (vold != vnew)
{
// allKenmerkenSQL levert nu deze kolommen (deels future use):
// kenmerk_omschrijving
// kenmerk_kenmerktype
// kenmerk_systeem
// kenmerk_readonly
// kenmerk_uniek
// fac_kenmerkdomein_key
var oRsk = Oracle.Execute(params.allKenmerkenSQL + flex.id);
var label = oRsk("kenmerk_omschrijving").Value;
var kdomein_key = oRsk("fac_kenmerkdomein_key").Value;
var confidential= oRsk("kenmerk_systeem").value&4;
oRsk.Close();
if (confidential)
{
vold = vnew =L("lcl_confidential_mask");
}
else
{
if (flex.type == "S" || flex.type == "R")
{
if (vold != "")
{
var oRsd = Oracle.Execute("SELECT fac.getdomeinwaarde(" + kdomein_key + ", " + safe.quoted_sql(vold) + ") domeinwaarde FROM DUAL");
vold = oRsd("domeinwaarde").Value;
oRsd.Close();
}
if (vnew != "")
{
var oRsd = Oracle.Execute("SELECT fac.getdomeinwaarde(" + kdomein_key + ", " + safe.quoted_sql(vnew) + ") domeinwaarde FROM DUAL");
vnew = oRsd("domeinwaarde").Value;
oRsd.Close();
}
}
}
trackarray.push(label + ": " + buildTrackText("varchar", vold, vnew, {nodiff: (flex.type != "C"? true : null)}));
}
}
// Bepaal of het hier gaat om een flexkemerk verbruiksmeter. Dan moet historie behouden blijven
var verbruiksmeter = false;
if (params.kenmerkKey == "ins_kenmerk_key")
{ // Het gaat om een INS flexkenemerk.
// Controleren of het hier om een verbruiksmeter gaat.
var sql2 = "SELECT ins_kenmerk_meetwaarde"
+ " FROM ins_kenmerk"
+ " WHERE ins_kenmerk_key = " + flex.id;
oRs = Oracle.Execute(sql2);
verbruiksmeter = oRs("ins_kenmerk_meetwaarde").value == 1;
oRs.Close();
}
// A real kenmerk value exists
if (( flex.value == "" || flex.value == "undefined"))
{
if (kenmerk_keys[flex.id])
{
if (verbruiksmeter)
{ // Zet de sysdate zodat de historie behouden blijft
sql = "UPDATE ins_kenmerkdeel"
+ " SET ins_kenmerkdeel_verwijder = " + "SYSDATE"
+ " WHERE ins_deel_key = " + parentKey
+ " AND ins_kenmerk_key = " + flex.id
+ " AND ins_kenmerkdeel_verwijder IS NULL";
Oracle.Execute(sql);
}
else
{ // Delete;
// Zelf zetten we niet de verwijderdatum maar als een ander proces dat
// heeft gedaan (BONS#21991) dan blijven wij wel van die records af.
sql = "DELETE FROM " + params.kenmerkTable
+ " WHERE " + params.kenmerkParentKey + " = " + parentKey
+ " AND " + params.kenmerkKey + " = " + flex.id
+ " AND " + params.kenmerkTable + "_VERWIJDER IS NULL";
Oracle.Execute(sql);
}
}
continue;
}
if (flex.id in kenmerk_keys) // Kenmerk komt in de kenmerkTable voor. Desnoods met waarde null (wat eigenlijk niet zou mogen).
{ // update
// Alleen een update als de waarde veranderd is
if (vold != vnew)
{ // Alleen een update/insert als de waarde veranderd of toegevoegd is
if (verbruiksmeter)
{ // Bij de verbruiksmeters moet de historie behouden blijven
// Bij verbruiksmeter gaat het over ins kenmerken
sql = "UPDATE ins_kenmerkdeel"
+ " SET ins_kenmerkdeel_verwijder = " + "SYSDATE"
+ " WHERE ins_deel_key = " + parentKey
+ " AND ins_kenmerk_key = " + flex.id
+ " AND ins_kenmerkdeel_verwijder IS NULL";
Oracle.Execute(sql);
sql = "INSERT INTO ins_kenmerkdeel "
+ " (ins_kenmerkdeel_waarde, ins_deel_key, ins_kenmerk_key)"
+ " VALUES "
+ " (" + safe.quoted_sql(flex.value) + ", " + parentKey + ", " + flex.id + ")";
Oracle.Execute(sql);
}
else
{ // Gewone flexkenmerken
// Zelf zetten we niet de verwijderdatum maar als een ander proces dat
// heeft gedaan (BONS#21991) dan blijven wij wel van die records af.
sql = "UPDATE " + params.kenmerkTable + " SET " + params.kenmerkWaarde + " = " + safe.quoted_sql(flex.value)
+ " WHERE " + params.kenmerkParentKey + " = " + parentKey
+ " AND " + params.kenmerkKey + " = " + flex.id
+ " AND " + params.kenmerkTable + "_VERWIJDER IS NULL";
Oracle.Execute(sql);
}
}
}
else
{ // Insert
if (( flex.value != "" && flex.value != "undefined"))
{
sql = "INSERT INTO " + params.kenmerkTable
+ "(" + params.kenmerkParentKey
+ "," + params.kenmerkKey
+ "," + params.kenmerkWaarde
+ (params.moduleName? "," + params.moduleName : "")
+ ")"
+ " VALUES "
+ "(" + parentKey
+ "," + flex.id
+ "," + safe.quoted_sql(flex.value)
+ (params.moduleName? "," + safe.quoted_sql(params.moduleVal): "")
+ ")";
Oracle.Execute(sql);
}
}
}
if (hasExpression)
{
if (params.module == "MLD")
{
if (params.flexPath == "MLD/O")
module = "OPD"
else
module = "MLD"
}
else
module = params.module;
// Tabel fac_kenmwaarden vullen, expressies berekenen en tabel fac_kenmwaarden weer leeg maken.
// Vorige waarden verwijderen.
removekenmerkwaarden(module, parentKey);
savekenmerkwaarden(module, parentKey, params.moduleVal, flexdata);
evaluateflexexpressions(module, parentKey, true);
//removekenmerkwaarden(module, parentKey);
}
return trackarray;
}
function savekenmerkwaarden(module, refkey, kenmerkniveau, flexdata)
{
for (kenmerkkey in flexdata)
{
var sql = "INSERT INTO fac_kenmwaarden"
+ " (fac_kenmwaarden_module"
+ " , fac_kenmwaarden_refkey"
+ (kenmerkniveau
? " , fac_kenmwaarden_niveau"
: "")
+ " , fac_kenmwaarden_kenmerk_key"
+ " , fac_kenmwaarden_waarde"
+ " , fac_kenmwaarden_kenmerktype"
+ " , fac_kenmwaarden_isexpr"
+ " , prs_perslid_key"
+ " )"
+ " VALUES (" + safe.quoted_sql(module)
+ " , " + refkey
+ (kenmerkniveau
? " , " + safe.quoted_sql(kenmerkniveau)
: "")
+ " , " + flexdata[kenmerkkey].id
+ " , " + safe.quoted_sql(flexdata[kenmerkkey].value)
+ " , " + safe.quoted_sql(flexdata[kenmerkkey].type)
+ " , " + flexdata[kenmerkkey].expr
+ " , " + user_key
+ " )";
Oracle.Execute(sql);
}
}
function evaluateflexexpressions(module, refkey, savetodb)
{ // Berekening van de expressie kenmerken.
var sql = "BEGIN flx.evaluateflexexpressions(" + safe.quoted_sql(module) + ", " + refkey + ", " + user_key + ", " + (savetodb? 1 : 0) + "); END;";
var err = Oracle.Execute(sql, true);
if (err.friendlyMsg)
{
var message = "kenmerk_common.inc (evaluateflexexpressions): Error writing flex expression\n" + err.friendlyMsg;
__DoLog(message);
abort_with_warning(err.friendlyMsg);
}
}
function removekenmerkwaarden(module, refkey)
{
var sql = "DELETE FROM fac_kenmwaarden"
+ " WHERE fac_kenmwaarden_module = " + safe.quoted_sql(module)
+ " AND fac_kenmwaarden_refkey = " + refkey
+ " AND prs_perslid_key = " + user_key;
Oracle.Execute(sql);
}
function flexkenmerken2jsondata(params)
{
// Lees de Form parameters van flexkenmerken en zet ze in een json-object.
var jsondata = [];
var namePrefix = params.nameprefix || "k";
var counterName = (params.extraserie? namePrefix + "_all" : "k_all");
var multiMode = params.multiMode;
if (Request.Form(counterName).count > 0)
var kall = Request.Form(counterName)(1); // bij bezoekers komt counterName (k_all) meerdere keren voor maar wel altijd identiek
else
{ // JGL: komt normaal nooit voor, alleen als edit-scherm flexkenmerken niet goed heeft kunnen laden, bijv. AKZA#21569
// Normaal laten we zoiets gewoon gebeuren maar
// Error: File /facilitor5iwork/appl/shared/kenmerk_common.inc Line 1246 Index out of range. An array index is out of range.
// in de eventvwr(!) wil ik echt niet hebben
var kall = 0;
}
for (var kenmerk=1; kenmerk<=kall; kenmerk++)
{
var flex = namePrefix + kenmerk;
var kkn = Request.Form(flex + "key").Count;
var ktn = Request.Form(flex + "t").Count;
if (kkn && ktn)
{
var kk = getFParamInt(flex + "key"); // kenmerk key
var kt = getFParam(flex + "t", ""); // Type letter
var kv = getFParam(flex + "val", ""); // kenmerk waarde
var ke = Request.Form(flex + "e").Count; // Flexkenmerk is een expressie.
// Native datepicker
if (kt == "DN")
{
kt = "D";
// Change format from [YYYY-MM-DD] -> [DD-MM-YYYY] for Oracle
// It's format is already checked by checkKenmerk()
kv = kv.split("-").reverse().join("-");
}
// ATTENTIE: Als het een numeriek/decimaal veld is, kan het zijn dat er een komma in voorkomt die eigenlijk een punt moet zijn.
// Als het een numeriek/decimaal veld is, kan het ook een checkbox zijn
if (kt == "N")
{
kv = kv.replace(",", "."); // We slaan altijd op met punten
if (kv.substr(0, 2) == "0.") // leading zero er af. Doet de database trigger ook en nu
if (kv.length == 2 || kv.substr(3) == " ")
kv = "0";
else
kv = kv.substr(1); // krijgen we geen ongewenste tracking.
// Kijken of het een checkbox is
var isCheckbox = getFParamInt("has_" + flex + "val", 0) == 1;
if (isCheckbox)
{
var isChecked = Request.Form(flex + "val").Count;
kv = (isChecked ? "1" : ""); // Een niet aangevinkte checkbox hoeft niet opgeslagen te worden als de waarde "0".
}
}
// Suggest kenmerken moeten ook gedelete worden als ze leeg zijn. Dus voor delete actie leeg maken.
// Ook nodig voor correctere tracking
if ((kt == "S" || kt == "R") && kv == "-1") kv = ""; // anders zouden we '-1' opslaan
jsondata[kk] = { id: kk,
//name: "",
type: kt,
value: kv,
expr: (ke? 1 : 0),
kfieldid: flex
};
}
}
return jsondata;
}
%>