//private static string PartialDayPattern(Appointment appt, RecurrencePattern pattern) //{ // TimeZoneInfo local = TimeZoneInfo.Local; // string olson = OlsonConverter.TimeZoneInfoToOlsonTimeZone(local); // return DTSTART_TZID_PREFIX + olson + ":" + appt.StartDate.ToString(DateTimeLocalFormat) + "\r\n" // + DTEND_TZID_PREFIX + olson + ":" + appt.EndDate.ToString(DateTimeLocalFormat) + "\r\n" // + RRULE + ":" + pattern.ToString() + "\r\n" // + "BEGIN:VTIMEZONE" + "\r\n" // + TZID + ":" + olson + "\r\n" // + "X-LIC-LOCATION:" + olson + "\r\n" // + "BEGIN:DAYLIGHT\r\n" // + TZOFFSETFROM + ":" + JoinTimeSpan(local.BaseUtcOffset) + "\r\n" // + TZOFFSETTO + ":" + JoinTimeSpan(local.BaseUtcOffset.Add(TimeSpan.FromHours(1))) + "\r\n" // + TZNAME + ":" + local.DaylightName.Acronym() + "\r\n" // + DTSTART + ":19700308T020000\r\n" // + RRULE + ":FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\n" // + "END:DAYLIGHT\r\n" // + "BEGIN:STANDARD\r\n" // + TZOFFSETFROM + ":" + JoinTimeSpan(local.BaseUtcOffset.Add(TimeSpan.FromHours(1))) + "\r\n" // + TZOFFSETTO + ":" + JoinTimeSpan(local.BaseUtcOffset) + "\r\n" // + TZNAME + ":" + local.StandardName.Acronym() + "\r\n" // + DTSTART + ":19701101T020000\r\n" // + RRULE + ":FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\n" // + "END:STANDARD\r\n" // + "END:VTIMEZONE"; //} private static string[] PartialDayPattern(Appointment appt, RecurrencePattern pattern) { TimeZoneInfo local = TimeZoneInfo.Local; string olson = OlsonConverter.TimeZoneInfoToOlsonTimeZone(local); return(new string[] { DTSTART_TZID_PREFIX + olson + ":" + appt.StartDate.ToString(DateTimeLocalFormat), DTEND_TZID_PREFIX + olson + ":" + appt.EndDate.ToString(DateTimeLocalFormat), RRULE + ":" + pattern.ToString(), "BEGIN:VTIMEZONE", TZID + ":" + olson, "X-LIC-LOCATION:" + olson, "BEGIN:DAYLIGHT", TZOFFSETFROM + ":" + JoinTimeSpan(local.BaseUtcOffset), TZOFFSETTO + ":" + JoinTimeSpan(local.BaseUtcOffset.Add(TimeSpan.FromHours(1))), TZNAME + ":" + local.DaylightName.Acronym(), DTSTART + ":19700308T020000", RRULE + ":FREQ=YEARLY;BYMONTH=3;BYDAY=2SU", "END:DAYLIGHT", "BEGIN:STANDARD", TZOFFSETFROM + ":" + JoinTimeSpan(local.BaseUtcOffset.Add(TimeSpan.FromHours(1))), TZOFFSETTO + ":" + JoinTimeSpan(local.BaseUtcOffset), TZNAME + ":" + local.StandardName.Acronym(), DTSTART + ":19701101T020000", RRULE + ":FREQ=YEARLY;BYMONTH=11;BYDAY=1SU", "END:STANDARD", "END:VTIMEZONE" }); }
internal Calendar(Template template, TimeManager timeManager) { _timeManager = timeManager; _endTime = _timeManager.ToUtc(template.End); var sb = new StringBuilder(); sb.AppendLine(template.Description); sb.AppendLine(); sb.Append($"Цена: {template.Price}"); if (!string.IsNullOrWhiteSpace(template.Hosts)) { sb.AppendLine(); sb.Append($"Кто ведёт: {template.Hosts}"); } string icsDescription = sb.ToString(); sb.AppendLine(); sb.AppendLine(); sb.Append($"Принять участе: {template.Uri}"); string googleDetails = sb.ToString(); var rule = new RecurrencePattern(FrequencyType.Weekly); CalendarEvent icsEvent = AsIcsEvent(template, icsDescription, rule); IcsContent = GetIcsContent(icsEvent); GoogleCalendarLink = AsGoogleLink(template, googleDetails, rule.ToString()); }
//private static string AllDayPattern(Appointment appt, RecurrencePattern pattern) //{ // return DTSTART_VALUE_DATE + ":" + appt.StartDate.Date.ToString(DateFormat) + "\r\n" // + DTEND_VALUE_DATE + ":" + appt.EndDate.Date.ToString(DateFormat) + "\r\n" // + RRULE + ":" + pattern.ToString(); //} private static string[] AllDayPattern(Appointment appt, RecurrencePattern pattern) { return(new string[] { DTSTART_VALUE_DATE + ":" + appt.StartDate.Date.ToString(DateFormat), DTEND_VALUE_DATE + ":" + appt.EndDate.Date.ToString(DateFormat), RRULE + ":" + pattern.ToString() }); }
public RRuleTextBuilderTestHelper(string rRuleString, string readableString, string culture) { RRuleString = rRuleString; ReadableString = readableString; string rRuleStringC = RRuleTextBuilder.GetRRuleStringCorrection(rRuleString); recurrencePattern = new RecurrencePattern(rRuleStringC); RecreatedRRuleString = recurrencePattern.ToString(); ReadableResult = recurrencePattern.ToText(new CultureInfo(culture)); }
public ActionResult Create(GroupInstance groupinstance) { if (ModelState.IsValid) { //default recurrence once a week forever RecurrencePattern rp = new RecurrencePattern(FrequencyType.Weekly); groupinstance.RecurrenceRule = "RRULE:" + rp.ToString(); db.GroupInstances.Add(groupinstance); db.SaveChanges(); return Content(Boolean.TrueString); } //TODO: review error handling. This will fail since it is not filtering dropdowns for overlapping events!!! ViewBag.GroupId = new SelectList(db.Groups, "GroupId", "Name", groupinstance.GroupId); ViewBag.ClassroomId = new SelectList(db.Classrooms, "ClassroomID", "Name", groupinstance.ClassroomId); return Content("Please review your form"); }
public IActionResult CreateRRule([FromBody] RRuleWrapper RRuleWrapper) { if (RRuleWrapper == null) { var rRuleResultE = new RRuleResult() { ErrorText = "invalid data" }; return(new JsonResult(rRuleResultE)); } ; var recurrencePattern = new RecurrencePattern(RRuleWrapper.GetFrequencyType(), RRuleWrapper.Interval); switch (recurrencePattern.Frequency) { case FrequencyType.None: case FrequencyType.Secondly: case FrequencyType.Minutely: case FrequencyType.Hourly: case FrequencyType.Daily: break; case FrequencyType.Weekly: recurrencePattern.ByDay = RRuleWrapper.GetByDayList(); break; case FrequencyType.Monthly: recurrencePattern.ByDay = RRuleWrapper.GetByDayList(); recurrencePattern.ByMonthDay = RRuleWrapper.ByMonthDay; recurrencePattern.BySetPosition = RRuleWrapper.BySetPosition; break; case FrequencyType.Yearly: recurrencePattern.ByDay = RRuleWrapper.GetByDayList(); recurrencePattern.ByMonth = RRuleWrapper.ByMonth; recurrencePattern.ByMonthDay = RRuleWrapper.ByMonthDay; recurrencePattern.BySetPosition = RRuleWrapper.BySetPosition; break; default: break; } if (RRuleWrapper.Count > 0) { recurrencePattern.Count = RRuleWrapper.Count; } if (RRuleWrapper.Until.HasValue) { recurrencePattern.Until = RRuleWrapper.Until.Value; } //var rRuleResult = new RRuleResult() { RecurrencePatternString = recurrencePattern.ToString(), RecurrencePatternText = recurrencePattern.ToText() }; var browserLang = Request.Headers["Accept-Language"].ToString().Split(";").FirstOrDefault()?.Split(",").FirstOrDefault(); var rRuleResult = new RRuleResult() { RecurrencePatternString = recurrencePattern.ToString(), RecurrencePatternText = recurrencePattern.ToText(new CultureInfo(browserLang)) }; var startTime = RRuleWrapper.StartDate != null ? RRuleWrapper.StartDate : DateTime.Now; rRuleResult.RecurrencePatternList = RecurringRuleProcessor.GetAppointments(startTime, startTime.AddYears(maxYears), recurrencePattern.ToString()).Take(maxOccurences + 1).ToList(); if (rRuleResult.RecurrencePatternList.Count > maxOccurences) { rRuleResult.RecurrencePatternList.RemoveAt(maxOccurences); rRuleResult.HintText = $"there are more occurences, only first {maxOccurences} occurences in the next {maxYears} years at most are listed"; } return(new JsonResult(rRuleResult)); }