| <template> |
| <b-container fluid="xl"> |
| <page-title /> |
| <b-row class="align-items-end"> |
| <b-col sm="6" md="5" xl="4"> |
| <search |
| :placeholder="$t('pageSensors.searchForSensors')" |
| data-test-id="sensors-input-searchForSensors" |
| @change-search="onChangeSearchInput" |
| @clear-search="onClearSearchInput" |
| /> |
| </b-col> |
| <b-col sm="3" md="3" xl="2"> |
| <table-cell-count |
| :filtered-items-count="filteredRows" |
| :total-number-of-cells="allSensors.length" |
| ></table-cell-count> |
| </b-col> |
| <b-col sm="3" md="4" xl="6" class="text-right"> |
| <table-filter :filters="tableFilters" @filter-change="onFilterChange" /> |
| </b-col> |
| </b-row> |
| <b-row> |
| <b-col xl="12"> |
| <table-toolbar |
| ref="toolbar" |
| :selected-items-count="selectedRows.length" |
| @clear-selected="clearSelectedRows($refs.table)" |
| > |
| <template #toolbar-buttons> |
| <table-toolbar-export |
| :data="selectedRows" |
| :file-name="exportFileNameByDate()" |
| /> |
| </template> |
| </table-toolbar> |
| <b-table |
| ref="table" |
| responsive="md" |
| selectable |
| no-select-on-click |
| sort-icon-left |
| hover |
| no-sort-reset |
| sticky-header="75vh" |
| sort-by="status" |
| show-empty |
| :no-border-collapse="true" |
| :items="filteredSensors" |
| :fields="fields" |
| :sort-desc="true" |
| :sort-compare="sortCompare" |
| :filter="searchFilter" |
| :empty-text="$t('global.table.emptyMessage')" |
| :empty-filtered-text="$t('global.table.emptySearchMessage')" |
| :busy="isBusy" |
| @filtered="onFiltered" |
| @row-selected="onRowSelected($event, filteredSensors.length)" |
| > |
| <!-- Checkbox column --> |
| <template #head(checkbox)> |
| <b-form-checkbox |
| v-model="tableHeaderCheckboxModel" |
| :indeterminate="tableHeaderCheckboxIndeterminate" |
| @change="onChangeHeaderCheckbox($refs.table)" |
| > |
| <span class="sr-only">{{ $t('global.table.selectAll') }}</span> |
| </b-form-checkbox> |
| </template> |
| <template #cell(checkbox)="row"> |
| <b-form-checkbox |
| v-model="row.rowSelected" |
| @change="toggleSelectRow($refs.table, row.index)" |
| > |
| <span class="sr-only">{{ $t('global.table.selectItem') }}</span> |
| </b-form-checkbox> |
| </template> |
| |
| <template #cell(status)="{ value }"> |
| <status-icon :status="statusIcon(value)" /> {{ value }} |
| </template> |
| <template #cell(currentValue)="data"> |
| {{ data.value }} {{ data.item.units }} |
| </template> |
| <template #cell(lowerCaution)="data"> |
| {{ data.value }} {{ data.item.units }} |
| </template> |
| <template #cell(upperCaution)="data"> |
| {{ data.value }} {{ data.item.units }} |
| </template> |
| <template #cell(lowerCritical)="data"> |
| {{ data.value }} {{ data.item.units }} |
| </template> |
| <template #cell(upperCritical)="data"> |
| {{ data.value }} {{ data.item.units }} |
| </template> |
| </b-table> |
| </b-col> |
| </b-row> |
| </b-container> |
| </template> |
| |
| <script> |
| import PageTitle from '@/components/Global/PageTitle'; |
| import Search from '@/components/Global/Search'; |
| import StatusIcon from '@/components/Global/StatusIcon'; |
| import TableFilter from '@/components/Global/TableFilter'; |
| import TableToolbar from '@/components/Global/TableToolbar'; |
| import TableToolbarExport from '@/components/Global/TableToolbarExport'; |
| import TableCellCount from '@/components/Global/TableCellCount'; |
| |
| import BVTableSelectableMixin, { |
| selectedRows, |
| tableHeaderCheckboxModel, |
| tableHeaderCheckboxIndeterminate, |
| } from '@/components/Mixins/BVTableSelectableMixin'; |
| import LoadingBarMixin from '@/components/Mixins/LoadingBarMixin'; |
| import TableFilterMixin from '@/components/Mixins/TableFilterMixin'; |
| import DataFormatterMixin from '@/components/Mixins/DataFormatterMixin'; |
| import TableSortMixin from '@/components/Mixins/TableSortMixin'; |
| import SearchFilterMixin, { |
| searchFilter, |
| } from '@/components/Mixins/SearchFilterMixin'; |
| |
| export default { |
| name: 'Sensors', |
| components: { |
| PageTitle, |
| Search, |
| StatusIcon, |
| TableCellCount, |
| TableFilter, |
| TableToolbar, |
| TableToolbarExport, |
| }, |
| mixins: [ |
| TableFilterMixin, |
| BVTableSelectableMixin, |
| LoadingBarMixin, |
| DataFormatterMixin, |
| TableSortMixin, |
| SearchFilterMixin, |
| ], |
| beforeRouteLeave(to, from, next) { |
| this.hideLoader(); |
| next(); |
| }, |
| data() { |
| return { |
| isBusy: true, |
| fields: [ |
| { |
| key: 'checkbox', |
| sortable: false, |
| label: '', |
| }, |
| { |
| key: 'name', |
| sortable: true, |
| label: this.$t('pageSensors.table.name'), |
| }, |
| { |
| key: 'status', |
| sortable: true, |
| label: this.$t('pageSensors.table.status'), |
| tdClass: 'text-nowrap', |
| }, |
| { |
| key: 'lowerCritical', |
| formatter: this.dataFormatter, |
| label: this.$t('pageSensors.table.lowerCritical'), |
| }, |
| { |
| key: 'lowerCaution', |
| formatter: this.dataFormatter, |
| label: this.$t('pageSensors.table.lowerWarning'), |
| }, |
| |
| { |
| key: 'currentValue', |
| formatter: this.dataFormatter, |
| label: this.$t('pageSensors.table.currentValue'), |
| }, |
| { |
| key: 'upperCaution', |
| formatter: this.dataFormatter, |
| label: this.$t('pageSensors.table.upperWarning'), |
| }, |
| { |
| key: 'upperCritical', |
| formatter: this.dataFormatter, |
| label: this.$t('pageSensors.table.upperCritical'), |
| }, |
| ], |
| tableFilters: [ |
| { |
| key: 'status', |
| label: this.$t('pageSensors.table.status'), |
| values: [ |
| this.$t('global.action.ok'), |
| this.$t('global.action.warning'), |
| this.$t('global.action.critical'), |
| ], |
| }, |
| ], |
| activeFilters: [], |
| searchFilter: searchFilter, |
| searchTotalFilteredRows: 0, |
| selectedRows: selectedRows, |
| tableHeaderCheckboxModel: tableHeaderCheckboxModel, |
| tableHeaderCheckboxIndeterminate: tableHeaderCheckboxIndeterminate, |
| }; |
| }, |
| computed: { |
| allSensors() { |
| return this.$store.getters['sensors/sensors']; |
| }, |
| filteredRows() { |
| return this.searchFilter |
| ? this.searchTotalFilteredRows |
| : this.filteredSensors.length; |
| }, |
| filteredSensors() { |
| return this.getFilteredTableData(this.allSensors, this.activeFilters); |
| }, |
| }, |
| created() { |
| this.startLoader(); |
| this.$store.dispatch('sensors/getAllSensors').finally(() => { |
| this.endLoader(); |
| this.isBusy = false; |
| }); |
| }, |
| methods: { |
| sortCompare(a, b, key) { |
| if (key === 'status') { |
| return this.sortStatus(a, b, key); |
| } |
| }, |
| onFilterChange({ activeFilters }) { |
| this.activeFilters = activeFilters; |
| }, |
| onFiltered(filteredItems) { |
| this.searchTotalFilteredRows = filteredItems.length; |
| }, |
| onChangeSearchInput(event) { |
| this.searchFilter = event; |
| }, |
| exportFileNameByDate() { |
| // Create export file name based on date |
| let date = new Date(); |
| date = |
| date.toISOString().slice(0, 10) + |
| '_' + |
| date.toString().split(':').join('-').split(' ')[4]; |
| return this.$t('pageSensors.exportFilePrefix') + date; |
| }, |
| }, |
| }; |
| </script> |