2016-06-22 8 views
2

У меня есть планировщик и выпадающее меню в дневнике. Планировщик конфигурируется как таковой:фильтрация kendo ui scheduler

 $("#scheduler").kendoScheduler({ 
      date : Date.now(), 
      workDayStart: new Date("2015/1/1 08:00 AM"), 
      workDayEnd: new Date("2015/1/1 8:00 PM"), 
      dateHeaderTemplate: kendo.template("<strong>#=kendo.toString(date, 'ddd dd/M')#</strong>"), 
      majorTimeHeaderTemplate: kendo.template("<strong>#=kendo.toString(date, 'HH')#</strong><sup>00</sup>"), 
      minorTimeHeaderTemplate: kendo.template("<strong>#=kendo.toString(date, 'HH')#</strong><sup>#=kendo.toString(date, 'mm')#</sup>"), 
      selectable: true, 
      messages: { 
       ariaSlotLabel: "Selected from {0:g} to {0:g}", 
       showWorkDay: "Show core work hours" 
      }, 
      editable: { 
       window: { 
        title: "Work Request Details", 
        width: "800px" 
       }, 
       template: $("#customEditorTemplate").html() 
      }, 
      edit: function (e) { 
       //set the start end datetime 
       if (e.event.isNew && e.event.id == -1) { 
        var startDtp = e.container.find("[name=start][data-role=datetimepicker]"); 
        var endDtp = e.container.find("[name=end][data-role=datetimepicker]"); 
        var setStartDate = e.event.start; 
        var setEndDate = e.event.end; 
        setStartDate.setHours(8); 
        setEndDate.setHours(-6); // by default the end date is midnight on the following day of the selected cell so we subtract 6h to get 18:00 on the selected date. 
        $(startDtp).data("kendoDateTimePicker").value(setStartDate); //set start date to the selected cell start date and time 08:00 
        $(endDtp).data("kendoDateTimePicker").value(setEndDate); //set enddate to the selected cell end date and time 18:00 
       } 

       var recurrenceEditor = e.container.find("[data-role=recurrenceeditor]").data("kendoRecurrenceEditor"); 
       //set start option value, used to define the week 'Repeat on' selected checkboxes 
       recurrenceEditor.setOptions({ 
       start: new Date(e.event.start) 
       }); 
      }, 
      eventTemplate: $("#eventTemplate").html(), 
      height: 550, 
      messages: { 
       allDay: "Anytime" 
      }, 
      views: [ 
       { type: "day", allDaySlot: true}, 
       { type: "week", eventHeight: 80 }, 
       { type: "timeline", eventHeight: 80 }, 
       { type: "timelineWeek", selected: true, majorTick: 1440, minorTickCount: 1, eventHeight: 80 }, 
       { type: "agenda" }, 
       { type: "month", eventHeight: 80 } 
      ], 
      timezone: "Etc/UTC", 
      selectable: true, 
      dataSource: { 
       parameterMap: function parameterMap(data, type) { 
        console.log(type); 
        if (type === "read") { 
         //var reqFilter = wRequestFilter.value(); 
         var reqFilter = 'ALL' 
         console.log(reqFilter); 
         if (reqFilter == "MY") { 
          data.filter = { logic: "and", filters: [{ field: "diary", operator: "eq", value: 'UIS' }, { field: "AssigneeID", operator: "eq", value: 1 }] }; 
         } else if (reqFilter == "ALL") { 
          data.filter = { logic: "and", filters: [{ field: "diary", operator: "eq", value: 'UIS' }] }; 
         } else { 
          data.filter = { logic: "and", filters: [{ field: "diary", operator: "eq", value: 'UIS' }, { field: "team", operator: "eq", value: reqFilter }] }; 
         } 

        } 
        console.log(data); 
        return data; 
       }, 
       type: "signalr", 
       push: function (e) { 
        generateNotification(e.type, e.items[0].WRequestID, e.items[0].diary, e.items[0].team); 
       }, 
       transport: { 
        signalr: { 
         hub: sHub, 
         promise: sHubStart, 
         server: { 
          read: "read", 
          create: "create", 
          update: "update", 
          destroy: "destroy" 
         }, 
         client: { 
          read: "read", 
          create: "create", 
          update: "update", 
          destroy: "destroy" 
         } 
        }, 
       }, 
       schema: { 
        model: { 
         id: "WRequestID", 
         fields: { 
          WRequestID: { 
           type: "number", 
           editable: false, 
           defaultValue: -1 
          }, 
          start: { 
           from: "Start", 
           type: "date", 
           culture: "en-GB" 
          }, 
          end : { 
           from: "End", 
           type: "date", 
           culture: "en-GB" }, 
          diary: { 
           from: "Diary", 
           type: "string", 
           defaultValue: "@AppShort" 
          }, 
          team: { 
           from: "Team", 
           type: "string", 
           validation: { required: true } 
          }, 
          title: { 
           from: "Title", 
           type: "string", 
           validation: { required: true } 
          }, 
          workManager: { 
           from: "WorkManagerID", 
           type: "number", 
           validation: { required: true } 
          }, 
          assignee: { 
           from: "AssigneeID", 
           type: "number", 
           validation: { required: true } 
          }, 
          changeRef: { 
           from: "ChangeRef", 
           type: "string", 
           validation: { required: true } 
          }, 
          description: { 
           from: "Description", 
           type: "string", 
           validation: { required: true } 
          }, 
          impactedServers: { 
           from: "ImpactedServers", 
           type: "string", 
           validation: { required: true } 
          }, 
          impactedServices: { 
           from: "ImpactedServices", 
           type: "string", 
           validation: { required: true } 
          }, 
          isBAU: { 
           from: "IsBAU", 
           type: "boolean", 
           defaultValue: false 
          }, 
          projectRef: { 
           from: "ProjectRef", 
           type: "string", 
           validation: { required: true } 
          }, 
          notes: { 
           from: "Notes", 
           type: "string" 
          }, 
          isOOH: { 
           from: "IsOOH", 
           type: "boolean", 
           defaultValue: false 
          }, 
          isAllDay: { 
           from: "IsAllDay", 
           type: "boolean", 
           defaultValue: false 
          }, 
          recurrenceRule: { 
           from: "RecurrenceRule", 
           type: "string" 
          }, 
          recurrenceId: { 
           from: "RecurrenceID", 
           type: "number" 
          }, 
          recurrenceException: { 
           from: "RecurrenceException", 
           type: "string" 
          }, 
          startTimezone: { 
           from: "StartTimezone", 
           type: "string" 
          }, 
          endTimezone: { 
           from: "EndTimezone", 
           type: "string" 
          }, 
          requestStatus: { 
           from: "RequestStatus", 
           type: "number", 
           defaultValue: 0 
          } 
         } 
        }, 
       }, 
      } 
     }); 

