diff --git a/apps/api/src/app/user/user.service.ts b/apps/api/src/app/user/user.service.ts
index 0a4f21190..ef186288d 100644
--- a/apps/api/src/app/user/user.service.ts
+++ b/apps/api/src/app/user/user.service.ts
@@ -129,7 +129,7 @@ export class UserService {
const [
access,
accounts,
- activitiesCount,
+ activitiesGroupedByType,
firstActivity,
impersonationUser,
tagsForUser
@@ -150,7 +150,10 @@ export class UserService {
userId: impersonationUserId || user.id
}
}),
- this.prismaService.order.count({
+ this.prismaService.order.groupBy({
+ _count: { _all: true },
+ by: ['type'],
+ orderBy: { type: 'asc' },
where: { userId: impersonationUserId || user.id }
}),
this.prismaService.order.findFirst({
@@ -165,6 +168,17 @@ export class UserService {
this.tagService.getTagsForUser(impersonationUserId || user.id)
]);
+ const activitiesCount = activitiesGroupedByType.reduce(
+ (count, { _count }) => {
+ return count + _count._all;
+ },
+ 0
+ );
+
+ const activityTypes = activitiesGroupedByType.map(({ type }) => {
+ return type;
+ });
+
const resolvedUserSettings = resolveUserSettings({
impersonationUserSettings: impersonationUser?.settings
?.settings as UserSettings,
@@ -209,6 +223,7 @@ export class UserService {
return {
activitiesCount,
+ activityTypes,
id,
permissions,
referralPartners,
diff --git a/apps/client/src/app/pages/portfolio/activities/activities-page.html b/apps/client/src/app/pages/portfolio/activities/activities-page.html
index c69437742..3e7e00710 100644
--- a/apps/client/src/app/pages/portfolio/activities/activities-page.html
+++ b/apps/client/src/app/pages/portfolio/activities/activities-page.html
@@ -3,6 +3,7 @@
Activities
[];
accounts: AccountWithPlatform[];
activitiesCount: number;
+ activityTypes: ActivityType[];
dateOfFirstActivity: Date;
id: string;
permissions: string[];
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 9c10b5cb7..67fcef244 100644
--- a/libs/ui/src/lib/activities-table/activities-table.component.html
+++ b/libs/ui/src/lib/activities-table/activities-table.component.html
@@ -7,7 +7,8 @@
Type
@for (
- activityType of activityTypesTranslationMap | keyvalue: sortByValue;
+ activityType of activityTypesTranslationMap()
+ | keyvalue: sortByValue;
track activityType.key
) {
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 c5a0e58c2..b83555be1 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
@@ -483,6 +483,7 @@ export const Actions: Story = {
export const Toolbar: Story = {
args: {
dataSource,
+ activityTypes: ['BUY', 'DIVIDEND', 'SELL'],
baseCurrency: 'USD',
deviceType: 'desktop',
hasActivities: true,
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 3b354b5aa..4794acc3e 100644
--- a/libs/ui/src/lib/activities-table/activities-table.component.ts
+++ b/libs/ui/src/lib/activities-table/activities-table.component.ts
@@ -139,7 +139,6 @@ export class GfActivitiesTableComponent implements AfterViewInit, OnInit {
@ViewChild(MatPaginator) paginator: MatPaginator;
@ViewChild(MatSort) sort: MatSort;
- public activityTypesTranslationMap = new Map();
public hasDrafts = false;
public hasErrors = false;
public isDraftActivity = isDraftActivity;
@@ -147,6 +146,7 @@ export class GfActivitiesTableComponent implements AfterViewInit, OnInit {
public selectedRows = new SelectionModel(true, []);
public typesFilter = new FormControl([]);
+ public readonly activityTypes = input([]);
public readonly dataSource = input.required<
MatTableDataSource | undefined
>();
@@ -173,6 +173,16 @@ export class GfActivitiesTableComponent implements AfterViewInit, OnInit {
return routerLinks;
});
+ protected readonly activityTypesTranslationMap = computed(() => {
+ const translationMap = new Map();
+
+ for (const activityType of this.activityTypes()) {
+ translationMap.set(activityType, translate(activityType));
+ }
+
+ return translationMap;
+ });
+
protected readonly displayedColumns = computed(() => {
let columns = [
'select',
@@ -220,13 +230,6 @@ export class GfActivitiesTableComponent implements AfterViewInit, OnInit {
private readonly notificationService = inject(NotificationService);
public constructor(private destroyRef: DestroyRef) {
- for (const type of Object.keys(ActivityType) as ActivityType[]) {
- this.activityTypesTranslationMap.set(
- ActivityType[type],
- translate(ActivityType[type])
- );
- }
-
addIcons({
alertCircleOutline,
calendarClearOutline,
diff --git a/prisma/migrations/20260820000000_updated_indexes_of_order/migration.sql b/prisma/migrations/20260820000000_updated_indexes_of_order/migration.sql
new file mode 100644
index 000000000..137bc6185
--- /dev/null
+++ b/prisma/migrations/20260820000000_updated_indexes_of_order/migration.sql
@@ -0,0 +1,11 @@
+-- DropIndex
+DROP INDEX "Order_symbolProfileId_idx";
+
+-- DropIndex
+DROP INDEX "Order_type_idx";
+
+-- DropIndex
+DROP INDEX "Order_userId_idx";
+
+-- CreateIndex
+CREATE INDEX "Order_userId_type_idx" ON "Order"("userId", "type");
diff --git a/prisma/schema.prisma b/prisma/schema.prisma
index ca394887f..bcff21e62 100644
--- a/prisma/schema.prisma
+++ b/prisma/schema.prisma
@@ -198,8 +198,7 @@ model Order {
@@index([accountId])
@@index([date])
@@index([symbolProfileId])
- @@index([type])
- @@index([userId])
+ @@index([userId, type])
}
model Platform {