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