Add event log search and filter capabilities

Change-Id: I9dc891e0f1e30abe488d401c57e1cf4f5656c3af
Signed-off-by: Iftekharul Islam <iislam@us.ibm.com>
diff --git a/app/server-health/controllers/log-controller.js b/app/server-health/controllers/log-controller.js
new file mode 100644
index 0000000..59ebd01
--- /dev/null
+++ b/app/server-health/controllers/log-controller.js
@@ -0,0 +1,139 @@
+/**
+ * Controller for log
+ *
+ * @module app/serverHealth
+ * @exports logController
+ * @name logController
+ * @version 0.1.0
+ */
+
+window.angular && (function (angular) {
+    'use strict';
+    var logData = [], originalData = {};
+    angular
+        .module('app.serverHealth')
+        .controller('logController', [
+            '$scope', 
+            '$window', 
+            'APIUtils', 
+            'dataService',
+            'Constants',
+            function($scope, $window, APIUtils, dataService, Constants){
+                $scope.dataService = dataService;
+                $scope.logs = [];
+                $scope.tmz = 'EDT';
+                $scope.itemsPerPage = Constants.PAGINATION.LOG_ITEMS_PER_PAGE;
+                // priority buttons
+                $scope.selectedSeverity = {
+                    all: true,
+                    low: false,
+                    medium: false,
+                    high: false
+                };
+                $scope.selectedStatus = {
+                    all: true,
+                    resolved: false
+                };
+
+                $scope.customSearch = "";
+                $scope.searchItems = [];
+                $scope.selectedEvents = [];
+
+                $scope.loadLogs = function(){
+                    APIUtils.getLogs(function(data, originalData){
+                        logData = data;
+                        originalData = originalData;
+                        $scope.logs = data;
+                        $scope.originalData = originalData;
+                    });
+                };
+                $scope.jsonData = function(data){
+                    return JSON.stringify(data);
+                };
+
+                $scope.filterBySeverity = function(log){
+                    if($scope.selectedSeverity.all) return true;
+
+                    return( (log.severity_flags.low && $scope.selectedSeverity.low) ||
+                            (log.severity_flags.medium && $scope.selectedSeverity.medium) ||
+                            (log.severity_flags.high && $scope.selectedSeverity.high)
+                    );
+                }
+
+
+                $scope.filterByStatus = function(log){
+                    if ($scope.selectedStatus.all) return true;
+                    return( (log.Resolved && $scope.selectedStatus.resolved)||
+                            (!log.Resolved && !$scope.selectedStatus.resolved)
+                    );
+                }
+
+                $scope.filterByDate = function(log){
+                    if($scope.start_date && $scope.end_date){
+                        var date = new Date(log.Timestamp);
+                        return (date >= $scope.start_date &&
+                               date <= $scope.end_date );
+                    }else{
+                        return true;
+                    }
+                }
+
+                $scope.filterBySearchTerms = function(log){
+                    if(!$scope.searchItems.length) return true; 
+
+                    var flag = false;
+                    for(var i = 0, length = $scope.searchItems.length; i < length; i++){
+                        if(log.search_text.indexOf($scope.searchItems[i].toLowerCase()) == -1) return false;
+                    }
+                    return true;
+                }
+
+                $scope.addSearchItem = function(searchTerms){
+                    var terms = searchTerms.split(" ");
+                    terms.forEach(function(searchTerm){
+                        if($scope.searchItems.indexOf(searchTerm) == -1){
+                            $scope.searchItems.push(searchTerm);
+                        }  
+                    });
+                }
+
+                $scope.clearSearchItem = function(searchTerm){
+                    $scope.searchItems = [];
+                }
+
+                $scope.removeSearchItem = function(searchTerm){
+                    var termIndex = $scope.searchItems.indexOf(searchTerm);
+
+                    if(termIndex > -1){
+                        $scope.searchItems.splice(termIndex,1);
+                    }
+                }
+
+                $scope.$watch('all', function(){
+                    $scope.logs.forEach(function(item){
+                        item.selected = $scope.all;
+                    });
+                });
+
+                function updateExportData(){
+                    $scope.export_name = ($scope.selectedEvents.length == 1) ? $scope.selectedEvents[0].Id + ".json" : "export.json";
+                    var data = {};
+                    $scope.selectedEvents.forEach(function(item){
+                        data[item.data.key] = item.data.value;
+                    });
+                    $scope.export_data = JSON.stringify(data);
+                }
+
+                $scope.$watch('logs', function(){
+                    $scope.selectedEvents = $scope.logs.filter(function(item){
+                        return item.selected;
+                    });
+                    updateExportData();
+                }, true);
+
+                $scope.loadLogs();
+            }
+        ]
+    );
+
+})(angular);