Bläddra i källkod

HUE-1176 [jb] Offer to filter map reduce tasks by status

Romain Rigaux 8 år sedan
förälder
incheckning
2fd628d

+ 5 - 2
apps/jobbrowser/src/jobbrowser/apis/job_api.py

@@ -238,8 +238,11 @@ class YarnMapReduceTaskApi(Api):
     if filters.get('text'):
       filter_params['task_text'] = filters['text']
 
-    if filters.get('states') and len(filters.get('states')) == 1:
-      filter_params['task_types'] = filters['states'][0]
+    if filters.get('states'):
+      filter_params['task_states'] = filters['states']
+
+    if filters.get('types') and len(filters.get('types')) == 1:
+      filter_params['task_types'] = filters['types'][0]
 
     return {
       'apps': [self._massage_task(task) for task in NativeYarnApi(self.user).get_tasks(**filter_params)],

+ 27 - 12
apps/jobbrowser/src/jobbrowser/templates/job_browser.mako

@@ -420,6 +420,7 @@ ${ commonheader("Job Browser", "jobbrowser", user, request) | n,unicode }
     <div class="tab-pane" id="job-mapreduce-page-tasks">
       ${_('Filter')}
       <input data-bind="value: textFilter" type="text" class="input-xlarge search-query" placeholder="${_('Filter by name')}">
+
       <span data-bind="foreach: statesValuesFilter">
         <label class="checkbox">
           <div data-bind="attr: {'class': 'status-circle ' + klass()}"></div>
@@ -428,6 +429,14 @@ ${ commonheader("Job Browser", "jobbrowser", user, request) | n,unicode }
         </label>
       </span>
 
+      <span data-bind="foreach: typesValuesFilter">
+        <label class="checkbox">
+          <div data-bind="attr: {'class': 'status-circle ' + klass()}"></div>
+          <input type="checkbox" data-bind="checked: checked, attr: {id: name}">
+          <span data-bind="text: name, attr: {for: name}"></span>
+        </label>
+      </span>
+
       <table class="table table-condensed">
         <thead>
         <tr>
@@ -507,14 +516,6 @@ ${ commonheader("Job Browser", "jobbrowser", user, request) | n,unicode }
     </div>
 
     <div class="tab-pane" id="job-mapreduce-task-page-attempts">
-      ${_('Filter')} <input type="text" class="input-xlarge search-query" placeholder="${_('Filter by id, name, user...')}" value="user:${ user.username }">
-      <span class="btn-group">
-        <class="btn-group">
-          <a class="btn btn-status btn-success" data-value="completed">${ _('Succeeded') }</a>
-          <a class="btn btn-status btn-warning" data-value="running">${ _('Running') }</a>
-          <a class="btn btn-status btn-danger disable-feedback" data-value="failed">${ _('Failed') }</a>
-        </span>
-      </span>
 
       <table class="table table-condensed">
         <thead>
@@ -1004,8 +1005,9 @@ ${ commonheader("Job Browser", "jobbrowser", user, request) | n,unicode }
 
       self.textFilter = ko.observable('').extend({ rateLimit: { method: "notifyWhenChangesStop", timeout: 1000 } });
       self.statesValuesFilter = ko.observableArray([
-        ko.mapping.fromJS({'value': 'map', 'name': '${_("Map")}', 'checked': true, 'klass': 'green'}),
-        ko.mapping.fromJS({'value': 'reduce', 'name': '${_("Reduce")}', 'checked': true, 'klass': 'orange'}),
+        ko.mapping.fromJS({'value': 'completed', 'name': '${_("Succeeded")}', 'checked': true, 'klass': 'green'}),
+        ko.mapping.fromJS({'value': 'running', 'name': '${_("Running")}', 'checked': true, 'klass': 'orange'}),
+        ko.mapping.fromJS({'value': 'failed', 'name': '${_("Failed")}', 'checked': true, 'klass': 'red'}),
       ]);
       self.statesFilter = ko.computed(function () {
         var checkedStates = ko.utils.arrayFilter(self.statesValuesFilter(), function (state) {
@@ -1015,10 +1017,23 @@ ${ commonheader("Job Browser", "jobbrowser", user, request) | n,unicode }
           return state.value()
         });
       });
-      self.filters = ko.computed(function() {
+      self.typesValuesFilter = ko.observableArray([
+        ko.mapping.fromJS({'value': 'map', 'name': '${_("Map")}', 'checked': true, 'klass': 'green'}),
+        ko.mapping.fromJS({'value': 'reduce', 'name': '${_("Reduce")}', 'checked': true, 'klass': 'orange'}),
+      ]);
+      self.typesFilter = ko.computed(function () {
+        var checkedTypes = ko.utils.arrayFilter(self.typesValuesFilter(), function (type) {
+          return type.checked();
+        });
+        return ko.utils.arrayMap(checkedTypes, function(type){
+          return type.value()
+        });
+      });
+      self.filters = ko.pureComputed(function() {
         return [
           {'text': self.textFilter()},
           {'states': ko.mapping.toJS(self.statesFilter())},
+          {'types': ko.mapping.toJS(self.typesFilter())},
         ];
       });
       self.filters.subscribe(function(value) {
@@ -1347,7 +1362,7 @@ ${ commonheader("Job Browser", "jobbrowser", user, request) | n,unicode }
         self.paginationOffset(self.paginationOffset() + self.paginationResultPage());
       };
 
-      self.filters = ko.computed(function() {
+      self.filters = ko.pureComputed(function() {
         return [
           {'text': self.textFilter()},
           {'time': {'time_value': self.timeValueFilter(), 'time_unit': self.timeUnitFilter()}},