Add batch actions and row action to Event Logs

Adds ability to export and delete event logs by row or in a
table batch action.

- Modifications to TableRowAction component to allow single
  row export functionality

Signed-off-by: Yoshie Muranaka <yoshiemuranaka@gmail.com>
Change-Id: Ica50dd0868ac85cc2d6925a9448858b40da9c529
diff --git a/src/store/api.js b/src/store/api.js
index 4a8b8e8..63fd75c 100644
--- a/src/store/api.js
+++ b/src/store/api.js
@@ -55,3 +55,18 @@
     return Axios.spread(callback);
   }
 };
+
+export const getResponseCount = responses => {
+  let successCount = 0;
+  let errorCount = 0;
+
+  responses.forEach(response => {
+    if (response instanceof Error) errorCount++;
+    else successCount++;
+  });
+
+  return {
+    successCount,
+    errorCount
+  };
+};
diff --git a/src/store/modules/Health/EventLogStore.js b/src/store/modules/Health/EventLogStore.js
index 2f0b800..2b93ffa 100644
--- a/src/store/modules/Health/EventLogStore.js
+++ b/src/store/modules/Health/EventLogStore.js
@@ -1,4 +1,5 @@
-import api from '../../api';
+import api, { getResponseCount } from '@/store/api';
+import i18n from '@/i18n';
 
 const getHealthStatus = events => {
   let status = 'OK';
@@ -37,22 +38,60 @@
       return await api
         .get('/redfish/v1/Systems/system/LogServices/EventLog/Entries')
         .then(({ data: { Members = [] } = {} }) => {
-          const eventLogs = Members.map(
-            ({ Id, Severity, Created, EntryType, Message }) => {
-              return {
-                id: Id,
-                severity: Severity,
-                date: new Date(Created),
-                type: EntryType,
-                description: Message
-              };
-            }
-          );
+          const eventLogs = Members.map(log => {
+            const { Id, Severity, Created, EntryType, Message } = log;
+            return {
+              id: Id,
+              severity: Severity,
+              date: new Date(Created),
+              type: EntryType,
+              description: Message,
+              uri: log['@odata.id']
+            };
+          });
           commit('setAllEvents', eventLogs);
         })
         .catch(error => {
           console.log('Event Log Data:', error);
         });
+    },
+    async deleteEventLogs({ dispatch }, uris = []) {
+      const promises = uris.map(uri =>
+        api.delete(uri).catch(error => {
+          console.log(error);
+          return error;
+        })
+      );
+      return await api
+        .all(promises)
+        .then(response => {
+          dispatch('getEventLogData');
+          return response;
+        })
+        .then(
+          api.spread((...responses) => {
+            const { successCount, errorCount } = getResponseCount(responses);
+            const toastMessages = [];
+
+            if (successCount) {
+              const message = i18n.tc(
+                'pageEventLogs.toast.successDelete',
+                successCount
+              );
+              toastMessages.push({ type: 'success', message });
+            }
+
+            if (errorCount) {
+              const message = i18n.tc(
+                'pageEventLogs.toast.errorDelete',
+                errorCount
+              );
+              toastMessages.push({ type: 'error', message });
+            }
+
+            return toastMessages;
+          })
+        );
     }
   }
 };