@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
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { __decorate, __awaiter, __generator, __values } from 'tslib';
|
|
2
|
-
import { ɵɵdefineInjectable, Injectable, EventEmitter, Input, Output, ViewChild, Component, NgModule } from '@angular/core';
|
|
1
|
+
import { __decorate, __awaiter, __generator, __spread, __values } from 'tslib';
|
|
2
|
+
import { ɵɵdefineInjectable, Injectable, EventEmitter, ChangeDetectorRef, Input, Output, ViewChild, Component, NgModule } from '@angular/core';
|
|
3
3
|
import { Validators, FormBuilder, FormsModule, ReactiveFormsModule } from '@angular/forms';
|
|
4
4
|
import { base64ToFile, ImageCropperComponent, ImageCropperModule } from 'ngx-image-cropper';
|
|
5
5
|
import imageCompression from 'browser-image-compression';
|
|
@@ -221,11 +221,12 @@ var toBase64 = function (file) { return new Promise(function (resolve, reject) {
|
|
|
221
221
|
}); };
|
|
222
222
|
var ɵ0 = toBase64;
|
|
223
223
|
var EqpAttachmentsComponent = /** @class */ (function () {
|
|
224
|
-
function EqpAttachmentsComponent(dialog, formBuilder, sanitizer, http) {
|
|
224
|
+
function EqpAttachmentsComponent(dialog, formBuilder, sanitizer, http, cd) {
|
|
225
225
|
this.dialog = dialog;
|
|
226
226
|
this.formBuilder = formBuilder;
|
|
227
227
|
this.sanitizer = sanitizer;
|
|
228
228
|
this.http = http;
|
|
229
|
+
this.cd = cd;
|
|
229
230
|
//#region @Input del componente
|
|
230
231
|
/**
|
|
231
232
|
* Se TRUE allora nasconde la colonna per le azioni sull'allegato (nel caso "multipleAttachment" è TRUE).
|
|
@@ -252,6 +253,11 @@ var EqpAttachmentsComponent = /** @class */ (function () {
|
|
|
252
253
|
* Se TRUE allora il componente mostra l'elenco di tutti gli allegati ricevuto nel parametro "attachmentsList".
|
|
253
254
|
*/
|
|
254
255
|
this.multipleAttachment = true;
|
|
256
|
+
/**
|
|
257
|
+
* Se assume il valore TRUE allora sarà possibile caricare più file per volta. Questa funzionalità è attiva
|
|
258
|
+
* SOLO se si gestiscono allegati multipli, quindi se l'input 'multipleAttachment' assume il valore TRUE, altrimenti è sempre disabilitata.
|
|
259
|
+
*/
|
|
260
|
+
this.loadMultipleFiles = false;
|
|
255
261
|
/**
|
|
256
262
|
* Configurazione delle colonne della eqp-table per la visualizzazione degli allegati (caso "multipleAttachment" è TRUE).
|
|
257
263
|
*/
|
|
@@ -328,6 +334,10 @@ var EqpAttachmentsComponent = /** @class */ (function () {
|
|
|
328
334
|
* Restituisce la lista aggiornata degli allegati.
|
|
329
335
|
*/
|
|
330
336
|
this.localEditedAttachments = new EventEmitter();
|
|
337
|
+
/**
|
|
338
|
+
* Evento scatenato alla pressione del pulsante ESCI della modale di caricamento file.
|
|
339
|
+
*/
|
|
340
|
+
this.abortAddAttachment = new EventEmitter();
|
|
331
341
|
/**
|
|
332
342
|
* Evento di output che restituisce l'IAttachmentDTO selezionato per il download nel caso FileDataBase64, FileContentType o FileName non fossero specificati.
|
|
333
343
|
*/
|
|
@@ -339,8 +349,10 @@ var EqpAttachmentsComponent = /** @class */ (function () {
|
|
|
339
349
|
//#endregion
|
|
340
350
|
//#region Proprietà per gestione caricamento nuovo allegato
|
|
341
351
|
this.newAttachment = {};
|
|
352
|
+
this.newMultipleAttachments = [];
|
|
342
353
|
this.attachmentType = AttachmentType;
|
|
343
354
|
this.selectedFile = null;
|
|
355
|
+
this.selectedFiles = null;
|
|
344
356
|
this.showCropImage = false;
|
|
345
357
|
//#endregion
|
|
346
358
|
//#region Proprietà per gestione ridimensionamento file di tipo image
|
|
@@ -371,8 +383,6 @@ var EqpAttachmentsComponent = /** @class */ (function () {
|
|
|
371
383
|
if (this.attachmentsList == null)
|
|
372
384
|
this.attachmentsList = new Array();
|
|
373
385
|
this.checkAttachmentImage();
|
|
374
|
-
// if (!this.compressionOptions || !this.compressionOptions.maxSizeMB || !this.compressionOptions.maxWidthOrHeight)
|
|
375
|
-
// this.compressionOptions = { maxSizeMB: 0.5, maxWidthOrHeight: 1920, useWebWorker: true };
|
|
376
386
|
};
|
|
377
387
|
EqpAttachmentsComponent.prototype.reloadData = function () {
|
|
378
388
|
if (this.attachmentTable)
|
|
@@ -485,9 +495,25 @@ var EqpAttachmentsComponent = /** @class */ (function () {
|
|
|
485
495
|
* Apre la modale per la definizione dei parametri del nuovo file
|
|
486
496
|
*/
|
|
487
497
|
EqpAttachmentsComponent.prototype.openModalAddAttachment = function (attachmentType) {
|
|
498
|
+
//Se è stato richiesto il caricamento di un LINK o è impostato il caricamento di FILE SINGOLO allora apre la modale per
|
|
499
|
+
//il caricamento singolo del file altrimenti apre quella per il caricamento multiplo
|
|
500
|
+
// if (attachmentType == AttachmentType.LINK || (attachmentType == AttachmentType.FILE && this.loadMultipleFiles != true)) {
|
|
488
501
|
this.newAttachment = {};
|
|
489
502
|
this.newAttachment.IsImage = false;
|
|
490
503
|
this.newAttachment.AttachmentType = attachmentType;
|
|
504
|
+
this.newMultipleAttachments = new Array();
|
|
505
|
+
if (attachmentType == AttachmentType.LINK)
|
|
506
|
+
this.newMultipleAttachments.push(this.newAttachment);
|
|
507
|
+
this.createAttachmentForm();
|
|
508
|
+
//Apre la modale
|
|
509
|
+
this.dialofRefAddAttachment = this.dialog.open(this.dialogAddAttachment, {
|
|
510
|
+
disableClose: true,
|
|
511
|
+
hasBackdrop: true,
|
|
512
|
+
width: '60%',
|
|
513
|
+
maxHeight: '80%'
|
|
514
|
+
});
|
|
515
|
+
};
|
|
516
|
+
EqpAttachmentsComponent.prototype.createAttachmentForm = function () {
|
|
491
517
|
//Crea la form per la validazione dei campi
|
|
492
518
|
this.newAttachmentForm = this.formBuilder.group({
|
|
493
519
|
type: [this.newAttachment.AttachmentType, Validators.required],
|
|
@@ -496,19 +522,17 @@ var EqpAttachmentsComponent = /** @class */ (function () {
|
|
|
496
522
|
customHeight: [this.customHeight],
|
|
497
523
|
customWidth: [this.customWidth]
|
|
498
524
|
});
|
|
499
|
-
//Apre la modale
|
|
500
|
-
this.dialofRefAddAttachment = this.dialog.open(this.dialogAddAttachment, {
|
|
501
|
-
disableClose: true,
|
|
502
|
-
hasBackdrop: true,
|
|
503
|
-
width: '60%',
|
|
504
|
-
maxHeight: '80%'
|
|
505
|
-
});
|
|
506
525
|
};
|
|
507
|
-
EqpAttachmentsComponent.prototype.close = function () {
|
|
526
|
+
EqpAttachmentsComponent.prototype.close = function (emitCloseEvent) {
|
|
527
|
+
if (emitCloseEvent === void 0) { emitCloseEvent = true; }
|
|
508
528
|
this.newAttachment = {};
|
|
529
|
+
this.newMultipleAttachments = new Array();
|
|
509
530
|
this.abortFile();
|
|
510
|
-
this.newAttachmentForm
|
|
531
|
+
if (this.newAttachmentForm)
|
|
532
|
+
this.newAttachmentForm.reset();
|
|
511
533
|
this.dialofRefAddAttachment.close();
|
|
534
|
+
if (emitCloseEvent == true && this.abortAddAttachment)
|
|
535
|
+
this.abortAddAttachment.emit();
|
|
512
536
|
};
|
|
513
537
|
/**
|
|
514
538
|
* In base al tipo di allegato controlla se disabilitare o meno il pulsante per salvare.
|
|
@@ -516,23 +540,37 @@ var EqpAttachmentsComponent = /** @class */ (function () {
|
|
|
516
540
|
* @returns
|
|
517
541
|
*/
|
|
518
542
|
EqpAttachmentsComponent.prototype.disableSave = function () {
|
|
519
|
-
if (this.
|
|
520
|
-
|
|
543
|
+
if (this.loadMultipleFiles != true) {
|
|
544
|
+
if (this.newAttachment.AttachmentType == AttachmentType.FILE) {
|
|
545
|
+
return !this.newAttachment.FileDataBase64;
|
|
546
|
+
}
|
|
547
|
+
else {
|
|
548
|
+
return !this.newAttachment.FilePath;
|
|
549
|
+
}
|
|
521
550
|
}
|
|
522
551
|
else {
|
|
523
|
-
return
|
|
552
|
+
return this.newMultipleAttachments.filter(function (p) { return (p.AttachmentType == AttachmentType.FILE && !p.FileDataBase64) || (p.AttachmentType == AttachmentType.LINK && !p.FilePath); }).length > 0;
|
|
524
553
|
}
|
|
525
554
|
};
|
|
526
555
|
EqpAttachmentsComponent.prototype.confirmAddAttachment = function () {
|
|
527
|
-
if (this.
|
|
528
|
-
this.newAttachment.
|
|
529
|
-
|
|
530
|
-
this.attachmentsList
|
|
531
|
-
|
|
556
|
+
if (this.loadMultipleFiles != true) {
|
|
557
|
+
if (this.newAttachment.AttachmentType == AttachmentType.LINK && !this.newAttachment.FileName)
|
|
558
|
+
this.newAttachment.FileName = this.newAttachment.FilePath;
|
|
559
|
+
if (this.attachmentsList == null)
|
|
560
|
+
this.attachmentsList = new Array();
|
|
561
|
+
this.attachmentsList.push(this.newAttachment);
|
|
562
|
+
}
|
|
563
|
+
else {
|
|
564
|
+
if (this.newMultipleAttachments == null || this.newMultipleAttachments.length == 0)
|
|
565
|
+
return;
|
|
566
|
+
if (this.attachmentsList == null)
|
|
567
|
+
this.attachmentsList = new Array();
|
|
568
|
+
this.attachmentsList = this.attachmentsList.concat(this.newMultipleAttachments);
|
|
569
|
+
}
|
|
532
570
|
if (this.attachmentTable)
|
|
533
571
|
this.attachmentTable.reloadDatatable();
|
|
534
572
|
this.localEditedAttachments.emit(this.attachmentsList);
|
|
535
|
-
this.
|
|
573
|
+
this.close(false);
|
|
536
574
|
};
|
|
537
575
|
/**
|
|
538
576
|
* Apre il dialog per l'anteprima dell'allegato selezionato.
|
|
@@ -602,36 +640,39 @@ var EqpAttachmentsComponent = /** @class */ (function () {
|
|
|
602
640
|
};
|
|
603
641
|
//#region Gestione caricamento file
|
|
604
642
|
/**
|
|
605
|
-
*
|
|
606
|
-
*
|
|
643
|
+
* Evento scatenato alla selezione del file (o dei file).
|
|
644
|
+
* 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
|
|
645
|
+
* mostrare le funzionalità del croppie (per ritagliare l'immagine) oppure no.
|
|
646
|
+
* Se il file caricato non è un immagine allora genera direttamente il base64 e lo associa all'allegato da salvare.
|
|
647
|
+
* Se invece il caricamento dei file è MULTIPLO e sono presenti più file allora esegue le stesse operazioni ignorando però il contrllo
|
|
648
|
+
* immagine per il croppie (in caso di caricamento multiplo le funzionalità del croppie sono disabilitate).
|
|
607
649
|
*/
|
|
608
650
|
EqpAttachmentsComponent.prototype.onFileInputChange = function (event) {
|
|
609
651
|
return __awaiter(this, void 0, void 0, function () {
|
|
610
|
-
var
|
|
611
|
-
return __generator(this, function (
|
|
612
|
-
switch (
|
|
652
|
+
var _a, checkOnlyImage, base64Result, i, newAttachment, checkOnlyImage;
|
|
653
|
+
return __generator(this, function (_b) {
|
|
654
|
+
switch (_b.label) {
|
|
613
655
|
case 0:
|
|
614
656
|
this.showCropImage = false;
|
|
657
|
+
if (!(__spread(event.target.files).length == 1 || this.loadMultipleFiles != true)) return [3 /*break*/, 5];
|
|
615
658
|
this.selectedFile = event.target.files[0];
|
|
659
|
+
this.selectedFiles = event.target.files;
|
|
616
660
|
if (!this.selectedFile)
|
|
617
661
|
return [2 /*return*/];
|
|
618
662
|
//Memorizza i dati per l'allegato
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
}
|
|
629
|
-
else if (!this.checkAcceptedFiles()) {
|
|
630
|
-
EqpAttachmentDialogService.Error(this.wrongTypeSelectedErrorMessage);
|
|
631
|
-
this.abortFile();
|
|
663
|
+
_a = this;
|
|
664
|
+
return [4 /*yield*/, this.createAttachmentFromUploadedFile(this.selectedFile, false)];
|
|
665
|
+
case 1:
|
|
666
|
+
//Memorizza i dati per l'allegato
|
|
667
|
+
_a.newAttachment = _b.sent();
|
|
668
|
+
this.newMultipleAttachments = new Array();
|
|
669
|
+
this.newMultipleAttachments.push(this.newAttachment);
|
|
670
|
+
checkOnlyImage = this.checkAllowOnlyImageFile(this.newAttachment);
|
|
671
|
+
if (checkOnlyImage == false)
|
|
632
672
|
return [2 /*return*/];
|
|
633
|
-
|
|
634
|
-
|
|
673
|
+
if (this.loadMultipleFiles == true && __spread(event.target.files).length == 1)
|
|
674
|
+
this.createAttachmentForm();
|
|
675
|
+
if (!(this.newAttachment.IsImage == true)) return [3 /*break*/, 2];
|
|
635
676
|
this.getImageDimensions(event.target.files[0]);
|
|
636
677
|
//Mostra il croppie e disabilita la form finchè non termina la modifica dell'immagine
|
|
637
678
|
this.newAttachmentForm.disable();
|
|
@@ -639,23 +680,103 @@ var EqpAttachmentsComponent = /** @class */ (function () {
|
|
|
639
680
|
this.newAttachmentForm.controls["customHeight"].enable();
|
|
640
681
|
this.showCropImage = true;
|
|
641
682
|
this.imageChangedEvent = event;
|
|
642
|
-
return [3 /*break*/,
|
|
643
|
-
case 1:
|
|
644
|
-
this.showCropImage = false;
|
|
645
|
-
return [4 /*yield*/, toBase64(this.selectedFile)];
|
|
683
|
+
return [3 /*break*/, 4];
|
|
646
684
|
case 2:
|
|
685
|
+
this.showCropImage = false;
|
|
686
|
+
return [4 /*yield*/, this.getBase64FromFile(this.selectedFile)];
|
|
687
|
+
case 3:
|
|
688
|
+
base64Result = _b.sent();
|
|
689
|
+
this.newAttachment.FileDataBase64 = base64Result.Base64File;
|
|
690
|
+
this.newAttachment.FileContentType = base64Result.ContentType;
|
|
691
|
+
_b.label = 4;
|
|
692
|
+
case 4: return [3 /*break*/, 9];
|
|
693
|
+
case 5:
|
|
694
|
+
this.selectedFiles = event.target.files;
|
|
695
|
+
if (!this.selectedFiles || this.selectedFiles.length == 0)
|
|
696
|
+
return [2 /*return*/];
|
|
697
|
+
this.newMultipleAttachments = new Array();
|
|
698
|
+
i = 0;
|
|
699
|
+
_b.label = 6;
|
|
700
|
+
case 6:
|
|
701
|
+
if (!(i < this.selectedFiles.length)) return [3 /*break*/, 9];
|
|
702
|
+
return [4 /*yield*/, this.createAttachmentFromUploadedFile(this.selectedFiles[i], true)];
|
|
703
|
+
case 7:
|
|
704
|
+
newAttachment = _b.sent();
|
|
705
|
+
checkOnlyImage = this.checkAllowOnlyImageFile(newAttachment);
|
|
706
|
+
if (checkOnlyImage == false)
|
|
707
|
+
return [2 /*return*/];
|
|
708
|
+
this.newMultipleAttachments.push(newAttachment);
|
|
709
|
+
_b.label = 8;
|
|
710
|
+
case 8:
|
|
711
|
+
i++;
|
|
712
|
+
return [3 /*break*/, 6];
|
|
713
|
+
case 9: return [2 /*return*/];
|
|
714
|
+
}
|
|
715
|
+
});
|
|
716
|
+
});
|
|
717
|
+
};
|
|
718
|
+
/**
|
|
719
|
+
* A partire dal FILE ricevuto in input ricostruisce l'oggetto IAttachmentDTO e lo restituisce.
|
|
720
|
+
* Se il parametro getBase64 viene passato a TRUE allora, sempre a partire dal file,genera il base64 e
|
|
721
|
+
* ricava il ContentType da associare all'oggetto IAttachmentDTO da restituire
|
|
722
|
+
* @param currentFile Oggetto FILE da processare
|
|
723
|
+
* @param getBase64 Se TRUE allora calcola base64 e ContentType del file passato in input
|
|
724
|
+
* @returns Restituisce un oggetto di tipo IAttachmentDTO
|
|
725
|
+
*/
|
|
726
|
+
EqpAttachmentsComponent.prototype.createAttachmentFromUploadedFile = function (currentFile, getBase64) {
|
|
727
|
+
if (getBase64 === void 0) { getBase64 = true; }
|
|
728
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
729
|
+
var newAttachment, base64Result;
|
|
730
|
+
return __generator(this, function (_a) {
|
|
731
|
+
switch (_a.label) {
|
|
732
|
+
case 0:
|
|
733
|
+
newAttachment = {};
|
|
734
|
+
//Memorizza i dati per l'allegato
|
|
735
|
+
newAttachment.AttachmentType = AttachmentType.FILE;
|
|
736
|
+
newAttachment.FileContentType = currentFile.type;
|
|
737
|
+
newAttachment.FileName = currentFile.name;
|
|
738
|
+
newAttachment.FileExtension = currentFile.name.substr(currentFile.name.lastIndexOf('.') + 1);
|
|
739
|
+
newAttachment.IsImage = AttachmentHelperService.checkImageFromMimeType(currentFile.type);
|
|
740
|
+
if (!(getBase64 == true)) return [3 /*break*/, 2];
|
|
741
|
+
return [4 /*yield*/, this.getBase64FromFile(currentFile)];
|
|
742
|
+
case 1:
|
|
743
|
+
base64Result = _a.sent();
|
|
744
|
+
newAttachment.FileDataBase64 = base64Result.Base64File;
|
|
745
|
+
newAttachment.FileContentType = base64Result.ContentType;
|
|
746
|
+
_a.label = 2;
|
|
747
|
+
case 2: return [2 /*return*/, newAttachment];
|
|
748
|
+
}
|
|
749
|
+
});
|
|
750
|
+
});
|
|
751
|
+
};
|
|
752
|
+
/**
|
|
753
|
+
* A partire dal file passato in input restituisce un oggetto
|
|
754
|
+
* contenente il base64 del file e il suo contentType
|
|
755
|
+
* @param currentFile Oggetto File da cui estrapolare base64 e contentType
|
|
756
|
+
* @returns Restituisce un oggetto avente le proprietà Base64File e ContentType
|
|
757
|
+
*/
|
|
758
|
+
EqpAttachmentsComponent.prototype.getBase64FromFile = function (currentFile) {
|
|
759
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
760
|
+
var base64File, contentType, result;
|
|
761
|
+
return __generator(this, function (_a) {
|
|
762
|
+
switch (_a.label) {
|
|
763
|
+
case 0: return [4 /*yield*/, toBase64(currentFile)];
|
|
764
|
+
case 1:
|
|
647
765
|
base64File = _a.sent();
|
|
766
|
+
contentType = null;
|
|
648
767
|
if (base64File) {
|
|
649
768
|
// Loris 20/01/2022: PROBLEMA - Quando eseguo l'upload di un file .sql non viene salvato/scaricato correttamente.
|
|
650
769
|
// Questo succede perchè non viene popolato il FileContentType. Per risolvere il problema
|
|
651
770
|
// faccio un controllo e se non esiste il FileContentType allora lo recupero dal base64 ottenuto.
|
|
652
|
-
|
|
771
|
+
contentType = base64File.split(",")[0].split(":")[1].split(";")[0];
|
|
653
772
|
// Un altro metodo per leggere il ccontent type del file è tramite una regular expression:
|
|
654
|
-
|
|
655
|
-
this.newAttachment.FileDataBase64 = base64File.split(",")[1];
|
|
773
|
+
base64File = base64File.split(",")[1];
|
|
656
774
|
}
|
|
657
|
-
|
|
658
|
-
|
|
775
|
+
result = {
|
|
776
|
+
Base64File: base64File,
|
|
777
|
+
ContentType: contentType
|
|
778
|
+
};
|
|
779
|
+
return [2 /*return*/, result];
|
|
659
780
|
}
|
|
660
781
|
});
|
|
661
782
|
});
|
|
@@ -666,12 +787,25 @@ var EqpAttachmentsComponent = /** @class */ (function () {
|
|
|
666
787
|
*/
|
|
667
788
|
EqpAttachmentsComponent.prototype.checkAcceptedFiles = function () {
|
|
668
789
|
var e_1, _a;
|
|
669
|
-
|
|
790
|
+
var _this = this;
|
|
791
|
+
if ((this.loadMultipleFiles != true && this.selectedFile.type.startsWith("video"))
|
|
792
|
+
|| (this.loadMultipleFiles == true && __spread(this.selectedFiles).filter(function (p) { return p.type.startsWith("video"); }).length > 0))
|
|
670
793
|
return false;
|
|
671
794
|
if (this.acceptedFileTypes == "*")
|
|
672
795
|
return true;
|
|
673
|
-
|
|
674
|
-
|
|
796
|
+
//Verifica che i tipi del file (o dei file) caricati siano coerenti con quelli accettati dalla direttiva
|
|
797
|
+
var accepted = true;
|
|
798
|
+
if (this.loadMultipleFiles != true)
|
|
799
|
+
accepted = this.acceptedFileTypes.includes(this.selectedFile.type);
|
|
800
|
+
else {
|
|
801
|
+
var uploadedFileTypes = __spread(this.selectedFiles).map(function (p) { return p.type; });
|
|
802
|
+
uploadedFileTypes.forEach(function (type) {
|
|
803
|
+
if (!_this.acceptedFileTypes.includes(type))
|
|
804
|
+
accepted = false;
|
|
805
|
+
});
|
|
806
|
+
}
|
|
807
|
+
//Questo controllo permette di gestire le casistiche per cui vengono indicati come tipi validi, ad esempio, 'image/*'
|
|
808
|
+
if (!accepted && this.loadMultipleFiles != true) {
|
|
675
809
|
try {
|
|
676
810
|
for (var _b = __values(this.acceptedFileTypes.split(",").filter(function (t) { return t.includes("*"); })), _c = _b.next(); !_c.done; _c = _b.next()) {
|
|
677
811
|
var t = _c.value;
|
|
@@ -690,6 +824,24 @@ var EqpAttachmentsComponent = /** @class */ (function () {
|
|
|
690
824
|
}
|
|
691
825
|
return accepted;
|
|
692
826
|
};
|
|
827
|
+
/**
|
|
828
|
+
* Se eqp-attachments è stata configurata per il caricamento delle sole immagini allora verifica che il file passato in
|
|
829
|
+
* input sia effettivamente un immagine o no.
|
|
830
|
+
* Se il controllo va a buon fine restituisce TRUE altrimenti mostra un messaggio d'errore e restituisce FALSE
|
|
831
|
+
*/
|
|
832
|
+
EqpAttachmentsComponent.prototype.checkAllowOnlyImageFile = function (newAttachment) {
|
|
833
|
+
if (this.allowOnlyImages == true && newAttachment.IsImage != true) {
|
|
834
|
+
EqpAttachmentDialogService.Error(this.noImageSelectedErrorMessage);
|
|
835
|
+
this.abortFile();
|
|
836
|
+
return false;
|
|
837
|
+
}
|
|
838
|
+
else if (!this.checkAcceptedFiles()) {
|
|
839
|
+
EqpAttachmentDialogService.Error(this.wrongTypeSelectedErrorMessage);
|
|
840
|
+
this.abortFile();
|
|
841
|
+
return false;
|
|
842
|
+
}
|
|
843
|
+
return true;
|
|
844
|
+
};
|
|
693
845
|
EqpAttachmentsComponent.prototype.getImageDimensions = function (img) {
|
|
694
846
|
var _this = this;
|
|
695
847
|
var reader = new FileReader();
|
|
@@ -758,12 +910,14 @@ var EqpAttachmentsComponent = /** @class */ (function () {
|
|
|
758
910
|
if (this.imageInput)
|
|
759
911
|
this.imageInput.nativeElement.value = '';
|
|
760
912
|
this.selectedFile = null;
|
|
913
|
+
this.selectedFiles = null;
|
|
761
914
|
this.showCropImage = false;
|
|
762
915
|
this.newAttachment.IsImage = false;
|
|
763
916
|
this.newAttachment.FileDataBase64 = null;
|
|
764
917
|
this.newAttachment.FileName = null;
|
|
765
918
|
this.newAttachment.FileExtension = null;
|
|
766
919
|
this.newAttachment.FileContentType = null;
|
|
920
|
+
this.newMultipleAttachments = new Array();
|
|
767
921
|
this.customHeight = null;
|
|
768
922
|
this.customWidth = null;
|
|
769
923
|
this.originalHeight = null;
|
|
@@ -773,7 +927,8 @@ var EqpAttachmentsComponent = /** @class */ (function () {
|
|
|
773
927
|
{ type: MatDialog },
|
|
774
928
|
{ type: FormBuilder },
|
|
775
929
|
{ type: DomSanitizer },
|
|
776
|
-
{ type: HttpClient }
|
|
930
|
+
{ type: HttpClient },
|
|
931
|
+
{ type: ChangeDetectorRef }
|
|
777
932
|
]; };
|
|
778
933
|
__decorate([
|
|
779
934
|
Input("disableAction")
|
|
@@ -793,6 +948,9 @@ var EqpAttachmentsComponent = /** @class */ (function () {
|
|
|
793
948
|
__decorate([
|
|
794
949
|
Input("multipleAttachment")
|
|
795
950
|
], EqpAttachmentsComponent.prototype, "multipleAttachment", void 0);
|
|
951
|
+
__decorate([
|
|
952
|
+
Input("loadMultipleFiles")
|
|
953
|
+
], EqpAttachmentsComponent.prototype, "loadMultipleFiles", void 0);
|
|
796
954
|
__decorate([
|
|
797
955
|
Input("attachmentsColumns")
|
|
798
956
|
], EqpAttachmentsComponent.prototype, "attachmentsColumns", void 0);
|
|
@@ -886,6 +1044,9 @@ var EqpAttachmentsComponent = /** @class */ (function () {
|
|
|
886
1044
|
__decorate([
|
|
887
1045
|
Output()
|
|
888
1046
|
], EqpAttachmentsComponent.prototype, "localEditedAttachments", void 0);
|
|
1047
|
+
__decorate([
|
|
1048
|
+
Output()
|
|
1049
|
+
], EqpAttachmentsComponent.prototype, "abortAddAttachment", void 0);
|
|
889
1050
|
__decorate([
|
|
890
1051
|
Output("downloadAttachment")
|
|
891
1052
|
], EqpAttachmentsComponent.prototype, "downloadAttachment", void 0);
|
|
@@ -895,6 +1056,9 @@ var EqpAttachmentsComponent = /** @class */ (function () {
|
|
|
895
1056
|
__decorate([
|
|
896
1057
|
ViewChild('dialogAddAttachment', { static: true })
|
|
897
1058
|
], EqpAttachmentsComponent.prototype, "dialogAddAttachment", void 0);
|
|
1059
|
+
__decorate([
|
|
1060
|
+
ViewChild('dialogAddMultipleAttachment', { static: true })
|
|
1061
|
+
], EqpAttachmentsComponent.prototype, "dialogAddMultipleAttachment", void 0);
|
|
898
1062
|
__decorate([
|
|
899
1063
|
ViewChild(ImageCropperComponent)
|
|
900
1064
|
], EqpAttachmentsComponent.prototype, "imageCropper", void 0);
|
|
@@ -913,7 +1077,7 @@ var EqpAttachmentsComponent = /** @class */ (function () {
|
|
|
913
1077
|
EqpAttachmentsComponent = __decorate([
|
|
914
1078
|
Component({
|
|
915
1079
|
selector: 'eqp-attachments',
|
|
916
|
-
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>",
|
|
1080
|
+
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>",
|
|
917
1081
|
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}"]
|
|
918
1082
|
})
|
|
919
1083
|
], EqpAttachmentsComponent);
|