432 lines
20 KiB
Plaintext
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> </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")%> <% = L("lcl_dirty") %></td></tr>
|
|
<% if (urole != 'fe') { %>
|
|
<tr><td><%=I("fa-wrench")%> <% = L("lcl_complains") %></td></tr>
|
|
<tr><td><%=I("fa-television")%> <% = L("lcl_reserved_object") %></td></tr>
|
|
<tr><td><%=I("fa-cutlery")%> <% = 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> <%=L("lcl_res_flag"+flagkey)%></td></tr><%
|
|
}
|
|
}
|
|
%>
|
|
</table>
|
|
</div>
|
|
</body>
|
|
</html>
|