mirror of https://github.com/ghostfolio/ghostfolio
committed by
GitHub
10 changed files with 346 additions and 4 deletions
@ -0,0 +1,76 @@ |
|||||
|
import { UserService } from '@ghostfolio/client/services/user/user.service'; |
||||
|
import { SubscriptionType } from '@ghostfolio/common/enums'; |
||||
|
import { SubscriptionOffer } from '@ghostfolio/common/interfaces'; |
||||
|
import { publicRoutes } from '@ghostfolio/common/routes/routes'; |
||||
|
import { GfPremiumIndicatorComponent } from '@ghostfolio/ui/premium-indicator'; |
||||
|
import { DataService } from '@ghostfolio/ui/services'; |
||||
|
|
||||
|
import { DecimalPipe } from '@angular/common'; |
||||
|
import { |
||||
|
ChangeDetectionStrategy, |
||||
|
ChangeDetectorRef, |
||||
|
Component, |
||||
|
DestroyRef, |
||||
|
inject, |
||||
|
OnInit |
||||
|
} from '@angular/core'; |
||||
|
import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; |
||||
|
import { MatButtonModule } from '@angular/material/button'; |
||||
|
import { RouterModule } from '@angular/router'; |
||||
|
|
||||
|
@Component({ |
||||
|
changeDetection: ChangeDetectionStrategy.OnPush, |
||||
|
host: { class: 'page' }, |
||||
|
imports: [ |
||||
|
DecimalPipe, |
||||
|
GfPremiumIndicatorComponent, |
||||
|
MatButtonModule, |
||||
|
RouterModule |
||||
|
], |
||||
|
selector: 'gf-black-weeks-2026-page', |
||||
|
templateUrl: './black-weeks-2026-page.html' |
||||
|
}) |
||||
|
export class BlackWeeks2026PageComponent implements OnInit { |
||||
|
public baseCurrency: string; |
||||
|
public price: number | undefined; |
||||
|
public routerLinkBlog = publicRoutes.blog.routerLink; |
||||
|
public routerLinkFeatures = publicRoutes.features.routerLink; |
||||
|
public routerLinkPricing = publicRoutes.pricing.routerLink; |
||||
|
|
||||
|
private readonly changeDetectorRef = inject(ChangeDetectorRef); |
||||
|
private readonly dataService = inject(DataService); |
||||
|
private readonly destroyRef = inject(DestroyRef); |
||||
|
private readonly userService = inject(UserService); |
||||
|
|
||||
|
public ngOnInit() { |
||||
|
const { baseCurrency, subscriptionOffer } = this.dataService.fetchInfo(); |
||||
|
|
||||
|
this.baseCurrency = baseCurrency; |
||||
|
this.setPrice(subscriptionOffer); |
||||
|
|
||||
|
this.userService.stateChanged |
||||
|
.pipe(takeUntilDestroyed(this.destroyRef)) |
||||
|
.subscribe((state) => { |
||||
|
if (state?.user) { |
||||
|
this.setPrice( |
||||
|
state.user.subscription?.offer, |
||||
|
state.user.subscription?.type |
||||
|
); |
||||
|
} |
||||
|
|
||||
|
this.changeDetectorRef.markForCheck(); |
||||
|
}); |
||||
|
} |
||||
|
|
||||
|
private setPrice( |
||||
|
offer: SubscriptionOffer | undefined, |
||||
|
subscriptionType?: SubscriptionType |
||||
|
) { |
||||
|
this.price = |
||||
|
offer?.durationExtension && |
||||
|
offer.price && |
||||
|
subscriptionType !== SubscriptionType.Premium |
||||
|
? offer.price - (offer.coupon ?? 0) |
||||
|
: undefined; |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,201 @@ |
|||||
|
<div class="blog container"> |
||||
|
<div class="row"> |
||||
|
<div class="col-md-8 offset-md-2"> |
||||
|
<article> |
||||
|
<div class="mb-4 text-center"> |
||||
|
<h1 class="mb-1"> |
||||
|
Black Weeks 2026: 15 Months of Premium for the Price of 12 |
||||
|
</h1> |
||||
|
<div class="mb-3 text-body-secondary"><small>2026-11-01</small></div> |
||||
|
<img |
||||
|
alt="Black Weeks 2026: 15 months of Ghostfolio Premium for the price of 12" |
||||
|
class="rounded w-100" |
||||
|
src="../assets/images/blog/black-weeks-2026.jpg" |
||||
|
title="Black Weeks 2026" |
||||
|
/> |
||||
|
</div> |
||||
|
<section class="mb-4"> |
||||
|
<p> |
||||
|
Get <strong>15 months</strong> of |
||||
|
<span class="align-items-center d-inline-flex" |
||||
|
>Ghostfolio Premium |
||||
|
<gf-premium-indicator |
||||
|
class="d-inline-block ms-1" |
||||
|
[enableLink]="false" |
||||
|
/> |
||||
|
</span> |
||||
|
for the price of 12. Our <strong>Black Weeks</strong> offer adds |
||||
|
<strong>3 extra months</strong> to the annual plan of the open |
||||
|
source portfolio tracker, which gives you 25% more time at the same |
||||
|
price. |
||||
|
</p> |
||||
|
</section> |
||||
|
<section class="mb-4"> |
||||
|
<h2 class="h4">What you get with Ghostfolio Premium</h2> |
||||
|
<p> |
||||
|
<a |
||||
|
href="https://ghostfol.io" |
||||
|
title="Open Source Wealth Management Software" |
||||
|
>Ghostfolio</a |
||||
|
> |
||||
|
unifies your finances in one place and gives you a clear overview of |
||||
|
your portfolio across stocks, ETFs, cryptocurrencies or other |
||||
|
assets. With Ghostfolio Premium, you can: |
||||
|
</p> |
||||
|
<ul class="list-unstyled"> |
||||
|
<li> |
||||
|
<strong>See the full picture</strong>: Understand your portfolio |
||||
|
at a glance with the summary and allocations. |
||||
|
</li> |
||||
|
<li> |
||||
|
<strong>Measure your progress</strong>: Compare your performance |
||||
|
against benchmarks. |
||||
|
</li> |
||||
|
<li> |
||||
|
<strong>Access professional data</strong>: Get 80’000+ tickers |
||||
|
from over 50 exchanges. |
||||
|
</li> |
||||
|
<li> |
||||
|
<strong>Plan your financial independence</strong>: Calculate your |
||||
|
path to retirement with the FIRE calculator. |
||||
|
</li> |
||||
|
<li> |
||||
|
<strong>Connect your AI client</strong>: Analyze your portfolio |
||||
|
and import activities with the new Ghostfolio MCP (enable |
||||
|
<i>Experimental Features</i> in your account settings). |
||||
|
</li> |
||||
|
</ul> |
||||
|
<p> |
||||
|
Explore all the |
||||
|
<a [routerLink]="routerLinkFeatures">features</a> of Ghostfolio. |
||||
|
</p> |
||||
|
</section> |
||||
|
<section class="mb-4"> |
||||
|
<h2 class="h4">How the offer works</h2> |
||||
|
@if (price) { |
||||
|
<p> |
||||
|
You pay {{ baseCurrency }} <strong>{{ price }}</strong> for |
||||
|
15 months, which is {{ baseCurrency }} {{ |
||||
|
price / 15 | number: '1.2-2' |
||||
|
}} |
||||
|
per month. |
||||
|
</p> |
||||
|
} |
||||
|
<p> |
||||
|
It is a one-time payment with no auto-renewal. The offer is valid |
||||
|
until the <strong>end of November</strong>. |
||||
|
</p> |
||||
|
@if (price) { |
||||
|
<p class="text-center"> |
||||
|
<a |
||||
|
color="primary" |
||||
|
mat-flat-button |
||||
|
[routerLink]="routerLinkPricing" |
||||
|
>Get 3 extra months</a |
||||
|
> |
||||
|
</p> |
||||
|
<p class="mt-5"> |
||||
|
More details are available on the |
||||
|
<a [routerLink]="routerLinkPricing">pricing page</a>. |
||||
|
</p> |
||||
|
} |
||||
|
</section> |
||||
|
<section class="mb-4"> |
||||
|
<ul class="list-inline"> |
||||
|
<li class="list-inline-item"> |
||||
|
<span class="badge bg-light text-dark">2026</span> |
||||
|
</li> |
||||
|
<li class="list-inline-item"> |
||||
|
<span class="badge bg-light text-dark">Black Friday</span> |
||||
|
</li> |
||||
|
<li class="list-inline-item"> |
||||
|
<span class="badge bg-light text-dark">Black Weeks</span> |
||||
|
</li> |
||||
|
<li class="list-inline-item"> |
||||
|
<span class="badge bg-light text-dark">Cryptocurrency</span> |
||||
|
</li> |
||||
|
<li class="list-inline-item"> |
||||
|
<span class="badge bg-light text-dark">Deal</span> |
||||
|
</li> |
||||
|
<li class="list-inline-item"> |
||||
|
<span class="badge bg-light text-dark">ETF</span> |
||||
|
</li> |
||||
|
<li class="list-inline-item"> |
||||
|
<span class="badge bg-light text-dark">Finance</span> |
||||
|
</li> |
||||
|
<li class="list-inline-item"> |
||||
|
<span class="badge bg-light text-dark">Fintech</span> |
||||
|
</li> |
||||
|
<li class="list-inline-item"> |
||||
|
<span class="badge bg-light text-dark">Ghostfolio</span> |
||||
|
</li> |
||||
|
<li class="list-inline-item"> |
||||
|
<span class="badge bg-light text-dark">Ghostfolio MCP</span> |
||||
|
</li> |
||||
|
<li class="list-inline-item"> |
||||
|
<span class="badge bg-light text-dark">Ghostfolio Premium</span> |
||||
|
</li> |
||||
|
<li class="list-inline-item"> |
||||
|
<span class="badge bg-light text-dark">Investment</span> |
||||
|
</li> |
||||
|
<li class="list-inline-item"> |
||||
|
<span class="badge bg-light text-dark">Open Source</span> |
||||
|
</li> |
||||
|
<li class="list-inline-item"> |
||||
|
<span class="badge bg-light text-dark">OSS</span> |
||||
|
</li> |
||||
|
<li class="list-inline-item"> |
||||
|
<span class="badge bg-light text-dark">Personal Finance</span> |
||||
|
</li> |
||||
|
<li class="list-inline-item"> |
||||
|
<span class="badge bg-light text-dark">Portfolio</span> |
||||
|
</li> |
||||
|
<li class="list-inline-item"> |
||||
|
<span class="badge bg-light text-dark">Portfolio Tracker</span> |
||||
|
</li> |
||||
|
<li class="list-inline-item"> |
||||
|
<span class="badge bg-light text-dark">Pricing</span> |
||||
|
</li> |
||||
|
<li class="list-inline-item"> |
||||
|
<span class="badge bg-light text-dark">Promotion</span> |
||||
|
</li> |
||||
|
<li class="list-inline-item"> |
||||
|
<span class="badge bg-light text-dark">SaaS</span> |
||||
|
</li> |
||||
|
<li class="list-inline-item"> |
||||
|
<span class="badge bg-light text-dark">Sale</span> |
||||
|
</li> |
||||
|
<li class="list-inline-item"> |
||||
|
<span class="badge bg-light text-dark">Software</span> |
||||
|
</li> |
||||
|
<li class="list-inline-item"> |
||||
|
<span class="badge bg-light text-dark">Stock</span> |
||||
|
</li> |
||||
|
<li class="list-inline-item"> |
||||
|
<span class="badge bg-light text-dark">Subscription</span> |
||||
|
</li> |
||||
|
<li class="list-inline-item"> |
||||
|
<span class="badge bg-light text-dark">Wealth</span> |
||||
|
</li> |
||||
|
<li class="list-inline-item"> |
||||
|
<span class="badge bg-light text-dark">Wealth Management</span> |
||||
|
</li> |
||||
|
</ul> |
||||
|
</section> |
||||
|
<nav aria-label="breadcrumb"> |
||||
|
<ol class="breadcrumb"> |
||||
|
<li class="breadcrumb-item"> |
||||
|
<a i18n [routerLink]="routerLinkBlog">Blog</a> |
||||
|
</li> |
||||
|
<li |
||||
|
aria-current="page" |
||||
|
class="active breadcrumb-item text-truncate" |
||||
|
> |
||||
|
Black Weeks 2026 |
||||
|
</li> |
||||
|
</ol> |
||||
|
</nav> |
||||
|
</article> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
After Width: | Height: | Size: 304 KiB |
Loading…
Reference in new issue