diff --git a/src/scripting/Elsa.Scripting.JavaScript/Handlers/ConfigureJavaScriptEngineWithDateTimeFeatures.cs b/src/scripting/Elsa.Scripting.JavaScript/Handlers/ConfigureJavaScriptEngineWithDateTimeFeatures.cs index 2aaa0409c..2b49b0cbd 100644 --- a/src/scripting/Elsa.Scripting.JavaScript/Handlers/ConfigureJavaScriptEngineWithDateTimeFeatures.cs +++ b/src/scripting/Elsa.Scripting.JavaScript/Handlers/ConfigureJavaScriptEngineWithDateTimeFeatures.cs @@ -24,6 +24,10 @@ namespace Elsa.Scripting.JavaScript.Handlers engine.SetValue( "instantFromDateTimeUtc", (Func) Instant.FromDateTimeUtc); + + engine.SetValue( + "instantFromUtc", + (Func) Instant.FromUtc); engine.SetValue( "currentInstant", @@ -55,12 +59,12 @@ namespace Elsa.Scripting.JavaScript.Handlers ); engine.SetValue( - "plus", + "addDurationTo", (Func) ((instant, duration) => instant.Plus(duration)) ); engine.SetValue( - "minus", + "subtractDurationFrom", (Func) ((instant, duration) => instant.Minus(duration)) ); @@ -86,7 +90,7 @@ namespace Elsa.Scripting.JavaScript.Handlers engine.SetValue( "formatInstant", - (Func) ((instant, format, cultureInfo) => + (Func) ((instant, format, cultureInfo) => instant.ToString(format, cultureInfo ?? CultureInfo.InvariantCulture)) ); @@ -99,18 +103,30 @@ namespace Elsa.Scripting.JavaScript.Handlers "instantFromLocalDate", (Func) (value => value.AtStartOfDayInZone(DateTimeZone.Utc).ToInstant()) ); + + engine.SetValue( + "durationBetween", + (Func) ((a, b) => a - b) + ); + + engine.SetValue( + "periodFromNow", + (Func) GetPeriodFromNow + ); return Task.CompletedTask; } - private LocalDateTime GetStartOfMonth(Instant instant) + private LocalDateTime GetStartOfMonth(Instant instant) => GetStartOfMonth(instant.InUtc().LocalDateTime); + private LocalDateTime GetStartOfMonth(LocalDateTime localDateTime) => localDateTime.With(DateAdjusters.StartOfMonth); + + private Period GetPeriodFromNow(Instant pastInstant) { - return GetStartOfMonth(instant.InUtc().LocalDateTime); - } - - private LocalDateTime GetStartOfMonth(LocalDateTime localDateTime) - { - return localDateTime.With(DateAdjusters.StartOfMonth); + var now = _clock.GetCurrentInstant(); + var today = now.InUtc().Date; + var pastDate = pastInstant.InUtc().Date; + var period = Period.Between(pastDate, today); + return period; } } } \ No newline at end of file diff --git a/src/scripting/Elsa.Scripting.JavaScript/Handlers/RenderJavaScriptDateTimeTypeDefinitions.cs b/src/scripting/Elsa.Scripting.JavaScript/Handlers/RenderJavaScriptDateTimeTypeDefinitions.cs new file mode 100644 index 000000000..9798f5008 --- /dev/null +++ b/src/scripting/Elsa.Scripting.JavaScript/Handlers/RenderJavaScriptDateTimeTypeDefinitions.cs @@ -0,0 +1,42 @@ +using System.Threading; +using System.Threading.Tasks; +using Elsa.Scripting.JavaScript.Events; +using Elsa.Services; +using MediatR; + +namespace Elsa.Scripting.JavaScript.Handlers +{ + public class RenderJavaScriptDateTimeTypeDefinitions : INotificationHandler + { + private readonly IActivityTypeService _activityTypeService; + + public RenderJavaScriptDateTimeTypeDefinitions(IActivityTypeService activityTypeService) + { + _activityTypeService = activityTypeService; + } + + public async Task Handle(RenderingTypeScriptDefinitions notification, CancellationToken cancellationToken) + { + var output = notification.Output; + + output.AppendLine("declare function instantFromDateTimeUtc(dateTime: DateTime): Instant"); + output.AppendLine("declare function instantFromUtc(year: number, month: number, day: number, hour?: number, minute?: number, second?: number): Instant"); + output.AppendLine("declare function currentInstant(): Instant;"); + output.AppendLine("declare function currentYear(): number;"); + output.AppendLine("declare function startOfMonth(instant?: Instant): LocalDate;"); + output.AppendLine("declare function endOfMonth(instant?: Instant): LocalDate;"); + output.AppendLine("declare function startOfPreviousMonth(instant?: Instant): LocalDate;"); + output.AppendLine("declare function addDurationTo(instant: Instant, duration: Duration): Instant;"); + output.AppendLine("declare function subtractDurationFrom(instant: Instant, duration: Duration): Instant;"); + output.AppendLine("declare function durationFromSeconds(seconds: number): Duration;"); + output.AppendLine("declare function durationFromMinutes(minutes: number): Duration;"); + output.AppendLine("declare function durationFromHours(hours: number): Duration;"); + output.AppendLine("declare function durationFromDays(days: number): Duration;"); + output.AppendLine("declare function formatInstant(instant: Instant, format: string, culture?: CultureInfo): string;"); + output.AppendLine("declare function localDateFromInstant(instant: Instant): LocalDate;"); + output.AppendLine("declare function instantFromLocalDate(localDate: LocalDate): LocalDate;"); + output.AppendLine("declare function durationBetween(a: Instant, b: Instant): Duration;"); + output.AppendLine("declare function periodFromNow(pastInstant: Instant): Period;"); + } + } +} \ No newline at end of file diff --git a/src/scripting/Elsa.Scripting.JavaScript/Handlers/RenderJavaScriptTypeDefinitions.cs b/src/scripting/Elsa.Scripting.JavaScript/Handlers/RenderJavaScriptTypeDefinitions.cs index 5caece7c4..095b05ebb 100644 --- a/src/scripting/Elsa.Scripting.JavaScript/Handlers/RenderJavaScriptTypeDefinitions.cs +++ b/src/scripting/Elsa.Scripting.JavaScript/Handlers/RenderJavaScriptTypeDefinitions.cs @@ -13,12 +13,10 @@ namespace Elsa.Scripting.JavaScript.Handlers { public class RenderJavaScriptTypeDefinitions : INotificationHandler { - private readonly IConfiguration _configuration; private readonly IActivityTypeService _activityTypeService; - public RenderJavaScriptTypeDefinitions(IConfiguration configuration, IActivityTypeService activityTypeService) + public RenderJavaScriptTypeDefinitions(IActivityTypeService activityTypeService) { - _configuration = configuration; _activityTypeService = activityTypeService; }