2019.12 Launch Part 3 – December 20 – extensions
2019.12 Launch Part 3 – December 20 – extensions
Today’s webinar is going to be about a new extension that was added in 2019-12, and this corresponds with all the other packages and the core stuff that we’re releasing. And today I’m particularly excited. Yifo, do you want to know why I’m excited? I absolutely do. So the way I usually do these webinars is I start a little early in the morning and try to build the demo the morning of number one to cut down on the amount of time it takes to prepare them, but it’s also a good exercise to kind of test out the things that I’m showing really are simple, and that it’s not too difficult, and I didn’t spend all week to make something and then telling you that it’s simple. That said, you know, making a demo as it’s problems and things come up and I encounter trouble. Today I woke up and I started to build the demo that I’m going to show you, and it was as easy as it’s supposed to be, and I think that’s nice. So what I’m going to show you today is a new extension, I’m calling SPY Navigation, and it’s really a combination of a few things. For one, it’s a lightweight API for generating navigation events within an application, so going from screen to screen, and also sort of capturing what happened when there’s navigation events so you can respond to things in your application. So an API is nice, but we find that when we give someone an API, we have to explain to them how to use it, and you know, it’s not out of the box, it’s just an API. So what we’d like to do with this one is we held off on releasing it until we had a sort of reference user experience, and we took the most common kind of navigation setup that we’re seeing, which is sort of a side navigation menu with maybe a nav bar across the top, and we made a UX template for that that’s already hooked up to the API and just works. But at the same time, we understand that people want total UX freedom, so we made that template extensible, so that you can customize it, and you can also provide your own implementations if you want to. So everything that I’m going to show you from a UI point of view is totally flexible, but you get this out of the box. So with that said, I’d like to jump into the demo. So what I’m showing you here is probably something that looks familiar. It’s a simple application with customers and orders, and we can navigate between them. The first part that I want to show you is really just how I set up navigation, and then we’re going to get in some more complex navigation scenarios. But really what I have is I have four screens. I have a customers list and a customer detail and orders list and an order detail. And so what I want to be able to do is click on a customer, jump in there with that customer, maybe go back and click on the orders, and then jump in here and look at that order and move around that way. The other thing I might want to do is be able to click on a customer, look at their orders, and click on an order, and look at the order. Also from an order point of view, I might want to say, oh, this is this customer here, and I want to navigate from the order directly to the customer. So I’m going to walk through setting these things up and how to get these scenarios. So let’s jump into the IDE. And what I’m going to start with first is my main navigation form. So in order to start this entire application, what I’ve done is I’ve included in my IDE’s responding slowly, usually from go to meeting. I’ve included in my build path here the new extension that we’re provided called SUI navigation. And that actually includes a module SUI navigation UX, which is providing the navigation as the API, and the navigation UX is the UI implementation. And then what I’ve done is included those as modules. And for my solution, I made a form, the first form here, I call nav main, and this is the side navigation with the menu bar across the top that you’re seeing. Let me get rid of these warnings here that I’m getting. Developer. So then what I did is I created this form, but it’s an extension. So I’m using form inheritance of a base form. And that base form comes from the SUI navigation UX module. So if I look at the properties of this form, you can see that it extends the SUI navigation UX. That’s a bit hard to see from the properties. But I picked this form as my base form. And all the instructions for this are on the wiki for this project. So when I get that, I get UI out of the box, but I also am getting some functionality. So I get all these methods that are inherited through form inheritance. And what I have to do is go in and override a few methods. So the first thing I want to do is get the navigation items to show up. So there’s a method in there called load menu items. What I did is I followed the instructions on the wiki and I added a few items. So what I want to do is create a menu item object. And I use the type that ships with this extension called the side nav menu item. And really it just takes a few properties. The ID in this case is really the name of the form that I want to show. And then what the display text is, that could be anything, the I18N, etc. And then if I want, I can do an icon style class. So I put in an icon there and I added to my array, basically at the end of this, it needs to return an array. So I have two forms here, customers and orders. If I do nothing else and I do that, I get this functionality that I can click in the menu, back and forth between customers and orders. So the rest is done for me. I don’t have to handle a click event. I don’t have to build the menus and put them into the element. It’s just a quick override of this method. So the next thing that I would show you is how I can navigate, say, from the customer list to the customer detail, because you’ll notice, there’s not a customer detail or list here. The list is in the menu, but I don’t really want to show the detail in the menu. However, I still want to be able to navigate to it. And I wanted to show up where it’s supposed to show up, etc. So just again, to review the functionality, I’m going to just pick a customer here and when I click on it, I’m sorry, I’m on a board of screen. I’m going to pick a customer here when I click on that customer. You can see I go to the customer detail and I get some information there. So what I’ve done here is in the customers table view form, I’m handling the on cell click event of that grid. And grids are on other subjects. We have a few webinars about them. So I’m not going to get into the UI and stuff. Just that when you click on it, it calls this method. And I have this form called show customer detail. So there’s just two lines of code I need to do here. One is I create a navigation item. So if I had already shown and I wanted to recall it, it’s another complex scenario. I could refer to it by ID. But in this case, I’m just going to make it new. And I just pass in the name of the form. And then I call the S3Y navigation API and it opens that for me. So when I’m on the list here, it’s calling that. And then it shows this form in the same context. Now another use case that I’d like to show you is when I went from the customer to the order record, how am I getting the right record? So showing a form is one thing. And by the way, I’m just using the same found set that gets generated for any customer form. So I’m not using separate found sets or name found sets or related data. So those of you that are new to Sirboy, I didn’t have to do anything special to keep these records in sync. The record that I’m picking here is the record that shows up in the detail. That happens by default in Sirboy. Now the next use case that I’m talking about is suppose I see an order in here that I want to know more about. I click on that order. It now goes to that order records screen, but it’s also the right order. So I had to do one extra step and specify some data to load. So if we look at the at the form customer details, again, in the on cell click of the of the grid that shows the the orders for that customer, the related orders. Again, I have this type of method where I create the navigation item just like before. However, in this example, I also want to pass in some related data. So what I do, I grab my customers to orders found set and I get selected record. And that’s specified as the data to load in this S few I navigation open method. If I mouse over this and you’ll see I get all the doc is the self documenting API. Of course, this is all in the wiki as well with examples, et cetera. And you can see that there’s an optional argument that I put in for this example, data to show and you can pass in a few things like a record, an entire found set, as well as a QV select object if you wanted to pass in some custom query and have that be run against the target form. So that’s all I had to do was add this one extra line of code and that’s what is making sure that when I navigate to say this order here with a total of 718, I’m really getting, you can see the total up here, I’m really getting the right order that I chose. I’m able to specify it. Now, I didn’t tell it that hey, go and load these records, that was done implicitly. I want to look at another use case where again, I’m navigating to a related record, but I’m also kind of changing the options a bit and I’m going to show you what I mean. So in this use case, suppose I want to navigate from the order of the customer. But when I click on this, it goes back to the customer or to the customer if I wasn’t just there. And the way that I do this, if I look at the order detail record, I have a method here show customer that happens that’s being called from that little button that I put next to the customer field. And there’s one other thing I want to show here, there’s something about custom data which I’m going to get to in a minute. But this looks just like the previous method, but I add one more option and that’s the selection type. And you get a few options here, select record is rather than load a record. There’s only a few customers in this database, I think 91 in a sample database. So they’re already loaded by default. So what I want to do is keep that list, this has to do with sort of caching. That list is already cached and I just want to select it because I know it’s already in the list as a developer. I know it’s already in the list. So I’m using the select record option so that suppose I were to go navigate to a list form, it wouldn’t just have one record, it would have all the records yet it would select the right record. So there’s a semantic difference there between the other options which are to load or to select. And now one little caveat I would point out is that there’s a way to, so if it’s already cached it will select it. But there’s also another option called force select. This is a bit of an edge case but suppose you had a really large table and also the found set that’s going to be returned. So it’s not filtered by something and it could just go on and on to the end of the table. And you’re saying I want to select this record and it’s not cached and you want to force it, then it will actually go and load the records and then select in order and then select that record. But if that was a really big table you wouldn’t want that to happen. So there’s another option called force selection but I would say there’s a warning in it in the documentation everything to know that it could be expensive. Anyway that’s just a little caveat. The thing I want you to remember is that I can select or load it’s optional. Okay so I’m going to wrap two, four, two seconds to show. Sure. So I just posted in the chat box that Joham released about two minutes ago the RC2 candidate. So the link to the forum should be available for everybody in the chat box. The other one is I think there’s a question that might be a good time to ask you right now. Sure. Since you are in a, well let me tell you what the question is by changing from the customer detail to the related order. The highlighted navigation doesn’t change. Ah yes. Right. So as I was in customers and I went to the detail and then to the order the point is that this could be updated. I can actually show when I get into navigating handling navigation events I can show how we could do that. Maybe it’s also a candidate for an enhancement to the UX template that comes with this to identify navigation events and see if they match. In this case the the nav item is not technically the same as the one here because it has some custom data in it or a records to load. But it could be ideal to highlight that if you just check the form so we can actually do that after after we get through the normal demo and fix that using one of the one of the API hooks that are available. So that’s a good question. There’s there’s one other thing I want to point out about just using the API when you navigate between things and in order to set this up I’m going to do a couple steps. I’m going to come into the orders list here. Oh I already have it sort of descending by date because it just helps if I get like an order that’s not going to be the first order of the customer. So I’m going to I’m just going to pick one of these here. This order number 11076 in this case I want to navigate to the customer but I also want to add a little bit of custom behavior when I get to that customer record. I want to make sure that in that customers list of orders that this order is also selected for whatever reason. I’m just using as an example of some custom implementation. So what I’m going to just click here and I do get into well I don’t show the order number but if we if we go back you can see the totals a 25 and indeed it was the order that was a 25 here that is selected. And the reason I inverted the sort on that was because I wanted to make it so that it didn’t default to the first one actually got the last one because it sorted by creation or by date. So that’s a little bit of extra functionality I want to add in there that’s custom to my own application or user experience that I want. And that was this part right here. So again this is when I call show customer when I click in that order detail with a little arrow icon. I’m just passing in I’m doing item set custom data and I just pass in really I could pass in whatever I want because I’m going to pick it up in the other form. So if I go to the customer detail form and I look at the on show of and. What I’m doing here I want you to ignore some other stuff and just focus on this for the moment because we’ll get to the other stuff right here. Is I’m going to pick up that custom data so I call one line of code to the API which is to get the current item. Then I get the custom data and then if it has custom data and it has that property select order ID which is my own my own thing that’s not part of the API or the reference implementation. That’s my own custom. Little packet that I want that I want to send and then pick up if it has that then I want to call customers to orders dot select record on that ID so that’s what that’s what caused it to select that last record there was that I’m sort of saying hey show the customer form and by the way. select this order in the in the customer form so that’s how you can kind of inject a bit of custom behavior a bit of it could be something else it could be a filter you want to do or something even related to the UI. That you want to have show with the form shows something like that it’s entirely up to you how you handle that the idea is that you do it this way in a way that doesn’t break in encapsulation that doesn’t have you meddling inside that form from some other form scope. You can do it in a purely event based way which is the right way to do it. Something else you might have noticed is that I’m able to click this little X button here and and it’s actually going to it actually goes back to to where I was so the simple example is I’m on a customer list I click into this customer I click the X it goes back to the list. In the example where I was I went into an order and I click the X it went back to where I was before I click the X and went back again so again that’s that’s something that I added to my form. You can see it if I if I come into my customer detail form and open this up in the form editor. You’ll see that I have that little button there so this is my own implementation and then I I handled that event. Right here on action back and again it’s just a one liner in the API S few I navigation history dot back so you can go back and you can go next and what it does is it it brings back the the prior. The prior item that you had so that’s how I’m able to do that easily. I want to talk about handling events as well so for example I want to know when navigation is happening and there’s really two ways you can you can go about this you can you can know that an event is about to happen and you can know that an event has happened sort of sort of like a before and after. And the use case that I’m going to use to illustrate this is suppose that I go into this customer and I’m editing that customer and. I decide that you know instead of Germany I’m going to move this customer France. Okay, and then but while I’m editing I change my mind and I want to navigate back to the list. Have unsafe changes what would I like to do do I want to save and go back to the list and continue editing if I continue editing it just leaves it as is until I actually do something like save. And then it goes back to the list you can see that the country here is France of the edit was made. So I want to talk a bit about how that was done because it was done in a way that works that’s compatible with the navigation framework here and of course could be put in a base form and done very generically. So the first thing that that I did is in the customer detail form in the on show event you may remember I told you to ignore the stuff at the top, but now you can pay attention to it. What I’m doing is registering a listener to receive navigation events only well the form is showing. And then what I do is I register this on navigation event which is down here and it receives this object as you I navigation event. And again you’ll get code complete on all that it’s one of these documented types and I’m checking if it was a before close so I don’t care about after it’s called before close and after open. I care I care about before I’m about to navigate away that the API gives you a chance to check stuff and then rejected if you want to. And so there are what I do is I’m just checking for edits in this case just all edits and then I asked the user and if they if they choose save then I just I saved data and I return true. However, if they did anything else so even if they didn’t click cancel but if I came in here edited the form. And suppose that I didn’t click this button but I tried to click over here it doesn’t matter what I’m doing if I’m trying to navigate away it’s going to give me that opportunity. And so if they do anything else other than say I want to I want to save changes then it returns false and that’s your that’s your exit it blocks it blocks the next event which is the open event. To open a new item and it leaves you where you are so it’s a hook you get to be able to handle that. There’s there’s another feature of the sort of you accent limitation that I that I didn’t show which is how to handle searching. You this navigation well let me back up a bit there’s an ad bar across the top this was this is provided in the in the UX template again on the template is just a reference implementation it’s extensible or you can throw it out and make your own and still use the same functionality. But in this example I have a search box and I have a way to to log out. So the log out is pretty simple I click user I log out. I can come back in. And you can see I’m I’m logged back in. The other thing is as I could search so suppose I want to find all customers in Germany and yeah maybe. With the word Tom in it and I get one record you’ll notice that when I get one record it goes to the right to the detail form. But suppose that you know I just put this one it stays on the list form. So that is not just specific to this form this this search bar sits outside in the sort of navigation framework and it could be applied to any form. So when the customer. Table view is in its on show event. That’s the most stable view on show that ID is. There we go just took a minute. I’m calling one method here to the SUI navigation UX you’ll notice the scope is different it’s not SUI navigation. SUI navigation is just API it’s purely API events and processing those the UX has to do with the actual. template that you see and I add this global search listener on search you can see that’s this method right down here. And what happens is it calls. Whatever handler you register and it passes in the search text when it’s called and then you can handle it however you like in this case I use the. The column in SUI search API you could also use the pop up filter pass it to that like we showed in Wednesdays demo and then it finds directly to the grid so it’s up to you what you want to do with that but it’s. It’s just a nice little way to handle that. I also want to talk a bit I probably did this a bit out of order of how I set up the nav bar again in that main nav that form that I extended. And then I had to override a few methods I also over rode the. Load nav bar items. And this is a simple method that gets called when the form is initializing you just have to override it and provide return back in array of navigation items. And so these have to do with the nav bar component which is just one of our standard components that we ship and you just provide the menu items for that and it gets plugged into that menu. In addition to that there’s some can functionality that goes with it such as. The search so as we this is one template but we could also extend this template ourselves you know as a developer or also. As we make updates to this project we may add more and more functionality like really you know generic functionality like logging out like searching to this. So for this example. I I create a menu item in this case the the action name is that default nav bar action search and that gets picked up automatically I don’t have to do that and then it calls any registered listeners. So that’s what happens there. The other one is is suppose it’s a it’s a custom one and I had the user menu and then I had a user sub menu down here and the the log out. Is the action that that I handle custom so then what you want to do is his override the on nav bar menu item click event and. handle any any default menu items that happen there and this is where I handled the log out one so this is sort of the same way you would implement a nav bar but it’s already plugged into. Into the framework and it has some default actions in it like the that global search which gets handled for you automatically so that’s how that was set up as well. So I think that concludes everything from the demo part and I can run through a quick overview of what we saw and I promise to go quickly but I just want to make sure it’s it’s clear. Again, I know it’s a lot of info to take in but keep in mind that I started working on the demo this morning to be able to prove that it can be done quickly and I followed the instructions on the wiki and I really had no problems. So the first thing I did is I extended that navigation UX template form that that side nav. Base form and I override over road to methods I over road the menu items method and the nav bar items method. Then what I did is I started playing with the API I got the default navigation by default I didn’t have to do anything for that but then I started to play with the API and I took it from the simple case the more contact complex case so I was able to open. So from list to detail I was able to go from one entity to another entity say customers to orders to customers by using the options of data that can be loaded. I also played around with the options of selecting a record versus loading a specific record and that has to more to do with what stays in your cash and your found set. I started playing with history and I just put a history back in all of the detail forms and I was able to go back to where I was coming from. Then what I started to do is play with with the custom objects I wanted to be able to show in order. Go from an order to a customer but then have that customers orders select that order and I use the set custom data on the nav item object. And then I handled the custom action in the on show event so there’s a lot of different use cases for that one could be custom filters something with the UI. The bottom line is you do it the right way without breaking encapsulation. Then I started to play with the events and I add a remove navigation listeners in the on show events and the on high defense I didn’t show the on high but by the way in on high I do remove the list and and that’s kind of important. I handled that before close so I got the I’m able to block it by returning falls so I forced them to save records or to cancel. And then finally I showed you how you can plug in that global search listener to the menu item that you initialize and you can search however you like with that. Well, well we take questions and answers i’m going to leave up a link to the project into the wiki this is also available through the package manager so if you if you bring up the package manager in the IDE you can include it in your project. Also, we did we covered a lot this week, but we didn’t even get through all of the new stuff. So when we come back in the new year we have some updates to these security module that is a lot like this some default UX templates and some more extended functionality that we’d like to know so. Although this webinar series about the launch is over will be back with more updates every two weeks in the new year. Thank you. Maybe I’ve got a little challenge for you to show us how to build a blank screen. You mean like start with a new screen and and plug it in. Yeah, sure that’s a good idea. Let’s do that in under two minutes again. So what I’m going to do is. Create a new form. In this case i’m going to make it based off of the employees table. And i’m going to click finish. And then it’s a little slow with the IDE and the go to meeting at the same time. But what i’m going to do is i’m going to place a grid on here. And i’m going to sort of blow that grid up a bit. And i’m going to put a column on there for. The employee name let’s do. I think I have a calculation for their display name. There we go. And a title. So now we have a form with a grid on it that works on the employee screen. So then what I’d like to do is go back to my main nav. JS form and remember this load. Load menu items. And i’m just going to copy this because that’s how I roll. And we want to say this is employees. And the name of my form was employees. And I don’t want it to say orders. Please, let’s call sales rep. And well, we wanted to look like a person, so we’ll do the font awesome user icon. And that should be enough. So I need that to sort of initialize some in a relaunch the. And then we’ll go back to the next slide. So again, there we go. I didn’t set a default first form, but so we come in here. This is what it looked like at the start of the demo. So now I have sales reps here. And when I click on it, I get a list of my sales reps. So I hope that was under two minutes, but that’s how you do it. And then you can start plugging stuff in. And then you want to go to say my order. My order screen. I didn’t name these in a consistent way. And I want to. Well, I have, I know I have a. And employee the sales rep for that order. Sitting on the screen here. And I’m going to do a copy paste on this button. I’m going to make a new method in the form. Show sales rep. Create private. Okay. And show. And I’m going to copy some stuff here. Still timing you by the way. Yeah, well, we’re over two minutes now, but I did make this screen, right? Yeah. Okay. And then I’m going to open this. And. That’s just copy this because I like that select record option here because I know there’s only a few. A few employees. So in this case, it’s not borders to. Hello. It’s orders to employees. I’m really waiting when I click around here. And we do want to select our. So I think that’s right except for this. Employees. Name of the form. So save everything. And I don’t think I need to reload. But if I come into the order here, pick one of these orders. And then I see employee ID here as Margaret Peacock. And now it navigates here and it selects Margaret Peacock. So I didn’t make a detail screen for the employee, but I couldn’t navigate it there. And you can see, because this item is already registered here, we do get the update here. There’s a question about, you know, the highlight here. Because this this item is stored in as pertaining to the nav bar or the side nav. It does highlight that. So not case it gets picked up. Yeah, so that’s that’s kind of the gist of it. I could keep going. I could make it searchable, et cetera. But I think that you get the idea that there’s really not a lot of work there. You can go pretty quickly. It takes a lot longer to explain than it does to do it. Any more questions? Yep. Got one here about navigation. How many steps will it remember to go forward or backwards? Okay. Okay, figure it right there. Yeah. So if you check out the wiki, there’s some info on that. I think it’s 500. I’m just going off to the top of my head here. Navigation history. 500, right? Because it doesn’t really it doesn’t have to do with, I mean, it’s it’s cash by ID. So it doesn’t keep forms in memory of forms. Want to fall out of memory. So void does a has a very mature way of memory management, both for data and screens. And there’s not much you can do to corrupt that. So don’t worry about that. But if you wanted to kind of, you know, limit that, you could by setting this Mac history light so you can configure that. And by the way, this is the project site that I put on the useful links there. They get hub project with the wiki and I really just followed these steps in order to build what I built. What else? So for people that get lost really easily, they can go back 500 steps. Yes. Interesting. Let’s see what would need to be considered to implement the same navigation events, but multiple forms shown in tabs and our tabs recommended. Okay. So the question is about kind of taking the same. approach here, but instead of doing maybe menu items here, you do tabs. The steps that you would take would be to to use the parse the API that I demonstrated. Basically, the API is really lightweight. If you actually go and look at the code, there’s not much code there, not that you have to look at the code. But if you look at the public methods and maybe it just helps to look here. Here’s the top level functions, right? There’s not many of them. And what you want to do is you want to. You want to call the navigation open events. You saw in a lot of these, this SUI navigation open and that navigates to something. Now what the implementation of that is depends on how you handle it. And in the, the UX template we made here, we’re using that navigation listener. So in, there was another case where I was listening for navigation events. When I was trying to block the them from leaving when they had, so if we look again at the end of the application, we’re using that navigation. So there was another case where I was listening for navigation events. When I was trying to block the them from leaving when they had, so if we look again at the customer detail screen, when I was editing, I have this on navigation handler that I registered to the on show. But you could have a tab form that registers a listener. And then when you receive a navigation event, then you show the right tab. So that what that gives you is rather than saying, I want to go over to this form here and I want to muck with its tabs and totally breaking encapsulation. What you can do is say, hey, I want to navigate to this form, let the UI implement it the way it’s designed to and it doesn’t matter, you know, if it’s tabs or if it’s menu. So very easily you could switch the, the UX implementation from, from a side nav type of thing to a tab panel type thing. And in fact, we have, I’ve seen a customer of ours that had, they had both at the same time with a lot of other stuff. So they got pretty complex with it where they had, uh, abs inside the, you know, the screen, but the main navigation was still on the left. And, and they were able to keep track of that via navigation. So it’s, it’s a matter of just using the API the right way, but we also don’t want to just give you an API with nothing to go on. So we give you this by default. If there’s interest in other UX templates, we’d be happy to pursue those two. And we sort of pick those up through, through customers we work directly with to see what, what types of things they want to do. And there are other, there are other patterns that we do see that, but this is the simplest one that this is our MVP if you will, and we do plan to enhance this with different kinds of templates if you will. Okay. Got another question here as well. Can some many can some menu items work the same way. And when you use the history, will it select the sub menu item? Yes. I didn’t show any sub menus, but I could have done. I think, you know what, if you go back in the archives, I did a demo of the side nav component when it was new, a long time ago. And I did show how to do sub menus. And in that case, I think I, I had a products menu. And then in the sub menus, I had all of the product categories like beverages, produce, etc. And then when you would click on it would change the list here. So rather than even navigating to a screen, you don’t even have to show a form you could, you could call a function or something. Or you could navigate to the same form, but with the different filters. So not only can you do sub menus and will it keep track of it in the navigation, but those, those could pertain to, you know, different data in the same form. It doesn’t have to just be this kind of like customer orders, customer orders. And that’s just the easiest one to show. Okay, John, if this answers your question, perfect, if not feel free to send an email to Sean and me and we will look up that other webinar where Sean demo does. All right, then I got another one here. That was actually posted in the beginning of the webinar. Can I use this for deep links as well. I don’t know what the this is. Okay. I think I understand. So in Servoy, you can, for those of you out there who don’t know what deep links are in Servoy, you can open a navigation with the URL having some information in it, such that the navigator, sorry, such that the application does something maybe it runs some functionality or navigates directly to. To a particular screen, right. Suppose you get an email with a deep link into it that says your order has been approved and then you, you know, you want to click on it and it takes you rightcorn here and it loads the order. So the question is, Met. navigate essentially from a deep link and the answers yeah absolutely that that’s a great great question I would if I would have had that question before bearing this I would have put that in here because it’s not much worth to do and so you handle your deep link and then you can you can just call you know scopes as rewind navigation you know open possibly you could even come up with a mapping so that you just have one deep link that maps you know different URL fragments to different resources with different filters or you know selectors that sort of thing all right that would hit jump yeah those are those are great questions awesome well that’s that’s it I think everybody’s ready to start the holy ice all righty thanks for all the webinars that you’ve done this year we’re gonna post this one as soon as we can as well are you gonna do another webinar before the end of the year nope what so when’s the next one I think January 15 so it’s uh it’s uh yeah it’s not um not the first Wednesday but the third one we’ll make sure that everybody gets an update of the new dates yeah and I think what will probably be showing is some stuff that we didn’t get get through in this mini series uh because we have some other really interesting stuff related to sample solutions all right okay well thanks everybody for joining um happy holy days see you guys early next year stay warm stay safe thanks everyone yep thank you okay bye