logo

NJP

Hackathon Kickoff - Live Coding Happy Hour

Import · May 08, 2021 · video

foreign foreign this is the pre-pre-stream if you're catching this on YouTube and twitch early we're not quite ready yet but we'll be ready in just a few minutes so just hang with us we're gonna start uh right on time uh this is just a little audio to make sure everything's working foreign [Music] I think that was enough oh okay all right I changed my screen size and then we should be fairly ready [Music] thank you hello and welcome to live coding happy hour special edition for the knowledge 21 Creator con hackathon this is very exciting we've got some stuff to build and streaming oh man this is like the the tip of that knowledge Iceberg it is it is here finally can you tell the excitement in the air it's just it's electric and it's still it's 7 A.M for me get wait till we get started see how we are at the karaoke party in a couple of weeks oh the the excitement is infectious chuck with that Legends will Ed simple well hello everybody I'm Andrew Barnes developer advocate here at servicenow I've been developing on the platform for about seven years and working at servicenow uh for two and a half years and I love developing on the platform and I'm excited uh to join you today as the hackathon organizer and super excited to see what people are going to build Brad thanks Andrew I don't know that I can match uh Chuck's level of excitement uh but I'll try my name is Brad Tilton I am a developer Advocate with a developer program here at servicenow I've been developing on the platform uh since 2008. I'm really excited to see what everybody builds and hackathon today we always have some really impressive apps and things that I'd never even thought of doing on service now uh so it's going to be great to watching what everybody does and hopefully being able to see some some different live streams of what people are doing and uh and we'll be building something on a live stream as well so it's going to be a fun day and my name is Chuck tomasi senior developer Advocate at servicenow been here for coming up on 11 years it was a customer for a couple before that and lots of experience in the I.T space in a bunch of different roles before that and like Brad I love this is one of my favorite parts of the whole knowledge conference is is the hackathon and seeing what everybody builds and the imagination and and The Innovation really getting those moments where you go wow never would have thought of that love the idea and uh this is this is nose to the grindstone time it is it's excitement yeah I mean we are you know 55 minutes from the start of the hackathon uh and thank you for joining us uh wherever you might be in the world today uh and we are just super excited um the teams uh we've got uh something like a hundred teams that are ready to compete uh and get going uh just just by the time we end this stream they should all be ready to to go if they're uh awake um this stream is 24 or the hackathon is 24 hours so uh hopefully uh that is uh fairly uh nice for all of the teams uh throughout the world uh to have the same amount of time uh and uh to to participate in the hackathon so we're going to do some building ourselves today uh so during this hour period um I will be screen sharing and building hilariously enough um a hackathon management app so we currently have a hackathon management app that we're using to run this hackathon but we are reimagining it with 2.0 and there will be lots more automation uh because we love Automation and uh let's let's uh see what we can get accomplished today uh to help facilitate that now we are not competing in the hackathon so we cheated just a little bit and have created a couple of tables that we knew we needed ahead of time so we won't be starting from bear scratch um but you know we've we've put less than an hour into this app so far we've basically just created tables unless one of my esteemed colleagues has information that I don't have no Chuck says it was less than an hour he just created some tables if that I mean we made some notes an outline of saying we need a person table here and an event table there and I went as far as I could before we got into those philosophical discussions of list or related lists you know those kinds of things so we'll we'll do our Justice on this show and and kind of be going the solutions out there somewhere awesome anything else that we need to share before we get going um well uh why don't I say during the stream um if you're participating in the hackathon is when your team leader will get the credentials for your instance and as soon as you receive that email you can start so you don't have to wait until exactly the start time if once you get your instance credentials you can start um creating users for your team and sharing those out and y'all can start building as soon as you're ready I think our video audience is going to drop off a little bit at that point we've got a great group here today love it so real quick before we get into it Andrew if somebody has a question about the hackathon during the stream what's the best place for them to go and ask that question ah excellent question Brad so if you're here in the Stream you can ask us um but throughout the hackathon window uh reaching out through the community so there is a community uh formed especially for the hackathon that's the best place to to go ask your questions and get help from one of our gurus there's also five different scheduled times uh for the gurus to be in a zoom session to help you live on a zoom so you're welcome to drop in those as well and get help directly but the community is the main first stop for you to get your fastest way to get help most of the most of the time thank you for that question Brad and barring anything else I'm gonna start sharing my screen nope see no objections let me know over there I second the motion so here we are in our instance for uh building this hackathon app I have got my hackathon app selected and the first thing that I'm going to do today is go take a look and if you haven't seen it yet this is a Quebec instance and it's got app engine Studio installed so this is our our latest Innovation to helping uh you know reach out to a broader developer base uh to folks that don't necessarily think of themselves as developers um so that they can build apps on the servicenow platform so we're going to take a look at some of the data so some of the tables that we have already created so we've got we've already got nine tables uh built and we like I said we haven't spent a lot of time building these tables um because we built them right here in app engine studio with uh our table Builder here which really helps us accelerate that and I just recently created the instance table so the hackathon has a a bunch of instances so every team gets their own instance and so we need a table to store those instances and be able to operate on them and one of the things that we do for the teams to help them go faster is we pre-load some of the plugins that they might need to get going in the hackathon and of course I like to do that with automation so let's make a new table to store our plugins and if I could ask um Brad do you think you could go and grab the plug-in names um from the flow that I've got in the existing instance so there's a flow to install plugins and if you could get those names for me that'll help while I'm building the table this is this is a just the V underscore plug-in list is it it is not because I may want to install plugins that are not on this instance so if I was limiting my search to just the plugins on this instance uh that would that would potentially stop me from installing a plug-in on one of these other instances that I I don't actually have access to on this instance ah okay I thought you had like super duper access to all plugins and just designate who gets what not the case um it's not that it's not not the way that I I'm envisioning how to to run it here so we want this to be uh the plug-in um packages that we'd like um we don't need to make it extensible I don't think and ah why not make it Auto number even if I don't need it uh I don't think we're gonna need that many digits though foreign question does seven plugins sound right and how do you want this list um you can send it to me in slack or you can drop into this table once we create it and oh I'll do that and and input them yourself I'll do that so I have got a stub of a table now and now I'm in our table Builder and I'm going to add a couple of fields so I'm going to hit add new field and we want the name of the plugin sneaky sneaky and we'd like that to be a string type and some of the plugin names get a little long so I'm thinking something like 80. how's that sound yeah that's not fair all right this is the ID or the friendly name um that the name might be the friendly name and let's do the uh as its own string so probably the friendly name could have uh could have been shorter than 80. but we'll keep them we'll keep them both 80. so we've got the name and ID and I might want to roll them up into a package which again is going to be a shrink nope I want this to be I don't know what I want the package yet hmm I'm gonna come back and think on that what helped me understand what the package is what what's that field representing so uh a colleague of mine did something similar to this and they used uh like a package bundler to say these are all the things that go with virtual agent ah and put them into a package and I may or may not want that here um thank you so that's why I was on my brain you'd want a related list right because you a plug-in could be in more than one package this feels like a reference like some kind of dependency this package depends on that other one and I think you can get that out of the the plug-in information uh it's not necessarily a dependency so you could want to install all the things for virtual agent and put them in a bundle and they they're not all dependent on you know you can't just pick one and say install all these dependencies um that was that funding I don't know if we need that here so uh let's go on to uh events now event is going to be a reference field so this is referencing another table in our application uh so this is the and this is gonna wow we actually got uh close uh hacker event there we are event is personally event is a terrible table name there are so many so many event tables and it can represent multiple things so on uh let's leave package off for now until we know that we need it because we can always come back and edit this table and and ex you know add more functionality as we run into it so we don't have to have all of this figured out uh right up front so let's make our name the display value and I think we're ready to save just so with that Brad should now be able to input those into our table what was the name of this table uh apparently I called it plug-in package hacker I guessed right yay so Brad's gonna input us uh some data here and then the next thing that I'm going to do is I want to be able to from this instance install these plugins on other instances so how do I do that well uh you you might have caught uh some of our continuous integration continuous delivery uh sessions before but if you haven't let's go take a look in our docs and see if we can find some information on that look at that first thing so there is a Spoke so there's some apis and those are you know great to use uh if you're outside of the servicenow and you're trying to reach into it from you know say Azure or something to use the apis directly but we're inside servicenow so we get to leverage some of the the tools like Spokes and we're gonna go take a look at what those are um but this this is what we want to do is we want to use this cicd spoke to activate a plug-in and we actually may even want to do a batch install on plugins oh that'll be fine but let's start with activate a plugin so back here in AES I'm going to to go to the the top screen of my app and well this isn't data that we're trying to do and it's not an experience uh it's automation so we would like to do some Automation and we look at these templates that are sent to us here and are any of these jumping out at us is a thing that we're going to do it's not jumping out at me no I don't know it's definitely not any of that spreadsheet nonsense so uh we are going to build a new flow so one of our tools is flow designer uh and then I'm a big fan of flow designer and we are going to activate plugins for hack upon instances what are what are the advanced options um you might actually want to run a system that is a good call thank you Chuck one of my most common ones I go there probably at least half the time so if it isn't clear yet this is not a polished demo uh we have net not practiced this uh this we're building this live uh so if you're in the chat and you have a suggestion on uh something that we should be doing differently we are completely open to it because uh we are you know we're prepared this is live coding this isn't this is not just live demo this is live coding we are we are building this for real um so our flow is ready so let's open it up get flow designer a second to load doing live coding without our beverages is interesting beverage it's herbal tea but it's a beverage my coffee ran out said oh no that is sad so let's first take a look uh before I I pick the trigger I want to go take a look at what our options are and so the spoke in the documentation told me uh that there are some subflows nice so down here are subflows so spokes are in flow designer are how we package together actions and subflows that uh you know is is delivered to you as like starting points and activities for you to Leverage and then and we're going to put those in a flow together to deliver our business logic so there's already some subflows um in our continuous integration and our CI CD I'm not saying that whole thing um and one of those is activate plugin we Mouse over this and when it says this needs plug-in ID instance URL in a credential alias and we'll output some status and errors and messages for me that seems to be what I need right now so let's get that it's almost like they built that for us it is almost like they built that for us so I'm gonna need some plugin IDs and instance urls well that um that seems to make sense to me where in our uh in our instance table let's go take a look at our instance table and see if we have all the things that we need so I'm going to take a look at do we have there's our ID do I have URL I do I have URL do I have credentials yes I have credentials uh what else did I need URL credentials and plugin ID so I'm going to need something from the dev instance table and something from the plugin package table so that means we need to get some things from there now how do we want to invoke this I think my first question uh I think that we might you know invoke this flow uh potentially from uh in a UI action not to say the instances normally wouldn't you then create a subflow to call from a well I guess you could call the flow from a UI yeah you can do that not the way I commonly do it but so the other option is we could create a record that says here's what I want to activate and when this trigger sees that record that we that way we'd have a log of what requests were made and fulfilled and whatnot and move those through a process as well yeah and so that that's a very good point so do we want to monitor this process and see it or do we hope it just all works and I think uh that I want another table so let's go do that uh no I I did not want to click that button I wanted this one apparently thank you for thank you for prompting me AES uh so I want a new table from strap from scratch uh and actually I don't want it from scratch I want a task-based table I was going to say this this feels more like a task so we want to extend this from task so task is like one of the fundamental tables base tables in servicenow so if you're doing something that has a state and potentially like an assigned to task is is is where you want to be so this is going to be um instance operations take the plural off please oh yes instance operation and multiple of those is is the plural I agree um I don't like that prefix somebody give me a prefix uh i o in in stop or yeah I uh oh too late we can change it please no too late we're committed you haven't created any records there's no no Legacy data yet so as you can see this is a much uh longer uh amounts of fields that I got when I started from scratch I've got four pages of fields available to me here oh beautiful pages uh so what kinds of things do we need here we need a Target instance uh field so do we have something that's close to that hmm probably not I think we're gonna need I think we're gonna need to add that one yep instance operations seems like we want to to have a reference to the instance table and we want pack s what's the name of my table underscore Dev instances there we are not on plural two we need a shame screen or something oh I did oh you know sometimes I'm bad it's okay how could I do that I think I do that about once an app too you know you've got all your tables are good and then you've got this one table I don't know what I was thinking it's plural I'm upset with it but it's too late and we're not drinking yet so we've got instance operations table and it's got a reference to instances and so we need now a way to tell it um you know to to figure out which of those plugins we want and I think on the plug-in table we want a state like an active and not active at minimum do we want it to be uh like a State field or just active inactive for plugins that we want to install we don't need any approval what what kind of States would you see them in it would it would be what pending running complete yeah but that that belongs on the instance operations oh on the instance operations I'm sorry yeah I didn't see a switch to the plug-in package I think we'll just go with an active field for now yeah I guess like we'll be pending open and retired or pending active and retired are the only states that I could think of any anytime I create a table from scratch I always include an active field whether I need it or not don't forget your default value of true and if we need if we need a State field we can add that in yep all right so uh we can grab all the plugins that are active uh for a given instance and send that to our flow I think we're ready to return to our flow now Phil's messing with you said make an inactive field that set it to false no no don't do that so on our uh created or updated so now we'll be able to choose our instance operation table iops foreign and we're going to want to filter that at some point uh but you know something like State and we don't even have state choices yet that are good uh but you know something like open maybe and then we're going to need how do we want to denote that this operation is for installing plugins so we're going to need the type of operation do we have a type field no uh and we have a contact type I don't know if there's a type type category for type all right where's am I not seeing category categories on instance or incident oh yeah I don't it may not be on uh it might not be a task waiting for the chat to catch up and tell us offering we need to search where's the where's the search on this thing so I don't see one jumping out at me so let's make one foreign do we want to just say operation type or just type this is an operation table I think yeah keep it short let's make that a choice list and give us some choices I'll drop down without none and we want uh let's install plugins change password wake up store apps or is that part of plugins uh I'm gonna plugins in apps that are in store apps are all the same I think lost Chuck uh and that's good enough for now what else were we doing with instance is so type all right we're going to have to save in order to get type Brad wants me to save my flow anyway true making me nervous I've switched tabs see if we can get type nope all right we're gonna have to reload that's fine so let's return back to app home and open activate plugins how is the chat going Brad it's good it's pretty active um I don't know they all think I should push the button should I push the button no oh really let's see uh I'm okay with that all right email's not instantaneous so go ahead that's true so now I have an instance operation against an instance uh so that should give me the details I need to send here except for plugin IDs so that means I need to go retrieve some information from our plugin table so I'm going to need to do a record lookup for records push the button check give me a sound effect oh man I'm putting on a spot we we know that you always have them ready all right um where is it it's a highly tuned operation here highly I didn't have my soundboard up so I have to make this a quick one no worries not at hand I got it I got it I got it three Bells all right so everybody should get an email and that's a few minutes or the uh the team captain uh and uh with credentials and they'll log in and change it and then create accounts for everybody on the team excellent so I'm gonna look up those plugins for the ones that are active and then I'm going to Loop through those so we gonna go into flow logic hit for each and then we're going to grab our records plural records data pill and say yes give me those and now I'm going to move this little guy right up into the under the four each for activate plugin so now I shouldn't we have confirmation people are receiving the email already excellent well thank you for letting us know folks and uh Happy hacking uh for those of you that are are already ready to get started and we're going to keep going so this subflow for activate plugin uh we need a couple of data bits uh to send it so we're going to hit this little data pill picker and drill into our for each and then into our record and then go down to URL yeah into the instant wrong table I'm bad it's from our trigger instance URL the plugin ID is from the 4-H and then ID I think that's probably the most challenging especially when you do a lookup record or you've got a dot walk to something is is figure out where to start so uh for our connection and credential Alias I'm going to go to my trigger to my instance operations to my instance and then to its credentials so so this is what we should need uh in order to do this so let's hit done and well we're going to need to test this aren't we of course we do of course we are so let us uh create a entry in our Dev instance table so let's create a new new record here and this is [Music] fix that form layout later I have not been to this form layout and I am clearly unpleased with it so we will we will be working on that a very wide editable numbers the first thing that sets me off let's hit new we're gonna choose credential we're gonna hit submit and that's good enough for now go now I need to open up this credential record and actually put a credential in here throw a basic auth in here and then it's not password of course it is foreign so what plugin would we like to install over here um that we don't already have so do we think what that I don't have one of the ones from the list installed let's see something that doesn't take an hour to install like well even if it we just see it starting we'll be good enough I think that's true um Brad what are what are the ones that we have in the list filter on index we've got integration Hub Enterprise uh you've got VA the mobile offline plug-in agile 2.0 I don't know if I have this one PA premium did you set display values on some of those reference tables um I don't know I didn't see the uh mobile offline one in my list here at all so let's let's just filter out and we'll just add one in that uh is at the top of the list all let's see let's go for yeah advanced work assignment will be great this guy so we'll create an entry for this in our plug-in package table with this ID and advanced work assignment let's submit that and so now let's go back to that table and set the other ones to inactive hey did you already do that you did you just created that no I'm saying someone already sent the other ones to inactive uh that's magical uh so now we should be able to in our instance operation table so let's go to Dev instances I'm actually going to drop into um the platform View and go to our Dev instance table what's this table's name we may want to State because didn't you say the Act of creating a record triggers the flow uh we did put a state on the flow I Believe on the float trigger table on the operations table yep okay you're right type is install plugins so let's create the a entry here I'm just wondering if somebody triggers a flow while another one is just started we may not have that operation record in the it might get picked up twice so I'm going to add the instance operation related list to my view let's create a new one let's say we need type on this sucker yes because the default task form is oh so functional put it right here for now type install plugins open install and we'll fix this up to be a little nicer in a second uh but we actually have a record in that table now so we should be able to go to our flow and give it a whirl so look up plugin um so we we only expect to get one because all the other ones are inactive uh and then it should activate that plug-in in our instance so let's hit save one more time for the Brad let's hit test we'll only have one record in here and let's run it thank you so this is going to provide us the instance operation view of our flow so in a second it will give me a link to open up that operations view so that I can see how my flow is progressing I probably should have told it to run in the background but I'm bad I'm curious does the does that uh record maker invoke the filter from your trigger so what you're asking Chuck is um does this follow the filter that I have here and the answer is no it does not okay okay so there is no filter okay so we have our flow has started its execution it said oh okay that record uh it looked up the records from the plug-in table uh and it said oh okay I've got one one record from that table and now I'm going to Loop through those uh there is only one but we're still going to Loop through them and execute this subflow to install this plugin so we can even drill into the execution context for our subflow and see that the first thing it said was activate plugin which is one of those actions provided from that spoke um which you know takes a bunch of the data that we sent this subflow and reaches out to that other instance and says hey start installing this plugin and then we've got a check to see if it's already installed uh then then we exit this pretty quick but if it isn't installed yet then we drop into here and we start a wait until tracker completes hmm so if you're building spokes that need to interact with another system that has uh potentially long-running operations that you want to check in periodically this subflow is actually a good one to take as an example to build from so this tracker reaches out to that other instance and checks periodically so this is a subflow all in itself and it reaches out to that end point and says are you done yet and then Waits a while and then says are you done yet so we should be able to over here um under plug-ins gives it more of a TCP communication than a UDP nice yeah because potentially installing one of these plugins or interacting with another system that says you know you're reaching out to another system and say hey generate this big report for me and it might take that system 50 minutes to do that yeah well you're not going to hold open the connection with that other system for 50 minutes waiting for them to finish instead you're going to say initiate that and then every minute or so you'll reach back out or whatever your the timeliness process for that interaction is and say are you done yet how's it going so let's see if we can see oh the the plug-in status is active and we've got logs coming in oh and so plug-in is activated uh upgraded successfully so that should mean if we return to flow designer we should be able to see that this thing is completed the next time it Checks In oh and exciting look at that it is completed so we have automated now reaching out to other servicenow instances to install plugins for us we can scale up scale up or down the number of plugins and the number of instances that we do this against so one of the things we did was we said uh this flow that we built right here has a trigger for this instance operation and one thing that I could potentially do is have a way to generate a bunch of these instance operation requests right so if I want to reset all of our instances that might be something that I build a flow to do that and in fact I kind of want to do do we want to move on uh to the next step or do we want to uh automate the creation of the instance operations or do we want to do something like reset the password we need to finish this process because activating the record we didn't update anything on the instance operations State oh that is a really good point otherwise you're gonna when you do your yeah that that is an excellent point Chuck thank you um so let us update that record um as soon as we get some plugins uh so let us update our record and we're going to update our trigger record so I'm going to drag that right over and we're going to set the state here progress to work in progress and we're going to say um you want to comment we want to add a worknote to let it know plug in installation is in progress for this mini plugins all right so we get that count of that lookup and update our record with that do we want any error handling inside of that for each do we get any kind of output back from these we do get some error handling from the these so right here and you should be able to see that under activate plugin let's collapse some of these we get error and status messages from that that subflow nice so what we can do is uh we can update our record for every plugin if we'd like so we can update our record again grab that from our data pill picker we can add a new worknote do you want oh you're just gonna log the error status message I could add we could add something like a check to see if there's a error here yeah we would need to know what those error codes were though so we could say if um there is an error at all if they're not it is yeah um is not empty it's uh it's just free but it looked really goofy but you leave it there and it'll work somebody just asked me that last week hey I don't have all the conditions like and then uh let us add a new action for update and so we will grab our nope that's not high enough scroll to the top update our instance operation table and we want to set the state probably to error closed and complete seems good enough for now and let's add us a work note something to note for people who haven't used flow designer a whole lot is Andrew took the trigger record from the top uh the best practice suggests that you should take the most recently updated record that you can obviously if you're inside of a branch down a deep tree and you can't get to that record you don't take that one because it's the most recently updated but he had a choice of taking the trigger record or the one from step two which was also an update instance operation record think about what Fields you're updating and what the state is because you may want the most recent record and the trigger record may not be that record that is a really good point if you're getting data from the record right but if you're updating the record it it doesn't matter but from a from a best practice standpoint absolutely so if you just get in the habit to always grabbing the most recent one uh then you won't get surprised um but that is an excellent point after I've updated This Record uh in step two this is now stored and if the values as they are from this data pill are actually different than the values as they are from this data pill it's it's not like a current dot something that you would expect in a script so plug-in installation has errored for plugin and we'll grab that plug-in that from R4 each for each this one uh and let's get the name from that for each name and the error with error and comments good so that'll update in the case we get an error and then we want to yeah update it without an error so let's drag this update record here and we'll say plug in activate it and let's get that plug-in name done so that's um good error handling that we have there so activate the plugin we're going to get back either a success or failure from that and based off of that we will update our instance operation record appropriately and then it will move on to the next plugin in the list so hitting one of these errors doesn't invalidate uh the trying to install all of them uh it will keep going um and not stop I could design it that way um but in this case I think you know seven out of eight is better than failing on number two and only getting one out of eight yep closer is better so that allows us to update our instance operation record and in fact let's see it let's see it work so this should be relatively fast test uh it will reach out to that other instance it will find that it's already activated uh and we'll uh get and we might need to adjust how we're handling that because um let's see what we get so we'll run this in the foreground because we expect this to actually run uh fairly quickly well you get an error if the ACT if the plugin was already activated or does it do a reinstall I don't believe you get an error message you do get us you do get a status message but you don't get an error message if I recall appropriately so we'll open up our flow execution and if we go into that subflow we'll notice that it will have said that it was already active but we did not get an error on that installation um and we could go take a look at the activate plugin execution and see why I can't imagine trying to do what we just did in the last hour or so without flow designer and integration Hub and bespoke the scripting on this would take us all day yes and and this is already uh put together and uh so we can see that activate plugin called the other system uh it responded to say hey this is already active uh and so when we check to see if it was active it said yes um and we uh you know wrote to a log and we assigned a status message but we did not hit an error and I think that's fine I don't think I need to report up uh to my instance operation uh that it was already active I just wanted to be active I don't actually care so if we go take a look at our record we should see that oh we didn't set it complete but we did write some more things I'm sorry that's kind of the point I was making when we started this adventure we did we got the error one but we didn't uh we need the form header let's add that real quick we want the format the little things that are out about here activities filtered or as we stuff from the 2007 it says tax activities plug-in installation is in progress for one and plug-in activated advanced work assignment so let us go add that one state and then we will wrap up the show so I'll return to my activate plugins this data down here we put in the the work notes but let us set the state to closed complete oh wait no I can't do that here we're not uh because this is too early so what instead I have to do uh which we don't have time for we'll pick this up after we take a break uh is I don't want to close complete the operation because I'm in the middle of a for Loop right you are for each of my records and so the work note is appropriate and then I'll need to outside of the for each do a close out the uh and and if that that's going to be really good to look at because we'll actually see in practice uh that we'll need to do a look up for that instance operation record to see if it has been set to closed and complete so that that'll be fun logic uh to go look at when we do that um but for now I'm going to hit save and then we'll uh stop this screen share in a couple of seconds and wrap up um so we're gonna keep streaming but we're gonna but we're gonna wrap this up uh so let me stop the screen share right now another option of that logic would be to use a flow variable and if you run into an issue you can just say hey this had at least one that failed then we'd get to the end you could say did I have at least one failure now that's assuming our flow variables work the way we expected them to because they didn't in Early Access oh uh we've got a number of uh people that did not receive the email I don't know if we had some Gmail issues but a lot of people didn't receive the instance email so I put this in the chat uh if you did not receive an instance go ahead and post that in the community and then Andrew where are the guru hours posted now they are everyone got an email all the participants got an email yesterday with those um but the one of them is starting right now uh so I will also go post it to the Creator con um page where the fact is uh for the the office hours there and that will have the zoom link and I will go do that uh right now so if you're having trouble getting to your instance come join the guru hours or post into the community and um Brad and Chuck are going to continue uh streaming in YouTube and twitch we are closing out the knowledge broadcast right now and gonna switch over to do that and we're gonna keep building this hackathon app um and I want to thank everyone for watching and following along and uh so we'll say goodbye but we'll be right back so uh thanks everybody thanks [Music] I had a drop out in the middle of that I was not happy all right I'm gonna switch over to the other Zoom um the wave wave your hands at the at this Zoom so I'll still be in there from the VM perspective so wave your hands if you need something okay foreign uh if sauce start by saying uh if you need help with uh something with a hackathon uh you should post that in the community or join the guru hours which are posted in the community and on the hackathon landing page uh so this is just going to be a live stream of uh chuckin Chuck and I and then we may be joined by some MVPs and I think Andrew is going to come back at some point and we're going to continue work on our hackathon app uh and uh keep keep building stuff so there are also some other people streaming I think there's a thread on the community that's going to list some of the uh some of the links to other people's streams uh if you want to go watch some other people and and you're bored of the uh the ABCs uh I don't I don't blame you but uh we've got that on the community uh and if you are on the Essen Dev slack there is a hackathon channel that has that stuff listed um so lots of lots of places to go but the community that Creator con hackathon 2021 communities the the best place uh to go if you're not sure foreign Chuck you got anything before we jump into doing stuff tell us what we're gonna build all right so in the last uh in the last hour uh Andrew did some uh automation around this new version of the hackathon management app uh where we automated installing plugins and instances and built a little bit of the back end that was necessary to do that um I think we're gonna jump into a little bit of uh UI Builder and front end stuff here and one of we've got a few different portals and workspaces that we're going to need to build for this hackathon management app but the one that seems closest to what we're doing right now is the the live event portal so you know right now with the hackathon we're kind of handling things through the community and we're doing these Zoom sessions it'd be nice if you had just one place where you say this is you know this is where I go this is a portal that has all the information I need has a place for me to ask questions it's got a place for me to look up what people are streaming we can you know have announcements on there and then you know I can maybe look up just past knowledge um so that's what we're gonna do we did have a question in the chat on where to get AES templates so the AES templates should have gotten installed on the instance but it didn't install in every instance so if you post that in the hackathon community somebody should be able to help you get those installed on the instance so again any hackathon questions go ahead and post them to the hackathon community the three of us are going to be doing uh development here and probably will not be able to troubleshoot hackathon uh stuff during this live stream all right so with that I'm going to go ahead and share my screen where did my zoom window go oh here it is quickest way I found to get to the hackathon community was right at the top where it says knowledge now it says knowledge 2021 on that top menu bar take the second option that says Creator con community and then over on the left you'll see a sub forum for the hackathon and everything you need is right there including the official rules foreign two clicks and you're there all right so this is our instance that we were just in um let's start an app engine Studio because that that seemed fun let's see if I have the app in app engine Studio oh yeah we had to do some doctoring for that didn't we yeah so so just a kind of a fun uh piece of info with app engine Studio you can display uh any app that you want an app engine Studio there's some tables on the back end that connect basically a sys app record to what shows up in app engine Studio when you create an app an app engine Studio it creates a sys app record that you could also open in regular studio so it is possible to uh to to do some of that if you have multiple people working on an app you can have it show up for both of them uh I believe uh I believe that we are looking at you know how to make that experience better to where people in app engine Studio can invite other people to come work on their apps that was my next comments like we should really have that as an onboard feature but I know that yeah it was it was everything we could do to get app engine Studio out in the time we did so some things had to be put on V2 the nice thing about app engine studio is it's a store app so you're not necessarily tied to releases on it should have some updates coming soon March uh junish if I remember right I thought we had more tables than this oh okay it only shows me the first uh the first three yeah yeah on the second uh the second tab there like what this could be a short show all right so one of my favorite things to do in app engine studio is to create an experience for Map engine studio so the experience we're talking about is basically a a live event portal I'd say the experience section is Green Space for you right now so let's create a portal let's design our portal so um hackathon I don't think I can edit this right yeah uh I think that's odd I think I can what happens if you want your yeah what if what happens when your workspace to be called hackathon it's just so you can change uh the name and it'll change the UI ah okay so you could call this portal hack portal or something yeah I think what I want to call it is now slash hackathon slash portal I think I would want all of the uh so I I think oh you know I was wondering about that just the other day could you could you bury that deeper so right now it's going to be an underscore I think we can change that because when you're creating if you're doing this manually you can marry that a little um all right so let's go ahead and continue so it's creating an experience I think it's creating us like eight to ten pages that are all like it all works uh which is cool so we'll kind of Click through those and see uh What uh what we have um question in the chat a couple of questions in the chat I'm not sure Raphael what your question means uh this as far as servicenow doubt program that's the channel that we're currently streaming on here uh the other question is virtual agent experience also available here I think no there's four yeah so right now you can't access virtual agent uh through app engine studio uh so again this was V1 of app engine studio and uh we are you know we're looking at what uh what V 1.1 and V2 and all those things uh look like or I think there's already probably a lot of development going on to to add things to it so I can't tell you you know when VA is going to get added but I'm pretty sure we will add that at some point um so all right let's go ahead and uh uh edit I think is how I want to launch UI Builder so that is uh one way to launch UI Builder is through here uh I hate this uh I don't hate this uh personally I don't like that I'm losing all of these vertical pixels uh so I'm going to open it via UI Builder so I get the whole screen out of it but for your uh you know for your low code users uh who you may not necessarily want to point at the uh at the left nav that is a great way to get into app engine Studio that is a fairly significant difference isn't it yeah I I wish you could minimize this because at least this part like I could handle the tab interface but it's the combo of the banner and the tabs uh it reminds me when someone's doing a PowerPoint but they don't put it into like present mode um yeah and you're looking yeah yeah it's inside a window inside a window inside a window and by the time you get to see it outside I can't read that and they've got the slides on the left real big yeah don't be that person when you're presenting present all right so let's look at uh we get a number of pages created uh it's more it's what is that 12 11. um I'm going to count them it's 11. uh yeah so we get a lot of pages created for us by default all of these pages are functional uh so it's not like I just have a page that only has components in it and I have to hook them all up together um so this is a like a functional portal right now it's not necessarily tied to my data uh I think if you spin up a workspace you do get some some things that are tied to your app's data but for this one if I open it up in the preview I get this nice page like this I thought I got some are we still loading hmm I thought I got some cards down here maybe the I don't know anyway so we get this page with a search box but one of the best things that we get uh is we have a theme already right so we've got some it already kind of looks nice uh so for me uh I'm I'm not a designer so when I have to start from scratch my pages look very boring so it's just nice that you get a little bit of of you know of a visual layout and some styling applied to it uh and then you also have a whole theme record that you can play with switch out the logo things like that coincidentally if you are interested in uh building an app building a UI with UI Builder we have a couple of uh UI Builder Creator con Labs one of them is CCL 1047 and that's Lisa holdenstein is has one where you start with a workspace starter experience and configure it to work with an app that we built and then I built one that's ccl1088 that is a portal that that you can use uh should I admit Travis let's do it uh that is a portal uh that uh from a from blogging app uh and uh you start with a page like this and you turn it into a Blog landing page and then you take uh you know then you create a new page uh and you do do things with the theme and change out the logo and fonts and do all sorts of things so nice if you are interested in the in this UI builder stuff that we do that's a good lab to check out we have a guest Travis welcome oh they're coming hey guys how's it going pretty good uh we are just uh getting into uh doing some portal work on our hackathon app um obligatory introduction yeah tell us about yourself oh wow going there um hi everybody I'm uh Travis Tolson I've been a developer on the surf style platform for about 10 years I think and uh specialize mostly in Portal stuff so glad to see the UI Builder up and uh running here awesome he didn't want to come for any of that boring flow designers all right so uh so what we want to do here is we want to make this portal um the um we want to make this portal the landing page I'm gonna have to minimize some things because I keep getting uh I keep getting sidetracked by messages coming in all right so what we're looking for now is the active event portal so I have started the hackathon a lot of a lot of people watching uh are in this situation at the moment you've started the hackathon and uh you uh want to know where to get help we're handling that mostly through a community Forum at the moment but uh but we want to uh to handle this through UI Builder or through a portal so let's see well I think the first thing is I do like this uh this Hello message uh personalize it so yeah for now we can leave that uh but we do have a special UI Builder thing in here uh where this uh so this hello uh is just a hard-coded hello but when we say Brad this is not a hard-coded bread it is a um it is a session property that holds some information about me and we have bound that session property uh to this uh this heading components label property so each of these inputs are component properties and so I can bind data to any property so it doesn't have to be like a string field like I could bind a true false data to one of these toggles so it's uh it's powerful in that everything can be dynamic if you want it to be um so which is which is nice so uh hello Brad let's say something about uh welcome to the hackathon event portal nice uh I think we probably want a search bar yeah I think we can leave the search bar right so how uh like what do people need during a hackathon they need to ask a question probably they need um yeah maybe eventually we hook up uh something to um to the automation that we have built uh so I think at the beginning maybe they ask a question and then on the back end a guru automates a plug-in but uh yeah foreign so I think some knowledge I'm trying to think of what um report a problem a simple incident yeah what do you think about what what most portals do is you know in the self-help is request something report a problem or look up some knowledge should have should have thought about architecting this a little more um uh but let's let's go ahead and do something uh so I've got this container and this hero oh that's right so we have um we've got this other row down here and we have some stuff hidden so how do I unhide you uh how about this edit component visibility ah there we go Okay so looks like this component visibility is uh depending on whether we have data for this and I think all of these are showing knowledge articles and I wonder if we don't have any knowledge in this instance it wouldn't surprise me you're the one who spun it up did you say hello to any demo data I think I'm pretty sure I said load demo data but I thought our user table was a little surprised with me ouch foreign so let's do this um let's go let's create at least a um let's create a knowledge base for the hackathon I like it all right hackathon has to have an owner it's a user uh you all right uh me all of this looks fine submit I haven't actually done uh like a knowledge implementation in a while so somebody's probably like hey you missed something and it's not going to work at all it's changed significantly since I was in YouTube so I think we need a category probably right I think I can create this from the knowledge record so let's create a new article and I'm going to oh I had it there right you're gonna go get the rules yeah I'm gonna grab the rules and we'll we'll put that up clicks man knowledge 21 right at the top where is it oh there we go second option over on the right it's in the Forum right there two clicks rules are ready all these questions featured content yeah I'm just I'm just looking at all these questions that are answered now let's don't do it don't get sucked into them [Laughter] type Facebook sometimes like holy smokes two hours just went by the sweet sweet points yeah [Laughter] all right so let's grab that and just dump it in here all right so let's say here Khan hackathon 2021 rules and then we're gonna put this in the hackathon knowledge base and we've got my category picker so rules I don't know yeah what kind of categories would you want in your hackathon I don't know so so part of it is we probably have some knowledge articles that are uh Universal to all hackathons we probably have some that are specific to a to a single hackathon like this Creator kind of hackathon has some special rules because it's Global and it's virtual and we're giving out uh prizes you could categorize by Year too I mean your category may be 2021. hmm because I want I would want some that are Global right that are just always there right and I don't I don't want to copy those every year great call it global [Laughter] oh I see Andrew popped up how are the gurus let's go I I have no idea how this category picker works I remember when they put this in and I was like this is great can we do this on other reference Fields it's like no it's it's very hard-coded um so 2021 greater cut I don't know let's let's just do that submit all right uh and then let's go back to UI Builder do we need to publish it or anything probably um right all right that looks published my brain just made the weirdest Association I watched Princess Bride the other night so when I read the word knowledge it came out as knowledge [Laughter] had to go there hey there we go now my uh my data row showed up because I have data there so updated articles um so working in UI Builder that's right thanks for joining Travis yeah thanks for uh thanks for the invite there Andrew how's it going awesome teams are building stuff and I'm gonna go updated article I'm gonna go work on my flow that we were building in the first hour some while Brad is working on this UI is that how hackathons work [Laughter] is that part of the rules or do you have to work in serial hahaha no I didn't have breakfast um so if I click on this let's see hey it even I didn't even have to do anything and it works yeah a little component is working and connected and works that's pretty slick this is nice what happens if I hit home we go back to the landing page but one of the things we wanted to do is say oh that's right yes let's see and you do it here I think you go here open page definition I would have guessed second from the last one it's experience settings I think uh uh there it is let's see if we can change it here oh I didn't save did it actually change here no I don't know didn't change there you gotta do a Reload a change there uh yeah let's do a Reload and oh it looks like it looks like okay that's like for organizing stuff multiple portals and workspaces within the same app I'm sold yeah because we'll want everything to be under hackathon and yeah so this is really an event portal I think I'm gonna change it one more time you could call your workspace you know a workspace or admin or user whatever yeah that's that's nice so is there any is there any limit to how far you can Nest that down or outside I don't know seems like a thing that is discoverable though uh if somebody has some time let's keep adding to hackathon we're in a hurry we don't have time to experiment with that so we have that we have that let's see so I always end up with a crazy amount of uh previews open YouTube for whatever reason I was looking at it here and it opened it for me there and I don't even know which one's right anymore so we have the article flag article cop does this work copy link does it face the uh it's the back end link all right I was I was hoping it was going to give me the UI poker link and then does uh rating work and then if we post a comment here is a no if only we had a slug instead of a CIS ID that would be a pretty URL foreign hey there we go that's a good comment let's like it all right so this is actually what a lot of what a lot of what we want from this portal is uh just giving out information um so uh there are some things that we will want to do we'll want to change the links we want to change out the logo we want to make sure this search box works I kind of like this report issue button I think we'll want to rename it to something else what does it do it won't tell me what is this catalog it it does that uh the catalog item probably doesn't exist right demo data is missing you think it brings up a record producer uh see it's up to you if you want to explore that or you want to build something new uh create new enhancement wow that's a Brute Force way looking for it okay whatever it is it doesn't exist yeah that's probably it um you can check another instance see if it's in there at some point uh is that on the so it's on the landing page also so I think we'll want uh like this top section I think I wanted to say something like uh right because this is uh I'm pretty zoomed in here um I'm curious how do you get someone to the right event I mean you've got a portal for the hackathon you don't we want to make a like a a generic front-end portal per event I think you're right um yeah you don't want to make one of these every time you make an event we got to make something that's a little more generic that says hey welcome to it may not even say welcome it could say welcome to the hack of hackathon event portal pick your event or you are registered for this event or here's sign up oh that's that is good you know I think I think the way it currently Works in hack now is that uh it does list multiple events and you click into the one you want um so we probably do want this to be per event because we want to be able to run more than one at the same time that's probably part of it okay so good point let's let's see so I think we leave the landing page as the page that lists active events and then uh and then we'll have an event page I like it uh okay so for this we'll just want to show active hackathons that the person who's logged in I don't know do we want them to choose or we would already know that they're associated with an active hackathon so maybe we just send them to the yeah that's what I was thinking active one foreign I'm wondering if we want to just create a new landing page the problem with this landing page that gets created is there is a lot going on on it already so I think we're going to create our own event page here instead of doing something to the uh to the landing page okay let's create a page oh do we want to start from a page template I think probably not so let's call this you've uh did we call the last one event portal so I'm gonna Let's uh oh yeah because it's called event portal foreign we'll just call it event because it's great to name things event as we have established oh yeah no we already had that discussion um so whenever you do people don't name your what was it don't name your field event call it you underscore event if you possibly can even in a scoped app because the moment you try to inject that like into a mail notification it's going to say dollar curly brace event dot something and you're gonna think you're going to get a field and you're gonna get the event event data it just they will mess you up it took me like two days to figure that out it was my wife that said is that a reserved word and she's not a servicenow developer but she knows enough about computer science to figure it out oh and oh for God's sake yes so Not only was it you know tricky it was embarrassing at the same time and that's not what you want that is a great little tidbit Chuck I I don't think I had realized that when naming Fields stay away from reserved words don't name your field current it seems obvious but when you hit it it's a problem all right so uh so what we're gonna do is we're going to give this page an optional parameter for the event ID so if I pass it an event ID it shows me that event but I don't want to make it required because I want to be able to just send somebody to the event page and then have the page figure out which event they're in oh do I want to do that maybe we should just do that no matter what all right I think that was for a demo that I did at k17 that I figured that out unfortunately we figured it out before we got there why isn't this thing working all right and just to uh just to give an update uh to the people in the chat uh this is again just the uh The Advocates and some of the developer MVPs we are building an app uh uh during the hackathon but there is no hackathon support uh on this stream please go to the hackathon Community page uh if you need some help or something yeah or office hours Linda just put in a comment that said gurus are doing office hours and uh team leaders have been given the link yep so Travis you're not doing a hackathon this year no I'm not the only one this year uh talked about it but just didn't quite get into it kids and you know oh yeah that'll do it every time FYI uh we do have a breakpoint podcast coming out with Travis's wife Sarah on Wednesday so the 12th watch your podcasts catching clients or websites or our blog for that it's a really good one you don't want to miss it and I'm not biased in any way shape or form on that oh did she like you listen to the preview she did [Laughter] [Music] sneak peek family privilege all right so I kind of want to do something similar to the landing page so let's go back and see how they made that image show up it is here uh uh yeah that's it so let's just steal the CSS I 22 okay that's all specified in the CSS so let's go back to our event page and do this hey there we go uh my container so how do they put something on the left here this is my this uh save and continue thanks UI Builder how could I not uh hero Banner Main we just have a margin top here Let's do let's do that so let's go back you know I don't think I've ever used that star directive uh in uh in the components that is that is what you use you can't actually Target uh things in the component ah okay because yeah I'm looking at is it in the format I have a colon in there somewhere all right so we've got this now um let's do all right so let's save and let's get some data before we put something in there so yeah this is the part that I'm still kind of rusty on let's grab a data resource so we want info about the event that is currently happening um so let's look at our data model real quick did we yeah I was gonna say did we make some records for the event and whatnot yeah I don't think we have any records but we have so event participant is going to have the user I thought that was a many-to-many uh let's see yeah also when you create a table through app engine Studio you do not automatically get a an app menu and the platform View and that's correct because generally when you're creating an app through app engine Studio you're going to have a portal experience and a workspace experience and you may not necessarily have the platform backend I'm making air quotes but you can't see me uh view of that so if you need to get to the table real easily you can just hit up hit the preview button and it'll open up that list uh so Chuck is uh registered uh well apparently I did make it on the winning team wow yeah I again developer can't think of good data names I mean I guess being one of the judges uh you know you can maybe uh maybe you know make yourself on the winning team um all right so event participant looks like a good starting record uh that's going to have links to my event and then the user so I think we're gonna we're gonna have to do a series of uh data lookups I believe but we're going to start with that one so I'm gonna go Global and we want I think a look up records oh look up properties that may be new or new to me oh stay on target there's this uh this thing that happens with data resources where you're like all right cool and then you click out of it what you have to do is scroll down and then hit add I think we did one of these with Chris Johnson who's one of the designers on UI Builder and I mentioned that and he said noted so hopefully that's a thing that uh something went wrong so I I just I really don't like this message uh it's just uh it's not getting anything yet because we haven't configured it yet but uh but we will get there so once we give it a table this message will go away and our table was event participant Travis you got a question on YouTube from Jace he says what sessions are you looking forward to this week I'm really interested in the uh full stack app development Adventures ones all right and a couple the couple of the UI experience framework obviously gotta gotta love those portals like when we did previously but it's been updated for this year ah so we get to do something fun here um so this condition Builder uh we want we want it to be dynamic because I want to grab uh we only have one uh one piece of data in that in that row but I want to grab um um the uh I want to grab the piece of data that's associated with my user record not all of them uh and so this needs to be dynamic uh oh or we could do can we do is me person yes yes fail oh is the person record not a user record it is not a user record we could go Define a new Dynamic filter uh does it link to a user record somewhere nope oh yeah there it is oh it is linked to sys user yeah okay otherwise we can't figure out when somebody's logged in what right so you're thinking dot walk to there yeah can we die walk let's see person.user is dynamic me uh oh we can of course we can download there's an error and then let's let's make an assumption here that uh uh that I can only be registered for one hackathon at a time uh like I can't be hacking in two different hackathons at the same time so that's uh that's we can make this rule for all future hackathons because uh I'm I'm lazy and don't want to have to do this differently uh it seems like a good good thing to do I love writing requirements like that um all right uh I don't have let's create a record for me just so uh um uh I know let's go back to app engine Studio uh I think I'm gonna need a person record but uh even participants so there's probably only one event I think we'll need to create a new user foreign and then let's create a new team uh we don't know what states are on a team yet all right so now if I save uh so sometimes you get a message in UI Builder saying but I think I think you have to actually update the data resource um but sometimes you get a message in UI Builders saying hey the data was updated do you want to update it in UI Builder uh refresh but I think uh actually yeah there we go so there I am how do you know that wait you said there I am oh because it got a yeah we conditioned yeah right the condition worked yeah like those display values kind of suck I just uh have this thing where I remember CIS IDs uh no I can remember the last four I go yep that's me uh so let's let's add some return Fields here I do really love in data resources uh that when you change something over here it really reloads the data for you on the right I see the Json that you're going to get back and you don't have to like do a whole bunch of things and then be like pretty sure I messed something up uh and then you know you find out later on that you did something wrong at the beginning so I really like uh really like this so yeah that can be a challenge in service portal all right so we want I think we want the event from this because this will be how we show that event data so I'm going to paraphrase a question from the chat is is why would we create a landing page using UI Builder versus just doing HTML CSS and JavaScript uh that that is a good question uh so um I don't think there's anywhere where you can just use HTML CSS and JavaScript I mean I guess service portal I mean you still have to kind of know how to use service portal to do those things uh so the different ways you can do some sort of custom UI and servicenow are uh service portal um UI pages and UI macros but if you use those you have to know at least a little bit of jelly um you can do a lot of things without having to know a lot of jelly but you have to know at least a little bit of the syntax and how it works and there's all sorts of little things you get to run into when you do that um uh like you know all sorts of things but UI Builder we're going to do a whole lot of stuff in UI Builder and not write any code and so part of that is you don't necessarily have to know JavaScript or even HTML that much CSS helps a little bit but this is also one of those things where you can build something out and then turn it over to a designer and have them make it look nicer uh and you know not only is it you don't have to know code it's also um you know there's there's less uh room for uh coding errors you know anytime you do something that's low code that's one of the advantages uh is that you know you don't have a random character in your JavaScript or HTML and then other people can come in and uh work with this and they don't have to know those things either uh it also you know we haven't used a lot of the um you know there's page templates where I can just spin up a new page real easy um so so yeah that's that's one of the big reasons there's probably uh we probably have people that can give a much more better or a much more concise and better answer to that Jace distilled that down to two words click development there you go thanks Chase no that's true the the speed of development is much faster with something like this obviously there's a bit of a learning curve but as there is with any other language uh but it makes it less brittle too it's like you said if somebody has to come in and maintain this my God they they if you were in service portal they'd have to unwind several things especially if you start getting into directives and you know libraries of custom widgets like this is this is a lot easier to decipher and control all right so Max results we only want one and let's sort by I mean there should only be what but we'll sort by the updated date descending I look at this very similar to um you know flow designer to as to script includes um good point Chuck so uh Andrew's back was that the first time you said something yep he's back for a while uh I said something a bit ago but uh yeah I'm back all right so you're laughing and having a good time over there I dropped in I dropped in on uh some of the other Twitches uh and YouTubes oh nice and helping teams on the community get going and I said I was going to start working on my uh flow but I'm just now getting there so if you saw our our first uh hour where I was working on activating a plug-in and uh I am taking uh Chuck's suggestion to use a flow variable uh to to help store the data from my for each so thanks for that Chuck I wanna know I haven't used it very much yeah yeah if we can set that flow variable and and change the value inside of that 4-H and then be able to come back and get it because that was the issue before you couldn't do like count up how many of these I've got uh it would it would just kind of die it wouldn't retain the value properly when you came out of that Loop so that's my first curiosity is do we have that fixed I will let you know shortly uh so uh you can rename these data resources or as you'll see in the platform data Brokers is what we used to call them which is a good idea if you think you're going to have a good amount of them on the page uh to make them more specific so you don't have to remember look up records four was when I did this other thing so we're going to do that so what we're going to do here is we are going to look up the event record um and then the record we want is actually going to be the record that's returned from that other data resource so data results Dot there's only one result Dot event dot value that'll get you the sysid and that'll get us the sys ID so we should if I click out of this we should get Maybe please I would love to see that more in a pill picker format yeah um so name do I get something now hmm [Music] uh let's I wonder if I can do this so data fetch succeeded maybe it's not calling it or something uh well I'm not going to see that in UI Builder so let's wait and see uh see what we get here okay I need to go back here immediately that didn't look like it showed an array though you had a you had a DOT Open results not zero go back to the the lookup participant record of this month no over on the left click here you could click click your data resource oh it is okay yeah okay it is an array I saw that as a curly brace this maybe should have been a so this is a lookup records uh it maybe should have been a lookup record like the one I'm using to look up the event record and I wonder if I need to so I can emote this invoke this immediately or I can say only when invoked and I wonder if I should say look up the participant record and then when that succeeds oh then I won't have one trigger the other look up the other one uh which I maybe is refresh instead of invoke I don't know so let's uh here I'm gonna let's just test this out and see so it should give us a name and then let's find that uh let's add a component here let's say stylized text component and we will just give it um data dot uh lookup record like items maybe what we want nope does the return fields's name would it be yeah it's not giving us value I don't know uh it's the field how's that represented in your that so this one uh event dot value this one just so I'm I'm getting this in my head and can wrap my brain around it we're effectively doing like a nested Glide record lookup right yes okay yeah so I'm just gonna do that and we'll see uh uh what happens if I test that hey it did work why did we not see it here I guess because it maybe it didn't know the uh that makes it hard to debug it worked sort of but we don't know why let's do this so I'm going to create a client State parameter which is a page property and then we're going to say event ID kind of like a temporary variable yeah it's like the pages scratch pad okay all right eight nope no that's not there we go what did you change uh it had a so I've found in uh for some reason it it's it treats things like a an array like an array and so I think I guess is that giving us the first the first Val it's the first character right yeah what I don't know I'm gonna try and comprehend because it's not represented as an array in the data that gets spit back instead of binding it to the data resource we're going to bind it to the that variable thing you just made State event ID hey and that worked and okay I like that uh look up event record and we could also um you know we could uh build our own uh graphql query I believe um and get like all of this data data back in one query instead of doing multiples yeah but uh maybe that's a uh that's like a performance Improvement later on V2 or three or seven I also like how I wasn't consistent in capitalizing these so let's hahaha now you're reminding me of Matt Getty remember Matt um all right so let's get some more fields from there so registration start um app due date seems like a good field uh actually this is the live event portal so I don't think we need to know when registration starts let me know when I can break in what do you want to do get help with flow variables oh yeah hold on let me let me uh finish provide the info you're assuming there's a flow variable resource here um all right what else do we have in that table so the event table got the name registration start and end the state of the event ooh event active I think is what we want instead of the active field I think that was when it was running oh oh so you're yeah yeah you might be right uh it's gonna be is it in progress is it in pre-registration I don't know I think active might still be effective yeah but like if it's it could be like you could be participating in a hackathon and be registered for another hackathon I think that they're both act like the state is active but uh okay oh look at these beautiful spaces all right uh oh no it's a picker so I don't need to I don't need this uh so I probably want the end time I think that's probably good for now uh app due date and and are probably the same thing but Travis had to jump all right so Creator con 21 hackathon is the name of the event let's add um let's add something to the end of this uh or I guess let's add it below so I'm all over the place though first I want to edit these conditions and say event Dot eight state is even active did we have any I don't think we had any data oh yeah we I didn't change the how many lost hours there were trying to debug code only to find out it was the stupid demo did all right I haven't saved in a while so there we go it's back why isn't this code working you don't have a case for that oh so we've got the stylized text let's add another one and this one I want to make it like an H4 ooh oh no no I'm gonna do we're gonna do something a little fancier uh I want to add another contain no I invite people to go into UI Builder even if you don't feel comfortable with a lot of this stuff it's just start looking around add a component here and and put something in it like a data visualization is a good beginner exercise and you'll get comfortable with where these menu options are what the options are for each component and then because as I look at this is it's an incremental from what I did just by playing around otherwise if you if you try to think about this all in one big lump sum it can be a bit overwhelming yeah so here we're going to add a text component that just says and time and then let's make it like a H4 sure and then since I want the the next one to come after I'm going to come into this main slot and right now it's a column and I'm going to change the flux direction to row can you notice if I come back here the plus sign are no longer on the top and the bottom they're on the right and the left so I when I add a component after it's going to go to the right do you know how much time I waste doing stuff like this in service portal and CSS this is this is genius right here there are you know there are some areas that are still a little complex um or you know much complex in some place but the the power of what you can do here without having to do a whole bunch of hacking uh this is really nice I swear I gotta go to stack Overflow every time I want to put two buttons next to each other so we want I think end may be a better dot display value there we go yeah that's a great date for referee end users so the other thing I want to do here is you might want some padding in there margin right um Let's test that that's better there we go I don't like why is this oh you know what I need to give uh let's give this main container some padding oh yeah that is kind of jammed up against the the side is that too many foreign dark though do you want to change the color of the of the font inside the yeah let's see uh let's see what it looks like rendered oh yeah that's true yeah because it's all the way over here yeah what's the what's the padding let's just match that with this ah uh so what is that 56 . uh and that's it in pixels oh you want to align it there oh it's got a Max width I don't know let's try uh let's just try 56 pixels all right I've heard of EMS but what are rams what unit is that uh uh I don't know off the top of my head I believe it is similar oh there we go uh of viewport what if we click on the reference em what's there between Ian and a rem we'll have to figure that out while uh yeah I I can go look that up I've never seen that before um that looks more better but for better all right so we've done some Grandma's um Google says REM is is relative to the HTML root font size okay oh so I would wonder what the difference between rim and E and em uh but uh an em is relative to the nearest parent oh that makes sense that makes total sense because I have totally screwed up service portal widgets that way all right so uh we have a portal now yay you did something interesting flow variables in the portal so I guess I will stop sharing Andrew are you ready to uh have a portal we can do some knowledge sure you want to just take it from me yeah I'll take the ball so uh if you're picking back up uh with us uh thank you for joining us um I am working on some instance automation uh management and flow designer and Chuck gave me a great idea uh so we have a loop operation and inside this operation we need to keep track of the number of plugins that might have aired out and if we've aired out at all and so I tried to create some flow variables and it doesn't let me change them away from string for some reason because it hates me and you I what I what I believe I found in my experimentation is it doesn't matter because it it's like JavaScript doesn't care and neither do we you can still do comparisons with an if at the end and it will know and and so I wanted to see if there was just some error with me or my flow so I created a new one and with nothing in it and it is Happy switching them to different variable types uh when I don't have anything in my flow so if I know what I need ahead of time apparently I can choose uh well anyway so I'm going to the reason that I'm not actually sad to rebuild this is because um if you take a look at this operation what you'll see here is depending on the number of plugins I need to activate this is going to take a long time yes and and it will require a bunch of calls and we don't need quite that many calls because we actually have um over here in the docks if we go to install multiplication we do have an install multiple things nice so in this spoke there is a batch plan that you can call so down here batch install that's new yeah it is new with Quebec so this this is a new um API and Associated spoke for batch install um and so you can pass it multiple plugins or applications or uh the what do we call the uh customizations to store apps we have a different oh yeah app extent app app customization so so you can bundle all of those together and tell the instance all at once hey go do this and then you can just do your checks to see if it's done so I'm gonna switch uh instead of doing this single uh activate plug-in inside a loop instead I'm going to use a loop to create my package yep and then send that all along all in one bundle uh and I think that will allow me to one simplify um how I handle the responses and only require me to do one activate plugin called roughly to the other instance and then all of the rest of them will be just checking on the result if I remember right match install kind of fires off an async job and you have to use the batch results periodically to check where you are so does the activate plugin right right but that doesn't that one do it implicitly in the background it's the the check is part of activate plugin but I think you have to use batch results explicitly yes so they're I think what you're saying is this subflow is provided for me and there's not an equivalent subflow for batch is that what you were trying to say let's go through it and find out I want to because there's a separate flow and API for batch results yes yes and and there's a the same so in here you'll see the right this way for tracker is calling the get the results from um the API from the other instance uh to say get get the get the results of this activation does batch install have a corresponding batch results built into it like activate plugin does so git execution tracker progress um is the action that's calling that API and I'll need a similar setup for the batch one let's go for given a progress ID an instance and a cred called the cicd progress API and I'll need this this this will be the same call for batch or uh Plug-In or any of them actually so they all use this thing Andrew go back to your go back to your docs page right under batch install those batch results and I think batch install returns that society that batch results then goes and checks I think we can make use of this so my question is do we have to call this explicitly or is it built into the batch installed to just sit there and wait does batch install do this synchronously or asynchronicity is really my question uh the the batch install is definitely asynchronously and so is the activate plugin was it yes that's why we're calling this check progress so we're periodically calling this check progress that's right that's what you were saying is you don't want to hold that connection open for so long what you said earlier correct okay and so I have not looked to see if there is a equivalent subflow for uh getting the batch progress you know batch results there is one yep excellent so I'll call the batch install that will return me the uh the inputs I need the results ID that that I can then pass into the batch results yep so I should be able to stitch This Together uh the way I want here now I'm still let's do it those flow variables that's very unsportsmanlike to not let you add what you want later and I'll check into that some more because uh you know it clearly is something that should work uh that's just yeah it's just not working quite right um so it's giving me a warning whenever I try and modify these it doesn't stop me but it also doesn't do it but if you'll see in the bottom right that it does throw a warning that says hey there might be some references to this I'm gonna have to delete those that's fine one there aren't and two go ahead uh so uh you can't delete it and recreate it because it's going to do the same nonsense oh yes so uh here is our trigger for our flow hey Jared thanks for joining us are you ready to build some stuff hey Andrew hey check yeah hey Andrew or Jared wrong window all right so uh state is requested install plugins we want to uh again uh we'll want to go get in fact this might be a time where I want to build an action for this I'm about to do I'd suggest updating your record first change your instance operation record to work in progress um and can I can I shout out how cool it is um that you're just pivoting in the second hour uh of building this uh in the first hour first hour Chuck made a comment of you know this would have taken us one or two days of scripting to get to where we were at the end of the first hour and you would feel really bad having to Pivot you know being two or three days into a development project like this but but here you don't feel bad at all you just kind of delete some actions start a new action and keep moving on it's a really good point it's all it's fun so you think I should so I was thinking about making no no your position filter for when to trigger Remains the Same but your first action is absolutely um but what I was going to to say is over here in this lookup plugin um I want to do that but I want to do it so I need to build a Json payload for my batch install and so I'm going to have to create that and so I was thinking I might just make an action for that [Music] because we don't have any other way to build that Json natively there's not an action to build Json there is a step in the action builder for that but but not in flows directly so this is a craft batch plan and we're gonna have to identify this artist pass in a single record into this uh yes in that instance operation record I don't think I have to pass anything into this how's it going to know what to reference to build I will query the plug-in table based on what the trigger record um so if you recall the way we have it set up right now is we're not making this super flexible um it's the plugins that are active in the plug-in table is what gets installed um and so I don't need to pass anything to this it just queries the plugins where active is true and that's it so I think I can just get away with doing the same thing over here which is oh you're okay I thought this was per instance this is per hackathon you're you're going to say here's the plugins you all get to play with correct okay I thought this was in case Jared says I need this plug-in and this plugin and this plug-in we would invoke this flow and his instance would get certain plugins installed um now that's uh that's a nice request mechanism uh and we should probably allow for that as well but this this current set is for you know fresh instances getting them this is your base set of plugins okay I had the scope incorrect so active is true and we want to get all of those and because that is what happens when you're writing a requirements someone misinterprets the scope now let's go look on our plug-in package table I think we did give it an event yes we did so let's take that as an optional parameter um for this so we will take an input if you do send it to us uh event and this is a reference to yeah that way you could have a base configuration for all events kind of like system user preferences and user user preferences and so we'll make this optional it is not mandatory but if it is present um we will use it all right so that'll get us the records and now what we need to do is we're going to need to craft some Json from that and I'm not sure that our Json are we really do we not have oh no we didn't activate anything we need our flow for this instance hey Chuck are you ready to do some uh some development or is Brad ready to take over because I'm Gonna Go activate some plugins on this instance we hit a roadblock I don't have anything immediate that I I need to do but my tasks would be cleaning up forms and lists at this point I'm fine with that though it needs to be done Brad you want to take over or you want Chuck to work on some forms um let's let Chuck I think I'm gonna have to drop off in about 15 minutes okay okay you take the screen share whenever you're ready check I'm gonna be installing plugins I take can I just take it it says no someone already has the screen share oh you can't do you want to continue I'm going to say continue and share something like this let's not look at my speed test or the knowledge playlist the other Dev probably should have set up the screen before I shared it in we go make that about 125 so it's readable get the zoom windows out of the way all right this is what I had once upon a time but I'm gonna kill those shortcuts I did make some menus for the tables that I built a few weeks ago so list okay let's Okay we made some new tables though so I you know what I'll go into app engine Studio why not I was going to make a ride for Studio before you go Brad are you smoking anything today I'm I'm about to start uh doing some uh pork belly burnt ends sounded wrong Andrew whatever you're smoking I want some I do love pork belly burn-ins I am smoking a chuck roast and I had forgotten to check my temperature and I'm I need to go out add a log to it so I'll be right back all right don't roast Chuck it's a chuck roast all right and I'm making a note to put in the rim shot for my sound effects when I add that to my stream deck all right is this operation let's start at the top how's the list look we have number priority this looks like a task table to me ugly so configure list layout and get rid of things like task type first we had our we added category right no sounds right I thought we added category wise not listed uh did we call it type type oh yeah we had a debate about that and I lost we don't need a priority um uh what else we got on here that we want to take a look at anything from that instance operation [Music] um we I needed uh States um I know that I'm going to have like us actually we might need to add a couple of fields if they're not there let's do that when we get into uh form designer so let's do that now this is this is looking rather tasky so configure form designer which I love for everything except dot walk fields and embedded lists but out aside let's take out what we don't need priority let's put state where State belongs sorry type configuration item can go active who wants it results parameters and so I don't think we have a result or parameters table area you're looking at our good old notes I am looking at my notes okay so what type was the results uh result is a string like a long ish string field parameters okay do we want a new form section or should we just dump it like down here what else uh parameters Okay so do any of these logically group together um parameters is an input results as an output uh but those are you said longish like 100 longish or a thousand large uh like a like results should be uh probably 400-ish and parameters it should be two thousand I'm making a thousand just to make it standard is anything over like 255 gets a large text box anyway and parameters works for me okay any of this mandatory first let's fix this oops oh darn I accidentally removed the number field from the form I hate it when that happens let's put it back effective number I've never seen that field before and I'm really curious as to what it means let's make that read only State make sure our things are in order we added queued schedule canceled is that what it was uh I did add those yes okay now those in the order you like to see them in or should we move the closy stuff at the end yeah let's let's reorder them please cancel it at the bottom though that's usually the way I go to okay and then scheduled and queued should be relatively near the top because they're you know are we using pending and I think we can get pending out yeah anything else open and work in progress the same thing yeah you kind of like it let's nuke open and just leave work in progress so requested or work in progress uh in fact how has requested different than pewter scheduled that's my question you created these I know requested pre-flow and schedule requested is like for free everything like new record essentially is requested okay that looks good thank you okay um our types are these in the orders that we wanted them in don't know don't okay don't really care that out later at the moment either for the types I'm I'm not really digging this layout with the two large Fields than a short description another description let's um let's do like uh I don't know General details I I suck at naming sections sometimes yeah details and activity pretty much make it into every form I build yep yep you're right we need to we need another one down here there's a journal field get that get that off of the I often do blog these these go there these go there and then this one would be uh uh details yeah sure details [Laughter] that's feeling a little better let's see how it looks we go from that and one column looks good I think for all those to that much cleaner you get our details there we get our log there nice okay that fixes instance operation what else did we uh doodad with plug-in package I don't think we took a sneak peek at that number name event ID that feels good let's see how the Forum looks uh no [Laughter] two calls again I don't know why I keep going way down there when I know darn where where it is okay step one make that top part two column get the number as read only oh you know what else I didn't think about on that other one is mandatory fields do we have any I should probably say this real quick don't want to lose my work insteads up right here the that doesn't have a type doesn't have a none so that doesn't matter um anything mandatory on here Andrew Andrew's not at home he stepped away all right then we'll come back to that I'm just driving the requirements for that back to login package why isn't it finding that there it is plug-in package okay back to work how long was this 80. that should be in a new section one column not called new section and I'm assuming event that was an optional so we could have that Baseline package yep ID I'm thinking should be mandatory I agree an active I want to put over here this feels more like a steady state thing uh maybe just to balance it out we put ID is the important part I like important things on the left that feels or at home I'm gonna make should name be mandatory or could we get away with just an ID is that the name of the plugin that goes along with the ID name of the plug-in yeah if we have the ID we can still run the flow and whatnot it's not exactly user friendly but I'm going to leave it optional for now and we go from that to that better wait a minute active should be true by default do we miss that when we Define the table it is the default is true so why is that not true is now okay maybe it's just that one record we should have active on here as well the other thing I like to do let's change this list layout put active over there um a common thing is to make the active field more visible because see when your eye scans this it's really hard to see true and false as differentiated so let's go do a quick field Style and for those of you who haven't done field Styles before right click configure Style we're going to create a new one it defaults to of course the active field which is what we're playing with now values on true and false are the database values of 0 and 1. so the value is zero I can do one thing and one thing only and that is a little bit of CSS for the background color and the most common one we've always used and I can't spell tomato without first starting to spell tomasi sorry motor skills is the tomato color and it shows you what the sample will be so when I go back to my list layout which would have been back here oops not quite try that again I can now see these false are red you could equally do uh like lime green I think is the typical green we use for true it doesn't burn your retinas if you use red you're going to have blind spots in your eyes after 15 years like I do so you know Tomatoes a little more gentler on the eyes and it's just something that's been around for almost ever so that helps me see these in a list of like which ones are turned off just something you might want to consider the other tables let's go get another table so I think this one's pretty pretty solid yeah I don't think we need to add any journals activity logs anything not not to the plug-in itself yeah it doesn't feel like this is going to be changing a whole lot let's go look at another table what else did we add Dev instances Andrew said he added so quick clean up on that we have a number we have a name this list layout looks pretty comprehensive there might actually be too much on here but I'm going to leave that alone let's see the form no here we go again uh I'm lazy rather than changing the menu on the other one I'm just going to go back to configure form layout agreed and this is this is one of the satisfying parts of the app development process I love making dirty code turning into clean code abstracting it that's also satisfying but yeah this is this is kind of therapeutic because you get to do a little artistic ability here how long it's not as intimidating as a blank piece of CSS oh good Heavens no let's make this a one column down here what else do we want in the upper part event uh State I finally I found a State field I'm just grabbing these little handlebars next to the field drag that up there make sure state has options we want it has a drop down with none rarely if ever do you ever put a State field with a none option I'm not even sure what a non-state looks like and then we have a whole bunch of dates right so I'm thinking we've put a section called dates maybe some uh details here what is version is that an a short string that's a choice but it has a nun also I don't think you should ever have an instance without a version what do you think I would agree oh it says without none and it defaults to Quebec okay I've misread that my fault maybe maybe for housekeeping put them in alphabetical order uh you are absolutely correct you are as try to do it without singing the song but that's a nice short little field so what um what is the instance name what would the instance name be and just the short the short name like a short description but it's of the city character so I want that long here's what I'm going to do I'm gonna put um a section an unnamed section within a section so name will be across the top but let's put these little short other fields uh no I kind of don't like that let's do it the other way around wherever there's a label it means it's going to make a new tab unless of course you only have one tab so short fields on top long fields on the bottom let's put some of these dates oh credentials what is credentials was that a reference to connect okay that's a credential alias so that would be a short little field yeah that would look good up there data signed that's a date instance DC ID I have no idea what I just did so that's a society I'll put that next to credentials I like it uh date reclaimed I'm just throwing dates up here they should be in a two column format thank you last activity smells like a date date expires smells like a date last login smells like a date get rid of that do these need organizing in any way shape or form need to sign date reclaimed date expires Maybe a little chronological in here you know plus activity and last login that feels pretty good what do you think Jared from an aesthetic point of view we got three main sections let's go take a look I like it created to that was like plug-in that was run on that instance what is activity I'm good with that that looks good going to be populated with I'm sorry your audio broke up what was that oh that might be my bandwidth oh we lost Jared rats rats anyone come across Glide David issue and flow designer there he is oh you muted at the moment where they're dealing with zoom or trucks bandwidth again okay I'm going to go inspect another form and field me and Jared at the moment and one of us is having issues team I don't remember doing anything with team oh I didn't want to do that I want to preview the list we have a winning team and then winning our team I think I did the form layout but again we have no states on the teams I don't recall if we needed any what what the state values were from our old notes of what the team States could be um Thinking Out Loud walking through the process in my head you could be forming a team do we even need a state on a team you either have a team or you don't could be a team of one I have no idea so I'm going to leave that one alone as far as the choices go we'll put a TBD on that a to do on that task that looks good uh did we add anything else servicenow version app event I think all of these were added by me and done the form layout so we are at the top of the hour again time is just cruising we've been at this for three hours how did that happen anyone uh already read that question hello Brad we seem to have lost uh right here on mute we lost Jared I think the internet bandwidth demons got him yep I uh I have to abandon us after three hours and go watch a soccer game okay so that may do it for our stream then because I've gone through the the forms and lists done some cleanup I had one question about the states on a team I don't know if you wanted to dig into that for two seconds but I can't think of why you would need a State field on a team yeah I think active probably is good enough kind of what I'm thinking too we can always keep it but let's hide it from the form yeah let's do that for now um yeah so I think uh I think we can break and then I think we're gonna hop back on later this afternoon all right I've got a lunch date with some friends like first time we've seen these people in person in over a year so looking forward to that but uh yeah keep in touch we'll jump back on when we can Let's uh let me do a stop screen share if I could find the zoom control for that there we are bring that back over so I'm looking at people in the face Andrew is often his fog he's foggy so we've done a little bit of everything well not everything but we've done a little bit of a lot of things all sorts of things so that was a that was a lot of fun thank you for the uiv stuff I feel like my knowledge has advanced a little bit further particularly with the uh getting data and doing some of those queries and presenting it on the screen I've got to get a little more Hands-On with that stuff yeah I mean uib is just a matter of spending time with it so you know the more time you spend with it the more it makes sense and you know the further you get there's some pretty good resources out there now I think with the knowledge sessions there will be more we are planning on releasing some training on the developer site uh in you know the next near future uh around uib also so you know we're gradually getting more content out there uh for that so you've got a great series of videos and blog entries on that so that's that's a place I've got to start going through them I'm looking forward to the lesson plans that are coming up the the uh Creator con Labs like you said are also good resources for that if you're looking for more of the no code low code capabilities like the Forum lists layouts and whatnot that that we showed or some of the AES things um also recommend the Builder track CCL 1075 through 1082 will walk you through a number number of these features uh had some wonderful people build or in some cases rebuild those labs and new new format this year we're not going to watch somebody do this for an hour they're going to all the all the Creator con labs are going to be in short little video vignettes to help introduce the topic maybe some caveats and then you go off and do the lab on your own and then come back and watch the video for five more minutes and go hey welcome back great job on exercise one here's a little bit of about information about exercise two so you can you can it feels more on demand and self-paced in that case it sounds like you're uh wrapping up Chuck we are I I got the forms and list layouts there were a a couple of questions but nothing that was Earth shattering we cleaned them up Jared was helpful with that he had he had to drop as well but uh sounds like we will resume in a few hours yep and I'm gonna keep working on my flow and uh are you gonna stay online or you're gonna work on that offline I'm gonna work on that offline uh so okay we'll come back in a bit um did did we check in on any of the streamers I have not had a chance I think you were the social man going around to the different streams earlier well I will I'm gonna go pop into some streams then uh so thank you everybody if you have questions about the hackathon uh visit the community link for the hackathon uh and uh ask your questions there and we will we will get you answers as soon as we can and uh and the other streams are slack Channel Community is that where they're posted um there is a list of them in S and F slack um I and there is a community post where uh some of them are posted uh in the hackathon community what is the channel name on snw slack hackathon well gee that's too easy all right thank you everybody have a great day and we'll see you back again together take care stay safe foreign

View original source

https://www.youtube.com/watch?v=4o1J_qYyqHA