blob: c620c2b640296a9a4d8f92f5927ce6e80c5cf0d4 [file] [log] [blame]
Yoshie Muranaka6f102342020-05-05 09:45:39 -07001<template>
2 <b-container fluid="xl">
3 <page-title />
Yoshie Muranaka68bbba22020-05-18 09:49:37 -07004 <b-row class="mb-3">
Sukanya Pandey99010962020-07-27 21:44:47 +05305 <b-col sm="7" xl="4" class="d-flex flex-column justify-content-end">
Yoshie Muranaka193c22a2020-06-30 20:54:10 -07006 <search
7 :placeholder="$t('pageEventLogs.table.searchLogs')"
Sukanya Pandeyedb8a772020-10-29 11:33:42 +05308 @change-search="onChangeSearchInput"
9 @clear-search="onClearSearchInput"
Yoshie Muranaka193c22a2020-06-30 20:54:10 -070010 />
11 </b-col>
Sukanya Pandey99010962020-07-27 21:44:47 +053012 <b-col sm="3" class="d-flex flex-column justify-content-end">
13 <table-cell-count
14 :filtered-items-count="filteredRows"
15 :total-number-of-cells="allLogs.length"
16 ></table-cell-count>
17 </b-col>
18 <b-col sm="8" md="7" xl="5">
Yoshie Muranaka68bbba22020-05-18 09:49:37 -070019 <table-date-filter @change="onChangeDateTimeFilter" />
20 </b-col>
21 </b-row>
Yoshie Muranaka6f102342020-05-05 09:45:39 -070022 <b-row>
23 <b-col class="text-right">
Sukanya Pandeyedb8a772020-10-29 11:33:42 +053024 <table-filter :filters="tableFilters" @filter-change="onFilterChange" />
Yoshie Muranaka6f102342020-05-05 09:45:39 -070025 </b-col>
26 </b-row>
27 <b-row>
28 <b-col>
Yoshie Muranakabe3af332020-05-11 08:23:04 -070029 <table-toolbar
30 ref="toolbar"
31 :selected-items-count="selectedRows.length"
32 :actions="batchActions"
Sukanya Pandeyedb8a772020-10-29 11:33:42 +053033 @clear-selected="clearSelectedRows($refs.table)"
34 @batch-action="onBatchAction"
Yoshie Muranakabe3af332020-05-11 08:23:04 -070035 >
Derick Montague602e98a2020-10-21 16:20:00 -050036 <template #export>
Yoshie Muranakabe3af332020-05-11 08:23:04 -070037 <table-toolbar-export
38 :data="batchExportData"
SurenNeware96ebb0d2020-09-08 17:42:39 +053039 :file-name="exportFileNameByDate()"
Yoshie Muranakabe3af332020-05-11 08:23:04 -070040 />
41 </template>
42 </table-toolbar>
Yoshie Muranaka6f102342020-05-05 09:45:39 -070043 <b-table
Yoshie Muranakaf9832b02020-05-12 12:04:46 -070044 id="table-event-logs"
Yoshie Muranakabe3af332020-05-11 08:23:04 -070045 ref="table"
SurenNeware5e25e282020-07-08 15:57:23 +053046 responsive="md"
Yoshie Muranakabe3af332020-05-11 08:23:04 -070047 selectable
48 no-select-on-click
Yoshie Muranaka6f102342020-05-05 09:45:39 -070049 sort-icon-left
Sukanya Pandeyfde429e2020-09-14 20:48:39 +053050 hover
Yoshie Muranaka6f102342020-05-05 09:45:39 -070051 no-sort-reset
52 sort-desc
53 show-empty
Derick Montague6b140ba2020-09-03 16:26:33 -050054 sort-by="id"
Yoshie Muranakabe3af332020-05-11 08:23:04 -070055 :fields="fields"
56 :items="filteredLogs"
Yoshie Muranaka6f102342020-05-05 09:45:39 -070057 :sort-compare="onSortCompare"
SurenNeware307382e2020-07-27 20:45:14 +053058 :empty-text="$t('global.table.emptyMessage')"
SurenNeware156a0e62020-08-28 19:20:03 +053059 :empty-filtered-text="$t('global.table.emptySearchMessage')"
Yoshie Muranakaf9832b02020-05-12 12:04:46 -070060 :per-page="perPage"
61 :current-page="currentPage"
Yoshie Muranaka193c22a2020-06-30 20:54:10 -070062 :filter="searchFilter"
Sukanya Pandey99010962020-07-27 21:44:47 +053063 @filtered="onFiltered"
Yoshie Muranakabe3af332020-05-11 08:23:04 -070064 @row-selected="onRowSelected($event, filteredLogs.length)"
Yoshie Muranaka6f102342020-05-05 09:45:39 -070065 >
Yoshie Muranakabe3af332020-05-11 08:23:04 -070066 <!-- Checkbox column -->
Derick Montague602e98a2020-10-21 16:20:00 -050067 <template #head(checkbox)>
Yoshie Muranakabe3af332020-05-11 08:23:04 -070068 <b-form-checkbox
69 v-model="tableHeaderCheckboxModel"
Yoshie Muranakaed06dc12020-06-16 12:12:27 -070070 data-test-id="eventLogs-checkbox-selectAll"
Yoshie Muranakabe3af332020-05-11 08:23:04 -070071 :indeterminate="tableHeaderCheckboxIndeterminate"
72 @change="onChangeHeaderCheckbox($refs.table)"
Dixsie Wolmersc42ad712020-11-19 17:29:24 -060073 >
74 <span class="sr-only">{{ $t('global.table.selectAll') }}</span>
75 </b-form-checkbox>
Yoshie Muranakabe3af332020-05-11 08:23:04 -070076 </template>
Derick Montague602e98a2020-10-21 16:20:00 -050077 <template #cell(checkbox)="row">
Yoshie Muranakabe3af332020-05-11 08:23:04 -070078 <b-form-checkbox
79 v-model="row.rowSelected"
Yoshie Muranakaed06dc12020-06-16 12:12:27 -070080 :data-test-id="`eventLogs-checkbox-selectRow-${row.index}`"
Yoshie Muranakabe3af332020-05-11 08:23:04 -070081 @change="toggleSelectRow($refs.table, row.index)"
Dixsie Wolmersc42ad712020-11-19 17:29:24 -060082 >
83 <span class="sr-only">{{ $t('global.table.selectItem') }}</span>
84 </b-form-checkbox>
Yoshie Muranakabe3af332020-05-11 08:23:04 -070085 </template>
86
87 <!-- Severity column -->
Derick Montague602e98a2020-10-21 16:20:00 -050088 <template #cell(severity)="{ value }">
Mateusz Gapskib1f12532020-07-24 08:15:23 +020089 <status-icon v-if="value" :status="statusIcon(value)" />
Yoshie Muranaka6f102342020-05-05 09:45:39 -070090 {{ value }}
91 </template>
Yoshie Muranakabe3af332020-05-11 08:23:04 -070092
93 <!-- Date column -->
Derick Montague602e98a2020-10-21 16:20:00 -050094 <template #cell(date)="{ value }">
Dixsie Wolmers949cdd52020-08-24 21:36:37 -050095 <p class="mb-0">{{ value | formatDate }}</p>
96 <p class="mb-0">{{ value | formatTime }}</p>
Yoshie Muranaka6f102342020-05-05 09:45:39 -070097 </template>
Yoshie Muranakabe3af332020-05-11 08:23:04 -070098
99 <!-- Actions column -->
Derick Montague602e98a2020-10-21 16:20:00 -0500100 <template #cell(actions)="row">
Yoshie Muranakabe3af332020-05-11 08:23:04 -0700101 <table-row-action
Yoshie Muranakaed06dc12020-06-16 12:12:27 -0700102 v-for="(action, index) in row.item.actions"
Yoshie Muranakabe3af332020-05-11 08:23:04 -0700103 :key="index"
104 :value="action.value"
105 :title="action.title"
Yoshie Muranakaed06dc12020-06-16 12:12:27 -0700106 :row-data="row.item"
SurenNeware96ebb0d2020-09-08 17:42:39 +0530107 :export-name="exportFileNameByDate()"
Yoshie Muranakaed06dc12020-06-16 12:12:27 -0700108 :data-test-id="`eventLogs-button-deleteRow-${row.index}`"
Sukanya Pandeyedb8a772020-10-29 11:33:42 +0530109 @click-table-action="onTableRowAction($event, row.item)"
Yoshie Muranakabe3af332020-05-11 08:23:04 -0700110 >
Derick Montague602e98a2020-10-21 16:20:00 -0500111 <template #icon>
Yoshie Muranakabe3af332020-05-11 08:23:04 -0700112 <icon-export v-if="action.value === 'export'" />
113 <icon-trashcan v-if="action.value === 'delete'" />
114 </template>
115 </table-row-action>
116 </template>
Yoshie Muranaka6f102342020-05-05 09:45:39 -0700117 </b-table>
118 </b-col>
119 </b-row>
Yoshie Muranakaf9832b02020-05-12 12:04:46 -0700120
121 <!-- Table pagination -->
122 <b-row>
SurenNewarea35b5a12020-10-13 17:08:20 +0530123 <b-col sm="6">
Yoshie Muranakaf9832b02020-05-12 12:04:46 -0700124 <b-form-group
125 class="table-pagination-select"
126 :label="$t('global.table.itemsPerPage')"
127 label-for="pagination-items-per-page"
128 >
129 <b-form-select
130 id="pagination-items-per-page"
131 v-model="perPage"
132 :options="itemsPerPageOptions"
133 />
134 </b-form-group>
SurenNewarea35b5a12020-10-13 17:08:20 +0530135 </b-col>
136 <b-col sm="6">
Yoshie Muranakaf9832b02020-05-12 12:04:46 -0700137 <b-pagination
138 v-model="currentPage"
139 first-number
140 last-number
141 :per-page="perPage"
142 :total-rows="getTotalRowCount(filteredLogs.length)"
143 aria-controls="table-event-logs"
144 />
145 </b-col>
146 </b-row>
Yoshie Muranaka6f102342020-05-05 09:45:39 -0700147 </b-container>
148</template>
149
150<script>
Yoshie Muranakabe3af332020-05-11 08:23:04 -0700151import IconTrashcan from '@carbon/icons-vue/es/trash-can/20';
Sukanya Pandeyb2ca0c02020-07-20 23:23:29 +0530152import IconExport from '@carbon/icons-vue/es/document--export/20';
Yoshie Muranakabe3af332020-05-11 08:23:04 -0700153import { omit } from 'lodash';
154
Yoshie Muranaka6f102342020-05-05 09:45:39 -0700155import PageTitle from '@/components/Global/PageTitle';
156import StatusIcon from '@/components/Global/StatusIcon';
Derick Montagued853fba2020-07-16 11:24:10 -0500157import Search from '@/components/Global/Search';
Sukanya Pandey99010962020-07-27 21:44:47 +0530158import TableCellCount from '@/components/Global/TableCellCount';
Yoshie Muranaka68bbba22020-05-18 09:49:37 -0700159import TableDateFilter from '@/components/Global/TableDateFilter';
Yoshie Muranaka6f102342020-05-05 09:45:39 -0700160import TableFilter from '@/components/Global/TableFilter';
Yoshie Muranakabe3af332020-05-11 08:23:04 -0700161import TableRowAction from '@/components/Global/TableRowAction';
162import TableToolbar from '@/components/Global/TableToolbar';
163import TableToolbarExport from '@/components/Global/TableToolbarExport';
Yoshie Muranaka6f102342020-05-05 09:45:39 -0700164
165import LoadingBarMixin from '@/components/Mixins/LoadingBarMixin';
166import TableFilterMixin from '@/components/Mixins/TableFilterMixin';
Yoshie Muranakaf9832b02020-05-12 12:04:46 -0700167import BVPaginationMixin from '@/components/Mixins/BVPaginationMixin';
Yoshie Muranakabe3af332020-05-11 08:23:04 -0700168import BVTableSelectableMixin from '@/components/Mixins/BVTableSelectableMixin';
169import BVToastMixin from '@/components/Mixins/BVToastMixin';
Yoshie Muranaka73e419a2020-06-18 13:08:19 -0700170import TableDataFormatterMixin from '@/components/Mixins/TableDataFormatterMixin';
171import TableSortMixin from '@/components/Mixins/TableSortMixin';
Dixsie Wolmers9b22b492020-09-07 21:26:06 -0500172import SearchFilterMixin from '@/components/Mixins/SearchFilterMixin';
Yoshie Muranaka6f102342020-05-05 09:45:39 -0700173
174export default {
Yoshie Muranakaf9832b02020-05-12 12:04:46 -0700175 components: {
Yoshie Muranakabe3af332020-05-11 08:23:04 -0700176 IconExport,
177 IconTrashcan,
Yoshie Muranakaf9832b02020-05-12 12:04:46 -0700178 PageTitle,
Yoshie Muranaka193c22a2020-06-30 20:54:10 -0700179 Search,
Yoshie Muranakaf9832b02020-05-12 12:04:46 -0700180 StatusIcon,
Sukanya Pandey99010962020-07-27 21:44:47 +0530181 TableCellCount,
Yoshie Muranakabe3af332020-05-11 08:23:04 -0700182 TableFilter,
183 TableRowAction,
184 TableToolbar,
Yoshie Muranaka68bbba22020-05-18 09:49:37 -0700185 TableToolbarExport,
Derick Montague602e98a2020-10-21 16:20:00 -0500186 TableDateFilter,
Yoshie Muranakaf9832b02020-05-12 12:04:46 -0700187 },
Yoshie Muranakabe3af332020-05-11 08:23:04 -0700188 mixins: [
189 BVPaginationMixin,
190 BVTableSelectableMixin,
191 BVToastMixin,
192 LoadingBarMixin,
Yoshie Muranaka73e419a2020-06-18 13:08:19 -0700193 TableFilterMixin,
194 TableDataFormatterMixin,
Dixsie Wolmers9b22b492020-09-07 21:26:06 -0500195 TableSortMixin,
Derick Montague602e98a2020-10-21 16:20:00 -0500196 SearchFilterMixin,
Yoshie Muranakabe3af332020-05-11 08:23:04 -0700197 ],
Derick Montague602e98a2020-10-21 16:20:00 -0500198 beforeRouteLeave(to, from, next) {
199 // Hide loader if the user navigates to another page
200 // before request is fulfilled.
201 this.hideLoader();
202 next();
203 },
Yoshie Muranaka6f102342020-05-05 09:45:39 -0700204 data() {
205 return {
206 fields: [
207 {
Yoshie Muranakabe3af332020-05-11 08:23:04 -0700208 key: 'checkbox',
Derick Montague602e98a2020-10-21 16:20:00 -0500209 sortable: false,
Yoshie Muranakabe3af332020-05-11 08:23:04 -0700210 },
211 {
Yoshie Muranaka6f102342020-05-05 09:45:39 -0700212 key: 'id',
213 label: this.$t('pageEventLogs.table.id'),
Derick Montague602e98a2020-10-21 16:20:00 -0500214 sortable: true,
Yoshie Muranaka6f102342020-05-05 09:45:39 -0700215 },
216 {
217 key: 'severity',
218 label: this.$t('pageEventLogs.table.severity'),
Dixsie Wolmersa04d46f2020-10-22 06:34:56 -0500219 sortable: true,
Derick Montague602e98a2020-10-21 16:20:00 -0500220 tdClass: 'text-nowrap',
Yoshie Muranaka6f102342020-05-05 09:45:39 -0700221 },
222 {
223 key: 'type',
224 label: this.$t('pageEventLogs.table.type'),
Derick Montague602e98a2020-10-21 16:20:00 -0500225 sortable: true,
Yoshie Muranaka6f102342020-05-05 09:45:39 -0700226 },
227 {
228 key: 'date',
229 label: this.$t('pageEventLogs.table.date'),
Derick Montague602e98a2020-10-21 16:20:00 -0500230 sortable: true,
Yoshie Muranaka6f102342020-05-05 09:45:39 -0700231 },
232 {
233 key: 'description',
Derick Montague602e98a2020-10-21 16:20:00 -0500234 label: this.$t('pageEventLogs.table.description'),
Yoshie Muranakabe3af332020-05-11 08:23:04 -0700235 },
236 {
237 key: 'actions',
238 sortable: false,
239 label: '',
Derick Montague602e98a2020-10-21 16:20:00 -0500240 tdClass: 'text-right text-nowrap',
241 },
Yoshie Muranaka6f102342020-05-05 09:45:39 -0700242 ],
243 tableFilters: [
244 {
Yoshie Muranaka00454002020-06-22 09:14:05 -0700245 key: 'severity',
Yoshie Muranaka6f102342020-05-05 09:45:39 -0700246 label: this.$t('pageEventLogs.table.severity'),
Derick Montague602e98a2020-10-21 16:20:00 -0500247 values: ['OK', 'Warning', 'Critical'],
248 },
Yoshie Muranaka6f102342020-05-05 09:45:39 -0700249 ],
Yoshie Muranakabe3af332020-05-11 08:23:04 -0700250 activeFilters: [],
251 batchActions: [
252 {
253 value: 'delete',
Derick Montague602e98a2020-10-21 16:20:00 -0500254 label: this.$t('global.action.delete'),
255 },
Yoshie Muranaka68bbba22020-05-18 09:49:37 -0700256 ],
257 filterStartDate: null,
Yoshie Muranaka193c22a2020-06-30 20:54:10 -0700258 filterEndDate: null,
Derick Montague602e98a2020-10-21 16:20:00 -0500259 searchTotalFilteredRows: 0,
Yoshie Muranaka6f102342020-05-05 09:45:39 -0700260 };
261 },
262 computed: {
Sukanya Pandey99010962020-07-27 21:44:47 +0530263 filteredRows() {
264 return this.searchFilter
265 ? this.searchTotalFilteredRows
266 : this.filteredLogs.length;
267 },
Yoshie Muranaka6f102342020-05-05 09:45:39 -0700268 allLogs() {
Derick Montague602e98a2020-10-21 16:20:00 -0500269 return this.$store.getters['eventLog/allEvents'].map((event) => {
Yoshie Muranakabe3af332020-05-11 08:23:04 -0700270 return {
271 ...event,
272 actions: [
273 {
274 value: 'export',
Derick Montague602e98a2020-10-21 16:20:00 -0500275 title: this.$t('global.action.export'),
Yoshie Muranakabe3af332020-05-11 08:23:04 -0700276 },
277 {
278 value: 'delete',
Derick Montague602e98a2020-10-21 16:20:00 -0500279 title: this.$t('global.action.delete'),
280 },
281 ],
Yoshie Muranakabe3af332020-05-11 08:23:04 -0700282 };
283 });
Yoshie Muranaka6f102342020-05-05 09:45:39 -0700284 },
Yoshie Muranakabe3af332020-05-11 08:23:04 -0700285 batchExportData() {
Derick Montague602e98a2020-10-21 16:20:00 -0500286 return this.selectedRows.map((row) => omit(row, 'actions'));
Yoshie Muranaka68bbba22020-05-18 09:49:37 -0700287 },
288 filteredLogsByDate() {
289 return this.getFilteredTableDataByDate(
290 this.allLogs,
291 this.filterStartDate,
292 this.filterEndDate
293 );
294 },
295 filteredLogs() {
296 return this.getFilteredTableData(
297 this.filteredLogsByDate,
298 this.activeFilters
299 );
Derick Montague602e98a2020-10-21 16:20:00 -0500300 },
Yoshie Muranaka6f102342020-05-05 09:45:39 -0700301 },
302 created() {
303 this.startLoader();
304 this.$store
305 .dispatch('eventLog/getEventLogData')
306 .finally(() => this.endLoader());
307 },
Yoshie Muranaka6f102342020-05-05 09:45:39 -0700308 methods: {
Yoshie Muranakabe3af332020-05-11 08:23:04 -0700309 deleteLogs(uris) {
Derick Montague602e98a2020-10-21 16:20:00 -0500310 this.$store
311 .dispatch('eventLog/deleteEventLogs', uris)
312 .then((messages) => {
313 messages.forEach(({ type, message }) => {
314 if (type === 'success') {
315 this.successToast(message);
316 } else if (type === 'error') {
317 this.errorToast(message);
318 }
319 });
Yoshie Muranakabe3af332020-05-11 08:23:04 -0700320 });
Yoshie Muranakabe3af332020-05-11 08:23:04 -0700321 },
Yoshie Muranaka6f102342020-05-05 09:45:39 -0700322 onFilterChange({ activeFilters }) {
323 this.activeFilters = activeFilters;
Yoshie Muranaka6f102342020-05-05 09:45:39 -0700324 },
325 onSortCompare(a, b, key) {
326 if (key === 'severity') {
Yoshie Muranaka73e419a2020-06-18 13:08:19 -0700327 return this.sortStatus(a, b, key);
Yoshie Muranaka6f102342020-05-05 09:45:39 -0700328 }
Yoshie Muranakabe3af332020-05-11 08:23:04 -0700329 },
330 onTableRowAction(action, { uri }) {
331 if (action === 'delete') {
332 this.$bvModal
333 .msgBoxConfirm(this.$tc('pageEventLogs.modal.deleteMessage'), {
334 title: this.$tc('pageEventLogs.modal.deleteTitle'),
Derick Montague602e98a2020-10-21 16:20:00 -0500335 okTitle: this.$t('global.action.delete'),
Yoshie Muranakabe3af332020-05-11 08:23:04 -0700336 })
Derick Montague602e98a2020-10-21 16:20:00 -0500337 .then((deleteConfirmed) => {
Yoshie Muranakabe3af332020-05-11 08:23:04 -0700338 if (deleteConfirmed) this.deleteLogs([uri]);
339 });
340 }
341 },
342 onBatchAction(action) {
343 if (action === 'delete') {
Derick Montague602e98a2020-10-21 16:20:00 -0500344 const uris = this.selectedRows.map((row) => row.uri);
Yoshie Muranakabe3af332020-05-11 08:23:04 -0700345 this.$bvModal
346 .msgBoxConfirm(
347 this.$tc(
348 'pageEventLogs.modal.deleteMessage',
349 this.selectedRows.length
350 ),
351 {
352 title: this.$tc(
353 'pageEventLogs.modal.deleteTitle',
354 this.selectedRows.length
355 ),
Derick Montague602e98a2020-10-21 16:20:00 -0500356 okTitle: this.$t('global.action.delete'),
Yoshie Muranakabe3af332020-05-11 08:23:04 -0700357 }
358 )
Derick Montague602e98a2020-10-21 16:20:00 -0500359 .then((deleteConfirmed) => {
Sukanya Pandey2f6d5522020-10-28 10:38:00 +0530360 if (deleteConfirmed) {
361 if (this.selectedRows.length === this.allLogs.length) {
362 this.$store
363 .dispatch(
364 'eventLog/deleteAllEventLogs',
365 this.selectedRows.length
366 )
367 .then((message) => this.successToast(message))
368 .catch(({ message }) => this.errorToast(message));
369 } else {
370 this.deleteLogs(uris);
371 }
372 }
Yoshie Muranakabe3af332020-05-11 08:23:04 -0700373 });
374 }
Yoshie Muranaka68bbba22020-05-18 09:49:37 -0700375 },
376 onChangeDateTimeFilter({ fromDate, toDate }) {
377 this.filterStartDate = fromDate;
378 this.filterEndDate = toDate;
Yoshie Muranaka193c22a2020-06-30 20:54:10 -0700379 },
Sukanya Pandey99010962020-07-27 21:44:47 +0530380 onFiltered(filteredItems) {
381 this.searchTotalFilteredRows = filteredItems.length;
382 },
SurenNeware96ebb0d2020-09-08 17:42:39 +0530383 // Create export file name based on date
384 exportFileNameByDate() {
385 let date = new Date();
386 date =
387 date.toISOString().slice(0, 10) +
388 '_' +
Derick Montague602e98a2020-10-21 16:20:00 -0500389 date.toString().split(':').join('-').split(' ')[4];
SurenNeware96ebb0d2020-09-08 17:42:39 +0530390 return this.$t('pageEventLogs.exportFilePrefix') + date;
Derick Montague602e98a2020-10-21 16:20:00 -0500391 },
392 },
Yoshie Muranaka6f102342020-05-05 09:45:39 -0700393};
394</script>