Files
Facilitor/APPL/RES/res_search_plan_room.asp
Erik Groener b46fdb89e0 UWVA#61386 Extra release 2019.2 voor UWV
svn path=/Website/branches/v2019.2/; revision=45885
2020-02-18 15:56:54 +00:00

432 lines
20 KiB
Plaintext

<%@ language = "JavaScript" %>
<% /*
$Revision$
$Id$
File: res_search_plan_room.asp
Remark: Toon ruimte planbord
Parameters:
Context: vanuit res_search.asp
*/ %>
<!-- #include file="../Shared/common.inc" -->
<!-- #include file="../shared/iface.inc" -->
<!-- #include file="../Shared/discxalg3d.inc"-->
<!-- #include file="res_plan_room.inc" -->
<!-- #include file="res.inc" -->
<%
FCLTHeader.Requires({plugins: ["jQuery"],
js : ["jquery-ui.js"], // Voor slepen
css : ["../res/res.css"]});
var res_ruimte_key = getQParamInt("res_ruimte_key", -1); // Filter specifieke vergaderzaal
var vis = getQParamInt("vis", 0);
var srtact = getFParamInt("srtact", -1);
var autosearch = getFParamInt("autosearch", 0) == 1;
var urole = getQParamSafe("urole");
var autfunction = "";
switch(urole)
{
case "fe": autfunction = "WEB_RESUSE";
break;
case "fo": autfunction = "WEB_RESFOF";
break;
case "bo": autfunction = "WEB_RESBOF";
break;
case "mi": autfunction = "WEB_RESBAC";
break;
}
var authparams = user.checkAutorisation(autfunction);
//dateoffset wordt voor deeplinking gebruikt!(?)
dateoffset = getQParamInt("dateoffset",0)*24*60*60*1000;
var defDate = new Date();
defDate.setDate(defDate.getDate() + dateoffset);
// Bij wijze van uitzondering mogen date_from en date_to ook uit de QueryString komen voor deeplinking
var date_from = getQParamDate("date_from", getFParamDate("date_from", defDate));
var date_to = getQParamDate("date_to", getFParamDate("date_to", date_from));
var samedate = (date_from.midnight().getTime() == date_to.midnight().getTime());
var ruimtecat = getFParamIntArray("roomcatmulti", []); // Ruimte soort catalogus
var act_key = getFParamInt("act", -1);
if (act_key > 0)
{ // Voeg de disciplines van de activiteit aan de ruimtecatalogus toe.
var sql = "SELECT res_discipline_key"
+ " FROM res_activiteitdiscipline"
+ " WHERE res_activiteit_key = " + act_key;
var oRs = Oracle.Execute(sql);
while (!oRs.eof)
{
ruimtecat.push(oRs("res_discipline_key").value);
oRs.MoveNext();
}
oRs.Close();
}
var fnStep;
if (getFParam("fnStep", ""))
{
fnStep = "parent.fnStepPlanbord";
}
// Bereken dynamisch breedte blokjes
// PAS OP: identiek houden aan res_plan_room.inc!
var width_px = getQParamInt("width_px", 1024);
var nr_days = Math.round(1+(date_to.midnight() - date_from.midnight())/24/60/60/1000);
hour_px = res.hour_px(width_px - 400, nr_days);
%>
<html style='overflow:scroll'>
<head>
<% FCLTHeader.Generate(); %>
<% // Ruimtes mogen alleen horizontaal gewijzigd worden, je mag geen andere ruimte kiezen in het planbord
// Dat heeft mogelijk veel te veel consequenties
%>
<style>
div.ui-resizable-handle { xbackground-color:red;
background-image: url(../localscripts/theme/images/ui-icons_888888_256x240.png);
background-position: -4px -225px; }
div.ui-resizable-w { left: 0px; }
div.ui-resizable-e { right: 0px; }
</style>
<script type="text/javascript">
<% // TODO: Wel erg hardcoded
var extern_flex = customerId + " gebruiker: " + user.naam()
+ "\nE-mail:" + user.prs_perslid_email()
+ "\n" + customerId + " kostenplaats: " + user.kpn_string();
%>
var extern_flex = "Flex voor externen=<%=safe.jsstring(extern_flex)%>";
window.lastFilter = "";
function doFilter()
{
var valThis = $("#autofilter").val().toLowerCase();
// Zolang je *meer* letters tikt hoeven we altijd alleen te hiden
// Dat is op IE11 veel sneller dan toggle
var hideOnly = valThis.indexOf(window.lastFilter) == 0;
$("table.planbord > tbody > tr").each(function() {
var text = $(this).text().toLowerCase();
var found = text.indexOf(valThis) > -1;
if (!found)
this.style.display = "none"; // Veel sneller met IE11 dan $(this).hide();
else if (!hideOnly)
$(this).show();
});
window.lastFilter = valThis;
if (typeof updateTableHeaders === "function")
updateTableHeaders();
if (!hideOnly)
FcltMgr.resized();
}
$(function()
{
if ($("table.planbord > tbody > tr").length > 4)
{
var $tableBlock = $("table.planbord").closest("div#list");
var $frameHeader = $tableBlock.prev(".fcltframeheader");
$frameHeader.find("#iframerextratitle").after("<input id='autofilter' type='text' placeholder='"+L("lcl_autofilter")+"'>");
$("#autofilter").click(function (e) { e.stopPropagation() })
.keyup(function (e) {
if (e.which == 27) {
$("#autofilter").val("");
}
delayed(200, doFilter);
});
}
});
function res_print()
{
FcltMgr.setHeaderExtraTitle("<%=toDateString(date_from)%>");
window.print();
}
function res_change()
{
var hour_px = $("#tab_room_sched")[0].getAttribute("hour_px");
var blokje = hour_px * <%=safe.jsfloat(S("res_h"))%>;
var startx; // start positie van het slepen (left);
var starty; // start positie van het slepen (top);
$('div.gepland:not(.res_nietvrij,.res_lunchblok,.overflowright,.overflowleft.continueright,.continueleft,.extern,.res_extern)').resizable(
{ containment: '#tab_room_sched',
grid: [blokje, 12],
handles: 'e, w',
//ghost: true,
start: function (event, ui)
{
window.beingdragged = true; /* to prevent onclick */
},
stop: function (event, ui)
{
var dvan = Math.floor((ui.position.left - ui.originalPosition.left) / blokje + 0.5);
var dwidth = Math.floor((ui.size.width - ui.originalSize.width) / blokje + 0.5);
var elm = ui.originalElement;
FcltMgr.stopPropagation(event);
//window.beingdragged = false; doet rsv_click wel
var data = { rsv_ruimte_key: elm[0].getAttribute("rsv_key"),
dvan: dvan,
dwidth: dwidth
};
<% protectRequest.dataToken("data"); %>
$.post("res_update_room.asp",
data,
function (json)
{
if (json.message) FcltMgr.alert(json.message);
if (json.info)
FcltMgr.setHeaderExtraTitle(json.info);
else
FcltMgr.setHeaderExtraTitle("");
if (json.success)
{
ui.originalElement[0].title="";
ui.originalElement.removeClass(json.removeClass).addClass(json.addClass)
}
else
{
ui.originalElement.width(ui.originalSize.width);
ui.originalElement.css('left', ui.originalPosition.left);
}
},
"json");
}
});
$('.plantd').droppable(
{ drop: function(event, ui)
{
var jtr = $(this).closest('tr');
// Externe ruimten mogen niet versleept worden en ruimten mogen niet naar een externe ruimte versleept worden.
if (ui.draggable.closest('tr').hasClass("extern") || jtr.hasClass("extern"))
return;
// Langs welke as wordt er nu verschoven?
// X-as: ruimte blijft hetzelfde (res_ruimte_key blijft hetzelfde)
// Y-as: Tijd blijft hetzelfde (fres_van blijft hetzelfde)
var axis = ui.draggable.draggable("option", "axis");
// LET OP: Het verschoven blok is met of zonder schoonmaaktijd. En schoonmaaktijd wordt in het planbord niet goed bepaald en is altijd 1 blokje
old_dx = startx - jtr.find('.plantd').offset().left;
new_dx = ui.offset.left - jtr.find('.plantd').offset().left;
old_dx = old_dx / <%=hour_px%> + <%=safe.jsfloat(S("res_t1"))%>;
new_dx = new_dx / <%=hour_px%> + <%=safe.jsfloat(S("res_t1"))%>;
var rsv_ruimte_key = ui.draggable[0].getAttribute("rsv_key"); // nieuwe rsv_ruimte_key
var new_res_ruimte_key = $(this).closest('tr')[0].id; // nieuwe res_ruimte_key
var old_res_ruimte_key = ui.draggable.closest('tr')[0].id; // oorspronkelijke res_ruimte_key
// Als er niets gewijzigd is dan modal popup scherm niet tonen
var noChange = (axis == "x" && old_dx == new_dx) || (axis == "y" && new_res_ruimte_key == old_res_ruimte_key)
if (new_res_ruimte_key &&
!noChange)
{
var url = "./res_update_room_drag.asp?rsv_ruimte_key=" + rsv_ruimte_key
+ "&res_ruimte_key=" + (axis == "x"? old_res_ruimte_key : new_res_ruimte_key)
+ "&fres_van=" + (axis == "y"? old_dx : new_dx); // LET OP: dx is met of zonder schoonmaaktijd. En schoonmaaktijd wordt in het planbord niet goed bepaald en is altijd 1 blokje
FcltMgr.openModalDetail(url,
"",
{ callback: function (data)
{
if (data.refresh)
{
<% if (fnStep)
Response.Write(fnStep + "(0, 0, 1)"); // hersubmit vanuit parent
%>
}
}
}
);
}
}
});
$('table.planbord').each(function ()
{
var x, y;
var element = $(this).find('div.gepland:not(.overflowleft,.overflowright,.res_extern)');
element.draggable(
{ cursor: 'crosshair' ,
containment: $(this), //.find(".plantd.reserv"),
start: function(event, ui)
{
window.beingdragged = true; /* to prevent onclick */
x = event.originalEvent.pageX;
y = event.originalEvent.pageY;
startx = ui.offset.left; // start positie van het slepen (left);
starty = ui.offset.top; // start positie van het slepen (top);
},
drag: function(event, ui)
{
if (x && y)
{
axis = Math.abs(event.originalEvent.pageX - x) > Math.abs(event.originalEvent.pageY - y) ? 'x' : 'y';
element.draggable('option', 'axis', axis);
x = y = null;
}
},
stop: function()
{
x = y = null;
element.draggable('option', 'axis', false);
},
helper: 'clone',
opacity: 0.50,
appendTo: this,
grid: [<%=hour_px*S("res_h")%>, 19],
scroll: false//,
//axis: "xy"
});
});
$("#btnchange").html(L("lcl_res_edit_inplanbord"))
.addClass("noHover")
.removeClass("btn_disabled"); // Remove disabled CSS
return true; // But keep button onClick disabled
}
<% if (autosearch && samedate)
{ %>
$(function()
{
res_change();
});
<% } %>
</script>
</head>
<body id="planbody">
<%
var buttons = [];
if (authparams.PRSwritelevel < 9 && authparams.ALGwritelevel < 9 && samedate)
buttons.push({ icon: "wijzigen.png", title: L("lcl_change"), action: 'res_change()', singlepress: true, id: "btnchange" });
buttons.push({ icon: "legenda.png", title: L("lcl_res_legenda"), action: 'openLegenda()' });
buttons.push({ icon: "print.png", title: L("lcl_print_table"), action: 'res_print()' });
IFRAMER_HEADER(L("lcl_planboard"), buttons);
%>
<div id="list">
<%
var params = { id: "tab_room_sched",
res_van: date_from,
res_tot: date_to,
reg: getFParamInt("regiokey", -1),
dist: getFParamInt("districtkey", -1),
loc: getFParamInt("locatiekey", -1),
bld: getFParamInt("gebouwkey", -1),
ver: getFParamInt("verdiepingkey", -1),
rui: getFParamInt("ruimtekey", -1),
ruimtecat: ruimtecat,
srtact: (srtact != -1? srtact : null),
act: act_key,
res_ruimte_key: (res_ruimte_key != -1? res_ruimte_key : null),
authparams: authparams,
host_key: getFParamInt("sHost_key",-1),
contact_key: getFParamInt("sName_key",-1),
urole: urole,
fnStep: fnStep,
width_px: width_px };
var plan_rooms_info = res.plan_rooms_info(params);
var plan_bezet_info = res.plan_bezet_info(params);
var nnregels = make_plan_room(plan_rooms_info, plan_bezet_info, params);
%>
</div>
<table>
<%
// Overzicht externe ruimtes
var sql = res.getremotes_sql(autfunction);
var oRs = Oracle.Execute(sql);
// Als je hier weet dat er intern niks was zou je deze externe opties initieel opengeklapt willen?
while( !oRs.eof )
{
%>
<tr>
<td>
<div class="resexternline closed">
<span class="resexterntitle" onclick="$(this.parentElement).toggleClass('closed');FcltMgr.resized()">
<%= L("lcl_res_extern_prefix") + Server.HTMLencode(oRs("ins_discipline_omschrijving").Value)%>
</span>
<div class="resexterndiv">
<%
var url = oRs("res_disc_params_remoteurl").Value + "&API=RESINFO";
var xparams = { res_van: params.res_van,
res_tot: params.res_tot,
res_vis: params.vis,
prs_externId: customerId + "_" + String(user_key)
}
if (params.loc) // Aan de andere kant kennen we onze key niet, daarmo via plaats.
xparams.alg_locatie_plaats = new Locatie(params.loc).alg_locatie_plaats();
xparams.request = "plan_rooms_info";
var plan_rooms_info = HTTP.getJSON(url, { data: xparams }).plan_rooms_info;
xparams.request = "plan_bezet_info";
var plan_bezet_info = HTTP.getJSON(url, { data: xparams }).plan_bezet_info;
xparams.extern = true;
params.disc_key = oRs("ins_discipline_key").Value;
params.noclicker = true; // die hebben we al gehad.
if (plan_rooms_info && plan_bezet_info)
nnregels += make_plan_room(plan_rooms_info, plan_bezet_info, params);
%>
</div>
</div>
</td>
</tr>
<%
oRs.MoveNext();
}
oRs.close();
%>
</table>
<%
// Genereer ruimte voor popupje bij kleine planborden
while (nnregels < 8)
{
Response.Write("<p>&nbsp;</p>");
nnregels ++;
}
%>
<!-- LEGENDA -->
<script type="text/javascript">
function openLegenda()
{
var myPosition = "right top+30";
if (elems.$originalHeaderRow && elems.$originalHeaderRow.length)
myPosition = "right-15 top+"+(parseInt(elems.$fcltFrameHeader.css("top"))+30);
params = { width: 170,
resizable: false,
position: { my: "right top", at: myPosition },
title: "<%=L("lcl_res_legenda")%>",
create: FcltMgr.fnCreateCloseButton("div#legenda")
}
$('div#legenda').dialog(params).dialog('open');
FcltMgr.resized();
}
</script>
<div id="legenda" style="display:none; line-height: 30px;">
<table id="planbordlegenda">
<tr><td class="res_definitief"><%= L("lcl_def") %></td></tr>
<tr><td class="res_optie"><%= L("lcl_optie") %></td></tr>
<tr><td class="res_definitief_eigen"><%= L("lcl_def_own") %></td></tr>
<tr><td class="res_optie_eigen"><%= L("lcl_optie_own") %></td></tr>
<tr><td class="res_vervallen"><%= L("lcl_vervallen") %></td></tr>
<tr><td class="res_blok"><%= L("lcl_blokkade") %></td></tr>
<tr><td class="res_nietvrij"><%= L("lcl_niet_beschikbaar") %></td></tr>
<tr><td class="res_extern"><%= L("lcl_reservation_extern") %></td></tr>
<tr><td class="res_fatalicon"><%=I("fa-times")%>&nbsp;<% = L("lcl_dirty") %></td></tr>
<% if (urole != 'fe') { %>
<tr><td><%=I("fa-wrench")%>&nbsp;<% = L("lcl_complains") %></td></tr>
<tr><td><%=I("fa-television")%>&nbsp;<% = L("lcl_reserved_object") %></td></tr>
<tr><td><%=I("fa-cutlery")%>&nbsp;<% = L("lcl_reserved_cons") %></td></tr>
<% }
if (S("res_reservering_flags") > 1)
{
for (var flagkey=1; flagkey < S('res_reservering_flags'); flagkey++)
{
%><tr><td><i class='fa fa-fw fa-circle resflag<%=flagkey%>'></i>&nbsp;<%=L("lcl_res_flag"+flagkey)%></td></tr><%
}
}
%>
</table>
</div>
</body>
</html>