]>
git.proxmox.com Git - proxmox-widget-toolkit.git/blob - src/panel/DiskList.js
1 Ext
.define('pmx-disk-list', {
2 extend
: 'Ext.data.Model',
5 { name
: 'size', type
: 'number' },
6 { name
: 'osdid', type
: 'number', defaultValue
: -1 },
9 convert: function(value
, rec
) {
10 if (value
) return value
;
11 if (rec
.data
.health
) {
12 return rec
.data
.health
;
14 return Proxmox
.Utils
.unknownText
;
19 convert: function(value
, rec
) {
20 if (value
) return value
;
21 if (rec
.data
.devpath
) return rec
.data
.devpath
;
27 convert: function(value
, rec
) {
28 if (value
) return value
;
29 if (rec
.data
.type
) return rec
.data
.type
;
33 'vendor', 'model', 'serial', 'rpm', 'type', 'wearout', 'health',
35 idProperty
: 'devpath',
38 Ext
.define('Proxmox.DiskList', {
39 extend
: 'Ext.tree.Panel',
40 alias
: 'widget.pmxDiskList',
44 emptyText
: gettext('No Disks found'),
47 stateId
: 'tree-node-disks',
50 xclass
: 'Ext.app.ViewController',
54 let view
= me
.getView();
57 if (view
.includePartitions
) {
58 extraParams
['include-partitions'] = 1;
61 let url
= `${view.baseurl}/list`;
64 extraParams
: extraParams
,
70 openSmartWindow: function() {
72 let view
= me
.getView();
73 let selection
= view
.getSelection();
74 if (!selection
|| selection
.length
< 1) return;
76 let rec
= selection
[0];
77 Ext
.create('Proxmox.window.DiskSmart', {
78 baseurl
: view
.baseurl
,
85 let view
= me
.getView();
86 let selection
= view
.getSelection();
87 if (!selection
|| selection
.length
< 1) return;
89 let rec
= selection
[0];
90 Proxmox
.Utils
.API2Request({
91 url
: `${view.exturl}/initgpt`,
94 params
: { disk
: rec
.data
.name
},
95 failure: function(response
, options
) {
96 Ext
.Msg
.alert(gettext('Error'), response
.htmlStatus
);
98 success: function(response
, options
) {
99 var upid
= response
.result
.data
;
100 var win
= Ext
.create('Proxmox.window.TaskProgress', {
102 taskDone: function() {
111 init: function(view
) {
112 let nodename
= view
.nodename
|| 'localhost';
113 view
.baseurl
= `/api2/json/nodes/${nodename}/disks`;
114 view
.exturl
= `/api2/extjs/nodes/${nodename}/disks`;
116 this.store
= Ext
.create('Ext.data.Store', {
117 model
: 'pmx-disk-list',
119 this.store
.on('load', this.onLoad
, this);
121 Proxmox
.Utils
.monStoreErrors(view
, this.store
);
125 onLoad: function(store
, records
, success
, operation
) {
127 let view
= this.getView();
130 Proxmox
.Utils
.setErrorMask(
132 Proxmox
.Utils
.getResponseErrorMessage(operation
.getError()),
139 for (const item
of records
) {
140 let data
= item
.data
;
142 data
.expanded
= true;
144 data
.iconCls
= 'fa fa-fw fa-hdd-o x-fa-tree';
146 disks
[data
.devpath
] = data
;
149 for (const item
of records
) {
150 let data
= item
.data
;
152 disks
[data
.parent
].leaf
= false;
153 disks
[data
.parent
].children
.push(data
);
158 for (const [_
, device
] of Object
.entries(disks
)) {
159 children
.push(device
);
167 Proxmox
.Utils
.setErrorMask(view
, false);
173 text
: gettext('Reload'),
177 xtype
: 'proxmoxButton',
178 text
: gettext('Show S.M.A.R.T. values'),
179 parentXType
: 'treepanel',
181 enableFn: function(rec
) {
182 if (!rec
|| rec
.data
.parent
) {
188 handler
: 'openSmartWindow',
191 xtype
: 'proxmoxButton',
192 text
: gettext('Initialize Disk with GPT'),
193 parentXType
: 'treepanel',
195 enableFn: function(rec
) {
196 if (!rec
|| rec
.data
.parent
||
197 (rec
.data
.used
&& rec
.data
.used
!== 'unused')) {
210 header
: gettext('Device'),
213 dataIndex
: 'devpath',
216 header
: gettext('Type'),
219 dataIndex
: 'disk-type',
220 renderer: function(v
) {
221 if (v
=== undefined) return Proxmox
.Utils
.unknownText
;
223 case 'ssd': return 'SSD';
224 case 'hdd': return 'Hard Disk';
225 case 'usb': return 'USB';
231 header
: gettext('Usage'),
234 renderer: function(v
, metaData
, rec
) {
235 let extendedInfo
= ' ';
238 if (rec
.data
.osdid
!== undefined && rec
.data
.osdid
>= 0) {
239 types
.push(`OSD.${rec.data.osdid.toString()}`);
241 if (rec
.data
.journals
> 0) {
242 types
.push('Journal');
244 if (rec
.data
.db
> 0) {
247 if (rec
.data
.wal
> 0) {
250 if (types
.length
> 0) {
251 extendedInfo
= `, Ceph (${types.join(', ')})`;
254 return v
? `${v}${extendedInfo}` : Proxmox
.Utils
.noText
;
259 header
: gettext('Size'),
263 renderer
: Proxmox
.Utils
.format_size
,
270 renderer
: Proxmox
.Utils
.format_boolean
,
274 header
: gettext('Vendor'),
278 renderer
: Ext
.String
.htmlEncode
,
282 header
: gettext('Model'),
285 renderer
: Ext
.String
.htmlEncode
,
289 header
: gettext('Serial'),
292 renderer
: Ext
.String
.htmlEncode
,
296 header
: 'S.M.A.R.T.',
299 renderer
: Ext
.String
.htmlEncode
,
307 dataIndex
: 'wearout',
308 renderer: function(value
) {
309 if (Ext
.isNumeric(value
)) {
310 return (100 - value
).toString() + '%';
318 itemdblclick
: 'openSmartWindow',