@eqproject/eqp-attachments 0.1.11 → 0.1.14
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 +2 -0
- package/bundles/eqproject-eqp-attachments.umd.js +219 -55
- package/bundles/eqproject-eqp-attachments.umd.js.map +1 -1
- package/bundles/eqproject-eqp-attachments.umd.min.js +1 -1
- package/bundles/eqproject-eqp-attachments.umd.min.js.map +1 -1
- package/eqproject-eqp-attachments.metadata.json +1 -1
- package/esm2015/lib/eqp-attachments.component.js +208 -69
- package/esm5/lib/eqp-attachments.component.js +222 -58
- package/fesm2015/eqproject-eqp-attachments.js +207 -68
- package/fesm2015/eqproject-eqp-attachments.js.map +1 -1
- package/fesm5/eqproject-eqp-attachments.js +221 -57
- package/fesm5/eqproject-eqp-attachments.js.map +1 -1
- package/lib/eqp-attachments.component.d.ts +46 -6
- package/package.json +2 -2
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. |
|
|
@@ -89,6 +90,7 @@ export class AppModule {}
|
|
|
89
90
|
| Output | Event Arguments | Required | Description |
|
|
90
91
|
| ------------- | ------------- | ------------- | ------------- |
|
|
91
92
|
| (localEditedAttachments) | `EventEmitter<Array<IAttachmentDTO>>` | no | Invoked when an IAttachmentDTO is created and added to `attachmentsList` or is deleted. It always return an Array of IAttachmentDTO, even if `[multipleAttachment]="true"`. |
|
|
93
|
+
| (abortAddAttachment) | `EventEmitter<any>` | no | Event triggered by pressing the EXIT button of the file upload modal. |
|
|
92
94
|
| (downloadAttachment) | EventEmitter<IAttachmentDTO> | no | Invoked when the user tries to download an IAttachmentDTO with at least one of the following properties not defined: `"FileDataBase64", "FileContentType", "FileName"`. It returns the user selected object. |
|
|
93
95
|
| (onDeleteAttachment) | `EventEmitter<IAttachmentDTO>` | no | Invoked when an IAttachmentDTO is deleted from `attachmentsList`. It returns the deleted element. |
|
|
94
96
|
|
|
@@ -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
|
*/
|
|
@@ -513,6 +519,10 @@
|
|
|
513
519
|
* Restituisce la lista aggiornata degli allegati.
|
|
514
520
|
*/
|
|
515
521
|
this.localEditedAttachments = new core.EventEmitter();
|
|
522
|
+
/**
|
|
523
|
+
* Evento scatenato alla pressione del pulsante ESCI della modale di caricamento file.
|
|
524
|
+
*/
|
|
525
|
+
this.abortAddAttachment = new core.EventEmitter();
|
|
516
526
|
/**
|
|
517
527
|
* Evento di output che restituisce l'IAttachmentDTO selezionato per il download nel caso FileDataBase64, FileContentType o FileName non fossero specificati.
|
|
518
528
|
*/
|
|
@@ -524,8 +534,10 @@
|
|
|
524
534
|
//#endregion
|
|
525
535
|
//#region Proprietà per gestione caricamento nuovo allegato
|
|
526
536
|
this.newAttachment = {};
|
|
537
|
+
this.newMultipleAttachments = [];
|
|
527
538
|
this.attachmentType = exports.AttachmentType;
|
|
528
539
|
this.selectedFile = null;
|
|
540
|
+
this.selectedFiles = null;
|
|
529
541
|
this.showCropImage = false;
|
|
530
542
|
//#endregion
|
|
531
543
|
//#region Proprietà per gestione ridimensionamento file di tipo image
|
|
@@ -556,8 +568,6 @@
|
|
|
556
568
|
if (this.attachmentsList == null)
|
|
557
569
|
this.attachmentsList = new Array();
|
|
558
570
|
this.checkAttachmentImage();
|
|
559
|
-
// if (!this.compressionOptions || !this.compressionOptions.maxSizeMB || !this.compressionOptions.maxWidthOrHeight)
|
|
560
|
-
// this.compressionOptions = { maxSizeMB: 0.5, maxWidthOrHeight: 1920, useWebWorker: true };
|
|
561
571
|
};
|
|
562
572
|
EqpAttachmentsComponent.prototype.reloadData = function () {
|
|
563
573
|
if (this.attachmentTable)
|
|
@@ -670,9 +680,25 @@
|
|
|
670
680
|
* Apre la modale per la definizione dei parametri del nuovo file
|
|
671
681
|
*/
|
|
672
682
|
EqpAttachmentsComponent.prototype.openModalAddAttachment = function (attachmentType) {
|
|
683
|
+
//Se è stato richiesto il caricamento di un LINK o è impostato il caricamento di FILE SINGOLO allora apre la modale per
|
|
684
|
+
//il caricamento singolo del file altrimenti apre quella per il caricamento multiplo
|
|
685
|
+
// if (attachmentType == AttachmentType.LINK || (attachmentType == AttachmentType.FILE && this.loadMultipleFiles != true)) {
|
|
673
686
|
this.newAttachment = {};
|
|
674
687
|
this.newAttachment.IsImage = false;
|
|
675
688
|
this.newAttachment.AttachmentType = attachmentType;
|
|
689
|
+
this.newMultipleAttachments = new Array();
|
|
690
|
+
if (attachmentType == exports.AttachmentType.LINK)
|
|
691
|
+
this.newMultipleAttachments.push(this.newAttachment);
|
|
692
|
+
this.createAttachmentForm();
|
|
693
|
+
//Apre la modale
|
|
694
|
+
this.dialofRefAddAttachment = this.dialog.open(this.dialogAddAttachment, {
|
|
695
|
+
disableClose: true,
|
|
696
|
+
hasBackdrop: true,
|
|
697
|
+
width: '60%',
|
|
698
|
+
maxHeight: '80%'
|
|
699
|
+
});
|
|
700
|
+
};
|
|
701
|
+
EqpAttachmentsComponent.prototype.createAttachmentForm = function () {
|
|
676
702
|
//Crea la form per la validazione dei campi
|
|
677
703
|
this.newAttachmentForm = this.formBuilder.group({
|
|
678
704
|
type: [this.newAttachment.AttachmentType, forms.Validators.required],
|
|
@@ -681,19 +707,17 @@
|
|
|
681
707
|
customHeight: [this.customHeight],
|
|
682
708
|
customWidth: [this.customWidth]
|
|
683
709
|
});
|
|
684
|
-
//Apre la modale
|
|
685
|
-
this.dialofRefAddAttachment = this.dialog.open(this.dialogAddAttachment, {
|
|
686
|
-
disableClose: true,
|
|
687
|
-
hasBackdrop: true,
|
|
688
|
-
width: '60%',
|
|
689
|
-
maxHeight: '80%'
|
|
690
|
-
});
|
|
691
710
|
};
|
|
692
|
-
EqpAttachmentsComponent.prototype.close = function () {
|
|
711
|
+
EqpAttachmentsComponent.prototype.close = function (emitCloseEvent) {
|
|
712
|
+
if (emitCloseEvent === void 0) { emitCloseEvent = true; }
|
|
693
713
|
this.newAttachment = {};
|
|
714
|
+
this.newMultipleAttachments = new Array();
|
|
694
715
|
this.abortFile();
|
|
695
|
-
this.newAttachmentForm
|
|
716
|
+
if (this.newAttachmentForm)
|
|
717
|
+
this.newAttachmentForm.reset();
|
|
696
718
|
this.dialofRefAddAttachment.close();
|
|
719
|
+
if (emitCloseEvent == true && this.abortAddAttachment)
|
|
720
|
+
this.abortAddAttachment.emit();
|
|
697
721
|
};
|
|
698
722
|
/**
|
|
699
723
|
* In base al tipo di allegato controlla se disabilitare o meno il pulsante per salvare.
|
|
@@ -701,23 +725,37 @@
|
|
|
701
725
|
* @returns
|
|
702
726
|
*/
|
|
703
727
|
EqpAttachmentsComponent.prototype.disableSave = function () {
|
|
704
|
-
if (this.
|
|
705
|
-
|
|
728
|
+
if (this.loadMultipleFiles != true) {
|
|
729
|
+
if (this.newAttachment.AttachmentType == exports.AttachmentType.FILE) {
|
|
730
|
+
return !this.newAttachment.FileDataBase64;
|
|
731
|
+
}
|
|
732
|
+
else {
|
|
733
|
+
return !this.newAttachment.FilePath;
|
|
734
|
+
}
|
|
706
735
|
}
|
|
707
736
|
else {
|
|
708
|
-
return
|
|
737
|
+
return this.newMultipleAttachments.filter(function (p) { return (p.AttachmentType == exports.AttachmentType.FILE && !p.FileDataBase64) || (p.AttachmentType == exports.AttachmentType.LINK && !p.FilePath); }).length > 0;
|
|
709
738
|
}
|
|
710
739
|
};
|
|
711
740
|
EqpAttachmentsComponent.prototype.confirmAddAttachment = function () {
|
|
712
|
-
if (this.
|
|
713
|
-
this.newAttachment.
|
|
714
|
-
|
|
715
|
-
this.attachmentsList
|
|
716
|
-
|
|
741
|
+
if (this.loadMultipleFiles != true) {
|
|
742
|
+
if (this.newAttachment.AttachmentType == exports.AttachmentType.LINK && !this.newAttachment.FileName)
|
|
743
|
+
this.newAttachment.FileName = this.newAttachment.FilePath;
|
|
744
|
+
if (this.attachmentsList == null)
|
|
745
|
+
this.attachmentsList = new Array();
|
|
746
|
+
this.attachmentsList.push(this.newAttachment);
|
|
747
|
+
}
|
|
748
|
+
else {
|
|
749
|
+
if (this.newMultipleAttachments == null || this.newMultipleAttachments.length == 0)
|
|
750
|
+
return;
|
|
751
|
+
if (this.attachmentsList == null)
|
|
752
|
+
this.attachmentsList = new Array();
|
|
753
|
+
this.attachmentsList = this.attachmentsList.concat(this.newMultipleAttachments);
|
|
754
|
+
}
|
|
717
755
|
if (this.attachmentTable)
|
|
718
756
|
this.attachmentTable.reloadDatatable();
|
|
719
757
|
this.localEditedAttachments.emit(this.attachmentsList);
|
|
720
|
-
this.
|
|
758
|
+
this.close(false);
|
|
721
759
|
};
|
|
722
760
|
/**
|
|
723
761
|
* Apre il dialog per l'anteprima dell'allegato selezionato.
|
|
@@ -787,36 +825,39 @@
|
|
|
787
825
|
};
|
|
788
826
|
//#region Gestione caricamento file
|
|
789
827
|
/**
|
|
790
|
-
*
|
|
791
|
-
*
|
|
828
|
+
* Evento scatenato alla selezione del file (o dei file).
|
|
829
|
+
* 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
|
|
830
|
+
* mostrare le funzionalità del croppie (per ritagliare l'immagine) oppure no.
|
|
831
|
+
* Se il file caricato non è un immagine allora genera direttamente il base64 e lo associa all'allegato da salvare.
|
|
832
|
+
* Se invece il caricamento dei file è MULTIPLO e sono presenti più file allora esegue le stesse operazioni ignorando però il contrllo
|
|
833
|
+
* immagine per il croppie (in caso di caricamento multiplo le funzionalità del croppie sono disabilitate).
|
|
792
834
|
*/
|
|
793
835
|
EqpAttachmentsComponent.prototype.onFileInputChange = function (event) {
|
|
794
836
|
return __awaiter(this, void 0, void 0, function () {
|
|
795
|
-
var
|
|
796
|
-
return __generator(this, function (
|
|
797
|
-
switch (
|
|
837
|
+
var _a, checkOnlyImage, base64Result, i, newAttachment, checkOnlyImage;
|
|
838
|
+
return __generator(this, function (_b) {
|
|
839
|
+
switch (_b.label) {
|
|
798
840
|
case 0:
|
|
799
841
|
this.showCropImage = false;
|
|
842
|
+
if (!(__spread(event.target.files).length == 1 || this.loadMultipleFiles != true)) return [3 /*break*/, 5];
|
|
800
843
|
this.selectedFile = event.target.files[0];
|
|
844
|
+
this.selectedFiles = event.target.files;
|
|
801
845
|
if (!this.selectedFile)
|
|
802
846
|
return [2 /*return*/];
|
|
803
847
|
//Memorizza i dati per l'allegato
|
|
804
|
-
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
|
|
808
|
-
|
|
809
|
-
|
|
810
|
-
|
|
811
|
-
|
|
812
|
-
|
|
813
|
-
}
|
|
814
|
-
else if (!this.checkAcceptedFiles()) {
|
|
815
|
-
EqpAttachmentDialogService.Error(this.wrongTypeSelectedErrorMessage);
|
|
816
|
-
this.abortFile();
|
|
848
|
+
_a = this;
|
|
849
|
+
return [4 /*yield*/, this.createAttachmentFromUploadedFile(this.selectedFile, false)];
|
|
850
|
+
case 1:
|
|
851
|
+
//Memorizza i dati per l'allegato
|
|
852
|
+
_a.newAttachment = _b.sent();
|
|
853
|
+
this.newMultipleAttachments = new Array();
|
|
854
|
+
this.newMultipleAttachments.push(this.newAttachment);
|
|
855
|
+
checkOnlyImage = this.checkAllowOnlyImageFile(this.newAttachment);
|
|
856
|
+
if (checkOnlyImage == false)
|
|
817
857
|
return [2 /*return*/];
|
|
818
|
-
|
|
819
|
-
|
|
858
|
+
if (this.loadMultipleFiles == true && __spread(event.target.files).length == 1)
|
|
859
|
+
this.createAttachmentForm();
|
|
860
|
+
if (!(this.newAttachment.IsImage == true)) return [3 /*break*/, 2];
|
|
820
861
|
this.getImageDimensions(event.target.files[0]);
|
|
821
862
|
//Mostra il croppie e disabilita la form finchè non termina la modifica dell'immagine
|
|
822
863
|
this.newAttachmentForm.disable();
|
|
@@ -824,23 +865,103 @@
|
|
|
824
865
|
this.newAttachmentForm.controls["customHeight"].enable();
|
|
825
866
|
this.showCropImage = true;
|
|
826
867
|
this.imageChangedEvent = event;
|
|
827
|
-
return [3 /*break*/,
|
|
828
|
-
case 1:
|
|
829
|
-
this.showCropImage = false;
|
|
830
|
-
return [4 /*yield*/, toBase64(this.selectedFile)];
|
|
868
|
+
return [3 /*break*/, 4];
|
|
831
869
|
case 2:
|
|
870
|
+
this.showCropImage = false;
|
|
871
|
+
return [4 /*yield*/, this.getBase64FromFile(this.selectedFile)];
|
|
872
|
+
case 3:
|
|
873
|
+
base64Result = _b.sent();
|
|
874
|
+
this.newAttachment.FileDataBase64 = base64Result.Base64File;
|
|
875
|
+
this.newAttachment.FileContentType = base64Result.ContentType;
|
|
876
|
+
_b.label = 4;
|
|
877
|
+
case 4: return [3 /*break*/, 9];
|
|
878
|
+
case 5:
|
|
879
|
+
this.selectedFiles = event.target.files;
|
|
880
|
+
if (!this.selectedFiles || this.selectedFiles.length == 0)
|
|
881
|
+
return [2 /*return*/];
|
|
882
|
+
this.newMultipleAttachments = new Array();
|
|
883
|
+
i = 0;
|
|
884
|
+
_b.label = 6;
|
|
885
|
+
case 6:
|
|
886
|
+
if (!(i < this.selectedFiles.length)) return [3 /*break*/, 9];
|
|
887
|
+
return [4 /*yield*/, this.createAttachmentFromUploadedFile(this.selectedFiles[i], true)];
|
|
888
|
+
case 7:
|
|
889
|
+
newAttachment = _b.sent();
|
|
890
|
+
checkOnlyImage = this.checkAllowOnlyImageFile(newAttachment);
|
|
891
|
+
if (checkOnlyImage == false)
|
|
892
|
+
return [2 /*return*/];
|
|
893
|
+
this.newMultipleAttachments.push(newAttachment);
|
|
894
|
+
_b.label = 8;
|
|
895
|
+
case 8:
|
|
896
|
+
i++;
|
|
897
|
+
return [3 /*break*/, 6];
|
|
898
|
+
case 9: return [2 /*return*/];
|
|
899
|
+
}
|
|
900
|
+
});
|
|
901
|
+
});
|
|
902
|
+
};
|
|
903
|
+
/**
|
|
904
|
+
* A partire dal FILE ricevuto in input ricostruisce l'oggetto IAttachmentDTO e lo restituisce.
|
|
905
|
+
* Se il parametro getBase64 viene passato a TRUE allora, sempre a partire dal file,genera il base64 e
|
|
906
|
+
* ricava il ContentType da associare all'oggetto IAttachmentDTO da restituire
|
|
907
|
+
* @param currentFile Oggetto FILE da processare
|
|
908
|
+
* @param getBase64 Se TRUE allora calcola base64 e ContentType del file passato in input
|
|
909
|
+
* @returns Restituisce un oggetto di tipo IAttachmentDTO
|
|
910
|
+
*/
|
|
911
|
+
EqpAttachmentsComponent.prototype.createAttachmentFromUploadedFile = function (currentFile, getBase64) {
|
|
912
|
+
if (getBase64 === void 0) { getBase64 = true; }
|
|
913
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
914
|
+
var newAttachment, base64Result;
|
|
915
|
+
return __generator(this, function (_a) {
|
|
916
|
+
switch (_a.label) {
|
|
917
|
+
case 0:
|
|
918
|
+
newAttachment = {};
|
|
919
|
+
//Memorizza i dati per l'allegato
|
|
920
|
+
newAttachment.AttachmentType = exports.AttachmentType.FILE;
|
|
921
|
+
newAttachment.FileContentType = currentFile.type;
|
|
922
|
+
newAttachment.FileName = currentFile.name;
|
|
923
|
+
newAttachment.FileExtension = currentFile.name.substr(currentFile.name.lastIndexOf('.') + 1);
|
|
924
|
+
newAttachment.IsImage = AttachmentHelperService.checkImageFromMimeType(currentFile.type);
|
|
925
|
+
if (!(getBase64 == true)) return [3 /*break*/, 2];
|
|
926
|
+
return [4 /*yield*/, this.getBase64FromFile(currentFile)];
|
|
927
|
+
case 1:
|
|
928
|
+
base64Result = _a.sent();
|
|
929
|
+
newAttachment.FileDataBase64 = base64Result.Base64File;
|
|
930
|
+
newAttachment.FileContentType = base64Result.ContentType;
|
|
931
|
+
_a.label = 2;
|
|
932
|
+
case 2: return [2 /*return*/, newAttachment];
|
|
933
|
+
}
|
|
934
|
+
});
|
|
935
|
+
});
|
|
936
|
+
};
|
|
937
|
+
/**
|
|
938
|
+
* A partire dal file passato in input restituisce un oggetto
|
|
939
|
+
* contenente il base64 del file e il suo contentType
|
|
940
|
+
* @param currentFile Oggetto File da cui estrapolare base64 e contentType
|
|
941
|
+
* @returns Restituisce un oggetto avente le proprietà Base64File e ContentType
|
|
942
|
+
*/
|
|
943
|
+
EqpAttachmentsComponent.prototype.getBase64FromFile = function (currentFile) {
|
|
944
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
945
|
+
var base64File, contentType, result;
|
|
946
|
+
return __generator(this, function (_a) {
|
|
947
|
+
switch (_a.label) {
|
|
948
|
+
case 0: return [4 /*yield*/, toBase64(currentFile)];
|
|
949
|
+
case 1:
|
|
832
950
|
base64File = _a.sent();
|
|
951
|
+
contentType = null;
|
|
833
952
|
if (base64File) {
|
|
834
953
|
// Loris 20/01/2022: PROBLEMA - Quando eseguo l'upload di un file .sql non viene salvato/scaricato correttamente.
|
|
835
954
|
// Questo succede perchè non viene popolato il FileContentType. Per risolvere il problema
|
|
836
955
|
// faccio un controllo e se non esiste il FileContentType allora lo recupero dal base64 ottenuto.
|
|
837
|
-
|
|
956
|
+
contentType = base64File.split(",")[0].split(":")[1].split(";")[0];
|
|
838
957
|
// Un altro metodo per leggere il ccontent type del file è tramite una regular expression:
|
|
839
|
-
|
|
840
|
-
this.newAttachment.FileDataBase64 = base64File.split(",")[1];
|
|
958
|
+
base64File = base64File.split(",")[1];
|
|
841
959
|
}
|
|
842
|
-
|
|
843
|
-
|
|
960
|
+
result = {
|
|
961
|
+
Base64File: base64File,
|
|
962
|
+
ContentType: contentType
|
|
963
|
+
};
|
|
964
|
+
return [2 /*return*/, result];
|
|
844
965
|
}
|
|
845
966
|
});
|
|
846
967
|
});
|
|
@@ -851,12 +972,25 @@
|
|
|
851
972
|
*/
|
|
852
973
|
EqpAttachmentsComponent.prototype.checkAcceptedFiles = function () {
|
|
853
974
|
var e_1, _a;
|
|
854
|
-
|
|
975
|
+
var _this = this;
|
|
976
|
+
if ((this.loadMultipleFiles != true && this.selectedFile.type.startsWith("video"))
|
|
977
|
+
|| (this.loadMultipleFiles == true && __spread(this.selectedFiles).filter(function (p) { return p.type.startsWith("video"); }).length > 0))
|
|
855
978
|
return false;
|
|
856
979
|
if (this.acceptedFileTypes == "*")
|
|
857
980
|
return true;
|
|
858
|
-
|
|
859
|
-
|
|
981
|
+
//Verifica che i tipi del file (o dei file) caricati siano coerenti con quelli accettati dalla direttiva
|
|
982
|
+
var accepted = true;
|
|
983
|
+
if (this.loadMultipleFiles != true)
|
|
984
|
+
accepted = this.acceptedFileTypes.includes(this.selectedFile.type);
|
|
985
|
+
else {
|
|
986
|
+
var uploadedFileTypes = __spread(this.selectedFiles).map(function (p) { return p.type; });
|
|
987
|
+
uploadedFileTypes.forEach(function (type) {
|
|
988
|
+
if (!_this.acceptedFileTypes.includes(type))
|
|
989
|
+
accepted = false;
|
|
990
|
+
});
|
|
991
|
+
}
|
|
992
|
+
//Questo controllo permette di gestire le casistiche per cui vengono indicati come tipi validi, ad esempio, 'image/*'
|
|
993
|
+
if (!accepted && this.loadMultipleFiles != true) {
|
|
860
994
|
try {
|
|
861
995
|
for (var _b = __values(this.acceptedFileTypes.split(",").filter(function (t) { return t.includes("*"); })), _c = _b.next(); !_c.done; _c = _b.next()) {
|
|
862
996
|
var t = _c.value;
|
|
@@ -875,6 +1009,24 @@
|
|
|
875
1009
|
}
|
|
876
1010
|
return accepted;
|
|
877
1011
|
};
|
|
1012
|
+
/**
|
|
1013
|
+
* Se eqp-attachments è stata configurata per il caricamento delle sole immagini allora verifica che il file passato in
|
|
1014
|
+
* input sia effettivamente un immagine o no.
|
|
1015
|
+
* Se il controllo va a buon fine restituisce TRUE altrimenti mostra un messaggio d'errore e restituisce FALSE
|
|
1016
|
+
*/
|
|
1017
|
+
EqpAttachmentsComponent.prototype.checkAllowOnlyImageFile = function (newAttachment) {
|
|
1018
|
+
if (this.allowOnlyImages == true && newAttachment.IsImage != true) {
|
|
1019
|
+
EqpAttachmentDialogService.Error(this.noImageSelectedErrorMessage);
|
|
1020
|
+
this.abortFile();
|
|
1021
|
+
return false;
|
|
1022
|
+
}
|
|
1023
|
+
else if (!this.checkAcceptedFiles()) {
|
|
1024
|
+
EqpAttachmentDialogService.Error(this.wrongTypeSelectedErrorMessage);
|
|
1025
|
+
this.abortFile();
|
|
1026
|
+
return false;
|
|
1027
|
+
}
|
|
1028
|
+
return true;
|
|
1029
|
+
};
|
|
878
1030
|
EqpAttachmentsComponent.prototype.getImageDimensions = function (img) {
|
|
879
1031
|
var _this = this;
|
|
880
1032
|
var reader = new FileReader();
|
|
@@ -943,12 +1095,14 @@
|
|
|
943
1095
|
if (this.imageInput)
|
|
944
1096
|
this.imageInput.nativeElement.value = '';
|
|
945
1097
|
this.selectedFile = null;
|
|
1098
|
+
this.selectedFiles = null;
|
|
946
1099
|
this.showCropImage = false;
|
|
947
1100
|
this.newAttachment.IsImage = false;
|
|
948
1101
|
this.newAttachment.FileDataBase64 = null;
|
|
949
1102
|
this.newAttachment.FileName = null;
|
|
950
1103
|
this.newAttachment.FileExtension = null;
|
|
951
1104
|
this.newAttachment.FileContentType = null;
|
|
1105
|
+
this.newMultipleAttachments = new Array();
|
|
952
1106
|
this.customHeight = null;
|
|
953
1107
|
this.customWidth = null;
|
|
954
1108
|
this.originalHeight = null;
|
|
@@ -958,7 +1112,8 @@
|
|
|
958
1112
|
{ type: dialog.MatDialog },
|
|
959
1113
|
{ type: forms.FormBuilder },
|
|
960
1114
|
{ type: platformBrowser.DomSanitizer },
|
|
961
|
-
{ type: http.HttpClient }
|
|
1115
|
+
{ type: http.HttpClient },
|
|
1116
|
+
{ type: core.ChangeDetectorRef }
|
|
962
1117
|
]; };
|
|
963
1118
|
__decorate([
|
|
964
1119
|
core.Input("disableAction")
|
|
@@ -978,6 +1133,9 @@
|
|
|
978
1133
|
__decorate([
|
|
979
1134
|
core.Input("multipleAttachment")
|
|
980
1135
|
], EqpAttachmentsComponent.prototype, "multipleAttachment", void 0);
|
|
1136
|
+
__decorate([
|
|
1137
|
+
core.Input("loadMultipleFiles")
|
|
1138
|
+
], EqpAttachmentsComponent.prototype, "loadMultipleFiles", void 0);
|
|
981
1139
|
__decorate([
|
|
982
1140
|
core.Input("attachmentsColumns")
|
|
983
1141
|
], EqpAttachmentsComponent.prototype, "attachmentsColumns", void 0);
|
|
@@ -1071,6 +1229,9 @@
|
|
|
1071
1229
|
__decorate([
|
|
1072
1230
|
core.Output()
|
|
1073
1231
|
], EqpAttachmentsComponent.prototype, "localEditedAttachments", void 0);
|
|
1232
|
+
__decorate([
|
|
1233
|
+
core.Output()
|
|
1234
|
+
], EqpAttachmentsComponent.prototype, "abortAddAttachment", void 0);
|
|
1074
1235
|
__decorate([
|
|
1075
1236
|
core.Output("downloadAttachment")
|
|
1076
1237
|
], EqpAttachmentsComponent.prototype, "downloadAttachment", void 0);
|
|
@@ -1080,6 +1241,9 @@
|
|
|
1080
1241
|
__decorate([
|
|
1081
1242
|
core.ViewChild('dialogAddAttachment', { static: true })
|
|
1082
1243
|
], EqpAttachmentsComponent.prototype, "dialogAddAttachment", void 0);
|
|
1244
|
+
__decorate([
|
|
1245
|
+
core.ViewChild('dialogAddMultipleAttachment', { static: true })
|
|
1246
|
+
], EqpAttachmentsComponent.prototype, "dialogAddMultipleAttachment", void 0);
|
|
1083
1247
|
__decorate([
|
|
1084
1248
|
core.ViewChild(ngxImageCropper.ImageCropperComponent)
|
|
1085
1249
|
], EqpAttachmentsComponent.prototype, "imageCropper", void 0);
|
|
@@ -1098,7 +1262,7 @@
|
|
|
1098
1262
|
EqpAttachmentsComponent = __decorate([
|
|
1099
1263
|
core.Component({
|
|
1100
1264
|
selector: 'eqp-attachments',
|
|
1101
|
-
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\" [isMultiLanguage]=\"isEqpTableMultiLanguage\"\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>",
|
|
1265
|
+
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>",
|
|
1102
1266
|
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}"]
|
|
1103
1267
|
})
|
|
1104
1268
|
], EqpAttachmentsComponent);
|