From d341c4804abab279484f21909ab018a5761a8013 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Sat, 29 Nov 2025 13:57:57 +0100 Subject: [PATCH 01/31] Feature/improve asset profile data gathering (#5997) * Improve asset profile data gathering * Update changelog --- CHANGELOG.md | 1 + apps/api/src/app/admin/admin.controller.ts | 4 +- apps/api/src/services/cron/cron.service.ts | 4 +- .../data-gathering/data-gathering.service.ts | 53 +++++++++++-------- 4 files changed, 36 insertions(+), 26 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index aa78ea5c0..5acae5a13 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed +- Restricted the asset profile data gathering on Sundays to only process outdated asset profiles - Eliminated `uuid` in favor of using `randomUUID` from `node:crypto` - Upgraded `color` from version `5.0.0` to `5.0.3` diff --git a/apps/api/src/app/admin/admin.controller.ts b/apps/api/src/app/admin/admin.controller.ts index 8b5da4965..24467c732 100644 --- a/apps/api/src/app/admin/admin.controller.ts +++ b/apps/api/src/app/admin/admin.controller.ts @@ -93,7 +93,7 @@ export class AdminController { @UseGuards(AuthGuard('jwt'), HasPermissionGuard) public async gatherMax(): Promise { const assetProfileIdentifiers = - await this.dataGatheringService.getAllActiveAssetProfileIdentifiers(); + await this.dataGatheringService.getActiveAssetProfileIdentifiers(); await this.dataGatheringService.addJobsToQueue( assetProfileIdentifiers.map(({ dataSource, symbol }) => { @@ -120,7 +120,7 @@ export class AdminController { @UseGuards(AuthGuard('jwt'), HasPermissionGuard) public async gatherProfileData(): Promise { const assetProfileIdentifiers = - await this.dataGatheringService.getAllActiveAssetProfileIdentifiers(); + await this.dataGatheringService.getActiveAssetProfileIdentifiers(); await this.dataGatheringService.addJobsToQueue( assetProfileIdentifiers.map(({ dataSource, symbol }) => { diff --git a/apps/api/src/services/cron/cron.service.ts b/apps/api/src/services/cron/cron.service.ts index 88fcabce2..ee91a811e 100644 --- a/apps/api/src/services/cron/cron.service.ts +++ b/apps/api/src/services/cron/cron.service.ts @@ -59,7 +59,9 @@ export class CronService { public async runEverySundayAtTwelvePm() { if (await this.isDataGatheringEnabled()) { const assetProfileIdentifiers = - await this.dataGatheringService.getAllActiveAssetProfileIdentifiers(); + await this.dataGatheringService.getActiveAssetProfileIdentifiers({ + maxAge: '60 days' + }); await this.dataGatheringService.addJobsToQueue( assetProfileIdentifiers.map(({ dataSource, symbol }) => { diff --git a/apps/api/src/services/queues/data-gathering/data-gathering.service.ts b/apps/api/src/services/queues/data-gathering/data-gathering.service.ts index c433f692f..cec63c3eb 100644 --- a/apps/api/src/services/queues/data-gathering/data-gathering.service.ts +++ b/apps/api/src/services/queues/data-gathering/data-gathering.service.ts @@ -28,8 +28,9 @@ import { InjectQueue } from '@nestjs/bull'; import { Inject, Injectable, Logger } from '@nestjs/common'; import { DataSource } from '@prisma/client'; import { JobOptions, Queue } from 'bull'; -import { format, min, subDays, subYears } from 'date-fns'; +import { format, min, subDays, subMilliseconds, subYears } from 'date-fns'; import { isEmpty } from 'lodash'; +import ms, { StringValue } from 'ms'; @Injectable() export class DataGatheringService { @@ -160,8 +161,7 @@ export class DataGatheringService { ); if (!assetProfileIdentifiers) { - assetProfileIdentifiers = - await this.getAllActiveAssetProfileIdentifiers(); + assetProfileIdentifiers = await this.getActiveAssetProfileIdentifiers(); } if (assetProfileIdentifiers.length <= 0) { @@ -301,29 +301,36 @@ export class DataGatheringService { ); } - public async getAllActiveAssetProfileIdentifiers(): Promise< - AssetProfileIdentifier[] - > { - const symbolProfiles = await this.prismaService.symbolProfile.findMany({ - orderBy: [{ symbol: 'asc' }], + /** + * Returns active asset profile identifiers + * + * @param {StringValue} maxAge - Optional. Specifies the maximum allowed age + * of a profile’s last update timestamp. Only asset profiles considered stale + * are returned. + */ + public async getActiveAssetProfileIdentifiers({ + maxAge + }: { + maxAge?: StringValue; + } = {}): Promise { + return this.prismaService.symbolProfile.findMany({ + orderBy: [{ symbol: 'asc' }, { dataSource: 'asc' }], + select: { + dataSource: true, + symbol: true + }, where: { - isActive: true + dataSource: { + notIn: ['MANUAL', 'RAPID_API'] + }, + isActive: true, + ...(maxAge && { + updatedAt: { + lt: subMilliseconds(new Date(), ms(maxAge)) + } + }) } }); - - return symbolProfiles - .filter(({ dataSource }) => { - return ( - dataSource !== DataSource.MANUAL && - dataSource !== DataSource.RAPID_API - ); - }) - .map(({ dataSource, symbol }) => { - return { - dataSource, - symbol - }; - }); } private async getAssetProfileIdentifiersWithCompleteMarketData(): Promise< From 9092669dd8586c4353620e907044a62e241483aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sven=20G=C3=BCnther?= Date: Sat, 29 Nov 2025 14:12:08 +0100 Subject: [PATCH 02/31] Task/remove Cypress setup (#5995) * Remove Cypress setup * Update changelog --- CHANGELOG.md | 1 + apps/client-e2e/.eslintrc.json | 20 - apps/client-e2e/cypress.json | 12 - apps/client-e2e/project.json | 22 - apps/client-e2e/src/fixtures/example.json | 4 - apps/client-e2e/src/integration/app.spec.ts | 13 - apps/client-e2e/src/plugins/index.js | 22 - apps/client-e2e/src/support/app.po.ts | 1 - apps/client-e2e/src/support/commands.ts | 31 -- apps/client-e2e/src/support/index.ts | 16 - apps/client-e2e/tsconfig.e2e.json | 10 - apps/client-e2e/tsconfig.json | 10 - apps/ui-e2e/cypress.json | 13 - apps/ui-e2e/eslint.config.cjs | 33 -- apps/ui-e2e/project.json | 28 -- apps/ui-e2e/src/fixtures/example.json | 4 - .../integration/value/value.component.spec.ts | 6 - apps/ui-e2e/src/plugins/index.js | 22 - apps/ui-e2e/src/support/commands.ts | 33 -- apps/ui-e2e/src/support/index.ts | 16 - apps/ui-e2e/tsconfig.json | 10 - package-lock.json | 402 +++++++++++++++--- package.json | 5 - 23 files changed, 339 insertions(+), 395 deletions(-) delete mode 100644 apps/client-e2e/.eslintrc.json delete mode 100644 apps/client-e2e/cypress.json delete mode 100644 apps/client-e2e/project.json delete mode 100644 apps/client-e2e/src/fixtures/example.json delete mode 100644 apps/client-e2e/src/integration/app.spec.ts delete mode 100644 apps/client-e2e/src/plugins/index.js delete mode 100644 apps/client-e2e/src/support/app.po.ts delete mode 100644 apps/client-e2e/src/support/commands.ts delete mode 100644 apps/client-e2e/src/support/index.ts delete mode 100644 apps/client-e2e/tsconfig.e2e.json delete mode 100644 apps/client-e2e/tsconfig.json delete mode 100644 apps/ui-e2e/cypress.json delete mode 100644 apps/ui-e2e/eslint.config.cjs delete mode 100644 apps/ui-e2e/project.json delete mode 100644 apps/ui-e2e/src/fixtures/example.json delete mode 100644 apps/ui-e2e/src/integration/value/value.component.spec.ts delete mode 100644 apps/ui-e2e/src/plugins/index.js delete mode 100644 apps/ui-e2e/src/support/commands.ts delete mode 100644 apps/ui-e2e/src/support/index.ts delete mode 100644 apps/ui-e2e/tsconfig.json diff --git a/CHANGELOG.md b/CHANGELOG.md index 5acae5a13..4236570c3 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 ### Changed - Restricted the asset profile data gathering on Sundays to only process outdated asset profiles +- Removed the _Cypress_ testing setup - Eliminated `uuid` in favor of using `randomUUID` from `node:crypto` - Upgraded `color` from version `5.0.0` to `5.0.3` diff --git a/apps/client-e2e/.eslintrc.json b/apps/client-e2e/.eslintrc.json deleted file mode 100644 index dbedf6bd4..000000000 --- a/apps/client-e2e/.eslintrc.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "extends": ["plugin:cypress/recommended", "../../.eslintrc.json"], - "ignorePatterns": ["!**/*"], - "overrides": [ - { - "files": ["*.ts", "*.tsx", "*.js", "*.jsx"], - "parserOptions": { - "project": ["apps/client-e2e/tsconfig.*?.json"] - }, - "rules": {} - }, - { - "files": ["src/plugins/index.js"], - "rules": { - "@typescript-eslint/no-var-requires": "off", - "no-undef": "off" - } - } - ] -} diff --git a/apps/client-e2e/cypress.json b/apps/client-e2e/cypress.json deleted file mode 100644 index a8219f0fe..000000000 --- a/apps/client-e2e/cypress.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "fileServerFolder": ".", - "fixturesFolder": "./src/fixtures", - "integrationFolder": "./src/integration", - "modifyObstructiveCode": false, - "pluginsFile": "./src/plugins/index", - "supportFile": "./src/support/index.ts", - "video": true, - "videosFolder": "../../dist/cypress/apps/client-e2e/videos", - "screenshotsFolder": "../../dist/cypress/apps/client-e2e/screenshots", - "chromeWebSecurity": false -} diff --git a/apps/client-e2e/project.json b/apps/client-e2e/project.json deleted file mode 100644 index 92e2f09ef..000000000 --- a/apps/client-e2e/project.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "name": "client-e2e", - "$schema": "../../node_modules/nx/schemas/project-schema.json", - "sourceRoot": "apps/client-e2e/src", - "projectType": "application", - "tags": [], - "implicitDependencies": ["client"], - "targets": { - "e2e": { - "executor": "@nx/cypress:cypress", - "options": { - "cypressConfig": "apps/client-e2e/cypress.json", - "devServerTarget": "client:serve" - }, - "configurations": { - "production": { - "devServerTarget": "client:serve:production" - } - } - } - } -} diff --git a/apps/client-e2e/src/fixtures/example.json b/apps/client-e2e/src/fixtures/example.json deleted file mode 100644 index 294cbed6c..000000000 --- a/apps/client-e2e/src/fixtures/example.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "name": "Using fixtures to represent data", - "email": "hello@cypress.io" -} diff --git a/apps/client-e2e/src/integration/app.spec.ts b/apps/client-e2e/src/integration/app.spec.ts deleted file mode 100644 index b194092d7..000000000 --- a/apps/client-e2e/src/integration/app.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { getGreeting } from '../support/app.po'; - -describe('client', () => { - beforeEach(() => cy.visit('/')); - - it('should display welcome message', () => { - // Custom command example, see `../support/commands.ts` file - cy.login('my-email@something.com', 'myPassword'); - - // Function helper example, see `../support/app.po.ts` file - getGreeting().contains('Welcome to client!'); - }); -}); diff --git a/apps/client-e2e/src/plugins/index.js b/apps/client-e2e/src/plugins/index.js deleted file mode 100644 index 63aa33cbe..000000000 --- a/apps/client-e2e/src/plugins/index.js +++ /dev/null @@ -1,22 +0,0 @@ -// *********************************************************** -// This example plugins/index.js can be used to load plugins -// -// You can change the location of this file or turn off loading -// the plugins file with the 'pluginsFile' configuration option. -// -// You can read more here: -// https://on.cypress.io/plugins-guide -// *********************************************************** - -// This function is called when a project is opened or re-opened (e.g. due to -// the project's config changing) - -const { preprocessTypescript } = require('@nx/cypress/plugins/preprocessor'); - -module.exports = (on, config) => { - // `on` is used to hook into various events Cypress emits - // `config` is the resolved Cypress config - - // Preprocess Typescript file using Nx helper - on('file:preprocessor', preprocessTypescript(config)); -}; diff --git a/apps/client-e2e/src/support/app.po.ts b/apps/client-e2e/src/support/app.po.ts deleted file mode 100644 index 329342469..000000000 --- a/apps/client-e2e/src/support/app.po.ts +++ /dev/null @@ -1 +0,0 @@ -export const getGreeting = () => cy.get('h1'); diff --git a/apps/client-e2e/src/support/commands.ts b/apps/client-e2e/src/support/commands.ts deleted file mode 100644 index 36c834059..000000000 --- a/apps/client-e2e/src/support/commands.ts +++ /dev/null @@ -1,31 +0,0 @@ -// *********************************************** -// This example commands.js shows you how to -// create various custom commands and overwrite -// existing commands. -// -// For more comprehensive examples of custom -// commands please read more here: -// https://on.cypress.io/custom-commands -// *********************************************** - -declare namespace Cypress { - interface Chainable { - login(email: string, password: string): void; - } -} -// -// -- This is a parent command -- -Cypress.Commands.add('login', (email, password) => { - console.log('Custom command example: Login', email, password); -}); -// -// -- This is a child command -- -// Cypress.Commands.add("drag", { prevSubject: 'element'}, (subject, options) => { ... }) -// -// -// -- This is a dual command -- -// Cypress.Commands.add("dismiss", { prevSubject: 'optional'}, (subject, options) => { ... }) -// -// -// -- This will overwrite an existing command -- -// Cypress.Commands.overwrite("visit", (originalFn, url, options) => { ... }) diff --git a/apps/client-e2e/src/support/index.ts b/apps/client-e2e/src/support/index.ts deleted file mode 100644 index fad130159..000000000 --- a/apps/client-e2e/src/support/index.ts +++ /dev/null @@ -1,16 +0,0 @@ -// *********************************************************** -// This example support/index.js is processed and -// loaded automatically before your test files. -// -// This is a great place to put global configuration and -// behavior that modifies Cypress. -// -// You can change the location of this file or turn off -// automatically serving support files with the -// 'supportFile' configuration option. -// -// You can read more here: -// https://on.cypress.io/configuration -// *********************************************************** -// Import commands.js using ES2015 syntax: -import './commands'; diff --git a/apps/client-e2e/tsconfig.e2e.json b/apps/client-e2e/tsconfig.e2e.json deleted file mode 100644 index 9dc3660a7..000000000 --- a/apps/client-e2e/tsconfig.e2e.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "extends": "./tsconfig.json", - "compilerOptions": { - "sourceMap": false, - "outDir": "../../dist/out-tsc", - "allowJs": true, - "types": ["cypress", "node"] - }, - "include": ["src/**/*.ts", "src/**/*.js"] -} diff --git a/apps/client-e2e/tsconfig.json b/apps/client-e2e/tsconfig.json deleted file mode 100644 index 08841a7f5..000000000 --- a/apps/client-e2e/tsconfig.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "extends": "../../tsconfig.base.json", - "files": [], - "include": [], - "references": [ - { - "path": "./tsconfig.e2e.json" - } - ] -} diff --git a/apps/ui-e2e/cypress.json b/apps/ui-e2e/cypress.json deleted file mode 100644 index 71520788e..000000000 --- a/apps/ui-e2e/cypress.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "fileServerFolder": ".", - "fixturesFolder": "./src/fixtures", - "integrationFolder": "./src/integration", - "modifyObstructiveCode": false, - "supportFile": "./src/support/index.ts", - "pluginsFile": "./src/plugins/index", - "video": true, - "videosFolder": "../../dist/cypress/apps/ui-e2e/videos", - "screenshotsFolder": "../../dist/cypress/apps/ui-e2e/screenshots", - "chromeWebSecurity": false, - "baseUrl": "http://localhost:4400" -} diff --git a/apps/ui-e2e/eslint.config.cjs b/apps/ui-e2e/eslint.config.cjs deleted file mode 100644 index 5e6707635..000000000 --- a/apps/ui-e2e/eslint.config.cjs +++ /dev/null @@ -1,33 +0,0 @@ -const { FlatCompat } = require('@eslint/eslintrc'); -const js = require('@eslint/js'); -const baseConfig = require('../../eslint.config.cjs'); - -const compat = new FlatCompat({ - baseDirectory: __dirname, - recommendedConfig: js.configs.recommended -}); - -module.exports = [ - { - ignores: ['**/dist'] - }, - ...baseConfig, - ...compat.extends('plugin:cypress/recommended'), - { - files: ['**/*.ts', '**/*.tsx', '**/*.js', '**/*.jsx'], - // Override or add rules here - rules: {}, - languageOptions: { - parserOptions: { - project: ['apps/ui-e2e/tsconfig.json'] - } - } - }, - { - files: ['src/plugins/index.js'], - rules: { - '@typescript-eslint/no-var-requires': 'off', - 'no-undef': 'off' - } - } -]; diff --git a/apps/ui-e2e/project.json b/apps/ui-e2e/project.json deleted file mode 100644 index a5b4cf53a..000000000 --- a/apps/ui-e2e/project.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "name": "ui-e2e", - "$schema": "../../node_modules/nx/schemas/project-schema.json", - "sourceRoot": "apps/ui-e2e/src", - "projectType": "application", - "tags": [], - "implicitDependencies": ["ui"], - "targets": { - "e2e": { - "executor": "@nx/cypress:cypress", - "options": { - "cypressConfig": "apps/ui-e2e/cypress.json", - "devServerTarget": "ui:storybook" - }, - "configurations": { - "ci": { - "devServerTarget": "ui:storybook:ci" - } - } - }, - "lint": { - "executor": "@nx/eslint:lint", - "options": { - "lintFilePatterns": ["apps/ui-e2e/**/*.{js,ts}"] - } - } - } -} diff --git a/apps/ui-e2e/src/fixtures/example.json b/apps/ui-e2e/src/fixtures/example.json deleted file mode 100644 index 294cbed6c..000000000 --- a/apps/ui-e2e/src/fixtures/example.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "name": "Using fixtures to represent data", - "email": "hello@cypress.io" -} diff --git a/apps/ui-e2e/src/integration/value/value.component.spec.ts b/apps/ui-e2e/src/integration/value/value.component.spec.ts deleted file mode 100644 index 5b90784e7..000000000 --- a/apps/ui-e2e/src/integration/value/value.component.spec.ts +++ /dev/null @@ -1,6 +0,0 @@ -describe('ui', () => { - beforeEach(() => cy.visit('/iframe.html?id=valuecomponent--loading')); - it('should render the component', () => { - cy.get('gf-value').should('exist'); - }); -}); diff --git a/apps/ui-e2e/src/plugins/index.js b/apps/ui-e2e/src/plugins/index.js deleted file mode 100644 index 63aa33cbe..000000000 --- a/apps/ui-e2e/src/plugins/index.js +++ /dev/null @@ -1,22 +0,0 @@ -// *********************************************************** -// This example plugins/index.js can be used to load plugins -// -// You can change the location of this file or turn off loading -// the plugins file with the 'pluginsFile' configuration option. -// -// You can read more here: -// https://on.cypress.io/plugins-guide -// *********************************************************** - -// This function is called when a project is opened or re-opened (e.g. due to -// the project's config changing) - -const { preprocessTypescript } = require('@nx/cypress/plugins/preprocessor'); - -module.exports = (on, config) => { - // `on` is used to hook into various events Cypress emits - // `config` is the resolved Cypress config - - // Preprocess Typescript file using Nx helper - on('file:preprocessor', preprocessTypescript(config)); -}; diff --git a/apps/ui-e2e/src/support/commands.ts b/apps/ui-e2e/src/support/commands.ts deleted file mode 100644 index 310f1fa0e..000000000 --- a/apps/ui-e2e/src/support/commands.ts +++ /dev/null @@ -1,33 +0,0 @@ -// *********************************************** -// This example commands.js shows you how to -// create various custom commands and overwrite -// existing commands. -// -// For more comprehensive examples of custom -// commands please read more here: -// https://on.cypress.io/custom-commands -// *********************************************** - -// eslint-disable-next-line @typescript-eslint/no-namespace -declare namespace Cypress { - // eslint-disable-next-line @typescript-eslint/no-unused-vars - interface Chainable { - login(email: string, password: string): void; - } -} -// -// -- This is a parent command -- -Cypress.Commands.add('login', (email, password) => { - console.log('Custom command example: Login', email, password); -}); -// -// -- This is a child command -- -// Cypress.Commands.add("drag", { prevSubject: 'element'}, (subject, options) => { ... }) -// -// -// -- This is a dual command -- -// Cypress.Commands.add("dismiss", { prevSubject: 'optional'}, (subject, options) => { ... }) -// -// -// -- This will overwrite an existing command -- -// Cypress.Commands.overwrite("visit", (originalFn, url, options) => { ... }) diff --git a/apps/ui-e2e/src/support/index.ts b/apps/ui-e2e/src/support/index.ts deleted file mode 100644 index fad130159..000000000 --- a/apps/ui-e2e/src/support/index.ts +++ /dev/null @@ -1,16 +0,0 @@ -// *********************************************************** -// This example support/index.js is processed and -// loaded automatically before your test files. -// -// This is a great place to put global configuration and -// behavior that modifies Cypress. -// -// You can change the location of this file or turn off -// automatically serving support files with the -// 'supportFile' configuration option. -// -// You can read more here: -// https://on.cypress.io/configuration -// *********************************************************** -// Import commands.js using ES2015 syntax: -import './commands'; diff --git a/apps/ui-e2e/tsconfig.json b/apps/ui-e2e/tsconfig.json deleted file mode 100644 index c4f818ecd..000000000 --- a/apps/ui-e2e/tsconfig.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "extends": "../../tsconfig.base.json", - "compilerOptions": { - "sourceMap": false, - "outDir": "../../dist/out-tsc", - "allowJs": true, - "types": ["cypress", "node"] - }, - "include": ["src/**/*.ts", "src/**/*.js"] -} diff --git a/package-lock.json b/package-lock.json index a68a42262..f765b52fd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -109,7 +109,6 @@ "@nestjs/schematics": "11.0.9", "@nestjs/testing": "11.1.8", "@nx/angular": "21.5.1", - "@nx/cypress": "21.5.1", "@nx/eslint-plugin": "21.5.1", "@nx/jest": "21.5.1", "@nx/js": "21.5.1", @@ -132,10 +131,8 @@ "@types/passport-google-oauth20": "2.0.16", "@typescript-eslint/eslint-plugin": "8.43.0", "@typescript-eslint/parser": "8.43.0", - "cypress": "6.2.1", "eslint": "9.35.0", "eslint-config-prettier": "10.1.8", - "eslint-plugin-cypress": "4.2.0", "eslint-plugin-import": "2.32.0", "eslint-plugin-storybook": "9.1.5", "husky": "9.1.7", @@ -4699,6 +4696,7 @@ "dev": true, "license": "MIT", "optional": true, + "peer": true, "engines": { "node": ">=0.1.90" } @@ -4733,6 +4731,8 @@ "integrity": "sha512-EDiBsVPWC27DDLEJCo+dpl9ODHhdrwU57ccr9tspwCdG2ni0QVkf6LF0FGbhfujcjPxnXLIwsaks4sOrwrA4Qw==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "chalk": "^1.1.3", "cli-cursor": "^1.0.2", @@ -4749,6 +4749,8 @@ "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=0.10.0" } @@ -4759,6 +4761,8 @@ "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=0.10.0" } @@ -4769,6 +4773,8 @@ "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "ansi-styles": "^2.2.1", "escape-string-regexp": "^1.0.2", @@ -4785,7 +4791,9 @@ "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-1.30.1.tgz", "integrity": "sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw==", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "node_modules/@cypress/listr-verbose-renderer/node_modules/escape-string-regexp": { "version": "1.0.5", @@ -4793,6 +4801,8 @@ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=0.8.0" } @@ -4803,6 +4813,8 @@ "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "ansi-regex": "^2.0.0" }, @@ -4816,6 +4828,8 @@ "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=0.8.0" } @@ -4826,6 +4840,8 @@ "integrity": "sha512-tOn+0mDZxASFM+cuAP9szGUGPI1HwWVSvdzm7V4cCsPdFTx6qMj29CwaQmRAMIEhORIUBFBsYROYJcveK4uOjA==", "dev": true, "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "aws-sign2": "~0.7.0", "aws4": "^1.8.0", @@ -4856,6 +4872,8 @@ "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.6", @@ -4871,6 +4889,8 @@ "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "bin": { "uuid": "dist/bin/uuid" } @@ -4881,6 +4901,8 @@ "integrity": "sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "debug": "^3.1.0", "lodash.once": "^4.1.1" @@ -4892,6 +4914,8 @@ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "ms": "^2.1.1" } @@ -4901,7 +4925,9 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "node_modules/@date-fns/utc": { "version": "2.1.0", @@ -12824,6 +12850,8 @@ "integrity": "sha512-c/qwwcHyafOQuVQJj0IlBjf5yYgBI7YPJ77k4fOJYesb41jio65eaJODRUmfYKhTOFBrIZ66kgvGPlNbjuoRdQ==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "any-observable": "^0.3.0" }, @@ -14551,14 +14579,18 @@ "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-6.0.4.tgz", "integrity": "sha512-IFQTJARgMUBF+xVd2b+hIgXWrZEjND3vJtRCvIelcFB5SIXfjV4bOHbHJ0eXKh+0COrBRc8MqteKAz/j88rE0A==", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "node_modules/@types/sizzle": { "version": "2.3.9", "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.9.tgz", "integrity": "sha512-xzLEyKB50yqCUPUJkIsrVvoWNfFUbIZI+RspLWt8u+tIW/BetMBZtgV2LY/2o+tYH8dRvQ+eoPf3NdhQCcLE2w==", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "node_modules/@types/sockjs": { "version": "0.3.36", @@ -15900,6 +15932,8 @@ "integrity": "sha512-/FQM1EDkTsf63Ub2C6O7GuYFDsSXUwsaZDurV0np41ocwq0jthUAYCmhBX9f+KwlaCgIuWyr/4WlUQUBfKfZog==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=6" } @@ -15956,7 +15990,9 @@ "url": "https://feross.org/support" } ], - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "node_modules/arg": { "version": "4.1.3", @@ -16146,6 +16182,8 @@ "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "safer-buffer": "~2.1.0" } @@ -16170,6 +16208,8 @@ "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=0.8" } @@ -16291,6 +16331,8 @@ "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", "dev": true, "license": "Apache-2.0", + "optional": true, + "peer": true, "engines": { "node": "*" } @@ -16300,7 +16342,9 @@ "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.13.2.tgz", "integrity": "sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "node_modules/axios": { "version": "1.11.0", @@ -16677,6 +16721,8 @@ "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", "dev": true, "license": "BSD-3-Clause", + "optional": true, + "peer": true, "dependencies": { "tweetnacl": "^0.14.3" } @@ -16686,7 +16732,9 @@ "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", "dev": true, - "license": "Unlicense" + "license": "Unlicense", + "optional": true, + "peer": true }, "node_modules/beasties": { "version": "0.3.5", @@ -16857,14 +16905,18 @@ "resolved": "https://registry.npmjs.org/blob-util/-/blob-util-2.0.2.tgz", "integrity": "sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ==", "dev": true, - "license": "Apache-2.0" + "license": "Apache-2.0", + "optional": true, + "peer": true }, "node_modules/bluebird": { "version": "3.7.2", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "node_modules/body-parser": { "version": "2.2.0", @@ -17068,6 +17120,8 @@ "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": "*" } @@ -17313,6 +17367,8 @@ "integrity": "sha512-9EtFOZR8g22CL7BWjJ9BUx1+A/djkofnyW3aOXZORNW2kxoUpx2h+uN2cOqwPmFhnpVmxg+KW2OjOSgChTEvsQ==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=6" } @@ -17444,7 +17500,9 @@ "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", "dev": true, - "license": "Apache-2.0" + "license": "Apache-2.0", + "optional": true, + "peer": true }, "node_modules/chai": { "version": "5.2.1", @@ -17565,6 +17623,8 @@ "integrity": "sha512-Pj779qHxV2tuapviy1bSZNEL1maXr13bPYpsvSDB68HlYcYuhlDrmGd63i0JHMCLKzc7rUSNIrpdJlhVlNwrxA==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">= 0.8.0" } @@ -17722,7 +17782,9 @@ "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "node_modules/citty": { "version": "0.1.6", @@ -17787,6 +17849,8 @@ "integrity": "sha512-25tABq090YNKkF6JH7lcwO0zFJTRke4Jcq9iX2nr/Sz0Cjjv4gckmwlW6Ty/aoyFd6z3ysR2hMGC2GFugmBo6A==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "restore-cursor": "^1.0.1" }, @@ -17813,6 +17877,8 @@ "integrity": "sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "string-width": "^4.2.0" }, @@ -17829,6 +17895,8 @@ "integrity": "sha512-f4r4yJnbT++qUPI9NR4XLDLq41gQ+uqnPItWG0F5ZkehuNiTTa3EY0S4AqTSUOeJ7/zU41oWPQSNkW5BqPL9bg==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "slice-ansi": "0.0.4", "string-width": "^1.0.1" @@ -17843,6 +17911,8 @@ "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=0.10.0" } @@ -17853,6 +17923,8 @@ "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "number-is-nan": "^1.0.0" }, @@ -17866,6 +17938,8 @@ "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -17881,6 +17955,8 @@ "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "ansi-regex": "^2.0.0" }, @@ -18006,6 +18082,8 @@ "integrity": "sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=0.10.0" } @@ -18175,6 +18253,8 @@ "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=4.0.0" } @@ -18254,6 +18334,8 @@ "node >= 0.8" ], "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "buffer-from": "^1.0.0", "inherits": "^2.0.3", @@ -18266,7 +18348,9 @@ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "node_modules/concat-stream/node_modules/readable-stream": { "version": "2.3.8", @@ -18274,6 +18358,8 @@ "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -18289,7 +18375,9 @@ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "node_modules/concat-stream/node_modules/string_decoder": { "version": "1.1.1", @@ -18297,6 +18385,8 @@ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "safe-buffer": "~5.1.0" } @@ -19712,6 +19802,8 @@ "dev": true, "hasInstallScript": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@cypress/listr-verbose-renderer": "^0.4.1", "@cypress/request": "^2.88.5", @@ -19765,6 +19857,8 @@ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -19782,6 +19876,8 @@ "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">= 6" } @@ -20343,6 +20439,8 @@ "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "assert-plus": "^1.0.0" }, @@ -21020,6 +21118,8 @@ "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "jsbn": "~0.1.0", "safer-buffer": "^2.1.0" @@ -21030,7 +21130,9 @@ "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "node_modules/ecdsa-sig-formatter": { "version": "1.0.11", @@ -21086,6 +21188,8 @@ "integrity": "sha512-B+ZM+RXvRqQaAmkMlO/oSe5nMUOaUnyfGYCEHoR8wrXsZR2mA0XVibsxV1bvTwxdRWah1PkQqso2EzhILGHtEQ==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=0.10.0" } @@ -21712,32 +21816,6 @@ "dev": true, "license": "MIT" }, - "node_modules/eslint-plugin-cypress": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-cypress/-/eslint-plugin-cypress-4.2.0.tgz", - "integrity": "sha512-v5cyt0VYb1tEEODBJSE44PocYOwQsckyexJhCs7LtdD3FGO6D2GjnZB2s2Sts4RcxdxECTWX01nObOZRs26bQw==", - "dev": true, - "license": "MIT", - "dependencies": { - "globals": "^15.11.0" - }, - "peerDependencies": { - "eslint": ">=9" - } - }, - "node_modules/eslint-plugin-cypress/node_modules/globals": { - "version": "15.15.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz", - "integrity": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/eslint-plugin-import": { "version": "2.32.0", "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz", @@ -22128,6 +22206,8 @@ "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "cross-spawn": "^7.0.0", "get-stream": "^5.0.0", @@ -22151,7 +22231,9 @@ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true, - "license": "ISC" + "license": "ISC", + "optional": true, + "peer": true }, "node_modules/executable": { "version": "4.1.1", @@ -22159,6 +22241,8 @@ "integrity": "sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "pify": "^2.2.0" }, @@ -22181,6 +22265,8 @@ "integrity": "sha512-MsG3prOVw1WtLXAZbM3KiYtooKR1LvxHh3VHsVtIy0uiUu8usxgB/94DP2HxtD/661lLdB6yzQ09lGJSQr6nkg==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=0.10.0" } @@ -22468,6 +22554,8 @@ "integrity": "sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA==", "dev": true, "license": "BSD-2-Clause", + "optional": true, + "peer": true, "dependencies": { "concat-stream": "^1.6.2", "debug": "^2.6.9", @@ -22484,6 +22572,8 @@ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "ms": "2.0.0" } @@ -22493,7 +22583,9 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "node_modules/extsprintf": { "version": "1.3.0", @@ -22503,7 +22595,9 @@ "engines": [ "node >=0.6.0" ], - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "node_modules/fast-check": { "version": "3.23.2", @@ -22661,6 +22755,8 @@ "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "pend": "~1.2.0" } @@ -22704,6 +22800,8 @@ "integrity": "sha512-UxKlfCRuCBxSXU4C6t9scbDyWZ4VlaFFdojKtzJuSkuOBQ5CNFum+zZXFwHjo+CxBC1t6zlYPgHIgFjL8ggoEQ==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "escape-string-regexp": "^1.0.5", "object-assign": "^4.1.0" @@ -22718,6 +22816,8 @@ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=0.8.0" } @@ -23034,6 +23134,8 @@ "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", "dev": true, "license": "Apache-2.0", + "optional": true, + "peer": true, "engines": { "node": "*" } @@ -23583,6 +23685,8 @@ "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "pump": "^3.0.0" }, @@ -23624,6 +23728,8 @@ "integrity": "sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "async": "^3.2.0" } @@ -23634,6 +23740,8 @@ "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "assert-plus": "^1.0.0" } @@ -23745,6 +23853,8 @@ "integrity": "sha512-MG6kdOUh/xBnyo9cJFeIKkLEc1AyFq42QTU4XiX51i2NEdxLxLWXIjEjmqKeSuKR7pAZjTqUVoT2b2huxVLgYQ==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "ini": "1.3.7" }, @@ -23760,7 +23870,9 @@ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.7.tgz", "integrity": "sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ==", "dev": true, - "license": "ISC" + "license": "ISC", + "optional": true, + "peer": true }, "node_modules/global-modules": { "version": "1.0.0", @@ -24041,6 +24153,8 @@ "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "ansi-regex": "^2.0.0" }, @@ -24054,6 +24168,8 @@ "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=0.10.0" } @@ -24610,6 +24726,8 @@ "integrity": "sha512-3adrsD6zqo4GsTqtO7FyrejHNv+NgiIfAfv68+jVlFmSr9OGy7zrxONceFRLKvnnZA5jbxQBX1u9PpB6Wi32Gw==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "assert-plus": "^1.0.0", "jsprim": "^2.0.2", @@ -24644,6 +24762,8 @@ "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", "dev": true, "license": "Apache-2.0", + "optional": true, + "peer": true, "engines": { "node": ">=8.12.0" } @@ -24865,6 +24985,8 @@ "integrity": "sha512-BYqTHXTGUIvg7t1r4sJNKcbDZkL92nkXA8YtRpbjFHRHGDL/NtUeiBJMeE60kIFN/Mg8ESaWQvftaYMGJzQZCQ==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=4" } @@ -25108,6 +25230,8 @@ "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "ci-info": "^2.0.0" }, @@ -25284,6 +25408,8 @@ "integrity": "sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "global-dirs": "^2.0.1", "is-path-inside": "^3.0.1" @@ -25379,6 +25505,8 @@ "integrity": "sha512-NqCa4Sa2d+u7BWc6CukaObG3Fh+CU9bvixbpcXYhy2VvYS7vVGIdAgnIS5Ks3A/cqk4rebLJ9s8zBstT2aKnIA==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "symbol-observable": "^1.1.0" }, @@ -25392,6 +25520,8 @@ "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=8" } @@ -25431,7 +25561,9 @@ "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "node_modules/is-regex": { "version": "1.2.1", @@ -25549,7 +25681,9 @@ "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "node_modules/is-unicode-supported": { "version": "0.1.0", @@ -25704,7 +25838,9 @@ "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "node_modules/istanbul-lib-coverage": { "version": "3.2.2", @@ -30141,7 +30277,9 @@ "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", "dev": true, - "license": "ISC" + "license": "ISC", + "optional": true, + "peer": true }, "node_modules/json5": { "version": "2.2.3", @@ -30331,6 +30469,8 @@ "node >=0.6.0" ], "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "assert-plus": "1.0.0", "extsprintf": "1.3.0", @@ -30637,6 +30777,8 @@ "integrity": "sha512-cc8oEVoctTvsFZ/Oje/kGnHbpWHYBe8IAJe4C0QNc3t8uM/0Y8+erSz/7Y1ALuXTEZTMvxXwO6YbX1ey3ujiZw==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": "> 0.8" } @@ -30816,6 +30958,8 @@ "integrity": "sha512-RmAl7su35BFd/xoMamRjpIE4j3v+L28o8CT5YhAXQJm1fD+1l9ngXY8JAQRJ+tFK2i5njvi0iRUKV09vPwA0iA==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@samverschueren/stream-to-observable": "^0.3.0", "is-observable": "^1.1.0", @@ -30837,6 +30981,8 @@ "integrity": "sha512-L26cIFm7/oZeSNVhWB6faeorXhMg4HNlb/dS/7jHhr708jxlXrtrBWo4YUxZQkc6dGoxEAe6J/D3juTRBUzjtA==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=4" } @@ -30847,6 +30993,8 @@ "integrity": "sha512-tKRsZpKz8GSGqoI/+caPmfrypiaq+OQCbd+CovEC24uk1h952lVj5sC7SqyFUm+OaJ5HN/a1YLt5cit2FMNsFA==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "chalk": "^1.1.3", "cli-truncate": "^0.2.1", @@ -30870,6 +31018,8 @@ "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=0.10.0" } @@ -30880,6 +31030,8 @@ "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=0.10.0" } @@ -30890,6 +31042,8 @@ "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "ansi-styles": "^2.2.1", "escape-string-regexp": "^1.0.2", @@ -30907,6 +31061,8 @@ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=0.8.0" } @@ -30917,6 +31073,8 @@ "integrity": "sha512-mmPrW0Fh2fxOzdBbFv4g1m6pR72haFLPJ2G5SJEELf1y+iaQrDG6cWCPjy54RHYbZAt7X+ls690Kw62AdWXBzQ==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "chalk": "^1.0.0" }, @@ -30930,6 +31088,8 @@ "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "ansi-regex": "^2.0.0" }, @@ -30943,6 +31103,8 @@ "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=0.8.0" } @@ -30953,6 +31115,8 @@ "integrity": "sha512-04PDPqSlsqIOaaaGZ+41vq5FejI9auqTInicFRndCBgE3bXG8D6W1I+mWhk+1nqbHmyhla/6BUrd5OSiHwKRXw==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "chalk": "^2.4.1", "cli-cursor": "^2.1.0", @@ -30969,6 +31133,8 @@ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "color-convert": "^1.9.0" }, @@ -30982,6 +31148,8 @@ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -30997,6 +31165,8 @@ "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "restore-cursor": "^2.0.0" }, @@ -31010,6 +31180,8 @@ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "color-name": "1.1.3" } @@ -31019,14 +31191,18 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "node_modules/listr-verbose-renderer/node_modules/date-fns": { "version": "1.30.1", "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-1.30.1.tgz", "integrity": "sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw==", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "node_modules/listr-verbose-renderer/node_modules/escape-string-regexp": { "version": "1.0.5", @@ -31034,6 +31210,8 @@ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=0.8.0" } @@ -31044,6 +31222,8 @@ "integrity": "sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "escape-string-regexp": "^1.0.5" }, @@ -31057,6 +31237,8 @@ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=4" } @@ -31067,6 +31249,8 @@ "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=4" } @@ -31077,6 +31261,8 @@ "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "mimic-fn": "^1.0.0" }, @@ -31090,6 +31276,8 @@ "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "onetime": "^2.0.0", "signal-exit": "^3.0.2" @@ -31103,7 +31291,9 @@ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true, - "license": "ISC" + "license": "ISC", + "optional": true, + "peer": true }, "node_modules/listr-verbose-renderer/node_modules/supports-color": { "version": "5.5.0", @@ -31111,6 +31301,8 @@ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "has-flag": "^3.0.0" }, @@ -31124,6 +31316,8 @@ "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=0.10.0" } @@ -31134,6 +31328,8 @@ "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", "dev": true, "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "tslib": "^1.9.0" }, @@ -31146,7 +31342,9 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "dev": true, - "license": "0BSD" + "license": "0BSD", + "optional": true, + "peer": true }, "node_modules/listr2": { "version": "9.0.1", @@ -31647,6 +31845,8 @@ "integrity": "sha512-vlP11XfFGyeNQlmEn9tJ66rEW1coA/79m5z6BCkudjbAGE83uhAcGYrBFwfs3AdLiLzGRusRPAbSPK9xZteCmg==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "ansi-escapes": "^3.0.0", "cli-cursor": "^2.0.0", @@ -31662,6 +31862,8 @@ "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=4" } @@ -31672,6 +31874,8 @@ "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=4" } @@ -31682,6 +31886,8 @@ "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "restore-cursor": "^2.0.0" }, @@ -31695,6 +31901,8 @@ "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=4" } @@ -31705,6 +31913,8 @@ "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=4" } @@ -31715,6 +31925,8 @@ "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "mimic-fn": "^1.0.0" }, @@ -31728,6 +31940,8 @@ "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "onetime": "^2.0.0", "signal-exit": "^3.0.2" @@ -31741,7 +31955,9 @@ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true, - "license": "ISC" + "license": "ISC", + "optional": true, + "peer": true }, "node_modules/log-update/node_modules/string-width": { "version": "2.1.1", @@ -31749,6 +31965,8 @@ "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "is-fullwidth-code-point": "^2.0.0", "strip-ansi": "^4.0.0" @@ -31763,6 +31981,8 @@ "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "ansi-regex": "^3.0.0" }, @@ -31776,6 +31996,8 @@ "integrity": "sha512-iXR3tDXpbnTpzjKSylUJRkLuOrEC7hwEB221cgn6wtF8wpmz28puFXAEfPT5zrjM3wahygB//VuWEr1vTkDcNQ==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "string-width": "^2.1.1", "strip-ansi": "^4.0.0" @@ -32393,6 +32615,8 @@ "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": "*" } @@ -33147,6 +33371,8 @@ "integrity": "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=0.10.0" } @@ -34020,7 +34246,9 @@ "resolved": "https://registry.npmjs.org/ospath/-/ospath-1.2.2.tgz", "integrity": "sha512-o6E5qJV5zkAbIDNhGSIlyOhScKXgQrSRMilfph0clDfM0nEnBOlKlH4sWDmG95BW/CvwNz0vmm7dJVtU2KlMiA==", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "node_modules/own-keys": { "version": "1.0.1", @@ -34107,6 +34335,8 @@ "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=6" } @@ -34616,7 +34846,9 @@ "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "node_modules/perfect-debounce": { "version": "1.0.0", @@ -34630,7 +34862,9 @@ "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "node_modules/picocolors": { "version": "1.1.1", @@ -35549,6 +35783,8 @@ "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=6" }, @@ -35751,6 +35987,8 @@ "integrity": "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" @@ -35872,7 +36110,9 @@ "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.26.1.tgz", "integrity": "sha512-hLWjpy7EnsDBb0p+Z3B7rPi3GDeRG5ZtiI33kJhTt+ORCd38AbAIjB/9zRIUoeTbE/AVX5ZkU7m6bznsvrf8eQ==", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "node_modules/randombytes": { "version": "2.1.0", @@ -36385,6 +36625,8 @@ "integrity": "sha512-MnWzEHHaxHO2iWiQuHrUPBi/1WeBf5PkxQqNyNvLl9VAYSdXkP8tQ3pBSeCPD+yw0v0Aq1zosWLz0BdeXpWwZg==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "throttleit": "^1.0.0" } @@ -36395,6 +36637,8 @@ "integrity": "sha512-vDZpf9Chs9mAdfY046mcPt8fg5QSZr37hEH4TXYBnDF+izxgrbRGUAAaBvIk/fJm9aOFCGFd1EsNg5AZCbnQCQ==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "funding": { "url": "https://github.com/sponsors/sindresorhus" } @@ -36550,6 +36794,8 @@ "integrity": "sha512-reSjH4HuiFlxlaBaFCiS6O76ZGG2ygKoSlCsipKdaZuKSPx/+bt9mULkn4l0asVzbEfQQmXRg6Wp6gv6m0wElw==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "exit-hook": "^1.0.0", "onetime": "^1.0.0" @@ -36564,6 +36810,8 @@ "integrity": "sha512-GZ+g4jayMqzCRMgB2sol7GiCLjKfS1PINkjmx8spcKce1LiVqcbQreXwqs2YAFXC6R03VIG28ZS31t8M866v6A==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=0.10.0" } @@ -37938,6 +38186,8 @@ "integrity": "sha512-up04hB2hR92PgjpyU3y/eg91yIBILyjVY26NvvciY3EVVPjybkMszMpXQ9QAkcS3I5rtJBDLoTxxg+qvW8c7rw==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=0.10.0" } @@ -38151,6 +38401,8 @@ "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "asn1": "~0.2.3", "assert-plus": "^1.0.0", @@ -38176,14 +38428,18 @@ "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "node_modules/sshpk/node_modules/tweetnacl": { "version": "0.14.5", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", "dev": true, - "license": "Unlicense" + "license": "Unlicense", + "optional": true, + "peer": true }, "node_modules/ssri": { "version": "12.0.0", @@ -38856,6 +39112,8 @@ "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=0.10.0" } @@ -40026,6 +40284,8 @@ "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", "dev": true, "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "safe-buffer": "^5.0.1" }, @@ -40446,6 +40706,8 @@ "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=8" } @@ -40507,6 +40769,8 @@ "integrity": "sha512-oCwdVC7mTuWiPyjLUz/COz5TLk6wgp0RCsN+wHZ2Ekneac9w8uuV0njcbbie2ME+Vs+d6duwmYuR3HgQXs1fOg==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "punycode": "^1.4.1", "qs": "^6.12.3" @@ -40537,7 +40801,9 @@ "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "node_modules/url/node_modules/qs": { "version": "6.14.0", @@ -40545,6 +40811,8 @@ "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", "dev": true, "license": "BSD-3-Clause", + "optional": true, + "peer": true, "dependencies": { "side-channel": "^1.1.0" }, @@ -40684,6 +40952,8 @@ "node >=0.6.0" ], "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "assert-plus": "^1.0.0", "core-util-is": "1.0.2", @@ -40695,7 +40965,9 @@ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "node_modules/vite": { "version": "7.1.5", @@ -42211,6 +42483,8 @@ "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "buffer-crc32": "~0.2.3", "fd-slicer": "~1.1.0" diff --git a/package.json b/package.json index 654acdf61..85b1ed48b 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,6 @@ "affected:apps": "nx affected:apps", "affected:build": "nx affected:build", "affected:dep-graph": "nx affected:dep-graph", - "affected:e2e": "nx affected:e2e", "affected:libs": "nx affected:libs", "affected:lint": "nx affected:lint", "affected:test": "nx affected:test", @@ -27,7 +26,6 @@ "database:setup": "npm run database:push && npm run database:seed", "database:validate-schema": "prisma validate", "dep-graph": "nx dep-graph", - "e2e": "ng e2e", "extract-locales": "nx run client:extract-i18n --output-path ./apps/client/src/locales", "format": "nx format:write", "format:check": "nx format:check", @@ -155,7 +153,6 @@ "@nestjs/schematics": "11.0.9", "@nestjs/testing": "11.1.8", "@nx/angular": "21.5.1", - "@nx/cypress": "21.5.1", "@nx/eslint-plugin": "21.5.1", "@nx/jest": "21.5.1", "@nx/js": "21.5.1", @@ -178,10 +175,8 @@ "@types/passport-google-oauth20": "2.0.16", "@typescript-eslint/eslint-plugin": "8.43.0", "@typescript-eslint/parser": "8.43.0", - "cypress": "6.2.1", "eslint": "9.35.0", "eslint-config-prettier": "10.1.8", - "eslint-plugin-cypress": "4.2.0", "eslint-plugin-import": "2.32.0", "eslint-plugin-storybook": "9.1.5", "husky": "9.1.7", From 1d011747c729607a21eabe70ba7ac691e67d05fa Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Sat, 29 Nov 2025 16:54:05 +0100 Subject: [PATCH 03/31] Task/improve usability of actions in various tables (#5992) * Improve usability of actions --- .../access-table/access-table.component.html | 2 +- .../app/components/admin-jobs/admin-jobs.html | 6 ++++-- .../admin-market-data/admin-market-data.html | 2 +- .../admin-platform.component.html | 2 +- .../admin-tag/admin-tag.component.html | 2 +- .../components/admin-users/admin-users.html | 4 +++- .../accounts-table.component.html | 6 +++--- .../activities-table.component.html | 18 +++++++++++------- 8 files changed, 25 insertions(+), 17 deletions(-) diff --git a/apps/client/src/app/components/access-table/access-table.component.html b/apps/client/src/app/components/access-table/access-table.component.html index abeda6de8..cb41904d3 100644 --- a/apps/client/src/app/components/access-table/access-table.component.html +++ b/apps/client/src/app/components/access-table/access-table.component.html @@ -73,7 +73,7 @@ } diff --git a/apps/client/src/app/components/admin-jobs/admin-jobs.html b/apps/client/src/app/components/admin-jobs/admin-jobs.html index 14f1b211b..a82294001 100644 --- a/apps/client/src/app/components/admin-jobs/admin-jobs.html +++ b/apps/client/src/app/components/admin-jobs/admin-jobs.html @@ -205,14 +205,16 @@
diff --git a/apps/client/src/app/components/admin-tag/admin-tag.component.html b/apps/client/src/app/components/admin-tag/admin-tag.component.html index 8b1b510d7..86377c937 100644 --- a/apps/client/src/app/components/admin-tag/admin-tag.component.html +++ b/apps/client/src/app/components/admin-tag/admin-tag.component.html @@ -64,7 +64,7 @@
diff --git a/apps/client/src/app/components/admin-users/admin-users.html b/apps/client/src/app/components/admin-users/admin-users.html index e802e3272..eb63f8aa6 100644 --- a/apps/client/src/app/components/admin-users/admin-users.html +++ b/apps/client/src/app/components/admin-users/admin-users.html @@ -222,7 +222,9 @@ > - View Details + View Details... @if (hasPermissionToImpersonateAllUsers) { diff --git a/libs/ui/src/lib/accounts-table/accounts-table.component.html b/libs/ui/src/lib/accounts-table/accounts-table.component.html index c5ebaa657..d127b4bf3 100644 --- a/libs/ui/src/lib/accounts-table/accounts-table.component.html +++ b/libs/ui/src/lib/accounts-table/accounts-table.component.html @@ -7,7 +7,7 @@ (click)="onTransferBalance()" > - Transfer Cash Balance... + Transfer Cash Balance... } @@ -304,13 +304,13 @@
diff --git a/libs/ui/src/lib/activities-table/activities-table.component.html b/libs/ui/src/lib/activities-table/activities-table.component.html index e9bebaa16..b8e1882d4 100644 --- a/libs/ui/src/lib/activities-table/activities-table.component.html +++ b/libs/ui/src/lib/activities-table/activities-table.component.html @@ -6,7 +6,7 @@ (click)="onImport()" > - Import Activities... + Import Activities... @if (hasPermissionToExportActivities) { @if (hasPermissionToExportActivities) { @@ -379,7 +379,9 @@ > - Import Activities... + Import Activities... } @@ -391,7 +393,9 @@ > - Import Dividends... + Import Dividends... } @@ -443,20 +447,20 @@ } - - - - } -
-
-
Membership
-
{{ name }}
+
+ diff --git a/libs/ui/src/lib/membership-card/membership-card.component.scss b/libs/ui/src/lib/membership-card/membership-card.component.scss index 270adc0f1..fcd923f12 100644 --- a/libs/ui/src/lib/membership-card/membership-card.component.scss +++ b/libs/ui/src/lib/membership-card/membership-card.component.scss @@ -1,71 +1,231 @@ :host { --borderRadius: 1rem; --borderWidth: 2px; + --hover3dSpotlightOpacity: 0.2; display: block; max-width: 25rem; padding-top: calc(1 * var(--borderWidth)); width: 100%; - .card-container { - border-radius: var(--borderRadius); - box-shadow: 0 5px 15px rgba(0, 0, 0, 0.15); + .card-wrapper { + &.hover-3d { + perspective: 1000px; + } - &:after { - animation: animatedborder 7s ease alternate infinite; - background: linear-gradient(60deg, #5073b8, #1098ad, #07b39b, #6fba82); - background-size: 300% 300%; + .card-container { border-radius: var(--borderRadius); - content: ''; - height: calc(100% + var(--borderWidth) * 2); - left: calc(-1 * var(--borderWidth)); - top: calc(-1 * var(--borderWidth)); - position: absolute; - width: calc(100% + var(--borderWidth) * 2); - z-index: -1; - - @keyframes animatedborder { - 0% { - background-position: 0% 50%; + box-shadow: 0 5px 15px rgba(0, 0, 0, 0.15); + + .card-item { + aspect-ratio: 1.586; + background-color: #1d2124; + border-radius: calc(var(--borderRadius) - var(--borderWidth)); + color: rgba(var(--light-primary-text)); + line-height: 1.2; + + button { + color: rgba(var(--light-primary-text)); + height: 1.5rem; + z-index: 3; } - 50% { - background-position: 100% 50%; + + .heading { + font-size: 13px; } - 100% { - background-position: 0% 50%; + + .value { + font-size: 18px; + } + } + + &:not(.premium) { + &::after { + opacity: 0; + } + + .card-item { + background-color: #ffffff; + color: rgba(var(--dark-primary-text)); } } } - .card-item { - aspect-ratio: 1.586; - background-color: #1d2124; - border-radius: calc(var(--borderRadius) - var(--borderWidth)); - color: rgba(var(--light-primary-text)); - line-height: 1.2; + &.hover-3d { + --hover3d-rotate-x: 0; + --hover3d-rotate-y: 0; + --hover3d-shine: 100% 100%; - button { - color: rgba(var(--light-primary-text)); - height: 1.5rem; + .card-container { + overflow: hidden; + position: relative; + scale: 1; + transform: rotate3d( + var(--hover3d-rotate-x), + var(--hover3d-rotate-y), + 0, + 10deg + ); + transform-style: preserve-3d; + transition: + box-shadow 400ms ease-out, + scale 500ms ease-out, + transform 500ms ease-out; + will-change: transform, scale; + + &::before { + background-image: radial-gradient( + circle at 50%, + rgba(255, 255, 255, var(--hover3dSpotlightOpacity)) 10%, + transparent 50% + ); + content: ''; + filter: blur(0.75rem); + height: 33.333%; + opacity: 0; + pointer-events: none; + position: absolute; + scale: 500%; + translate: var(--hover3d-shine); + transition: + opacity 400ms ease-out, + translate 400ms ease-out; + width: 33.333%; + z-index: 1; + } + + .card-item { + position: relative; + + .hover-zone { + height: 33.333%; + width: 33.333%; + z-index: 2; + + &:nth-child(1) { + left: 0; + top: 0; + } + + &:nth-child(2) { + left: 33.333%; + top: 0; + } + + &:nth-child(3) { + right: 0; + top: 0; + } + + &:nth-child(4) { + left: 0; + top: 33.333%; + } + + &:nth-child(5) { + left: 33.333%; + top: 33.333%; + } + + &:nth-child(6) { + right: 0; + top: 33.333%; + } + + &:nth-child(7) { + bottom: 0; + left: 0; + } + + &:nth-child(8) { + bottom: 0; + left: 33.333%; + } + + &:nth-child(9) { + bottom: 0; + right: 0; + } + } + } } - .heading { - font-size: 13px; + &:has(.hover-zone:hover) .card-container { + box-shadow: 0 18px 40px rgba(15, 23, 42, 0.3); + scale: 1.05; + + &::before { + opacity: 1; + } } - .value { - font-size: 18px; + &:has(.hover-zone:nth-child(1):hover) { + --hover3d-rotate-x: 1; + --hover3d-rotate-y: -1; + --hover3d-shine: 0% 0%; } - } - &:not(.premium) { - &:after { - opacity: 0; + &:has(.hover-zone:nth-child(2):hover) { + --hover3d-rotate-x: 1; + --hover3d-rotate-y: 0; + --hover3d-shine: 100% 0%; } - .card-item { - background-color: #ffffff; - color: rgba(var(--dark-primary-text)); + &:has(.hover-zone:nth-child(3):hover) { + --hover3d-rotate-x: 1; + --hover3d-rotate-y: 1; + --hover3d-shine: 200% 0%; + } + + &:has(.hover-zone:nth-child(4):hover) { + --hover3d-rotate-x: 0; + --hover3d-rotate-y: -1; + --hover3d-shine: 0% 100%; + } + + &:has(.hover-zone:nth-child(5):hover) { + --hover3d-rotate-x: 0; + --hover3d-rotate-y: 0; + --hover3d-shine: 100% 100%; + } + + &:has(.hover-zone:nth-child(6):hover) { + --hover3d-rotate-x: 0; + --hover3d-rotate-y: 1; + --hover3d-shine: 200% 100%; + } + + &:has(.hover-zone:nth-child(7):hover) { + --hover3d-rotate-x: -1; + --hover3d-rotate-y: -1; + --hover3d-shine: 0% 200%; + } + + &:has(.hover-zone:nth-child(8):hover) { + --hover3d-rotate-x: -1; + --hover3d-rotate-y: 0; + --hover3d-shine: 100% 200%; + } + + &:has(.hover-zone:nth-child(9):hover) { + --hover3d-rotate-x: -1; + --hover3d-rotate-y: 1; + --hover3d-shine: 200% 200%; + } + } + } + + @media (prefers-reduced-motion: reduce) { + .card-wrapper.hover-3d { + .card-container { + scale: 1 !important; + transform: none !important; + transition: none !important; + + &::before { + opacity: 0 !important; + transition: none !important; + } } } } diff --git a/libs/ui/src/lib/membership-card/membership-card.component.stories.ts b/libs/ui/src/lib/membership-card/membership-card.component.stories.ts index 6b6fbe038..0d475bda7 100644 --- a/libs/ui/src/lib/membership-card/membership-card.component.stories.ts +++ b/libs/ui/src/lib/membership-card/membership-card.component.stories.ts @@ -26,6 +26,9 @@ export default { }) ], argTypes: { + hover3d: { + control: { type: 'boolean' } + }, name: { control: { type: 'select' }, options: ['Basic', 'Premium'] @@ -37,6 +40,7 @@ type Story = StoryObj; export const Basic: Story = { args: { + hover3d: false, name: 'Basic' } }; @@ -45,6 +49,7 @@ export const Premium: Story = { args: { expiresAt: addYears(new Date(), 1).toLocaleDateString(), hasPermissionToCreateApiKey: true, + hover3d: false, name: 'Premium' } }; diff --git a/libs/ui/src/lib/membership-card/membership-card.component.ts b/libs/ui/src/lib/membership-card/membership-card.component.ts index 175a94f42..be223758d 100644 --- a/libs/ui/src/lib/membership-card/membership-card.component.ts +++ b/libs/ui/src/lib/membership-card/membership-card.component.ts @@ -34,6 +34,7 @@ import { GfLogoComponent } from '../logo'; export class GfMembershipCardComponent { @Input() public expiresAt: string; @Input() public hasPermissionToCreateApiKey: boolean; + @Input() public hover3d = false; @Input() public name: string; @Output() generateApiKeyClicked = new EventEmitter(); From 4cd16c33f884a5a9dc2e98e56b85cf83a4b1e7bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Germ=C3=A1n=20Mart=C3=ADn?= Date: Sun, 7 Dec 2025 10:04:20 +0100 Subject: [PATCH 24/31] Feature/OIDC authentication (#5981) * Set up OIDC authentication * Update changelog --- CHANGELOG.md | 5 +- apps/api/src/app/auth/auth.controller.ts | 48 ++++++-- apps/api/src/app/auth/auth.module.ts | 82 ++++++++++++- apps/api/src/app/auth/auth.service.ts | 36 +++--- .../api/src/app/auth/interfaces/interfaces.ts | 19 +++ apps/api/src/app/auth/oidc-state.store.ts | 114 ++++++++++++++++++ apps/api/src/app/auth/oidc.strategy.ts | 69 +++++++++++ apps/api/src/app/info/info.service.ts | 4 + .../configuration/configuration.service.ts | 26 +++- .../interfaces/environment.interface.ts | 9 ++ .../app/components/header/header.component.ts | 7 ++ .../interfaces/interfaces.ts | 1 + .../login-with-access-token-dialog.html | 11 ++ libs/common/src/lib/permissions.ts | 2 + package-lock.json | 43 +++++++ package.json | 2 + .../migration.sql | 2 + prisma/schema.prisma | 1 + 18 files changed, 447 insertions(+), 34 deletions(-) create mode 100644 apps/api/src/app/auth/oidc-state.store.ts create mode 100644 apps/api/src/app/auth/oidc.strategy.ts create mode 100644 prisma/migrations/20251103162035_added_oidc_to_provider/migration.sql diff --git a/CHANGELOG.md b/CHANGELOG.md index 878d90326..7b3f93910 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,12 +7,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## Unreleased -#### Added +### Added - Introduced data source transformation support in the import functionality for self-hosted environments +- Added _OpenID Connect_ (`OIDC`) as a new login provider for self-hosted environments (experimental) - Added an optional 3D hover effect to the membership card component -#### Changed +### Changed - Increased the numerical precision for cryptocurrency quantities in the holding detail dialog - Upgraded `envalid` from version `8.1.0` to `8.1.1` diff --git a/apps/api/src/app/auth/auth.controller.ts b/apps/api/src/app/auth/auth.controller.ts index b45e7b97b..388f1dbd3 100644 --- a/apps/api/src/app/auth/auth.controller.ts +++ b/apps/api/src/app/auth/auth.controller.ts @@ -84,7 +84,6 @@ export class AuthController { @Req() request: Request, @Res() response: Response ) { - // Handles the Google OAuth2 callback const jwt: string = (request.user as any).jwt; if (jwt) { @@ -102,6 +101,46 @@ export class AuthController { } } + @Get('oidc') + @UseGuards(AuthGuard('oidc')) + @Version(VERSION_NEUTRAL) + public oidcLogin() { + if (!this.configurationService.get('ENABLE_FEATURE_AUTH_OIDC')) { + throw new HttpException( + getReasonPhrase(StatusCodes.FORBIDDEN), + StatusCodes.FORBIDDEN + ); + } + } + + @Get('oidc/callback') + @UseGuards(AuthGuard('oidc')) + @Version(VERSION_NEUTRAL) + public oidcLoginCallback(@Req() request: Request, @Res() response: Response) { + const jwt: string = (request.user as any).jwt; + + if (jwt) { + response.redirect( + `${this.configurationService.get( + 'ROOT_URL' + )}/${DEFAULT_LANGUAGE_CODE}/auth/${jwt}` + ); + } else { + response.redirect( + `${this.configurationService.get( + 'ROOT_URL' + )}/${DEFAULT_LANGUAGE_CODE}/auth` + ); + } + } + + @Post('webauthn/generate-authentication-options') + public async generateAuthenticationOptions( + @Body() body: { deviceId: string } + ) { + return this.webAuthService.generateAuthenticationOptions(body.deviceId); + } + @Get('webauthn/generate-registration-options') @UseGuards(AuthGuard('jwt'), HasPermissionGuard) public async generateRegistrationOptions() { @@ -116,13 +155,6 @@ export class AuthController { return this.webAuthService.verifyAttestation(body.credential); } - @Post('webauthn/generate-authentication-options') - public async generateAuthenticationOptions( - @Body() body: { deviceId: string } - ) { - return this.webAuthService.generateAuthenticationOptions(body.deviceId); - } - @Post('webauthn/verify-authentication') public async verifyAuthentication( @Body() body: { deviceId: string; credential: AssertionCredentialJSON } diff --git a/apps/api/src/app/auth/auth.module.ts b/apps/api/src/app/auth/auth.module.ts index 824c432b1..9fc5d0925 100644 --- a/apps/api/src/app/auth/auth.module.ts +++ b/apps/api/src/app/auth/auth.module.ts @@ -4,17 +4,20 @@ import { SubscriptionModule } from '@ghostfolio/api/app/subscription/subscriptio import { UserModule } from '@ghostfolio/api/app/user/user.module'; import { ApiKeyService } from '@ghostfolio/api/services/api-key/api-key.service'; import { ConfigurationModule } from '@ghostfolio/api/services/configuration/configuration.module'; +import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; import { PrismaModule } from '@ghostfolio/api/services/prisma/prisma.module'; import { PropertyModule } from '@ghostfolio/api/services/property/property.module'; -import { Module } from '@nestjs/common'; +import { Logger, Module } from '@nestjs/common'; import { JwtModule } from '@nestjs/jwt'; +import type { StrategyOptions } from 'passport-openidconnect'; import { ApiKeyStrategy } from './api-key.strategy'; import { AuthController } from './auth.controller'; import { AuthService } from './auth.service'; import { GoogleStrategy } from './google.strategy'; import { JwtStrategy } from './jwt.strategy'; +import { OidcStrategy } from './oidc.strategy'; @Module({ controllers: [AuthController], @@ -36,6 +39,83 @@ import { JwtStrategy } from './jwt.strategy'; AuthService, GoogleStrategy, JwtStrategy, + { + inject: [AuthService, ConfigurationService], + provide: OidcStrategy, + useFactory: async ( + authService: AuthService, + configurationService: ConfigurationService + ) => { + const isOidcEnabled = configurationService.get( + 'ENABLE_FEATURE_AUTH_OIDC' + ); + + if (!isOidcEnabled) { + return null; + } + + const issuer = configurationService.get('OIDC_ISSUER'); + const scope = configurationService.get('OIDC_SCOPE'); + + const callbackUrl = + configurationService.get('OIDC_CALLBACK_URL') || + `${configurationService.get('ROOT_URL')}/api/auth/oidc/callback`; + + // Check for manual URL overrides + const manualAuthorizationUrl = configurationService.get( + 'OIDC_AUTHORIZATION_URL' + ); + const manualTokenUrl = configurationService.get('OIDC_TOKEN_URL'); + const manualUserInfoUrl = + configurationService.get('OIDC_USER_INFO_URL'); + + let authorizationURL: string; + let tokenURL: string; + let userInfoURL: string; + + if (manualAuthorizationUrl && manualTokenUrl && manualUserInfoUrl) { + // Use manual URLs + authorizationURL = manualAuthorizationUrl; + tokenURL = manualTokenUrl; + userInfoURL = manualUserInfoUrl; + } else { + // Fetch OIDC configuration from discovery endpoint + try { + const response = await fetch( + `${issuer}/.well-known/openid-configuration` + ); + + const config = (await response.json()) as { + authorization_endpoint: string; + token_endpoint: string; + userinfo_endpoint: string; + }; + + // Manual URLs take priority over discovered ones + authorizationURL = + manualAuthorizationUrl || config.authorization_endpoint; + tokenURL = manualTokenUrl || config.token_endpoint; + userInfoURL = manualUserInfoUrl || config.userinfo_endpoint; + } catch (error) { + Logger.error(error, 'OidcStrategy'); + throw new Error('Failed to fetch OIDC configuration from issuer'); + } + } + + const options: StrategyOptions = { + authorizationURL, + issuer, + scope, + tokenURL, + userInfoURL, + callbackURL: callbackUrl, + clientID: configurationService.get('OIDC_CLIENT_ID'), + clientSecret: configurationService.get('OIDC_CLIENT_SECRET') + }; + + return new OidcStrategy(authService, options); + } + }, WebAuthService ] }) diff --git a/apps/api/src/app/auth/auth.service.ts b/apps/api/src/app/auth/auth.service.ts index a6ee5d260..6fe50dce0 100644 --- a/apps/api/src/app/auth/auth.service.ts +++ b/apps/api/src/app/auth/auth.service.ts @@ -17,30 +17,22 @@ export class AuthService { ) {} public async validateAnonymousLogin(accessToken: string): Promise { - return new Promise(async (resolve, reject) => { - try { - const hashedAccessToken = this.userService.createAccessToken({ - password: accessToken, - salt: this.configurationService.get('ACCESS_TOKEN_SALT') - }); + const hashedAccessToken = this.userService.createAccessToken({ + password: accessToken, + salt: this.configurationService.get('ACCESS_TOKEN_SALT') + }); - const [user] = await this.userService.users({ - where: { accessToken: hashedAccessToken } - }); + const [user] = await this.userService.users({ + where: { accessToken: hashedAccessToken } + }); - if (user) { - const jwt = this.jwtService.sign({ - id: user.id - }); + if (user) { + return this.jwtService.sign({ + id: user.id + }); + } - resolve(jwt); - } else { - throw new Error(); - } - } catch { - reject(); - } - }); + throw new Error(); } public async validateOAuthLogin({ @@ -75,7 +67,7 @@ export class AuthService { } catch (error) { throw new InternalServerErrorException( 'validateOAuthLogin', - error.message + error instanceof Error ? error.message : 'Unknown error' ); } } diff --git a/apps/api/src/app/auth/interfaces/interfaces.ts b/apps/api/src/app/auth/interfaces/interfaces.ts index 4fdcc25b5..7ddfe41d2 100644 --- a/apps/api/src/app/auth/interfaces/interfaces.ts +++ b/apps/api/src/app/auth/interfaces/interfaces.ts @@ -6,6 +6,25 @@ export interface AuthDeviceDialogParams { authDevice: AuthDeviceDto; } +export interface OidcContext { + claims?: { + sub?: string; + }; +} + +export interface OidcIdToken { + sub?: string; +} + +export interface OidcParams { + sub?: string; +} + +export interface OidcProfile { + id?: string; + sub?: string; +} + export interface ValidateOAuthLoginParams { provider: Provider; thirdPartyId: string; diff --git a/apps/api/src/app/auth/oidc-state.store.ts b/apps/api/src/app/auth/oidc-state.store.ts new file mode 100644 index 000000000..653451166 --- /dev/null +++ b/apps/api/src/app/auth/oidc-state.store.ts @@ -0,0 +1,114 @@ +import ms from 'ms'; + +/** + * Custom state store for OIDC authentication that doesn't rely on express-session. + * This store manages OAuth2 state parameters in memory with automatic cleanup. + */ +export class OidcStateStore { + private readonly STATE_EXPIRY_MS = ms('10 minutes'); + + private stateMap = new Map< + string, + { + appState?: unknown; + ctx: { issued?: Date; maxAge?: number; nonce?: string }; + meta?: unknown; + timestamp: number; + } + >(); + + /** + * Store request state. + * Signature matches passport-openidconnect SessionStore + */ + public store( + _req: unknown, + _meta: unknown, + appState: unknown, + ctx: { maxAge?: number; nonce?: string; issued?: Date }, + callback: (err: Error | null, handle?: string) => void + ) { + try { + // Generate a unique handle for this state + const handle = this.generateHandle(); + + this.stateMap.set(handle, { + appState, + ctx, + meta: _meta, + timestamp: Date.now() + }); + + // Clean up expired states + this.cleanup(); + + callback(null, handle); + } catch (error) { + callback(error as Error); + } + } + + /** + * Verify request state. + * Signature matches passport-openidconnect SessionStore + */ + public verify( + _req: unknown, + handle: string, + callback: ( + err: Error | null, + appState?: unknown, + ctx?: { maxAge?: number; nonce?: string; issued?: Date } + ) => void + ) { + try { + const data = this.stateMap.get(handle); + + if (!data) { + return callback(null, undefined, undefined); + } + + if (Date.now() - data.timestamp > this.STATE_EXPIRY_MS) { + // State has expired + this.stateMap.delete(handle); + return callback(null, undefined, undefined); + } + + // Remove state after verification (one-time use) + this.stateMap.delete(handle); + + callback(null, data.ctx, data.appState); + } catch (error) { + callback(error as Error); + } + } + + /** + * Clean up expired states + */ + private cleanup() { + const now = Date.now(); + const expiredKeys: string[] = []; + + for (const [key, value] of this.stateMap.entries()) { + if (now - value.timestamp > this.STATE_EXPIRY_MS) { + expiredKeys.push(key); + } + } + + for (const key of expiredKeys) { + this.stateMap.delete(key); + } + } + + /** + * Generate a cryptographically secure random handle + */ + private generateHandle() { + return ( + Math.random().toString(36).substring(2, 15) + + Math.random().toString(36).substring(2, 15) + + Date.now().toString(36) + ); + } +} diff --git a/apps/api/src/app/auth/oidc.strategy.ts b/apps/api/src/app/auth/oidc.strategy.ts new file mode 100644 index 000000000..96b284121 --- /dev/null +++ b/apps/api/src/app/auth/oidc.strategy.ts @@ -0,0 +1,69 @@ +import { Injectable, Logger } from '@nestjs/common'; +import { PassportStrategy } from '@nestjs/passport'; +import { Provider } from '@prisma/client'; +import { Request } from 'express'; +import { Strategy, type StrategyOptions } from 'passport-openidconnect'; + +import { AuthService } from './auth.service'; +import { + OidcContext, + OidcIdToken, + OidcParams, + OidcProfile +} from './interfaces/interfaces'; +import { OidcStateStore } from './oidc-state.store'; + +@Injectable() +export class OidcStrategy extends PassportStrategy(Strategy, 'oidc') { + private static readonly stateStore = new OidcStateStore(); + + public constructor( + private readonly authService: AuthService, + options: StrategyOptions + ) { + super({ + ...options, + passReqToCallback: true, + store: OidcStrategy.stateStore + }); + } + + public async validate( + _request: Request, + issuer: string, + profile: OidcProfile, + context: OidcContext, + idToken: OidcIdToken, + _accessToken: string, + _refreshToken: string, + params: OidcParams + ) { + try { + const thirdPartyId = + profile?.id ?? + profile?.sub ?? + idToken?.sub ?? + params?.sub ?? + context?.claims?.sub; + + const jwt = await this.authService.validateOAuthLogin({ + thirdPartyId, + provider: Provider.OIDC + }); + + if (!thirdPartyId) { + Logger.error( + `Missing subject identifier in OIDC response from ${issuer}`, + 'OidcStrategy' + ); + + throw new Error('Missing subject identifier in OIDC response'); + } + + return { jwt }; + } catch (error) { + Logger.error(error, 'OidcStrategy'); + throw error; + } + } +} diff --git a/apps/api/src/app/info/info.service.ts b/apps/api/src/app/info/info.service.ts index 634fc959c..3802e3ef4 100644 --- a/apps/api/src/app/info/info.service.ts +++ b/apps/api/src/app/info/info.service.ts @@ -55,6 +55,10 @@ export class InfoService { globalPermissions.push(permissions.enableAuthGoogle); } + if (this.configurationService.get('ENABLE_FEATURE_AUTH_OIDC')) { + globalPermissions.push(permissions.enableAuthOidc); + } + if (this.configurationService.get('ENABLE_FEATURE_AUTH_TOKEN')) { globalPermissions.push(permissions.enableAuthToken); } diff --git a/apps/api/src/services/configuration/configuration.service.ts b/apps/api/src/services/configuration/configuration.service.ts index f37189569..a91aa6e69 100644 --- a/apps/api/src/services/configuration/configuration.service.ts +++ b/apps/api/src/services/configuration/configuration.service.ts @@ -41,6 +41,7 @@ export class ConfigurationService { default: [] }), ENABLE_FEATURE_AUTH_GOOGLE: bool({ default: false }), + ENABLE_FEATURE_AUTH_OIDC: bool({ default: false }), ENABLE_FEATURE_AUTH_TOKEN: bool({ default: true }), ENABLE_FEATURE_FEAR_AND_GREED_INDEX: bool({ default: false }), ENABLE_FEATURE_GATHER_NEW_EXCHANGE_RATES: bool({ default: true }), @@ -54,9 +55,32 @@ export class ConfigurationService { GOOGLE_SHEETS_ID: str({ default: '' }), GOOGLE_SHEETS_PRIVATE_KEY: str({ default: '' }), HOST: host({ default: DEFAULT_HOST }), - JWT_SECRET_KEY: str({}), + JWT_SECRET_KEY: str(), MAX_ACTIVITIES_TO_IMPORT: num({ default: Number.MAX_SAFE_INTEGER }), MAX_CHART_ITEMS: num({ default: 365 }), + OIDC_AUTHORIZATION_URL: str({ default: '' }), + OIDC_CALLBACK_URL: str({ default: '' }), + OIDC_CLIENT_ID: str({ + default: undefined, + requiredWhen: (env) => { + return env.ENABLE_FEATURE_AUTH_OIDC === true; + } + }), + OIDC_CLIENT_SECRET: str({ + default: undefined, + requiredWhen: (env) => { + return env.ENABLE_FEATURE_AUTH_OIDC === true; + } + }), + OIDC_ISSUER: str({ + default: undefined, + requiredWhen: (env) => { + return env.ENABLE_FEATURE_AUTH_OIDC === true; + } + }), + OIDC_SCOPE: json({ default: ['openid'] }), + OIDC_TOKEN_URL: str({ default: '' }), + OIDC_USER_INFO_URL: str({ default: '' }), PORT: port({ default: DEFAULT_PORT }), PROCESSOR_GATHER_ASSET_PROFILE_CONCURRENCY: num({ default: DEFAULT_PROCESSOR_GATHER_ASSET_PROFILE_CONCURRENCY diff --git a/apps/api/src/services/interfaces/environment.interface.ts b/apps/api/src/services/interfaces/environment.interface.ts index 3a2ac687c..3c03744f1 100644 --- a/apps/api/src/services/interfaces/environment.interface.ts +++ b/apps/api/src/services/interfaces/environment.interface.ts @@ -17,6 +17,7 @@ export interface Environment extends CleanedEnvAccessors { DATA_SOURCES: string[]; DATA_SOURCES_GHOSTFOLIO_DATA_PROVIDER: string[]; ENABLE_FEATURE_AUTH_GOOGLE: boolean; + ENABLE_FEATURE_AUTH_OIDC: boolean; ENABLE_FEATURE_AUTH_TOKEN: boolean; ENABLE_FEATURE_FEAR_AND_GREED_INDEX: boolean; ENABLE_FEATURE_GATHER_NEW_EXCHANGE_RATES: boolean; @@ -32,6 +33,14 @@ export interface Environment extends CleanedEnvAccessors { JWT_SECRET_KEY: string; MAX_ACTIVITIES_TO_IMPORT: number; MAX_CHART_ITEMS: number; + OIDC_AUTHORIZATION_URL: string; + OIDC_CALLBACK_URL: string; + OIDC_CLIENT_ID: string; + OIDC_CLIENT_SECRET: string; + OIDC_ISSUER: string; + OIDC_SCOPE: string[]; + OIDC_TOKEN_URL: string; + OIDC_USER_INFO_URL: string; PORT: number; PROCESSOR_GATHER_ASSET_PROFILE_CONCURRENCY: number; PROCESSOR_GATHER_HISTORICAL_MARKET_DATA_CONCURRENCY: number; diff --git a/apps/client/src/app/components/header/header.component.ts b/apps/client/src/app/components/header/header.component.ts index 9fb9a8351..80239d56f 100644 --- a/apps/client/src/app/components/header/header.component.ts +++ b/apps/client/src/app/components/header/header.component.ts @@ -105,6 +105,7 @@ export class GfHeaderComponent implements OnChanges { public hasFilters: boolean; public hasImpersonationId: boolean; public hasPermissionForAuthGoogle: boolean; + public hasPermissionForAuthOidc: boolean; public hasPermissionForAuthToken: boolean; public hasPermissionForSubscription: boolean; public hasPermissionToAccessAdminControl: boolean; @@ -170,6 +171,11 @@ export class GfHeaderComponent implements OnChanges { permissions.enableAuthGoogle ); + this.hasPermissionForAuthOidc = hasPermission( + this.info?.globalPermissions, + permissions.enableAuthOidc + ); + this.hasPermissionForAuthToken = hasPermission( this.info?.globalPermissions, permissions.enableAuthToken @@ -286,6 +292,7 @@ export class GfHeaderComponent implements OnChanges { data: { accessToken: '', hasPermissionToUseAuthGoogle: this.hasPermissionForAuthGoogle, + hasPermissionToUseAuthOidc: this.hasPermissionForAuthOidc, hasPermissionToUseAuthToken: this.hasPermissionForAuthToken, title: $localize`Sign in` }, diff --git a/apps/client/src/app/components/login-with-access-token-dialog/interfaces/interfaces.ts b/apps/client/src/app/components/login-with-access-token-dialog/interfaces/interfaces.ts index c7c4ab3fd..e9222e142 100644 --- a/apps/client/src/app/components/login-with-access-token-dialog/interfaces/interfaces.ts +++ b/apps/client/src/app/components/login-with-access-token-dialog/interfaces/interfaces.ts @@ -1,6 +1,7 @@ export interface LoginWithAccessTokenDialogParams { accessToken: string; hasPermissionToUseAuthGoogle: boolean; + hasPermissionToUseAuthOidc: boolean; hasPermissionToUseAuthToken: boolean; title: string; } diff --git a/apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html b/apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html index bc232cfb7..cf5611ef7 100644 --- a/apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html +++ b/apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html @@ -45,6 +45,17 @@ >
} + + @if (data.hasPermissionToUseAuthOidc) { + + }
diff --git a/libs/common/src/lib/permissions.ts b/libs/common/src/lib/permissions.ts index 597c27690..2e244568c 100644 --- a/libs/common/src/lib/permissions.ts +++ b/libs/common/src/lib/permissions.ts @@ -29,6 +29,7 @@ export const permissions = { deleteUser: 'deleteUser', deleteWatchlistItem: 'deleteWatchlistItem', enableAuthGoogle: 'enableAuthGoogle', + enableAuthOidc: 'enableAuthOidc', enableAuthToken: 'enableAuthToken', enableDataProviderGhostfolio: 'enableDataProviderGhostfolio', enableFearAndGreedIndex: 'enableFearAndGreedIndex', @@ -159,6 +160,7 @@ export function filterGlobalPermissions( return globalPermissions.filter((permission) => { return ( permission !== permissions.enableAuthGoogle && + permission !== permissions.enableAuthOidc && permission !== permissions.enableSubscription ); }); diff --git a/package-lock.json b/package-lock.json index 6a3829a1d..faa39e722 100644 --- a/package-lock.json +++ b/package-lock.json @@ -83,6 +83,7 @@ "passport-google-oauth20": "2.0.0", "passport-headerapikey": "1.2.2", "passport-jwt": "4.0.1", + "passport-openidconnect": "0.1.2", "reflect-metadata": "0.2.2", "rxjs": "7.8.1", "stripe": "18.5.0", @@ -129,6 +130,7 @@ "@types/node": "22.15.17", "@types/papaparse": "5.3.7", "@types/passport-google-oauth20": "2.0.16", + "@types/passport-openidconnect": "0.1.3", "@typescript-eslint/eslint-plugin": "8.43.0", "@typescript-eslint/parser": "8.43.0", "eslint": "9.35.0", @@ -14502,6 +14504,30 @@ "@types/passport": "*" } }, + "node_modules/@types/passport-openidconnect": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@types/passport-openidconnect/-/passport-openidconnect-0.1.3.tgz", + "integrity": "sha512-k1Ni7bG/9OZNo2Qpjg2W6GajL+pww6ZPaNWMXfpteCX4dXf4QgaZLt2hjR5IiPrqwBT9+W8KjCTJ/uhGIoBx/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/express": "*", + "@types/oauth": "*", + "@types/passport": "*", + "@types/passport-strategy": "*" + } + }, + "node_modules/@types/passport-strategy": { + "version": "0.2.38", + "resolved": "https://registry.npmjs.org/@types/passport-strategy/-/passport-strategy-0.2.38.tgz", + "integrity": "sha512-GC6eMqqojOooq993Tmnmp7AUTbbQSgilyvpCYQjT+H6JfG/g6RGc7nXEniZlp0zyKJ0WUdOiZWLBZft9Yug1uA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/express": "*", + "@types/passport": "*" + } + }, "node_modules/@types/qs": { "version": "6.14.0", "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz", @@ -34723,6 +34749,23 @@ "url": "https://github.com/sponsors/jaredhanson" } }, + "node_modules/passport-openidconnect": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/passport-openidconnect/-/passport-openidconnect-0.1.2.tgz", + "integrity": "sha512-JX3rTyW+KFZ/E9OF/IpXJPbyLO9vGzcmXB5FgSP2jfL3LGKJPdV7zUE8rWeKeeI/iueQggOeFa3onrCmhxXZTg==", + "license": "MIT", + "dependencies": { + "oauth": "0.10.x", + "passport-strategy": "1.x.x" + }, + "engines": { + "node": ">= 0.6.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/jaredhanson" + } + }, "node_modules/passport-strategy": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/passport-strategy/-/passport-strategy-1.0.0.tgz", diff --git a/package.json b/package.json index 5dae615b8..843091424 100644 --- a/package.json +++ b/package.json @@ -127,6 +127,7 @@ "passport-google-oauth20": "2.0.0", "passport-headerapikey": "1.2.2", "passport-jwt": "4.0.1", + "passport-openidconnect": "0.1.2", "reflect-metadata": "0.2.2", "rxjs": "7.8.1", "stripe": "18.5.0", @@ -173,6 +174,7 @@ "@types/node": "22.15.17", "@types/papaparse": "5.3.7", "@types/passport-google-oauth20": "2.0.16", + "@types/passport-openidconnect": "0.1.3", "@typescript-eslint/eslint-plugin": "8.43.0", "@typescript-eslint/parser": "8.43.0", "eslint": "9.35.0", diff --git a/prisma/migrations/20251103162035_added_oidc_to_provider/migration.sql b/prisma/migrations/20251103162035_added_oidc_to_provider/migration.sql new file mode 100644 index 000000000..f71f6eded --- /dev/null +++ b/prisma/migrations/20251103162035_added_oidc_to_provider/migration.sql @@ -0,0 +1,2 @@ +-- AlterEnum +ALTER TYPE "Provider" ADD VALUE 'OIDC'; diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 72ec79008..232dde9ca 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -335,6 +335,7 @@ enum Provider { ANONYMOUS GOOGLE INTERNET_IDENTITY + OIDC } enum Role { From e20530d5f041061599f63aa0e24d8bee1dd8980e Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Sun, 7 Dec 2025 10:04:53 +0100 Subject: [PATCH 25/31] Task/activate 3d hover effect in account membership overview (#6039) * Activate 3d hover effect --- .../user-account-membership/user-account-membership.html | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/client/src/app/components/user-account-membership/user-account-membership.html b/apps/client/src/app/components/user-account-membership/user-account-membership.html index 351d5608a..31d239215 100644 --- a/apps/client/src/app/components/user-account-membership/user-account-membership.html +++ b/apps/client/src/app/components/user-account-membership/user-account-membership.html @@ -5,6 +5,7 @@ From 5ccfbc31aef808bdd9d41b855963bc4978293c03 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Sun, 7 Dec 2025 10:07:47 +0100 Subject: [PATCH 26/31] Release 2.222.0 (#6041) --- CHANGELOG.md | 2 +- package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7b3f93910..cf976e909 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,7 +5,7 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## Unreleased +## 2.222.0 - 2025-12-07 ### Added diff --git a/package-lock.json b/package-lock.json index faa39e722..61f38db9f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "ghostfolio", - "version": "2.221.0", + "version": "2.222.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "ghostfolio", - "version": "2.221.0", + "version": "2.222.0", "hasInstallScript": true, "license": "AGPL-3.0", "dependencies": { diff --git a/package.json b/package.json index 843091424..d0ee2c084 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ghostfolio", - "version": "2.221.0", + "version": "2.222.0", "homepage": "https://ghostfol.io", "license": "AGPL-3.0", "repository": "https://github.com/ghostfolio/ghostfolio", From 0f7e5a25042ca85b9ade9d993084c1c2139b166f Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Sun, 7 Dec 2025 21:16:44 +0100 Subject: [PATCH 27/31] Task/improve OIDC login button label (#6043) * Improve label --- .../login-with-access-token-dialog.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html b/apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html index cf5611ef7..78604456b 100644 --- a/apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html +++ b/apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html @@ -52,7 +52,7 @@ class="px-4 rounded-pill" href="../api/auth/oidc" mat-stroked-button - >Sign in with OIDCSign in with OpenID Connect } From 1cbcb623b505a71afe142b13b208e5c3a4e7db80 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 8 Dec 2025 19:06:37 +0100 Subject: [PATCH 28/31] Feature/update locales (#5993) * Update locales * Update translation * Update changelog --------- Co-authored-by: github-actions[bot] Co-authored-by: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> --- CHANGELOG.md | 6 ++ apps/client/src/locales/messages.ca.xlf | 78 ++++++++++++++----------- apps/client/src/locales/messages.de.xlf | 78 ++++++++++++++----------- apps/client/src/locales/messages.es.xlf | 78 ++++++++++++++----------- apps/client/src/locales/messages.fr.xlf | 78 ++++++++++++++----------- apps/client/src/locales/messages.it.xlf | 78 ++++++++++++++----------- apps/client/src/locales/messages.nl.xlf | 78 ++++++++++++++----------- apps/client/src/locales/messages.pl.xlf | 78 ++++++++++++++----------- apps/client/src/locales/messages.pt.xlf | 78 ++++++++++++++----------- apps/client/src/locales/messages.tr.xlf | 78 ++++++++++++++----------- apps/client/src/locales/messages.uk.xlf | 78 ++++++++++++++----------- apps/client/src/locales/messages.xlf | 77 +++++++++++++----------- apps/client/src/locales/messages.zh.xlf | 78 ++++++++++++++----------- 13 files changed, 521 insertions(+), 420 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cf976e909..f818b9d28 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,12 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## Unreleased + +### Changed + +- Improved the language localization for German (`de`) + ## 2.222.0 - 2025-12-07 ### Added diff --git a/apps/client/src/locales/messages.ca.xlf b/apps/client/src/locales/messages.ca.xlf index e2740945e..2944e43fb 100644 --- a/apps/client/src/locales/messages.ca.xlf +++ b/apps/client/src/locales/messages.ca.xlf @@ -38,11 +38,11 @@ apps/client/src/app/components/header/header.component.ts - 290 + 297 apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 68 + 79 libs/common/src/lib/routes/routes.ts @@ -607,7 +607,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 453 + 457 @@ -643,7 +643,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 480 + 484 libs/ui/src/lib/benchmark/benchmark.component.html @@ -795,7 +795,7 @@ Veure Stacktrace apps/client/src/app/components/admin-jobs/admin-jobs.html - 215 + 216 @@ -803,7 +803,7 @@ Executar Procés apps/client/src/app/components/admin-jobs/admin-jobs.html - 218 + 220 @@ -811,7 +811,7 @@ Suprimir Procés apps/client/src/app/components/admin-jobs/admin-jobs.html - 222 + 224 @@ -1503,7 +1503,7 @@ No auto-renewal on membership. apps/client/src/app/components/user-account-membership/user-account-membership.html - 73 + 74 @@ -1531,7 +1531,7 @@ Actuar com un altre Usuari apps/client/src/app/components/admin-users/admin-users.html - 232 + 234 @@ -1539,7 +1539,7 @@ Eliminar Usuari apps/client/src/app/components/admin-users/admin-users.html - 253 + 255 @@ -1623,7 +1623,7 @@ apps/client/src/app/components/user-account-membership/user-account-membership.html - 20 + 21 apps/client/src/app/pages/pricing/pricing-page.html @@ -1639,7 +1639,7 @@ apps/client/src/app/components/user-account-membership/user-account-membership.html - 18 + 19 apps/client/src/app/pages/pricing/pricing-page.html @@ -1671,7 +1671,7 @@ Oooh! El testimoni de seguretat és incorrecte. apps/client/src/app/components/header/header.component.ts - 305 + 312 apps/client/src/app/components/user-account-access/user-account-access.component.ts @@ -2043,7 +2043,7 @@ Manteniu la sessió iniciada apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 55 + 66 @@ -2471,7 +2471,7 @@ per any apps/client/src/app/components/user-account-membership/user-account-membership.html - 32 + 33 apps/client/src/app/pages/portfolio/fire/fire-page.html @@ -2487,7 +2487,7 @@ Prova Premium apps/client/src/app/components/user-account-membership/user-account-membership.html - 52 + 53 @@ -2495,7 +2495,7 @@ Bescanviar el cupó apps/client/src/app/components/user-account-membership/user-account-membership.html - 66 + 67 @@ -4076,7 +4076,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 382 + 383 @@ -4092,7 +4092,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 394 + 397 @@ -5229,7 +5229,7 @@ libs/ui/src/lib/membership-card/membership-card.component.html - 37 + 40 @@ -5301,7 +5301,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 407 + 411 @@ -5313,7 +5313,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 420 + 424 @@ -5337,7 +5337,7 @@ Clonar libs/ui/src/lib/activities-table/activities-table.component.html - 459 + 463 @@ -5345,7 +5345,7 @@ Exporta l’esborrany com a ICS libs/ui/src/lib/activities-table/activities-table.component.html - 469 + 473 @@ -5929,7 +5929,7 @@ View Details apps/client/src/app/components/admin-users/admin-users.html - 225 + 226 libs/ui/src/lib/accounts-table/accounts-table.component.html @@ -5944,6 +5944,14 @@ 33 + + Sign in with OpenID Connect + Sign in with OpenID Connect + + apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html + 55 + + Buy Comprar @@ -6061,7 +6069,7 @@ Authentication apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 32 + 35 @@ -6209,7 +6217,7 @@ libs/ui/src/lib/membership-card/membership-card.component.html - 42 + 45 @@ -6461,7 +6469,7 @@ View Holding libs/ui/src/lib/activities-table/activities-table.component.html - 446 + 450 @@ -6729,7 +6737,7 @@ Role apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 36 + 14 @@ -7167,7 +7175,7 @@ API Key libs/ui/src/lib/membership-card/membership-card.component.html - 18 + 21 @@ -7175,7 +7183,7 @@ Generate Ghostfolio Premium Data Provider API key for self-hosted environments... libs/ui/src/lib/membership-card/membership-card.component.html - 26 + 29 @@ -7531,7 +7539,7 @@ Generate Security Token apps/client/src/app/components/admin-users/admin-users.html - 242 + 244 @@ -7907,7 +7915,7 @@ Limited Offer! apps/client/src/app/components/user-account-membership/user-account-membership.html - 40 + 41 apps/client/src/app/pages/pricing/pricing-page.html @@ -7919,7 +7927,7 @@ Get extra apps/client/src/app/components/user-account-membership/user-account-membership.html - 43 + 44 apps/client/src/app/pages/pricing/pricing-page.html @@ -8592,7 +8600,7 @@ Registration Date apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 20 + 26 diff --git a/apps/client/src/locales/messages.de.xlf b/apps/client/src/locales/messages.de.xlf index 65e71fbd8..02ef33acd 100644 --- a/apps/client/src/locales/messages.de.xlf +++ b/apps/client/src/locales/messages.de.xlf @@ -254,7 +254,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 453 + 457 @@ -290,7 +290,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 480 + 484 libs/ui/src/lib/benchmark/benchmark.component.html @@ -418,7 +418,7 @@ Stacktrace anzeigen apps/client/src/app/components/admin-jobs/admin-jobs.html - 215 + 216 @@ -426,7 +426,7 @@ Job löschen apps/client/src/app/components/admin-jobs/admin-jobs.html - 222 + 224 @@ -674,7 +674,7 @@ Keine automatische Erneuerung der Mitgliedschaft. apps/client/src/app/components/user-account-membership/user-account-membership.html - 73 + 74 @@ -758,11 +758,11 @@ apps/client/src/app/components/header/header.component.ts - 290 + 297 apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 68 + 79 libs/common/src/lib/routes/routes.ts @@ -778,7 +778,7 @@ Ups! Falsches Sicherheits-Token. apps/client/src/app/components/header/header.component.ts - 305 + 312 apps/client/src/app/components/user-account-access/user-account-access.component.ts @@ -890,7 +890,7 @@ Eingeloggt bleiben apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 55 + 66 @@ -1226,7 +1226,7 @@ pro Jahr apps/client/src/app/components/user-account-membership/user-account-membership.html - 32 + 33 apps/client/src/app/pages/portfolio/fire/fire-page.html @@ -1242,7 +1242,7 @@ Premium ausprobieren apps/client/src/app/components/user-account-membership/user-account-membership.html - 52 + 53 @@ -1250,7 +1250,7 @@ Gutschein einlösen apps/client/src/app/components/user-account-membership/user-account-membership.html - 66 + 67 @@ -2254,7 +2254,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 382 + 383 @@ -2266,7 +2266,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 407 + 411 @@ -2278,7 +2278,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 420 + 424 @@ -2286,7 +2286,7 @@ Kopieren libs/ui/src/lib/activities-table/activities-table.component.html - 459 + 463 @@ -2294,7 +2294,7 @@ Geplante Aktivität als ICS exportieren libs/ui/src/lib/activities-table/activities-table.component.html - 469 + 473 @@ -2870,7 +2870,7 @@ Authentifizierung apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 32 + 35 @@ -3266,7 +3266,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 394 + 397 @@ -3278,7 +3278,7 @@ libs/ui/src/lib/membership-card/membership-card.component.html - 42 + 45 @@ -3466,7 +3466,7 @@ apps/client/src/app/components/user-account-membership/user-account-membership.html - 20 + 21 apps/client/src/app/pages/pricing/pricing-page.html @@ -3726,7 +3726,7 @@ apps/client/src/app/components/user-account-membership/user-account-membership.html - 18 + 19 apps/client/src/app/pages/pricing/pricing-page.html @@ -3746,7 +3746,7 @@ Benutzer verwenden apps/client/src/app/components/admin-users/admin-users.html - 232 + 234 @@ -3754,7 +3754,7 @@ Benutzer löschen apps/client/src/app/components/admin-users/admin-users.html - 253 + 255 @@ -4006,7 +4006,7 @@ Details anzeigen apps/client/src/app/components/admin-users/admin-users.html - 225 + 226 libs/ui/src/lib/accounts-table/accounts-table.component.html @@ -4385,6 +4385,14 @@ 73 + + Sign in with OpenID Connect + Einloggen mit OpenID Connect + + apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html + 55 + + Buy Kauf @@ -5468,7 +5476,7 @@ libs/ui/src/lib/membership-card/membership-card.component.html - 37 + 40 @@ -6093,7 +6101,7 @@ Job ausführen apps/client/src/app/components/admin-jobs/admin-jobs.html - 218 + 220 @@ -6485,7 +6493,7 @@ Position ansehen libs/ui/src/lib/activities-table/activities-table.component.html - 446 + 450 @@ -6753,7 +6761,7 @@ Rolle apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 36 + 14 @@ -7191,7 +7199,7 @@ API-Schlüssel libs/ui/src/lib/membership-card/membership-card.component.html - 18 + 21 @@ -7199,7 +7207,7 @@ Ghostfolio Premium Datenanbieter API-Schlüssel für selbst gehostete Umgebungen erstellen... libs/ui/src/lib/membership-card/membership-card.component.html - 26 + 29 @@ -7555,7 +7563,7 @@ Sicherheits-Token generieren apps/client/src/app/components/admin-users/admin-users.html - 242 + 244 @@ -7907,7 +7915,7 @@ Begrenztes Angebot! apps/client/src/app/components/user-account-membership/user-account-membership.html - 40 + 41 apps/client/src/app/pages/pricing/pricing-page.html @@ -7919,7 +7927,7 @@ Erhalte extra apps/client/src/app/components/user-account-membership/user-account-membership.html - 43 + 44 apps/client/src/app/pages/pricing/pricing-page.html @@ -8592,7 +8600,7 @@ Registrierungsdatum apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 20 + 26 diff --git a/apps/client/src/locales/messages.es.xlf b/apps/client/src/locales/messages.es.xlf index 2703aebb8..4314903be 100644 --- a/apps/client/src/locales/messages.es.xlf +++ b/apps/client/src/locales/messages.es.xlf @@ -255,7 +255,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 453 + 457 @@ -291,7 +291,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 480 + 484 libs/ui/src/lib/benchmark/benchmark.component.html @@ -419,7 +419,7 @@ Visualiza Stacktrace apps/client/src/app/components/admin-jobs/admin-jobs.html - 215 + 216 @@ -427,7 +427,7 @@ Elimina el trabajo apps/client/src/app/components/admin-jobs/admin-jobs.html - 222 + 224 @@ -659,7 +659,7 @@ No auto-renewal on membership. apps/client/src/app/components/user-account-membership/user-account-membership.html - 73 + 74 @@ -743,11 +743,11 @@ apps/client/src/app/components/header/header.component.ts - 290 + 297 apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 68 + 79 libs/common/src/lib/routes/routes.ts @@ -763,7 +763,7 @@ Vaya! Token de seguridad incorrecto. apps/client/src/app/components/header/header.component.ts - 305 + 312 apps/client/src/app/components/user-account-access/user-account-access.component.ts @@ -875,7 +875,7 @@ Seguir conectado apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 55 + 66 @@ -1211,7 +1211,7 @@ por año apps/client/src/app/components/user-account-membership/user-account-membership.html - 32 + 33 apps/client/src/app/pages/portfolio/fire/fire-page.html @@ -1227,7 +1227,7 @@ Prueba Premium apps/client/src/app/components/user-account-membership/user-account-membership.html - 52 + 53 @@ -1235,7 +1235,7 @@ Canjea el cupón apps/client/src/app/components/user-account-membership/user-account-membership.html - 66 + 67 @@ -2239,7 +2239,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 382 + 383 @@ -2251,7 +2251,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 407 + 411 @@ -2263,7 +2263,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 420 + 424 @@ -2271,7 +2271,7 @@ Clonar libs/ui/src/lib/activities-table/activities-table.component.html - 459 + 463 @@ -2279,7 +2279,7 @@ Exportar borrador como ICS libs/ui/src/lib/activities-table/activities-table.component.html - 469 + 473 @@ -2855,7 +2855,7 @@ Authentication apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 32 + 35 @@ -3251,7 +3251,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 394 + 397 @@ -3263,7 +3263,7 @@ libs/ui/src/lib/membership-card/membership-card.component.html - 42 + 45 @@ -3451,7 +3451,7 @@ apps/client/src/app/components/user-account-membership/user-account-membership.html - 20 + 21 apps/client/src/app/pages/pricing/pricing-page.html @@ -3703,7 +3703,7 @@ apps/client/src/app/components/user-account-membership/user-account-membership.html - 18 + 19 apps/client/src/app/pages/pricing/pricing-page.html @@ -3723,7 +3723,7 @@ Suplantar usuario apps/client/src/app/components/admin-users/admin-users.html - 232 + 234 @@ -3731,7 +3731,7 @@ Eliminar usuario apps/client/src/app/components/admin-users/admin-users.html - 253 + 255 @@ -3983,7 +3983,7 @@ View Details apps/client/src/app/components/admin-users/admin-users.html - 225 + 226 libs/ui/src/lib/accounts-table/accounts-table.component.html @@ -4362,6 +4362,14 @@ 73 + + Sign in with OpenID Connect + Sign in with OpenID Connect + + apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html + 55 + + Buy Comprar @@ -5445,7 +5453,7 @@ libs/ui/src/lib/membership-card/membership-card.component.html - 37 + 40 @@ -6070,7 +6078,7 @@ Ejecutar Tarea apps/client/src/app/components/admin-jobs/admin-jobs.html - 218 + 220 @@ -6462,7 +6470,7 @@ View Holding libs/ui/src/lib/activities-table/activities-table.component.html - 446 + 450 @@ -6730,7 +6738,7 @@ Role apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 36 + 14 @@ -7168,7 +7176,7 @@ Clave API libs/ui/src/lib/membership-card/membership-card.component.html - 18 + 21 @@ -7176,7 +7184,7 @@ Genere la clave API del proveedor de datos premium de Ghostfolio para entornos autohospedados... libs/ui/src/lib/membership-card/membership-card.component.html - 26 + 29 @@ -7532,7 +7540,7 @@ Generar token de seguridad apps/client/src/app/components/admin-users/admin-users.html - 242 + 244 @@ -7908,7 +7916,7 @@ ¡Oferta limitada! apps/client/src/app/components/user-account-membership/user-account-membership.html - 40 + 41 apps/client/src/app/pages/pricing/pricing-page.html @@ -7920,7 +7928,7 @@ Obtén extra apps/client/src/app/components/user-account-membership/user-account-membership.html - 43 + 44 apps/client/src/app/pages/pricing/pricing-page.html @@ -8593,7 +8601,7 @@ Registration Date apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 20 + 26 diff --git a/apps/client/src/locales/messages.fr.xlf b/apps/client/src/locales/messages.fr.xlf index 81da3848d..41dc3d391 100644 --- a/apps/client/src/locales/messages.fr.xlf +++ b/apps/client/src/locales/messages.fr.xlf @@ -310,7 +310,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 453 + 457 @@ -346,7 +346,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 480 + 484 libs/ui/src/lib/benchmark/benchmark.component.html @@ -474,7 +474,7 @@ Voir la Stacktrace apps/client/src/app/components/admin-jobs/admin-jobs.html - 215 + 216 @@ -482,7 +482,7 @@ Supprimer Tâche apps/client/src/app/components/admin-jobs/admin-jobs.html - 222 + 224 @@ -870,7 +870,7 @@ No auto-renewal on membership. apps/client/src/app/components/user-account-membership/user-account-membership.html - 73 + 74 @@ -966,11 +966,11 @@ apps/client/src/app/components/header/header.component.ts - 290 + 297 apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 68 + 79 libs/common/src/lib/routes/routes.ts @@ -986,7 +986,7 @@ Oups! Jeton de Sécurité Incorrect. apps/client/src/app/components/header/header.component.ts - 305 + 312 apps/client/src/app/components/user-account-access/user-account-access.component.ts @@ -1146,7 +1146,7 @@ Rester connecté apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 55 + 66 @@ -1494,7 +1494,7 @@ par an apps/client/src/app/components/user-account-membership/user-account-membership.html - 32 + 33 apps/client/src/app/pages/portfolio/fire/fire-page.html @@ -1510,7 +1510,7 @@ Essayer Premium apps/client/src/app/components/user-account-membership/user-account-membership.html - 52 + 53 @@ -1518,7 +1518,7 @@ Utiliser un Code Promotionnel apps/client/src/app/components/user-account-membership/user-account-membership.html - 66 + 67 @@ -2710,7 +2710,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 382 + 383 @@ -2722,7 +2722,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 407 + 411 @@ -2734,7 +2734,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 420 + 424 @@ -2742,7 +2742,7 @@ Dupliquer libs/ui/src/lib/activities-table/activities-table.component.html - 459 + 463 @@ -2750,7 +2750,7 @@ Exporter Brouillon sous ICS libs/ui/src/lib/activities-table/activities-table.component.html - 469 + 473 @@ -3058,7 +3058,7 @@ Authentication apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 32 + 35 @@ -3250,7 +3250,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 394 + 397 @@ -3262,7 +3262,7 @@ libs/ui/src/lib/membership-card/membership-card.component.html - 42 + 45 @@ -3450,7 +3450,7 @@ apps/client/src/app/components/user-account-membership/user-account-membership.html - 20 + 21 apps/client/src/app/pages/pricing/pricing-page.html @@ -3702,7 +3702,7 @@ apps/client/src/app/components/user-account-membership/user-account-membership.html - 18 + 19 apps/client/src/app/pages/pricing/pricing-page.html @@ -3722,7 +3722,7 @@ Voir en tant que ... apps/client/src/app/components/admin-users/admin-users.html - 232 + 234 @@ -3730,7 +3730,7 @@ Supprimer l’Utilisateur apps/client/src/app/components/admin-users/admin-users.html - 253 + 255 @@ -3982,7 +3982,7 @@ View Details apps/client/src/app/components/admin-users/admin-users.html - 225 + 226 libs/ui/src/lib/accounts-table/accounts-table.component.html @@ -4361,6 +4361,14 @@ 73 + + Sign in with OpenID Connect + Sign in with OpenID Connect + + apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html + 55 + + Buy Achat @@ -5444,7 +5452,7 @@ libs/ui/src/lib/membership-card/membership-card.component.html - 37 + 40 @@ -6069,7 +6077,7 @@ Execute la tâche apps/client/src/app/components/admin-jobs/admin-jobs.html - 218 + 220 @@ -6461,7 +6469,7 @@ View Holding libs/ui/src/lib/activities-table/activities-table.component.html - 446 + 450 @@ -6729,7 +6737,7 @@ Role apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 36 + 14 @@ -7167,7 +7175,7 @@ Clé API libs/ui/src/lib/membership-card/membership-card.component.html - 18 + 21 @@ -7175,7 +7183,7 @@ Générer la clé API du fournisseur de données Ghostfolio Premium pour les environnements auto-hébergés... libs/ui/src/lib/membership-card/membership-card.component.html - 26 + 29 @@ -7531,7 +7539,7 @@ Générer un jeton de sécurité apps/client/src/app/components/admin-users/admin-users.html - 242 + 244 @@ -7907,7 +7915,7 @@ Offre Limitée ! apps/client/src/app/components/user-account-membership/user-account-membership.html - 40 + 41 apps/client/src/app/pages/pricing/pricing-page.html @@ -7919,7 +7927,7 @@ Obtenez supplémentaires apps/client/src/app/components/user-account-membership/user-account-membership.html - 43 + 44 apps/client/src/app/pages/pricing/pricing-page.html @@ -8592,7 +8600,7 @@ Registration Date apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 20 + 26 diff --git a/apps/client/src/locales/messages.it.xlf b/apps/client/src/locales/messages.it.xlf index 6618d2463..e5bc9ccc6 100644 --- a/apps/client/src/locales/messages.it.xlf +++ b/apps/client/src/locales/messages.it.xlf @@ -255,7 +255,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 453 + 457 @@ -291,7 +291,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 480 + 484 libs/ui/src/lib/benchmark/benchmark.component.html @@ -419,7 +419,7 @@ Visualizza Stacktrace apps/client/src/app/components/admin-jobs/admin-jobs.html - 215 + 216 @@ -427,7 +427,7 @@ Elimina il lavoro apps/client/src/app/components/admin-jobs/admin-jobs.html - 222 + 224 @@ -659,7 +659,7 @@ No auto-renewal on membership. apps/client/src/app/components/user-account-membership/user-account-membership.html - 73 + 74 @@ -743,11 +743,11 @@ apps/client/src/app/components/header/header.component.ts - 290 + 297 apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 68 + 79 libs/common/src/lib/routes/routes.ts @@ -763,7 +763,7 @@ Ops! Token di sicurezza errato. apps/client/src/app/components/header/header.component.ts - 305 + 312 apps/client/src/app/components/user-account-access/user-account-access.component.ts @@ -875,7 +875,7 @@ Rimani connesso apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 55 + 66 @@ -1211,7 +1211,7 @@ per anno apps/client/src/app/components/user-account-membership/user-account-membership.html - 32 + 33 apps/client/src/app/pages/portfolio/fire/fire-page.html @@ -1227,7 +1227,7 @@ Prova Premium apps/client/src/app/components/user-account-membership/user-account-membership.html - 52 + 53 @@ -1235,7 +1235,7 @@ Riscatta il buono apps/client/src/app/components/user-account-membership/user-account-membership.html - 66 + 67 @@ -2239,7 +2239,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 382 + 383 @@ -2251,7 +2251,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 407 + 411 @@ -2263,7 +2263,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 420 + 424 @@ -2271,7 +2271,7 @@ Clona libs/ui/src/lib/activities-table/activities-table.component.html - 459 + 463 @@ -2279,7 +2279,7 @@ Esporta la bozza come ICS libs/ui/src/lib/activities-table/activities-table.component.html - 469 + 473 @@ -2855,7 +2855,7 @@ Authentication apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 32 + 35 @@ -3251,7 +3251,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 394 + 397 @@ -3263,7 +3263,7 @@ libs/ui/src/lib/membership-card/membership-card.component.html - 42 + 45 @@ -3451,7 +3451,7 @@ apps/client/src/app/components/user-account-membership/user-account-membership.html - 20 + 21 apps/client/src/app/pages/pricing/pricing-page.html @@ -3703,7 +3703,7 @@ apps/client/src/app/components/user-account-membership/user-account-membership.html - 18 + 19 apps/client/src/app/pages/pricing/pricing-page.html @@ -3723,7 +3723,7 @@ Imita l’utente apps/client/src/app/components/admin-users/admin-users.html - 232 + 234 @@ -3731,7 +3731,7 @@ Elimina l’utente apps/client/src/app/components/admin-users/admin-users.html - 253 + 255 @@ -3983,7 +3983,7 @@ View Details apps/client/src/app/components/admin-users/admin-users.html - 225 + 226 libs/ui/src/lib/accounts-table/accounts-table.component.html @@ -4362,6 +4362,14 @@ 73 + + Sign in with OpenID Connect + Sign in with OpenID Connect + + apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html + 55 + + Buy Compra @@ -5445,7 +5453,7 @@ libs/ui/src/lib/membership-card/membership-card.component.html - 37 + 40 @@ -6070,7 +6078,7 @@ Esegui il lavoro apps/client/src/app/components/admin-jobs/admin-jobs.html - 218 + 220 @@ -6462,7 +6470,7 @@ View Holding libs/ui/src/lib/activities-table/activities-table.component.html - 446 + 450 @@ -6730,7 +6738,7 @@ Role apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 36 + 14 @@ -7168,7 +7176,7 @@ API Key libs/ui/src/lib/membership-card/membership-card.component.html - 18 + 21 @@ -7176,7 +7184,7 @@ Genera API key per Ghostfolio Premium Data Provider per ambienti self-hosted... libs/ui/src/lib/membership-card/membership-card.component.html - 26 + 29 @@ -7532,7 +7540,7 @@ Genera Token di Sicurezza apps/client/src/app/components/admin-users/admin-users.html - 242 + 244 @@ -7908,7 +7916,7 @@ Offerta limitata! apps/client/src/app/components/user-account-membership/user-account-membership.html - 40 + 41 apps/client/src/app/pages/pricing/pricing-page.html @@ -7920,7 +7928,7 @@ Get extra apps/client/src/app/components/user-account-membership/user-account-membership.html - 43 + 44 apps/client/src/app/pages/pricing/pricing-page.html @@ -8593,7 +8601,7 @@ Registration Date apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 20 + 26 diff --git a/apps/client/src/locales/messages.nl.xlf b/apps/client/src/locales/messages.nl.xlf index 43f22714b..5d1bec1b5 100644 --- a/apps/client/src/locales/messages.nl.xlf +++ b/apps/client/src/locales/messages.nl.xlf @@ -254,7 +254,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 453 + 457 @@ -290,7 +290,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 480 + 484 libs/ui/src/lib/benchmark/benchmark.component.html @@ -418,7 +418,7 @@ Bekijk Stacktrace apps/client/src/app/components/admin-jobs/admin-jobs.html - 215 + 216 @@ -426,7 +426,7 @@ Taak verwijderen apps/client/src/app/components/admin-jobs/admin-jobs.html - 222 + 224 @@ -658,7 +658,7 @@ No auto-renewal on membership. apps/client/src/app/components/user-account-membership/user-account-membership.html - 73 + 74 @@ -742,11 +742,11 @@ apps/client/src/app/components/header/header.component.ts - 290 + 297 apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 68 + 79 libs/common/src/lib/routes/routes.ts @@ -762,7 +762,7 @@ Oeps! Onjuiste beveiligingstoken. apps/client/src/app/components/header/header.component.ts - 305 + 312 apps/client/src/app/components/user-account-access/user-account-access.component.ts @@ -874,7 +874,7 @@ Aangemeld blijven apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 55 + 66 @@ -1210,7 +1210,7 @@ per jaar apps/client/src/app/components/user-account-membership/user-account-membership.html - 32 + 33 apps/client/src/app/pages/portfolio/fire/fire-page.html @@ -1226,7 +1226,7 @@ Probeer Premium apps/client/src/app/components/user-account-membership/user-account-membership.html - 52 + 53 @@ -1234,7 +1234,7 @@ Coupon inwisselen apps/client/src/app/components/user-account-membership/user-account-membership.html - 66 + 67 @@ -2238,7 +2238,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 382 + 383 @@ -2250,7 +2250,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 407 + 411 @@ -2262,7 +2262,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 420 + 424 @@ -2270,7 +2270,7 @@ Kloon libs/ui/src/lib/activities-table/activities-table.component.html - 459 + 463 @@ -2278,7 +2278,7 @@ Concept exporteren als ICS libs/ui/src/lib/activities-table/activities-table.component.html - 469 + 473 @@ -2854,7 +2854,7 @@ Authentication apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 32 + 35 @@ -3250,7 +3250,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 394 + 397 @@ -3262,7 +3262,7 @@ libs/ui/src/lib/membership-card/membership-card.component.html - 42 + 45 @@ -3450,7 +3450,7 @@ apps/client/src/app/components/user-account-membership/user-account-membership.html - 20 + 21 apps/client/src/app/pages/pricing/pricing-page.html @@ -3702,7 +3702,7 @@ apps/client/src/app/components/user-account-membership/user-account-membership.html - 18 + 19 apps/client/src/app/pages/pricing/pricing-page.html @@ -3722,7 +3722,7 @@ Gebruiker immiteren apps/client/src/app/components/admin-users/admin-users.html - 232 + 234 @@ -3730,7 +3730,7 @@ Gebruiker verwijderen apps/client/src/app/components/admin-users/admin-users.html - 253 + 255 @@ -3982,7 +3982,7 @@ View Details apps/client/src/app/components/admin-users/admin-users.html - 225 + 226 libs/ui/src/lib/accounts-table/accounts-table.component.html @@ -4361,6 +4361,14 @@ 73 + + Sign in with OpenID Connect + Sign in with OpenID Connect + + apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html + 55 + + Buy Koop @@ -5444,7 +5452,7 @@ libs/ui/src/lib/membership-card/membership-card.component.html - 37 + 40 @@ -6069,7 +6077,7 @@ Opdracht Uitvoeren apps/client/src/app/components/admin-jobs/admin-jobs.html - 218 + 220 @@ -6461,7 +6469,7 @@ View Holding libs/ui/src/lib/activities-table/activities-table.component.html - 446 + 450 @@ -6729,7 +6737,7 @@ Role apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 36 + 14 @@ -7167,7 +7175,7 @@ API-sleutel libs/ui/src/lib/membership-card/membership-card.component.html - 18 + 21 @@ -7175,7 +7183,7 @@ Genereer een Ghostfolio Premium Gegevensleverancier API-sleutel voor zelfgehoste omgevingen... libs/ui/src/lib/membership-card/membership-card.component.html - 26 + 29 @@ -7531,7 +7539,7 @@ Beveiligingstoken Aanmaken apps/client/src/app/components/admin-users/admin-users.html - 242 + 244 @@ -7907,7 +7915,7 @@ Beperkt aanbod! apps/client/src/app/components/user-account-membership/user-account-membership.html - 40 + 41 apps/client/src/app/pages/pricing/pricing-page.html @@ -7919,7 +7927,7 @@ Krijg extra apps/client/src/app/components/user-account-membership/user-account-membership.html - 43 + 44 apps/client/src/app/pages/pricing/pricing-page.html @@ -8592,7 +8600,7 @@ Registration Date apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 20 + 26 diff --git a/apps/client/src/locales/messages.pl.xlf b/apps/client/src/locales/messages.pl.xlf index 1ae972c8e..6e167a355 100644 --- a/apps/client/src/locales/messages.pl.xlf +++ b/apps/client/src/locales/messages.pl.xlf @@ -531,7 +531,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 453 + 457 @@ -567,7 +567,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 480 + 484 libs/ui/src/lib/benchmark/benchmark.component.html @@ -691,7 +691,7 @@ Wyświetl Stos Wywołań apps/client/src/app/components/admin-jobs/admin-jobs.html - 215 + 216 @@ -699,7 +699,7 @@ Usuń Zadanie apps/client/src/app/components/admin-jobs/admin-jobs.html - 222 + 224 @@ -1331,7 +1331,7 @@ No auto-renewal on membership. apps/client/src/app/components/user-account-membership/user-account-membership.html - 73 + 74 @@ -1359,7 +1359,7 @@ Wciel się w Użytkownika apps/client/src/app/components/admin-users/admin-users.html - 232 + 234 @@ -1367,7 +1367,7 @@ Usuń Użytkownika apps/client/src/app/components/admin-users/admin-users.html - 253 + 255 @@ -1459,11 +1459,11 @@ apps/client/src/app/components/header/header.component.ts - 290 + 297 apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 68 + 79 libs/common/src/lib/routes/routes.ts @@ -1479,7 +1479,7 @@ Ups! Nieprawidłowy token bezpieczeństwa. apps/client/src/app/components/header/header.component.ts - 305 + 312 apps/client/src/app/components/user-account-access/user-account-access.component.ts @@ -1739,7 +1739,7 @@ Pozostań zalogowany apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 55 + 66 @@ -2059,7 +2059,7 @@ apps/client/src/app/components/user-account-membership/user-account-membership.html - 20 + 21 apps/client/src/app/pages/pricing/pricing-page.html @@ -2187,7 +2187,7 @@ rocznie apps/client/src/app/components/user-account-membership/user-account-membership.html - 32 + 33 apps/client/src/app/pages/portfolio/fire/fire-page.html @@ -2203,7 +2203,7 @@ Wypróbuj Premium apps/client/src/app/components/user-account-membership/user-account-membership.html - 52 + 53 @@ -2211,7 +2211,7 @@ Wykorzystaj kupon apps/client/src/app/components/user-account-membership/user-account-membership.html - 66 + 67 @@ -3703,7 +3703,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 382 + 383 @@ -3719,7 +3719,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 394 + 397 @@ -4339,7 +4339,7 @@ apps/client/src/app/components/user-account-membership/user-account-membership.html - 18 + 19 apps/client/src/app/pages/pricing/pricing-page.html @@ -4756,7 +4756,7 @@ libs/ui/src/lib/membership-card/membership-card.component.html - 37 + 40 @@ -4820,7 +4820,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 407 + 411 @@ -4832,7 +4832,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 420 + 424 @@ -4848,7 +4848,7 @@ Sklonuj libs/ui/src/lib/activities-table/activities-table.component.html - 459 + 463 @@ -4856,7 +4856,7 @@ Eksportuj Wersję Roboczą jako ICS libs/ui/src/lib/activities-table/activities-table.component.html - 469 + 473 @@ -5296,7 +5296,7 @@ View Details apps/client/src/app/components/admin-users/admin-users.html - 225 + 226 libs/ui/src/lib/accounts-table/accounts-table.component.html @@ -5311,6 +5311,14 @@ 33 + + Sign in with OpenID Connect + Sign in with OpenID Connect + + apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html + 55 + + Buy Zakup @@ -5420,7 +5428,7 @@ Authentication apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 32 + 35 @@ -5568,7 +5576,7 @@ libs/ui/src/lib/membership-card/membership-card.component.html - 42 + 45 @@ -6069,7 +6077,7 @@ Wykonaj Zadanie apps/client/src/app/components/admin-jobs/admin-jobs.html - 218 + 220 @@ -6461,7 +6469,7 @@ View Holding libs/ui/src/lib/activities-table/activities-table.component.html - 446 + 450 @@ -6729,7 +6737,7 @@ Role apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 36 + 14 @@ -7167,7 +7175,7 @@ Klucz API libs/ui/src/lib/membership-card/membership-card.component.html - 18 + 21 @@ -7175,7 +7183,7 @@ Generowanie klucza API Ghostfolio Premium Data Provider dla środowisk hostowanych samodzielnie... libs/ui/src/lib/membership-card/membership-card.component.html - 26 + 29 @@ -7531,7 +7539,7 @@ Generowanie Tokena Zabezpieczającego apps/client/src/app/components/admin-users/admin-users.html - 242 + 244 @@ -7907,7 +7915,7 @@ Oferta ograniczona czasowo! apps/client/src/app/components/user-account-membership/user-account-membership.html - 40 + 41 apps/client/src/app/pages/pricing/pricing-page.html @@ -7919,7 +7927,7 @@ Uzyskaj dodatkowo apps/client/src/app/components/user-account-membership/user-account-membership.html - 43 + 44 apps/client/src/app/pages/pricing/pricing-page.html @@ -8592,7 +8600,7 @@ Registration Date apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 20 + 26 diff --git a/apps/client/src/locales/messages.pt.xlf b/apps/client/src/locales/messages.pt.xlf index 9c928731a..8b63acdf6 100644 --- a/apps/client/src/locales/messages.pt.xlf +++ b/apps/client/src/locales/messages.pt.xlf @@ -310,7 +310,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 453 + 457 @@ -346,7 +346,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 480 + 484 libs/ui/src/lib/benchmark/benchmark.component.html @@ -474,7 +474,7 @@ Ver Stacktrace apps/client/src/app/components/admin-jobs/admin-jobs.html - 215 + 216 @@ -482,7 +482,7 @@ Apagar Tarefa apps/client/src/app/components/admin-jobs/admin-jobs.html - 222 + 224 @@ -738,7 +738,7 @@ No auto-renewal on membership. apps/client/src/app/components/user-account-membership/user-account-membership.html - 73 + 74 @@ -834,11 +834,11 @@ apps/client/src/app/components/header/header.component.ts - 290 + 297 apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 68 + 79 libs/common/src/lib/routes/routes.ts @@ -854,7 +854,7 @@ Oops! Token de Segurança Incorreto. apps/client/src/app/components/header/header.component.ts - 305 + 312 apps/client/src/app/components/user-account-access/user-account-access.component.ts @@ -1022,7 +1022,7 @@ Manter sessão iniciada apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 55 + 66 @@ -1482,7 +1482,7 @@ por ano apps/client/src/app/components/user-account-membership/user-account-membership.html - 32 + 33 apps/client/src/app/pages/portfolio/fire/fire-page.html @@ -1498,7 +1498,7 @@ Experimentar Premium apps/client/src/app/components/user-account-membership/user-account-membership.html - 52 + 53 @@ -1506,7 +1506,7 @@ Resgatar Cupão apps/client/src/app/components/user-account-membership/user-account-membership.html - 66 + 67 @@ -2610,7 +2610,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 382 + 383 @@ -2622,7 +2622,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 407 + 411 @@ -2634,7 +2634,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 420 + 424 @@ -2642,7 +2642,7 @@ Clonar libs/ui/src/lib/activities-table/activities-table.component.html - 459 + 463 @@ -2650,7 +2650,7 @@ Exportar Rascunho como ICS libs/ui/src/lib/activities-table/activities-table.component.html - 469 + 473 @@ -2902,7 +2902,7 @@ Authentication apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 32 + 35 @@ -3250,7 +3250,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 394 + 397 @@ -3262,7 +3262,7 @@ libs/ui/src/lib/membership-card/membership-card.component.html - 42 + 45 @@ -3450,7 +3450,7 @@ apps/client/src/app/components/user-account-membership/user-account-membership.html - 20 + 21 apps/client/src/app/pages/pricing/pricing-page.html @@ -3702,7 +3702,7 @@ apps/client/src/app/components/user-account-membership/user-account-membership.html - 18 + 19 apps/client/src/app/pages/pricing/pricing-page.html @@ -3722,7 +3722,7 @@ Personificar Utilizador apps/client/src/app/components/admin-users/admin-users.html - 232 + 234 @@ -3730,7 +3730,7 @@ Apagar Utilizador apps/client/src/app/components/admin-users/admin-users.html - 253 + 255 @@ -3982,7 +3982,7 @@ View Details apps/client/src/app/components/admin-users/admin-users.html - 225 + 226 libs/ui/src/lib/accounts-table/accounts-table.component.html @@ -4361,6 +4361,14 @@ 73 + + Sign in with OpenID Connect + Sign in with OpenID Connect + + apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html + 55 + + Buy Comprar @@ -5444,7 +5452,7 @@ libs/ui/src/lib/membership-card/membership-card.component.html - 37 + 40 @@ -6069,7 +6077,7 @@ Executar trabalho apps/client/src/app/components/admin-jobs/admin-jobs.html - 218 + 220 @@ -6461,7 +6469,7 @@ View Holding libs/ui/src/lib/activities-table/activities-table.component.html - 446 + 450 @@ -6729,7 +6737,7 @@ Role apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 36 + 14 @@ -7167,7 +7175,7 @@ Chave de API libs/ui/src/lib/membership-card/membership-card.component.html - 18 + 21 @@ -7175,7 +7183,7 @@ Gerar chave de API do Provedor de Dados do Ghostfolio Premium para ambientes auto-hospedados... libs/ui/src/lib/membership-card/membership-card.component.html - 26 + 29 @@ -7531,7 +7539,7 @@ Generate Security Token apps/client/src/app/components/admin-users/admin-users.html - 242 + 244 @@ -7907,7 +7915,7 @@ Limited Offer! apps/client/src/app/components/user-account-membership/user-account-membership.html - 40 + 41 apps/client/src/app/pages/pricing/pricing-page.html @@ -7919,7 +7927,7 @@ Get extra apps/client/src/app/components/user-account-membership/user-account-membership.html - 43 + 44 apps/client/src/app/pages/pricing/pricing-page.html @@ -8592,7 +8600,7 @@ Registration Date apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 20 + 26 diff --git a/apps/client/src/locales/messages.tr.xlf b/apps/client/src/locales/messages.tr.xlf index 810f91cfa..bc687b3d4 100644 --- a/apps/client/src/locales/messages.tr.xlf +++ b/apps/client/src/locales/messages.tr.xlf @@ -491,7 +491,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 453 + 457 @@ -527,7 +527,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 480 + 484 libs/ui/src/lib/benchmark/benchmark.component.html @@ -655,7 +655,7 @@ Hata İzini Görüntüle apps/client/src/app/components/admin-jobs/admin-jobs.html - 215 + 216 @@ -663,7 +663,7 @@ İşleri Sil apps/client/src/app/components/admin-jobs/admin-jobs.html - 222 + 224 @@ -1199,7 +1199,7 @@ No auto-renewal on membership. apps/client/src/app/components/user-account-membership/user-account-membership.html - 73 + 74 @@ -1227,7 +1227,7 @@ Kullanıcıyı Taklit Et apps/client/src/app/components/admin-users/admin-users.html - 232 + 234 @@ -1235,7 +1235,7 @@ Kullanıcıyı Sil apps/client/src/app/components/admin-users/admin-users.html - 253 + 255 @@ -1319,11 +1319,11 @@ apps/client/src/app/components/header/header.component.ts - 290 + 297 apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 68 + 79 libs/common/src/lib/routes/routes.ts @@ -1339,7 +1339,7 @@ Hay Allah! Güvenlik anahtarı yanlış. apps/client/src/app/components/header/header.component.ts - 305 + 312 apps/client/src/app/components/user-account-access/user-account-access.component.ts @@ -1599,7 +1599,7 @@ Oturumu açık tut apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 55 + 66 @@ -1919,7 +1919,7 @@ apps/client/src/app/components/user-account-membership/user-account-membership.html - 20 + 21 apps/client/src/app/pages/pricing/pricing-page.html @@ -3183,7 +3183,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 382 + 383 @@ -3199,7 +3199,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 394 + 397 @@ -3827,7 +3827,7 @@ apps/client/src/app/components/user-account-membership/user-account-membership.html - 18 + 19 apps/client/src/app/pages/pricing/pricing-page.html @@ -4324,7 +4324,7 @@ libs/ui/src/lib/membership-card/membership-card.component.html - 42 + 45 @@ -4332,7 +4332,7 @@ yıllık apps/client/src/app/components/user-account-membership/user-account-membership.html - 32 + 33 apps/client/src/app/pages/portfolio/fire/fire-page.html @@ -4348,7 +4348,7 @@ Premium’u Deneyin apps/client/src/app/components/user-account-membership/user-account-membership.html - 52 + 53 @@ -4356,7 +4356,7 @@ Kupon Kullan apps/client/src/app/components/user-account-membership/user-account-membership.html - 66 + 67 @@ -4540,7 +4540,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 407 + 411 @@ -4552,7 +4552,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 420 + 424 @@ -4568,7 +4568,7 @@ Klonla libs/ui/src/lib/activities-table/activities-table.component.html - 459 + 463 @@ -4576,7 +4576,7 @@ Taslakları ICS Olarak Dışa Aktar libs/ui/src/lib/activities-table/activities-table.component.html - 469 + 473 @@ -4988,7 +4988,7 @@ View Details apps/client/src/app/components/admin-users/admin-users.html - 225 + 226 libs/ui/src/lib/accounts-table/accounts-table.component.html @@ -5003,6 +5003,14 @@ 33 + + Sign in with OpenID Connect + Sign in with OpenID Connect + + apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html + 55 + + Buy Al @@ -5096,7 +5104,7 @@ Authentication apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 32 + 35 @@ -5444,7 +5452,7 @@ libs/ui/src/lib/membership-card/membership-card.component.html - 37 + 40 @@ -6069,7 +6077,7 @@ İşlemi Yürüt apps/client/src/app/components/admin-jobs/admin-jobs.html - 218 + 220 @@ -6461,7 +6469,7 @@ View Holding libs/ui/src/lib/activities-table/activities-table.component.html - 446 + 450 @@ -6729,7 +6737,7 @@ Role apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 36 + 14 @@ -7167,7 +7175,7 @@ API Anahtarı libs/ui/src/lib/membership-card/membership-card.component.html - 18 + 21 @@ -7175,7 +7183,7 @@ Kendi barındırılan ortamlar için Ghostfolio Premium Veri Sağlayıcı API anahtarı oluştur... libs/ui/src/lib/membership-card/membership-card.component.html - 26 + 29 @@ -7531,7 +7539,7 @@ Güvenlik belirteci oluştur apps/client/src/app/components/admin-users/admin-users.html - 242 + 244 @@ -7907,7 +7915,7 @@ Sınırlı Teklif! apps/client/src/app/components/user-account-membership/user-account-membership.html - 40 + 41 apps/client/src/app/pages/pricing/pricing-page.html @@ -7919,7 +7927,7 @@ Get extra apps/client/src/app/components/user-account-membership/user-account-membership.html - 43 + 44 apps/client/src/app/pages/pricing/pricing-page.html @@ -8592,7 +8600,7 @@ Registration Date apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 20 + 26 diff --git a/apps/client/src/locales/messages.uk.xlf b/apps/client/src/locales/messages.uk.xlf index 24bc12dd1..166b79a13 100644 --- a/apps/client/src/locales/messages.uk.xlf +++ b/apps/client/src/locales/messages.uk.xlf @@ -38,11 +38,11 @@ apps/client/src/app/components/header/header.component.ts - 290 + 297 apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 68 + 79 libs/common/src/lib/routes/routes.ts @@ -623,7 +623,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 453 + 457 @@ -659,7 +659,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 480 + 484 libs/ui/src/lib/benchmark/benchmark.component.html @@ -819,7 +819,7 @@ Переглянути трасування apps/client/src/app/components/admin-jobs/admin-jobs.html - 215 + 216 @@ -827,7 +827,7 @@ Виконати завдання apps/client/src/app/components/admin-jobs/admin-jobs.html - 218 + 220 @@ -835,7 +835,7 @@ Видалити завдання apps/client/src/app/components/admin-jobs/admin-jobs.html - 222 + 224 @@ -1427,7 +1427,7 @@ libs/ui/src/lib/membership-card/membership-card.component.html - 42 + 45 @@ -1567,7 +1567,7 @@ No auto-renewal on membership. apps/client/src/app/components/user-account-membership/user-account-membership.html - 73 + 74 @@ -1647,7 +1647,7 @@ Видавати себе за користувача apps/client/src/app/components/admin-users/admin-users.html - 232 + 234 @@ -1655,7 +1655,7 @@ Видалити користувача apps/client/src/app/components/admin-users/admin-users.html - 253 + 255 @@ -1739,7 +1739,7 @@ apps/client/src/app/components/user-account-membership/user-account-membership.html - 20 + 21 apps/client/src/app/pages/pricing/pricing-page.html @@ -1755,7 +1755,7 @@ apps/client/src/app/components/user-account-membership/user-account-membership.html - 18 + 19 apps/client/src/app/pages/pricing/pricing-page.html @@ -1779,7 +1779,7 @@ Упс! Неправильний Секретний Токен. apps/client/src/app/components/header/header.component.ts - 305 + 312 apps/client/src/app/components/user-account-access/user-account-access.component.ts @@ -2135,7 +2135,7 @@ Залишатися в системі apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 55 + 66 @@ -2759,7 +2759,7 @@ на рік apps/client/src/app/components/user-account-membership/user-account-membership.html - 32 + 33 apps/client/src/app/pages/portfolio/fire/fire-page.html @@ -2775,7 +2775,7 @@ Спробуйте Premium apps/client/src/app/components/user-account-membership/user-account-membership.html - 52 + 53 @@ -2783,7 +2783,7 @@ Обміняти купон apps/client/src/app/components/user-account-membership/user-account-membership.html - 66 + 67 @@ -4376,7 +4376,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 382 + 383 @@ -4392,7 +4392,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 394 + 397 @@ -5947,7 +5947,7 @@ libs/ui/src/lib/membership-card/membership-card.component.html - 37 + 40 @@ -6019,7 +6019,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 407 + 411 @@ -6031,7 +6031,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 420 + 424 @@ -6055,7 +6055,7 @@ Клонувати libs/ui/src/lib/activities-table/activities-table.component.html - 459 + 463 @@ -6063,7 +6063,7 @@ Експортувати чернетку як ICS libs/ui/src/lib/activities-table/activities-table.component.html - 469 + 473 @@ -6763,7 +6763,7 @@ View Details apps/client/src/app/components/admin-users/admin-users.html - 225 + 226 libs/ui/src/lib/accounts-table/accounts-table.component.html @@ -6783,7 +6783,7 @@ Role apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 36 + 14 @@ -6794,6 +6794,14 @@ 34 + + Sign in with OpenID Connect + Sign in with OpenID Connect + + apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html + 55 + + Buy Купити @@ -6911,7 +6919,7 @@ Authentication apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 32 + 35 @@ -7063,7 +7071,7 @@ View Holding libs/ui/src/lib/activities-table/activities-table.component.html - 446 + 450 @@ -7223,7 +7231,7 @@ Ключ API libs/ui/src/lib/membership-card/membership-card.component.html - 18 + 21 @@ -7231,7 +7239,7 @@ Згенерувати ключ API для постачальника даних Ghostfolio Premium для self-hosted середовищ... libs/ui/src/lib/membership-card/membership-card.component.html - 26 + 29 @@ -7531,7 +7539,7 @@ Generate Security Token apps/client/src/app/components/admin-users/admin-users.html - 242 + 244 @@ -7907,7 +7915,7 @@ Limited Offer! apps/client/src/app/components/user-account-membership/user-account-membership.html - 40 + 41 apps/client/src/app/pages/pricing/pricing-page.html @@ -7919,7 +7927,7 @@ Get extra apps/client/src/app/components/user-account-membership/user-account-membership.html - 43 + 44 apps/client/src/app/pages/pricing/pricing-page.html @@ -8592,7 +8600,7 @@ Registration Date apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 20 + 26 diff --git a/apps/client/src/locales/messages.xlf b/apps/client/src/locales/messages.xlf index 800f238ef..92d1c9639 100644 --- a/apps/client/src/locales/messages.xlf +++ b/apps/client/src/locales/messages.xlf @@ -509,7 +509,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 453 + 457 @@ -544,7 +544,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 480 + 484 libs/ui/src/lib/benchmark/benchmark.component.html @@ -656,14 +656,14 @@ View Stacktrace apps/client/src/app/components/admin-jobs/admin-jobs.html - 215 + 216 Delete Job apps/client/src/app/components/admin-jobs/admin-jobs.html - 222 + 224 @@ -1254,7 +1254,7 @@ No auto-renewal on membership. apps/client/src/app/components/user-account-membership/user-account-membership.html - 73 + 74 @@ -1279,14 +1279,14 @@ Impersonate User apps/client/src/app/components/admin-users/admin-users.html - 232 + 234 Delete User apps/client/src/app/components/admin-users/admin-users.html - 253 + 255 @@ -1370,11 +1370,11 @@ apps/client/src/app/components/header/header.component.ts - 290 + 297 apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 68 + 79 libs/common/src/lib/routes/routes.ts @@ -1389,7 +1389,7 @@ Oops! Incorrect Security Token. apps/client/src/app/components/header/header.component.ts - 305 + 312 apps/client/src/app/components/user-account-access/user-account-access.component.ts @@ -1627,7 +1627,7 @@ Stay signed in apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 55 + 66 @@ -1919,7 +1919,7 @@ apps/client/src/app/components/user-account-membership/user-account-membership.html - 20 + 21 apps/client/src/app/pages/pricing/pricing-page.html @@ -2034,7 +2034,7 @@ per year apps/client/src/app/components/user-account-membership/user-account-membership.html - 32 + 33 apps/client/src/app/pages/portfolio/fire/fire-page.html @@ -2049,14 +2049,14 @@ Try Premium apps/client/src/app/components/user-account-membership/user-account-membership.html - 52 + 53 Redeem Coupon apps/client/src/app/components/user-account-membership/user-account-membership.html - 66 + 67 @@ -3417,7 +3417,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 382 + 383 @@ -3432,7 +3432,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 394 + 397 @@ -3989,7 +3989,7 @@ apps/client/src/app/components/user-account-membership/user-account-membership.html - 18 + 19 apps/client/src/app/pages/pricing/pricing-page.html @@ -4378,7 +4378,7 @@ libs/ui/src/lib/membership-card/membership-card.component.html - 37 + 40 @@ -4442,7 +4442,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 407 + 411 @@ -4453,7 +4453,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 420 + 424 @@ -4467,14 +4467,14 @@ Clone libs/ui/src/lib/activities-table/activities-table.component.html - 459 + 463 Export Draft as ICS libs/ui/src/lib/activities-table/activities-table.component.html - 469 + 473 @@ -4888,7 +4888,7 @@ View Details apps/client/src/app/components/admin-users/admin-users.html - 225 + 226 libs/ui/src/lib/accounts-table/accounts-table.component.html @@ -4902,6 +4902,13 @@ 33 + + Sign in with OpenID Connect + + apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html + 55 + + Buy @@ -5000,7 +5007,7 @@ Authentication apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 32 + 35 @@ -5130,7 +5137,7 @@ libs/ui/src/lib/membership-card/membership-card.component.html - 42 + 45 @@ -5541,7 +5548,7 @@ Execute Job apps/client/src/app/components/admin-jobs/admin-jobs.html - 218 + 220 @@ -5841,7 +5848,7 @@ View Holding libs/ui/src/lib/activities-table/activities-table.component.html - 446 + 450 @@ -6058,7 +6065,7 @@ Role apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 36 + 14 @@ -6488,14 +6495,14 @@ Generate Ghostfolio Premium Data Provider API key for self-hosted environments... libs/ui/src/lib/membership-card/membership-card.component.html - 26 + 29 API Key libs/ui/src/lib/membership-card/membership-card.component.html - 18 + 21 @@ -6854,7 +6861,7 @@ Generate Security Token apps/client/src/app/components/admin-users/admin-users.html - 242 + 244 @@ -7168,7 +7175,7 @@ Limited Offer! apps/client/src/app/components/user-account-membership/user-account-membership.html - 40 + 41 apps/client/src/app/pages/pricing/pricing-page.html @@ -7179,7 +7186,7 @@ Get extra apps/client/src/app/components/user-account-membership/user-account-membership.html - 43 + 44 apps/client/src/app/pages/pricing/pricing-page.html @@ -7772,7 +7779,7 @@ Registration Date apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 20 + 26 diff --git a/apps/client/src/locales/messages.zh.xlf b/apps/client/src/locales/messages.zh.xlf index 5c2508f8d..6a9abc040 100644 --- a/apps/client/src/locales/messages.zh.xlf +++ b/apps/client/src/locales/messages.zh.xlf @@ -540,7 +540,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 453 + 457 @@ -576,7 +576,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 480 + 484 libs/ui/src/lib/benchmark/benchmark.component.html @@ -700,7 +700,7 @@ 查看堆栈跟踪 apps/client/src/app/components/admin-jobs/admin-jobs.html - 215 + 216 @@ -708,7 +708,7 @@ 删除任务 apps/client/src/app/components/admin-jobs/admin-jobs.html - 222 + 224 @@ -1340,7 +1340,7 @@ No auto-renewal on membership. apps/client/src/app/components/user-account-membership/user-account-membership.html - 73 + 74 @@ -1368,7 +1368,7 @@ 模拟用户 apps/client/src/app/components/admin-users/admin-users.html - 232 + 234 @@ -1376,7 +1376,7 @@ 删除用户 apps/client/src/app/components/admin-users/admin-users.html - 253 + 255 @@ -1468,11 +1468,11 @@ apps/client/src/app/components/header/header.component.ts - 290 + 297 apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 68 + 79 libs/common/src/lib/routes/routes.ts @@ -1488,7 +1488,7 @@ 哎呀!安全令牌不正确。 apps/client/src/app/components/header/header.component.ts - 305 + 312 apps/client/src/app/components/user-account-access/user-account-access.component.ts @@ -1748,7 +1748,7 @@ 保持登录 apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 55 + 66 @@ -2068,7 +2068,7 @@ apps/client/src/app/components/user-account-membership/user-account-membership.html - 20 + 21 apps/client/src/app/pages/pricing/pricing-page.html @@ -2196,7 +2196,7 @@ 每年 apps/client/src/app/components/user-account-membership/user-account-membership.html - 32 + 33 apps/client/src/app/pages/portfolio/fire/fire-page.html @@ -2212,7 +2212,7 @@ 尝试高级版 apps/client/src/app/components/user-account-membership/user-account-membership.html - 52 + 53 @@ -2220,7 +2220,7 @@ 兑换优惠券 apps/client/src/app/components/user-account-membership/user-account-membership.html - 66 + 67 @@ -3712,7 +3712,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 382 + 383 @@ -3728,7 +3728,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 394 + 397 @@ -4348,7 +4348,7 @@ apps/client/src/app/components/user-account-membership/user-account-membership.html - 18 + 19 apps/client/src/app/pages/pricing/pricing-page.html @@ -4777,7 +4777,7 @@ libs/ui/src/lib/membership-card/membership-card.component.html - 37 + 40 @@ -4849,7 +4849,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 407 + 411 @@ -4861,7 +4861,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 420 + 424 @@ -4877,7 +4877,7 @@ 克隆 libs/ui/src/lib/activities-table/activities-table.component.html - 459 + 463 @@ -4885,7 +4885,7 @@ 将汇票导出为 ICS libs/ui/src/lib/activities-table/activities-table.component.html - 469 + 473 @@ -5341,7 +5341,7 @@ 查看详细信息 apps/client/src/app/components/admin-users/admin-users.html - 225 + 226 libs/ui/src/lib/accounts-table/accounts-table.component.html @@ -5356,6 +5356,14 @@ 33 + + Sign in with OpenID Connect + Sign in with OpenID Connect + + apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html + 55 + + Buy 买入 @@ -5465,7 +5473,7 @@ Authentication apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 32 + 35 @@ -5613,7 +5621,7 @@ libs/ui/src/lib/membership-card/membership-card.component.html - 42 + 45 @@ -6070,7 +6078,7 @@ 执行作业 apps/client/src/app/components/admin-jobs/admin-jobs.html - 218 + 220 @@ -6462,7 +6470,7 @@ 查看持仓 libs/ui/src/lib/activities-table/activities-table.component.html - 446 + 450 @@ -6730,7 +6738,7 @@ 角色 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 36 + 14 @@ -7168,7 +7176,7 @@ API 密钥 libs/ui/src/lib/membership-card/membership-card.component.html - 18 + 21 @@ -7176,7 +7184,7 @@ 为自托管环境生成 Ghostfolio Premium 数据提供者 API 密钥... libs/ui/src/lib/membership-card/membership-card.component.html - 26 + 29 @@ -7532,7 +7540,7 @@ 生成安全令牌 apps/client/src/app/components/admin-users/admin-users.html - 242 + 244 @@ -7908,7 +7916,7 @@ 限时优惠! apps/client/src/app/components/user-account-membership/user-account-membership.html - 40 + 41 apps/client/src/app/pages/pricing/pricing-page.html @@ -7920,7 +7928,7 @@ 获取额外 apps/client/src/app/components/user-account-membership/user-account-membership.html - 43 + 44 apps/client/src/app/pages/pricing/pricing-page.html @@ -8593,7 +8601,7 @@ 注册日期 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 20 + 26 From a36f87d59268ae71951a4c6b7c5c9c53536b9e44 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Germ=C3=A1n=20Mart=C3=ADn?= Date: Mon, 8 Dec 2025 19:43:05 +0100 Subject: [PATCH 29/31] Task/add OpenID Connect (OIDC) configuration details to README (#6044) * Add OpenID Connect (OIDC) configuration details --- README.md | 51 +++++++++++++++++++++++++++++++++------------------ 1 file changed, 33 insertions(+), 18 deletions(-) diff --git a/README.md b/README.md index 1a5cc6e95..822825b57 100644 --- a/README.md +++ b/README.md @@ -85,24 +85,39 @@ We provide official container images hosted on [Docker Hub](https://hub.docker.c ### Supported Environment Variables -| Name | Type | Default Value | Description | -| ------------------------ | --------------------- | ------------- | ----------------------------------------------------------------------------------------------------------------------------------- | -| `ACCESS_TOKEN_SALT` | `string` | | A random string used as salt for access tokens | -| `API_KEY_COINGECKO_DEMO` | `string` (optional) |   | The _CoinGecko_ Demo API key | -| `API_KEY_COINGECKO_PRO` | `string` (optional) | | The _CoinGecko_ Pro API key | -| `DATABASE_URL` | `string` | | The database connection URL, e.g. `postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@localhost:5432/${POSTGRES_DB}?sslmode=prefer` | -| `HOST` | `string` (optional) | `0.0.0.0` | The host where the Ghostfolio application will run on | -| `JWT_SECRET_KEY` | `string` | | A random string used for _JSON Web Tokens_ (JWT) | -| `LOG_LEVELS` | `string[]` (optional) | | The logging levels for the Ghostfolio application, e.g. `["debug","error","log","warn"]` | -| `PORT` | `number` (optional) | `3333` | The port where the Ghostfolio application will run on | -| `POSTGRES_DB` | `string` | | The name of the _PostgreSQL_ database | -| `POSTGRES_PASSWORD` | `string` | | The password of the _PostgreSQL_ database | -| `POSTGRES_USER` | `string` | | The user of the _PostgreSQL_ database | -| `REDIS_DB` | `number` (optional) | `0` | The database index of _Redis_ | -| `REDIS_HOST` | `string` | | The host where _Redis_ is running | -| `REDIS_PASSWORD` | `string` | | The password of _Redis_ | -| `REDIS_PORT` | `number` | | The port where _Redis_ is running | -| `REQUEST_TIMEOUT` | `number` (optional) | `2000` | The timeout of network requests to data providers in milliseconds | +| Name | Type | Default Value | Description | +| ------------------------ | --------------------- | --------------------- | ----------------------------------------------------------------------------------------------------------------------------------- | +| `ACCESS_TOKEN_SALT` | `string` | | A random string used as salt for access tokens | +| `API_KEY_COINGECKO_DEMO` | `string` (optional) |   | The _CoinGecko_ Demo API key | +| `API_KEY_COINGECKO_PRO` | `string` (optional) | | The _CoinGecko_ Pro API key | +| `DATABASE_URL` | `string` | | The database connection URL, e.g. `postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@localhost:5432/${POSTGRES_DB}?sslmode=prefer` | +| `HOST` | `string` (optional) | `0.0.0.0` | The host where the Ghostfolio application will run on | +| `JWT_SECRET_KEY` | `string` | | A random string used for _JSON Web Tokens_ (JWT) | +| `LOG_LEVELS` | `string[]` (optional) | | The logging levels for the Ghostfolio application, e.g. `["debug","error","log","warn"]` | +| `PORT` | `number` (optional) | `3333` | The port where the Ghostfolio application will run on | +| `POSTGRES_DB` | `string` | | The name of the _PostgreSQL_ database | +| `POSTGRES_PASSWORD` | `string` | | The password of the _PostgreSQL_ database | +| `POSTGRES_USER` | `string` | | The user of the _PostgreSQL_ database | +| `REDIS_DB` | `number` (optional) | `0` | The database index of _Redis_ | +| `REDIS_HOST` | `string` | | The host where _Redis_ is running | +| `REDIS_PASSWORD` | `string` | | The password of _Redis_ | +| `REDIS_PORT` | `number` | | The port where _Redis_ is running | +| `REQUEST_TIMEOUT` | `number` (optional) | `2000` | The timeout of network requests to data providers in milliseconds | +| `ROOT_URL` | `string` (optional) | `http://0.0.0.0:3333` | The root URL of the Ghostfolio application, used for generating callback URLs and external links. | + +#### OpenID Connect OIDC (Experimental) + +| Name | Type | Default Value | Description | +| -------------------------- | --------------------- | ------------------------------------ | ---------------------------------------------------------------------------------------------------- | +| `ENABLE_FEATURE_AUTH_OIDC` | `boolean` (optional) | `false` | Enables _OpenID Connect_ authentication | +| `OIDC_AUTHORIZATION_URL` | `string` (optional) | | Manual override for the OIDC authorization endpoint (falls back to the discovery from the issuer) | +| `OIDC_CALLBACK_URL` | `string` (optional) | `${ROOT_URL}/api/auth/oidc/callback` | The OIDC callback URL | +| `OIDC_CLIENT_ID` | `string` | | The OIDC client ID | +| `OIDC_CLIENT_SECRET` | `string` | | The OIDC client secret | +| `OIDC_ISSUER` | `string` | | The OIDC issuer URL, used to discover the OIDC configuration via `/.well-known/openid-configuration` | +| `OIDC_SCOPE` | `string[]` (optional) | `["openid"]` | The OIDC scope to request, e.g. `["email","openid","profile"]` | +| `OIDC_TOKEN_URL` | `string` (optional) | | Manual override for the OIDC token endpoint (falls back to the discovery from the issuer) | +| `OIDC_USER_INFO_URL` | `string` (optional) | | Manual override for the OIDC user info endpoint (falls back to the discovery from the issuer) | ### Run with Docker Compose From 76e06ed59f9cd266088c496a806d4f5fcd4fe85a Mon Sep 17 00:00:00 2001 From: Kenrick Tandrian <60643640+KenTandrian@users.noreply.github.com> Date: Tue, 9 Dec 2025 02:01:22 +0700 Subject: [PATCH 30/31] Task/move notification service to UI library (#6048) * Move notification service to UI library * Update changelog --- CHANGELOG.md | 1 + apps/client/src/app/app.component.ts | 2 +- .../src/app/components/access-table/access-table.component.ts | 2 +- .../src/app/components/admin-jobs/admin-jobs.component.ts | 2 +- .../components/admin-market-data/admin-market-data.service.ts | 2 +- .../asset-profile-dialog/asset-profile-dialog.component.ts | 2 +- .../app/components/admin-overview/admin-overview.component.ts | 2 +- .../app/components/admin-platform/admin-platform.component.ts | 2 +- .../app/components/admin-settings/admin-settings.component.ts | 2 +- .../src/app/components/admin-tag/admin-tag.component.ts | 2 +- .../src/app/components/admin-users/admin-users.component.ts | 2 +- apps/client/src/app/components/header/header.component.ts | 2 +- .../portfolio-performance/portfolio-performance.component.ts | 2 +- .../portfolio-summary/portfolio-summary.component.ts | 2 +- .../create-or-update-access-dialog.component.ts | 2 +- .../user-account-access/user-account-access.component.ts | 2 +- .../user-account-membership.component.ts | 2 +- .../user-account-settings/user-account-settings.component.ts | 2 +- apps/client/src/app/core/layout.service.ts | 4 ++-- apps/client/src/app/pages/accounts/accounts-page.component.ts | 2 +- apps/client/src/app/pages/demo/demo-page.component.ts | 2 +- apps/client/src/app/pages/pricing/pricing-page.component.ts | 2 +- apps/client/src/main.ts | 2 +- .../ui/src/lib/account-balances/account-balances.component.ts | 3 +-- .../lib/accounts-table/accounts-table.component.stories.ts | 2 +- libs/ui/src/lib/accounts-table/accounts-table.component.ts | 3 +-- .../activities-table/activities-table.component.stories.ts | 2 +- .../ui/src/lib/activities-table/activities-table.component.ts | 3 +-- libs/ui/src/lib/benchmark/benchmark.component.ts | 3 +-- .../lib/notifications}/alert-dialog/alert-dialog.component.ts | 0 .../ui/src/lib/notifications}/alert-dialog/alert-dialog.html | 0 .../ui/src/lib/notifications}/alert-dialog/alert-dialog.scss | 0 .../lib/notifications}/alert-dialog/interfaces/interfaces.ts | 0 .../confirmation-dialog/confirmation-dialog.component.ts | 0 .../confirmation-dialog/confirmation-dialog.html | 0 .../confirmation-dialog/confirmation-dialog.scss | 0 .../confirmation-dialog/interfaces/interfaces.ts | 0 libs/ui/src/lib/notifications/index.ts | 3 +++ .../ui/src/lib/notifications}/interfaces/interfaces.ts | 0 .../ui/src/lib/notifications}/notification.module.ts | 0 .../ui/src/lib/notifications}/notification.service.ts | 0 .../notifications}/prompt-dialog/prompt-dialog.component.ts | 0 .../src/lib/notifications}/prompt-dialog/prompt-dialog.html | 0 43 files changed, 33 insertions(+), 33 deletions(-) rename {apps/client/src/app/core/notification => libs/ui/src/lib/notifications}/alert-dialog/alert-dialog.component.ts (100%) rename {apps/client/src/app/core/notification => libs/ui/src/lib/notifications}/alert-dialog/alert-dialog.html (100%) rename {apps/client/src/app/core/notification => libs/ui/src/lib/notifications}/alert-dialog/alert-dialog.scss (100%) rename {apps/client/src/app/core/notification => libs/ui/src/lib/notifications}/alert-dialog/interfaces/interfaces.ts (100%) rename {apps/client/src/app/core/notification => libs/ui/src/lib/notifications}/confirmation-dialog/confirmation-dialog.component.ts (100%) rename {apps/client/src/app/core/notification => libs/ui/src/lib/notifications}/confirmation-dialog/confirmation-dialog.html (100%) rename {apps/client/src/app/core/notification => libs/ui/src/lib/notifications}/confirmation-dialog/confirmation-dialog.scss (100%) rename {apps/client/src/app/core/notification => libs/ui/src/lib/notifications}/confirmation-dialog/interfaces/interfaces.ts (100%) create mode 100644 libs/ui/src/lib/notifications/index.ts rename {apps/client/src/app/core/notification => libs/ui/src/lib/notifications}/interfaces/interfaces.ts (100%) rename {apps/client/src/app/core/notification => libs/ui/src/lib/notifications}/notification.module.ts (100%) rename {apps/client/src/app/core/notification => libs/ui/src/lib/notifications}/notification.service.ts (100%) rename {apps/client/src/app/core/notification => libs/ui/src/lib/notifications}/prompt-dialog/prompt-dialog.component.ts (100%) rename {apps/client/src/app/core/notification => libs/ui/src/lib/notifications}/prompt-dialog/prompt-dialog.html (100%) diff --git a/CHANGELOG.md b/CHANGELOG.md index f818b9d28..7ceb94a11 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed +- Moved the notification module to `@ghostfolio/ui` - Improved the language localization for German (`de`) ## 2.222.0 - 2025-12-07 diff --git a/apps/client/src/app/app.component.ts b/apps/client/src/app/app.component.ts index de82c7d9c..12a7b0de9 100644 --- a/apps/client/src/app/app.component.ts +++ b/apps/client/src/app/app.component.ts @@ -3,6 +3,7 @@ import { InfoItem, User } from '@ghostfolio/common/interfaces'; import { hasPermission, permissions } from '@ghostfolio/common/permissions'; import { internalRoutes, publicRoutes } from '@ghostfolio/common/routes/routes'; import { ColorScheme } from '@ghostfolio/common/types'; +import { NotificationService } from '@ghostfolio/ui/notifications'; import { ChangeDetectionStrategy, @@ -35,7 +36,6 @@ import { GfFooterComponent } from './components/footer/footer.component'; import { GfHeaderComponent } from './components/header/header.component'; import { GfHoldingDetailDialogComponent } from './components/holding-detail-dialog/holding-detail-dialog.component'; import { HoldingDetailDialogParams } from './components/holding-detail-dialog/interfaces/interfaces'; -import { NotificationService } from './core/notification/notification.service'; import { DataService } from './services/data.service'; import { ImpersonationStorageService } from './services/impersonation-storage.service'; import { TokenStorageService } from './services/token-storage.service'; diff --git a/apps/client/src/app/components/access-table/access-table.component.ts b/apps/client/src/app/components/access-table/access-table.component.ts index 1127e5629..fe2c81199 100644 --- a/apps/client/src/app/components/access-table/access-table.component.ts +++ b/apps/client/src/app/components/access-table/access-table.component.ts @@ -1,7 +1,7 @@ -import { NotificationService } from '@ghostfolio/client/core/notification/notification.service'; import { ConfirmationDialogType } from '@ghostfolio/common/enums'; import { Access, User } from '@ghostfolio/common/interfaces'; import { publicRoutes } from '@ghostfolio/common/routes/routes'; +import { NotificationService } from '@ghostfolio/ui/notifications'; import { Clipboard, ClipboardModule } from '@angular/cdk/clipboard'; import { CommonModule } from '@angular/common'; diff --git a/apps/client/src/app/components/admin-jobs/admin-jobs.component.ts b/apps/client/src/app/components/admin-jobs/admin-jobs.component.ts index 8ed72445f..66bac76f5 100644 --- a/apps/client/src/app/components/admin-jobs/admin-jobs.component.ts +++ b/apps/client/src/app/components/admin-jobs/admin-jobs.component.ts @@ -1,4 +1,3 @@ -import { NotificationService } from '@ghostfolio/client/core/notification/notification.service'; import { AdminService } from '@ghostfolio/client/services/admin.service'; import { UserService } from '@ghostfolio/client/services/user/user.service'; import { @@ -9,6 +8,7 @@ import { } from '@ghostfolio/common/config'; import { getDateWithTimeFormatString } from '@ghostfolio/common/helper'; import { AdminJobs, User } from '@ghostfolio/common/interfaces'; +import { NotificationService } from '@ghostfolio/ui/notifications'; import { CommonModule } from '@angular/common'; import { diff --git a/apps/client/src/app/components/admin-market-data/admin-market-data.service.ts b/apps/client/src/app/components/admin-market-data/admin-market-data.service.ts index 3f60cb8c5..eaad32c0e 100644 --- a/apps/client/src/app/components/admin-market-data/admin-market-data.service.ts +++ b/apps/client/src/app/components/admin-market-data/admin-market-data.service.ts @@ -1,4 +1,3 @@ -import { NotificationService } from '@ghostfolio/client/core/notification/notification.service'; import { AdminService } from '@ghostfolio/client/services/admin.service'; import { ghostfolioScraperApiSymbolPrefix } from '@ghostfolio/common/config'; import { ConfirmationDialogType } from '@ghostfolio/common/enums'; @@ -11,6 +10,7 @@ import { AssetProfileIdentifier, AdminMarketDataItem } from '@ghostfolio/common/interfaces'; +import { NotificationService } from '@ghostfolio/ui/notifications'; import { Injectable } from '@angular/core'; import { EMPTY, catchError, finalize, forkJoin } from 'rxjs'; diff --git a/apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts b/apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts index b2ef4f17b..3fe944a25 100644 --- a/apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts +++ b/apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts @@ -1,5 +1,4 @@ import { AdminMarketDataService } from '@ghostfolio/client/components/admin-market-data/admin-market-data.service'; -import { NotificationService } from '@ghostfolio/client/core/notification/notification.service'; import { AdminService } from '@ghostfolio/client/services/admin.service'; import { DataService } from '@ghostfolio/client/services/data.service'; import { UserService } from '@ghostfolio/client/services/user/user.service'; @@ -24,6 +23,7 @@ import { GfEntityLogoComponent } from '@ghostfolio/ui/entity-logo'; import { GfHistoricalMarketDataEditorComponent } from '@ghostfolio/ui/historical-market-data-editor'; import { translate } from '@ghostfolio/ui/i18n'; import { GfLineChartComponent } from '@ghostfolio/ui/line-chart'; +import { NotificationService } from '@ghostfolio/ui/notifications'; import { GfPortfolioProportionChartComponent } from '@ghostfolio/ui/portfolio-proportion-chart'; import { GfSymbolAutocompleteComponent } from '@ghostfolio/ui/symbol-autocomplete'; import { GfValueComponent } from '@ghostfolio/ui/value'; diff --git a/apps/client/src/app/components/admin-overview/admin-overview.component.ts b/apps/client/src/app/components/admin-overview/admin-overview.component.ts index 0b4b36d06..e4be7b062 100644 --- a/apps/client/src/app/components/admin-overview/admin-overview.component.ts +++ b/apps/client/src/app/components/admin-overview/admin-overview.component.ts @@ -1,4 +1,3 @@ -import { NotificationService } from '@ghostfolio/client/core/notification/notification.service'; import { AdminService } from '@ghostfolio/client/services/admin.service'; import { CacheService } from '@ghostfolio/client/services/cache.service'; import { DataService } from '@ghostfolio/client/services/data.service'; @@ -20,6 +19,7 @@ import { User } from '@ghostfolio/common/interfaces'; import { hasPermission, permissions } from '@ghostfolio/common/permissions'; +import { NotificationService } from '@ghostfolio/ui/notifications'; import { GfValueComponent } from '@ghostfolio/ui/value'; import { CommonModule } from '@angular/common'; diff --git a/apps/client/src/app/components/admin-platform/admin-platform.component.ts b/apps/client/src/app/components/admin-platform/admin-platform.component.ts index 64e7ff7cf..832a70503 100644 --- a/apps/client/src/app/components/admin-platform/admin-platform.component.ts +++ b/apps/client/src/app/components/admin-platform/admin-platform.component.ts @@ -1,10 +1,10 @@ -import { NotificationService } from '@ghostfolio/client/core/notification/notification.service'; import { AdminService } from '@ghostfolio/client/services/admin.service'; import { DataService } from '@ghostfolio/client/services/data.service'; import { UserService } from '@ghostfolio/client/services/user/user.service'; import { CreatePlatformDto, UpdatePlatformDto } from '@ghostfolio/common/dtos'; import { ConfirmationDialogType } from '@ghostfolio/common/enums'; import { GfEntityLogoComponent } from '@ghostfolio/ui/entity-logo'; +import { NotificationService } from '@ghostfolio/ui/notifications'; import { ChangeDetectionStrategy, diff --git a/apps/client/src/app/components/admin-settings/admin-settings.component.ts b/apps/client/src/app/components/admin-settings/admin-settings.component.ts index ec44b6e65..cabf4e589 100644 --- a/apps/client/src/app/components/admin-settings/admin-settings.component.ts +++ b/apps/client/src/app/components/admin-settings/admin-settings.component.ts @@ -1,7 +1,6 @@ import { GfAdminPlatformComponent } from '@ghostfolio/client/components/admin-platform/admin-platform.component'; import { GfAdminTagComponent } from '@ghostfolio/client/components/admin-tag/admin-tag.component'; import { GfDataProviderStatusComponent } from '@ghostfolio/client/components/data-provider-status/data-provider-status.component'; -import { NotificationService } from '@ghostfolio/client/core/notification/notification.service'; import { AdminService } from '@ghostfolio/client/services/admin.service'; import { DataService } from '@ghostfolio/client/services/data.service'; import { UserService } from '@ghostfolio/client/services/user/user.service'; @@ -15,6 +14,7 @@ import { } from '@ghostfolio/common/interfaces'; import { publicRoutes } from '@ghostfolio/common/routes/routes'; import { GfEntityLogoComponent } from '@ghostfolio/ui/entity-logo'; +import { NotificationService } from '@ghostfolio/ui/notifications'; import { GfPremiumIndicatorComponent } from '@ghostfolio/ui/premium-indicator'; import { GfValueComponent } from '@ghostfolio/ui/value'; diff --git a/apps/client/src/app/components/admin-tag/admin-tag.component.ts b/apps/client/src/app/components/admin-tag/admin-tag.component.ts index a891baa45..305eb4628 100644 --- a/apps/client/src/app/components/admin-tag/admin-tag.component.ts +++ b/apps/client/src/app/components/admin-tag/admin-tag.component.ts @@ -1,8 +1,8 @@ -import { NotificationService } from '@ghostfolio/client/core/notification/notification.service'; import { DataService } from '@ghostfolio/client/services/data.service'; import { UserService } from '@ghostfolio/client/services/user/user.service'; import { CreateTagDto, UpdateTagDto } from '@ghostfolio/common/dtos'; import { ConfirmationDialogType } from '@ghostfolio/common/enums'; +import { NotificationService } from '@ghostfolio/ui/notifications'; import { ChangeDetectionStrategy, diff --git a/apps/client/src/app/components/admin-users/admin-users.component.ts b/apps/client/src/app/components/admin-users/admin-users.component.ts index 6c366a16c..99fbe7901 100644 --- a/apps/client/src/app/components/admin-users/admin-users.component.ts +++ b/apps/client/src/app/components/admin-users/admin-users.component.ts @@ -1,6 +1,5 @@ import { UserDetailDialogParams } from '@ghostfolio/client/components/user-detail-dialog/interfaces/interfaces'; import { GfUserDetailDialogComponent } from '@ghostfolio/client/components/user-detail-dialog/user-detail-dialog.component'; -import { NotificationService } from '@ghostfolio/client/core/notification/notification.service'; import { AdminService } from '@ghostfolio/client/services/admin.service'; import { DataService } from '@ghostfolio/client/services/data.service'; import { ImpersonationStorageService } from '@ghostfolio/client/services/impersonation-storage.service'; @@ -19,6 +18,7 @@ import { User } from '@ghostfolio/common/interfaces'; import { hasPermission, permissions } from '@ghostfolio/common/permissions'; +import { NotificationService } from '@ghostfolio/ui/notifications'; import { GfPremiumIndicatorComponent } from '@ghostfolio/ui/premium-indicator'; import { GfValueComponent } from '@ghostfolio/ui/value'; diff --git a/apps/client/src/app/components/header/header.component.ts b/apps/client/src/app/components/header/header.component.ts index 80239d56f..b7bf4cb98 100644 --- a/apps/client/src/app/components/header/header.component.ts +++ b/apps/client/src/app/components/header/header.component.ts @@ -1,7 +1,6 @@ import { LoginWithAccessTokenDialogParams } from '@ghostfolio/client/components/login-with-access-token-dialog/interfaces/interfaces'; import { GfLoginWithAccessTokenDialogComponent } from '@ghostfolio/client/components/login-with-access-token-dialog/login-with-access-token-dialog.component'; import { LayoutService } from '@ghostfolio/client/core/layout.service'; -import { NotificationService } from '@ghostfolio/client/core/notification/notification.service'; import { DataService } from '@ghostfolio/client/services/data.service'; import { ImpersonationStorageService } from '@ghostfolio/client/services/impersonation-storage.service'; import { @@ -17,6 +16,7 @@ import { internalRoutes, publicRoutes } from '@ghostfolio/common/routes/routes'; import { DateRange } from '@ghostfolio/common/types'; import { GfAssistantComponent } from '@ghostfolio/ui/assistant/assistant.component'; import { GfLogoComponent } from '@ghostfolio/ui/logo'; +import { NotificationService } from '@ghostfolio/ui/notifications'; import { GfPremiumIndicatorComponent } from '@ghostfolio/ui/premium-indicator'; import { CommonModule } from '@angular/common'; diff --git a/apps/client/src/app/components/portfolio-performance/portfolio-performance.component.ts b/apps/client/src/app/components/portfolio-performance/portfolio-performance.component.ts index c98a26831..04c0f507c 100644 --- a/apps/client/src/app/components/portfolio-performance/portfolio-performance.component.ts +++ b/apps/client/src/app/components/portfolio-performance/portfolio-performance.component.ts @@ -1,4 +1,3 @@ -import { NotificationService } from '@ghostfolio/client/core/notification/notification.service'; import { getLocale, getNumberFormatDecimal, @@ -8,6 +7,7 @@ import { PortfolioPerformance, ResponseError } from '@ghostfolio/common/interfaces'; +import { NotificationService } from '@ghostfolio/ui/notifications'; import { GfValueComponent } from '@ghostfolio/ui/value'; import { CommonModule } from '@angular/common'; diff --git a/apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts b/apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts index 7eab9172e..9e9bb13d3 100644 --- a/apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts +++ b/apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts @@ -1,8 +1,8 @@ -import { NotificationService } from '@ghostfolio/client/core/notification/notification.service'; import { NUMERICAL_PRECISION_THRESHOLD_6_FIGURES } from '@ghostfolio/common/config'; import { getDateFnsLocale, getLocale } from '@ghostfolio/common/helper'; import { PortfolioSummary, User } from '@ghostfolio/common/interfaces'; import { translate } from '@ghostfolio/ui/i18n'; +import { NotificationService } from '@ghostfolio/ui/notifications'; import { GfValueComponent } from '@ghostfolio/ui/value'; import { CommonModule } from '@angular/common'; diff --git a/apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts b/apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts index 9aa07feee..05c047dc6 100644 --- a/apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts +++ b/apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts @@ -1,7 +1,7 @@ -import { NotificationService } from '@ghostfolio/client/core/notification/notification.service'; import { DataService } from '@ghostfolio/client/services/data.service'; import { CreateAccessDto, UpdateAccessDto } from '@ghostfolio/common/dtos'; import { validateObjectForForm } from '@ghostfolio/common/utils'; +import { NotificationService } from '@ghostfolio/ui/notifications'; import { ChangeDetectionStrategy, diff --git a/apps/client/src/app/components/user-account-access/user-account-access.component.ts b/apps/client/src/app/components/user-account-access/user-account-access.component.ts index da2e8f508..11960b8aa 100644 --- a/apps/client/src/app/components/user-account-access/user-account-access.component.ts +++ b/apps/client/src/app/components/user-account-access/user-account-access.component.ts @@ -1,5 +1,4 @@ import { GfAccessTableComponent } from '@ghostfolio/client/components/access-table/access-table.component'; -import { NotificationService } from '@ghostfolio/client/core/notification/notification.service'; import { DataService } from '@ghostfolio/client/services/data.service'; import { TokenStorageService } from '@ghostfolio/client/services/token-storage.service'; import { UserService } from '@ghostfolio/client/services/user/user.service'; @@ -7,6 +6,7 @@ import { CreateAccessDto } from '@ghostfolio/common/dtos'; import { ConfirmationDialogType } from '@ghostfolio/common/enums'; import { Access, User } from '@ghostfolio/common/interfaces'; import { hasPermission, permissions } from '@ghostfolio/common/permissions'; +import { NotificationService } from '@ghostfolio/ui/notifications'; import { GfPremiumIndicatorComponent } from '@ghostfolio/ui/premium-indicator'; import { diff --git a/apps/client/src/app/components/user-account-membership/user-account-membership.component.ts b/apps/client/src/app/components/user-account-membership/user-account-membership.component.ts index ae9183c13..069ea4b0e 100644 --- a/apps/client/src/app/components/user-account-membership/user-account-membership.component.ts +++ b/apps/client/src/app/components/user-account-membership/user-account-membership.component.ts @@ -1,4 +1,3 @@ -import { NotificationService } from '@ghostfolio/client/core/notification/notification.service'; import { DataService } from '@ghostfolio/client/services/data.service'; import { UserService } from '@ghostfolio/client/services/user/user.service'; import { ConfirmationDialogType } from '@ghostfolio/common/enums'; @@ -7,6 +6,7 @@ import { User } from '@ghostfolio/common/interfaces'; import { hasPermission, permissions } from '@ghostfolio/common/permissions'; import { publicRoutes } from '@ghostfolio/common/routes/routes'; import { GfMembershipCardComponent } from '@ghostfolio/ui/membership-card'; +import { NotificationService } from '@ghostfolio/ui/notifications'; import { GfPremiumIndicatorComponent } from '@ghostfolio/ui/premium-indicator'; import { CommonModule } from '@angular/common'; diff --git a/apps/client/src/app/components/user-account-settings/user-account-settings.component.ts b/apps/client/src/app/components/user-account-settings/user-account-settings.component.ts index 32e3d132e..e17425676 100644 --- a/apps/client/src/app/components/user-account-settings/user-account-settings.component.ts +++ b/apps/client/src/app/components/user-account-settings/user-account-settings.component.ts @@ -1,4 +1,3 @@ -import { NotificationService } from '@ghostfolio/client/core/notification/notification.service'; import { DataService } from '@ghostfolio/client/services/data.service'; import { KEY_STAY_SIGNED_IN, @@ -12,6 +11,7 @@ import { ConfirmationDialogType } from '@ghostfolio/common/enums'; import { downloadAsFile } from '@ghostfolio/common/helper'; import { User } from '@ghostfolio/common/interfaces'; import { hasPermission, permissions } from '@ghostfolio/common/permissions'; +import { NotificationService } from '@ghostfolio/ui/notifications'; import { ChangeDetectionStrategy, diff --git a/apps/client/src/app/core/layout.service.ts b/apps/client/src/app/core/layout.service.ts index a6fb65006..fd435acdb 100644 --- a/apps/client/src/app/core/layout.service.ts +++ b/apps/client/src/app/core/layout.service.ts @@ -1,9 +1,9 @@ +import { NotificationService } from '@ghostfolio/ui/notifications'; + import { Injectable } from '@angular/core'; import { DeviceDetectorService } from 'ngx-device-detector'; import { Observable, Subject } from 'rxjs'; -import { NotificationService } from './notification/notification.service'; - @Injectable({ providedIn: 'root' }) diff --git a/apps/client/src/app/pages/accounts/accounts-page.component.ts b/apps/client/src/app/pages/accounts/accounts-page.component.ts index 2bb6457a5..2b496e4fb 100644 --- a/apps/client/src/app/pages/accounts/accounts-page.component.ts +++ b/apps/client/src/app/pages/accounts/accounts-page.component.ts @@ -1,6 +1,5 @@ import { GfAccountDetailDialogComponent } from '@ghostfolio/client/components/account-detail-dialog/account-detail-dialog.component'; import { AccountDetailDialogParams } from '@ghostfolio/client/components/account-detail-dialog/interfaces/interfaces'; -import { NotificationService } from '@ghostfolio/client/core/notification/notification.service'; import { DataService } from '@ghostfolio/client/services/data.service'; import { ImpersonationStorageService } from '@ghostfolio/client/services/impersonation-storage.service'; import { UserService } from '@ghostfolio/client/services/user/user.service'; @@ -12,6 +11,7 @@ import { import { User } from '@ghostfolio/common/interfaces'; import { hasPermission, permissions } from '@ghostfolio/common/permissions'; import { GfAccountsTableComponent } from '@ghostfolio/ui/accounts-table'; +import { NotificationService } from '@ghostfolio/ui/notifications'; import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core'; import { MatButtonModule } from '@angular/material/button'; diff --git a/apps/client/src/app/pages/demo/demo-page.component.ts b/apps/client/src/app/pages/demo/demo-page.component.ts index 720bb4974..9eba64788 100644 --- a/apps/client/src/app/pages/demo/demo-page.component.ts +++ b/apps/client/src/app/pages/demo/demo-page.component.ts @@ -1,7 +1,7 @@ -import { NotificationService } from '@ghostfolio/client/core/notification/notification.service'; import { DataService } from '@ghostfolio/client/services/data.service'; import { TokenStorageService } from '@ghostfolio/client/services/token-storage.service'; import { InfoItem } from '@ghostfolio/common/interfaces'; +import { NotificationService } from '@ghostfolio/ui/notifications'; import { Component, OnDestroy } from '@angular/core'; import { Router } from '@angular/router'; diff --git a/apps/client/src/app/pages/pricing/pricing-page.component.ts b/apps/client/src/app/pages/pricing/pricing-page.component.ts index 88958ea0d..6ed8dfd31 100644 --- a/apps/client/src/app/pages/pricing/pricing-page.component.ts +++ b/apps/client/src/app/pages/pricing/pricing-page.component.ts @@ -1,10 +1,10 @@ -import { NotificationService } from '@ghostfolio/client/core/notification/notification.service'; import { DataService } from '@ghostfolio/client/services/data.service'; import { UserService } from '@ghostfolio/client/services/user/user.service'; import { User } from '@ghostfolio/common/interfaces'; import { hasPermission, permissions } from '@ghostfolio/common/permissions'; import { publicRoutes } from '@ghostfolio/common/routes/routes'; import { translate } from '@ghostfolio/ui/i18n'; +import { NotificationService } from '@ghostfolio/ui/notifications'; import { GfPremiumIndicatorComponent } from '@ghostfolio/ui/premium-indicator'; import { CommonModule } from '@angular/common'; diff --git a/apps/client/src/main.ts b/apps/client/src/main.ts index fc8a9ef7a..2a22b7b7b 100644 --- a/apps/client/src/main.ts +++ b/apps/client/src/main.ts @@ -1,6 +1,7 @@ import { locale } from '@ghostfolio/common/config'; import { InfoResponse } from '@ghostfolio/common/interfaces'; import { filterGlobalPermissions } from '@ghostfolio/common/permissions'; +import { GfNotificationModule } from '@ghostfolio/ui/notifications'; import { Platform } from '@angular/cdk/platform'; import { @@ -33,7 +34,6 @@ import { authInterceptorProviders } from './app/core/auth.interceptor'; import { httpResponseInterceptorProviders } from './app/core/http-response.interceptor'; import { LanguageService } from './app/core/language.service'; import { ModulePreloadService } from './app/core/module-preload.service'; -import { GfNotificationModule } from './app/core/notification/notification.module'; import { PageTitleStrategy } from './app/services/page-title.strategy'; import { environment } from './environments/environment'; diff --git a/libs/ui/src/lib/account-balances/account-balances.component.ts b/libs/ui/src/lib/account-balances/account-balances.component.ts index 5fe47347e..608ee1c75 100644 --- a/libs/ui/src/lib/account-balances/account-balances.component.ts +++ b/libs/ui/src/lib/account-balances/account-balances.component.ts @@ -1,10 +1,9 @@ -/* eslint-disable @nx/enforce-module-boundaries */ -import { NotificationService } from '@ghostfolio/client/core/notification/notification.service'; import { CreateAccountBalanceDto } from '@ghostfolio/common/dtos'; import { ConfirmationDialogType } from '@ghostfolio/common/enums'; import { DATE_FORMAT, getLocale } from '@ghostfolio/common/helper'; import { AccountBalancesResponse } from '@ghostfolio/common/interfaces'; import { validateObjectForForm } from '@ghostfolio/common/utils'; +import { NotificationService } from '@ghostfolio/ui/notifications'; import { CUSTOM_ELEMENTS_SCHEMA, diff --git a/libs/ui/src/lib/accounts-table/accounts-table.component.stories.ts b/libs/ui/src/lib/accounts-table/accounts-table.component.stories.ts index aeda82fd9..53c59a95f 100644 --- a/libs/ui/src/lib/accounts-table/accounts-table.component.stories.ts +++ b/libs/ui/src/lib/accounts-table/accounts-table.component.stories.ts @@ -7,10 +7,10 @@ import { RouterModule } from '@angular/router'; import { IonIcon } from '@ionic/angular/standalone'; import { moduleMetadata } from '@storybook/angular'; import type { Meta, StoryObj } from '@storybook/angular'; -import { NotificationService } from 'apps/client/src/app/core/notification/notification.service'; import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader'; import { GfEntityLogoComponent } from '../entity-logo'; +import { NotificationService } from '../notifications'; import { GfValueComponent } from '../value'; import { GfAccountsTableComponent } from './accounts-table.component'; diff --git a/libs/ui/src/lib/accounts-table/accounts-table.component.ts b/libs/ui/src/lib/accounts-table/accounts-table.component.ts index 898231168..699de6d7e 100644 --- a/libs/ui/src/lib/accounts-table/accounts-table.component.ts +++ b/libs/ui/src/lib/accounts-table/accounts-table.component.ts @@ -1,8 +1,7 @@ -/* eslint-disable @nx/enforce-module-boundaries */ -import { NotificationService } from '@ghostfolio/client/core/notification/notification.service'; import { ConfirmationDialogType } from '@ghostfolio/common/enums'; import { getLocale } from '@ghostfolio/common/helper'; import { GfEntityLogoComponent } from '@ghostfolio/ui/entity-logo'; +import { NotificationService } from '@ghostfolio/ui/notifications'; import { GfValueComponent } from '@ghostfolio/ui/value'; import { CommonModule } from '@angular/common'; diff --git a/libs/ui/src/lib/activities-table/activities-table.component.stories.ts b/libs/ui/src/lib/activities-table/activities-table.component.stories.ts index a0ad690d7..e7a2ba819 100644 --- a/libs/ui/src/lib/activities-table/activities-table.component.stories.ts +++ b/libs/ui/src/lib/activities-table/activities-table.component.stories.ts @@ -13,12 +13,12 @@ import { RouterModule } from '@angular/router'; import { IonIcon } from '@ionic/angular/standalone'; import { moduleMetadata } from '@storybook/angular'; import type { Meta, StoryObj } from '@storybook/angular'; -import { NotificationService } from 'apps/client/src/app/core/notification/notification.service'; import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader'; import { GfActivityTypeComponent } from '../activity-type/activity-type.component'; import { GfEntityLogoComponent } from '../entity-logo'; import { GfNoTransactionsInfoComponent } from '../no-transactions-info/no-transactions-info.component'; +import { NotificationService } from '../notifications'; import { GfValueComponent } from '../value'; import { GfActivitiesTableComponent } from './activities-table.component'; diff --git a/libs/ui/src/lib/activities-table/activities-table.component.ts b/libs/ui/src/lib/activities-table/activities-table.component.ts index 476fca5fb..e53f37872 100644 --- a/libs/ui/src/lib/activities-table/activities-table.component.ts +++ b/libs/ui/src/lib/activities-table/activities-table.component.ts @@ -1,5 +1,3 @@ -/* eslint-disable @nx/enforce-module-boundaries */ -import { NotificationService } from '@ghostfolio/client/core/notification/notification.service'; import { DEFAULT_PAGE_SIZE, TAG_ID_EXCLUDE_FROM_ANALYSIS @@ -12,6 +10,7 @@ import { } from '@ghostfolio/common/interfaces'; import { GfSymbolPipe } from '@ghostfolio/common/pipes'; import { OrderWithAccount } from '@ghostfolio/common/types'; +import { NotificationService } from '@ghostfolio/ui/notifications'; import { SelectionModel } from '@angular/cdk/collections'; import { CommonModule } from '@angular/common'; diff --git a/libs/ui/src/lib/benchmark/benchmark.component.ts b/libs/ui/src/lib/benchmark/benchmark.component.ts index 5793300c1..fe53240ed 100644 --- a/libs/ui/src/lib/benchmark/benchmark.component.ts +++ b/libs/ui/src/lib/benchmark/benchmark.component.ts @@ -1,5 +1,3 @@ -/* eslint-disable @nx/enforce-module-boundaries */ -import { NotificationService } from '@ghostfolio/client/core/notification/notification.service'; import { ConfirmationDialogType } from '@ghostfolio/common/enums'; import { getLocale, resolveMarketCondition } from '@ghostfolio/common/helper'; import { @@ -7,6 +5,7 @@ import { Benchmark, User } from '@ghostfolio/common/interfaces'; +import { NotificationService } from '@ghostfolio/ui/notifications'; import { CommonModule } from '@angular/common'; import { diff --git a/apps/client/src/app/core/notification/alert-dialog/alert-dialog.component.ts b/libs/ui/src/lib/notifications/alert-dialog/alert-dialog.component.ts similarity index 100% rename from apps/client/src/app/core/notification/alert-dialog/alert-dialog.component.ts rename to libs/ui/src/lib/notifications/alert-dialog/alert-dialog.component.ts diff --git a/apps/client/src/app/core/notification/alert-dialog/alert-dialog.html b/libs/ui/src/lib/notifications/alert-dialog/alert-dialog.html similarity index 100% rename from apps/client/src/app/core/notification/alert-dialog/alert-dialog.html rename to libs/ui/src/lib/notifications/alert-dialog/alert-dialog.html diff --git a/apps/client/src/app/core/notification/alert-dialog/alert-dialog.scss b/libs/ui/src/lib/notifications/alert-dialog/alert-dialog.scss similarity index 100% rename from apps/client/src/app/core/notification/alert-dialog/alert-dialog.scss rename to libs/ui/src/lib/notifications/alert-dialog/alert-dialog.scss diff --git a/apps/client/src/app/core/notification/alert-dialog/interfaces/interfaces.ts b/libs/ui/src/lib/notifications/alert-dialog/interfaces/interfaces.ts similarity index 100% rename from apps/client/src/app/core/notification/alert-dialog/interfaces/interfaces.ts rename to libs/ui/src/lib/notifications/alert-dialog/interfaces/interfaces.ts diff --git a/apps/client/src/app/core/notification/confirmation-dialog/confirmation-dialog.component.ts b/libs/ui/src/lib/notifications/confirmation-dialog/confirmation-dialog.component.ts similarity index 100% rename from apps/client/src/app/core/notification/confirmation-dialog/confirmation-dialog.component.ts rename to libs/ui/src/lib/notifications/confirmation-dialog/confirmation-dialog.component.ts diff --git a/apps/client/src/app/core/notification/confirmation-dialog/confirmation-dialog.html b/libs/ui/src/lib/notifications/confirmation-dialog/confirmation-dialog.html similarity index 100% rename from apps/client/src/app/core/notification/confirmation-dialog/confirmation-dialog.html rename to libs/ui/src/lib/notifications/confirmation-dialog/confirmation-dialog.html diff --git a/apps/client/src/app/core/notification/confirmation-dialog/confirmation-dialog.scss b/libs/ui/src/lib/notifications/confirmation-dialog/confirmation-dialog.scss similarity index 100% rename from apps/client/src/app/core/notification/confirmation-dialog/confirmation-dialog.scss rename to libs/ui/src/lib/notifications/confirmation-dialog/confirmation-dialog.scss diff --git a/apps/client/src/app/core/notification/confirmation-dialog/interfaces/interfaces.ts b/libs/ui/src/lib/notifications/confirmation-dialog/interfaces/interfaces.ts similarity index 100% rename from apps/client/src/app/core/notification/confirmation-dialog/interfaces/interfaces.ts rename to libs/ui/src/lib/notifications/confirmation-dialog/interfaces/interfaces.ts diff --git a/libs/ui/src/lib/notifications/index.ts b/libs/ui/src/lib/notifications/index.ts new file mode 100644 index 000000000..864083b16 --- /dev/null +++ b/libs/ui/src/lib/notifications/index.ts @@ -0,0 +1,3 @@ +export * from './interfaces/interfaces'; +export * from './notification.module'; +export * from './notification.service'; diff --git a/apps/client/src/app/core/notification/interfaces/interfaces.ts b/libs/ui/src/lib/notifications/interfaces/interfaces.ts similarity index 100% rename from apps/client/src/app/core/notification/interfaces/interfaces.ts rename to libs/ui/src/lib/notifications/interfaces/interfaces.ts diff --git a/apps/client/src/app/core/notification/notification.module.ts b/libs/ui/src/lib/notifications/notification.module.ts similarity index 100% rename from apps/client/src/app/core/notification/notification.module.ts rename to libs/ui/src/lib/notifications/notification.module.ts diff --git a/apps/client/src/app/core/notification/notification.service.ts b/libs/ui/src/lib/notifications/notification.service.ts similarity index 100% rename from apps/client/src/app/core/notification/notification.service.ts rename to libs/ui/src/lib/notifications/notification.service.ts diff --git a/apps/client/src/app/core/notification/prompt-dialog/prompt-dialog.component.ts b/libs/ui/src/lib/notifications/prompt-dialog/prompt-dialog.component.ts similarity index 100% rename from apps/client/src/app/core/notification/prompt-dialog/prompt-dialog.component.ts rename to libs/ui/src/lib/notifications/prompt-dialog/prompt-dialog.component.ts diff --git a/apps/client/src/app/core/notification/prompt-dialog/prompt-dialog.html b/libs/ui/src/lib/notifications/prompt-dialog/prompt-dialog.html similarity index 100% rename from apps/client/src/app/core/notification/prompt-dialog/prompt-dialog.html rename to libs/ui/src/lib/notifications/prompt-dialog/prompt-dialog.html From 0683c5b69b2512043514bb2d2b50963ed0a2d68a Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Tue, 9 Dec 2025 17:24:22 +0100 Subject: [PATCH 31/31] Task/update OSS Friends (#6047) * Update OSS Friends --- apps/client/src/assets/oss-friends.json | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/apps/client/src/assets/oss-friends.json b/apps/client/src/assets/oss-friends.json index 8a64650fe..2d5b994d3 100644 --- a/apps/client/src/assets/oss-friends.json +++ b/apps/client/src/assets/oss-friends.json @@ -1,5 +1,5 @@ { - "createdAt": "2025-11-21T00:00:00.000Z", + "createdAt": "2025-12-08T00:00:00.000Z", "data": [ { "name": "Activepieces", @@ -76,6 +76,11 @@ "description": "Mockoon is the easiest and quickest way to design and run mock REST APIs.", "href": "https://mockoon.com" }, + { + "name": "Onyx", + "description": "Onyx is the open-source AI chat connected to your docs, apps, and people.", + "href": "https://onyx.app" + }, { "name": "OpenBB", "description": "Democratizing investment research through an open source financial ecosystem. The OpenBB Terminal allows everyone to perform investment research, from everywhere.",