Files
Facilitor/APPL/FAC/fac_menu.inc
Koen Reefman d319122eda AKZA#38532 nu iconen klikbaar met behouden opmaak
svn path=/Website/trunk/; revision=32813
2017-02-14 12:52:26 +00:00

892 lines
46 KiB
HTML

<% /*
$Revision$
$Id$
File: fac/fac_menu.inc.asp
Context:
Levert de div "menutabs" op met alle voor deze user beschikbare opties
(en niets meer dan dat)
Deze div heeft de nesting
<div id="menutabs">
<ul></ul>
<div id="ProfFAC"></div>
<div id="PersFAC"></div>
<div id="MgtFAC"></div>
</div>
*/
%>
<!--#include file="fac.inc" -->
<%
var MENU = { PERS:0, PROF:1, MGT:2, MOB:3, TAB:5, FAV:6 };
// Zoekt een plaatje onder S("menu_image_path") met fallback naar ../Pictures
var fso = Server.CreateObject("Scripting.FileSystemObject");
function findImage(filename)
{
if (fso.FileExists(Server.MapPath(S("menu_image_path") + filename)))
return S("menu_image_path") + filename;
if (fso.FileExists(Server.MapPath("../Pictures/" + filename)))
return "../Pictures/" + filename;
return "";
}
function showImage (img, cls)
{
if (!img)
return "";
if (img.match(/^fa-/))
return "<i class='fa fa-fw {0} {1}'></i>".format(cls, img);
var newimg = findImage(img);
if (!newimg)
return "<i class='fa fa-fw fa-question fa-spin {0}' title='{1}'></i>".format(cls, img);
else
return "<img class='{0}' src='{1}'>".format(cls, safe.htmlattr(newimg));
}
// Maak een lijstje met items onder een kopje
// Als er meer dan 1 items meer dan max_lines zijn verschijnt een More...-regel
// Het aantal zichtbare regels is dus altijd maximaal max_lines+1.
function CreateItems(menuItems, pmode, start_collapsed, max_lines)
{
%><ul <%=start_collapsed?'style="display:none"':''%>><%
for (var j=0; j < menuItems.length; j++)
{
var itm = menuItems[j];
if (itm.orggroep == MENU.TAB && pmode == 1) // pinned tabs not under favs on desktop portal
continue;
var ttl = "";
if (itm.info)
ttl=" title='"+safe.htmlattr(itm.info)+"'";
var showtxt = ""; // Het zichtbare deel
if (itm.image)
showtxt = showImage(itm.image, 'mimg');
showtxt += (itm.level < 1? itm.name : safe.html(itm.name));
var unpin = (itm.orggroep == MENU.FAV && pmode != 3 // niet op portal
? "<span class='menupinned' title='" + L("lcl_current_fav_unsave") + "'"
+ " onclick='FcltMgr.stopPropagation(event);FcltMgr.saveFavMenu(this);'"
+ " fav_ttl='" + safe.htmlattr(itm.name) + "'>"
+ I("fa-thumb-tack")
+ "</span>"
: ""
);
var action = "";
if (itm.href)
{ // '*' voor een reguliere menuoptie forceert nieuw window
var protocol = itm.href.split(":")[0];
if (protocol.length > 0 && protocol.match(/^http|https|mailto|tel$/) || itm.href.slice(0,1) == "*")
{
if (itm.href.slice(0,1) == "*")
itm.href = "../../" + itm.href.substr(1);
action = " onclick=\"FcltMgr.stopPropagation(event);window.open('" + safe.jsstring(itm.href) + "')\"";
} else if (itm.href.slice(0,11) == "javascript:") {
action = " onclick=\"FcltMgr.stopPropagation(event);" + safe.htmlattr(itm.href) + "\"";
} else {
action = " onclick=\"" + safe.htmlattr("menu(event,'" + safe.jsstring(itm.href) + "', this, " + (itm.menu_key||-1) + ");") + "\"";
}
} else { // MGE: komt dit wel voor? Een submenu item zonder href (link) naar een pagina?
action = "";
}
%>
<li class="mi<%=itm.level>0?" mi"+itm.level:""%>"<%=ttl%> <%=j>=max_lines&&max_lines!=menuItems.length-1?"style='display:none'":""%><%= action %>>
<%=unpin%><%=showtxt%>
</li>
<%
}
if (j > max_lines&&max_lines!=menuItems.length-1)
{
%><li class="mi more" onclick="$('li', $(this).closest('ul')).show();$(this).hide();FcltMgr.resized();"><%=L("lcl_rs_truncated")%></li><%
}
%></ul><%
}
// nog verfijnen? diepere levels?
function CreateMenuGroep(Koppen, pmode)
{
function groepHeeftItems(pkop, pmode)
{
var heeft_items = false;
if (pmode == 1)
{
for (var i=0; i<pkop.Items.length; i++)
{
if ( (pkop.Items[i].group == pkop.Items[i].orggroep)
|| (pkop.Items[i].group == 0 && pkop.Items[i].orggroep == MENU.FAV)
)
heeft_items = true;
}
}
else
heeft_items = true;
return heeft_items;
}
%><ul><%
if (Koppen.length > S("menu_collapse_threshold")) menu_start_collapsed = 1; else menu_start_collapsed = 0;
for (var i = 0; i<Koppen.length; i++)
{
var menuKop = Koppen[i];
var ttl = "";
if (menuKop.info)
ttl=' title="'+safe.htmlattr(menuKop.info)+'"';
// Gaat het hier om een hoofdmenuitem met submenuitems of om een image link (logo) als menu item?
// Een hoofdmenuitem heeft submenuitems (en heeft geen url)
if (menuKop.Items.length > 0 && groepHeeftItems(menuKop, pmode))
{ // Hoofdmenuitems met submenuitems
%><li class="mk"<%=ttl%>><%
if (S("menu_use_menuicons") == 1)
{
if (menuKop.image && menuKop.image != "")
{
showtxt = showImage(menuKop.image, 'micon fa-2x');
Response.Write(showtxt);
} else {
%><span class="nomicon"> </span><% // invisible but take up the same space as an image
}
}%>
<span class="menukop"><%= safe.html(menuKop.label) %></span>
<% CreateItems(menuKop.Items, pmode, !menuKop.startopen && menu_start_collapsed==1) %>
</li><%
}
else
{ // Gaat het hier om een image link (logo) als menu item?
// Een logo als menuitem als
// 1) Menuitem moet een hoofdmenuitem zijn (Instelling "Topniveau" moet aan staan) die geen enkele submenu item heeft
// 2) Met plaatje/logo
// 3) Met een url naar de pagina
if (menuKop.image && menuKop.image != "" && menuKop.href && menuKop.href != "")
{ // Het gaat hier over een image als menu item
%><li class="mklogo"<%=ttl%>><span class="menulinkkop"><%
var kitm = menuKop;
if (kitm.href.slice(0,7) == "http://" || kitm.href.slice(0,8) == "https://" || kitm.href.slice(0,11) == "javascript:"){
%><a href="<%=safe.htmlattr(kitm.href)%>" target="_blank"><%
} else {
%><a onclick='FcltMgr.openDetail("<%=safe.htmlattr(kitm.href)%>", "<%=safe.htmlattr(menuKop.label)%>")'><%
}
%><%=showImage(menuKop.image, 'mk')%>
</a></span><%
%></li><%
}
}
}
%></ul><%
}
function generatePortalmenu(koppen)
{
if (koppen.length == 0)
return;
%><table><%
var col=0;
// Hoeveel procent per kolom igv volle breedte
var cw = parseInt(100 / S("portalmenucols") , 10);
for (var i = 0; i<koppen.length; i++)
{
var menuKop = koppen[i];
// Gaat het hier om een hoofdmenuitem met submenuitems of om een image link (logo) als menu item?
// Een hoofdmenuitem heeft submenuitems (en heeft geen url)
if (menuKop.Items.length > 0)
{ // Hoofdmenuitems met submenuitems
if (col==0)
Response.Write("<tr>");
Response.Write("<td"+(cw > 0 ? " style='width:"+cw+"%'": "")+">");
var ttl = "";
if (menuKop.info)
ttl=" title='"+safe.htmlattr(menuKop.info)+"'";
%><span class="menuimg"<%=ttl%>>
<%=showImage(menuKop.image, 'mklogo fa-4x')%>
</span>
<div class='portalmenukop'>
<span class="menukop"<%=ttl%>>
<%=safe.html(menuKop.label)%>
</span>
<% CreateItems(menuKop.Items, 3, false, S("portalmenulines"));
%></div><%
Response.Write("</td>");
col ++;
if (col==S("portalmenucols"))
{
Response.Write("</tr>");
col = 0;
cw = 0; // alleen de eerste rij is voldoende
}
}
}
%></table><%
}
function fillMenuArray(portalOnly, mobileOnly) {
// Levert een tweedimensionaal menu-array op met alle opties, in de juiste volgorde,
// waarbij 0=personal, 1=professional, 2=management, 3=mobile, 4=?, 5=pinned tab, 6=favoriten menu
// als er nog niet is ingelogd, wordt null opgeleverd.
var tmp = fac.myfunctionssqlstring(user_key);
var lmyreadfacfunctiekeys = tmp.read;
var lmywritefacfunctiekeys = tmp.write;
// Deze querie levert de geldende menu-opties op, dat zijn:
// die uit fac_menu
// - waarvoor ik de juiste autorisatie heb (functie + read of write)
// - geen autorisatie gegevens is ook altijd goed
// - waar aangegeven (draft) vermenigvuldigd met de module-srt/disciplines waarvoor ik rechten heb (functie +read of write)
// Voor de functies MET disciplines-autorisaties kunnen we beter direct bijjoinen, vond ik.
// TODO: (in menufunctions.inc): de diepere levels beter/anders supporten (openklapbaar)
/* var selectImage = (mobileOnly
? ", fac_menuitems_image" // evt image
+", fac_menu_image" // evt overrule
: ", COALESCE (fac_menu_image, fac_menuitems_image) image"
);
*/
// waarom bovenstaand verschil? Dit moet toch gewoon kunnen?
var selectImage = ", COALESCE (fac_menu_image, fac_menuitems_image) image";
var lsql = "SELECT * FROM ("
+ " SELECT fac_menu_key"
+ " , " + lcl.xsql2('COALESCE (fac_menu_altlabel, fac_menuitems_label)', 'FAC_MENU_ALTLABEL', 'fac_menu_key') + " label"
+ " , to_char(null) exploded "
+ " , REPLACE(REPLACE(COALESCE (fac_menu_alturl, fac_menuitems_url) "
+ " || CASE WHEN m.ins_discipline_key IS NOT NULL THEN '&dis_key='|| m.ins_discipline_key END "
+ " || CASE WHEN m.ins_srtdiscipline_key IS NOT NULL THEN '&srtdisc='|| m.ins_srtdiscipline_key END, '{0}', m.ins_srtdiscipline_key), '{1}', m.ins_discipline_key) "
+ " url "
+ " , fac_menu_filter filter"
+ selectImage
+ " , COALESCE (fac_menu_altgroep, fac_menuitems_groep) groep"
+ " , fac_menu_level "
+ " , fac_menu_portal"
+ " , " + lcl.xsqla('fac_menu_info', 'fac_menu_key')
+ " , fac_menu_volgnr"
+ " , COALESCE (m.fac_functie_key, mi.fac_functie_key) fac_functie_key"
+ " , COALESCE (mi.fac_menuitems_rw, 'R')"
+ " , 0 depth"
+ " FROM fac_menu m"
+ " , fac_menuitems mi"
+ " WHERE m.fac_menuitems_key = mi.fac_menuitems_key(+)"
// Systeemautorisatie
+ " AND (mi.fac_functie_key IS NULL" /* niet-explodeerbare opties zonder autorisaties */
+ " OR (COALESCE (mi.fac_menuitems_rw, 'R') = 'R' AND mi.fac_functie_key IN (" + lmyreadfacfunctiekeys + "))" /* niet-explodeerbare opties met read-autorisatie */
+ " OR (COALESCE (mi.fac_menuitems_rw, 'R') = 'W' AND mi.fac_functie_key IN (" + lmywritefacfunctiekeys + "))" /* niet-explodeerbare opties met write-autorisatie */
+ " )"
// Extra autorisatie
+ " AND (m.fac_functie_key IS NULL" /* niet-explodeerbare opties zonder autorisaties */
+ " OR (COALESCE (mi.fac_menuitems_rw, 'R') = 'R' AND m.fac_functie_key IN (" + lmyreadfacfunctiekeys + "))" /* niet-explodeerbare opties met read-autorisatie */
+ " OR (COALESCE (mi.fac_menuitems_rw, 'R') = 'W' AND m.fac_functie_key IN (" + lmywritefacfunctiekeys + "))" /* niet-explodeerbare opties met write-autorisatie */
+ " )"
if (!mobileOnly)
{
lsql +=" AND COALESCE (mi.fac_menuitems_disc, 0) = 0"
+ " AND COALESCE (mi.fac_menuitems_srtdisc, 0) = 0"
+ (portalOnly
? " AND fac_menu_portal=1"
: "")
// Extra autorisatie met een gekozen ins_discipline of ins_srtdiscipline
+ " AND ((m.ins_discipline_key IS NULL AND m.ins_srtdiscipline_key IS NULL)"
+ " OR (m.ins_discipline_key IS NOT NULL AND EXISTS "
+ "(SELECT ''"
+ " FROM fac_groeprechten g, fac_gebruikersgroep gg"
+ " WHERE g.fac_groep_key = gg.fac_groep_key"
+ " AND (g.ins_discipline_key = m.ins_discipline_key OR g.ins_discipline_key IS NULL)"
+ " AND g.fac_functie_key = m.fac_functie_key"
+ " AND fac_gebruiker_prs_level_read < 9"
+ " AND fac_gebruiker_alg_level_read < 9"
+ " AND gg.prs_perslid_key = " + user_key
+ "))"
+ " OR (m.ins_srtdiscipline_key IS NOT NULL AND EXISTS "
+ "(SELECT ''"
+ " FROM fac_groeprechten g, fac_gebruikersgroep gg, ins_tab_discipline d"
+ " WHERE g.fac_groep_key = gg.fac_groep_key"
+ " AND (g.ins_discipline_key = d.ins_discipline_key OR g.ins_discipline_key IS NULL)"
+ " AND d.ins_srtdiscipline_key = m.ins_srtdiscipline_key"
+ " AND g.fac_functie_key = m.fac_functie_key"
+ " AND fac_gebruiker_prs_level_read < 9"
+ " AND fac_gebruiker_alg_level_read < 9"
+ " AND gg.prs_perslid_key = " + user_key
+ "))"
+ ")"
+ " UNION ALL" // BES artikelcatalogi zonder een afzonderlijke vermelding
+ " SELECT fac_menu_key"
+ " , " + lcl.xsql2('COALESCE (fac_menu_altlabel, fac_menuitems_label)', 'FAC_MENU_ALTLABEL', 'fac_menu_key') + " label"
+ " , CASE WHEN sd.ins_srtdiscipline_omschrijving IS NULL " // geen lcl.xsql; veronderstelt: geen basistaal, dan ook geen vertaling
+ " THEN ''"
+ " ELSE " + lcl.xsql('sd.ins_srtdiscipline_omschrijving', 'sd.ins_srtdiscipline_key') + "||' '"
+ " END || "
+ lcl.xsql('d.ins_discipline_omschrijving', 'd.ins_discipline_key')
+ " exploded "
+ " , REPLACE(COALESCE (fac_menu_alturl, fac_menuitems_url) || '&dis_key='|| d.ins_discipline_key, '{1}', d.ins_discipline_key) url "
+ " , fac_menu_filter filter"
+ " , COALESCE (fac_menu_image, fac_menuitems_image) image"
+ " , COALESCE (fac_menu_altgroep, fac_menuitems_groep)groep"
+ " , fac_menu_level "
+ " , fac_menu_portal"
+ " , " + lcl.xsql('d.ins_discipline_opmerking', 'd.ins_discipline_key') + " fac_menu_info" // info per discipline
+ " , fac_menu_volgnr"
+ " , COALESCE (m.fac_functie_key, mi.fac_functie_key) fac_functie_key"
+ " , COALESCE (mi.fac_menuitems_rw, 'R')"
+ " , 2 depth"
+ " FROM fac_menu m"
+ " , fac_menuitems mi"
+ " , ins_tab_discipline d"
+ " , ins_srtdiscipline sd "
+ " WHERE m.fac_menuitems_key = mi.fac_menuitems_key(+)"
+ " AND d.ins_discipline_module = mi.fac_menuitems_module"
+ " AND d.ins_discipline_verwijder IS NULL"
+ " AND d.ins_srtdiscipline_key = sd.ins_srtdiscipline_key(+)"
+ " AND COALESCE (mi.fac_menuitems_disc, 0) = 1"
+ (portalOnly
? " AND m.fac_menu_portal = 1"
: "")
+ " AND d.ins_discipline_key NOT IN (" /* sluit items met een afzonderlijke vermelding uit */
+ " SELECT mm.ins_discipline_key"
+ " FROM fac_menu mm "
+ " WHERE mm.fac_functie_key = mi.fac_functie_key" // Alleen bij extra autorisatie kun je fac_menu.ins_discipline_key hebben
+ " AND mm.ins_discipline_key IS NOT NULL"
+ " )"
+ " AND (COALESCE (m.fac_functie_key, mi.fac_functie_key) IS NULL" /* disc-explodeerbare opties zonder autorisaties */
+ " OR (COALESCE (mi.fac_menuitems_rw, 'R') = 'R'"
+ " AND EXISTS"
+ " (SELECT ''"
+ " FROM fac_groeprechten g, fac_gebruikersgroep gg"
+ " WHERE g.fac_groep_key = gg.fac_groep_key"
+ " AND (g.ins_discipline_key = d.ins_discipline_key OR g.ins_discipline_key IS NULL)"
+ " AND g.fac_functie_key = mi.fac_functie_key"
+ " AND fac_gebruiker_prs_level_read < 9"
+ " AND fac_gebruiker_alg_level_read < 9"
+ " AND gg.prs_perslid_key = " + user_key
+ " )"
+ " AND (EXISTS"
+ " (SELECT ''"
+ " FROM fac_groeprechten g, fac_gebruikersgroep gg"
+ " WHERE g.fac_groep_key = gg.fac_groep_key"
+ " AND (g.ins_discipline_key = d.ins_discipline_key OR g.ins_discipline_key IS NULL)"
+ " AND g.fac_functie_key = m.fac_functie_key"
+ " AND fac_gebruiker_prs_level_read < 9"
+ " AND fac_gebruiker_alg_level_read < 9"
+ " AND gg.prs_perslid_key = " + user_key + ")"
+ " OR m.fac_functie_key IS NULL)"
+ " )"
+ " OR (COALESCE (mi.fac_menuitems_rw, 'R') = 'W'"
+ " AND EXISTS"
+ " (SELECT ''"
+ " FROM fac_groeprechten g, fac_gebruikersgroep gg"
+ " WHERE g.fac_groep_key = gg.fac_groep_key"
+ " AND (g.ins_discipline_key = d.ins_discipline_key OR g.ins_discipline_key IS NULL)"
+ " AND g.fac_functie_key = mi.fac_functie_key"
+ " AND fac_gebruiker_prs_level_write < 9"
+ " AND fac_gebruiker_alg_level_write < 9"
+ " AND gg.prs_perslid_key = " + user_key
+ " )"
+ " AND (EXISTS"
+ " (SELECT ''"
+ " FROM fac_groeprechten g, fac_gebruikersgroep gg"
+ " WHERE g.fac_groep_key = gg.fac_groep_key"
+ " AND (g.ins_discipline_key = d.ins_discipline_key OR g.ins_discipline_key IS NULL)"
+ " AND g.fac_functie_key = m.fac_functie_key"
+ " AND fac_gebruiker_prs_level_write < 9"
+ " AND fac_gebruiker_alg_level_write < 9"
+ " AND gg.prs_perslid_key = " + user_key + ") "
+ " OR m.fac_functie_key IS NULL)"
+ " )"
+ " )"
+ " UNION ALL" // MLD srtdisciplines zonder een afzonderlijke vermelding
+ " SELECT m.fac_menu_key"
+ " , " + lcl.xsql2('COALESCE (fac_menu_altlabel, fac_menuitems_label)', 'FAC_MENU_ALTLABEL', 'fac_menu_key') + " label"
+ " , " + lcl.xsql('sd.ins_srtdiscipline_omschrijving', 'sd.ins_srtdiscipline_key') + " exploded"
+ " , COALESCE (m.fac_menu_alturl, mi.fac_menuitems_url) || '&srtdisc='|| sd.ins_srtdiscipline_key url "
+ " , fac_menu_filter filter"
+ " , COALESCE (m.fac_menu_image, mi.fac_menuitems_image) image"
+ " , COALESCE (m.fac_menu_altgroep, mi.fac_menuitems_groep) groep"
+ " , m.fac_menu_level "
+ " , m.fac_menu_portal"
+ " , "+lcl.xsql('sd.ins_srtdiscipline_opmerking', 'sd.ins_srtdiscipline_key')+" fac_menu_info" // info per srtdiscipline
+ " , m.fac_menu_volgnr"
+ " , COALESCE (m.fac_functie_key, mi.fac_functie_key)"
+ " , mi.fac_menuitems_rw"
+ " , 1 depth"
+ " FROM fac_menu m"
+ " , fac_menuitems mi"
+ " , ins_srtdiscipline sd "
+ " WHERE m.fac_menuitems_key = mi.fac_menuitems_key(+)"
+ " AND sd.ins_srtdiscipline_module = mi.fac_menuitems_module "
+ " AND sd.ins_srtdiscipline_verwijder IS NULL "
+ (portalOnly
? " AND m.fac_menu_portal = 1"
: "")
+ " AND COALESCE (mi.fac_menuitems_srtdisc, 0) = 1 "
+ " AND mi.fac_menuitems_module != 'RES' " // Voor MLD heeft ins_srtdiscipline (vakgroeptype) alleen een waarde
+ " AND sd.ins_srtdiscipline_key <> "+ S("kto_srtdiscipline_key") // die tonen we niet in het menu
+ " AND sd.ins_srtdiscipline_key IN "
+ " (SELECT d.ins_srtdiscipline_key "
+ " FROM ins_tab_discipline d "
+ " WHERE d.ins_discipline_verwijder IS NULL "
+ " AND d.ins_srtdiscipline_key NOT IN " /* sluit items met een afzonderlijke vermelding uit */
+ " (SELECT mm.ins_srtdiscipline_key "
+ " FROM fac_menu mm "
+ " WHERE mm.fac_functie_key = mi.fac_functie_key" // Alleen bij extra autorisatie kun je fac_menu.ins_discipline_key hebben
+ " AND mm.ins_srtdiscipline_key IS NOT NULL) "
+ " AND (COALESCE (m.fac_functie_key, mi.fac_functie_key) IS NULL " /* srtdisc-explodeerbare opties zonder autorisaties */
+ " OR (mi.fac_menuitems_rw = 'R'"
+ " AND EXISTS " // Systeemautorisatie
+ " (SELECT '' "
+ " FROM fac_groeprechten g, fac_gebruikersgroep gg "
+ " WHERE g.fac_groep_key = gg.fac_groep_key "
+ " AND (g.ins_discipline_key = d.ins_discipline_key OR g.ins_discipline_key IS NULL)"
+ " AND g.fac_functie_key = mi.fac_functie_key "
+ " AND fac_gebruiker_prs_level_read < 9 "
+ " AND fac_gebruiker_alg_level_read < 9 "
+ " AND gg.prs_perslid_key = " + user_key
+ " )"
+ " AND (EXISTS " // Extra autorisatie
+ " (SELECT '' "
+ " FROM fac_groeprechten g, fac_gebruikersgroep gg "
+ " WHERE g.fac_groep_key = gg.fac_groep_key "
+ " AND (g.ins_discipline_key = d.ins_discipline_key OR g.ins_discipline_key IS NULL)"
+ " AND g.fac_functie_key = m.fac_functie_key"
+ " AND fac_gebruiker_prs_level_read < 9 "
+ " AND fac_gebruiker_alg_level_read < 9 "
+ " AND gg.prs_perslid_key = " + user_key + ")"
+ " OR m.fac_functie_key IS NULL)"
+ " )"
+ " OR (mi.fac_menuitems_rw = 'W'"
+ " AND EXISTS " // Systeemautorisatie
+ " (SELECT '' "
+ " FROM fac_groeprechten g, fac_gebruikersgroep gg "
+ " WHERE g.fac_groep_key = gg.fac_groep_key "
+ " AND (g.ins_discipline_key = d.ins_discipline_key OR g.ins_discipline_key IS NULL)"
+ " AND g.fac_functie_key = mi.fac_functie_key "
+ " AND fac_gebruiker_prs_level_write < 9 "
+ " AND fac_gebruiker_alg_level_write < 9 "
+ " AND gg.prs_perslid_key = " + user_key
+ " ) "
+ " AND (EXISTS " // Extra autorisatie
+ " (SELECT '' "
+ " FROM fac_groeprechten g, fac_gebruikersgroep gg "
+ " WHERE g.fac_groep_key = gg.fac_groep_key "
+ " AND (g.ins_discipline_key = d.ins_discipline_key OR g.ins_discipline_key IS NULL)"
+ " AND g.fac_functie_key = m.fac_functie_key"
+ " AND fac_gebruiker_prs_level_write < 9 "
+ " AND fac_gebruiker_alg_level_write < 9 "
+ " AND gg.prs_perslid_key = " + user_key + ")"
+ " OR m.fac_functie_key IS NULL)"
+ " ))) "
+ " UNION ALL" // RES: srtactiviteiten
+ " SELECT DISTINCT m.fac_menu_key"
+ " , " + lcl.xsql2('COALESCE (fac_menu_altlabel, fac_menuitems_label)', 'FAC_MENU_ALTLABEL', 'fac_menu_key') + " label"
+ " , " + lcl.xsql('sa.res_srtactiviteit_omschrijving', 'sa.res_srtactiviteit_key') + " exploded"
+ " , COALESCE (m.fac_menu_alturl, mi.fac_menuitems_url) || '&srtact=' || sa.res_srtactiviteit_key url "
+ " , fac_menu_filter filter"
+ " , COALESCE (m.fac_menu_image, mi.fac_menuitems_image) image"
+ " , COALESCE (m.fac_menu_altgroep, mi.fac_menuitems_groep) groep"
+ " , m.fac_menu_level "
+ " , m.fac_menu_portal"
+ " , " + lcl.xsql('sa.res_srtactiviteit_opmerking', 'sa.res_srtactiviteit_key') + " fac_menu_info" // info per srtdiscipline
+ " , m.fac_menu_volgnr"
+ " , COALESCE (m.fac_functie_key, mi.fac_functie_key)"
+ " , mi.fac_menuitems_rw"
+ " , 1 depth"
+ " FROM fac_menu m"
+ " , fac_menuitems mi"
+ " , res_srtactiviteit sa"
+ " WHERE m.fac_menuitems_key = mi.fac_menuitems_key(+)"
+ " AND sa.res_srtactiviteit_verwijder IS NULL"
+ (portalOnly
? " AND m.fac_menu_portal = 1"
: "")
+ " AND COALESCE (mi.fac_menuitems_srtdisc, 0) = 1"
+ " AND mi.fac_menuitems_module = 'RES' "
+ " AND sa.res_srtactiviteit_key IN "
+ " (SELECT ra.res_srtactiviteit_key "
+ " FROM ins_tab_discipline d, res_activiteitdiscipline ad, res_activiteit ra "
+ " WHERE d.ins_discipline_module = mi.fac_menuitems_module "
+ " AND d.ins_discipline_verwijder IS NULL "
+ " AND ra.res_activiteit_verwijder IS NULL "
+ " AND ad.res_activiteit_key = ra.res_activiteit_key "
+ " AND d.ins_discipline_key = ad.res_discipline_key "
+ " AND d.ins_srtdiscipline_key NOT IN " /* sluit items met een afzonderlijke vermelding uit */
+ " (SELECT mm.ins_srtdiscipline_key "
+ " FROM fac_menu mm "
+ " WHERE mm.fac_functie_key = mi.fac_functie_key" // Alleen bij extra autorisatie kun je fac_menu.ins_discipline_key hebben
+ " AND mm.ins_srtdiscipline_key IS NOT NULL) "
+ " AND (COALESCE (m.fac_functie_key, mi.fac_functie_key) IS NULL " /* srtact-explodeerbare opties zonder autorisaties */
+ " OR (mi.fac_menuitems_rw = 'R' "
+ " AND EXISTS " // Systeemautorisatie
+ " (SELECT '' "
+ " FROM fac_groeprechten g, fac_gebruikersgroep gg "
+ " WHERE g.fac_groep_key = gg.fac_groep_key "
+ " AND (g.ins_discipline_key = d.ins_discipline_key OR g.ins_discipline_key IS NULL)"
+ " AND g.fac_functie_key = mi.fac_functie_key "
+ " AND fac_gebruiker_prs_level_read < 9 "
+ " AND fac_gebruiker_alg_level_read < 9 "
+ " AND gg.prs_perslid_key = " + user_key
+ " )"
+ " AND (EXISTS " // Extra autorisatie
+ " (SELECT '' "
+ " FROM fac_groeprechten g, fac_gebruikersgroep gg "
+ " WHERE g.fac_groep_key = gg.fac_groep_key "
+ " AND (g.ins_discipline_key = d.ins_discipline_key OR g.ins_discipline_key IS NULL)"
+ " AND g.fac_functie_key = m.fac_functie_key"
+ " AND fac_gebruiker_prs_level_read < 9 "
+ " AND fac_gebruiker_alg_level_read < 9 "
+ " AND gg.prs_perslid_key = " + user_key + ")"
+ " OR m.fac_functie_key IS NULL)"
+ " )"
+ " OR (mi.fac_menuitems_rw = 'W' "
+ " AND EXISTS " // Systeemautorisatie
+ " (SELECT '' "
+ " FROM fac_groeprechten g, fac_gebruikersgroep gg "
+ " WHERE g.fac_groep_key = gg.fac_groep_key "
+ " AND (g.ins_discipline_key = d.ins_discipline_key OR g.ins_discipline_key IS NULL)"
+ " AND g.fac_functie_key = mi.fac_functie_key "
+ " AND fac_gebruiker_prs_level_write < 9 "
+ " AND fac_gebruiker_alg_level_write < 9 "
+ " AND gg.prs_perslid_key = " + user_key
+ " ) "
+ " AND (EXISTS " // Extra autorisatie
+ " (SELECT '' "
+ " FROM fac_groeprechten g, fac_gebruikersgroep gg "
+ " WHERE g.fac_groep_key = gg.fac_groep_key "
+ " AND (g.ins_discipline_key = d.ins_discipline_key OR g.ins_discipline_key IS NULL)"
+ " AND g.fac_functie_key = m.fac_functie_key"
+ " AND fac_gebruiker_prs_level_write < 9 "
+ " AND fac_gebruiker_alg_level_write < 9 "
+ " AND gg.prs_perslid_key = " + user_key + ")"
+ " OR m.fac_functie_key IS NULL)"
+ " ))) ";
}
lsql += " )";
lsql += " WHERE groep IS NOT NULL"; // veiligheidje
lsql += " AND fac_menu_key IN"
+ " ( SELECT fac_menu_key"
+ " FROM fac_menu"
+ " WHERE prs_perslid_key = " + user_key
+ " OR prs_perslid_key is null"
+ " )"
lsql += (mobileOnly ? " AND groep = " + MENU.MOB : "");
// Favorieten (groep=6) *voor* de rest van de zelfservice (groep=0)
lsql += " ORDER BY CASE WHEN groep = 6 OR groep = 5 THEN -1 ELSE groep END, fac_menu_volgnr, label, exploded ";
var loRs = Oracle.Execute( lsql );
// Verwerk de opties tot menu-array. Het is van belang dat er geen nodeloze
// items (zoals kop zonder items) in voorkomen, omdat zichtbaarheid
// van de groep op lengte>0 wordt bepaald
// Groepen --> Koppen --> Items
var Groepen = [];
while( !loRs.eof )
{
var groepnr = loRs("groep").value;
var orggroep = groepnr;
if (groepnr == MENU.TAB) // Pinned tabs gaan onder favorieten in non-desktop mode
groepnr = MENU.FAV;
if (groepnr == MENU.FAV)
groepnr = MENU.PERS; // Daar stoppen we de favorieten onder
if (!mobileOnly)
{
var mlabel = fac.localstring(loRs("label").value);
if (loRs("exploded").Value)
mlabel += " " + loRs("exploded").Value;
if (!Groepen[groepnr])
Groepen[groepnr] = { Koppen: []};
var grp = Groepen[groepnr];
// De allereerste van iedere groep MOET een kop worden
if (loRs("fac_menu_level").value == 1)
{
grp.Koppen.push({ Items: [],
label: mlabel,
info: loRs("fac_menu_info").value,
image: loRs("image").value,
href:loRs("url").value
});
}
else
{
if (!grp.Koppen.length)
{ // Deze eerste is geen kop; verzin er zelf eentje bij.
var kop_label = (orggroep == MENU.FAV || orggroep == MENU.TAB ? L("lcl_current_fav") : "<!--auto menukop-->");
var image = (orggroep == MENU.FAV || orggroep == MENU.TAB ? "fa-heart" : null);
grp.Koppen.push({ Items: [],
label: kop_label,
startopen: true,
info: null,
image: image, //null,
href:null
});
}
var kop = grp.Koppen[grp.Koppen.length-1];
if (kop.Items.length && kop.Items[kop.Items.length-1].href == loRs("url").value && kop.Items[kop.Items.length-1].name == loRs("label"))
{
// skip it
}
else
{
var xurl = "";
var url = loRs("url").Value;
var filters = loRs("filter").Value;
if (url)
{
url = url.replace(/\?$/, "");
url = url.replace(/\&$/, "");
xurl = url + ( url
? (url.indexOf("?") > -1 ? "&" : "?") + (filters ? "fcltfilters=" + safe.url(filters) : "")
: ""
);
}
kop.Items.push({name: mlabel,
href: xurl,
info: loRs("fac_menu_info").value,
depth: loRs("depth").value,
img: loRs("image").value,
menu_key: loRs("fac_menu_key").Value,
group: groepnr,
orggroep: orggroep
})
}
}
}
else // mobileOnly
{
var mlabel = fac.localstring(loRs("label").value);
var murl = loRs("url").value;
// Alleen de eerste keer een groep aanmaken voor mobile menu.
if (!Groepen[groepnr])
Groepen[groepnr] = {Koppen: []};
var grp = Groepen[groepnr]; // altijd 3
// Voor elk record een kop en item aanmaken
if (grp.Koppen.length && grp.Koppen[grp.Koppen.length-1].Items[0].href == murl)
{
// skip it
}
else
{
grp.Koppen.push({ Items: [],
label: mlabel
});
var kop = grp.Koppen[grp.Koppen.length-1];
kop.Items.push({name: mlabel,
info: loRs("fac_menu_info").value,
href: murl,
img: loRs("image").value,
menu_key: loRs("fac_menu_key").Value,
group: groepnr,
orggroep: orggroep
});
}
}
loRs.MoveNext();
}
loRs.close();
// Loopje om lege Groepen/ Koppen te verwijderen
for (var grp in Groepen)
{
for (var kop=0; kop < Groepen[grp].Koppen.length; kop++)
{
if (!Groepen[grp].Koppen[kop].Items.length && !Groepen[grp].Koppen[kop].href)
{
Groepen[grp].Koppen.splice(kop, 1);
kop --;
}
}
}
return Groepen;
}
// Genereer het menu volgens mode pmode
// 1 = traditional
// 2 = tablet like
// 3 = portal style ("loket")
// 4 = mobile style
function generateMenu (pmode, groep) //groep alleen voor mode 3
{
if (pmode == 1) {
var menuitems = fillMenuArray();
if (menuitems) {
var menuTitleLength = 0;
var menuTitleString = "";
if ((menuitems[MENU.PERS] && menuitems[MENU.PERS].Koppen.length > 0) || (menuitems[MENU.FAV] && menuitems[MENU.FAV].Koppen.length > 0)) {
menuTitleLength++;
menuTitleString += '<li><a href="#PersFAC"><span class="menutab">' + L("lcl_menu_pers") + '</span></a></li>';
}
if ((menuitems[MENU.PROF] && menuitems[MENU.PROF].Koppen.length > 0)) {
menuTitleLength++;
menuTitleString += '<li><a href="#ProfFAC"><span class="menutab">' + L("lcl_menu_prof") + '</span></a></li>';
}
if ((menuitems[MENU.MGT] && menuitems[MENU.MGT].Koppen.length > 0)) {
menuTitleLength++;
menuTitleString += '<li><a href="#MgtFAC"><span class="menutab">' + L("lcl_menu_config") + '</span></a></li>';
}
var disp = menuTitleLength == 1 ? " noToggle\" style=\"display:none\"" : "\"";
// ui-helper-clearfix wordt er straks door jQuery opgezet bij $("#menutabs").tabs();
// CONN#19264 Door het alvast zelf te doen wordt een reproduceerbare crash voorkomen!
%>
<ul class="ui-tabs-nav ui-helper-clearfix<% Response.Write(disp); %>><%
Response.write(menuTitleString);
%></ul>
<div class="ui-layout-content">
<%
if ((menuitems[MENU.PERS] && menuitems[MENU.PERS].Koppen.length > 0)) {
%><div id="PersFAC" class="ui-tabs-panel ui-tabs-hide"><%
Response.Write("<div class='filtermenukop'>" + L("lcl_menu_pers") + "</div>");
if (menuitems[MENU.PERS].Koppen.length > 0)
CreateMenuGroep(menuitems[MENU.PERS].Koppen, pmode); // zelfservice
%></div><%
}
if ((menuitems[MENU.PROF] && menuitems[MENU.PROF].Koppen.length > 0)) {
%><div id="ProfFAC" class="ui-tabs-panel"><%
Response.Write("<div class='filtermenukop'>" + L("lcl_menu_prof") + "</div>");
CreateMenuGroep(menuitems[MENU.PROF].Koppen, pmode);
%></div><%
}
if ((menuitems[MENU.MGT] && menuitems[MENU.MGT].Koppen.length > 0)) {
%><div id="MgtFAC" class="ui-tabs-panel ui-tabs-hide"><%
Response.Write("<div class='filtermenukop'>" + L("lcl_menu_config") + "</div>");
CreateMenuGroep(menuitems[MENU.MGT].Koppen, pmode);
%></div>
<% } %>
</div>
<% // Als er ergens iets is dichtgeklapt dan wordt het tijd voor een zoekveld
if (menuitems[MENU.PERS].Koppen.length > S("menu_collapse_threshold") ||
menuitems[MENU.PROF].Koppen.length > S("menu_collapse_threshold") ||
menuitems[MENU.MGT].Koppen.length > S("menu_collapse_threshold") )
{
Response.Write("<input id='menufilter' type='text' placeholder='" + L("lcl_menufilter") + "'>");
}
%> <%
}
}
if (pmode == 2) {
var menuitems = fillMenuArray();
if (menuitems) {
%><ul class="ui-tabs-nav ui-helper-clearfix">
<li><a href="#tabletmenu"><span class="menutab"><%=L("lcl_body_portal")%></span></a></li><%
if (menuitems[MENU.PERS].Koppen.length > 0) {
%><li><a href="#tPersFAC"><span class="menutab"><%=L("lcl_menu_pers")%></span></a></li><%
}
if (menuitems[MENU.PROF].Koppen.length > 0) {
%><li><a href="#tProfFAC"><span class="menutab"><%=L("lcl_menu_prof")%></span></a></li><%
}
if (menuitems[MENU.MGT].Koppen.length > 0) {
%><li><a href="#tMgtFAC"><span class="menutab"><%=L("lcl_menu_config")%></span></a></li><%
}
%></ul>
<div class="ui-layout-content">
<div id="tabletmenu">
<script>
function gototab(t)
{
$("[href='"+t+"']").trigger("click");
}
</script>
<div id="twelkom"></div>
<div id="myactions">
<div id="myactionscontainer">
<iframe src="fac_list.asp?urole=fe" id="myactionsframe" name="myactionsframe" autorefresh="1"
width="100%" marginwidth="0" marginheight="0" frameborder="0" scrolling="auto" onload="FcltMgr.iframeLoaded(this)">
</iframe>
</div>
</div>
</div>
<div id="tPersFAC"><div id="portalmenu"><%
generatePortalmenu(menuitems[MENU.PERS].Koppen);
%></div></div>
<div id="tProfFAC"><div id="portalmenu"><%
generatePortalmenu(menuitems[MENU.PROF].Koppen);
%></div></div>
<div id="tMgtFAC"><div id="portalmenu"><%
generatePortalmenu(menuitems[MENU.MGT].Koppen);
%></div></div>
</div>
<%
}
}
if (pmode == 3) {
var menuitems = fillMenuArray(true); // true is portalOnly
if (menuitems && menuitems[groep] && menuitems[groep].Koppen ) {
%><div id="portalmenu">
<h2><%=L("lcl_facilitor_portalwelcome"+groep)%></h2>
<% generatePortalmenu(menuitems[groep].Koppen)
%>
</div><%
}
}
if (pmode == 4) {
var menuitems = fillMenuArray(false, true); // mobileOnly
var kop = [];
if (menuitems && menuitems[MENU.MOB])
kop = menuitems[MENU.MOB].Koppen;
if (S("mobile_imageportal"))
{ // Menu wordt een grid met images
var actions = "<div class='ui-grid-b'>";
for (var i=0; i<kop.length; i++)
{
var itm = kop[i].Items[0];
var protocol = itm.href.split(":")[0];
if (protocol.length == 1 || !protocol.match(/^http|https|mailto|tel$/))
{
itm.href = "../../" + itm.href;
if (itm.menu_key > 0)
{
itm.href += itm.href.indexOf("?") > -1?"&":"?";
itm.href += "from_menu_key=" + itm.menu_key;
}
}
var colnr;
switch (i%3)
{
case 0 : colnr='a'; break;
case 1 : colnr='b'; break;
case 2 : colnr='c'; break;
}
actions += "\n<div class='ui-block-" + colnr + " micon'>"
+ "<a href='" + safe.htmlattr(itm.href) + "' data-ajax='false'>"
+ showImage(itm.img, "miconimg")
+"</a>"
+ "<div class='imgCaption'>" + safe.html(itm.name) + "</div>"
+ "</div>";
}
actions += "</div>";
}
else
{ // Geen plaatjes bij menuitems gevonden, dus menu wordt een lijst.
var actions = "<ul data-role='listview' data-inset='true' data-theme='b' data-dividertheme='b'>";
for (var i=0; i<kop.length; i++)
{
var itm = kop[i].Items[0];
var protocol = itm.href.split(":")[0];
if (protocol.length == 1 || !protocol.match(/^http|https|mailto|tel$/))
itm.href = "../../" + itm.href;
actions += "\n<li><a href='" + safe.htmlattr(itm.href) + "' data-ajax='false'>" + safe.html(itm.name) + "</a></li>";
}
actions += "</ul>";
}
Response.Write(actions);
}
}
%>