Compare commits
10 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 2ac142ed7e | |||
| 637a7635cd | |||
| 7e5475322b | |||
| 3b58e43611 | |||
| 99830c6a93 | |||
| 481544069a | |||
| b5e8a436b4 | |||
| 7faf857ea1 | |||
| 13692b8af0 | |||
| 5b52989230 |
@@ -2,7 +2,7 @@
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net10.0</TargetFramework>
|
||||
<Version>1.0.0</Version>
|
||||
<Version>1.0.13</Version>
|
||||
<Authors>SZUAbsolventenverein</Authors>
|
||||
<Company>SZUAbsolventenverein</Company>
|
||||
<Description>[Description]</Description>
|
||||
@@ -12,6 +12,10 @@
|
||||
<CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<None Include="wwwroot\Themes\SZUAbsolventenverein.Theme.Website\icon.png" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly" Version="10.0.1" />
|
||||
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.Authentication" Version="10.0.1" />
|
||||
|
||||
@@ -10,7 +10,7 @@ namespace SZUAbsolventenverein.Theme.Website
|
||||
public Oqtane.Models.Theme Theme => new Oqtane.Models.Theme
|
||||
{
|
||||
Name = "SZUAbsolventenverein Website",
|
||||
Version = "1.0.17",
|
||||
Version = "1.0.15",
|
||||
PackageName = "SZUAbsolventenverein.Theme.Website",
|
||||
ThemeSettingsType = "SZUAbsolventenverein.Theme.Website.ThemeSettings, SZUAbsolventenverein.Theme.Website.Client.Oqtane",
|
||||
ContainerSettingsType = "SZUAbsolventenverein.Theme.Website.ContainerSettings, SZUAbsolventenverein.Theme.Website.Client.Oqtane",
|
||||
|
||||
16
Client/Themes/MenuVertical.razor
Normal file
16
Client/Themes/MenuVertical.razor
Normal file
@@ -0,0 +1,16 @@
|
||||
@namespace Oqtane.Themes.Controls
|
||||
@inherits MenuBase
|
||||
|
||||
@if (MenuPages.Any())
|
||||
{
|
||||
<span class="app-menu-toggler">
|
||||
<button type="button" class="navbar-toggler" data-bs-toggle="collapse" data-bs-target="#Menu" aria-controls="Menu" aria-expanded="false" aria-label="Toggle Navigation">
|
||||
<span class="navbar-toggler-icon"></span>
|
||||
</button>
|
||||
</span>
|
||||
<div class="app-menu">
|
||||
<div class="collapse navbar-collapse" id="Menu">
|
||||
<MenuItemsVertical ParentPage="null" Pages="MenuPages" />
|
||||
</div>
|
||||
</div>
|
||||
}
|
||||
@@ -1,8 +1,8 @@
|
||||
@namespace SZUAbsolventenverein.Theme.Website
|
||||
@namespace SZUAbsolventenverein.Theme.Website
|
||||
@inherits ThemeBase
|
||||
@inject NavigationManager NavigationManager
|
||||
@inject ISettingService SettingService
|
||||
@implements IDisposable
|
||||
@implements IDisposable
|
||||
|
||||
<main role="main">
|
||||
<nav class="navbar navbar-dark bg-primary fixed-top app-navbar">
|
||||
@@ -11,99 +11,71 @@
|
||||
<Logo />
|
||||
</div>
|
||||
|
||||
<!-- Versteckte Checkbox zum Steuern des Menüs (nur HTML, kein Blazor) -->
|
||||
<input type="checkbox" id="nav-toggle" class="nav-toggle" @bind="_navOpen" />
|
||||
|
||||
<!-- Burger-Icon, das die Checkbox toggelt -->
|
||||
<label for="nav-toggle" class="nav-toggle-label">
|
||||
<span></span>
|
||||
<span></span>
|
||||
<span></span>
|
||||
</label>
|
||||
|
||||
<!-- Menü-Container, der per :checked ein-/ausgeblendet wird -->
|
||||
<!-- Menü-Container, der per :checked ein-/ausgeblendet wird -->
|
||||
<div class="app-menu">
|
||||
<div class="app-menu-items">
|
||||
@if (PageState?.Pages != null)
|
||||
{
|
||||
// Diese Seitennamen sollen NICHT im Menü erscheinen
|
||||
var hiddenNames = new[]
|
||||
<div class="app-menu-items">
|
||||
@if (PageState?.Pages != null)
|
||||
{
|
||||
"Login", "Register", "Reset", "Profile",
|
||||
"Search", "Privacy", "Terms", "Not Found", "NotFound"
|
||||
};
|
||||
|
||||
// Aktuelle Seite erkennen
|
||||
var currentPath = new Uri(NavigationManager.Uri).AbsolutePath.Trim('/').ToLower();
|
||||
|
||||
@foreach (var page in PageState.Pages
|
||||
.Where(p => p.ParentId == null
|
||||
&& p.IsNavigation
|
||||
&& !p.IsDeleted
|
||||
&& !hiddenNames.Contains(p.Name)))
|
||||
{
|
||||
var pagePath = (page.Path ?? "").Trim('/').ToLower();
|
||||
var isActive = currentPath == pagePath;
|
||||
var children = PageState.Pages
|
||||
.Where(c => c.ParentId == page.PageId
|
||||
&& c.IsNavigation
|
||||
&& !c.IsDeleted
|
||||
&& !hiddenNames.Contains(c.Name));
|
||||
var hasChildren = children.Any();
|
||||
// Prüfe ob ein Kind aktiv ist
|
||||
var isChildActive = hasChildren && children.Any(c => currentPath == (c.Path ?? "").Trim('/').ToLower());
|
||||
var activeClass = (isActive || isChildActive) ? "nav-link text-white active" : "nav-link text-white";
|
||||
var wrapperClass = hasChildren ? "nav-item nav-item-dropdown" : "nav-item";
|
||||
|
||||
<div class="@wrapperClass">
|
||||
<div class="nav-link-row">
|
||||
<a class="@activeClass" href="@(@page.Path)">
|
||||
// Diese Seitennamen sollen NICHT im Menü erscheinen
|
||||
var hiddenNames = new[]
|
||||
{
|
||||
"Login", "Register", "Reset", "Profile",
|
||||
"Search", "Privacy", "Terms", "Not Found", "NotFound"
|
||||
};
|
||||
@foreach (var page in PageState.Pages
|
||||
.Where(p => p.ParentId == null
|
||||
&& p.IsNavigation
|
||||
&& !p.IsDeleted
|
||||
&& !hiddenNames.Contains(p.Name)))
|
||||
{
|
||||
<div class="nav-item">
|
||||
<a class="nav-link text-white" href="@(@page.Path)">
|
||||
@(@page.Name)
|
||||
</a>
|
||||
@if (hasChildren)
|
||||
{
|
||||
<button class="dropdown-toggle-btn" onclick="var sub=this.closest('.nav-item-dropdown').querySelector('.app-submenu'); sub.classList.toggle('mobile-open'); this.querySelector('.dropdown-arrow').classList.toggle('open');">
|
||||
<span class="dropdown-arrow">▾</span>
|
||||
</button>
|
||||
}
|
||||
</div>
|
||||
|
||||
@if (hasChildren)
|
||||
var children = PageState.Pages
|
||||
.Where(c => c.ParentId == page.PageId
|
||||
&& c.IsNavigation
|
||||
&& !c.IsDeleted
|
||||
&& !hiddenNames.Contains(c.Name));
|
||||
if (children.Any())
|
||||
{
|
||||
<div class="app-submenu">
|
||||
@foreach (var child in children)
|
||||
{
|
||||
var childPath = (child.Path ?? "").Trim('/').ToLower();
|
||||
var isThisChildActive = currentPath == childPath;
|
||||
var childActiveClass = isThisChildActive ? "nav-link text-white active" : "nav-link text-white";
|
||||
|
||||
<div class="nav-item">
|
||||
<a class="@childActiveClass" href="@child.Path">
|
||||
<a class="nav-link text-white" href="@child.Path">
|
||||
@child.Name
|
||||
</a>
|
||||
</div>
|
||||
}
|
||||
</div>
|
||||
}
|
||||
</div>
|
||||
}
|
||||
}
|
||||
}
|
||||
</div>
|
||||
|
||||
<!-- WICHTIG: Footer jetzt AUßERHALB von app-menu-items -->
|
||||
<div class="app-menu-footer ">
|
||||
<UserProfile ShowRegister="@_register" />
|
||||
<Login ShowLogin="@_login" />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Rechts: ControlPanel + User + Login -->
|
||||
<div class="d-flex align-items-center gap-2 app-navbar-left">
|
||||
<div class="d-flex align-items-center gap-2">
|
||||
<ControlPanel/>
|
||||
</div>
|
||||
<!-- WICHTIG: Footer jetzt AUßERHALB von app-menu-items -->
|
||||
<div class="app-menu-footer ">
|
||||
<UserProfile ShowRegister="@_register" />
|
||||
<Login ShowLogin="@_login" />
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
<!-- Rechts: ControlPanel + User + Login -->
|
||||
<div class="d-flex align-items-center gap-2 app-navbar-left">
|
||||
<div class="d-flex align-items-center gap-2">
|
||||
<ControlPanel/>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
|
||||
|
||||
<div class="content">
|
||||
<div class="container">
|
||||
<div class="row">
|
||||
@@ -187,15 +159,14 @@
|
||||
</div>
|
||||
<Pane Name="Bottom Full Width" />
|
||||
</div>
|
||||
<CookieConsent />
|
||||
</main>
|
||||
|
||||
|
||||
@code {
|
||||
public override string Name => "Theme1";
|
||||
|
||||
public override string Panes => PaneNames.Admin + ",Top Full Width,Top 100%,Left 50%,Right 50%,Left 33%,Center 33%,Right 33%,Left Outer 25%,Left Inner 25%,Right Inner 25%,Right Outer 25%,Left 25%,Center 50%,Right 25%,Left Sidebar 66%,Right Sidebar 33%,Left Sidebar 33%,Right Sidebar 66%,Bottom 100%,Bottom Full Width";
|
||||
|
||||
private bool _showDropdown = false;
|
||||
private bool _login = true;
|
||||
private bool _register = true;
|
||||
private bool _navOpen = false;
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
@namespace SZUAbsolventenverein.Theme.Website
|
||||
ich pr@namespace SZUAbsolventenverein.Theme.Website
|
||||
@inherits ModuleBase
|
||||
@implements Oqtane.Interfaces.ISettingsControl
|
||||
@inject ISettingService SettingService
|
||||
|
||||
BIN
Client/Themes/icon.jpg
Normal file
BIN
Client/Themes/icon.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 51 KiB |
@@ -1,21 +1,7 @@
|
||||
/* ===========================
|
||||
/* ===========================
|
||||
Standard Layout
|
||||
=========================== */
|
||||
|
||||
body {}
|
||||
|
||||
/* Oqtane Control Panel / Bootstrap Overlays über dem Menü anzeigen */
|
||||
.offcanvas,
|
||||
.offcanvas-backdrop,
|
||||
.modal,
|
||||
.modal-backdrop {
|
||||
z-index: 2000 !important;
|
||||
}
|
||||
|
||||
.offcanvas.show {
|
||||
z-index: 2001 !important;
|
||||
}
|
||||
|
||||
/* Login-Button (Mobile + Desktop) */
|
||||
.app-menu-footer .btn-login,
|
||||
.app-menu-footer .login-btn,
|
||||
@@ -103,7 +89,6 @@ body {}
|
||||
z-index: 1000;
|
||||
}
|
||||
|
||||
|
||||
/* ===================================================
|
||||
NAVBAR / BURGER / SIDEBAR
|
||||
=================================================== */
|
||||
@@ -171,60 +156,9 @@ body {}
|
||||
gap: 0.5rem;
|
||||
}
|
||||
|
||||
/* Dropdown-Wrapper: relative positioniert für absolutes Dropdown */
|
||||
.nav-item-dropdown {
|
||||
position: relative;
|
||||
}
|
||||
|
||||
/* Link + Toggle-Button nebeneinander */
|
||||
.nav-link-row {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 0;
|
||||
}
|
||||
|
||||
/* Toggle-Button für Mobile */
|
||||
.dropdown-toggle-btn {
|
||||
background: none;
|
||||
border: none;
|
||||
color: white;
|
||||
cursor: pointer;
|
||||
padding: 6px 8px;
|
||||
font-size: 1rem;
|
||||
line-height: 1;
|
||||
}
|
||||
|
||||
/* Dropdown-Pfeil */
|
||||
.dropdown-arrow {
|
||||
font-size: 0.8em;
|
||||
opacity: 0.7;
|
||||
display: inline-block;
|
||||
transition: transform 0.2s ease;
|
||||
}
|
||||
|
||||
/* Pfeil dreht sich wenn offen */
|
||||
.dropdown-arrow.open {
|
||||
transform: rotate(180deg);
|
||||
}
|
||||
|
||||
/* Untermenü: standardmäßig versteckt */
|
||||
/* Untermenü (Kinder-Seiten) etwas eingerückt */
|
||||
.app-submenu {
|
||||
display: none;
|
||||
position: absolute;
|
||||
top: 100%;
|
||||
left: 0;
|
||||
min-width: 180px;
|
||||
background-color: #9a9999;
|
||||
border-radius: 6px;
|
||||
padding: 0.5rem 0;
|
||||
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.25);
|
||||
z-index: 2000;
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
/* Dropdown bei Hover öffnen */
|
||||
.nav-item-dropdown:hover > .app-submenu {
|
||||
display: flex;
|
||||
margin-left: 1rem;
|
||||
}
|
||||
|
||||
/* Nav-Items */
|
||||
@@ -232,42 +166,21 @@ body {}
|
||||
padding-bottom: 0.25rem;
|
||||
}
|
||||
|
||||
/* Sub-Items im Dropdown: volle Breite */
|
||||
.app-submenu .nav-item {
|
||||
padding: 0;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.app-submenu .nav-link {
|
||||
padding: 6px 16px;
|
||||
border-radius: 0;
|
||||
white-space: nowrap;
|
||||
display: block;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.app-submenu .nav-link:hover {
|
||||
background-color: rgba(0, 0, 0, 0.25);
|
||||
}
|
||||
|
||||
/* Hover-/Active-Style für Links */
|
||||
.app-menu .nav-link {
|
||||
padding: 6px 12px;
|
||||
border-radius: 6px;
|
||||
transition: background-color 0.2s ease, color 0.2s ease, font-weight 0.2s ease;
|
||||
transition: background-color 0.2s ease, color 0.2s ease;
|
||||
}
|
||||
|
||||
/* Hover: dunkler Hintergrund */
|
||||
.app-menu .nav-link:hover {
|
||||
background-color: rgba(0, 0, 0, 0.35);
|
||||
background-color: #4a4a4a;
|
||||
color: #ffffff !important;
|
||||
}
|
||||
|
||||
/* Aktive Seite: dunkel + fett */
|
||||
.app-menu .nav-link.active {
|
||||
background-color: rgba(0, 0, 0, 0.45);
|
||||
background-color: #3b3b3b;
|
||||
color: #ffffff !important;
|
||||
font-weight: 700;
|
||||
}
|
||||
|
||||
|
||||
@@ -286,7 +199,7 @@ body {}
|
||||
min-height: 60px;
|
||||
/* optional: fixe Höhe */
|
||||
}
|
||||
|
||||
|
||||
/* Menü nur als Container für den Footer */
|
||||
.app-menu {
|
||||
display: flex !important;
|
||||
@@ -400,7 +313,6 @@ body {}
|
||||
justify-content: right;
|
||||
}
|
||||
|
||||
|
||||
/* Sidebar öffnen/schließen über Checkbox */
|
||||
.nav-toggle:checked~.app-menu {
|
||||
transform: translateX(0);
|
||||
@@ -412,22 +324,4 @@ body {}
|
||||
font-size: clamp(12px, 3.5vw, 15px);
|
||||
}
|
||||
|
||||
/* Mobile: Dropdown standardmäßig versteckt */
|
||||
.app-submenu {
|
||||
position: static !important;
|
||||
min-width: unset !important;
|
||||
box-shadow: none !important;
|
||||
background-color: transparent !important;
|
||||
padding: 0 !important;
|
||||
padding-left: 1rem !important;
|
||||
border-radius: 0 !important;
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
/* Mobile: Dropdown nur öffnen wenn angeklickt */
|
||||
.app-submenu.mobile-open {
|
||||
display: flex !important;
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
}
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 13 KiB |
@@ -2,7 +2,7 @@
|
||||
<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
|
||||
<metadata>
|
||||
<id>SZUAbsolventenverein.Theme.Website</id>
|
||||
<version>1.0.17</version>
|
||||
<version>1.0.15</version>
|
||||
<authors>SZUAbsolventenverein</authors>
|
||||
<owners>SZUAbsolventenverein</owners>
|
||||
<title>Website</title>
|
||||
|
||||
10
Package/debug.sh
Executable file → Normal file
10
Package/debug.sh
Executable file → Normal file
@@ -1,10 +1,8 @@
|
||||
#!/bin/bash
|
||||
set -x
|
||||
|
||||
TargetFramework=$1
|
||||
ProjectName=$2
|
||||
|
||||
whoami
|
||||
|
||||
cp -f "../Client/bin/Debug/$TargetFramework/$ProjectName.Client.Oqtane.dll" "../../oqtane.framework/Oqtane.Server/bin/Debug/$TargetFramework/"
|
||||
cp -f "../Client/bin/Debug/$TargetFramework/$ProjectName.Client.Oqtane.pdb" "../../oqtane.framework/Oqtane.Server/bin/Debug/$TargetFramework/"
|
||||
cp -rf "../Client/wwwroot/"* "../../oqtane.framework/Oqtane.Server/wwwroot/"
|
||||
cp -f "../Client/bin/Debug/$TargetFramework/$ProjectName$.Client.Oqtane.dll" "../../oqtane.framework/Oqtane.Server/bin/Debug/$TargetFramework/"
|
||||
cp -f "../Client/bin/Debug/$TargetFramework/$ProjectName$.Client.Oqtane.pdb" "../../oqtane.framework/Oqtane.Server/bin/Debug/$TargetFramework/"
|
||||
cp -rf "../Server/wwwroot/"* "../../oqtane.framework/Oqtane.Server/wwwroot/"
|
||||
BIN
Package/icon.png
BIN
Package/icon.png
Binary file not shown.
|
Before Width: | Height: | Size: 7.6 KiB After Width: | Height: | Size: 13 KiB |
@@ -2,6 +2,6 @@
|
||||
set TargetFramework=%1
|
||||
set ProjectName=%2
|
||||
|
||||
if exist *.nupkg del *.nupkg
|
||||
dotnet build "..\Client\SZUAbsolventenverein.Theme.Website.Client.csproj" -c Release
|
||||
dotnet pack "%ProjectName%.Package.csproj" -p:NuspecFile="%ProjectName%.nuspec" -p:NuspecProperties="targetframework=%TargetFramework%;projectname=%ProjectName%" --no-build -o .
|
||||
del "*.nupkg"
|
||||
"..\..\oqtane.framework\oqtane.package\nuget.exe" pack %ProjectName%.nuspec -Properties targetframework=%TargetFramework%;projectname=%ProjectName%
|
||||
XCOPY "*.nupkg" "..\..\oqtane.framework\Oqtane.Server\wwwroot\Packages\" /Y
|
||||
|
||||
Reference in New Issue
Block a user