@eqproject/eqp-attachments 0.1.16 → 0.1.18

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,14 @@
1
1
  import { __decorate, __awaiter, __generator, __spread, __values } 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 * as JSZip from 'jszip';
10
+ import { base64ToFile, ImageCropperComponent, ImageCropperModule } from 'ngx-image-cropper';
11
+ import Swal from 'sweetalert2';
11
12
  import { CommonModule } from '@angular/common';
12
13
  import { MatCheckboxModule } from '@angular/material/checkbox';
13
14
  import { MatButtonModule } from '@angular/material/button';
@@ -40,12 +41,6 @@ import { MatSortModule } from '@angular/material/sort';
40
41
  import { MatPaginatorModule } from '@angular/material/paginator';
41
42
  import { MatNativeDateModule } from '@angular/material/core';
42
43
 
43
- var AttachmentType;
44
- (function (AttachmentType) {
45
- AttachmentType[AttachmentType["FILE"] = 1] = "FILE";
46
- AttachmentType[AttachmentType["LINK"] = 2] = "LINK";
47
- })(AttachmentType || (AttachmentType = {}));
48
-
49
44
  var AttachmentHelperService = /** @class */ (function () {
50
45
  function AttachmentHelperService() {
51
46
  }
@@ -105,6 +100,12 @@ var AttachmentHelperService = /** @class */ (function () {
105
100
  return AttachmentHelperService;
106
101
  }());
107
102
 
103
+ var AttachmentType;
104
+ (function (AttachmentType) {
105
+ AttachmentType[AttachmentType["FILE"] = 1] = "FILE";
106
+ AttachmentType[AttachmentType["LINK"] = 2] = "LINK";
107
+ })(AttachmentType || (AttachmentType = {}));
108
+
108
109
  var EqpAttachmentDialogService = /** @class */ (function () {
109
110
  function EqpAttachmentDialogService() {
110
111
  }
@@ -213,12 +214,14 @@ var EqpAttachmentDialogService = /** @class */ (function () {
213
214
  return EqpAttachmentDialogService;
214
215
  }());
215
216
 
216
- var toBase64 = function (file) { return new Promise(function (resolve, reject) {
217
- var reader = new FileReader();
218
- reader.readAsDataURL(file);
219
- reader.onload = function () { return resolve(reader.result.toString()); };
220
- reader.onerror = function (error) { return reject(error); };
221
- }); };
217
+ var toBase64 = function (file) {
218
+ return new Promise(function (resolve, reject) {
219
+ var reader = new FileReader();
220
+ reader.readAsDataURL(file);
221
+ reader.onload = function () { return resolve(reader.result.toString()); };
222
+ reader.onerror = function (error) { return reject(error); };
223
+ });
224
+ };
222
225
  var ɵ0 = toBase64;
223
226
  var EqpAttachmentsComponent = /** @class */ (function () {
224
227
  function EqpAttachmentsComponent(dialog, formBuilder, sanitizer, http, cd) {
@@ -297,7 +300,11 @@ var EqpAttachmentsComponent = /** @class */ (function () {
297
300
  /**
298
301
  * Opzioni per la compressione delle immagini caricate.
299
302
  */
300
- this.compressionOptions = { maxSizeMB: 0.5, maxWidthOrHeight: 1920, useWebWorker: true };
303
+ this.compressionOptions = {
304
+ maxSizeMB: 0.5,
305
+ maxWidthOrHeight: 1920,
306
+ useWebWorker: true
307
+ };
301
308
  /**
302
309
  * Array di AttachmentType che si possono aggiungere
303
310
  */
@@ -317,6 +324,22 @@ var EqpAttachmentsComponent = /** @class */ (function () {
317
324
  * per la tabella contenente l'elenco degli allegati
318
325
  */
319
326
  this.tablePaginatorSize = null;
327
+ /**
328
+ * Abilitare caricamento video
329
+ */
330
+ this.allowVideo = false;
331
+ /**
332
+ * Abilitare la compressione al caricamento di un video (allowVideo dev'essere true)
333
+ */
334
+ this.allowVideoCompression = false;
335
+ /**
336
+ * Lista di formati video non ammessi
337
+ */
338
+ this.videoFormatsNotAllowed = ["mkv", "avi"];
339
+ /**
340
+ * dimensione massima ammessa per file
341
+ */
342
+ this.allowedMBForFile = 100;
320
343
  /**
321
344
  * Input per definire le label da usare nel componente
322
345
  */
@@ -375,11 +398,12 @@ var EqpAttachmentsComponent = /** @class */ (function () {
375
398
  this.showCropImage = false;
376
399
  //#endregion
377
400
  //#region Proprietà per gestione ridimensionamento file di tipo image
378
- this.imageChangedEvent = '';
379
- this.croppedImage = '';
401
+ this.imageChangedEvent = "";
402
+ this.croppedImage = "";
380
403
  this.transform = {};
381
404
  //#endregion
382
405
  this.AttachmentType = AttachmentType;
406
+ this.showZipSpinner = false;
383
407
  }
384
408
  EqpAttachmentsComponent.prototype.ngOnInit = function () {
385
409
  //Se è stata richiesta la gestione delle sole immagini allora imposta il filtro per le estensioni possibili da caricare
@@ -392,7 +416,7 @@ var EqpAttachmentsComponent = /** @class */ (function () {
392
416
  if (!this.allowedTypes || this.allowedTypes.length == 0)
393
417
  this.allowedTypes = [AttachmentType.FILE, AttachmentType.LINK];
394
418
  else if (this.allowedTypes.find(function (t) { return t != AttachmentType.FILE && t != AttachmentType.LINK; })) {
395
- EqpAttachmentDialogService.Warning("Almeno uno degli AttachmentType selezionati nel parametro \"allowedTypes\" non esiste.");
419
+ EqpAttachmentDialogService.Warning('Almeno uno degli AttachmentType selezionati nel parametro "allowedTypes" non esiste.');
396
420
  this.allowedTypes = [AttachmentType.FILE, AttachmentType.LINK];
397
421
  }
398
422
  //Se è stata richiesta la gestione multipla degli allegati allora configura l'eqp-table
@@ -424,27 +448,45 @@ var EqpAttachmentsComponent = /** @class */ (function () {
424
448
  this.attachmentsColumns = [];
425
449
  if (this.disableAction != true) {
426
450
  this.attachmentsColumns.push({
427
- key: "action", display: "",
428
- type: TypeColumn.MenuAction, buttonMenuIcon: "more_vert", styles: { flex: "0 0 6%" },
451
+ key: "action",
452
+ display: "",
453
+ type: TypeColumn.MenuAction,
454
+ buttonMenuIcon: "more_vert",
455
+ styles: { flex: "0 0 6%" },
429
456
  actions: [
430
- { name: this.deleteLabel, icon: "delete", fn: function (element, index, col) { return _this.deleteAttachment(element); } },
431
- ],
457
+ { name: this.deleteLabel, icon: "delete", fn: function (element, index, col) { return _this.deleteAttachment(element); } }
458
+ ]
432
459
  });
433
460
  }
434
461
  var downloadColumn = {
435
- key: "attachment", display: "",
436
- type: TypeColumn.SimpleAction, styles: { flex: "0 0 6%" },
462
+ key: "attachment",
463
+ display: "",
464
+ type: TypeColumn.SimpleAction,
465
+ styles: { flex: "0 0 6%" },
437
466
  actions: [
438
467
  {
439
- name: '', fontawesome: true,
440
- icon: function (element) { return _this.showInlinePreview ? (element.AttachmentType == AttachmentType.FILE ? "fas fa-cloud-download-alt" : "fas fa-external-link-alt") : _this.getAttachmentIcon(element); },
468
+ name: "",
469
+ fontawesome: true,
470
+ icon: function (element) {
471
+ return _this.showInlinePreview
472
+ ? element.AttachmentType == AttachmentType.FILE
473
+ ? "fas fa-cloud-download-alt"
474
+ : "fas fa-external-link-alt"
475
+ : _this.getAttachmentIcon(element);
476
+ },
441
477
  fn: function (element, col, elementIndex) { return _this.viewAttachment(element); },
442
- tooltip: { tooltipText: function (element) { return element.AttachmentType == AttachmentType.FILE ? _this.downloadLabel : _this.openLinkLabel; }, tooltipPosition: this.downloadTooltipPosition }
443
- },
478
+ tooltip: {
479
+ tooltipText: function (element) {
480
+ return element.AttachmentType == AttachmentType.FILE ? _this.downloadLabel : _this.openLinkLabel;
481
+ },
482
+ tooltipPosition: this.downloadTooltipPosition
483
+ }
484
+ }
444
485
  ]
445
486
  };
446
487
  var inlinePreviewColumn = {
447
- key: "InlinePreview", display: this.previewLabel,
488
+ key: "InlinePreview",
489
+ display: this.previewLabel,
448
490
  type: TypeColumn.ExternalTemplate,
449
491
  externalTemplate: this.inlinePreviewTemplate,
450
492
  styles: { flex: "0 0 10%" }
@@ -487,7 +529,7 @@ var EqpAttachmentsComponent = /** @class */ (function () {
487
529
  */
488
530
  EqpAttachmentsComponent.prototype.viewAttachment = function (attachment) {
489
531
  if (attachment.AttachmentType == AttachmentType.LINK) {
490
- window.open(attachment.FilePath, '_blank');
532
+ window.open(attachment.FilePath, "_blank");
491
533
  return;
492
534
  }
493
535
  if (attachment.FileDataBase64 && attachment.FileContentType && attachment.FileName) {
@@ -517,6 +559,7 @@ var EqpAttachmentsComponent = /** @class */ (function () {
517
559
  * Apre la modale per la definizione dei parametri del nuovo file
518
560
  */
519
561
  EqpAttachmentsComponent.prototype.openModalAddAttachment = function (attachmentType) {
562
+ this.showZipSpinner = false;
520
563
  //Se è stato richiesto il caricamento di un LINK o è impostato il caricamento di FILE SINGOLO allora apre la modale per
521
564
  //il caricamento singolo del file altrimenti apre quella per il caricamento multiplo
522
565
  // if (attachmentType == AttachmentType.LINK || (attachmentType == AttachmentType.FILE && this.loadMultipleFiles != true)) {
@@ -531,8 +574,8 @@ var EqpAttachmentsComponent = /** @class */ (function () {
531
574
  this.dialofRefAddAttachment = this.dialog.open(this.dialogAddAttachment, {
532
575
  disableClose: true,
533
576
  hasBackdrop: true,
534
- width: '60%',
535
- maxHeight: '80%'
577
+ width: "60%",
578
+ maxHeight: "80%"
536
579
  });
537
580
  };
538
581
  EqpAttachmentsComponent.prototype.createAttachmentForm = function () {
@@ -571,7 +614,10 @@ var EqpAttachmentsComponent = /** @class */ (function () {
571
614
  }
572
615
  }
573
616
  else {
574
- return this.newMultipleAttachments.filter(function (p) { return (p.AttachmentType == AttachmentType.FILE && !p.FileDataBase64) || (p.AttachmentType == AttachmentType.LINK && !p.FilePath); }).length > 0;
617
+ return (this.newMultipleAttachments.filter(function (p) {
618
+ return (p.AttachmentType == AttachmentType.FILE && !p.FileDataBase64) ||
619
+ (p.AttachmentType == AttachmentType.LINK && !p.FilePath);
620
+ }).length > 0);
575
621
  }
576
622
  };
577
623
  EqpAttachmentsComponent.prototype.confirmAddAttachment = function () {
@@ -618,8 +664,12 @@ var EqpAttachmentsComponent = /** @class */ (function () {
618
664
  }
619
665
  if (!(this.getAttachmentEndpoint && this.selectedAttachment.IsImage && !this.selectedAttachment.FileDataBase64)) return [3 /*break*/, 2];
620
666
  return [4 /*yield*/, this.getAttachmentByID()
621
- .then(function (res) { _this.selectedAttachment.FileDataBase64 = res.FileDataBase64; })
622
- .catch(function (err) { EqpAttachmentDialogService.Error(err); })];
667
+ .then(function (res) {
668
+ _this.selectedAttachment.FileDataBase64 = res.FileDataBase64;
669
+ })
670
+ .catch(function (err) {
671
+ EqpAttachmentDialogService.Error(err);
672
+ })];
623
673
  case 1:
624
674
  _a.sent();
625
675
  _a.label = 2;
@@ -627,7 +677,9 @@ var EqpAttachmentsComponent = /** @class */ (function () {
627
677
  if (this.selectedAttachment.AttachmentType == AttachmentType.LINK) {
628
678
  this.selectedAttachment.TrustedUrl = this.sanitizer.bypassSecurityTrustResourceUrl(this.selectedAttachment.FilePath);
629
679
  }
630
- else if (this.selectedAttachment.IsImage && !this.selectedAttachment.FileDataBase64 && !this.selectedAttachment.FileThumbnailBase64) {
680
+ else if (this.selectedAttachment.IsImage &&
681
+ !this.selectedAttachment.FileDataBase64 &&
682
+ !this.selectedAttachment.FileThumbnailBase64) {
631
683
  EqpAttachmentDialogService.Info("Impossibile aprire l'anteprima dell'allegato, file mancante.");
632
684
  return [2 /*return*/];
633
685
  }
@@ -646,7 +698,7 @@ var EqpAttachmentsComponent = /** @class */ (function () {
646
698
  }
647
699
  this.dialog.open(this.dialogPreview, {
648
700
  disableClose: true,
649
- hasBackdrop: true,
701
+ hasBackdrop: true
650
702
  });
651
703
  return [2 /*return*/];
652
704
  }
@@ -670,28 +722,32 @@ var EqpAttachmentsComponent = /** @class */ (function () {
670
722
  * immagine per il croppie (in caso di caricamento multiplo le funzionalità del croppie sono disabilitate).
671
723
  */
672
724
  EqpAttachmentsComponent.prototype.onFileInputChange = function (event) {
725
+ var _a;
673
726
  return __awaiter(this, void 0, void 0, function () {
674
- var _a, checkOnlyImage, base64Result, i, newAttachment, checkOnlyImage;
675
- return __generator(this, function (_b) {
676
- switch (_b.label) {
727
+ var _b, checkOnlyImage, base64Result, _c, i, newAttachment, checkOnlyImage;
728
+ return __generator(this, function (_d) {
729
+ switch (_d.label) {
677
730
  case 0:
678
731
  this.showCropImage = false;
679
- if (!(__spread(event.target.files).length == 1 || this.loadMultipleFiles != true)) return [3 /*break*/, 5];
732
+ if (!(__spread(event.target.files).length == 1 || this.loadMultipleFiles != true)) return [3 /*break*/, 7];
680
733
  this.selectedFile = event.target.files[0];
681
734
  this.selectedFiles = event.target.files;
682
735
  if (!this.selectedFile)
683
736
  return [2 /*return*/];
684
- //Memorizza i dati per l'allegato
685
- _a = this;
737
+ this.showZipSpinner = true;
738
+ //Memorizza i dati per l'allegato
739
+ _b = this;
686
740
  return [4 /*yield*/, this.createAttachmentFromUploadedFile(this.selectedFile, false)];
687
741
  case 1:
688
- //Memorizza i dati per l'allegato
689
- _a.newAttachment = _b.sent();
742
+ //Memorizza i dati per l'allegato
743
+ _b.newAttachment = _d.sent();
690
744
  this.newMultipleAttachments = new Array();
691
745
  this.newMultipleAttachments.push(this.newAttachment);
692
746
  checkOnlyImage = this.checkAllowOnlyImageFile(this.newAttachment);
693
- if (checkOnlyImage == false)
747
+ if (checkOnlyImage == false) {
748
+ this.showZipSpinner = false;
694
749
  return [2 /*return*/];
750
+ }
695
751
  if (this.loadMultipleFiles == true && __spread(event.target.files).length == 1)
696
752
  this.createAttachmentForm();
697
753
  if (!(this.newAttachment.IsImage == true)) return [3 /*break*/, 2];
@@ -702,37 +758,91 @@ var EqpAttachmentsComponent = /** @class */ (function () {
702
758
  this.newAttachmentForm.controls["customHeight"].enable();
703
759
  this.showCropImage = true;
704
760
  this.imageChangedEvent = event;
705
- return [3 /*break*/, 4];
761
+ return [3 /*break*/, 6];
706
762
  case 2:
707
763
  this.showCropImage = false;
708
764
  return [4 /*yield*/, this.getBase64FromFile(this.selectedFile)];
709
765
  case 3:
710
- base64Result = _b.sent();
766
+ base64Result = _d.sent();
767
+ if (!(this.allowVideo && this.allowVideoCompression && this.selectedFile.type.startsWith("video"))) return [3 /*break*/, 5];
768
+ _c = this;
769
+ return [4 /*yield*/, this.zipVideo(this.newAttachment, base64Result.Base64File)];
770
+ case 4:
771
+ _c.newAttachment = _d.sent();
772
+ return [3 /*break*/, 6];
773
+ case 5:
711
774
  this.newAttachment.FileDataBase64 = base64Result.Base64File;
712
775
  this.newAttachment.FileContentType = base64Result.ContentType;
713
- _b.label = 4;
714
- case 4: return [3 /*break*/, 9];
715
- case 5:
776
+ _d.label = 6;
777
+ case 6:
778
+ this.showZipSpinner = false;
779
+ return [3 /*break*/, 14];
780
+ case 7:
716
781
  this.selectedFiles = event.target.files;
717
782
  if (!this.selectedFiles || this.selectedFiles.length == 0)
718
783
  return [2 /*return*/];
719
784
  this.newMultipleAttachments = new Array();
785
+ this.showZipSpinner = true;
720
786
  i = 0;
721
- _b.label = 6;
722
- case 6:
723
- if (!(i < this.selectedFiles.length)) return [3 /*break*/, 9];
787
+ _d.label = 8;
788
+ case 8:
789
+ if (!(i < ((_a = this.selectedFiles) === null || _a === void 0 ? void 0 : _a.length))) return [3 /*break*/, 13];
724
790
  return [4 /*yield*/, this.createAttachmentFromUploadedFile(this.selectedFiles[i], true)];
725
- case 7:
726
- newAttachment = _b.sent();
791
+ case 9:
792
+ newAttachment = _d.sent();
793
+ if (!(this.allowVideo && this.allowVideoCompression && this.selectedFiles[i].type.startsWith("video"))) return [3 /*break*/, 11];
794
+ return [4 /*yield*/, this.zipVideo(newAttachment, newAttachment.FileDataBase64)];
795
+ case 10:
796
+ newAttachment = _d.sent();
797
+ _d.label = 11;
798
+ case 11:
727
799
  checkOnlyImage = this.checkAllowOnlyImageFile(newAttachment);
728
- if (checkOnlyImage == false)
800
+ if (checkOnlyImage == false) {
801
+ this.showZipSpinner = false;
729
802
  return [2 /*return*/];
803
+ }
730
804
  this.newMultipleAttachments.push(newAttachment);
731
- _b.label = 8;
732
- case 8:
805
+ _d.label = 12;
806
+ case 12:
733
807
  i++;
734
- return [3 /*break*/, 6];
735
- case 9: return [2 /*return*/];
808
+ return [3 /*break*/, 8];
809
+ case 13:
810
+ this.showZipSpinner = false;
811
+ _d.label = 14;
812
+ case 14: return [2 /*return*/];
813
+ }
814
+ });
815
+ });
816
+ };
817
+ EqpAttachmentsComponent.prototype.zipVideo = function (newAttachment, base64) {
818
+ return __awaiter(this, void 0, void 0, function () {
819
+ var zip, videoFolder, content, base64Result;
820
+ return __generator(this, function (_a) {
821
+ switch (_a.label) {
822
+ case 0:
823
+ zip = new JSZip();
824
+ videoFolder = zip.folder("videos");
825
+ videoFolder.file(newAttachment.FileName, base64, { base64: true });
826
+ return [4 /*yield*/, zip.generateAsync({
827
+ type: "blob",
828
+ compression: "DEFLATE",
829
+ compressionOptions: {
830
+ /* compression level ranges from 1 (best speed) to 9 (best compression) */
831
+ level: 9
832
+ }
833
+ })];
834
+ case 1:
835
+ content = _a.sent();
836
+ return [4 /*yield*/, this.getBase64FromFile(content)];
837
+ case 2:
838
+ base64Result = _a.sent();
839
+ newAttachment.FileContentType = content.type;
840
+ newAttachment.FileName = newAttachment.FileName.replace(/\.[^/.]+$/, "") + ".zip";
841
+ newAttachment.FileExtension = newAttachment.FileName.substring(newAttachment.FileName.lastIndexOf(".") + 1);
842
+ newAttachment.IsImage = AttachmentHelperService.checkImageFromMimeType(content.type);
843
+ newAttachment.FileDataBase64 = base64Result.Base64File;
844
+ newAttachment.FileContentType = base64Result.ContentType;
845
+ return [2 /*return*/, newAttachment];
736
846
  }
737
847
  });
738
848
  });
@@ -753,11 +863,11 @@ var EqpAttachmentsComponent = /** @class */ (function () {
753
863
  switch (_a.label) {
754
864
  case 0:
755
865
  newAttachment = {};
756
- //Memorizza i dati per l'allegato
866
+ //Memorizza i dati per l'allegato
757
867
  newAttachment.AttachmentType = AttachmentType.FILE;
758
868
  newAttachment.FileContentType = currentFile.type;
759
869
  newAttachment.FileName = currentFile.name;
760
- newAttachment.FileExtension = currentFile.name.substr(currentFile.name.lastIndexOf('.') + 1);
870
+ newAttachment.FileExtension = currentFile.name.substring(currentFile.name.lastIndexOf(".") + 1);
761
871
  newAttachment.IsImage = AttachmentHelperService.checkImageFromMimeType(currentFile.type);
762
872
  if (!(getBase64 == true)) return [3 /*break*/, 2];
763
873
  return [4 /*yield*/, this.getBase64FromFile(currentFile)];
@@ -810,9 +920,30 @@ var EqpAttachmentsComponent = /** @class */ (function () {
810
920
  EqpAttachmentsComponent.prototype.checkAcceptedFiles = function () {
811
921
  var e_1, _a;
812
922
  var _this = this;
813
- if ((this.loadMultipleFiles != true && this.selectedFile.type.startsWith("video"))
814
- || (this.loadMultipleFiles == true && __spread(this.selectedFiles).filter(function (p) { return p.type.startsWith("video"); }).length > 0))
923
+ var _b, _c;
924
+ if (!this.allowVideo) {
925
+ if ((!this.loadMultipleFiles && this.selectedFile.type.startsWith("video")) ||
926
+ (this.loadMultipleFiles == true && __spread(this.selectedFiles).filter(function (p) { return p.type.startsWith("video"); }).length > 0))
927
+ return false;
928
+ }
929
+ else {
930
+ if ((!this.loadMultipleFiles &&
931
+ this.videoFormatsNotAllowed.includes((_b = this.selectedFile) === null || _b === void 0 ? void 0 : _b.name.substring(this.selectedFile.name.lastIndexOf(".") + 1))) ||
932
+ (this.loadMultipleFiles &&
933
+ this.selectedFiles &&
934
+ __spread(this.selectedFiles).filter(function (p) {
935
+ return _this.videoFormatsNotAllowed.includes(p.name.substring(p.name.lastIndexOf(".") + 1));
936
+ }).length > 0))
937
+ return false;
938
+ }
939
+ if (!this.loadMultipleFiles && ((_c = this.selectedFile) === null || _c === void 0 ? void 0 : _c.size) / (1024 * 1024) > this.allowedMBForFile) {
815
940
  return false;
941
+ }
942
+ if (this.loadMultipleFiles &&
943
+ this.selectedFiles &&
944
+ __spread(this.selectedFiles).filter(function (p) { var _a; return ((_a = p) === null || _a === void 0 ? void 0 : _a.size) / (1024 * 1024) > _this.allowedMBForFile; }).length > 0) {
945
+ return false;
946
+ }
816
947
  if (this.acceptedFileTypes == "*")
817
948
  return true;
818
949
  //Verifica che i tipi del file (o dei file) caricati siano coerenti con quelli accettati dalla direttiva
@@ -829,8 +960,8 @@ var EqpAttachmentsComponent = /** @class */ (function () {
829
960
  //Questo controllo permette di gestire le casistiche per cui vengono indicati come tipi validi, ad esempio, 'image/*'
830
961
  if (!accepted && this.loadMultipleFiles != true) {
831
962
  try {
832
- for (var _b = __values(this.acceptedFileTypes.split(",").filter(function (t) { return t.includes("*"); })), _c = _b.next(); !_c.done; _c = _b.next()) {
833
- var t = _c.value;
963
+ for (var _d = __values(this.acceptedFileTypes.split(",").filter(function (t) { return t.includes("*"); })), _e = _d.next(); !_e.done; _e = _d.next()) {
964
+ var t = _e.value;
834
965
  accepted = this.selectedFile.type.startsWith(t.split("*")[0]);
835
966
  if (accepted)
836
967
  break;
@@ -839,7 +970,7 @@ var EqpAttachmentsComponent = /** @class */ (function () {
839
970
  catch (e_1_1) { e_1 = { error: e_1_1 }; }
840
971
  finally {
841
972
  try {
842
- if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
973
+ if (_e && !_e.done && (_a = _d.return)) _a.call(_d);
843
974
  }
844
975
  finally { if (e_1) throw e_1.error; }
845
976
  }
@@ -871,15 +1002,15 @@ var EqpAttachmentsComponent = /** @class */ (function () {
871
1002
  var image = new Image();
872
1003
  image.src = e.target.result;
873
1004
  image.onload = function (rs) {
874
- _this.originalHeight = rs.currentTarget['height'];
875
- _this.originalWidth = rs.currentTarget['width'];
1005
+ _this.originalHeight = rs.currentTarget["height"];
1006
+ _this.originalWidth = rs.currentTarget["width"];
876
1007
  if (_this.originalWidth > 1280) {
877
1008
  _this.customWidth = 1280;
878
1009
  _this.customHeight = Math.round((1280 * _this.originalHeight) / _this.originalWidth);
879
1010
  }
880
1011
  else {
881
- _this.customHeight = rs.currentTarget['height'];
882
- _this.customWidth = rs.currentTarget['width'];
1012
+ _this.customHeight = rs.currentTarget["height"];
1013
+ _this.customWidth = rs.currentTarget["width"];
883
1014
  }
884
1015
  };
885
1016
  };
@@ -908,18 +1039,18 @@ var EqpAttachmentsComponent = /** @class */ (function () {
908
1039
  /**
909
1040
  * Comprime l'immagine passando come parametri le options create nell'oggetto sopra, e il file dal reader principale
910
1041
  */
911
- imageCompression(file, options).then((function (fileCompressed) {
1042
+ imageCompression(file, options).then(function (fileCompressed) {
912
1043
  var fileReader = new FileReader();
913
1044
  //Faccio la push di ogni file all'interno dell'array di file dell'item da mandare al server
914
1045
  fileReader.onload = function () {
915
1046
  var resultReader = fileReader.result;
916
- var marker = ';base64,';
1047
+ var marker = ";base64,";
917
1048
  self.newAttachment.FileDataBase64 = resultReader.substring(resultReader.indexOf(marker) + marker.length);
918
1049
  self.showCropImage = false;
919
1050
  self.newAttachmentForm.enable();
920
1051
  };
921
1052
  fileReader.readAsDataURL(fileCompressed);
922
- }));
1053
+ });
923
1054
  };
924
1055
  EqpAttachmentsComponent.prototype.confirmCrop = function () {
925
1056
  this.imageCropper.crop();
@@ -928,9 +1059,9 @@ var EqpAttachmentsComponent = /** @class */ (function () {
928
1059
  * Annulla la selezione del file, svuotando l'input e resettando tutte le proprietà dell'IAttachmentDTO
929
1060
  */
930
1061
  EqpAttachmentsComponent.prototype.abortFile = function () {
931
- this.imageChangedEvent = '';
1062
+ this.imageChangedEvent = "";
932
1063
  if (this.imageInput)
933
- this.imageInput.nativeElement.value = '';
1064
+ this.imageInput.nativeElement.value = "";
934
1065
  this.selectedFile = null;
935
1066
  this.selectedFiles = null;
936
1067
  this.showCropImage = false;
@@ -1012,6 +1143,18 @@ var EqpAttachmentsComponent = /** @class */ (function () {
1012
1143
  __decorate([
1013
1144
  Input("tablePaginatorSize")
1014
1145
  ], EqpAttachmentsComponent.prototype, "tablePaginatorSize", void 0);
1146
+ __decorate([
1147
+ Input("allowVideo")
1148
+ ], EqpAttachmentsComponent.prototype, "allowVideo", void 0);
1149
+ __decorate([
1150
+ Input("allowVideoCompression")
1151
+ ], EqpAttachmentsComponent.prototype, "allowVideoCompression", void 0);
1152
+ __decorate([
1153
+ Input("videoFormatsNotAllowed")
1154
+ ], EqpAttachmentsComponent.prototype, "videoFormatsNotAllowed", void 0);
1155
+ __decorate([
1156
+ Input("allowedMBForFile")
1157
+ ], EqpAttachmentsComponent.prototype, "allowedMBForFile", void 0);
1015
1158
  __decorate([
1016
1159
  Input("downloadTooltipPosition")
1017
1160
  ], EqpAttachmentsComponent.prototype, "downloadTooltipPosition", void 0);
@@ -1085,30 +1228,30 @@ var EqpAttachmentsComponent = /** @class */ (function () {
1085
1228
  Output("onComponentLoaded")
1086
1229
  ], EqpAttachmentsComponent.prototype, "onComponentLoaded", void 0);
1087
1230
  __decorate([
1088
- ViewChild('dialogAddAttachment', { static: true })
1231
+ ViewChild("dialogAddAttachment", { static: true })
1089
1232
  ], EqpAttachmentsComponent.prototype, "dialogAddAttachment", void 0);
1090
1233
  __decorate([
1091
- ViewChild('dialogAddMultipleAttachment', { static: true })
1234
+ ViewChild("dialogAddMultipleAttachment", { static: true })
1092
1235
  ], EqpAttachmentsComponent.prototype, "dialogAddMultipleAttachment", void 0);
1093
1236
  __decorate([
1094
1237
  ViewChild(ImageCropperComponent)
1095
1238
  ], EqpAttachmentsComponent.prototype, "imageCropper", void 0);
1096
1239
  __decorate([
1097
- ViewChild('imageInput')
1240
+ ViewChild("imageInput")
1098
1241
  ], EqpAttachmentsComponent.prototype, "imageInput", void 0);
1099
1242
  __decorate([
1100
- ViewChild('attachmentTable', { static: false })
1243
+ ViewChild("attachmentTable", { static: false })
1101
1244
  ], EqpAttachmentsComponent.prototype, "attachmentTable", void 0);
1102
1245
  __decorate([
1103
- ViewChild('inlinePreviewTemplate', { static: true })
1246
+ ViewChild("inlinePreviewTemplate", { static: true })
1104
1247
  ], EqpAttachmentsComponent.prototype, "inlinePreviewTemplate", void 0);
1105
1248
  __decorate([
1106
- ViewChild('dialogPreview', { static: true })
1249
+ ViewChild("dialogPreview", { static: true })
1107
1250
  ], EqpAttachmentsComponent.prototype, "dialogPreview", void 0);
1108
1251
  EqpAttachmentsComponent = __decorate([
1109
1252
  Component({
1110
- selector: 'eqp-attachments',
1111
- 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>",
1253
+ selector: "eqp-attachments",
1254
+ 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 eqp-attachments-save-btn mr-2\" type=\"submit\"\r\n [disabled]=\"showCropImage == true || (loadMultipleFiles != true && newAttachmentForm?.disabled == true) || disableSave()\">\r\n <span *ngIf=\"showZipSpinner\" class=\"spinner-border spinner-border-sm eqp-attachments-save-spinner\" role=\"status\" aria-hidden=\"true\"></span>\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>",
1112
1255
  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}"]
1113
1256
  })
1114
1257
  ], EqpAttachmentsComponent);