Browse Source

Merge branch 'main' into bugfix/update-account-balance-of-activity-without-account

pull/7402/head
Thomas Kaul 1 month ago
committed by GitHub
parent
commit
1e9eec2db7
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 10
      CHANGELOG.md
  2. 9
      apps/api/src/main.ts
  3. 6
      apps/client/src/app/pages/landing/landing-page.html
  4. 2
      apps/client/src/locales/messages.pl.xlf
  5. 2
      apps/client/src/main.ts
  6. 2
      libs/ui/src/lib/carousel/carousel.component.ts
  7. 8
      libs/ui/src/lib/entity-logo/entity-logo.component.stories.ts
  8. 12
      libs/ui/src/lib/fire-calculator/fire-calculator.component.stories.ts
  9. 8
      libs/ui/src/lib/symbol-autocomplete/symbol-autocomplete.component.stories.ts
  10. 10
      libs/ui/src/lib/tags-selector/tags-selector.component.stories.ts
  11. 2
      libs/ui/src/lib/top-holdings/top-holdings.component.html
  12. 15
      libs/ui/src/lib/top-holdings/top-holdings.component.scss
  13. 17
      libs/ui/src/lib/top-holdings/top-holdings.component.ts
  14. 9
      libs/ui/src/lib/value/value.component.stories.ts

10
CHANGELOG.md

@ -7,9 +7,19 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## Unreleased ## Unreleased
### Added
- Added the stack trace logging for `MaxListenersExceededWarning` occurrences
### Changed
- Refactored the deprecated animation providers (`provideAnimations()` and `provideNoopAnimations()`)
- Improved the language localization for Polish (`pl`)
### Fixed ### Fixed
- Resolved an exception in the `POST api/v1/order` endpoint when creating an activity with the update account balance option but without an account - Resolved an exception in the `POST api/v1/order` endpoint when creating an activity with the update account balance option but without an account
- Improved the spacing in the testimonial section on the landing page
## 3.32.0 - 2026-07-22 ## 3.32.0 - 2026-07-22

9
apps/api/src/main.ts

