Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add interactive filter menu #5523

Merged
merged 18 commits into from
Mar 13, 2023
Merged

Conversation

oliver-stoehr
Copy link
Collaborator

@oliver-stoehr oliver-stoehr commented Jan 30, 2023

This pull requests adds a more interactive filter menu to the process, task and user lists based on #5212.
A new overlay will open on focus of the filter input and close on blur. This overlay contains the filters that were previously located at the bottom of each list. It will also provide suggestions for the filters when applicable.
Bildschirm­foto 2023-01-30 um 21 36 33
These suggestions are filtered by the text the user enters into the input.
The overlay will suggest filter categories and also filter values for the following filter categories:

  • step
  • stepdone
  • stepinwork
  • steplocked
  • stepopen
  • stepdonetitle
  • project
  • property
    The suggestions can be selected by mouse and keyboard (up, down, enter).
    Submitted filters are displayed in a more distinguishable way and can be removed by clicking the "x" or pressing delete key in the filter input:
    Bildschirm­foto 2023-01-30 um 21 48 58

Resolves #5212, resolves #3511.

Copy link
Collaborator

@henning-gerhardt henning-gerhardt left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is only a code review of Java classes and a little bit of css / xhtml files. I did not into the JavaScript changes nor did a deep look into the css and xhtml files as my knowledge there is a little above zero.

@subhhwendt
Copy link
Collaborator

Hi Oliver,
I just tested the feature with the newest version, hopefully - found on the preview server.
My remarks:

  • the button for a chosen parameter is very small for the value (f.e. projectnames) - may be it's possible to show the beginning of the value?
  • What's the difference between "stepdone" and "stepdonetitle"?
  • What should be the result for "stepautomatic"?
  • We should give up "stepdoneuser" - we are not allowed to filter by this detail.
  • A search with the parameter "property" caused a crash for the processlist in our environment - may be due to the state of our testserver??

@oliver-stoehr
Copy link
Collaborator Author

oliver-stoehr commented Feb 6, 2023

@subhhwendt can you please provide the "property" filter that produced an error? I will look into this.
This might be an error that already exists independent of this pull request, see #5530.

Copy link
Collaborator

@andre-hohmann andre-hohmann left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@oliver-stoehr : as discussed before, here is just a rough estimate.
The main point is that Issue #3511 is solved. I have already sent you some suggestions for improvement by mail as a preliminary review.
Let me know if further assessment is needed.

@solth
Copy link
Member

solth commented Feb 21, 2023

@oliver-stoehr please rebase against current master to resolve conflicts as this pull request is the next merge candidate.

@henning-gerhardt
Copy link
Collaborator

@solth : as I wrote 3 weeks ago: "This is only a code review of Java classes and a little bit of css / xhtml files. I did not into the JavaScript changes nor did a deep look into the css and xhtml files as my knowledge there is a little above zero." .. I can and I will not approve a pull request where only parts reviewed by me and / or I only know the requirements of the change. If you need somebody who is full reviewing this change then please assign the review to an other person than me.

@solth solth requested review from markusweigelt and removed request for henning-gerhardt February 22, 2023 08:42
Copy link
Collaborator

@markusweigelt markusweigelt left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Great work! Test your implementation with process, task and user filter and it works as far as possible.

However, a out of bounds exception appears with some filter strings. e.g. when I navigate to processes and select "property" from suggestions and press "enter".

