]>
git.proxmox.com Git - proxmox-widget-toolkit.git/blob - src/panel/DiskList.js
ad965c899500fe1e80aa43890f564fbff61fa0b5
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
;
15 if (rec
.data
.type
=== 'partition') {
19 return Proxmox
.Utils
.unknownText
;
24 convert: function(value
, rec
) {
25 if (value
) return value
;
26 if (rec
.data
.devpath
) return rec
.data
.devpath
;
32 convert: function(value
, rec
) {
33 if (value
) return value
;
34 if (rec
.data
.type
) return rec
.data
.type
;
38 'vendor', 'model', 'serial', 'rpm', 'type', 'wearout', 'health',
40 idProperty
: 'devpath',
43 Ext
.define('Proxmox.DiskList', {
44 extend
: 'Ext.tree.Panel',
45 alias
: 'widget.pmxDiskList',
49 emptyText
: gettext('No Disks found'),
52 stateId
: 'tree-node-disks',
55 xclass
: 'Ext.app.ViewController',
59 let view
= me
.getView();
62 if (view
.includePartitions
) {
63 extraParams
['include-partitions'] = 1;
66 let url
= `${view.baseurl}/list`;
69 extraParams
: extraParams
,
75 openSmartWindow: function() {
77 let view
= me
.getView();
78 let selection
= view
.getSelection();
79 if (!selection
|| selection
.length
< 1) return;
81 let rec
= selection
[0];
82 Ext
.create('Proxmox.window.DiskSmart', {
83 baseurl
: view
.baseurl
,
90 let view
= me
.getView();
91 let selection
= view
.getSelection();
92 if (!selection
|| selection
.length
< 1) return;
94 let rec
= selection
[0];
95 Proxmox
.Utils
.API2Request({
96 url
: `${view.exturl}/initgpt`,
99 params
: { disk
: rec
.data
.name
},
100 failure: function(response
, options
) {
101 Ext
.Msg
.alert(gettext('Error'), response
.htmlStatus
);
103 success: function(response
, options
) {
104 var upid
= response
.result
.data
;
105 var win
= Ext
.create('Proxmox.window.TaskProgress', {
107 taskDone: function() {
116 init: function(view
) {
117 let nodename
= view
.nodename
|| 'localhost';
118 view
.baseurl
= `/api2/json/nodes/${nodename}/disks`;
119 view
.exturl
= `/api2/extjs/nodes/${nodename}/disks`;
121 this.store
= Ext
.create('Ext.data.Store', {
122 model
: 'pmx-disk-list',
124 this.store
.on('load', this.onLoad
, this);
126 Proxmox
.Utils
.monStoreErrors(view
, this.store
);
130 onLoad: function(store
, records
, success
, operation
) {
132 let view
= this.getView();
135 Proxmox
.Utils
.setErrorMask(
137 Proxmox
.Utils
.getResponseErrorMessage(operation
.getError()),
144 for (const item
of records
) {
145 let data
= item
.data
;
147 data
.expanded
= true;
149 data
.iconCls
= 'fa fa-fw fa-hdd-o x-fa-tree';
151 disks
[data
.devpath
] = data
;
154 for (const item
of records
) {
155 let data
= item
.data
;
157 disks
[data
.parent
].leaf
= false;
158 disks
[data
.parent
].children
.push(data
);
163 for (const [_
, device
] of Object
.entries(disks
)) {
164 children
.push(device
);
172 Proxmox
.Utils
.setErrorMask(view
, false);
178 text
: gettext('Reload'),
182 xtype
: 'proxmoxButton',
183 text
: gettext('Show S.M.A.R.T. values'),
184 parentXType
: 'treepanel',
186 enableFn: function(rec
) {
187 if (!rec
|| rec
.data
.parent
) {
193 handler
: 'openSmartWindow',
196 xtype
: 'proxmoxButton',
197 text
: gettext('Initialize Disk with GPT'),
198 parentXType
: 'treepanel',
200 enableFn: function(rec
) {
201 if (!rec
|| rec
.data
.parent
||
202 (rec
.data
.used
&& rec
.data
.used
!== 'unused')) {
215 header
: gettext('Device'),
218 dataIndex
: 'devpath',
221 header
: gettext('Type'),
224 dataIndex
: 'disk-type',
225 renderer: function(v
) {
226 if (v
=== undefined) return Proxmox
.Utils
.unknownText
;
228 case 'ssd': return 'SSD';
229 case 'hdd': return 'Hard Disk';
230 case 'usb': return 'USB';
236 header
: gettext('Usage'),
239 renderer: function(v
, metaData
, rec
) {
240 let extendedInfo
= '';
243 if (rec
.data
.osdid
!== undefined && rec
.data
.osdid
>= 0) {
244 types
.push(`OSD.${rec.data.osdid.toString()}`);
246 if (rec
.data
.journals
> 0) {
247 types
.push('Journal');
249 if (rec
.data
.db
> 0) {
252 if (rec
.data
.wal
> 0) {
255 if (types
.length
> 0) {
256 extendedInfo
= `, Ceph (${types.join(', ')})`;
259 return v
? `${v}${extendedInfo}` : Proxmox
.Utils
.noText
;
264 header
: gettext('Size'),
268 renderer
: Proxmox
.Utils
.format_size
,
275 renderer
: Proxmox
.Utils
.format_boolean
,
279 header
: gettext('Vendor'),
283 renderer
: Ext
.String
.htmlEncode
,
287 header
: gettext('Model'),
290 renderer
: Ext
.String
.htmlEncode
,
294 header
: gettext('Serial'),
297 renderer
: Ext
.String
.htmlEncode
,
301 header
: 'S.M.A.R.T.',
304 renderer
: Ext
.String
.htmlEncode
,
312 dataIndex
: 'wearout',
313 renderer: function(value
) {
314 if (Ext
.isNumeric(value
)) {
315 return (100 - value
).toString() + '%';
323 itemdblclick
: 'openSmartWindow',