Răsfoiți Sursa

HUE-2721 [oozie] Paginate Workflow dashboard

krish 10 ani în urmă
părinte
comite
34b7a2b

+ 1 - 1
apps/oozie/src/oozie/conf.py

@@ -62,7 +62,7 @@ REMOTE_SAMPLE_DIR = Config(
 
 OOZIE_JOBS_COUNT = Config(
   key='oozie_jobs_count',
-  default=100,
+  default=50,
   type=int,
   help=_t('Maximum number of Oozie workflows or coodinators or bundles to retrieve in one API call.')
 )

+ 53 - 12
apps/oozie/src/oozie/templates/dashboard/list_oozie_workflows.mako

@@ -98,7 +98,10 @@ ${ layout.menubar(section='workflows', dashboard=True) }
         </tr>
       </tbody>
     </table>
-
+    <span class="btn-toolbar" style="float:right;">
+      <a class="btn btn-running-pagination btn-running-prev" data-value='Previous' disabled='disabled'>${ _('Previous') }</a>
+      <a class="btn btn-running-pagination btn-running-next" data-value='Next'>${ _('Next') }</a>
+    </span>
   </div>
 
   <div>
@@ -196,11 +199,13 @@ ${ layout.menubar(section='workflows', dashboard=True) }
   }
 
   var refreshRunning;
