]> git.proxmox.com Git - proxmox-widget-toolkit.git/blobdiff - src/panel/DiskList.js
panel: disks: more static task window creation
[proxmox-widget-toolkit.git] / src / panel / DiskList.js
index ad965c899500fe1e80aa43890f564fbff61fa0b5..90a655344270d085a61e18eeb8e54697128d0c35 100644 (file)
@@ -44,6 +44,8 @@ Ext.define('Proxmox.DiskList', {
     extend: 'Ext.tree.Panel',
     alias: 'widget.pmxDiskList',
 
+    supportsWipeDisk: false,
+
     rootVisible: false,
 
     emptyText: gettext('No Disks found'),
@@ -97,18 +99,40 @@ Ext.define('Proxmox.DiskList', {
                waitMsgTarget: view,
                method: 'POST',
                params: { disk: rec.data.name },
-               failure: function(response, options) {
-                   Ext.Msg.alert(gettext('Error'), response.htmlStatus);
+               failure: response => Ext.Msg.alert(gettext('Error'), response.htmlStatus),
+               success: function(response, options) {
+                   Ext.create('Proxmox.window.TaskProgress', {
+                       upid: response.result.data,
+                       taskDone: function() {
+                           me.reload();
+                       },
+                       autoShow: true,
+                   });
                },
+           });
+       },
+
+       wipeDisk: function() {
+           let me = this;
+           let view = me.getView();
+           let selection = view.getSelection();
+           if (!selection || selection.length < 1) return;
+
+           let rec = selection[0];
+           Proxmox.Utils.API2Request({
+               url: `${view.exturl}/wipedisk`,
+               waitMsgTarget: view,
+               method: 'PUT',
+               params: { disk: rec.data.name },
+               failure: response => Ext.Msg.alert(gettext('Error'), response.htmlStatus),
                success: function(response, options) {
-                   var upid = response.result.data;
-                   var win = Ext.create('Proxmox.window.TaskProgress', {
-                       upid: upid,
+                   Ext.create('Proxmox.window.TaskProgress', {
+                       upid: response.result.data,
                        taskDone: function() {
                            me.reload();
                        },
+                       autoShow: true,
                    });
-                   win.show();
                },
            });
        },
@@ -173,41 +197,38 @@ Ext.define('Proxmox.DiskList', {
        },
     },
 
-    tbar: [
-       {
-           text: gettext('Reload'),
-           handler: 'reload',
-       },
-       {
-           xtype: 'proxmoxButton',
-           text: gettext('Show S.M.A.R.T. values'),
-           parentXType: 'treepanel',
-           disabled: true,
-           enableFn: function(rec) {
-               if (!rec || rec.data.parent) {
-                   return false;
-               } else {
-                   return true;
-               }
-           },
-           handler: 'openSmartWindow',
-       },
-       {
-           xtype: 'proxmoxButton',
-           text: gettext('Initialize Disk with GPT'),
-           parentXType: 'treepanel',
-           disabled: true,
-           enableFn: function(rec) {
-               if (!rec || rec.data.parent ||
-                   (rec.data.used && rec.data.used !== 'unused')) {
-                   return false;
-               } else {
-                   return true;
-               }
-           },
-           handler: 'initGPT',
-       },
-    ],
+    renderDiskType: function(v) {
+       if (v === undefined) return Proxmox.Utils.unknownText;
+       switch (v) {
+           case 'ssd': return 'SSD';
+           case 'hdd': return 'Hard Disk';
+           case 'usb': return 'USB';
+           default: return v;
+       }
+    },
+
+    renderDiskUsage: function(v, metaData, rec) {
+       let extendedInfo = '';
+       if (rec) {
+           let types = [];
+           if (rec.data.osdid !== undefined && rec.data.osdid >= 0) {
+               types.push(`OSD.${rec.data.osdid.toString()}`);
+           }
+           if (rec.data.journals > 0) {
+               types.push('Journal');
+           }
+           if (rec.data.db > 0) {
+               types.push('DB');
+           }
+           if (rec.data.wal > 0) {
+               types.push('WAL');
+           }
+           if (types.length > 0) {
+               extendedInfo = `, Ceph (${types.join(', ')})`;
+           }
+       }
+       return v ? `${v}${extendedInfo}` : Proxmox.Utils.noText;
+    },
 
     columns: [
        {
@@ -223,13 +244,8 @@ Ext.define('Proxmox.DiskList', {
            sortable: true,
            dataIndex: 'disk-type',
            renderer: function(v) {
-               if (v === undefined) return Proxmox.Utils.unknownText;
-               switch (v) {
-                   case 'ssd': return 'SSD';
-                   case 'hdd': return 'Hard Disk';
-                   case 'usb': return 'USB';
-                   default: return v;
-               }
+               let me = this;
+               return me.renderDiskType(v);
            },
        },
        {
@@ -237,26 +253,8 @@ Ext.define('Proxmox.DiskList', {
            width: 150,
            sortable: false,
            renderer: function(v, metaData, rec) {
-               let extendedInfo = '';
-               if (rec) {
-                   let types = [];
-                   if (rec.data.osdid !== undefined && rec.data.osdid >= 0) {
-                       types.push(`OSD.${rec.data.osdid.toString()}`);
-                   }
-                   if (rec.data.journals > 0) {
-                       types.push('Journal');
-                   }
-                   if (rec.data.db > 0) {
-                       types.push('DB');
-                   }
-                   if (rec.data.wal > 0) {
-                       types.push('WAL');
-                   }
-                   if (types.length > 0) {
-                       extendedInfo = `, Ceph (${types.join(', ')})`;
-                   }
-               }
-               return v ? `${v}${extendedInfo}` : Proxmox.Utils.noText;
+               let me = this;
+               return me.renderDiskUsage(v, metaData, rec);
            },
            dataIndex: 'used',
        },
@@ -322,4 +320,99 @@ Ext.define('Proxmox.DiskList', {
     listeners: {
        itemdblclick: 'openSmartWindow',
     },
+
+    initComponent: function() {
+       let me = this;
+
+       let tbar = [
+           {
+               text: gettext('Reload'),
+               handler: 'reload',
+           },
+           {
+               xtype: 'proxmoxButton',
+               text: gettext('Show S.M.A.R.T. values'),
+               parentXType: 'treepanel',
+               disabled: true,
+               enableFn: function(rec) {
+                   if (!rec || rec.data.parent) {
+                       return false;
+                   } else {
+                       return true;
+                   }
+               },
+               handler: 'openSmartWindow',
+           },
+           {
+               xtype: 'proxmoxButton',
+               text: gettext('Initialize Disk with GPT'),
+               parentXType: 'treepanel',
+               disabled: true,
+               enableFn: function(rec) {
+                   if (!rec || rec.data.parent ||
+                       (rec.data.used && rec.data.used !== 'unused')) {
+                       return false;
+                   } else {
+                       return true;
+                   }
+               },
+               handler: 'initGPT',
+           },
+       ];
+
+       if (me.supportsWipeDisk) {
+           tbar.push('-');
+           tbar.push({
+               xtype: 'proxmoxButton',
+               text: gettext('Wipe Disk'),
+               parentXType: 'treepanel',
+               dangerous: true,
+               confirmMsg: function(rec) {
+                   const data = rec.data;
+
+                   let mainMessage = Ext.String.format(
+                       gettext('Are you sure you want to wipe {0}?'),
+                       data.devpath,
+                   );
+                   mainMessage += `<br> ${gettext('All data on the device will be lost!')}`;
+
+                   const type = me.renderDiskType(data["disk-type"]);
+
+                   let usage;
+                   if (data.children.length > 0) {
+                       const partitionUsage = data.children.map(
+                           partition => me.renderDiskUsage(partition.used),
+                       ).join(', ');
+                       usage = `${gettext('Partitions')} (${partitionUsage})`;
+                   } else {
+                       usage = me.renderDiskUsage(data.used, undefined, rec);
+                   }
+
+                   const size = Proxmox.Utils.format_size(data.size);
+                   const serial = Ext.String.htmlEncode(data.serial);
+
+                   let additionalInfo = `${gettext('Type')}: ${type}<br>`;
+                   additionalInfo += `${gettext('Usage')}: ${usage}<br>`;
+                   additionalInfo += `${gettext('Size')}: ${size}<br>`;
+                   additionalInfo += `${gettext('Serial')}: ${serial}`;
+
+                   return `${mainMessage}<br><br>${additionalInfo}`;
+               },
+               disabled: true,
+               enableFn: function(rec) {
+                   // TODO enable for partitions once they can be selected for ZFS,LVM,etc. creation
+                   if (!rec || rec.data.parent) {
+                       return false;
+                   } else {
+                       return true;
+                   }
+               },
+               handler: 'wipeDisk',
+           });
+       }
+
+       me.tbar = tbar;
+
+       me.callParent();
+    },
 });