From 6a934f488fd636829efbcb24058f92621e5a9fc6 Mon Sep 17 00:00:00 2001 From: David Reyna Date: Sat, 21 Mar 2015 18:01:38 -0700 Subject: bitbake: toaster: build date range selections Enable date range selections for build start and build complete in all builds page for both managed and interactive mode. Disable the filter counts. [YOCTO #6040] [YOCTO #7249] [YOCTO #7461] (Bitbake rev: 7c86ed5fb51c6237fa40fb454e58564ef027dd51) Signed-off-by: David Reyna Signed-off-by: Richard Purdie --- .../toaster/toastergui/static/js/filtersnippet.js | 95 +++++++++++++++ .../lib/toaster/toastergui/templates/build.html | 17 +++ .../toastergui/templates/filtersnippet.html | 34 ++++-- .../toastergui/templates/managed_builds.html | 19 ++- .../toaster/toastergui/templatetags/projecttags.py | 4 + bitbake/lib/toaster/toastergui/views.py | 132 ++++++++++++++++++--- 6 files changed, 277 insertions(+), 24 deletions(-) create mode 100755 bitbake/lib/toaster/toastergui/static/js/filtersnippet.js (limited to 'bitbake') diff --git a/bitbake/lib/toaster/toastergui/static/js/filtersnippet.js b/bitbake/lib/toaster/toastergui/static/js/filtersnippet.js new file mode 100755 index 0000000000..27b057e64e --- /dev/null +++ b/bitbake/lib/toaster/toastergui/static/js/filtersnippet.js @@ -0,0 +1,95 @@ +"use strict" + +// The disable removes the 'datepicker' attribute and +// settings, so you have to re-initialize it each time +// the date range is selected and enabled +// DOM is used instead of jQuery to find the elements +// in all contexts +function date_enable (key, action) { + + var elemFrom=document.getElementById("date_from_"+key); + var elemTo=document.getElementById("date_to_"+key); + + if ('enable' == action) { + elemFrom.removeAttribute("disabled"); + elemTo.removeAttribute("disabled"); + + $(elemFrom).datepicker(); + $(elemTo).datepicker(); + + $(elemFrom).datepicker( "option", "dateFormat", "dd/mm/yy" ); + $(elemTo).datepicker( "option", "dateFormat", "dd/mm/yy" ); + + $(elemFrom).datepicker( "setDate", elemFrom.getAttribute( "data-setDate") ); + $(elemTo).datepicker( "setDate", elemTo.getAttribute( "data-setDate") ); + $(elemFrom).datepicker( "option", "minDate", elemFrom.getAttribute( "data-minDate")); + $(elemTo).datepicker( "option", "minDate", elemTo.getAttribute( "data-minDate")); + $(elemFrom).datepicker( "option", "maxDate", elemFrom.getAttribute( "data-maxDate")); + $(elemTo).datepicker( "option", "maxDate", elemTo.getAttribute( "data-maxDate")); + } else { + elemFrom.setAttribute("disabled","disabled"); + elemTo.setAttribute("disabled","disabled"); + } +} + +// Initialize the date picker elements with their default state variables, and +// register the radio button and form actions +function date_init (key, from_date, to_date, min_date, max_date, initial_enable) { + + var elemFrom=document.getElementById("date_from_"+key); + var elemTo=document.getElementById("date_to_"+key); + + // Were there any daterange filters instantiated? (e.g. no builds found) + if (null == elemFrom) { + return; + } + + // init the datepicker context data + elemFrom.setAttribute( "data-setDate", from_date ); + elemTo.setAttribute( "data-setDate", to_date ); + elemFrom.setAttribute( "data-minDate", min_date); + elemTo.setAttribute( "data-minDate", min_date); + elemFrom.setAttribute( "data-maxDate", max_date); + elemTo.setAttribute( "data-maxDate", max_date); + + // does the date set start enabled? + if (key == initial_enable) { + date_enable (key, "enable"); + } else { + date_enable (key, "disable"); + } + + // catch the radio button selects for enable/disable + $('input:radio[name="filter"]').change(function(){ + if ($(this).val() == 'daterange') { + key=$(this).attr("data-key"); + date_enable (key, 'enable'); + } else { + key=$(this).attr("data-key"); + date_enable (key, 'disable'); + } + }); + + // catch any new 'from' date as minDate for 'to' date + $("#date_from_"+key).change(function(){ + from_date = $("#date_from_"+key).val(); + $("#date_to_"+key).datepicker( "option", "minDate", from_date ); + }); + + // catch the submit (just once) + $("form").unbind('submit'); + $("form").submit(function(e) { + // format a composite daterange filter value so that it can be parsed and post-processed in the view + var key=e.originalEvent.explicitOriginalTarget.getAttribute("data-key") + if (typeof key != "undefined") { + if ($("#date_from_"+key).length) { + var filter=key+"__gte!"+key+"__lt:"+$("#date_from_"+key).val()+"!"+$("#date_to_"+key).val()+"_daterange"; + $("#last_date_from_"+key).val($("#date_from_"+key).val()); + $("#last_date_to_"+key).val($("#date_to_"+key).val()); + $("#filter_value_"+key).val(filter); + } + } + return true; + }); + +}; diff --git a/bitbake/lib/toaster/toastergui/templates/build.html b/bitbake/lib/toaster/toastergui/templates/build.html index 684ec65884..f7ad2f4892 100644 --- a/bitbake/lib/toaster/toastergui/templates/build.html +++ b/bitbake/lib/toaster/toastergui/templates/build.html @@ -4,7 +4,24 @@ {% load projecttags %} {% load humanize %} +{% block extraheadcontent %} + + + + + +{% endblock %} + {% block pagecontent %} + + +
{% include "mrb_section.html" %} diff --git a/bitbake/lib/toaster/toastergui/templates/filtersnippet.html b/bitbake/lib/toaster/toastergui/templates/filtersnippet.html index fe70e7143e..f624d88bad 100644 --- a/bitbake/lib/toaster/toastergui/templates/filtersnippet.html +++ b/bitbake/lib/toaster/toastergui/templates/filtersnippet.html @@ -1,5 +1,6 @@ {% load projecttags %} +{% with f.class as key %}