Hello,
So I'm back at this issue where the Editor window won't close. I'm using the OnActionBegin and it's going through that code, so data is being updated. But then the editor window just sort of flashes really quick and stays open, I can't get it to close. I've tried ScheduleRef.CloseEditor but nothing, I've even tried to send an args.cancel, since the cancel button will close it but that didn't work either. Any additional help is appreciated.
Thanks,
Andrew
Hi Andrew,
Thanks for the update.
We have checked the reported problem but unfortunately, we are not able to replicate the issue at our end. Could you please get back to us with the below details that help us to validate the issue further and provide the solution earlier?
Regards,
Ruksar Moosa Sait
Sorry, I put this on the back burner for a bit while I finished up other parts of the program. Here is the full code as requested:
@page "/Calendar"
@inject Microsoft.AspNetCore.Components.NavigationManager UriHelper
@using System.Globalization
@using System.IO
@using System.Timers
@using Syncfusion.Blazor.Buttons
@using Syncfusion.Blazor.Calendars
@using Syncfusion.Blazor.Data
@using Syncfusion.Blazor.DropDowns
@using Syncfusion.Blazor.Inputs
@using Syncfusion.Blazor.Navigations
@using Syncfusion.Blazor.Schedule
@using Syncfusion.Blazor.SplitButtons
@using RCManagement.Helpers
@using static RCManagement.Shared.Models.CalendarSettingsModel
@using static RCManagement.Shared.Models.EventsModel
<PageTitle>Calendar</PageTitle>
<h2>Calendar Of Events</h2>
<div class="control-section">
<div class="content-wrapper">
<div class="schedule-overview">
<div class="overview-header">
<div class="overview-titlebar">
<div class="right-panel">
<div class="control-panel calendar-export">
<SfButton IconCss="e-icons e-print" CssClass="title-bar-btn" OnClick="OnPrintClick">Print</SfButton>
</div>
<div class="control-panel" style="display: inline-flex;padding-left:15px;">
<div class="e-icons e-upload-1 e-btn-icon e-icon-left" style="line-height: 40px;"></div>
<SfUploader AllowedExtensions=".ics" CssClass="calendar-import" Multiple="false">
<UploaderButtons Browse="Import"></UploaderButtons>
<UploaderEvents ValueChange="OnFileUploadChange"></UploaderEvents>
</SfUploader>
</div>
<div class="control-panel calendar-export">
<SfDropDownButton Content="Export" class="title-bar-btn">
<DropDownMenuItems>
<DropDownMenuItem Text="iCalendar" IconCss="e-icons e-export"></DropDownMenuItem>
<DropDownMenuItem Text="Excel" IconCss="e-icons e-export-excel"></DropDownMenuItem>
</DropDownMenuItems>
<DropDownButtonEvents ItemSelected="OnExportClick"></DropDownButtonEvents>
</SfDropDownButton>
</div>
</div>
</div>
</div>
<div class="overview-toolbar">
<div style="height: 70px;width: calc(100% - 90px);">
<SfToolbar Width="auto" Height="70px" OverflowMode="OverflowMode.Scrollable" ScrollStep="100">
<ToolbarItems>
<ToolbarItem PrefixIcon="e-icons e-plus" TooltipText="New Event" Text="New Event" OnClick="OnNewEventAdd"></ToolbarItem>
<ToolbarItem PrefixIcon="e-icons e-repeat" TooltipText="New Recurring Event" Text="New Recurring Event" OnClick="OnNewRecurringEventAdd"></ToolbarItem>
<ToolbarItem Type="@ItemType.Separator"></ToolbarItem>
<ToolbarItem PrefixIcon="e-icons e-day" TooltipText="Day" Text="Day" OnClick="OnDayView"></ToolbarItem>
<ToolbarItem PrefixIcon="e-icons e-week" TooltipText="Week" Text="Week" OnClick="OnWeekView"></ToolbarItem>
<ToolbarItem PrefixIcon="e-icons e-week" TooltipText="WorkWeek" Text="WorkWeek" OnClick="OnWorkWeekView"></ToolbarItem>
<ToolbarItem PrefixIcon="e-icons e-month" TooltipText="Month" Text="Month" OnClick="OnMonthView"></ToolbarItem>
<ToolbarItem PrefixIcon="e-icons e-month" TooltipText="Year" Text="Year" OnClick="OnYearView"></ToolbarItem>
<ToolbarItem PrefixIcon="e-icons e-agenda-date-range" TooltipText="Agenda" Text="Agenda" OnClick="OnAgendaView"></ToolbarItem>
<ToolbarItem TooltipText="Timeline Views">
<Template>
<div style="height: 46px; line-height: 23px;">
<div class="icon-child" style="text-align: center;">
<SfSwitch @ref="ViewRef" HtmlAttributes="@htmlAttribute" TChecked="bool" ValueChange="OnViewChange"></SfSwitch>
</div>
<div class="text-child" style="font-size: 14px;">Timeline Views</div>
</div>
</Template>
</ToolbarItem>
<ToolbarItem Type="@ItemType.Separator"></ToolbarItem>
<ToolbarItem TooltipText="Grouping Resource">
<Template>
<div style="height: 46px; line-height: 23px;">
<div class="icon-child" style="text-align: center;">
<SfSwitch TChecked="bool" HtmlAttributes="@htmlAttribute" Checked="@EnableGroup" ValueChange="OnGroupChange"></SfSwitch>
</div>
<div class="text-child" style="font-size: 14px;">Grouping</div>
</div>
</Template>
</ToolbarItem>
<ToolbarItem TooltipText="Gridlines" Disabled="@(CurrentView == (View.Agenda | View.Month | View.Year | View.TimelineMonth | View.TimelineYear))">
<Template>
<div style="height: 46px; line-height: 23px;">
<div class="icon-child" style="text-align: center;">
<SfSwitch TChecked="bool" HtmlAttributes="@htmlAttribute" Checked="@EnableTimeScale" ValueChange="OnTimeScaleChange"></SfSwitch>
</div>
<div class="text-child" style="font-size: 14px;">Gridlines</div>
</div>
</Template>
</ToolbarItem>
<ToolbarItem TooltipText="Row Auto Height" Disabled="@(this.CurrentView == (View.Day | View.Week | View.WorkWeek | View.Year))">
<Template>
<div style="height: 46px; line-height: 23px;">
<div class="icon-child" style="text-align: center;">
<SfSwitch TChecked="bool" HtmlAttributes="@htmlAttribute" Checked="@isRowAutoHeight" ValueChange="OnRowAutoHeightChange"></SfSwitch>
</div>
<div class="text-child" style="font-size: 14px;">Row Auto Height</div>
</div>
</Template>
</ToolbarItem>
<ToolbarItem TooltipText="Tooltip">
<Template>
<div style="height: 46px; line-height: 23px;">
<div class="icon-child" style="text-align: center;">
<SfSwitch TChecked="bool" HtmlAttributes="@htmlAttribute" Checked="@TooltipEnable" ValueChange="OnTooltipChange"></SfSwitch>
</div>
<div class="text-child" style="font-size: 14px;">Tooltip</div>
</div>
</Template>
</ToolbarItem>
</ToolbarItems>
<ToolbarEvents Created="OnToolbarCreated"></ToolbarEvents>
</SfToolbar>
</div>
<div style="height:70px;width:90px;">
<SfButton IconCss="e-icons e-settings" CssClass="overview-toolbar-settings" IconPosition="IconPosition.Top" OnClick="OnSettingsClick">Settings</SfButton>
</div>
</div>
<div class="overview-content" style="height: 100%">
<div class="left-panel">
<div class="overview-scheduler">
<SfSchedule @ref="ScheduleRef" TValue="Events" CssClass="schedule-overview" Width="100%" Height="100%" @bind-SelectedDate="@SelectedDate" @bind-CurrentView="@CurrentView" Timezone="@TimezoneValue" AllowDragAndDrop="true" FirstDayOfWeek="0" EnablePersistence="true" ShowWeekNumber="@ShowWeekNumber" WeekRule="@WeekRule" WorkDays="@WorkDays" StartHour="@DayStartHour" EndHour="@DayEndHour" EnableAutoRowHeight="@isRowAutoHeight" TimeFormat="@TimeFormat">
<ScheduleGroup Resources="@GroupData"></ScheduleGroup>
<ScheduleResources>
<ScheduleResource TValue="int[]" TItem="CalendarData" DataSource="@Calendars" Query="@ResourceQuery" Field="CalendarId" Title="Calendars" Name="Calendars" TextField="CalendarName" IdField="CalendarId" ColorField="CalendarColor" AllowMultiple="true"></ScheduleResource>
</ScheduleResources>
<ScheduleViews>
<ScheduleView Option="View.Day"></ScheduleView>
<ScheduleView Option="View.Week"></ScheduleView>
<ScheduleView Option="View.WorkWeek"></ScheduleView>
<ScheduleView Option="View.Month"></ScheduleView>
<ScheduleView Option="View.Year"></ScheduleView>
<ScheduleView Option="View.Agenda"></ScheduleView>
<ScheduleView Option="View.TimelineDay"></ScheduleView>
<ScheduleView Option="View.TimelineWeek"></ScheduleView>
<ScheduleView Option="View.TimelineWorkWeek"></ScheduleView>
<ScheduleView Option="View.TimelineMonth"></ScheduleView>
<ScheduleView Option="View.TimelineYear"></ScheduleView>
</ScheduleViews>
<ScheduleQuickInfoTemplates>
<HeaderTemplate>
<div class="quick-info-header">
<div class="quick-info-header-content" style="@(GetHeaderStyles((context as Events)))">
<div class="quick-info-title">@((context as Events).ElementType == "cell" ? "Add Event" : "Event Details")</div>
<div class="duration-text">@(GetEventDetails((context as Events)))</div>
</div>
</div>
</HeaderTemplate>
<ContentTemplate>
@if ((context as Events).ElementType == "cell")
{
<div class="e-cell-content">
<div class="content-area">
<SfTextBox @ref="SubjectRef" CssClass="e-subject" @bind-Value="@((context as Events).Subject)" Placeholder="Event Title"></SfTextBox>
</div>
<div class="content-area">
<SfDropDownList @ref="CalendarRef" TValue="int" TItem="CalendarData" @bind-Value="@((context as Events).CalendarId)" DataSource="@Calendars" Placeholder="Choose Calendar">
<DropDownListFieldSettings Text="CalendarName" Value="CalendarId"></DropDownListFieldSettings>
</SfDropDownList>
</div>
<div class="content-area">
<SfTextBox @ref="DescriptionRef" @bind-Value="@((context as Events).Description)" Placeholder="Event Notes"></SfTextBox>
</div>
</div>
}
else
{
Events Data = context as Events;
CalendarData resData = GetResourceData(Data);
<div class="event-content">
<div class="meeting-type-wrap">
<label>Subject</label>:
<span>@(Data.Subject)</span>
</div>
<div class="meeting-subject-wrap">
<label>Type</label>:
<span>@((resData != null) ? resData.CalendarName : string.Empty)</span>
</div>
<div class="notes-wrap">
<label>Notes</label>:
<span>@(Data.Description)</span>
</div>
</div>
}
</ContentTemplate>
<FooterTemplate>
@if ((context as Events).ElementType == "cell")
{
<div class="cell-footer">
<SfButton Content="Add" IsPrimary="true" OnClick="@(e => OnAdd(e, (context as Events)))"></SfButton>
</div>
}
</FooterTemplate>
</ScheduleQuickInfoTemplates>
<ScheduleTimeScale Enable="@EnableTimeScale" Interval="@SlotInterval" SlotCount="@SlotCount"></ScheduleTimeScale>
<ScheduleWorkHours Start="@WorkStartHour" End="@WorkEndHour"></ScheduleWorkHours>
<ScheduleEvents TValue="Events" OnActionBegin="@EventsControl" OnCellDoubleClick="@OnCellDoubleClick" ></ScheduleEvents>
<ScheduleEventSettings TValue="Events" DataSource="@EventsList" EnableTooltip="@TooltipEnable"></ScheduleEventSettings>
</SfSchedule>
<SfContextMenu TValue="Syncfusion.Blazor.Navigations.MenuItem" @ref="ContextMenuObj" CssClass="schedule-context-menu" Target=".e-schedule">
<MenuItems>
<Syncfusion.Blazor.Navigations.MenuItem Text="New Event" IconCss="e-icons e-plus" Id="Add" Hidden="@isCell"></Syncfusion.Blazor.Navigations.MenuItem>
<Syncfusion.Blazor.Navigations.MenuItem Text="New Recurring Event" IconCss="e-icons e-repeat" Hidden="@isCell" Id="AddRecurrence"></Syncfusion.Blazor.Navigations.MenuItem>
<Syncfusion.Blazor.Navigations.MenuItem Text="Today" IconCss="e-icons e-timeline-today" Id="Today" Hidden="@isCell"></Syncfusion.Blazor.Navigations.MenuItem>
<Syncfusion.Blazor.Navigations.MenuItem Text="Edit Event" IconCss="e-icons e-edit" Id="Save" Hidden="@isEvent"></Syncfusion.Blazor.Navigations.MenuItem>
<Syncfusion.Blazor.Navigations.MenuItem Text="Edit Event" IconCss="e-icons e-edit" Id="EditRecurrenceEvent" Hidden="@isRecurrence">
<MenuItems>
<Syncfusion.Blazor.Navigations.MenuItem Text="Edit Occurrence" Id="EditOccurrence"></Syncfusion.Blazor.Navigations.MenuItem>
<Syncfusion.Blazor.Navigations.MenuItem Text="Edit Series" Id="EditSeries"></Syncfusion.Blazor.Navigations.MenuItem>
</MenuItems>
</Syncfusion.Blazor.Navigations.MenuItem>
<Syncfusion.Blazor.Navigations.MenuItem Text="Delete Event" IconCss="e-icons e-trash" Id="Delete" Hidden="@isEvent"></Syncfusion.Blazor.Navigations.MenuItem>
<Syncfusion.Blazor.Navigations.MenuItem Text="Delete Event" IconCss="e-icons e-trash" Id="DeleteRecurrenceEvent" Hidden="@isRecurrence">
<MenuItems>
<Syncfusion.Blazor.Navigations.MenuItem Text="Delete Occurrence" Id="DeleteOccurrence"></Syncfusion.Blazor.Navigations.MenuItem>
<Syncfusion.Blazor.Navigations.MenuItem Text="Delete Series" Id="DeleteSeries"></Syncfusion.Blazor.Navigations.MenuItem>
</MenuItems>
</Syncfusion.Blazor.Navigations.MenuItem>
</MenuItems>
<MenuEvents TValue="Syncfusion.Blazor.Navigations.MenuItem" OnOpen="OnOpen" ItemSelected="OnItemSelected"></MenuEvents>
</SfContextMenu>
</div>
</div>
<div class="right-panel @((this.IsSettingsVisible ? "" : "hide"))">
<div class="control-panel e-css">
<div class="col-row">
<div class="col-left">
<label style="line-height: 34px; margin: 0;">Work week</label>
</div>
<div class="col-right">
<SfMultiSelect Mode="@VisualMode.CheckBox" AllowFiltering="true" CssClass="schedule-workweek" Width="170px" PopupHeight="150px" DataSource="@WeekCollection" EnableSelectionOrder="false" ShowDropDownIcon="true" @bind-Value="@WorkDays" ShowClearButton="false">
<MultiSelectFieldSettings Text="Name" Value="Value"></MultiSelectFieldSettings>
<MultiSelectEvents TValue="int[]" TItem="WeekDays" ValueChange="OnWorkDaysChange"></MultiSelectEvents>
</SfMultiSelect>
</div>
</div>
<div class="col-row">
<div class="col-left">
<label style="line-height: 34px; margin: 0;">Calendars</label>
</div>
<div class="col-right">
<SfMultiSelect @ref="ResourceRef" Mode="@VisualMode.CheckBox" AllowFiltering="true" CssClass="schedule-resource" Width="170px" PopupHeight="150px" DataSource="@Calendars" EnableSelectionOrder="false" ShowDropDownIcon="true" @bind-Value="@SelectedResource" ShowClearButton="false">
<MultiSelectFieldSettings Text="CalendarName" Value="CalendarId"></MultiSelectFieldSettings>
<MultiSelectEvents TValue="int[]" TItem="CalendarData" ValueChange="OnResourceChange"></MultiSelectEvents>
</SfMultiSelect>
</div>
</div>
<div class="col-row">
<div class="col-left">
<label style="line-height: 34px; margin: 0;">Day Start Hour</label>
</div>
<div class="col-right">
<SfTimePicker TValue="DateTime?" Format="HH:mm" Width="170px" @bind-Value="@ScheduleStartHour" ShowClearButton="false">
<TimePickerEvents TValue="DateTime?" ValueChange="OnDayStartHourChange"></TimePickerEvents>
</SfTimePicker>
</div>
</div>
<div class="col-row">
<div class="col-left">
<label style="line-height: 34px; margin: 0;">Day End Hour</label>
</div>
<div class="col-right">
<SfTimePicker TValue="DateTime?" Format="HH:mm" Width="170px" @bind-Value="@ScheduleEndHour" ShowClearButton="false">
<TimePickerEvents TValue="DateTime?" ValueChange="OnDayEndHourChange"></TimePickerEvents>
</SfTimePicker>
</div>
</div>
<div class="col-row">
<div class="col-left">
<label style="line-height: 34px; margin: 0;">Work Start Hour</label>
</div>
<div class="col-right">
<SfTimePicker TValue="DateTime?" Format="HH:mm" Width="170px" @bind-Value="@StartWorkHour" ShowClearButton="false">
<TimePickerEvents TValue="DateTime?" ValueChange="OnWorkStartHourChange"></TimePickerEvents>
</SfTimePicker>
</div>
</div>
<div class="col-row">
<div class="col-left">
<label style="line-height: 34px; margin: 0;">Work End Hour</label>
</div>
<div class="col-right">
<SfTimePicker TValue="DateTime?" Format="HH:mm" Width="170px" @bind-Value="@EndWorkHour" ShowClearButton="false">
<TimePickerEvents TValue="DateTime?" ValueChange="OnWorkEndHourChange"></TimePickerEvents>
</SfTimePicker>
</div>
</div>
<div class="col-row">
<div class="col-left">
<label style="line-height: 34px; margin: 0;">Slot Duration</label>
</div>
<div class="col-right">
<SfDropDownList TItem="SlotData" TValue="int" Width="170px" PopupHeight="150px" DataSource="@SlotIntervalDataSource" @bind-Value="@SlotInterval">
<DropDownListFieldSettings Text="Name" Value="Value"></DropDownListFieldSettings>
<DropDownListEvents TItem="SlotData" TValue="int" ValueChange="OnSlotIntervalChange"></DropDownListEvents>
</SfDropDownList>
</div>
</div>
<div class="col-row">
<div class="col-left">
<label style="line-height: 34px; margin: 0;">Slot Interval</label>
</div>
<div class="col-right">
<SfDropDownList TItem="SlotData" TValue="int" Width="170px" PopupHeight="150px" DataSource="@SlotCountDataSource" @bind-Value="@SlotCount">
<DropDownListFieldSettings Text="Name" Value="Value"></DropDownListFieldSettings>
</SfDropDownList>
</div>
</div>
<div class="col-row">
<div class="col-left">
<label style="line-height: 34px; margin: 0;">Time Format</label>
</div>
<div class="col-right">
<SfDropDownList TItem="TimeFormatData" TValue="string" Width="170px" PopupHeight="150px" DataSource="@TimeFormatDataSource" @bind-Value="@TimeFormat">
<DropDownListFieldSettings Text="Name" Value="Value"></DropDownListFieldSettings>
</SfDropDownList>
</div>
</div>
<div class="col-row">
<div class="col-left">
<label style="line-height: 34px; margin: 0;">Week Numbers</label>
</div>
<div class="col-right">
<SfDropDownList TItem="WeekNumbers" TValue="string" Width="170px" PopupHeight="150px" DataSource="@WeekNumbersData" @bind-Value="@WeeklyRule">
<DropDownListEvents TItem="WeekNumbers" TValue="string" ValueChange="OnWeekNumberChange"></DropDownListEvents>
<DropDownListFieldSettings Text="Name" Value="Value"></DropDownListFieldSettings>
</SfDropDownList>
</div>
</div>
<div class="col-row">
<div class="col-right">
<button id="saveSettings" type="submit" @onclick="@SaveCalendarSettings" class="btn">Save</button>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
@code {
SfTextBox? SubjectRef;
SfSwitch<bool>? ViewRef;
SfTextBox? DescriptionRef;
SfMultiSelect<int[], CalendarData>? ResourceRef;
SfSchedule<Events> ScheduleRef;
SfContextMenu<Syncfusion.Blazor.Navigations.MenuItem>? ContextMenuObj;
SfDropDownList<int, CalendarData>? CalendarRef;
private CalendarSettings calendarSettings = new CalendarSettings();
private Events events = new Events();
private int ChurchID;
private int EditEventID;
private string? userName;
private string? userFName;
private string? userLName;
private ActivityLog activityLogs = new ActivityLog();
string TimezoneValue;
protected override async Task OnInitializedAsync()
{
await Task.Run(() => GetChurchIDAsync());
}
protected override async Task OnAfterRenderAsync(bool firstRender)
{
if (firstRender)
{
TimezoneValue = await JsRuntime.InvokeAsync<string>("eval", "(function(){try { return ''+ Intl.DateTimeFormat().resolvedOptions().timeZone; } catch(e) {} return 'UTC';}())");
EventsList = await Task.Run(() => GetEventsListAsync());
LoadCalendarSettings();
}
}
private async Task GetChurchIDAsync()
{
var authState = await AuthState.GetAuthenticationStateAsync();
var user = authState.User;
userName = user.Identity.Name.ToString();
var userClaims = await UserManager.FindByNameAsync(user.Identity.Name);
ChurchID = userClaims.ChurchID;
userFName = userClaims.FirstName;
userLName = userClaims.LastName;
}
private async void SaveCalendarSettings()
{
using (var saveCalendarSettingsContext = _dbFactory.CreateDbContext())
{
calendarSettings = await Task.Run(() => GetCalendarSettingsAsync());
if (calendarSettings != null) //Indicates this is an update to settings
{
if (WorkDays != null)
{
calendarSettings.WorkDays = String.Join(",", WorkDays.Select(w => w.ToString()).ToArray());
}
calendarSettings.DayStart = DayStartHour;
calendarSettings.DayEnd = DayEndHour;
calendarSettings.WorkStart = WorkStartHour;
calendarSettings.WorkEnd = WorkEndHour;
calendarSettings.SlotDuration = SlotInterval;
calendarSettings.SlotCount = SlotCount;
calendarSettings.ToolTip = TooltipEnable;
calendarSettings.RowAutoHeight = isRowAutoHeight;
saveCalendarSettingsContext.CalendarSettings.Update(calendarSettings);
await saveCalendarSettingsContext.SaveChangesAsync();
}
else //Indicates these are new settings
{
calendarSettings = new CalendarSettings();
if (WorkDays != null)
{
calendarSettings.WorkDays = String.Join(",", WorkDays.Select(w => w.ToString()).ToArray());
}
else
{
calendarSettings.WorkDays = null;
}
calendarSettings.DayStart = DayStartHour;
calendarSettings.DayEnd = DayEndHour;
calendarSettings.WorkStart = WorkStartHour;
calendarSettings.WorkEnd = WorkEndHour;
calendarSettings.SlotDuration = SlotInterval;
calendarSettings.SlotCount = SlotCount;
calendarSettings.ToolTip = TooltipEnable;
calendarSettings.RowAutoHeight = isRowAutoHeight;
calendarSettings.UserName = userName;
calendarSettings.ChurchInfo_ChurchID = ChurchID;
await saveCalendarSettingsContext.CalendarSettings.AddAsync(calendarSettings);
await saveCalendarSettingsContext.SaveChangesAsync();
}
IsSettingsVisible = false;
await InvokeAsync(() => PopupNotificationBox.PopupMessage("Settings Saved", "Calendar Settings for " + calendarSettings.UserName + " saved.", _notice));
}
}
private async void LoadCalendarSettings()
{
string StartDayStr;
string EndDayStr;
string StartWorkStr;
string EndWorkStr;
calendarSettings = await Task.Run(() => GetCalendarSettingsAsync());
if (calendarSettings != null)
{
if (calendarSettings.WorkDays != null)
{
WorkDays = calendarSettings.WorkDays.Split(",").Select(w => Convert.ToInt32(w)).ToArray();
}
else
{
WorkDays = null;
}
DayStartHour = calendarSettings.DayStart;
StartDayStr = Convert.ToDateTime(await ConvertToLocalTime.UTCToLocal(DateTime.UtcNow, JsRuntime)).ToShortDateString() + " " + DayStartHour;
ScheduleStartHour = Convert.ToDateTime(StartDayStr);
DayEndHour = calendarSettings.DayEnd;
EndDayStr = Convert.ToDateTime(await ConvertToLocalTime.UTCToLocal(DateTime.UtcNow, JsRuntime)).ToShortDateString() + " " + DayEndHour;
ScheduleEndHour = Convert.ToDateTime(EndDayStr);
WorkStartHour = calendarSettings.WorkStart;
StartWorkStr = Convert.ToDateTime(await ConvertToLocalTime.UTCToLocal(DateTime.UtcNow, JsRuntime)).ToShortDateString() + " " + WorkStartHour;
StartWorkHour = Convert.ToDateTime(StartWorkStr);
WorkEndHour = calendarSettings.WorkEnd;
EndWorkStr = Convert.ToDateTime(await ConvertToLocalTime.UTCToLocal(DateTime.UtcNow, JsRuntime)).ToShortDateString() + " " + WorkEndHour;
EndWorkHour = Convert.ToDateTime(EndWorkStr);
SlotInterval = calendarSettings.SlotDuration;
SlotCount = calendarSettings.SlotCount;
TooltipEnable = calendarSettings.ToolTip;
isRowAutoHeight = calendarSettings.RowAutoHeight;
}
else
{
await InvokeAsync(() => PopupNotificationBox.PopupMessage("Settings Not Found", "No Calendar Settings Found.", _notice));
}
}
public class CalendarData
{
public string? CalendarName { get; set; }
public string? CalendarColor { get; set; }
public int CalendarId { get; set; }
}
public class WeekDays
{
public string? Name { get; set; }
public int Value { get; set; }
}
public class SlotData : WeekDays { }
public class TimeFormatData
{
public string? Name { get; set; }
public string? Value { get; set; }
}
public class WeekNumbers
{
public string? Name { get; set; }
public string? Value { get; set; }
}
public class Timezone
{
public string? Name { get; set; }
public string? Key { get; set; }
public string? Value { get; set; }
}
public CellClickEventArgs? CellData { get; set; }
private bool isCell { get; set; }
private bool isEvent { get; set; }
private bool isRecurrence { get; set; }
private int SlotCount { get; set; } = 2;
private int SlotInterval { get; set; } = 60;
private bool EnableGroup { get; set; } = true;
private bool TooltipEnable { get; set; } = true;
private bool isRowAutoHeight { get; set; } = false;
private bool EnableTimeScale { get; set; } = true;
private bool ShowWeekNumber { get; set; } = false;
private CalendarWeekRule WeekRule { get; set; } = CalendarWeekRule.FirstDay;
private string WeeklyRule { get; set; } = "Off";
private View CurrentView { get; set; } = View.Week;
private string SelectedView { get; set; } = "Week";
private string DayStartHour { get; set; }
private string DayEndHour { get; set; }
private string WorkStartHour { get; set; }
private string WorkEndHour { get; set; }
private string TimeFormat { get; set; } = "hh:mm tt";
private bool IsSettingsVisible { get; set; } = false;
public string[] GroupData = new string[] { "Calendars" };
private DateTime SystemTime { get; set; } = DateTime.UtcNow;
private DateTime SelectedDate { get; set; } = DateTime.Today;
private DateTime? StartWorkHour { get; set; }
private DateTime? EndWorkHour { get; set; }
private DateTime? ScheduleStartHour { get; set; }
private DateTime? ScheduleEndHour { get; set; }
private int[] SelectedResource { get; set; } = new int[] { 1 };
private int[] WorkDays { get; set; }
private Timezone TimezoneData { get; set; } = new Timezone() { Name = "UTC+00:00", Key = "UTC", Value = "UTC" };
private Syncfusion.Blazor.Data.Query ResourceQuery { get; set; } = new Syncfusion.Blazor.Data.Query().Where(new WhereFilter() { Field = "CalendarId", Operator = "equal", value = 1 });
public List<CalendarData> Calendars { get; set; } = new List<CalendarData> {
new CalendarData { CalendarName = "Church", CalendarId = 1, CalendarColor = "#c43081" },
new CalendarData { CalendarName= "Company", CalendarId= 2, CalendarColor= "#ff7f50" },
new CalendarData { CalendarName= "Birthday", CalendarId= 3, CalendarColor= "#AF27CD" },
new CalendarData { CalendarName= "Holiday", CalendarId= 4, CalendarColor= "#808000" }
};
private List<SlotData> SlotIntervalDataSource = new List<SlotData>() {
new SlotData() { Name = "1 hour", Value = 60 },
new SlotData() { Name = "1.5 hours", Value = 90 },
new SlotData() { Name = "2 hours", Value = 120 },
new SlotData() { Name = "2.5 hours", Value = 150 },
new SlotData() { Name = "3 hours", Value = 180 },
new SlotData() { Name = "3.5 hours", Value = 210 },
new SlotData() { Name = "4 hours", Value = 240 },
new SlotData() { Name = "4.5 hours", Value = 270 },
new SlotData() { Name = "5 hours", Value = 300 },
new SlotData() { Name = "5.5 hours", Value = 330 },
new SlotData() { Name = "6 hours", Value = 360 },
new SlotData() { Name = "6.5 hours", Value = 390 },
new SlotData() { Name = "7 hours", Value = 420 },
new SlotData() { Name = "7.5 hours", Value = 450 },
new SlotData() { Name = "8 hours", Value = 480 },
new SlotData() { Name = "8.5 hours", Value = 510 },
new SlotData() { Name = "9 hours", Value = 540 },
new SlotData() { Name = "9.5 hours", Value = 570 },
new SlotData() { Name = "10 hours", Value = 600 },
new SlotData() { Name = "10.5 hours", Value = 630 },
new SlotData() { Name = "11 hours", Value = 660 },
new SlotData() { Name = "11.5 hours", Value = 690 },
new SlotData() { Name = "12 hours", Value = 720 }
};
private List<SlotData> SlotCountDataSource = new List<SlotData>() {
new SlotData() { Name = "1", Value = 1 },
new SlotData() { Name = "2", Value = 2 },
new SlotData() { Name = "3", Value = 3 },
new SlotData() { Name = "4", Value = 4 },
new SlotData() { Name = "5", Value = 5 },
new SlotData() { Name = "6", Value = 6 },
new SlotData() { Name = "7", Value = 7 },
new SlotData() { Name = "8", Value = 8 },
new SlotData() { Name = "9", Value = 9 },
new SlotData() { Name = "10", Value = 10 }
};
private List<TimeFormatData> TimeFormatDataSource = new List<TimeFormatData>()
{
new TimeFormatData() { Name = "12 hours", Value = "hh:mm tt" },
new TimeFormatData() { Name = "24 hours", Value = "HH:mm" }
};
private List<WeekNumbers> WeekNumbersData = new List<WeekNumbers>()
{
new WeekNumbers() { Name = "Off", Value = "Off" },
new WeekNumbers() { Name = "First Day Of Year", Value = "FirstDay" },
new WeekNumbers() { Name = "First Full Week", Value = "FirstFullWeek" },
new WeekNumbers() { Name = "First Four-Day Week", Value = "FirstFourDayWeek" }
};
private List<string> ScheduleViews { get; set; } = new List<string>() { "Day", "Week", "WorkWeek", "Month", "Year", "Agenda", "TimelineDay", "TimelineWeek", "TimelineWorkWeek", "TimelineMonth", "TimelineYear" };
private List<WeekDays> WeekCollection { get; set; } = new List<WeekDays>() {
new WeekDays () { Name = "Sunday", Value = 0 },
new WeekDays () { Name = "Monday", Value = 1 },
new WeekDays () { Name = "Tuesday", Value = 2 },
new WeekDays () { Name = "Wednesday", Value = 3 },
new WeekDays () { Name = "Thursday", Value = 4 },
new WeekDays () { Name = "Friday", Value = 5 },
new WeekDays () { Name = "Saturday", Value = 6 }
};
private List<Timezone> TimezoneCollection { get; set; } = new List<Timezone>() {
new Timezone () { Name = "UTC-08:00", Key = "Pacific Standard Time", Value = "Pacific" },
new Timezone () { Name = "UTC-07:00", Key = "Mountain Standard Time", Value = "Mountain" },
new Timezone () { Name = "UTC-06:00", Key = "Central Standard Time", Value = "Central" },
new Timezone () { Name = "UTC-05:00", Key = "Eastern Standard Time", Value = "Eastern" },
new Timezone () { Name = "UTC-04:00", Key = "Atlantic Standard Time", Value = "Atlantic" },
//new Timezone () { Name = "UTC-03:00", Key = "Greenland Standard Time", Value = "Greenland" },
//new Timezone () { Name = "UTC-02:00", Key = "Mid-Atlantic Standard Time", Value = "America/Sao_Paulo" },
//new Timezone () { Name = "UTC-01:00", Key = "Cape Verde Standard Time", Value = "Atlantic/Cape_Verde" },
new Timezone () { Name = "UTC+00:00", Key = "UTC", Value = "UTC" },
//new Timezone () { Name = "UTC+01:00", Key = "Romance Standard Time", Value = "Europe/Paris" },
//new Timezone () { Name = "UTC+03:00", Key = "Russian Standard Time", Value = "Europe/Moscow" },
//new Timezone () { Name = "UTC+05:30", Key = "India Standard Time", Value = "Asia/Kolkata" },
//new Timezone () { Name = "UTC+08:00", Key = "W. Australia Standard Time", Value = "Australia/Perth" },
//new Timezone () { Name = "UTC+10:00", Key = "E. Australia Standard Time", Value = "Australia/Brisbane" },
//new Timezone () { Name = "UTC+10:30", Key = "Lord Howe Standard Time", Value = "Australia/Adelaide" },
//new Timezone () { Name = "UTC+13:00", Key = "New Zealand Standard Time", Value = "Pacific/Auckland" }
};
private Dictionary<string, object> htmlAttribute = new Dictionary<string, object>() {
{"tabindex", "-1" }
};
private void OnViewChange(Syncfusion.Blazor.Buttons.ChangeEventArgs<bool> args)
{
switch (this.CurrentView)
{
case View.Day:
case View.TimelineDay:
this.CurrentView = args.Checked ? View.TimelineDay : View.Day;
break;
case View.Week:
case View.TimelineWeek:
this.CurrentView = args.Checked ? View.TimelineWeek : View.Week;
break;
case View.WorkWeek:
case View.TimelineWorkWeek:
this.CurrentView = args.Checked ? View.TimelineWorkWeek : View.WorkWeek;
break;
case View.Month:
case View.TimelineMonth:
this.CurrentView = args.Checked ? View.TimelineMonth : View.Month;
break;
case View.Year:
case View.TimelineYear:
this.CurrentView = args.Checked ? View.TimelineYear : View.Year;
break;
case View.Agenda:
this.CurrentView = View.Agenda;
break;
}
}
private void OnDayView()
{
this.CurrentView = this.ViewRef.Checked ? View.TimelineDay : View.Day;
}
private void OnWeekView()
{
this.CurrentView = this.ViewRef.Checked ? View.TimelineWeek : View.Week;
}
private void OnWorkWeekView()
{
this.CurrentView = this.ViewRef.Checked ? View.TimelineWorkWeek : View.WorkWeek;
}
private void OnMonthView()
{
this.CurrentView = this.ViewRef.Checked ? View.TimelineMonth : View.Month;
}
private void OnYearView()
{
this.CurrentView = this.ViewRef.Checked ? View.TimelineYear : View.Year;
}
private void OnAgendaView()
{
this.CurrentView = View.Agenda;
}
private async void OnSettingsClick()
{
this.IsSettingsVisible = !this.IsSettingsVisible;
StateHasChanged();
await this.ScheduleRef.RefreshEventsAsync();
}
private string GetEventDetails(Events data)
{
return data.StartTime.ToString("dddd dd, MMMM yyyy", CultureInfo.InvariantCulture) + " (" + data.StartTime.ToString(TimeFormat, CultureInfo.InvariantCulture) + "-" + data.EndTime.ToString(TimeFormat, CultureInfo.InvariantCulture) + ")";
}
public static string GetDateHeaderText(DateTime date)
{
return date.ToString("dd ddd", CultureInfo.InvariantCulture);
}
private string GetHeaderStyles(Events data)
{
if (data.ElementType == "cell")
{
return "align-items: center ; color: #919191;";
}
else
{
CalendarData resData = GetResourceData(data);
return "background:" + (resData == null ? "#007bff" : resData.CalendarColor) + "; color: #FFFFFF;";
}
}
public void OnToolbarCreated()
{
Timer timer = new Timer(1000);
timer.Elapsed += new ElapsedEventHandler((object sender, ElapsedEventArgs e) =>
{
string key = this.TimezoneData.Key ?? "UTC";
SystemTime = this.TimeConvertor(key);
ScheduleRef?.PreventRender();
InvokeAsync(() => { StateHasChanged(); });
});
timer.Enabled = true;
}
private CalendarData GetResourceData(Events data)
{
if (data.CalendarId != 0)
{
int resourceId = SelectedResource.Where(item => item == data.CalendarId).FirstOrDefault();
CalendarData resourceData = this.Calendars.Where(item => item.CalendarId == resourceId).FirstOrDefault();
return resourceData;
}
return null;
}
private DateTime TimeConvertor(string TimeZoneId)
{
return TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, TimeZoneInfo.FindSystemTimeZoneById(TimeZoneId));
}
public void OnCellDoubleClick(CellClickEventArgs args)
{
args.Cancel = true;
}
private async void OnNewEventAdd()
{
DateTime Date = this.ScheduleRef.SelectedDate;
DateTime Today = await ConvertToLocalTime.UTCToLocal(DateTime.UtcNow, JsRuntime);
Events eventData = new Events
{
Subject = "",
StartTime = Today,
EndTime = Today.AddHours(1),
Location = "",
Description = "",
IsAllDay = false,
CalendarId = this.ResourceRef.Value[0],
CreatedBy = userName,
CreatedDate = await ConvertToLocalTime.UTCToLocal(DateTime.UtcNow, JsRuntime),
ChurchInfo_ChurchID = ChurchID
};
await ScheduleRef.OpenEditorAsync(eventData, CurrentAction.Add);
}
private async void OnNewRecurringEventAdd()
{
DateTime Date = this.ScheduleRef.SelectedDate;
DateTime Today = await ConvertToLocalTime.UTCToLocal(DateTime.UtcNow, JsRuntime);
Events eventData = new Events
{
Subject = "",
StartTime = Today,
EndTime = Today.AddHours(1),
Location = "",
Description = "",
IsAllDay = false,
CalendarId = this.ResourceRef.Value[0],
RecurrenceRule = "FREQ=DAILY;INTERVAL=1;",
CreatedBy = userName,
CreatedDate = await ConvertToLocalTime.UTCToLocal(DateTime.UtcNow, JsRuntime)
};
await ScheduleRef.OpenEditorAsync(eventData, CurrentAction.Add);
}
private async Task OnAdd(MouseEventArgs args, Events data)
{
await ScheduleRef.CloseQuickInfoPopupAsync();
Events eventData = new Events
{
Subject = SubjectRef.Value,
Description = DescriptionRef.Value,
StartTime = data.StartTime,
EndTime = data.EndTime,
CalendarId = CalendarRef.Value,
Location = data.Location,
IsAllDay = data.IsAllDay,
RecurrenceException = data.RecurrenceException,
RecurrenceID = data.RecurrenceID,
RecurrenceRule = data.RecurrenceRule
};
await ScheduleRef.AddEvent(data);
ScheduleRef.CloseEditor();
}
private async void EventsControl(ActionEventArgs<Events> args)
{
using (var eventsControlContext = _dbFactory.CreateDbContext())
{
if (args.ActionType == ActionType.EventCreate)
{
foreach (var eventData in args.AddedRecords)
{
events = new Events();
events.CalendarId = eventData.CalendarId;
events.StartTime = eventData.StartTime;
events.EndTime = eventData.EndTime;
events.Subject = eventData.Subject;
events.IsAllDay = eventData.IsAllDay;
events.Description = eventData.Description;
events.Location = eventData.Location;
events.RecurrenceID = eventData.RecurrenceID;
events.RecurrenceRule = eventData.RecurrenceRule;
events.RecurrenceException = eventData.RecurrenceException;
events.ChurchInfo_ChurchID = ChurchID;
events.CreatedBy = userName;
events.CreatedDate = await ConvertToLocalTime.UTCToLocal(DateTime.UtcNow, JsRuntime);
await eventsControlContext.Events.AddAsync(events);
await eventsControlContext.SaveChangesAsync();
//Activity Log Entry
eventsControlContext.Entry(activityLogs).State = EntityState.Detached; //Drops current Activity Log entry to avoid failure
activityLogs = new ActivityLog();
activityLogs.ActivityPage = "Event";
activityLogs.ActivityType = "Add";
activityLogs.ActivityDetails = events.Subject + " - Starting " + events.StartTime;
activityLogs.ActivityDate = await ConvertToLocalTime.UTCToLocal(DateTime.UtcNow, JsRuntime);
activityLogs.UserName = userName;
activityLogs.UserFName = userFName;
activityLogs.UserLName = userLName;
activityLogs.ChurchInfo_ChurchID = ChurchID;
await eventsControlContext.ActivityLogs.AddAsync(activityLogs);
await eventsControlContext.SaveChangesAsync();
}
}
else if (args.ActionType == ActionType.EventChange)
{
foreach (var eventData in args.ChangedRecords)
{
EditEventID = eventData.EventsID;
events = await Task.Run(() => GetEventAsync());
events.CalendarId = eventData.CalendarId;
events.StartTime = eventData.StartTime;
events.EndTime = eventData.EndTime;
events.Subject = eventData.Subject;
events.IsAllDay = eventData.IsAllDay;
events.Description = eventData.Description;
events.Location = eventData.Location;
events.RecurrenceID = eventData.RecurrenceID;
events.RecurrenceRule = eventData.RecurrenceRule;
events.RecurrenceException = eventData.RecurrenceException;
events.ChurchInfo_ChurchID = ChurchID;
events.ModifiedBy = userName;
events.ModifiedDate = await ConvertToLocalTime.UTCToLocal(DateTime.UtcNow, JsRuntime);
eventsControlContext.Events.Update(events);
await eventsControlContext.SaveChangesAsync();
//Activity Log Entry
eventsControlContext.Entry(activityLogs).State = EntityState.Detached; //Drops current Activity Log entry to avoid failure
activityLogs = new ActivityLog();
activityLogs.ActivityPage = "Event";
activityLogs.ActivityType = "Update";
activityLogs.ActivityDetails = events.Subject + " - Starting " + events.StartTime;
activityLogs.ActivityDate = await ConvertToLocalTime.UTCToLocal(DateTime.UtcNow, JsRuntime);
activityLogs.UserName = userName;
activityLogs.UserFName = userFName;
activityLogs.UserLName = userLName;
activityLogs.ChurchInfo_ChurchID = ChurchID;
await eventsControlContext.ActivityLogs.AddAsync(activityLogs);
await eventsControlContext.SaveChangesAsync();
}
}
else if (args.ActionType == ActionType.EventRemove)
{
foreach (var eventData in args.DeletedRecords)
{
eventsControlContext.Remove(eventData);
await eventsControlContext.SaveChangesAsync();
//Activity Log Entry
eventsControlContext.Entry(activityLogs).State = EntityState.Detached; //Drops current Activity Log entry to avoid failure
activityLogs = new ActivityLog();
activityLogs.ActivityPage = "Event";
activityLogs.ActivityType = "Delete";
activityLogs.ActivityDetails = events.Subject + " - Starting " + events.StartTime;
activityLogs.ActivityDate = await ConvertToLocalTime.UTCToLocal(DateTime.UtcNow, JsRuntime);
activityLogs.UserName = userName;
activityLogs.UserFName = userFName;
activityLogs.UserLName = userLName;
activityLogs.ChurchInfo_ChurchID = ChurchID;
await eventsControlContext.ActivityLogs.AddAsync(activityLogs);
await eventsControlContext.SaveChangesAsync();
}
}
ScheduleRef.CloseEditor();
}
}
public void OnChange(Syncfusion.Blazor.DropDowns.ChangeEventArgs<string> args)
{
View currentView = new View();
switch (args.Value)
{
case "Day":
currentView = View.Day;
break;
case "Week":
currentView = View.Week;
break;
case "WorkWeek":
currentView = View.WorkWeek;
break;
case "Month":
currentView = View.Month;
break;
case "Year":
currentView = View.Year;
break;
case "Agenda":
currentView = View.Agenda;
break;
case "TimelineDay":
currentView = View.TimelineDay;
break;
case "TimelineWeek":
currentView = View.TimelineWeek;
break;
case "TimelineWorkWeek":
currentView = View.TimelineWorkWeek;
break;
case "TimelineMonth":
currentView = View.TimelineMonth;
break;
case "TimelineYear":
currentView = View.TimelineYear;
break;
}
this.CurrentView = currentView;
}
public void OnWeekNumberChange(Syncfusion.Blazor.DropDowns.ChangeEventArgs<string, WeekNumbers> args)
{
switch (args.Value)
{
case "Off":
this.ShowWeekNumber = false;
break;
case "FirstDay":
this.ShowWeekNumber = true;
this.WeekRule = CalendarWeekRule.FirstDay;
break;
case "FirstFullWeek":
this.ShowWeekNumber = true;
this.WeekRule = CalendarWeekRule.FirstFullWeek;
break;
case "FirstFourDayWeek":
this.ShowWeekNumber = true;
this.WeekRule = CalendarWeekRule.FirstFourDayWeek;
break;
}
}
public void OnWorkDaysChange(Syncfusion.Blazor.DropDowns.MultiSelectChangeEventArgs<int[]> args)
{
this.WorkDays = args.Value;
}
public void OnDayStartHourChange(Syncfusion.Blazor.Calendars.ChangeEventArgs<DateTime?> args)
{
this.DayStartHour = args.Text;
}
public void OnDayEndHourChange(Syncfusion.Blazor.Calendars.ChangeEventArgs<DateTime?> args)
{
this.DayEndHour = args.Text;
}
public void OnWorkStartHourChange(Syncfusion.Blazor.Calendars.ChangeEventArgs<DateTime?> args)
{
this.WorkStartHour = args.Text;
}
public void OnWorkEndHourChange(Syncfusion.Blazor.Calendars.ChangeEventArgs<DateTime?> args)
{
this.WorkEndHour = args.Text;
}
public void OnTimezoneChange(Syncfusion.Blazor.DropDowns.ChangeEventArgs<string, Timezone> args)
{
this.TimezoneData = args.ItemData;
var zones = TimeZoneInfo.GetSystemTimeZones();
SystemTime = this.TimeConvertor(this.TimezoneData.Key);
}
public void OnResourceChange(Syncfusion.Blazor.DropDowns.MultiSelectChangeEventArgs<int[]> args)
{
WhereFilter predicate = new WhereFilter();
if (args.Value != null)
{
predicate = new WhereFilter() { Field = "CalendarId", Operator = "equal", value = args.Value.Count() > 0 ? args.Value[0] : 0 }.
Or(new WhereFilter() { Field = "CalendarId", Operator = "equal", value = args.Value.Count() > 1 ? args.Value[1] : 0 }).
Or(new WhereFilter() { Field = "CalendarId", Operator = "equal", value = args.Value.Count() > 2 ? args.Value[2] : 0 }).
Or(new WhereFilter() { Field = "CalendarId", Operator = "equal", value = args.Value.Count() > 3 ? args.Value[3] : 0 });
}
else
{
predicate = new WhereFilter() { Field = "CalendarId", Operator = "equal", value = 1 };
}
this.ResourceQuery = new Syncfusion.Blazor.Data.Query().Where(predicate);
}
public void OnGroupChange(Syncfusion.Blazor.Buttons.ChangeEventArgs<bool> args)
{
this.EnableGroup = args.Checked;
this.GroupData = args.Checked ? new string[] { "Calendars" } : null;
}
public void OnTimeScaleChange(Syncfusion.Blazor.Buttons.ChangeEventArgs<bool> args)
{
this.EnableTimeScale = args.Checked;
}
public void OnRowAutoHeightChange(Syncfusion.Blazor.Buttons.ChangeEventArgs<bool> args)
{
this.isRowAutoHeight = args.Checked;
}
public void OnTooltipChange(Syncfusion.Blazor.Buttons.ChangeEventArgs<bool> args)
{
this.TooltipEnable = args.Checked;
}
public void OnSlotIntervalChange(Syncfusion.Blazor.DropDowns.ChangeEventArgs<int, SlotData> args)
{
this.SlotInterval = args.Value;
}
public void OnSlotCountChange(Syncfusion.Blazor.DropDowns.ChangeEventArgs<int, SlotData> args)
{
this.SlotCount = args.Value;
}
public async Task OnFileUploadChange(Syncfusion.Blazor.Inputs.UploadChangeEventArgs args)
{
foreach (Syncfusion.Blazor.Inputs.UploadFiles file in args.Files)
{
file.Stream.Position = 0;
StreamReader reader = new StreamReader(file.Stream);
await ScheduleRef.ImportICalendarAsync(reader.ReadToEnd());
}
}
public async void OnPrintClick()
{
await ScheduleRef.PrintAsync();
}
public async void OnExportClick(Syncfusion.Blazor.SplitButtons.MenuEventArgs args)
{
if (args.Item.Text == "Excel")
{
List<Events> ExportDatas = new List<Events>();
List<Events> EventCollection = await ScheduleRef.GetEventsAsync();
List<Syncfusion.Blazor.Schedule.Resource> ResourceCollection = ScheduleRef.GetResourceCollections();
List<CalendarData> ResourceData = ResourceCollection[0].DataSource as List<CalendarData>;
for (int a = 0, count = ResourceData.Count(); a < count; a++)
{
List<Events> datas = EventCollection.Where(e => e.CalendarId == ResourceData[a].CalendarId).ToList();
foreach (Events data in datas)
{
ExportDatas.Add(data);
}
}
ExportOptions Options = new ExportOptions()
{
ExportType = ExcelFormat.Xlsx,
CustomData = ExportDatas,
Fields = new string[] { "Id", "Subject", "StartTime", "EndTime", "CalendarId" }
};
await ScheduleRef.ExportToExcelAsync(Options);
}
else
{
await ScheduleRef.ExportToICalendarAsync();
}
}
public async Task OnOpen(BeforeOpenCloseMenuEventArgs<Syncfusion.Blazor.Navigations.MenuItem> args)
{
if (args.ParentItem == null)
{
CellData = await ScheduleRef.GetTargetCellAsync((int)args.Left, (int)args.Top);
if (CellData == null)
{
events = await ScheduleRef.GetTargetEventAsync((int)args.Left, (int)args.Top);
if (events.EventsID == 0)
{
args.Cancel = true;
}
if (events.RecurrenceRule != null)
{
isCell = isEvent = true;
isRecurrence = false;
}
else
{
isCell = isRecurrence = true;
isEvent = false;
}
}
else
{
isCell = false;
isEvent = isRecurrence = true;
}
}
}
public async Task OnItemSelected(MenuEventArgs<Syncfusion.Blazor.Navigations.MenuItem> args)
{
var SelectedMenuItem = args.Item.Id;
var ActiveCellsData = await ScheduleRef.GetSelectedCellsAsync();
if (ActiveCellsData == null)
{
ActiveCellsData = CellData;
}
switch (SelectedMenuItem)
{
case "Today":
string key = this.TimezoneData.Key ?? "UTC";
SelectedDate = this.TimeConvertor(key);
break;
case "Add":
await ScheduleRef.OpenEditorAsync(ActiveCellsData, CurrentAction.Add);
break;
case "AddRecurrence":
await ScheduleRef.OpenEditorAsync(ActiveCellsData, CurrentAction.Add, RepeatType.Daily);
break;
case "Save":
await ScheduleRef.OpenEditorAsync(events, CurrentAction.Save);
break;
case "EditOccurrence":
await ScheduleRef.OpenEditorAsync(events, CurrentAction.EditOccurrence);
break;
case "EditSeries":
List<Events> Events = await ScheduleRef.GetEventsAsync();
events = (Events)Events.Where(data => data.EventsID == events.RecurrenceID).FirstOrDefault();
await ScheduleRef.OpenEditorAsync(events, CurrentAction.EditSeries);
break;
case "Delete":
await ScheduleRef.DeleteEventAsync(events);
break;
case "DeleteOccurrence":
await ScheduleRef.DeleteEventAsync(events, CurrentAction.DeleteOccurrence);
break;
case "DeleteSeries":
await ScheduleRef.DeleteEventAsync(events, CurrentAction.DeleteSeries);
break;
}
}
List<Events>? EventsList;
public async Task<List<Events>> GetEventsListAsync()
{
using (var getEventsListContext = _dbFactory.CreateDbContext())
{
return await getEventsListContext.Events.Where(e => e.ChurchInfo_ChurchID == ChurchID).ToListAsync();
}
}
public async Task<Events> GetEventAsync()
{
using (var getEventContext = _dbFactory.CreateDbContext())
{
return await getEventContext.Events.Where(e => e.ChurchInfo_ChurchID == ChurchID && e.EventsID == EditEventID).FirstOrDefaultAsync();
}
}
public async Task<CalendarSettings> GetCalendarSettingsAsync()
{
using (var getCalendarSettingsContext = _dbFactory.CreateDbContext())
{
return await getCalendarSettingsContext.CalendarSettings.Where(cs => cs.ChurchInfo_ChurchID == ChurchID && cs.UserName == userName).FirstOrDefaultAsync();
}
}
}
Hi Andrew,
We have checked on your shared codes but unfortunately, we are not able to reproduce the issue at our end. Could you please get back to us with the below additional details that help us to validate the issue further and provide the solution earlier?
Regards,
Ruksar Moosa Sait