@eqproject/eqp-attachments 0.1.10 → 0.1.13

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.
package/README.md CHANGED
@@ -55,6 +55,7 @@ export class AppModule {}
55
55
  | [attachmentsList] | `Array<IAttachmentDTO>` | `null` | no | Defines the initial array of attachments. If not passed it is instantiated as an empty array. Even in case `multipleAttachment` is set to FALSE you need to pass the eventual attachment as an Array. |
56
56
  | [showMatCard] | `boolean` | `true` | no | If TRUE applies the `box-shadow` style of the mat-card |
57
57
  | [multipleAttachment] | `boolean` | `true` | no | Defines how many attachments the directive needs to handle. If TRUE shows an eqp-table containing the values of `attachmentsList` with the possibility to download/open or delete any row. With any other value it shows only a button to upload one IAttachmentDTO (link or file). |
58
+ | [loadMultipleFiles] | `boolean` | `false` | no | If it assumes the value TRUE then it will be possible to load multiple files at the same time. This feature is active ONLY if you manage multiple attachments, so if the `multipleAttachment` input takes on the value TRUE, otherwise it is always disabled. |
58
59
  | [attachmentsColumns] | `Array<ConfigColumn>` | `null` | no | Has effect only if `[multipleAttachment]="true"`. Columns configuration for the eqp-table showing the list of IAttachmentDTO.
59
60
  | [emptyTableMessage] | `string` | `"Nessun dato trovato"` | no | Has effect only if `[multipleAttachment]="true"`. Sets the message to show if the eqp-table contains no elements. |
60
61
  | [allowOnlyImages] | `boolean` | `false` | no | If TRUE allows the user to upload only image files of the following types: `["image/bmp", "image/gif", "image/jpeg", "image/tiff", "image/png"]`. If FALSE the user can upload a file of any type. |
@@ -406,11 +406,12 @@
406
406
  }); };
407
407
  var ɵ0 = toBase64;
