From mboxrd@z Thu Jan  1 00:00:00 1970
Return-Path: <m.limbeck@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) server-digest SHA256)
 (No client certificate requested)
 by lists.proxmox.com (Postfix) with ESMTPS id C98DC93C1D
 for <pmg-devel@lists.proxmox.com>; Wed, 21 Feb 2024 10:49:56 +0100 (CET)
Received: from firstgate.proxmox.com (localhost [127.0.0.1])
 by firstgate.proxmox.com (Proxmox) with ESMTP id AFB6B139EC
 for <pmg-devel@lists.proxmox.com>; Wed, 21 Feb 2024 10:49:56 +0100 (CET)
Received: from proxmox-new.maurer-it.com (proxmox-new.maurer-it.com
 [94.136.29.106])
 (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)
 key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256)
 (No client certificate requested)
 by firstgate.proxmox.com (Proxmox) with ESMTPS
 for <pmg-devel@lists.proxmox.com>; Wed, 21 Feb 2024 10:49:55 +0100 (CET)
Received: from proxmox-new.maurer-it.com (localhost.localdomain [127.0.0.1])
 by proxmox-new.maurer-it.com (Proxmox) with ESMTP id 6359F443AC
 for <pmg-devel@lists.proxmox.com>; Wed, 21 Feb 2024 10:49:55 +0100 (CET)
Message-ID: <d46d2722-2f99-4309-8f5d-ce9d835da9eb@proxmox.com>
Date: Wed, 21 Feb 2024 10:49:54 +0100
MIME-Version: 1.0
User-Agent: Mozilla Thunderbird
Content-Language: en-US
To: pmg-devel@lists.proxmox.com
References: <20240213132846.3318535-1-d.csapak@proxmox.com>
From: Mira Limbeck <m.limbeck@proxmox.com>
In-Reply-To: <20240213132846.3318535-1-d.csapak@proxmox.com>
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 7bit
X-SPAM-LEVEL: Spam detection results:  0
 AWL 0.301 Adjusted score from AWL reputation of From: address
 BAYES_00                 -1.9 Bayes spam probability is 0 to 1%
 DMARC_MISSING             0.1 Missing DMARC policy
 KAM_DMARC_STATUS 0.01 Test Rule for DKIM or SPF Failure with Strict Alignment
 SPF_HELO_NONE           0.001 SPF: HELO does not publish an SPF Record
 SPF_PASS               -0.001 SPF: sender matches SPF record
 T_SCC_BODY_TEXT_LINE    -0.01 -
 URIBL_BLOCKED 0.001 ADMINISTRATOR NOTICE: The query to URIBL was blocked. See
 http://wiki.apache.org/spamassassin/DnsBlocklists#dnsbl-block for more
 information. [rec.data, defines.mk]
Subject: Re: [pmg-devel] [PATCH pmg-gui] fix #4510: add filter box to many
 grids
X-BeenThere: pmg-devel@lists.proxmox.com
X-Mailman-Version: 2.1.29
Precedence: list
List-Id: Proxmox Mail Gateway development discussion
 <pmg-devel.lists.proxmox.com>
List-Unsubscribe: <https://lists.proxmox.com/cgi-bin/mailman/options/pmg-devel>, 
 <mailto:pmg-devel-request@lists.proxmox.com?subject=unsubscribe>
List-Archive: <http://lists.proxmox.com/pipermail/pmg-devel/>
List-Post: <mailto:pmg-devel@lists.proxmox.com>
List-Help: <mailto:pmg-devel-request@lists.proxmox.com?subject=help>
List-Subscribe: <https://lists.proxmox.com/cgi-bin/mailman/listinfo/pmg-devel>, 
 <mailto:pmg-devel-request@lists.proxmox.com?subject=subscribe>
X-List-Received-Date: Wed, 21 Feb 2024 09:49:56 -0000

