Browse Source

Extend personal finance tools with categories and platforms

pull/7240/head
Thomas Kaul 2 weeks ago
parent
commit
a5993bd9cf
  1. 76
      apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts
  2. 44
      apps/client/src/app/pages/resources/personal-finance-tools/product-page.html
  3. 33
      libs/ui/src/lib/i18n.ts

76
apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts

@ -2,6 +2,7 @@ import { getCountryName } from '@ghostfolio/common/helper';
import { Product } from '@ghostfolio/common/interfaces'; import { Product } from '@ghostfolio/common/interfaces';
import { personalFinanceTools } from '@ghostfolio/common/personal-finance-tools'; import { personalFinanceTools } from '@ghostfolio/common/personal-finance-tools';
import { publicRoutes } from '@ghostfolio/common/routes/routes'; import { publicRoutes } from '@ghostfolio/common/routes/routes';
import { ProductCategory, ProductPlatform } from '@ghostfolio/common/types';
import { translate } from '@ghostfolio/ui/i18n'; import { translate } from '@ghostfolio/ui/i18n';
import { DataService } from '@ghostfolio/ui/services'; import { DataService } from '@ghostfolio/ui/services';
@ -91,39 +92,52 @@ export class GfProductPageComponent {
const product1 = this.product1(); const product1 = this.product1();
const product2 = this.product2(); const product2 = this.product2();
return [ return Array.from(
product1.name, new Set(
product1.origin, [
product2.name, ...(product1.categories ?? []).map((category: ProductCategory) => {
product2.origin, return translate(category);
$localize`Alternative`, }),
$localize`App`, product1.name,
$localize`Budgeting`, product1.origin,
$localize`Community`, ...(product1.platforms ?? []).map((platform: ProductPlatform) => {
$localize`Family Office`, return translate(platform);
`Fintech`, }),
$localize`Investment`, ...(product2.categories ?? []).map((category: ProductCategory) => {
$localize`Investor`, return translate(category);
$localize`Open Source`, }),
`OSS`, product2.name,
$localize`Personal Finance`, product2.origin,
$localize`Privacy`, ...(product2.platforms ?? []).map((platform: ProductPlatform) => {
$localize`Portfolio`, return translate(platform);
$localize`Software`, }),
$localize`Tool`, $localize`Alternative`,
$localize`User Experience`, $localize`App`,
$localize`Wealth`, $localize`Community`,
$localize`Wealth Management`, `Fintech`,
`WealthTech` $localize`Investment`,
] $localize`Investor`,
.filter((item): item is string => { $localize`Open Source`,
return !!item; `OSS`,
}) $localize`Personal Finance`,
.sort((a, b) => { $localize`Portfolio`,
return a.localeCompare(b, undefined, { sensitivity: 'base' }); $localize`Privacy`,
}); $localize`Software`,
$localize`Tool`,
$localize`User Experience`,
$localize`Wealth`,
`WealthTech`
].filter((item): item is string => {
return !!item;
})
)
).sort((a, b) => {
return a.localeCompare(b, undefined, { sensitivity: 'base' });
});
}); });
protected readonly translate = translate;
private readonly dataService = inject(DataService); private readonly dataService = inject(DataService);
private readonly route = inject(ActivatedRoute); private readonly route = inject(ActivatedRoute);
} }

44
apps/client/src/app/pages/resources/personal-finance-tools/product-page.html

@ -73,6 +73,27 @@
<td class="mat-mdc-cell px-1 py-2">{{ product1().slogan }}</td> <td class="mat-mdc-cell px-1 py-2">{{ product1().slogan }}</td>
<td class="mat-mdc-cell px-1 py-2">{{ product2().slogan }}</td> <td class="mat-mdc-cell px-1 py-2">{{ product2().slogan }}</td>
</tr> </tr>
<tr class="mat-mdc-row">
<td class="mat-mdc-cell px-3 py-2 text-right" i18n>Category</td>
<td class="mat-mdc-cell px-1 py-2">
@for (
category of product1().categories;
track category;
let isLast = $last
) {
{{ translate(category) }}{{ isLast ? '' : ', ' }}
}
</td>
<td class="mat-mdc-cell px-1 py-2">
@for (
category of product2().categories;
track category;
let isLast = $last
) {
{{ translate(category) }}{{ isLast ? '' : ', ' }}
}
</td>
</tr>
<tr class="mat-mdc-row"> <tr class="mat-mdc-row">
<td class="mat-mdc-cell px-3 py-2 text-right" i18n>Founded</td> <td class="mat-mdc-cell px-3 py-2 text-right" i18n>Founded</td>
<td class="mat-mdc-cell px-1 py-2">{{ product1().founded }}</td> <td class="mat-mdc-cell px-1 py-2">{{ product1().founded }}</td>
@ -104,6 +125,29 @@
} }
</td> </td>
</tr> </tr>
<tr class="mat-mdc-row">
<td class="mat-mdc-cell px-3 py-2 text-right" i18n>
Available on
</td>
<td class="mat-mdc-cell px-1 py-2">
@for (
platform of product1().platforms;
track platform;
let isLast = $last
) {
{{ translate(platform) }}{{ isLast ? '' : ', ' }}
}
</td>
<td class="mat-mdc-cell px-1 py-2">
@for (
platform of product2().platforms;
track platform;
let isLast = $last
) {
{{ translate(platform) }}{{ isLast ? '' : ', ' }}
}
</td>
</tr>
<tr class="mat-mdc-row"> <tr class="mat-mdc-row">
<td class="mat-mdc-cell px-3 py-2 text-right" i18n> <td class="mat-mdc-cell px-3 py-2 text-right" i18n>
Available in Available in

33
libs/ui/src/lib/i18n.ts

@ -1,4 +1,8 @@
import type { SectorName } from '@ghostfolio/common/types'; import type {
ProductCategory,
ProductPlatform,
SectorName
} from '@ghostfolio/common/types';
import '@angular/localize/init'; import '@angular/localize/init';
@ -94,8 +98,31 @@ const locales = {
Other: $localize`Other`, Other: $localize`Other`,
'Real Estate': $localize`Real Estate`, 'Real Estate': $localize`Real Estate`,
Technology: $localize`Technology`, Technology: $localize`Technology`,
Utilities: $localize`Utilities` Utilities: $localize`Utilities`,
} satisfies Record<SectorName, string> & Record<string, string>;
// Product categories (CRYPTOCURRENCY is defined above under AssetSubClass)
BUDGETING: $localize`Budgeting`,
DIVIDEND_TRACKING: $localize`Dividend Tracking`,
ETF_TRACKING: $localize`ETF Tracking`,
FAMILY_OFFICE: $localize`Family Office`,
FINANCIAL_PLANNING: $localize`Financial Planning`,
INVESTMENT_RESEARCH: $localize`Investment Research`,
NET_WORTH_TRACKING: $localize`Net Worth Tracking`,
STOCK_TRACKING: $localize`Stock Tracking`,
TAX_REPORTING: $localize`Tax Reporting`,
WEALTH_MANAGEMENT: $localize`Wealth Management`,
// Product platforms
ANDROID: $localize`Android`,
IOS: $localize`iOS`,
LINUX: $localize`Linux`,
MACOS: $localize`macOS`,
WEB: $localize`Web`,
WINDOWS: $localize`Windows`
} satisfies Record<ProductCategory, string> &
Record<ProductPlatform, string> &
Record<SectorName, string> &
Record<string, string>;
export function translate(aKey: string): string { export function translate(aKey: string): string {
return locales[aKey] ?? aKey; return locales[aKey] ?? aKey;

Loading…
Cancel
Save