From mboxrd@z Thu Jan  1 00:00:00 1970
Return-Path: <d.csapak@proxmox.com>
Received: from firstgate.proxmox.com (firstgate.proxmox.com [212.224.123.68])
 (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)
 key-exchange X25519 server-signature RSA-PSS (2048 bits))
 (No client certificate requested)
 by lists.proxmox.com (Postfix) with ESMTPS id 5622D60FDE
 for <pbs-devel@lists.proxmox.com>; Fri, 11 Sep 2020 13:07:50 +0200 (CEST)
Received: from firstgate.proxmox.com (localhost [127.0.0.1])
 by firstgate.proxmox.com (Proxmox) with ESMTP id 51EEA241CC
 for <pbs-devel@lists.proxmox.com>; Fri, 11 Sep 2020 13:07:50 +0200 (CEST)
Received: from proxmox-new.maurer-it.com (proxmox-new.maurer-it.com
 [212.186.127.180])
 (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)
 key-exchange X25519 server-signature RSA-PSS (2048 bits))
 (No client certificate requested)
 by firstgate.proxmox.com (Proxmox) with ESMTPS id B2410241BC
 for <pbs-devel@lists.proxmox.com>; Fri, 11 Sep 2020 13:07:48 +0200 (CEST)
Received: from proxmox-new.maurer-it.com (localhost.localdomain [127.0.0.1])
 by proxmox-new.maurer-it.com (Proxmox) with ESMTP id 7A30744B62
 for <pbs-devel@lists.proxmox.com>; Fri, 11 Sep 2020 13:07:48 +0200 (CEST)
To: pbs-devel@lists.proxmox.com
References: <20200828084658.22057-1-h.laimer@proxmox.com>
 <20200828084658.22057-2-h.laimer@proxmox.com>
From: Dominik Csapak <d.csapak@proxmox.com>
Message-ID: <95d4b25b-987d-a24e-8765-660a3c9db37c@proxmox.com>
Date: Fri, 11 Sep 2020 13:07:44 +0200
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:81.0) Gecko/20100101
 Thunderbird/81.0
MIME-Version: 1.0
In-Reply-To: <20200828084658.22057-2-h.laimer@proxmox.com>
Content-Type: text/plain; charset=utf-8; format=flowed
Content-Language: en-US
Content-Transfer-Encoding: 7bit
X-SPAM-LEVEL: Spam detection results:  0
 AWL 2.350 Adjusted score from AWL reputation of From: address
 KAM_DMARC_STATUS 0.01 Test Rule for DKIM or SPF Failure with Strict Alignment
 NICE_REPLY_A           -3.576 Looks like a legit reply (A)
 RCVD_IN_DNSWL_MED        -2.3 Sender listed at https://www.dnswl.org/,
 medium trust
 SPF_HELO_NONE           0.001 SPF: HELO does not publish an SPF Record
 SPF_PASS               -0.001 SPF: sender matches SPF record
 URIBL_BLOCKED 0.001 ADMINISTRATOR NOTICE: The query to URIBL was blocked. See
 http://wiki.apache.org/spamassassin/DnsBlocklists#dnsbl-block for more
 information. [item.id]
Subject: Re: [pbs-devel] [PATCH v3 proxmox-widget-toolbox 1/9] safe-destroy:
 move SafeDestroy from pve-manager here
X-BeenThere: pbs-devel@lists.proxmox.com
X-Mailman-Version: 2.1.29
Precedence: list
List-Id: Proxmox Backup Server development discussion
 <pbs-devel.lists.proxmox.com>
List-Unsubscribe: <https://lists.proxmox.com/cgi-bin/mailman/options/pbs-devel>, 
 <mailto:pbs-devel-request@lists.proxmox.com?subject=unsubscribe>
List-Archive: <http://lists.proxmox.com/pipermail/pbs-devel/>
List-Post: <mailto:pbs-devel@lists.proxmox.com>
List-Help: <mailto:pbs-devel-request@lists.proxmox.com?subject=help>
List-Subscribe: <https://lists.proxmox.com/cgi-bin/mailman/listinfo/pbs-devel>, 
 <mailto:pbs-devel-request@lists.proxmox.com?subject=subscribe>
