From 9c16af81c7b5b9ee105b3fc1260bf3e2ba410073 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Fri, 18 Aug 2023 20:45:10 +0200 Subject: [PATCH] Feature/setup oss friends page (#2245) * Setup OSS Friends page * Update changelog --- CHANGELOG.md | 1 + apps/api/src/assets/sitemap.xml | 8 + .../pages/about/about-page-routing.module.ts | 7 + .../app/pages/about/about-page.component.ts | 53 ++++--- .../oss-friends-page-routing.module.ts | 20 +++ .../oss-friends/oss-friends-page.component.ts | 145 ++++++++++++++++++ .../about/oss-friends/oss-friends-page.html | 36 +++++ .../oss-friends/oss-friends-page.module.ts | 19 +++ .../about/oss-friends/oss-friends-page.scss | 3 + apps/client/src/locales/messages.de.xlf | 38 +++-- apps/client/src/locales/messages.es.xlf | 38 +++-- apps/client/src/locales/messages.fr.xlf | 38 +++-- apps/client/src/locales/messages.it.xlf | 38 +++-- apps/client/src/locales/messages.nl.xlf | 38 +++-- apps/client/src/locales/messages.pt.xlf | 38 +++-- apps/client/src/locales/messages.xlf | 36 +++-- 16 files changed, 456 insertions(+), 100 deletions(-) create mode 100644 apps/client/src/app/pages/about/oss-friends/oss-friends-page-routing.module.ts create mode 100644 apps/client/src/app/pages/about/oss-friends/oss-friends-page.component.ts create mode 100644 apps/client/src/app/pages/about/oss-friends/oss-friends-page.html create mode 100644 apps/client/src/app/pages/about/oss-friends/oss-friends-page.module.ts create mode 100644 apps/client/src/app/pages/about/oss-friends/oss-friends-page.scss diff --git a/CHANGELOG.md b/CHANGELOG.md index 3efc198c..df62dedc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Added the data export feature to the user account page - Added a currencies preset to the historical market data table of the admin control panel +- Added the _OSS Friends_ page ### Changed diff --git a/apps/api/src/assets/sitemap.xml b/apps/api/src/assets/sitemap.xml index cd4c9f3f..74457def 100644 --- a/apps/api/src/assets/sitemap.xml +++ b/apps/api/src/assets/sitemap.xml @@ -66,6 +66,10 @@ https://ghostfol.io/de/ueber-uns/lizenz ${currentDate}T00:00:00+00:00 + + https://ghostfol.io/de/ueber-uns/oss-friends + ${currentDate}T00:00:00+00:00 + https://ghostfol.io/en ${currentDate}T00:00:00+00:00 @@ -82,6 +86,10 @@ https://ghostfol.io/en/about/license ${currentDate}T00:00:00+00:00 + + https://ghostfol.io/en/about/oss-friends + ${currentDate}T00:00:00+00:00 + https://ghostfol.io/en/blog ${currentDate}T00:00:00+00:00 diff --git a/apps/client/src/app/pages/about/about-page-routing.module.ts b/apps/client/src/app/pages/about/about-page-routing.module.ts index 9183a9b4..91fc0650 100644 --- a/apps/client/src/app/pages/about/about-page-routing.module.ts +++ b/apps/client/src/app/pages/about/about-page-routing.module.ts @@ -38,6 +38,13 @@ const routes: Routes = [ (m) => m.LicensePageModule ) })), + { + path: 'oss-friends', + loadChildren: () => + import('./oss-friends/oss-friends-page.module').then( + (m) => m.OpenSourceSoftwareFriendsPageModule + ) + }, ...[ 'privacy-policy', ///// 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 084623a7..eb0536f9 100644 --- a/apps/client/src/app/pages/about/about-page.component.ts +++ b/apps/client/src/app/pages/about/about-page.component.ts @@ -44,30 +44,31 @@ export class AboutPageComponent implements OnDestroy, OnInit { this.userService.stateChanged .pipe(takeUntil(this.unsubscribeSubject)) .subscribe((state) => { + this.tabs = [ + { + iconName: 'reader-outline', + label: $localize`About`, + path: ['/about'] + }, + { + iconName: 'sparkles-outline', + label: $localize`Changelog`, + path: ['/about', 'changelog'] + }, + { + iconName: 'ribbon-outline', + label: $localize`License`, + path: ['/about', 'license'] + } + ]; + if (state?.user) { - this.tabs = [ - { - iconName: 'reader-outline', - label: $localize`About`, - path: ['/about'] - }, - { - iconName: 'sparkles-outline', - label: $localize`Changelog`, - path: ['/about', 'changelog'] - }, - { - iconName: 'ribbon-outline', - label: $localize`License`, - path: ['/about', 'license'] - }, - { - iconName: 'shield-checkmark-outline', - label: $localize`Privacy Policy`, - path: ['/about', 'privacy-policy'], - showCondition: this.hasPermissionForSubscription - } - ]; + this.tabs.push({ + iconName: 'shield-checkmark-outline', + label: $localize`Privacy Policy`, + path: ['/about', 'privacy-policy'], + showCondition: this.hasPermissionForSubscription + }); this.user = state.user; this.hasMessage = @@ -78,6 +79,12 @@ export class AboutPageComponent implements OnDestroy, OnInit { this.changeDetectorRef.markForCheck(); } + + this.tabs.push({ + iconName: 'happy-outline', + label: 'OSS Friends', + path: ['/about', 'oss-friends'] + }); }); } diff --git a/apps/client/src/app/pages/about/oss-friends/oss-friends-page-routing.module.ts b/apps/client/src/app/pages/about/oss-friends/oss-friends-page-routing.module.ts new file mode 100644 index 00000000..34aa528a --- /dev/null +++ b/apps/client/src/app/pages/about/oss-friends/oss-friends-page-routing.module.ts @@ -0,0 +1,20 @@ +import { NgModule } from '@angular/core'; +import { RouterModule, Routes } from '@angular/router'; +import { AuthGuard } from '@ghostfolio/client/core/auth.guard'; + +import { OpenSourceSoftwareFriendsPageComponent } from './oss-friends-page.component'; + +const routes: Routes = [ + { + canActivate: [AuthGuard], + component: OpenSourceSoftwareFriendsPageComponent, + path: '', + title: 'OSS Friends' + } +]; + +@NgModule({ + exports: [RouterModule], + imports: [RouterModule.forChild(routes)] +}) +export class OpenSourceSoftwareFriendsPageRoutingModule {} diff --git a/apps/client/src/app/pages/about/oss-friends/oss-friends-page.component.ts b/apps/client/src/app/pages/about/oss-friends/oss-friends-page.component.ts new file mode 100644 index 00000000..a387976d --- /dev/null +++ b/apps/client/src/app/pages/about/oss-friends/oss-friends-page.component.ts @@ -0,0 +1,145 @@ +import { Component, OnDestroy } from '@angular/core'; +import { Subject } from 'rxjs'; + +@Component({ + host: { class: 'page' }, + selector: 'gf-oss-friends-page', + styleUrls: ['./oss-friends-page.scss'], + templateUrl: './oss-friends-page.html' +}) +export class OpenSourceSoftwareFriendsPageComponent implements OnDestroy { + public ossFriends = [ + { + description: 'Build build custom software on top of your data.', + name: 'Appsmith', + url: 'https://www.appsmith.com' + }, + { + description: + 'BoxyHQ’s suite of APIs for security and privacy helps engineering teams build and ship compliant cloud applications faster.', + name: 'BoxyHQ', + url: 'https://boxyhq.com' + }, + { + description: + 'Cal.com is a scheduling tool that helps you schedule meetings without the back-and-forth emails.', + name: 'Cal.com', + url: 'https://cal.com' + }, + { + description: + 'Centralize community, product, and customer data to understand which companies are engaging with your open source project.', + name: 'Crowd.dev', + url: 'https://www.crowd.dev' + }, + { + description: + 'The Open-Source DocuSign Alternative. We aim to earn your trust by enabling you to self-host the platform and examine its inner workings.', + name: 'Documenso', + url: 'https://documenso.com' + }, + { + description: + 'The Open-Source HubSpot Alternative. A single XOS enables to create unique and life-changing experiences that work for all types of business.', + name: 'Erxes', + url: 'https://erxes.io' + }, + { + description: + 'Survey granular user segments at any point in the user journey. Gather up to 6x more insights with targeted micro-surveys. All open-source.', + name: 'Formbricks', + url: 'https://formbricks.com' + }, + { + description: + 'GitWonk is an open-source technical documentation tool, designed and built focusing on the developer experience.', + name: 'GitWonk', + url: 'https://gitwonk.com' + }, + { + description: + 'Open-source authentication and user management for the passkey era. Integrated in minutes, for web and mobile apps.', + name: 'Hanko', + url: 'https://www.hanko.io' + }, + { + description: + 'HTMX is a dependency-free JavaScript library that allows you to access AJAX, CSS Transitions, WebSockets, and Server Sent Events directly in HTML.', + name: 'HTMX', + url: 'https://htmx.org' + }, + { + description: + 'Open source, end-to-end encrypted platform that lets you securely manage secrets and configs across your team, devices, and infrastructure.', + name: 'Infisical', + url: 'https://infisical.com' + }, + { + description: + 'Mockoon is the easiest and quickest way to design and run mock REST APIs.', + name: 'Mockoon', + url: 'https://mockoon.com' + }, + { + description: + 'The open-source notification infrastructure for developers. Simple components and APIs for managing all communication channels in one place.', + name: 'Novu', + url: 'https://novu.co' + }, + { + description: + 'Democratizing investment research through an open source financial ecosystem. The OpenBB Terminal allows everyone to perform investment research, from everywhere.', + name: 'OpenBB', + url: 'https://openbb.co' + }, + { + description: + 'Sniffnet is a network monitoring tool to help you easily keep track of your Internet traffic.', + name: 'Sniffnet', + url: 'https://www.sniffnet.net' + }, + { + description: 'Software localization from A to Z made really easy.', + name: 'Tolgee', + url: 'https://tolgee.io' + }, + { + description: + 'Create long-running Jobs directly in your codebase with features like API integrations, webhooks, scheduling and delays.', + name: 'Trigger.dev', + url: 'https://trigger.dev' + }, + { + description: + 'Typebot gives you powerful blocks to create unique chat experiences. Embed them anywhere on your apps and start collecting results like magic.', + name: 'Typebot', + url: 'https://typebot.io' + }, + { + description: + 'A modern CRM offering the flexibility of open-source, advanced features and sleek design.', + name: 'Twenty', + url: 'https://twenty.com' + }, + { + description: + 'Open-source enterprise-grade serverless CMS. Own your data. Scale effortlessly. Customize everything.', + name: 'Webiny', + url: 'https://www.webiny.com' + }, + { + description: 'Webstudio is an open source alternative to Webflow', + name: 'Webstudio', + url: 'https://webstudio.is' + } + ]; + + private unsubscribeSubject = new Subject(); + + public constructor() {} + + public ngOnDestroy() { + this.unsubscribeSubject.next(); + this.unsubscribeSubject.complete(); + } +} diff --git a/apps/client/src/app/pages/about/oss-friends/oss-friends-page.html b/apps/client/src/app/pages/about/oss-friends/oss-friends-page.html new file mode 100644 index 00000000..07f9a834 --- /dev/null +++ b/apps/client/src/app/pages/about/oss-friends/oss-friends-page.html @@ -0,0 +1,36 @@ + + + + + Our OSS Friends + + + + + + {{ ossFriend.name }} + + + {{ ossFriend.description }} + + + + Visit {{ ossFriend.name + }} + + + + + + + + diff --git a/apps/client/src/app/pages/about/oss-friends/oss-friends-page.module.ts b/apps/client/src/app/pages/about/oss-friends/oss-friends-page.module.ts new file mode 100644 index 00000000..1af5631b --- /dev/null +++ b/apps/client/src/app/pages/about/oss-friends/oss-friends-page.module.ts @@ -0,0 +1,19 @@ +import { CommonModule } from '@angular/common'; +import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; + +import { OpenSourceSoftwareFriendsPageRoutingModule } from './oss-friends-page-routing.module'; +import { OpenSourceSoftwareFriendsPageComponent } from './oss-friends-page.component'; +import { MatCardModule } from '@angular/material/card'; +import { MatButtonModule } from '@angular/material/button'; + +@NgModule({ + declarations: [OpenSourceSoftwareFriendsPageComponent], + imports: [ + CommonModule, + MatButtonModule, + MatCardModule, + OpenSourceSoftwareFriendsPageRoutingModule + ], + schemas: [CUSTOM_ELEMENTS_SCHEMA] +}) +export class OpenSourceSoftwareFriendsPageModule {} diff --git a/apps/client/src/app/pages/about/oss-friends/oss-friends-page.scss b/apps/client/src/app/pages/about/oss-friends/oss-friends-page.scss new file mode 100644 index 00000000..5d4e87f3 --- /dev/null +++ b/apps/client/src/app/pages/about/oss-friends/oss-friends-page.scss @@ -0,0 +1,3 @@ +:host { + display: block; +} diff --git a/apps/client/src/locales/messages.de.xlf b/apps/client/src/locales/messages.de.xlf index ab068786..037f96f0 100644 --- a/apps/client/src/locales/messages.de.xlf +++ b/apps/client/src/locales/messages.de.xlf @@ -190,7 +190,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 71 + 74 @@ -466,7 +466,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 47 + 50 @@ -1322,7 +1322,7 @@ Allokation libs/ui/src/lib/holdings-table/holdings-table.component.html - 95 + 98 @@ -1338,7 +1338,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 116 + 119 @@ -1346,7 +1346,7 @@ Alle anzeigen libs/ui/src/lib/holdings-table/holdings-table.component.html - 169 + 172 @@ -1430,11 +1430,11 @@ Über Ghostfolio apps/client/src/app/pages/about/about-page-routing.module.ts - 60 + 67 apps/client/src/app/pages/about/about-page.component.ts - 51 + 50 apps/client/src/app/pages/about/overview/about-overview-page-routing.module.ts @@ -1550,7 +1550,7 @@ Datenschutzbestimmungen apps/client/src/app/pages/about/about-page.component.ts - 66 + 68 apps/client/src/app/pages/about/privacy-policy/privacy-policy-page-routing.module.ts @@ -2786,7 +2786,7 @@ Filtern nach Konto oder Tag... apps/client/src/app/pages/portfolio/allocations/allocations-page.component.ts - 141 + 147 apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts @@ -4158,7 +4158,7 @@ Changelog apps/client/src/app/pages/about/about-page.component.ts - 56 + 55 apps/client/src/app/pages/about/changelog/changelog-page-routing.module.ts @@ -4170,7 +4170,7 @@ Lizenz apps/client/src/app/pages/about/about-page.component.ts - 61 + 60 apps/client/src/app/pages/about/license/license-page-routing.module.ts @@ -7265,6 +7265,22 @@ 65 + + Our + Unsere + + apps/client/src/app/pages/about/oss-friends/oss-friends-page.html + 5 + + + + Visit + Besuche + + apps/client/src/app/pages/about/oss-friends/oss-friends-page.html + 26 + +
{{ ossFriend.description }}