diff --git a/README.md b/README.md index 94b47f7..eedca3f 100644 --- a/README.md +++ b/README.md @@ -113,6 +113,7 @@ public partial class Index - [Checkbox](#checkbox) - [Chip](#chip) - [Content Header](#content-header) **(since v0.3.3)** +- [Date Dropdown](#date-dropdown) - [Date Picker](#date-picker) - [Date Time Picker](#date-time-picker) - [Divider](#divider) @@ -720,6 +721,35 @@ chart1.InitialChart(object1); ``` +## Date Dropdown +```razor + +``` +```csharp + readonly DateDropdownOption[] _dateRangeOptions = +{ + new() + { + Id = "last-7", + Label = "Last 7 days", + From = DateTime.Today.AddDays(-7).ToString("MM/dd/yyyy"), + To = DateTime.Today.ToString("MM/dd/yyyy") + }, + new() + { + Id = "today", + Label = "Today", + From = DateTime.Today.ToString("MM/dd/yyyy"), + To = DateTime.Today.ToString("MM/dd/yyyy") + } +}; + +private void Callback(DateDropdownResponse selectedDateDropdown) +{ + Console.WriteLine(selectedDateDropdown.Id); +} +``` + ## Date picker ```razor diff --git a/SiemensIXBlazor/Components/DateDropdown/DateDropdown.razor b/SiemensIXBlazor/Components/DateDropdown/DateDropdown.razor new file mode 100644 index 0000000..b867e87 --- /dev/null +++ b/SiemensIXBlazor/Components/DateDropdown/DateDropdown.razor @@ -0,0 +1,24 @@ +@namespace SiemensIXBlazor.Components +@using Microsoft.JSInterop + +@inject IJSRuntime JsRuntime +@inherits IXBaseComponent + + + + \ No newline at end of file diff --git a/SiemensIXBlazor/Components/DateDropdown/DateDropdown.razor.cs b/SiemensIXBlazor/Components/DateDropdown/DateDropdown.razor.cs new file mode 100644 index 0000000..afbef3c --- /dev/null +++ b/SiemensIXBlazor/Components/DateDropdown/DateDropdown.razor.cs @@ -0,0 +1,81 @@ +using System.Text.Json; +using Microsoft.AspNetCore.Components; +using Microsoft.JSInterop; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using Newtonsoft.Json.Serialization; +using SiemensIXBlazor.Interops; +using SiemensIXBlazor.Objects.DateDropdown; + +namespace SiemensIXBlazor.Components; + +public partial class DateDropdown +{ + private BaseInterop _interop = null!; + private Lazy>? _moduleTask; + + [Parameter][EditorRequired] public string Id { get; set; } = string.Empty; + + [Parameter] public bool CustomRangeAllowed { get; set; } = true; + + [Parameter] public string DateRangeId { get; set; } = "custom"; + + [Parameter] public EventCallback DateRangeIdChanged { get; set; } + + [Parameter] public DateDropdownOption[]? DateRangeOptions { get; set; } + + [Parameter] public string Format { get; set; } = "yyyy/LL/dd"; + + [Parameter] public string? From { get; set; } + + [Parameter] public string I18NCustomItem { get; set; } = "Custom..."; + + [Parameter] public string I18NDone { get; set; } = "Done"; + + [Parameter] public string I18NNoRange { get; set; } = "No range set"; + + [Parameter] public string? MaxDate { get; set; } + + [Parameter] public string? MinDate { get; set; } + + [Parameter] public bool Range { get; set; } = true; + + [Parameter] public string? To { get; set; } + + [Parameter] public EventCallback DateRangeChangeEvent { get; set; } + + protected override async Task OnAfterRenderAsync(bool firstRender) + { + if (firstRender) + { + await InitialParameterAsync("setDateRangeOptions", DateRangeOptions); + _interop = new BaseInterop(JsRuntime); + + await _interop.AddEventListener(this, Id, "dateRangeChange", "DateRangeChange"); + } + } + + private async Task InitialParameterAsync(string functionName, object? param) + { + _moduleTask = new Lazy>(() => JsRuntime.InvokeAsync( + "import", "./_content/SiemensIXBlazor/js/interops/dateDropdownInterop.js").AsTask()); + + var dateRangeOptions = JsonConvert.SerializeObject(param, new JsonSerializerSettings + { + ContractResolver = new CamelCasePropertyNamesContractResolver() + }); + + var module = await _moduleTask.Value; + if (module != null) await module.InvokeVoidAsync(functionName, Id, dateRangeOptions); + } + + [JSInvokable] + public async void DateRangeChange(JsonElement data) + { + var jsonDataText = data.GetRawText(); + var jsonData = JObject.Parse(jsonDataText) + .ToObject(); + + await DateRangeChangeEvent.InvokeAsync(jsonData); + } +} \ No newline at end of file diff --git a/SiemensIXBlazor/Objects/DateDropdown/DateDropdownOption.cs b/SiemensIXBlazor/Objects/DateDropdown/DateDropdownOption.cs new file mode 100644 index 0000000..80a6c73 --- /dev/null +++ b/SiemensIXBlazor/Objects/DateDropdown/DateDropdownOption.cs @@ -0,0 +1,15 @@ +using Newtonsoft.Json; + +namespace SiemensIXBlazor.Objects.DateDropdown; + +public class + DateDropdownOption +{ + [JsonProperty("id")] public string Id { get; set; } = null!; + + [JsonProperty("label")] public string Label { get; set; } = null!; + + [JsonProperty("from")] public string? From { get; set; } + + [JsonProperty("to")] public string? To { get; set; } +} \ No newline at end of file diff --git a/SiemensIXBlazor/Objects/DateDropdown/DateDropdownResponse.cs b/SiemensIXBlazor/Objects/DateDropdown/DateDropdownResponse.cs new file mode 100644 index 0000000..023b8f8 --- /dev/null +++ b/SiemensIXBlazor/Objects/DateDropdown/DateDropdownResponse.cs @@ -0,0 +1,15 @@ +using System.Text.Json.Serialization; + +namespace SiemensIXBlazor.Objects.DateDropdown; + +public class DateDropdownResponse +{ + [JsonPropertyName("id")] + public string Id { get; set; } = null!; + + [JsonPropertyName("from")] + public string? From { get; set; } + + [JsonPropertyName("to")] + public string? To { get; set; } +} \ No newline at end of file diff --git a/SiemensIXBlazor/wwwroot/js/interops/dateDropdownInterop.js b/SiemensIXBlazor/wwwroot/js/interops/dateDropdownInterop.js new file mode 100644 index 0000000..c6ffaf2 --- /dev/null +++ b/SiemensIXBlazor/wwwroot/js/interops/dateDropdownInterop.js @@ -0,0 +1,9 @@ +export function setDateRangeOptions(id, dateRangeOptions) { + try { + const element = document.getElementById(id); + element.dateRangeOptions = JSON.parse(dateRangeOptions); + } + catch (err) { + console.error(err) + } +} \ No newline at end of file