Преглед на файлове

HUE-1176 [jb] Add filter on map or reduce status on task page

Romain Rigaux преди 8 години
родител
ревизия
3b5c9e6

+ 2 - 0
apps/jobbrowser/src/jobbrowser/apis/base_api.py

@@ -85,5 +85,7 @@ def _extract_query_params(filters):
       if user_filter:
         filter_params['username'] = user_filter.group(3)
         filter_params['text'] = filter_params['text'].replace(user_filter.group(1), '').strip()
+    else:
+      filter_params[name] = value
 
   return filter_params

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

@@ -238,35 +238,8 @@ class YarnMapReduceTaskApi(Api):
     if filters.get('text'):
       filter_params['task_text'] = filters['text']
 
-#     filter_params.update(_extract_query_params(filters)
-#
-#     #filter_params['text']
-#
-#     if filters.get('states'):
-#       filter_params['states'] = filters['states']
-#
-#     if 'time' in filters:
-#       filter_params['time_value'] = int(filters['time']['time_value'])
-#       filter_params['time_unit'] = filters['time']['time_unit']
-
-#     jobs = NativeYarnApi(self.user).get_jobs(**filter_params)
-#
-#     apps = [massage_job_for_json(job, user=self.user) for job in jobs]
-#
-#     return {
-#       'apps': [{
-#         'id': app['id'],
-#         'name': app['name'],
-#         'type': app['applicationType'],
-#         'status': app['status'],
-#         'apiStatus': self._api_status(app['status']),
-#         'user': app['user'],
-#         'progress': app['progress'],
-#         'duration': app['durationMs'],
-#         'submitted': app['startTimeMs']
-#       } for app in apps],
-#       'total': None
-#     }
+    if filters.get('states') and len(filters.get('states')) == 1:
+      filter_params['task_types'] = filters['states'][0]
 
     return {
       'apps': [self._massage_task(task) for task in NativeYarnApi(self.user).get_tasks(**filter_params)],

+ 20 - 6
apps/jobbrowser/src/jobbrowser/templates/job_browser.mako

@@ -419,12 +419,13 @@ ${ 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 id, name, user...')}">
-      <span class="btn-group">
-        <class="btn-group">
-          <a class="btn btn-status btn-success" data-value="completed">${ _('MAP') }</a>
-          <a class="btn btn-status btn-warning" data-value="running">${ _('REDUCE') }</a>
-        </span>
+      <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>
+          <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">
@@ -1002,9 +1003,22 @@ ${ commonheader("Job Browser", "jobbrowser", user, request) | n,unicode }
       self.mainType = ko.observable(vm.interface());
 
       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'}),
+      ]);
+      self.statesFilter = ko.computed(function () {
+        var checkedStates = ko.utils.arrayFilter(self.statesValuesFilter(), function (state) {
+          return state.checked();
+        });
+        return ko.utils.arrayMap(checkedStates, function(state){
+          return state.value()
+        });
+      });
       self.filters = ko.computed(function() {
         return [
           {'text': self.textFilter()},
+          {'states': ko.mapping.toJS(self.statesFilter())},
         ];
       });
       self.filters.subscribe(function(value) {