java.lang.ArrayIndexOutOfBoundsException: Index 1 out of bounds for length 1
	at org.kitodo.production.services.data.FilterService.createProcessPropertyFilter(FilterService.java:527)
	at org.kitodo.production.services.data.FilterService.buildQueryFromCondition(FilterService.java:252)
	at org.kitodo.production.services.data.FilterService.queryBuilder(FilterService.java:196)
	at org.kitodo.production.helper.SearchResultGeneration.getQueryForFilter(SearchResultGeneration.java:85)
	at org.kitodo.production.services.data.ProcessService.getQueryForFilter(ProcessService.java:409)
	at org.kitodo.production.forms.ProcessForm.getAmount(ProcessForm.java:1100)
	at jdk.internal.reflect.GeneratedMethodAccessor595.invoke(Unknown Source)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.base/java.lang.reflect.Method.invoke(Unknown Source)
	at javax.el.BeanELResolver.getValue(BeanELResolver.java:85)
	at javax.el.CompositeELResolver.getValue(CompositeELResolver.java:62)
	at org.apache.myfaces.el.unified.resolver.FacesCompositeELResolver.getValue(FacesCompositeELResolver.java:179)
	at org.apache.el.parser.AstValue.getValue(AstValue.java:168)
	at org.apache.el.parser.AstDeferredExpression.getValue(AstDeferredExpression.java:42)
	at org.apache.el.parser.AstCompositeExpression.getValue(AstCompositeExpression.java:48)
	at org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:189)
	at org.jboss.weld.el.WeldValueExpression.getValue(WeldValueExpression.java:50)
	at org.jboss.weld.el.WeldValueExpression.getValue(WeldValueExpression.java:50)
	at org.apache.myfaces.view.facelets.el.ContextAwareTagValueExpression.getValue(ContextAwareTagValueExpression.java:93)
	at javax.faces.component._DeltaStateHelper.eval(_DeltaStateHelper.java:356)
	at javax.faces.component.UIOutput.getValue(UIOutput.java:67)
	at org.apache.myfaces.shared.renderkit.RendererUtils.getValue(RendererUtils.java:486)
	at org.apache.myfaces.shared.renderkit.RendererUtils.getStringValue(RendererUtils.java:329)
	at org.apache.myfaces.shared.renderkit.html.HtmlTextRendererBase.renderOutput(HtmlTextRendererBase.java:94)
	at org.apache.myfaces.shared.renderkit.html.HtmlTextRendererBase.encodeEnd(HtmlTextRendererBase.java:81)
	at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:675)
	at javax.faces.component.UIComponentBase.encodeAll(UIComponentBase.java:555)
	at org.apache.myfaces.context.servlet.PartialViewContextImpl$PhaseAwareVisitCallback.processRenderComponent(PartialViewContextImpl.java:826)
	at org.apache.myfaces.context.servlet.PartialViewContextImpl$PhaseAwareVisitCallback.visit(PartialViewContextImpl.java:787)
	at org.apache.myfaces.component.visit.PartialVisitContext.invokeVisitCallback(PartialVisitContext.java:213)
	at javax.faces.component.UIComponent.visitTree(UIComponent.java:1019)
	at javax.faces.component.UIComponentBase.visitTree(UIComponentBase.java:1192)
	at javax.faces.component.UIComponent.visitTree(UIComponent.java:1047)
	at javax.faces.component.UIComponentBase.visitTree(UIComponentBase.java:1192)
	at javax.faces.component.UIComponent.visitTree(UIComponent.java:1047)
	at javax.faces.component.UIComponentBase.visitTree(UIComponentBase.java:1192)
	at javax.faces.component.UIComponent.visitTree(UIComponent.java:1047)
	at javax.faces.component.UIComponentBase.visitTree(UIComponentBase.java:1192)
	at javax.faces.component.UIComponent.visitTree(UIComponent.java:1047)
	at javax.faces.component.UIComponentBase.visitTree(UIComponentBase.java:1192)
	at org.apache.myfaces.context.servlet.PartialViewContextImpl.processPartialRendering(PartialViewContextImpl.java:518)
	at org.apache.myfaces.context.servlet.PartialViewContextImpl.processPartial(PartialViewContextImpl.java:420)
	at org.primefaces.context.PrimePartialViewContext.processPartial(PrimePartialViewContext.java:65)
	at javax.faces.context.PartialViewContextWrapper.processPartial(PartialViewContextWrapper.java:97)
	at org.omnifaces.context.OmniPartialViewContext.processPartial(OmniPartialViewContext.java:122)
	at javax.faces.component.UIViewRoot.encodeChildren(UIViewRoot.java:571)
	at javax.faces.component.UIComponentBase.encodeAll(UIComponentBase.java:542)
	at org.apache.myfaces.view.facelets.FaceletViewDeclarationLanguage.renderView(FaceletViewDeclarationLanguage.java:1897)
	at org.apache.myfaces.application.ViewHandlerImpl.renderView(ViewHandlerImpl.java:315)
	at javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:73)
	at javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:73)
	at org.omnifaces.viewhandler.OmniViewHandler.renderView(OmniViewHandler.java:151)
	at javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:73)
	at org.apache.myfaces.lifecycle.RenderResponseExecutor.execute(RenderResponseExecutor.java:122)
	at org.apache.myfaces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:266)
	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:206)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:227)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
	at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
	at org.kitodo.production.servletfilter.EncodingFilter.doFilter(EncodingFilter.java:68)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
	at org.omnifaces.filter.GzipResponseFilter.doFilter(GzipResponseFilter.java:183)
	at org.omnifaces.filter.HttpFilter.doFilter(HttpFilter.java:108)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:337)
	at org.kitodo.production.security.SecurityObjectAccessFilter.doFilter(SecurityObjectAccessFilter.java:89)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346)
	at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:115)
	at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:81)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346)
	at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:122)
	at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:116)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346)
	at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:126)
	at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:81)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346)
	at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:109)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346)
	at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:149)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346)
	at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346)
	at org.springframework.security.web.session.ConcurrentSessionFilter.doFilter(ConcurrentSessionFilter.java:147)
	at org.springframework.security.web.session.ConcurrentSessionFilter.doFilter(ConcurrentSessionFilter.java:125)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346)
	at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:223)
	at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:217)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346)
	at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:103)
	at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:89)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346)
	at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:90)
	at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:75)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346)
	at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:112)
	at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:82)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346)
	at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:55)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346)
	at org.springframework.security.web.session.DisableEncodeUrlFilter.doFilterInternal(DisableEncodeUrlFilter.java:42)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346)
	at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:221)
	at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:186)
	at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:354)
	at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:267)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
	at org.apache.logging.log4j.web.Log4jServletFilter.doFilter(Log4jServletFilter.java:71)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:197)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:135)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
	at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:687)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:360)
	at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:399)
	at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:890)
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1743)
	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
	at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)
	at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
	at java.base/java.lang.Thread.run(Unknown Source)

