2020.09 Launch Part 2
2020.09 Launch Part 2
Today, we will cover the pop-up filter module. This was introduced about nine months ago, I think, when we were doing one of our quarterly releases. And this is a very popular combination of sort of components and API to be able to do really inline filtering in your applications without writing any or very much code. So it’s easy to add into your applications, and it can add a lot of value very quickly for the user experience. So we did do a webinar on this. As I said, about nine months ago, there have been some updates, especially in the recent release. So I will go over everything kind of from the beginning. But if you already know this component, I will also be pointing out what’s new on the way. As we go through it, and then I’ll sort of point that out again as we do an overview. I think we can do this webinar in the 25 minutes. I always say it should be a quick webinar. We always go a bit long sometimes because of questions. But it’s really just a click overview of what’s new on this component, and we’ll jump right into a demo. And then we’ll cover the overview and some slides. So let’s get right to the demo. In my browser, you see I have a sample application. This is actually the tutorial solution that we now ship. So you can get this application as well and deconstruct it. And I’ll have more about that later in the week about updates to it. But we have a typical grid view on the form. We have some searching here. And we have a button here, which indicates that I could do some sort of filtering. So I’m going to start to show you the different filtering functionality. If I click this, you’ll notice that it’s showing the columns that are also showing in the grid. And I’m going to select ship country as the column that I want to filter by. When I click that, now I can type in free text to be able to filter. So I might type in Canada. And when I click out, you’ll see that all of the records are filtered by the ship country of Canada. You’ll notice I didn’t. As I type in, I did put the whole text Canada, but I could remove this filter. All the records load again. And I will reapply it with just a string fragment. So if your users are feeling particularly lazy, they can still filter on a string fragment. The filters work together in concert. So I could add additional filters. And I want to say there’s several cities in the country of Canada that I could also filter by. So I could, for example, filter on Montreal. I want to point out a new feature here where you can add free text to the filter. You can now also do an exclude option. So suppose that I don’t want to see records from Montreal. You can see the icon here indicates that that’s an exclusion. And when I click out, I’m really filtering where ship country is Canada and ship city is not Montreal. And you could add as many of those exclusions as you want. I could filter out Vancouver that way. So that’s one of the new features that we just added. In addition to being able to put free form text, you can also now exclude choices easily. I’m going to go ahead and clear these filters and show the next option. If I select the customer, in the dropdown here, you’ll see that I actually have lists of discrete customers. And so I can begin to check these off and select multiple of them. So now you can see it’s showing only those customers. That’s because that’s driven by a value list. So this is a customer ID in the grid, just a foreign key. But we associate that with a value list. And that value list is automatically used here. When we go under the hood, I’ll show you how that works. I’m going to clear that and do another value list based one just to show you something a little different. For employee, you’ll notice that in the dropdown here, there’s actually two columns. That’s because the value list definition has also two columns in the display value. It’s kind of nice because I could, if this was, this is just a pretty short list, but this is data-driven. It could come from a table having millions of records and still be performance. And this list could be, in that case, quite long, you can search and filter within that list, for example. And I could also sort within that as well. And that would all be performant. It uses the same normal data binding that you find in Servoy that can show, search, filter, sort, large data sets easily. And then I could, once I get the results I want, I could add those to my filter and filter by the foreign key for employee. John. Yes. I got a question. Is there a GUI way of excluding texts from filters, or do we have to do it with a minus sign? Currently, it’s just a minus sign. That’s the same convention that we have for the free text search for the overall searching, is to put a minus sign to exclude tokens. I guess the person asking the question is implying that it might be nice to, for example, well, this is on a value list one, to have some icon here to exclude it, versus a checkbox to include it. We could look into that if you would please file a support case and support.serway.com, or directly on the GitHub project. And I’ll have a link for that at the end. That could be a nice addition. You can also filter on dates. So we have the ordered date column here, and that appears in the dropdown. When I selected date, I get some nice options for date picker. The first thing I would point out is that the kind of date selection is here. So you can do, this would be uncommon, but you could do specific dates where you just really wanna pick a date, and then be done with it. Or you could do before or after. And in that case, you’ll notice that one of the calendars will always be grayed out. So if it’s before, then you have the upper bound here, and then the lower bound is grayed out, and if you switch, so that’s kind of intuitive, and that the other would be grayed out. And in that case, I should probably do before today. I’ll still get a lot of records. Somebody can see that it’s less than September 16th. And of course, you could do between. And then you have both the upper bound and the lower bound. So maybe I go back a few months, and then, oops, I didn’t select. There we go. Now you can see the between here, and you’ll see all of these fall between some time in July and September. Also on the dates, one more thing, there are these special selectors. So I can do today, and it’ll just jump to it and automatically. So I like this one this year, and it gives you the upper and lower bound. So you can play with those. Those are just convenient for your user. That was all available in the filter component before, but one thing that is worth pointing out is that the format that you see here, oops, I accidentally double clicked, the format that you see here if I do a specific date, you can make this now, you can set this so that it matches what’s in your grids, and that can be a global setting. So you can say everywhere, I want my day formats to be a specific thing. And so you can pass that in on solution open. Or when a base form loads or something. And that way, because we had noticed that sometimes this had a default format and it didn’t match up with what other people were formatting in their grids. So now you can make them match up nicely. I’m gonna switch over to the products grid to show a couple other options and some things which are new. You can of course filter on numeric columns. So if I bring the filter up here, and I select say price column, I get these options. And this was here before and you can do equal to greater than, smaller than, et cetera. So I’ll do a bigger than. But one thing that’s nice now is because it recognizes the data type of this column as being it’s actually a double precision in the database. So it recognizes it as a number and not an integer now. It’ll allow me to do things like, greater than 21, 20. And it will filter on that. Whereas before it didn’t distinguish between numbers and integers. So if then I were to add a filter for units in stock, which happens to be an integer. And I try to, well, you can’t see this, but if I try to type in a decimal here, it prevents me from doing that because it recognizes that it’s an integer. So there’s a little bit of smart formatting there on the input that we’ve added in this release. So you can see it matches exactly on that, 53 units in stock. So there’s one nice addition that we added as well. And this is the filter type that’s new. So you’ve seen how we have numeric and date and free text and valu a Boolean filter in the database. I’ll select it here. And it actually automatically infers that it’s, since it’s radios that it’s gonna be a yes-no filter. So I could say I only wanna show discontinued products or I wanna show only non discontinued products. And you can see that it filters that accordingly. So that’s new, that ability to do that Boolean option there. Can you, can I be translated by language as well? Yeah, so that’s a good question. Today it can be because the API for this is open, but it’s a little bit tricky. So today that requires a little bit of work, but we have a case for that that we’re gonna implement where you could pass in some, some translation. The challenge with that is that we shift these products, these, this project with no dependencies. And we wanna keep it that way. So having dependencies on I-18 and keys, like the translation keys, not the values, would make it a little bit more cumbersome to distribute. So we’re gonna come up with a way where you could pass those in at a run time to replace some of the strings that are hard-coded in here. So that’s coming. Finally, I think it’s worth pointing out that the filters are semantically different than searching. And so what’s nice, and this is true, of the Servoy data API is going back for years and years, what’s nice is that you can combine them, and it would be common for your users to maybe say, I wanna filter on products which are not discontinued, but at the same time, I might wanna type in, some free text and those work together. I could even search across, I think we have categories, right? So if I did produce, which is not discontinued, I get products which are in a related table. So that search is of course, been an extension that we released a long time ago, and we’ve been updating it continuously. The API for that is a dependency of this too. So it’s the same searching that goes on, for example, when we had that pop-up value list and you’re typing in the search within the results for the employee when I showed that, it’s the same API. So, but these work together in concerts, so you can narrow down your, you’re looking for produce and tofu that’s not discontinued, right? And so that all works together and gives a nice user experience where they can both filter and search. Okay, I think it makes sense to, oh, one other thing, I, before I jump onto the hood. If I were to say, look at one of these filters that I’ve set up here, I’ve filtered just on one date and have one record. Suppose I were to log out and log back into the solution, it might be nice if my grid and my filter were in the same state as I had left them. And you can see that when I arrived back here in the solution, both my orders grid and my product grid will have the same filter supplied. So the filter, the state of the filter is can be serialized and stored. You could do that by user or by tenant or however you like. In this case, I’m just putting it to web storage. So I’ll show you how to pick up an event that the filter changed and be able to write that out to storage if you wanna capture that. Makes for a nice user experience that you come back and things are the way that you left them. That’s true of the grid as well if I were to reorder the columns or apply some grouping on the grid or something that can also be serialized and stored. So you get that nice user experience that it is the way you left it. I think it makes sense now to go ahead into the IDE and see how some of this is set up. And again, I’ll try to touch on some of the new stuff as well. So first of all, let’s look at the orders grid that we had going. The pop-up filter component is specifically, or module really, is specifically designed to work with the NG grids. Filtering has always been part of the ServoyAPI and people have long built their own UI ways of applying filters. This was the idea behind this project was to provide something out of the box that was little to no code to do, robust filtering in a consistent user experience. And so the way this works is that we have a grid on the form and the filter object itself will look at the grid and look at how the grid is designed to determine what filters are available and how they work. So you really don’t have to say, we’re gonna filter on this column or that column and do it programmatically. It just inspects the grid. So you gotta have a grid to start with. Then there is another component here where you saw the filter show up. This is a specialized component called the Advanced Render component. You would see it in the, let me filter forward here. I don’t quite know where it shows up. It might be customer render, a custom list, and that’s what it is. I can ever remember the name for it. But this is really a generic component here that is meant to, you wouldn’t use this normally on your own like you would the other components. This is meant to display a list type of arrangements. I mean, you can, but it’s a little bit more of an advanced topic. And in this case, this is actually what’s showing the filters themselves. Once you, once you have selected a filter, then finally you have to invoke the filter request somewhere. And so here’s just a simple button and there’s an on action there. So I have kind of three ingredients to get started here. A grid, one of these custom lists to render the different filters that have been applied and then a button to say that I want to show the filter pop up. Everything from there is API. Finally, you kind of need to initialize things such that they are referencing each other. So if we look at the on load event of this form. Sean, we’ve gone see the ID. Oh my goodness. Okay. I think when I shared, I must have only shared. Let’s see. I should stop sharing and then I’m going to share it again. I think I only shared the application. So I’m going to share my screen. And first, can you confirm that you can see the ID. Yeah. Okay. I’m sorry for that. There’s a subtle distinction between sharing a screen and then just I just clicked on the window and it started sharing. So real quick, here is the grid. And here is that that custom list I was talking about here. So you would drag that onto the form. You don’t really have to do much to that other than name it. So here I call it filter toolbar. That’s actually going to show the toolbar where all the filters are applied. And then finally, like a button. And this is just a button with the filter icon on it where we invoke the filter pop up. So those are the three things you need to have on your form. And what’s important mostly is what the column states are in the grid because it looks at that grid to determine what to do. But on load, you want to associate these components together. So if we look at the on load event for this form and you might notice this goes into a base form that I had set up because it’s working the same on any of the table view forms that I had made. So really, this is the most important here online 40. You can see that I’m calling the SUI toolbar filter API and I’m creating this filter toolbar object. And what it takes as an argument is the element where the toolbar will be rendered. So it’s that it needs that custom list component to be passed in. And then the grid that it’s going to draw the information to filter from. And that would be the grid component that I placed there. So you initialize and associate those and it gives you back this toolbar filter object. And this has, you’ll see that it actually has quite some API to it if you want to dig in and get busy with the API. What’s nice is that you don’t really have to deliver the functionality that I’ve shown in this webinar too much except for the following items here. So that’s really all you need to do to get started. These are the three lines. I’ll come back to in a minute, but they are needed to handle some of the other topics. Finally, what you want to do is handle the click event of the button here. And you can see that I handled the on action event. And that’s just a one liner. Basically, you want to say that toolbar filter object that I made is a form variable. And I want to call a show pop of filter and pass in. This is the source of the event. I could also do event.getsource, but you want to pass in that component where it was clicked because you want to show the pop-up relative to where the component was clicked. If you don’t pass in anything, it’ll just show up centered in your screen. So if you want that as your user experience, you can have that as well. So that’s really it. Once you click the component, you call the button, you call this. And then it looks at the grid. It’s already associated to and everything else is handled for you from there. So really two lines of code. I handle the onload event. I do the binding. I handle the click event and I show it. That’s all you need to do. Now the subtleties come into the grid itself. If we look at the grid here in the orders table, this is where the different types of filters are determined. First of all, I’ll just click on customer here. This is the customer column. There is a filter type property in the grid and you have to set this. The default is none. And if you don’t set it, you’ll notice it won’t show up in the filters. You don’t have to make all of your columns filterable. You can control that. And here you’ll see the types of filters that are available. And they are text number, date, value list, and the new one, radio. If you put text, then it will be freeform text. Unless you provide a value list, you can also put value list. I guess it kind of works the same. I guess once you apply value list. And here I applied the customer value list. So simply by attaching that value list, it made me able to select discrete customers from the dropdown. For the country, it’s text, but there is no value list. And that was the real freeform one, right? It’s just type in string fragments. And that was the same for city. Then you can also filter by date. So here the filter type is date. And that shows that date picker with all those options. And that’s really all you have to set there. If I go to the products table view, the setup is exactly the same. And in this case, if I get one of these numeric ones, you can see here the filter type is number. And that’s where I got the greater than or less than, et cetera. And again, I didn’t have to do anything to say that this is a number column that has decimals versus when I did the units in stock. That one is a integer. The filter type is number either way. It actually looks at the data provider and figures out if it’s going to be integer or number. Finally, I showed the radio one. And so we added that new filter type radios. And this is on a, if the edit type is checkbox, then it assumes that we’re dealing with a kind of a binary or a Boolean setup. And so you want checkbox for the edit type. That’s the checkbox showing up in the grid. And then set the filter type to radio and you don’t need a value list or anything. And that’s what gives the yes, no filter on the discontinued column in the products table. So that’s really how to set it up two lines of code, two events to handle, and then configuring the grid. And that pretty much covers everything that we saw. I’ll go back now to that on load event and cover a couple of the other topics. That was here. So we covered this one here where we, we, we established the toolbar filter object in the binding. Here I register events, event listeners for when a filter is applied. And when a filter is removed. And the reason I registered those is that I just want to be able to persist the state of the filter. So I’m capturing whenever they change the filter state. And I’m going to handle that. So if you look at either of these event handlers, they both call this save toolbar filter property, which is down here. And I use that toolbar filter API to get the filter state, which is just going to be some an object. And then I serialize it. I call it all over here. Jason does stringify, which covers that object to JSON text. And in this case, I’m just writing it out to, um, to a user property, like a web store on, on, on this machine on the browser cache. But obviously you might want to store that to, oh, the SUI properties API. You can actually have it go to the logged in user in the database. If you want to and link it to security and such. But in this case, it’s just a local cache. So there is a one line of code for each of these events to register a callback. And then you can respond when the filter has changed. You might want to do other stuff. Um, finally, I did show how we updated the date format to make that configurable. I did this on load here, but, um, because this is a base form. Um, but probably the right plan I wanted to make it simple to show probably the right place to do is on solution open because this is global to, um, the whole filtering scheme so that all your, your filters will have a consistent, um, uh, consistent date. Uh, we are looking at, into maybe, uh, supporting where it looks at the, the actual column. But, uh, this, this one was, um, requested so that we could have to have something consistent. All right. Um, that concludes the demo. Um, and just a real quick recap and we’ll get to the questions. Um, there’s those three things you have to set up. The, um, uh, the grid itself and those filter type properties. You have to put that advanced render that custom list. Uh, I guess is what it’s called component on the form. And then you call the initialize on load once and then, and from there, you handle the click of and on the, on the button to show the filter. You can filter, uh, free text text with valueless, uh, numeric dates and then the new one is radios. We saw that on the product discontinued. Um, and that default that’s automatically shows you the yes, no option. Uh, so you don’t even have to make a valueless for that. It just, it just works. Um, and then, uh, something else which is new, which is nice that that exclude option from the token based searching. So when you have the free form searching, uh, you put the minus sign, you can start to exclude values, uh, in the filter. Um, we, we have the date, the global date formatting and the numeric input is now smart to integer or, or number with regards to decimals. Um, uh, the event model I showed how, uh, there’s the on filter applied and the on filter removed. I used that to do the persistence. There’s also on filter create where you can kind of get in between the, um, the events there and sub in your own values. So you, there’s a lot you can do there to do some custom stuff. I did do an example of that in the prior webinar. Um, so if you go back to the 2019.12 release, um, part two, I think it was, um, you can see an example of that. I showed how you can, uh, persist the filter state. That’s pretty easy. One line of code to get the state, uh, one line of code to restore it. And, um, and that’s just to realize JavaScript. There are some dependencies here. Uh, when you install this, it will, it will prompt to install, uh, the dependencies. And those are the search API, the lookup API, um, because some of the lookups you saw, like the employee, uh, valueless with the, um, uh, how there was first name in the last name and it was in a grid and you could sort the grid. And that was just on the pop up. That’s actually a separate, uh, API that you can use standalone, not just for filters, but for, um, instead of having a value list, you might want to have a smart, um, a smart lookup, say when you’re selecting a foreign key and you’re, you’re selecting the employee on the record editing process, you might want to pop up a lookup. That’s actually a separate API that you can use for other cool stuff, but it’s a dependency for this one. You need that, uh, that custom list or that advanced, and then we renamed it. I should have updated a slide. It’s really called the custom list component. Uh, and that’s really just a, all you have to do is put it on the form and name it. Uh, but it is a dependency. It has its own repository. Of course, you need the ng grids and, and for the radio, uh, filter, you need the latest ng grid because that’s, that’s actually also an option in the ng grid, uh, to set the filter type because there is built in filtering into the ng grid as well. So the filter types there can work double, but, uh, we recommend this for, really, uh, robust filtering. And finally, um, you want to get the latest bootstrap components as well. Uh, so those all will, it can install when you install this, you can install this from the servoIPackage manager. Um, okay. I see some questions coming in. Um, so Ruttger, I’ll leave this up. I would just point out that, um, there is the homepage for the, uh, pop up filter project on GitHub. So that’s where you can find Wikidock and information about the release. Um, we did make a, a rebuild. Uh, so if you get the binary and has a few extra fixes in it, but we should probably bump that to one dot two dot one, which is the one more, uh, uh, and, and rebuild it that way so that there’s no discrepancy between the tag in the source and, and the binary, um, for those people that do like to run from source. Uh, so we will do that, uh, probably later today. But if you just install now, you’ll get everything the latest. Okay. I’m done. Questions. Uh, yeah. We’ve got some questions. Will it also be hosted like demo conservative come? Um, is one question. So sorry. Can you repeat that? Uh, if it, it will be hosted like demo dot server dot com. Uh, okay. Um, yeah. Uh, what we will do is, um, uh, is, uh, the, the solution that I was demoing is the, is actually the tutorial solution now that we’re starting to use for, um, for a lot of teaching. And we will, um, it’s, it’s already in there. And we are going to be rebuilding that this week to, um, include all of the updated packages that are already referenced. And, um, so it will be in there so you can kind of deconstruct what I have here, um, from that, uh, from that. Yeah. Uh, another question. Uh, someone is asking if the pop of filter can be used without a table grid. For instance, to filter the foreign found set without having a grid display. Hmm. Well, the, the short answer is no. Um, uh, the ingredients of the, of the pop of filter. So the question I guess is, yeah, you, you want to have the same functionality, but maybe not have it associated with the grid. The short answer is no, because it, for convenience sake, it just, you pass in that grid, and it gets all of its information from that. Um, the long answer is that probably because that’s really just getting like a configuration and then, uh, showing it in, um, in, you know, where, on top of where that toolbar component that placeholder was. Uh, so, you know, the long answer is that probably you could, I would ask you to file a support case at, um, support.surboy.com or on the GitHub project, issues list. Uh, and we can look into that because I, I do think it’s possible. I think it also could be possible to point this at the, the, um, Servoy extra table component, which is like a lighter version than the, the ng grid. There was someone who had asked for that at one point. So, um, yeah, we can look at other use cases like that. Also the lookup, um, the lookup API is, you can install that all on its own and do your own little pop up lookups as well. Um, as I said before, so, so there’s a lot of a lot going on in this particular module that is reusable in other places. Yeah. Um, someone is wondering what the advantage is over using the filtering in the grid. Well, the, the filtering in the grid is, um, is limited. Um, the, the filtering in that we have here is really taking advantage of, um, other constructs that you have in your project like valueless. Um, and, uh, it’s able to generate the filtering in the grid. I believe, um, maybe only works inside. I can’t remember if it only works inside of what’s already loaded. Um, versus here it’s really generating the sequel and sort of applying a persistent filter on the, on the found set. Um, so, uh, yeah, it’s a lot more robust. You get to reuse things you’ve already made. Um, and, and it has like when you were, you saw when I was, uh, typing, uh, on, say the employee filter and I start to type a string fragment and it’s searching. That’s searching in the database. That, that table itself could be really big. And so that’s all sequel based too. So it’s all high performance and you can use all of your data, not just something that’s cached in the browser. Yeah. Um, another question. When you search a filter that is a valueless that has a valueless, can you then select all the options that have appeared? Oh, okay. But, um, um, if, um, that would be a sur holdED at Taco Bell July, um, first, part, um, right now comes along. We can sort of arrange our trade comes to personal radar and some of the action banks you would pass to zero, sixty-three order goods present. search customer. I clicked the wrong one. And it would be like like oh when I search within here like if I were to do a L then could I select all that if I mean you can you can click them individually there’s a D select all but there’s not a select all I don’t know if that answers the question or not. But but you can search on one and then clear the search. I’m sorry clear the whole filter. You can you can clear the search and then do you know another one and then clear the search and it remembers what you that had selected both. I don’t know if that answers the question but there is no select all we could look into adding that. I don’t know if that answered the question. Sorry. Got one other question. Will the new filters work with a column using a calculation essay data provided? Okay yeah good question. That that does not work because this is that does not work out of the box I should say because this is database driven and SQL driven. So everything is applying a filter to the found set which you know has the data binding applied. There is a way to handle that on filter applied event and then do it yourself. But you have to get in there because because we have no idea for example the order total here is this is a calculation which you know it’s told in memory and so we have no way to generate a SQL query that will produce that but the developer will know how to and so you can get that on filter apply event that I showed and then you can apply back your own filter result but you have to you have to build a logic for that because you wouldn’t be able to deconstruct a calculation. And another question I think you’d like with it. Can the filters be created via code? Yes. Yeah. Okay. Yeah. In a way that when the user brings up a screen it is auto-fealer. Well yeah. Yeah. Because that where I restored I’m doing that when I’m logging back in and you get the same filter as when you logged out. That’s just applying a I maybe didn’t show the restore in the code. I showed the saving but it’s kind of an inverse on probably somewhere in here. Yeah. On the first show you can see that it’s calling the filter state here. Toolbar filter online 241 restore to a water filter state with some just JavaScript object. So you could you could take that and say every time they show it every time they the form shows or the first time the form shows that you are applying a certain default state in the same way that we’re remembering what the user did last. It’s irrelevant where it came from. It’s just you can apply it when you want. Another question is does it work with preset table or found set filters? Oh, okay. Yeah. So those of you who are have been using Servoy for some time know that filters are also supported in the default data API and you can have a persistent filter on an individual found set or even on a whole table anywhere a found set of that table shown. So I could filter say I wanted to take that product table and never show discontinued products. And I could apply that globally or I could apply it just on this found set. You know, does that conflict with what I’m allowing here and the answers no because filters all working in concert. You could just set a filter on load or on per show or something or a table filter on solution open and then never show it in the in the filter pop up and it will it will apply just the same and work together with all the other filters and searches so that will work. Okay. Yeah, can we also customize the field of display you can feel? Yes, you can. That is an advanced topic. We might have covered that in the last webinar. So if you go back to the archives and look at the 2019 12 where we introduce this component, we might have covered that. It’s documented on the on the project. Here’s the here’s the project homepage and there’s the the wiki documentation here and I think it’s custom templates and this shows how to basically these that anything is this is not a specialized component. For those of you that know, you know, serve way for a while you have components and they’re pretty specialized to make your own component which you can do. But this is actually forms. They’re like template forms that are showing. So when I’m actually showing those filter pop ups, those are those are forms that are just shipped with a module and you can go and extend one of those base forms and have your own implementation of your own custom filters whether you’re changing the look and feel a little bit or really how the filter works. It’s possible to extend that and stick that in there and kind of piggyback on on the setup here. And so there is documentation here how to create custom templates and custom filters so you can really get in here and customize things. Okay. I think we covered. Cool questions. No one last question. Someone is asking when you have multiple filters applied across different columns. Does it use a logical and or a logical or change it which it’s doing right it’s always an end. And if you if you work with a servoise filters. Well it’s so some of them where you can select an option like I select multiple customers that’s an in right. So that’s not an or so if I select you know three customers it’ll show you know customer a customer be or customer c but it’s not really a logical or it’s more of an in and then if I combined with a different column it’s going to be an end between those. So it’s always an and and that’s the way and that’s by design that that filters and searching are semantically and and reducing the the data set size because that’s usually the goal of the user. There are ways to do logical wars but you wouldn’t do it through a filter. Okay. That’s it. I guess. No other questions. That’s it for now. Okay. Everyone I encourage you who ask the question where we could look into adding some kind of support for something. I think there was this select all and some other good observations and questions. Please file a case at support.servoy.com or go to the GitHub project here and and go to the issues section here and you can you can log in and see there either place works we pick them both up and track them. Okay. Thanks everyone. Thank you, Rhetker. Thank you Sean. Thanks all for attending and enjoy the rest of the day. Bye. Bye.