Continuing my evaluation, after finding this project:
http://www.telerik.com/support/code-library/custom-editor-9fd60fca3c02
most of my questions from the previous thread about customizing the scheduler were answered. Building off the above example I have run into a few problems.
1. While the custom editor will allow me to save events to the database, the calendar will not display these events.
It appears to be pulling and pushing the data just fine using a clone of the the ScheduleTaskService from the demo solution, just not displaying for whatever reason.
2. After clicking save on the CustomEditorTemplate the pop-up is not closing as it does with the standard editor.
The rest of the issues are really about specific components in the CustomEditorTemplate but rather than splash all over the forums figured I would list them here.
3. DropDownList component -- is there a way to set a default/selected value. I found in my testing that if I did not change the value of the ddl it returned a null on submit.
4. MultiSelect component -- is there a way to set a ":water mark" or a "click me" a "down arrow" rather than a blank box. After you use it once it is intuitive but the first time I saw it, I thought the list didn't load.
5. DateTimePicker component -- is there a way to set the default time to something other than 12:00 AM?
6. In the CustomEditorTemplate by default it isAllDayEvent is set to true. How on earth do you change that? I tried setting the value to false, the data-val to false, and scripting I attempted broke the form so I am at a loss.
Here is the ViewModel:
Any help or guidance you can provide would be greatly appreciated.
Thanks,
Chris
http://www.telerik.com/support/code-library/custom-editor-9fd60fca3c02
most of my questions from the previous thread about customizing the scheduler were answered. Building off the above example I have run into a few problems.
1. While the custom editor will allow me to save events to the database, the calendar will not display these events.
@(Html.Kendo().Scheduler<
SchedulerViewModel
>()
.Name("scheduler")
.Date(new DateTime(2015, 2, 1))
.StartTime(new DateTime(2015, 2, 1, 7, 00, 00))
.Height(600)
.Timezone("Etc/UTC")
.Views(views =>
{
views.DayView();
views.WeekView();
views.MonthView(monthView => monthView.Selected(true));
})
.DataSource(d => d.Model(m =>
{
m.Id(f => f.EventId);
m.Field(f => f.Title).DefaultValue("No title");
m.RecurrenceId(f => f.RecurrenceID);
m.Field(f => f.IsAllDay).DefaultValue(false);
})
.Read("Read", "Scheduler")
.Create("Create", "Scheduler")
.Destroy("Destroy", "Scheduler")
.Update("Update", "Scheduler")
)
.Editable(editable =>
{
editable.TemplateName("CustomEditorTemplate");
})
)
2. After clicking save on the CustomEditorTemplate the pop-up is not closing as it does with the standard editor.
The rest of the issues are really about specific components in the CustomEditorTemplate but rather than splash all over the forums figured I would list them here.
3. DropDownList component -- is there a way to set a default/selected value. I found in my testing that if I did not change the value of the ddl it returned a null on submit.
4. MultiSelect component -- is there a way to set a ":water mark" or a "click me" a "down arrow" rather than a blank box. After you use it once it is intuitive but the first time I saw it, I thought the list didn't load.
5. DateTimePicker component -- is there a way to set the default time to something other than 12:00 AM?
6. In the CustomEditorTemplate by default it isAllDayEvent is set to true. How on earth do you change that? I tried setting the value to false, the data-val to false, and scripting I attempted broke the form so I am at a loss.
@model PokerLeagueMVCv2.Models.SchedulerViewModel
@{
//required in order to render validation attributes
ViewContext.FormContext = new FormContext();
}
@functions{
public Dictionary<
string
, object> generateDatePickerAttributes(
string elementId,
string fieldName,
string dataBindAttribute,
Dictionary<
string
, object> additionalAttributes = null)
{
Dictionary<
string
, object> datePickerAttributes = additionalAttributes != null ? new Dictionary<
string
, object>(additionalAttributes) : new Dictionary<
string
, object>();
datePickerAttributes["id"] = elementId;
datePickerAttributes["name"] = fieldName;
datePickerAttributes["data-bind"] = dataBindAttribute;
datePickerAttributes["required"] = "required";
datePickerAttributes["style"] = "z-index: inherit;";
return datePickerAttributes;
}
}
<
div
class
=
"k-edit-label"
>
@(Html.LabelFor(model => model.Title))
</
div
>
<
div
data-container-for
=
"VenueId"
class
=
"k-edit-field"
>
@(Html.Kendo().DropDownListFor(model => model.VenueId)
.Name("Venue")
.HtmlAttributes(new { data_bind = "value:VenueId", style = "width: 300px" })
.DataTextField("VenueName")
.DataValueField("VenueId")
.DataSource(source =>
{
source.Read(read => { read.Action("VenueDropDownList", "DropDownList"); });
})
)
</
div
>
<
div
class
=
"k-edit-label"
>
@(Html.LabelFor(model => model.RegionIds))
</
div
>
<
div
data-container-for
=
"RegionIds"
class
=
"k-edit-field"
>
@(Html.Kendo().MultiSelectFor(model => model.RegionIds)
.Name("AssignRegions")
.HtmlAttributes(new { data_bind = "value:RegionIds", style = "width: 200px" })
.DataTextField("RegionName")
.DataValueField("RegionId")
.DataSource(source =>
{
source.Read(read => { read.Action("RegionDropDownList", "DropDownList"); });
})
)
</
div
>
<
div
class
=
"k-edit-label"
>
@(Html.LabelFor(model => model.Start))
</
div
>
<
div
data-container-for
=
"start"
class
=
"k-edit-field"
>
@(Html.Kendo().DateTimePickerFor(model => model.Start)
.HtmlAttributes(generateDatePickerAttributes("startDateTime", "start", "value:start,invisible:isAllDay")))
@(Html.Kendo().DatePickerFor(model => model.Start)
.HtmlAttributes(generateDatePickerAttributes("startDate", "start", "value:start,visible:isAllDay")))
<
span
data-bind
=
"text: startTimezone"
></
span
>
<
span
data-for
=
"start"
class
=
"k-invalid-msg"
></
span
>
</
div
>
<
div
class
=
"k-edit-label"
>
@(Html.LabelFor(model => model.End))
</
div
>
<
div
data-container-for
=
"end"
class
=
"k-edit-field"
>
@(Html.Kendo().DateTimePickerFor(model => model.End)
.HtmlAttributes(generateDatePickerAttributes(
"endDateTime",
"end",
"value:end,invisible:isAllDay",
new Dictionary<
string
, object>() { { "data-dateCompare-msg", "End date should be greater than or equal to the start date" } })))
@(Html.Kendo().DatePickerFor(model => model.End)
.HtmlAttributes(generateDatePickerAttributes(
"endDate",
"end",
"value:end,visible:isAllDay",
new Dictionary<
string
, object>() { { "data-dateCompare-msg", "End date should be greater than or equal to the start date" } })))
<
span
data-bind
=
"text: endTimezone"
></
span
>
<
span
data-for
=
"end"
class
=
"k-invalid-msg"
></
span
>
</
div
>
<
div
class
=
"k-edit-label"
>
@(Html.LabelFor(model => model.IsAllDay))
</
div
>
<
div
data-container-for
=
"isAllDay"
class
=
"k-edit-field"
>
<
input
id
=
"IsAllDay"
data-bind
=
"checked: isAllDay"
data-val
=
"false"
name
=
"IsAllDay"
type
=
"checkbox"
/>
</
div
>
<
div
class
=
"endTimezoneRow"
>
<
div
class
=
"k-edit-label"
></
div
>
<
div
class
=
"k-edit-field"
>
<
label
class
=
"k-check"
>
<
input
checked
=
"checked"
class
=
"k-timezone-toggle"
type
=
"checkbox"
value
=
"true"
/>
Use separate start and end time zones
</
label
>
</
div
>
</
div
>
<
script
>
$(".k-timezone-toggle").on("click", function () {
var isVisible = $(this).is(":checked");
var container = $(this).closest(".k-popup-edit-form");
var endTimezoneRow = container.find("label[for='EndTimezone']").parent().add(container.find("div[data-container-for='endTimezone']"));
endTimezoneRow.toggle(isVisible);
if (!isVisible) {
var uid = container.attr("data-uid");
var scheduler = $("\#scheduler").data("kendoScheduler");
var model = scheduler.dataSource.getByUid(uid);
model.set("endTimezone", null);
}
});
var endTimezone = '${data.endTimezone}';
if (!endTimezone || endTimezone == "null") {
$(".k-timezone-toggle").trigger('click');
}
</
script
>
<
div
class
=
"k-edit-label"
>
@(Html.LabelFor(model => model.StartTimezone))
</
div
>
<
div
data-container-for
=
"startTimezone"
class
=
"k-edit-field"
>
@(Html.Kendo().TimezoneEditorFor(model => model.StartTimezone)
.HtmlAttributes(new { data_bind = "value:startTimezone" }))
</
div
>
<
div
class
=
"k-edit-label"
>
@(Html.LabelFor(model => model.EndTimezone))
</
div
>
<
div
data-container-for
=
"endTimezone"
class
=
"k-edit-field"
>
@(Html.Kendo().TimezoneEditorFor(model => model.EndTimezone)
.HtmlAttributes(new { data_bind = "value:endTimezone" }))
</
div
>
<
div
class
=
"k-edit-label"
>
@(Html.LabelFor(model => model.RecurrenceRule))
</
div
>
<
div
data-container-for
=
"recurrenceRule"
class
=
"k-edit-field"
>
@(Html.Kendo().RecurrenceEditorFor(model => model.RecurrenceRule)
.HtmlAttributes(new { data_bind = "value:recurrenceRule" }))
</
div
>
<
div
class
=
"k-edit-label"
>
@(Html.LabelFor(model => model.Description))
</
div
>
<
div
data-container-for
=
"description"
class
=
"k-edit-field"
>
@(Html.TextAreaFor(model => model.Description, new { @class = "k-textbox", data_bind = "value:description" }))
</
div
>
<
div
class
=
"k-edit-label"
>
@(Html.LabelFor(model => model.Registration))
</
div
>
<
div
data-container-for
=
"Registration"
class
=
"k-edit-field"
>
<
input
data-bind
=
"checked: Registration"
data-val
=
"false"
id
=
"Registration"
name
=
"Registration"
type
=
"checkbox"
class
=
"k-registration-toggle"
/>
</
div
>
<
div
class
=
"k-edit-label"
>
@(Html.LabelFor(model => model.MaxRegistrations))
</
div
>
<
div
data-container-for
=
"MaxRegistrations"
class
=
"k-edit-field"
>
@(Html.TextBoxFor(model => model.MaxRegistrations, new { @class = "k-textbox", data_bind = "value:MaxRegistrations" }))
</
div
>
<
div
class
=
"k-edit-label"
>
@(Html.LabelFor(model => model.MaxWaitList))
</
div
>
<
div
data-container-for
=
"MaxWaitList"
class
=
"k-edit-field"
>
@(Html.TextBoxFor(model => model.MaxWaitList, new { @class = "k-textbox", data_bind = "value:MaxWaitList" }))
</
div
>
<
div
class
=
"k-edit-label"
>
@(Html.LabelFor(model => model.MaxWinsAllowed))
</
div
>
<
div
data-container-for
=
"MaxWinsAllowed"
class
=
"k-edit-field"
>
@(Html.TextBoxFor(model => model.MaxWinsAllowed, new { @class = "k-textbox", data_bind = "value:MaxWinsAllowed" }))
</
div
>
@{
ViewContext.FormContext = null;
}
Here is the ViewModel:
public
class
SchedulerViewModel: ISchedulerEvent
{
public
string
Title {
get
;
set
; }
private
DateTime start;
public
DateTime Start
{
get
{
return
start;
}
set
{
start = value.ToUniversalTime();
}
}
private
DateTime end;
public
DateTime End
{
get
{
return
end;
}
set
{
end = value.ToUniversalTime();
}
}
[DisplayName(
"Start Timezone"
)]
public
string
StartTimezone {
get
;
set
; }
[DisplayName(
"End Timezone"
)]
public
string
EndTimezone {
get
;
set
; }
public
string
Description {
get
;
set
; }
public
bool
IsAllDay {
get
;
set
; }
public
string
Recurrence {
get
;
set
; }
public
int
? RecurrenceID {
get
;
set
; }
[DisplayName(
"Recurrence"
)]
public
string
RecurrenceRule {
get
;
set
; }
public
string
RecurrenceException {
get
;
set
; }
//this is for charity events or session main events
public
bool
Registration {
get
;
set
; }
[DisplayName(
"Max Reg"
)]
public
int
MaxRegistrations {
get
;
set
; }
[DisplayName(
"Max Wins"
)]
public
int
MaxWinsAllowed {
get
;
set
; }
[DisplayName(
"Max Wait"
)]
public
int
MaxWaitList {
get
;
set
; }
//IDs
public
int
VenueId {
get
;
set
; }
public
int
EventId {
get
;
set
; }
[DisplayName(
"Regions"
)]
public
ICollection<Region> RegionIds {
get
;
set
; }
public
LeagueEvent ToEntity()
{
return
new
LeagueEvent
{
EventId = EventId,
VenueId =VenueId,
Start = Start,
End = End,
StartTimezone = StartTimezone,
EndTimezone = EndTimezone,
Description = Description,
IsAllDay = IsAllDay,
Recurrence = Recurrence,
RecurrenceID = RecurrenceID,
RecurrenceRule = RecurrenceRule,
RecurrenceException = RecurrenceException,
Registration = Registration,
MaxRegistrations = MaxRegistrations,
MaxWinsAllowed = MaxWinsAllowed,
MaxWaitList = MaxWaitList,
RegionIds = RegionIds
};
}
}
Any help or guidance you can provide would be greatly appreciated.
Thanks,
Chris