The exception occurs in some filter names of tasks filter and user filter too.

The filter templates are almost congruent and therefore I suggest to generalize the template and then include or better use "ui:decorate". https://stackoverflow.com/questions/10778068/what-is-the-real-conceptual-difference-between-uidecorate-and-uiinclude That is up to you and I will approve also without this change.

Test for users filter is missing. Not necessary for me if components largely the same. So it is just a suggestion to have a test for each filter type. But that is up to you and I will approve it in the same way.

Copy link
Collaborator

@markusweigelt markusweigelt left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thx for implementation. Unfortunately under users list i still get the same ArrayIndexOutOfBoundsException.

KITODO.PRODUCTION Version 3.6.0-SNAPSHOTEs ist ein Fehler aufgetreten:
Date/time: 2023-03-03 15:21:05
User agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36
User IP: 172.21.0.1
Request URI: /kitodo/pages/users.jsf
Ajax request: No
Status code: 500
Exception type: class java.lang.ArrayIndexOutOfBoundsException
Exception message: Index 1 out of bounds for length 1
Exception UUID:
Stack trace:
java.lang.ArrayIndexOutOfBoundsException: Index 1 out of bounds for length 1
	at org.kitodo.production.services.data.FilterService.getSQLFilterMap(FilterService.java:1042)
	at org.kitodo.production.services.data.UserService.countResults(UserService.java:104)
	at org.kitodo.production.model.LazyDTOModel.load(LazyDTOModel.java:105)
	at org.primefaces.component.datatable.DataTable.loadLazyData(DataTable.java:567)
	at org.primefaces.component.datatable.DataTableRenderer.preRender(DataTableRenderer.java:130)
	at org.primefaces.component.datatable.DataTableRenderer.encodeEnd(DataTableRenderer.java:93)
	at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:675)
	at javax.faces.component.UIData.encodeEnd(UIData.java:1835)
	at javax.faces.component.UIComponentBase.encodeAll(UIComponentBase.java:555)
	at javax.faces.component.UIComponentBase.encodeAll(UIComponentBase.java:551)
	at org.primefaces.component.tabview.TabViewRenderer.encodeTabContent(TabViewRenderer.java:301)
	at org.primefaces.component.tabview.TabViewRenderer.lambda$encodeContents$1(TabViewRenderer.java:277)
	at org.primefaces.component.tabview.TabView.forEachTab(TabView.java:186)
	at org.primefaces.component.tabview.TabViewRenderer.encodeContents(TabViewRenderer.java:275)
	at org.primefaces.component.tabview.TabViewRenderer.encodeMarkup(TabViewRenderer.java:144)
	at org.primefaces.component.tabview.TabViewRenderer.encodeEnd(TabViewRenderer.java:83)
	at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:675)
	at org.primefaces.renderkit.CoreRenderer.renderChild(CoreRenderer.java:88)
	at org.primefaces.renderkit.CoreRenderer.renderChildren(CoreRenderer.java:70)
	at org.primefaces.component.panel.PanelRenderer.encodeContent(PanelRenderer.java:219)
	at org.primefaces.component.panel.PanelRenderer.encodeMarkup(PanelRenderer.java:133)
	at org.primefaces.component.panel.PanelRenderer.encodeEnd(PanelRenderer.java:68)
	at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:675)
	at javax.faces.component.UIComponentBase.encodeAll(UIComponentBase.java:555)
	at javax.faces.component.UIComponentBase.encodeAll(UIComponentBase.java:551)
	at javax.faces.component.UIComponentBase.encodeAll(UIComponentBase.java:551)
	at org.apache.myfaces.view.facelets.FaceletViewDeclarationLanguage.renderView(FaceletViewDeclarationLanguage.java:1897)
	at org.apache.myfaces.application.ViewHandlerImpl.renderView(ViewHandlerImpl.java:315)
	at javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:73)
	at javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:73)
	at org.omnifaces.viewhandler.OmniViewHandler.renderView(OmniViewHandler.java:151)
	at javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:73)
	at org.apache.myfaces.lifecycle.RenderResponseExecutor.execute(RenderResponseExecutor.java:122)
	at org.apache.myfaces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:266)
	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:206)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:227)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
	at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
	at org.kitodo.production.servletfilter.EncodingFilter.doFilter(EncodingFilter.java:68)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
	at org.omnifaces.filter.GzipResponseFilter.doFilter(GzipResponseFilter.java:183)
	at org.omnifaces.filter.HttpFilter.doFilter(HttpFilter.java:108)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:337)
	at org.kitodo.production.security.SecurityObjectAccessFilter.doFilter(SecurityObjectAccessFilter.java:89)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346)
	at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:115)
	at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:81)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346)
	at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:122)
	at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:116)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346)
	at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:126)
	at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:81)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346)
	at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:109)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346)
	at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:149)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346)
	at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346)
	at org.springframework.security.web.session.ConcurrentSessionFilter.doFilter(ConcurrentSessionFilter.java:147)
	at org.springframework.security.web.session.ConcurrentSessionFilter.doFilter(ConcurrentSessionFilter.java:125)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346)
	at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:223)
	at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:217)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346)
	at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:103)
	at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:89)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346)
	at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:90)
	at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:75)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346)
	at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:112)
	at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:82)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346)
	at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:55)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346)
	at org.springframework.security.web.session.DisableEncodeUrlFilter.doFilterInternal(DisableEncodeUrlFilter.java:42)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346)
	at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:221)
	at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:186)
	at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:354)
	at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:267)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
	at org.apache.logging.log4j.web.Log4jServletFilter.doFilter(Log4jServletFilter.java:71)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:197)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:135)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
	at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:687)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:360)
	at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:399)
	at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:890)
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1743)
	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
	at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)
	at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
	at java.base/java.lang.Thread.run(Unknown Source)

If multiple filter are used, the search field is broken. Besides that, a space / margin between the filter boxes is missing. The example is created while testing tasks list. Please also test or implement for projects and user list to avoid further test iteration.

image

@oliver-stoehr
Copy link
Collaborator Author

I improved the layout so the parsed filters should always be visible now. They will still overflow the input field, when there is not enough space. I would like to move the general solution for this overflow to another pull request as I'm not yet sure about the best way to solve this.

I was not able to reproduce the ArrayIndexOutOfBoundsException. If it still can be reproduced, I would like to address this in a new issue/pr since this is an existing bug in the filters and does not depend on the changes of this pull request.

@markusweigelt could you review my latest changes?

Copy link
Collaborator

@markusweigelt markusweigelt left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thx works for me!

I could not recreate the ArrayIndexOutOfBoundsException with various tests either. 🤔

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Improve filter menu for processes and tasks Adjustments on filter menu "Add filter"
6 participants