@eqproject/eqp-attachments 0.1.16 → 0.1.17

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,13 +1,13 @@
1
1
  import { __decorate, __awaiter } from 'tslib';
2
+ import { HttpClient } from '@angular/common/http';
2
3
  import { ɵɵdefineInjectable, Injectable, EventEmitter, ChangeDetectorRef, Input, Output, ViewChild, Component, NgModule } from '@angular/core';
3
4
  import { Validators, FormBuilder, FormsModule, ReactiveFormsModule } from '@angular/forms';
4
- import { base64ToFile, ImageCropperComponent, ImageCropperModule } from 'ngx-image-cropper';
5
- import imageCompression from 'browser-image-compression';
6
- import { TooltipPositionType, TypeColumn, EqpTableModule } from '@eqproject/eqp-table';
7
5
  import { MatDialog, MatDialogModule } from '@angular/material/dialog';
8
- import Swal from 'sweetalert2';
9
6
  import { DomSanitizer } from '@angular/platform-browser';
10
- import { HttpClient } from '@angular/common/http';
7
+ import { TooltipPositionType, TypeColumn, EqpTableModule } from '@eqproject/eqp-table';
8
+ import imageCompression from 'browser-image-compression';
9
+ import { base64ToFile, ImageCropperComponent, ImageCropperModule } from 'ngx-image-cropper';
10
+ import Swal from 'sweetalert2';
11
11
  import { CommonModule } from '@angular/common';
12
12
  import { MatCheckboxModule } from '@angular/material/checkbox';
13
13
  import { MatButtonModule } from '@angular/material/button';
@@ -40,12 +40,6 @@ import { MatSortModule } from '@angular/material/sort';
40
40
  import { MatPaginatorModule } from '@angular/material/paginator';
41
41
  import { MatNativeDateModule } from '@angular/material/core';
42
42
 
43
- var AttachmentType;
44
- (function (AttachmentType) {
45
- AttachmentType[AttachmentType["FILE"] = 1] = "FILE";
46
- AttachmentType[AttachmentType["LINK"] = 2] = "LINK";
47
- })(AttachmentType || (AttachmentType = {}));
48
-
49
43
  let AttachmentHelperService = class AttachmentHelperService {
50
44
  constructor() {
51
45
  }
@@ -104,6 +98,12 @@ AttachmentHelperService = __decorate([
104
98
  })
105
99
  ], AttachmentHelperService);
106
100
 
101
+ var AttachmentType;
102
+ (function (AttachmentType) {
103
+ AttachmentType[AttachmentType["FILE"] = 1] = "FILE";
104
+ AttachmentType[AttachmentType["LINK"] = 2] = "LINK";
105
+ })(AttachmentType || (AttachmentType = {}));
106
+
107
107
  let EqpAttachmentDialogService = class EqpAttachmentDialogService {
108
108
  constructor() {
109
109
  }
@@ -203,11 +203,11 @@ EqpAttachmentDialogService = __decorate([
203
203
  })
204
204
  ], EqpAttachmentDialogService);
205
205
 
