blob: d500c363d900a56bc6c16d644333cb66b70fd82c [file] [log] [blame]
Yoshie Muranaka22d4d522020-12-03 10:58:35 -08001<template>
2 <b-container fluid="xl">
3 <page-title />
4 <b-row>
5 <b-col sm="6" lg="5" xl="4">
Yoshie Muranakaf415a082020-12-07 13:04:11 -08006 <page-section :section-title="$t('pageDumps.initiateDump')">
Yoshie Muranaka22d4d522020-12-03 10:58:35 -08007 <dumps-form />
8 </page-section>
9 </b-col>
10 </b-row>
11 <b-row>
12 <b-col xl="10">
Yoshie Muranakaf415a082020-12-07 13:04:11 -080013 <page-section :section-title="$t('pageDumps.dumpsAvailableOnBmc')">
Yoshie Muranaka22d4d522020-12-03 10:58:35 -080014 <b-row class="align-items-start">
15 <b-col sm="8" xl="6" class="d-sm-flex align-items-end">
16 <search
17 :placeholder="$t('pageDumps.table.searchDumps')"
18 @change-search="onChangeSearchInput"
19 @clear-search="onClearSearchInput"
20 />
jason westoverd36ac8a2025-11-03 20:58:59 -060021 <div class="ms-sm-4">
Yoshie Muranaka22d4d522020-12-03 10:58:35 -080022 <table-cell-count
Sukanya Pandeye39b95d2021-08-23 18:11:02 +053023 :filtered-items-count="filteredRows"
24 :total-number-of-cells="allDumps.length"
Yoshie Muranaka22d4d522020-12-03 10:58:35 -080025 ></table-cell-count>
26 </div>
27 </b-col>
28 <b-col sm="8" md="7" xl="6">
29 <table-date-filter @change="onChangeDateTimeFilter" />
30 </b-col>
31 </b-row>
Sukanya Pandeye39b95d2021-08-23 18:11:02 +053032 <b-row>
jason westoverd36ac8a2025-11-03 20:58:59 -060033 <b-col class="text-end">
Sukanya Pandeye39b95d2021-08-23 18:11:02 +053034 <table-filter
35 :filters="tableFilters"
36 @filter-change="onFilterChange"
37 />
38 </b-col>
39 </b-row>
Yoshie Muranaka22d4d522020-12-03 10:58:35 -080040 <table-toolbar
jason westoverd36ac8a2025-11-03 20:58:59 -060041 :selected-items-count="
42 Array.isArray(selectedRows) ? selectedRows.length : 0
43 "
Yoshie Muranaka22d4d522020-12-03 10:58:35 -080044 :actions="batchActions"
45 @clear-selected="clearSelectedRows($refs.table)"
46 @batch-action="onTableBatchAction"
47 />
48 <b-table
49 ref="table"
50 show-empty
51 hover
52 sort-icon-left
jason westoverd36ac8a2025-11-03 20:58:59 -060053 must-sort
54 thead-class="table-light"
55 :sort-desc="[true]"
Yoshie Muranaka22d4d522020-12-03 10:58:35 -080056 selectable
57 no-select-on-click
58 responsive="md"
jason westoverd36ac8a2025-11-03 20:58:59 -060059 :sort-by="['dateTime']"
Yoshie Muranaka22d4d522020-12-03 10:58:35 -080060 :fields="fields"
Sukanya Pandeye39b95d2021-08-23 18:11:02 +053061 :items="filteredDumps"
Yoshie Muranaka22d4d522020-12-03 10:58:35 -080062 :empty-text="$t('global.table.emptyMessage')"
63 :empty-filtered-text="$t('global.table.emptySearchMessage')"
64 :filter="searchFilter"
Kenneth Fullbright41057852021-12-27 16:19:37 -060065 :busy="isBusy"
Nikhil Ashokad7cd12c2024-05-28 11:56:41 +053066 @filtered="onFiltered"
jason westoverd36ac8a2025-11-03 20:58:59 -060067 @row-selected="onRowSelected($event, filteredRows)"
Yoshie Muranaka22d4d522020-12-03 10:58:35 -080068 >
69 <!-- Checkbox column -->
70 <template #head(checkbox)>
71 <b-form-checkbox
72 v-model="tableHeaderCheckboxModel"
73 :indeterminate="tableHeaderCheckboxIndeterminate"
jason westoverd36ac8a2025-11-03 20:58:59 -060074 @change="onChangeHeaderCheckbox($refs.table, $event)"
Yoshie Muranaka22d4d522020-12-03 10:58:35 -080075 >
jason westoverd36ac8a2025-11-03 20:58:59 -060076 <span class="visually-hidden-focusable">
77 {{ $t('global.table.selectAll') }}
78 </span>
Yoshie Muranaka22d4d522020-12-03 10:58:35 -080079 </b-form-checkbox>
80 </template>
81 <template #cell(checkbox)="row">
82 <b-form-checkbox
83 v-model="row.rowSelected"
84 @change="toggleSelectRow($refs.table, row.index)"
85 >
jason westoverd36ac8a2025-11-03 20:58:59 -060086 <span class="visually-hidden-focusable">
87 {{ $t('global.table.selectItem') }}
88 </span>
Yoshie Muranaka22d4d522020-12-03 10:58:35 -080089 </b-form-checkbox>
90 </template>
91
92 <!-- Date and Time column -->
93 <template #cell(dateTime)="{ value }">
Surya Vde23ea22024-07-11 15:19:46 +053094 <p class="mb-0">{{ $filters.formatDate(value) }}</p>
95 <p class="mb-0">{{ $filters.formatTime(value) }}</p>
Yoshie Muranaka22d4d522020-12-03 10:58:35 -080096 </template>
97
98 <!-- Size column -->
99 <template #cell(size)="{ value }">
100 {{ convertBytesToMegabytes(value) }} MB
101 </template>
102
103 <!-- Actions column -->
104 <template #cell(actions)="row">
105 <table-row-action
106 v-for="(action, index) in row.item.actions"
107 :key="index"
108 :value="action.value"
109 :title="action.title"
Yoshie Muranakaa87f3e72021-01-04 14:08:04 -0800110 :download-location="row.item.data"
Sneha Patel3f9cfa22021-06-04 16:06:08 -0500111 :export-name="exportFileName(row)"
Yoshie Muranaka22d4d522020-12-03 10:58:35 -0800112 @click-table-action="onTableRowAction($event, row.item)"
113 >
114 <template #icon>
Yoshie Muranakaa87f3e72021-01-04 14:08:04 -0800115 <icon-download v-if="action.value === 'download'" />
Yoshie Muranaka22d4d522020-12-03 10:58:35 -0800116 <icon-delete v-if="action.value === 'delete'" />
117 </template>
118 </table-row-action>
119 </template>
120 </b-table>
121 </page-section>
122 </b-col>
123 </b-row>
Sukanya Pandeyf7000cd2021-08-26 18:34:49 +0530124 <!-- Table pagination -->
125 <b-row>
126 <b-col sm="6" xl="5">
127 <b-form-group
128 class="table-pagination-select"
129 :label="$t('global.table.itemsPerPage')"
130 label-for="pagination-items-per-page"
131 >
132 <b-form-select
133 id="pagination-items-per-page"
134 v-model="perPage"
135 :options="itemsPerPageOptions"
136 />
137 </b-form-group>
138 </b-col>
139 <b-col sm="6" xl="5">
140 <b-pagination
141 v-model="currentPage"
142 first-number
143 last-number
144 :per-page="perPage"
jason westoverd36ac8a2025-11-03 20:58:59 -0600145 :total-rows="getTotalRowCount(filteredRows)"
Sukanya Pandeyf7000cd2021-08-26 18:34:49 +0530146 aria-controls="table-dump-entries"
147 />
148 </b-col>
149 </b-row>
Yoshie Muranaka22d4d522020-12-03 10:58:35 -0800150 </b-container>
151</template>
152
153<script>
154import IconDelete from '@carbon/icons-vue/es/trash-can/20';
Yoshie Muranakaa87f3e72021-01-04 14:08:04 -0800155import IconDownload from '@carbon/icons-vue/es/download/20';
Yoshie Muranaka22d4d522020-12-03 10:58:35 -0800156import DumpsForm from './DumpsForm';
157import PageSection from '@/components/Global/PageSection';
158import PageTitle from '@/components/Global/PageTitle';
159import Search from '@/components/Global/Search';
160import TableCellCount from '@/components/Global/TableCellCount';
161import TableDateFilter from '@/components/Global/TableDateFilter';
162import TableRowAction from '@/components/Global/TableRowAction';
163import TableToolbar from '@/components/Global/TableToolbar';
Yoshie Muranaka22d4d522020-12-03 10:58:35 -0800164import BVTableSelectableMixin, {
165 selectedRows,
166 tableHeaderCheckboxModel,
167 tableHeaderCheckboxIndeterminate,
168} from '@/components/Mixins/BVTableSelectableMixin';
Yoshie Muranakaf415a082020-12-07 13:04:11 -0800169import BVToastMixin from '@/components/Mixins/BVToastMixin';
Sukanya Pandeyf7000cd2021-08-26 18:34:49 +0530170import BVPaginationMixin, {
171 currentPage,
172 perPage,
173 itemsPerPageOptions,
174} from '@/components/Mixins/BVPaginationMixin';
Yoshie Muranaka22d4d522020-12-03 10:58:35 -0800175import LoadingBarMixin from '@/components/Mixins/LoadingBarMixin';
176import SearchFilterMixin, {
177 searchFilter,
178} from '@/components/Mixins/SearchFilterMixin';
Sukanya Pandeye39b95d2021-08-23 18:11:02 +0530179import TableFilter from '@/components/Global/TableFilter';
Yoshie Muranaka22d4d522020-12-03 10:58:35 -0800180import TableFilterMixin from '@/components/Mixins/TableFilterMixin';
Surya Vde23ea22024-07-11 15:19:46 +0530181import i18n from '@/i18n';
Paul Fertser6e53b142025-01-21 16:19:36 +0000182import { useI18n } from 'vue-i18n';
jason westoverd36ac8a2025-11-03 20:58:59 -0600183import { useModal } from 'bootstrap-vue-next';
Yoshie Muranaka22d4d522020-12-03 10:58:35 -0800184
185export default {
186 components: {
187 DumpsForm,
188 IconDelete,
Yoshie Muranakaa87f3e72021-01-04 14:08:04 -0800189 IconDownload,
Yoshie Muranaka22d4d522020-12-03 10:58:35 -0800190 PageSection,
191 PageTitle,
192 Search,
193 TableCellCount,
194 TableDateFilter,
195 TableRowAction,
196 TableToolbar,
Sukanya Pandeye39b95d2021-08-23 18:11:02 +0530197 TableFilter,
Yoshie Muranaka22d4d522020-12-03 10:58:35 -0800198 },
199 mixins: [
200 BVTableSelectableMixin,
Yoshie Muranakaf415a082020-12-07 13:04:11 -0800201 BVToastMixin,
Sukanya Pandeyf7000cd2021-08-26 18:34:49 +0530202 BVPaginationMixin,
Yoshie Muranaka22d4d522020-12-03 10:58:35 -0800203 LoadingBarMixin,
204 SearchFilterMixin,
205 TableFilterMixin,
206 ],
207 beforeRouteLeave(to, from, next) {
208 // Hide loader if the user navigates to another page
209 // before request is fulfilled.
210 this.hideLoader();
211 next();
212 },
jason westoverd36ac8a2025-11-03 20:58:59 -0600213 setup() {
214 const bvModal = useModal();
215 return { bvModal };
216 },
Yoshie Muranaka22d4d522020-12-03 10:58:35 -0800217 data() {
218 return {
Paul Fertser6e53b142025-01-21 16:19:36 +0000219 $t: useI18n().t,
Kenneth Fullbright41057852021-12-27 16:19:37 -0600220 isBusy: true,
Yoshie Muranaka22d4d522020-12-03 10:58:35 -0800221 fields: [
222 {
223 key: 'checkbox',
224 sortable: false,
225 },
226 {
227 key: 'dateTime',
Surya Vde23ea22024-07-11 15:19:46 +0530228 label: i18n.global.t('pageDumps.table.dateAndTime'),
Yoshie Muranaka22d4d522020-12-03 10:58:35 -0800229 sortable: true,
230 },
231 {
232 key: 'dumpType',
Surya Vde23ea22024-07-11 15:19:46 +0530233 label: i18n.global.t('pageDumps.table.dumpType'),
Yoshie Muranaka22d4d522020-12-03 10:58:35 -0800234 sortable: true,
235 },
236 {
237 key: 'id',
Surya Vde23ea22024-07-11 15:19:46 +0530238 label: i18n.global.t('pageDumps.table.id'),
Yoshie Muranaka22d4d522020-12-03 10:58:35 -0800239 sortable: true,
240 },
241 {
242 key: 'size',
Surya Vde23ea22024-07-11 15:19:46 +0530243 label: i18n.global.t('pageDumps.table.size'),
Yoshie Muranaka22d4d522020-12-03 10:58:35 -0800244 sortable: true,
245 },
246 {
247 key: 'actions',
248 sortable: false,
249 label: '',
jason westoverd36ac8a2025-11-03 20:58:59 -0600250 tdClass: 'text-end text-nowrap',
Yoshie Muranaka22d4d522020-12-03 10:58:35 -0800251 },
252 ],
253 batchActions: [
254 {
255 value: 'delete',
Surya Vde23ea22024-07-11 15:19:46 +0530256 label: i18n.global.t('global.action.delete'),
Yoshie Muranaka22d4d522020-12-03 10:58:35 -0800257 },
258 ],
Sukanya Pandeye39b95d2021-08-23 18:11:02 +0530259 tableFilters: [
260 {
261 key: 'dumpType',
Surya Vde23ea22024-07-11 15:19:46 +0530262 label: i18n.global.t('pageDumps.table.dumpType'),
Sukanya Pandeye39b95d2021-08-23 18:11:02 +0530263 values: [
264 'BMC Dump Entry',
265 'Hostboot Dump Entry',
266 'Resource Dump Entry',
267 'System Dump Entry',
268 ],
269 },
270 ],
271 activeFilters: [],
Sukanya Pandeyf7000cd2021-08-26 18:34:49 +0530272 currentPage: currentPage,
Yoshie Muranaka22d4d522020-12-03 10:58:35 -0800273 filterEndDate: null,
274 filterStartDate: null,
Sukanya Pandeyf7000cd2021-08-26 18:34:49 +0530275 itemsPerPageOptions: itemsPerPageOptions,
276 perPage: perPage,
Yoshie Muranaka22d4d522020-12-03 10:58:35 -0800277 searchFilter,
Sukanya Pandeye39b95d2021-08-23 18:11:02 +0530278 searchTotalFilteredRows: 0,
Yoshie Muranaka22d4d522020-12-03 10:58:35 -0800279 selectedRows,
280 tableHeaderCheckboxIndeterminate,
281 tableHeaderCheckboxModel,
282 };
283 },
284 computed: {
Sukanya Pandeye39b95d2021-08-23 18:11:02 +0530285 filteredRows() {
286 return this.searchFilter
287 ? this.searchTotalFilteredRows
288 : this.filteredDumps.length;
Yoshie Muranaka22d4d522020-12-03 10:58:35 -0800289 },
Sukanya Pandeye39b95d2021-08-23 18:11:02 +0530290 allDumps() {
291 return this.$store.getters['dumps/allDumps'].map((item) => {
Yoshie Muranaka22d4d522020-12-03 10:58:35 -0800292 return {
293 ...item,
294 actions: [
295 {
Yoshie Muranakaa87f3e72021-01-04 14:08:04 -0800296 value: 'download',
Surya Vde23ea22024-07-11 15:19:46 +0530297 title: i18n.global.t('global.action.download'),
Yoshie Muranakaa87f3e72021-01-04 14:08:04 -0800298 },
299 {
Yoshie Muranaka22d4d522020-12-03 10:58:35 -0800300 value: 'delete',
Surya Vde23ea22024-07-11 15:19:46 +0530301 title: i18n.global.t('global.action.delete'),
Yoshie Muranaka22d4d522020-12-03 10:58:35 -0800302 },
303 ],
304 };
305 });
306 },
Sukanya Pandeye39b95d2021-08-23 18:11:02 +0530307 filteredDumpsByDate() {
Yoshie Muranaka22d4d522020-12-03 10:58:35 -0800308 return this.getFilteredTableDataByDate(
Sukanya Pandeye39b95d2021-08-23 18:11:02 +0530309 this.allDumps,
Yoshie Muranaka22d4d522020-12-03 10:58:35 -0800310 this.filterStartDate,
311 this.filterEndDate,
Ed Tanous81323992024-02-27 11:26:24 -0800312 'dateTime',
Yoshie Muranaka22d4d522020-12-03 10:58:35 -0800313 );
314 },
Sukanya Pandeye39b95d2021-08-23 18:11:02 +0530315 filteredDumps() {
316 return this.getFilteredTableData(
317 this.filteredDumpsByDate,
Ed Tanous81323992024-02-27 11:26:24 -0800318 this.activeFilters,
Sukanya Pandeye39b95d2021-08-23 18:11:02 +0530319 );
Yoshie Muranaka22d4d522020-12-03 10:58:35 -0800320 },
321 },
322 created() {
323 this.startLoader();
Kees Trommel210b1272024-06-26 13:10:50 +0200324 this.$store.dispatch('dumps/getAllDumps').finally(() => {
Kenneth Fullbright41057852021-12-27 16:19:37 -0600325 this.endLoader();
326 this.isBusy = false;
327 });
Yoshie Muranaka22d4d522020-12-03 10:58:35 -0800328 },
329 methods: {
330 convertBytesToMegabytes(bytes) {
331 return parseFloat((bytes / 1000000).toFixed(3));
332 },
Sukanya Pandeye39b95d2021-08-23 18:11:02 +0530333 onFilterChange({ activeFilters }) {
334 this.activeFilters = activeFilters;
335 },
336 onFiltered(filteredItems) {
337 this.searchTotalFilteredRows = filteredItems.length;
Yoshie Muranaka22d4d522020-12-03 10:58:35 -0800338 },
339 onChangeDateTimeFilter({ fromDate, toDate }) {
340 this.filterStartDate = fromDate;
341 this.filterEndDate = toDate;
342 },
jason westoverd36ac8a2025-11-03 20:58:59 -0600343 async onTableRowAction(action, item) {
Yoshie Muranaka22d4d522020-12-03 10:58:35 -0800344 if (action === 'delete') {
jason westoverd36ac8a2025-11-03 20:58:59 -0600345 const ok = await this.confirmDialog(
346 i18n.global.t('pageDumps.modal.deleteDumpConfirmation', 1),
347 {
348 title: i18n.global.t('pageDumps.modal.deleteDump', 1),
349 okTitle: i18n.global.t('pageDumps.modal.deleteDump', 1),
350 cancelTitle: i18n.global.t('global.action.cancel'),
351 },
352 );
353 if (ok)
354 this.$store.dispatch('dumps/deleteDumps', [item]).then((messages) => {
355 messages.forEach(({ type, message }) => {
356 if (type === 'success') {
357 this.successToast(message);
358 } else if (type === 'error') {
359 this.errorToast(message);
360 }
361 });
Yoshie Muranaka22d4d522020-12-03 10:58:35 -0800362 });
363 }
364 },
jason westoverd36ac8a2025-11-03 20:58:59 -0600365 async onTableBatchAction(action) {
Yoshie Muranaka22d4d522020-12-03 10:58:35 -0800366 if (action === 'delete') {
jason westoverd36ac8a2025-11-03 20:58:59 -0600367 const ids = (this.selectedRows || []).map((r) => r.Id);
368 const count = ids.length;
369 const ok = await this.confirmDialog(
370 i18n.global.t('pageDumps.modal.deleteDumpConfirmation', count),
371 {
372 title: i18n.global.t('pageDumps.modal.deleteDump', count),
373 okTitle: i18n.global.t('pageDumps.modal.deleteDump', count),
374 cancelTitle: i18n.global.t('global.action.cancel'),
375 },
376 );
377 if (ok) {
378 if (this.selectedRows.length === this.dumps.length) {
379 this.$store
380 .dispatch('dumps/deleteAllDumps')
381 .then((success) => this.successToast(success))
382 .catch(({ message }) => this.errorToast(message));
383 } else {
384 this.$store
385 .dispatch('dumps/deleteDumps', this.selectedRows)
386 .then((messages) => {
387 messages.forEach(({ type, message }) => {
388 if (type === 'success') {
389 this.successToast(message);
390 } else if (type === 'error') {
391 this.errorToast(message);
392 }
393 });
394 });
395 }
396 }
Yoshie Muranaka22d4d522020-12-03 10:58:35 -0800397 }
398 },
Sneha Patel3f9cfa22021-06-04 16:06:08 -0500399 exportFileName(row) {
Gunnar Millscc79a532021-11-30 19:33:42 -0600400 let filename = row.item.dumpType + '_' + row.item.id + '.tar.xz';
Sneha Patel3f9cfa22021-06-04 16:06:08 -0500401 filename = filename.replace(RegExp(' ', 'g'), '_');
402 return filename;
403 },
jason westoverd36ac8a2025-11-03 20:58:59 -0600404 confirmDialog(message, options = {}) {
405 return this.$confirm({ message, ...options });
406 },
Yoshie Muranaka22d4d522020-12-03 10:58:35 -0800407 },
408};
409</script>