Я пытаюсь использовать parameterMap для фильтрации данных на основе одного или двух битов данных.

  • Если выпадающее значение = ALL, то данные фильтруются дневником = @AppShort, где @AppShort происходят из настроек web.config раздела.
  • Если значение выпадающего = MY то данные дополнительно фильтруется, чтобы только дисплее текущее использует события
  • Если значение выпадающего что-нибудь еще, то это означает, что имя команды выбрана и поэтому данные фильтруются дневник и команда.

Моя проблема в том, что данные не фильтруются вообще, и функция parameterMap никогда не запускается. Это лучший подход или есть другой способ реализации фильтрации.

Любая помощь приветствуется.

UPDATE

В соответствии с просьбой ... это мой signalR ступица код:

Public Class WRequestHub 
    Inherits Hub 

    Private requestService As SchedulerRequestService 

    Public Sub New() 
     requestService = New SchedulerRequestService() 
    End Sub 

    Public Function Read() As IEnumerable(Of WRequestViewModel) 
     Return requestService.GetAll() 
    End Function 

    Public Sub Update(request As WRequestViewModel) 
     requestService.Update(request) 
     Clients.Others.update(request) 
    End Sub 

    Public Sub Destroy(request As WRequestViewModel) 
     requestService.Delete(request) 
     Clients.Others.destroy(request) 
    End Sub 

    Public Function Create(request As WRequestViewModel) As WRequestViewModel 

     requestService.Insert(request) 
     Clients.Others.create(request) 

     Return request 

    End Function 

    Public Sub LockRecord(id As Integer) 
     Clients.Others.lockRecord(New With { 
      Key .id = id 
     }) 
    End Sub 

    Public Sub UnlockRecord(id As Integer) 
     Clients.Others.unlockRecord(New With { 
      Key .id = id 
     }) 
    End Sub 

End Class 

И это мой класс SchedulerRequestService ...