On 2/13/24 14:28, Dominik Csapak wrote:
> namely relay domains, transports, trusted networks, smtp whitelist +
> when/what/who object grids.
> 
> Adds a new 'FilterField', that takes a store and a list of columns to
> filter, and filters on every change.
> 
> Signed-off-by: Dominik Csapak <d.csapak@proxmox.com>
> ---
>  js/Makefile            |  1 +
>  js/MyNetworks.js       |  6 ++++++
>  js/ObjectGroup.js      |  6 ++++++
>  js/RelayDomains.js     |  6 ++++++
>  js/Transport.js        |  6 ++++++
>  js/form/FilterField.js | 46 ++++++++++++++++++++++++++++++++++++++++++
>  6 files changed, 71 insertions(+)
>  create mode 100644 js/form/FilterField.js
> 
> diff --git a/js/Makefile b/js/Makefile
> index 78f2b57..5f57e0d 100644
> --- a/js/Makefile
> +++ b/js/Makefile
> @@ -2,6 +2,7 @@ include ../defines.mk
>  
>  JSSRC=							\
>  	Utils.js					\
> +	form/FilterField.js				\
>  	FilterProxy.js					\
>  	LoginView.js					\
>  	RoleSelector.js					\
> diff --git a/js/MyNetworks.js b/js/MyNetworks.js
> index 22a8577..e8b3e19 100644
> --- a/js/MyNetworks.js
> +++ b/js/MyNetworks.js
> @@ -106,6 +106,12 @@ Ext.define('PMG.MyNetworks', {
>  		},
>              },
>  	    remove_btn,
> +	    '->',
> +	    {
> +		xtype: 'pmgFilterField',
> +		store: store,
> +		filteredFields: ['cidr', 'comment'],
> +	    },
>          ];
>  
>  	Proxmox.Utils.monStoreErrors(me, store, true);
> diff --git a/js/ObjectGroup.js b/js/ObjectGroup.js
> index 2223ffa..7041084 100644
> --- a/js/ObjectGroup.js
> +++ b/js/ObjectGroup.js
> @@ -199,6 +199,12 @@ Ext.define('PMG.ObjectGroup', {
>  		    handler: run_editor,
>  		},
>  		remove_btn,
> +		'->',
> +		{
> +		    xtype: 'pmgFilterField',
> +		    store: me.store,
> +		    filteredFields: ['otype_text', 'descr'],

This behavior is kind of unexpected, since otype_text doesn't match the
visible text.
When an object group contains a single mail address, and you type
`address` even though none of the visible texts contain it, it still
matches since the otype_text contains address. It only shows `E-Mail`
though in the GUI (English language).

> +		},
>  	    ],
>  	});
>  
> diff --git a/js/RelayDomains.js b/js/RelayDomains.js
> index ec43aa1..19e953a 100644
> --- a/js/RelayDomains.js
> +++ b/js/RelayDomains.js
> @@ -111,6 +111,12 @@ Ext.define('PMG.RelayDomains', {
>  		},
>              },
>  	    remove_btn,
> +	    '->',
> +	    {
> +		xtype: 'pmgFilterField',
> +		store: store,
> +		filteredFields: ['domain', 'comment'],
> +	    },
>          ];
>  
>  	Proxmox.Utils.monStoreErrors(me, store, true);
> diff --git a/js/Transport.js b/js/Transport.js
> index 141fde1..fc3c28c 100644
> --- a/js/Transport.js
> +++ b/js/Transport.js
> @@ -72,6 +72,12 @@ Ext.define('PMG.Transport', {
>  		    callback: reload,
>  		    waitMsgTarget: me,
>  		},
> +		'->',
> +		{
> +		    xtype: 'pmgFilterField',
> +		    store: store,
> +		    filteredFields: ['domain', 'host', 'port', 'protocol', 'comment'],
> +		},
>  	    ],
>  	    viewConfig: {
>  		trackOver: false,
> diff --git a/js/form/FilterField.js b/js/form/FilterField.js
> new file mode 100644
> index 0000000..0593d94
> --- /dev/null
> +++ b/js/form/FilterField.js
> @@ -0,0 +1,46 @@
> +Ext.define('PMG.form.FilterField', {
> +    extend: 'Ext.form.field.Text',
> +    alias: 'widget.pmgFilterField',
> +
> +    // the store to filter
> +    store: undefined,
> +
> +    // a list of fields of the records that will be searched
> +    filteredFields: [],
> +
> +    fieldLabel: gettext('Filter'),
> +    labelAlign: 'right',
> +
> +    triggers: {
> +	clear: {
> +	    cls: 'pmx-clear-trigger',
> +	    hidden: true,
> +	    handler: function() {
> +		let me = this;
> +		me.setValue('');
> +		me.triggers.clear.setVisible(false);
> +	    },
> +	},
> +    },
> +
> +    listeners: {
> +	change: function(field, value) {
> +	    let me = this;
> +	    if (!me.store) {
> +		return;
> +	    }
> +
> +	    if (value) {
> +		me.store.filterBy((rec) => me.filteredFields.some((fieldname) =>
> +			rec.data[fieldname].toString().toLowerCase().indexOf(value.toLowerCase()) !== -1,
> +		    ),
> +		);
> +		field.triggers.clear.setVisible(true);
> +	    } else {
> +		me.store.clearFilter();
> +		field.triggers.clear.setVisible(false);
> +	    }
> +	},
> +    },
> +
> +});

Other than the unexpected behavior mentioned above, it behaved as expected.