[pve-devel] [PATCH manager v2] fix #4758: ui: lxc wizard: allow multiple ssh keys

Christoph Heiss c.heiss at proxmox.com
Thu Jul 13 12:09:40 CEST 2023


On Mon, Jul 03, 2023 at 04:51:16PM +0200, Dominik Csapak wrote:
> by converting the textfield into a textarea and validate the value
> line wise (if there is more than one line)
>
> also create a 'MultiFileButton' (mostly copied from extjs) that allows
> to select multiple files at once
>

Some small nits inline, but otherwise:

Tested-by: Christoph Heiss <c.heiss at proxmox.com>
> Signed-off-by: Dominik Csapak <d.csapak at proxmox.com>
> ---
> changes from v2:
> * reduces lines of code (Thanks @Thomas)
> * implemented multi file select
>
>  www/manager6/Makefile                |  1 +
>  www/manager6/form/MultiFileButton.js | 58 ++++++++++++++++++++++++++++
>  www/manager6/lxc/CreateWizard.js     | 19 +++++----
>  3 files changed, 71 insertions(+), 7 deletions(-)
>  create mode 100644 www/manager6/form/MultiFileButton.js
>
> [..]
> diff --git a/www/manager6/form/MultiFileButton.js b/www/manager6/form/MultiFileButton.js
> new file mode 100644
> index 00000000..a73662f2
> --- /dev/null
> +++ b/www/manager6/form/MultiFileButton.js
> @@ -0,0 +1,58 @@
> +// mostly copied from ExtJS FileButton, but added 'multiple' at the relevant
> +// places so we have a file picker where one can select multiple files
> +Ext.define('PVE.form.MultiFileButton', {
> +    extend: 'Ext.form.field.FileButton',
> +    alias: 'widget.pveMultiFileButton',
> +
> +    afterTpl: [
> +	'<input id="{id}-fileInputEl" data-ref="fileInputEl" class="{childElCls} {inputCls}" ',
> +	    'type="file" size="1" name="{inputName}" unselectable="on" multiple ',
> +	    '<tpl if="accept != null">accept="{accept}"</tpl>',
> +	    '<tpl if="tabIndex != null">tabindex="{tabIndex}"</tpl>',
> +	'>',
> +    ],
> +
> +    createFileInput: function(isTemporary) {
> +	var me = this,
nit: s/var/let/

> +	    fileInputEl, listeners;
> +
> +	fileInputEl = me.fileInputEl = me.el.createChild({
nit: Is `me.fileInputEl` used somewhere I'm not seeing? Otherwise, could
be eliminated and just be `let fileInputEl = ..`.

> +	    name: me.inputName || me.id,
> +	    multiple: true,
> +	    id: !isTemporary ? me.id + '-fileInputEl' : undefined,
> +	    cls: me.inputCls + (me.getInherited().rtl ? ' ' + Ext.baseCSSPrefix + 'rtl' : ''),
> +	    tag: 'input',
> +	    type: 'file',
> +	    size: 1,
> +	    unselectable: 'on',
> +	}, me.afterInputGuard); // Nothing special happens outside of IE/Edge
> +
> +	// This is our focusEl
> +	fileInputEl.dom.setAttribute('data-componentid', me.id);
> +
> +	if (me.tabIndex !== null) {
> +	    me.setTabIndex(me.tabIndex);
> +	}
> +
> +	if (me.accept) {
> +	    fileInputEl.dom.setAttribute('accept', me.accept);
> +	}
> +
> +	// We place focus and blur listeners on fileInputEl to activate Button's
> +	// focus and blur style treatment
> +	listeners = {
nit: Declare `listeners` here directly instead of above?

> +	    scope: me,
> +	    change: me.fireChange,
> +	    mousedown: me.handlePrompt,
> +	    keydown: me.handlePrompt,
> +	    focus: me.onFileFocus,
> +	    blur: me.onFileBlur,
> +	};
> +
> +	if (me.useTabGuards) {
> +	    listeners.keydown = me.onFileInputKeydown;
> +	}
> +
> +	fileInputEl.on(listeners);
> +    },
> +});
> diff --git a/www/manager6/lxc/CreateWizard.js b/www/manager6/lxc/CreateWizard.js
> index 0b82cc1c..7cc59299 100644
> --- a/www/manager6/lxc/CreateWizard.js
> +++ b/www/manager6/lxc/CreateWizard.js
> @@ -120,16 +120,16 @@ Ext.define('PVE.lxc.CreateWizard', {
>  		    },
>  		},
>  		{
> -		    xtype: 'proxmoxtextfield',
> +		    xtype: 'textarea',
>  		    name: 'ssh-public-keys',
>  		    value: '',
> -		    fieldLabel: gettext('SSH public key'),
> +		    fieldLabel: gettext('SSH public key(s)'),
>  		    allowBlank: true,
>  		    validator: function(value) {
>  			let pwfield = this.up().down('field[name=password]');
>  			if (value.length) {
> -			    let key = PVE.Parser.parseSSHKey(value);
> -			    if (!key) {
> +			    let keys = value.indexOf('\n') !== -1 ? value.split('\n') : [ value ];
nit: eslint complains here, should be `[value]`
also: s/let/const/

> +			    if (keys.some(key => key === '' || !PVE.Parser.parseSSHKey(key))) {
>  				return "Failed to recognize ssh key";
>  			    }
>  			    pwfield.allowBlank = true;
> @@ -159,15 +159,20 @@ Ext.define('PVE.lxc.CreateWizard', {
>  		    },
>  		},
>  		{
> -		    xtype: 'filebutton',
> +		    xtype: 'pveMultiFileButton',
>  		    name: 'file',
>  		    hidden: !window.FileReader,
>  		    text: gettext('Load SSH Key File'),
>  		    listeners: {
>  			change: function(btn, e, value) {
>  			    e = e.event;
> -			    let field = this.up().down('proxmoxtextfield[name=ssh-public-keys]');
> -			    PVE.Utils.loadSSHKeyFromFile(e.target.files[0], v => field.setValue(v));
> +			    let field = this.up().down('textarea[name=ssh-public-keys]');
> +			    for (const file of e?.target?.files ?? []) {
> +				PVE.Utils.loadSSHKeyFromFile(file, v => {
> +				    let oldValue = field.getValue();
nit: s/let/const/

> +				    field.setValue(oldValue ? `${oldValue}\n${v.trim()}` : v.trim());
> +				});
> +			    }
>  			    btn.reset();
>  			},
>  		    },
> --
> 2.30.2
>
>
>
> _______________________________________________
> pve-devel mailing list
> pve-devel at lists.proxmox.com
> https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel
>
>





More information about the pve-devel mailing list