408
408
  var EqpAttachmentsComponent = /** @class */ (function () {
409
- function EqpAttachmentsComponent(dialog, formBuilder, sanitizer, http) {
409
+ function EqpAttachmentsComponent(dialog, formBuilder, sanitizer, http, cd) {
410
410
  this.dialog = dialog;
411
411
  this.formBuilder = formBuilder;
412
412
  this.sanitizer = sanitizer;
413
413
  this.http = http;
414
+ this.cd = cd;
414
415
  //#region @Input del componente
415
416
  /**
416
417
  * Se TRUE allora nasconde la colonna per le azioni sull'allegato (nel caso "multipleAttachment" è TRUE).
@@ -437,6 +438,11 @@
437
438
  * Se TRUE allora il componente mostra l'elenco di tutti gli allegati ricevuto nel parametro "attachmentsList".
438
439
  */
439
440
  this.multipleAttachment = true;
441
+ /**
442
+ * Se assume il valore TRUE allora sarà possibile caricare più file per volta. Questa funzionalità è attiva
443
+ * SOLO se si gestiscono allegati multipli, quindi se l'input 'multipleAttachment' assume il valore TRUE, altrimenti è sempre disabilitata.
444
+ */
445
+ this.loadMultipleFiles = false;
440
446
  /**
441
447
  * Configurazione delle colonne della eqp-table per la visualizzazione degli allegati (caso "multipleAttachment" è TRUE).
442
448
  */
@@ -481,6 +487,10 @@
481
487
  * Array di AttachmentType che si possono aggiungere
482
488
  */
483
489
  this.allowedTypes = [exports.AttachmentType.FILE, exports.AttachmentType.LINK];
490
+ /**
491
+ * Booleano per impostare la eqp-table nella modalità multilingua
492
+ */
493
+ this.isEqpTableMultiLanguage = false;
484
494
  /**
485
495
  * Input per definire le label da usare nel componente
486
496
  */
@@ -520,8 +530,10 @@
520
530
  //#endregion
521
531
  //#region Proprietà per gestione caricamento nuovo allegato
522
532
  this.newAttachment = {};
533
+ this.newMultipleAttachments = [];
523
534
  this.attachmentType = exports.AttachmentType;
524
535
  this.selectedFile = null;
536
+ this.selectedFiles = null;
525
537
  this.showCropImage = false;
526
538
  //#endregion
527
539
  //#region Proprietà per gestione ridimensionamento file di tipo image
@@ -552,8 +564,6 @@
552
564
  if (this.attachmentsList == null)
553
565
  this.attachmentsList = new Array();
554
566
  this.checkAttachmentImage();
555
- // if (!this.compressionOptions || !this.compressionOptions.maxSizeMB || !this.compressionOptions.maxWidthOrHeight)
556
- // this.compressionOptions = { maxSizeMB: 0.5, maxWidthOrHeight: 1920, useWebWorker: true };
557
567
  };
558
568
  EqpAttachmentsComponent.prototype.reloadData = function () {
559
569
  if (this.attachmentTable)
@@ -666,9 +676,25 @@
666
676
  * Apre la modale per la definizione dei parametri del nuovo file
667
677
  */
668
678
  EqpAttachmentsComponent.prototype.openModalAddAttachment = function (attachmentType) {
679
+ //Se è stato richiesto il caricamento di un LINK o è impostato il caricamento di FILE SINGOLO allora apre la modale per
680
+ //il caricamento singolo del file altrimenti apre quella per il caricamento multiplo
681
+ // if (attachmentType == AttachmentType.LINK || (attachmentType == AttachmentType.FILE && this.loadMultipleFiles != true)) {
669
682
  this.newAttachment = {};
670
683
  this.newAttachment.IsImage = false;
671
684
  this.newAttachment.AttachmentType = attachmentType;
685
+ this.newMultipleAttachments = new Array();
686
+ if (attachmentType == exports.AttachmentType.LINK)
687
+ this.newMultipleAttachments.push(this.newAttachment);
688
+ this.createAttachmentForm();
689
+ //Apre la modale
690
+ this.dialofRefAddAttachment = this.dialog.open(this.dialogAddAttachment, {
691
+ disableClose: true,
692
+ hasBackdrop: true,
693
+ width: '60%',
694
+ maxHeight: '80%'
695
+ });
696
+ };
697
+ EqpAttachmentsComponent.prototype.createAttachmentForm = function () {
672
698
  //Crea la form per la validazione dei campi
673
699
  this.newAttachmentForm = this.formBuilder.group({
674
700
  type: [this.newAttachment.AttachmentType, forms.Validators.required],
@@ -677,18 +703,13 @@
677
703
  customHeight: [this.customHeight],
678
704
  customWidth: [this.customWidth]
679
705
  });
680
- //Apre la modale
681
- this.dialofRefAddAttachment = this.dialog.open(this.dialogAddAttachment, {
682
- disableClose: true,
683
- hasBackdrop: true,
684
- width: '60%',
685
- maxHeight: '80%'
686
- });
687
706
  };
688
707
  EqpAttachmentsComponent.prototype.close = function () {
689
708
  this.newAttachment = {};
709
+ this.newMultipleAttachments = new Array();
690
710
  this.abortFile();
691
- this.newAttachmentForm.reset();
711
+ if (this.newAttachmentForm)
712
+ this.newAttachmentForm.reset();
692
713
  this.dialofRefAddAttachment.close();
693
714
  };
694
715
  /**
@@ -697,23 +718,37 @@
697
718
  * @returns
698
719
  */
699
720
  EqpAttachmentsComponent.prototype.disableSave = function () {
700
- if (this.newAttachment.AttachmentType == exports.AttachmentType.FILE) {
701
- return !this.newAttachment.FileDataBase64;
721
+ if (this.loadMultipleFiles != true) {
722
+ if (this.newAttachment.AttachmentType == exports.AttachmentType.FILE) {
723
+ return !this.newAttachment.FileDataBase64;
724
+ }
725
+ else {
726
+ return !this.newAttachment.FilePath;
727
+ }
702
728
  }
703
729
  else {
704
- return !this.newAttachment.FilePath;
730
+ return this.newMultipleAttachments.filter(function (p) { return (p.AttachmentType == exports.AttachmentType.FILE && !p.FileDataBase64) || (p.AttachmentType == exports.AttachmentType.LINK && !p.FilePath); }).length > 0;
705
731
  }
706
732
  };
707
733
  EqpAttachmentsComponent.prototype.confirmAddAttachment = function () {
708
- if (this.newAttachment.AttachmentType == exports.AttachmentType.LINK && !this.newAttachment.FileName)
709
- this.newAttachment.FileName = this.newAttachment.FilePath;
710
- if (this.attachmentsList == null)
711
- this.attachmentsList = new Array();
712
- this.attachmentsList.push(this.newAttachment);
734
+ if (this.loadMultipleFiles != true) {
735
+ if (this.newAttachment.AttachmentType == exports.AttachmentType.LINK && !this.newAttachment.FileName)
736
+ this.newAttachment.FileName = this.newAttachment.FilePath;
737
+ if (this.attachmentsList == null)
738
+ this.attachmentsList = new Array();
739
+ this.attachmentsList.push(this.newAttachment);
740
+ }
741
+ else {
742
+ if (this.newMultipleAttachments == null || this.newMultipleAttachments.length == 0)
743
+ return;
744
+ if (this.attachmentsList == null)
745
+ this.attachmentsList = new Array();
746
+ this.attachmentsList = this.attachmentsList.concat(this.newMultipleAttachments);
747
+ }
713
748
  if (this.attachmentTable)
714
749
  this.attachmentTable.reloadDatatable();
715
750
  this.localEditedAttachments.emit(this.attachmentsList);
716
- this.dialofRefAddAttachment.close();
751
+ this.close();
717
752
  };
718
753
  /**
719
754
  * Apre il dialog per l'anteprima dell'allegato selezionato.
@@ -783,36 +818,39 @@
783
818
  };
784
819
  //#region Gestione caricamento file
785
820
  /**
786
- * Se il file caricato è un immagine allora mostra le funzionalità del croppie per ritagliare l'immagine altrimenti
787
- * converte il file in base64 e lo associa all'allegato da salvare
821
+ * Evento scatenato alla selezione del file (o dei file).
822
+ * Se il caricamento è SINGOLO o se comunque è stato selezionato un solo file allora si occupa di controllare se si tratta di un immagine in modo da
823
+ * mostrare le funzionalità del croppie (per ritagliare l'immagine) oppure no.
824
+ * Se il file caricato non è un immagine allora genera direttamente il base64 e lo associa all'allegato da salvare.
825
+ * Se invece il caricamento dei file è MULTIPLO e sono presenti più file allora esegue le stesse operazioni ignorando però il contrllo
826
+ * immagine per il croppie (in caso di caricamento multiplo le funzionalità del croppie sono disabilitate).
788
827
  */
789
828
  EqpAttachmentsComponent.prototype.onFileInputChange = function (event) {
790
829
  return __awaiter(this, void 0, void 0, function () {
791
- var base64File;
792
- return __generator(this, function (_a) {
793
- switch (_a.label) {
830
+ var _a, checkOnlyImage, base64Result, i, newAttachment, checkOnlyImage;
831
+ return __generator(this, function (_b) {
832
+ switch (_b.label) {
794
833
  case 0:
795
834
  this.showCropImage = false;
835
+ if (!(__spread(event.target.files).length == 1 || this.loadMultipleFiles != true)) return [3 /*break*/, 5];
796
836
  this.selectedFile = event.target.files[0];
837
+ this.selectedFiles = event.target.files;
797
838
  if (!this.selectedFile)
798
839
  return [2 /*return*/];
799
840
  //Memorizza i dati per l'allegato
800
- this.newAttachment.FileContentType = this.selectedFile.type;
801
- this.newAttachment.FileName = this.selectedFile.name;
802
- this.newAttachment.FileExtension = this.selectedFile.name.substr(this.selectedFile.name.lastIndexOf('.') + 1);
803
- this.newAttachment.IsImage = AttachmentHelperService.checkImageFromMimeType(this.selectedFile.type);
804
- //Se è stata richiesta la gestione delle sole immagini ma per errore è stato selezionato un file che non è un immagine
805
- if (this.allowOnlyImages == true && this.newAttachment.IsImage != true) {
806
- EqpAttachmentDialogService.Error(this.noImageSelectedErrorMessage);
807
- this.abortFile();
808
- return [2 /*return*/];
809
- }
810
- else if (!this.checkAcceptedFiles()) {
811
- EqpAttachmentDialogService.Error(this.wrongTypeSelectedErrorMessage);
812
- this.abortFile();
841
+ _a = this;
842
+ return [4 /*yield*/, this.createAttachmentFromUploadedFile(this.selectedFile, false)];
843
+ case 1:
844
+ //Memorizza i dati per l'allegato
845
+ _a.newAttachment = _b.sent();
846
+ this.newMultipleAttachments = new Array();
847
+ this.newMultipleAttachments.push(this.newAttachment);
848
+ checkOnlyImage = this.checkAllowOnlyImageFile(this.newAttachment);
849
+ if (checkOnlyImage == false)
813
850
  return [2 /*return*/];
814
- }
815
- if (!(this.newAttachment.IsImage == true)) return [3 /*break*/, 1];
851
+ if (this.loadMultipleFiles == true && __spread(event.target.files).length == 1)
852
+ this.createAttachmentForm();
853
+ if (!(this.newAttachment.IsImage == true)) return [3 /*break*/, 2];
816
854
  this.getImageDimensions(event.target.files[0]);
817
855
  //Mostra il croppie e disabilita la form finchè non termina la modifica dell'immagine
818
856
  this.newAttachmentForm.disable();
@@ -820,23 +858,103 @@
820
858
  this.newAttachmentForm.controls["customHeight"].enable();
821
859
  this.showCropImage = true;
822
860
  this.imageChangedEvent = event;
823
- return [3 /*break*/, 3];
824
- case 1:
825
- this.showCropImage = false;
826
- return [4 /*yield*/, toBase64(this.selectedFile)];
861
+ return [3 /*break*/, 4];
827
862
  case 2:
863
+ this.showCropImage = false;
864
+ return [4 /*yield*/, this.getBase64FromFile(this.selectedFile)];
865
+ case 3:
866
+ base64Result = _b.sent();
867
+ this.newAttachment.FileDataBase64 = base64Result.Base64File;
868
+ this.newAttachment.FileContentType = base64Result.ContentType;
869
+ _b.label = 4;
870
+ case 4: return [3 /*break*/, 9];
871
+ case 5:
872
+ this.selectedFiles = event.target.files;
873
+ if (!this.selectedFiles || this.selectedFiles.length == 0)
874
+ return [2 /*return*/];
875
+ this.newMultipleAttachments = new Array();
876
+ i = 0;
877
+ _b.label = 6;
878
+ case 6:
879
+ if (!(i < this.selectedFiles.length)) return [3 /*break*/, 9];
880
+ return [4 /*yield*/, this.createAttachmentFromUploadedFile(this.selectedFiles[i], true)];
881
+ case 7:
882
+ newAttachment = _b.sent();
883
+ checkOnlyImage = this.checkAllowOnlyImageFile(newAttachment);
884
+ if (checkOnlyImage == false)
885
+ return [2 /*return*/];
886
+ this.newMultipleAttachments.push(newAttachment);
887
+ _b.label = 8;
888
+ case 8:
889
+ i++;
890
+ return [3 /*break*/, 6];
891
+ case 9: return [2 /*return*/];
892
+ }
893
+ });
894
+ });
895
+ };
896
+ /**
897
+ * A partire dal FILE ricevuto in input ricostruisce l'oggetto IAttachmentDTO e lo restituisce.
898
+ * Se il parametro getBase64 viene passato a TRUE allora, sempre a partire dal file,genera il base64 e
899
+ * ricava il ContentType da associare all'oggetto IAttachmentDTO da restituire
900
+ * @param currentFile Oggetto FILE da processare
901
+ * @param getBase64 Se TRUE allora calcola base64 e ContentType del file passato in input
902
+ * @returns Restituisce un oggetto di tipo IAttachmentDTO
903
+ */
904
+ EqpAttachmentsComponent.prototype.createAttachmentFromUploadedFile = function (currentFile, getBase64) {
905
+ if (getBase64 === void 0) { getBase64 = true; }
906
+ return __awaiter(this, void 0, void 0, function () {
907
+ var newAttachment, base64Result;
908
+ return __generator(this, function (_a) {
909
+ switch (_a.label) {
910
+ case 0:
911
+ newAttachment = {};
912
+ //Memorizza i dati per l'allegato
913
+ newAttachment.AttachmentType = exports.AttachmentType.FILE;
914
+ newAttachment.FileContentType = currentFile.type;
915
+ newAttachment.FileName = currentFile.name;
916
+ newAttachment.FileExtension = currentFile.name.substr(currentFile.name.lastIndexOf('.') + 1);
917
+ newAttachment.IsImage = AttachmentHelperService.checkImageFromMimeType(currentFile.type);
918
+ if (!(getBase64 == true)) return [3 /*break*/, 2];
919
+ return [4 /*yield*/, this.getBase64FromFile(currentFile)];
920
+ case 1:
921
+ base64Result = _a.sent();
922
+ newAttachment.FileDataBase64 = base64Result.Base64File;
923
+ newAttachment.FileContentType = base64Result.ContentType;
924
+ _a.label = 2;
925
+ case 2: return [2 /*return*/, newAttachment];
926
+ }
927
+ });
928
+ });
929
+ };
930
+ /**
931
+ * A partire dal file passato in input restituisce un oggetto
932
+ * contenente il base64 del file e il suo contentType
933
+ * @param currentFile Oggetto File da cui estrapolare base64 e contentType
934
+ * @returns Restituisce un oggetto avente le proprietà Base64File e ContentType
935
+ */
936
+ EqpAttachmentsComponent.prototype.getBase64FromFile = function (currentFile) {
937
+ return __awaiter(this, void 0, void 0, function () {
938
+ var base64File, contentType, result;
939
+ return __generator(this, function (_a) {
940
+ switch (_a.label) {
941
+ case 0: return [4 /*yield*/, toBase64(currentFile)];
942
+ case 1:
828
943
  base64File = _a.sent();
944
+ contentType = null;
829
945
  if (base64File) {
830
946
  // Loris 20/01/2022: PROBLEMA - Quando eseguo l'upload di un file .sql non viene salvato/scaricato correttamente.
831
947
  // Questo succede perchè non viene popolato il FileContentType. Per risolvere il problema
832
948
  // faccio un controllo e se non esiste il FileContentType allora lo recupero dal base64 ottenuto.
833
- this.newAttachment.FileContentType = !this.newAttachment.FileContentType ? base64File.split(",")[0].split(":")[1].split(";")[0] : this.newAttachment.FileContentType;
949
+ contentType = base64File.split(",")[0].split(":")[1].split(";")[0];
834
950
  // Un altro metodo per leggere il ccontent type del file è tramite una regular expression:
835
- // this.newAttachment.FileContentType = !this.newAttachment.FileContentType ? base64File.match(/[^:]\w+\/[\w-+\d.]+(?=;|,)/)[0] : this.newAttachment.FileContentType;
836
- this.newAttachment.FileDataBase64 = base64File.split(",")[1];
951
+ base64File = base64File.split(",")[1];
837
952
  }
838
- _a.label = 3;
839
- case 3: return [2 /*return*/];
953
+ result = {
954
+ Base64File: base64File,
955
+ ContentType: contentType
956
+ };
957
+ return [2 /*return*/, result];
840
958
  }
841
959
  });
842
960
  });
@@ -847,12 +965,25 @@
847
965
  */
848
966
  EqpAttachmentsComponent.prototype.checkAcceptedFiles = function () {
849
967
  var e_1, _a;
850
- if (this.selectedFile.type.startsWith("video"))
968
+ var _this = this;
969
+ if ((this.loadMultipleFiles != true && this.selectedFile.type.startsWith("video"))
970
+ || (this.loadMultipleFiles == true && __spread(this.selectedFiles).filter(function (p) { return p.type.startsWith("video"); }).length > 0))
851
971
  return false;
852
972
  if (this.acceptedFileTypes == "*")
853
973
  return true;
854
- var accepted = this.acceptedFileTypes.includes(this.selectedFile.type);
855
- if (!accepted) {
974
+ //Verifica che i tipi del file (o dei file) caricati siano coerenti con quelli accettati dalla direttiva
975
+ var accepted = true;
976
+ if (this.loadMultipleFiles != true)
977
+ accepted = this.acceptedFileTypes.includes(this.selectedFile.type);
978
+ else {
979
+ var uploadedFileTypes = __spread(this.selectedFiles).map(function (p) { return p.type; });
980
+ uploadedFileTypes.forEach(function (type) {
981
+ if (!_this.acceptedFileTypes.includes(type))
982
+ accepted = false;
983
+ });
984
+ }
985
+ //Questo controllo permette di gestire le casistiche per cui vengono indicati come tipi validi, ad esempio, 'image/*'
986
+ if (!accepted && this.loadMultipleFiles != true) {
856
987
  try {
857
988
  for (var _b = __values(this.acceptedFileTypes.split(",").filter(function (t) { return t.includes("*"); })), _c = _b.next(); !_c.done; _c = _b.next()) {
858
989
  var t = _c.value;
@@ -871,6 +1002,24 @@
871
1002
  }
872
1003
  return accepted;
873
1004
  };
1005
+ /**
1006
+ * Se eqp-attachments è stata configurata per il caricamento delle sole immagini allora verifica che il file passato in
1007
+ * input sia effettivamente un immagine o no.
1008
+ * Se il controllo va a buon fine restituisce TRUE altrimenti mostra un messaggio d'errore e restituisce FALSE
1009
+ */
1010
+ EqpAttachmentsComponent.prototype.checkAllowOnlyImageFile = function (newAttachment) {
1011
+ if (this.allowOnlyImages == true && newAttachment.IsImage != true) {
1012
+ EqpAttachmentDialogService.Error(this.noImageSelectedErrorMessage);
1013
+ this.abortFile();
1014
+ return false;
1015
+ }
1016
+ else if (!this.checkAcceptedFiles()) {
1017
+ EqpAttachmentDialogService.Error(this.wrongTypeSelectedErrorMessage);
1018
+ this.abortFile();
1019
+ return false;
1020
+ }
1021
+ return true;
1022
+ };
874
1023
  EqpAttachmentsComponent.prototype.getImageDimensions = function (img) {
875
1024
  var _this = this;
876
1025
  var reader = new FileReader();
@@ -939,12 +1088,14 @@
939
1088
  if (this.imageInput)
940
1089
  this.imageInput.nativeElement.value = '';
941
1090
  this.selectedFile = null;
1091
+ this.selectedFiles = null;
942
1092
  this.showCropImage = false;
943
1093
  this.newAttachment.IsImage = false;
944
1094
  this.newAttachment.FileDataBase64 = null;
945
1095
  this.newAttachment.FileName = null;
946
1096
  this.newAttachment.FileExtension = null;
947
1097
  this.newAttachment.FileContentType = null;
1098
+ this.newMultipleAttachments = new Array();
948
1099
  this.customHeight = null;
949
1100
  this.customWidth = null;
950
1101
  this.originalHeight = null;
@@ -954,7 +1105,8 @@
954
1105
  { type: dialog.MatDialog },
955
1106
  { type: forms.FormBuilder },
956
1107
  { type: platformBrowser.DomSanitizer },
957
- { type: http.HttpClient }
1108
+ { type: http.HttpClient },
1109
+ { type: core.ChangeDetectorRef }
958
1110
  ]; };
959
1111
  __decorate([
960
1112
  core.Input("disableAction")
@@ -974,6 +1126,9 @@
974
1126
  __decorate([
975
1127
  core.Input("multipleAttachment")
976
1128
  ], EqpAttachmentsComponent.prototype, "multipleAttachment", void 0);
1129
+ __decorate([
1130
+ core.Input("loadMultipleFiles")
1131
+ ], EqpAttachmentsComponent.prototype, "loadMultipleFiles", void 0);
977
1132
  __decorate([
978
1133
  core.Input("attachmentsColumns")
979
1134
  ], EqpAttachmentsComponent.prototype, "attachmentsColumns", void 0);
@@ -1004,6 +1159,9 @@
1004
1159
  __decorate([
1005
1160
  core.Input("allowedTypes")
1006
1161
  ], EqpAttachmentsComponent.prototype, "allowedTypes", void 0);
1162
+ __decorate([
1163
+ core.Input("isEqpTableMultiLanguage")
1164
+ ], EqpAttachmentsComponent.prototype, "isEqpTableMultiLanguage", void 0);
1007
1165
  __decorate([
1008
1166
  core.Input("downloadTooltipPosition")
1009
1167
  ], EqpAttachmentsComponent.prototype, "downloadTooltipPosition", void 0);
@@ -1073,6 +1231,9 @@
1073
1231
  __decorate([
1074
1232
  core.ViewChild('dialogAddAttachment', { static: true })
1075
1233
  ], EqpAttachmentsComponent.prototype, "dialogAddAttachment", void 0);
1234
+ __decorate([
1235
+ core.ViewChild('dialogAddMultipleAttachment', { static: true })
1236
+ ], EqpAttachmentsComponent.prototype, "dialogAddMultipleAttachment", void 0);
1076
1237
  __decorate([
1077
1238
  core.ViewChild(ngxImageCropper.ImageCropperComponent)
1078
1239
  ], EqpAttachmentsComponent.prototype, "imageCropper", void 0);
@@ -1091,7 +1252,7 @@
1091
1252
  EqpAttachmentsComponent = __decorate([
1092
1253
  core.Component({
1093
1254
  selector: 'eqp-attachments',
1094
- 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 [data]=\"attachmentsList\" [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\" name=\"file_attachment\" type=\"file\"\r\n (change)=\"onFileInputChange($event)\" [accept]=\"acceptedFileTypes\" />\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=\"!newAttachment.FileDataBase64\">\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=\"newAttachment.FileDataBase64\" 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\">\r\n <mat-form-field>\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>\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 <div class=\"row\"\r\n *ngIf=\"showCropImage != true && newAttachment.FileDataBase64 && newAttachment.IsImage == true\"\r\n 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 <div class=\"row mt-2 mb-2\" *ngIf=\"showCropImage == true\">\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\" *ngIf=\"showCropImage == true\">\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\" *ngIf=\"showCropImage == true\">\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\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 || 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\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.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.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>",
1255
+ 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 [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>",
1095
1256
  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}"]
1096
1257
  })
1097
1258
  ], EqpAttachmentsComponent);