@ -26,6 +26,15 @@ import { AppModule } from './app/app.module';
import { environment } from './environments/environment'; import { environment } from './environments/environment';
const logger = new Logger('Bootstrap'); const logger = new Logger('Bootstrap');
const processWarningLogger = new Logger('ProcessWarning');
process.on('warning', ({ name, stack }) => {
if (name === 'MaxListenersExceededWarning') {
// Log the stack trace of MaxListenersExceededWarning occurrences to identify
// the event emitter and the call site which registers the listeners
processWarningLogger.warn(stack);
}
});
async function bootstrap() { async function bootstrap() {
// Respect HTTP_PROXY / HTTPS_PROXY / NO_PROXY for outbound HTTP requests // Respect HTTP_PROXY / HTTPS_PROXY / NO_PROXY for outbound HTTP requests

6
apps/client/src/app/pages/landing/landing-page.html

@ -247,11 +247,11 @@
@if (testimonial.url) { @if (testimonial.url) {
<a target="_blank" [href]="testimonial.url">{{ <a target="_blank" [href]="testimonial.url">{{
testimonial.author testimonial.author
}}</a> }}</a
>,
} @else { } @else {
<span>{{ testimonial.author }}</span> <span>{{ testimonial.author }},</span>
} }
,
{{ testimonial.country }} {{ testimonial.country }}
</div> </div>
</div> </div>

2
apps/client/src/locales/messages.pl.xlf

@ -6526,7 +6526,7 @@
</trans-unit> </trans-unit>
<trans-unit id="8204176479746810612" datatype="html"> <trans-unit id="8204176479746810612" datatype="html">
<source>Active</source> <source>Active</source>
<target state="translated">Antywne</target> <target state="translated">Aktywne</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/home-holdings/home-holdings.component.ts</context> <context context-type="sourcefile">apps/client/src/app/components/home-holdings/home-holdings.component.ts</context>
<context context-type="linenumber">64</context> <context context-type="linenumber">64</context>

2
apps/client/src/main.ts

@ -23,7 +23,6 @@ import {
import { MatSnackBarModule } from '@angular/material/snack-bar'; import { MatSnackBarModule } from '@angular/material/snack-bar';
import { MatTooltipModule } from '@angular/material/tooltip'; import { MatTooltipModule } from '@angular/material/tooltip';
import { bootstrapApplication } from '@angular/platform-browser'; import { bootstrapApplication } from '@angular/platform-browser';
import { provideAnimations } from '@angular/platform-browser/animations';
import { RouterModule, TitleStrategy } from '@angular/router'; import { RouterModule, TitleStrategy } from '@angular/router';
import { ServiceWorkerModule } from '@angular/service-worker'; import { ServiceWorkerModule } from '@angular/service-worker';
import { provideIonicAngular } from '@ionic/angular/standalone'; import { provideIonicAngular } from '@ionic/angular/standalone';
@ -82,7 +81,6 @@ import { environment } from './environments/environment';
), ),
LanguageService, LanguageService,
ModulePreloadService, ModulePreloadService,
provideAnimations(),
provideHttpClient(withInterceptorsFromDi()), provideHttpClient(withInterceptorsFromDi()),
provideIonicAngular(), provideIonicAngular(),
provideMarkdown(), provideMarkdown(),

2
libs/ui/src/lib/carousel/carousel.component.ts

@ -1,4 +1,5 @@
import { import {
ANIMATION_MODULE_TYPE,
CUSTOM_ELEMENTS_SCHEMA, CUSTOM_ELEMENTS_SCHEMA,
ChangeDetectionStrategy, ChangeDetectionStrategy,
Component, Component,
@ -11,7 +12,6 @@ import {
ViewChild ViewChild
} from '@angular/core'; } from '@angular/core';
import { MatButtonModule } from '@angular/material/button'; import { MatButtonModule } from '@angular/material/button';
import { ANIMATION_MODULE_TYPE } from '@angular/platform-browser/animations';
import { IonIcon } from '@ionic/angular/standalone'; import { IonIcon } from '@ionic/angular/standalone';
import { addIcons } from 'ionicons'; import { addIcons } from 'ionicons';
import { chevronBackOutline, chevronForwardOutline } from 'ionicons/icons'; import { chevronBackOutline, chevronForwardOutline } from 'ionicons/icons';

8
libs/ui/src/lib/entity-logo/entity-logo.component.stories.ts

@ -1,6 +1,5 @@
import { CommonModule } from '@angular/common'; import { CommonModule } from '@angular/common';
import { importProvidersFrom } from '@angular/core'; import { ANIMATION_MODULE_TYPE, importProvidersFrom } from '@angular/core';
import { provideNoopAnimations } from '@angular/platform-browser/animations';
import { applicationConfig, Meta, StoryObj } from '@storybook/angular'; import { applicationConfig, Meta, StoryObj } from '@storybook/angular';
import { EntityLogoImageSourceServiceMock } from '../mocks/entity-logo-image-source.service.mock'; import { EntityLogoImageSourceServiceMock } from '../mocks/entity-logo-image-source.service.mock';
@ -13,8 +12,11 @@ export default {
decorators: [ decorators: [
applicationConfig({ applicationConfig({
providers: [ providers: [
provideNoopAnimations(),
importProvidersFrom(CommonModule), importProvidersFrom(CommonModule),
{
provide: ANIMATION_MODULE_TYPE,
useValue: 'NoopAnimations'
},
{ {
provide: EntityLogoImageSourceService, provide: EntityLogoImageSourceService,
useValue: new EntityLogoImageSourceServiceMock() useValue: new EntityLogoImageSourceServiceMock()

12
libs/ui/src/lib/fire-calculator/fire-calculator.component.stories.ts

@ -1,6 +1,7 @@
import { DEFAULT_LOCALE } from '@ghostfolio/common/config'; import { DEFAULT_LOCALE } from '@ghostfolio/common/config';
import { CommonModule } from '@angular/common'; import { CommonModule } from '@angular/common';
import { ANIMATION_MODULE_TYPE } from '@angular/core';
import { FormsModule, ReactiveFormsModule } from '@angular/forms'; import { FormsModule, ReactiveFormsModule } from '@angular/forms';
import '@angular/localize/init'; import '@angular/localize/init';
import { MatButtonModule } from '@angular/material/button'; import { MatButtonModule } from '@angular/material/button';
@ -8,7 +9,6 @@ import { provideNativeDateAdapter } from '@angular/material/core';
import { MatDatepickerModule } from '@angular/material/datepicker'; import { MatDatepickerModule } from '@angular/material/datepicker';
import { MatFormFieldModule } from '@angular/material/form-field'; import { MatFormFieldModule } from '@angular/material/form-field';
import { MatInputModule } from '@angular/material/input'; import { MatInputModule } from '@angular/material/input';
import { NoopAnimationsModule } from '@angular/platform-browser/animations';
import { moduleMetadata } from '@storybook/angular'; import { moduleMetadata } from '@storybook/angular';
import type { Meta, StoryObj } from '@storybook/angular'; import type { Meta, StoryObj } from '@storybook/angular';
import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader'; import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader';
@ -32,10 +32,16 @@ export default {
MatFormFieldModule, MatFormFieldModule,
MatInputModule, MatInputModule,
NgxSkeletonLoaderModule, NgxSkeletonLoaderModule,
NoopAnimationsModule,
ReactiveFormsModule ReactiveFormsModule
], ],
providers: [FireCalculatorService, provideNativeDateAdapter()] providers: [
FireCalculatorService,
provideNativeDateAdapter(),
{
provide: ANIMATION_MODULE_TYPE,
useValue: 'NoopAnimations'
}
]
}) })
] ]
} as Meta<GfFireCalculatorComponent>; } as Meta<GfFireCalculatorComponent>;

8
libs/ui/src/lib/symbol-autocomplete/symbol-autocomplete.component.stories.ts

@ -2,14 +2,13 @@ import { LookupItem } from '@ghostfolio/common/interfaces';
import { CommonModule } from '@angular/common'; import { CommonModule } from '@angular/common';
import { HttpClient } from '@angular/common/http'; import { HttpClient } from '@angular/common/http';
import { importProvidersFrom } from '@angular/core'; import { ANIMATION_MODULE_TYPE, importProvidersFrom } from '@angular/core';
import { import {
FormControl, FormControl,
FormsModule, FormsModule,
NgControl, NgControl,
ReactiveFormsModule ReactiveFormsModule
} from '@angular/forms'; } from '@angular/forms';
import { provideNoopAnimations } from '@angular/platform-browser/animations';
import { applicationConfig, Meta, StoryObj } from '@storybook/angular'; import { applicationConfig, Meta, StoryObj } from '@storybook/angular';
import { HttpClientMock } from '../mocks/httpClient.mock'; import { HttpClientMock } from '../mocks/httpClient.mock';
@ -75,8 +74,11 @@ export default {
decorators: [ decorators: [
applicationConfig({ applicationConfig({
providers: [ providers: [
provideNoopAnimations(),
importProvidersFrom(CommonModule, FormsModule, ReactiveFormsModule), importProvidersFrom(CommonModule, FormsModule, ReactiveFormsModule),
{
provide: ANIMATION_MODULE_TYPE,
useValue: 'NoopAnimations'
},
{ {
provide: NgControl, provide: NgControl,
useValue: { useValue: {

10
libs/ui/src/lib/tags-selector/tags-selector.component.stories.ts

@ -1,6 +1,6 @@
import { CommonModule } from '@angular/common'; import { CommonModule } from '@angular/common';
import { ANIMATION_MODULE_TYPE } from '@angular/core';
import '@angular/localize/init'; import '@angular/localize/init';
import { NoopAnimationsModule } from '@angular/platform-browser/animations';
import { Meta, moduleMetadata, StoryObj } from '@storybook/angular'; import { Meta, moduleMetadata, StoryObj } from '@storybook/angular';
import { GfTagsSelectorComponent } from './tags-selector.component'; import { GfTagsSelectorComponent } from './tags-selector.component';
@ -10,7 +10,13 @@ export default {
component: GfTagsSelectorComponent, component: GfTagsSelectorComponent,
decorators: [ decorators: [
moduleMetadata({ moduleMetadata({
imports: [CommonModule, NoopAnimationsModule] imports: [CommonModule],
providers: [
{
provide: ANIMATION_MODULE_TYPE,
useValue: 'NoopAnimations'
}
]
}) })
] ]
} as Meta<GfTagsSelectorComponent>; } as Meta<GfTagsSelectorComponent>;

2
libs/ui/src/lib/top-holdings/top-holdings.component.html

@ -58,7 +58,7 @@
mat-cell mat-cell
[attr.colspan]="displayedColumns.length" [attr.colspan]="displayedColumns.length"
> >
<div [@detailExpand]="element.expand ? 'expanded' : 'collapsed'"> <div class="detail-expand" [class.expanded]="element.expand">
<div class="holding-parents-table"> <div class="holding-parents-table">
<table <table
class="gf-table w-100" class="gf-table w-100"

15
libs/ui/src/lib/top-holdings/top-holdings.component.scss

@ -19,6 +19,21 @@
height: 0; height: 0;
} }
.detail-expand {
display: grid;
grid-template-rows: 0fr;
transition: grid-template-rows 225ms cubic-bezier(0.4, 0, 0.2, 1);
&.expanded {
grid-template-rows: 1fr;
}
.holding-parents-table {
min-height: 0;
overflow: hidden;
}
}
.holding-parents-table { .holding-parents-table {
--table-padding: 0.5em; --table-padding: 0.5em;

17
libs/ui/src/lib/top-holdings/top-holdings.component.ts

@ -5,13 +5,6 @@ import {
PortfolioPosition PortfolioPosition
} from '@ghostfolio/common/interfaces'; } from '@ghostfolio/common/interfaces';
import {
animate,
state,
style,
transition,
trigger
} from '@angular/animations';
import { import {
CUSTOM_ELEMENTS_SCHEMA, CUSTOM_ELEMENTS_SCHEMA,
ChangeDetectionStrategy, ChangeDetectionStrategy,
@ -31,16 +24,6 @@ import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader';
import { GfValueComponent } from '../value/value.component'; import { GfValueComponent } from '../value/value.component';
@Component({ @Component({
animations: [
trigger('detailExpand', [
state('collapsed,void', style({ height: '0px', minHeight: '0' })),
state('expanded', style({ height: '*' })),
transition(
'expanded <=> collapsed',
animate('225ms cubic-bezier(0.4, 0.0, 0.2, 1)')
)
])
],
changeDetection: ChangeDetectionStrategy.OnPush, changeDetection: ChangeDetectionStrategy.OnPush,
imports: [ imports: [
GfValueComponent, GfValueComponent,

9
libs/ui/src/lib/value/value.component.stories.ts

@ -1,5 +1,5 @@
import { ANIMATION_MODULE_TYPE } from '@angular/core';
import '@angular/localize/init'; import '@angular/localize/init';
import { provideNoopAnimations } from '@angular/platform-browser/animations';
import { applicationConfig, moduleMetadata } from '@storybook/angular'; import { applicationConfig, moduleMetadata } from '@storybook/angular';
import type { Meta, StoryObj } from '@storybook/angular'; import type { Meta, StoryObj } from '@storybook/angular';
import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader'; import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader';
@ -11,7 +11,12 @@ export default {
component: GfValueComponent, component: GfValueComponent,
decorators: [ decorators: [
applicationConfig({ applicationConfig({
providers: [provideNoopAnimations()] providers: [
{
provide: ANIMATION_MODULE_TYPE,
useValue: 'NoopAnimations'
}
]
}), }),
moduleMetadata({ moduleMetadata({
imports: [NgxSkeletonLoaderModule] imports: [NgxSkeletonLoaderModule]

Loading…
Cancel
Save