Add ability to view all the dumps

The story is integration of these two API responses
for their respective dumps:

1.Resource and Hostboot dumps:
redfish/v1/Systems/system/LogServices/Dump/Entries
2.BMC Dumps: /redfish/v1/Managers/bmc/LogServices/Dump/Entries

Signed-off-by: Sukanya Pandey <sukapan1@in.ibm.com>
Change-Id: I24ded733e682d21904e92e2e8be1951e46d33b09
diff --git a/src/store/modules/Logs/DumpsStore.js b/src/store/modules/Logs/DumpsStore.js
index ac61d2d..746733a 100644
--- a/src/store/modules/Logs/DumpsStore.js
+++ b/src/store/modules/Logs/DumpsStore.js
@@ -10,7 +10,7 @@
     allDumps: (state) => state.allDumps,
   },
   mutations: {
-    setBmcDumps: (state, dumps) => {
+    setAllDumps: (state, dumps) => {
       state.allDumps = dumps.map((dump) => ({
         data: dump.AdditionalDataURI,
         dateTime: new Date(dump.Created),
@@ -22,10 +22,35 @@
     },
   },
   actions: {
-    async getBmcDumpEntries({ commit }) {
+    async getBmcDumpEntries() {
+      return api
+        .get('/redfish/v1/')
+        .then((response) => api.get(response.data.Managers['@odata.id']))
+        .then((response) => api.get(`${response.data['@odata.id']}/bmc`))
+        .then((response) => api.get(response.data.LogServices['@odata.id']))
+        .then((response) => api.get(`${response.data['@odata.id']}/Dump`))
+        .then((response) => api.get(response.data.Entries['@odata.id']))
+        .catch((error) => console.log(error));
+    },
+    async getSystemDumpEntries() {
+      return api
+        .get('/redfish/v1/')
+        .then((response) => api.get(response.data.Systems['@odata.id']))
+        .then((response) => api.get(`${response.data['@odata.id']}/system`))
+        .then((response) => api.get(response.data.LogServices['@odata.id']))
+        .then((response) => api.get(`${response.data['@odata.id']}/Dump`))
+        .then((response) => api.get(response.data.Entries['@odata.id']))
+        .catch((error) => console.log(error));
+    },
+    async getAllDumps({ commit, dispatch }) {
       return await api
-        .get('/redfish/v1/Managers/bmc/LogServices/Dump/Entries')
-        .then(({ data = {} }) => commit('setBmcDumps', data.Members || []))
+        .all([dispatch('getBmcDumpEntries'), dispatch('getSystemDumpEntries')])
+        .then((response) => {
+          const bmcDumpEntries = response[0].data?.Members || [];
+          const systemDumpEntries = response[1].data?.Members || [];
+          const allDumps = [...bmcDumpEntries, ...systemDumpEntries];
+          commit('setAllDumps', allDumps);
+        })
         .catch((error) => console.log(error));
     },
     async createBmcDump() {
@@ -66,7 +91,7 @@
       return await api
         .all(promises)
         .then((response) => {
-          dispatch('getBmcDumpEntries');
+          dispatch('getAllDumps');
           return response;
         })
         .then(
@@ -95,13 +120,13 @@
         );
     },
     async deleteAllDumps({ commit, state }) {
-      const totalDumpCount = state.bmcDumps.length;
+      const totalDumpCount = state.allDumps.length;
       return await api
         .post(
           '/redfish/v1/Managers/bmc/LogServices/Dump/Actions/LogService.ClearLog'
         )
         .then(() => {
-          commit('setBmcDumps', []);
+          commit('setAllDumps', []);
           return i18n.tc('pageDumps.toast.successDeleteDump', totalDumpCount);
         })
         .catch((error) => {
diff --git a/src/views/Logs/Dumps/Dumps.vue b/src/views/Logs/Dumps/Dumps.vue
index a6dc10f..179a503 100644
--- a/src/views/Logs/Dumps/Dumps.vue
+++ b/src/views/Logs/Dumps/Dumps.vue
@@ -20,8 +20,8 @@
               />
               <div class="ml-sm-4">
                 <table-cell-count
-                  :filtered-items-count="filteredItemCount"
-                  :total-number-of-cells="tableItems.length"
+                  :filtered-items-count="filteredRows"
+                  :total-number-of-cells="allDumps.length"
                 ></table-cell-count>
               </div>
             </b-col>
@@ -29,6 +29,14 @@
               <table-date-filter @change="onChangeDateTimeFilter" />
             </b-col>
           </b-row>
+          <b-row>
+            <b-col class="text-right">
+              <table-filter
+                :filters="tableFilters"
+                @filter-change="onFilterChange"
+              />
+            </b-col>
+          </b-row>
           <table-toolbar
             :selected-items-count="selectedRows.length"
             :actions="batchActions"
@@ -47,12 +55,12 @@
             responsive="md"
             sort-by="dateTime"
             :fields="fields"
-            :items="filteredTableItems"
+            :items="filteredDumps"
             :empty-text="$t('global.table.emptyMessage')"
             :empty-filtered-text="$t('global.table.emptySearchMessage')"
             :filter="searchFilter"
-            @filtered="onChangeSearchFilter"
-            @row-selected="onRowSelected($event, filteredTableItems.length)"
+            @filtered="onFiltered"
+            @row-selected="onRowSelected($event, filteredDumps.length)"
           >
             <!-- Checkbox column -->
             <template #head(checkbox)>
@@ -126,7 +134,7 @@
           first-number
           last-number
           :per-page="perPage"
-          :total-rows="getTotalRowCount(filteredItemCount)"
+          :total-rows="getTotalRowCount()"
           aria-controls="table-dump-entries"
         />
       </b-col>
@@ -137,7 +145,6 @@
 <script>
 import IconDelete from '@carbon/icons-vue/es/trash-can/20';
 import IconDownload from '@carbon/icons-vue/es/download/20';
-
 import DumpsForm from './DumpsForm';
 import PageSection from '@/components/Global/PageSection';
 import PageTitle from '@/components/Global/PageTitle';
@@ -146,7 +153,6 @@
 import TableDateFilter from '@/components/Global/TableDateFilter';
 import TableRowAction from '@/components/Global/TableRowAction';
 import TableToolbar from '@/components/Global/TableToolbar';
-
 import BVTableSelectableMixin, {
   selectedRows,
   tableHeaderCheckboxModel,
@@ -162,6 +168,7 @@
 import SearchFilterMixin, {
   searchFilter,
 } from '@/components/Mixins/SearchFilterMixin';
+import TableFilter from '@/components/Global/TableFilter';
 import TableFilterMixin from '@/components/Mixins/TableFilterMixin';
 
 export default {
@@ -176,6 +183,7 @@
     TableDateFilter,
     TableRowAction,
     TableToolbar,
+    TableFilter,
   },
   mixins: [
     BVTableSelectableMixin,
@@ -231,24 +239,39 @@
           label: this.$t('global.action.delete'),
         },
       ],
+      tableFilters: [
+        {
+          key: 'dumpType',
+          label: this.$t('pageDumps.table.dumpType'),
+          values: [
+            'BMC Dump Entry',
+            'Hostboot Dump Entry',
+            'Resource Dump Entry',
+            'System Dump Entry',
+          ],
+        },
+      ],
+      activeFilters: [],
       currentPage: currentPage,
       filterEndDate: null,
       filterStartDate: null,
       itemsPerPageOptions: itemsPerPageOptions,
       perPage: perPage,
       searchFilter,
-      searchFilteredItemsCount: 0,
+      searchTotalFilteredRows: 0,
       selectedRows,
       tableHeaderCheckboxIndeterminate,
       tableHeaderCheckboxModel,
     };
   },
   computed: {
-    dumps() {
-      return this.$store.getters['dumps/allDumps'];
+    filteredRows() {
+      return this.searchFilter
+        ? this.searchTotalFilteredRows
+        : this.filteredDumps.length;
     },
-    tableItems() {
-      return this.dumps.map((item) => {
+    allDumps() {
+      return this.$store.getters['dumps/allDumps'].map((item) => {
         return {
           ...item,
           actions: [
@@ -264,32 +287,34 @@
         };
       });
     },
-    filteredTableItems() {
+    filteredDumpsByDate() {
       return this.getFilteredTableDataByDate(
-        this.tableItems,
+        this.allDumps,
         this.filterStartDate,
         this.filterEndDate,
         'dateTime'
       );
     },
-    filteredItemCount() {
-      return this.searchFilter
-        ? this.searchFilteredItemsCount
-        : this.filteredTableItems.length;
+    filteredDumps() {
+      return this.getFilteredTableData(
+        this.filteredDumpsByDate,
+        this.activeFilters
+      );
     },
   },
   created() {
     this.startLoader();
-    this.$store
-      .dispatch('dumps/getBmcDumpEntries')
-      .finally(() => this.endLoader());
+    this.$store.dispatch('dumps/getAllDumps').finally(() => this.endLoader());
   },
   methods: {
     convertBytesToMegabytes(bytes) {
       return parseFloat((bytes / 1000000).toFixed(3));
     },
-    onChangeSearchFilter(items) {
-      this.searchFilteredItemsCount = items.length;
+    onFilterChange({ activeFilters }) {
+      this.activeFilters = activeFilters;
+    },
+    onFiltered(filteredItems) {
+      this.searchTotalFilteredRows = filteredItems.length;
     },
     onChangeDateTimeFilter({ fromDate, toDate }) {
       this.filterStartDate = fromDate;
diff --git a/src/views/Logs/Dumps/DumpsForm.vue b/src/views/Logs/Dumps/DumpsForm.vue
index 02ec186..07f4a06 100644
--- a/src/views/Logs/Dumps/DumpsForm.vue
+++ b/src/views/Logs/Dumps/DumpsForm.vue
@@ -34,10 +34,8 @@
 
 <script>
 import { required } from 'vuelidate/lib/validators';
-
 import ModalConfirmation from './DumpsModalConfirmation';
 import Alert from '@/components/Global/Alert';
-
 import BVToastMixin from '@/components/Mixins/BVToastMixin';
 import VuelidateMixin from '@/components/Mixins/VuelidateMixin.js';
 
@@ -62,9 +60,13 @@
     handleSubmit() {
       this.$v.$touch();
       if (this.$v.$invalid) return;
+
+      // System dump initiation
       if (this.selectedDumpType === 'system') {
         this.showConfirmationModal();
-      } else {
+      }
+      // BMC dump initiation
+      else if (this.selectedDumpType === 'bmc') {
         this.$store
           .dispatch('dumps/createBmcDump')
           .then(() =>