diff --git a/client/src/app/+admin/system/logs/logs.component.html b/client/src/app/+admin/system/logs/logs.component.html index c945c1fdc..d602090ef 100644 --- a/client/src/app/+admin/system/logs/logs.component.html +++ b/client/src/app/+admin/system/logs/logs.component.html @@ -37,19 +37,27 @@
Loading...
+ +
No log.
-
- {{ log.level }} +
+
+ {{ log.level }} - [{{ log.localeDate }}] + [{{ log.localeDate }}] - By {{ log.by }} -> - {{ log.domain }} -> {{ log.action }} + By {{ log.by }} -> + {{ log.domain }} -> {{ log.action }} - {{ log.message }} + {{ log.message }} -
{{ log.meta }}
+
{{ log.meta }}
+
diff --git a/client/src/app/+admin/system/logs/logs.component.scss b/client/src/app/+admin/system/logs/logs.component.scss index 128c71e40..ae038c033 100644 --- a/client/src/app/+admin/system/logs/logs.component.scss +++ b/client/src/app/+admin/system/logs/logs.component.scss @@ -9,6 +9,10 @@ background: rgba(0, 0, 0, 0.03); padding: 20px; + > div { + position: relative; + } + .log-row { margin-top: 1px; word-break: break-word; @@ -81,7 +85,11 @@ &.error { color: rgb(250, 5, 5); } +} +my-copy-button { + position: absolute; + right: 5px; } @include on-small-main-col { diff --git a/client/src/app/+admin/system/logs/logs.component.ts b/client/src/app/+admin/system/logs/logs.component.ts index 18fcdbe4c..e236a81bd 100644 --- a/client/src/app/+admin/system/logs/logs.component.ts +++ b/client/src/app/+admin/system/logs/logs.component.ts @@ -1,28 +1,42 @@ +import { DatePipe, NgClass, NgFor, NgIf } from '@angular/common' import { Component, ElementRef, OnInit, ViewChild } from '@angular/core' +import { FormsModule } from '@angular/forms' import { LocalStorageService, Notifier } from '@app/core' +import { NgSelectModule } from '@ng-select/ng-select' import { ServerLogLevel } from '@peertube/peertube-models' +import { SelectTagsComponent } from '../../../shared/shared-forms/select/select-tags.component' +import { ButtonComponent } from '../../../shared/shared-main/buttons/button.component' +import { CopyButtonComponent } from '../../../shared/shared-main/buttons/copy-button.component' import { LogRow } from './log-row.model' import { LogsService } from './logs.service' -import { ButtonComponent } from '../../../shared/shared-main/buttons/button.component' -import { SelectTagsComponent } from '../../../shared/shared-forms/select/select-tags.component' -import { NgSelectModule } from '@ng-select/ng-select' -import { NgFor, NgIf, NgClass, DatePipe } from '@angular/common' -import { FormsModule } from '@angular/forms' @Component({ templateUrl: './logs.component.html', styleUrls: [ './logs.component.scss' ], standalone: true, - imports: [ FormsModule, NgFor, NgSelectModule, NgIf, NgClass, SelectTagsComponent, ButtonComponent, DatePipe ] + imports: [ + FormsModule, + NgFor, + NgSelectModule, + NgIf, + NgClass, + SelectTagsComponent, + ButtonComponent, + DatePipe, + CopyButtonComponent + ] }) export class LogsComponent implements OnInit { private static LOCAL_STORAGE_LOG_TYPE_CHOICE_KEY = 'admin-logs-log-type-choice' @ViewChild('logsElement', { static: true }) logsElement: ElementRef + @ViewChild('logsContent', { static: true }) logsContent: ElementRef loading = false + rawLogs: string logs: LogRow[] = [] + timeChoices: { id: string, label: string, dateFormat: string }[] = [] levelChoices: { id: ServerLogLevel, label: string }[] = [] logTypeChoices: { id: 'audit' | 'standard', label: string }[] = [] @@ -72,6 +86,8 @@ export class LogsComponent implements OnInit { next: logs => { this.logs = logs + this.rawLogs = this.logs.map(l => `${l.level} ${l.localeDate} ${l.message} ${l.meta}`).join('\n') + setTimeout(() => { this.logsElement.nativeElement.scrollIntoView({ block: 'end', inline: 'nearest' }) }) diff --git a/client/src/app/+admin/system/logs/logs.service.ts b/client/src/app/+admin/system/logs/logs.service.ts index 9e774d7fd..b157ae9df 100644 --- a/client/src/app/+admin/system/logs/logs.service.ts +++ b/client/src/app/+admin/system/logs/logs.service.ts @@ -1,9 +1,8 @@ -import { Observable } from 'rxjs' -import { catchError, map } from 'rxjs/operators' import { HttpClient, HttpParams } from '@angular/common/http' import { Injectable } from '@angular/core' import { RestExtractor, RestService } from '@app/core' import { ServerLogLevel } from '@peertube/peertube-models' +import { catchError, map } from 'rxjs/operators' import { environment } from '../../../../environments/environment' import { LogRow } from './log-row.model' @@ -24,7 +23,7 @@ export class LogsService { tagsOneOf?: string[] level?: ServerLogLevel endDate?: string - }): Observable { + }) { const { isAuditLog, startDate, endDate, tagsOneOf } = options let params = new HttpParams() @@ -38,7 +37,7 @@ export class LogsService { ? LogsService.BASE_AUDIT_LOG_URL : LogsService.BASE_LOG_URL - return this.authHttp.get(path, { params }) + return this.authHttp.get(path, { params }) .pipe( map(rows => rows.map(r => new LogRow(r))), catchError(err => this.restExtractor.handleError(err)) diff --git a/client/src/app/shared/shared-main/buttons/copy-button.component.html b/client/src/app/shared/shared-main/buttons/copy-button.component.html index a99c0a93a..149a36cc7 100644 --- a/client/src/app/shared/shared-main/buttons/copy-button.component.html +++ b/client/src/app/shared/shared-main/buttons/copy-button.component.html @@ -1,7 +1,7 @@