+  var runningTableOffset = 1;
+  var PAGE_SIZE = 50;
 
   $(document).ready(function () {
     var runningTable = $("#running-table").dataTable({
-      "sPaginationType":"bootstrap",
-      "iDisplayLength":50,
+      "bPaginate": false,
+      "iDisplayLength":PAGE_SIZE,
       "bLengthChange":false,
       "sDom":"<'row'r>t<'row'<'span6'i><''p>>",
       "aoColumns":[
@@ -224,12 +229,6 @@ ${ layout.menubar(section='workflows', dashboard=True) }
         "sInfoEmpty":"${_('Showing 0 to 0 of 0 entries')}",
         "sInfoFiltered":"${_('(filtered from _MAX_ total entries)')}",
         "sZeroRecords":"${_('No matching records')}",
-        "oPaginate":{
-          "sFirst":"${_('First')}",
-          "sLast":"${_('Last')}",
-          "sNext":"${_('Next')}",
-          "sPrevious":"${_('Previous')}"
-        }
       },
       "fnDrawCallback":function (oSettings) {
         $("a[data-row-selector='true']").jHueRowSelector();
@@ -238,7 +237,7 @@ ${ layout.menubar(section='workflows', dashboard=True) }
 
     var completedTable = $("#completed-table").dataTable({
       "sPaginationType":"bootstrap",
-      "iDisplayLength":50,
+      "iDisplayLength":PAGE_SIZE,
       "bLengthChange":false,
       "sDom":"<'row'r>t<'row'<'span6'i><''p>>",
       "aoColumns":[
@@ -286,7 +285,20 @@ ${ layout.menubar(section='workflows', dashboard=True) }
     });
 
 
+    $("a.btn-running-pagination").click(function () {
+      if ($.attr(this, "disabled") == null) {
+        var btnText = $(this).data('value');
+        if (btnText == 'Previous') {
+          runningTableOffset -= PAGE_SIZE;
+        } else if (btnText == 'Next') {
+          runningTableOffset += PAGE_SIZE;
+        }
+        refreshRunning();
+      }
+    });
+
     $("a.btn-status").click(function () {
+      refreshPagination();
       $(this).toggleClass("active");
       refreshRunning();
       refreshCompleted();
@@ -299,6 +311,7 @@ ${ layout.menubar(section='workflows', dashboard=True) }
     });
 
     $("a.btn-date").click(function () {
+      refreshPagination();
       $("a.btn-date").not(this).removeClass("active");
       $(this).toggleClass("active");
       refreshRunning();
@@ -310,6 +323,10 @@ ${ layout.menubar(section='workflows', dashboard=True) }
       $("a.btn-date[data-value='" + hash.split("=")[1] + "']").click();
     }
 
+    function refreshPagination() {
+      runningTableOffset = 1;
+    }
+
     function drawTable() {
       runningTable.fnDraw();
       completedTable.fnDraw();
@@ -386,7 +403,7 @@ ${ layout.menubar(section='workflows', dashboard=True) }
     var numRunning = 0;
 
     refreshRunning = function () {
-      $.getJSON(window.location.pathname + "?format=json" + getStatuses('running') + getDaysFilter(), function (data) {
+      $.getJSON(window.location.pathname + "?format=json&offset=" + runningTableOffset + getStatuses('running') + getDaysFilter(), function (data) {
         if (data.jobs) {
           var nNodes = runningTable.fnGetNodes();
 
@@ -445,12 +462,36 @@ ${ layout.menubar(section='workflows', dashboard=True) }
           refreshCompleted();
         }
         numRunning = data.jobs.length;
+        refreshPaginationButtons("running", data.total_jobs);
 
-        runningTable.fnDraw();
         window.setTimeout(refreshRunning, 5000);
       });
     }
 
+    function refreshPaginationButtons(tableName, totalJobs) {
+      var prevBtn = $("a.btn-running-prev");
+      var nextBtn = $("a.btn-running-next");
+      var offset = runningTableOffset;
+
+      if (tableName == 'completed') {
+        // TBD
+        prevBtn = $("a.btn-completed-prev");
+        nextBtn = $("a.btn-completed-next");
+        offset = completedTableOffset;
+      }
+
+      if(offset == 1 || !totalJobs) {
+        prevBtn.attr("disabled", 'true');
+      } else {
+        prevBtn.removeAttr("disabled");
+      }
+      if (totalJobs <= (offset + PAGE_SIZE)  || !totalJobs) {
+        nextBtn.attr("disabled", 'true');
+      } else if (totalJobs > offset + PAGE_SIZE) {
+        nextBtn.removeAttr("disabled");
+      }
+    }
+
     function getParentImage(parentUrl) {
       var _sub = parentUrl[parentUrl.length - 2];
       switch (_sub) {

+ 10 - 2
apps/oozie/src/oozie/views/dashboard.py

@@ -172,15 +172,23 @@ def list_oozie_workflows(request):
     if request.GET.get('startcreatedtime'):
       kwargs['filters'].extend([('startcreatedtime', request.GET.get('startcreatedtime'))])
 
+    if request.GET.get('offset'):
+      kwargs['offset'] = request.GET.get('offset')
+
     json_jobs = []
+    total_jobs = 0
     if request.GET.getlist('status'):
       kwargs['filters'].extend([('status', status) for status in request.GET.getlist('status')])
-      json_jobs = oozie_api.get_workflows(**kwargs).jobs
+      wf_list = oozie_api.get_workflows(**kwargs)
+      json_jobs = wf_list.jobs
+      total_jobs = wf_list.total
 
     if request.GET.get('type') == 'progress':
       json_jobs = [oozie_api.get_job(job.id) for job in json_jobs]
 
-    return JsonResponse(massaged_oozie_jobs_for_json(json_jobs, request.user, just_sla), encoder=JSONEncoderForHTML)
+    response = massaged_oozie_jobs_for_json(json_jobs, request.user, just_sla)
+    response['total_jobs'] = total_jobs
+    return JsonResponse(response, encoder=JSONEncoderForHTML)
 
   return render('dashboard/list_oozie_workflows.mako', request, {
     'user': request.user,

+ 1 - 1
desktop/conf.dist/hue.ini

@@ -802,7 +802,7 @@
   ## remote_data_dir=/user/hue/oozie/workspaces
 
   # Maximum of Oozie workflows or coodinators to retrieve in one API call.
-  ## oozie_jobs_count=100
+  ## oozie_jobs_count=50
 
   # Use Cron format for defining the frequency of a Coordinator instead of the old frequency number/unit.
   ## enable_cron_scheduling=true

+ 1 - 1
desktop/conf/pseudo-distributed.ini.tmpl

@@ -809,7 +809,7 @@
   ## remote_data_dir=/user/hue/oozie/workspaces
 
   # Maximum of Oozie workflows or coodinators to retrieve in one API call.
-  ## oozie_jobs_count=100
+  ## oozie_jobs_count=50
 
   # Use Cron format for defining the frequency of a Coordinator instead of the old frequency number/unit.
   ## enable_cron_scheduling=true