1<template> 2 <b-container fluid="xl"> 3 <page-title /> 4 <b-row class="align-items-end"> 5 <b-col sm="6" md="5" xl="4"> 6 <search 7 :placeholder="$t('pageSensors.searchForSensors')" 8 data-test-id="sensors-input-searchForSensors" 9 @change-search="onChangeSearchInput" 10 @clear-search="onClearSearchInput" 11 /> 12 </b-col> 13 <b-col sm="3" md="3" xl="2"> 14 <table-cell-count 15 :filtered-items-count="filteredRows" 16 :total-number-of-cells="allSensors.length" 17 ></table-cell-count> 18 </b-col> 19 <b-col sm="3" md="4" xl="6" class="text-end"> 20 <table-filter :filters="tableFilters" @filter-change="onFilterChange" /> 21 </b-col> 22 </b-row> 23 <b-row> 24 <b-col xl="12"> 25 <table-toolbar 26 ref="toolbar" 27 :selected-items-count=" 28 Array.isArray(selectedRows) ? selectedRows.length : 0 29 " 30 @clear-selected="clearSelectedRows($refs.table)" 31 > 32 <template #toolbar-buttons> 33 <table-toolbar-export 34 :data="selectedRows" 35 :file-name="exportFileNameByDate()" 36 /> 37 </template> 38 </table-toolbar> 39 <b-table 40 ref="table" 41 responsive="md" 42 selectable 43 no-select-on-click 44 sort-icon-left 45 hover 46 must-sort 47 sticky-header="75vh" 48 thead-class="table-light" 49 :sort-by="['status']" 50 show-empty 51 :items="filteredSensors" 52 :fields="fields" 53 :sort-desc="[true]" 54 :filter="searchFilter" 55 :empty-text="$t('global.table.emptyMessage')" 56 :empty-filtered-text="$t('global.table.emptySearchMessage')" 57 :busy="isBusy" 58 @filtered="onFiltered" 59 @row-selected="onRowSelected($event, filteredSensors.length)" 60 > 61 <!-- Checkbox column --> 62 <template #head(checkbox)> 63 <b-form-checkbox 64 v-model="tableHeaderCheckboxModel" 65 :indeterminate="tableHeaderCheckboxIndeterminate" 66 @change="onChangeHeaderCheckbox($refs.table, $event)" 67 > 68 <span class="visually-hidden-focusable"> 69 {{ $t('global.table.selectAll') }} 70 </span> 71 </b-form-checkbox> 72 </template> 73 <template #cell(checkbox)="row"> 74 <b-form-checkbox 75 v-model="row.rowSelected" 76 @change="toggleSelectRow($refs.table, row.index)" 77 > 78 <span class="visually-hidden-focusable"> 79 {{ $t('global.table.selectItem') }} 80 </span> 81 </b-form-checkbox> 82 </template> 83 84 <template #cell(status)="{ value }"> 85 <status-icon :status="statusIcon(value)" /> {{ value }} 86 </template> 87 <template #cell(currentValue)="data"> 88 {{ data.value }} {{ data.item.units }} 89 </template> 90 <template #cell(lowerCaution)="data"> 91 {{ data.value }} {{ data.item.units }} 92 </template> 93 <template #cell(upperCaution)="data"> 94 {{ data.value }} {{ data.item.units }} 95 </template> 96 <template #cell(lowerCritical)="data"> 97 {{ data.value }} {{ data.item.units }} 98 </template> 99 <template #cell(upperCritical)="data"> 100 {{ data.value }} {{ data.item.units }} 101 </template> 102 </b-table> 103 </b-col> 104 </b-row> 105 </b-container> 106</template> 107 108<script> 109import PageTitle from '@/components/Global/PageTitle'; 110import Search from '@/components/Global/Search'; 111import StatusIcon from '@/components/Global/StatusIcon'; 112import TableFilter from '@/components/Global/TableFilter'; 113import TableToolbar from '@/components/Global/TableToolbar'; 114import TableToolbarExport from '@/components/Global/TableToolbarExport'; 115import TableCellCount from '@/components/Global/TableCellCount'; 116 117import BVTableSelectableMixin, { 118 selectedRows, 119 tableHeaderCheckboxModel, 120 tableHeaderCheckboxIndeterminate, 121} from '@/components/Mixins/BVTableSelectableMixin'; 122import LoadingBarMixin from '@/components/Mixins/LoadingBarMixin'; 123import TableFilterMixin from '@/components/Mixins/TableFilterMixin'; 124import DataFormatterMixin from '@/components/Mixins/DataFormatterMixin'; 125import TableSortMixin from '@/components/Mixins/TableSortMixin'; 126import SearchFilterMixin, { 127 searchFilter, 128} from '@/components/Mixins/SearchFilterMixin'; 129import { useI18n } from 'vue-i18n'; 130import i18n from '@/i18n'; 131 132export default { 133 name: 'Sensors', 134 components: { 135 PageTitle, 136 Search, 137 StatusIcon, 138 TableCellCount, 139 TableFilter, 140 TableToolbar, 141 TableToolbarExport, 142 }, 143 mixins: [ 144 TableFilterMixin, 145 BVTableSelectableMixin, 146 LoadingBarMixin, 147 DataFormatterMixin, 148 TableSortMixin, 149 SearchFilterMixin, 150 ], 151 beforeRouteLeave(to, from, next) { 152 this.hideLoader(); 153 next(); 154 }, 155 data() { 156 return { 157 $t: useI18n().t, 158 isBusy: true, 159 fields: [ 160 { 161 key: 'checkbox', 162 sortable: false, 163 label: '', 164 }, 165 { 166 key: 'name', 167 sortable: true, 168 label: i18n.global.t('pageSensors.table.name'), 169 }, 170 { 171 key: 'status', 172 sortable: true, 173 label: i18n.global.t('pageSensors.table.status'), 174 tdClass: 'text-nowrap', 175 }, 176 { 177 key: 'lowerCritical', 178 formatter: this.dataFormatter, 179 label: i18n.global.t('pageSensors.table.lowerCritical'), 180 }, 181 { 182 key: 'lowerCaution', 183 formatter: this.dataFormatter, 184 label: i18n.global.t('pageSensors.table.lowerWarning'), 185 }, 186 187 { 188 key: 'currentValue', 189 formatter: this.dataFormatter, 190 label: i18n.global.t('pageSensors.table.currentValue'), 191 }, 192 { 193 key: 'upperCaution', 194 formatter: this.dataFormatter, 195 label: i18n.global.t('pageSensors.table.upperWarning'), 196 }, 197 { 198 key: 'upperCritical', 199 formatter: this.dataFormatter, 200 label: i18n.global.t('pageSensors.table.upperCritical'), 201 }, 202 ], 203 tableFilters: [ 204 { 205 key: 'status', 206 label: i18n.global.t('pageSensors.table.status'), 207 values: [ 208 i18n.global.t('global.action.ok'), 209 i18n.global.t('global.action.warning'), 210 i18n.global.t('global.action.critical'), 211 ], 212 }, 213 ], 214 activeFilters: [], 215 searchFilter: searchFilter, 216 searchTotalFilteredRows: 0, 217 selectedRows: selectedRows, 218 tableHeaderCheckboxModel: tableHeaderCheckboxModel, 219 tableHeaderCheckboxIndeterminate: tableHeaderCheckboxIndeterminate, 220 }; 221 }, 222 computed: { 223 allSensors() { 224 return this.$store.getters['sensors/sensors']; 225 }, 226 filteredRows() { 227 return this.searchFilter 228 ? this.searchTotalFilteredRows 229 : this.filteredSensors.length; 230 }, 231 filteredSensors() { 232 return this.getFilteredTableData(this.allSensors, this.activeFilters); 233 }, 234 }, 235 created() { 236 this.startLoader(); 237 this.$store.dispatch('sensors/getAllSensors').finally(() => { 238 this.endLoader(); 239 this.isBusy = false; 240 }); 241 }, 242 methods: { 243 onFilterChange({ activeFilters }) { 244 this.activeFilters = activeFilters; 245 }, 246 onFiltered(filteredItems) { 247 this.searchTotalFilteredRows = filteredItems.length; 248 }, 249 onChangeSearchInput(event) { 250 this.searchFilter = event; 251 }, 252 exportFileNameByDate() { 253 // Create export file name based on date 254 let date = new Date(); 255 date = 256 date.toISOString().slice(0, 10) + 257 '_' + 258 date.toString().split(':').join('-').split(' ')[4]; 259 return i18n.global.t('pageSensors.exportFilePrefix') + date; 260 }, 261 }, 262}; 263</script> 264