blob: 6d8ff9076ec96872f0b6b97c4fbb61f1586dcd63 [file] [log] [blame]
Sandeepa Singh06d53862021-05-24 13:51:09 +05301<template>
2 <b-container fluid="xl">
3 <page-title />
4 <b-row class="align-items-start">
5 <b-col sm="8" xl="6" class="d-sm-flex align-items-end mb-4">
6 <search
7 :placeholder="$t('pagePostCodeLogs.table.searchLogs')"
8 @change-search="onChangeSearchInput"
9 @clear-search="onClearSearchInput"
10 />
11 <div class="ml-sm-4">
12 <table-cell-count
13 :filtered-items-count="filteredRows"
14 :total-number-of-cells="allLogs.length"
15 ></table-cell-count>
16 </div>
17 </b-col>
18 <b-col sm="8" md="7" xl="6">
19 <table-date-filter @change="onChangeDateTimeFilter" />
20 </b-col>
21 </b-row>
22 <b-row>
23 <b-col xl="12" class="text-right">
24 <b-button
Konstantin Aladyshevd8c71c02023-02-15 12:49:11 +000025 variant="link"
26 :disabled="allLogs.length === 0"
27 @click="deleteAllLogs"
28 >
29 <icon-delete /> {{ $t('global.action.deleteAll') }}
30 </b-button>
31 <b-button
Sandeepa Singh06d53862021-05-24 13:51:09 +053032 variant="primary"
33 :disabled="allLogs.length === 0"
34 :download="exportFileNameByDate()"
35 :href="href"
36 >
37 <icon-export /> {{ $t('pagePostCodeLogs.button.exportAll') }}
38 </b-button>
39 </b-col>
40 </b-row>
41 <b-row>
42 <b-col>
43 <table-toolbar
44 ref="toolbar"
45 :selected-items-count="selectedRows.length"
46 @clear-selected="clearSelectedRows($refs.table)"
47 >
Sandeepa Singhb8182882021-08-27 13:20:11 +053048 <template #toolbar-buttons>
Sandeepa Singh06d53862021-05-24 13:51:09 +053049 <table-toolbar-export
50 :data="batchExportData"
Sandeepa Singhb8182882021-08-27 13:20:11 +053051 :file-name="exportFileNameByDate()"
Sandeepa Singh06d53862021-05-24 13:51:09 +053052 />
53 </template>
54 </table-toolbar>
55 <b-table
56 id="table-post-code-logs"
57 ref="table"
58 responsive="md"
59 selectable
60 no-select-on-click
61 sort-icon-left
62 hover
63 no-sort-reset
64 sort-desc
65 show-empty
66 sort-by="id"
67 :fields="fields"
68 :items="filteredLogs"
69 :empty-text="$t('global.table.emptyMessage')"
70 :empty-filtered-text="$t('global.table.emptySearchMessage')"
71 :per-page="perPage"
72 :current-page="currentPage"
73 :filter="searchFilter"
Kenneth Fullbright41057852021-12-27 16:19:37 -060074 :busy="isBusy"
Sandeepa Singh06d53862021-05-24 13:51:09 +053075 @filtered="onFiltered"
76 @row-selected="onRowSelected($event, filteredLogs.length)"
77 >
78 <!-- Checkbox column -->
79 <template #head(checkbox)>
80 <b-form-checkbox
81 v-model="tableHeaderCheckboxModel"
82 data-test-id="postCode-checkbox-selectAll"
83 :indeterminate="tableHeaderCheckboxIndeterminate"
84 @change="onChangeHeaderCheckbox($refs.table)"
85 >
86 <span class="sr-only">{{ $t('global.table.selectAll') }}</span>
87 </b-form-checkbox>
88 </template>
89 <template #cell(checkbox)="row">
90 <b-form-checkbox
91 v-model="row.rowSelected"
92 :data-test-id="`postCode-checkbox-selectRow-${row.index}`"
93 @change="toggleSelectRow($refs.table, row.index)"
94 >
95 <span class="sr-only">{{ $t('global.table.selectItem') }}</span>
96 </b-form-checkbox>
97 </template>
98 <!-- Date column -->
99 <template #cell(date)="{ value }">
Surya Vde23ea22024-07-11 15:19:46 +0530100 <p class="mb-0">{{ $filters.formatDate(value) }}</p>
101 <p class="mb-0">{{ $filters.formatTime(value) }}</p>
Sandeepa Singh06d53862021-05-24 13:51:09 +0530102 </template>
103
104 <!-- Actions column -->
105 <template #cell(actions)="row">
106 <table-row-action
107 v-for="(action, index) in row.item.actions"
108 :key="index"
109 :value="action.value"
110 :title="action.title"
111 :row-data="row.item"
112 :btn-icon-only="true"
113 :export-name="exportFileNameByDate(action.value)"
114 :download-location="row.item.uri"
115 :download-in-new-tab="true"
Sandeepa Singh450bdb02021-08-05 15:51:56 +0530116 :show-button="false"
Sandeepa Singh06d53862021-05-24 13:51:09 +0530117 >
118 <template #icon>
119 <icon-export v-if="action.value === 'export'" />
120 <icon-download v-if="action.value === 'download'" />
121 </template>
122 </table-row-action>
123 </template>
124 </b-table>
125 </b-col>
126 </b-row>
127
128 <!-- Table pagination -->
129 <b-row>
130 <b-col sm="6">
131 <b-form-group
132 class="table-pagination-select"
133 :label="$t('global.table.itemsPerPage')"
134 label-for="pagination-items-per-page"
135 >
136 <b-form-select
137 id="pagination-items-per-page"
138 v-model="perPage"
139 :options="itemsPerPageOptions"
140 />
141 </b-form-group>
142 </b-col>
143 <b-col sm="6">
144 <b-pagination
145 v-model="currentPage"
146 first-number
147 last-number
148 :per-page="perPage"
Sukanya Pandeyf7000cd2021-08-26 18:34:49 +0530149 :total-rows="getTotalRowCount(filteredRows)"
Sandeepa Singh06d53862021-05-24 13:51:09 +0530150 aria-controls="table-post-code-logs"
151 />
152 </b-col>
153 </b-row>
154 </b-container>
155</template>
156
157<script>
Konstantin Aladyshevd8c71c02023-02-15 12:49:11 +0000158import IconDelete from '@carbon/icons-vue/es/trash-can/20';
Sandeepa Singh06d53862021-05-24 13:51:09 +0530159import IconDownload from '@carbon/icons-vue/es/download/20';
160import IconExport from '@carbon/icons-vue/es/document--export/20';
161import { omit } from 'lodash';
162import PageTitle from '@/components/Global/PageTitle';
163import Search from '@/components/Global/Search';
164import TableCellCount from '@/components/Global/TableCellCount';
165import TableDateFilter from '@/components/Global/TableDateFilter';
166import TableRowAction from '@/components/Global/TableRowAction';
167import TableToolbar from '@/components/Global/TableToolbar';
168import TableToolbarExport from '@/components/Global/TableToolbarExport';
169import LoadingBarMixin from '@/components/Mixins/LoadingBarMixin';
170import TableFilterMixin from '@/components/Mixins/TableFilterMixin';
171import BVPaginationMixin, {
172 currentPage,
173 perPage,
174 itemsPerPageOptions,
175} from '@/components/Mixins/BVPaginationMixin';
176import BVTableSelectableMixin, {
177 selectedRows,
178 tableHeaderCheckboxModel,
179 tableHeaderCheckboxIndeterminate,
180} from '@/components/Mixins/BVTableSelectableMixin';
181import BVToastMixin from '@/components/Mixins/BVToastMixin';
Sandeepa Singh06d53862021-05-24 13:51:09 +0530182import TableSortMixin from '@/components/Mixins/TableSortMixin';
183import TableRowExpandMixin, {
184 expandRowLabel,
185} from '@/components/Mixins/TableRowExpandMixin';
186import SearchFilterMixin, {
187 searchFilter,
188} from '@/components/Mixins/SearchFilterMixin';
Surya Vde23ea22024-07-11 15:19:46 +0530189import { useI18n } from 'vue-i18n';
190import i18n from '@/i18n';
Sandeepa Singh06d53862021-05-24 13:51:09 +0530191
192export default {
193 components: {
Konstantin Aladyshevd8c71c02023-02-15 12:49:11 +0000194 IconDelete,
Sandeepa Singh06d53862021-05-24 13:51:09 +0530195 IconExport,
196 IconDownload,
197 PageTitle,
198 Search,
199 TableCellCount,
200 TableRowAction,
201 TableToolbar,
202 TableToolbarExport,
203 TableDateFilter,
204 },
205 mixins: [
206 BVPaginationMixin,
207 BVTableSelectableMixin,
208 BVToastMixin,
209 LoadingBarMixin,
210 TableFilterMixin,
Sandeepa Singh06d53862021-05-24 13:51:09 +0530211 TableSortMixin,
212 TableRowExpandMixin,
213 SearchFilterMixin,
214 ],
215 beforeRouteLeave(to, from, next) {
216 // Hide loader if the user navigates to another page
217 // before request is fulfilled.
218 this.hideLoader();
219 next();
220 },
221 data() {
222 return {
Surya Vde23ea22024-07-11 15:19:46 +0530223 $t: useI18n().t,
Kenneth Fullbright41057852021-12-27 16:19:37 -0600224 isBusy: true,
Sandeepa Singh06d53862021-05-24 13:51:09 +0530225 fields: [
226 {
227 key: 'checkbox',
228 sortable: false,
229 },
230 {
231 key: 'date',
Surya Vde23ea22024-07-11 15:19:46 +0530232 label: i18n.global.t('pagePostCodeLogs.table.created'),
Sandeepa Singhb8182882021-08-27 13:20:11 +0530233 sortable: true,
Sandeepa Singh06d53862021-05-24 13:51:09 +0530234 },
235 {
236 key: 'timeStampOffset',
Surya Vde23ea22024-07-11 15:19:46 +0530237 label: i18n.global.t('pagePostCodeLogs.table.timeStampOffset'),
Sandeepa Singh06d53862021-05-24 13:51:09 +0530238 },
239 {
240 key: 'bootCount',
Surya Vde23ea22024-07-11 15:19:46 +0530241 label: i18n.global.t('pagePostCodeLogs.table.bootCount'),
Sandeepa Singh06d53862021-05-24 13:51:09 +0530242 },
243 {
244 key: 'postCode',
Surya Vde23ea22024-07-11 15:19:46 +0530245 label: i18n.global.t('pagePostCodeLogs.table.postCode'),
Sandeepa Singh06d53862021-05-24 13:51:09 +0530246 },
247 {
248 key: 'actions',
249 label: '',
250 tdClass: 'text-right text-nowrap',
251 },
252 ],
253 expandRowLabel,
254 activeFilters: [],
255 currentPage: currentPage,
256 filterStartDate: null,
257 filterEndDate: null,
258 itemsPerPageOptions: itemsPerPageOptions,
259 perPage: perPage,
260 searchFilter: searchFilter,
261 searchTotalFilteredRows: 0,
262 selectedRows: selectedRows,
263 tableHeaderCheckboxModel: tableHeaderCheckboxModel,
264 tableHeaderCheckboxIndeterminate: tableHeaderCheckboxIndeterminate,
265 };
266 },
267 computed: {
268 href() {
269 return `data:text/json;charset=utf-8,${this.exportAllLogsString()}`;
270 },
271 filteredRows() {
272 return this.searchFilter
273 ? this.searchTotalFilteredRows
274 : this.filteredLogs.length;
275 },
276 allLogs() {
277 return this.$store.getters['postCodeLogs/allPostCodes'].map(
278 (postCodes) => {
279 return {
280 ...postCodes,
281 actions: [
282 {
283 value: 'export',
Surya Vde23ea22024-07-11 15:19:46 +0530284 title: i18n.global.t('pagePostCodeLogs.action.exportLogs'),
Sandeepa Singh06d53862021-05-24 13:51:09 +0530285 },
286 {
287 value: 'download',
Surya Vde23ea22024-07-11 15:19:46 +0530288 title: i18n.global.t('pagePostCodeLogs.action.downloadDetails'),
Sandeepa Singh06d53862021-05-24 13:51:09 +0530289 },
290 ],
291 };
Ed Tanous81323992024-02-27 11:26:24 -0800292 },
Sandeepa Singh06d53862021-05-24 13:51:09 +0530293 );
294 },
295 batchExportData() {
296 return this.selectedRows.map((row) => omit(row, 'actions'));
297 },
298 filteredLogsByDate() {
299 return this.getFilteredTableDataByDate(
300 this.allLogs,
301 this.filterStartDate,
Ed Tanous81323992024-02-27 11:26:24 -0800302 this.filterEndDate,
Sandeepa Singh06d53862021-05-24 13:51:09 +0530303 );
304 },
305 filteredLogs() {
306 return this.getFilteredTableData(
307 this.filteredLogsByDate,
Ed Tanous81323992024-02-27 11:26:24 -0800308 this.activeFilters,
Sandeepa Singh06d53862021-05-24 13:51:09 +0530309 );
310 },
311 },
312 created() {
313 this.startLoader();
Kenneth Fullbright41057852021-12-27 16:19:37 -0600314 this.$store.dispatch('postCodeLogs/getPostCodesLogData').finally(() => {
315 this.endLoader();
316 this.isBusy = false;
317 });
Sandeepa Singh06d53862021-05-24 13:51:09 +0530318 },
319 methods: {
Konstantin Aladyshevd8c71c02023-02-15 12:49:11 +0000320 deleteAllLogs() {
321 this.$bvModal
Surya Vde23ea22024-07-11 15:19:46 +0530322 .msgBoxConfirm(i18n.global.t('pageEventLogs.modal.deleteAllMessage'), {
323 title: i18n.global.t('pageEventLogs.modal.deleteAllTitle'),
324 okTitle: i18n.global.t('global.action.delete'),
Konstantin Aladyshevd8c71c02023-02-15 12:49:11 +0000325 okVariant: 'danger',
Surya Vde23ea22024-07-11 15:19:46 +0530326 cancelTitle: i18n.global.t('global.action.cancel'),
Paul Fertserd1ef18e2024-04-06 08:04:14 +0000327 autoFocusButton: 'cancel',
Konstantin Aladyshevd8c71c02023-02-15 12:49:11 +0000328 })
329 .then((deleteConfirmed) => {
330 if (deleteConfirmed) {
331 this.$store
332 .dispatch('postCodeLogs/deleteAllPostCodeLogs', this.allLogs)
333 .then((message) => this.successToast(message))
334 .catch(({ message }) => this.errorToast(message));
335 }
336 });
337 },
Sandeepa Singh06d53862021-05-24 13:51:09 +0530338 exportAllLogsString() {
339 {
340 return this.$store.getters['postCodeLogs/allPostCodes'].map(
341 (postCodes) => {
342 const allLogsString = JSON.stringify(postCodes);
343 return allLogsString;
Ed Tanous81323992024-02-27 11:26:24 -0800344 },
Sandeepa Singh06d53862021-05-24 13:51:09 +0530345 );
346 }
347 },
348 onFilterChange({ activeFilters }) {
349 this.activeFilters = activeFilters;
350 },
351 onChangeDateTimeFilter({ fromDate, toDate }) {
352 this.filterStartDate = fromDate;
353 this.filterEndDate = toDate;
354 },
355 onFiltered(filteredItems) {
356 this.searchTotalFilteredRows = filteredItems.length;
357 },
358 // Create export file name based on date and action
359 exportFileNameByDate(value) {
360 let date = new Date();
361 date =
362 date.toISOString().slice(0, 10) +
363 '_' +
364 date.toString().split(':').join('-').split(' ')[4];
365 let fileName;
366 if (value === 'download') {
Surya Vde23ea22024-07-11 15:19:46 +0530367 fileName = i18n.global.t('pagePostCodeLogs.downloadFilePrefix');
Sandeepa Singh06d53862021-05-24 13:51:09 +0530368 } else if (value === 'export') {
Surya Vde23ea22024-07-11 15:19:46 +0530369 fileName = i18n.global.t('pagePostCodeLogs.exportFilePrefix');
Sandeepa Singh06d53862021-05-24 13:51:09 +0530370 } else {
Surya Vde23ea22024-07-11 15:19:46 +0530371 fileName = i18n.global.t('pagePostCodeLogs.allExportFilePrefix');
Sandeepa Singh06d53862021-05-24 13:51:09 +0530372 }
373 return fileName + date;
374 },
375 },
376};
377</script>