summaryrefslogtreecommitdiff
path: root/src/views/_sila/HardwareStatus/Sensors/Sensors.vue
diff options
context:
space:
mode:
Diffstat (limited to 'src/views/_sila/HardwareStatus/Sensors/Sensors.vue')
-rw-r--r--src/views/_sila/HardwareStatus/Sensors/Sensors.vue256
1 files changed, 256 insertions, 0 deletions
diff --git a/src/views/_sila/HardwareStatus/Sensors/Sensors.vue b/src/views/_sila/HardwareStatus/Sensors/Sensors.vue
new file mode 100644
index 00000000..6329d9d8
--- /dev/null
+++ b/src/views/_sila/HardwareStatus/Sensors/Sensors.vue
@@ -0,0 +1,256 @@
+<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: ['OK', 'Warning', '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>