Files
Facilitor/APPL/Localscripts/plaatsselector.js
Maykel Geerdink ba5cea23ae FMHN#81597: filter geeft niet weer bij selecteren van terrein.
svn path=/Website/trunk/; revision=65879
2024-08-13 18:35:56 +00:00

501 lines
23 KiB
JavaScript

"use strict";
/*
$Revision$
$Id$
Clientside functions for shared/plaatsselector.inc
Zou nog kunnen worden verfijnd, maar dan gaan we al zeuren:
MGE DONE: - naar boven toe terug-escaleren of terug-invalideren indien de bovenste zichtbare waarde wijzigt
- automatisch keuze maken indien er maar eentje is.
- verfijndere focus-handling
*/
var plaatsselector =
{
fillLowerLevels: function(json, textStatus)
{
if (textStatus == "success")
{
//if (json.level) FcltMgr.alert(json.level);
var sgRoom = psObject[json.idadd].sgRoom;
var sgFlr = psObject[json.idadd].sgFlr;
var sgBld = psObject[json.idadd].sgBld;
var sgLoc = psObject[json.idadd].sgLoc;
var sgDis = psObject[json.idadd].sgDis;
var sgReg = psObject[json.idadd].sgReg;
var escalateOnChUp = psObject[json.idadd].escalateOnChUp;
var onRegChange = psObject[json.idadd].onRegChange;
var onDisChange = psObject[json.idadd].onDisChange;
var onLocChange = psObject[json.idadd].onLocChange;
var onGebChange = psObject[json.idadd].onGebChange;
var onVerChange = psObject[json.idadd].onVerChange;
var onRuiChange = psObject[json.idadd].onRuiChange;
switch(json.level)
{ // Naar boven toe terug-escaleren:
// Levels: werkplek (6), ruimte (5), verdieping (4), gebouw/terrein (3), locatie (2), district (1), regio (0).
// Waarde zetten met de functie setValue(key, txt, doonChange, checkExist, extraParam, lastTry).
// Geen onChange (doonChange) uitvoeren met de functie setValue(). Dan worden de functies plaatsselector.xxxChanged uitgevoerd en lagere velden weer leeggemaakt.
// Als escalateOnChUp is gezet moet alleen de params.onLocChange functies worden uitgevoerd, maar niet de plaatsselector.xxxChanged functies.
// Let op, er is geen break aan het eind van elke case
case 6: if (typeof(sgRoom) != "undefined" && $("#ruimtekey").val() == -1)
{
sgRoom.setValue(json.ruimte_key, json.ruimte_oms);
if (escalateOnChUp) eval(onRuiChange);
}
case 5: if (typeof(sgFlr) != "undefined" && $("#verdiepingkey").val() == -1)
{
sgFlr.setValue(json.verdieping_key, json.verdieping_oms);
if (escalateOnChUp) eval(onVerChange);
}
case 4: if (typeof(sgBld) != "undefined" && $("#gebouwkey").val() == -1)
{
// Als level 4 is dan heeft of gebouw_key of terrein_key een geldige waarde
if (json.gebouw_key > 0)
sgBld.setValue(json.gebouw_key, json.gebouw_oms, false, false, 'B');
else
sgBld.setValue(json.terrein_key, json.terrein_oms, false, false, 'T');
if (escalateOnChUp) eval(onGebChange);
}
case 3: if (typeof(sgLoc) != "undefined" && $("#locatiekey").val() == -1)
{
sgLoc.setValue(json.locatie_key, json.locatie_oms);
if (escalateOnChUp) eval(onLocChange);
}
case 2: if (typeof(sgDis) != "undefined" && $("#districtkey").val() == -1)
{
sgDis.setValue(json.district_key, json.district_oms);
if (escalateOnChUp) eval(onDisChange);
}
case 1: if (typeof(sgReg) != "undefined" && $("#regiokey").val() == -1)
{
sgReg.setValue(json.regio_key, json.regio_oms);
if (escalateOnChUp) eval(onRegChange);
}
break;
}
}
else
FcltMgr.alert("fillLowerLevels: " + textStatus);
},
checkLowerLevels: function(suggestlevel, alg_key, idadd)
{
// Levels: werkplek (6), ruimte (5), verdieping (4), gebouw/terrein (3), locatie (2), district (1), regio (0).
if ((suggestlevel == 6 && $("#ruimtekey").val() <= 0) ||
(suggestlevel == 5 && $("#verdiepingkey").val() <= 0) ||
(suggestlevel == 4 && $("#gebouwkey").val() <= 0) ||
(suggestlevel == 3 && $("#locatiekey").val() <= 0) ||
(suggestlevel == 2 && $("#districtkey").val() <= 0) ||
(suggestlevel == 1 && $("#regiokey").val() <= 0))
{ // Onderliggende level heeft geen ingevulde waarde
// Haal alle plaats keys op. De callback functie fillLowerLevels moet dan de waarden invullen voor onderliggende levels.
// Alleen gegevens ophalen. Dus hier get gebruiken. (Dan wordt er ook gecached, wat ten goede komt in de performance)
// Synchroon zodat verdere code (Cascade functies) er vanuit kan gaan dat de onderliggende waarden zijn ingevuld.
var returndata = FcltSyncgetJSON("../Shared/get_alg_info.asp",
{ level: suggestlevel,
alg_key: alg_key,
idadd: idadd
});
plaatsselector.fillLowerLevels(returndata, returndata.textStatus)
}
},
regChanged: async function(key, idadd = 0)
{
if (typeof(psObject[idadd].sgDis) != "undefined")
{
var sgDis = psObject[idadd].sgDis;
if (!sgDis.isMulti()) sgDis.setValue(-1, "");
plaatsselector.disChanged(-1);
if (key > 0 && $("#district" + (idadd? idadd : "")).is(".required,.autoselect")) // Required moet ook gelden voor CheckJustOne
await sgDis.CheckJustOne();
}
if (key > 0 && (typeof(psObject[idadd].sgDis) == "undefined" || $("#districtkey" + (idadd? idadd : "")).val() < 0))
eval(onRegCascade[idadd]);
},
disChanged: async function(key, idadd = 0)
{
if (typeof(psObject[idadd].sgLoc) != "undefined")
{
var sgLoc = psObject[idadd].sgLoc;
if (!sgLoc.isMulti()) sgLoc.setValue(-1, "");
plaatsselector.locChanged(-1);
if (key > 0) plaatsselector.checkLowerLevels(1, key, idadd);
if (key > 0 && $("#locatie" + (idadd? idadd : "")).is(".required,.autoselect")) // Required moet ook gelden voor CheckJustOne
await sgLoc.CheckJustOne();
}
if (typeof(psObject[idadd].sgReg) != "undefined")
if (key > 0) plaatsselector.checkLowerLevels(1, key, idadd);
if (key > 0 && (typeof(psObject[idadd].sgLoc) == "undefined" || $("#locatiekey" + (idadd? idadd : "")).val() < 0))
eval(onDisCascade[idadd]);
},
locChanged: async function(key, idadd = 0)
{
if (typeof(psObject[idadd].sgBld) != "undefined")
{
var sgBld = psObject[idadd].sgBld;
var autosel = plaatsselector._autoSelect("alg_locatie_key", key, "alg_gebouw_key", "alg_gebouw_naam", "alg_gebouw_code");
if (!sgBld.isMulti()) sgBld.setValue(autosel.key, autosel.desc);
if (autosel.key > 0)
$("#bttype" + (idadd? idadd : "")).val("B"); // De functie _autoSelect heeft een gebouw gevonden. Werkplekken zitten altijd in een gebouw en niet op een terrein.
else
$("#bttype" + (idadd? idadd : "")).val("");
plaatsselector.gebChanged(autosel.key);
if (key > 0 && autosel.key < 0 && $("#gebouw" + (idadd? idadd : "")).is(".required,.autoselect")) // Required moet ook gelden voor CheckJustOne
await sgBld.CheckJustOne();
}
if (typeof(psObject[idadd].sgDis) != "undefined")
if (key > 0) plaatsselector.checkLowerLevels(2, key, idadd);
if (key > 0 && (typeof(psObject[idadd].sgBld) == "undefined" || $("#gebouwkey" + (idadd? idadd : "")).val() < 0))
eval(onLocCascade[idadd]);
},
gebChanged: async function(key, idadd = 0)
{
if (typeof(psObject[idadd].sgFlr) != "undefined")
{
var sgFlr = psObject[idadd].sgFlr;
var autosel = plaatsselector._autoSelect("alg_gebouw_key", key, "alg_verdieping_key", "alg_verdieping_naam", "alg_verdieping_code");
if (!sgFlr.isMulti()) sgFlr.setValue(autosel.key, autosel.desc);
plaatsselector.verChanged(autosel.key);
if ($("#bttype" + (idadd? idadd : "")).val() == 'T')
{ // Indien een terrein gekozen is, maak dan onderstaande velden readonly
if (requiredlevel >= 4) // Verplichtheid eraf halen indien required.
$("#verdieping" + (idadd? idadd : "")).removeClass("required");
sgFlr.makeReadOnly();
if (typeof(psObject[idadd].sgRoom) != "undefined")
{
if (requiredlevel >= 5) // Verplichtheid eraf halen indien required.
$("#ruimte" + (idadd? idadd : "")).removeClass("required");
psObject[idadd].sgRoom.makeReadOnly();
}
if (typeof(psObject[idadd].sgWpl) != "undefined")
{
if (requiredlevel >= 6) // Verplichtheid eraf halen indien required.
$("#werkplek" + (idadd? idadd : "")).removeClass("required");
psObject[idadd].sgWpl.makeReadOnly();
}
}
else // ($("#bttype" + (idadd? idadd : "")).val() == 'B')
{ // Indien een gebouw gekozen is, maak dan onderstaande velden "weer" wijzigbaar
if (requiredlevel >= 4) // Verplichtheid er weer opzetten indien required.
$("#verdieping" + (idadd? idadd : "")).addClass("required");
sgFlr.undoReadOnly();
if (typeof(psObject[idadd].sgRoom) != "undefined")
{
if (requiredlevel >= 5) // Verplichtheid er weer opzetten indien required.
$("#ruimte" + (idadd? idadd : "")).addClass("required");
psObject[idadd].sgRoom.undoReadOnly();
}
if (typeof(psObject[idadd].sgWpl) != "undefined")
{
if (requiredlevel >= 6) // Verplichtheid er weer opzetten indien required.
$("#werkplek" + (idadd? idadd : "")).addClass("required");
psObject[idadd].sgWpl.undoReadOnly();
}
}
if (key > 0 && autosel.key < 0 && $("#verdieping" + (idadd? idadd : "")).is(".required,.autoselect")) // Required moet ook gelden voor CheckJustOne
await sgFlr.CheckJustOne();
}
if (typeof(psObject[idadd].sgLoc) != "undefined")
if (key > 0) plaatsselector.checkLowerLevels(3, key, idadd);
if (key > 0 && (typeof(psObject[idadd].sgFlr) == "undefined" || $("#verdiepingkey" + (idadd? idadd : "")).val() < 0))
eval(onGebCascade[idadd]);
var pbttype
if ($("#gebouw" + (idadd? idadd : "")).prop("tagName") == "SELECT")
{
for (var i = 0; i < $("#gebouw").find(":selected").length; i++)
{
if (i == 0)
{
pbttype = $("#gebouw").find(":selected")[i].getAttribute("extra");
}
else if (pbttype != $("#gebouw").find(":selected")[i].getAttribute("extra"))
{
pbttype = "BT"
break;
}
}
$("#bttype").val(pbttype);
}
},
verChanged: async function(key, idadd = 0)
{
if (typeof(psObject[idadd].sgRoom) != "undefined")
{
var sgRoom = psObject[idadd].sgRoom;
var autosel = plaatsselector._autoSelect("alg_verdieping_key", key, "alg_ruimte_key", "alg_ruimte_naam");
if (!sgRoom.isMulti()) sgRoom.setValue(autosel.key, autosel.desc);
plaatsselector.ruiChanged(autosel.key);
if (key > 0 && autosel.key < 0 && $("#ruimte" + (idadd? idadd : "")).is(".required,.autoselect")) // Required moet ook gelden voor CheckJustOne
await sgRoom.CheckJustOne();
}
if (typeof(psObject[idadd].sgBld) != "undefined")
if (key > 0) plaatsselector.checkLowerLevels(4, key, idadd);
if (key > 0 && (typeof(psObject[idadd].sgRoom) == "undefined" || $("#ruimtekey" + (idadd? idadd : "")).val() < 0))
eval(onVerCascade[idadd]);
},
ruiChanged: async function(key, idadd = 0)
{
if (typeof(psObject[idadd].sgWpl) != "undefined")
{
var sgWpl = psObject[idadd].sgWpl;
//plaatsselector._autoSelect("alg_ruimte_key", key);
if (!sgWpl.isMulti()) sgWpl.setValue(-1, "");
plaatsselector.werChanged(-1);
if (key > 0 && $("#werkplek" + (idadd? idadd : "")).is(".required,.autoselect")) // Required moet ook gelden voor CheckJustOne
await sgWpl.CheckJustOne();
}
if (typeof(psObject[idadd].sgFlr) != "undefined")
if (key > 0) plaatsselector.checkLowerLevels(5, key, idadd);
if (key > 0)
eval(onRuiCascade[idadd]);
},
werChanged: async function(key, idadd = 0)
{
if (typeof(psObject[idadd].sgRoom) != "undefined")
if (key > 0) plaatsselector.checkLowerLevels(6, key, idadd);
},
checkReadonlyVer: function (idadd)
{
if ($("#bttype" + (idadd? idadd : "")).val() == 'T')
{ // Indien een terrein gekozen is, maak dan onderstaande velden readonly
if (requiredlevel >= 4) // Verplichtheid eraf halen indien required.
$("#verdieping" + (idadd? idadd : "")).removeClass("required");
var sgFlr = psObject[idadd? idadd : 0].sgFlr;
sgFlr.makeReadOnly();
$("#verdieping" + (idadd? idadd : "")).val("");
}
},
checkReadonlyRui: function (idadd)
{
if ($("#bttype" + (idadd? idadd : "")).val() == 'T')
{ // Indien een terrein gekozen is, maak dan onderstaande velden readonly
if (requiredlevel >= 5) // Verplichtheid eraf halen indien required.
$("#ruimte" + (idadd? idadd : "")).removeClass("required");
var sgRoom = psObject[idadd? idadd : 0].sgRoom;
sgRoom.makeReadOnly();
$("#ruimte" + (idadd? idadd : "")).val("");
}
},
checkReadonlyWer: function (idadd)
{
if ($("#bttype" + (idadd? idadd : "")).val() == 'T')
{ // Indien een terrein gekozen is, maak dan onderstaande velden readonly
if (requiredlevel >= 6) // Verplichtheid eraf halen indien required.
$("#werkplek" + (idadd? idadd : "")).removeClass("required");
var sgWpl = psObject[idadd? idadd : 0].sgWpl;
sgWpl.makeReadOnly();
$("#werkplek" + (idadd? idadd : "")).val("");
}
},
_werkplekken: [], // Deze proberen we te autoselecten. Komen uit prs_info.werkplekken
_werklocatie: {}, // Deze word gebruikt worden om preciezer te autoselecten (op welke plaats zit ik nu/vandaag ?)
_werkplaats: {}, // Hier wordt het beste van beiden opgeslagen, zoals in _setWerkplaats ge-evalueerd
// Deze functie vult plaatsselector._werkplaats in en returned (boolean) of dat gelukt is of niet
_setWerkplaats: function(werkplekken, werklocatie)
{
plaatsselector._resetWerkplaats();
if (!plaatsselector._setWerkplaatsByWL(werklocatie)) {
plaatsselector._setWerkplaatsByWP(werkplekken);
}
if (plaatsselector._werkplaats.alg_ruimte_naam && plaatsselector._werkplaats.alg_ruimte_naam.charAt(0) == '_')
{
plaatsselector._werkplaats.alg_ruimte_key = -1;
plaatsselector._werkplaats.alg_ruimte_naam = "";
}
},
_resetWerkplaats: function ()
{
plaatsselector._werkplaats = {
alg_locatie_key: -1,
alg_locatie_naam: "",
alg_gebouw_key: -1,
alg_gebouw_naam: "",
alg_verdieping_key: -1,
alg_verdieping_naam: "",
alg_ruimte_key: -1,
alg_ruimte_naam: ""
}
},
// Bepaal plaatsselector._werkplaats met inachtneming van de werklocatie
_setWerkplaatsByWL: function(werklocatie)
{
var hasWerklocatie;
for (var i = 0; i < Object.values(werklocatie).length && !hasWerklocatie; i++) {
hasWerklocatie |= Object.values(werklocatie)[i] > 0;
}
if (hasWerklocatie) {
plaatsselector._werkplaats = werklocatie;
}
return hasWerklocatie;
},
// Bepaal plaatsselector._werkplaats alleen op basis van de werkplekken; zoek de specifiekste common denominator tussen de werkplekken
_setWerkplaatsByWP: function(werkplekken)
{
var result = JSON.parse(JSON.stringify(plaatsselector._werkplaats)); // Copy
if (!werkplekken || werkplekken.length == 0)
return false;
var commonL = 1;
var commonG = 1;
var commonV = 1;
var commonR = 1;
var locKey = plaatsselector._werkplekken[0].alg_locatie_key;
var bldKey = plaatsselector._werkplekken[0].alg_gebouw_key;
var flrKey = plaatsselector._werkplekken[0].alg_verdieping_key;
var roomKey = plaatsselector._werkplekken[0].alg_ruimte_key;
for (var i = 1; i < werkplekken.length; i++)
{
if (locKey == werkplekken[i].alg_locatie_key)
commonL++;
if (bldKey == werkplekken[i].alg_gebouw_key)
commonG++;
if (flrKey == werkplekken[i].alg_verdieping_key)
commonV++;
if (roomKey == werkplekken[i].alg_ruimte_key)
commonR++;
}
var niveauFound = -1;
if (commonR == werkplekken.length) // Alle werkplekken hebben dezelfde Ruimte
niveauFound = 5;
else if (commonV == werkplekken.length) // Alle werkplekken hebben dezelfde Verdieping
niveauFound = 4;
else if (commonG == werkplekken.length) // Alle werkplekken hebben hetzelfde Gebouw
niveauFound = 3;
else if (commonL == werkplekken.length) // Alle werkplekken hebben dezelfde Locatie
niveauFound = 2;
switch (niveauFound)
{ // Geen break's
case 5: result.alg_ruimte_key = plaatsselector._werkplekken[0].alg_ruimte_key;
result.alg_ruimte_naam = plaatsselector._werkplekken[0].alg_ruimte_naam;
case 4: result.alg_verdieping_key = plaatsselector._werkplekken[0].alg_verdieping_key;
result.alg_verdieping_naam = plaatsselector._werkplekken[0].alg_verdieping_naam;
case 3: result.alg_gebouw_key = plaatsselector._werkplekken[0].alg_gebouw_key;
result.alg_gebouw_naam = plaatsselector._werkplekken[0].alg_gebouw_naam;
case 2: result.alg_locatie_key = plaatsselector._werkplekken[0].alg_locatie_key;
result.alg_locatie_naam = plaatsselector._werkplekken[0].alg_locatie_naam;
break;
default: return false;
}
plaatsselector._werkplaats = result;
return true;
},
hasWerkplaats: function()
{
var hasWerkplaats = false;
for (var i = 0; i < Object.values(plaatsselector._werkplaats).length && !hasWerkplaats; i++) {
hasWerkplaats |= Object.values(plaatsselector._werkplaats)[i] > 0; // Werkt ook voor String (naam)
}
return hasWerkplaats;
},
// Vind een goede default plaats op basis van werkplek/locatie en vul die in
preferWerkplekken: function(werkplekken, werklocatie, idadd = 0)
{
plaatsselector._werkplekken = werkplekken;
plaatsselector._werklocatie = werklocatie || {};
var sgLoc = psObject[idadd].sgLoc;
var sgBld = psObject[idadd].sgBld;
var sgFlr = psObject[idadd].sgFlr;
var sgRoom = psObject[idadd].sgRoom;
// Bepaal beste default op basis van werkplek(ken) en werklocatie, en sla die op in plaatsselector._werkplaats
plaatsselector._setWerkplaats(werkplekken, werklocatie);
// Nu dan ook invullen, 1 niveau is voldoende, de rest cascadeert wel middels _autoSelect
if (plaatsselector.hasWerkplaats()) { // Alleen verrijken, niet leegmaken
if (!sgLoc.isReadOnly()) {
sgLoc.setValue(plaatsselector._werkplaats.alg_locatie_key, plaatsselector._werkplaats.alg_locatie_naam, true, true);
} else if (!sgBld.isReadOnly()) {
sgBld.setValue(plaatsselector._werkplaats.alg_gebouw_key, plaatsselector._werkplaats.alg_gebouw_naam, true, true);
} else if (!sgFlr.isReadOnly()) {
sgFlr.setValue(plaatsselector._werkplaats.alg_verdieping_key, plaatsselector._werkplaats.alg_verdieping_naam, true, true);
} else if (!sgRoom.isReadOnly()) {
sgRoom.setValue(plaatsselector._werkplaats.alg_ruimte_key, plaatsselector._werkplaats.alg_ruimte_naam, true, true);
}
}
return plaatsselector.hasWerkplaats();
},
// Vul de plaatsselector in op basis van de bepaalde _werkplaats
_autoSelect: function(level, key, childKey, childDesc, childCode)
{
// De huidige level is dezelfde als mijn werklocatie en mijn werklocatie kent de child
if (plaatsselector._werkplaats[level] == key && plaatsselector._werkplaats[childKey] > 0)
return { key: plaatsselector._werkplaats[childKey], desc: plaatsselector._werkplaats[childDesc] };
return { key: -1, desc: "" };
},
locatiedetails: function (fieldName)
{
var pkey=$(fieldName)[0].value;
if (pkey != -1) {
FcltMgr.openDetail("appl/alg/alg_locatie.asp?key=" + pkey);
}
},
gebouwdetails: function (fieldName, bttypefield)
{
var pkey=$(fieldName)[0].value;
if (pkey != -1) {
if ($(bttypefield)[0].value == "B")
FcltMgr.openDetail("appl/alg/alg_gebouw.asp?key=" + pkey);
else if ($(bttypefield)[0].value == "T")
FcltMgr.openDetail("appl/alg/alg_terreinsector.asp?ter_key=" + pkey);
}
},
verdiepingdetails: function (fieldName)
{
var pkey=$(fieldName)[0].value;
if (pkey != -1) {
FcltMgr.openDetail("appl/alg/alg_verdieping.asp?key=" + pkey);
}
},
ruimtedetails: function (fieldName)
{
var pkey=$(fieldName)[0].value;
if (pkey != -1) {
FcltMgr.openDetail("appl/alg/alg_ruimte.asp?key=" + pkey);
}
},
showmap: function (idadd, params)
{
var rkey = $("#ruimtekey" + idadd)[0].value;
var vkey = $("#verdiepingkey" + idadd)[0].value;
var url = "../cad/showroom.asp?vKey=" + vkey + "&rKey=" + rkey
+ "&caddwgx=" + params.caddwgx + "&caddwgy=" + params.caddwgy
+ (params.mld_key_dwgxy
? "&mld_key_dwgxy=" + params.mld_key_dwgxy
: "")
+ (has_cadShowdiscfn
? "&discs=" + cadShowdiscfn()
: "")
+ (has_cadShowthemafn
? "&thema=" + cadShowthemafn()
: "");
FcltMgr.openModalDetail(url,
L("lcl_select_ruimte"),
{
callback: function (data)
{
// var a = 1;
}
});
}
}