Layout fixes

This commit is contained in:
gSpot 2021-03-15 20:28:22 +03:00
parent 2a1d50fc77
commit 3265543379
10 changed files with 201 additions and 203 deletions

View File

@ -7,7 +7,7 @@
include $(TOPDIR)/rules.mk include $(TOPDIR)/rules.mk
PKG_VERSION:=0.3 PKG_VERSION:=0.3
PKG_RELEASE:=3 PKG_RELEASE:=4
LUCI_TITLE:=Information about connected disk devices (partitions, filesystems, SMART). LUCI_TITLE:=Information about connected disk devices (partitions, filesystems, SMART).
LUCI_DEPENDS:=+fdisk +smartmontools +smartmontools-drivedb LUCI_DEPENDS:=+fdisk +smartmontools +smartmontools-drivedb
LUCI_PKGARCH:=all LUCI_PKGARCH:=all

View File

@ -5,16 +5,16 @@ OpenWrt >= 19.07.
**Installation notes:** **Installation notes:**
wget --no-check-certificate -O /tmp/luci-app-disks-info_0.3-3_all.ipk https://github.com/gSpotx2f/luci-app-disks-info/raw/master/packages/19.07/luci-app-disks-info_0.3-3_all.ipk wget --no-check-certificate -O /tmp/luci-app-disks-info_0.3-4_all.ipk https://github.com/gSpotx2f/luci-app-disks-info/raw/master/packages/19.07/luci-app-disks-info_0.3-4_all.ipk
opkg install /tmp/luci-app-disks-info_0.3-3_all.ipk opkg install /tmp/luci-app-disks-info_0.3-4_all.ipk
rm /tmp/luci-app-disks-info_0.3-3_all.ipk rm /tmp/luci-app-disks-info_0.3-4_all.ipk
/etc/init.d/rpcd restart /etc/init.d/rpcd restart
**i18n-ru:** **i18n-ru:**
wget --no-check-certificate -O /tmp/luci-i18n-disks-info-ru_0.3-3_all.ipk https://github.com/gSpotx2f/luci-app-disks-info/raw/master/packages/19.07/luci-i18n-disks-info-ru_0.3-3_all.ipk wget --no-check-certificate -O /tmp/luci-i18n-disks-info-ru_0.3-4_all.ipk https://github.com/gSpotx2f/luci-app-disks-info/raw/master/packages/19.07/luci-i18n-disks-info-ru_0.3-4_all.ipk
opkg install /tmp/luci-i18n-disks-info-ru_0.3-3_all.ipk opkg install /tmp/luci-i18n-disks-info-ru_0.3-4_all.ipk
rm /tmp/luci-i18n-disks-info-ru_0.3-3_all.ipk rm /tmp/luci-i18n-disks-info-ru_0.3-4_all.ipk
**Screenshots:** **Screenshots:**

View File

