Search code examples
c#kendo-uitelerikasp.net-core-mvckendo-scheduler

How to load resource from different Controller and and change it when user click in tab nav Telerik Scheduler UI?


I am trying to find a way to load Rooms into Resources section in Telerik Scheduler UI. The Scheduler UI is bound to theMeeting Model where a user can book rooms for meeting from the Room. What I am trying to do is find a way to bind resources "Rooms" from another controller and Model and How to change the resource when user select deferent office

From View

 <div class="row">
        <div class="col-md-12">
            <ul class="nav nav-tabs" id="officeTab"><li><a class="office" href="#" data-value="3">London</a></li><li><a class="office" href="#" data-value="5">Hanover</a></li><li><a class="office" href="#" data-value="4">Owen Sound</a></li><li><a class="office" href="#" data-value="1">Seaforth</a></li><li><a class="office" href="#" data-value="6">St. Thomas</a></li><li><a class="office" href="#" data-value="2">Stratford</a></li><li><a class="office" href="#" data-value="8">Woodstock</a></li></ul>
        </div>
    </div>
<div>
    @(Html.Kendo().Scheduler<Meeting>().Name("scheduler").Date(new DateTime(2017, 5, 13))
          .StartTime(new DateTime(2017, 5, 13, 7, 00, 00))
          .Editable(true)
          .Views(views =>
          {
              views.DayView();
              views.AgendaView();
          })
          .Height(600)
          .Timezone("Etc/UTC")
          .Group(group => { group.Resources("Rooms"); group.Date(true); })
          .Resources(resource =>
          {
              resource.Add(m => m.RoomId)
              .Title("Room")
              .Name("Rooms")
              .DataTextField("Text")
              .DataValueField("Value")
              .DataColorField("Color")
              .DataSource(d => d.Read("Get", "Room"));
          }).DataSource(d => d
              .WebApi()
              .Model(m =>
              {
                  m.Id(f => f.RecordId);
                  m.Field(f => f.Title).DefaultValue("No title");
                  m.Field(f => f.Title).DefaultValue("No title");
              })
              .Events(events => events.Error("error_handler"))
              .Read(read => read.Action("Get", "Meeting"))
              .Create(create => create.Action("Post", "Meeting"))
              .Destroy(destroy => destroy.Action("Delete", "Meeting", new { recordId = "{0}" }))
              .Update(update => update.Action("Put", "Meeting", new { recordId = "{0}" }))
          ).Deferred())


    @section scripts {
        @Html.Kendo().DeferredScripts()
    }
    <script>
        function error_handler(e) {
            var errors = $.parseJSON(e.xhr.responseText);

            if (errors) {
                alert("Errors:\n" + errors.join("\n"));
            }
        }
    </script> 
</div>

//MeetingController

using Kendo.Mvc.Extensions;
using Kendo.Mvc.UI;
using Microsoft.AspNetCore.Mvc;
using RoomBooking.Application.Couties.Queries;
using RoomBooking.Application.Rooms.Queries;
using RoomBooking.Domain;

namespace RoomBooking.Presentation.Controllers
{
    [Route("api/v1/[controller]")]
    public class MeetingController : Controller
    {
        [HttpGet]
        public DataSourceResult Get([DataSourceRequest]DataSourceRequest request)
        {
            //return meetingData.GetAll().ToDataSourceResult(request);
            return this.meetingService.GetAll().ToDataSourceResult(request); ;
        }


        public MeetingController(ISchedulerEventService<MeetingModel> meetingService, ISchedulerEventService<ListRoomModel> resourcesService)
        {
            this.meetingService = meetingService;
            this.resourcesService = resourcesService;
        }
        private readonly ISchedulerEventService<MeetingModel> meetingService;
        private readonly ISchedulerEventService<ListRoomModel> resourcesService;
    }
}

//RoomController

using Kendo.Mvc.Extensions;
using Kendo.Mvc.UI;
using Microsoft.AspNetCore.Mvc;
using RoomBooking.Application.Couties.Queries;
using RoomBooking.Application.Rooms.Queries;
using RoomBooking.Domain;


namespace RoomBooking.Presentation.Controllers
{
    [Route("api/v1/[controller]")]
    public class RoomController : Controller
    {
        [HttpGet]
        public DataSourceResult Get([DataSourceRequest]DataSourceRequest request)
        {
            //return meetingData.GetAll().ToDataSourceResult(request);
            //return this.getRoomsListQuery.Execute().ToDataSourceResult(request);
            var result =  this.resourcesService.GetAll().ToDataSourceResult(request);
            return result;
        }

        public RoomController(ISchedulerEventService<ListRoomModel> resourcesService)
        {
            this.resourcesService = resourcesService;
        }

    private readonly ISchedulerEventService<ListRoomModel> resourcesService;
    }
}

Solution

  • I found how to load Items into Resources using this example from asp.net MVC you can use the same method in asp.net core the link https://github.com/telerik/ui-for-aspnet-mvc-examples/tree/master/scheduler/scheduler-resource-editing

    @using Kendo.Mvc.UI
    @using Kendo.Mvc.UI.Fluent
    @using RoomBooking.Domain
    @{
        ViewData["Title"] = "Home Page";
    }
    
    
    <div class="row">
        <div class="col-md-12">
            <ul id="officeTab" class="nav nav-tabs"></ul>
        </div>
    
    </div>
    
    <div>
        @(Html.Kendo().Scheduler<Meeting>().Name("scheduler").Date(new DateTime(2017, 5, 13))
              .StartTime(new DateTime(2017, 5, 13, 7, 00, 00))
              .Editable(true)
              .Views(views =>
              {
                  views.DayView();
                  views.AgendaView();
              })
              .Height(600)
              .Timezone("Etc/UTC")
              .Group(group => { group.Resources("Rooms"); group.Date(true); })
              .Resources(resource =>
              {
                  //resource.Add(m => m.RoomId).Title("Room").Name("Rooms").DataTextField("Text").DataValueField("Value").DataColorField("Color").BindTo(new[]
                  //{
                  //    new {Text = "Meeting Room 101", Value = 1, Color = "#6eb3fa"},
                  //    new {Text = "Meeting Room 201", Value = 2, Color = "#f58a8a"}
                  //});
                  resource.Add(m => m.RoomId)
                     .Title("Room")
                     .Name("Rooms")
                     .DataTextField("Text")
                     .DataSource(
                         ds => ds.Custom()
                         .Type("aspnetmvc-ajax")
                         .Transport(t => t.Read(r =>
                        r.Action("readRoom", "Room")))
                        .Schema(s => s.Data("Data").Total("Total").Errors("Errors").Model(m =>
                        {
                            m.Id("Value");
                            m.Field("Value", typeof(int));
                            m.Field("Text", typeof(string));
                            m.Field("Color", typeof(string));
                        })
                        ));
              })
              .DataSource(d => d
                  .WebApi()
                  .Model(m =>
                  {
                      m.Id(f => f.RecordId);
                      m.Field(f => f.Title).DefaultValue("No title");
                      m.Field(f => f.Title).DefaultValue("No title");
                  })
                  .Events(events => events.Error("error_handler"))
                  .Read(read => read.Action("Get", "Meeting"))
                  .Create(create => create.Action("Post", "Meeting"))
                  .Destroy(destroy => destroy.Action("Delete", "Meeting", new { recordId = "{0}" }))
                  .Update(update => update.Action("Put", "Meeting", new { recordId = "{0}" }))
              ).Deferred())
    
    
        @section scripts {
            @Html.Kendo().DeferredScripts()
        }
        <script>
            function error_handler(e) {
                var errors = $.parseJSON(e.xhr.responseText);
    
                if (errors) {
                    alert("Errors:\n" + errors.join("\n"));
                }
            }
        </script>
    
    </div>