Files
Facilitor/APPL/RES/res_plan_obj.inc
Gijs Wassink 259ffbb037 FCLT#66362: Accessibility score verbeteren
svn path=/Website/trunk/; revision=51025
2021-04-22 13:46:05 +00:00

510 lines
21 KiB
HTML
Raw Blame History

<% /*
$Revision$
$Id$
File: res_plan_obj.inc
Description: Het echte genereren van het planbordje voor objecten
via functie make_plan_obj() die een kale HTML-table oplevert
Parameters: params: hour_px
reg_key
dist_key
loc_key
geb_key
ver_key
rui_key
rsv_ruimte_key: als meegegeven dan 'edit-mode'
res_deel_key: default keuze voor nieuwe reservering
Context: Indirect ajax in res_load_plan_obj.asp
of rechtstreeks in res_search_plan_obj.asp
Notes: Zie res_load_cat.asp voor de catering en res_plan_room.inc voor ruimtes
*/
FCLTHeader.Requires({ js: [rooturl+"/appl/res/res_plan.js", "date.js"] });
function make_plan_obj(disc_key, res_van, res_tot, params)
{
mkDiv = function (theClass, h_start, h_end, theClick, theMouse, theOther, prepost_time, flag_status)
{
var div;
var overleft="";
var overright="";
if (h_start<S("res_t1"))
{
h_start = S("res_t1")-S("res_h");
if (dagen > 0)
overleft = " continueleft";
else
overleft = " overflowleft";
}
if (h_end>S("res_t2"))
{
h_end = S("res_t2")+S("res_h");
if (dagen < nr_days-1)
overright = " continueright";
else
overright = " overflowright";
}
var px_start = Math.round((h_start-S("res_t1"))*params.hour_px + 1); // 1 px speling
var px_end = Math.round((h_end-S("res_t1"))*params.hour_px);
var px_width = px_end - px_start;
var theStyleLeft = "";
var theStyleRight = "";
var res_flag = "";
if (flag_status > 0)
{
res_flag = "<span class='respl resflag"+flag_status+"'>" + I("fa-dot-circle", {fastyle: "fas"}) + "</span>";
}
// Perhaps cleaning time, (TODO delen? alleen optie en definitief)
if (prepost_time > 0) // && (ar[ci].fo_status == 1 || ar[ci].fo_status == 2))
{
theClass += " res_cleaning";
// maximaal kwartier 'doorschieten' links/rechts
var preclean = Math.min(prepost_time, h_start - S("res_t1") + 0.25);
var postclean = Math.min(prepost_time, S("res_t2") - h_end + 0.25);
if ( postclean > 0 && overright == "")
theStyleRight = "border-right-width:"+Math.round(params.hour_px * postclean - 1)+"px;"
if ( preclean > 0 && overleft == "")
{
var precleanpx = Math.round(params.hour_px * preclean - 1);
theStyleLeft = "border-left-width:"+precleanpx+"px;"
if (px_start >= 0)
{
px_start -= precleanpx; // border is 1px minder, maar wel altijd een kwartier
px_width += 1; // border is 1px minder
}
}
}
if (overleft!=""&&overright!="")
{ // Maak twee divjes, eentje links en eentje rechts.
// HTML kan maar <20><>n background image tegelijk aan
div = "<div class='"+theClass+overleft+"'"
+(theMouse||"")
+(theClick||"")
+(theOther||"")
+" style='left:"+px_start+"px;width:"+(px_width/2)+"px;"+theStyleLeft+"'>" + res_flag
+"&nbsp;</div>";
div += "<div class='"+theClass+overright+"'"
+(theMouse||"")
+(theClick||"")
+(theOther||"")
+" style='left:"+(px_start+px_width/2)+"px;width:"+(px_width/2)+"px;"+theStyleRight+"'>"
+"&nbsp;</div>";
}
else
{
div = "<div class='"+theClass+overleft+overright+"'"
+(theMouse||"")
+(theClick||"")
+(theOther||"")
+" style='left:"+px_start+"px;width:"+px_width+"px;"+theStyleLeft+theStyleRight+"'>" + res_flag
+"&nbsp;</div>";
}
return { div: div, overleft: overleft, overright: overright };
}
params = params || {};
params.hour_px = params.hour_px || 48;
params.rsv_ruimte_key = params.rsv_ruimte_key || -1;
var res_h_px = params.hour_px * S("res_h");
if (params.srtact)
lcl.set_dialect(params.srtact, "RES_SRTACTIVITEIT_KEY");
readwrite=(authparams&&authparams.ALGwritelevel<9); // Ondersteun (FE) gebruikers met *alleen* FO-leesrechten: kijken planbord
if (params.rsv_ruimte_key>0) // single-reservering mode
{
sql = "SELECT ru.res_ruimte_begintijd"
+ ", ru.res_ruimte_eindtijd"
+ ", rr.alg_ruimte_key"
+ ", ro.res_ruimte_key"
+ " FROM res_v_aanwezigruimte ru"
+ ", res_rsv_ruimte rr"
+ ", res_ruimte_opstelling ro"
+ " WHERE ru.res_ruimte_key = ro.res_ruimte_key"
+ " AND ro.res_ruimte_opstel_key = rr.res_ruimte_opstel_key"
+ " AND rr.res_rsv_ruimte_key = " + params.rsv_ruimte_key;
oRs = Oracle.Execute(sql);
if (!oRs.eof)
{
var alg_ruimte_key = oRs("alg_ruimte_key").value; // de eerste
var res_ruimte_key = oRs("res_ruimte_key").value;
// Als de ruimte maar beperkt open is gaan we rekenen met een krappere S("res_t1")/res_t2
var res_ruimte_begintijd = oRs("res_ruimte_begintijd").Value||S("res_t1");
var res_ruimte_eindtijd = oRs("res_ruimte_eindtijd").Value||S("res_t2");
if (res_ruimte_begintijd > res_ruimte_eindtijd) res_ruimte_begintijd = res_ruimte_eindtijd;
if (res_ruimte_begintijd > S("res_t1")) settings.overrule_setting("res_t1", res_ruimte_begintijd);
if (res_ruimte_eindtijd > S("res_t2")) settings.overrule_setting("res_t2", res_ruimte_eindtijd);
}
else // CV reserverering, altijd S("res_t1")-res_t2
{
res_ruimte_key = -1;
sql = "SELECT alg_ruimte_key"
+ " FROM res_rsv_ruimte"
+ " WHERE res_rsv_ruimte_key = " + params.rsv_ruimte_key;
oRs = Oracle.Execute(sql);
var alg_ruimte_key = oRs("alg_ruimte_key").value;
}
}
var sql;
var dparams = { res_van: res_van,
res_tot: res_tot,
disc_key: disc_key
}
var existing_res = res.plan_deel_bezet_info(dparams);
var nr_days = Math.round(1+(res_tot.midnight() - res_van.midnight())/24/60/60/1000);
%>
<div id='timetip'></div>
<table id="table_dis<%=disc_key%>"
class="compressed tab_obj_sched planbord planbord<%=params.hour_px%> <%=nr_days>1?" multiday":""%>"
<% if (params.rsv_ruimte_key<0) { // Click om een nieuwe deelreservering aan te maken
var dt = res_van.getTime();
%>
onclick="obj_table_click(event,new Date(<%=dt%>), <%=params.hour_px%>, <%=safe.jsfloat(S("res_t1"))%>,'<%=urole%>')"
onmousemove="room_table_mouse(event,new Date(<%=dt%>), <%=params.hour_px%>, <%=safe.jsfloat(S("res_t1"))%>)"
onmouseout="$('#timetip').hide();"
<% } %>
><thead class="float-alone">
<tr style='height:36px;vertical-align:top;'>
<td><span style="float:left"><nobr><input id="autofilter-<%=disc_key%>" type="text" placeholder="filter..."></nobr></span></td>
<% Response.Write(res.build_planbord_tijdbalk(res_van, nr_days, hour_px, S("res_t1"), S("res_t2"), params.fnStep)); %>
</tr></thead>
<%
var select_fields = " r.res_deel_key"
+ ", " + lcl.xsqla('r.res_deel_opmerking', 'r.res_deel_key')
+ ", " + lcl.xsql('r.res_deel_omschrijving', 'r.res_deel_key')
+ " || CASE"
+ " WHEN (r.res_deel_vervaldatum IS NULL OR r.res_deel_vervaldatum > SYSDATE)"
+ " THEN ''"
+ " ELSE " + safe.quoted_sql(L("lcl_inactive_data_suffix"))
+ " END res_deel_omschrijving"
+ ", d.ins_alg_ruimte_key_org"
+ ", d.ins_discipline_key"
+ ", r.res_deel_prijs"
+ ", r.res_deel_image"
+ ", " + lcl.xsqla('r.res_deel_eenheid', 'r.res_deel_key')
+ ", res_disc_params_preposttime"
+ ", d.ins_deel_state"
+ ", d.ins_deel_key";
var group_by = " GROUP BY "
+ " r.res_deel_key"
+ ", r.res_deel_opmerking"
+ ", r.res_deel_omschrijving"
+ ", r.res_deel_vervaldatum"
+ ", d.ins_alg_ruimte_key_org"
+ ", d.ins_discipline_key"
+ ", r.res_deel_prijs"
+ ", r.res_deel_image"
+ ", r.res_deel_eenheid"
+ ", res_disc_params_preposttime"
+ ", d.ins_deel_state"
+ ", d.ins_deel_key"
+ " ORDER BY 3 "; // r.res_deel_omschrijving: Don't use column alias with UNION ...
// Iterate through all reservable objects (vertically) and show schedule for them (horizontally)
var sql1 = get_res_deel_sql(
{ rsv_ruimte_key: params.rsv_ruimte_key,
alg_ruimte_key: alg_ruimte_key,
res_ruimte_key: res_ruimte_key,
select_fields : select_fields,
reg_key : params.reg_key,
dist_key : params.dist_key,
loc_key : params.loc_key,
loc_key_arr : params.loc_key_arr,
geb_key : params.geb_key,
geb_key_arr : params.geb_key_arr,
ver_key : params.ver_key,
ver_key_arr : params.ver_key_arr,
rui_key : params.rui_key,
act_key : params.act_key,
sdisc : disc_key,
group_by: group_by,
autfunction : autfunction,
res_tot: res_tot
});
oRs = Oracle.Execute(sql1);
var cnt = 0;
var any_nofit = false;
while (!oRs.eof)
{ // Doorloop reserveerbare delen binnen filter
res_deel_key = oRs("res_deel_key").value;
res_deel_omschrijving = oRs("res_deel_omschrijving").value;
res_deel_prijs = oRs("res_deel_prijs").Value;
res_deel_eenheid = oRs("res_deel_eenheid").Value;
res_deel_image = oRs("res_deel_image").Value;
ins_deel_state = oRs("ins_deel_state").Value; // POC. ins_deel_statedate doet denk ik ook mee
var res_deel_opm2 = oRs("res_deel_opmerking").value;
var prepost_time = oRs("res_disc_params_preposttime").Value||0;
var ins_deel_key = oRs("ins_deel_key").value;
var showLendOut = false;
if (oRs("ins_alg_ruimte_key_org").value != null)
{
var authparamsINSFOF = user.checkAutorisation("WEB_INSFOF", true, + oRs("ins_discipline_key").Value); // cache't wel
if (authparamsINSFOF)
showLendOut = true;
}
if (res_deel_eenheid == null) res_deel_eenheid='';
else res_deel_eenheid='/'+res_deel_eenheid;
if( res_deel_prijs && res_deel_prijs != 0)
{
prijs_text = S("currency_pref") + safe.curr(res_deel_prijs)+S("currency_suff")+res_deel_eenheid;
}
else
{
prijs_text = '';
res_deel_prijs = 0.0;
}
var ar = existing_res[ins_deel_key]; // Bestaande reserveringen op dit deel
var ro = " readonly ", st = false;
if (params.rsv_ruimte_key>0) {
// check whether the current resource is reserved for the current reservation
var is_selected = false;
var is_nofit = false; // zouden we hier passen?
if (res_deel_key==params.res_deel_key) // default keuze
{
is_selected = true;
ro=false;
st = false;
};
for (ci=0; ar != null && ci<ar.length; ci++)
{
if (ar[ci].rsv_ruimte_key == params.rsv_ruimte_key)
{ // we zijn het zelf
is_selected = true;
// Indien het hetzelfde object (ins_deel_key) betreft maar niet hetzelfde reserverbaar deel (res_deel_key), dan disabled weergeven
ro = (ar[ci].res_status==6 || res_deel_key != ar[ci].res_deel_key? " disabled " : "");
st = (ar[ci].res_status==6 || res_deel_key != ar[ci].res_deel_key);
}
else
{
if (res_van.getTime() - prepost_time*60*60*1000 < ar[ci].res_tot.getTime()
&& res_tot.getTime() + prepost_time*60*60*1000 > ar[ci].res_van.getTime())
is_nofit = true; // Overlap!
}
}
any_nofit |= is_nofit;
}
%>
<tr class="<%=is_selected?' selected':''%><%=is_nofit?' res_nofit':''%>" id='<%=res_deel_key%>'>
<td class='label'
OnMouseOver="showOpmerking('#remark_obj<%=res_deel_key%>', event);"
OnMouseOut="$('#remark_obj<%=res_deel_key%>').hide();"
>
<% if (is_selected && res_deel_key!=params.res_deel_key ) // Als res_deel_key==params.res_deel_key komen we uit het
// planbord en hebben we hem nog niet echt
{ %>
<input name='has_<%=res_deel_key%>' type='hidden'>
<% } %>
<label>
<% if (params.rsv_ruimte_key>0) { %>
<input id='chk_<%=res_deel_key%>' name='chk_<%=res_deel_key%>'
type='checkbox' <%=is_selected?'checked':''%> <%=ro%>
<% if (!st) { %>
onClick="res_deel_click('<%=res_deel_key%>')"
<% } %>>
<% } txt = res_deel_omschrijving + (params.rsv_ruimte_key>0 ? '':(prijs_text?' ('+prijs_text+')':''))
var safe_txt = safe.html(txt.substr(0,25));
if (showLendOut)
safe_txt += "&nbsp;<span title='"+L("lcl_ins_islent_res")+"' style='position:absolute'>" + I("fa-thumbtack respl") + "</span>"; // de absolute voorkomt invloed op layout
//- zeker/daadwerkelijk bezet (&1)
//- zeker/daadwerkelijk vrij (&0)
//- functioneel bezet (bv &3 (met &2 = onzeker)), optioneel bv iemand is even weg maar nog binnen de toleranties (handdoekje leggen)
//- geblokkeerd (bv &5 bv moet schoongemaakt worden)
//- error (&128?)
var stateicon ="";
var statecolorclass ="";
if (ins_deel_state&128)
{
stateicon = "fa-exclamation-triangle";
statecolorclass = "sens-fatal";
}
else if (ins_deel_state&1)
{
stateicon = "fa-do-not-enter";
if (ins_deel_state&4)
{
statecolorclass = "sens-blocked";
stateicon = "fa-times-circle";
}
else if (ins_deel_state&2)
{
statecolorclass = "sens-uncertain";
stateicon = "fa-question-circle";
}
else
statecolorclass = "sens-occupied";
}
else if (ins_deel_state == 0)
{
stateicon = "fa-circle";
statecolorclass = "sens-free";
}
if (ins_deel_state) // POC
safe_txt += "<span "+(statecolorclass ? "class='sens-status "+statecolorclass+"' " :"")+"title='"+L("lcl_deel_state")+" "+safe.htmlattr(ins_deel_state)+"' style='position:absolute'>"
+ "&nbsp;"+I(stateicon, {fastyle: "fas"})
+ "</span>"; // de absolute voorkomt invloed op layout
var safe_tooltip = safe.html(res_deel_omschrijving);
if (res_deel_image)
{
safe_tooltip += "<br><br><img alt='" + safe.htmlattr(L("lcl_reservation")) + "' class='resdeelfoto' style='height:100px' theSrc='"+safe.htmlattr(S("res_image_path") + "deel/" + res_deel_image)+"'>"
}
if (res_deel_opm2)
safe_tooltip += "<br>" + safe.html(res_deel_opm2);
if (showLendOut)
safe_tooltip += "<br>" + L("lcl_ins_islent_res");
%>
<span title="<%=safe.htmlattr(txt)%>"><%=safe_txt%></span>
</label>
<div class="res_remark" id="remark_obj<%=res_deel_key%>">
<%=safe_tooltip%>
</div>
</td>
<%
divver = { overleft: "", overright: "" };
var vanmidnight = res_van.midnight().getTime(); // E<>n keer uitrekenen
var totmidnight = res_tot.midnight().getTime();
var rsv_key = 0;
var res_flag = 0;
for (dagen=0; dagen<nr_days; dagen++)
{
%>
<td class="plantd reserv"><div class="tddiv">
<%
// Maak een dummy res_nieuw aan die we eenvoudig aan kunnen zetten als we in selectie-mode zitten
// (niet voor planbord)
if (!params.planbord && !is_selected || res_deel_key==params.res_deel_key)
{
var h_start = (res_van - vanmidnight) /1000/60/60 - 24*dagen;
var h_end = (res_tot - totmidnight) /1000/60/60 + 24*(nr_days-1-dagen);
var new_divver = mkDiv("gepland res_nieuw", h_start, h_end);
Response.Write("\n"+new_divver.div);
}
for (ci=0; ar && ci<ar.length; ci++)
{
var h_start = (ar[ci].res_van - vanmidnight) /1000/60/60 - 24*dagen;
var h_end = (ar[ci].res_tot - totmidnight) /1000/60/60 + 24*(nr_days-1-dagen);
if (h_start>24 || h_end < 0)
continue;
var not_available = (urole=='fe' && !user.isCollega(ar[ci].contact_key));
if (res_deel_key != ar[ci].res_deel_key || ar[ci].dirtlevel > 0 || not_available)
statClass = "res_nietvrij";
else
statClass = { 1 : "res_optie",
2 : "res_definitief",
3 : "res_blok",
4 : "res_vervallen"}[ar[ci].status_fo_key ];
if (ar[ci].rsv_ruimte_key == params.rsv_ruimte_key && res_deel_key == ar[ci].res_deel_key)
statClass += " res_current";
if (ar[ci].dirtlevel & (res.dirtlevel.deel.notavailable | res.dirtlevel.deel.notallowed))
statClass += " res_fatal";
var theClass = statClass + " gepland";
if (ar[ci].dirtlevel & res.dirtlevel.ruimte.notavailable)
theClass += " res_fatal";
var rsv_ruimte_key = ar[ci].rsv_ruimte_key;
var rsv_deel_key = ar[ci].rsv_deel_key;
var alg_ruimte_key = isNaN(ar[ci].alg_ruimte_key) ? -1 :ar[ci].alg_ruimte_key;
var bez_key = ar[ci].bez_key;
res_flag = 0;
if (rsv_key != rsv_ruimte_key)
{
res_flag = ar[ci].res_flag;
rsv_key = rsv_ruimte_key;
}
var theClick = "";
var theMouse="";
if (bez_key > 0)
theMouse = " onMouseOver='setBezBezoekersTitle(this, "+bez_key+")'";
else
theMouse = " onMouseOver='setResRsvDeelTitle(this, "+rsv_deel_key+")'";
if (readwrite&&bez_key==-1&&params.rsv_ruimte_key<0)
{
theClick = ' onClick="rsv_click(this,\''+urole+'\');"'
theClass += " click";
}
if (not_available) // altijd fe, mag niet klikken
theClick = "";
divver = mkDiv(theClass, h_start, h_end, theClick, theMouse,
" rsv_key='" + rsv_ruimte_key +"' rsv_deel_key='" + rsv_deel_key + "'", prepost_time, res_flag);
Response.Write("\n"+divver.div);
}
%></div></td><%
if (dagen<nr_days-1) { %>
<td class="between"><div class="<%=divver.overright!=""?statClass:""%>">&nbsp;</div></td>
<% } else { %>
<td class="post <%=divver.overright%>"><div>&nbsp;</div></td>
<% } %>
<%
} // dagen
%> </tr>
<%
oRs.MoveNext();
} //end while
oRs.close();
%>
<tr>
<td></td>
<% Response.Write(res.build_planbord_tijdbalk(res_van, nr_days, hour_px, S("res_t1"), S("res_t2"))); %>
</tr>
</table>
<script>
if (typeof setFilter == "function")
{
setFilter();
}
else
{
$("input[id^=autofilter-", "table[id^=table_dis").hide();
}
</script>
<%
if (any_nofit)
{
%><div class="resplanbordlimited" onclick="$('#table_dis<%=disc_key%>').toggleClass('compressed');$(this).toggle();$(this).next().toggle();FcltMgr.resized(window);">
<a><%=L("lcl_res_show_full_obj_catalogus")%></a></div>
<div class="resplanbordlimited" style='display:none' onclick="$('#table_dis<%=disc_key%>').toggleClass('compressed');$(this).toggle();$(this).prev().toggle();FcltMgr.resized(window);">
<a><%=L("lcl_res_show_half_obj_catalogus")%></a></div><%
}
}
%>