Public Class SchedulerRequestService 

    Public Overridable Function GetAll() As IQueryable(Of WRequestViewModel) 

     Using de As New SupportDiaryEntities 

      Dim rList As IQueryable(Of WRequestViewModel) 

      rList = (From r In de.tWorkRequests 
        Select New WRequestViewModel() With { 
         .WRequestID = r.WRequestID, 
         .Start = r.Start, 
         .[End] = r.[End], 
         .Title = r.Title, 
         .Diary = r.Diary, 
         .Team = r.Team, 
         .WorkManagerID = r.WorkManagerID, 
         .AssigneeID = r.AssigneeID, 
         .ChangeRef = r.ChangeRef, 
         .Description = r.Description, 
         .ImpactedServers = r.ImpactedServers, 
         .ImpactedServices = r.ImpactedServices, 
         .IsBAU = r.IsBAU, 
         .ProjectRef = r.ProjectRef, 
         .Notes = r.Notes, 
         .IsOOH = r.IsOOH, 
         .IsAllDay = r.IsAllDay, 
         .RecurrenceRule = r.RecurrenceRule, 
         .RecurrenceID = r.RecurrenceID, 
         .RecurrenceException = r.RecurrenceException, 
         .StartTimezone = r.StartTimezone, 
         .EndTimezone = r.EndTimezone, 
         .RequestStatus = r.RequestStatus 
        }).ToList.AsQueryable() 

      Return rList 

     End Using 

    End Function 

     'OTHER FUNCTIONS (Insert, Update, Delete) Removed for brevity. 
    End Class 

UPDATE 2

С помощью Calinaadi и примеров фильтрации источника сигналов SignalR на сетке Kendo я вижу, что мне нужно изменить функцию чтения, чтобы принять мой фильтр (фильтры). К сожалению, в примерах, используемых с сеткой, были .take, .skip, .sort, .filter и .aggregate в качестве аргументов, которые я понимаю, когда у вас есть сетка с пейджингом, и вы хотите взять X-записи после пропуска Y-записей.

Это типичный пример из Telerik демок ...

public DataSourceResult Read(MyDataSourceRequest request) 
{ 
    return productService.Read().ToDataSourceResult(request.Take, request.Skip, request.Sort, request.Filter, request.Aggregates); 
} 

Для планировщика я хотел бы ожидать чтения для извлечения назад все событий с концом или после начала текущего представления планировщика и начиная с или до конца текущего представления планировщика. Вероятно, отсортировано по началу. Необходимо фильтровать полевые фильтры (это фильтры, которые я установил). Я не вижу, чтобы принимать, пропускать или собирать какую-либо концепцию в получении данных о событиях.

Функция моего приложения полностью отличается от фильтрации. У меня есть VS-решение, которое я могу предоставить, если необходимо, с базой данных, заполненной фиктивными записями.

Предлагаем щедрость за любую помощь.

+0

Не могли бы вы также добавить код, в котором срабатывает фильтр? – calinaadi

+0

@calinaadi Я не уверен, что понимаю ... Планировщик запускает чтение, когда он инициализируется, я считаю ... Источник данных связан через signalR. Вы имеете в виду код хаба? – Mych

+0

@calinaadi Я добавил концентратор и функцию, призванную читать данные ... Возможно, вы собрали меня немного из моей глубины здесь ... этот проект проиграл от базового календаря до одного со многими функциями. Из того, что я читал, я думал, что фильтрация выполняется на стороне клиента, но я могу ошибаться ... Если это серверная сторона, как передать свои фильтры с моим запросом на чтение? – Mych

ответ

1

После многих поисков и много читать. Теперь у меня есть рабочая система. Планировщику потребовался параметр serverFiltering: true, и функции Read, Create, Update and Destroy должны быть переделаны, чтобы принять фильтр, который был отправлен. Если кто-то хочет получить копию кода, который слишком много для публикации здесь, я могу позволить вам это сделать.

3

Вы должны изменить:

transport: { 
        signalr: { 
         hub: sHub, 
         promise: sHubStart, 
         ParameterMap: "parameterMap", 

к:

transport: { 
         parameterMap: function parameterMap(data, type) { 
                  alert(type);  
           }, 
         signalr: { 
+0

Calinaadi, я очень ценю вашу помощь. Я обновил раздел parameterMap в соответствии с инструкциями. Я также добавляю статические значения только для проверки фильтрации, а не для поиска значений из другого элемента на странице. Я добавил команды console.log для отслеживания различных данных. К сожалению, до сих пор нет фильтрации. Все данные отображаются ... нет ошибки, и журнал не производит никаких результатов ... как будто функция parameterMap игнорируется. – Mych

+0

http://dojo.telerik.com/APIrO – calinaadi

+0

Посмотрел пример додзе ... но я не вижу, как работает параметрMap ... предупреждение (тип) не запускается. – Mych

Смежные вопросы