diff --git a/APPL/Localscripts/iface.js b/APPL/Localscripts/iface.js index 5a0746b76e..ebca2c8a46 100644 --- a/APPL/Localscripts/iface.js +++ b/APPL/Localscripts/iface.js @@ -772,8 +772,11 @@ function isGoodNumber(str, intOnly, posOnly, numLen, numDec) function validateField(thisObj, valid, errorMsg) { - var hasIconFollower = $(thisObj).next('i.fa').length; - var $afterThisObj = hasIconFollower ? $(thisObj).next('i.fa') : $(thisObj); + var nextIsTimeHolder = $(thisObj).next("div.time-holder").length; + var $afterThisObj = nextIsTimeHolder ? $(thisObj).next("div.time-holder") : $(thisObj); + + var hasIconFollower = $afterThisObj.next('i.fa').length; + $afterThisObj = hasIconFollower ? $afterThisObj.next('i.fa') : $afterThisObj; $(thisObj).removeClass('bad'); $afterThisObj.next('span.bad').remove(); diff --git a/APPL/Localscripts/jquery.timepicker-table.js b/APPL/Localscripts/jquery.timepicker-table.js index cf51eec094..12cd517780 100644 --- a/APPL/Localscripts/jquery.timepicker-table.js +++ b/APPL/Localscripts/jquery.timepicker-table.js @@ -97,15 +97,15 @@ $.fn.timePicker = function(options) if(!appended) timesTable.append(timesRow); timeHolder.append(timesTable); $(el).after(timeHolder); - timeHolder.css('top', $(el).position().top + "px"); + timeHolder.css('top', $(el).offset().top + "px"); // JGL added - var newLeft = $(el).position().left + $(el).outerWidth(); + var newLeft = $(el).offset().left + $(el).outerWidth(); var w = settings.columns * 50; // timeHolder.outerWidth() is altijd 1? if (newLeft + w > $("body").width()) { // Wel in beeld houden newLeft = Math.max(0, $("body").width() - w); - timeHolder.css('top', $(el).position().top + $(el).outerHeight() + "px"); + timeHolder.css('top', $(el).offset().top + $(el).outerHeight() + "px"); } timeHolder.css('left', newLeft + "px"); if(jQuery.fn.below) timeHolder.below(el).hide(); @@ -125,7 +125,6 @@ $.fn.timePicker = function(options) el.value = $(this).text(); $(this).parents("div.time-holder").hide(); options.onChange.apply(this, [el.value]); - } ).removeClass("selected"); } diff --git a/APPL/Shared/default.csx b/APPL/Shared/default.csx index be76c84089..d4fa29ac77 100644 --- a/APPL/Shared/default.csx +++ b/APPL/Shared/default.csx @@ -2922,6 +2922,10 @@ i.timeklikker { cursor: pointer; width: 0; } +i.flex.timeklikker { + left: -16px; + pointer-events: none; +} .flddatetime, .fldresstatus, #existingDates, #newDates, .fldmsgprio, .fldafspnum, .flddeel, .fldcnttarief { width: 140px; diff --git a/APPL/Shared/kenmerk_common.inc b/APPL/Shared/kenmerk_common.inc index deee36dbca..7caab459ec 100644 --- a/APPL/Shared/kenmerk_common.inc +++ b/APPL/Shared/kenmerk_common.inc @@ -316,9 +316,11 @@ function listKenmerk(sql, module, key, props) var idCounter = 1; // We maken alleen name/id-s voor de velden die ook echt bewerkt kunnen worden var clabelCounter = 0; // Het aantal collapsable labels var anyDate = false; + var anyTime = false; var anyTextarea = false; var kenmerkidref = new Array(); // Bijhouden welk kenmerk welke id referentie mee heeft gekregen var dpYearRanges = []; // te gebruiker jaren voor datepicker vastleggen. + var minMax = []; // te gebruiker uren voor timepicker vastleggen. var allCollapsable = false; // true bij eerste 'l'-label var inMobileBlock = false; // true van begin mobile-collapse-content tot eind mobile-collapse-content @@ -532,14 +534,14 @@ function listKenmerk(sql, module, key, props) // En: voor type M is het altijd nu nog leeg, en die komen dus readonly nooit! // Voorlopig laat ik die dan altijd maar zien (TODO: evt niet als er 0 bestanden zijn) if (readonlyfield && !isParent && ktype != 'L' && ktype != 'l' && ktype != 'M' && (!flexkenmerkwaarde || flexkenmerkwaarde=="") && - (!kenmerk_search && (ktype == 'C' || ktype == 'N' || ktype == 'B' || ktype == 'D' || ktype == 'R' || ktype == 'S')) ) // Als geavanceerd dan maakt het niet uit of het readonly is. Dan moet je het kenmerk gewoon tonen. + (!kenmerk_search && (ktype == 'C' || ktype == 'N' || ktype == 'B' || ktype == 'D' || ktype == 'T' || ktype == 'R' || ktype == 'S')) ) // Als geavanceerd dan maakt het niet uit of het readonly is. Dan moet je het kenmerk gewoon tonen. { oRs.MoveNext(); continue; } // Als geavanceerd dan maakt het niet uit of het readonly is. Dan moet je het kenmerk gewoon tonen. - if (kenmerk_search && readonlyfield && (ktype == 'C' || ktype == 'N' || ktype == 'B' || ktype == 'D' || ktype == 'R' || ktype == 'S')) + if (kenmerk_search && readonlyfield && (ktype == 'C' || ktype == 'N' || ktype == 'B' || ktype == 'D' || ktype == 'T' || ktype == 'R' || ktype == 'S')) readonlyfield = false; colCount++; // Nu pas ophogen. @@ -1184,6 +1186,69 @@ function listKenmerk(sql, module, key, props) val_seperator = ''; } + // ========================================================================================== + // ===================================================================== + // KENMERKTYPE T (Time) ===================================================================== + // ===================================================================== + // ========================================================================================== + if (ktype == 'T') + { + if (kmin === null) + { + switch(module) + { + case "BEZ": kmin = S("vis_t1"); break; + case "PRS": kmin = S("prs_t1"); break; + case "RES": kmin = S("res_t1"); break; + default: kmin = S("fac_t_startofworkday"); break; + } + } + if (kmax === null) + { + switch(module) + { + case "BEZ": kmax = S("vis_t2"); break; + case "PRS": kmax = S("prs_t2"); break; + case "RES": kmax = S("res_t2"); break; + default: kmax = S("fac_t_endofworkday"); break; + } + } + kmin = String(kmin); + kmax = String(kmax); + if (kmin.indexOf(":") == -1) kmin += ":00"; + if (kmax.indexOf(":") == -1) kmax += ":00"; + if (kmin.split(":")[0].length == 1) kmin = "0" + kmin; // pad + if (kmax.split(":")[0].length == 1) kmax = "0" + kmax; // pad + + minMax.push({id: idCounter, kmin: kmin, kmax: kmax}); + + kv = ""; + + if (!readonlyfield && !isExpression && !maskeren) + kv += ""; + + anyTime |= !readonlyfield; + } + // =========================================================================== // De uitzonderingen hebben we nu gehad, alle overige types beginnen hetzelfde // =========================================================================== @@ -1294,6 +1359,7 @@ function listKenmerk(sql, module, key, props) if (!readonlyfield && !isExpression && !maskeren) kv += ""; + // Als er voor een datumveld geen kmin en kmax is ingevuld dan is de yearRange default -10 tot +10 jaar vanaf geselecteerd jaar. // Is een van beiden ingevuld dan wordt de andere op 10 jaar vanaf geselecteerde jaar gezet (deze verschuift met selectie). // Een opgegeven waarde is het aantal jaren voor of na het huidige jaar (waarde < 1000), of een jaartal (waarde > 1000). @@ -1715,7 +1781,6 @@ function listKenmerk(sql, module, key, props) { if ($.datepicker) { - // jQuery datepicker $(".fldflexD").not("[readonly]").datepicker({ // buttonImage: "../pictures/calendar2.png", @@ -1759,7 +1824,7 @@ function listKenmerk(sql, module, key, props) $(this).val($(this).attr("value").split("-").reverse().join("-")); // Change hidden type field from 'D' to 'DN' - var nativeId = $(this).attr("id").slice(0,-3); + var nativeId = $(this).attr("id").slice(0, -3); $("input:hidden#"+nativeId+"t").val("DN"); }); } @@ -1767,6 +1832,50 @@ function listKenmerk(sql, module, key, props) <% } + if (anyTime && !kenmerk_search) + { + // FCLTHeader.Requires is hier te laat + %><% + } + if (hasfilter) { %> diff --git a/APPL/Shared/kenmerk_js.asp b/APPL/Shared/kenmerk_js.asp index 3bb5daa34e..4804d6e480 100644 --- a/APPL/Shared/kenmerk_js.asp +++ b/APPL/Shared/kenmerk_js.asp @@ -110,6 +110,47 @@ function checkKenmerk(field, show, ktype, klen, kdec, kmin, kmax) } else valid = false; } + else if (ktype == 'T') + { + // sta toe 14 -> 14:00h + // sta toe 930 -> 9:30h + // sta ook allerlei separators toe. + var TIME_RE = /^(\d*)[\/\.\-\: ]?(\d\d?)?$/; + posstime = value.match(TIME_RE); + if (posstime && posstime.length && !isNaN(parseInt(posstime, 10))) // er moet minstens iets goed zijn + { + var hh = parseInt(posstime, 10); + mm = 0; + if (posstime.length > 1 && posstime[2]) + { + var mm = parseInt(posstime[2],10); + } + else // 930 voor 9:30h + if (hh > 100) + { + mm = hh % 100; + hh = Math.floor(hh / 100); + } + hh = hh % 24; + mm = mm % 60; + // Opgeschoonde waarde opslaan + $(field).val(String((hh<10?"0":"")+hh) + ":" + String((mm<10?"0":"")+mm), true); + + if (kmin || kmax) + { + var kval = parseFloat(hh + "." + mm); + kmin = kmin ? parseFloat(kmin.split(":").join(".")) : 0; + kmax = kmax ? parseFloat(kmax.split(":").join(".")) : 24; + if (kmin > kval || kval > kmax) + { + valid = false; + error = "<%=L("lcl_mld_kenmerk_out_range")%>"; + } + } + } + else + valid = false; + } else if (ktype == 'C' || ktype == 'L' || ktype == 'Q') { // newlines verdubbelen naar %0D%0A dus aantal regels bijtellen if (value.length + (value.split("\n").length-1) > klen) valid = false; @@ -156,7 +197,7 @@ function checkKenmerk(field, show, ktype, klen, kdec, kmin, kmax) } } } - if (valid) + if (valid && ktype != 'T') // Time wordt hierboven al gecontroleerd { if ((kmin !== null) && (t < kmin)) { valid = false; error = "<%=L("lcl_mld_kenmerk_out_range")%>"; } if ((kmax !== null) && (t > kmax)) { valid = false; error = "<%=L("lcl_mld_kenmerk_out_range")%>"; }