
Kickstart your Widget Development
If you’re looking for best practices and new ways to develop widgets in Mendix, view this webcast for expert advice and a real-world view of the new tools available for widget development.
-
Transcript
[00:00:00.030] hello and welcome everyone to a new [00:00:02.340] mendax expert developer webinar my name [00:00:05.279] is Jung dufus and I will be your host [00:00:06.870] for today today's webinar will be about [00:00:09.510] kick starting your widget development [00:00:10.889] with node yes grunt and other useful [00:00:14.549] tools JavaScript developer yell - laughs [00:00:18.029] and I will teach you how to use the new [00:00:19.830] widget generator upgrade your existing [00:00:21.960] widgets and how to check your code for [00:00:24.600] deprecations during the webinar you can [00:00:28.560] submit your questions in the question we [00:00:30.359] know after the demos the elta will go [00:00:33.210] through some of the questions the [00:00:35.280] questions and answers will be posted on [00:00:36.989] the webinar page afterwards [00:00:38.989] before we start please take a look at [00:00:41.190] the handouts window and go to webinar to [00:00:43.770] find the presentation slides please [00:00:46.350] enjoy the presentation I'll now give the [00:00:48.480] floor to Yelton I am thank you and thank [00:00:54.030] you everybody for joining the expert [00:00:56.430] webinar kickstart your widget [00:00:58.230] development my name is Lt lacnic I am a [00:01:01.500] JavaScript developer for the community [00:01:03.420] team at mendax at the community team we [00:01:06.750] want to enable you as a JavaScript [00:01:10.020] developer to create your own widgets and [00:01:12.630] we want to enable our community to [00:01:14.640] create content for this webinar we [00:01:18.030] expect you to know how a widget works [00:01:20.600] have technical knowledge about [00:01:22.770] JavaScript and have a basic [00:01:25.560] understanding what nodejs is we will not [00:01:31.170] go in depth on how a widget works in the [00:01:34.290] notes of the slide deck we provided a [00:01:36.240] link for a how-to for great in your [00:01:39.240] first widget the hello world widget in [00:01:41.700] this webinar I am focusing on Julie [00:01:46.009] first we'll talk about how to scaffold a [00:01:48.810] widget in a minute using our latest tool [00:01:51.060] the widget generator next we'll discuss [00:01:55.430] grunt which is included in our latest [00:01:58.890] tools and widgets repositories I'll talk [00:02:03.240] about how we can use the tools namely [00:02:05.790] the widget generator to update existing [00:02:08.039] widgets [00:02:11.090] as a bonus I will show another tool that [00:02:13.700] we built back in November to check your [00:02:16.849] widget and when it comes to deprecations [00:02:19.129] in minik 6 last but not least I'll give [00:02:23.569] a demo demonstrating these tools we'll [00:02:26.900] go into a step by step guide using the [00:02:29.599] widget generator and grunt in a slide [00:02:33.830] deck we added links and further [00:02:35.269] explanations in the notes per slide the [00:02:38.810] notes in the last slide contains a brief [00:02:41.660] step-by-step guide on the things that we [00:02:43.910] are going to demo at the community team [00:02:52.760] we create and maintain a lot of witches [00:02:55.750] in order to do this properly we need [00:02:58.670] development tools so up until now we [00:03:01.610] only had brackets the code editor [00:03:04.060] combined with a custom plugin to create [00:03:07.099] widgets there are a couple of in depth [00:03:10.190] how tools that you can find on our [00:03:12.500] website regarding this editor it has [00:03:16.670] advantages and disadvantages it's visual [00:03:20.569] and it's easy to use but there are a few [00:03:24.889] bugs in the plugin that because of the [00:03:27.230] very little support in brackets are hard [00:03:30.079] to fix simply put the plugin not always [00:03:34.280] works as expected but it's hard to debug [00:03:37.069] and fix it for example the plugin will [00:03:40.549] not work if you are not connected to the [00:03:42.829] Internet this led to the creation of a [00:03:47.030] new tool the yeoman widget generator [00:03:49.870] it's faster it's more reliable it's [00:03:54.380] better maintainable its editor [00:03:57.340] independent and we've made this tool [00:04:00.669] transparent and open-source the files [00:04:03.950] you can find them on github for those of [00:04:11.540] you [00:04:11.930] do not know in what nodejs this simply [00:04:15.739] put it's a framework that uses [00:04:18.290] JavaScript to run basically anything on [00:04:21.079] your computer it has been around for a [00:04:23.810] long time and has a large ecosystem of [00:04:26.509] open-source libraries now you might have [00:04:30.139] already used it without knowing it [00:04:32.330] for example the previously mentioned [00:04:34.750] brackets editor is built on top of node [00:04:39.520] yeoman is a command-line tool that is [00:04:42.259] built on top of no GS as well it's what [00:04:46.130] is called a scaffolding tool using a [00:04:49.130] template and by entering a few [00:04:50.960] parameters it can quickly scaffold a web [00:04:54.229] application a website or in our case a [00:04:58.100] widget the widget generator is basically [00:05:02.150] a template that is used by the yeoman [00:05:04.340] command-line client to create a widget [00:05:10.780] grunt is a task runner that can be found [00:05:14.900] on crunches calm [00:05:17.349] it is also built on top of note yes and [00:05:20.780] it has the ability to run predefined or [00:05:24.860] custom Li defined tasks grunt uses a [00:05:29.599] single file a grünfeld digest to run [00:05:33.289] these tasks it has a few advantages [00:05:36.349] mainly it is independent of any editor [00:05:39.770] you use you can run this from the [00:05:42.409] command-line client and you can run this [00:05:44.510] from the command line but for a lot of [00:05:47.180] editors there are also plugins that can [00:05:51.020] use grunt now our community comes up [00:05:55.190] with new ways to improve development [00:05:57.020] either through the forum through github [00:05:59.990] or meetups and I actually have to thank [00:06:02.780] one of our MVPs unleash MIT for [00:06:05.180] providing the first version of this [00:06:06.860] grunt file using hiss as an example we [00:06:10.669] created our own which is now included in [00:06:13.310] the sources of many of our widgets on [00:06:15.889] github as well as automatically provided [00:06:20.060] by our widget generator [00:06:24.599] we have created a few tasks that you can [00:06:27.789] use out of the box to speed up your [00:06:29.919] widget development in a demo I will [00:06:33.519] demonstrate the use of grunt and running [00:06:35.529] the various tasks like built version [00:06:38.649] start muddler and a default task in a [00:06:43.599] slide deck you will find a short [00:06:45.189] description per task and the most [00:06:47.979] important task the default task will let [00:06:51.399] you develop your widget while running [00:06:54.099] your mimics application without a [00:06:56.529] necessity to redeploy your application [00:06:59.439] every time you make a change to your [00:07:02.110] javascript files in your widget now you [00:07:09.369] might have already built a widget or for [00:07:12.519] a client you are customizing one we have [00:07:17.079] adapted the widget generator to include [00:07:20.289] the necessary files for grunt [00:07:22.300] in your existing widget repository so [00:07:26.349] this will give you the ability to [00:07:28.300] quickly use the power of grunt there are [00:07:33.219] a few steps that you will need to take [00:07:34.919] you open your widget folder in the [00:07:37.240] terminal and that can either be a [00:07:39.369] command line client or a powershell you [00:07:43.449] have to make sure that the source files [00:07:45.099] are in a subdirectory called SRC [00:07:48.689] you run the widget generator in the [00:07:51.189] terminal it will ask you if you're [00:07:53.439] updating an existing widget the widget [00:07:58.419] generator will then create a package to [00:08:00.699] Jason and a grunt file j/s it will [00:08:05.050] install the necessary dependencies for [00:08:06.969] grunt and you can start using it now as [00:08:13.269] a bone [00:08:13.790] in this webinar I'll also talk about [00:08:16.870] deprecations in November last year we [00:08:21.770] had to make sure our mimics supported [00:08:24.200] widgets were up-to-date and compatible [00:08:27.140] with the new mendax six release there [00:08:31.460] were methods and api's were already [00:08:33.290] Markus deprecations in mimics five these [00:08:37.130] would be removed in mimic six if any of [00:08:43.400] the widgets would contain deprecations [00:08:45.290] they would break the remaining six [00:08:47.540] application due to JavaScript errors so [00:08:52.280] we created a deprecation checker that is [00:08:55.280] also built on top of no GS and run as a [00:08:58.550] standalone command-line client with this [00:09:02.840] client you can quickly check your [00:09:05.540] existing widgets in your project you run [00:09:09.860] this client in your widgets folder of [00:09:11.890] your project and it will tell you [00:09:15.410] whether or not any widget has possible [00:09:18.440] deprecations now I said we use this tool [00:09:22.730] to check any of our own supported [00:09:26.990] widgets the tool can also export an [00:09:31.430] excel file for future references so [00:09:39.970] enough theory let's go let's get down to [00:09:43.730] business and let's demo the tools that I [00:09:47.600] discussed [00:10:04.270] okay first of all and to use these tools [00:10:08.360] we need note yes no js' can be [00:10:14.210] downloaded from Noah's Ark and we [00:10:19.220] recommend that you installed the LTS [00:10:21.920] version in this case the 4.2 that six [00:10:25.490] version you can also install the stable [00:10:28.340] version if you want it as long as you [00:10:30.920] make sure that the version is minimally [00:10:35.530] 4.2 now once you've installed node yes [00:10:40.940] it is available on your command line and [00:10:44.020] I will show this by opening a PowerShell [00:10:48.770] I have my PowerShell opened here you can [00:10:53.720] also use if you want the standard [00:10:56.300] command line client in Windows this one [00:11:00.770] you can open by going to start and then [00:11:03.520] in the search bar type CMD press ENTER [00:11:09.020] and this will start your command line [00:11:11.120] client now for this demo I'm going to [00:11:14.090] use a PowerShell I personally prefer the [00:11:17.060] PowerShell okay so I've installed no [00:11:22.370] Jess and I can check if it's there by [00:11:28.880] typing note - V and this will give me a [00:11:33.650] version number now in my case I have [00:11:36.020] version 4.2.1 you also can check whether [00:11:40.970] or not the node package manager is there [00:11:43.870] by typing NPM - V and this will give you [00:11:49.760] the version of the node package manager [00:11:52.930] now these these are necessary to install [00:11:59.300] the yeoman generator so first I'll show [00:12:03.440] you the website of yeoman yeoman is on [00:12:07.220] yeoman dot IO and this will give you an [00:12:10.580] explanation of what yeoman does and how [00:12:13.910] it works and how you can install it now [00:12:15.940] if I go to [00:12:18.520] yeoman dot io / generators here I have a [00:12:23.600] list of all the generators and currently [00:12:25.510] yeoman has about 33 or by 3400 [00:12:30.560] generators and MINIX has built their own [00:12:33.440] generator as well so if I type in min [00:12:35.750] decks here you'll see a link to the [00:12:39.500] MINIX widget generator now if I click on [00:12:42.440] it I go to our get up page now at the [00:12:47.450] moment we have not yet provided a how-to [00:12:51.980] on our website this how-to will be [00:12:55.400] published as soon as this video will be [00:12:58.730] published for now I'm I refer to the [00:13:02.630] readme page on get up here you'll see a [00:13:08.180] short explanation on how it works and [00:13:11.630] how you need to install it and you [00:13:14.360] install this by typing this command in [00:13:18.530] your command line window so if I go to [00:13:21.350] powershell it would be npm install [00:13:24.940] install - g which means globally yo [00:13:30.500] that's the yeoman client generator [00:13:34.610] - Bendix that's the MINIX widget [00:13:39.410] generator and grunt - climb and that's [00:13:43.820] the grunt client now this can take up to [00:13:48.470] a minute or two minutes I've already [00:13:51.470] installed it so I don't want you to be [00:13:54.350] looking at a window where it's trying to [00:13:57.860] install I already have it so let's use [00:14:04.240] the widget generator [00:14:06.890] I want to scaffold a new widget so I [00:14:12.050] create an older where I want to scaffold [00:14:15.020] this widget in this case I have a folder [00:14:18.710] generate a widget which is empty so if I [00:14:21.890] go to my parish shell here I see you [00:14:26.480] listening and I go to [00:14:29.720] this folder and it is empty so let me [00:14:35.279] clear this and now I'm going to run the [00:14:40.139] widget generator I do this by typing yo [00:14:45.799] Bendix pressing enter this will start my [00:14:52.290] generator and this generator is going to [00:14:57.059] ask me for a few parameters first of all [00:15:00.949] it asked me what's the name of my widget [00:15:03.869] now let's say I'm going to call this [00:15:06.209] webinar widget I press ENTER I can enter [00:15:16.919] a description now what you might see if [00:15:19.319] you open the widget generator is that [00:15:22.759] there is already a value here between [00:15:25.790] brackets so if I press ENTER now it will [00:15:29.279] use the default value if you open the [00:15:34.139] widget generator and for example here [00:15:36.209] you have add a copy right now between [00:15:39.149] brackets there is mendax 2016 for you [00:15:45.089] that would be different now that is [00:15:47.850] because I've already used the generator [00:15:50.809] before and so it will save these values [00:15:57.529] so I'll just press enter enter here's [00:16:02.610] the initial version and we always always [00:16:05.249] start the widget with version 1.0.0 and [00:16:09.989] this is actually what is called semantic [00:16:12.809] versioning that means that first number [00:16:16.799] is the major number the second number is [00:16:19.529] the minor number and the third number is [00:16:22.980] a patch number and we recommend that [00:16:26.910] everybody uses semantic versioning you [00:16:30.329] will see this in our app store you will [00:16:33.629] see this on github and we recommend that [00:16:37.110] you stick to this versioning version [00:16:40.919] numbering [00:16:41.960] so press ENTER again again I've already [00:16:45.529] used this so the author is already [00:16:47.540] filled in and I have here my github [00:16:50.450] username that's not completely [00:16:54.860] functional right now but you can already [00:16:57.140] set it so if I press enter now it will [00:17:01.120] scaffold a new widget so if I let me [00:17:07.059] here you will see the folder that I'm [00:17:09.949] working in and right now it's empty so [00:17:12.410] if I press enter now what it will do is [00:17:15.709] create all the files and these files are [00:17:19.309] actually a copy of our app store widget [00:17:23.420] boilerplate that is on github as well so [00:17:26.750] this follows the pattern of the app [00:17:30.860] store widget boilerplate that is also [00:17:34.880] discussed on our website in the [00:17:40.309] documentation what it also does here you [00:17:45.320] see it has copied all the files and now [00:17:48.530] it's installing all the dependencies [00:17:50.420] that are needed for grunt when these [00:17:55.700] dependencies are installed it will [00:17:58.179] automatically run grunt built to build [00:18:01.490] the first version of your widget and the [00:18:04.820] first version of my widget will be in my [00:18:06.980] distal der and it is called the webinar [00:18:09.830] widget I will show you the tasks that [00:18:14.600] you can run in grunt later on now I also [00:18:20.710] mention that you can use the Bendix [00:18:24.100] widget generator to update existing [00:18:27.500] widgets so if I go to I have here a [00:18:32.150] folder and let me go to my folder [00:18:43.020] now as you might see there is no grunt [00:18:47.440] file here and there is no package no [00:18:50.500] Jason here now normally you could um [00:18:56.100] manual copy these files but like I said [00:19:00.159] we've adapted the generator to create [00:19:02.650] them for you so let me run the generator [00:19:06.970] again in this mint and in this folder so [00:19:10.260] third is and I type in yo mendax and I [00:19:15.640] press ENTER now what will happen is the [00:19:21.520] generator will see that the directory is [00:19:24.970] not empty and let me maximize this and [00:19:29.370] it will give you a warning and if there [00:19:33.730] is already if there are already files in [00:19:36.309] your folder but it will also ask you [00:19:41.559] whether or not you are upgrading a [00:19:43.659] custom widget and in this case I am so [00:19:47.890] I'll press yes what it will do now is [00:19:53.190] try to read the package XML in your [00:19:59.020] source folder so if I go to my source [00:20:06.159] folder here is the package XML and here [00:20:12.130] is my demo which is XML and so it will [00:20:15.520] automatically detect this is the name of [00:20:18.909] your widget so here I can press ENTER [00:20:21.490] and since my widget is of version 1.0.0 [00:20:28.120] it will take this version number as well [00:20:31.570] so I press enter and now it will copy a [00:20:36.520] couple of files but the most important [00:20:38.860] one is a package to Jason and grunt file [00:20:42.370] and as you might see now it has included [00:20:48.520] the grunt file and the package Jason [00:20:54.020] it will then install all the [00:20:57.690] dependencies and now you can use grunt [00:21:01.850] in your existing widget repository let [00:21:08.340] me break out of this now it might also [00:21:16.440] happen that you have downloaded a widget [00:21:21.380] and if you've downloaded a widget you [00:21:24.840] have the widget from us so if I go to [00:21:28.820] the mendax a repository and for example [00:21:32.850] I take the chart yes widget if I I can [00:21:39.690] clone this using git or I can download [00:21:42.600] it as a zip file and it will include a [00:21:45.720] grunt file and a package Jason so I [00:21:51.150] should be able to use grunt from this [00:21:54.480] repository so if I type right now it [00:21:58.500] will give me an error and that is [00:22:00.930] because grunt cannot find the local [00:22:04.740] grunt and that's because the [00:22:07.610] dependencies that are used by grunt are [00:22:11.370] not yet installed so I need to install [00:22:14.790] these and I do this by typing npm [00:22:19.290] install and if I press ENTER it will [00:22:23.720] install the dependencies that's because [00:22:26.580] it has a package that jason and so the [00:22:30.090] node package manager will understand [00:22:33.420] which dependencies to install so if i [00:22:37.080] open i will open this in my editor and [00:22:45.890] so in my editor here you will see the [00:22:50.130] packages are jason and in here are the [00:22:54.090] dependencies that are used by grunt to [00:22:56.670] run their tasks [00:23:00.640] so that concludes using the widget [00:23:05.679] generator and so now let's go let's use [00:23:09.970] grunt so for this I'm going to use [00:23:19.170] actually use one of our widgets that [00:23:22.240] we've built the chart yes we would you [00:23:30.750] in here I have a grunt fell I have a [00:23:33.910] package that Jason and my dependencies [00:23:36.309] are already installed because I have a [00:23:38.350] node modules folder so let's go to my [00:23:43.840] partial and I go to charge s now from [00:23:51.370] here I can run my grunt tasks and so [00:23:56.740] first let's build a new NPK file a [00:24:00.790] widget fell so here's my NPK fell and [00:24:06.580] now I'm going to run grunt build now [00:24:16.240] grunt what grunt built will do is take [00:24:19.799] all the files in your source folder here [00:24:23.740] and create a an archive a sip archive [00:24:29.520] with an mpk extension and it will put [00:24:33.929] this NPK file into this folder and as [00:24:37.929] you can see by the time stamp I just [00:24:39.970] created this mpk file so that's how you [00:24:44.500] use the grunt build tool and this this [00:24:49.299] NPK you can distribute in the app store [00:24:52.990] or you can use it in your project now if [00:24:58.780] I'm updating the code in my widget I [00:25:02.700] need to do some versioning so every time [00:25:06.429] I create a new version of my widget I [00:25:09.610] need to update the version number if I [00:25:12.640] go to [00:25:13.809] let me go through my editor in my source [00:25:21.519] folder I have a package dot XML here and [00:25:28.659] here is a version number and currently [00:25:32.919] the version is 3.1.3 now if I want to [00:25:37.779] update my version number I could change [00:25:42.460] this myself but we have created a [00:25:46.119] current task for this so if I run grunt [00:25:50.190] version it will try to read the package [00:25:55.899] XML in the version number in package XML [00:25:59.320] and in this case it's 3.1.3 so if I want [00:26:03.489] to update my version number for example [00:26:06.249] I want version 3.2 I can set this using [00:26:11.799] grunt version so I say grunt version [00:26:20.279] 3.2.40 the patch number here if I say [00:26:23.109] it's version 3.2 it's actually 3.2 dot [00:26:27.639] and so now I press ENTER and if I go [00:26:33.159] back to my editor you will see that in [00:26:36.549] the package dot XML the version number [00:26:39.369] has changed to 3.2 dot oh so that's an a [00:26:43.690] fast way to change the version number of [00:26:47.879] your widget it will also update the [00:26:51.549] version number in your package JSON and [00:26:54.629] we try to keep these two aligned but [00:26:59.589] this version number is not used in the [00:27:02.259] app store or anywhere it's just for [00:27:05.019] convenience that we also change it here [00:27:07.330] in the package that Jason when we [00:27:15.729] develop [00:27:16.220] a widget we always add a test project [00:27:20.870] and usually if you're looking at our [00:27:24.710] widgets at our structure you have in [00:27:27.770] your widget repository you have a folder [00:27:32.179] called test and in test here is my test [00:27:36.590] project now I can run this test project [00:27:42.580] just by clicking on it but we also [00:27:46.370] included a current task for that so I [00:27:51.049] can run this by typing grunt start - [00:27:57.730] muddler now what it will do is search [00:28:06.080] for your mimics version selector and [00:28:10.360] taking the test test project and opening [00:28:15.710] it with the version selector so right [00:28:18.049] now from the command line I've started [00:28:20.240] my test project now let's do some [00:28:29.179] development on the widget so right now [00:28:32.750] what I'm going to do is I'm going to [00:28:34.490] going to run this project locally [00:28:46.570] and in the meantime in a source folder [00:28:50.950] I'm going to update one of my files in [00:28:55.930] this case cord rjs and i will uncomment [00:29:01.570] this line now if I'm if I open my test [00:29:07.840] project locally and I open my chrome [00:29:12.040] inspector by right-clicking and then go [00:29:15.700] to inspect in the tab sources okay I can [00:29:23.830] look at all the sources of the files [00:29:26.890] that are loaded and in this case it has [00:29:31.480] loaded the charges files and in this [00:29:36.010] case I want to look at the court at je s [00:29:38.470] file now if I look at the quarter J's [00:29:41.710] file you'll see that this line is [00:29:53.280] commented but I just uncommon it here [00:29:59.500] let me save it again and reload it's [00:30:08.080] still commented that's because the [00:30:11.770] modeler will take all the widget files [00:30:14.140] and unpack them in the deployment folder [00:30:16.750] so if I go into my project and I go to [00:30:21.340] my test test project folder to [00:30:25.390] deployment then to web into widgets hill [00:30:32.380] here here you will see the files of in [00:30:36.730] this case the charge yes widget and so [00:30:39.700] if I go to core here you'll see that [00:30:44.590] it's commented now if I want to do [00:30:48.880] widget development it's useful to change [00:30:52.630] files in your source folder and see [00:30:56.170] these changes reflected directly [00:30:59.770] your project so that's why we created [00:31:06.400] the default task for grunt and I run the [00:31:12.730] default task I can say grunt default but [00:31:16.690] if I omit a task name I can just say [00:31:19.870] grunt run grunt so I press ENTER and [00:31:23.790] this will run the watch task now what [00:31:28.240] watch will do the watch task will do is [00:31:33.420] watch your source folder so let me go [00:31:36.880] back to my source folder arrived my core [00:31:41.500] dot JS file it will watch for any [00:31:46.890] changes in these files and when one of [00:31:50.950] those changes happens and let me do this [00:31:55.930] by say triple comment in here for [00:31:58.810] example and I'd press save now you'll [00:32:02.260] see that grunt detects a change in this [00:32:05.380] case in cordage is now it will run [00:32:08.680] actually run two tasks it will compress [00:32:12.130] all the files in the source folder and [00:32:15.640] it will basically build a new NPK file [00:32:18.870] so this is similar to the grunt build [00:32:22.450] task but it will do it will also do [00:32:26.650] something else it will copy the changed [00:32:30.820] file to your deployment folder so in [00:32:35.980] this case here I have cordage is opening [00:32:39.340] my source file and just as I saw that [00:32:42.810] the cordage is file in my deployment [00:32:46.360] folder was not changed if I go to my [00:32:49.560] cordage a s file here you'll see that it [00:32:53.350] now has triple comments and so here if I [00:32:59.520] reload the page now [00:33:06.190] already had a sources open so and the [00:33:09.909] quartet JS file open and now we'll see [00:33:12.309] that it's triple committed and basically [00:33:16.769] what this means is that all the changes [00:33:19.750] I make in my source folder are now also [00:33:23.529] reflected in my deployment folder and so [00:33:26.200] when I'm developing this widget and I [00:33:29.620] make changes to the JavaScript files I [00:33:32.860] do not have to read the redeploy my [00:33:37.179] project or synchronize my project [00:33:40.600] directory as you can see in the if you [00:33:43.990] have in the modeler and what it was all [00:33:46.600] all also done when developing in records [00:33:52.259] now I emphasize on changes in your [00:33:56.710] JavaScript because when you're changing [00:34:00.639] files for example in this case the [00:34:05.679] package XML or let's take for example [00:34:10.060] the bar chart here this XML is loaded by [00:34:16.119] the modeler now if I make changes here [00:34:20.079] for example we create a new property so [00:34:23.919] for demo purposes I will just copy this [00:34:28.119] and I'll say the key is size caption [00:34:35.169] size now if I save this my grunt will [00:34:44.859] also see this change it will create a [00:34:48.159] new mpk file but if I go to my modeler [00:34:52.720] and in this case go to the bar chart I [00:34:55.770] will not see this key here yet and [00:34:59.290] that's because it now needs to reload [00:35:02.319] the mpk file so in this case if I make [00:35:06.130] changes to my XML file or or CSS because [00:35:12.010] that also needs a reload from the [00:35:16.510] modeler [00:35:17.900] I now need to synchronize my project [00:35:20.630] directory and if I do that you'll see [00:35:23.150] that it has added a couple of errors and [00:35:26.270] that's because the definition of the [00:35:28.700] widget in this case the bar chart is [00:35:31.730] changed so if I click on the error what [00:35:36.260] I need to do is update this widget so I [00:35:40.340] right-click and I say update all widgets [00:35:43.600] and now if I double click on the bar [00:35:48.440] chart now you'll see that it has added a [00:35:53.990] key so that is something that you need [00:35:58.730] to keep in mind when you're developing [00:36:01.100] your widget that if you make changes to [00:36:03.800] either your CSS file or an XML file then [00:36:08.510] you need to you need to simply [00:36:11.930] synchronize your project directory but [00:36:14.420] while running this grunt task it will [00:36:16.370] always have the latest version of the [00:36:19.310] mpk file in your test project because i [00:36:24.470] said that grunt when you went grunt [00:36:29.000] built runs it will create an MPA file [00:36:32.360] and puts it in the dist folder but it [00:36:36.170] will also make a copy of this in your [00:36:39.020] test project in this case in my test [00:36:41.900] folder and then widgets and so this mpk [00:36:46.190] file is also the latest version of your [00:36:51.380] widget now I [00:36:58.940] promised a bonus and that is the [00:37:03.790] deprecation checker so let me break out [00:37:08.359] of this if you want to stop run in this [00:37:10.579] case the the the the standard grunt [00:37:14.060] watch task you can break out of it by [00:37:17.089] pressing ctrl + C and then press yes and [00:37:21.200] now I'm I have stopped grunt so like I [00:37:27.230] said we created a deprecation checker [00:37:29.660] and this can be found on github as well [00:37:32.890] under manic so koat.com slash mendax and [00:37:38.829] if I type in deprecation it will show me [00:37:44.150] the MX - check - deprecations now this [00:37:50.990] will give you a short description on how [00:37:54.470] to install it and this is similar of [00:37:57.760] installing your widget generator or [00:38:02.930] yeoman in this case we install the [00:38:06.680] deprecation checker by running npm [00:38:09.319] install MX - check - deprecations [00:38:13.280] - g which means globally so you can use [00:38:16.339] it everywhere in your terminal so i've [00:38:21.530] already installed it so if i run MX [00:38:25.310] check deprecations - h which means help [00:38:32.170] it will show me the deprecation checker [00:38:34.790] with a short description of the options [00:38:38.240] that you can give so let me go to a [00:38:41.869] project where i want to check whether or [00:38:44.930] not a widget has deprecations that will [00:38:48.890] break in mendick 6 so i go to the folder [00:38:52.790] i created a test project in the folder [00:38:57.380] deprecations for demo purposes and so in [00:39:01.400] this folder [00:39:09.640] this is a standard project folder and in [00:39:12.880] my widgets folder I have a couple of [00:39:15.789] widgets and now I want to check these [00:39:17.619] widgets using the deprecation checker to [00:39:22.240] see if there are any deprecations so I [00:39:25.079] go to widgets and now here I run a mix [00:39:33.039] check deprecations now what it will do [00:39:39.099] is run through every widget so as you [00:39:43.150] can see here if run runs through [00:39:46.089] bootstrap RTE NPK which is here and it [00:39:53.109] will check for any deprecations and in [00:39:54.670] this case it hasn't found any [00:39:56.349] deprecations the same for the calendar [00:39:58.450] widget the same for the charge as widget [00:40:02.049] and here I have deprecations in my micro [00:40:07.210] flow label dot mpk now what it will tell [00:40:10.390] you is what kind of deprecation do I [00:40:14.740] have in on which javascript file in this [00:40:19.779] case the microphone labelled is in the [00:40:24.069] NPK foam it will tell me what the [00:40:26.529] deprecation is it will tell me on what [00:40:29.589] line it is in what column it is and it [00:40:33.640] will tell me what the the match and this [00:40:37.990] is basically a short snippet of the the [00:40:42.509] deprecation and that's because the [00:40:46.420] application checker will tell you about [00:40:49.089] possible deprecations so if i go to for [00:40:52.089] example here is a deprecation it says [00:40:55.269] the deprecation is MX UI dot HTML dot [00:40:58.359] set content but this is set contents and [00:41:02.319] this is clearly a method in the widget [00:41:05.740] and so this is actually a false positive [00:41:08.410] so the deprecation checker just checks [00:41:12.160] for deprecations but it will tell me not [00:41:14.559] tell you whether or not it is really a [00:41:17.829] deprecation because it might be a false [00:41:20.710] positive [00:41:21.279] now of course this [00:41:23.380] create a list in your terminal your [00:41:26.740] terminal and that might not be very [00:41:28.900] convenient so if I run this again but [00:41:31.869] now by using - II it will do the same [00:41:35.950] thing but it will create a deprecations [00:41:39.009] dot XLS file and this is basically an [00:41:42.039] excel file where all the deprecations [00:41:44.529] are listed and so you can check them for [00:41:49.049] for later references and that concludes [00:41:55.059] my demo yum [00:42:04.109] great thank you very much for that yell [00:42:06.849] - great explanation and awesome demos [00:42:09.490] it's now time for some questions [00:42:11.740] you can ask questions through the [00:42:14.079] questions window in GoToWebinar during [00:42:17.440] the webinar we've already received some [00:42:19.509] great questions so let's go through some [00:42:22.210] of them the first question is by Ahmed [00:42:26.710] and his question is is yeoman better [00:42:30.700] than brackets and what would you [00:42:32.980] recommend I think we've seen some of it [00:42:35.319] during your demos but I'd love to hear [00:42:38.380] your answer in this yeah it's a great [00:42:43.599] question thank you what is better the [00:42:48.819] brackets editor in our opinion is not [00:42:53.589] well supported and the plugin that we [00:42:56.890] created is as I said earlier is [00:43:01.740] difficult to maintain we have the code [00:43:04.809] of this this plug-in on github as well [00:43:07.000] but it's very hard to maintain and so we [00:43:12.730] thought let's create a better tool and [00:43:16.390] in this case it's the yeoman which [00:43:18.069] generator so which one is best [00:43:20.980] I think it's yeoman but brackets is more [00:43:25.839] visual so yeah I think that's that would [00:43:31.420] be my short explanation great IMed does [00:43:36.880] it [00:43:37.210] answer your question can you now make a [00:43:41.200] decision on what you prefer because I [00:43:43.780] think that's what it comes down to it's [00:43:45.550] not specifically that one is better than [00:43:47.500] the other but more of what you prefer to [00:43:51.609] use Michael asks a question hi guys is [00:43:56.079] it possible to get a recorded version of [00:43:57.970] the webinar at some later time and yes [00:44:00.280] every expert webinar is recorded and [00:44:02.349] posted on the developer website [00:44:04.170] developer Dominic's calm and we also [00:44:07.359] post the slides with the notes along [00:44:10.300] with the questions and answers so you [00:44:12.250] can see and read everything afterwards [00:44:16.390] jayven Bari asks a question is there a [00:44:19.540] plan to make this into a GUI instead of [00:44:22.599] a command line not right now [00:44:30.240] there might be possibilities - to create [00:44:33.460] a GUI right now there isn't a plan on on [00:44:39.280] doing that and basically the Yeomen [00:44:42.160] client is always a terminal a client so [00:44:47.589] a command line client and I have to [00:44:50.500] check because for instance for grunt [00:44:53.890] there are a couple of plugins for a lot [00:44:57.760] of editors in my case I use Adam a lot [00:45:01.079] so for Adam there is a grunt plug-in and [00:45:04.230] maybe but that's something I have to [00:45:06.910] check maybe there's a plugin for using [00:45:11.440] yeoman from your generator and then yeah [00:45:15.630] sorry from using yeoman in your editor [00:45:19.299] and so then you don't need to command [00:45:23.470] line client anymore but that's something [00:45:27.099] I have to check so maybe maybe all right [00:45:32.799] thanks [00:45:35.770] Mohammed asks a question is there a [00:45:38.349] webinar to show how to build a widget [00:45:40.089] from scratch well actually we've hosted [00:45:44.920] another webinar exactly one year ago [00:45:47.410] also in February [00:45:49.720] which was hosted by hit art Aidan's [00:45:52.240] about creating custom widgets and it [00:45:56.049] also includes a basic webinar and how to [00:45:57.910] create your first hello world widget and [00:46:01.240] we've also got some how-tos on that in [00:46:05.380] the MINIX documentation so if you go to [00:46:08.170] world man x-com you'll find that in the [00:46:11.710] how-to section Ivana asks suppose you [00:46:16.839] want to develop a new widget on what [00:46:19.329] version of mendax can you best start if [00:46:23.349] you would also want to support the [00:46:25.329] current mendax customer base if you want [00:46:38.529] to develop a widget I would recommend [00:46:42.579] that you start on MINIX 518 and that's [00:46:51.549] because when you for example you would [00:46:54.970] want to use this this this widget in [00:46:58.630] many six if you want to update it to too [00:47:02.859] many clicks it's more convenient to [00:47:04.990] start add MINIX 518 that would be my [00:47:08.799] recommendation all right thank you so [00:47:13.690] not necessarily the latest version not [00:47:16.240] 6.2 but 518 plus half v 5 would be 5 [00:47:23.619] would be now 5 is used to most so yeah I [00:47:27.940] think it's best to start at for example [00:47:31.210] 518 something like that yeah so it's [00:47:35.319] there's more support for it and more [00:47:37.690] people using it yeah all right so the [00:47:40.390] next question is by I'm Matt so he wants [00:47:43.720] to know how you can become an expert [00:47:45.480] widget developer in a short time so do [00:47:48.549] we have any suggestions for how you can [00:47:51.940] you know quickly ramp up widget [00:47:54.519] development is there something specific [00:47:56.200] you can do for mendax or maybe a crash [00:47:58.779] course online somewhere we have [00:48:03.480] couple of how to's on the MINIX [00:48:06.570] developer website which will tell you [00:48:10.380] how to to create a widget but it will [00:48:13.920] also tell you how a widget is structured [00:48:16.590] so what's the the for example the folder [00:48:20.250] structure and things like that and yon [00:48:23.070] also mentioned the other webinar from [00:48:26.130] last year that also goes into creating I [00:48:30.150] think there was a hello world widget and [00:48:34.950] so that would be a quick way to to start [00:48:38.550] and I think the other way to to learn [00:48:46.320] this is by experimenting [00:48:49.140] so just by developing and if you make [00:48:52.440] for example a an error I mean that's [00:48:55.619] something that you learn from so you'll [00:48:59.460] learn also by I would say trial and [00:49:02.520] error so I think that that yeah plus [00:49:05.940] well be how choose and the other webinar [00:49:09.930] I think that would be a quick way to to [00:49:13.530] start your your widget development great [00:49:17.640] thank you very much I'm at does that [00:49:19.380] answer your question [00:49:20.490] I think it comes down to practicing a [00:49:23.220] lot finding a good idea and just trying [00:49:26.430] it out and if you have someone around [00:49:28.859] you maybe colleague or a JavaScript [00:49:32.580] expert who's maybe built widgets before [00:49:36.000] maybe they can assist you and give you [00:49:38.700] some pointers give you some tips and [00:49:40.140] otherwise of course there's a the medics [00:49:42.960] forum where you can always ask you [00:49:44.400] questions and guaranteed answers yeah [00:49:49.109] and I I think there's also something [00:49:50.880] else I mean a we have a lot of our [00:49:54.720] widgets we have them on github so that's [00:49:58.410] also a quick way to try to find out what [00:50:02.070] the structure is take the how-tos and [00:50:04.380] then take one of our existing which it's [00:50:06.869] um get up and try to look at the code [00:50:09.690] and try to understand how to structured [00:50:12.630] and I think that I mean that helped me [00:50:15.000] when I started [00:50:16.900] as a JavaScript developer at MINIX that [00:50:19.750] helped me tremendously just by looking [00:50:22.450] at the code of existing widgets as well [00:50:25.480] and I mean then it goes pretty fast and [00:50:29.260] yeah the forum is a good one as well [00:50:31.120] yes all right thank you very much so [00:50:35.590] a yellow Decker asks a question he says [00:50:39.100] would this work as a yeoman GUI for [00:50:42.250] mendax and he links to an atom package [00:50:45.820] called atom yeoman and perhaps you can [00:50:50.440] open that on your UI so that we can all [00:50:55.870] see what he means [00:50:57.820] so that would be atom dot io / packages [00:51:03.510] / atom - a yeoman and perhaps you know [00:51:09.340] that's that's something we have to look [00:51:11.590] into and perhaps yell that can already [00:51:14.860] tell us now if this is looking good or [00:51:18.990] maybe something for for the future well [00:51:25.180] thank you [00:51:27.120] I didn't see this one but I'll be sure [00:51:32.500] to to look into it I mean if if it works [00:51:35.590] then I'm going to experiment with it and [00:51:39.250] and if it works and then I would really [00:51:42.640] recommend it yes thank you excellent so [00:51:46.690] thank you very much for the suggestion [00:51:49.360] gonzo heart which is asking if you want [00:51:52.090] to adapt an existing widget that has no [00:51:54.850] node yes and Jason with grunt for [00:51:58.960] example one you download it from the App [00:52:01.810] Store how do you start and install grunt [00:52:06.340] so I think that's I think you show that [00:52:10.390] as part of the updating a widget but [00:52:12.520] perhaps we can quickly go through that [00:52:14.740] so through the main steps yeah of course [00:52:19.480] now if you [00:52:23.220] well if you've downloaded a Witcher then [00:52:30.400] you won't have the grunt file and the [00:52:32.770] package are Jason here and so you can [00:52:38.050] install these using the widget generator [00:52:41.350] so like I already showed if I go to now [00:52:56.830] suppose I don't have a grunt file and [00:52:59.650] effects urges and I can just run your [00:53:01.690] Linux from here and it will see that the [00:53:06.190] folder is not empty and it will ask you [00:53:08.710] if you're upgrading which it were [00:53:10.540] pressing yes it will take the name of [00:53:13.360] the widget and the version number of the [00:53:15.340] widget and then it will try to it will [00:53:21.100] will put package star Jason and the the [00:53:25.900] grunt file there so that's that but if [00:53:32.770] you have downloaded widget here's the [00:53:35.830] thing a widget is has a dot m PK [00:53:41.410] extension but basically this is a zip [00:53:44.890] archive so if I rename this to dot zip [00:53:51.420] and I change it now I have a zip folder [00:53:54.400] and if I open this there you go so you [00:53:57.700] can unpack this these files into a a dot [00:54:02.410] SRC folder and then run your widget [00:54:07.270] generator in the your root folder and [00:54:09.250] there you have it then you can start [00:54:11.980] developing or editing an existing widget [00:54:17.350] that you downloaded from the from from [00:54:19.240] the App Store all right [00:54:23.830] perfect thank you very much for the for [00:54:25.210] the answer do we have any more questions [00:54:28.110] if not we will be rounding up and all [00:54:36.100] the questions and answers will be posted [00:54:38.470] on the website afterwards and we'll be [00:54:41.290] sure to post that on Twitter and on the [00:54:44.470] mendax forum so that concludes the [00:54:48.280] webinar for today thank you all very [00:54:50.260] much for attending and don't forget to [00:54:52.450] fill out the survey afterwards see you [00:54:54.970] at the next web