blob: eba90b7a89e1452964dc1d6ee5d8c357256f4ebc [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">
6 <page-section :section-title="$t('pageDumps.newDump')">
7 <dumps-form />
8 </page-section>
9 </b-col>
10 </b-row>
11 <b-row>
12 <b-col xl="10">
13 <page-section :section-title="$t('pageDumps.dumpHistory')">
14 <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 />
21 <div class="ml-sm-4">
22 <table-cell-count
23 :filtered-items-count="filteredItemCount"
24 :total-number-of-cells="tableItems.length"
25 ></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>
32 <table-toolbar
33 :selected-items-count="selectedRows.length"
34 :actions="batchActions"
35 @clear-selected="clearSelectedRows($refs.table)"
36 @batch-action="onTableBatchAction"
37 />
38 <b-table
39 ref="table"
40 show-empty
41 hover
42 sort-icon-left
43 no-sort-reset
44 selectable
45 no-select-on-click
46 responsive="md"
47 sort-by="dateTime"
48 :fields="fields"
49 :items="filteredTableItems"
50 :empty-text="$t('global.table.emptyMessage')"
51 :empty-filtered-text="$t('global.table.emptySearchMessage')"
52 :filter="searchFilter"
53 @filtered="onChangeSearchFilter"
54 @row-selected="onRowSelected($event, filteredTableItems.length)"
55 >
56 <!-- Checkbox column -->
57 <template #head(checkbox)>
58 <b-form-checkbox
59 v-model="tableHeaderCheckboxModel"
60 :indeterminate="tableHeaderCheckboxIndeterminate"
61 @change="onChangeHeaderCheckbox($refs.table)"
62 >
63 <span class="sr-only">{{ $t('global.table.selectAll') }}</span>
64 </b-form-checkbox>
65 </template>
66 <template #cell(checkbox)="row">
67 <b-form-checkbox
68 v-model="row.rowSelected"
69 @change="toggleSelectRow($refs.table, row.index)"
70 >
71 <span class="sr-only">{{ $t('global.table.selectItem') }}</span>
72 </b-form-checkbox>
73 </template>
74
75 <!-- Date and Time column -->
76 <template #cell(dateTime)="{ value }">
77 <p class="mb-0">{{ value | formatDate }}</p>
78 <p class="mb-0">{{ value | formatTime }}</p>
79 </template>
80
81 <!-- Size column -->
82 <template #cell(size)="{ value }">
83 {{ convertBytesToMegabytes(value) }} MB
84 </template>
85
86 <!-- Actions column -->
87 <template #cell(actions)="row">
88 <table-row-action
89 v-for="(action, index) in row.item.actions"
90 :key="index"
91 :value="action.value"
92 :title="action.title"
93 @click-table-action="onTableRowAction($event, row.item)"
94 >
95 <template #icon>
96 <icon-delete v-if="action.value === 'delete'" />
97 </template>
98 </table-row-action>
99 </template>
100 </b-table>
101 </page-section>
102 </b-col>
103 </b-row>
104 </b-container>
105</template>
106
107<script>
108import IconDelete from '@carbon/icons-vue/es/trash-can/20';
109
110import DumpsForm from './DumpsForm';
111import PageSection from '@/components/Global/PageSection';
112import PageTitle from '@/components/Global/PageTitle';
113import Search from '@/components/Global/Search';
114import TableCellCount from '@/components/Global/TableCellCount';
115import TableDateFilter from '@/components/Global/TableDateFilter';
116import TableRowAction from '@/components/Global/TableRowAction';
117import TableToolbar from '@/components/Global/TableToolbar';
118
119import BVTableSelectableMixin, {
120 selectedRows,
121 tableHeaderCheckboxModel,
122 tableHeaderCheckboxIndeterminate,
123} from '@/components/Mixins/BVTableSelectableMixin';
124import LoadingBarMixin from '@/components/Mixins/LoadingBarMixin';
125import SearchFilterMixin, {
126 searchFilter,
127} from '@/components/Mixins/SearchFilterMixin';
128import TableFilterMixin from '@/components/Mixins/TableFilterMixin';
129
130export default {
131 components: {
132 DumpsForm,
133 IconDelete,
134 PageSection,
135 PageTitle,
136 Search,
137 TableCellCount,
138 TableDateFilter,
139 TableRowAction,
140 TableToolbar,
141 },
142 mixins: [
143 BVTableSelectableMixin,
144 LoadingBarMixin,
145 SearchFilterMixin,
146 TableFilterMixin,
147 ],
148 beforeRouteLeave(to, from, next) {
149 // Hide loader if the user navigates to another page
150 // before request is fulfilled.
151 this.hideLoader();
152 next();
153 },
154 data() {
155 return {
156 fields: [
157 {
158 key: 'checkbox',
159 sortable: false,
160 },
161 {
162 key: 'dateTime',
163 label: this.$t('pageDumps.table.dateAndTime'),
164 sortable: true,
165 },
166 {
167 key: 'dumpType',
168 label: this.$t('pageDumps.table.dumpType'),
169 sortable: true,
170 },
171 {
172 key: 'id',
173 label: this.$t('pageDumps.table.id'),
174 sortable: true,
175 },
176 {
177 key: 'size',
178 label: this.$t('pageDumps.table.size'),
179 sortable: true,
180 },
181 {
182 key: 'actions',
183 sortable: false,
184 label: '',
185 tdClass: 'text-right text-nowrap',
186 },
187 ],
188 batchActions: [
189 {
190 value: 'delete',
191 label: this.$t('global.action.delete'),
192 },
193 ],
194 filterEndDate: null,
195 filterStartDate: null,
196 searchFilter,
197 searchFilteredItemsCount: 0,
198 selectedRows,
199 tableHeaderCheckboxIndeterminate,
200 tableHeaderCheckboxModel,
201 };
202 },
203 computed: {
204 dumps() {
205 return this.$store.getters['dumps/allDumps'];
206 },
207 tableItems() {
208 return this.dumps.map((item) => {
209 return {
210 ...item,
211 actions: [
212 {
213 value: 'delete',
214 title: this.$t('global.action.delete'),
215 },
216 ],
217 };
218 });
219 },
220 filteredTableItems() {
221 return this.getFilteredTableDataByDate(
222 this.tableItems,
223 this.filterStartDate,
224 this.filterEndDate,
225 'dateTime'
226 );
227 },
228 filteredItemCount() {
229 return this.searchFilter
230 ? this.searchFilteredItemsCount
231 : this.filteredTableItems.length;
232 },
233 },
234 created() {
235 this.startLoader();
236 this.$store.dispatch('dumps/getBmcDumps').finally(() => this.endLoader());
237 },
238 methods: {
239 convertBytesToMegabytes(bytes) {
240 return parseFloat((bytes / 1000000).toFixed(3));
241 },
242 onChangeSearchFilter(items) {
243 this.searchFilteredItemsCount = items.length;
244 },
245 onChangeDateTimeFilter({ fromDate, toDate }) {
246 this.filterStartDate = fromDate;
247 this.filterEndDate = toDate;
248 },
249 onTableRowAction(action) {
250 if (action === 'delete') {
251 this.$bvModal
252 .msgBoxConfirm(this.$tc('pageDumps.modal.deleteDumpConfirmation'), {
253 title: this.$tc('pageDumps.modal.deleteDump'),
254 okTitle: this.$tc('pageDumps.modal.deleteDump'),
255 cancelTitle: this.$t('global.action.cancel'),
256 })
257 .then((deleteConfrimed) => {
258 if (deleteConfrimed); // delete dump
259 });
260 }
261 },
262 onTableBatchAction(action) {
263 if (action === 'delete') {
264 this.$bvModal
265 .msgBoxConfirm(
266 this.$tc(
267 'pageDumps.modal.deleteDumpConfirmation',
268 this.selectedRows.length
269 ),
270 {
271 title: this.$tc(
272 'pageDumps.modal.deleteDump',
273 this.selectedRows.length
274 ),
275 okTitle: this.$tc(
276 'pageDumps.modal.deleteDump',
277 this.selectedRows.length
278 ),
279 cancelTitle: this.$t('global.action.cancel'),
280 }
281 )
282 .then((deleteConfrimed) => {
283 if (deleteConfrimed); // delete dump
284 });
285 }
286 },
287 },
288};
289</script>