Skip to content
Snippets Groups Projects
Commit 37d83f50 authored by Lukas Mauß's avatar Lukas Mauß
Browse files

Move 'export-comments'-function to room-settings

parent 4b3d9fa5
1 merge request!198Improve filtering/sorting
Pipeline #26923 passed with stages
in 5 minutes and 32 seconds
Showing
with 81 additions and 61 deletions
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
</div> </div>
</mat-radio-group> </mat-radio-group>
<div fxLayout="row" fxLayoutAlign="center center" fxLayoutGap="20px"> <div fxLayout="row" fxLayoutAlign="center center" fxLayoutGap="20px">
<button mat-raised-button color="warn" (click)="onNoClick()">{{'comment-page.abort' | translate}}</button> <button mat-raised-button class="abort" (click)="onNoClick()">{{'comment-page.abort' | translate}}</button>
<button mat-raised-button class="export" <button mat-raised-button class="export"
(click)="dialogRef.close(exportType)">{{'comment-page.export' | translate}}</button> (click)="dialogRef.close(exportType)">{{'comment-page.export' | translate}}</button>
</div> </div>
......
...@@ -11,6 +11,11 @@ h4 { ...@@ -11,6 +11,11 @@ h4 {
margin: 15px 0 15px 0; margin: 15px 0 15px 0;
} }
.abort {
background-color: var(--secondary);
color: var(--on-secondary);
}
.export { .export {
background-color: var(--primary); background-color: var(--primary);
color: var(--on-primary); color: var(--on-primary);
......
import { Component, OnInit } from '@angular/core'; import { Component, OnInit } from '@angular/core';
import { MatDialogRef } from '@angular/material'; import { MatDialogRef } from '@angular/material';
import { CommentPageComponent } from '../../../shared/comment-page/comment-page.component'; import { RoomEditComponent } from '../room-edit/room-edit.component';
@Component({ @Component({
selector: 'app-comment-export', selector: 'app-comment-export',
...@@ -11,7 +11,7 @@ export class CommentExportComponent implements OnInit { ...@@ -11,7 +11,7 @@ export class CommentExportComponent implements OnInit {
exportType = 'comma'; exportType = 'comma';
constructor(public dialogRef: MatDialogRef<CommentPageComponent>) { } constructor(public dialogRef: MatDialogRef<RoomEditComponent>) { }
ngOnInit() { ngOnInit() {
} }
......
...@@ -28,13 +28,18 @@ ...@@ -28,13 +28,18 @@
<mat-slider id="commentSlider" min="-50" max="50" step="1" value="0" <mat-slider id="commentSlider" min="-50" max="50" step="1" value="0"
[(ngModel)]="commentThreshold" (input)="onSliderChange($event)"></mat-slider> [(ngModel)]="commentThreshold" (input)="onSliderChange($event)"></mat-slider>
</div> </div>
<div fxLayoutAlign="center center">
<button mat-raised-button class="export" (click)="openExportDialog()">
<mat-icon>cloud_download</mat-icon>
{{ 'room-page.export-comments' | translate }}</button>
</div>
<div fxLayoutAlign="center center"> <div fxLayoutAlign="center center">
<button mat-raised-button class="delete" (click)="openDeleteCommentDialog()"> <button mat-raised-button class="delete" (click)="openDeleteCommentDialog()">
<mat-icon>delete</mat-icon> <mat-icon>delete</mat-icon>
{{ 'room-page.delete-all-comments' | translate }}</button> {{ 'room-page.delete-all-comments' | translate }}</button>
</div> </div>
<mat-divider></mat-divider> <mat-divider></mat-divider>
<div fxLayout="row" fxLayoutAlign="center" fxLayoutGap="10px"> <div fxLayout="row" fxLayoutAlign="center" fxLayoutGap="10px" class="submit">
<button mat-raised-button class="abort" (click)="dialogRef.close('abort')"> <button mat-raised-button class="abort" (click)="dialogRef.close('abort')">
{{ 'room-page.abort' | translate }} {{ 'room-page.abort' | translate }}
</button> </button>
......
...@@ -5,10 +5,16 @@ ...@@ -5,10 +5,16 @@
.delete { .delete {
margin-bottom: 20px; margin-bottom: 20px;
min-width: 220px; min-width: 220px;
width: 60%;
background-color: var(--red); background-color: var(--red);
} }
.export {
margin-bottom: 20px;
min-width: 220px;
background-color: var(--secondary);
color: var(--on-secondary);
}
button { button {
min-width: 105px; min-width: 105px;
} }
...@@ -41,6 +47,10 @@ mat-divider { ...@@ -41,6 +47,10 @@ mat-divider {
color: var(--on-primary); color: var(--on-primary);
} }
.submit {
margin-top: 20px;
}
mat-form-field { mat-form-field {
color: var(--on-surface); color: var(--on-surface);
} }
......
...@@ -9,6 +9,8 @@ import { Router } from '@angular/router'; ...@@ -9,6 +9,8 @@ import { Router } from '@angular/router';
import { RoomCreatorPageComponent } from '../../room-creator-page/room-creator-page.component'; import { RoomCreatorPageComponent } from '../../room-creator-page/room-creator-page.component';
import { DeleteCommentComponent } from '../delete-comment/delete-comment.component'; import { DeleteCommentComponent } from '../delete-comment/delete-comment.component';
import { CommentService } from '../../../../services/http/comment.service'; import { CommentService } from '../../../../services/http/comment.service';
import { CommentExportComponent } from '../comment-export/comment-export.component';
import { Comment } from '../../../../models/comment';
@Component({ @Component({
selector: 'app-room-edit', selector: 'app-room-edit',
...@@ -17,6 +19,7 @@ import { CommentService } from '../../../../services/http/comment.service'; ...@@ -17,6 +19,7 @@ import { CommentService } from '../../../../services/http/comment.service';
}) })
export class RoomEditComponent implements OnInit { export class RoomEditComponent implements OnInit {
editRoom: Room; editRoom: Room;
comments: Comment[];
commentThreshold: number; commentThreshold: number;
constructor(public dialogRef: MatDialogRef<RoomCreatorPageComponent>, constructor(public dialogRef: MatDialogRef<RoomCreatorPageComponent>,
...@@ -35,6 +38,7 @@ export class RoomEditComponent implements OnInit { ...@@ -35,6 +38,7 @@ export class RoomEditComponent implements OnInit {
} else { } else {
this.commentThreshold = -10; this.commentThreshold = -10;
} }
console.log(this.editRoom);
} }
onSliderChange(event: any) { onSliderChange(event: any) {
...@@ -85,4 +89,45 @@ export class RoomEditComponent implements OnInit { ...@@ -85,4 +89,45 @@ export class RoomEditComponent implements OnInit {
}); });
this.commentService.deleteCommentsByRoomId(this.editRoom.id).subscribe(); this.commentService.deleteCommentsByRoomId(this.editRoom.id).subscribe();
} }
exportCsv(delimiter: string, date: string): void {
const exportComments = JSON.parse(JSON.stringify(this.comments));
let csv: string;
let keyFields = '';
let valueFields = '';
keyFields = Object.keys(exportComments[0]).slice(3).join(delimiter) + '\r\n';
exportComments.forEach(element => {
element.body = '"' + element.body.replace(/[\r\n]/g, ' ').replace(/ +/g, ' ').replace(/"/g, '""') + '"';
valueFields += Object.values(element).slice(3).join(delimiter) + '\r\n';
});
csv = keyFields + valueFields;
const myBlob = new Blob([csv], { type: 'text/csv' });
const link = document.createElement('a');
const fileName = 'comments_' + date + '.csv';
link.setAttribute('download', fileName);
link.href = window.URL.createObjectURL(myBlob);
link.click();
}
onExport(exportType: string): void {
const date = new Date();
const dateString = date.getFullYear() + '_' + ('0' + (date.getMonth() + 1)).slice(-2) + '_' + ('0' + date.getDate()).slice(-2);
const timeString = ('0' + date.getHours()).slice(-2) + ('0' + date.getMinutes()).slice(-2) + ('0' + date.getSeconds()).slice(-2);
const timestamp = dateString + '_' + timeString;
if (exportType === 'comma') {
this.exportCsv(',', timestamp);
}
if (exportType === 'semicolon') {
this.exportCsv(';', timestamp);
}
}
openExportDialog(): void {
const dialogRef = this.dialog.open(CommentExportComponent, {
width: '400px'
});
dialogRef.afterClosed().subscribe(result => {
this.onExport(result);
});
}
} }
...@@ -10,6 +10,7 @@ import { RoomEditComponent } from '../_dialogs/room-edit/room-edit.component'; ...@@ -10,6 +10,7 @@ import { RoomEditComponent } from '../_dialogs/room-edit/room-edit.component';
import { TranslateService } from '@ngx-translate/core'; import { TranslateService } from '@ngx-translate/core';
import { LanguageService } from '../../../services/util/language.service'; import { LanguageService } from '../../../services/util/language.service';
import { TSMap } from 'typescript-map'; import { TSMap } from 'typescript-map';
import { CommentService } from '../../../services/http/comment.service';
@Component({ @Component({
selector: 'app-room-creator-page', selector: 'app-room-creator-page',
...@@ -29,7 +30,8 @@ export class RoomCreatorPageComponent extends RoomPageComponent implements OnIni ...@@ -29,7 +30,8 @@ export class RoomCreatorPageComponent extends RoomPageComponent implements OnIni
protected location: Location, protected location: Location,
public dialog: MatDialog, public dialog: MatDialog,
private translateService: TranslateService, private translateService: TranslateService,
protected langService: LanguageService) { protected langService: LanguageService,
public commentService: CommentService) {
super(roomService, route, location); super(roomService, route, location);
langService.langEmitter.subscribe(lang => translateService.use(lang)); langService.langEmitter.subscribe(lang => translateService.use(lang));
} }
...@@ -66,6 +68,10 @@ export class RoomCreatorPageComponent extends RoomPageComponent implements OnIni ...@@ -66,6 +68,10 @@ export class RoomCreatorPageComponent extends RoomPageComponent implements OnIni
}); });
dialogRef.componentInstance.editRoom = this.updRoom; dialogRef.componentInstance.editRoom = this.updRoom;
dialogRef.componentInstance.commentThreshold = this.updCommentThreshold; dialogRef.componentInstance.commentThreshold = this.updCommentThreshold;
this.commentService.getComments(this.room.id)
.subscribe(comments => {
dialogRef.componentInstance.comments = comments;
});
dialogRef.afterClosed() dialogRef.afterClosed()
.subscribe(result => { .subscribe(result => {
if (result === 'abort') { if (result === 'abort') {
......
...@@ -12,11 +12,6 @@ ...@@ -12,11 +12,6 @@
<span class="fill-remaining-space"></span> <span class="fill-remaining-space"></span>
<div class="button-bar" fxLayoutAlign="center center"> <div class="button-bar" fxLayoutAlign="center center">
<button mat-icon-button class="searchBarButton" *ngIf="!searchBox.value && userRole === 1 && comments.length > 0"
matTooltip="{{ 'comment-list.export-comments' | translate }}" (click)="openExportDialog()">
<mat-icon class="searchBarIcon">cloud_download</mat-icon>
</button>
<button mat-icon-button class="searchBarButton" *ngIf="!searchBox.value && comments.length > 0" <button mat-icon-button class="searchBarButton" *ngIf="!searchBox.value && comments.length > 0"
[matMenuTriggerFor]="filterMenu" matTooltip="{{ 'comment-list.filter-comments' | translate }}"> [matMenuTriggerFor]="filterMenu" matTooltip="{{ 'comment-list.filter-comments' | translate }}">
<mat-icon class="searchBarIcon">filter_list</mat-icon> <mat-icon class="searchBarIcon">filter_list</mat-icon>
......
...@@ -12,8 +12,6 @@ import { UserRole } from '../../../models/user-roles.enum'; ...@@ -12,8 +12,6 @@ import { UserRole } from '../../../models/user-roles.enum';
import { AuthenticationService } from '../../../services/http/authentication.service'; import { AuthenticationService } from '../../../services/http/authentication.service';
import { Room } from '../../../models/room'; import { Room } from '../../../models/room';
import { RoomService } from '../../../services/http/room.service'; import { RoomService } from '../../../services/http/room.service';
import { CommentExportComponent } from '../../creator/_dialogs/comment-export/comment-export.component';
import { DeleteCommentComponent } from '../../creator/_dialogs/delete-comment/delete-comment.component';
@Component({ @Component({
selector: 'app-comment-list', selector: 'app-comment-list',
...@@ -50,7 +48,6 @@ export class CommentListComponent implements OnInit { ...@@ -50,7 +48,6 @@ export class CommentListComponent implements OnInit {
ngOnInit() { ngOnInit() {
this.roomId = localStorage.getItem(`roomId`); this.roomId = localStorage.getItem(`roomId`);
this.roomService.getRoom(this.roomId).subscribe( room => this.room = room); this.roomService.getRoom(this.roomId).subscribe( room => this.room = room);
this.comments = [];
this.hideCommentsList = false; this.hideCommentsList = false;
this.wsCommentService.getCommentStream(this.roomId).subscribe((message: Message) => { this.wsCommentService.getCommentStream(this.roomId).subscribe((message: Message) => {
this.parseIncomingMessage(message); this.parseIncomingMessage(message);
...@@ -163,48 +160,6 @@ export class CommentListComponent implements OnInit { ...@@ -163,48 +160,6 @@ export class CommentListComponent implements OnInit {
this.wsCommentService.add(comment); this.wsCommentService.add(comment);
} }
exportCsv(delimiter: string, date: string): void {
const exportComments = JSON.parse(JSON.stringify(this.comments));
let csv: string;
let keyFields = '';
let valueFields = '';
keyFields = Object.keys(exportComments[0]).slice(3).join(delimiter) + '\r\n';
exportComments.forEach(element => {
element.body = '"' + element.body.replace(/[\r\n]/g, ' ').replace(/ +/g, ' ').replace(/"/g, '""') + '"';
valueFields += Object.values(element).slice(3).join(delimiter) + '\r\n';
});
csv = keyFields + valueFields;
const myBlob = new Blob([csv], { type: 'text/csv' });
const link = document.createElement('a');
const fileName = 'comments_' + date + '.csv';
link.setAttribute('download', fileName);
link.href = window.URL.createObjectURL(myBlob);
link.click();
}
onExport(exportType: string): void {
const date = new Date();
const dateString = date.getFullYear() + '_' + ('0' + (date.getMonth() + 1)).slice(-2) + '_' + ('0' + date.getDate()).slice(-2);
const timeString = ('0' + date.getHours()).slice(-2) + ('0' + date.getMinutes()).slice(-2) + ('0' + date.getSeconds()).slice(-2);
const timestamp = dateString + '_' + timeString;
if (exportType === 'comma') {
this.exportCsv(',', timestamp);
}
if (exportType === 'semicolon') {
this.exportCsv(';', timestamp);
}
}
openExportDialog(): void {
const dialogRef = this.dialog.open(CommentExportComponent, {
width: '400px'
});
dialogRef.afterClosed().subscribe(result => {
this.onExport(result);
});
}
filterFavorite(): void { filterFavorite(): void {
this.filteredComments = this.comments.filter(c => c.favorite); this.filteredComments = this.comments.filter(c => c.favorite);
} }
......
...@@ -27,7 +27,8 @@ ...@@ -27,7 +27,8 @@
"threshold": "Schwellenwert für sichtbare Kommentare: ", "threshold": "Schwellenwert für sichtbare Kommentare: ",
"delete-all-comments": "Alle Kommentare löschen", "delete-all-comments": "Alle Kommentare löschen",
"really-delete-comments": "Wollen sie wirklich alle Kommentare dieser Session löschen?", "really-delete-comments": "Wollen sie wirklich alle Kommentare dieser Session löschen?",
"comments-deleted": "Alle Kommentare wurden gelöscht." "comments-deleted": "Alle Kommentare wurden gelöscht.",
"export-comments": "Kommentare exportieren"
}, },
"content": { "content": {
"content": "Frage", "content": "Frage",
...@@ -101,7 +102,6 @@ ...@@ -101,7 +102,6 @@
}, },
"comment-list": { "comment-list": {
"search": "Suchen", "search": "Suchen",
"export-comments": "Kommentare exportieren",
"filter-comments": "Kommentare filtern", "filter-comments": "Kommentare filtern",
"sort-comments": "Kommentare sortieren", "sort-comments": "Kommentare sortieren",
"add-comment": "Kommentar erstellen" "add-comment": "Kommentar erstellen"
......
...@@ -27,8 +27,8 @@ ...@@ -27,8 +27,8 @@
"threshold": "Threshold for visible comments: ", "threshold": "Threshold for visible comments: ",
"delete-all-comments": "Delete all comments", "delete-all-comments": "Delete all comments",
"really-delete-comments": "Do you really want to delete all comments of this session?", "really-delete-comments": "Do you really want to delete all comments of this session?",
"comments-deleted": "All comments have been deleted." "comments-deleted": "All comments have been deleted.",
"export-comments": "Export comments"
}, },
"content": { "content": {
"content": "Content", "content": "Content",
...@@ -102,7 +102,6 @@ ...@@ -102,7 +102,6 @@
}, },
"comment-list": { "comment-list": {
"search": "Search", "search": "Search",
"export-comments": "Export comments",
"filter-comments": "Filter comments", "filter-comments": "Filter comments",
"sort-comments": "Sort comments", "sort-comments": "Sort comments",
"add-comment": "Create comment" "add-comment": "Create comment"
......
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment