xref: /openbmc/webui-vue/src/views/HardwareStatus/Inventory/InventoryTableFans.vue (revision 825059ac475c16d5dcbbdb1af2d33d4f73d30f66)
17affc529SSandeepa Singh<template>
27affc529SSandeepa Singh  <page-section :section-title="$t('pageInventory.fans')">
37affc529SSandeepa Singh    <b-row class="align-items-end">
47affc529SSandeepa Singh      <b-col sm="6" md="5" xl="4">
57affc529SSandeepa Singh        <search
67affc529SSandeepa Singh          @change-search="onChangeSearchInput"
77affc529SSandeepa Singh          @clear-search="onClearSearchInput"
87affc529SSandeepa Singh        />
97affc529SSandeepa Singh      </b-col>
107affc529SSandeepa Singh      <b-col sm="6" md="3" xl="2">
117affc529SSandeepa Singh        <table-cell-count
127affc529SSandeepa Singh          :filtered-items-count="filteredRows"
137affc529SSandeepa Singh          :total-number-of-cells="fans.length"
147affc529SSandeepa Singh        ></table-cell-count>
157affc529SSandeepa Singh      </b-col>
167affc529SSandeepa Singh    </b-row>
177affc529SSandeepa Singh    <b-table
187affc529SSandeepa Singh      sort-icon-left
197affc529SSandeepa Singh      no-sort-reset
207affc529SSandeepa Singh      hover
217affc529SSandeepa Singh      responsive="md"
227affc529SSandeepa Singh      sort-by="health"
237affc529SSandeepa Singh      show-empty
247affc529SSandeepa Singh      :items="fans"
257affc529SSandeepa Singh      :fields="fields"
267affc529SSandeepa Singh      :sort-desc="true"
277affc529SSandeepa Singh      :sort-compare="sortCompare"
287affc529SSandeepa Singh      :filter="searchFilter"
297affc529SSandeepa Singh      :empty-text="$t('global.table.emptyMessage')"
307affc529SSandeepa Singh      :empty-filtered-text="$t('global.table.emptySearchMessage')"
3141057853SKenneth Fullbright      :busy="isBusy"
327affc529SSandeepa Singh      @filtered="onFiltered"
337affc529SSandeepa Singh    >
347affc529SSandeepa Singh      <!-- Expand chevron icon -->
357affc529SSandeepa Singh      <template #cell(expandRow)="row">
367affc529SSandeepa Singh        <b-button
377affc529SSandeepa Singh          variant="link"
387affc529SSandeepa Singh          data-test-id="hardwareStatus-button-expandFans"
397affc529SSandeepa Singh          :title="expandRowLabel"
407affc529SSandeepa Singh          class="btn-icon-only"
417affc529SSandeepa Singh          @click="toggleRowDetails(row)"
427affc529SSandeepa Singh        >
437affc529SSandeepa Singh          <icon-chevron />
447affc529SSandeepa Singh          <span class="sr-only">{{ expandRowLabel }}</span>
457affc529SSandeepa Singh        </b-button>
467affc529SSandeepa Singh      </template>
477affc529SSandeepa Singh
487affc529SSandeepa Singh      <!-- Health -->
497affc529SSandeepa Singh      <template #cell(health)="{ value }">
507affc529SSandeepa Singh        <status-icon :status="statusIcon(value)" />
517affc529SSandeepa Singh        {{ value }}
527affc529SSandeepa Singh      </template>
537affc529SSandeepa Singh
54db2940a8SFarah Rasheed      <!-- StatusState -->
55db2940a8SFarah Rasheed      <template #cell(statusState)="{ value }">
56db2940a8SFarah Rasheed        <status-icon :status="statusStateIcon(value)" />
57db2940a8SFarah Rasheed        {{ value }}
58db2940a8SFarah Rasheed      </template>
59db2940a8SFarah Rasheed
607affc529SSandeepa Singh      <template #row-details="{ item }">
617affc529SSandeepa Singh        <b-container fluid>
627affc529SSandeepa Singh          <b-row>
637affc529SSandeepa Singh            <b-col sm="6" xl="4">
647affc529SSandeepa Singh              <dl>
6573d255b6SGlukhov Mikhail                <!-- ID -->
6673d255b6SGlukhov Mikhail                <dt>{{ $t('pageInventory.table.id') }}:</dt>
6773d255b6SGlukhov Mikhail                <dd>{{ dataFormatter(item.id) }}</dd>
687affc529SSandeepa Singh              </dl>
697affc529SSandeepa Singh              <dl>
707affc529SSandeepa Singh                <!-- Serial number -->
717affc529SSandeepa Singh                <dt>{{ $t('pageInventory.table.serialNumber') }}:</dt>
729726f9a7SDixsie Wolmers                <dd>{{ dataFormatter(item.serialNumber) }}</dd>
737affc529SSandeepa Singh              </dl>
747affc529SSandeepa Singh              <dl>
757affc529SSandeepa Singh                <!-- Part number -->
767affc529SSandeepa Singh                <dt>{{ $t('pageInventory.table.partNumber') }}:</dt>
779726f9a7SDixsie Wolmers                <dd>{{ dataFormatter(item.partNumber) }}</dd>
787affc529SSandeepa Singh              </dl>
797affc529SSandeepa Singh              <dl>
807affc529SSandeepa Singh                <!-- Fan speed -->
817affc529SSandeepa Singh                <dt>{{ $t('pageInventory.table.fanSpeed') }}:</dt>
82d0b078f6SGlukhov Mikhail                <dd>
83d0b078f6SGlukhov Mikhail                  {{ dataFormatter(item.speed) }}
84d0b078f6SGlukhov Mikhail                  {{ $t('unit.RPM') }}
85d0b078f6SGlukhov Mikhail                </dd>
867affc529SSandeepa Singh              </dl>
877affc529SSandeepa Singh            </b-col>
887affc529SSandeepa Singh            <b-col sm="6" xl="4">
897affc529SSandeepa Singh              <dl>
907affc529SSandeepa Singh                <!-- Status state -->
917affc529SSandeepa Singh                <dt>{{ $t('pageInventory.table.statusState') }}:</dt>
929726f9a7SDixsie Wolmers                <dd>{{ dataFormatter(item.statusState) }}</dd>
937affc529SSandeepa Singh              </dl>
947affc529SSandeepa Singh              <dl>
957affc529SSandeepa Singh                <!-- Health Rollup state -->
967affc529SSandeepa Singh                <dt>{{ $t('pageInventory.table.statusHealthRollup') }}:</dt>
979726f9a7SDixsie Wolmers                <dd>{{ dataFormatter(item.healthRollup) }}</dd>
987affc529SSandeepa Singh              </dl>
997affc529SSandeepa Singh            </b-col>
1007affc529SSandeepa Singh          </b-row>
1017affc529SSandeepa Singh        </b-container>
1027affc529SSandeepa Singh      </template>
1037affc529SSandeepa Singh    </b-table>
1047affc529SSandeepa Singh  </page-section>
1057affc529SSandeepa Singh</template>
1067affc529SSandeepa Singh
1077affc529SSandeepa Singh<script>
1087affc529SSandeepa Singhimport PageSection from '@/components/Global/PageSection';
1097affc529SSandeepa Singhimport IconChevron from '@carbon/icons-vue/es/chevron--down/20';
1107affc529SSandeepa Singhimport TableCellCount from '@/components/Global/TableCellCount';
1117affc529SSandeepa Singh
1127affc529SSandeepa Singhimport StatusIcon from '@/components/Global/StatusIcon';
1139726f9a7SDixsie Wolmersimport DataFormatterMixin from '@/components/Mixins/DataFormatterMixin';
1147affc529SSandeepa Singhimport TableSortMixin from '@/components/Mixins/TableSortMixin';
1157affc529SSandeepa Singhimport Search from '@/components/Global/Search';
1167affc529SSandeepa Singhimport SearchFilterMixin, {
1177affc529SSandeepa Singh  searchFilter,
1187affc529SSandeepa Singh} from '@/components/Mixins/SearchFilterMixin';
1197affc529SSandeepa Singhimport TableRowExpandMixin, {
1207affc529SSandeepa Singh  expandRowLabel,
1217affc529SSandeepa Singh} from '@/components/Mixins/TableRowExpandMixin';
122de23ea23SSurya Vimport { useI18n } from 'vue-i18n';
123de23ea23SSurya Vimport i18n from '@/i18n';
1247affc529SSandeepa Singh
1257affc529SSandeepa Singhexport default {
1267affc529SSandeepa Singh  components: { IconChevron, PageSection, StatusIcon, Search, TableCellCount },
1277affc529SSandeepa Singh  mixins: [
1287affc529SSandeepa Singh    TableRowExpandMixin,
1299726f9a7SDixsie Wolmers    DataFormatterMixin,
1307affc529SSandeepa Singh    TableSortMixin,
1317affc529SSandeepa Singh    SearchFilterMixin,
1327affc529SSandeepa Singh  ],
1337affc529SSandeepa Singh  data() {
1347affc529SSandeepa Singh    return {
135de23ea23SSurya V      $t: useI18n().t,
13641057853SKenneth Fullbright      isBusy: true,
1377affc529SSandeepa Singh      fields: [
1387affc529SSandeepa Singh        {
1397affc529SSandeepa Singh          key: 'expandRow',
1407affc529SSandeepa Singh          label: '',
1417affc529SSandeepa Singh          tdClass: 'table-row-expand',
1427affc529SSandeepa Singh          sortable: false,
1437affc529SSandeepa Singh        },
1447affc529SSandeepa Singh        {
14573d255b6SGlukhov Mikhail          key: 'name',
146de23ea23SSurya V          label: i18n.global.t('pageInventory.table.name'),
1479726f9a7SDixsie Wolmers          formatter: this.dataFormatter,
1487affc529SSandeepa Singh          sortable: true,
1497affc529SSandeepa Singh        },
1507affc529SSandeepa Singh        {
1517affc529SSandeepa Singh          key: 'health',
152de23ea23SSurya V          label: i18n.global.t('pageInventory.table.health'),
1539726f9a7SDixsie Wolmers          formatter: this.dataFormatter,
1547affc529SSandeepa Singh          sortable: true,
1557affc529SSandeepa Singh          tdClass: 'text-nowrap',
1567affc529SSandeepa Singh        },
1577affc529SSandeepa Singh        {
158db2940a8SFarah Rasheed          key: 'statusState',
159*825059acSSurya Venkatesan          label: i18n.global.t('pageInventory.table.state'),
160db2940a8SFarah Rasheed          formatter: this.dataFormatter,
161db2940a8SFarah Rasheed          tdClass: 'text-nowrap',
162db2940a8SFarah Rasheed        },
163db2940a8SFarah Rasheed        {
1647affc529SSandeepa Singh          key: 'partNumber',
165de23ea23SSurya V          label: i18n.global.t('pageInventory.table.partNumber'),
1669726f9a7SDixsie Wolmers          formatter: this.dataFormatter,
1677affc529SSandeepa Singh          sortable: true,
1687affc529SSandeepa Singh        },
1697affc529SSandeepa Singh        {
1707affc529SSandeepa Singh          key: 'serialNumber',
171de23ea23SSurya V          label: i18n.global.t('pageInventory.table.serialNumber'),
1729726f9a7SDixsie Wolmers          formatter: this.dataFormatter,
1737affc529SSandeepa Singh        },
1747affc529SSandeepa Singh      ],
1757affc529SSandeepa Singh      searchFilter: searchFilter,
1767affc529SSandeepa Singh      searchTotalFilteredRows: 0,
1777affc529SSandeepa Singh      expandRowLabel: expandRowLabel,
1787affc529SSandeepa Singh    };
1797affc529SSandeepa Singh  },
1807affc529SSandeepa Singh  computed: {
1817affc529SSandeepa Singh    filteredRows() {
1827affc529SSandeepa Singh      return this.searchFilter
1837affc529SSandeepa Singh        ? this.searchTotalFilteredRows
1847affc529SSandeepa Singh        : this.fans.length;
1857affc529SSandeepa Singh    },
1867affc529SSandeepa Singh    fans() {
1877affc529SSandeepa Singh      return this.$store.getters['fan/fans'];
1887affc529SSandeepa Singh    },
1897affc529SSandeepa Singh  },
1907affc529SSandeepa Singh  created() {
1917affc529SSandeepa Singh    this.$store.dispatch('fan/getFanInfo').finally(() => {
1927affc529SSandeepa Singh      // Emit initial data fetch complete to parent component
1937affc529SSandeepa Singh      this.$root.$emit('hardware-status-fans-complete');
19441057853SKenneth Fullbright      this.isBusy = false;
1957affc529SSandeepa Singh    });
1967affc529SSandeepa Singh  },
1977affc529SSandeepa Singh  methods: {
1987affc529SSandeepa Singh    sortCompare(a, b, key) {
1997affc529SSandeepa Singh      if (key === 'health') {
2007affc529SSandeepa Singh        return this.sortStatus(a, b, key);
201db2940a8SFarah Rasheed      } else if (key === 'statusState') {
202db2940a8SFarah Rasheed        return this.sortStatusState(a, b, key);
2037affc529SSandeepa Singh      }
2047affc529SSandeepa Singh    },
2057affc529SSandeepa Singh    onFiltered(filteredItems) {
2067affc529SSandeepa Singh      this.searchTotalFilteredRows = filteredItems.length;
2077affc529SSandeepa Singh    },
208db2940a8SFarah Rasheed    /**
209db2940a8SFarah Rasheed     * Returns the appropriate icon based on the given status.
210db2940a8SFarah Rasheed     *
211db2940a8SFarah Rasheed     * @param {string} status - The status to determine the icon for.
212db2940a8SFarah Rasheed     * @return {string} The icon corresponding to the given status.
213db2940a8SFarah Rasheed     */
214db2940a8SFarah Rasheed    statusStateIcon(status) {
215db2940a8SFarah Rasheed      switch (status) {
216db2940a8SFarah Rasheed        case 'Enabled':
217db2940a8SFarah Rasheed          return 'success';
218db2940a8SFarah Rasheed        case 'Absent':
219db2940a8SFarah Rasheed          return 'warning';
220db2940a8SFarah Rasheed        default:
221db2940a8SFarah Rasheed          return '';
222db2940a8SFarah Rasheed      }
223db2940a8SFarah Rasheed    },
224db2940a8SFarah Rasheed    /**
225db2940a8SFarah Rasheed     * Sorts the status state of two objects based on the provided key.
226db2940a8SFarah Rasheed     *
227db2940a8SFarah Rasheed     * @param {Object} a - The first object to compare.
228db2940a8SFarah Rasheed     * @param {Object} b - The second object to compare.
229db2940a8SFarah Rasheed     * @param {string} key - The key to use for comparison.
230db2940a8SFarah Rasheed     */
231db2940a8SFarah Rasheed    sortStatusState(a, b, key) {
232db2940a8SFarah Rasheed      const statusState = ['Enabled', 'Absent'];
233db2940a8SFarah Rasheed      return statusState.indexOf(a[key]) - statusState.indexOf(b[key]);
234db2940a8SFarah Rasheed    },
2357affc529SSandeepa Singh  },
2367affc529SSandeepa Singh};
2377affc529SSandeepa Singh</script>
238