FSN#31698 Rapportgenerator savepoint
svn path=/Website/trunk/; revision=24322
This commit is contained in:
@@ -57,7 +57,7 @@ api2 = {
|
|||||||
IMPERS = getQParam("SWITCHUSER", "");
|
IMPERS = getQParam("SWITCHUSER", "");
|
||||||
if (!IMPERS && Request.ServerVariables("HTTP_X_FACILITOR_SWITCH_USER").Count)
|
if (!IMPERS && Request.ServerVariables("HTTP_X_FACILITOR_SWITCH_USER").Count)
|
||||||
IMPERS = String(Request.ServerVariables("HTTP_X_FACILITOR_SWITCH_USER")); // Meegegeven als X-FACILITOR-SWITCH-USER
|
IMPERS = String(Request.ServerVariables("HTTP_X_FACILITOR_SWITCH_USER")); // Meegegeven als X-FACILITOR-SWITCH-USER
|
||||||
if (IMPERS) // && S("fac_api_allow_impersonate")
|
if (IMPERS && S("fac_api_allow_impersonate"))
|
||||||
{
|
{
|
||||||
var sql = "SELECT prs_perslid_key, prs_perslid_naam"
|
var sql = "SELECT prs_perslid_key, prs_perslid_naam"
|
||||||
+ " FROM prs_perslid"
|
+ " FROM prs_perslid"
|
||||||
@@ -165,12 +165,12 @@ api2 = {
|
|||||||
if ("REST_DELETE" in model)
|
if ("REST_DELETE" in model)
|
||||||
result.methods.push("DELETE");
|
result.methods.push("DELETE");
|
||||||
|
|
||||||
for (var i in model.fields) // TODO: Misschien beter via een (beknopt) field-object?
|
for (var fld in model.fields)
|
||||||
{ // TODO: We missen hard-coded filters als reservableequipment/allowedinroom nu nog
|
{ // TODO: We missen hard-coded filters als reservableequipment/allowedinroom nu nog
|
||||||
if (model.fields[i].filter)
|
if (model.fields[fld].filter)
|
||||||
result.filters.push({ id: model.fields[i].name,
|
result.filters.push({ id: fld,
|
||||||
filter: model.fields[i].filter,
|
filter: model.fields[fld].filter,
|
||||||
type: model.fields[i].typ
|
type: model.fields[fld].typ
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -239,23 +239,12 @@ api2 = {
|
|||||||
labels: function _labels(model)
|
labels: function _labels(model)
|
||||||
{
|
{
|
||||||
var result = {};
|
var result = {};
|
||||||
for (var i in model.fields)
|
for (var fld in model.fields)
|
||||||
{
|
{
|
||||||
if (model.fields[i].label)
|
if (model.fields[fld].label)
|
||||||
result[model.fields[i].name] = model.fields[i].label;
|
result[fld] = model.fields[fld].label;
|
||||||
else if (typeof model.fields[i].track == 'string')
|
else if (typeof model.fields[fld].track == 'string')
|
||||||
result[model.fields[i].name] = model.fields[i].track;
|
result[fld] = model.fields[fld].track;
|
||||||
}
|
|
||||||
return result;
|
|
||||||
|
|
||||||
},
|
|
||||||
assoc: function _assoc(model, fld)
|
|
||||||
{
|
|
||||||
var result = {};
|
|
||||||
for (var i in model.fields)
|
|
||||||
{
|
|
||||||
if (fld in model.fields[i])
|
|
||||||
result[model.fields[i][fld]] = model.fields[i];
|
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
|
|
||||||
@@ -264,12 +253,24 @@ api2 = {
|
|||||||
We begonnen ooit met fields als een array van { name: "xxx", dbs: "yyyy", .... }
|
We begonnen ooit met fields als een array van { name: "xxx", dbs: "yyyy", .... }
|
||||||
Maar later bleek het handiger een hash van "xxx": { dbs: "yyyy", .... }
|
Maar later bleek het handiger een hash van "xxx": { dbs: "yyyy", .... }
|
||||||
Voor oude modellen herschrijven we versie 1 naar versie 2
|
Voor oude modellen herschrijven we versie 1 naar versie 2
|
||||||
|
|
||||||
|
TODO: Dit moet er nog uit!!
|
||||||
*/
|
*/
|
||||||
normalize: function _normalize(model)
|
normalize: function _normalize(model)
|
||||||
{
|
{
|
||||||
|
if (!model.fields.length)
|
||||||
|
return; // het is al een hash
|
||||||
|
var newfields = {};
|
||||||
|
for (var i in model.fields)
|
||||||
|
{
|
||||||
|
newfields[model.fields[i]["name"]] = model.fields[i];
|
||||||
|
//delete model.fields[i]["name"];
|
||||||
|
}
|
||||||
|
model.fields = newfields;
|
||||||
},
|
},
|
||||||
form2JSONdata: function _form2JSONdata(model, params, formfields) // Maak een jsondata-object voor gebruik vanuit model_xxx.inc
|
form2JSONdata: function _form2JSONdata(model, params, formfields) // Maak een jsondata-object voor gebruik vanuit model_xxx.inc
|
||||||
{
|
{
|
||||||
|
api2.normalize(model);
|
||||||
var jsondata = {};
|
var jsondata = {};
|
||||||
jsondata[model.record_name] = {id: params.filter.id};
|
jsondata[model.record_name] = {id: params.filter.id};
|
||||||
|
|
||||||
@@ -278,38 +279,41 @@ api2 = {
|
|||||||
{
|
{
|
||||||
// Voeg een nieuwe combinatie naam:waarde toe aan het jsondata object als er een frm of val bekend is.
|
// Voeg een nieuwe combinatie naam:waarde toe aan het jsondata object als er een frm of val bekend is.
|
||||||
var val;
|
var val;
|
||||||
var hasFrm = true;
|
|
||||||
if (formfields[i].frm)
|
if (formfields[i].frm)
|
||||||
{
|
{
|
||||||
// Haal waarde uit de formparameters.
|
// Haal waarde uit de formparameters.
|
||||||
if (Request.Form(formfields[i].frm).count > 0)
|
if (Request.Form(formfields[i].frm).count == 0)
|
||||||
val = Request.Form(formfields[i].frm)(1);
|
continue; // niet aanwezig
|
||||||
else
|
val = Request.Form(formfields[i].frm)(1);
|
||||||
hasFrm = false;
|
switch (model.fields[formfields[i].name].typ)
|
||||||
|
{
|
||||||
|
case "float":
|
||||||
|
val = getFParamFloat(formfields[i].frm, null);
|
||||||
|
break;
|
||||||
|
case "key":
|
||||||
|
case "check":
|
||||||
|
case "check0":
|
||||||
|
case "number":
|
||||||
|
val = getFParamInt(formfields[i].frm, null);
|
||||||
|
break;
|
||||||
|
case "date":
|
||||||
|
case "datetime":
|
||||||
|
val = getFParamDate(formfields[i].frm, null);
|
||||||
|
break;
|
||||||
|
case "varchar":
|
||||||
|
val = getFParam(formfields[i].frm, null);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
__DoLog(model.fields[formfields[i].name].typ);
|
||||||
|
INTERN_ERROR_UNKNOWN_TYPE;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
val = formfields[i].val;
|
val = formfields[i].val;
|
||||||
//
|
//
|
||||||
if (hasFrm)
|
jsondata[model.record_name][formfields[i].name] = val;
|
||||||
{
|
|
||||||
var modelIndex = api2.find_fieldindex_by_attr(model.fields, "name", formfields[i].name);
|
|
||||||
switch (model.fields[modelIndex].typ)
|
|
||||||
{
|
|
||||||
case "float":
|
|
||||||
if (val === "" || val === null)
|
|
||||||
var safe_val = "";
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (typeof val == "string")
|
|
||||||
val = val.replace(/,/g,".");
|
|
||||||
var safe_val = parseFloat(val);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
safe_val = val;
|
|
||||||
}
|
|
||||||
jsondata[model.record_name][formfields[i].name] = safe_val.toString();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return jsondata;
|
return jsondata;
|
||||||
},
|
},
|
||||||
@@ -320,6 +324,10 @@ api2 = {
|
|||||||
var wheres = [];
|
var wheres = [];
|
||||||
if (params.filter)
|
if (params.filter)
|
||||||
{
|
{
|
||||||
|
if (model.parent_key in params.filter)
|
||||||
|
wheres.push(model.table + "." + model.parent_key + " = " + parseInt(params.filter[model.parent_key], 10));
|
||||||
|
else if ("pid" in params.filter)
|
||||||
|
wheres.push(model.table + "." + model.parent_key + " = " + parseInt(params.filter["pid"], 10));
|
||||||
for (var fld in model.fields)
|
for (var fld in model.fields)
|
||||||
{
|
{
|
||||||
var field = model.fields[fld];
|
var field = model.fields[fld];
|
||||||
@@ -328,28 +336,29 @@ api2 = {
|
|||||||
continue;
|
continue;
|
||||||
|
|
||||||
// We kijken of dit model-veld in de filterparameters voorkomt. Voor ranges kunnen prefixes in gebruik zijn
|
// We kijken of dit model-veld in de filterparameters voorkomt. Voor ranges kunnen prefixes in gebruik zijn
|
||||||
if (field.name in params.filter || "start_"+field.name in params.filter || "end_"+field.name in params.filter)
|
if (fld in params.filter || "start_" + fld in params.filter || "end_" + fld in params.filter)
|
||||||
{
|
{
|
||||||
// filterval is de meegegeven filterwaarde voor dit veld
|
// filterval is de meegegeven filterwaarde voor dit veld
|
||||||
var filterval = params.filter[field.name];
|
var filterval = params.filter[fld];
|
||||||
|
if (filterval === "" || filterval === null)
|
||||||
|
continue;
|
||||||
|
if (filterval < 0 && field.typ == "key")
|
||||||
|
continue;
|
||||||
|
|
||||||
// Voor ranges komt de naam (misschien) niet letterlijk voor, maar (mogelijk) met start_ of end_ ervoor
|
// Voor ranges komt de naam (misschien) niet letterlijk voor, maar (mogelijk) met start_ of end_ ervoor
|
||||||
// meerdere filters voor 1 veld dus wellicht
|
// meerdere filters voor 1 veld dus wellicht
|
||||||
if (filter == "range") {
|
if (filter == "range") {
|
||||||
filterval1 = params.filter["start_"+field.name];
|
filterval1 = params.filter["start_" + fld];
|
||||||
filterval2 = params.filter["end_"+field.name];
|
filterval2 = params.filter["end_" + fld];
|
||||||
//__Log(">>filterval1>>"+filterval1);
|
|
||||||
//__Log(">>filterval2>>"+filterval2);
|
|
||||||
}
|
}
|
||||||
// Nu is ook voor ranges alles weer normaal
|
// Nu is ook voor ranges alles weer normaal
|
||||||
//__Log(">>field>>"+field.name);
|
|
||||||
//__Log(">>filter>>"+filter);
|
|
||||||
//__Log(">>filterval>>"+filterval);
|
|
||||||
var clause;
|
var clause;
|
||||||
var operand = " = ";
|
var operand = " = ";
|
||||||
switch (field.typ)
|
switch (field.typ)
|
||||||
{
|
{
|
||||||
case "key":
|
case "key":
|
||||||
|
if (!filterval)
|
||||||
|
continue;
|
||||||
if (filterval instanceof Array)
|
if (filterval instanceof Array)
|
||||||
{
|
{
|
||||||
safe_val = "(" + filterval.join(",") + ")";
|
safe_val = "(" + filterval.join(",") + ")";
|
||||||
@@ -358,7 +367,7 @@ api2 = {
|
|||||||
else if (String(filterval).indexOf(",") != -1) // let op: bij buildings/1234.json is id al numeriek gemaakt
|
else if (String(filterval).indexOf(",") != -1) // let op: bij buildings/1234.json is id al numeriek gemaakt
|
||||||
// NB: index=-1 als het geen array is.
|
// NB: index=-1 als het geen array is.
|
||||||
{
|
{
|
||||||
safe_val = "(" + getQParamIntArray(field.name).join(",") + ")"; // TODO: Niet via getQParamIntArray
|
safe_val = "(" + getQParamIntArray(fld).join(",") + ")"; // TODO: Niet via getQParamIntArray
|
||||||
operand = " IN ";
|
operand = " IN ";
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -498,14 +507,16 @@ api2 = {
|
|||||||
},
|
},
|
||||||
|
|
||||||
// Als er voor een veldnaam een alias moet worden gebruikt, doe het dan op deze manier.
|
// Als er voor een veldnaam een alias moet worden gebruikt, doe het dan op deze manier.
|
||||||
sqlfield_alias: function _sqlfield_alias(model, field)
|
sqlfield_alias: function _sqlfield_alias(model, fld)
|
||||||
{
|
{
|
||||||
return model.aliasprefix + (field.dbs == model.primary ? field.dbs : field.name);
|
var field = model.fields[fld];
|
||||||
|
return model.aliasprefix + (field.dbs == model.primary ? field.dbs : fld);
|
||||||
},
|
},
|
||||||
|
|
||||||
// Bepaal bij een GET welke velden op te halen
|
// Bepaal bij een GET welke velden op te halen
|
||||||
sqlfields: function _sqlfields(params, model)
|
sqlfields: function _sqlfields(params, model)
|
||||||
{
|
{
|
||||||
|
api2.normalize(model);
|
||||||
model.aliasprefix = model.aliasprefix || "";
|
model.aliasprefix = model.aliasprefix || "";
|
||||||
var selects = [];
|
var selects = [];
|
||||||
var tables = [ model.table ];
|
var tables = [ model.table ];
|
||||||
@@ -514,15 +525,14 @@ api2 = {
|
|||||||
var name_cnt = 0;
|
var name_cnt = 0;
|
||||||
for (var fld in model.fields)
|
for (var fld in model.fields)
|
||||||
{
|
{
|
||||||
var field = model.fields[fld];
|
if (fld.substring(0,1) == "_")
|
||||||
if (!field.name)
|
|
||||||
continue;
|
continue;
|
||||||
|
var field = model.fields[fld];
|
||||||
var dbs = field.dbs;
|
var dbs = field.dbs;
|
||||||
if (field.sql)
|
if (field.sql)
|
||||||
{
|
{
|
||||||
if (model.aliasprefix)
|
if (model.aliasprefix)
|
||||||
dbs = model.aliasprefix + field.name;
|
dbs = model.aliasprefix + fld;
|
||||||
selects.push(field.sql + " AS " + dbs);
|
selects.push(field.sql + " AS " + dbs);
|
||||||
}
|
}
|
||||||
else if (dbs)
|
else if (dbs)
|
||||||
@@ -532,7 +542,7 @@ api2 = {
|
|||||||
{
|
{
|
||||||
dbs = model.table + "." + dbs;
|
dbs = model.table + "." + dbs;
|
||||||
if (model.aliasprefix)
|
if (model.aliasprefix)
|
||||||
dbs += " AS " + api2.sqlfield_alias(model, field);
|
dbs += " AS " + api2.sqlfield_alias(model, fld);
|
||||||
}
|
}
|
||||||
selects.push(dbs);
|
selects.push(dbs);
|
||||||
}
|
}
|
||||||
@@ -622,7 +632,6 @@ api2 = {
|
|||||||
// TODO the_key *moet* bestaan. Andere filtervelden negeren we
|
// TODO the_key *moet* bestaan. Andere filtervelden negeren we
|
||||||
update_fields: function _update_fields(params, model, jsondata)
|
update_fields: function _update_fields(params, model, jsondata)
|
||||||
{
|
{
|
||||||
//__DoLogj(jsondata)
|
|
||||||
if (jsondata[model.record_name])
|
if (jsondata[model.record_name])
|
||||||
jsondata = jsondata[model.record_name]; // dereference
|
jsondata = jsondata[model.record_name]; // dereference
|
||||||
|
|
||||||
@@ -631,11 +640,11 @@ api2 = {
|
|||||||
{
|
{
|
||||||
var field = model.fields[fld];
|
var field = model.fields[fld];
|
||||||
// De key halen we uit de url, die in de JSON negeren we
|
// De key halen we uit de url, die in de JSON negeren we
|
||||||
if (field.name == "id")
|
if (fld == "id")
|
||||||
continue;
|
continue;
|
||||||
if ("sql" in field)
|
if ("sql" in field)
|
||||||
continue;
|
continue;
|
||||||
if (!(field.name in jsondata) && !field.fnval)
|
if (!(fld in jsondata) && !field.fnval)
|
||||||
continue;
|
continue;
|
||||||
if (field.readonly)
|
if (field.readonly)
|
||||||
continue;
|
continue;
|
||||||
@@ -643,7 +652,7 @@ api2 = {
|
|||||||
if (field.fnval)
|
if (field.fnval)
|
||||||
var newval = field.fnval(jsondata);
|
var newval = field.fnval(jsondata);
|
||||||
else // simpel
|
else // simpel
|
||||||
var newval = jsondata[field.name];
|
var newval = jsondata[fld];
|
||||||
|
|
||||||
switch (field.typ)
|
switch (field.typ)
|
||||||
{
|
{
|
||||||
@@ -651,25 +660,28 @@ api2 = {
|
|||||||
if (newval && typeof newval == "object" && "id" in newval)
|
if (newval && typeof newval == "object" && "id" in newval)
|
||||||
{ // dereference
|
{ // dereference
|
||||||
newval = newval.id;
|
newval = newval.id;
|
||||||
jsondata[field.name] = newval;
|
jsondata[fld] = newval;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case "date":
|
case "date":
|
||||||
case "datetime":
|
case "datetime":
|
||||||
|
if (newval === "")
|
||||||
|
newval = null;
|
||||||
// LET OP: Een (new Date) gemaakt binnen een plugin is vreemd genoeg geen (instanceof Date)
|
// LET OP: Een (new Date) gemaakt binnen een plugin is vreemd genoeg geen (instanceof Date)
|
||||||
// Waarschijnlijk gebruikt een wsc een ander Date object als (ASP)JScript?
|
// Waarschijnlijk gebruikt een wsc een ander Date object als (ASP)JScript?
|
||||||
if (newval !== null && typeof newval == "object" && !(newval instanceof Date))
|
if (newval !== null && typeof newval == "object" && !(newval instanceof Date))
|
||||||
newval = new Date(newval);
|
newval = new Date(newval);
|
||||||
|
__DoLog(newval)
|
||||||
|
__DoLogj(typeof newval)
|
||||||
if (newval !== null && !(newval instanceof Date))
|
if (newval !== null && !(newval instanceof Date))
|
||||||
{
|
{
|
||||||
abort_with_warning("Invalid " + field.typ + " (" + model.record_name + "." + field.name + "): " + newval);
|
abort_with_warning("Invalid " + field.typ + " (" + model.record_name + "." + fld + "): " + newval);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case "float":
|
case "float":
|
||||||
case "number":
|
case "number":
|
||||||
if (isNaN(newval))
|
if (isNaN(newval))
|
||||||
abort_with_warning("Invalid number (" + model.record_name + "." + field.name + "): " + newval);
|
abort_with_warning("Invalid number (" + model.record_name + "." + fld + "): " + newval);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (field.dbs.indexOf(".") >= 0) // complexe foreign key
|
if (field.dbs.indexOf(".") >= 0) // complexe foreign key
|
||||||
@@ -677,8 +689,9 @@ api2 = {
|
|||||||
//__Log("newval="+newval);
|
//__Log("newval="+newval);
|
||||||
var newfield = { dbs: field.dbs,
|
var newfield = { dbs: field.dbs,
|
||||||
typ: field.typ,
|
typ: field.typ,
|
||||||
track: field.track,
|
track: field.track && field.label?field.label:field.track,
|
||||||
val: newval
|
val: newval,
|
||||||
|
len: field.len
|
||||||
};
|
};
|
||||||
fields.push(newfield);
|
fields.push(newfield);
|
||||||
}
|
}
|
||||||
@@ -701,6 +714,7 @@ api2 = {
|
|||||||
if (inc.model) // andere includes zijn nog niet bij te werken
|
if (inc.model) // andere includes zijn nog niet bij te werken
|
||||||
{
|
{
|
||||||
// Als je bij een PUT/POST een include in de BODY zet geven we heb automagisch terug
|
// Als je bij een PUT/POST een include in de BODY zet geven we heb automagisch terug
|
||||||
|
params.include = params.include || [];
|
||||||
params.include.push(incname);
|
params.include.push(incname);
|
||||||
|
|
||||||
var incmodel = inc.model;
|
var incmodel = inc.model;
|
||||||
@@ -713,7 +727,6 @@ api2 = {
|
|||||||
var oRs = Oracle.Execute(sql);
|
var oRs = Oracle.Execute(sql);
|
||||||
while (!oRs.Eof)
|
while (!oRs.Eof)
|
||||||
{
|
{
|
||||||
//__DoLog("Found in DB " + incname + " " + oRs(incmodel.primary).Value);
|
|
||||||
existing_includes[oRs(incmodel.primary).Value] = { found: false }; // vooralsnog niet in json-data gevonden
|
existing_includes[oRs(incmodel.primary).Value] = { found: false }; // vooralsnog niet in json-data gevonden
|
||||||
oRs.MoveNext();
|
oRs.MoveNext();
|
||||||
}
|
}
|
||||||
@@ -751,13 +764,14 @@ api2 = {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
// Geeft de GET terug
|
// Geeft de GET terug
|
||||||
sql2jsonval: function(oRs, field, model)
|
sql2jsonval: function(oRs, fld, model)
|
||||||
{
|
{
|
||||||
|
var field = model.fields[fld];
|
||||||
if (field.val instanceof Function)
|
if (field.val instanceof Function)
|
||||||
var val = field.val(oRs, field, model);
|
var val = field.val(oRs, field, model);
|
||||||
else if (field.dbs.indexOf(".") < 0)
|
else if (field.dbs.indexOf(".") < 0)
|
||||||
{
|
{
|
||||||
var sqlfieldname = (model.aliasprefix ? api2.sqlfield_alias(model, field) : field.dbs);
|
var sqlfieldname = (model.aliasprefix ? api2.sqlfield_alias(model, fld) : field.dbs);
|
||||||
var val = oRs(sqlfieldname).Value;
|
var val = oRs(sqlfieldname).Value;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -787,21 +801,51 @@ api2 = {
|
|||||||
val = { id: val };
|
val = { id: val };
|
||||||
val.name = name;
|
val.name = name;
|
||||||
}
|
}
|
||||||
|
if (val !== null && (field.LOV))
|
||||||
|
{
|
||||||
|
var spl = api2.splitLOV(field.LOV);
|
||||||
|
val = { id: val, name: spl[val] };
|
||||||
|
}
|
||||||
return val;
|
return val;
|
||||||
},
|
},
|
||||||
|
splitLOV: function _splitLOV(LOV)
|
||||||
|
{
|
||||||
|
var splits = LOV.split(";");
|
||||||
|
if (splits % 2)
|
||||||
|
abort_with_warning("LOV '{0}' mismatch".format(LOV));
|
||||||
|
var result = {};
|
||||||
|
for (var i=0; i < splits.length / 2; i++)
|
||||||
|
result[splits[i*2]] = splits[i*2 + 1];
|
||||||
|
return result;
|
||||||
|
},
|
||||||
|
splitLOV2sql: function _splitLOV(LOV)
|
||||||
|
{
|
||||||
|
var spl = api2.splitLOV(LOV);
|
||||||
|
var dual = [];
|
||||||
|
for (var l in spl)
|
||||||
|
dual.push("SELECT " + safe.quoted_sql(l) + ", " + safe.quoted_sql(spl[l]) + " FROM DUAL");
|
||||||
|
return dual.join(" UNION ALL ");
|
||||||
|
},
|
||||||
|
splitLOV2select: function _splitLOV(LOV, current)
|
||||||
|
{
|
||||||
|
var spl = api2.splitLOV(LOV);
|
||||||
|
var options = [];
|
||||||
|
for (var l in spl)
|
||||||
|
options.push("<option value='" + safe.htmlattr(l) + "'>" + safe.html(spl[l]) + "</option>");
|
||||||
|
return "<select>" + options.join("") + "</select>";
|
||||||
|
},
|
||||||
sql2jsonfields: function (oRs, model)
|
sql2jsonfields: function (oRs, model)
|
||||||
{
|
{
|
||||||
var record = {};
|
var record = {};
|
||||||
for (var fld in model.fields)
|
for (var fld in model.fields)
|
||||||
{
|
{
|
||||||
var field = model.fields[fld];
|
if (fld.substring(0,1) == "_")
|
||||||
if (!field.name)
|
|
||||||
continue;
|
continue;
|
||||||
|
var field = model.fields[fld];
|
||||||
var val = api2.sql2jsonval(oRs, field, model);
|
var val = api2.sql2jsonval(oRs, fld, model);
|
||||||
if (field.readonly && !val.id)
|
if (field.readonly && !val.id)
|
||||||
continue;
|
continue;
|
||||||
record[field.name] = val;
|
record[fld] = val;
|
||||||
}
|
}
|
||||||
return record;
|
return record;
|
||||||
},
|
},
|
||||||
@@ -815,17 +859,21 @@ api2 = {
|
|||||||
|
|
||||||
var data = [];
|
var data = [];
|
||||||
var oRs = Oracle.Execute(sql);
|
var oRs = Oracle.Execute(sql);
|
||||||
var lastkey = -1;
|
var lastkey = 0;
|
||||||
|
var record = {};
|
||||||
// Merk op dat onze recordset meer regels kan bevatten dan je zou verwachten
|
// Merk op dat onze recordset meer regels kan bevatten dan je zou verwachten
|
||||||
// omdat de includes er bij zijn gejoind
|
// omdat de includes er bij zijn gejoind
|
||||||
while (!oRs.Eof)
|
while (!oRs.Eof)
|
||||||
{
|
{
|
||||||
var key = oRs(model.primary).Value;
|
if (model.primary)
|
||||||
if (key != lastkey)
|
|
||||||
{
|
{
|
||||||
if (lastkey > 0 && "id" in record) // Record was er mogelijk uit gefilterd
|
var key = oRs(model.primary).Value;
|
||||||
data.push(record);
|
if (key != lastkey)
|
||||||
var record = {};
|
{
|
||||||
|
if (lastkey && "id" in record) // Record was er mogelijk uit gefilterd
|
||||||
|
data.push(record);
|
||||||
|
var record = {};
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Complexe filtering die we niet voor elkaar kregen met een WHERE-clause
|
// Complexe filtering die we niet voor elkaar kregen met een WHERE-clause
|
||||||
@@ -842,13 +890,13 @@ api2 = {
|
|||||||
var fld;
|
var fld;
|
||||||
for (fld in model.fields)
|
for (fld in model.fields)
|
||||||
{
|
{
|
||||||
var field = model.fields[fld];
|
if (fld.substring(0,1) == "_")
|
||||||
if (!field.name)
|
|
||||||
continue;
|
continue;
|
||||||
var val = api2.sql2jsonval(oRs, field, model)
|
var field = model.fields[fld];
|
||||||
|
var val = api2.sql2jsonval(oRs, fld, model)
|
||||||
if (field.readonly && !val.id)
|
if (field.readonly && !val.id)
|
||||||
continue;
|
continue;
|
||||||
record[field.name] = val;
|
record[fld] = val;
|
||||||
}
|
}
|
||||||
if (params.include && model.includes)
|
if (params.include && model.includes)
|
||||||
{
|
{
|
||||||
@@ -899,9 +947,14 @@ api2 = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
lastkey = key;
|
lastkey = key;
|
||||||
|
if (!model.primary)
|
||||||
|
{
|
||||||
|
data.push(record);
|
||||||
|
record = {};
|
||||||
|
}
|
||||||
oRs.MoveNext();
|
oRs.MoveNext();
|
||||||
}
|
}
|
||||||
if (lastkey > 0)
|
if (lastkey)
|
||||||
data.push(record);
|
data.push(record);
|
||||||
return data;
|
return data;
|
||||||
},
|
},
|
||||||
@@ -955,7 +1008,7 @@ api2 = {
|
|||||||
break;
|
break;
|
||||||
case "xml":
|
case "xml":
|
||||||
Response.ContentType = "text/xml";
|
Response.ContentType = "text/xml";
|
||||||
var xml_antwoord = api2.json2xml(data, model.records_name, model.record_name, single);
|
var xml_antwoord = api2.json2xml(data, model, single);
|
||||||
// TODO: Output XSL transform ondersteunen?
|
// TODO: Output XSL transform ondersteunen?
|
||||||
if (getQParam("pretty","0")=="1")
|
if (getQParam("pretty","0")=="1")
|
||||||
{
|
{
|
||||||
@@ -996,8 +1049,10 @@ api2 = {
|
|||||||
|
|
||||||
// TODO: Wanneer attributes gebruiken en wanneer (sub)-elements?
|
// TODO: Wanneer attributes gebruiken en wanneer (sub)-elements?
|
||||||
// Streven: data == xml2json(json2xml(data))
|
// Streven: data == xml2json(json2xml(data))
|
||||||
json2xml: function _json2xml(data, rootname, record_name, single)
|
json2xml: function _json2xml(data, model, single)
|
||||||
{
|
{
|
||||||
|
var rootname = model.records_name;
|
||||||
|
var record_name = model.record_name;
|
||||||
var xmlDoc = new ActiveXObject("MSXML2.DOMDocument.6.0");
|
var xmlDoc = new ActiveXObject("MSXML2.DOMDocument.6.0");
|
||||||
xmlDoc.appendChild(xmlDoc.createProcessingInstruction("xml", "version=\"1.0\" encoding=\"utf-8\""));
|
xmlDoc.appendChild(xmlDoc.createProcessingInstruction("xml", "version=\"1.0\" encoding=\"utf-8\""));
|
||||||
|
|
||||||
@@ -1014,14 +1069,20 @@ api2 = {
|
|||||||
}
|
}
|
||||||
else if (record[fld] instanceof Array)
|
else if (record[fld] instanceof Array)
|
||||||
{
|
{
|
||||||
|
var inc_record_name;
|
||||||
|
for (var ii in model.includes)
|
||||||
|
{
|
||||||
|
if (model.includes[ii].model.records_name == fld)
|
||||||
|
inc_record_name = model.includes[ii].model.record_name;
|
||||||
|
}
|
||||||
for (var i = 0; i < record[fld].length; i++)
|
for (var i = 0; i < record[fld].length; i++)
|
||||||
elementField.appendChild(record2json(record[fld][i], "visitor")); // TODO Hardcoded
|
elementField.appendChild(record2json(record[fld][i], inc_record_name));
|
||||||
}
|
}
|
||||||
else if (record[fld] && typeof record[fld] == "object") // TODO: veronderstelt nog hardcoded dat dit foreign met name/key is
|
else if (record[fld] && typeof record[fld] == "object") // Veronderstelt dat dit foreign met name/key is
|
||||||
{ // misschien && "id" in record[fld]
|
{
|
||||||
if ("name" in record[fld] && "id" in record[fld])
|
if ("name" in record[fld] && "id" in record[fld])
|
||||||
{
|
{
|
||||||
elementField.setAttribute("name", record[fld].name);
|
elementField.setAttribute("name", fld);
|
||||||
elementField.setAttribute("id", record[fld].id);
|
elementField.setAttribute("id", record[fld].id);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -1184,17 +1245,6 @@ api2 = {
|
|||||||
}
|
}
|
||||||
return -1;
|
return -1;
|
||||||
},
|
},
|
||||||
find_fieldindex_by_attr: function(array, attr, value)
|
|
||||||
{
|
|
||||||
for(var i = 0; i < array.length; i++)
|
|
||||||
{
|
|
||||||
if(array[i].hasOwnProperty(attr) && array[i][attr] === value)
|
|
||||||
{
|
|
||||||
return i;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return -1;
|
|
||||||
},
|
|
||||||
field_delete: function(array, dbsname)
|
field_delete: function(array, dbsname)
|
||||||
{
|
{
|
||||||
var index = api2.find_fieldindex_by_dbsname(array, dbsname);
|
var index = api2.find_fieldindex_by_dbsname(array, dbsname);
|
||||||
@@ -1217,7 +1267,7 @@ api2 = {
|
|||||||
var newfield = {};
|
var newfield = {};
|
||||||
newfield.dbs = model[newindex].dbs;
|
newfield.dbs = model[newindex].dbs;
|
||||||
newfield.typ = model[newindex].typ;
|
newfield.typ = model[newindex].typ;
|
||||||
if (model[newindex].track) newfield.track = model[newindex].track;
|
if (model[newindex].track) newfield.track = model[newindex].track&&model[newindex].label?model[newindex].label:model[newindex].track;
|
||||||
newfield.val = newval;
|
newfield.val = newval;
|
||||||
__Logj(newfield);
|
__Logj(newfield);
|
||||||
array.push(newfield);
|
array.push(newfield);
|
||||||
|
|||||||
29
APPL/API2/api_reports.asp
Normal file
29
APPL/API2/api_reports.asp
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
<%@ language = "JavaScript" %>
|
||||||
|
<% /*
|
||||||
|
$Revision$
|
||||||
|
$Id$
|
||||||
|
|
||||||
|
File: api_reports.asp
|
||||||
|
|
||||||
|
Description: Reports API
|
||||||
|
Parameters:
|
||||||
|
Context:
|
||||||
|
|
||||||
|
Notes:
|
||||||
|
*/
|
||||||
|
DOCTYPE_Disable = true;
|
||||||
|
ANONYMOUS_Allowed = 1; // Eigenlijk niet waar. We regelen echter alles zelf
|
||||||
|
THIS_FILE = "appl/api/api_reportsx.asp";
|
||||||
|
|
||||||
|
|
||||||
|
%>
|
||||||
|
<!-- #include file="../Shared/common.inc" -->
|
||||||
|
<!-- #include file="./api2.inc" -->
|
||||||
|
<!-- #include file="../Shared/json2.js" -->
|
||||||
|
<!-- #include file="./model_reports.inc" -->
|
||||||
|
<%
|
||||||
|
var usrrap_key = getQParamInt("usrrap_key");
|
||||||
|
var model = model_reports(usrrap_key);
|
||||||
|
|
||||||
|
api2.process(model);
|
||||||
|
%>
|
||||||
@@ -36,17 +36,19 @@ model_appointments =
|
|||||||
primary: "bez_afspraak_key",
|
primary: "bez_afspraak_key",
|
||||||
records_name: "appointments",
|
records_name: "appointments",
|
||||||
record_name: "appointment",
|
record_name: "appointment",
|
||||||
fields: [{ name: "id", dbs: "bez_afspraak_key", typ: "key", filter: "exact" },
|
fields: {"id" : { dbs: "bez_afspraak_key", typ: "key", label: L("lcl_vis_appointment"), filter: "exact" },
|
||||||
{ name: "from", dbs: "bez_afspraak_datum", typ: "datetime", track: L("lcl_vis_start_date")},
|
"from" : { dbs: "bez_afspraak_datum", typ: "datetime", label: L("lcl_vis_start_date"), track: true},
|
||||||
{ name: "to", dbs: "bez_afspraak_eind", typ: "datetime", track: L("lcl_vis_end_date") },
|
"to" : { dbs: "bez_afspraak_eind", typ: "datetime", label: L("lcl_vis_end_date"), track: true },
|
||||||
{ name: "description", dbs: "bez_afspraak_opmerking", typ: "varchar"},
|
"description": { dbs: "bez_afspraak_opmerking", typ: "varchar", label: L("lcl_remark")},
|
||||||
{ name: "action", dbs: "bez_actie_key", typ: "key", foreign: "bez_actie"},
|
"action" : { dbs: "bez_actie_key", typ: "key", foreign: "bez_actie", label: L("lcl_action"), track: true},
|
||||||
{ name: "location", dbs: "alg_locatie_key", typ: "key", foreign: "alg_locatie"},
|
"location" : { dbs: "alg_locatie_key", typ: "key", foreign: "alg_locatie"},
|
||||||
{ name: "building", dbs: "alg_v_allonroerendgoed.alg_gebouw_key", typ: "key", foreign: "alg_gebouw" },
|
"building" : { dbs: "alg_v_allonroerendgoed.alg_gebouw_key", typ: "key", foreign: "alg_gebouw" },
|
||||||
{ name: "floor", dbs: "alg_v_allonroerendgoed.alg_verdieping_key", typ: "key", foreign: "alg_verdieping" },
|
"floor" : { dbs: "alg_v_allonroerendgoed.alg_verdieping_key", typ: "key", foreign: "alg_verdieping" },
|
||||||
{ name: "room", dbs: "alg_v_allonroerendgoed.alg_ruimte_key", typ: "key", foreign: "alg_ruimte" },
|
"room" : { dbs: "alg_v_allonroerendgoed.alg_ruimte_key", typ: "key", foreign: "alg_ruimte" },
|
||||||
{ dbs: "alg_onrgoed_keys", typ: "key", fnval: afs_alg_onrgoed_keys }
|
"_alg_keys" : { dbs: "alg_onrgoed_keys", typ: "key", fnval: afs_alg_onrgoed_keys },
|
||||||
],
|
"contact" : { dbs: "bez_afspraak_contact_key", typ: "key", foreign: "prs_perslid", label: L("lcl_vis_contactperson"), track: true}
|
||||||
|
},
|
||||||
|
list: { columns: ["id", "from", "to"] },
|
||||||
includes: {"visitors": { model: model_visitors,
|
includes: {"visitors": { model: model_visitors,
|
||||||
joinfield: "bez_afspraak_key"
|
joinfield: "bez_afspraak_key"
|
||||||
}
|
}
|
||||||
@@ -136,10 +138,6 @@ model_appointments =
|
|||||||
},
|
},
|
||||||
REST_POST: function (params, jsondata) /* new appointment */
|
REST_POST: function (params, jsondata) /* new appointment */
|
||||||
{
|
{
|
||||||
//__Logj(params);
|
|
||||||
//__Logj(jsondata);
|
|
||||||
//return { key: 3636089 };
|
|
||||||
//abort_with_warning("STOP");
|
|
||||||
params.isNew = true; // negeer eventuele bestaande keys
|
params.isNew = true; // negeer eventuele bestaande keys
|
||||||
|
|
||||||
var fields = api2.update_fields(params, model_appointments, jsondata); // Build updater
|
var fields = api2.update_fields(params, model_appointments, jsondata); // Build updater
|
||||||
|
|||||||
236
APPL/API2/model_generic.inc
Normal file
236
APPL/API2/model_generic.inc
Normal file
@@ -0,0 +1,236 @@
|
|||||||
|
<% /*
|
||||||
|
$Revision$
|
||||||
|
$Id$
|
||||||
|
|
||||||
|
File: model_generic.inc
|
||||||
|
|
||||||
|
Description: Generiek model voor willekeurige tabel
|
||||||
|
Parameters:
|
||||||
|
Context:
|
||||||
|
|
||||||
|
Notes:
|
||||||
|
*/
|
||||||
|
%>
|
||||||
|
<%
|
||||||
|
|
||||||
|
model_generic_template =
|
||||||
|
{
|
||||||
|
table: "<unkown>",
|
||||||
|
primary: "<unkown>",
|
||||||
|
records_name: "<unkown>s",
|
||||||
|
record_name: "<unkown>",
|
||||||
|
fields: {},
|
||||||
|
list: { columns: [] },
|
||||||
|
soft_delete: null,
|
||||||
|
|
||||||
|
_check_authorization: function(params, method)
|
||||||
|
{
|
||||||
|
params.message = "";
|
||||||
|
var autfunction = "WEB_PRSSYS";
|
||||||
|
params.authparams = user.checkAutorisation(autfunction);
|
||||||
|
},
|
||||||
|
|
||||||
|
_analyze_fields: function (fields, params, jsondata) /* analyseer inkomende data, common voor PUT en POST */
|
||||||
|
{
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
|
REST_GET: function _GET(params, jsondata)
|
||||||
|
{
|
||||||
|
model_generic_template._check_authorization(params, "GET");
|
||||||
|
var query = api2.sqlfields(params, model_generic_template);
|
||||||
|
|
||||||
|
var wheres = api2.sqlfilter(params, model_generic_template);
|
||||||
|
query.wheres = query.wheres.concat(wheres);
|
||||||
|
|
||||||
|
if (model_generic_template.soft_delete && params.filter.show_deleted != "on")
|
||||||
|
query.wheres.push(model_generic_template.soft_delete + " IS NULL");
|
||||||
|
|
||||||
|
var maxcnt = getQParamInt("showall", 0) == 1?S("qp_maxrows2"):S("qp_maxrows");
|
||||||
|
query.wheres.push("ROWNUM <= " + maxcnt + 1); // Eentje extra om overflow-melding te triggeren in resultsettable
|
||||||
|
|
||||||
|
var sql = "SELECT " + query.selects.join(", ")
|
||||||
|
+ " FROM " + query.tables.join(", ")
|
||||||
|
+ (query.wheres.length ? " WHERE " + query.wheres.join(" AND " ) : "")
|
||||||
|
+ " ORDER BY " + (model_generic_template.fields.name?model_generic_template.fields.name.dbs:model_generic_template.fields.id.dbs);
|
||||||
|
|
||||||
|
var json = api2.sql2json (params, sql, model_generic_template);
|
||||||
|
return json;
|
||||||
|
},
|
||||||
|
REST_PUT: function (params, jsondata, the_key) /* update room */
|
||||||
|
{
|
||||||
|
abort_with_warning("generic update not supported yet");
|
||||||
|
model_generic_template._check_authorization(params, "PUT");
|
||||||
|
if (!jsondata.room.id) jsondata.room.id = the_key;
|
||||||
|
|
||||||
|
var fields = api2.update_fields(params, model_generic_template, jsondata);
|
||||||
|
model_generic_template._analyze_fields(fields, params, jsondata);
|
||||||
|
|
||||||
|
var wheres = [model_generic_template.id.dbs + " = " + the_key];
|
||||||
|
var roomUpd = buildTrackingUpdate(model_generic_template.table, wheres.join(" AND " ), fields, { noValidateToken: true });
|
||||||
|
|
||||||
|
var err = Oracle.Execute(roomUpd.sql, true);
|
||||||
|
if (err.friendlyMsg)
|
||||||
|
abort_with_warning(err.friendlyMsg);
|
||||||
|
|
||||||
|
return { key: room_key, warning: "" };
|
||||||
|
},
|
||||||
|
REST_POST: function (params, jsondata) /* new room */
|
||||||
|
{
|
||||||
|
abort_with_warning("generic uinsert not supported yet");
|
||||||
|
model_generic_template._check_authorization(params, "POST");
|
||||||
|
|
||||||
|
var fields = api2.update_fields(params, model_generic_template, jsondata); // Build updater
|
||||||
|
model_generic_template._analyze_fields(fields, params, jsondata);
|
||||||
|
fields.push({dbs: "fac_usrrap_key", typ: "key", seq: "alg_s_alg_onroerendgoed_keys" });
|
||||||
|
var roomIns = buildInsert(model_generic_template.table, fields, { noValidateToken: true });
|
||||||
|
var room_key = roomIns.sequences["fac_usrrap_key"];
|
||||||
|
|
||||||
|
var err = Oracle.Execute(roomIns.sql, true);
|
||||||
|
if (err.friendlyMsg)
|
||||||
|
abort_with_warning(err.friendlyMsg);
|
||||||
|
|
||||||
|
return { key: room_key, warning: "" };
|
||||||
|
},
|
||||||
|
REST_DELETE: function (params, the_key) /* delete room */
|
||||||
|
{
|
||||||
|
abort_with_warning("generic delete not supported yet");
|
||||||
|
model_generic_template._check_authorization(params, "DELETE");
|
||||||
|
var room_key = params.filter.id;
|
||||||
|
var sql = "UPDATE fac_usrrap"
|
||||||
|
+ " SET fac_usrrap_verwijder = SYSDATE"
|
||||||
|
+ " WHERE fac_usrrap_key = " + room_key;
|
||||||
|
|
||||||
|
var err = Oracle.Execute(sql, true);
|
||||||
|
if (err.friendlyMsg)
|
||||||
|
abort_with_warning(err.friendlyMsg);
|
||||||
|
|
||||||
|
return { key: room_key, warning: "" };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function model_generic(table)
|
||||||
|
{
|
||||||
|
model_generic_template.table = table;
|
||||||
|
model_generic_template.record_name = table.substring(0,1) + table.substring(1).toLowerCase();
|
||||||
|
model_generic_template.records_name = model_generic_template.record_name + "s";
|
||||||
|
|
||||||
|
var sql = "SELECT cols.column_name, cols.position, cons.status, cons.owner"
|
||||||
|
+ " FROM all_constraints cons, all_cons_columns cols"
|
||||||
|
+ " WHERE cols.table_name = " + safe.quoted_sql(table)
|
||||||
|
+ " AND cons.constraint_type = 'P'"
|
||||||
|
+ " AND cons.constraint_name = cols.constraint_name"
|
||||||
|
+ " AND cons.owner = cols.owner"
|
||||||
|
+ " ORDER BY cols.table_name, cols.position";
|
||||||
|
var oRs = Oracle.Execute(sql);
|
||||||
|
if (oRs.Eof)
|
||||||
|
{
|
||||||
|
Session.Contents.Remove("scaffolding_table");
|
||||||
|
abort_with_warning("Unable to determine primary key for table {0}".format(table));
|
||||||
|
}
|
||||||
|
|
||||||
|
model_generic_template.primary = oRs("column_name").Value;
|
||||||
|
oRs.MoveNext();
|
||||||
|
if (!oRs.Eof)
|
||||||
|
{
|
||||||
|
Session.Contents.Remove("scaffolding_table");
|
||||||
|
abort_with_warning("Composite primary key not supported for table {0}".format(table));
|
||||||
|
}
|
||||||
|
oRs.Close();
|
||||||
|
|
||||||
|
var sql = "SELECT num_rows, last_analyzed"
|
||||||
|
+ " FROM all_tables"
|
||||||
|
+ " WHERE table_name = " + safe.quoted_sql(table);
|
||||||
|
var oRs = Oracle.Execute(sql);
|
||||||
|
model_generic_template.estimated_rows = oRs("num_rows").Value;
|
||||||
|
model_generic_template.last_analyzed = oRs("last_analyzed").Value;
|
||||||
|
oRs.Close;
|
||||||
|
|
||||||
|
var sql = "SELECT column_name"
|
||||||
|
+ " , data_type"
|
||||||
|
+ " , data_length"
|
||||||
|
+ " , data_precision"
|
||||||
|
+ " , data_scale"
|
||||||
|
+ " FROM user_tab_columns utc"
|
||||||
|
+ " WHERE utc.table_name = UPPER(" + safe.quoted_sql(table) + ")"
|
||||||
|
+ " ORDER BY column_id";
|
||||||
|
var oRs = Oracle.Execute(sql);
|
||||||
|
var hasName = false;
|
||||||
|
while (!oRs.eof)
|
||||||
|
{
|
||||||
|
var field = { dbs: oRs.Fields("column_name").Value,
|
||||||
|
label: oRs.Fields("column_name").Value,
|
||||||
|
typ: "varchar"
|
||||||
|
};
|
||||||
|
var ora_type = oRs("data_type").Value;
|
||||||
|
var ora_length = oRs("data_length").Value;
|
||||||
|
var ora_precision = oRs("data_precision").Value;
|
||||||
|
var ora_scale = oRs("data_scale").Value;
|
||||||
|
|
||||||
|
foreignKeyTable("dummy") // force generating __foreignKeyTable
|
||||||
|
|
||||||
|
switch (ora_type)
|
||||||
|
{
|
||||||
|
case 'NUMBER':
|
||||||
|
field.typ = 'integer';
|
||||||
|
if (ora_scale > 0)
|
||||||
|
{
|
||||||
|
field.datatype = 'float';
|
||||||
|
}
|
||||||
|
if (field.dbs.match(/_KEY$/))
|
||||||
|
{
|
||||||
|
field.typ = 'key';
|
||||||
|
if (field.dbs != model_generic_template.primary &&
|
||||||
|
field.dbs.replace(/_KEY$/,"") in __foreignKeyTable) // TODO ipv. de replace echt foreign-key constraint controleren
|
||||||
|
{
|
||||||
|
field.foreign = field.dbs.replace(/_KEY$/,"");
|
||||||
|
field.label = field.foreign + "(_KEY)"; // indicatie dat het foreign is
|
||||||
|
field.filter = "exact";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case "DATE":
|
||||||
|
field.typ = 'datetime';
|
||||||
|
break;
|
||||||
|
case "VARCHAR":
|
||||||
|
field.typ = 'varchar';
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
var fld = oRs.Fields("column_name").Value;
|
||||||
|
|
||||||
|
if (fld == table + "_VERWIJDER")
|
||||||
|
model_generic_template.soft_delete = table + "_VERWIJDER";
|
||||||
|
|
||||||
|
if (fld == model_generic_template.primary)
|
||||||
|
{
|
||||||
|
field.filter = "exact";
|
||||||
|
fld = "id";
|
||||||
|
}
|
||||||
|
if (fld.match(/_CODE$/))
|
||||||
|
{
|
||||||
|
field.filter = "like";
|
||||||
|
fld = "name";
|
||||||
|
hasName = true;
|
||||||
|
}
|
||||||
|
if (!hasName && fld.match(/(_OMSCHRIJVING|_REMARK)$/))
|
||||||
|
{
|
||||||
|
field.filter = "like";
|
||||||
|
fld = "name";
|
||||||
|
}
|
||||||
|
if (fld == model_generic_template.table + "_MODULE")
|
||||||
|
{
|
||||||
|
field.filter = "like";
|
||||||
|
}
|
||||||
|
model_generic_template.fields[fld] = field;
|
||||||
|
|
||||||
|
if (fld == "id" || fld == "name" || fld == "description" || field.filter)
|
||||||
|
model_generic_template.list.columns.push(fld);
|
||||||
|
|
||||||
|
oRs.MoveNext();
|
||||||
|
}
|
||||||
|
oRs.Close();
|
||||||
|
__Logj(model_generic_template);
|
||||||
|
return model_generic_template;
|
||||||
|
}
|
||||||
|
%>
|
||||||
82
APPL/API2/model_reportcolumns.inc
Normal file
82
APPL/API2/model_reportcolumns.inc
Normal file
@@ -0,0 +1,82 @@
|
|||||||
|
<% /*
|
||||||
|
$Revision$
|
||||||
|
$Id$
|
||||||
|
|
||||||
|
File: model_report_columns.inc
|
||||||
|
|
||||||
|
Description: rapport model voor de kolommen van rapporten.
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
Context:
|
||||||
|
|
||||||
|
Notes:
|
||||||
|
*/
|
||||||
|
|
||||||
|
// model_reportcolumns is uitsluitend beschikbaar onder model_reports(x) die de autorisatie dan ook doet
|
||||||
|
model_reportcolumns =
|
||||||
|
{
|
||||||
|
table: "fac_usrrap_cols",
|
||||||
|
primary: "fac_usrrap_cols_key",
|
||||||
|
records_name: "columns",
|
||||||
|
record_name: "column",
|
||||||
|
parent_key: "fac_usrrap_key",
|
||||||
|
|
||||||
|
fields: { "id" : { dbs: "fac_usrrap_cols_key", typ: "key", filter: "exact" },
|
||||||
|
"sequence" : { dbs: "fac_usrrap_cols_volgnr", typ: "number", label: L("lcl_rap_sequence") },
|
||||||
|
"columnname": { dbs: "fac_usrrap_cols_column_name", typ: "varchar", label: L("lcl_rap_column"), insertonly: true },
|
||||||
|
"caption" : { dbs: "fac_usrrap_cols_caption", typ: "varchar", label: L("lcl_rap_caption")},
|
||||||
|
"datatype" : { dbs: "fac_usrrap_cols_datatype", typ: "varchar", label: L("lcl_rap_datatype"),
|
||||||
|
LOV: "varchar;Tekst;date;Datum;float;Float;integer;Getal"},
|
||||||
|
"filter" : { dbs: "fac_usrrap_cols_filter", typ: "varchar", label: L("lcl_rap_filter")},
|
||||||
|
"total" : { dbs: "fac_usrrap_cols_total", typ: "varchar", label: L("lcl_rap_total")}
|
||||||
|
},
|
||||||
|
list: { columns: ["id", "sequence", "columnname", "caption", "datatype"] },
|
||||||
|
|
||||||
|
REST_GET: function _GET(params)
|
||||||
|
{
|
||||||
|
var query = api2.sqlfields(params, model_reportcolumns );
|
||||||
|
var wheres = api2.sqlfilter(params, model_reportcolumns);
|
||||||
|
query.wheres = query.wheres.concat(wheres);
|
||||||
|
|
||||||
|
var sql = "SELECT " + query.selects.join(", ")
|
||||||
|
+ " FROM " + query.tables.join(", ")
|
||||||
|
+ " WHERE " + query.wheres.join(" AND " )
|
||||||
|
+ " ORDER BY fac_usrrap_cols_volgnr";
|
||||||
|
|
||||||
|
var json = api2.sql2json (params, sql, model_reportcolumns );
|
||||||
|
|
||||||
|
return json;
|
||||||
|
},
|
||||||
|
REST_PUT: function (params, jsondata, the_key) /* update columns */
|
||||||
|
{
|
||||||
|
var fields = api2.update_fields(params, model_reportcolumns, jsondata); // Build updater
|
||||||
|
|
||||||
|
var sql = buildUpdate("fac_usrrap_cols", fields) + " fac_usrrap_cols_key = " + the_key;
|
||||||
|
var err = Oracle.Execute(sql, true);
|
||||||
|
if (err.friendlyMsg)
|
||||||
|
abort_with_warning(err.friendlyMsg);
|
||||||
|
|
||||||
|
return { key: the_key };
|
||||||
|
},
|
||||||
|
// Internally used by report_clone
|
||||||
|
REST_POST: function (params, jsondata, parent_key) /* insert columns */
|
||||||
|
{
|
||||||
|
if (!params.internal)
|
||||||
|
INTERNAL_ERROR_INTERNAL_ONLY;
|
||||||
|
var fields = api2.update_fields(params, model_reportcolumns, jsondata); // Build updater
|
||||||
|
|
||||||
|
fields.push({ dbs: "fac_usrrap_cols_key", typ: "key", seq: "fac_s_fac_usrrap_cols_key" });
|
||||||
|
fields.push({ dbs: "fac_usrrap_key", typ: "key", val: parent_key });
|
||||||
|
var roomIns = buildInsert("fac_usrrap_cols", fields, { noValidateToken: true });
|
||||||
|
var col_key = roomIns.sequences["fac_usrrap_col_key"];
|
||||||
|
|
||||||
|
var err = Oracle.Execute(roomIns.sql, true);
|
||||||
|
if (err.friendlyMsg)
|
||||||
|
abort_with_warning(err.friendlyMsg);
|
||||||
|
|
||||||
|
return { key: col_key, warning: "" };
|
||||||
|
}
|
||||||
|
// REST_DELETE: not supported
|
||||||
|
}
|
||||||
|
|
||||||
|
%>
|
||||||
148
APPL/API2/model_reports.inc
Normal file
148
APPL/API2/model_reports.inc
Normal file
@@ -0,0 +1,148 @@
|
|||||||
|
<% /*
|
||||||
|
$Revision$
|
||||||
|
$Id$
|
||||||
|
|
||||||
|
File: model_reports.inc
|
||||||
|
|
||||||
|
Description: rapport model voor *de data* van een specifiek rapport.
|
||||||
|
Zal rapporten uitvoeren dus. Het *bewerken* van rapporten gaat via model_reportsx
|
||||||
|
Parameters:
|
||||||
|
Context:
|
||||||
|
|
||||||
|
Notes:
|
||||||
|
*/
|
||||||
|
%>
|
||||||
|
<!-- #include file="../Shared/json2.js" -->
|
||||||
|
<!-- #include file="./model_reportsx.inc" -->
|
||||||
|
<!-- #include file="../fac/fac_usrrap.inc" -->
|
||||||
|
<%
|
||||||
|
|
||||||
|
model_reports_template =
|
||||||
|
{
|
||||||
|
table: "te bepalen",
|
||||||
|
primary: null,
|
||||||
|
records_name: "te bepalen",
|
||||||
|
record_name: "te bepalen",
|
||||||
|
fields: {/* te bepalen */},
|
||||||
|
|
||||||
|
_check_authorization: function(params, method)
|
||||||
|
{
|
||||||
|
params.message = "";
|
||||||
|
var autfunction = "WEB_PRSSYS";
|
||||||
|
params.authparams = user.checkAutorisation(autfunction);
|
||||||
|
},
|
||||||
|
|
||||||
|
REST_GET: function _GET(params, jsondata)
|
||||||
|
{
|
||||||
|
model_reports_template._check_authorization(params, "GET");
|
||||||
|
var groupbys = [];
|
||||||
|
if (params.columns && params.groupby)
|
||||||
|
{
|
||||||
|
if (params.columns.length != params.groupby.length)
|
||||||
|
INTERNAL_ERROR_GROUP_MISMATCH;
|
||||||
|
for (var fld in model_reports_template.fields)
|
||||||
|
{
|
||||||
|
if (!inArray(fld, params.columns))
|
||||||
|
delete model_reports_template.fields[fld];
|
||||||
|
}
|
||||||
|
for (var i=0; i < params.columns.length; i++)
|
||||||
|
{
|
||||||
|
var fld = params.columns[i];
|
||||||
|
var field = model_reports_template.fields[fld];
|
||||||
|
switch (params.groupby[i])
|
||||||
|
{
|
||||||
|
case "G":
|
||||||
|
groupbys.push(field.dbs);
|
||||||
|
break;
|
||||||
|
case "S":
|
||||||
|
field.sql = "SUM(" + field.dbs + ")";
|
||||||
|
field.label = "SUM(" + field.label + ")";
|
||||||
|
break;
|
||||||
|
case "C":
|
||||||
|
field.sql = "COUNT(" + field.dbs + ")";
|
||||||
|
field.label = "CNT(" + field.label + ")";
|
||||||
|
break;
|
||||||
|
case "A":
|
||||||
|
field.sql = "AVG(" + field.dbs + ")";
|
||||||
|
field.label = "AVG(" + field.label + ")";
|
||||||
|
break;
|
||||||
|
case "D":
|
||||||
|
field.sql = "TRUNC(" + field.dbs + ", 'DD')";
|
||||||
|
groupbys.push(field.sql);
|
||||||
|
field.label = "DAY(" + field.label + ")";
|
||||||
|
break;
|
||||||
|
case "W":
|
||||||
|
field.sql = "TO_CHAR(" + field.dbs + ", 'YYYY-IW')";
|
||||||
|
field.typ = "varchar";
|
||||||
|
groupbys.push(field.sql);
|
||||||
|
field.label = "WEEK(" + field.label + ")";
|
||||||
|
break;
|
||||||
|
case "M":
|
||||||
|
field.sql = "TO_CHAR(" + field.dbs + ", 'YYYY-MM')";
|
||||||
|
field.typ = "varchar";
|
||||||
|
groupbys.push(field.sql);
|
||||||
|
field.label = "MONTH(" + field.label + ")";
|
||||||
|
break;
|
||||||
|
case "Y":
|
||||||
|
field.sql = "TO_CHAR(" + field.dbs + ", 'YYYY')";
|
||||||
|
field.typ = "varchar";
|
||||||
|
groupbys.push(field.sql);
|
||||||
|
field.label = "YEAR(" + field.label + ")";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
var query = api2.sqlfields(params, model_reports_template);
|
||||||
|
|
||||||
|
var wheres = api2.sqlfilter(params, model_reports_template);
|
||||||
|
query.wheres = query.wheres.concat(wheres);
|
||||||
|
|
||||||
|
var maxcnt = getQParamInt("showall", 0) == 1?S("qp_maxrows2"):S("qp_maxrows");
|
||||||
|
query.wheres.push("ROWNUM <= " + maxcnt + 1); // Eentje extra om overflow-melding te triggeren in resultsettable
|
||||||
|
|
||||||
|
var sql = "SELECT " + query.selects.join(", ")
|
||||||
|
+ " FROM " + query.tables.join(", ")
|
||||||
|
+ (query.wheres.length ? " WHERE " + query.wheres.join(" AND " ) : "")
|
||||||
|
|
||||||
|
// TODO: 3D en FCLT_KEY filtering en zo
|
||||||
|
if (groupbys.length)
|
||||||
|
sql += " GROUP BY " + groupbys.join(", ");
|
||||||
|
|
||||||
|
var order = [];
|
||||||
|
for (var i=0; i < query.selects.length; i++)
|
||||||
|
order.push(i+1)
|
||||||
|
sql += " ORDER BY " + order.join(", ");
|
||||||
|
|
||||||
|
var json = api2.sql2json (params, sql, model_reports_template);
|
||||||
|
|
||||||
|
return json;
|
||||||
|
},
|
||||||
|
REST_PUT: false,
|
||||||
|
REST_POST: false,
|
||||||
|
REST_DELETE: false
|
||||||
|
}
|
||||||
|
|
||||||
|
function model_reports(fac_usrrap_key)
|
||||||
|
{
|
||||||
|
var usrrap = model_reportsx.REST_GET({filter: { "id" : fac_usrrap_key}, include: ["columns"] })[0];
|
||||||
|
|
||||||
|
model_reports_template.table = usrrap.viewname;
|
||||||
|
model_reports_template.record_name = usrrap.viewname.substring(0,1) + usrrap.viewname.substring(1).toLowerCase();
|
||||||
|
model_reports_template.records_name = model_reports_template.record_name + "s";
|
||||||
|
|
||||||
|
model_reports_template.list = { columns : [] };
|
||||||
|
for (var i = 0; i < usrrap.columns.length; i++)
|
||||||
|
{
|
||||||
|
var field = { dbs: usrrap.columns[i].columnname,
|
||||||
|
label: usrrap.columns[i].caption,
|
||||||
|
typ: usrrap.columns[i].datatype.id,
|
||||||
|
filter: usrrap.columns[i].filter == "A"?"like":null
|
||||||
|
}
|
||||||
|
var fld = "COL" + String(usrrap.columns[i].id)
|
||||||
|
model_reports_template.fields[fld] = field;
|
||||||
|
model_reports_template.list.columns.push(fld);
|
||||||
|
}
|
||||||
|
__Logj(model_reports_template);
|
||||||
|
return model_reports_template;
|
||||||
|
}
|
||||||
|
%>
|
||||||
@@ -4,8 +4,8 @@
|
|||||||
|
|
||||||
File: model_reportsx.inc
|
File: model_reportsx.inc
|
||||||
|
|
||||||
Description: rapport model voor het *bewerken* van rapporten.
|
Description: rapport model voor het *definieren* van rapporten.
|
||||||
Zal rapporten niet uitvoeren dus. Daar maken we ooit model_reports voor
|
Zal rapporten niet uitvoeren dus. Daar is model_reports voor
|
||||||
Parameters:
|
Parameters:
|
||||||
Context:
|
Context:
|
||||||
|
|
||||||
@@ -13,66 +13,22 @@
|
|||||||
*/
|
*/
|
||||||
%>
|
%>
|
||||||
<!-- #include file="../Shared/json2.js" -->
|
<!-- #include file="../Shared/json2.js" -->
|
||||||
|
<!-- #include file="./model_reportcolumns.inc" -->
|
||||||
<%
|
<%
|
||||||
|
|
||||||
// model_reportcolumns is uitsluitend beschikbaar onder model_reports die de autorisatie dan ook doet
|
|
||||||
model_reportcolumns =
|
|
||||||
{
|
|
||||||
table: "fac_usrrap_cols",
|
|
||||||
primary: "fac_usrrap_cols_key",
|
|
||||||
records_name: "columns",
|
|
||||||
record_name: "columns",
|
|
||||||
|
|
||||||
fields: [{ name: "id", dbs: "fac_usrrap_cols_key", typ: "key", filter: "exact" },
|
|
||||||
{ name: "sequence", dbs: "fac_usrrap_cols_volgnr", typ: "number", label: L("lcl_rap_sequence") },
|
|
||||||
{ name: "columnname", dbs: "fac_usrrap_cols_column_name", typ: "varchar", label: L("lcl_rap_column")},
|
|
||||||
{ name: "caption", dbs: "fac_usrrap_cols_caption", typ: "varchar", label: L("lcl_rap_caption")},
|
|
||||||
{ name: "datatype", dbs: "fac_usrrap_cols_datatype", typ: "varchar", label: L("lcl_rap_datatype")},
|
|
||||||
{ name: "filter", dbs: "fac_usrrap_cols_filter", typ: "varchar", label: L("lcl_rap_filter")},
|
|
||||||
{ name: "total", dbs: "fac_usrrap_cols_total", typ: "check0", label: L("lcl_rap_total")},
|
|
||||||
// niet teruglinken, { name: "report", dbs: "fac_usrrap_key", typ: "key", foreign: "fac_usrrap"}
|
|
||||||
],
|
|
||||||
|
|
||||||
REST_GET: function _GET(params)
|
|
||||||
{
|
|
||||||
var query = api2.sqlfields(params, model_reportcolumns );
|
|
||||||
var wheres = api2.sqlfilter(params, model_reportcolumns);
|
|
||||||
query.wheres = query.wheres.concat(wheres);
|
|
||||||
|
|
||||||
var sql = "SELECT " + query.selects.join(", ")
|
|
||||||
+ " FROM " + query.tables.join(", ")
|
|
||||||
+ " WHERE " + query.wheres.join(" AND " )
|
|
||||||
+ " ORDER BY fac_usrrap_cols_volgnr";
|
|
||||||
|
|
||||||
var json = api2.sql2json (params, sql, model_reportcolumns );
|
|
||||||
|
|
||||||
return json;
|
|
||||||
},
|
|
||||||
REST_PUT: function (params, jsondata, the_key) /* update columns */
|
|
||||||
{
|
|
||||||
var fields = api2.update_fields(params, model_reportcolumns, jsondata); // Build updater
|
|
||||||
|
|
||||||
var sql = buildUpdate("fac_usrrap_cols", fields) + " fac_usrrap_cols_key = " + the_key;
|
|
||||||
Oracle.Execute(sql);
|
|
||||||
|
|
||||||
// var beztrack = api2.process_includes(params, model_reportcolumns, the_key, jsondata);
|
|
||||||
return { key: the_key };
|
|
||||||
}
|
|
||||||
// REST_POST: not supported
|
|
||||||
// REST_DELETE: not supported
|
|
||||||
}
|
|
||||||
|
|
||||||
model_reportsx =
|
model_reportsx =
|
||||||
{
|
{
|
||||||
table: "fac_usrrap",
|
table: "fac_usrrap",
|
||||||
primary: "fac_usrrap_key",
|
primary: "fac_usrrap_key",
|
||||||
records_name: "reports",
|
records_name: "reports",
|
||||||
record_name: "report",
|
record_name: "report",
|
||||||
fields: [{ name: "id", dbs: "fac_usrrap_key", typ: "key", label: "Key", filter: "exact" },
|
fields: { "id" : { dbs: "fac_usrrap_key", typ: "key", label: "Key", filter: "exact" },
|
||||||
{ name: "name", dbs: "fac_usrrap_omschrijving", typ: "varchar", label: L("lcl_usrrap_report"), filter: "like"},
|
"name" : { dbs: "fac_usrrap_omschrijving", typ: "varchar", label: L("lcl_usrrap_report"), filter: "like", len : 60},
|
||||||
{ name: "description", dbs: "fac_usrrap_info", typ: "varchar", label: L("lcl_usrrap_info")},
|
"description" : { dbs: "fac_usrrap_info", typ: "varchar", label: L("lcl_usrrap_info")},
|
||||||
{ name: "viewname", dbs: "fac_usrrap_view_name", typ: "varchar", label: L("lcl_usrrap_viewname")},
|
"viewname" : { dbs: "fac_usrrap_view_name", typ: "varchar", label: L("lcl_usrrap_viewname"), filter: "like"},
|
||||||
],
|
"authorisation": { dbs: "fac_functie_key", typ: "key", label: L("lcl_usrrap_functie"), foreign: "fac_functie"}
|
||||||
|
},
|
||||||
|
list: { columns: ["id", "name", "viewname", "description"] },
|
||||||
includes: {"columns": { model: model_reportcolumns,
|
includes: {"columns": { model: model_reportcolumns,
|
||||||
joinfield: "fac_usrrap_key"
|
joinfield: "fac_usrrap_key"
|
||||||
}
|
}
|
||||||
@@ -89,8 +45,8 @@ return; // TODO?
|
|||||||
case "GET":
|
case "GET":
|
||||||
if (params.filter.id)
|
if (params.filter.id)
|
||||||
{
|
{
|
||||||
var room_key = params.filter.id;
|
var rap_key = params.filter.id;
|
||||||
var this_alg = alg.func_enabled(room_key, model_reportsx.defaults.onrgoedlvl);
|
var this_alg = alg.func_enabled(rap_key, model_reportsx.defaults.onrgoedlvl);
|
||||||
user.auth_required_or_abort(this_alg.readman || this_alg.readuse);
|
user.auth_required_or_abort(this_alg.readman || this_alg.readuse);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@@ -99,14 +55,14 @@ return; // TODO?
|
|||||||
var authParams = user.checkAutorisation(autfunction);
|
var authParams = user.checkAutorisation(autfunction);
|
||||||
// en verder met de autorisatie van PUT...
|
// en verder met de autorisatie van PUT...
|
||||||
case "PUT":
|
case "PUT":
|
||||||
var room_key = params.filter.id;
|
var rap_key = params.filter.id;
|
||||||
var this_alg = alg.func_enabled(room_key, model_reportsx.defaults.onrgoedlvl);
|
var this_alg = alg.func_enabled(rap_key, model_reportsx.defaults.onrgoedlvl);
|
||||||
user.auth_required_or_abort(this_alg.writeman || this_alg.writeuse);
|
user.auth_required_or_abort(this_alg.writeman || this_alg.writeuse);
|
||||||
params.isNew = false;
|
params.isNew = false;
|
||||||
break;
|
break;
|
||||||
case "POST":
|
case "POST":
|
||||||
var room_key = -1;
|
var rap_key = -1;
|
||||||
var this_alg = alg.func_enabled(room_key, model_reportsx.defaults.onrgoedlvl);
|
var this_alg = alg.func_enabled(rap_key, model_reportsx.defaults.onrgoedlvl);
|
||||||
user.auth_required_or_abort(this_alg.writeman);
|
user.auth_required_or_abort(this_alg.writeman);
|
||||||
params.isNew = true;
|
params.isNew = true;
|
||||||
break;
|
break;
|
||||||
@@ -127,17 +83,20 @@ return; // TODO?
|
|||||||
var wheres = api2.sqlfilter(params, model_reportsx);
|
var wheres = api2.sqlfilter(params, model_reportsx);
|
||||||
query.wheres = query.wheres.concat(wheres);
|
query.wheres = query.wheres.concat(wheres);
|
||||||
|
|
||||||
|
if (params.authparams.ALGreadlevel > -1)
|
||||||
|
{ // Er is een scope-beperking van kracht
|
||||||
|
query.wheres.push("r.fac_usrrap_key IN"
|
||||||
|
+ " (SELECT fac_usrrap_key FROM fac_v_my_rooms"
|
||||||
|
+ " WHERE prs_perslid_key = " + user_key
|
||||||
|
+ " AND niveau = " + params.authparams.ALGreadlevel + ")");
|
||||||
|
}
|
||||||
var sql = "SELECT " + query.selects.join(", ")
|
var sql = "SELECT " + query.selects.join(", ")
|
||||||
+ " FROM " + query.tables.join(", ")
|
+ " FROM " + query.tables.join(", ")
|
||||||
+ (query.wheres.length ? " WHERE " + query.wheres.join(" AND " ) : "")
|
+ (query.wheres.length ? " WHERE " + query.wheres.join(" AND " ) : "")
|
||||||
|
+ " ORDER BY fac_usrrap_key";
|
||||||
|
|
||||||
if (params.authparams.ALGreadlevel > -1)
|
if (params.include && params.include.length)
|
||||||
{ // Er is een scope-beperking van kracht
|
sql += ", fac_usrrap_cols_volgnr";
|
||||||
sql += " AND r.fac_usrrap_key IN"
|
|
||||||
+ " (SELECT fac_usrrap_key FROM fac_v_my_rooms"
|
|
||||||
+ " WHERE prs_perslid_key = " + user_key
|
|
||||||
+ " AND niveau = " + params.authparams.ALGreadlevel + ")";
|
|
||||||
}
|
|
||||||
|
|
||||||
var json = api2.sql2json (params, sql, model_reportsx);
|
var json = api2.sql2json (params, sql, model_reportsx);
|
||||||
|
|
||||||
@@ -147,19 +106,19 @@ return; // TODO?
|
|||||||
{
|
{
|
||||||
model_reportsx._check_authorization(params, "PUT");
|
model_reportsx._check_authorization(params, "PUT");
|
||||||
if (!jsondata.room.id) jsondata.room.id = the_key;
|
if (!jsondata.room.id) jsondata.room.id = the_key;
|
||||||
var room_key = the_key;
|
var rap_key = the_key;
|
||||||
|
|
||||||
var fields = api2.update_fields(params, model_reportsx, jsondata); // Build updater
|
var fields = api2.update_fields(params, model_reportsx, jsondata); // Build updater
|
||||||
model_reportsx._analyze_fields(fields, params, jsondata);
|
model_reportsx._analyze_fields(fields, params, jsondata);
|
||||||
|
|
||||||
var wheres = [" fac_usrrap_key = " + room_key];
|
var wheres = [" fac_usrrap_key = " + rap_key];
|
||||||
var roomUpd = buildTrackingUpdate("fac_usrrap", wheres.join(" AND " ), fields, { noValidateToken: true });
|
var roomUpd = buildTrackingUpdate("fac_usrrap", wheres.join(" AND " ), fields, { noValidateToken: true });
|
||||||
|
|
||||||
var err = Oracle.Execute(roomUpd.sql, true);
|
var err = Oracle.Execute(roomUpd.sql, true);
|
||||||
if (err.friendlyMsg)
|
if (err.friendlyMsg)
|
||||||
abort_with_warning(err.friendlyMsg);
|
abort_with_warning(err.friendlyMsg);
|
||||||
|
|
||||||
return { key: room_key, warning: "" };
|
return { key: rap_key, warning: "" };
|
||||||
},
|
},
|
||||||
REST_POST: function (params, jsondata) /* new room */
|
REST_POST: function (params, jsondata) /* new room */
|
||||||
{
|
{
|
||||||
@@ -167,29 +126,31 @@ return; // TODO?
|
|||||||
|
|
||||||
var fields = api2.update_fields(params, model_reportsx, jsondata); // Build updater
|
var fields = api2.update_fields(params, model_reportsx, jsondata); // Build updater
|
||||||
model_reportsx._analyze_fields(fields, params, jsondata);
|
model_reportsx._analyze_fields(fields, params, jsondata);
|
||||||
fields.push({dbs: "fac_usrrap_key", typ: "key", seq: "alg_s_alg_onroerendgoed_keys" });
|
fields.push({dbs: "fac_usrrap_key", typ: "key", seq: "fac_s_fac_usrrap_key" });
|
||||||
var roomIns = buildInsert("fac_usrrap", fields, { noValidateToken: true });
|
var roomIns = buildInsert("fac_usrrap", fields, { noValidateToken: true });
|
||||||
var room_key = roomIns.sequences["fac_usrrap_key"];
|
var rap_key = roomIns.sequences["fac_usrrap_key"];
|
||||||
|
|
||||||
var err = Oracle.Execute(roomIns.sql, true);
|
var err = Oracle.Execute(roomIns.sql, true);
|
||||||
if (err.friendlyMsg)
|
if (err.friendlyMsg)
|
||||||
abort_with_warning(err.friendlyMsg);
|
abort_with_warning(err.friendlyMsg);
|
||||||
|
|
||||||
return { key: room_key, warning: "" };
|
var beztrack = api2.process_includes(params, model_reportsx, jsondata, rap_key);
|
||||||
|
|
||||||
|
return { key: rap_key, warning: "" };
|
||||||
},
|
},
|
||||||
REST_DELETE: function (params, the_key) /* delete room */
|
REST_DELETE: function (params, the_key) /* delete room */
|
||||||
{
|
{
|
||||||
model_reportsx._check_authorization(params, "DELETE");
|
model_reportsx._check_authorization(params, "DELETE");
|
||||||
var room_key = params.filter.id;
|
var rap_key = params.filter.id;
|
||||||
var sql = "UPDATE fac_usrrap"
|
var sql = "UPDATE fac_usrrap"
|
||||||
+ " SET fac_usrrap_verwijder = SYSDATE"
|
+ " SET fac_usrrap_verwijder = SYSDATE"
|
||||||
+ " WHERE fac_usrrap_key = " + room_key;
|
+ " WHERE fac_usrrap_key = " + rap_key;
|
||||||
|
|
||||||
var err = Oracle.Execute(sql, true);
|
var err = Oracle.Execute(sql, true);
|
||||||
if (err.friendlyMsg)
|
if (err.friendlyMsg)
|
||||||
abort_with_warning(err.friendlyMsg);
|
abort_with_warning(err.friendlyMsg);
|
||||||
|
|
||||||
return { key: room_key, warning: "" };
|
return { key: rap_key, warning: "" };
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -29,19 +29,21 @@ model_reservationconsumables =
|
|||||||
primary: "res_rsv_artikel_key",
|
primary: "res_rsv_artikel_key",
|
||||||
records_name: "reservationconsumables",
|
records_name: "reservationconsumables",
|
||||||
record_name: "reservationconsumable",
|
record_name: "reservationconsumable",
|
||||||
fields: [ { name: "id", dbs: "res_rsv_artikel_key", typ: "key", filter: "exact" },
|
parent_key: "res_rsv_ruimte_key",
|
||||||
{ name: "consumable", dbs: "res_artikel_key", typ: "key", filter: "exact", foreign: "res_artikel" },
|
|
||||||
{ name: "amount", dbs: "res_rsv_artikel_aantal", typ: "number"},
|
fields: { "id" : { dbs: "res_rsv_artikel_key", typ: "key", filter: "exact" },
|
||||||
{ name: "status", dbs: "res_status_bo_key", typ: "number", filter: "exact", foreign: status_bo },
|
"consumable" : { dbs: "res_artikel_key", typ: "key", filter: "exact", foreign: "res_artikel" },
|
||||||
{ name: "reservation", dbs: "res_rsv_ruimte_key", typ: "key", filter: "exact", foreign: "res_rsv_ruimte" },
|
"amount" : { dbs: "res_rsv_artikel_aantal", typ: "number"},
|
||||||
{ name: "from", dbs: "res_rsv_artikel_levering", typ: "date", filter: "exact" },
|
"status" : { dbs: "res_status_bo_key", typ: "number", filter: "exact", foreign: status_bo },
|
||||||
//{ name: "to", dbs: "res_rsv_artikel_tot", typ: "date" },
|
"reservation": { dbs: "res_rsv_ruimte_key", typ: "key", filter: "exact", foreign: "res_rsv_ruimte" },
|
||||||
{ name: "price", dbs: "res_rsv_artikel_prijs", typ: "float" },
|
"from" : { dbs: "res_rsv_artikel_levering", typ: "date", filter: "exact" },
|
||||||
{ name: "processed", dbs: "res_rsv_artikel_verwerkt", typ: "datetime" },
|
//: "to" { dbs: "res_rsv_artikel_tot", typ: "date" },
|
||||||
{ name: "closed", dbs: "res_rsv_artikel_afgemeld", typ: "datetime" },
|
"price" : { dbs: "res_rsv_artikel_prijs", typ: "float" },
|
||||||
{ name: "changed", dbs: "res_rsv_artikel_mutatie", typ: "datetime" },
|
"processed" : { dbs: "res_rsv_artikel_verwerkt", typ: "datetime" },
|
||||||
{ name: "dirtlevel", dbs: "res_rsv_artikel_dirtlevel", typ: "number", filter: "exact" }
|
"closed" : { dbs: "res_rsv_artikel_afgemeld", typ: "datetime" },
|
||||||
],
|
"changed" : { dbs: "res_rsv_artikel_mutatie", typ: "datetime" },
|
||||||
|
"dirtlevel" : { dbs: "res_rsv_artikel_dirtlevel", typ: "number", filter: "exact" }
|
||||||
|
},
|
||||||
|
|
||||||
REST_GET: function _GET(params)
|
REST_GET: function _GET(params)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -33,19 +33,21 @@ model_reservationequipment =
|
|||||||
primary: "res_rsv_deel_key",
|
primary: "res_rsv_deel_key",
|
||||||
records_name: "reservationequipment",
|
records_name: "reservationequipment",
|
||||||
record_name: "reservationequipment",
|
record_name: "reservationequipment",
|
||||||
fields: [ { name: "id", dbs: "res_rsv_deel_key", typ: "key", filter: "exact" },
|
parent_key: "res_rsv_ruimte_key",
|
||||||
{ name: "equipment", dbs: "res_deel_key", typ: "key", filter: "exact", foreign: "res_deel" },
|
|
||||||
{ name: "status", dbs: "res_status_bo_key", typ: "key", filter: "exact", foreign: res.getbostatustext },
|
fields: {"id" : { dbs: "res_rsv_deel_key", typ: "key", filter: "exact" },
|
||||||
{ name: "from", dbs: "res_rsv_deel_van", typ: "datetime", filter: "exact" },
|
"equipment" : { dbs: "res_deel_key", typ: "key", filter: "exact", foreign: "res_deel" },
|
||||||
{ name: "to", dbs: "res_rsv_deel_tot", typ: "datetime" },
|
"status" : { dbs: "res_status_bo_key", typ: "key", filter: "exact", foreign: res.getbostatustext },
|
||||||
{ name: "price", dbs: "res_rsv_deel_prijs", typ: "float" },
|
"from" : { dbs: "res_rsv_deel_van", typ: "datetime", filter: "exact" },
|
||||||
{ name: "processed", dbs: "res_rsv_deel_verwerkt", typ: "datetime" },
|
"to" : { dbs: "res_rsv_deel_tot", typ: "datetime" },
|
||||||
{ name: "closed", dbs: "res_rsv_deel_afgemeld", typ: "datetime" },
|
"price" : { dbs: "res_rsv_deel_prijs", typ: "float" },
|
||||||
{ name: "changed", dbs: "res_rsv_deel_mutatie", typ: "datetime" },
|
"processed" : { dbs: "res_rsv_deel_verwerkt", typ: "datetime" },
|
||||||
{ name: "dirtlevel", dbs: "res_rsv_deel_dirtlevel", typ: "number", filter: "exact" }
|
"closed" : { dbs: "res_rsv_deel_afgemeld", typ: "datetime" },
|
||||||
|
"changed" : { dbs: "res_rsv_deel_mutatie", typ: "datetime" },
|
||||||
|
"dirtlevel" : { dbs: "res_rsv_deel_dirtlevel", typ: "number", filter: "exact" }
|
||||||
// altijd 1 { name: "number", dbs: "res_rsv_deel_aantal", typ: "number", filter: "exact" }
|
// altijd 1 { name: "number", dbs: "res_rsv_deel_aantal", typ: "number", filter: "exact" }
|
||||||
// niet terug linken { name: "reservation", dbs: "res_rsv_ruimte_key", typ: "key", filter: "exact", foreign: "res_rsv_ruimte" }
|
// niet terug linken { name: "reservation", dbs: "res_rsv_ruimte_key", typ: "key", filter: "exact", foreign: "res_rsv_ruimte" }
|
||||||
],
|
},
|
||||||
|
|
||||||
REST_GET: function _GET(params)
|
REST_GET: function _GET(params)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -46,25 +46,26 @@ model_reservations =
|
|||||||
records_name: "reservations",
|
records_name: "reservations",
|
||||||
record_name: "reservation",
|
record_name: "reservation",
|
||||||
|
|
||||||
fields: [{ name: "id", dbs: "res_rsv_ruimte_key", typ: "key", filter: "exact" },
|
fields: {"id" : { dbs: "res_rsv_ruimte_key", typ: "key", filter: "exact", label: L("lcl_reservation") },
|
||||||
{ name: "name", dbs: "res_reservering_id", sql: "res_reservering_key||'/'||res_rsv_ruimte_volgnr", typ: "varchar"},
|
"name" : { dbs: "res_reservering_id", sql: "res_reservering_key||'/'||res_rsv_ruimte_volgnr", typ: "varchar", label: L("lcl_reservation")},
|
||||||
{ name: "from", dbs: "res_rsv_ruimte_van", typ: "datetime", filter: "range", track: L("lcl_res_starttime")}, // TODO: Andere lcl voor catering
|
"from" : { dbs: "res_rsv_ruimte_van", typ: "datetime", filter: "range", label: L("lcl_res_starttime"), track: true}, // TODO: Andere lcl voor catering
|
||||||
{ name: "to", dbs: "res_rsv_ruimte_tot", typ: "datetime", filter: "range", track: L("lcl_res_endtime")},
|
"to" : { dbs: "res_rsv_ruimte_tot", typ: "datetime", filter: "range", label: L("lcl_res_endtime"), track: true},
|
||||||
{ name: "description", dbs: "res_rsv_ruimte_omschrijving", typ: "varchar", track: L("lcl_descr")},
|
"description" : { dbs: "res_rsv_ruimte_omschrijving", typ: "varchar", track: L("lcl_descr")},
|
||||||
{ name: "activity", dbs: "res_activiteit_key", typ: "key", filter: "exact", foreign: "res_activiteit", track: L("lcl_activity") },
|
"activity" : { dbs: "res_activiteit_key", typ: "key", filter: "exact", foreign: "res_activiteit", label: L("lcl_activity"), track: true },
|
||||||
{ name: "remark", dbs: "res_rsv_ruimte_opmerking", typ: "varchar", track: L("lcl_remark")},
|
"remark" : { dbs: "res_rsv_ruimte_opmerking", typ: "varchar", track: L("lcl_remark")},
|
||||||
{ name: "host", dbs: "res_rsv_ruimte_host_key", typ: "key", foreign: "prs_perslid", track: L("lcl_host")},
|
"host" : { dbs: "res_rsv_ruimte_host_key", typ: "key", foreign: "prs_perslid", label: L("lcl_host"), track: true},
|
||||||
{ name: "contact", dbs: "res_rsv_ruimte_contact_key", typ: "key", foreign: "prs_perslid", track: L("lcl_name")},
|
"contact" : { dbs: "res_rsv_ruimte_contact_key", typ: "key", foreign: "prs_perslid", label: L("lcl_name"), track: true},
|
||||||
{ name: "visitorscount", dbs: "res_rsv_ruimte_bezoekers", typ: "number", track: L("lcl_visitors") },
|
"visitorscount" : { dbs: "res_rsv_ruimte_bezoekers", typ: "number", label: L("lcl_visitors"), track: true },
|
||||||
{ name: "status", dbs: "res_status_fo_key", typ: "key", foreign: res.getfostatustext },
|
"status" : { dbs: "res_status_fo_key", typ: "key", foreign: res.getfostatustext },
|
||||||
{ name: "resroom", dbs: "res_ruimte_opstelling.res_ruimte_key", typ: "key", filter: "exact", foreign: "res_ruimte" },
|
"resroom" : { dbs: "res_ruimte_opstelling.res_ruimte_key", typ: "key", filter: "exact", label: L("lcl_room"), foreign: "res_ruimte" },
|
||||||
{ name: "configuration", dbs: "res_ruimte_opstelling.res_opstelling_key", typ: "key", foreign: "res_opstelling" },
|
"configuration" : { dbs: "res_ruimte_opstelling.res_opstelling_key", typ: "key", foreign: "res_opstelling" },
|
||||||
{ name: "warning", dbs: "res_rsv_ruimte_dirtlevel", typ: "number", foreign: fndirtwarn, readonly: true },
|
"warning" : { dbs: "res_rsv_ruimte_dirtlevel", typ: "number", foreign: fndirtwarn, readonly: true }
|
||||||
],
|
},
|
||||||
|
list: { columns: ["id", "name", "from", "to"] },
|
||||||
includes: {"reservationequipment": { model: model_reservationequipment,
|
includes: {"reservationequipment": { model: model_reservationequipment,
|
||||||
joinfield: "res_rsv_ruimte_key"
|
joinfield: "res_rsv_ruimte_key"
|
||||||
},
|
},
|
||||||
"reservationconsumables": { model: model_reservationconsumables,
|
"reservationconsumables": { model: model_reservationconsumables,
|
||||||
joinfield: "res_rsv_ruimte_key"
|
joinfield: "res_rsv_ruimte_key"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -23,22 +23,22 @@ model_rooms =
|
|||||||
primary: "alg_ruimte_key",
|
primary: "alg_ruimte_key",
|
||||||
records_name: "rooms",
|
records_name: "rooms",
|
||||||
record_name: "room",
|
record_name: "room",
|
||||||
fields: [{ name: "id", dbs: "alg_ruimte_key", typ: "key", filter: "exact" },
|
fields: {"id" : { dbs: "alg_ruimte_key", typ: "key", filter: "exact" },
|
||||||
{ name: "name", dbs: "alg_ruimte_nr", typ: "varchar", filter: "like", track: L("lcl_estate_ruimte_man_nr") },
|
"name" : { dbs: "alg_ruimte_nr", typ: "varchar", filter: "like", track: true, label: L("lcl_estate_ruimte_man_nr") },
|
||||||
{ name: "floor", dbs: "alg_verdieping_key", typ: "key", foreign: "alg_verdieping", filter: "exact" },
|
"floor" : { dbs: "alg_verdieping_key", typ: "key", foreign: "alg_verdieping", filter: "exact" },
|
||||||
{ name: "roomtype", dbs: "alg_srtruimte_key", typ: "key", foreign: "alg_srtruimte", track: L("lcl_estate_ruimte_man_sort") },
|
"roomtype" : { dbs: "alg_srtruimte_key", typ: "key", foreign: "alg_srtruimte", track: true, label: L("lcl_estate_ruimte_man_sort") },
|
||||||
{ name: "servicelevel", dbs: "mld_dienstniveau_key", typ: "key", foreign: "mld_dienstniveau", track: L("lcl_mld_dienst_niveau") },
|
"servicelevel": { dbs: "mld_dienstniveau_key", typ: "key", foreign: "mld_dienstniveau", track: true, label: L("lcl_mld_dienst_niveau") },
|
||||||
{ name: "description", dbs: "alg_ruimte_omschrijving", typ: "varchar", filter: "like", track: L("lcl_estate_ruimte_man_descr") },
|
"description" : { dbs: "alg_ruimte_omschrijving", typ: "varchar", filter: "like", track: true, label: L("lcl_estate_ruimte_man_descr") },
|
||||||
{ name: "grossarea", dbs: "alg_ruimte_bruto_vloeropp", typ: "float", track: L("lcl_estate_ruimte_bruto_vloeropp") },
|
"grossarea" : { dbs: "alg_ruimte_bruto_vloeropp", typ: "float", track: true, label: L("lcl_estate_ruimte_bruto_vloeropp") },
|
||||||
{ name: "area1", dbs: "alg_ruimte_opp_alt1", typ: "float", track: L("lcl_estate_ruimte_opp_alt1") },
|
"area1" : { dbs: "alg_ruimte_opp_alt1", typ: "float", track: true, label: L("lcl_estate_ruimte_opp_alt1") },
|
||||||
{ name: "area2", dbs: "alg_ruimte_opp_alt2", typ: "float", track: L("lcl_estate_ruimte_opp_alt2") },
|
"area2" : { dbs: "alg_ruimte_opp_alt2", typ: "float", track: true, label: L("lcl_estate_ruimte_opp_alt2") },
|
||||||
{ name: "perimeter", dbs: "alg_ruimte_omtrek", typ: "float", track: L("lcl_estate_ruimte_man_omtrek") },
|
"perimeter" : { dbs: "alg_ruimte_omtrek", typ: "float", track: true, label: L("lcl_estate_ruimte_man_omtrek") },
|
||||||
{ name: "volume", dbs: "alg_ruimte_inhoud", typ: "float", track: L("lcl_estate_ruimte_man_inhoud") },
|
"volume" : { dbs: "alg_ruimte_inhoud", typ: "float", track: true, label: L("lcl_estate_ruimte_man_inhoud") },
|
||||||
{ name: "remark", dbs: "alg_ruimte_opmerking", typ: "varchar", track: L("lcl_estate_ruimte_man_opmerk") },
|
"remark" : { dbs: "alg_ruimte_opmerking", typ: "varchar", track: true, label: L("lcl_estate_ruimte_man_opmerk") },
|
||||||
{ name: "openfrom", dbs: "alg_ruimte_beginuur", typ: "float", track: L("lcl_estate_gebouw_beginuur") },
|
"openfrom" : { dbs: "alg_ruimte_beginuur", typ: "float", track: true, label: L("lcl_estate_gebouw_beginuur") },
|
||||||
{ name: "opento", dbs: "alg_ruimte_einduur", typ: "float", track: L("lcl_estate_gebouw_einduur") },
|
"opento" : { dbs: "alg_ruimte_einduur", typ: "float", track: true, label: L("lcl_estate_gebouw_einduur") },
|
||||||
{ name: "workdays", dbs: "alg_ruimte_werkdagen", typ: "number" },
|
"workdays" : { dbs: "alg_ruimte_werkdagen", typ: "number" },
|
||||||
{ name: "deleted", dbs: "alg_ruimte_verwijder", typ: "datetime" },
|
"deleted" : { dbs: "alg_ruimte_verwijder", typ: "datetime" }
|
||||||
/* niet gebruikt:
|
/* niet gebruikt:
|
||||||
{ dbs: "_ALG_RUIMTE_VLOER_OMSCHRIJVING", typ: "varchar", frm: "room_flrom" },
|
{ dbs: "_ALG_RUIMTE_VLOER_OMSCHRIJVING", typ: "varchar", frm: "room_flrom" },
|
||||||
{ dbs: "_ALG_RUIMTE_OPP_GEVELGLAS", typ: "float", frm: "room_gegl" },
|
{ dbs: "_ALG_RUIMTE_OPP_GEVELGLAS", typ: "float", frm: "room_gegl" },
|
||||||
@@ -47,7 +47,7 @@ model_rooms =
|
|||||||
{ dbs: "_ALG_RUIMTE_ACADKEY", typ: "varchar", frm: "room_ackey" },
|
{ dbs: "_ALG_RUIMTE_ACADKEY", typ: "varchar", frm: "room_ackey" },
|
||||||
{ dbs: "_ALG_RUIMTE_GETEKEND", typ: "date", frm: "room_tek" },
|
{ dbs: "_ALG_RUIMTE_GETEKEND", typ: "date", frm: "room_tek" },
|
||||||
*/
|
*/
|
||||||
],
|
},
|
||||||
controls: [ {name: "scope", type: "varchar" },
|
controls: [ {name: "scope", type: "varchar" },
|
||||||
{name: "show_deleted", type: "boolean" }
|
{name: "show_deleted", type: "boolean" }
|
||||||
],
|
],
|
||||||
|
|||||||
@@ -21,14 +21,17 @@ model_visitors =
|
|||||||
primary: "bez_bezoekers_key",
|
primary: "bez_bezoekers_key",
|
||||||
records_name: "visitors",
|
records_name: "visitors",
|
||||||
record_name: "visitor",
|
record_name: "visitor",
|
||||||
fields: [{ name: "id", dbs: "bez_bezoekers_key", typ: "key", filter: "exact" },
|
parent_key: "bez_afspraak_key",
|
||||||
{ name: "name", dbs: "bez_afspraak_naam", typ: "varchar"},
|
|
||||||
{ name: "company", dbs: "bez_afspraak_bedrijf", typ: "varchar"},
|
fields: {"id" : { dbs: "bez_bezoekers_key", typ: "key", filter: "exact" },
|
||||||
{ name: "badge", dbs: "bez_bezoekers_pasnr", typ: "varchar"},
|
"name" : { dbs: "bez_afspraak_naam", typ: "varchar", label: L("lcl_vis_name")},
|
||||||
{ name: "in", dbs: "bez_bezoekers_done", typ: "datetime"},
|
"company": { dbs: "bez_afspraak_bedrijf", typ: "varchar", label: L("lcl_vis_company")},
|
||||||
{ name: "out", dbs: "bez_bezoekers_out", typ: "datetime"}
|
"badge" : { dbs: "bez_bezoekers_pasnr", typ: "varchar", label: L("lcl_vis_badgenr")},
|
||||||
|
"in" : { dbs: "bez_bezoekers_done", typ: "datetime", label: L("lcl_bez_done_date")},
|
||||||
|
"out" : { dbs: "bez_bezoekers_out", typ: "datetime", label: L("lcl_bez_out_date")}
|
||||||
// niet teruglinken, { name: "appointment", dbs: "bez_afspraak_key", typ: "key", foreign: "bez_afspraak"}
|
// niet teruglinken, { name: "appointment", dbs: "bez_afspraak_key", typ: "key", foreign: "bez_afspraak"}
|
||||||
],
|
},
|
||||||
|
list: { columns: ["name", "company", "in", "out"] },
|
||||||
|
|
||||||
REST_GET: function _GET(params)
|
REST_GET: function _GET(params)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ FCLTHeader.Requires({ plugins:["jQuery"] });
|
|||||||
var authparamsPRSSYS = user.checkAutorisation("WEB_PRSSYS", true);
|
var authparamsPRSSYS = user.checkAutorisation("WEB_PRSSYS", true);
|
||||||
user.auth_required_or_abort(authparamsPRSSYS.PRSwritelevel < 9 && authparamsPRSSYS.ALGwritelevel < 9);
|
user.auth_required_or_abort(authparamsPRSSYS.PRSwritelevel < 9 && authparamsPRSSYS.ALGwritelevel < 9);
|
||||||
|
|
||||||
var usrrap_key = getFParam("usrrap_key", "");
|
var usrrap_key = getFParamInt("usrrap_key", "");
|
||||||
var path = getFParam("path");
|
var path = getFParam("path");
|
||||||
|
|
||||||
// rooturl moet er af
|
// rooturl moet er af
|
||||||
|
|||||||
@@ -36,7 +36,7 @@ var rap_array = model_reportsx.REST_GET(rap_params);
|
|||||||
if (!rap_array.length)
|
if (!rap_array.length)
|
||||||
shared.record_not_found();
|
shared.record_not_found();
|
||||||
var rap_data = rap_array[0];
|
var rap_data = rap_array[0];
|
||||||
var mdl = api2.assoc(model_reportsx, "name"); // Handiger
|
var mdl = model_reportsx.fields; //api2.assoc(model_reportsx, "name"); // Handiger
|
||||||
%>
|
%>
|
||||||
|
|
||||||
<html>
|
<html>
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ var col_key = getQParamInt("col_key");
|
|||||||
|
|
||||||
var col_params = { filter: { id: col_key } };
|
var col_params = { filter: { id: col_key } };
|
||||||
var col_data = model_reportcolumns.REST_GET(col_params)[0];
|
var col_data = model_reportcolumns.REST_GET(col_params)[0];
|
||||||
var mdl = api2.assoc(model_reportcolumns, "name");
|
var mdl = model_reportcolumns.fields; // Handiger
|
||||||
|
|
||||||
%>
|
%>
|
||||||
|
|
||||||
|
|||||||
75
APPL/SCF/scaffolding.inc
Normal file
75
APPL/SCF/scaffolding.inc
Normal file
@@ -0,0 +1,75 @@
|
|||||||
|
<% /*
|
||||||
|
$Revision$
|
||||||
|
$Id$
|
||||||
|
|
||||||
|
File: scaffolding.inc
|
||||||
|
|
||||||
|
Description:
|
||||||
|
Parameters:
|
||||||
|
Context:
|
||||||
|
*/
|
||||||
|
|
||||||
|
var mode = getQParamSafe("mode", "empty");
|
||||||
|
if (mode == "save")
|
||||||
|
var JSON_Result = true;
|
||||||
|
%>
|
||||||
|
<!-- #include file="../Shared/common.inc" -->
|
||||||
|
<% if (mode != "save") { %>
|
||||||
|
<!-- #include file="../Shared/iface.inc" -->
|
||||||
|
<!-- #include file="../Shared/calendar.inc" -->
|
||||||
|
<!-- #include file="../Shared/selector.inc" -->
|
||||||
|
<!-- #include file="../Shared/persoonselector.inc" -->
|
||||||
|
<!-- #include file="../Shared/data_recordset.inc" -->
|
||||||
|
<!-- #include file="../Shared/resultset_table_v2.inc" -->
|
||||||
|
<% } %>
|
||||||
|
<!-- #include file="../Shared/json2.js" -->
|
||||||
|
<!-- #include file="../api2/api2.inc" -->
|
||||||
|
<!-- #include file="./scaffolding_search.inc" -->
|
||||||
|
<!-- #include file="./scaffolding_list.inc" -->
|
||||||
|
<!-- #include file="./scaffolding_wrap.inc" -->
|
||||||
|
<!-- #include file="./scaffolding_show.inc" -->
|
||||||
|
<!-- #include file="./scaffolding_edit.inc" -->
|
||||||
|
<!-- #include file="./scaffolding_save.inc" -->
|
||||||
|
<%
|
||||||
|
function scaffolding(model, scf_params)
|
||||||
|
{
|
||||||
|
scf_params = scf_params || {};
|
||||||
|
|
||||||
|
if (model && mode == 'empty')
|
||||||
|
mode = 'search';
|
||||||
|
|
||||||
|
var imodel = getQParam("model", ""); // include model
|
||||||
|
if (model.includes && imodel in model.includes)
|
||||||
|
{
|
||||||
|
model = model.includes[imodel].model;
|
||||||
|
scf_params.transit = { name: "model", val: imodel };
|
||||||
|
}
|
||||||
|
|
||||||
|
scf_params.this_fullpath = String(Request.ServerVariables("SCRIPT_NAME"));
|
||||||
|
scf_params.this_path = scf_params.this_fullpath.substring(rooturl.length + 1);
|
||||||
|
|
||||||
|
switch (mode)
|
||||||
|
{
|
||||||
|
case "empty":
|
||||||
|
break;
|
||||||
|
case "search":
|
||||||
|
scaffolding_search(model, scf_params);
|
||||||
|
break;
|
||||||
|
case "list":
|
||||||
|
scaffolding_list(model, scf_params);
|
||||||
|
break;
|
||||||
|
case "wrap":
|
||||||
|
scaffolding_wrap(model, scf_params);
|
||||||
|
break;
|
||||||
|
case "show":
|
||||||
|
scaffolding_show(model, scf_params);
|
||||||
|
break;
|
||||||
|
case "edit":
|
||||||
|
scaffolding_edit(model, scf_params);
|
||||||
|
break;
|
||||||
|
case "save":
|
||||||
|
scaffolding_save(model, scf_params);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
%>
|
||||||
135
APPL/SCF/scaffolding_edit.inc
Normal file
135
APPL/SCF/scaffolding_edit.inc
Normal file
@@ -0,0 +1,135 @@
|
|||||||
|
<% /*
|
||||||
|
$Revision$
|
||||||
|
$Id$
|
||||||
|
|
||||||
|
File: scaffolding_edit.asp
|
||||||
|
Description: show detailed information of a usrrapx
|
||||||
|
|
||||||
|
Parameters: usrxxx_key (usrrapx id)
|
||||||
|
|
||||||
|
Context:
|
||||||
|
Note:
|
||||||
|
|
||||||
|
*/ %>
|
||||||
|
<%
|
||||||
|
function scaffolding_edit(model, scf_params)
|
||||||
|
{
|
||||||
|
FCLTHeader.Requires({ plugins: ["jQuery"],
|
||||||
|
js: ["jquery-ui.js", "jquery.timepicker-table.js"],
|
||||||
|
css: ["timePicker-table.css"]})
|
||||||
|
|
||||||
|
// Autorisatie
|
||||||
|
var authparamsPRSSYS = user.checkAutorisation("WEB_PRSSYS");
|
||||||
|
|
||||||
|
var transit = "";
|
||||||
|
if ("transit" in scf_params)
|
||||||
|
transit = "&" + scf_params.transit.name + "=" + safe.url(scf_params.transit.val);
|
||||||
|
|
||||||
|
var key = getQParamInt("id", -1);
|
||||||
|
if (key > 0)
|
||||||
|
{
|
||||||
|
var xxx_params = { filter: { id: key } };
|
||||||
|
var xxx_array = model.REST_GET(xxx_params);
|
||||||
|
if (!xxx_array.length)
|
||||||
|
shared.record_not_found();
|
||||||
|
var xxx_data = xxx_array[0];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
xxx_data = {};
|
||||||
|
|
||||||
|
var modal = (model.parent_key != null); // dan doen we een detailrecord altijd modal
|
||||||
|
%>
|
||||||
|
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<% FCLTHeader.Generate(); %>
|
||||||
|
<script>
|
||||||
|
function scf_submit()
|
||||||
|
{
|
||||||
|
if (!validateForm("u2"))
|
||||||
|
return false;
|
||||||
|
$.post($("form[name=u2]")[0].getAttribute("action"), $("[name=u2]").serialize(), FcltCallbackClose, "json");
|
||||||
|
return true; // disable button
|
||||||
|
}
|
||||||
|
|
||||||
|
function scf_cancel()
|
||||||
|
{
|
||||||
|
FcltMgr.closeDetail(window, { cancel: true } );
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
</head>
|
||||||
|
<body id="editbody" <%=modal?"class='modal scaffolding'":""%>>
|
||||||
|
<%
|
||||||
|
var buttons = [ {title: L("lcl_submit"), action:"scf_submit()", icon: "opslaan.png", singlepress: true },
|
||||||
|
{title: L("lcl_cancel"), action:"scf_cancel()", icon: "undo.png" }];
|
||||||
|
if (!modal)
|
||||||
|
IFRAMER_HEADER(model.record_name, buttons);
|
||||||
|
%>
|
||||||
|
<div id="edit">
|
||||||
|
<form name="u2" method="post" action="<%=scf_params.this_fullpath%>?mode=save&id=<%=key%><%=transit%>" onsubmit="return false;">
|
||||||
|
<%
|
||||||
|
BLOCK_START("facInfo", xxx_data["name"] || model.record_name);
|
||||||
|
for (var fld in model.fields)
|
||||||
|
{
|
||||||
|
var field = model.fields[fld];
|
||||||
|
if ((fld == "id" || field.insertonly) && key > 0)
|
||||||
|
ROFIELDTR("fldtxt", field.label||fld, xxx_data[fld]);
|
||||||
|
else if (field.foreign)
|
||||||
|
{
|
||||||
|
var foreign = foreignKeyTable(field.foreign);
|
||||||
|
if (field.foreign.toUpperCase() == "PRS_PERSLID" || field.foreign.toUpperCase() == "ALG_RUIMTE" || !foreign)
|
||||||
|
{
|
||||||
|
ROFIELDTR("fldtxt", field.label, "TODO: suggest met " + field.foreign);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
var sql = "SELECT " + foreign.key
|
||||||
|
+ " , " + foreign.desc
|
||||||
|
+ " FROM " + foreign.tbl + " " + (foreign.alias||"")
|
||||||
|
+ " ORDER BY 2";
|
||||||
|
FCLTselector(fld, sql, { label: field.label||fld,
|
||||||
|
initKey: xxx_data[fld]?xxx_data[fld].id:null,
|
||||||
|
emptyOption: "" // TODO: Niet bij required?
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (field.LOV)
|
||||||
|
{
|
||||||
|
var sql = api2.splitLOV2sql(field.LOV);
|
||||||
|
FCLTselector(fld, sql, { label: field.label||fld,
|
||||||
|
initKey: xxx_data[fld]?xxx_data[fld].id:null,
|
||||||
|
emptyOption: "" // TODO: Niet bij required?
|
||||||
|
});
|
||||||
|
}
|
||||||
|
else if (field.typ == "check")
|
||||||
|
RWCHECKBOXTR(fld, "fldcheck", field.label||fld, xxx_data[fld]);
|
||||||
|
else if (field.typ == "date")
|
||||||
|
FCLTcalendar(fld, { label : field.label||fld,
|
||||||
|
datum : xxx_data[fld],
|
||||||
|
timeField: false,
|
||||||
|
volgnr : 1
|
||||||
|
});
|
||||||
|
else if (field.typ == "datetime")
|
||||||
|
FCLTcalendar(fld, { label : field.label||fld,
|
||||||
|
datum : xxx_data[fld],
|
||||||
|
timeField: true,
|
||||||
|
timeStep : S("res_h")*60,
|
||||||
|
startTime: S("res_t1"),
|
||||||
|
endTime : S("res_t2"),
|
||||||
|
volgnr : 1
|
||||||
|
});
|
||||||
|
else
|
||||||
|
RWFIELDTR(fld, "fldtxt", field.label||fld, xxx_data[fld]);
|
||||||
|
}
|
||||||
|
BLOCK_END();
|
||||||
|
if (modal)
|
||||||
|
CreateButtons(buttons);
|
||||||
|
IFACE.FORM_END();
|
||||||
|
%>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
<%
|
||||||
|
}
|
||||||
|
%>
|
||||||
103
APPL/SCF/scaffolding_list.inc
Normal file
103
APPL/SCF/scaffolding_list.inc
Normal file
@@ -0,0 +1,103 @@
|
|||||||
|
<% /*
|
||||||
|
$Revision$
|
||||||
|
$Id$
|
||||||
|
|
||||||
|
File: scaffolding_list.asp
|
||||||
|
|
||||||
|
Description: Toont een lijst
|
||||||
|
Parameters:
|
||||||
|
Context: Vanuit scaffolding.inc
|
||||||
|
Note: model variabele is globaal beschikbaar
|
||||||
|
*/
|
||||||
|
%>
|
||||||
|
<%
|
||||||
|
function scaffolding_list(model, scf_params)
|
||||||
|
{
|
||||||
|
scf_params.list = scf_params.list || {};
|
||||||
|
scf_params.list.columns = scf_params.list.columns || [];
|
||||||
|
|
||||||
|
var transit = "";
|
||||||
|
if ("transit" in scf_params)
|
||||||
|
transit = "&" + scf_params.transit.name + "=" + safe.url(scf_params.transit.val);
|
||||||
|
|
||||||
|
var cols = getQParamArray("columns", []);
|
||||||
|
if (cols.length && cols[0])
|
||||||
|
scf_params.list.columns = cols;
|
||||||
|
|
||||||
|
var grps = getQParamArray("groups", []);
|
||||||
|
if (grps.length && grps[0])
|
||||||
|
scf_params.list.groups = grps;
|
||||||
|
|
||||||
|
if (!scf_params.list.columns.length && "list" in model)
|
||||||
|
scf_params.list.columns = model.list.columns;
|
||||||
|
|
||||||
|
var modal = (model.parent_key != null); // dan doen we een detailrecord altijd modal
|
||||||
|
|
||||||
|
FCLTHeader.Requires({js: []});
|
||||||
|
|
||||||
|
var autfunction = "WEB_PRSSYS";
|
||||||
|
var authparams = user.checkAutorisation(autfunction);
|
||||||
|
var showall = getQParamInt("showall", 0) == 1;
|
||||||
|
|
||||||
|
%>
|
||||||
|
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<% FCLTHeader.Generate(); %>
|
||||||
|
<script>
|
||||||
|
function scf_show(row)
|
||||||
|
{
|
||||||
|
var key = row.getAttribute("ROWKEY");
|
||||||
|
<% if (modal) { %>
|
||||||
|
var url = "<%=scf_params.this_fullpath%>?mode=edit<%=transit%>&id=" + key;
|
||||||
|
FcltMgr.openModalDetail(url, "<%=safe.jsstring(model.record_name)%>", { callback: FcltMgr.reload });
|
||||||
|
<% } else { %>
|
||||||
|
$(row).addClass('dirty');
|
||||||
|
var url = "<%=scf_params.this_path%>?mode=wrap<%=transit%>&id=" + key;
|
||||||
|
FcltMgr.openDetail(url, "<%=safe.jsstring(model.record_name)%>");
|
||||||
|
<% } %>
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
</head>
|
||||||
|
<body id="listbody">
|
||||||
|
<%
|
||||||
|
buttons = [];
|
||||||
|
buttons.push({ icon: "page_refresh.png", title: L("lcl_refresh"), action: "FcltMgr.reload()" });
|
||||||
|
if (model["REST_POST"] && authparams.PRSwritelevel < 9 && authparams.ALGwritelevel < 9)
|
||||||
|
{
|
||||||
|
var addurl = scf_params.this_path + "?mode=edit" + transit;
|
||||||
|
buttons.push({ icon: "plus.png", title: L("lcl_add"), action: "FcltMgr.openDetail('" + addurl + "', '" + L("lcl_add") + " " + model.record_name + "')" });
|
||||||
|
}
|
||||||
|
|
||||||
|
var xxx_params = { filter : scf_params.filter || api2.qs2json(), columns: cols, groupby: grps };
|
||||||
|
var xxx_array = model.REST_GET(xxx_params);
|
||||||
|
var rst = new ResultsetTable({ dataset: xxx_array,
|
||||||
|
keyColumn: "id",
|
||||||
|
ID: model.table,
|
||||||
|
title: model.records_name,
|
||||||
|
showAll: showall,
|
||||||
|
buttons: buttons
|
||||||
|
});
|
||||||
|
|
||||||
|
for (i in scf_params.list.columns)
|
||||||
|
{
|
||||||
|
var fld = scf_params.list.columns[i];
|
||||||
|
if (!(fld in model.fields)) // Tijdens ontwikkeling vaak fout
|
||||||
|
{
|
||||||
|
__DoLogj(model.fields);
|
||||||
|
__DoLogj(scf_params.list.columns);
|
||||||
|
abort_with_warning("Field '{0}' not found in model '{1}'".format(fld, model.table));
|
||||||
|
}
|
||||||
|
var field = model.fields[fld];
|
||||||
|
rst.addColumn(new Column({ caption: field.label || fld, content: fld, datatype: field.typ }));
|
||||||
|
}
|
||||||
|
|
||||||
|
rst.addAction({ action: "scf_show", caption: L("lcl_edit"), isDefault: true } );
|
||||||
|
|
||||||
|
var cnt = rst.processResultset();
|
||||||
|
%>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
<%
|
||||||
|
}
|
||||||
|
%>
|
||||||
59
APPL/SCF/scaffolding_save.inc
Normal file
59
APPL/SCF/scaffolding_save.inc
Normal file
@@ -0,0 +1,59 @@
|
|||||||
|
<% /*
|
||||||
|
$Revision$
|
||||||
|
$Id$
|
||||||
|
|
||||||
|
File: scaffolding_save.asp
|
||||||
|
Description: save information from scaffolding_edit.asp
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
|
||||||
|
Context:
|
||||||
|
Note:
|
||||||
|
|
||||||
|
*/ %>
|
||||||
|
<%
|
||||||
|
function scaffolding_save(model, scf_params)
|
||||||
|
{
|
||||||
|
protectRequest.validateToken();
|
||||||
|
var key = getQParamInt( "id" );
|
||||||
|
var scf_action = getFParam( "scf_action", key>0?"U":"I" );
|
||||||
|
|
||||||
|
var formfields = [];
|
||||||
|
for (var fld in model.fields)
|
||||||
|
{
|
||||||
|
var field = model.fields[fld];
|
||||||
|
if (fld == "id")
|
||||||
|
continue;
|
||||||
|
if (field.insertonly & scf_action != "I")
|
||||||
|
continue;
|
||||||
|
formfields.push({ name: fld, frm: fld });
|
||||||
|
}
|
||||||
|
|
||||||
|
var params = { filter: { "id": key } };
|
||||||
|
var jsondata = api2.form2JSONdata(model, params, formfields);
|
||||||
|
//jsondata[model.record_name].properties = flexkenmerken2jsondata(params.properties);
|
||||||
|
|
||||||
|
switch (scf_action)
|
||||||
|
{
|
||||||
|
case "I":
|
||||||
|
var xxx_array = model.REST_POST(params, jsondata);
|
||||||
|
key = xxx_array.key;
|
||||||
|
break;
|
||||||
|
case "U":
|
||||||
|
var xxx_array = model.REST_PUT(params, jsondata, params.filter.id);
|
||||||
|
break;
|
||||||
|
case "D":
|
||||||
|
var xxx_array = model.REST_DELETE(params, params.filter.id);
|
||||||
|
break;
|
||||||
|
default :
|
||||||
|
var xxx_array = {warning: L("lcl_cnt_Del_Fails_Auth")};
|
||||||
|
}
|
||||||
|
var warning = xxx_array.warning;
|
||||||
|
|
||||||
|
var result = { key: key,
|
||||||
|
warning: warning,
|
||||||
|
keepForm: !!warning,
|
||||||
|
success: true };
|
||||||
|
Response.Write(JSON.stringify(result));
|
||||||
|
}
|
||||||
|
%>
|
||||||
151
APPL/SCF/scaffolding_search.inc
Normal file
151
APPL/SCF/scaffolding_search.inc
Normal file
@@ -0,0 +1,151 @@
|
|||||||
|
<% /*
|
||||||
|
$Revision$
|
||||||
|
$Id$
|
||||||
|
|
||||||
|
File: scaffolding_search.asp
|
||||||
|
|
||||||
|
Description: Toont db-upgrade tracking
|
||||||
|
Parameters: ??
|
||||||
|
Context:
|
||||||
|
Note:
|
||||||
|
|
||||||
|
*/ %>
|
||||||
|
<%
|
||||||
|
function scaffolding_search(model, scf_params)
|
||||||
|
{
|
||||||
|
scf_params.search = scf_params.search || {};
|
||||||
|
scf_params.list = scf_params.list || {};
|
||||||
|
scf_params.list.columns |= [];
|
||||||
|
if (!scf_params.list.columns.length && "list" in model)
|
||||||
|
scf_params.list.columns = model.list.columns;
|
||||||
|
|
||||||
|
FCLTHeader.Requires({plugins:["jQuery"], js: []});
|
||||||
|
|
||||||
|
var autfunction = "WEB_PRSSYS";
|
||||||
|
var authparams = user.checkAutorisation(autfunction);
|
||||||
|
%>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<% FCLTHeader.Generate() %>
|
||||||
|
<script>
|
||||||
|
function pick_columns(evt, deze)
|
||||||
|
{
|
||||||
|
$("#colpicker").show();
|
||||||
|
$("#colpicker").css("left", evt.clientX - $("#colpicker").width() - 50);
|
||||||
|
}
|
||||||
|
|
||||||
|
function doSubmit()
|
||||||
|
{
|
||||||
|
$("#colpicker").hide();
|
||||||
|
var cols = [];
|
||||||
|
var groups = [];
|
||||||
|
$("#colpicker tr").each(function()
|
||||||
|
{
|
||||||
|
if (!this.id)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if ($(this).find("input[type=checkbox]").prop("checked"))
|
||||||
|
{
|
||||||
|
cols.push(this.id);
|
||||||
|
groups.push($(this).find("select").val());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
$("#columns").val(cols.join(","));
|
||||||
|
$("#groups").val(groups.join(","));
|
||||||
|
document.forms.u2.submit();
|
||||||
|
}
|
||||||
|
<% if (scf_params.search.autosubmit) { %>
|
||||||
|
$(doSubmit); // Autosubmit
|
||||||
|
<% } %>
|
||||||
|
</script>
|
||||||
|
</head>
|
||||||
|
<body id="searchbody">
|
||||||
|
|
||||||
|
<div id="search">
|
||||||
|
<form name="u2" method="get" target="workFrame">
|
||||||
|
<input type='hidden' name='mode' value='list'>
|
||||||
|
<input type='hidden' name='columns' id='columns'>
|
||||||
|
<input type='hidden' name='groups' id='groups'>
|
||||||
|
<%
|
||||||
|
if (scf_params.transit) { %>
|
||||||
|
<input type='hidden' name='<%=scf_params.transit.name%>' value='<%=safe.htmlattr(scf_params.transit.val)%>'>
|
||||||
|
<% }
|
||||||
|
var est_title = "";
|
||||||
|
if ("estimated_rows" in model)
|
||||||
|
est_title = " <em style='font-size:10px'>estimated {0} rows as of {1}</em>".format(model.estimated_rows, toDateTimeString(model.last_analyzed));
|
||||||
|
|
||||||
|
BLOCK_START("searchtable", L("lcl_filterblok") + est_title);
|
||||||
|
|
||||||
|
for (var fld in model.fields)
|
||||||
|
{
|
||||||
|
var field = model.fields[fld];
|
||||||
|
if (field.filter == 'like' || field.filter == 'exact')
|
||||||
|
{
|
||||||
|
if (field.foreign)
|
||||||
|
{
|
||||||
|
var foreign = foreignKeyTable(field.foreign);
|
||||||
|
if (field.foreign == "PRS_PERSLID" || field.foreign == "ALG_RUIMTE" || !foreign)
|
||||||
|
{
|
||||||
|
ROFIELDTR("fldtxt", field.label, "TODO: Listbox of suggest met " + field.foreign);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
var sql = "SELECT " + foreign.key
|
||||||
|
+ " , " + foreign.desc
|
||||||
|
+ " FROM " + foreign.tbl + " " + (foreign.alias||"")
|
||||||
|
+ " ORDER BY 2";
|
||||||
|
FCLTselector(fld, sql, { label: field.label||fld,
|
||||||
|
emptyOption: ""
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
RWFIELDTR(fld, "fld", field.label||fld, "");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (model.soft_delete)
|
||||||
|
RWCHECKBOXTR("show_deleted", "fldcheck", L("lcl_show_deleted"), 0);
|
||||||
|
|
||||||
|
BLOCK_END();
|
||||||
|
var buttons = [];
|
||||||
|
buttons.push({title: L("lcl_columns"), action: "pick_columns(event, this)" });
|
||||||
|
buttons.push({title: L("lcl_search"), action: "doSubmit()" });
|
||||||
|
CreateButtons(buttons, { entersubmit: true });
|
||||||
|
%>
|
||||||
|
</form>
|
||||||
|
|
||||||
|
<div id="colpicker" style='padding:10px;border:2px solid black;position:absolute;top:5px;left:500px;background-color:#f0f0f0;display:none'>
|
||||||
|
<table>
|
||||||
|
<tr><th>Show</th><th>Totals</th></tr>
|
||||||
|
<%
|
||||||
|
var grp = api2.splitLOV2select("G;Group by;S;Sum;C;Count;A;Avg");
|
||||||
|
var grpdate = api2.splitLOV2select("G;Group by;D;Group by date;W;Group by week;M;Group by month;Y;Group by year");
|
||||||
|
for (fld in model.fields)
|
||||||
|
{
|
||||||
|
var on = inArray(fld, scf_params.list.columns);
|
||||||
|
Response.Write("<tr id='" + fld + "'><td><label><input type='checkbox' " + (on?"checked='1'":"") + ">" + safe.html(model.fields[fld].label) + "</label></td>")
|
||||||
|
if (model.fields[fld].typ == "date")
|
||||||
|
Response.Write("<td>" + grpdate + "</td>")
|
||||||
|
else
|
||||||
|
Response.Write("<td>" + grp + "</td>")
|
||||||
|
Response.Write("</tr>")
|
||||||
|
}
|
||||||
|
%>
|
||||||
|
</table>
|
||||||
|
<input type='button' class='button' value='<%=L("lcl_search")%>' onclick='doSubmit()'>
|
||||||
|
<input type='button' class='button' value='<%=L("lcl_cancel")%>' onclick='$("#colpicker").hide()'>
|
||||||
|
</div>
|
||||||
|
</div> <!-- search -->
|
||||||
|
|
||||||
|
<div id="result">
|
||||||
|
<iframe width="100%" height="100%" src="../Shared/empty.asp"
|
||||||
|
name="workFrame" id="workFrame" onload='FcltMgr.iframeLoaded(this)'
|
||||||
|
frameborder="0" scrolling="no"></iframe>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
<%
|
||||||
|
}
|
||||||
|
%>
|
||||||
139
APPL/SCF/scaffolding_show.inc
Normal file
139
APPL/SCF/scaffolding_show.inc
Normal file
@@ -0,0 +1,139 @@
|
|||||||
|
<% /*
|
||||||
|
$Revision$
|
||||||
|
$Id$
|
||||||
|
|
||||||
|
File: scaffolding_show.asp
|
||||||
|
Description: show detailed information of a usrrapx
|
||||||
|
|
||||||
|
Parameters: usrrap_key (usrrapx id)
|
||||||
|
|
||||||
|
Context:
|
||||||
|
Note:
|
||||||
|
|
||||||
|
*/ %>
|
||||||
|
<%
|
||||||
|
function scaffolding_show(model, scf_params)
|
||||||
|
{
|
||||||
|
scf_params.show = scf_params.show || {};
|
||||||
|
|
||||||
|
FCLTHeader.Requires({ plugins: ["jQuery"],
|
||||||
|
js: ["jquery-ui.js"]
|
||||||
|
})
|
||||||
|
if ("js" in scf_params.show)
|
||||||
|
FCLTHeader.Requires({ js: scf_params.show.js });
|
||||||
|
|
||||||
|
// Autorisatie
|
||||||
|
var authparamsPRSSYS = user.checkAutorisation("WEB_PRSSYS");
|
||||||
|
|
||||||
|
var transit = "";
|
||||||
|
if ("transit" in scf_params)
|
||||||
|
transit = "&" + scf_params.transit.name + "=" + safe.url(scf_params.transit.val);
|
||||||
|
|
||||||
|
var key = getQParam("id");
|
||||||
|
var xxx_params = { filter: { id: key } };
|
||||||
|
var xxx_array = model.REST_GET(xxx_params);
|
||||||
|
if (!xxx_array.length)
|
||||||
|
shared.record_not_found();
|
||||||
|
var xxx_data = xxx_array[0];
|
||||||
|
%>
|
||||||
|
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<% FCLTHeader.Generate(); %>
|
||||||
|
<script>
|
||||||
|
<% if ("name" in xxx_data) { %>
|
||||||
|
FcltMgr.setTitle("<%=model.record_name + ' ' + safe.jsstring(xxx_data.name)%>", {hot:false});
|
||||||
|
<% } %>
|
||||||
|
|
||||||
|
function xxx_change()
|
||||||
|
{
|
||||||
|
if (FcltMgr.startEdit(window))
|
||||||
|
{
|
||||||
|
window.location.href = "<%=scf_params.this_fullpath%>?mode=edit&id=<%=key%><%=transit%>";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function xxx_delete()
|
||||||
|
{
|
||||||
|
if (confirm(L("lcl_R_U_sure")))
|
||||||
|
{
|
||||||
|
alert("Delete not supported yet");
|
||||||
|
return;
|
||||||
|
var data = { key: "<%=safe.jsstring(key)%>"};
|
||||||
|
<% protectRequest.dataToken("data"); %>
|
||||||
|
$.post("<%=scf_params.this_fullpath%>?mode=delete&id=<%=key%>",
|
||||||
|
data,
|
||||||
|
FcltCallbackClose,
|
||||||
|
"json");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function col_edit(row)
|
||||||
|
{
|
||||||
|
var col_key = row.getAttribute("ROWKEY");
|
||||||
|
var url = "../fac/fac_usrrap_col.asp?col_key=" + col_key;
|
||||||
|
FcltMgr.openModalDetail(url, L("lcl_fac_usrrap_cols"), {callback: FcltMgr.reload } );
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
</head>
|
||||||
|
<body id="showbody">
|
||||||
|
<% var buttons = [];
|
||||||
|
if (authparamsPRSSYS.PRSreadlevel < 9 && authparamsPRSSYS.ALGreadlevel < 9)
|
||||||
|
{
|
||||||
|
if (scf_params.show.buttons)
|
||||||
|
{
|
||||||
|
for (var i = 0; i < scf_params.show.buttons.length; i++)
|
||||||
|
{ // Als je een action opgeeft *zonder* haakjes voegen we automagisch de key toe
|
||||||
|
if (scf_params.show.buttons[i].action.indexOf("(") < 0)
|
||||||
|
scf_params.show.buttons[i].action += "(" + key + ")"
|
||||||
|
buttons.push(scf_params.show.buttons[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
buttons.push({title: L("lcl_change"), action: "xxx_change()", icon: "wijzigen.png" });
|
||||||
|
if (model["REST_DELETE"])
|
||||||
|
buttons.push({title: L("lcl_delete"), action: "xxx_delete()", icon: "delete.png" });
|
||||||
|
}
|
||||||
|
IFRAMER_HEADER(model.record_name, buttons);
|
||||||
|
%>
|
||||||
|
<div id="show">
|
||||||
|
<form name="u2" onSubmit="return false;">
|
||||||
|
<%
|
||||||
|
BLOCK_START("facInfo", model.record_name);
|
||||||
|
for (var fld in model.fields)
|
||||||
|
{
|
||||||
|
var field = model.fields[fld];
|
||||||
|
var txt = xxx_data[fld];
|
||||||
|
if (xxx_data[fld] === null)
|
||||||
|
{
|
||||||
|
if (field.typ == "check")
|
||||||
|
txt = "0";
|
||||||
|
else
|
||||||
|
continue; // Altijd suppressEmpty
|
||||||
|
}
|
||||||
|
var title = "";
|
||||||
|
if (typeof txt == "object")
|
||||||
|
{
|
||||||
|
if ("name" in txt) // Foreigns
|
||||||
|
{
|
||||||
|
title = "Key: " + txt["id"];
|
||||||
|
txt = txt["name"];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
if (field.typ == "datetime")
|
||||||
|
txt = toDateTimeString(txt);
|
||||||
|
else if (typeof txt == "date" || txt instanceof Date)
|
||||||
|
txt = toDateString(txt);
|
||||||
|
}
|
||||||
|
if (field.typ == "check")
|
||||||
|
ROCHECKBOXTR("fldtxt", field.label||fld, txt, { title: title});
|
||||||
|
else
|
||||||
|
ROFIELDTR("fldtxt", field.label||fld, txt, { title: title});
|
||||||
|
}
|
||||||
|
BLOCK_END();
|
||||||
|
%>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
<%
|
||||||
|
}
|
||||||
|
%>
|
||||||
90
APPL/SCF/scaffolding_wrap.inc
Normal file
90
APPL/SCF/scaffolding_wrap.inc
Normal file
@@ -0,0 +1,90 @@
|
|||||||
|
<%
|
||||||
|
/* $Revision$
|
||||||
|
$Id$
|
||||||
|
|
||||||
|
File: scaffolding_wrap.asp
|
||||||
|
Status:
|
||||||
|
Description: wrapper voor scaffolding show / edit en iframes voor de includes
|
||||||
|
|
||||||
|
Parameters: id
|
||||||
|
|
||||||
|
Context:
|
||||||
|
Note:
|
||||||
|
|
||||||
|
*/ %>
|
||||||
|
<%
|
||||||
|
function scaffolding_wrap(model, scf_params)
|
||||||
|
{
|
||||||
|
scf_params.wrap = scf_params.wrap || {};
|
||||||
|
|
||||||
|
var transit = "";
|
||||||
|
if ("transit" in scf_params)
|
||||||
|
transit = "&" + scf_params.transit.name + "=" + safe.url(scf_params.transit.val);
|
||||||
|
|
||||||
|
var key = getQParam("id", -1);
|
||||||
|
|
||||||
|
FCLTHeader.Requires({plugins:["jQuery", "suggest"], js: ["jquery-ui.js"]})
|
||||||
|
|
||||||
|
var scf_title = L("lcl_fac_usrrapx");
|
||||||
|
%>
|
||||||
|
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<% FCLTHeader.Generate(); %>
|
||||||
|
<script type="text/javascript" >
|
||||||
|
<% if (key > 0)
|
||||||
|
{ %>
|
||||||
|
FcltMgr.setTitle("<%=safe.jsstring(scf_title)%>", {hot: false});
|
||||||
|
<% } %>
|
||||||
|
|
||||||
|
function scfClose(params)
|
||||||
|
{
|
||||||
|
<% if (key < 0)
|
||||||
|
{ %>
|
||||||
|
if (params.cancel)
|
||||||
|
{
|
||||||
|
FcltMgr.closeDetail(window, params);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (!params.keepForm)
|
||||||
|
window.location.href = "<%=scf_params.this_fullpath%>?mode=wrap<%=transit%>&verynew=1&id=" + params.key;
|
||||||
|
<% }
|
||||||
|
else
|
||||||
|
{ /* Bestaand object bewerkt, switch naar show-mode */ %>
|
||||||
|
if (!params.keepForm && !params.deleted)
|
||||||
|
$("#scfFrame")[0].src = "<%=scf_params.this_fullpath%>?mode=show<%=transit%>&id=<%=key%>";
|
||||||
|
|
||||||
|
<% } %>
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<% if (key < 0)
|
||||||
|
var page = scf_params.this_fullpath + "?mode=edit" + transit; // Maak een nieuw
|
||||||
|
else
|
||||||
|
var page = scf_params.this_fullpath + "?mode=show" + transit;
|
||||||
|
page += "&id=" + key;
|
||||||
|
|
||||||
|
IFRAMER("scfFrame", page, { FcltClose: "scfClose" } );
|
||||||
|
|
||||||
|
if (key > 0)
|
||||||
|
{
|
||||||
|
for (var inc in model.includes)
|
||||||
|
{
|
||||||
|
var include = model.includes[inc];
|
||||||
|
if (include.joinfield == model.fields["id"].dbs)
|
||||||
|
{
|
||||||
|
var filter = {};
|
||||||
|
filter[include.joinfield] = key;
|
||||||
|
var url = scf_params.this_fullpath + "?mode=list&model=" + inc + "&pid=" + key;
|
||||||
|
IFRAMER("xxxFrame", url, { FcltClose: "scfClose" } );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
%>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
<%
|
||||||
|
}
|
||||||
|
%>
|
||||||
@@ -743,7 +743,7 @@ function abort_with_warning(warning, code)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
Response.ContentType = "application/json";
|
Response.ContentType = "application/json";
|
||||||
Response.Write(JSON.stringify(data, null, Request.QueryString("pretty")=="1"?2:0));
|
Response.Write(JSON.stringify(data, null, 2));
|
||||||
}
|
}
|
||||||
Response.Status = code;
|
Response.Status = code;
|
||||||
Response.End;
|
Response.End;
|
||||||
@@ -1034,6 +1034,13 @@ Date.prototype.midnight = function midnight()
|
|||||||
return midn;
|
return midn;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function inArray(needle, haystack) {
|
||||||
|
var length = haystack.length;
|
||||||
|
for(var i = 0; i < length; i++) {
|
||||||
|
if(haystack[i] == needle) return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
// Bepaalt de customerId (en rooturl)
|
// Bepaalt de customerId (en rooturl)
|
||||||
// Na afloop is de globale variabele customerId gezet en opgeslagen in Session("customerId")
|
// Na afloop is de globale variabele customerId gezet en opgeslagen in Session("customerId")
|
||||||
|
|||||||
@@ -2210,6 +2210,7 @@ body#mod_resmulti { width: 660px }
|
|||||||
body#mod_resmulti div#show_date_from { height: 230px }
|
body#mod_resmulti div#show_date_from { height: 230px }
|
||||||
#mod_respool {width:600px;}
|
#mod_respool {width:600px;}
|
||||||
#mod_bes_kenmerk {width:500px;}
|
#mod_bes_kenmerk {width:500px;}
|
||||||
|
.modal.scaffolding {width:500px;}
|
||||||
|
|
||||||
#mod_mldobj #obj_info {height:62px; padding: 4px; border: 1px solid #ccc;}
|
#mod_mldobj #obj_info {height:62px; padding: 4px; border: 1px solid #ccc;}
|
||||||
#mod_mldobj .label {
|
#mod_mldobj .label {
|
||||||
|
|||||||
@@ -1539,6 +1539,10 @@ ResultsetTable.formatValue = function (val, params) //datatype, decimals)
|
|||||||
else
|
else
|
||||||
return " ";
|
return " ";
|
||||||
}
|
}
|
||||||
|
// Vanuit API2 model
|
||||||
|
if (typeof val == "object" && "name" in val)
|
||||||
|
val = val["name"];
|
||||||
|
|
||||||
// Eerst de geforceerde datatypes
|
// Eerst de geforceerde datatypes
|
||||||
switch (params.datatype)
|
switch (params.datatype)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -90,7 +90,8 @@ function foreignKeyTable(field)
|
|||||||
"RES_DISCIPLINE" : { tbl: "res_discipline", key: "ins_discipline_key", desc: "ins_discipline_omschrijving" },
|
"RES_DISCIPLINE" : { tbl: "res_discipline", key: "ins_discipline_key", desc: "ins_discipline_omschrijving" },
|
||||||
"INS_DEEL" : { tbl: "ins_deel", key: "ins_deel_key", desc: "ins_deel_omschrijving" },
|
"INS_DEEL" : { tbl: "ins_deel", key: "ins_deel_key", desc: "ins_deel_omschrijving" },
|
||||||
"INS_SRTDEEL" : { tbl: "ins_srtdeel", key: "ins_srtdeel_key", desc: "ins_srtdeel_omschrijving" },
|
"INS_SRTDEEL" : { tbl: "ins_srtdeel", key: "ins_srtdeel_key", desc: "ins_srtdeel_omschrijving" },
|
||||||
"BES_BESTELOPDR" : { tbl: "bes_bestelopdr", key: "bes_bestelopdr_key", desc: "bes_bestelopdr_id" }
|
"BES_BESTELOPDR" : { tbl: "bes_bestelopdr", key: "bes_bestelopdr_key", desc: "bes_bestelopdr_id" },
|
||||||
|
"FAC_FUNCTIE" : { tbl: "fac_functie", key: "fac_functie_key", desc: "fac_functie_omschrijving" }
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
return __foreignKeyTable[field.toUpperCase()];
|
return __foreignKeyTable[field.toUpperCase()];
|
||||||
|
|||||||
Reference in New Issue
Block a user