xref: /openbmc/webui-vue/src/views/HardwareStatus/Inventory/InventoryTableDimmSlot.vue (revision 80a87851ab2b1bddb9f42cc494b0ad7799b06012)
1<template>
2  <page-section :section-title="$t('pageInventory.dimmSlot')">
3    <b-row class="align-items-end">
4      <b-col sm="6" md="5" xl="4">
5        <search
6          @change-search="onChangeSearchInput"
7          @clear-search="onClearSearchInput"
8        />
9      </b-col>
10      <b-col sm="6" md="3" xl="2">
11        <table-cell-count
12          :filtered-items-count="filteredRows"
13          :total-number-of-cells="dimms.length"
14        ></table-cell-count>
15      </b-col>
16    </b-row>
17    <b-table
18      sort-icon-left
19      no-sort-reset
20      hover
21      sort-by="health"
22      responsive="md"
23      show-empty
24      :items="dimms"
25      :fields="fields"
26      :sort-desc="true"
27      :sort-compare="sortCompare"
28      :filter="searchFilter"
29      :empty-text="$t('global.table.emptyMessage')"
30      :empty-filtered-text="$t('global.table.emptySearchMessage')"
31      :busy="isBusy"
32      @filtered="onFiltered"
33    >
34      <!-- Expand chevron icon -->
35      <template #cell(expandRow)="row">
36        <b-button
37          variant="link"
38          data-test-id="hardwareStatus-button-expandDimms"
39          :title="expandRowLabel"
40          class="btn-icon-only"
41          @click="toggleRowDetails(row)"
42        >
43          <icon-chevron />
44          <span class="sr-only">{{ expandRowLabel }}</span>
45        </b-button>
46      </template>
47
48      <!-- Health -->
49      <template #cell(health)="{ value }">
50        <status-icon :status="statusIcon(value)" />
51        {{ value }}
52      </template>
53      <!-- Toggle identify LED -->
54      <template #cell(identifyLed)="row">
55        <b-form-checkbox
56          v-model="row.item.identifyLed"
57          name="switch"
58          switch
59          @change="toggleIdentifyLedValue(row.item)"
60        >
61          <span v-if="row.item.identifyLed">
62            {{ $t('global.status.on') }}
63          </span>
64          <span v-else> {{ $t('global.status.off') }} </span>
65        </b-form-checkbox>
66      </template>
67      <template #row-details="{ item }">
68        <b-container fluid>
69          <b-row>
70            <b-col sm="6" xl="6">
71              <dl>
72                <!-- Part Number -->
73                <dt>{{ $t('pageInventory.table.partNumber') }}:</dt>
74                <dd>{{ dataFormatter(item.partNumber) }}</dd>
75              </dl>
76              <dl>
77                <!-- Serial Number -->
78                <dt>{{ $t('pageInventory.table.serialNumber') }}:</dt>
79                <dd>{{ dataFormatter(item.serialNumber) }}</dd>
80              </dl>
81              <dl>
82                <!-- Spare Part Number -->
83                <dt>{{ $t('pageInventory.table.sparePartNumber') }}:</dt>
84                <dd>{{ dataFormatter(item.sparePartNumber) }}</dd>
85              </dl>
86              <dl>
87                <!-- Model -->
88                <dt>{{ $t('pageInventory.table.model') }}:</dt>
89                <dd>{{ dataFormatter(item.model) }}</dd>
90              </dl>
91            </b-col>
92            <b-col sm="6" xl="6">
93              <dl>
94                <!-- Memory Size in kb -->
95                <dt>{{ $t('pageInventory.table.memorySize') }}:</dt>
96                <dd>{{ dataFormatter(item.memorySize) }} KB</dd>
97              </dl>
98              <dl>
99                <!-- Status-->
100                <dt>{{ $t('pageInventory.table.statusState') }}:</dt>
101                <dd>{{ dataFormatter(item.statusState) }}</dd>
102              </dl>
103              <dl>
104                <!-- Enabled-->
105                <dt>{{ $t('pageInventory.table.enabled') }}:</dt>
106                <dd>{{ dataFormatter(item.enabled) }}</dd>
107              </dl>
108            </b-col>
109          </b-row>
110          <div class="section-divider mb-3 mt-3"></div>
111          <b-row>
112            <b-col sm="6" xl="6">
113              <dl>
114                <!-- Description -->
115                <dt>{{ $t('pageInventory.table.description') }}:</dt>
116                <dd>{{ dataFormatter(item.description) }}</dd>
117              </dl>
118              <dl>
119                <!-- Memory Type -->
120                <dt>{{ $t('pageInventory.table.memoryType') }}:</dt>
121                <dd>{{ dataFormatter(item.memoryType) }}</dd>
122              </dl>
123              <dl>
124                <!-- Base Module Type -->
125                <dt>{{ $t('pageInventory.table.baseModuleType') }}:</dt>
126                <dd>{{ dataFormatter(item.baseModuleType) }}</dd>
127              </dl>
128              <dl>
129                <!-- Capacity MiB -->
130                <dt>{{ $t('pageInventory.table.capacityMiB') }}:</dt>
131                <dd>{{ dataFormatter(item.capacityMiB) }}</dd>
132              </dl>
133            </b-col>
134            <b-col sm="6" xl="6">
135              <dl>
136                <!-- Bus Width Bits -->
137                <dt>{{ $t('pageInventory.table.busWidthBits') }}:</dt>
138                <dd>{{ dataFormatter(item.busWidthBits) }}</dd>
139              </dl>
140              <dl>
141                <!-- Data Width Bits -->
142                <dt>{{ $t('pageInventory.table.dataWidthBits') }}:</dt>
143                <dd>{{ dataFormatter(item.dataWidthBits) }}</dd>
144              </dl>
145              <dl>
146                <!-- Operating Speed Mhz -->
147                <dt>{{ $t('pageInventory.table.operatingSpeedMhz') }}:</dt>
148                <dd>{{ dataFormatter(item.operatingSpeedMhz) }} MHz</dd>
149              </dl>
150            </b-col>
151          </b-row>
152        </b-container>
153      </template>
154    </b-table>
155  </page-section>
156</template>
157
158<script>
159import PageSection from '@/components/Global/PageSection';
160import IconChevron from '@carbon/icons-vue/es/chevron--down/20';
161
162import StatusIcon from '@/components/Global/StatusIcon';
163import TableCellCount from '@/components/Global/TableCellCount';
164
165import DataFormatterMixin from '@/components/Mixins/DataFormatterMixin';
166import TableSortMixin from '@/components/Mixins/TableSortMixin';
167import Search from '@/components/Global/Search';
168import SearchFilterMixin, {
169  searchFilter,
170} from '@/components/Mixins/SearchFilterMixin';
171import TableRowExpandMixin, {
172  expandRowLabel,
173} from '@/components/Mixins/TableRowExpandMixin';
174
175export default {
176  components: { IconChevron, PageSection, StatusIcon, Search, TableCellCount },
177  mixins: [
178    TableRowExpandMixin,
179    DataFormatterMixin,
180    TableSortMixin,
181    SearchFilterMixin,
182  ],
183  data() {
184    return {
185      isBusy: true,
186      fields: [
187        {
188          key: 'expandRow',
189          label: '',
190          tdClass: 'table-row-expand',
191        },
192        {
193          key: 'id',
194          label: this.$t('pageInventory.table.id'),
195          formatter: this.dataFormatter,
196        },
197        {
198          key: 'health',
199          label: this.$t('pageInventory.table.health'),
200          formatter: this.dataFormatter,
201          tdClass: 'text-nowrap',
202        },
203        {
204          key: 'locationNumber',
205          label: this.$t('pageInventory.table.locationNumber'),
206          formatter: this.dataFormatter,
207        },
208        {
209          key: 'identifyLed',
210          label: this.$t('pageInventory.table.identifyLed'),
211          formatter: this.dataFormatter,
212        },
213      ],
214      searchFilter: searchFilter,
215      searchTotalFilteredRows: 0,
216      expandRowLabel: expandRowLabel,
217    };
218  },
219  computed: {
220    filteredRows() {
221      return this.searchFilter
222        ? this.searchTotalFilteredRows
223        : this.dimms.length;
224    },
225    dimms() {
226      return this.$store.getters['memory/dimms'];
227    },
228  },
229  created() {
230    this.$store.dispatch('memory/getDimms').finally(() => {
231      // Emit initial data fetch complete to parent component
232      this.$root.$emit('hardware-status-dimm-slot-complete');
233      this.isBusy = false;
234    });
235  },
236  methods: {
237    sortCompare(a, b, key) {
238      if (key === 'health') {
239        return this.sortStatus(a, b, key);
240      }
241    },
242    onFiltered(filteredItems) {
243      this.searchTotalFilteredRows = filteredItems.length;
244    },
245    toggleIdentifyLedValue(row) {
246      this.$store
247        .dispatch('memory/updateIdentifyLedValue', {
248          uri: row.uri,
249          identifyLed: row.identifyLed,
250        })
251        .catch(({ message }) => this.errorToast(message));
252    },
253  },
254};
255</script>
256