Skip to content
Snippets Groups Projects
files.component.ts 6.37 KiB
Newer Older
import { MainDataService } from '../../maindata.service';
import { WorkspaceDataService } from '../workspacedata.service';
import { GetFileResponseData, CheckWorkspaceResponseData } from '../workspace.interfaces';
import { ConfirmDialogComponent, ConfirmDialogData, MessageDialogComponent,
paf's avatar
paf committed
  MessageDialogData, MessageType, ServerError } from 'iqb-components';
import { Subscription } from 'rxjs';
import { MatTableDataSource } from '@angular/material/table';
paf's avatar
paf committed
import { MatSnackBar } from '@angular/material/snack-bar';
Martin Mechtel's avatar
Martin Mechtel committed
import { BackendService } from '../backend.service';
import { Component, OnInit, Inject, OnDestroy } from '@angular/core';
import { ViewChild } from '@angular/core';
paf's avatar
paf committed
import { MatDialog } from '@angular/material/dialog';
import { MatSort } from '@angular/material/sort';
Martin Mechtel's avatar
Martin Mechtel committed
  templateUrl: './files.component.html',
  styleUrls: ['./files.component.css']
export class FilesComponent implements OnInit, OnDestroy {
  public serverfiles: MatTableDataSource<GetFileResponseData>;
  public displayedColumns = ['checked', 'filename', 'typelabel', 'filesize', 'filedatetime'];
mechtelm's avatar
mechtelm committed
  public dataLoading = false;
  private workspaceIdSubscription: Subscription = null;

  // for fileupload
  public uploadUrl = '';
  public fileNameAlias = 'fileforvo';

  // for workspace-check
  public checkErrors = [];
  public checkWarnings = [];
  public checkInfos = [];

paf's avatar
paf committed
  @ViewChild(MatSort, { static: true }) sort: MatSort;

  constructor(
    @Inject('SERVER_URL') private serverUrl: string,
    private bs: BackendService,
    private mds: MainDataService,
mechtelm's avatar
mechtelm committed
    public wds: WorkspaceDataService,
    public confirmDialog: MatDialog,
    public messsageDialog: MatDialog,
    public snackBar: MatSnackBar
  ) {
mechtelm's avatar
mechtelm committed
    this.uploadUrl = this.serverUrl + 'php/uploadFile.php';
    this.workspaceIdSubscription = this.wds.workspaceId$.subscribe(() => {
mechtelm's avatar
mechtelm committed
      this.updateFileList((this.wds.ws <= 0) || (this.mds.adminToken.length === 0));
  }

  // ***********************************************************************************
  checkAll(isChecked: boolean) {
    this.serverfiles.data.forEach(element => {
      element.isChecked = isChecked;
    });
  }

  // ***********************************************************************************
  deleteFiles() {
mechtelm's avatar
mechtelm committed
    if (this.wds.wsRole === 'RW') {
      this.checkErrors = [];
      this.checkWarnings = [];
      this.checkInfos = [];

      const filesToDelete = [];
      this.serverfiles.data.forEach(element => {
        if (element.isChecked) {
          filesToDelete.push(element.type + '::' + element.filename);
mechtelm's avatar
mechtelm committed
      if (filesToDelete.length > 0) {
        let prompt = 'Sie haben ';
        if (filesToDelete.length > 1) {
          prompt = prompt + filesToDelete.length + ' Dateien ausgewählt. Sollen';
        } else {
          prompt = prompt + ' eine Datei ausgewählt. Soll';
        }
        const dialogRef = this.confirmDialog.open(ConfirmDialogComponent, {
          width: '400px',
          data: <ConfirmDialogData>{
            title: 'Löschen von Dateien',
            content: prompt + ' diese gelöscht werden?',
            confirmbuttonlabel: 'Löschen',
            showcancel: true
mechtelm's avatar
mechtelm committed
          }
        });

        dialogRef.afterClosed().subscribe(result => {
          if (result !== false) {
            // =========================================================
            this.dataLoading = true;
            this.bs.deleteFiles(filesToDelete).subscribe(deletefilesresponse => {
              if (deletefilesresponse instanceof ServerError) {
                this.wds.setNewErrorMsg(deletefilesresponse as ServerError);
mechtelm's avatar
mechtelm committed
                const deletefilesresponseOk = deletefilesresponse as string;
                if ((deletefilesresponseOk.length > 5) && (deletefilesresponseOk.substr(0, 2) === 'e:')) {
                  this.snackBar.open(deletefilesresponseOk.substr(2), 'Fehler', {duration: 1000});
                } else {
                  this.snackBar.open(deletefilesresponseOk, '', {duration: 1000});
                  this.updateFileList();
                }
                this.wds.setNewErrorMsg();
mechtelm's avatar
mechtelm committed
            });
            // =========================================================
          }
        });
      } else {
        this.messsageDialog.open(MessageDialogComponent, {
          width: '400px',
          data: <MessageDialogData>{
            title: 'Löschen von Dateien',
            content: 'Bitte markieren Sie erst Dateien!',
            type: MessageType.error
          }
        });
      }
    }
  }

  // ***********************************************************************************
  updateFileList(empty = false) {
    this.checkErrors = [];
    this.checkWarnings = [];
    this.checkInfos = [];

mechtelm's avatar
mechtelm committed
    if (empty || this.wds.wsRole === 'MO') {
      this.serverfiles = new MatTableDataSource([]);
    } else {
      this.dataLoading = true;
      this.bs.getFiles().subscribe(
        (filedataresponse: GetFileResponseData[]) => {
          this.serverfiles = new MatTableDataSource(filedataresponse);
          this.serverfiles.sort = this.sort;
          this.dataLoading = false;
          this.wds.setNewErrorMsg();
        }, (err: ServerError) => {
          this.wds.setNewErrorMsg(err);
          this.dataLoading = false;
        }
      );
    }
  }

  // ***********************************************************************************
  getDownloadRef(element: GetFileResponseData): string {
    return this.serverUrl
Martin Mechtel's avatar
Martin Mechtel committed
        + 'php/getFile.php?t=' + element.type
        + '&fn=' + element.filename
        + '&at=' + this.mds.adminToken
        + '&ws=' + this.wds.ws.toString();
  }

  checkWorkspace() {
    this.checkErrors = [];
    this.checkWarnings = [];
    this.checkInfos = [];

Martin Mechtel's avatar
Martin Mechtel committed
    this.dataLoading = true;
    this.bs.checkWorkspace().subscribe(
      (checkResponse: CheckWorkspaceResponseData) => {
        this.checkErrors = checkResponse.errors;
        this.checkWarnings = checkResponse.warnings;
        this.checkInfos = checkResponse.infos;
        this.wds.setNewErrorMsg();

        this.dataLoading = false;
      }, (err: ServerError) => {
        this.wds.setNewErrorMsg(err);
        this.dataLoading = false;
      }
Martin Mechtel's avatar
Martin Mechtel committed
    );

  // % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % %
  ngOnDestroy() {
mechtelm's avatar
mechtelm committed
    if (this.workspaceIdSubscription !== null) {
      this.workspaceIdSubscription.unsubscribe();