Welcome to UMS.Razor!
This is a set of components that are used for delevoping of software at inLogic A/S. The UMS.Razor is based on bootstrap so we need to include that in our App.razor. There's also a javascript that need to be registred in program.cs, but enough about that.
Let's get started! 😎
First we need to need to update our App.razor
App.razor<head>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-T3c6CoIi6uLrA9TneNEoa7RxnatzjcDSCmG1MXxSR1GAsXEV/Dwwykc2MPK8M2HN" crossorigin="anonymous">
<link href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.10.5/font/bootstrap-icons.min.css" rel="stylesheet">
<link href="_content/UMS.Razor/Datepicker.css" rel="stylesheet" />
<link href="_content/UMS.Razor/Datepicker-dark.css" rel="stylesheet" />
</head>
Add the two links to the head element.
App.razor<body>
<Routes @rendermode="InteractiveServer" />
<script src="_framework/blazor.web.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.bundle.min.js" integrity="sha384-C6RzsynM9kWDrMNeT87bh95OGNyZPhcTNXj1NW7RuBCsyN/o0jlpcV8Qyq46cDfL" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
</body>
Add the two scripts to the end of the body tag.
Program.csvar builder = WebApplication.CreateBuilder(args);
builder.Services.AddScoped<UMS.Razor.JS>();
Here we add the UMS.Razor.JS class as a scoped service.
_Imports.razor@using UMS.Razor
@using UMS.Razor.Toast
@using UMS.Razor.Chart
@using UMS.Razor.ConfirmDialog
@using UMS.Razor.ThemeSwitcher
@using UMS.Razor.Modal
@using UMS.Razor.AutoComplete
@using UMS.Razor.FileUpload
@using UMS.Razor.Datepicker
@using UMS.Razor.LoadingIndicator
Add to UMS.Razor to _Imports.razor otherwise you will need to write the whole namespace.
selected value:
selected label:
selected value:
selected label:
<AutoComplete LabelText="AutoCompleteExample" Options="examples" TItem="AutoCompleteExample" LabelString="Label" ValueString="id" @bind-SelectedValue="SelectedValue" />
<p>selected value: @SelectedValue?.id</p>
<p>selected label: @SelectedValue?.Label</p>
<hr />
<AutoComplete IsFormFloating="false" LabelText="AutoCompleteExample" Options="examples1" TItem="AutoCompleteExample" LabelString="Label" ValueString="id" @bind-SelectedValue="SelectedValue1" />
<p>selected value: @SelectedValue1?.id</p>
<p>selected label: @SelectedValue1?.Label</p>
c#
private AutoCompleteExample SelectedValue { get; set; }
private AutoCompleteExample SelectedValue1 { get; set; }
private List<AutoCompleteExample> examples = new() { new() { id = 1, Label = "One" }, new() { id = 2, Label = "Two" }, new() { id = 3, Label = "Three" } };
private List<AutoCompleteExample> examples1 = new() { new() { id = 1, Label = "Apples" }, new() { id = 2, Label = "Oranges" }, new() { id = 3, Label = "Pears" } };
public class AutoCompleteExample
{
public int id { get; set; }
public string Label { get; set; }
}
selected value:
selected label:
selected value:
selected label:
<AutoCompleteV2 Options="examples" TItem="AutoCompleteExample" LabelString="Label" ValueString="id" @bind-SelectedValue="SelectedValue" PlaceholderString="Ello fessor" IsFormFloating="true" />
<br />
<p>selected value: @SelectedValue?.id</p>
<p>selected label: @SelectedValue?.Label</p>
<hr />
<AutoCompleteV2 Options="examples1" TItem="AutoCompleteExample" LabelString="Label" ValueString="id" @bind-SelectedValue="SelectedValue1" PlaceholderString="Ello fessor" IsFormFloating="false" />
<br />
<p>selected value: @SelectedValue1?.id</p>
<p>selected label: @SelectedValue1?.Label</p>
c#
private AutoCompleteExample SelectedValue { get; set; }
private AutoCompleteExample SelectedValue1 { get; set; }
private List<AutoCompleteExample> examples = new() { new() { id = 1, Label = "One" }, new() { id = 2, Label = "Two" }, new() { id = 3, Label = "Three" }, new() { id = 4, Label = "Only one" }, new() { id = 5, Label = "Only one5" }, new() { id = 6, Label = "Only one6" }, new() { id = 7, Label = "Only one7" }, new() { id = 8, Label = "Only one8" }, new() { id = 9, Label = "Only one9" }, new() { id = 10, Label = "Only one10" } };
private List<AutoCompleteExample> examples1 = new() { new() { id = 1, Label = "Apples" }, new() { id = 2, Label = "Oranges" }, new() { id = 3, Label = "Pears" } };
public class AutoCompleteExample
{
public int id { get; set; }
public string Label { get; set; }
}
<div class="row row-cols-1 row-cols-md-5 g-4">
<div class="col">
<div class="card">
<div class="card-body">
<Chart ChartType="bar" _Data="BarChartData" />
</div>
</div>
</div>
<div class="col">
<div class="card">
<div class="card-body">
<Chart ChartType="doughnut" _Data="DoughnutChartData"></Chart>
</div>
</div>
</div>
<div class="col">
<div class="card">
<div class="card-body">
<Chart ChartType="pie" _Data="PieChartData"></Chart>
</div>
</div>
</div>
<div class="col">
<div class="card">
<div class="card-body">
<Chart ChartType="line" _Data="LineChartData"></Chart>
</div>
</div>
</div>
<div class="col">
<div class="card">
<div class="card-body">
<Chart ChartType="polarArea" _Data="PolarAreaChartData"></Chart>
</div>
</div>
</div>
</div>
C#
private ChartData BarChartData = new();
private ChartData DoughnutChartData = new();
private ChartData PieChartData = new();
private ChartData LineChartData = new();
private ChartData PolarAreaChartData = new();
protected override void OnInitialized()
{
CreateBarChartData();
CreatePieChartData();
CreateDoughnutChartData();
CreateLineChartData();
CreatePolarAreaChartData();
}
private void CreateBarChartData()
{
BarChartData.labels = new();
BarChartData.datasets = new();
var dataSet = new Datasets();
dataSet.borderWidth = 1;
dataSet.label = "Bar chart";
dataSet.borderWidth = 1;
dataSet.data = new();
dataSet.data.Add(1);
dataSet.data.Add(2);
dataSet.data.Add(3);
dataSet.data.Add(4);
dataSet.data.Add(5);
dataSet.data.Add(6);
dataSet.data.Add(10.5f);
BarChartData.labels.Add("Red");
BarChartData.labels.Add("Blue");
BarChartData.labels.Add("Yellow");
BarChartData.labels.Add("Green");
BarChartData.labels.Add("Purple");
BarChartData.labels.Add("Orange");
BarChartData.labels.Add("Float value");
BarChartData.datasets.Add(dataSet);
}
private void CreateDoughnutChartData()
{
DoughnutChartData.labels = new();
DoughnutChartData.datasets = new();
var dataSet = new Datasets();
dataSet.borderWidth = 1;
dataSet.label = "Doughnut chart";
dataSet.data = new();
dataSet.data.Add(7);
dataSet.data.Add(3);
dataSet.data.Add(1);
DoughnutChartData.labels.Add("New");
DoughnutChartData.labels.Add("Old");
DoughnutChartData.labels.Add("Not set");
DoughnutChartData.datasets.Add(dataSet);
}
private void CreatePieChartData()
{
PieChartData.labels = new();
PieChartData.datasets = new();
var dataSet = new Datasets();
dataSet.borderWidth = 1;
dataSet.label = "Pie chart";
dataSet.data = new();
dataSet.data.Add(7);
dataSet.data.Add(8);
dataSet.data.Add(2);
PieChartData.labels.Add("New");
PieChartData.labels.Add("Old");
PieChartData.labels.Add("Not set");
PieChartData.datasets.Add(dataSet);
}
private void CreateLineChartData()
{
LineChartData.labels = new();
LineChartData.datasets = new();
var dataSet = new Datasets();
dataSet.borderWidth = 1;
dataSet.label = "Pie chart";
dataSet.tension = 0.1f;
dataSet.fill = false;
dataSet.borderColor = "rgb(75, 192, 192)";
dataSet.data = new();
dataSet.data.Add(7);
dataSet.data.Add(8);
dataSet.data.Add(2);
dataSet.data.Add(10);
LineChartData.labels.Add("January");
LineChartData.labels.Add("February");
LineChartData.labels.Add("March");
LineChartData.labels.Add("April");
LineChartData.datasets.Add(dataSet);
}
private void CreatePolarAreaChartData()
{
PolarAreaChartData.labels = new();
PolarAreaChartData.datasets = new();
var dataSet = new Datasets();
dataSet.label = "Polar Area chart";
dataSet.data = new();
dataSet.data.Add(7);
dataSet.data.Add(8);
dataSet.data.Add(2);
dataSet.data.Add(10);
dataSet.data.Add(10.4f);
PolarAreaChartData.labels.Add("January");
PolarAreaChartData.labels.Add("February");
PolarAreaChartData.labels.Add("March");
PolarAreaChartData.labels.Add("April");
PolarAreaChartData.labels.Add("float value");
PolarAreaChartData.datasets.Add(dataSet);
}
<button class="btn btn-primary" @onclick="() => confirmDialog.Show()">Show dialog</button>
<ConfirmDialog @ref="confirmDialog" Title="Test" Description="This is a test." onOkClick="OkClick">
</ConfirmDialog>
<ConfirmDialog @ref="confirmDialog" Title="Test" onOkClick="OkClick">
<h1>Test</h1>
</ConfirmDialog>
C#
private void OkClick()
{
// do something here
}
DateOnly
<Datepicker IsFormFloating="false" format="dd-mm-yyyy" label="Select a day" AutoHideAfterSelection="true" @bind-SelectedDate="selectedDate" />
<hr />
<Datepicker IsFormFloating="true" format="dd-mm-yyyy" label="Select a day" AutoHideAfterSelection="true" @bind-SelectedDate="selectedDate" />
Selected date: @selectedDate?.ToString("dd-MM-yyyy")
<hr />
DateTime
<Datepicker IsFormFloating="false" format="dd-mm-yyyy" label="Select a day" AutoHideAfterSelection="true" @bind-SelectedDateTime="selectedDateTime" />
Selected date: @selectedDateTime?.ToString("dd-MM-yyyy")
C#
private DateOnly selectedDate { get; set; }
private DateTime? selectedDateTime { get; set; } = DateTime.Now;
<UMS.Razor.FileUpload.FileUpload HideUploadButton="true" UploadedFilesChanged="OnChange" />
<UMS.Razor.FileUpload.FileUpload HideUploadButton="false" UploadedFilesChanged="OnChange" MaxAllowFileSizeInMB="5" />
<div class="image-container">
@foreach (var item in imageSources)
{
<img src="@item" />
}
</div>
C#
private List<string> imageSources = [];
async Task OnChange(List<IBrowserFile> files)
{
imageSources.Clear();
foreach (var file in files)
{
long MaxFileSize = 5 * 1024 * 1024;
using var stream = file.OpenReadStream(MaxFileSize);
using var ms = new MemoryStream();
await stream.CopyToAsync(ms);
imageSources.Add($"data:{file.ContentType};base64,{Convert.ToBase64String(ms.ToArray())}");
}
}
<LoadingIndicator @ref="loading" InitialDelay="500" ShowModalBackground="true" />
<button class="btn btn-primary" @onclick="simpleWait">Simple wait - 250 ms</button>
<button class="btn btn-primary" @onclick="longWait">Long wait - 2500 ms</button>
<button class="btn btn-primary" @onclick="Reset">Reset</button>
<br />
<br />
Result: @result
C#
private LoadingIndicator loading { get; set; } = new();
private string result { get; set; } = "";
private async Task simpleWait()
{
loading.Show();
await Task.Delay(250);
result = "simpleWait is done";
loading.Hide();
}
private async Task longWait()
{
loading.Show();
await Task.Delay(2500);
result = "longWait is done";
loading.Hide();
}
private void Reset()
{
result = "";
}
<button class="btn btn-primary" @onclick="() => modal.Show()">Show modal</button>
<Modal Title="Modal test" @ref="modal" OkButtonText="OK" ShowCancelButton="false" onOkClick="OkClick">
<h2>Modal content goes here!</h2>
<p>This can also be binded to properties.</p>
<p>@content</p>
</Modal>
C#
private string content { get; set; } = "Test content from bind!";
private Modal modal { get; set; }
private void OkClick()
{
modal.Hide();
}
<ThemeSwitcher ShouldRenderWithFixedPosition="false" />
<button class="btn btn-primary" @onclick="ShowUMSToast">Normal toast</button>
<ToastContainer>
<Toast @ref="Toast"></Toast>
</ToastContainer>
C#
private void ShowUMSToast()
{
Toast.Title = "Test";
Toast.Description = "This is a test of toast";
Toast.Show();
}
types of toast
public enum ToastType
{
primary,
secondary,
success,
danger,
warning,
info,
light,
dark
}
<button class="btn btn-primary" @onclick="ShowUMSToast">Normal toast</button>
<ToastContainer @ref="tc" />
C#
private ToastContainer tc = new();
private void ShowUMSToast()
{
var displayToast = tc.GetToast();
if (displayToast != null)
{
displayToast.Title = "Test";
displayToast.Description = "Test";
displayToast.Show();
}
}