Browse Source

Feature/add semantic list structure to header navigation (#2044)

* Add semantic list structure (ul and li elements)

* Update changelog
pull/2052/head
Thomas Kaul 1 year ago
committed by GitHub
parent
commit
7082ff12f8
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 1
      CHANGELOG.md
  2. 575
      apps/client/src/app/components/header/header.component.html

1
CHANGELOG.md

@ -11,6 +11,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Added the investment streaks to the analysis page - Added the investment streaks to the analysis page
- Added support for a unit in the value component - Added support for a unit in the value component
- Added a semantic list structure to the header navigation
- Added a default value for the `includeHistoricalData` attribute in the symbol data endpoint - Added a default value for the `includeHistoricalData` attribute in the symbol data endpoint
## 1.276.0 - 2023-06-03 ## 1.276.0 - 2023-06-03

575
apps/client/src/app/components/header/header.component.html

@ -8,216 +8,238 @@
<gf-logo [label]="pageTitle"></gf-logo> <gf-logo [label]="pageTitle"></gf-logo>
</a> </a>
<span class="spacer"></span> <span class="spacer"></span>
<a <ul class="alig-items-center d-flex list-inline m-0">
class="d-none d-sm-block" <li class="list-inline-item">
i18n <a
mat-flat-button class="d-none d-sm-block"
[ngClass]="{ i18n
'font-weight-bold': currentRoute === 'home' || currentRoute === 'zen', mat-flat-button
'text-decoration-underline': [ngClass]="{
currentRoute === 'home' || currentRoute === 'zen' 'font-weight-bold':
}" currentRoute === 'home' || currentRoute === 'zen',
[routerLink]="['/']" 'text-decoration-underline':
>Overview</a currentRoute === 'home' || currentRoute === 'zen'
> }"
<a [routerLink]="['/']"
class="d-none d-sm-block mx-1" >Overview</a
i18n
mat-flat-button
[ngClass]="{
'font-weight-bold': currentRoute === 'portfolio',
'text-decoration-underline': currentRoute === 'portfolio'
}"
[routerLink]="['/portfolio']"
>Portfolio</a
>
<a
class="d-none d-sm-block mx-1"
i18n
mat-flat-button
[ngClass]="{
'font-weight-bold': currentRoute === 'accounts',
'text-decoration-underline': currentRoute === 'accounts'
}"
[routerLink]="['/accounts']"
>Accounts</a
>
<a
*ngIf="hasPermissionToAccessAdminControl"
class="d-none d-sm-block mx-1"
i18n
mat-flat-button
[ngClass]="{
'font-weight-bold': currentRoute === 'admin',
'text-decoration-underline': currentRoute === 'admin'
}"
[routerLink]="['/admin']"
>Admin Control</a
>
<a
class="d-none d-sm-block mx-1"
i18n
mat-flat-button
[ngClass]="{
'font-weight-bold': currentRoute === 'resources',
'text-decoration-underline': currentRoute === 'resources'
}"
[routerLink]="['/resources']"
>Resources</a
>
<a
*ngIf="
hasPermissionForSubscription && user?.subscription?.type === 'Basic'
"
class="d-none d-sm-block mx-1"
i18n
mat-flat-button
[ngClass]="{
'font-weight-bold': currentRoute === 'pricing',
'text-decoration-underline': currentRoute === 'pricing'
}"
[routerLink]="['/pricing']"
>Pricing</a
>
<a
class="d-none d-sm-block mx-1"
i18n
mat-flat-button
[ngClass]="{
'font-weight-bold': currentRoute === 'about',
'text-decoration-underline': currentRoute === 'about'
}"
[routerLink]="['/about']"
>About</a
>
<button
class="no-min-width px-1"
mat-flat-button
[matMenuTriggerFor]="accountMenu"
(menuClosed)="onMenuClosed()"
(menuOpened)="onMenuOpened()"
>
<ion-icon
class="d-none d-sm-block"
name="person-circle-outline"
size="large"
></ion-icon>
<ion-icon
class="d-block d-sm-none"
size="large"
[name]="isMenuOpen ? 'close-outline' : 'menu-outline'"
></ion-icon>
</button>
<mat-menu #accountMenu="matMenu" xPosition="before">
<ng-container *ngIf="user?.access?.length > 0">
<button mat-menu-item (click)="impersonateAccount(null)">
<ion-icon
*ngIf="user?.access?.length > 0"
class="mr-2"
[name]="
impersonationId
? 'radio-button-off-outline'
: 'radio-button-on-outline'
"
></ion-icon>
<span i18n>Me</span>
</button>
<button
*ngFor="let accessItem of user?.access"
mat-menu-item
(click)="impersonateAccount(accessItem.id)"
> >
<ion-icon </li>
class="mr-2" <li class="list-inline-item">
name="square-outline" <a
[name]=" class="d-none d-sm-block mx-1"
accessItem.id === impersonationId i18n
? 'radio-button-on-outline' mat-flat-button
: 'radio-button-off-outline' [ngClass]="{
" 'font-weight-bold': currentRoute === 'portfolio',
></ion-icon> 'text-decoration-underline': currentRoute === 'portfolio'
<span *ngIf="accessItem.alias">{{ accessItem.alias }}</span> }"
<span *ngIf="!accessItem.alias" i18n>User</span> [routerLink]="['/portfolio']"
</button> >Portfolio</a
<hr class="m-0" /> >
</ng-container> </li>
<a <li class="list-inline-item">
class="d-flex d-sm-none" <a
i18n class="d-none d-sm-block mx-1"
mat-menu-item i18n
[ngClass]="{ mat-flat-button
'font-weight-bold': currentRoute === 'home' || currentRoute === 'zen' [ngClass]="{
}" 'font-weight-bold': currentRoute === 'accounts',
[routerLink]="['/']" 'text-decoration-underline': currentRoute === 'accounts'
>Overview</a }"
> [routerLink]="['/accounts']"
<a >Accounts</a
class="d-flex d-sm-none" >
i18n </li>
mat-menu-item <li *ngIf="hasPermissionToAccessAdminControl" class="list-inline-item">
[ngClass]="{ <a
'font-weight-bold': currentRoute === 'portfolio' class="d-none d-sm-block mx-1"
}" i18n
[routerLink]="['/portfolio']" mat-flat-button
>Portfolio</a [ngClass]="{
> 'font-weight-bold': currentRoute === 'admin',
<a 'text-decoration-underline': currentRoute === 'admin'
class="d-flex d-sm-none" }"
i18n [routerLink]="['/admin']"
mat-menu-item >Admin Control</a
[ngClass]="{ 'font-weight-bold': currentRoute === 'accounts' }" >
[routerLink]="['/accounts']" </li>
>Accounts</a <li class="list-inline-item">
> <a
<a class="d-none d-sm-block mx-1"
i18n i18n
mat-menu-item mat-flat-button
[ngClass]="{ 'font-weight-bold': currentRoute === 'account' }" [ngClass]="{
[routerLink]="['/account']" 'font-weight-bold': currentRoute === 'resources',
>My Ghostfolio</a 'text-decoration-underline': currentRoute === 'resources'
> }"
<a [routerLink]="['/resources']"
*ngIf="hasPermissionToAccessAdminControl" >Resources</a
class="d-flex d-sm-none" >
i18n </li>
mat-menu-item <li
[ngClass]="{ 'font-weight-bold': currentRoute === 'admin' }"
[routerLink]="['/admin']"
>Admin Control</a
>
<hr class="m-0" />
<a
class="d-flex d-sm-none"
i18n
mat-menu-item
[ngClass]="{
'font-weight-bold': currentRoute === 'resources'
}"
[routerLink]="['/resources']"
>Resources</a
>
<a
*ngIf=" *ngIf="
hasPermissionForSubscription && user?.subscription?.type === 'Basic' hasPermissionForSubscription && user?.subscription?.type === 'Basic'
" "
class="d-flex d-sm-none" class="list-inline-item"
i18n
mat-menu-item
[ngClass]="{ 'font-weight-bold': currentRoute === 'pricing' }"
[routerLink]="['/pricing']"
>Pricing</a
>
<a
class="d-flex d-sm-none"
i18n
mat-menu-item
[ngClass]="{ 'font-weight-bold': currentRoute === 'about' }"
[routerLink]="['/about']"
>About Ghostfolio</a
> >
<hr class="d-flex d-sm-none m-0" /> <a
<button mat-menu-item (click)="onSignOut()">Logout</button> class="d-none d-sm-block mx-1"
</mat-menu> i18n
mat-flat-button
[ngClass]="{
'font-weight-bold': currentRoute === 'pricing',
'text-decoration-underline': currentRoute === 'pricing'
}"
[routerLink]="['/pricing']"
>Pricing</a
>
</li>
<li class="list-inline-item">
<a
class="d-none d-sm-block mx-1"
i18n
mat-flat-button
[ngClass]="{
'font-weight-bold': currentRoute === 'about',
'text-decoration-underline': currentRoute === 'about'
}"
[routerLink]="['/about']"
>About</a
>
</li>
<li class="list-inline-item">
<button
class="no-min-width px-1"
mat-flat-button
[matMenuTriggerFor]="accountMenu"
(menuClosed)="onMenuClosed()"
(menuOpened)="onMenuOpened()"
>
<ion-icon
class="d-none d-sm-block"
name="person-circle-outline"
size="large"
></ion-icon>
<ion-icon
class="d-block d-sm-none"
size="large"
[name]="isMenuOpen ? 'close-outline' : 'menu-outline'"
></ion-icon>
</button>
<mat-menu #accountMenu="matMenu" xPosition="before">
<ng-container *ngIf="user?.access?.length > 0">
<button mat-menu-item (click)="impersonateAccount(null)">
<ion-icon
*ngIf="user?.access?.length > 0"
class="mr-2"
[name]="
impersonationId
? 'radio-button-off-outline'
: 'radio-button-on-outline'
"
></ion-icon>
<span i18n>Me</span>
</button>
<button
*ngFor="let accessItem of user?.access"
mat-menu-item
(click)="impersonateAccount(accessItem.id)"
>
<ion-icon
class="mr-2"
name="square-outline"
[name]="
accessItem.id === impersonationId
? 'radio-button-on-outline'
: 'radio-button-off-outline'
"
></ion-icon>
<span *ngIf="accessItem.alias">{{ accessItem.alias }}</span>
<span *ngIf="!accessItem.alias" i18n>User</span>
</button>
<hr class="m-0" />
</ng-container>
<a
class="d-flex d-sm-none"
i18n
mat-menu-item
[ngClass]="{
'font-weight-bold':
currentRoute === 'home' || currentRoute === 'zen'
}"
[routerLink]="['/']"
>Overview</a
>
<a
class="d-flex d-sm-none"
i18n
mat-menu-item
[ngClass]="{
'font-weight-bold': currentRoute === 'portfolio'
}"
[routerLink]="['/portfolio']"
>Portfolio</a
>
<a
class="d-flex d-sm-none"
i18n
mat-menu-item
[ngClass]="{ 'font-weight-bold': currentRoute === 'accounts' }"
[routerLink]="['/accounts']"
>Accounts</a
>
<a
i18n
mat-menu-item
[ngClass]="{ 'font-weight-bold': currentRoute === 'account' }"
[routerLink]="['/account']"
>My Ghostfolio</a
>
<a
*ngIf="hasPermissionToAccessAdminControl"
class="d-flex d-sm-none"
i18n
mat-menu-item
[ngClass]="{ 'font-weight-bold': currentRoute === 'admin' }"
[routerLink]="['/admin']"
>Admin Control</a
>
<hr class="m-0" />
<a
class="d-flex d-sm-none"
i18n
mat-menu-item
[ngClass]="{
'font-weight-bold': currentRoute === 'resources'
}"
[routerLink]="['/resources']"
>Resources</a
>
<a
*ngIf="
hasPermissionForSubscription &&
user?.subscription?.type === 'Basic'
"
class="d-flex d-sm-none"
i18n
mat-menu-item
[ngClass]="{ 'font-weight-bold': currentRoute === 'pricing' }"
[routerLink]="['/pricing']"
>Pricing</a
>
<a
class="d-flex d-sm-none"
i18n
mat-menu-item
[ngClass]="{ 'font-weight-bold': currentRoute === 'about' }"
[routerLink]="['/about']"
>About Ghostfolio</a
>
<hr class="d-flex d-sm-none m-0" />
<button mat-menu-item (click)="onSignOut()">Logout</button>
</mat-menu>
</li>
</ul>
</ng-container> </ng-container>
<ng-container *ngIf="user === null"> <ng-container *ngIf="user === null">
<a <a
@ -231,67 +253,86 @@
></gf-logo> ></gf-logo>
</a> </a>
<span class="spacer"></span> <span class="spacer"></span>
<a <ul class="alig-items-center d-flex list-inline m-0">
class="d-none d-sm-block mx-1" <li class="list-inline-item">
i18n <a
mat-flat-button class="d-none d-sm-block mx-1"
[ngClass]="{ i18n
'font-weight-bold': currentRoute === 'features', mat-flat-button
'text-decoration-underline': currentRoute === 'features' [ngClass]="{
}" 'font-weight-bold': currentRoute === 'features',
[routerLink]="['/features']" 'text-decoration-underline': currentRoute === 'features'
>Features</a }"
> [routerLink]="['/features']"
<a >Features</a
class="d-none d-sm-block mx-1" >
i18n </li>
mat-flat-button <li class="list-inline-item">
[ngClass]="{ <a
'font-weight-bold': currentRoute === 'about', class="d-none d-sm-block mx-1"
'text-decoration-underline': currentRoute === 'about' i18n
}" mat-flat-button
[routerLink]="['/about']" [ngClass]="{
>About</a 'font-weight-bold': currentRoute === 'about',
> 'text-decoration-underline': currentRoute === 'about'
<a }"
*ngIf="hasPermissionForSubscription" [routerLink]="['/about']"
i18n >About</a
mat-flat-button >
[ngClass]="{ </li>
'font-weight-bold': currentRoute === 'pricing', <li *ngIf="hasPermissionForSubscription" class="list-inline-item">
'text-decoration-underline': currentRoute === 'pricing' <a
}" i18n
[routerLink]="['/pricing']" mat-flat-button
>Pricing</a [ngClass]="{
> 'font-weight-bold': currentRoute === 'pricing',
<a 'text-decoration-underline': currentRoute === 'pricing'
*ngIf="hasPermissionToAccessFearAndGreedIndex" }"
class="d-none d-sm-block mx-1" [routerLink]="['/pricing']"
i18n >Pricing</a
mat-flat-button >
[ngClass]="{ </li>
'font-weight-bold': currentRoute === 'markets', <li
'text-decoration-underline': currentRoute === 'markets' *ngIf="hasPermissionToAccessFearAndGreedIndex"
}" class="list-inline-item"
[routerLink]="['/markets']" >
>Markets</a <a
> class="d-none d-sm-block mx-1"
<a i18n
class="d-none d-sm-block no-min-width" mat-flat-button
href="https://github.com/ghostfolio/ghostfolio" [ngClass]="{
mat-icon-button 'font-weight-bold': currentRoute === 'markets',
><ion-icon name="logo-github"></ion-icon 'text-decoration-underline': currentRoute === 'markets'
></a> }"
<button class="mx-1" mat-flat-button (click)="openLoginDialog()"> [routerLink]="['/markets']"
<ng-container i18n>Sign in</ng-container> >Markets</a
</button> >
<a </li>
*ngIf="currentRoute !== 'register' && hasPermissionToCreateUser" <li class="list-inline-item">
class="d-none d-sm-block" <a
color="primary" class="d-none d-sm-block no-min-width p-1"
mat-flat-button href="https://github.com/ghostfolio/ghostfolio"
[routerLink]="['/register']" mat-flat-button
><ng-container i18n>Get started</ng-container> ><ion-icon name="logo-github"></ion-icon
</a> ></a>
</li>
<li class="list-inline-item">
<button class="mx-1" mat-flat-button (click)="openLoginDialog()">
<ng-container i18n>Sign in</ng-container>
</button>
</li>
<li
*ngIf="currentRoute !== 'register' && hasPermissionToCreateUser"
class="list-inline-item"
>
<a
class="d-none d-sm-block"
color="primary"
mat-flat-button
[routerLink]="['/register']"
><ng-container i18n>Get started</ng-container>
</a>
</li>
</ul>
</ng-container> </ng-container>
</mat-toolbar> </mat-toolbar>

Loading…
Cancel
Save