Browse Source

Feature/client of last request in users table (#8143)

* Add icon

* Update changelog
pull/8142/head^2
Thomas Kaul 3 days ago
committed by GitHub
parent
commit
97443d894c
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 4
      CHANGELOG.md
  2. 21
      apps/client/src/app/components/admin-users/admin-users.component.ts
  3. 23
      apps/client/src/app/components/admin-users/admin-users.html

4
CHANGELOG.md

@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## Unreleased ## Unreleased
### Added
- Added an icon to indicate the client of the last request in the users table of the admin control panel
### Changed ### Changed
- Upgraded `ai` from version `7.0.114` to `7.0.127` - Upgraded `ai` from version `7.0.114` to `7.0.127`

21
apps/client/src/app/components/admin-users/admin-users.component.ts

@ -21,6 +21,7 @@ import {
} from '@ghostfolio/common/interfaces'; } from '@ghostfolio/common/interfaces';
import { hasPermission, permissions } from '@ghostfolio/common/permissions'; import { hasPermission, permissions } from '@ghostfolio/common/permissions';
import { internalRoutes } from '@ghostfolio/common/routes/routes'; import { internalRoutes } from '@ghostfolio/common/routes/routes';
import { RequestClient } from '@ghostfolio/prisma/enums';
import { NotificationService } from '@ghostfolio/ui/notifications'; import { NotificationService } from '@ghostfolio/ui/notifications';
import { GfPremiumIndicatorComponent } from '@ghostfolio/ui/premium-indicator'; import { GfPremiumIndicatorComponent } from '@ghostfolio/ui/premium-indicator';
import { AdminService, DataService } from '@ghostfolio/ui/services'; import { AdminService, DataService } from '@ghostfolio/ui/services';
@ -51,10 +52,14 @@ import { ActivatedRoute, Router, RouterModule } from '@angular/router';
import { IonIcon } from '@ionic/angular/standalone'; import { IonIcon } from '@ionic/angular/standalone';
import { addIcons } from 'ionicons'; import { addIcons } from 'ionicons';
import { import {
codeSlashOutline,
contractOutline, contractOutline,
ellipsisHorizontal, ellipsisHorizontal,
globeOutline,
keyOutline, keyOutline,
personOutline, personOutline,
serverOutline,
sparklesOutline,
trashOutline trashOutline
} from 'ionicons/icons'; } from 'ionicons/icons';
import ms from 'ms'; import ms from 'ms';
@ -85,6 +90,7 @@ export class GfAdminUsersComponent implements OnInit {
protected dataSource = new MatTableDataSource< protected dataSource = new MatTableDataSource<
AdminUsersResponse['users'][0] AdminUsersResponse['users'][0]
>(); >();
protected defaultDateFormat: string; protected defaultDateFormat: string;
protected displayedColumns: string[] = []; protected displayedColumns: string[] = [];
protected readonly canDeleteUser = canDeleteUser; protected readonly canDeleteUser = canDeleteUser;
@ -96,8 +102,17 @@ export class GfAdminUsersComponent implements OnInit {
protected info: InfoItem; protected info: InfoItem;
protected isLoading = false; protected isLoading = false;
protected readonly pageSize = DEFAULT_PAGE_SIZE; protected readonly pageSize = DEFAULT_PAGE_SIZE;
protected readonly requestClientIcons: Record<RequestClient, string> = {
API: 'code-slash-outline',
MCP: 'sparkles-outline',
SELF_HOSTING: 'server-outline',
WEB: 'globe-outline'
};
protected readonly routerLinkAdminControlUsers = protected readonly routerLinkAdminControlUsers =
internalRoutes.adminControl.subRoutes.users.routerLink; internalRoutes.adminControl.subRoutes.users.routerLink;
protected totalItems = 0; protected totalItems = 0;
protected user: User; protected user: User;
@ -112,9 +127,11 @@ export class GfAdminUsersComponent implements OnInit {
private readonly destroyRef = inject(DestroyRef); private readonly destroyRef = inject(DestroyRef);
private readonly deviceDetectorService = inject(DeviceDetectorService); private readonly deviceDetectorService = inject(DeviceDetectorService);
private readonly dialog = inject(MatDialog); private readonly dialog = inject(MatDialog);
private readonly impersonationStorageService = inject( private readonly impersonationStorageService = inject(
ImpersonationStorageService ImpersonationStorageService
); );
private readonly notificationService = inject(NotificationService); private readonly notificationService = inject(NotificationService);
private readonly route = inject(ActivatedRoute); private readonly route = inject(ActivatedRoute);
private readonly router = inject(Router); private readonly router = inject(Router);
@ -182,10 +199,14 @@ export class GfAdminUsersComponent implements OnInit {
}); });
addIcons({ addIcons({
codeSlashOutline,
contractOutline, contractOutline,
ellipsisHorizontal, ellipsisHorizontal,
globeOutline,
keyOutline, keyOutline,
personOutline, personOutline,
serverOutline,
sparklesOutline,
trashOutline trashOutline
}); });
} }

23
apps/client/src/app/components/admin-users/admin-users.html

@ -192,12 +192,23 @@
class="mat-mdc-cell px-1 py-2 text-nowrap" class="mat-mdc-cell px-1 py-2 text-nowrap"
mat-cell mat-cell
> >
{{ <div class="align-items-center d-flex">
formatRelativeTime({ @if (element.lastRequestClient) {
date: element.lastActivity, <ion-icon
language: user?.settings?.language class="mr-1"
}) [name]="requestClientIcons[element.lastRequestClient]"
}} [title]="element.lastRequestClient"
/>
} @else {
<ion-icon class="hidden mr-1" />
}
{{
formatRelativeTime({
date: element.lastActivity,
language: user?.settings?.language
})
}}
</div>
</td> </td>
</ng-container> </ng-container>
} }

Loading…
Cancel
Save