diff --git a/CHANGELOG.md b/CHANGELOG.md index 201d9ab01..fc4f48bb7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added - Added the date range component to the positions tab +- Added a blog ## 1.29.0 - 26.07.2021 diff --git a/apps/api/src/app/info/info.service.ts b/apps/api/src/app/info/info.service.ts index b41ea6be4..17a720001 100644 --- a/apps/api/src/app/info/info.service.ts +++ b/apps/api/src/app/info/info.service.ts @@ -28,6 +28,10 @@ export class InfoService { const globalPermissions: string[] = []; + if (this.configurationService.get('ENABLE_FEATURE_BLOG')) { + globalPermissions.push(permissions.enableBlog); + } + if (this.configurationService.get('ENABLE_FEATURE_IMPORT')) { globalPermissions.push(permissions.enableImport); } diff --git a/apps/api/src/services/configuration.service.ts b/apps/api/src/services/configuration.service.ts index 909d5657d..677e97c80 100644 --- a/apps/api/src/services/configuration.service.ts +++ b/apps/api/src/services/configuration.service.ts @@ -15,6 +15,7 @@ export class ConfigurationService { ALPHA_VANTAGE_API_KEY: str({ default: '' }), CACHE_TTL: num({ default: 1 }), DATA_SOURCES: json({ default: JSON.stringify([DataSource.YAHOO]) }), + ENABLE_FEATURE_BLOG: bool({ default: false }), ENABLE_FEATURE_CUSTOM_SYMBOLS: bool({ default: false }), ENABLE_FEATURE_FEAR_AND_GREED_INDEX: bool({ default: false }), ENABLE_FEATURE_IMPORT: bool({ default: !environment.production }), diff --git a/apps/api/src/services/interfaces/environment.interface.ts b/apps/api/src/services/interfaces/environment.interface.ts index c5d075caa..5439093a6 100644 --- a/apps/api/src/services/interfaces/environment.interface.ts +++ b/apps/api/src/services/interfaces/environment.interface.ts @@ -5,6 +5,7 @@ export interface Environment extends CleanedEnvAccessors { ALPHA_VANTAGE_API_KEY: string; CACHE_TTL: number; DATA_SOURCES: string | string[]; // string is not correct, error in envalid? + ENABLE_FEATURE_BLOG: boolean; ENABLE_FEATURE_CUSTOM_SYMBOLS: boolean; ENABLE_FEATURE_FEAR_AND_GREED_INDEX: boolean; ENABLE_FEATURE_IMPORT: boolean; diff --git a/apps/client/src/app/app-routing.module.ts b/apps/client/src/app/app-routing.module.ts index dff5871a9..d08757c8b 100644 --- a/apps/client/src/app/app-routing.module.ts +++ b/apps/client/src/app/app-routing.module.ts @@ -33,6 +33,20 @@ const routes: Routes = [ loadChildren: () => import('./pages/auth/auth-page.module').then((m) => m.AuthPageModule) }, + { + path: 'de/blog/2021/07/hallo-ghostfolio', + loadChildren: () => + import( + './pages/blog/2021/07/hallo-ghostfolio/hallo-ghostfolio-page.module' + ).then((m) => m.HalloGhostfolioPageModule) + }, + { + path: 'en/blog/2021/07/hello-ghostfolio', + loadChildren: () => + import( + './pages/blog/2021/07/hello-ghostfolio/hello-ghostfolio-page.module' + ).then((m) => m.HelloGhostfolioPageModule) + }, { path: 'home', loadChildren: () => diff --git a/apps/client/src/app/app.component.scss b/apps/client/src/app/app.component.scss index 92968e016..bcefe5d71 100644 --- a/apps/client/src/app/app.component.scss +++ b/apps/client/src/app/app.component.scss @@ -20,7 +20,7 @@ a { color: rgba(var(--palette-primary-500), 1); - font-weight: bold; + font-weight: 500; } } } diff --git a/apps/client/src/app/core/auth.guard.ts b/apps/client/src/app/core/auth.guard.ts index b2e70e446..7035f7167 100644 --- a/apps/client/src/app/core/auth.guard.ts +++ b/apps/client/src/app/core/auth.guard.ts @@ -16,6 +16,8 @@ import { UserService } from '../services/user/user.service'; export class AuthGuard implements CanActivate { private static PUBLIC_PAGE_ROUTES = [ '/about', + '/de/blog', + '/en/blog', '/pricing', '/register', '/resources' @@ -43,7 +45,11 @@ export class AuthGuard implements CanActivate { if (route.queryParams?.utm_source) { this.router.navigate(['/register']); resolve(false); - } else if (AuthGuard.PUBLIC_PAGE_ROUTES.includes(state.url)) { + } else if ( + AuthGuard.PUBLIC_PAGE_ROUTES.filter((publicPageRoute) => + state.url.startsWith(publicPageRoute) + )?.length > 0 + ) { resolve(true); return EMPTY; } else if (state.url !== '/start') { diff --git a/apps/client/src/app/pages/about/about-page.component.ts b/apps/client/src/app/pages/about/about-page.component.ts index 75d143a81..4a7cb6071 100644 --- a/apps/client/src/app/pages/about/about-page.component.ts +++ b/apps/client/src/app/pages/about/about-page.component.ts @@ -17,7 +17,9 @@ import { environment } from '../../../environments/environment'; }) export class AboutPageComponent implements OnDestroy, OnInit { public baseCurrency = baseCurrency; + public hasPermissionForBlog: boolean; public hasPermissionForStatistics: boolean; + public hasPermissionForSubscription: boolean; public isLoggedIn: boolean; public lastPublish = environment.lastPublish; public statistics: Statistics; @@ -40,11 +42,22 @@ export class AboutPageComponent implements OnDestroy, OnInit { */ public ngOnInit() { const { globalPermissions, statistics } = this.dataService.fetchInfo(); + + this.hasPermissionForBlog = hasPermission( + globalPermissions, + permissions.enableBlog + ); + this.hasPermissionForStatistics = hasPermission( globalPermissions, permissions.enableStatistics ); + this.hasPermissionForSubscription = hasPermission( + globalPermissions, + permissions.enableSubscription + ); + this.statistics = statistics; this.userService.stateChanged diff --git a/apps/client/src/app/pages/about/about-page.html b/apps/client/src/app/pages/about/about-page.html index 56cda5e46..ac398671c 100644 --- a/apps/client/src/app/pages/about/about-page.html +++ b/apps/client/src/app/pages/about/about-page.html @@ -2,7 +2,7 @@

