multi-tenant implementierung
This commit is contained in:
@@ -7,6 +7,7 @@
|
||||
@inject AuthenticationStateProvider AuthStateProvider
|
||||
@inject IJSRuntime JSRuntime
|
||||
@inject NavigationManager Nav
|
||||
@inject HttpClient Http
|
||||
|
||||
|
||||
<PageTitle>Einstellungen – Timetracker</PageTitle>
|
||||
@@ -22,13 +23,12 @@ else
|
||||
<MudStack Spacing="4">
|
||||
|
||||
@* ── Header ── *@
|
||||
<MudPaper Elevation="4" Class="pa-5 rounded-xl"
|
||||
Style="background: #1E293B; color:white;">
|
||||
<MudPaper Elevation="4" Class="pa-5 rounded-xl mud-theme-primary">
|
||||
<MudStack Row="true" AlignItems="AlignItems.Center" Spacing="3">
|
||||
<MudIcon Icon="@Icons.Material.Filled.Settings" Style="color:white; font-size:2rem" />
|
||||
<MudIcon Icon="@Icons.Material.Filled.Settings" Style="color: var(--mud-palette-primary-text); font-size:2rem" />
|
||||
<MudStack Spacing="0">
|
||||
<MudText Typo="Typo.h5" Style="color:white; font-weight:700">Einstellungen</MudText>
|
||||
<MudText Typo="Typo.caption" Style="color:rgba(255,255,255,0.72)">
|
||||
<MudText Typo="Typo.h5" Style="color: var(--mud-palette-primary-text); font-weight:700">Einstellungen</MudText>
|
||||
<MudText Typo="Typo.caption" Style="color: var(--mud-palette-primary-text); opacity: 0.72">
|
||||
Arbeitszeit, Arbeitstage und Urlaub konfigurieren
|
||||
</MudText>
|
||||
</MudStack>
|
||||
@@ -217,6 +217,52 @@ else
|
||||
</MudCard>
|
||||
</MudItem>
|
||||
|
||||
@if (_isTenantAdmin)
|
||||
{
|
||||
@* ── Firmen-Einstellungen (Branding) ── *@
|
||||
<MudItem xs="12" md="6">
|
||||
<MudCard Elevation="3" Class="rounded-xl h-100">
|
||||
<MudCardHeader>
|
||||
<CardHeaderContent>
|
||||
<MudStack Row="true" AlignItems="AlignItems.Center" Spacing="2">
|
||||
<MudIcon Icon="@Icons.Material.Filled.Business" Color="Color.Primary" />
|
||||
<MudText Typo="Typo.h6" Style="font-weight:600">Firmen-Einstellungen</MudText>
|
||||
</MudStack>
|
||||
</CardHeaderContent>
|
||||
</MudCardHeader>
|
||||
<MudCardContent>
|
||||
<MudStack Spacing="4">
|
||||
<MudTextField @bind-Value="_tenantName"
|
||||
Label="Firmenname"
|
||||
Variant="Variant.Outlined"
|
||||
HelperText="Der offizielle Name deiner Firma" />
|
||||
|
||||
<MudStack Row="true" Spacing="4">
|
||||
<MudColorPicker @bind-Text="_tenantPrimaryColor"
|
||||
Label="Primärfarbe"
|
||||
Variant="Variant.Outlined"
|
||||
Style="@($"color: {_tenantPrimaryColor};")"
|
||||
ColorPickerMode="ColorPickerMode.HEX" />
|
||||
|
||||
<MudColorPicker @bind-Text="_tenantSecondaryColor"
|
||||
Label="Sekundärfarbe"
|
||||
Variant="Variant.Outlined"
|
||||
Style="@($"color: {_tenantSecondaryColor};")"
|
||||
ColorPickerMode="ColorPickerMode.HEX" />
|
||||
</MudStack>
|
||||
|
||||
<MudButton Variant="Variant.Filled" Color="Color.Primary"
|
||||
StartIcon="@Icons.Material.Filled.Save"
|
||||
OnClick="SaveTenantSettings"
|
||||
Style="max-width:250px;">
|
||||
Firma speichern
|
||||
</MudButton>
|
||||
</MudStack>
|
||||
</MudCardContent>
|
||||
</MudCard>
|
||||
</MudItem>
|
||||
}
|
||||
|
||||
</MudGrid>
|
||||
|
||||
@* ── Speichern-Button ── *@
|
||||
@@ -467,6 +513,11 @@ else
|
||||
|
||||
private AppSettings? _settings;
|
||||
private int _userId;
|
||||
private bool _isTenantAdmin;
|
||||
private TenantInfo? _tenantInfo;
|
||||
private string _tenantName = "";
|
||||
private string _tenantPrimaryColor = "#0EA5E9";
|
||||
private string _tenantSecondaryColor = "#0EA5E9";
|
||||
private DateTime? _flexStartDate
|
||||
{
|
||||
get => _settings?.FlexTimeStartDate?.ToDateTime(TimeOnly.MinValue);
|
||||
@@ -526,6 +577,25 @@ else
|
||||
_userId = int.Parse(claim.Value);
|
||||
_settings = await TrackerService.GetSettingsAsync(_userId);
|
||||
|
||||
_isTenantAdmin = authState.User.IsInRole("TenantAdmin") || authState.User.HasClaim("IsTenantAdmin", "true");
|
||||
if (_isTenantAdmin)
|
||||
{
|
||||
try
|
||||
{
|
||||
_tenantInfo = await Http.GetFromJsonAsync<TenantInfo>("api/tenant/current");
|
||||
if (_tenantInfo != null)
|
||||
{
|
||||
_tenantName = _tenantInfo.Name ?? "";
|
||||
_tenantPrimaryColor = _tenantInfo.PrimaryColor ?? "#0EA5E9";
|
||||
_tenantSecondaryColor = _tenantInfo.SecondaryColor ?? "#0EA5E9";
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Snackbar.Add($"Fehler beim Laden der Firmen-Einstellungen: {ex.Message}", Severity.Error);
|
||||
}
|
||||
}
|
||||
|
||||
var loadVacationsTask = LoadVacations();
|
||||
var loadHolidaysTask = HolidayService.GetHolidaysAsync(_holYear, _settings.GermanState);
|
||||
|
||||
@@ -622,6 +692,35 @@ else
|
||||
}
|
||||
}
|
||||
|
||||
private async Task SaveTenantSettings()
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(_tenantName))
|
||||
{
|
||||
Snackbar.Add("Bitte einen Firmennamen eingeben.", Severity.Warning);
|
||||
return;
|
||||
}
|
||||
|
||||
var dto = new TenantSettingsDto
|
||||
{
|
||||
Name = _tenantName.Trim(),
|
||||
PrimaryColor = _tenantPrimaryColor,
|
||||
SecondaryColor = _tenantSecondaryColor
|
||||
};
|
||||
|
||||
var response = await Http.PostAsJsonAsync("api/tracker/tenant/settings", dto);
|
||||
if (response.IsSuccessStatusCode)
|
||||
{
|
||||
Snackbar.Add("Firmen-Einstellungen gespeichert. Lade Seite neu...", Severity.Success);
|
||||
await Task.Delay(1000);
|
||||
Nav.NavigateTo(Nav.Uri, forceLoad: true);
|
||||
}
|
||||
else
|
||||
{
|
||||
var err = await response.Content.ReadAsStringAsync();
|
||||
Snackbar.Add($"Fehler beim Speichern: {err}", Severity.Error);
|
||||
}
|
||||
}
|
||||
|
||||
private static string FormatHours(double hours)
|
||||
{
|
||||
var ts = TimeSpan.FromHours(hours);
|
||||
|
||||
Reference in New Issue
Block a user