@ -2,13 +2,17 @@
'require fs'; 'require fs';
'require ui'; 'require ui';
const deviceRegExp = new RegExp('^(h|s)d[a-z]$');
return L.view.extend({ return L.view.extend({
fsSpaceWarning: 90, fsSpaceWarning: 90,
ssdEnduranceWarning: 95,
smartCriticalAttrs: [ 5, 11, 183, 184, 187, 196, 197, 198, 200, 202, 220 ], smartCriticalAttrs: [ 5, 11, 183, 184, 187, 196, 197, 198, 200, 202, 220 ],
smartTempAttrs: [ 190, 194 ], smartTempAttrs: [ 190, 194 ],
deviceRegExp: new RegExp('^(h|s)d[a-z]$'),
getDeviceData: function(device) { getDeviceData: function(device) {
return Promise.all([ return Promise.all([
device, device,
@ -169,14 +173,14 @@ return L.view.extend({
return E([ return E([
E('div', { 'class': 'cbi-value' }, diskInfoTable), E('div', { 'class': 'cbi-value' }, diskInfoTable),
E('div', { 'class': 'cbi-value' }, E('div', { 'class': 'cbi-value' }, [
E('h3', {}, _('Partitions') + ':') E('h3', {}, _('Partitions') + ':'),
), partitionsTable,
E('div', { 'class': 'cbi-value' }, partitionsTable), ]),
E('div', { 'class': 'cbi-value' }, E('div', { 'class': 'cbi-value' }, [
E('h3', {}, _('Filesystems') + ':') E('h3', {}, _('Filesystems') + ':'),
), dfTable,
E('div', { 'class': 'cbi-value' }, dfTable), ]),
]); ]);
}, },
@ -185,14 +189,10 @@ return L.view.extend({
E('span', { 'class': 'label-status ok' }, _('passed')) : E('span', { 'class': 'label-status ok' }, _('passed')) :
E('span', { 'class': 'label-status err' }, _('failed')); E('span', { 'class': 'label-status err' }, _('failed'));
let smartStatus = E('div', { 'class': 'table' }, let smartStatus = E('h5', { 'style': 'width:100% !important; text-align:center !important' }, [
E('div', { 'class': 'tr' }, _('SMART overall-health self-assessment test result:'),
E('div', { 'class': 'td center', 'style': 'font-weight:bold' }, [ smartStatusLabel,
_('SMART overall-health self-assessment test result:'), ]);
smartStatusLabel,
])
)
);
let smartAttrsTable = E('div', { 'class': 'table' }, let smartAttrsTable = E('div', { 'class': 'table' },
E('div', { 'class': 'tr table-titles' }, [ E('div', { 'class': 'tr table-titles' }, [
@ -243,12 +243,10 @@ return L.view.extend({
); );
}; };
return E([ return E('div', { 'class': 'cbi-value' }, [
E('div', { 'class': 'cbi-value' }, E('h3', {}, _('S.M.A.R.T.') + ':'),
E('h3', {}, _('S.M.A.R.T.') + ':') smartStatus,
), smartAttrsTable,
E('div', { 'class': 'cbi-value' }, smartStatus),
E('div', { 'class': 'cbi-value' }, smartAttrsTable),
]); ]);
}, },
@ -267,66 +265,58 @@ return L.view.extend({
]) ])
); );
}; };
return E([ return E('div', { 'class': 'cbi-value' }, [
E('div', { 'class': 'cbi-value' }, E('h3', {}, _('S.M.A.R.T. error log') + ':'),
E('h3', {}, _('S.M.A.R.T. error log') + ':') E('div', { 'style': 'width:100%; max-height:20em; overflow:auto' },
), errorLogTable
E('div', { 'class': 'cbi-value' },
E('div', { 'style': 'width:100%; max-height:20em; overflow:auto' },
errorLogTable
)
), ),
]); ]);
}, },
createTempTable: function(smartObject) { createTempTable: function(smartObject) {
return E([ return E('div', { 'class': 'cbi-value' }, [
E('div', { 'class': 'cbi-value' }, E('h3', {}, _('Temperature') + ':'),
E('h3', {}, _('Temperature') + ':') E('div', { 'class': 'table' }, [
), E('div', {
E('div', { 'class': 'cbi-value' }, 'class': (smartObject.temperature.current >= smartObject.temperature.op_limit_max) ?
E('div', { 'class': 'table' }, [ 'tr err' : (smartObject.temperature.current >= this.diskTempWarning) ?
E('div', { 'tr warn' : 'tr',
'class': (smartObject.temperature.current >= smartObject.temperature.op_limit_max) ? }, [
'tr err' : (smartObject.temperature.current >= this.diskTempWarning) ? E('div', { 'class': 'td left', 'style':'min-width:33%' }, _('Current') + ':'),
'tr warn' : 'tr', E('div', { 'class': 'td left' }, ('current' in smartObject.temperature) ?
}, [ smartObject.temperature.current + ' °C' : null),
E('div', { 'class': 'td left', 'style':'min-width:33%' }, _('Current') + ':'), ]),
E('div', { 'class': 'td left' }, ('current' in smartObject.temperature) ? E('div', { 'class': 'tr' }, [
smartObject.temperature.current + ' °C' : null), E('div', { 'class': 'td left' }, _('Lifetime min') + ':'),
]), E('div', { 'class': 'td left' }, ('lifetime_min' in smartObject.temperature) ?
E('div', { 'class': 'tr' }, [ smartObject.temperature.lifetime_min + ' °C' : null),
E('div', { 'class': 'td left' }, _('Lifetime min') + ':'), ]),
E('div', { 'class': 'td left' }, ('lifetime_min' in smartObject.temperature) ? E('div', { 'class': 'tr' }, [
smartObject.temperature.lifetime_min + ' °C' : null), E('div', { 'class': 'td left' }, _('Lifetime max') + ':'),
]), E('div', { 'class': 'td left' }, ('lifetime_max' in smartObject.temperature) ?
E('div', { 'class': 'tr' }, [ smartObject.temperature.lifetime_max + ' °C' : null),
E('div', { 'class': 'td left' }, _('Lifetime max') + ':'), ]),
E('div', { 'class': 'td left' }, ('lifetime_max' in smartObject.temperature) ? E('div', { 'class': 'tr' }, [
smartObject.temperature.lifetime_max + ' °C' : null), E('div', { 'class': 'td left' }, _('Recommended min') + ':'),
]), E('div', { 'class': 'td left' }, ('op_limit_min' in smartObject.temperature) ?
E('div', { 'class': 'tr' }, [ smartObject.temperature.op_limit_min + ' °C' : null),
E('div', { 'class': 'td left' }, _('Recommended min') + ':'), ]),
E('div', { 'class': 'td left' }, ('op_limit_min' in smartObject.temperature) ? E('div', { 'class': 'tr' }, [
smartObject.temperature.op_limit_min + ' °C' : null), E('div', { 'class': 'td left' }, _('Recommended max') + ':'),
]), E('div', { 'class': 'td left' }, ('op_limit_max' in smartObject.temperature) ?
E('div', { 'class': 'tr' }, [ smartObject.temperature.op_limit_max + ' °C' : null),
E('div', { 'class': 'td left' }, _('Recommended max') + ':'), ]),
E('div', { 'class': 'td left' }, ('op_limit_max' in smartObject.temperature) ? E('div', { 'class': 'tr' }, [
smartObject.temperature.op_limit_max + ' °C' : null), E('div', { 'class': 'td left' }, _('Limit min') + ':'),
]), E('div', { 'class': 'td left' }, ('limit_min' in smartObject.temperature) ?
E('div', { 'class': 'tr' }, [ smartObject.temperature.limit_min + ' °C' : null),
E('div', { 'class': 'td left' }, _('Limit min') + ':'), ]),
E('div', { 'class': 'td left' }, ('limit_min' in smartObject.temperature) ? E('div', { 'class': 'tr' }, [
smartObject.temperature.limit_min + ' °C' : null), E('div', { 'class': 'td left' }, _('Limit max') + ':'),
]), E('div', { 'class': 'td left' }, ('limit_max' in smartObject.temperature) ?
E('div', { 'class': 'tr' }, [ smartObject.temperature.limit_max + ' °C' : null),
E('div', { 'class': 'td left' }, _('Limit max') + ':'), ]),
E('div', { 'class': 'td left' }, ('limit_max' in smartObject.temperature) ? ])
smartObject.temperature.limit_max + ' °C' : null),
]),
])
),
]); ]);
}, },
@ -499,12 +489,10 @@ return L.view.extend({
}; };
return E([ return E([
E('div', { 'class': 'cbi-value' },
E('h3', {},
`${_('SCT temperature history')} (${_('interval')}: ${intervalMin} ${_('min')}.):`)
),
E('div', { 'class': 'cbi-value' }, [ E('div', { 'class': 'cbi-value' }, [
E('div', { 'style': 'width:100%; min-height:' + (svgHeight + 20) + 'px; overflow:auto' }, E('h3', {},
`${_('SCT temperature history')} (${_('interval')}: ${intervalMin} ${_('min')}.):`),
E('div', { 'style': 'width:100%; min-height:' + (svgHeight + 20) + 'px; overflow:auto; margin-top:0.2em' },
E('div', { E('div', {
'style': 'width:' + svgWidth + 'px; height:' + svgHeight + 'px; margin:auto', 'style': 'width:' + svgWidth + 'px; height:' + svgHeight + 'px; margin:auto',
}, svg) }, svg)
@ -529,13 +517,15 @@ return L.view.extend({
), ),
]), ]),
E('div', { 'class': 'cbi-value' }, [ E('div', { 'class': 'cbi-value' }, [
E('label', { 'class': 'cbi-value-title' }), E('label', { 'class': 'cbi-value-title' },
E('div', { 'class': 'cbi-value-field' }, [ _('Write to device memory')
),
E('div', { 'class': 'cbi-value-field' },
E('button', { E('button', {
'class': 'btn cbi-button-apply important', 'class': 'btn cbi-button-apply important',
'click': ui.createHandlerFn(this, this.setSctTempLogInterval, device), 'click': ui.createHandlerFn(this, this.setSctTempLogInterval, device),
}, _('Apply')), }, _('Apply'))
]), ),
E('hr'), E('hr'),
]), ]),
]); ]);
@ -544,36 +534,37 @@ return L.view.extend({
createSsdArea: function(ssdStatObject) { createSsdArea: function(ssdStatObject) {
let ssdPercEndurObj = ssdStatObject.table.find(e => e.offset == 8); let ssdPercEndurObj = ssdStatObject.table.find(e => e.offset == 8);
if(ssdPercEndurObj) { if(ssdPercEndurObj) {
return E([ return E('div', { 'class': 'cbi-value' }, [
E('div', { 'class': 'cbi-value' }, E('h3', {}, _('SSD') + ':'),
E('h3', {}, _('SSD') + ':') E('div', { 'class': 'table' }, [
), E('div', { 'class': 'tr' }, [
E('div', { 'class': 'cbi-value' }, E('div', { 'class': 'td left', 'style':'min-width:33%' },
E('div', { 'class': 'table' }, [ _('Percentage used endurance indicator') + ':'),
E('div', { 'class': 'tr' }, [ E('div', {
E('div', { 'class': 'td left', 'style':'min-width:33%' }, 'class': (ssdPercEndurObj.value >= this.ssdEnduranceWarning) ?
_('Percentage used endurance indicator') + ':'), 'td left warn' : 'td left',
E('div', { 'class': 'td left' }, },
E('div', { E('div', {
'class': 'cbi-progressbar', 'class': 'cbi-progressbar',
'title': ssdPercEndurObj.value + '%', 'title': ssdPercEndurObj.value + '%',
'data-tooltip': _('May not be supported by some devices...'), 'data-tooltip': _('May not be supported by some devices...'),
}, },
E('div', { 'style': 'width:' + ssdPercEndurObj.value + '%' }) E('div', { 'style': 'width:' + ssdPercEndurObj.value + '%' })
) )
), ),
]), ]),
]) ]),
),
]); ]);
}; };
}, },
createDeviceStatistics: function(statObject) { createDeviceStatistics: function(statObject) {
let statsArea = E('div', { 'class': 'cbi-value' }); let statsArea = E('div', { 'class': 'cbi-value' },
E('h3', {}, _('Device statistics') + ':')
);
for(let page of statObject.pages) { for(let page of statObject.pages) {
if(page.number == 5 || page.number == 7) continue; if(page.number == 5 || page.number == 7) continue;
let pageTableTitle = E('h5', {}, _(page.name)); let pageTableTitle = E('h5', { 'style': 'width:100% !important; text-align:left !important' }, _(page.name));
let pageTable = E('div', { 'class': 'table' }); let pageTable = E('div', { 'class': 'table' });
for(let entry of page.table) { for(let entry of page.table) {
pageTable.append( pageTable.append(
@ -586,88 +577,79 @@ return L.view.extend({
statsArea.append(pageTableTitle); statsArea.append(pageTableTitle);
statsArea.append(pageTable); statsArea.append(pageTable);
}; };
return E([ return statsArea;
E('div', { 'class': 'cbi-value' },
E('h3', {}, _('Device statistics') + ':')
),
statsArea,
]);
}, },
createDeviceTable: function(smartObject) { createDeviceTable: function(smartObject) {
return E([ return E('div', { 'class': 'cbi-value' }, [
E('div', { 'class': 'cbi-value' }, E('h3', {}, _('Device') + ':'),
E('h3', {}, _('Device') + ':') E('div', { 'class': 'table' }, [
), E('div', { 'class': 'tr' }, [
E('div', { 'class': 'cbi-value' }, E('div', { 'class': 'td left', 'style':'min-width:33%' }, _('Model Family') + ':'),
E('div', { 'class': 'table' }, [ E('div', { 'class': 'td left' }, smartObject.model_family),
E('div', { 'class': 'tr' }, [ ]),
E('div', { 'class': 'td left', 'style':'min-width:33%' }, _('Model Family') + ':'), E('div', { 'class': 'tr' }, [
E('div', { 'class': 'td left' }, smartObject.model_family), E('div', { 'class': 'td left' }, _('Device Model') + ':'),
]), E('div', { 'class': 'td left' }, smartObject.model_name),
E('div', { 'class': 'tr' }, [ ]),
E('div', { 'class': 'td left' }, _('Device Model') + ':'), E('div', { 'class': 'tr' }, [
E('div', { 'class': 'td left' }, smartObject.model_name), E('div', { 'class': 'td left' }, _('Serial Number') + ':'),
]), E('div', { 'class': 'td left' }, smartObject.serial_number),
E('div', { 'class': 'tr' }, [ ]),
E('div', { 'class': 'td left' }, _('Serial Number') + ':'), E('div', { 'class': 'tr' }, [
E('div', { 'class': 'td left' }, smartObject.serial_number), E('div', { 'class': 'td left' }, _('LU WWN Device Id') + ':'),
]), E('div', { 'class': 'td left' }, ('wwn' in smartObject) ?
E('div', { 'class': 'tr' }, [ Object.values(smartObject.wwn).map(
E('div', { 'class': 'td left' }, _('LU WWN Device Id') + ':'), e => e.toString(16)).join(' ') : null),
E('div', { 'class': 'td left' }, ('wwn' in smartObject) ? ]),
Object.values(smartObject.wwn).map( E('div', { 'class': 'tr' }, [
e => e.toString(16)).join(' ') : null), E('div', { 'class': 'td left' }, _('Firmware Version') + ':'),
]), E('div', { 'class': 'td left' }, smartObject.firmware_version),
E('div', { 'class': 'tr' }, [ ]),
E('div', { 'class': 'td left' }, _('Firmware Version') + ':'), E('div', { 'class': 'tr' }, [
E('div', { 'class': 'td left' }, smartObject.firmware_version), E('div', { 'class': 'td left' }, _('User Capacity') + ':'),
]), E('div', { 'class': 'td left' }, ('user_capacity' in smartObject) ?
E('div', { 'class': 'tr' }, [ `${smartObject.user_capacity.bytes} ${_('bytes')} [${(smartObject.user_capacity.bytes / 1e9).toFixed()} ${_('Gb')}] (${smartObject.user_capacity.blocks} ${_('blocks')})`
E('div', { 'class': 'td left' }, _('User Capacity') + ':'), : null),
E('div', { 'class': 'td left' }, ('user_capacity' in smartObject) ? ]),
`${smartObject.user_capacity.bytes} ${_('bytes')} [${(smartObject.user_capacity.bytes / 1e9).toFixed()} ${_('Gb')}] (${smartObject.user_capacity.blocks} ${_('blocks')})` E('div', { 'class': 'tr' }, [
: null), E('div', { 'class': 'td left' }, `${_('Sector Size')} (${_('logical/physical')}):`),
]), E('div', { 'class': 'td left' }, ('logical_block_size' in smartObject) ?
E('div', { 'class': 'tr' }, [ `${smartObject.logical_block_size} ${_('bytes')} / ${smartObject.physical_block_size} ${_('bytes')}`
E('div', { 'class': 'td left' }, `${_('Sector Size')} (${_('logical/physical')}):`), : null),
E('div', { 'class': 'td left' }, ('logical_block_size' in smartObject) ? ]),
`${smartObject.logical_block_size} ${_('bytes')} / ${smartObject.physical_block_size} ${_('bytes')}` E('div', { 'class': 'tr' }, [
: null), E('div', { 'class': 'td left' }, _('Rotation Rate') + ':'),
]), E('div', { 'class': 'td left' }, (smartObject.rotation_rate === 0) ?
E('div', { 'class': 'tr' }, [ _('Solid State Device') : smartObject.rotation_rate),
E('div', { 'class': 'td left' }, _('Rotation Rate') + ':'), ]),
E('div', { 'class': 'td left' }, (smartObject.rotation_rate === 0) ? E('div', { 'class': 'tr' }, [
_('Solid State Device') : smartObject.rotation_rate), E('div', { 'class': 'td left' }, _('Form Factor') + ':'),
]), E('div', { 'class': 'td left' }, ('form_factor' in smartObject) ?
E('div', { 'class': 'tr' }, [ smartObject.form_factor.name : null),
E('div', { 'class': 'td left' }, _('Form Factor') + ':'), ]),
E('div', { 'class': 'td left' }, ('form_factor' in smartObject) ? E('div', { 'class': 'tr' }, [
smartObject.form_factor.name : null), E('div', { 'class': 'td left' }, _('Device is') + ':'),
]), E('div', { 'class': 'td left' }, smartObject.in_smartctl_database ?
E('div', { 'class': 'tr' }, [ _('In smartctl database [for details use: -P show]') :
E('div', { 'class': 'td left' }, _('Device is') + ':'), _('Not in smartctl database [for details use: -P showall]')),
E('div', { 'class': 'td left' }, smartObject.in_smartctl_database ? ]),
_('In smartctl database [for details use: -P show]') : E('div', { 'class': 'tr' }, [
_('Not in smartctl database [for details use: -P showall]')), E('div', { 'class': 'td left' }, _('ATA Version is') + ':'),
]), E('div', { 'class': 'td left' }, ('ata_version' in smartObject) ?
E('div', { 'class': 'tr' }, [ smartObject.ata_version.string : null),
E('div', { 'class': 'td left' }, _('ATA Version is') + ':'), ]),
E('div', { 'class': 'td left' }, ('ata_version' in smartObject) ? E('div', { 'class': 'tr' }, [
smartObject.ata_version.string : null), E('div', { 'class': 'td left' }, _('SATA Version is') + ':'),
]), E('div', { 'class': 'td left' }, ('sata_version' in smartObject) ?
E('div', { 'class': 'tr' }, [ smartObject.sata_version.string : null),
E('div', { 'class': 'td left' }, _('SATA Version is') + ':'), ]),
E('div', { 'class': 'td left' }, ('sata_version' in smartObject) ? E('div', { 'class': 'tr' }, [
smartObject.sata_version.string : null), E('div', { 'class': 'td left' }, _('Local Time is') + ':'),
]), E('div', { 'class': 'td left' }, ('local_time' in smartObject) ?
E('div', { 'class': 'tr' }, [ smartObject.local_time.asctime : null),
E('div', { 'class': 'td left' }, _('Local Time is') + ':'), ]),
E('div', { 'class': 'td left' }, ('local_time' in smartObject) ? ])
smartObject.local_time.asctime : null),
]),
])
),
]); ]);
}, },
@ -676,7 +658,7 @@ return L.view.extend({
let devices = []; let devices = [];
stat.forEach(e => { stat.forEach(e => {
let fname = e.name; let fname = e.name;
if(deviceRegExp.test(fname)) { if(this.deviceRegExp.test(fname)) {
devices.push('/dev/' + fname); devices.push('/dev/' + fname);
}; };
}); });
@ -685,16 +667,19 @@ return L.view.extend({
}, },
render: function(devices) { render: function(devices) {
document.head.append(E('style', {'type': 'text/css'}, document.head.append(E('style', {'type': 'text/css'},
`.label-status { `
.label-status {
display: inline; display: inline;
margin: 0px 4px !important; margin: 0 4px !important;
padding: 1px 4px; padding: 1px 4px;
-webkit-border-radius: 3px; -webkit-border-radius: 3px;
-moz-border-radius: 3px; -moz-border-radius: 3px;
border-radius: 3px; border-radius: 3px;
text-transform: uppercase; text-transform: uppercase;
font-weight: bold; font-weight: bold;
line-height: 1.6em;
color: #fff !important; color: #fff !important;
} }
.ok { .ok {
@ -705,7 +690,16 @@ return L.view.extend({
} }
.err { .err {
background-color: #ff4e54 !important; background-color: #ff4e54 !important;
}`)); color: #fff !important;
}
.err .td {
color: #fff !important;
}
.err td {
color: #fff !important;
}
`
));
let devicesNode = E('div', { 'class': 'cbi-section fade-in' }, let devicesNode = E('div', { 'class': 'cbi-section fade-in' },
E('div', { 'class': 'cbi-section-node' }, E('div', { 'class': 'cbi-section-node' },
@ -784,7 +778,6 @@ return L.view.extend({
}; };
if('ata_device_statistics' in smartObject) { if('ata_device_statistics' in smartObject) {
let ssdStatObject = smartObject.ata_device_statistics.pages.find(e => e.number == 7); let ssdStatObject = smartObject.ata_device_statistics.pages.find(e => e.number == 7);
if(ssdStatObject) { if(ssdStatObject) {
let ssdArea = this.createSsdArea(ssdStatObject); let ssdArea = this.createSsdArea(ssdStatObject);
if(ssdArea) { if(ssdArea) {
@ -797,7 +790,6 @@ return L.view.extend({
deviceTab.append(this.createDeviceTable(smartObject)); deviceTab.append(this.createDeviceTable(smartObject));
}; };
}; };
}; };
ui.tabs.initTabGroup(tabsContainer.children); ui.tabs.initTabGroup(tabsContainer.children);

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -236,6 +236,9 @@ msgstr ""
msgid "WORST" msgid "WORST"
msgstr "" msgstr ""
msgid "Write to device memory"
msgstr "Записать в память устройства"
msgid "blocks" msgid "blocks"
msgstr "блоков" msgstr "блоков"

View File

@ -226,6 +226,9 @@ msgstr ""
msgid "WORST" msgid "WORST"
msgstr "" msgstr ""
msgid "Write to device memory"
msgstr ""
msgid "blocks" msgid "blocks"
msgstr "" msgstr ""

Binary file not shown.

Before

Width:  |  Height:  |  Size: 573 KiB

After

Width:  |  Height:  |  Size: 567 KiB