mirror of https://github.com/Squidex/squidex.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
95 lines
2.8 KiB
95 lines
2.8 KiB
/*
|
|
* Squidex Headless CMS
|
|
*
|
|
* @license
|
|
* Copyright (c) Sebastian Stehle. All rights reserved
|
|
*/
|
|
|
|
import { Component, OnDestroy, OnInit } from '@angular/core';
|
|
import { ActivatedRoute } from '@angular/router';
|
|
import { Observable } from 'rxjs';
|
|
|
|
import { ImmutableArray, NotificationService } from 'framework';
|
|
|
|
import { AppComponentBase } from './../app-component-base';
|
|
import { AppsStoreService } from './../services/apps-store.service';
|
|
import { HistoryEventDto, HistoryService } from './../services/history.service';
|
|
import { UsersProviderService } from './../services/users-provider.service';
|
|
|
|
const FALLBACK_NAME = 'my-app';
|
|
const REPLACEMENT_REGEXP = new RegExp('{([^\s:]*):([^}]*)}');
|
|
const REPLACEMENT_TEMP = '$TEMP$';
|
|
|
|
@Component({
|
|
selector: 'sqx-history',
|
|
styleUrls: ['./history.component.scss'],
|
|
templateUrl: './history.component.html'
|
|
})
|
|
export class HistoryComponent extends AppComponentBase implements OnDestroy, OnInit {
|
|
private interval: any;
|
|
|
|
public events = ImmutableArray.empty();
|
|
|
|
constructor(appsStore: AppsStoreService, notifications: NotificationService, usersProvider: UsersProviderService,
|
|
private readonly historyService: HistoryService,
|
|
private readonly route: ActivatedRoute
|
|
) {
|
|
super(appsStore, notifications, usersProvider);
|
|
}
|
|
|
|
public ngOnDestroy() {
|
|
clearInterval(this.interval);
|
|
}
|
|
|
|
public ngOnInit() {
|
|
this.load();
|
|
|
|
this.interval =
|
|
setInterval(() => {
|
|
this.load();
|
|
}, 5000);
|
|
}
|
|
|
|
public load() {
|
|
const channel = this.route.snapshot.data['channel'];
|
|
|
|
this.appName()
|
|
.switchMap(app => this.historyService.getHistory(app, channel).retry(2))
|
|
.subscribe(dtos => {
|
|
this.events = ImmutableArray.of(dtos);
|
|
});
|
|
}
|
|
|
|
public actorName(actor: string): Observable<string> {
|
|
const parts = actor.split(':');
|
|
|
|
if (parts[0] === 'subject') {
|
|
return this.userName(parts[1]).map(n => n === 'Me' ? 'I' : n);
|
|
}
|
|
|
|
return Observable.of(parts[1]);
|
|
}
|
|
|
|
public format(message: string): Observable<string> {
|
|
let foundUserId: string;
|
|
|
|
message = message.replace(/{([^\s:]*):([^}]*)}/, (match: string, type: string, id: string) => {
|
|
if (type === 'user') {
|
|
foundUserId = id;
|
|
return REPLACEMENT_TEMP;
|
|
} else {
|
|
return id;
|
|
}
|
|
});
|
|
|
|
message = message.replace(/{([^\s:]*)}/, (match: string, marker: string) => {
|
|
return `<span class="marker-ref">${marker}</span>`;
|
|
});
|
|
|
|
if (foundUserId) {
|
|
return this.userName(foundUserId).map(t => message.replace(REPLACEMENT_TEMP, `<span class="user-ref">${t}</span>`));
|
|
}
|
|
|
|
return Observable.of(message);
|
|
}
|
|
}
|