@if (!AuthentificationService.IsLogin)
{
diff --git a/src/GameIdeas/Client/GameIdeas.BlazorApp/Shared/Headers/AccountSettings.razor.cs b/src/GameIdeas/Client/GameIdeas.BlazorApp/Shared/Components/Account/AccountSettings.razor.cs
similarity index 95%
rename from src/GameIdeas/Client/GameIdeas.BlazorApp/Shared/Headers/AccountSettings.razor.cs
rename to src/GameIdeas/Client/GameIdeas.BlazorApp/Shared/Components/Account/AccountSettings.razor.cs
index 97ff274..68ede95 100644
--- a/src/GameIdeas/Client/GameIdeas.BlazorApp/Shared/Headers/AccountSettings.razor.cs
+++ b/src/GameIdeas/Client/GameIdeas.BlazorApp/Shared/Components/Account/AccountSettings.razor.cs
@@ -2,7 +2,7 @@ using GameIdeas.BlazorApp.Services;
using GameIdeas.Shared.Dto;
using Microsoft.AspNetCore.Components.Forms;
-namespace GameIdeas.BlazorApp.Shared.Headers;
+namespace GameIdeas.BlazorApp.Shared.Components.Account;
public partial class AccountSettings (
AuthentificationService AuthentificationService)
diff --git a/src/GameIdeas/Client/GameIdeas.BlazorApp/Shared/Headers/AccountSettings.razor.css b/src/GameIdeas/Client/GameIdeas.BlazorApp/Shared/Components/Account/AccountSettings.razor.css
similarity index 100%
rename from src/GameIdeas/Client/GameIdeas.BlazorApp/Shared/Headers/AccountSettings.razor.css
rename to src/GameIdeas/Client/GameIdeas.BlazorApp/Shared/Components/Account/AccountSettings.razor.css
diff --git a/src/GameIdeas/Client/GameIdeas.BlazorApp/Shared/Components/Dropdown/DropdownContent.razor b/src/GameIdeas/Client/GameIdeas.BlazorApp/Shared/Components/Dropdown/DropdownContent.razor
deleted file mode 100644
index 1ddac6b..0000000
--- a/src/GameIdeas/Client/GameIdeas.BlazorApp/Shared/Components/Dropdown/DropdownContent.razor
+++ /dev/null
@@ -1,13 +0,0 @@
-@typeparam TItem
-
-
-
- @foreach (var item in Items)
- {
-
- @(LabelSelector != null ? LabelSelector.Invoke(item) : item?.ToString())
-
- }
-
-
\ No newline at end of file
diff --git a/src/GameIdeas/Client/GameIdeas.BlazorApp/Shared/Components/Dropdown/DropdownContent.razor.cs b/src/GameIdeas/Client/GameIdeas.BlazorApp/Shared/Components/Dropdown/DropdownContent.razor.cs
deleted file mode 100644
index 97c8b71..0000000
--- a/src/GameIdeas/Client/GameIdeas.BlazorApp/Shared/Components/Dropdown/DropdownContent.razor.cs
+++ /dev/null
@@ -1,36 +0,0 @@
-using Microsoft.AspNetCore.Components;
-
-namespace GameIdeas.BlazorApp.Shared.Components.Dropdown;
-
-public partial class DropdownContent
-{
- [Parameter] public TItem? Value { get; set; }
- [Parameter] public EventCallback ValueChanged { get; set; }
- [Parameter] public IEnumerable Items { get; set; } = [];
- [Parameter] public Func? LabelSelector { get; set; }
- [Parameter] public DropdownTheme Theme { get; set; }
-
- private bool ContentVisile = false;
- private DateTime ContentLastFocusOut = DateTime.Now;
- private ElementReference Content;
-
- public async Task OpenAsync()
- {
- if (DateTime.Now - ContentLastFocusOut >= TimeSpan.FromSeconds(0.2))
- {
- await Content.FocusAsync();
- ContentVisile = true;
- }
- }
-
- public void Close() => ContentVisile = false;
-
- private void HandleDropdownAddFocusOut()
- {
- ContentLastFocusOut = DateTime.Now;
- ContentVisile = false;
- }
-
- private async Task HandleItemClicked() => await ValueChanged.InvokeAsync(Value);
-
-}
\ No newline at end of file
diff --git a/src/GameIdeas/Client/GameIdeas.BlazorApp/Shared/Components/Dropdown/DropdownTheme.cs b/src/GameIdeas/Client/GameIdeas.BlazorApp/Shared/Components/Dropdown/DropdownTheme.cs
deleted file mode 100644
index e225ac5..0000000
--- a/src/GameIdeas/Client/GameIdeas.BlazorApp/Shared/Components/Dropdown/DropdownTheme.cs
+++ /dev/null
@@ -1,7 +0,0 @@
-namespace GameIdeas.BlazorApp.Shared.Components.Dropdown;
-
-public enum DropdownTheme
-{
- Navigation,
- Account
-}
diff --git a/src/GameIdeas/Client/GameIdeas.BlazorApp/Shared/Components/Select/Components/SelectListElement.razor b/src/GameIdeas/Client/GameIdeas.BlazorApp/Shared/Components/Select/Components/SelectListElement.razor
new file mode 100644
index 0000000..837f2ad
--- /dev/null
+++ b/src/GameIdeas/Client/GameIdeas.BlazorApp/Shared/Components/Select/Components/SelectListElement.razor
@@ -0,0 +1,15 @@
+@typeparam TItem
+
+
+
+ @if (Value != null && Value.IsSelected)
+ {
+
+ }
+
+
+ @Value?.Label
+
+
diff --git a/src/GameIdeas/Client/GameIdeas.BlazorApp/Shared/Components/Select/Components/SelectListElement.razor.cs b/src/GameIdeas/Client/GameIdeas.BlazorApp/Shared/Components/Select/Components/SelectListElement.razor.cs
new file mode 100644
index 0000000..c33f01a
--- /dev/null
+++ b/src/GameIdeas/Client/GameIdeas.BlazorApp/Shared/Components/Select/Components/SelectListElement.razor.cs
@@ -0,0 +1,18 @@
+using Microsoft.AspNetCore.Components;
+
+namespace GameIdeas.BlazorApp.Shared.Components.Select.Components;
+
+public partial class SelectListElement
+{
+ [Parameter] public EventCallback?> ValueChanged { get; set; }
+ [Parameter] public SelectElement? Value { get; set; }
+ [Parameter] public SelectListTheme Theme { get; set; }
+ private async Task HandleItemClicked()
+ {
+ if (Value != null)
+ {
+ Value.IsSelected = true;
+ await ValueChanged.InvokeAsync(Value);
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/GameIdeas/Client/GameIdeas.BlazorApp/Shared/Components/Select/Components/SelectListElement.razor.css b/src/GameIdeas/Client/GameIdeas.BlazorApp/Shared/Components/Select/Components/SelectListElement.razor.css
new file mode 100644
index 0000000..e7c5314
--- /dev/null
+++ b/src/GameIdeas/Client/GameIdeas.BlazorApp/Shared/Components/Select/Components/SelectListElement.razor.css
@@ -0,0 +1,25 @@
+.select-element {
+ width: fit-content;
+}
+
+ .select-element:hover {
+ cursor: pointer;
+ }
+
+.selected svg {
+ fill: var(--white)
+}
+
+/***** Navigation Theme *****/
+.navigation .selected {
+ display: none;
+}
+
+.navigation .select-label:hover {
+ color: var(--light-grey);
+}
+
+/***** Sort Theme *****/
+.sort .select-label:hover {
+ color: var(--light-grey);
+}
\ No newline at end of file
diff --git a/src/GameIdeas/Client/GameIdeas.BlazorApp/Shared/Components/Select/SelectElement.cs b/src/GameIdeas/Client/GameIdeas.BlazorApp/Shared/Components/Select/SelectElement.cs
new file mode 100644
index 0000000..b6a9299
--- /dev/null
+++ b/src/GameIdeas/Client/GameIdeas.BlazorApp/Shared/Components/Select/SelectElement.cs
@@ -0,0 +1,8 @@
+namespace GameIdeas.BlazorApp.Shared.Components.Select;
+
+public class SelectElement
+{
+ public TItem? Item { get; set; }
+ public string? Label { get; set; }
+ public bool IsSelected { get; set; } = false;
+}
diff --git a/src/GameIdeas/Client/GameIdeas.BlazorApp/Shared/Components/Select/SelectList.razor b/src/GameIdeas/Client/GameIdeas.BlazorApp/Shared/Components/Select/SelectList.razor
new file mode 100644
index 0000000..2a47bd3
--- /dev/null
+++ b/src/GameIdeas/Client/GameIdeas.BlazorApp/Shared/Components/Select/SelectList.razor
@@ -0,0 +1,32 @@
+@using GameIdeas.BlazorApp.Shared.Components.Select.Components
+@typeparam TItem
+
+
+
+ @Button
+
+
+
+ @foreach (var item in Headers)
+ {
+
+ }
+ @if (Headers.Any())
+ {
+
+ }
+ @foreach (var item in Items)
+ {
+
+ }
+
+
+
+
diff --git a/src/GameIdeas/Client/GameIdeas.BlazorApp/Shared/Components/Select/SelectList.razor.cs b/src/GameIdeas/Client/GameIdeas.BlazorApp/Shared/Components/Select/SelectList.razor.cs
new file mode 100644
index 0000000..415c24e
--- /dev/null
+++ b/src/GameIdeas/Client/GameIdeas.BlazorApp/Shared/Components/Select/SelectList.razor.cs
@@ -0,0 +1,64 @@
+using Microsoft.AspNetCore.Components;
+
+namespace GameIdeas.BlazorApp.Shared.Components.Select;
+
+public partial class SelectList
+{
+ [Parameter] public RenderFragment? Button { get; set; }
+ [Parameter] public TItem? Value { get; set; }
+ [Parameter] public EventCallback ValueChanged { get; set; }
+ [Parameter] public TItem? Header { get; set; }
+ [Parameter] public EventCallback HeaderChanged { get; set; }
+ [Parameter] public IEnumerable> Items { get; set; } = [];
+ [Parameter] public IEnumerable> Headers { get; set; } = [];
+ [Parameter] public SelectListTheme Theme { get; set; }
+ [Parameter] public bool AlignRight { get; set; }
+
+ private bool ContentVisile = false;
+ private DateTime ContentLastFocusOut = DateTime.Now;
+ private ElementReference Container;
+
+ public async Task OpenAsync()
+ {
+ if (DateTime.Now - ContentLastFocusOut >= TimeSpan.FromSeconds(0.2))
+ {
+ await Container.FocusAsync();
+ ContentVisile = true;
+ }
+ }
+
+ public void Close() => ContentVisile = false;
+
+ private async Task HandleButtonClicked() => await OpenAsync();
+
+ private void HandleFocusOut()
+ {
+ ContentLastFocusOut = DateTime.Now;
+ ContentVisile = false;
+ }
+
+ private async Task HandleItemClicked(SelectElement selectedValue)
+ {
+ foreach (var item in Items)
+ {
+ item.IsSelected = false;
+ }
+
+ selectedValue.IsSelected = true;
+ Value = selectedValue.Item;
+ await ValueChanged.InvokeAsync(Value);
+ Close();
+ }
+
+ private async Task HandleHeaderClicked(SelectElement selectedValue)
+ {
+ foreach (var header in Headers)
+ {
+ header.IsSelected = false;
+ }
+
+ selectedValue.IsSelected = true;
+ Header = selectedValue.Item;
+ await HeaderChanged.InvokeAsync(Header);
+ }
+}
\ No newline at end of file
diff --git a/src/GameIdeas/Client/GameIdeas.BlazorApp/Shared/Components/Dropdown/DropdownContent.razor.css b/src/GameIdeas/Client/GameIdeas.BlazorApp/Shared/Components/Select/SelectList.razor.css
similarity index 53%
rename from src/GameIdeas/Client/GameIdeas.BlazorApp/Shared/Components/Dropdown/DropdownContent.razor.css
rename to src/GameIdeas/Client/GameIdeas.BlazorApp/Shared/Components/Select/SelectList.razor.css
index 253d8f6..843330c 100644
--- a/src/GameIdeas/Client/GameIdeas.BlazorApp/Shared/Components/Dropdown/DropdownContent.razor.css
+++ b/src/GameIdeas/Client/GameIdeas.BlazorApp/Shared/Components/Select/SelectList.razor.css
@@ -1,4 +1,4 @@
-.dropdown-content {
+.select-content {
overflow: hidden;
display: flex;
flex-direction: column;
@@ -9,25 +9,28 @@
margin-top: 4px;
}
-.drowdown-element {
- width: fit-content;
-}
-
- .drowdown-element:hover {
- cursor: pointer;
- }
-
.invisible {
display: none;
}
-.dropdown-content.navigation {
+.line {
+ margin: 0 6px;
+ border-bottom: 2px solid var(--light-grey);
+}
+
+/***** Navigation Theme *****/
+.select-content.navigation {
gap: 4px;
background: var(--violet);
box-shadow: var(--drop-shadow);
padding: 4px 6px;
}
- .drowdown-element.navigation:hover {
- color: var(--light-grey);
- }
+/***** Sort Theme *****/
+.select-content.sort {
+ gap: 4px;
+ background: var(--black);
+ box-shadow: var(--drop-shadow);
+ padding: 4px 6px;
+}
+
diff --git a/src/GameIdeas/Client/GameIdeas.BlazorApp/Shared/Components/Select/SelectTheme.cs b/src/GameIdeas/Client/GameIdeas.BlazorApp/Shared/Components/Select/SelectTheme.cs
new file mode 100644
index 0000000..f3bb87f
--- /dev/null
+++ b/src/GameIdeas/Client/GameIdeas.BlazorApp/Shared/Components/Select/SelectTheme.cs
@@ -0,0 +1,8 @@
+namespace GameIdeas.BlazorApp.Shared.Components.Select;
+
+public enum SelectListTheme
+{
+ Navigation,
+ Sort,
+ Filter
+}
diff --git a/src/GameIdeas/Client/GameIdeas.BlazorApp/Shared/Headers/HeaderBaseComponent.cs b/src/GameIdeas/Client/GameIdeas.BlazorApp/Shared/Headers/HeaderBaseComponent.cs
deleted file mode 100644
index 79f09b8..0000000
--- a/src/GameIdeas/Client/GameIdeas.BlazorApp/Shared/Headers/HeaderBaseComponent.cs
+++ /dev/null
@@ -1,5 +0,0 @@
-using Microsoft.AspNetCore.Components;
-
-namespace GameIdeas.BlazorApp.Shared.Headers;
-
-public class HeaderBaseComponent : ComponentBase;
diff --git a/src/GameIdeas/Client/GameIdeas.BlazorApp/Shared/Headers/HeaderBase.razor b/src/GameIdeas/Client/GameIdeas.BlazorApp/Shared/Layouts/Header/HeaderLayout.razor
similarity index 58%
rename from src/GameIdeas/Client/GameIdeas.BlazorApp/Shared/Headers/HeaderBase.razor
rename to src/GameIdeas/Client/GameIdeas.BlazorApp/Shared/Layouts/Header/HeaderLayout.razor
index 71f784f..b18fedc 100644
--- a/src/GameIdeas/Client/GameIdeas.BlazorApp/Shared/Headers/HeaderBase.razor
+++ b/src/GameIdeas/Client/GameIdeas.BlazorApp/Shared/Layouts/Header/HeaderLayout.razor
@@ -1,14 +1,18 @@
@using GameIdeas.BlazorApp.Pages.Games
@using GameIdeas.BlazorApp.Pages.Games.Models
+@using GameIdeas.BlazorApp.Shared.Components.Account
@using GameIdeas.BlazorApp.Shared.Components.Dropdown
+@using GameIdeas.BlazorApp.Shared.Components.Select
@using GameIdeas.Resources
+@inherits LayoutComponentBase
+
-
+
diff --git a/src/GameIdeas/Client/GameIdeas.BlazorApp/Shared/Headers/HeaderBase.razor.cs b/src/GameIdeas/Client/GameIdeas.BlazorApp/Shared/Layouts/Header/HeaderLayout.razor.cs
similarity index 61%
rename from src/GameIdeas/Client/GameIdeas.BlazorApp/Shared/Headers/HeaderBase.razor.cs
rename to src/GameIdeas/Client/GameIdeas.BlazorApp/Shared/Layouts/Header/HeaderLayout.razor.cs
index 181a72e..b3a43f7 100644
--- a/src/GameIdeas/Client/GameIdeas.BlazorApp/Shared/Headers/HeaderBase.razor.cs
+++ b/src/GameIdeas/Client/GameIdeas.BlazorApp/Shared/Layouts/Header/HeaderLayout.razor.cs
@@ -1,15 +1,21 @@
using GameIdeas.BlazorApp.Pages.Games.Models;
+using GameIdeas.BlazorApp.Shared.Components.Account;
using GameIdeas.BlazorApp.Shared.Components.Dropdown;
+using GameIdeas.BlazorApp.Shared.Components.Select;
using GameIdeas.Resources;
using Microsoft.AspNetCore.Components;
-namespace GameIdeas.BlazorApp.Shared.Headers;
+namespace GameIdeas.BlazorApp.Shared.Layouts.Header;
-public partial class HeaderBase
+public partial class HeaderLayout : LayoutComponentBase
{
- [Parameter] public HeaderBaseComponent? Header { get; set; }
[Parameter] public EventCallback
AddTypeChanged { get; set; }
+ private readonly IEnumerable> SelectElements = [
+ new SelectElement { Item = AddType.Manual, Label = ResourcesKey.ManualAdd },
+ new SelectElement { Item = AddType.Auto, Label = ResourcesKey.AutoAdd }
+ ];
+
private DropdownContent? DropdownAdd;
private readonly IEnumerable AddTypes =
[
@@ -34,9 +40,9 @@ public partial class HeaderBase
AccountSettings?.Close();
}
- private async Task HandleAddTypeClickedAsync(AddTypeParams value)
+ private async Task HandleAddTypeClickedAsync(AddType value)
{
- await AddTypeChanged.InvokeAsync(value.AddType);
+ await AddTypeChanged.InvokeAsync(value);
}
private void HandleAccountClicked()
diff --git a/src/GameIdeas/Client/GameIdeas.BlazorApp/Shared/Headers/HeaderBase.razor.css b/src/GameIdeas/Client/GameIdeas.BlazorApp/Shared/Layouts/Header/HeaderLayout.razor.css
similarity index 100%
rename from src/GameIdeas/Client/GameIdeas.BlazorApp/Shared/Headers/HeaderBase.razor.css
rename to src/GameIdeas/Client/GameIdeas.BlazorApp/Shared/Layouts/Header/HeaderLayout.razor.css
diff --git a/src/GameIdeas/Client/GameIdeas.BlazorApp/Shared/Headers/LoginValidator.cs b/src/GameIdeas/Client/GameIdeas.BlazorApp/Shared/Layouts/Header/LoginValidator.cs
similarity index 86%
rename from src/GameIdeas/Client/GameIdeas.BlazorApp/Shared/Headers/LoginValidator.cs
rename to src/GameIdeas/Client/GameIdeas.BlazorApp/Shared/Layouts/Header/LoginValidator.cs
index 931bd7b..14cd426 100644
--- a/src/GameIdeas/Client/GameIdeas.BlazorApp/Shared/Headers/LoginValidator.cs
+++ b/src/GameIdeas/Client/GameIdeas.BlazorApp/Shared/Layouts/Header/LoginValidator.cs
@@ -1,7 +1,7 @@
using FluentValidation;
using GameIdeas.Shared.Dto;
-namespace GameIdeas.BlazorApp.Shared.Headers;
+namespace GameIdeas.BlazorApp.Shared.Layouts.Header;
public class LoginValidator : AbstractValidator
{