Add project files.

This commit is contained in:
2025-08-20 11:07:36 +03:30
parent 3863c74931
commit 1a308a4069
899 changed files with 85379 additions and 0 deletions
@@ -0,0 +1,30 @@
@using Elsa.Studio.Contracts
@inherits LayoutComponentBase
@implements IDisposable
@inject IThemeService ThemeService
<MudThemeProvider Theme="CurrentTheme" IsDarkMode="@true"/>
<MudSnackbarProvider/>
<MudPopoverProvider/>
<MudLayout>
@Body
</MudLayout>
@code {
private MudTheme CurrentTheme => ThemeService.CurrentTheme;
protected override void OnInitialized()
{
ThemeService.CurrentThemeChanged += OnThemeChanged;
StateHasChanged();
}
public void Dispose()
{
ThemeService.CurrentThemeChanged -= OnThemeChanged;
}
private void OnThemeChanged() => StateHasChanged();
}
@@ -0,0 +1,61 @@
@inherits LayoutComponentBase
<MudThemeProvider IsDarkMode="@IsDarkMode" Theme="CurrentTheme"/>
<MudPopoverProvider/>
<MudDialogProvider/>
<MudSnackbarProvider/>
<MudLayout>
<MudAppBar Elevation="0" Color="Color.Inherit">
<MudIconButton Icon="@Icons.Material.Filled.Menu" Color="Color.Inherit" Edge="Edge.Start" OnClick="@DrawerToggle"/>
<MudSpacer/>
@foreach (var appBarItem in AppBarService.AppBarItems)
{
@appBarItem
}
<MudIconButton Icon="@Icons.Material.Outlined.Book" Color="Color.Inherit" Href="https://v3.elsaworkflows.io/" Target="_blank" Title="Documentation"/>
<MudIconButton Icon="@Icons.Custom.Brands.GitHub" Color="Color.Inherit" Href="https://github.com/elsa-workflows/elsa-core" Target="_blank" Title="Source code"/>
@if (IsDarkMode)
{
<MudToggleIconButton Icon="@Icons.Material.Outlined.LightMode" Color="Color.Inherit" @onclick="@ToggleDarkMode"></MudToggleIconButton>
}
else
{
<MudToggleIconButton Icon="@Icons.Material.Outlined.DarkMode" Color="Color.Inherit" @onclick="@ToggleDarkMode"></MudToggleIconButton>
}
<MudIconButton Icon="@Icons.Material.Outlined.Info" Color="Color.Inherit" @onclick="@ShowProductInfo"/>
</MudAppBar>
<MudDrawer @bind-Open="_drawerOpen" Elevation="0" ClipMode="DrawerClipMode.Always">
<MudDrawerHeader>
@BrandingProvider.Branding
</MudDrawerHeader>
<div class="mt-10">
<NavMenu/>
</div>
</MudDrawer>
<MudMainContent>
<ErrorBoundary @ref="@_errorBoundary">
<ChildContent>
@Body
</ChildContent>
<ErrorContent>
@if (context is UnauthorizedAccessException)
{
@UnauthorizedComponent
}
else
{
<Well>
<MudAlert Severity="Severity.Error" Variant="Variant.Filled">
@context.GetType().Name: @context.Message
</MudAlert>
</Well>
}
</ErrorContent>
</ErrorBoundary>
</MudMainContent>
</MudLayout>
@@ -0,0 +1,94 @@
using Blazored.LocalStorage;
using Elsa.Studio.Branding;
using Elsa.Studio.Components;
using Elsa.Studio.Contracts;
using Elsa.Studio.Extensions;
using Elsa.Studio.Services;
using Microsoft.AspNetCore.Components;
using Microsoft.AspNetCore.Components.Authorization;
using Microsoft.AspNetCore.Components.Web;
using MudBlazor;
namespace Elsa.Studio.Layouts;
/// <summary>
/// The main layout for the application.
/// </summary>
public partial class MainLayout : IDisposable
{
private bool _drawerOpen = true;
private ErrorBoundary? _errorBoundary;
[Inject] private IThemeService ThemeService { get; set; } = null!;
[Inject] private IAppBarService AppBarService { get; set; } = null!;
[Inject] private IUnauthorizedComponentProvider UnauthorizedComponentProvider { get; set; } = null!;
[Inject] private IFeatureService FeatureService { get; set; } = null!;
[Inject] private IDialogService DialogService { get; set; } = null!;
[Inject] private IBrandingProvider BrandingProvider { get; set; } = null!;
[Inject] private IServiceProvider ServiceProvider { get; set; } = null!;
[CascadingParameter] private Task<AuthenticationState>? AuthenticationState { get; set; }
private MudTheme CurrentTheme => ThemeService.CurrentTheme;
private bool IsDarkMode => ThemeService.IsDarkMode;
private RenderFragment UnauthorizedComponent => UnauthorizedComponentProvider.GetUnauthorizedComponent();
/// <inheritdoc />
protected override void OnInitialized()
{
ThemeService.CurrentThemeChanged += OnThemeChanged;
AppBarService.AppBarItemsChanged += OnAppBarItemsChanged;
}
/// <inheritdoc />
protected override async Task OnInitializedAsync()
{
if (AuthenticationState != null)
{
var authState = await AuthenticationState;
if (authState.User.Identity?.IsAuthenticated == true && !authState.User.Claims.IsExpired())
{
await FeatureService.InitializeFeaturesAsync();
StateHasChanged();
}
}
else
{
await FeatureService.InitializeFeaturesAsync();
StateHasChanged();
}
}
/// <inheritdoc />
protected override void OnParametersSet()
{
_errorBoundary?.Recover();
}
private void OnThemeChanged() => StateHasChanged();
private void OnAppBarItemsChanged() => InvokeAsync(StateHasChanged);
private void DrawerToggle()
{
_drawerOpen = !_drawerOpen;
}
private void ToggleDarkMode()
{
ThemeService.IsDarkMode = !ThemeService.IsDarkMode;
}
private async Task ShowProductInfo()
{
await DialogService.ShowAsync<ProductInfoDialog>($"Elsa Studio {ToolVersion.GetDisplayVersion()}", new DialogOptions
{
FullWidth = true,
MaxWidth = MaxWidth.ExtraSmall,
CloseButton = true,
CloseOnEscapeKey = true
});
}
void IDisposable.Dispose()
{
ThemeService.CurrentThemeChanged -= OnThemeChanged;
}
}