206
- const toBase64 = file => new Promise((resolve, reject) => {
206
+ const toBase64 = (file) => new Promise((resolve, reject) => {
207
207
  const reader = new FileReader();
208
208
  reader.readAsDataURL(file);
209
209
  reader.onload = () => resolve(reader.result.toString());
210
- reader.onerror = error => reject(error);
210
+ reader.onerror = (error) => reject(error);
211
211
  });
212
212
  const ɵ0 = toBase64;
213
213
  let EqpAttachmentsComponent = class EqpAttachmentsComponent {
@@ -287,7 +287,11 @@ let EqpAttachmentsComponent = class EqpAttachmentsComponent {
287
287
  /**
288
288
  * Opzioni per la compressione delle immagini caricate.
289
289
  */
290
- this.compressionOptions = { maxSizeMB: 0.5, maxWidthOrHeight: 1920, useWebWorker: true };
290
+ this.compressionOptions = {
291
+ maxSizeMB: 0.5,
292
+ maxWidthOrHeight: 1920,
293
+ useWebWorker: true
294
+ };
291
295
  /**
292
296
  * Array di AttachmentType che si possono aggiungere
293
297
  */
@@ -307,6 +311,10 @@ let EqpAttachmentsComponent = class EqpAttachmentsComponent {
307
311
  * per la tabella contenente l'elenco degli allegati
308
312
  */
309
313
  this.tablePaginatorSize = null;
314
+ /**
315
+ * Abilitare caricamento video
316
+ */
317
+ this.allowVideo = false;
310
318
  /**
311
319
  * Input per definire le label da usare nel componente
312
320
  */
@@ -365,8 +373,8 @@ let EqpAttachmentsComponent = class EqpAttachmentsComponent {
365
373
  this.showCropImage = false;
366
374
  //#endregion
367
375
  //#region Proprietà per gestione ridimensionamento file di tipo image
368
- this.imageChangedEvent = '';
369
- this.croppedImage = '';
376
+ this.imageChangedEvent = "";
377
+ this.croppedImage = "";
370
378
  this.transform = {};
371
379
  //#endregion
372
380
  this.AttachmentType = AttachmentType;
@@ -381,8 +389,8 @@ let EqpAttachmentsComponent = class EqpAttachmentsComponent {
381
389
  // Se non sono stati specificati i tipi da gestire ma è stato passato null o un array vuoto imposto i tipi di default.
382
390
  if (!this.allowedTypes || this.allowedTypes.length == 0)
383
391
  this.allowedTypes = [AttachmentType.FILE, AttachmentType.LINK];
384
- else if (this.allowedTypes.find(t => t != AttachmentType.FILE && t != AttachmentType.LINK)) {
385
- EqpAttachmentDialogService.Warning("Almeno uno degli AttachmentType selezionati nel parametro \"allowedTypes\" non esiste.");
392
+ else if (this.allowedTypes.find((t) => t != AttachmentType.FILE && t != AttachmentType.LINK)) {
393
+ EqpAttachmentDialogService.Warning('Almeno uno degli AttachmentType selezionati nel parametro "allowedTypes" non esiste.');
386
394
  this.allowedTypes = [AttachmentType.FILE, AttachmentType.LINK];
387
395
  }
388
396
  //Se è stata richiesta la gestione multipla degli allegati allora configura l'eqp-table
@@ -401,7 +409,7 @@ let EqpAttachmentsComponent = class EqpAttachmentsComponent {
401
409
  this.attachmentTable.reloadDatatable();
402
410
  }
403
411
  checkAttachmentImage() {
404
- this.attachmentsList.forEach(a => {
412
+ this.attachmentsList.forEach((a) => {
405
413
  a.IsImage = AttachmentHelperService.checkImageFromMimeType(a.FileContentType);
406
414
  });
407
415
  }
@@ -413,27 +421,45 @@ let EqpAttachmentsComponent = class EqpAttachmentsComponent {
413
421
  this.attachmentsColumns = [];
414
422
  if (this.disableAction != true) {
415
423
  this.attachmentsColumns.push({
416
- key: "action", display: "",
417
- type: TypeColumn.MenuAction, buttonMenuIcon: "more_vert", styles: { flex: "0 0 6%" },
424
+ key: "action",
425
+ display: "",
426
+ type: TypeColumn.MenuAction,
427
+ buttonMenuIcon: "more_vert",
428
+ styles: { flex: "0 0 6%" },
418
429
  actions: [
419
- { name: this.deleteLabel, icon: "delete", fn: (element, index, col) => this.deleteAttachment(element) },
420
- ],
430
+ { name: this.deleteLabel, icon: "delete", fn: (element, index, col) => this.deleteAttachment(element) }
431
+ ]
421
432
  });
422
433
  }
423
434
  let downloadColumn = {
424
- key: "attachment", display: "",
425
- type: TypeColumn.SimpleAction, styles: { flex: "0 0 6%" },
435
+ key: "attachment",
436
+ display: "",
437
+ type: TypeColumn.SimpleAction,
438
+ styles: { flex: "0 0 6%" },
426
439
  actions: [
427
440
  {
428
- name: '', fontawesome: true,
429
- icon: (element) => { return this.showInlinePreview ? (element.AttachmentType == AttachmentType.FILE ? "fas fa-cloud-download-alt" : "fas fa-external-link-alt") : this.getAttachmentIcon(element); },
441
+ name: "",
442
+ fontawesome: true,
443
+ icon: (element) => {
444
+ return this.showInlinePreview
445
+ ? element.AttachmentType == AttachmentType.FILE
446
+ ? "fas fa-cloud-download-alt"
447
+ : "fas fa-external-link-alt"
448
+ : this.getAttachmentIcon(element);
449
+ },
430
450
  fn: (element, col, elementIndex) => this.viewAttachment(element),
431
- tooltip: { tooltipText: (element) => { return element.AttachmentType == AttachmentType.FILE ? this.downloadLabel : this.openLinkLabel; }, tooltipPosition: this.downloadTooltipPosition }
432
- },
451
+ tooltip: {
452
+ tooltipText: (element) => {
453
+ return element.AttachmentType == AttachmentType.FILE ? this.downloadLabel : this.openLinkLabel;
454
+ },
455
+ tooltipPosition: this.downloadTooltipPosition
456
+ }
457
+ }
433
458
  ]
434
459
  };
435
460
  let inlinePreviewColumn = {
436
- key: "InlinePreview", display: this.previewLabel,
461
+ key: "InlinePreview",
462
+ display: this.previewLabel,
437
463
  type: TypeColumn.ExternalTemplate,
438
464
  externalTemplate: this.inlinePreviewTemplate,
439
465
  styles: { flex: "0 0 10%" }
@@ -475,7 +501,7 @@ let EqpAttachmentsComponent = class EqpAttachmentsComponent {
475
501
  */
476
502
  viewAttachment(attachment) {
477
503
  if (attachment.AttachmentType == AttachmentType.LINK) {
478
- window.open(attachment.FilePath, '_blank');
504
+ window.open(attachment.FilePath, "_blank");
479
505
  return;
480
506
  }
481
507
  if (attachment.FileDataBase64 && attachment.FileContentType && attachment.FileName) {
@@ -519,8 +545,8 @@ let EqpAttachmentsComponent = class EqpAttachmentsComponent {
519
545
  this.dialofRefAddAttachment = this.dialog.open(this.dialogAddAttachment, {
520
546
  disableClose: true,
521
547
  hasBackdrop: true,
522
- width: '60%',
523
- maxHeight: '80%'
548
+ width: "60%",
549
+ maxHeight: "80%"
524
550
  });
525
551
  }
526
552
  createAttachmentForm() {
@@ -558,7 +584,8 @@ let EqpAttachmentsComponent = class EqpAttachmentsComponent {
558
584
  }
559
585
  }
560
586
  else {
561
- return this.newMultipleAttachments.filter(p => (p.AttachmentType == AttachmentType.FILE && !p.FileDataBase64) || (p.AttachmentType == AttachmentType.LINK && !p.FilePath)).length > 0;
587
+ return (this.newMultipleAttachments.filter((p) => (p.AttachmentType == AttachmentType.FILE && !p.FileDataBase64) ||
588
+ (p.AttachmentType == AttachmentType.LINK && !p.FilePath)).length > 0);
562
589
  }
563
590
  }
564
591
  confirmAddAttachment() {
@@ -601,13 +628,19 @@ let EqpAttachmentsComponent = class EqpAttachmentsComponent {
601
628
  }
602
629
  if (this.getAttachmentEndpoint && this.selectedAttachment.IsImage && !this.selectedAttachment.FileDataBase64) {
603
630
  yield this.getAttachmentByID()
604
- .then((res) => { this.selectedAttachment.FileDataBase64 = res.FileDataBase64; })
605
- .catch((err) => { EqpAttachmentDialogService.Error(err); });
631
+ .then((res) => {
632
+ this.selectedAttachment.FileDataBase64 = res.FileDataBase64;
633
+ })
634
+ .catch((err) => {
635
+ EqpAttachmentDialogService.Error(err);
636
+ });
606
637
  }
607
638
  if (this.selectedAttachment.AttachmentType == AttachmentType.LINK) {
608
639
  this.selectedAttachment.TrustedUrl = this.sanitizer.bypassSecurityTrustResourceUrl(this.selectedAttachment.FilePath);
609
640
  }
610
- else if (this.selectedAttachment.IsImage && !this.selectedAttachment.FileDataBase64 && !this.selectedAttachment.FileThumbnailBase64) {
641
+ else if (this.selectedAttachment.IsImage &&
642
+ !this.selectedAttachment.FileDataBase64 &&
643
+ !this.selectedAttachment.FileThumbnailBase64) {
611
644
  EqpAttachmentDialogService.Info("Impossibile aprire l'anteprima dell'allegato, file mancante.");
612
645
  return;
613
646
  }
@@ -626,7 +659,7 @@ let EqpAttachmentsComponent = class EqpAttachmentsComponent {
626
659
  }
627
660
  this.dialog.open(this.dialogPreview, {
628
661
  disableClose: true,
629
- hasBackdrop: true,
662
+ hasBackdrop: true
630
663
  });
631
664
  });
632
665
  }
@@ -654,7 +687,7 @@ let EqpAttachmentsComponent = class EqpAttachmentsComponent {
654
687
  this.selectedFiles = event.target.files;
655
688
  if (!this.selectedFile)
656
689
  return;
657
- //Memorizza i dati per l'allegato
690
+ //Memorizza i dati per l'allegato
658
691
  this.newAttachment = yield this.createAttachmentFromUploadedFile(this.selectedFile, false);
659
692
  this.newMultipleAttachments = new Array();
660
693
  this.newMultipleAttachments.push(this.newAttachment);
@@ -665,7 +698,7 @@ let EqpAttachmentsComponent = class EqpAttachmentsComponent {
665
698
  if (this.loadMultipleFiles == true && [...event.target.files].length == 1)
666
699
  this.createAttachmentForm();
667
700
  //Verifica se il file caricato è un'immagine oppure no. Se è un immagine, prima di caricarla mostra il croppie per il resize.
668
- //Se non è un immagine allora genera il Base64
701
+ //Se non è un immagine allora genera il Base64
669
702
  if (this.newAttachment.IsImage == true) {
670
703
  this.getImageDimensions(event.target.files[0]);
671
704
  //Mostra il croppie e disabilita la form finchè non termina la modifica dell'immagine
@@ -709,11 +742,11 @@ let EqpAttachmentsComponent = class EqpAttachmentsComponent {
709
742
  createAttachmentFromUploadedFile(currentFile, getBase64 = true) {
710
743
  return __awaiter(this, void 0, void 0, function* () {
711
744
  let newAttachment = {};
712
- //Memorizza i dati per l'allegato
745
+ //Memorizza i dati per l'allegato
713
746
  newAttachment.AttachmentType = AttachmentType.FILE;
714
747
  newAttachment.FileContentType = currentFile.type;
715
748
  newAttachment.FileName = currentFile.name;
716
- newAttachment.FileExtension = currentFile.name.substr(currentFile.name.lastIndexOf('.') + 1);
749
+ newAttachment.FileExtension = currentFile.name.substr(currentFile.name.lastIndexOf(".") + 1);
717
750
  newAttachment.IsImage = AttachmentHelperService.checkImageFromMimeType(currentFile.type);
718
751
  if (getBase64 == true) {
719
752
  let base64Result = yield this.getBase64FromFile(currentFile);
@@ -753,9 +786,11 @@ let EqpAttachmentsComponent = class EqpAttachmentsComponent {
753
786
  * @returns
754
787
  */
755
788
  checkAcceptedFiles() {
756
- if ((this.loadMultipleFiles != true && this.selectedFile.type.startsWith("video"))
757
- || (this.loadMultipleFiles == true && [...this.selectedFiles].filter(p => p.type.startsWith("video")).length > 0))
758
- return false;
789
+ if (!this.allowVideo) {
790
+ if ((this.loadMultipleFiles != true && this.selectedFile.type.startsWith("video")) ||
791
+ (this.loadMultipleFiles == true && [...this.selectedFiles].filter((p) => p.type.startsWith("video")).length > 0))
792
+ return false;
793
+ }
759
794
  if (this.acceptedFileTypes == "*")
760
795
  return true;
761
796
  //Verifica che i tipi del file (o dei file) caricati siano coerenti con quelli accettati dalla direttiva
@@ -763,15 +798,15 @@ let EqpAttachmentsComponent = class EqpAttachmentsComponent {
763
798
  if (this.loadMultipleFiles != true)
764
799
  accepted = this.acceptedFileTypes.includes(this.selectedFile.type);
765
800
  else {
766
- let uploadedFileTypes = [...this.selectedFiles].map(p => p.type);
767
- uploadedFileTypes.forEach(type => {
801
+ let uploadedFileTypes = [...this.selectedFiles].map((p) => p.type);
802
+ uploadedFileTypes.forEach((type) => {
768
803
  if (!this.acceptedFileTypes.includes(type))
769
804
  accepted = false;
770
805
  });
771
806
  }
772
807
  //Questo controllo permette di gestire le casistiche per cui vengono indicati come tipi validi, ad esempio, 'image/*'
773
808
  if (!accepted && this.loadMultipleFiles != true) {
774
- for (let t of this.acceptedFileTypes.split(",").filter(t => t.includes("*"))) {
809
+ for (let t of this.acceptedFileTypes.split(",").filter((t) => t.includes("*"))) {
775
810
  accepted = this.selectedFile.type.startsWith(t.split("*")[0]);
776
811
  if (accepted)
777
812
  break;
@@ -802,16 +837,16 @@ let EqpAttachmentsComponent = class EqpAttachmentsComponent {
802
837
  reader.onload = (e) => {
803
838
  const image = new Image();
804
839
  image.src = e.target.result;
805
- image.onload = rs => {
806
- this.originalHeight = rs.currentTarget['height'];
807
- this.originalWidth = rs.currentTarget['width'];
840
+ image.onload = (rs) => {
841
+ this.originalHeight = rs.currentTarget["height"];
842
+ this.originalWidth = rs.currentTarget["width"];
808
843
  if (this.originalWidth > 1280) {
809
844
  this.customWidth = 1280;
810
845
  this.customHeight = Math.round((1280 * this.originalHeight) / this.originalWidth);
811
846
  }
812
847
  else {
813
- this.customHeight = rs.currentTarget['height'];
814
- this.customWidth = rs.currentTarget['width'];
848
+ this.customHeight = rs.currentTarget["height"];
849
+ this.customWidth = rs.currentTarget["width"];
815
850
  }
816
851
  };
817
852
  };
@@ -840,18 +875,18 @@ let EqpAttachmentsComponent = class EqpAttachmentsComponent {
840
875
  /**
841
876
  * Comprime l'immagine passando come parametri le options create nell'oggetto sopra, e il file dal reader principale
842
877
  */
843
- imageCompression(file, options).then((fileCompressed => {
878
+ imageCompression(file, options).then((fileCompressed) => {
844
879
  let fileReader = new FileReader();
845
880
  //Faccio la push di ogni file all'interno dell'array di file dell'item da mandare al server
846
881
  fileReader.onload = function () {
847
882
  let resultReader = fileReader.result;
848
- var marker = ';base64,';
883
+ var marker = ";base64,";
849
884
  self.newAttachment.FileDataBase64 = resultReader.substring(resultReader.indexOf(marker) + marker.length);
850
885
  self.showCropImage = false;
851
886
  self.newAttachmentForm.enable();
852
887
  };
853
888
  fileReader.readAsDataURL(fileCompressed);
854
- }));
889
+ });
855
890
  }
856
891
  confirmCrop() {
857
892
  this.imageCropper.crop();
@@ -860,9 +895,9 @@ let EqpAttachmentsComponent = class EqpAttachmentsComponent {
860
895
  * Annulla la selezione del file, svuotando l'input e resettando tutte le proprietà dell'IAttachmentDTO
861
896
  */
862
897
  abortFile() {
863
- this.imageChangedEvent = '';
898
+ this.imageChangedEvent = "";
864
899
  if (this.imageInput)
865
- this.imageInput.nativeElement.value = '';
900
+ this.imageInput.nativeElement.value = "";
866
901
  this.selectedFile = null;
867
902
  this.selectedFiles = null;
868
903
  this.showCropImage = false;
@@ -945,6 +980,9 @@ __decorate([
945
980
  __decorate([
946
981
  Input("tablePaginatorSize")
947
982
  ], EqpAttachmentsComponent.prototype, "tablePaginatorSize", void 0);
983
+ __decorate([
984
+ Input("allowVideo")
985
+ ], EqpAttachmentsComponent.prototype, "allowVideo", void 0);
948
986
  __decorate([
949
987
  Input("downloadTooltipPosition")
950
988
  ], EqpAttachmentsComponent.prototype, "downloadTooltipPosition", void 0);
@@ -1018,29 +1056,29 @@ __decorate([
1018
1056
  Output("onComponentLoaded")
1019
1057
  ], EqpAttachmentsComponent.prototype, "onComponentLoaded", void 0);
1020
1058
  __decorate([
1021
- ViewChild('dialogAddAttachment', { static: true })
1059
+ ViewChild("dialogAddAttachment", { static: true })
1022
1060
  ], EqpAttachmentsComponent.prototype, "dialogAddAttachment", void 0);
1023
1061
  __decorate([
1024
- ViewChild('dialogAddMultipleAttachment', { static: true })
1062
+ ViewChild("dialogAddMultipleAttachment", { static: true })
1025
1063
  ], EqpAttachmentsComponent.prototype, "dialogAddMultipleAttachment", void 0);
1026
1064
  __decorate([
1027
1065
  ViewChild(ImageCropperComponent)
1028
1066
  ], EqpAttachmentsComponent.prototype, "imageCropper", void 0);
1029
1067
  __decorate([
1030
- ViewChild('imageInput')
1068
+ ViewChild("imageInput")
1031
1069
  ], EqpAttachmentsComponent.prototype, "imageInput", void 0);
1032
1070
  __decorate([
1033
- ViewChild('attachmentTable', { static: false })
1071
+ ViewChild("attachmentTable", { static: false })
1034
1072
  ], EqpAttachmentsComponent.prototype, "attachmentTable", void 0);
1035
1073
  __decorate([
1036
- ViewChild('inlinePreviewTemplate', { static: true })
1074
+ ViewChild("inlinePreviewTemplate", { static: true })
1037
1075
  ], EqpAttachmentsComponent.prototype, "inlinePreviewTemplate", void 0);
1038
1076
  __decorate([
1039
- ViewChild('dialogPreview', { static: true })
1077
+ ViewChild("dialogPreview", { static: true })
1040
1078
  ], EqpAttachmentsComponent.prototype, "dialogPreview", void 0);
1041
1079
  EqpAttachmentsComponent = __decorate([
1042
1080
  Component({
1043
- selector: 'eqp-attachments',
1081
+ selector: "eqp-attachments",
1044
1082
  template: "<!-- Se richiesta la gestione multipla mostra il pulsante di aggiunta e la tabella con l'elenco allegati -->\r\n<div *ngIf=\"multipleAttachment == true\">\r\n <mat-card [ngStyle]=\"{ 'box-shadow': showMatCard == false ? 'none' : null }\">\r\n <mat-card-header>\r\n <div class=\"col-md-6\">\r\n <div class=\"text-nowrap eqp-attachments-header-title\" *ngIf=\"showHeader == true\">\r\n {{headerTitle}}\r\n </div>\r\n </div>\r\n <div class=\"col-md-6 text-right\">\r\n <div class=\"row justify-content-end\">\r\n <!-- Template del button per l'aggiunta di un allegato -->\r\n <ng-container *ngTemplateOutlet=\"addAttachmentButton\"></ng-container>\r\n </div>\r\n </div>\r\n </mat-card-header>\r\n <mat-card-content>\r\n <eqp-table #attachmentTable [createMatCard]=\"false\" #table [columns]=\"attachmentsColumns\"\r\n [isMultiLanguage]=\"isEqpTableMultiLanguage\" [data]=\"attachmentsList\"\r\n [paginatorVisible]=\"tablePaginatorVisible\" [matPaginatorSize]=\"tablePaginatorSize\"\r\n [emptyTableMessage]=\"emptyTableMessage\" [searchText]=\"eqpTableSearchText\">\r\n </eqp-table>\r\n </mat-card-content>\r\n </mat-card>\r\n</div>\r\n\r\n<!-- Se richiesta la gestione singola mostra il pulsante di caricamento di un singolo file -->\r\n<div *ngIf=\"multipleAttachment != true\">\r\n <!-- Template del button per l'aggiunta di un allegato -->\r\n <ng-container *ngTemplateOutlet=\"addAttachmentButton\"></ng-container>\r\n\r\n <button class=\"mb-2 mr-2 eqp-attachments-download-btn\" (click)=\"viewAttachment(attachmentsList[0])\" type=\"button\"\r\n mat-raised-button *ngIf=\"attachmentsList && attachmentsList.length > 0 && attachmentsList[0]\" color=\"primary\">\r\n <mat-icon *ngIf=\"attachmentsList[0].AttachmentType == AttachmentType.FILE\">download</mat-icon>\r\n <mat-icon *ngIf=\"attachmentsList[0].AttachmentType != AttachmentType.FILE\">open_in_new</mat-icon>\r\n {{attachmentsList[0].AttachmentType == AttachmentType.FILE ? downloadLabel : openLinkLabel}}\r\n </button>\r\n <button class=\"mb-2 mr-2 eqp-attachments-preview-btn\" (click)=\"openPreviewDialog(attachmentsList[0])\" type=\"button\"\r\n mat-raised-button color=\"primary\"\r\n *ngIf=\"attachmentsList && attachmentsList.length > 0 && attachmentsList[0] && (!attachmentsList[0].FileContentType || (!attachmentsList[0].FileContentType.startsWith('video') && !attachmentsList[0].FileContentType.startsWith('audio')))\">\r\n <mat-icon>visibility</mat-icon> {{previewLabel}}\r\n </button>\r\n <button class=\"mb-2 eqp-attachments-delete-btn\" (click)=\"deleteAttachment(attachmentsList[0])\" type=\"button\"\r\n mat-raised-button *ngIf=\"attachmentsList && attachmentsList.length > 0 && attachmentsList[0]\"\r\n [disabled]=\"isDisabled\">\r\n <mat-icon>delete</mat-icon> {{deleteLabel}}\r\n </button>\r\n\r\n <div class=\"row\" style=\"margin-top: 10px;\"\r\n *ngIf=\"attachmentsList.length > 0 && attachmentsList[0] && attachmentsList[0].FileDataBase64 && attachmentsList[0].IsImage == true\">\r\n <div class=\"col-sm-12\">\r\n <div class=\"single-attachment-inline-preview-container\">\r\n <img src=\"data:image/png;base64,{{attachmentsList[0].FileDataBase64}}\">\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"row\" *ngIf=\"attachmentsList.length > 0 && attachmentsList[0] && attachmentsList[0].IsImage != true\">\r\n <div class=\"col-sm-12\">\r\n <mat-form-field>\r\n <mat-label>{{fileNameLabel}}</mat-label>\r\n <input readonly matInput [(ngModel)]=\"attachmentsList[0].FileName\">\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n\r\n\r\n<ng-template #dialogAddAttachment>\r\n <div class=\"container-fluid eqp-attachments-dialog-add-container\"\r\n style=\"max-height: 70vh !important; overflow-x: hidden; overflow-y: auto;\">\r\n <form [formGroup]=\"newAttachmentForm\" (ngSubmit)=\"confirmAddAttachment()\" *ngIf=\"newAttachmentForm\">\r\n <div class=\"row\">\r\n <div class=\"header-title-standard\"> {{addButtonLabel}} {{ newAttachment.AttachmentType ==\r\n attachmentType.FILE ?\r\n 'File' : 'Link'}} </div>\r\n </div>\r\n <div class=\"row\" style=\"margin-top: 20px;\">\r\n <div class=\"col-sm-12\" *ngIf=\"newAttachment.AttachmentType == attachmentType.FILE\">\r\n <input #imageInput style=\"display:none;\" id=\"file_attachment\"\r\n name=\"file_attachment\" type=\"file\" (change)=\"onFileInputChange($event)\"\r\n [accept]=\"acceptedFileTypes\" [multiple]=\"loadMultipleFiles\"/>\r\n <button (click)=\"imageInput.click()\" type=\"button\" style=\"margin-left: 10px;\" id=\"file_attachment\"\r\n mat-raised-button color=\"primary\" [disabled]=\"showCropImage == true\"\r\n class=\"mb-2 btn btn-primary eqp-attachments-upload-btn\" *ngIf=\"(loadMultipleFiles != true && !newAttachment.FileDataBase64) || (loadMultipleFiles == true && newMultipleAttachments && newMultipleAttachments.length == 0)\">\r\n <mat-icon>cloud_upload</mat-icon>\r\n {{uploadFileLabel}}\r\n </button>\r\n <button (click)=\"abortFile()\" type=\"button\" style=\"margin-left: 10px;\" mat-raised-button\r\n *ngIf=\"(loadMultipleFiles != true && newAttachment.FileDataBase64) || (loadMultipleFiles == true && newMultipleAttachments && newMultipleAttachments.length > 0)\" class=\"mb-2 eqp-attachments-delete-btn\">\r\n <mat-icon>delete</mat-icon> {{deleteLabel}}\r\n </button>\r\n </div>\r\n <div class=\"col-sm-12\" *ngIf=\"newAttachment.AttachmentType == 2 || (selectedFile && loadMultipleFiles != true)\">\r\n <mat-form-field style=\"width: 100%;\">\r\n <mat-label> {{fileNameLabel}} </mat-label>\r\n <input formControlName=\"name\" matInput [(ngModel)]=\"newAttachment.FileName\">\r\n </mat-form-field>\r\n </div>\r\n <div class=\"col-sm-12\" *ngIf=\"newAttachment.AttachmentType == 2\">\r\n <mat-form-field style=\"width: 100%;\">\r\n <mat-label> Link </mat-label>\r\n <input formControlName=\"path\" required matInput [(ngModel)]=\"newAttachment.FilePath\">\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n\r\n <!-- Riporta l'elenco dei nomi dei file caricati contemporaneamente (visibile solo se loadMultipleFiles = TRUE e se ci sono realmente pi\u00F9 file senza link) -->\r\n <div class=\"row\" *ngIf=\"loadMultipleFiles == true && newMultipleAttachments && newMultipleAttachments.length > 0 && newMultipleAttachments[0].AttachmentType != attachmentType.LINK\">\r\n <div class=\"col-12\" *ngFor=\"let attach of newMultipleAttachments\">\r\n <mat-form-field style=\"width: 100%\">\r\n <mat-label> {{fileNameLabel}} </mat-label>\r\n <input disabled matInput [(ngModel)]=\"attach.FileName\" [ngModelOptions]=\"{standalone: true}\">\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n\r\n <!-- Riporta la preview dell'immagine quando \u00E8 richiesto il caricamento MULTIPLO ma \u00E8 stata selezionata una sola immagine (quindi \u00E8 entrato in gioco anche il croppie) -->\r\n <div class=\"row\" *ngIf=\"loadMultipleFiles == true && showCropImage != true && newMultipleAttachments && newMultipleAttachments.length == 1 && newMultipleAttachments[0].IsImage == true\" style=\"margin-top: 10px;\">\r\n <div class=\"col-4\">\r\n <div class=\"single-attachment-inline-preview-container\">\r\n <img src=\"data:image/png;base64,{{newMultipleAttachments[0].FileDataBase64}}\">\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Riporta la preview dell'immagine quando \u00E8 richiesto il caricamento SINGOLO ed \u00E8 stata selezionata un'immagine -->\r\n <div class=\"row\" *ngIf=\"loadMultipleFiles != true && showCropImage != true && newAttachment.FileDataBase64 && newAttachment.IsImage == true\" style=\"margin-top: 10px;\">\r\n <div class=\"col-4\">\r\n <div class=\"single-attachment-inline-preview-container\">\r\n <img src=\"data:image/png;base64,{{newAttachment.FileDataBase64}}\">\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Richiama il template per le funzionalit\u00E0 del CROPPIE -->\r\n <ng-container [ngTemplateOutlet]=\"croppieTemplate\" [ngTemplateOutletContext]=\"{form: newAttachmentForm}\" *ngIf=\"showCropImage == true\"></ng-container>\r\n\r\n <div class=\"row mt-2\">\r\n <div class=\"col-sm-12 text-right\">\r\n <button class=\"btn btn-primary mat-raised-button eqp-attachments-save-btn mr-2\" type=\"submit\"\r\n [disabled]=\"showCropImage == true || (loadMultipleFiles != true && newAttachmentForm?.disabled == true) || disableSave()\">\r\n {{saveLabel}}\r\n </button>\r\n <button class=\"btn mat-raised-button eqp-attachments-exit-btn\" (click)=\"close()\"\r\n [disabled]=\"showCropImage == true\" type=\"button\">\r\n {{exitLabel}}\r\n </button>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #inlinePreviewTemplate let-row=\"row\">\r\n <div class=\"inline-preview-container\" *ngIf=\"row.AttachmentType != AttachmentType.LINK && row.IsImage\" (click)=\"openPreviewDialog(row)\">\r\n <img src=\"data:image/png;base64,{{row.FileThumbnailBase64 ? row.FileThumbnailBase64 : row.FileDataBase64}}\">\r\n </div>\r\n <div class=\"inline-preview-container\" *ngIf=\"row.AttachmentType != AttachmentType.LINK && !row.IsImage\" (click)=\"openPreviewDialog(row)\">\r\n <i [ngClass]=\"getAttachmentIcon(row)\"></i>\r\n </div>\r\n</ng-template>\r\n\r\n\r\n<ng-template #dialogPreview>\r\n <div class=\"container-fluid\" style=\"max-height: 70vh !important;\" *ngIf=\"selectedAttachment\">\r\n <div class=\"row\">\r\n <div class=\"header-title-standard\">\r\n {{previewLabel}} {{ selectedAttachment?.AttachmentType == attachmentType.FILE ? 'File' : 'Link'}}\r\n </div>\r\n </div>\r\n\r\n <div class=\"row mt-2\">\r\n <!-- ANTEPRIMA IMMAGINE -->\r\n <div class=\"col-12 text-center preview-container\" *ngIf=\"selectedAttachment.IsImage\">\r\n <img class=\"image-preview\"\r\n src=\"data:image/png;base64,{{selectedAttachment.FileDataBase64 ? selectedAttachment.FileDataBase64 : selectedAttachment.FileThumbnailBase64}}\">\r\n </div>\r\n\r\n <!-- ANTEPRIMA LINK -->\r\n <div class=\"col-12 preview-container\" *ngIf=\"!selectedAttachment.IsImage\">\r\n <iframe class=\"link-preview\" [src]=\"selectedAttachment.TrustedUrl\"\r\n [title]=\"selectedAttachment.FileName\"></iframe>\r\n </div>\r\n </div>\r\n\r\n <div class=\"row mt-3\">\r\n <div class=\"col-sm-12 text-right\">\r\n <button class=\"btn btn-primary mat-raised-button eqp-attachments-save-btn mr-2\" type=\"submit\"\r\n (click)=\"viewAttachment(selectedAttachment)\"\r\n *ngIf=\"selectedAttachment.AttachmentType != AttachmentType.LINK\">\r\n {{downloadLabel}}\r\n </button>\r\n <button class=\"btn mat-raised-button eqp-attachments-exit-btn\" mat-dialog-close type=\"button\"\r\n (click)=\"selectedAttachment = null\">\r\n {{exitLabel}}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n\r\n<!-- TEMPLATE PER IL PULSANTE DI AGGIUNTA NUOVO ALLEGATO -->\r\n<ng-template #addAttachmentButton>\r\n\r\n <!-- \r\n Pulsanti per l'aggiunta di un file o un link. Ne viene visualizzato uno se:\r\n - gli allowedTypes sono stati specificati, nell'array ne \u00E8 presente uno solo, quello inserito \u00E8 AttachmentType.FILE (o AttachmentType.LINK) \r\n e sono nella gestione di pi\u00F9 allegati (multipleAttachment == true)\r\n OPPURE\r\n - gli allowedTypes sono stati specificati, nell'array ne \u00E8 presente uno solo, quello inserito \u00E8 AttachmentType.FILE (o AttachmentType.LINK) \r\n e sono nella gestione di un singolo allegato (multipleAttachment == true) e non ne \u00E8 ancora stato selezionato uno (ovvero attachmentsList non esiste o non ha elementi)\r\n -->\r\n <button class=\"btn btn-primary mb-4 mr-5 eqp-attachments-add-btn\" mat-raised-button color=\"primary\" type=\"button\"\r\n *ngIf=\"allowedTypes && allowedTypes.length == 1 && (multipleAttachment == true || (!attachmentsList || attachmentsList.length == 0 || (attachmentsList.length > 0 && !attachmentsList[0])))\"\r\n (click)=\"openModalAddAttachment(allowedTypes[0])\" [disabled]=\"isDisabled\">\r\n <!-- Per l'aggiunta dei file mostro un'icona diversa dall'aggiunta dei link -->\r\n <mat-icon *ngIf=\"allowedTypes[0] == 1\">cloud_upload</mat-icon>\r\n <i class=\"fas fa-link\" *ngIf=\"allowedTypes[0] == 2\"></i>\r\n <span style=\"margin-left: 10px;\">{{addButtonLabel}} {{allowedTypes[0] == 1 ? \"file\" : \"link\"}}</span>\r\n </button>\r\n\r\n\r\n <!-- Pulsante per aprire il menu per la scelta del tipo di Attachment da creare -->\r\n <button class=\"btn btn-primary mb-4 mr-5 eqp-attachments-add-btn\" mat-raised-button color=\"primary\" type=\"button\"\r\n [matMenuTriggerFor]=\"attachmentTypeMenu\" [disabled]=\"isDisabled\"\r\n *ngIf=\"allowedTypes && allowedTypes.length > 1 && (multipleAttachment == true || (!attachmentsList || attachmentsList.length == 0 || (attachmentsList.length > 0 && !attachmentsList[0])))\">\r\n <mat-icon *ngIf=\"multipleAttachment != true\">cloud_upload</mat-icon>\r\n <mat-icon *ngIf=\"multipleAttachment == true\">add</mat-icon>\r\n <span style=\"margin-left: 0px;\"> {{addButtonLabel}} </span>\r\n </button>\r\n <mat-menu #attachmentTypeMenu=\"matMenu\">\r\n <button mat-menu-item (click)=\"openModalAddAttachment(1)\" class=\"eqp-attachments-file-btn\">\r\n <i class=\"fas fa-file\"></i>\r\n <span style=\"margin-left: 10px;\">File</span>\r\n </button>\r\n <button mat-menu-item (click)=\"openModalAddAttachment(2)\" class=\"eqp-attachments-link-btn\">\r\n <i class=\"fas fa-link\"></i>\r\n <span style=\"margin-left: 10px;\">Link</span>\r\n </button>\r\n </mat-menu>\r\n</ng-template>\r\n\r\n\r\n<ng-template #croppieTemplate let-form=\"form\">\r\n <div class=\"row mt-2 mb-2\" [formGroup]=\"form\">\r\n <div class=\"col-md-12 d-flex align-items-center justify-content-center\">\r\n <span class=\"mr-1\">Max H(px):</span>\r\n <mat-form-field>\r\n <input formControlName=\"customHeight\" type=\"number\" matInput [(ngModel)]=\"customHeight\"\r\n (change)=\"onDimensionsChange('H')\">\r\n </mat-form-field>\r\n\r\n <span class=\"ml-2 mr-1\">Max W(px):</span>\r\n <mat-form-field>\r\n <input formControlName=\"customWidth\" type=\"number\" matInput [(ngModel)]=\"customWidth\"\r\n (change)=\"onDimensionsChange('W')\">\r\n </mat-form-field>\r\n\r\n <button class=\"btn btn-primary mat-raised-button ml-2\" (click)=\"restoreOriginalDimensions()\"\r\n [disabled]=\"customWidth == originalWidth && customHeight == originalHeight\">\r\n <mat-icon style=\"vertical-align: middle;\">replay</mat-icon>\r\n </button>\r\n </div>\r\n </div>\r\n <div class=\"row justify-content-center\">\r\n <div style=\"max-height: 450px; max-width: 450px;\">\r\n <image-cropper [imageChangedEvent]=\"imageChangedEvent\" [maintainAspectRatio]=\"false\"\r\n [autoCrop]=\"false\" [containWithinAspectRatio]=\"false\" [aspectRatio]=\"4/3\"\r\n [cropperMinWidth]=\"128\" [onlyScaleDown]=\"true\" [roundCropper]=\"false\" [canvasRotation]=\"0\"\r\n [transform]=\"transform\" [alignImage]=\"'left'\" format=\"png\" (imageCropped)=\"imageCropped($event)\"\r\n [resizeToWidth]=\"customWidth\" [resizeToHeight]=\"customHeight\">\r\n </image-cropper>\r\n </div>\r\n </div>\r\n <div class=\"row justify-content-center mt-2\">\r\n <div style=\"max-height: 450px; max-width: 450px;\">\r\n <button class=\"btn btn-primary mat-raised-button eqp-attachments-confirm-btn mr-2\" type=\"button\"\r\n (click)=\"confirmCrop()\">\r\n {{confirmLabel}}\r\n </button>\r\n <button class=\"btn mat-raised-button eqp-attachments-abort-btn\" type=\"button\" (click)=\"abortFile()\">\r\n {{abortLabel}}\r\n </button>\r\n </div>\r\n </div>\r\n</ng-template>",
1045
1083
  styles: [".eqp-attachments-header-title{font-weight:700;font-size:19px;line-height:24px;margin-bottom:auto}.single-attachment-inline-preview-container{max-height:400px;max-width:400px;display:flex;align-items:center}.single-attachment-inline-preview-container img{max-width:100%;max-height:120px}.inline-preview-container{max-height:100px;max-width:100px;display:flex;align-items:center;justify-content:center;width:100%;cursor:pointer}.inline-preview-container img{max-width:100%;max-height:100px}.inline-preview-container i{font-size:25px;margin:auto}.preview-container{max-height:60vh;max-width:100%}.preview-container .image-preview{max-width:100%;max-height:100%}.preview-container .link-preview{width:70vw;height:55vh}"]
1046
1084
  })