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