{"id":3485,"date":"2016-05-11T13:52:27","date_gmt":"2016-05-11T09:52:27","guid":{"rendered":"http:\/\/dhtmlx.com\/blog\/?p=3485"},"modified":"2023-05-05T13:21:46","modified_gmt":"2023-05-05T10:21:46","slug":"using-scheduler-scalatra-framework-mongodb","status":"publish","type":"post","link":"https:\/\/dhtmlx.com\/blog\/using-scheduler-scalatra-framework-mongodb\/","title":{"rendered":"Using Scheduler with Scalatra Framework and MongoDB"},"content":{"rendered":"<p>Today we&#8217;ll show you the way of using <a href=\"https:\/\/dhtmlx.com\/docs\/products\/dhtmlxScheduler\/\">JavaScript Scheduling Calendar<\/a> with <a href=\"https:\/\/scalatra.org\/\" target=\"_blank\">Scalatra Web Framework<\/a>. Scalatra is a free and open source web application framework written in <a href=\"https:\/\/en.wikipedia.org\/wiki\/Scala_(programming_language)\" target=\"_blank\">Scala<\/a>. To install it, please follow the instructions you could find <a href=\"https:\/\/scalatra.org\/getting-started\/installation.html\" target=\"_blank\">here<\/a>. When installation is completed, we can start.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2016\/05\/scheduler-with-scalatra.jpg\" alt=\"scheduler with scalatra\" width=\"600\" height=\"400\" class=\"aligncenter size-full wp-image-3326\" \/><\/p>\n<p>The demo is available on GitHub, so you&#8217;re welcome to <a href=\"https:\/\/github.com\/DHTMLX\/scheduler-scalatra-mongo\">check it right now<\/a>.<br \/>\n<!--more--><\/p>\n<h3><b>Step 1: Create a new scalatra app<\/b><\/h3>\n<p><\/p>\n<p>Open a folder where you want to create a new project and run the following command:<\/p>\n<div class=\"codecolorer-container scala default codecolorer-noborder\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"scala codecolorer\">g8 scalatra\/scalatra-sbt<\/div><\/div>\n<p>There will be some questions about the application, so you need to fill them out and then you may continue. As a result, we should get something like this:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2016\/05\/1.png\" alt=\"scalatra app\" width=\"597\" height=\"343\" class=\"aligncenter size-full wp-image-3318\" \/><\/p>\n<p>Now, let&#8217;s go to the app directory and make sure that it works.<\/p>\n<div class=\"codecolorer-container scala default codecolorer-noborder\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"scala codecolorer\">cd scheduler-scala<br \/>\nsbt<br \/>\njetty<span class=\"sy0\">:<\/span>start<\/div><\/div>\n<p>To open the page, call &#8220;browse&#8221; command in the console or open <strong>http:\/\/127.0.0.1:8080<\/strong> in a browser. We should get the Hello World app to proceed to the next steps.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2016\/05\/0.png\" alt=\"hello world\" width=\"600\" height=\"404\" class=\"aligncenter size-full wp-image-3319\" \/><\/p>\n<p>Got it? Great! Let&#8217;s move on. <\/p>\n<p>We can\u2019t proceed without Scheduler, so it&#8217;s high time to <a href=\"https:\/\/dhtmlx.com\/docs\/products\/dhtmlxScheduler\/download.shtml\" target=\"_blank\">download it<\/a>. Now we can open <em>scheduler-scala\\src\\main\\webapp<\/em>, create <em>dhtmlxScheduler<\/em> folder and unpack the scheduler codebase content to it:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2016\/05\/2.png\" alt=\"scheduler and scala\" width=\"600\" height=\"300\" class=\"aligncenter size-full wp-image-3320\" \/><\/p>\n<p>Then open <em>scheduler-scala\\src\\main\\webapp\\WEB-INF\\templates\\views<\/em> and create <em>index.jade<\/em> file with the following content:<\/p>\n<div class=\"codecolorer-container scala default codecolorer-noborder\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"scala codecolorer\">- attributes<span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;title&quot;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"sy0\">=<\/span> <span class=\"st0\">&quot;Scheduler Sample&quot;<\/span><br \/>\nscript<span class=\"br0\">&#40;<\/span><span class=\"kw1\">type<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">'text\/javascript'<\/span> src<span class=\"sy0\">=<\/span><span class=\"st0\">'\/dhtmlxScheduler\/dhtmlxscheduler.js'<\/span><span class=\"br0\">&#41;<\/span><br \/>\nlink<span class=\"br0\">&#40;<\/span>rel<span class=\"sy0\">=<\/span><span class=\"st0\">'stylesheet'<\/span> href<span class=\"sy0\">=<\/span><span class=\"st0\">'\/dhtmlxScheduler\/dhtmlxscheduler.css'<\/span><span class=\"br0\">&#41;<\/span><br \/>\n<br \/>\n<span class=\"sy0\">#<\/span>scheduler<span class=\"sy0\">_<\/span>here.<span class=\"me1\">dhx_cal_container<\/span><span class=\"br0\">&#40;<\/span>style<span class=\"sy0\">=<\/span><span class=\"st0\">'width: 100%; height: 700px'<\/span><span class=\"br0\">&#41;<\/span><br \/>\n&nbsp; &nbsp; .<span class=\"me1\">dhx_cal_navline<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; .<span class=\"me1\">dhx_cal_prev_button<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; .<span class=\"me1\">dhx_cal_next_button<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; .<span class=\"me1\">dhx_cal_today_button<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; .<span class=\"me1\">dhx_cal_date<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; .<span class=\"me1\">dhx_cal_tab<\/span><span class=\"br0\">&#40;<\/span>name<span class=\"sy0\">=<\/span><span class=\"st0\">'day_tab'<\/span><span class=\"br0\">&#41;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; .<span class=\"me1\">dhx_cal_tab<\/span><span class=\"br0\">&#40;<\/span>name<span class=\"sy0\">=<\/span><span class=\"st0\">'week_tab'<\/span><span class=\"br0\">&#41;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; .<span class=\"me1\">dhx_cal_tab<\/span><span class=\"br0\">&#40;<\/span>name<span class=\"sy0\">=<\/span><span class=\"st0\">'month_tab'<\/span><span class=\"br0\">&#41;<\/span><br \/>\n&nbsp; &nbsp; .<span class=\"me1\">dhx_cal_header<\/span><br \/>\n&nbsp; &nbsp; .<span class=\"me1\">dhx_cal_data<\/span><br \/>\n<br \/>\nscript<br \/>\n&nbsp; &nbsp; |scheduler.<span class=\"me1\">config<\/span>.<span class=\"me1\">xml_date<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;%Y-%m-%d %H:%i:%s&quot;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; |scheduler.<span class=\"me1\">init<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;scheduler_here&quot;<\/span>,<span class=\"kw1\">new<\/span> Date<span class=\"br0\">&#40;<\/span><span class=\"nu0\">2016<\/span>,<span class=\"nu0\">3<\/span>,<span class=\"nu0\">18<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; |scheduler.<span class=\"me1\">load<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;\/data&quot;<\/span>, <span class=\"st0\">&quot;json&quot;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; |<span class=\"kw1\">var<\/span> dp <span class=\"sy0\">=<\/span> <span class=\"kw1\">new<\/span> dataProcessor<span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;\/data\/&quot;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; |dp.<span class=\"me1\">init<\/span><span class=\"br0\">&#40;<\/span>scheduler<span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; |dp.<span class=\"me1\">setTransactionMode<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;REST&quot;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><\/div><\/div>\n<p>That&#8217;s how we&#8217;re creating a simple page layout for scheduler and adding required scripts and styles from scheduler codebase. We also need to initialize &#8220;\/data&#8221; url as a datasource for the calendar. We&#8217;ll add the handlers to the server side later.<\/p>\n<p>Now open <em>scheduler-scala\\src\\main\\scala\\com\\scheduler\\app\\SchedulerServlet.scala<\/em> and replace this part:<\/p>\n<div class=\"codecolorer-container scala default codecolorer-noborder\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"scala codecolorer\">&nbsp;get<span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;\/&quot;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp;<span class=\"sy0\">&lt;<\/span>html<span class=\"sy0\">&gt;<\/span><br \/>\n&nbsp; &nbsp; &nbsp;<span class=\"sy0\">&lt;<\/span>body<span class=\"sy0\">&gt;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp;<span class=\"sy0\">&lt;<\/span>h1<span class=\"sy0\">&gt;<\/span>Hello, world<span class=\"sy0\">!&lt;<\/span>\/h1<span class=\"sy0\">&gt;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp;Say <span class=\"sy0\">&lt;<\/span>a href<span class=\"sy0\">=<\/span><span class=\"st0\">&quot;hello-scalate&quot;<\/span><span class=\"sy0\">&gt;<\/span>hello to Scalate<span class=\"sy0\">&lt;<\/span>\/a<span class=\"sy0\">&gt;<\/span>.<br \/>\n&nbsp; &nbsp; &nbsp;<span class=\"sy0\">&lt;<\/span>\/body<span class=\"sy0\">&gt;<\/span><br \/>\n&nbsp; &nbsp;<span class=\"sy0\">&lt;<\/span>\/html<span class=\"sy0\">&gt;<\/span><br \/>\n&nbsp;<span class=\"br0\">&#125;<\/span><\/div><\/div>\n<p>By this one:<\/p>\n<div class=\"codecolorer-container scala default codecolorer-noborder\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"scala codecolorer\">get<span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;\/&quot;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp;contentType <span class=\"sy0\">=<\/span> <span class=\"st0\">&quot;text\/html&quot;<\/span><br \/>\n&nbsp; &nbsp;jade<span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;\/index&quot;<\/span><span class=\"br0\">&#41;<\/span><br \/>\n&nbsp;<span class=\"br0\">&#125;<\/span><\/div><\/div>\n<p>As you can see, we start using <em>index.jade<\/em> as the main app page. If everything is done correctly in the previous steps, we should see an empty scheduler when we start the app:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2016\/05\/3.png\" alt=\"scheduler with scalatra\" width=\"600\" height=\"432\" class=\"aligncenter size-full wp-image-3321\" \/><\/p>\n<p>All the fundamental preparations are done, so we can move to the next step and load our scheduler app with data. <\/p>\n<h3><b>Step 2: Data loading<\/b><\/h3>\n<p><\/p>\n<p>First of all, we need to add route handlers for data loading. For this, open <em>scheduler-scala\\project\\build.scala<\/em> and add the following dependency to libraryDependencies:<\/p>\n<div class=\"codecolorer-container scala default codecolorer-noborder\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"scala codecolorer\"><span class=\"st0\">&quot;org.mongodb&quot;<\/span> <span class=\"sy0\">%%<\/span> <span class=\"st0\">&quot;casbah&quot;<\/span> <span class=\"sy0\">%<\/span> <span class=\"st0\">&quot;2.7.2&quot;<\/span><\/div><\/div>\n<p>As a result, we get the following:<\/p>\n<div class=\"codecolorer-container scala default codecolorer-noborder\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"scala codecolorer\">libraryDependencies ++<span class=\"sy0\">=<\/span> Seq<span class=\"br0\">&#40;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp;<span class=\"st0\">&quot;org.mongodb&quot;<\/span> <span class=\"sy0\">%%<\/span> <span class=\"st0\">&quot;casbah&quot;<\/span> <span class=\"sy0\">%<\/span> <span class=\"st0\">&quot;2.7.2&quot;<\/span>,<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp;<span class=\"st0\">&quot;org.scalatra&quot;<\/span> <span class=\"sy0\">%%<\/span> <span class=\"st0\">&quot;scalatra&quot;<\/span> <span class=\"sy0\">%<\/span> ScalatraVersion,<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp;<span class=\"st0\">&quot;org.scalatra&quot;<\/span> <span class=\"sy0\">%%<\/span> <span class=\"st0\">&quot;scalatra-scalate&quot;<\/span> <span class=\"sy0\">%<\/span> ScalatraVersion,<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp;<span class=\"st0\">&quot;org.scalatra&quot;<\/span> <span class=\"sy0\">%%<\/span> <span class=\"st0\">&quot;scalatra-specs2&quot;<\/span> <span class=\"sy0\">%<\/span> ScalatraVersion <span class=\"sy0\">%<\/span> <span class=\"st0\">&quot;test&quot;<\/span>,<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp;<span class=\"st0\">&quot;ch.qos.logback&quot;<\/span> <span class=\"sy0\">%<\/span> <span class=\"st0\">&quot;logback-classic&quot;<\/span> <span class=\"sy0\">%<\/span> <span class=\"st0\">&quot;1.1.5&quot;<\/span> <span class=\"sy0\">%<\/span> <span class=\"st0\">&quot;runtime&quot;<\/span>,<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp;<span class=\"st0\">&quot;org.eclipse.jetty&quot;<\/span> <span class=\"sy0\">%<\/span> <span class=\"st0\">&quot;jetty-webapp&quot;<\/span> <span class=\"sy0\">%<\/span> <span class=\"st0\">&quot;9.2.15.v20160210&quot;<\/span> <span class=\"sy0\">%<\/span> <span class=\"st0\">&quot;container&quot;<\/span>,<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp;<span class=\"st0\">&quot;javax.servlet&quot;<\/span> <span class=\"sy0\">%<\/span> <span class=\"st0\">&quot;javax.servlet-api&quot;<\/span> <span class=\"sy0\">%<\/span> <span class=\"st0\">&quot;3.1.0&quot;<\/span> <span class=\"sy0\">%<\/span> <span class=\"st0\">&quot;provided&quot;<\/span><br \/>\n&nbsp; &nbsp; &nbsp;<span class=\"br0\">&#41;<\/span>,<\/div><\/div>\n<p>Open scheduler-scala\\src\\main\\scala\\ScalatraBootstrap.scala and put following code:<\/p>\n<div class=\"codecolorer-container scala default codecolorer-noborder\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"scala codecolorer\"><span class=\"kw1\">import<\/span> com.<span class=\"me1\">mongodb<\/span>.<span class=\"me1\">casbah<\/span>.<span class=\"me1\">Imports<\/span>.<span class=\"sy0\">_<\/span><br \/>\n<span class=\"kw1\">import<\/span> com.<span class=\"me1\">scheduler<\/span>.<span class=\"me1\">app<\/span>.<span class=\"sy0\">_<\/span><br \/>\n<span class=\"kw1\">import<\/span> org.<span class=\"me1\">scalatra<\/span>.<span class=\"sy0\">_<\/span><br \/>\n<span class=\"kw1\">import<\/span> javax.<span class=\"me1\">servlet<\/span>.<span class=\"me1\">ServletContext<\/span><br \/>\n<span class=\"kw1\">import<\/span> com.<span class=\"me1\">mongodb<\/span>.<span class=\"me1\">casbah<\/span>.<span class=\"me1\">commons<\/span>.<span class=\"me1\">conversions<\/span>.<span class=\"me1\">scala<\/span>.<span class=\"br0\">&#123;<\/span>RegisterConversionHelpers, RegisterJodaTimeConversionHelpers<span class=\"br0\">&#125;<\/span><br \/>\n<br \/>\n<br \/>\n<span class=\"kw1\">class<\/span> ScalatraBootstrap <span class=\"kw1\">extends<\/span> LifeCycle <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; <span class=\"kw1\">override<\/span> <span class=\"kw1\">def<\/span> init<span class=\"br0\">&#40;<\/span>context<span class=\"sy0\">:<\/span> ServletContext<span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; RegisterConversionHelpers<span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><br \/>\n&nbsp; &nbsp; RegisterJodaTimeConversionHelpers<span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">val<\/span> mongoClient <span class=\"sy0\">=<\/span> MongoClient<span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">val<\/span> mongoColl <span class=\"sy0\">=<\/span> mongoClient<span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;scheduler&quot;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;events&quot;<\/span><span class=\"br0\">&#41;<\/span><br \/>\n<br \/>\n&nbsp; &nbsp; context.<span class=\"me1\">mount<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw1\">new<\/span> SchedulerServlet<span class=\"br0\">&#40;<\/span>mongoColl<span class=\"br0\">&#41;<\/span>, <span class=\"st0\">&quot;\/*&quot;<\/span><span class=\"br0\">&#41;<\/span><br \/>\n&nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><\/div><\/div>\n<p>Here we have created connection to MongoDB, got the link to MongoDB collection and passed it to our controller (with the mongoColl variable).<\/p>\n<p>Since we&#8217;ve passed a collection into the controller, we need to modify its signature and add the necessary parameter into it. So open scheduler-scala\\src\\main\\scala\\com\\scheduler\\app\\SchedulerServlet.scala and put following code:<\/p>\n<div class=\"codecolorer-container scala default codecolorer-noborder\" style=\"overflow:auto;white-space:nowrap;height:600px;\"><div class=\"scala codecolorer\"><span class=\"kw1\">package<\/span> com.<span class=\"me1\">scheduler<\/span>.<span class=\"me1\">app<\/span><br \/>\n<br \/>\n<span class=\"kw1\">import<\/span> java.<span class=\"me1\">text<\/span>.<span class=\"me1\">SimpleDateFormat<\/span><br \/>\n<span class=\"kw1\">import<\/span> java.<span class=\"me1\">util<\/span>.<span class=\"me1\">Date<\/span><br \/>\n<br \/>\n<span class=\"kw1\">import<\/span> com.<span class=\"me1\">mongodb<\/span>.<span class=\"me1\">casbah<\/span>.<span class=\"me1\">Imports<\/span>.<span class=\"sy0\">_<\/span><br \/>\n<span class=\"kw1\">import<\/span> org.<span class=\"me1\">joda<\/span>.<span class=\"me1\">time<\/span>.<span class=\"me1\">DateTime<\/span><br \/>\n<span class=\"kw1\">import<\/span> org.<span class=\"me1\">joda<\/span>.<span class=\"me1\">time<\/span>.<span class=\"me1\">format<\/span>.<span class=\"me1\">DateTimeFormat<\/span><br \/>\n<br \/>\n<span class=\"kw1\">class<\/span> SchedulerServlet<span class=\"br0\">&#40;<\/span>mongoColl<span class=\"sy0\">:<\/span> MongoCollection<span class=\"br0\">&#41;<\/span> <span class=\"kw1\">extends<\/span> SchedulerscalaStack <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; <span class=\"kw1\">var<\/span> dateFormat <span class=\"sy0\">=<\/span> DateTimeFormat.<span class=\"me1\">forPattern<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;yyyy-MM-dd HH:mm:ss&quot;<\/span><span class=\"br0\">&#41;<\/span><br \/>\n<br \/>\n&nbsp; <span class=\"kw1\">def<\/span> getEvent<span class=\"br0\">&#40;<\/span>params<span class=\"sy0\">:<\/span> Map<span class=\"br0\">&#91;<\/span>String, String<span class=\"br0\">&#93;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">:<\/span> MongoDBObject <span class=\"sy0\">=<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; MongoDBObject<span class=\"br0\">&#40;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; <span class=\"st0\">&quot;text&quot;<\/span> -<span class=\"sy0\">&gt;<\/span> params<span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;text&quot;<\/span><span class=\"br0\">&#41;<\/span>,<br \/>\n&nbsp; &nbsp; &nbsp; <span class=\"st0\">&quot;start_date&quot;<\/span> -<span class=\"sy0\">&gt;<\/span> dateFormat.<span class=\"me1\">parseDateTime<\/span><span class=\"br0\">&#40;<\/span>params<span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;start_date&quot;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span>,<br \/>\n&nbsp; &nbsp; &nbsp; <span class=\"st0\">&quot;end_date&quot;<\/span> -<span class=\"sy0\">&gt;<\/span> dateFormat.<span class=\"me1\">parseDateTime<\/span><span class=\"br0\">&#40;<\/span>params<span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;end_date&quot;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#41;<\/span><br \/>\n&nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n<br \/>\n&nbsp; get<span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;\/&quot;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; contentType <span class=\"sy0\">=<\/span> <span class=\"st0\">&quot;text\/html&quot;<\/span><br \/>\n&nbsp; &nbsp; jade<span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;\/index&quot;<\/span><span class=\"br0\">&#41;<\/span><br \/>\n&nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n<br \/>\n&nbsp; get<span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;\/init&quot;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; mongoColl +<span class=\"sy0\">=<\/span> getEvent<span class=\"br0\">&#40;<\/span>Map<span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;text&quot;<\/span> -<span class=\"sy0\">&gt;<\/span> <span class=\"st0\">&quot;My Test Event A&quot;<\/span>, <span class=\"st0\">&quot;start_date&quot;<\/span> -<span class=\"sy0\">&gt;<\/span> <span class=\"st0\">&quot;2016-04-18 03:00:00&quot;<\/span>, <span class=\"st0\">&quot;end_date&quot;<\/span> -<span class=\"sy0\">&gt;<\/span> <span class=\"st0\">&quot;2016-04-18 11:00:00&quot;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><br \/>\n&nbsp; &nbsp; mongoColl +<span class=\"sy0\">=<\/span> getEvent<span class=\"br0\">&#40;<\/span>Map<span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;text&quot;<\/span> -<span class=\"sy0\">&gt;<\/span> <span class=\"st0\">&quot;My Test Event B&quot;<\/span>, <span class=\"st0\">&quot;start_date&quot;<\/span> -<span class=\"sy0\">&gt;<\/span> <span class=\"st0\">&quot;2016-04-20 07:00:00&quot;<\/span>, <span class=\"st0\">&quot;end_date&quot;<\/span> -<span class=\"sy0\">&gt;<\/span> <span class=\"st0\">&quot;2016-04-20 12:00:00&quot;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><br \/>\n&nbsp; &nbsp; mongoColl +<span class=\"sy0\">=<\/span> getEvent<span class=\"br0\">&#40;<\/span>Map<span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;text&quot;<\/span> -<span class=\"sy0\">&gt;<\/span> <span class=\"st0\">&quot;Friday Event&quot;<\/span>, <span class=\"st0\">&quot;start_date&quot;<\/span> -<span class=\"sy0\">&gt;<\/span> <span class=\"st0\">&quot;2016-04-22 06:00:00&quot;<\/span>, <span class=\"st0\">&quot;end_date&quot;<\/span> -<span class=\"sy0\">&gt;<\/span> <span class=\"st0\">&quot;2016-04-22 15:00:00&quot;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><br \/>\n&nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n<br \/>\n&nbsp; get<span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;\/data&quot;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">val<\/span> evs <span class=\"sy0\">=<\/span> <span class=\"kw1\">for<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; x <span class=\"sy0\">&lt;<\/span>- mongoColl<br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span> <span class=\"kw1\">yield<\/span> MongoDBObject<span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;id&quot;<\/span> -<span class=\"sy0\">&gt;<\/span> x.<span class=\"me1\">get<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;_id&quot;<\/span><span class=\"br0\">&#41;<\/span>.<span class=\"me1\">toString<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span>,<br \/>\n&nbsp; &nbsp; &nbsp; <span class=\"st0\">&quot;text&quot;<\/span> -<span class=\"sy0\">&gt;<\/span> x<span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;text&quot;<\/span><span class=\"br0\">&#41;<\/span>,<br \/>\n&nbsp; &nbsp; &nbsp; <span class=\"st0\">&quot;start_date&quot;<\/span> -<span class=\"sy0\">&gt;<\/span> x.<span class=\"me1\">as<\/span><span class=\"br0\">&#91;<\/span>DateTime<span class=\"br0\">&#93;<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;start_date&quot;<\/span><span class=\"br0\">&#41;<\/span>.<span class=\"me1\">toString<\/span><span class=\"br0\">&#40;<\/span>dateFormat<span class=\"br0\">&#41;<\/span>,<br \/>\n&nbsp; &nbsp; &nbsp; <span class=\"st0\">&quot;end_date&quot;<\/span> -<span class=\"sy0\">&gt;<\/span> x.<span class=\"me1\">as<\/span><span class=\"br0\">&#91;<\/span>DateTime<span class=\"br0\">&#93;<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;end_date&quot;<\/span><span class=\"br0\">&#41;<\/span>.<span class=\"me1\">toString<\/span><span class=\"br0\">&#40;<\/span>dateFormat<span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><br \/>\n<br \/>\n&nbsp; &nbsp; contentType <span class=\"sy0\">=<\/span> <span class=\"st0\">&quot;application\/json&quot;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"st0\">&quot;[%s]&quot;<\/span>.<span class=\"me1\">format<\/span><span class=\"br0\">&#40;<\/span>evs.<span class=\"me1\">mkString<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;,&quot;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><br \/>\n&nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n<br \/>\n<span class=\"br0\">&#125;<\/span><\/div><\/div>\n<p>In the above code we&#8217;ve added the MongoCollection parameter for controller &#8211; SchedulerServlet(mongoColl: MongoCollection) and created the \u201c\/init\u201d and \u201c\/data\u201d handlers.<\/p>\n<p>The &#8220;\/init&#8221; handler is made just to generate some test data for the collection.<br \/>\nThe &#8220;\/data&#8221; handler is intended for loading data into scheduler. It gets all the records from database and sends them to the client side in the JSON format.<\/p>\n<p>As you may remember, we have the following string in our <em>index.jade<\/em>:<\/p>\n<div class=\"codecolorer-container scala default codecolorer-noborder\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"scala codecolorer\">scheduler.<span class=\"me1\">load<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;\/data&quot;<\/span>, <span class=\"st0\">&quot;json&quot;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><\/div><\/div>\n<p>It sends a request to the server to load data to the scheduler in JSON format.<\/p>\n<p>Now we can restart our server and open <strong>http:\/\/127.0.0.1:8080\/init<\/strong>. After this initial data for scheduler should be generated. Then we just need to open <strong>http:\/\/127.0.0.1:8080\/<\/strong> and scheduler with initial events will appear.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2016\/05\/4.png\" alt=\"calendar in scala\" width=\"600\" height=\"344\" class=\"aligncenter size-full wp-image-3322\" \/><\/p>\n<h3><b>Step 3: Adding, editing and deleting data<\/b><\/h3>\n<p><\/p>\n<p>We have a scheduler with events, but it doesn&#8217;t possess any useful features yet. Let&#8217;s provide it with such necessary abilities as adding, deleting and editing data.<\/p>\n<p>Open <em>scheduler-scala\\src\\main\\scala\\com\\scheduler\\app\\SchedulerServlet.scala<\/em> and add the insert, update, and delete handlers. We will also add a function that will get responses.<\/p>\n<p>The resulting code will look like this:<\/p>\n<div class=\"codecolorer-container scala default codecolorer-noborder\" style=\"overflow:auto;white-space:nowrap;height:600px;\"><div class=\"scala codecolorer\"><span class=\"kw1\">package<\/span> com.<span class=\"me1\">scheduler<\/span>.<span class=\"me1\">app<\/span><br \/>\n<br \/>\n<span class=\"kw1\">import<\/span> java.<span class=\"me1\">text<\/span>.<span class=\"me1\">SimpleDateFormat<\/span><br \/>\n<span class=\"kw1\">import<\/span> java.<span class=\"me1\">util<\/span>.<span class=\"me1\">Date<\/span><br \/>\n<br \/>\n<span class=\"kw1\">import<\/span> com.<span class=\"me1\">mongodb<\/span>.<span class=\"me1\">casbah<\/span>.<span class=\"me1\">Imports<\/span>.<span class=\"sy0\">_<\/span><br \/>\n<span class=\"kw1\">import<\/span> org.<span class=\"me1\">joda<\/span>.<span class=\"me1\">time<\/span>.<span class=\"me1\">DateTime<\/span><br \/>\n<span class=\"kw1\">import<\/span> org.<span class=\"me1\">joda<\/span>.<span class=\"me1\">time<\/span>.<span class=\"me1\">format<\/span>.<span class=\"me1\">DateTimeFormat<\/span><br \/>\n<br \/>\n<br \/>\n<span class=\"kw1\">class<\/span> SchedulerServlet<span class=\"br0\">&#40;<\/span>mongoColl<span class=\"sy0\">:<\/span> MongoCollection<span class=\"br0\">&#41;<\/span> <span class=\"kw1\">extends<\/span> SchedulerscalaStack <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp;<span class=\"kw1\">var<\/span> dateFormat <span class=\"sy0\">=<\/span> DateTimeFormat.<span class=\"me1\">forPattern<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;yyyy-MM-dd HH:mm:ss&quot;<\/span><span class=\"br0\">&#41;<\/span><br \/>\n<br \/>\n&nbsp;<span class=\"kw1\">def<\/span> getEvent<span class=\"br0\">&#40;<\/span>params<span class=\"sy0\">:<\/span> Map<span class=\"br0\">&#91;<\/span>String, String<span class=\"br0\">&#93;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">:<\/span> MongoDBObject <span class=\"sy0\">=<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp;MongoDBObject<span class=\"br0\">&#40;<\/span><br \/>\n&nbsp; &nbsp; &nbsp;<span class=\"st0\">&quot;text&quot;<\/span> -<span class=\"sy0\">&gt;<\/span> params<span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;text&quot;<\/span><span class=\"br0\">&#41;<\/span>,<br \/>\n&nbsp; &nbsp; &nbsp;<span class=\"st0\">&quot;start_date&quot;<\/span> -<span class=\"sy0\">&gt;<\/span> dateFormat.<span class=\"me1\">parseDateTime<\/span><span class=\"br0\">&#40;<\/span>params<span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;start_date&quot;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span>,<br \/>\n&nbsp; &nbsp; &nbsp;<span class=\"st0\">&quot;end_date&quot;<\/span> -<span class=\"sy0\">&gt;<\/span> dateFormat.<span class=\"me1\">parseDateTime<\/span><span class=\"br0\">&#40;<\/span>params<span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;end_date&quot;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><br \/>\n&nbsp; &nbsp;<span class=\"br0\">&#41;<\/span><br \/>\n&nbsp;<span class=\"br0\">&#125;<\/span><br \/>\n&nbsp;<br \/>\n&nbsp;<span class=\"kw1\">def<\/span> getResponse<span class=\"br0\">&#40;<\/span>mode<span class=\"sy0\">:<\/span> String, tid<span class=\"sy0\">:<\/span> String<span class=\"br0\">&#41;<\/span><span class=\"sy0\">:<\/span> String <span class=\"sy0\">=<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp;<span class=\"kw1\">var<\/span> response <span class=\"sy0\">=<\/span> Map<span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;type&quot;<\/span> -<span class=\"sy0\">&gt;<\/span> mode<span class=\"br0\">&#41;<\/span><br \/>\n&nbsp; &nbsp;<span class=\"kw1\">if<\/span><span class=\"br0\">&#40;<\/span>tid <span class=\"sy0\">!=<\/span> <span class=\"kw1\">null<\/span><span class=\"br0\">&#41;<\/span> response +<span class=\"sy0\">=<\/span> <span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;tid&quot;<\/span> -<span class=\"sy0\">&gt;<\/span> tid<span class=\"br0\">&#41;<\/span><br \/>\n<br \/>\n&nbsp; &nbsp;<span class=\"st0\">&quot;{%s}&quot;<\/span>.<span class=\"me1\">format<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#40;<\/span>response map <span class=\"br0\">&#123;<\/span><span class=\"kw1\">case<\/span> <span class=\"br0\">&#40;<\/span>k,v<span class=\"br0\">&#41;<\/span> <span class=\"sy0\">=&gt;<\/span> <span class=\"st0\">&quot;&quot;<\/span><span class=\"st0\">&quot;+k+&quot;<\/span><span class=\"st0\">&quot;:&quot;<\/span><span class=\"st0\">&quot;+v+&quot;<\/span><span class=\"st0\">&quot;&quot;<\/span><span class=\"br0\">&#125;<\/span><span class=\"br0\">&#41;<\/span>.<span class=\"me1\">mkString<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;,&quot;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><br \/>\n&nbsp;<span class=\"br0\">&#125;<\/span><br \/>\n<br \/>\n&nbsp;get<span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;\/&quot;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp;contentType <span class=\"sy0\">=<\/span> <span class=\"st0\">&quot;text\/html&quot;<\/span><br \/>\n&nbsp; &nbsp;jade<span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;\/index&quot;<\/span><span class=\"br0\">&#41;<\/span><br \/>\n&nbsp;<span class=\"br0\">&#125;<\/span><br \/>\n<br \/>\n&nbsp;get<span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;\/init&quot;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp;mongoColl +<span class=\"sy0\">=<\/span> getEvent<span class=\"br0\">&#40;<\/span>Map<span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;text&quot;<\/span> -<span class=\"sy0\">&gt;<\/span> <span class=\"st0\">&quot;My Test Event A&quot;<\/span>, <span class=\"st0\">&quot;start_date&quot;<\/span> -<span class=\"sy0\">&gt;<\/span> <span class=\"st0\">&quot;2016-04-18 03:00:00&quot;<\/span>, <span class=\"st0\">&quot;end_date&quot;<\/span> -<span class=\"sy0\">&gt;<\/span> <span class=\"st0\">&quot;2016-04-18 11:00:00&quot;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><br \/>\n&nbsp; &nbsp;mongoColl +<span class=\"sy0\">=<\/span> getEvent<span class=\"br0\">&#40;<\/span>Map<span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;text&quot;<\/span> -<span class=\"sy0\">&gt;<\/span> <span class=\"st0\">&quot;My Test Event B&quot;<\/span>, <span class=\"st0\">&quot;start_date&quot;<\/span> -<span class=\"sy0\">&gt;<\/span> <span class=\"st0\">&quot;2016-04-20 07:00:00&quot;<\/span>, <span class=\"st0\">&quot;end_date&quot;<\/span> -<span class=\"sy0\">&gt;<\/span> <span class=\"st0\">&quot;2016-04-20 12:00:00&quot;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><br \/>\n&nbsp; &nbsp;mongoColl +<span class=\"sy0\">=<\/span> getEvent<span class=\"br0\">&#40;<\/span>Map<span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;text&quot;<\/span> -<span class=\"sy0\">&gt;<\/span> <span class=\"st0\">&quot;Friday Event&quot;<\/span>, <span class=\"st0\">&quot;start_date&quot;<\/span> -<span class=\"sy0\">&gt;<\/span> <span class=\"st0\">&quot;2016-04-22 06:00:00&quot;<\/span>, <span class=\"st0\">&quot;end_date&quot;<\/span> -<span class=\"sy0\">&gt;<\/span> <span class=\"st0\">&quot;2016-04-22 15:00:00&quot;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><br \/>\n&nbsp;<span class=\"br0\">&#125;<\/span><br \/>\n<br \/>\n&nbsp;get<span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;\/data&quot;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp;<span class=\"kw1\">val<\/span> evs <span class=\"sy0\">=<\/span> <span class=\"kw1\">for<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp;x <span class=\"sy0\">&lt;<\/span>- mongoColl<br \/>\n&nbsp; &nbsp;<span class=\"br0\">&#125;<\/span> <span class=\"kw1\">yield<\/span> MongoDBObject<span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;id&quot;<\/span> -<span class=\"sy0\">&gt;<\/span> x.<span class=\"me1\">get<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;_id&quot;<\/span><span class=\"br0\">&#41;<\/span>.<span class=\"me1\">toString<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span>,<br \/>\n&nbsp; &nbsp; &nbsp;<span class=\"st0\">&quot;text&quot;<\/span> -<span class=\"sy0\">&gt;<\/span> x<span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;text&quot;<\/span><span class=\"br0\">&#41;<\/span>,<br \/>\n&nbsp; &nbsp; &nbsp;<span class=\"st0\">&quot;start_date&quot;<\/span> -<span class=\"sy0\">&gt;<\/span> x.<span class=\"me1\">as<\/span><span class=\"br0\">&#91;<\/span>DateTime<span class=\"br0\">&#93;<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;start_date&quot;<\/span><span class=\"br0\">&#41;<\/span>.<span class=\"me1\">toString<\/span><span class=\"br0\">&#40;<\/span>dateFormat<span class=\"br0\">&#41;<\/span>,<br \/>\n&nbsp; &nbsp; &nbsp;<span class=\"st0\">&quot;end_date&quot;<\/span> -<span class=\"sy0\">&gt;<\/span> x.<span class=\"me1\">as<\/span><span class=\"br0\">&#91;<\/span>DateTime<span class=\"br0\">&#93;<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;end_date&quot;<\/span><span class=\"br0\">&#41;<\/span>.<span class=\"me1\">toString<\/span><span class=\"br0\">&#40;<\/span>dateFormat<span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><br \/>\n<br \/>\n&nbsp; &nbsp;contentType <span class=\"sy0\">=<\/span> <span class=\"st0\">&quot;application\/json&quot;<\/span><br \/>\n&nbsp; &nbsp;<span class=\"st0\">&quot;[%s]&quot;<\/span>.<span class=\"me1\">format<\/span><span class=\"br0\">&#40;<\/span>evs.<span class=\"me1\">mkString<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;,&quot;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><br \/>\n&nbsp;<span class=\"br0\">&#125;<\/span><br \/>\n<br \/>\n&nbsp; post<span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;\/data\/:id&quot;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp;<span class=\"kw1\">val<\/span> newEvent<span class=\"sy0\">:<\/span>MongoDBObject <span class=\"sy0\">=<\/span> getEvent<span class=\"br0\">&#40;<\/span>params<span class=\"br0\">&#41;<\/span><br \/>\n<br \/>\n&nbsp; &nbsp;mongoColl +<span class=\"sy0\">=<\/span> newEvent<br \/>\n&nbsp; &nbsp;contentType <span class=\"sy0\">=<\/span> <span class=\"st0\">&quot;application\/json&quot;<\/span><br \/>\n&nbsp; &nbsp;getResponse<span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;inserted&quot;<\/span>, newEvent<span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;_id&quot;<\/span><span class=\"br0\">&#41;<\/span>.<span class=\"me1\">toString<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><br \/>\n&nbsp;<span class=\"br0\">&#125;<\/span><br \/>\n<br \/>\n&nbsp;put<span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;\/data\/:id&quot;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp;<span class=\"kw1\">val<\/span> query <span class=\"sy0\">=<\/span> MongoDBObject<span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;_id&quot;<\/span> -<span class=\"sy0\">&gt;<\/span> <span class=\"kw1\">new<\/span> ObjectId<span class=\"br0\">&#40;<\/span>params<span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;id&quot;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><br \/>\n&nbsp; &nbsp;<span class=\"kw1\">val<\/span> event<span class=\"sy0\">:<\/span>MongoDBObject <span class=\"sy0\">=<\/span> getEvent<span class=\"br0\">&#40;<\/span>params<span class=\"br0\">&#41;<\/span><br \/>\n&nbsp; &nbsp;mongoColl.<span class=\"me1\">findAndModify<\/span><span class=\"br0\">&#40;<\/span>query, event<span class=\"br0\">&#41;<\/span><br \/>\n&nbsp; &nbsp;contentType <span class=\"sy0\">=<\/span> <span class=\"st0\">&quot;application\/json&quot;<\/span><br \/>\n&nbsp; &nbsp;getResponse<span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;updated&quot;<\/span>, <span class=\"kw1\">null<\/span><span class=\"br0\">&#41;<\/span><br \/>\n&nbsp;<span class=\"br0\">&#125;<\/span><br \/>\n<br \/>\n&nbsp;delete<span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;\/data\/:id&quot;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp;<span class=\"kw1\">val<\/span> query <span class=\"sy0\">=<\/span> MongoDBObject<span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;_id&quot;<\/span> -<span class=\"sy0\">&gt;<\/span> <span class=\"kw1\">new<\/span> ObjectId<span class=\"br0\">&#40;<\/span>params<span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;id&quot;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><br \/>\n&nbsp; &nbsp;mongoColl.<span class=\"me1\">remove<\/span><span class=\"br0\">&#40;<\/span>query<span class=\"br0\">&#41;<\/span><br \/>\n&nbsp; &nbsp;contentType <span class=\"sy0\">=<\/span> <span class=\"st0\">&quot;application\/json&quot;<\/span><br \/>\n&nbsp; &nbsp;getResponse<span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;deleted&quot;<\/span>, <span class=\"kw1\">null<\/span><span class=\"br0\">&#41;<\/span><br \/>\n&nbsp;<span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><\/div><\/div>\n<p>When we restart the server and open <strong>http:\/\/127.0.0.1:8080<\/strong> in browser again, our calendar will be able to create, edit and delete events. What is more, now all the changes will be automatically saved in the database and won\u2019t disappear after reloading the page.<\/p>\n<p>The demo is available on GitHub, so you&#8217;re welcome to <a href=\"https:\/\/github.com\/DHTMLX\/scheduler-scalatra-mongo\">check it right now<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Today we&#8217;ll show you the way of using JavaScript Scheduling Calendar with Scalatra Web Framework. Scalatra is a free and open source web application framework written in Scala. To &#8230;<\/p>\n","protected":false},"author":2,"featured_media":3486,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[17,71,1,38],"tags":[33,14,50,15],"class_list":["post-3485","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-posts-for-codeproject-com","category-tutorials","category-uncategorized","category-visible","tag-all-posts","tag-tips","tag-scala","tag-dhtmlxscheduler"],"_links":{"self":[{"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/posts\/3485","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/comments?post=3485"}],"version-history":[{"count":4,"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/posts\/3485\/revisions"}],"predecessor-version":[{"id":10672,"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/posts\/3485\/revisions\/10672"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/media\/3486"}],"wp:attachment":[{"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/media?parent=3485"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/categories?post=3485"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/tags?post=3485"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}