Browse Source

Limit type filter in activities table component to used types

pull/7602/head
Thomas Kaul 3 weeks ago
parent
commit
c24c0ad986
  1. 2
      apps/api/src/app/portfolio/portfolio.service.spec.ts
  2. 20
      apps/api/src/app/user/user.service.ts
  3. 1
      libs/common/src/lib/types/user-with-settings.type.ts
  4. 4
      libs/ui/src/lib/activities-table/activities-table.component.html
  5. 2
      libs/ui/src/lib/activities-table/activities-table.component.ts

2
apps/api/src/app/portfolio/portfolio.service.spec.ts

@ -247,7 +247,7 @@ describe('PortfolioService', () => {
jest.spyOn(userService, 'user').mockResolvedValue({ jest.spyOn(userService, 'user').mockResolvedValue({
accounts: [], accounts: [],
activityCount: 0, activitiesCount: 0,
dataProviderGhostfolioDailyRequests: 0, dataProviderGhostfolioDailyRequests: 0,
id: userDummyData.id, id: userDummyData.id,
settings: { settings: {

20
apps/api/src/app/user/user.service.ts

@ -62,7 +62,7 @@ import { EventEmitter2 } from '@nestjs/event-emitter';
import { InjectThrottlerStorage, ThrottlerStorage } from '@nestjs/throttler'; import { InjectThrottlerStorage, ThrottlerStorage } from '@nestjs/throttler';
import { Prisma, Role, User } from '@prisma/client'; import { Prisma, Role, User } from '@prisma/client';
import { differenceInDays, subDays } from 'date-fns'; import { differenceInDays, subDays } from 'date-fns';
import { isNil, min, without } from 'lodash'; import { isNil, without } from 'lodash';
import { createHmac } from 'node:crypto'; import { createHmac } from 'node:crypto';
@Injectable() @Injectable()
@ -152,6 +152,7 @@ export class UserService {
this.prismaService.order.groupBy({ this.prismaService.order.groupBy({
_min: { date: true }, _min: { date: true },
by: ['type'], by: ['type'],
orderBy: { _min: { date: 'asc' } },
where: { userId: impersonationUserId || user.id } where: { userId: impersonationUserId || user.id }
}), }),
impersonationUserId impersonationUserId
@ -160,20 +161,18 @@ export class UserService {
this.tagService.getTagsForUser(impersonationUserId || user.id) this.tagService.getTagsForUser(impersonationUserId || user.id)
]); ]);
const activitiesCount = impersonationUser const activitiesCount = impersonationUserId
? impersonationUser.activitiesCount ? (impersonationUser?.activitiesCount ?? 0)
: user.activitiesCount; : user.activitiesCount;
const activityTypes = activitiesGroupedByType.map(({ type }) => { const activityTypes = activitiesGroupedByType
.map(({ type }) => {
return type; return type;
}); })
.sort();
const dateOfFirstActivity = const dateOfFirstActivity =
min( activitiesGroupedByType[0]?._min.date ?? new Date();
activitiesGroupedByType.map(({ _min }) => {
return _min.date;
})
) ?? new Date();
const resolvedUserSettings = resolveUserSettings({ const resolvedUserSettings = resolveUserSettings({
impersonationUserSettings: impersonationUser?.settings impersonationUserSettings: impersonationUser?.settings
@ -345,7 +344,6 @@ export class UserService {
settings: settings as UserWithSettings['settings'], settings: settings as UserWithSettings['settings'],
thirdPartyId, thirdPartyId,
updatedAt, updatedAt,
activityCount: analytics?.activityCount,
dataProviderGhostfolioDailyRequests: dataProviderGhostfolioDailyRequests:
analytics?.dataProviderGhostfolioDailyRequests ?? 0 analytics?.dataProviderGhostfolioDailyRequests ?? 0
}; };

1
libs/common/src/lib/types/user-with-settings.type.ts

@ -7,7 +7,6 @@ import { Account, Settings, User } from '@prisma/client';
export type UserWithSettings = User & { export type UserWithSettings = User & {
accounts: Account[]; accounts: Account[];
activitiesCount: number; activitiesCount: number;
activityCount: number;
dataProviderGhostfolioDailyRequests: number; dataProviderGhostfolioDailyRequests: number;
permissions?: string[]; permissions?: string[];
settings: Settings & { settings: UserSettings }; settings: Settings & { settings: UserSettings };

4
libs/ui/src/lib/activities-table/activities-table.component.html

@ -2,7 +2,9 @@
class="align-items-center d-flex justify-content-end justify-content-lg-between" class="align-items-center d-flex justify-content-end justify-content-lg-between"
> >
<div class="d-none d-lg-flex"> <div class="d-none d-lg-flex">
@if (hasPermissionToFilterByType) { @if (
hasPermissionToFilterByType && activityTypesTranslationMap().size > 0
) {
<mat-form-field appearance="outline" class="without-hint"> <mat-form-field appearance="outline" class="without-hint">
<mat-label i18n>Type</mat-label> <mat-label i18n>Type</mat-label>
<mat-select multiple [formControl]="typesFilter"> <mat-select multiple [formControl]="typesFilter">

2
libs/ui/src/lib/activities-table/activities-table.component.ts

@ -176,7 +176,7 @@ export class GfActivitiesTableComponent implements AfterViewInit, OnInit {
protected readonly activityTypesTranslationMap = computed(() => { protected readonly activityTypesTranslationMap = computed(() => {
const translationMap = new Map<ActivityType, string>(); const translationMap = new Map<ActivityType, string>();
for (const activityType of this.activityTypes()) { for (const activityType of this.activityTypes() ?? []) {
translationMap.set(activityType, translate(activityType)); translationMap.set(activityType, translate(activityType));
} }

Loading…
Cancel
Save