About Ghostfolio

- +

Ghostfolio is a lightweight wealth management @@ -56,7 +56,10 @@

-
+
+ +

Changelog

diff --git a/apps/client/src/app/pages/about/about-page.scss b/apps/client/src/app/pages/about/about-page.scss index fe52dfce1..2e4517709 100644 --- a/apps/client/src/app/pages/about/about-page.scss +++ b/apps/client/src/app/pages/about/about-page.scss @@ -7,6 +7,18 @@ } .mat-card { + &.about-container, + &.changelog { + a { + color: rgba(var(--palette-primary-500), 1); + font-weight: 500; + + &:hover { + color: rgba(var(--palette-primary-300), 1); + } + } + } + &.changelog { ::ng-deep { markdown { @@ -30,15 +42,6 @@ } } - a { - color: rgba(var(--palette-primary-500), 1); - font-weight: bold; - - &:hover { - color: rgba(var(--palette-primary-300), 1); - } - } - .independent-and-bootstrapped-logo { background-image: url('/assets/bootstrapped-dark.svg'); background-position: center; diff --git a/apps/client/src/app/pages/account/account-page.component.ts b/apps/client/src/app/pages/account/account-page.component.ts index 44bb0611c..e8ba412d6 100644 --- a/apps/client/src/app/pages/account/account-page.component.ts +++ b/apps/client/src/app/pages/account/account-page.component.ts @@ -35,7 +35,7 @@ export class AccountPageComponent implements OnDestroy, OnInit { public couponId: string; public currencies: Currency[] = []; public defaultDateFormat = DEFAULT_DATE_FORMAT; - public hasPermissionForSubscription; + public hasPermissionForSubscription: boolean; public hasPermissionToUpdateViewMode: boolean; public hasPermissionToUpdateUserSettings: boolean; public price: number; diff --git a/apps/client/src/app/pages/blog/2021/07/hallo-ghostfolio/hallo-ghostfolio-page-routing.module.ts b/apps/client/src/app/pages/blog/2021/07/hallo-ghostfolio/hallo-ghostfolio-page-routing.module.ts new file mode 100644 index 000000000..d2f4532c1 --- /dev/null +++ b/apps/client/src/app/pages/blog/2021/07/hallo-ghostfolio/hallo-ghostfolio-page-routing.module.ts @@ -0,0 +1,19 @@ +import { NgModule } from '@angular/core'; +import { RouterModule, Routes } from '@angular/router'; +import { AuthGuard } from '@ghostfolio/client/core/auth.guard'; + +import { HalloGhostfolioPageComponent } from './hallo-ghostfolio-page.component'; + +const routes: Routes = [ + { + path: '', + component: HalloGhostfolioPageComponent, + canActivate: [AuthGuard] + } +]; + +@NgModule({ + imports: [RouterModule.forChild(routes)], + exports: [RouterModule] +}) +export class HalloGhostfolioPageRoutingModule {} diff --git a/apps/client/src/app/pages/blog/2021/07/hallo-ghostfolio/hallo-ghostfolio-page.component.ts b/apps/client/src/app/pages/blog/2021/07/hallo-ghostfolio/hallo-ghostfolio-page.component.ts new file mode 100644 index 000000000..8a2163374 --- /dev/null +++ b/apps/client/src/app/pages/blog/2021/07/hallo-ghostfolio/hallo-ghostfolio-page.component.ts @@ -0,0 +1,7 @@ +import { Component } from '@angular/core'; + +@Component({ + selector: 'gf-hallo-ghostfolio-page', + templateUrl: './hallo-ghostfolio-page.html' +}) +export class HalloGhostfolioPageComponent {} diff --git a/apps/client/src/app/pages/blog/2021/07/hallo-ghostfolio/hallo-ghostfolio-page.html b/apps/client/src/app/pages/blog/2021/07/hallo-ghostfolio/hallo-ghostfolio-page.html new file mode 100644 index 000000000..a497e2de7 --- /dev/null +++ b/apps/client/src/app/pages/blog/2021/07/hallo-ghostfolio/hallo-ghostfolio-page.html @@ -0,0 +1,194 @@ +
+
+
+
+
+

Hallo Ghostfolio 👋

+
31.07.2021
+
+
+

+ In diesem Artikel möchte ich mein neues Open Source Projekt näher + vorstellen: Ghostfolio, eine + web-basierte Software für das Management der persönlichen Finanzen. +

+
+
+

Welches Problem löst Ghostfolio?

+

+ Aufgrund der steigenden Inflation und den Negativzinsen befasse ich + mich seit einiger Zeit, wie ich mein Vermögen möglichst + diversifiziert anlegen kann. Konkret verfolge ich eine + Buy and Hold Strategie mit + Investitionen in verschiedene Anlageklassen verteilt auf + unterschiedliche Plattformen. Deshalb suchte ich nach einer App, die + mein Portfolio ganzheitlich zusammenfasst. Bei meiner + Internetrecherche und Suche in App Stores habe ich mehrere Lösungen + ausprobiert, doch keine hat mich vollkommen überzeugt: Zu + kompliziert, zu überladen, nicht optimiert für Smartphones oder zu + wenig umfassend. +

+
+
+

Die Vision

+

+ Besonders wichtig ist mir, dass ich in Echtzeit die Übersicht über + mein gesamtes Vermögen erhalte. Bisher hatte ich nur einmal im Jahr, + beim Abschluss der Steuererklärung, die aufbereiteten Zahlen zur + Verfügung. Zum Gesamtbild gehören neben Cash auf dem Sparkonto auch + länderspezifische Besonderheiten wie beispielsweise die freiwillige + Altersvorsorge (Säule 3a) in der Schweiz. +

+

+ In der Zwischenzeit habe ich mit vielen Kollegen gesprochen, die + schon länger investieren. Nicht wenige haben aus denselben + Überlegungen über die Zeit ein komplexes Spreadsheet angelegt. Ich + finde, dass dies im Jahr 2021 besser gehen muss. +

+
+
+
+
+

+ Ghostfolio zeigt das Gesamtbild des Vermögens, um + bestmögliche Anlage-Entscheidungen zu treffen. +

+
+
+
+
+

+ Ghostfolio soll eine simple Wealth Management Software sein. Diese + präsentiert jederzeit das aktuelle Vermögen und unterstützt bei + zukünftigen Investments. Sei es beim Rebalancing des Portfolios in + Anlageklassen (Aktien, Cryptocurrencies, ETFs, etc.) oder der + Finanzierung einer Wohnung, Ghostfolio bietet eine solide, + datengestützte Entscheidungshilfe. +

+

+ Ich lege grossen Wert auf Datenschutz. Als + Open Source Software + (OSS) kann Ghostfolio vollständig anonym genutzt werden, ohne die + gierigen Blicke von Grossbanken oder Big Tech. +

+
+
+

Von der Idee zur Umsetzung

+

+ Vor diesem Hintergrund habe ich das ambitionierte Projekt gestartet + und in kleinen Schritten eine Software programmiert, die ich rasch + selbst nutzen konnte. Als Stack habe ich mich für moderne + Web-Technologien entschieden, die mich persönlich besonders + interessieren beziehungsweise die ich gerne erlernen und vertiefen + möchte. Dazu zählen Docker, + Nx für das Management des Monorepos, + NestJS für das Backend und + PostgreSQL als Datenbank. + Der Code ist sowohl im Frontend als auch im Backend in + TypeScript + geschrieben. +

+

+ Da ich bei einigen Kalkulationen an meine Grenzen gestossen bin, + habe ich mit verschiedenen Möglichkeiten auseinandergesetzt, um + Unterstützung zu bekommen. In der Hoffnung, dass andere Leute + ebenfalls von der Lösung profitieren und bei Interesse mit + Verbesserungen beitragen können, habe ich den bestehenden Code als + Open Source Software veröffentlicht. Schon nach kurzer Zeit haben + andere Entwickler + mit tollen Erweiterungen an Ghostfolio mitgewirkt. +

+
+
+

Wie kann ich das Projekt unterstützen?

+

+ Bist du ebenfalls besessen von einer maximal diversifizierten + Anlagestrategie? Ich freue mich über alle, die Ghostfolio + ausprobieren. Bist du überzeugt vom Potential der Software? Jede + Unterstützung für Ghostfolio ist willkommen. Sei es mit einer + Ghostfolio Premium + Subscription zur Finanzierung des Hostings, einem positiven Rating + im + Google Play Store, einem Sternchen auf + GitHub, + Feedback, Bug Reports, Feature Requests und natürlich Contributions! +

+

+ Du erreichst mich per E-Mail unter + hi@ghostfol.io oder auf Twitter + @ghostfolio_. +

+

+ Ich freue mich, von dir zu hören.
+ Thomas von Ghostfolio +

+
+
+
    +
  • + Aktie + Altersvorsorge + Anlage + App + Cryptocurrency + ETF + Feedback + Fintech + Ghostfolio + Investition + Open Source + OSS + Portfolio + Software + Strategie + Trading + TypeScript + Vermögen + Wealth Management +
  • +
+
+
+
+
+
diff --git a/apps/client/src/app/pages/blog/2021/07/hallo-ghostfolio/hallo-ghostfolio-page.module.ts b/apps/client/src/app/pages/blog/2021/07/hallo-ghostfolio/hallo-ghostfolio-page.module.ts new file mode 100644 index 000000000..203ab2ccc --- /dev/null +++ b/apps/client/src/app/pages/blog/2021/07/hallo-ghostfolio/hallo-ghostfolio-page.module.ts @@ -0,0 +1,15 @@ +import { CommonModule } from '@angular/common'; +import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; + +import { HalloGhostfolioPageRoutingModule } from './hallo-ghostfolio-page-routing.module'; +import { HalloGhostfolioPageComponent } from './hallo-ghostfolio-page.component'; + +@NgModule({ + declarations: [HalloGhostfolioPageComponent], + exports: [], + imports: [CommonModule, HalloGhostfolioPageRoutingModule, RouterModule], + providers: [], + schemas: [CUSTOM_ELEMENTS_SCHEMA] +}) +export class HalloGhostfolioPageModule {} diff --git a/apps/client/src/app/pages/blog/2021/07/hello-ghostfolio/hello-ghostfolio-page-routing.module.ts b/apps/client/src/app/pages/blog/2021/07/hello-ghostfolio/hello-ghostfolio-page-routing.module.ts new file mode 100644 index 000000000..5165ad5bb --- /dev/null +++ b/apps/client/src/app/pages/blog/2021/07/hello-ghostfolio/hello-ghostfolio-page-routing.module.ts @@ -0,0 +1,19 @@ +import { NgModule } from '@angular/core'; +import { RouterModule, Routes } from '@angular/router'; +import { AuthGuard } from '@ghostfolio/client/core/auth.guard'; + +import { HelloGhostfolioPageComponent } from './hello-ghostfolio-page.component'; + +const routes: Routes = [ + { + path: '', + component: HelloGhostfolioPageComponent, + canActivate: [AuthGuard] + } +]; + +@NgModule({ + imports: [RouterModule.forChild(routes)], + exports: [RouterModule] +}) +export class HelloGhostfolioPageRoutingModule {} diff --git a/apps/client/src/app/pages/blog/2021/07/hello-ghostfolio/hello-ghostfolio-page.component.ts b/apps/client/src/app/pages/blog/2021/07/hello-ghostfolio/hello-ghostfolio-page.component.ts new file mode 100644 index 000000000..8d5240fd3 --- /dev/null +++ b/apps/client/src/app/pages/blog/2021/07/hello-ghostfolio/hello-ghostfolio-page.component.ts @@ -0,0 +1,7 @@ +import { Component } from '@angular/core'; + +@Component({ + selector: 'gf-hello-ghostfolio-page', + templateUrl: './hello-ghostfolio-page.html' +}) +export class HelloGhostfolioPageComponent {} diff --git a/apps/client/src/app/pages/blog/2021/07/hello-ghostfolio/hello-ghostfolio-page.html b/apps/client/src/app/pages/blog/2021/07/hello-ghostfolio/hello-ghostfolio-page.html new file mode 100644 index 000000000..97dea5930 --- /dev/null +++ b/apps/client/src/app/pages/blog/2021/07/hello-ghostfolio/hello-ghostfolio-page.html @@ -0,0 +1,173 @@ +
+
+
+
+
+

Hello Ghostfolio 👋

+
31.07.2021
+
+
+

+ In this article I would like to introduce my new open source project + in more detail: Ghostfolio, a + web-based personal finance management software. +

+
+
+

What problem does Ghostfolio solve?

+

+ Due to rising inflation and negative interest rates, I have been + looking for some time at how I can invest my assets in the most + diversified way possible. Specifically, I follow a + buy and hold strategy with + investments in different asset classes spread across different + platforms. Therefore, I was looking for an app that would + holistically aggregate my portfolio. During my research on the + internet and in app stores, I have tried several solutions, but none + of them has convinced me completely: too complicated, too cluttered, + not optimized for smartphones or not comprehensive enough. +

+
+
+

The vision

+

+ It is particularly important to me that I get an overview of all my + assets in real time. Previously, I only had the prepared figures + available once a year, when I had completed my annual tax + declaration. In addition to the cash balance in the savings account, + the overall picture also includes country-specific traits such as + the voluntary pension plan (pillar 3a) in Switzerland. +

+

+ In the meantime, I have talked to many colleagues who have been + investing for a longer time. Quite a few have created complex + spreadsheets from the same considerations. I think that should be + better in 2021. +

+
+
+
+
+

+ Ghostfolio presents the big picture of assets to make the + best possible investment decisions. +

+
+
+
+
+

+ Ghostfolio is supposed to be a simple wealth management software. It + presents the current assets at any time and supports the decision + making of future investments. Whether rebalancing the portfolio in + asset classes (stocks, cryptocurrencies, ETFs, etc.) or financing an + apartment, Ghostfolio offers solid, data-driven decision support. +

+

+ As I value privacy, data protection is an integral part of + Ghostfolio. As + open source software + (OSS), Ghostfolio can be used completely anonymously, without the + greedy eyes of big banks or big tech. +

+
+
+

From idea to implementation

+

+ With this background I have started the ambitious project and + programmed with small steps a software that I could quickly use for + myself. As a stack, I chose modern web technologies that are + personally of particular interest or that I would like to learn and + deepen. These include Docker, + Nx for the management of the monorepo, + NestJS for the backend and + PostgreSQL as a database. + The code of the frontend and backend is written in + TypeScript. +

+

+ Since I have shortly reached my limits with some calculations, I + have looked into different possibilities to get valuable support. + Hoping that other people could also benefit from the solution and + contribute with improvements if interested, I have released the + existing code as open source software. Very soon, other + developers + contributed to Ghostfolio with great enhancements. +

+
+
+

How can I support the project?

+

+ Are you also obsessed with a maximally diversified investment + strategy? I'm happy for everyone who tries Ghostfolio. Are you + convinced of its potential? Any support for Ghostfolio is welcome. + Be it with a + Ghostfolio Premium + Subscription to finance the hosting, a positive rating in the + Google Play Store, a star on + GitHub, + feedback, bug reports, feature requests and of course contributions! +

+

+ You can reach me by email at + hi@ghostfol.io or on Twitter + @ghostfolio_. +

+

+ I look forward to hearing from you.
+ Thomas from Ghostfolio +

+
+
+
    +
  • + Cryptocurrency + ETF + Fintech + Ghostfolio + Investment + Open Source + OSS + Portfolio + Software + Stock + Strategy + Wealth + Wealth Management +
  • +
+
+
+
+
+
diff --git a/apps/client/src/app/pages/blog/2021/07/hello-ghostfolio/hello-ghostfolio-page.module.ts b/apps/client/src/app/pages/blog/2021/07/hello-ghostfolio/hello-ghostfolio-page.module.ts new file mode 100644 index 000000000..c9b7d82f5 --- /dev/null +++ b/apps/client/src/app/pages/blog/2021/07/hello-ghostfolio/hello-ghostfolio-page.module.ts @@ -0,0 +1,15 @@ +import { CommonModule } from '@angular/common'; +import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; + +import { HelloGhostfolioPageRoutingModule } from './hello-ghostfolio-page-routing.module'; +import { HelloGhostfolioPageComponent } from './hello-ghostfolio-page.component'; + +@NgModule({ + declarations: [HelloGhostfolioPageComponent], + exports: [], + imports: [CommonModule, HelloGhostfolioPageRoutingModule, RouterModule], + providers: [], + schemas: [CUSTOM_ELEMENTS_SCHEMA] +}) +export class HelloGhostfolioPageModule {} diff --git a/apps/client/src/app/pages/pricing/pricing-page.scss b/apps/client/src/app/pages/pricing/pricing-page.scss index 19ca6bf26..829c1abef 100644 --- a/apps/client/src/app/pages/pricing/pricing-page.scss +++ b/apps/client/src/app/pages/pricing/pricing-page.scss @@ -4,7 +4,7 @@ a { color: rgba(var(--palette-primary-500), 1); - font-weight: bold; + font-weight: 500; &:hover { color: rgba(var(--palette-primary-300), 1); diff --git a/apps/client/src/app/pages/resources/resources-page.scss b/apps/client/src/app/pages/resources/resources-page.scss index 4341c770a..01a013378 100644 --- a/apps/client/src/app/pages/resources/resources-page.scss +++ b/apps/client/src/app/pages/resources/resources-page.scss @@ -5,7 +5,7 @@ .mat-card { a { color: rgba(var(--palette-primary-500), 1); - font-weight: bold; + font-weight: 500; &:hover { color: rgba(var(--palette-primary-300), 1); diff --git a/apps/client/src/app/pages/tools/analysis/analysis-page.scss b/apps/client/src/app/pages/tools/analysis/analysis-page.scss index cbd3fde58..09e4ea30d 100644 --- a/apps/client/src/app/pages/tools/analysis/analysis-page.scss +++ b/apps/client/src/app/pages/tools/analysis/analysis-page.scss @@ -42,7 +42,7 @@ a { color: rgba(var(--palette-primary-500), 1); - font-weight: bold; + font-weight: 500; &:hover { color: rgba(var(--palette-primary-300), 1); diff --git a/apps/client/src/assets/sitemap.xml b/apps/client/src/assets/sitemap.xml index c41c22c2d..3ee979f4e 100644 --- a/apps/client/src/assets/sitemap.xml +++ b/apps/client/src/assets/sitemap.xml @@ -6,22 +6,30 @@ http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd"> https://ghostfol.io - 2021-06-03T00:00:00+00:00 + 2021-07-31T00:00:00+00:00 https://ghostfol.io/about - 2021-06-03T00:00:00+00:00 + 2021-07-31T00:00:00+00:00 - + + https://ghostfol.io/de/blog/2021/07/hallo-ghostfolio + 2021-07-31T00:00:00+00:00 + + + https://ghostfol.io/en/blog/2021/07/hello-ghostfolio + 2021-07-31T00:00:00+00:00 + + https://ghostfol.io/pricing - 2021-06-03T00:00:00+00:00 + 2021-07-31T00:00:00+00:00 https://ghostfol.io/register - 2021-06-03T00:00:00+00:00 + 2021-07-31T00:00:00+00:00 https://ghostfol.io/resources - 2021-06-03T00:00:00+00:00 + 2021-07-31T00:00:00+00:00 diff --git a/apps/client/src/styles.scss b/apps/client/src/styles.scss index bf2c9c0fd..e41b3b0f7 100644 --- a/apps/client/src/styles.scss +++ b/apps/client/src/styles.scss @@ -28,6 +28,22 @@ body { a { color: var(--dark-primary-text); + + &:hover { + color: unset; + text-decoration: none; + } + } + + .blog { + a { + color: rgba(var(--palette-primary-500), 1); + font-weight: 500; + + &:hover { + text-decoration: underline; + } + } } &.is-dark-theme { @@ -82,11 +98,6 @@ body { } } -a:hover { - color: unset; - text-decoration: none; -} - button:focus { outline: 0; } diff --git a/libs/common/src/lib/permissions.ts b/libs/common/src/lib/permissions.ts index 5cc26ffd9..e8f7824d8 100644 --- a/libs/common/src/lib/permissions.ts +++ b/libs/common/src/lib/permissions.ts @@ -15,6 +15,7 @@ export const permissions = { deleteOrder: 'deleteOrder', deleteUser: 'deleteUser', enableImport: 'enableImport', + enableBlog: 'enableBlog', enableSocialLogin: 'enableSocialLogin', enableStatistics: 'enableStatistics', enableSubscription: 'enableSubscription',