X-List-Received-Date: Fri, 11 Sep 2020 11:07:50 -0000


On 8/28/20 10:46 AM, Hannes Laimer wrote:
> Signed-off-by: Hannes Laimer <h.laimer@proxmox.com>
> ---
> the file was just moved, nothing except the define changed ('PVE.window.SafeDestroy' -> 'Proxmox.window.SafeDestroy')

that's actually not true, you changed some things, e.g. whitespace and 
trailing commas

which is ok (since its required for linting), but please mention such things

also you missed a place for fixing eslint (so i could not
build the package after the series was applied)

comment for this inline

> 
>   src/Makefile              |   1 +
>   src/window/SafeDestroy.js | 194 ++++++++++++++++++++++++++++++++++++++
>   2 files changed, 195 insertions(+)
>   create mode 100644 src/window/SafeDestroy.js
> 
> diff --git a/src/Makefile b/src/Makefile
> index 12dda30..ea71647 100644
> --- a/src/Makefile
> +++ b/src/Makefile
> @@ -43,6 +43,7 @@ JSSRC=					\
>   	panel/GaugeWidget.js		\
>   	window/Edit.js			\
>   	window/PasswordEdit.js		\
> +	window/SafeDestroy.js		\
>   	window/TaskViewer.js		\
>   	window/LanguageEdit.js		\
>   	window/DiskSmart.js		\
> diff --git a/src/window/SafeDestroy.js b/src/window/SafeDestroy.js
> new file mode 100644
> index 0000000..b1001a8
> --- /dev/null
> +++ b/src/window/SafeDestroy.js
> @@ -0,0 +1,194 @@
> +/* Popup a message window
> + * where the user has to manually enter the resource ID
> + * to enable the destroy button
> + */
> +Ext.define('Proxmox.window.SafeDestroy', {
> +    extend: 'Ext.window.Window',
> +    alias: 'proxmoxSafeDestroy',
> +
> +    title: gettext('Confirm'),
> +    modal: true,
> +    buttonAlign: 'center',
> +    bodyPadding: 10,
> +    width: 450,
> +    layout: { type: 'hbox' },
> +    defaultFocus: 'confirmField',
> +    showProgress: false,
> +
> +    config: {
> +	item: {
> +	    id: undefined,
> +	    type: undefined,
> +	},
> +	url: undefined,
> +	params: {},
> +    },
> +
> +    getParams: function() {
> +	var me = this;
> +	var purgeCheckbox = me.lookupReference('purgeCheckbox');
> +	if (purgeCheckbox.checked) {
> +	    me.params.purge = 1;
> +	}
> +	if (Ext.Object.isEmpty(me.params)) {
> +	    return '';
> +	}
> +	return '?' + Ext.Object.toQueryString(me.params);
> +    },
> +
> +    controller: {
> +
> +	xclass: 'Ext.app.ViewController',
> +
> +	control: {
> +	    'field[name=confirm]': {
> +		change: function(f, value) {
> +		    var view = this.getView();
> +		    var removeButton = this.lookupReference('removeButton');
> +		    if (value === view.getItem().id.toString()) {
> +			removeButton.enable();
> +		    } else {
> +			removeButton.disable();
> +		    }
> +		},
> +		specialkey: function(field, event) {
> +		    var removeButton = this.lookupReference('removeButton');
> +		    if (!removeButton.isDisabled() && event.getKey() == event.ENTER) {

eslint wants a '===' instead of '==' here

> +			removeButton.fireEvent('click', removeButton, event);
> +		    }
> +		},
> +	    },
> +           'button[reference=removeButton]': {
> +		click: function() {
> +		    var view = this.getView();
> +		    Proxmox.Utils.API2Request({
> +			url: view.getUrl() + view.getParams(),
> +			method: 'DELETE',
> +			waitMsgTarget: view,
> +			failure: function(response, opts) {
> +			    view.close();
> +			    Ext.Msg.alert('Error', response.htmlStatus);
> +			},
> +			success: function(response, options) {
> +			    var hasProgressBar = !!(view.showProgress &&
> +				response.result.data);
> +
> +			    if (hasProgressBar) {
> +				// stay around so we can trigger our close events
> +				// when background action is completed
> +				view.hide();
> +
> +				var upid = response.result.data;
> +				var win = Ext.create('Proxmox.window.TaskProgress', {
> +				    upid: upid,
> +				    listeners: {
> +					destroy: function() {
> +					    view.close();
> +					},
> +				    },
> +				});
> +				win.show();
> +			    } else {
> +				view.close();
> +			    }
> +			},
> +		    });
> +		},
> +            },
> +	},
> +    },
> +
> +    items: [
> +	{
> +	    xtype: 'component',
> +	    cls: [Ext.baseCSSPrefix + 'message-box-icon',
> +		   Ext.baseCSSPrefix + 'message-box-warning',
> +		   Ext.baseCSSPrefix + 'dlg-icon'],
> +	},
> +	{
> +	    xtype: 'container',
> +	    flex: 1,
> +	    layout: {
> +		type: 'vbox',
> +		align: 'stretch',
> +	    },
> +	    items: [
> +		{
> +		    xtype: 'component',
> +		    reference: 'messageCmp',
> +		},
> +		{
> +		    itemId: 'confirmField',
> +		    reference: 'confirmField',
> +		    xtype: 'textfield',
> +		    name: 'confirm',
> +		    labelWidth: 300,
> +		    hideTrigger: true,
> +		    allowBlank: false,
> +		},
> +		{
> +		    xtype: 'proxmoxcheckbox',
> +		    name: 'purge',
> +		    reference: 'purgeCheckbox',
> +		    boxLabel: gettext('Purge'),
> +		    checked: false,
> +		    autoEl: {
> +			tag: 'div',
> +			'data-qtip': gettext('Remove from replication and backup jobs'),
> +		    },
> +		},
> +	    ],
> +	},
> +    ],
> +    buttons: [
> +	{
> +	    reference: 'removeButton',
> +	    text: gettext('Remove'),
> +	    disabled: true,
> +	},
> +    ],
> +
> +    initComponent: function() {
> +	var me = this;
> +
> +	me.callParent();
> +
> +	var item = me.getItem();
> +
> +	if (!Ext.isDefined(item.id)) {
> +	    throw "no ID specified";
> +	}
> +
> +	if (!Ext.isDefined(item.type)) {
> +	    throw "no VM type specified";
> +	}
> +
> +	var messageCmp = me.lookupReference('messageCmp');
> +	var msg;
> +
> +	if (item.type === 'VM') {
> +	    msg = Proxmox.Utils.format_task_description('qmdestroy', item.id);
> +	} else if (item.type === 'CT') {
> +	    msg = Proxmox.Utils.format_task_description('vzdestroy', item.id);
> +	} else if (item.type === 'CephPool') {
> +	    msg = Proxmox.Utils.format_task_description('cephdestroypool', item.id);
> +	} else if (item.type === 'Image') {
> +	    msg = Proxmox.Utils.format_task_description('unknownimgdel', item.id);
> +	} else {
> +	    throw "unknown item type specified";
> +	}
> +
> +	messageCmp.setHtml(msg);
> +
> +	if (!(item.type === 'VM' || item.type === 'CT')) {
> +	    let purgeCheckbox = me.lookupReference('purgeCheckbox');
> +	    purgeCheckbox.setDisabled(true);
> +	    purgeCheckbox.setHidden(true);
> +	}
> +
> +	var confirmField = me.lookupReference('confirmField');
> +	msg = gettext('Please enter the ID to confirm') +
> +	    ' (' + item.id + ')';
> +	confirmField.setFieldLabel(msg);
> +    },
> +});
>