@dataclouder/ngx-cloud-storage 0.0.28 → 0.0.30
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.
|
@@ -6,20 +6,22 @@ import { FormsModule } from '@angular/forms';
|
|
|
6
6
|
import { AngularFireStorage } from '@angular/fire/compat/storage';
|
|
7
7
|
import { getStorage, ref, listAll, deleteObject, getDownloadURL, Storage } from '@angular/fire/storage';
|
|
8
8
|
import { lastValueFrom, BehaviorSubject } from 'rxjs';
|
|
9
|
-
import * as
|
|
9
|
+
import * as i5$1 from 'primeng/dialog';
|
|
10
10
|
import { DialogModule } from 'primeng/dialog';
|
|
11
|
-
import * as
|
|
11
|
+
import * as i4 from 'primeng/tooltip';
|
|
12
12
|
import { TooltipModule } from 'primeng/tooltip';
|
|
13
13
|
import * as i2 from 'primeng/button';
|
|
14
14
|
import { ButtonModule } from 'primeng/button';
|
|
15
|
-
import * as
|
|
15
|
+
import * as i5 from 'primeng/message';
|
|
16
16
|
import { MessageModule } from 'primeng/message';
|
|
17
|
-
import * as
|
|
17
|
+
import * as i6 from 'primeng/select';
|
|
18
18
|
import { SelectModule } from 'primeng/select';
|
|
19
|
-
import * as
|
|
19
|
+
import * as i7 from 'primeng/inputtext';
|
|
20
20
|
import { InputTextModule } from 'primeng/inputtext';
|
|
21
21
|
import { MoodStateOptions, CharacterEventActions } from '@dataclouder/ngx-core';
|
|
22
|
+
import { FieldsetModule } from 'primeng/fieldset';
|
|
22
23
|
import * as i1$1 from '@angular/platform-browser';
|
|
24
|
+
import { DynamicDialogRef, DynamicDialogConfig, DialogService, DynamicDialogModule } from 'primeng/dynamicdialog';
|
|
23
25
|
import * as i3 from 'primeng/api';
|
|
24
26
|
import { AsyncPipe, CommonModule } from '@angular/common';
|
|
25
27
|
import * as i3$1 from 'primeng/tag';
|
|
@@ -203,26 +205,24 @@ const AspectRatioOptions = [
|
|
|
203
205
|
},
|
|
204
206
|
},
|
|
205
207
|
];
|
|
208
|
+
const AllAspectRatioOptions = [...AspectRatioOptions];
|
|
206
209
|
var AspectType;
|
|
207
210
|
(function (AspectType) {
|
|
208
211
|
AspectType["Square"] = "square";
|
|
209
212
|
AspectType["Rectangle"] = "rectangle";
|
|
210
213
|
AspectType["Banner"] = "banner";
|
|
211
214
|
AspectType["RectangleLarge"] = "rectangleLarge";
|
|
212
|
-
AspectType["
|
|
213
|
-
AspectType["
|
|
214
|
-
AspectType["
|
|
215
|
+
AspectType["vertical_1_2"] = "vertical_1_2";
|
|
216
|
+
AspectType["vertical_9_16"] = "vertical_9_16";
|
|
217
|
+
AspectType["vertical_2_3"] = "vertical_2_3";
|
|
218
|
+
AspectType["vertical_3_4"] = "vertical_3_4";
|
|
219
|
+
AspectType["vertical_4_5"] = "vertical_4_5";
|
|
220
|
+
AspectType["horizontal_2_1"] = "horizontal_2_1";
|
|
221
|
+
AspectType["horizontal_16_9"] = "horizontal_16_9";
|
|
222
|
+
AspectType["horizontal_3_2"] = "horizontal_3_2";
|
|
223
|
+
AspectType["horizontal_4_3"] = "horizontal_4_3";
|
|
224
|
+
AspectType["horizontal_5_4"] = "horizontal_5_4";
|
|
215
225
|
})(AspectType || (AspectType = {}));
|
|
216
|
-
// Creo que seria bueno refactorizar para solo enviar aspect ratio asi
|
|
217
|
-
var AspectRatio2;
|
|
218
|
-
(function (AspectRatio2) {
|
|
219
|
-
// Vertical
|
|
220
|
-
AspectRatio2[AspectRatio2["9:16"] = 1.7777777777777777] = "9:16";
|
|
221
|
-
AspectRatio2[AspectRatio2["3:5"] = 0.6] = "3:5";
|
|
222
|
-
AspectRatio2[AspectRatio2["5:8"] = 0.625] = "5:8";
|
|
223
|
-
AspectRatio2[AspectRatio2["2:3"] = 0.6666666666666666] = "2:3";
|
|
224
|
-
AspectRatio2[AspectRatio2["1:1"] = 1] = "1:1";
|
|
225
|
-
})(AspectRatio2 || (AspectRatio2 = {}));
|
|
226
226
|
var ResolutionType;
|
|
227
227
|
(function (ResolutionType) {
|
|
228
228
|
ResolutionType[ResolutionType["Small"] = 200] = "Small";
|
|
@@ -234,11 +234,18 @@ var ResolutionType;
|
|
|
234
234
|
const AspectRatio = {
|
|
235
235
|
[AspectType.Square]: 1 / 1,
|
|
236
236
|
[AspectType.Rectangle]: 16 / 9,
|
|
237
|
-
[AspectType.
|
|
237
|
+
[AspectType.vertical_9_16]: 9 / 16,
|
|
238
238
|
[AspectType.RectangleLarge]: 16 / 8,
|
|
239
239
|
[AspectType.Banner]: 16 / 7,
|
|
240
|
-
[AspectType.
|
|
241
|
-
[AspectType.
|
|
240
|
+
[AspectType.vertical_1_2]: 1 / 2,
|
|
241
|
+
[AspectType.vertical_2_3]: 2 / 3,
|
|
242
|
+
[AspectType.vertical_3_4]: 3 / 4,
|
|
243
|
+
[AspectType.vertical_4_5]: 4 / 5,
|
|
244
|
+
[AspectType.horizontal_2_1]: 2 / 1,
|
|
245
|
+
[AspectType.horizontal_16_9]: 16 / 9,
|
|
246
|
+
[AspectType.horizontal_3_2]: 3 / 2,
|
|
247
|
+
[AspectType.horizontal_4_3]: 4 / 3,
|
|
248
|
+
[AspectType.horizontal_5_4]: 5 / 4,
|
|
242
249
|
};
|
|
243
250
|
const DEFAULT_SETTINGS = {
|
|
244
251
|
path: '/default-collection/id/please-change-this-subcollection',
|
|
@@ -476,6 +483,9 @@ class CropperComponentModal {
|
|
|
476
483
|
constructor() {
|
|
477
484
|
this.multiImagesStorageService = inject(MultiImagesStorageService);
|
|
478
485
|
this.changeDetectorRef = inject(ChangeDetectorRef);
|
|
486
|
+
this.ref = inject(DynamicDialogRef, { optional: true });
|
|
487
|
+
this.config = inject(DynamicDialogConfig, { optional: true });
|
|
488
|
+
this.dialogService = inject(DialogService);
|
|
479
489
|
// overrides name, path and resizeToWidth
|
|
480
490
|
this.imgStorageSettings = input(DEFAULT_SETTINGS, ...(ngDevMode ? [{ debugName: "imgStorageSettings" }] : []));
|
|
481
491
|
this.buttonLabel = input('Seleccionar archivo', ...(ngDevMode ? [{ debugName: "buttonLabel" }] : []));
|
|
@@ -486,7 +496,6 @@ class CropperComponentModal {
|
|
|
486
496
|
this.aspectRatioOptions = AspectRatioOptions;
|
|
487
497
|
this.MoodStateOptions = MoodStateOptions;
|
|
488
498
|
this.fileMetadata = null;
|
|
489
|
-
this.displayDialog = false;
|
|
490
499
|
this.aspectRatioValue = 1;
|
|
491
500
|
this.croppedImage = '';
|
|
492
501
|
this.renameFile = '';
|
|
@@ -501,6 +510,12 @@ class CropperComponentModal {
|
|
|
501
510
|
if (!this.imgStorageSettings().path) {
|
|
502
511
|
console.warn('⚠️ Remember to set imgStorageSettings, path and fileName are required , path example: /collection/id/subcollection ');
|
|
503
512
|
}
|
|
513
|
+
// This happens when the component is opened as a dialog
|
|
514
|
+
if (this.config?.data) {
|
|
515
|
+
this.imageChangedEvent = this.config.data.imageChangedEvent;
|
|
516
|
+
this.fileMetadata = this.config.data.file;
|
|
517
|
+
}
|
|
518
|
+
this.setSettingsForComponent();
|
|
504
519
|
this.reloadPath();
|
|
505
520
|
}
|
|
506
521
|
reloadPath() {
|
|
@@ -509,48 +524,60 @@ class CropperComponentModal {
|
|
|
509
524
|
this.storagePath = `${this.imgStorageSettings().path}/${fileName}-${randomCharacters}.webp`;
|
|
510
525
|
}
|
|
511
526
|
setSettingsForComponent() {
|
|
512
|
-
const
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
this.resizeToWidth = imgStorageSettings.cropSettings.resizeToWidth;
|
|
527
|
+
const settings = this.imgStorageSettings();
|
|
528
|
+
if (!settings)
|
|
529
|
+
return;
|
|
530
|
+
const { cropSettings, path, fileName } = settings;
|
|
531
|
+
if (cropSettings) {
|
|
532
|
+
const { aspectRatio, resizeToWidth } = cropSettings;
|
|
533
|
+
if (aspectRatio) {
|
|
534
|
+
this.aspectRatioValue = AspectRatio[aspectRatio];
|
|
535
|
+
const defaultRatio = this.aspectRatioOptions.find((option) => option.valueRatio === this.aspectRatioValue);
|
|
536
|
+
if (defaultRatio) {
|
|
537
|
+
this.ratioSelected = defaultRatio;
|
|
538
|
+
}
|
|
539
|
+
}
|
|
540
|
+
if (resizeToWidth) {
|
|
541
|
+
this.resizeToWidth = resizeToWidth;
|
|
542
|
+
}
|
|
529
543
|
}
|
|
530
|
-
if (
|
|
531
|
-
this.
|
|
544
|
+
if (path && fileName) {
|
|
545
|
+
this.storagePath = `${path}/${fileName}.webp`;
|
|
532
546
|
}
|
|
533
|
-
|
|
534
|
-
this.renameFile =
|
|
547
|
+
if (fileName) {
|
|
548
|
+
this.renameFile = fileName;
|
|
535
549
|
}
|
|
536
550
|
}
|
|
537
551
|
async fileChangeEvent(event) {
|
|
538
552
|
this.setSettingsForComponent();
|
|
539
|
-
console.log(this.fileInputId);
|
|
540
|
-
this.imageChangedEvent = event;
|
|
541
553
|
const file = event?.target?.files[0];
|
|
542
554
|
if (file) {
|
|
555
|
+
this.dialogService
|
|
556
|
+
.open(CropperComponentModal, {
|
|
557
|
+
header: 'Recortar y subir imagen',
|
|
558
|
+
width: '70vw',
|
|
559
|
+
modal: true,
|
|
560
|
+
closable: true,
|
|
561
|
+
maximizable: true,
|
|
562
|
+
data: {
|
|
563
|
+
imageChangedEvent: event,
|
|
564
|
+
file: file,
|
|
565
|
+
},
|
|
566
|
+
})
|
|
567
|
+
.onClose.subscribe((result) => {
|
|
568
|
+
if (result) {
|
|
569
|
+
this.imageUploaded.emit(result);
|
|
570
|
+
}
|
|
571
|
+
});
|
|
543
572
|
this.fileMetadata = file;
|
|
544
573
|
this.onFileSelected.emit(file);
|
|
545
574
|
this.renameFile = this.fileMetadata?.name
|
|
546
575
|
?.split('.')[0]
|
|
547
576
|
.replace(/[^a-zA-Z0-9]/g, '')
|
|
548
577
|
.slice(0, 80);
|
|
549
|
-
console.log(this.renameFile);
|
|
550
578
|
if (!this.imgStorageSettings().fileName) {
|
|
551
579
|
this.reloadPath();
|
|
552
580
|
}
|
|
553
|
-
this.displayDialog = true;
|
|
554
581
|
this.changeDetectorRef.detectChanges();
|
|
555
582
|
}
|
|
556
583
|
}
|
|
@@ -578,7 +605,7 @@ class CropperComponentModal {
|
|
|
578
605
|
}
|
|
579
606
|
console.log('imgStorage', imgStorage);
|
|
580
607
|
this.imageUploaded.emit({ ...imgStorage, metadata: this.emotionSelected });
|
|
581
|
-
this.
|
|
608
|
+
this.ref.close({ ...imgStorage, metadata: this.emotionSelected });
|
|
582
609
|
this.changeDetectorRef.detectChanges();
|
|
583
610
|
}
|
|
584
611
|
changeRatio(event) {
|
|
@@ -593,11 +620,23 @@ class CropperComponentModal {
|
|
|
593
620
|
this.emotionSelected = event;
|
|
594
621
|
}
|
|
595
622
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.6", ngImport: i0, type: CropperComponentModal, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
596
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.6", type: CropperComponentModal, isStandalone: true, selector: "dc-cropper-modal", inputs: { imgStorageSettings: { classPropertyName: "imgStorageSettings", publicName: "imgStorageSettings", isSignal: true, isRequired: false, transformFunction: null }, buttonLabel: { classPropertyName: "buttonLabel", publicName: "buttonLabel", isSignal: true, isRequired: false, transformFunction: null }, currentStorage: { classPropertyName: "currentStorage", publicName: "currentStorage", isSignal: false, isRequired: false, transformFunction: null } }, outputs: { imageUploaded: "imageUploaded", onImageCropped: "onImageCropped", onFileSelected: "onFileSelected" }, viewQueries: [{ propertyName: "imageCropper", first: true, predicate: ImageCropperComponent, descendants: true }], ngImport: i0, template: "<div class=\"upload-section\">\n <input type=\"file\" [id]=\"fileInputId\" class=\"file-input\" (change)=\"fileChangeEvent($event)\" />\n <label pButton [for]=\"fileInputId\" [pTooltip]=\"storagePath\" class=\"upload-button\">\n {{ buttonLabel() }}\n </label>\n</div>\n@if(displayDialog) {\n<!-- Cropper Dialog -->\n\n<p-dialog header=\"Recortar imagen\" [(visible)]=\"displayDialog\" [modal]=\"true\" [draggable]=\"false\" [resizable]=\"false\" styleClass=\"cropper-dialog\">\n <!-- Image Settings Section -->\n <div class=\"settings-section\">\n @if(!imgStorageSettings().path) {\n <p-message severity=\"warn\">Developer Note: make sure you have a path to save the image pass object imgStorageSettings</p-message>\n } @if(currentStorage?.url) {\n\n <p-message severity=\"warn\" variant=\"outlined\">\n <div>\n <span class=\"setting-label\">Image will be replaced:</span>\n <img width=\"100\" height=\"Auto\" [src]=\"currentStorage?.url\" />\n </div>\n </p-message>\n\n }\n\n <p-message>\n <b>Estas opciones estan preconfiguradas y no se pueden cambiar</b>\n\n <ul>\n <li> <b>Path to save:</b> {{ storagePath }}< </li>\n <li>\n <b>Resoluciones:</b>\n <span>{{ imgStorageSettings()?.cropSettings?.resolutions }}</span>\n </li>\n </ul>\n </p-message>\n\n <div class=\"setting-item\">\n <span class=\"setting-label\">Aspecto:</span>\n <p class=\"setting-value\">{{ imgStorageSettings()?.cropSettings?.aspectRatio }}</p>\n </div>\n\n <p-select\n [options]=\"aspectRatioOptions\"\n [ngModel]=\"ratioSelected\"\n (ngModelChange)=\"changeRatio($event)\"\n optionLabel=\"description\"\n placeholder=\"Select a ratio\">\n <ng-template pTemplate=\"selectedItem\" let-selectedOption>\n @if(selectedOption) {\n <div class=\"flex items-center gap-2\">\n <div [innerHTML]=\"selectedOption.icon | safeHtml\"></div>\n <div>{{ selectedOption.description }}</div>\n </div>\n }\n </ng-template>\n <ng-template let-ratio pTemplate=\"item\">\n <div class=\"flex items-center gap-2\">\n <div [innerHTML]=\"ratio.icon | safeHtml\"></div>\n <div>{{ ratio.description }}</div>\n </div>\n </ng-template>\n </p-select>\n\n <!-- File Metadata Section -->\n @if (fileMetadata) {\n <div class=\"metadata-section\">\n <span class=\"metadata-item\">tipo: {{ fileMetadata.type }}</span>\n <span class=\"metadata-item\">tama\u00F1o: {{ fileMetadata.size }}</span>\n </div>\n }\n\n <!-- Rename Input -->\n <input\n pInputText\n [disabled]=\"imgStorageSettings()?.fileName\"\n [(ngModel)]=\"renameFile\"\n type=\"text\"\n placeholder=\"Rename File\"\n (ngModelChange)=\"reloadPath()\"\n class=\"rename-input\" />\n\n <h5>Datos adicionales</h5>\n\n <p-select\n [options]=\"MoodStateOptions\"\n [(ngModel)]=\"emotionSelected\"\n (ngModelChange)=\"addEmotion($event)\"\n optionLabel=\"label\"\n optionValue=\"value\"\n placeholder=\"Select an emotion\" />\n </div>\n\n <!-- Image Cropper -->\n\n <div class=\"cropper-container-father\">\n <image-cropper\n [imageChangedEvent]=\"imageChangedEvent\"\n [maintainAspectRatio]=\"true\"\n [aspectRatio]=\"aspectRatioValue\"\n format=\"webp\"\n [resizeToWidth]=\"resizeToWidth\"\n (imageCropped)=\"onInnerImageCropped($event)\"\n (loadImageFailed)=\"loadImageFailed()\"\n (cropperReady)=\"cropperReady()\"\n [autoCrop]=\"false\">\n </image-cropper>\n </div>\n <!-- Dialog Footer -->\n <ng-template pTemplate=\"footer\">\n <div class=\"dialog-footer\">\n <button pButton class=\"p-button-primary\" (click)=\"simpleCropAndUpload()\"> Recortar y Subir </button>\n </div>\n </ng-template>\n</p-dialog>\n}\n", styles: [":host{display:block}:host ::ng-deep .ngx-ic-overlay{width:100%!important}.upload-section{margin-bottom:1rem}.upload-section .file-input{display:none}.upload-section .upload-button{cursor:pointer}::ng-deep .cropper-dialog{max-width:90vw;width:800px}::ng-deep .cropper-dialog .p-dialog-content{padding:1.5rem}.settings-section{margin-bottom:1.5rem}.settings-section .settings-header{color:var(--text-color-secondary);margin-bottom:1rem}.settings-section .settings-grid{display:grid;gap:1rem;margin-bottom:1.5rem}.settings-section .settings-grid .setting-item .setting-label{font-weight:600;color:var(--text-color);display:block;margin-bottom:.5rem}.settings-section .settings-grid .setting-item .setting-value{color:var(--text-color-secondary);margin:0}.metadata-section{display:flex;gap:1.5rem;margin-bottom:1rem}.metadata-section .metadata-item{color:var(--text-color-secondary)}.rename-section{margin-bottom:5px}.rename-section .rename-input{width:100%;padding:.5rem;border:1px solid var(--surface-border);border-radius:4px}.rename-section .rename-input:disabled{background-color:var(--surface-200);cursor:not-allowed}.cropper-container-father{display:flex;justify-content:center;align-items:center;height:65vh}.dialog-footer{display:flex;justify-content:flex-end;gap:1rem}.btn-crop{cursor:pointer;outline:0;display:inline-block;font-weight:400;line-height:1.5;text-align:center;background-color:transparent;border:1px solid transparent;padding:6px 12px;font-size:1rem;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;color:#0d6efd;border-color:#0d6efd}.btn-crop :hover{color:#fff;background-color:#0d6efd;border-color:#0d6efd}.file-input{display:none}.btn-upload{cursor:pointer;outline:0;display:inline-block;font-weight:400;line-height:1.5;text-align:center;background-color:transparent;border:1px solid #0d6efd;padding:6px 12px;font-size:1rem;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;color:#0d6efd}.btn-upload:hover{color:#fff;background-color:#0d6efd}.modal{display:none;position:fixed;top:0;left:0;width:100%;height:100%;background-color:#00000080;z-index:1000}.modal.show-modal{display:flex;align-items:center;justify-content:center}.modal .modal-content{background-color:#fff;border-radius:8px;width:90%;max-width:800px;max-height:90vh;overflow-y:auto;position:relative}.modal .modal-header{padding:1rem;border-bottom:1px solid #dee2e6;display:flex;justify-content:space-between;align-items:center}.modal .modal-header h3{margin:0}.modal .modal-header .close-button{background:none;border:none;font-size:1.5rem;cursor:pointer;padding:0;color:#6c757d}.modal .modal-header .close-button:hover{color:#343a40}.modal .modal-body{padding:1rem;height:100vh;display:flex;flex-direction:column}.modal .modal-footer{padding:1rem;border-top:1px solid #dee2e6;display:flex;justify-content:flex-end}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: ImageCropperComponent, selector: "image-cropper", inputs: ["imageChangedEvent", "imageURL", "imageBase64", "imageFile", "imageAltText", "options", "cropperFrameAriaLabel", "output", "format", "autoCrop", "cropper", "transform", "maintainAspectRatio", "aspectRatio", "resetCropOnAspectRatioChange", "resizeToWidth", "resizeToHeight", "cropperMinWidth", "cropperMinHeight", "cropperMaxHeight", "cropperMaxWidth", "cropperStaticWidth", "cropperStaticHeight", "canvasRotation", "initialStepSize", "roundCropper", "onlyScaleDown", "imageQuality", "backgroundColor", "containWithinAspectRatio", "hideResizeSquares", "allowMoveImage", "checkImageType", "alignImage", "disabled", "hidden"], outputs: ["imageCropped", "startCropImage", "imageLoaded", "cropperReady", "loadImageFailed", "transformChange", "cropperChange"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "directive", type: i2.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "loading", "severity", "raised", "rounded", "text", "outlined", "size", "plain", "fluid", "label", "icon", "buttonProps"] }, { kind: "directive", type: i3.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "ngmodule", type: DialogModule }, { kind: "component", type: i4.Dialog, selector: "p-dialog", inputs: ["header", "draggable", "resizable", "contentStyle", "contentStyleClass", "modal", "closeOnEscape", "dismissableMask", "rtl", "closable", "breakpoints", "styleClass", "maskStyleClass", "maskStyle", "showHeader", "blockScroll", "autoZIndex", "baseZIndex", "minX", "minY", "focusOnShow", "maximizable", "keepInViewport", "focusTrap", "transitionOptions", "closeIcon", "closeAriaLabel", "closeTabindex", "minimizeIcon", "maximizeIcon", "closeButtonProps", "maximizeButtonProps", "visible", "style", "position", "role", "appendTo", "content", "contentTemplate", "footerTemplate", "closeIconTemplate", "maximizeIconTemplate", "minimizeIconTemplate", "headlessTemplate"], outputs: ["onShow", "onHide", "visibleChange", "onResizeInit", "onResizeEnd", "onDragEnd", "onMaximize"] }, { kind: "ngmodule", type: TooltipModule }, { kind: "directive", type: i5.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "pTooltip", "tooltipDisabled", "tooltipOptions", "appendTo"] }, { kind: "ngmodule", type: MessageModule }, { kind: "component", type: i6.Message, selector: "p-message", inputs: ["severity", "text", "escape", "style", "styleClass", "closable", "icon", "closeIcon", "life", "showTransitionOptions", "hideTransitionOptions", "size", "variant"], outputs: ["onClose"] }, { kind: "ngmodule", type: SelectModule }, { kind: "component", type: i7.Select, selector: "p-select", inputs: ["id", "scrollHeight", "filter", "panelStyle", "styleClass", "panelStyleClass", "readonly", "editable", "tabindex", "placeholder", "loadingIcon", "filterPlaceholder", "filterLocale", "inputId", "dataKey", "filterBy", "filterFields", "autofocus", "resetFilterOnHide", "checkmark", "dropdownIcon", "loading", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "group", "showClear", "emptyFilterMessage", "emptyMessage", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "ariaLabel", "ariaLabelledBy", "filterMatchMode", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "focusOnHover", "selectOnFocus", "autoOptionFocus", "autofocusFilter", "filterValue", "options", "appendTo"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onShow", "onHide", "onClear", "onLazyLoad"] }, { kind: "ngmodule", type: InputTextModule }, { kind: "directive", type: i8.InputText, selector: "[pInputText]", inputs: ["pSize", "variant", "fluid", "invalid"] }, { kind: "pipe", type: SafeHtmlPipe, name: "safeHtml" }] }); }
|
|
623
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.6", type: CropperComponentModal, isStandalone: true, selector: "dc-cropper-modal", inputs: { imgStorageSettings: { classPropertyName: "imgStorageSettings", publicName: "imgStorageSettings", isSignal: true, isRequired: false, transformFunction: null }, buttonLabel: { classPropertyName: "buttonLabel", publicName: "buttonLabel", isSignal: true, isRequired: false, transformFunction: null }, currentStorage: { classPropertyName: "currentStorage", publicName: "currentStorage", isSignal: false, isRequired: false, transformFunction: null } }, outputs: { imageUploaded: "imageUploaded", onImageCropped: "onImageCropped", onFileSelected: "onFileSelected" }, providers: [DialogService], viewQueries: [{ propertyName: "imageCropper", first: true, predicate: ImageCropperComponent, descendants: true }], ngImport: i0, template: "<!-- src/app/components/cropper-modal/cropper-modal.component.html -->\n@if(!config?.data) {\n<div class=\"upload-section\">\n <input type=\"file\" [id]=\"fileInputId\" class=\"file-input\" (change)=\"fileChangeEvent($event)\" />\n <label pButton [for]=\"fileInputId\" [pTooltip]=\"storagePath\" class=\"upload-button\">\n {{ buttonLabel() }}\n </label>\n</div>\n} @else {\n<!-- Image Settings Section -->\n<div class=\"settings-section\">\n @if(!imgStorageSettings().path) {\n <p-message severity=\"warn\">Developer Note: make sure you have a path to save the image pass object imgStorageSettings</p-message>\n } @if(currentStorage?.url) {\n <p-message severity=\"warn\" variant=\"outlined\">\n <div>\n <span class=\"setting-label\">Image will be replaced:</span>\n <img width=\"100\" height=\"Auto\" [src]=\"currentStorage?.url\" />\n </div>\n </p-message>\n }\n\n <div class=\"grid\">\n <div class=\"col-12 md:col-6\">\n <p-message>\n <b>Estas opciones estan preconfiguradas y no se pueden cambiar</b>\n <ul>\n <li><b>Path to save:</b> {{ storagePath }}</li>\n <li>\n <b>Resoluciones:</b>\n <span>{{ imgStorageSettings()?.cropSettings?.resolutions }}</span>\n </li>\n </ul>\n </p-message>\n\n <div class=\"setting-item\">\n <span class=\"setting-label\">Aspecto:</span>\n <p class=\"setting-value\">{{ imgStorageSettings()?.cropSettings?.aspectRatio }}</p>\n </div>\n\n @if (fileMetadata) {\n <div class=\"metadata-section\">\n <span class=\"metadata-item\">tipo: {{ fileMetadata.type }}</span>\n <span class=\"metadata-item\">tama\u00F1o: {{ fileMetadata.size }}</span>\n </div>\n }\n </div>\n <div class=\"col-12 md:col-6\">\n <div class=\"flex flex-column gap-2\">\n <div>\n <span>Nombre del archivo</span>\n <p-select\n [options]=\"aspectRatioOptions\"\n [ngModel]=\"ratioSelected\"\n (ngModelChange)=\"changeRatio($event)\"\n optionLabel=\"description\"\n placeholder=\"Select a ratio\">\n <ng-template pTemplate=\"selectedItem\" let-selectedOption>\n @if(selectedOption) {\n <div class=\"flex items-center gap-2\">\n <div [innerHTML]=\"selectedOption.icon | safeHtml\"></div>\n <div>{{ selectedOption.description }}</div>\n </div>\n }\n </ng-template>\n <ng-template let-ratio pTemplate=\"item\">\n <div class=\"flex items-center gap-2\">\n <div [innerHTML]=\"ratio.icon | safeHtml\"></div>\n <div>{{ ratio.description }}</div>\n </div>\n </ng-template>\n </p-select>\n </div>\n\n <div>\n <span>Nombre del archivo</span>\n <input\n pInputText\n [disabled]=\"imgStorageSettings()?.fileName\"\n [(ngModel)]=\"renameFile\"\n type=\"text\"\n placeholder=\"Rename File\"\n (ngModelChange)=\"reloadPath()\"\n class=\"rename-input\" />\n </div>\n\n <div>\n <span>Datos adicionales</span>\n <p-select\n [options]=\"MoodStateOptions\"\n [(ngModel)]=\"emotionSelected\"\n (ngModelChange)=\"addEmotion($event)\"\n optionLabel=\"label\"\n optionValue=\"value\"\n placeholder=\"Select an emotion\" />\n </div>\n </div>\n </div>\n </div>\n</div>\n\n<!-- Image Cropper -->\n<hr />\n\n<div class=\"cropper-container-father\">\n <image-cropper\n [imageChangedEvent]=\"imageChangedEvent\"\n [maintainAspectRatio]=\"true\"\n [aspectRatio]=\"aspectRatioValue\"\n format=\"webp\"\n [resizeToWidth]=\"resizeToWidth\"\n (imageCropped)=\"onInnerImageCropped($event)\"\n (loadImageFailed)=\"loadImageFailed()\"\n (cropperReady)=\"cropperReady()\"\n [autoCrop]=\"false\">\n </image-cropper>\n</div>\n\n<!-- Dialog Footer -->\n<div class=\"p-dialog-footer\">\n <button pButton class=\"p-button-primary\" (click)=\"simpleCropAndUpload()\">Recortar y Subir</button>\n</div>\n}\n", styles: [":host{display:block}:host ::ng-deep .ngx-ic-overlay{width:100%!important}.upload-section{margin-bottom:1rem}.upload-section .file-input{display:none}.upload-section .upload-button{cursor:pointer}::ng-deep .cropper-dialog{max-width:90vw;width:800px}::ng-deep .cropper-dialog .p-dialog-content{padding:1.5rem}.settings-section{margin-bottom:1.5rem}.settings-section .grid .col-12{padding-top:0;padding-bottom:0}.settings-section .settings-header{color:var(--text-color-secondary);margin-bottom:1rem}.settings-section .settings-grid{display:grid;gap:1rem;margin-bottom:1.5rem}.settings-section .settings-grid .setting-item .setting-label{font-weight:600;color:var(--text-color);display:block;margin-bottom:.5rem}.settings-section .settings-grid .setting-item .setting-value{color:var(--text-color-secondary);margin:0}.metadata-section{display:flex;gap:1.5rem;margin-bottom:1rem}.metadata-section .metadata-item{color:var(--text-color-secondary)}.rename-section{margin-bottom:5px}.rename-section .rename-input{width:100%;padding:.5rem;border:1px solid var(--surface-border);border-radius:4px}.rename-section .rename-input:disabled{background-color:var(--surface-200);cursor:not-allowed}.cropper-container-father{display:flex;justify-content:center;align-items:center;height:65vh}.dialog-footer{display:flex;justify-content:flex-end;gap:1rem}.btn-crop{cursor:pointer;outline:0;display:inline-block;font-weight:400;line-height:1.5;text-align:center;background-color:transparent;border:1px solid transparent;padding:6px 12px;font-size:1rem;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;color:#0d6efd;border-color:#0d6efd}.btn-crop :hover{color:#fff;background-color:#0d6efd;border-color:#0d6efd}.file-input{display:none}.btn-upload{cursor:pointer;outline:0;display:inline-block;font-weight:400;line-height:1.5;text-align:center;background-color:transparent;border:1px solid #0d6efd;padding:6px 12px;font-size:1rem;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;color:#0d6efd}.btn-upload:hover{color:#fff;background-color:#0d6efd}.modal{display:none;position:fixed;top:0;left:0;width:100%;height:100%;background-color:#00000080;z-index:1000}.modal.show-modal{display:flex;align-items:center;justify-content:center}.modal .modal-content{background-color:#fff;border-radius:8px;width:90%;max-width:800px;max-height:90vh;overflow-y:auto;position:relative}.modal .modal-header{padding:1rem;border-bottom:1px solid #dee2e6;display:flex;justify-content:space-between;align-items:center}.modal .modal-header h3{margin:0}.modal .modal-header .close-button{background:none;border:none;font-size:1.5rem;cursor:pointer;padding:0;color:#6c757d}.modal .modal-header .close-button:hover{color:#343a40}.modal .modal-body{padding:1rem;height:100vh;display:flex;flex-direction:column}.modal .modal-footer{padding:1rem;border-top:1px solid #dee2e6;display:flex;justify-content:flex-end}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: ImageCropperComponent, selector: "image-cropper", inputs: ["imageChangedEvent", "imageURL", "imageBase64", "imageFile", "imageAltText", "options", "cropperFrameAriaLabel", "output", "format", "autoCrop", "cropper", "transform", "maintainAspectRatio", "aspectRatio", "resetCropOnAspectRatioChange", "resizeToWidth", "resizeToHeight", "cropperMinWidth", "cropperMinHeight", "cropperMaxHeight", "cropperMaxWidth", "cropperStaticWidth", "cropperStaticHeight", "canvasRotation", "initialStepSize", "roundCropper", "onlyScaleDown", "imageQuality", "backgroundColor", "containWithinAspectRatio", "hideResizeSquares", "allowMoveImage", "checkImageType", "alignImage", "disabled", "hidden"], outputs: ["imageCropped", "startCropImage", "imageLoaded", "cropperReady", "loadImageFailed", "transformChange", "cropperChange"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "directive", type: i2.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "loading", "severity", "raised", "rounded", "text", "outlined", "size", "plain", "fluid", "label", "icon", "buttonProps"] }, { kind: "directive", type: i3.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "ngmodule", type: DialogModule }, { kind: "ngmodule", type: TooltipModule }, { kind: "directive", type: i4.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "pTooltip", "tooltipDisabled", "tooltipOptions", "appendTo"] }, { kind: "ngmodule", type: MessageModule }, { kind: "component", type: i5.Message, selector: "p-message", inputs: ["severity", "text", "escape", "style", "styleClass", "closable", "icon", "closeIcon", "life", "showTransitionOptions", "hideTransitionOptions", "size", "variant"], outputs: ["onClose"] }, { kind: "ngmodule", type: SelectModule }, { kind: "component", type: i6.Select, selector: "p-select", inputs: ["id", "scrollHeight", "filter", "panelStyle", "styleClass", "panelStyleClass", "readonly", "editable", "tabindex", "placeholder", "loadingIcon", "filterPlaceholder", "filterLocale", "inputId", "dataKey", "filterBy", "filterFields", "autofocus", "resetFilterOnHide", "checkmark", "dropdownIcon", "loading", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "group", "showClear", "emptyFilterMessage", "emptyMessage", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "ariaLabel", "ariaLabelledBy", "filterMatchMode", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "focusOnHover", "selectOnFocus", "autoOptionFocus", "autofocusFilter", "filterValue", "options", "appendTo"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onShow", "onHide", "onClear", "onLazyLoad"] }, { kind: "ngmodule", type: InputTextModule }, { kind: "directive", type: i7.InputText, selector: "[pInputText]", inputs: ["pSize", "variant", "fluid", "invalid"] }, { kind: "ngmodule", type: FieldsetModule }, { kind: "ngmodule", type: DynamicDialogModule }, { kind: "pipe", type: SafeHtmlPipe, name: "safeHtml" }] }); }
|
|
597
624
|
}
|
|
598
625
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.6", ngImport: i0, type: CropperComponentModal, decorators: [{
|
|
599
626
|
type: Component,
|
|
600
|
-
args: [{ selector: 'dc-cropper-modal', standalone: true, imports: [
|
|
627
|
+
args: [{ selector: 'dc-cropper-modal', standalone: true, imports: [
|
|
628
|
+
FormsModule,
|
|
629
|
+
ImageCropperComponent,
|
|
630
|
+
ButtonModule,
|
|
631
|
+
DialogModule,
|
|
632
|
+
TooltipModule,
|
|
633
|
+
MessageModule,
|
|
634
|
+
SelectModule,
|
|
635
|
+
InputTextModule,
|
|
636
|
+
SafeHtmlPipe,
|
|
637
|
+
FieldsetModule,
|
|
638
|
+
DynamicDialogModule,
|
|
639
|
+
], providers: [DialogService], template: "<!-- src/app/components/cropper-modal/cropper-modal.component.html -->\n@if(!config?.data) {\n<div class=\"upload-section\">\n <input type=\"file\" [id]=\"fileInputId\" class=\"file-input\" (change)=\"fileChangeEvent($event)\" />\n <label pButton [for]=\"fileInputId\" [pTooltip]=\"storagePath\" class=\"upload-button\">\n {{ buttonLabel() }}\n </label>\n</div>\n} @else {\n<!-- Image Settings Section -->\n<div class=\"settings-section\">\n @if(!imgStorageSettings().path) {\n <p-message severity=\"warn\">Developer Note: make sure you have a path to save the image pass object imgStorageSettings</p-message>\n } @if(currentStorage?.url) {\n <p-message severity=\"warn\" variant=\"outlined\">\n <div>\n <span class=\"setting-label\">Image will be replaced:</span>\n <img width=\"100\" height=\"Auto\" [src]=\"currentStorage?.url\" />\n </div>\n </p-message>\n }\n\n <div class=\"grid\">\n <div class=\"col-12 md:col-6\">\n <p-message>\n <b>Estas opciones estan preconfiguradas y no se pueden cambiar</b>\n <ul>\n <li><b>Path to save:</b> {{ storagePath }}</li>\n <li>\n <b>Resoluciones:</b>\n <span>{{ imgStorageSettings()?.cropSettings?.resolutions }}</span>\n </li>\n </ul>\n </p-message>\n\n <div class=\"setting-item\">\n <span class=\"setting-label\">Aspecto:</span>\n <p class=\"setting-value\">{{ imgStorageSettings()?.cropSettings?.aspectRatio }}</p>\n </div>\n\n @if (fileMetadata) {\n <div class=\"metadata-section\">\n <span class=\"metadata-item\">tipo: {{ fileMetadata.type }}</span>\n <span class=\"metadata-item\">tama\u00F1o: {{ fileMetadata.size }}</span>\n </div>\n }\n </div>\n <div class=\"col-12 md:col-6\">\n <div class=\"flex flex-column gap-2\">\n <div>\n <span>Nombre del archivo</span>\n <p-select\n [options]=\"aspectRatioOptions\"\n [ngModel]=\"ratioSelected\"\n (ngModelChange)=\"changeRatio($event)\"\n optionLabel=\"description\"\n placeholder=\"Select a ratio\">\n <ng-template pTemplate=\"selectedItem\" let-selectedOption>\n @if(selectedOption) {\n <div class=\"flex items-center gap-2\">\n <div [innerHTML]=\"selectedOption.icon | safeHtml\"></div>\n <div>{{ selectedOption.description }}</div>\n </div>\n }\n </ng-template>\n <ng-template let-ratio pTemplate=\"item\">\n <div class=\"flex items-center gap-2\">\n <div [innerHTML]=\"ratio.icon | safeHtml\"></div>\n <div>{{ ratio.description }}</div>\n </div>\n </ng-template>\n </p-select>\n </div>\n\n <div>\n <span>Nombre del archivo</span>\n <input\n pInputText\n [disabled]=\"imgStorageSettings()?.fileName\"\n [(ngModel)]=\"renameFile\"\n type=\"text\"\n placeholder=\"Rename File\"\n (ngModelChange)=\"reloadPath()\"\n class=\"rename-input\" />\n </div>\n\n <div>\n <span>Datos adicionales</span>\n <p-select\n [options]=\"MoodStateOptions\"\n [(ngModel)]=\"emotionSelected\"\n (ngModelChange)=\"addEmotion($event)\"\n optionLabel=\"label\"\n optionValue=\"value\"\n placeholder=\"Select an emotion\" />\n </div>\n </div>\n </div>\n </div>\n</div>\n\n<!-- Image Cropper -->\n<hr />\n\n<div class=\"cropper-container-father\">\n <image-cropper\n [imageChangedEvent]=\"imageChangedEvent\"\n [maintainAspectRatio]=\"true\"\n [aspectRatio]=\"aspectRatioValue\"\n format=\"webp\"\n [resizeToWidth]=\"resizeToWidth\"\n (imageCropped)=\"onInnerImageCropped($event)\"\n (loadImageFailed)=\"loadImageFailed()\"\n (cropperReady)=\"cropperReady()\"\n [autoCrop]=\"false\">\n </image-cropper>\n</div>\n\n<!-- Dialog Footer -->\n<div class=\"p-dialog-footer\">\n <button pButton class=\"p-button-primary\" (click)=\"simpleCropAndUpload()\">Recortar y Subir</button>\n</div>\n}\n", styles: [":host{display:block}:host ::ng-deep .ngx-ic-overlay{width:100%!important}.upload-section{margin-bottom:1rem}.upload-section .file-input{display:none}.upload-section .upload-button{cursor:pointer}::ng-deep .cropper-dialog{max-width:90vw;width:800px}::ng-deep .cropper-dialog .p-dialog-content{padding:1.5rem}.settings-section{margin-bottom:1.5rem}.settings-section .grid .col-12{padding-top:0;padding-bottom:0}.settings-section .settings-header{color:var(--text-color-secondary);margin-bottom:1rem}.settings-section .settings-grid{display:grid;gap:1rem;margin-bottom:1.5rem}.settings-section .settings-grid .setting-item .setting-label{font-weight:600;color:var(--text-color);display:block;margin-bottom:.5rem}.settings-section .settings-grid .setting-item .setting-value{color:var(--text-color-secondary);margin:0}.metadata-section{display:flex;gap:1.5rem;margin-bottom:1rem}.metadata-section .metadata-item{color:var(--text-color-secondary)}.rename-section{margin-bottom:5px}.rename-section .rename-input{width:100%;padding:.5rem;border:1px solid var(--surface-border);border-radius:4px}.rename-section .rename-input:disabled{background-color:var(--surface-200);cursor:not-allowed}.cropper-container-father{display:flex;justify-content:center;align-items:center;height:65vh}.dialog-footer{display:flex;justify-content:flex-end;gap:1rem}.btn-crop{cursor:pointer;outline:0;display:inline-block;font-weight:400;line-height:1.5;text-align:center;background-color:transparent;border:1px solid transparent;padding:6px 12px;font-size:1rem;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;color:#0d6efd;border-color:#0d6efd}.btn-crop :hover{color:#fff;background-color:#0d6efd;border-color:#0d6efd}.file-input{display:none}.btn-upload{cursor:pointer;outline:0;display:inline-block;font-weight:400;line-height:1.5;text-align:center;background-color:transparent;border:1px solid #0d6efd;padding:6px 12px;font-size:1rem;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;color:#0d6efd}.btn-upload:hover{color:#fff;background-color:#0d6efd}.modal{display:none;position:fixed;top:0;left:0;width:100%;height:100%;background-color:#00000080;z-index:1000}.modal.show-modal{display:flex;align-items:center;justify-content:center}.modal .modal-content{background-color:#fff;border-radius:8px;width:90%;max-width:800px;max-height:90vh;overflow-y:auto;position:relative}.modal .modal-header{padding:1rem;border-bottom:1px solid #dee2e6;display:flex;justify-content:space-between;align-items:center}.modal .modal-header h3{margin:0}.modal .modal-header .close-button{background:none;border:none;font-size:1.5rem;cursor:pointer;padding:0;color:#6c757d}.modal .modal-header .close-button:hover{color:#343a40}.modal .modal-body{padding:1rem;height:100vh;display:flex;flex-direction:column}.modal .modal-footer{padding:1rem;border-top:1px solid #dee2e6;display:flex;justify-content:flex-end}\n"] }]
|
|
601
640
|
}], ctorParameters: () => [], propDecorators: { currentStorage: [{
|
|
602
641
|
type: Input
|
|
603
642
|
}], imageCropper: [{
|
|
@@ -756,7 +795,7 @@ class SimpleUploaderComponent {
|
|
|
756
795
|
}
|
|
757
796
|
}
|
|
758
797
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.6", ngImport: i0, type: SimpleUploaderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
759
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.6", type: SimpleUploaderComponent, isStandalone: true, selector: "dc-simple-uploader", inputs: { storagePath: { classPropertyName: "storagePath", publicName: "storagePath", isSignal: true, isRequired: true, transformFunction: null }, buttonLabel: { classPropertyName: "buttonLabel", publicName: "buttonLabel", isSignal: true, isRequired: false, transformFunction: null }, accept: { classPropertyName: "accept", publicName: "accept", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, metadata: { classPropertyName: "metadata", publicName: "metadata", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { fileUploaded: "fileUploaded", uploadError: "uploadError" }, ngImport: i0, template: "<p-button\n size=\"large\"\n [label]=\"buttonLabel()\"\n (click)=\"openDialog()\"\n [loading]=\"isLoading()\"\n [disabled]=\"disabled() || isLoading()\"\n pTooltip=\"Upload a file with metadata\"></p-button>\n\n@if(displayDialog()){\n<p-dialog\n header=\"Upload File\"\n [(visible)]=\"displayDialog\"\n [modal]=\"true\"\n [draggable]=\"false\"\n [resizable]=\"false\"\n [contentStyle]=\"{ width: '50vw', height: '50vh' }\">\n <div class=\"upload-dialog\">\n @if(!fileSelected()){\n <div class=\"file-input-container\">\n <input #fileInput type=\"file\" [id]=\"fileInputId\" (change)=\"onFileSelected($event)\" [accept]=\"accept()\" style=\"display: none\" />\n <p-button label=\"Select File\" (click)=\"triggerFileInputClick(fileInput)\"></p-button>\n </div>\n } @else {\n <div class=\"file-details\">\n <p>File: {{ fileSelected()?.name }}</p>\n <p>Size: {{ fileSelected()?.size }} bytes</p>\n </div>\n\n <div class=\"metadata-container\">\n <h5>Metadata</h5>\n <div class=\"p-fluid\">\n @for (key of objectKeys(metadata()); track key) {\n <div class=\"p-field\">\n <label [for]=\"key\">{{ key }}</label>\n <input pInputText [id]=\"key\" [(ngModel)]=\"metadataInput[key]\" />\n </div>\n }\n\n <div class=\"p-field\">\n <label for=\"emotion\">Emotion</label>\n <br />\n <p-select [options]=\"MoodStateOptions\" [(ngModel)]=\"moodSelected\" optionLabel=\"label\" optionValue=\"value\" placeholder=\"Select an emotion\"></p-select>\n </div>\n <div class=\"p-field\">\n <label for=\"emotion\">Event</label>\n <br />\n <p-select\n [options]=\"CharacterEventActions\"\n [(ngModel)]=\"eventSelected\"\n optionLabel=\"label\"\n optionValue=\"value\"\n placeholder=\"Select an event\"></p-select>\n </div>\n </div>\n </div>\n }\n </div>\n\n <ng-template pTemplate=\"footer\">\n <div class=\"dialog-footer\">\n <p-button label=\"Cancel\" styleClass=\"p-button-secondary\" (click)=\"displayDialog.set(false)\"></p-button>\n <p-button label=\"Upload\" (click)=\"uploadFile()\" [disabled]=\"!fileSelected() || isLoading()\"></p-button>\n </div>\n </ng-template>\n</p-dialog>\n}\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "component", type: i2.Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "raised", "rounded", "text", "plain", "severity", "outlined", "link", "tabindex", "size", "variant", "style", "styleClass", "badgeClass", "badgeSeverity", "ariaLabel", "buttonProps", "autofocus", "fluid"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "directive", type: i3.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "ngmodule", type: TooltipModule }, { kind: "directive", type:
|
|
798
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.6", type: SimpleUploaderComponent, isStandalone: true, selector: "dc-simple-uploader", inputs: { storagePath: { classPropertyName: "storagePath", publicName: "storagePath", isSignal: true, isRequired: true, transformFunction: null }, buttonLabel: { classPropertyName: "buttonLabel", publicName: "buttonLabel", isSignal: true, isRequired: false, transformFunction: null }, accept: { classPropertyName: "accept", publicName: "accept", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, metadata: { classPropertyName: "metadata", publicName: "metadata", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { fileUploaded: "fileUploaded", uploadError: "uploadError" }, ngImport: i0, template: "<p-button\n size=\"large\"\n [label]=\"buttonLabel()\"\n (click)=\"openDialog()\"\n [loading]=\"isLoading()\"\n [disabled]=\"disabled() || isLoading()\"\n pTooltip=\"Upload a file with metadata\"></p-button>\n\n@if(displayDialog()){\n<p-dialog\n header=\"Upload File\"\n [(visible)]=\"displayDialog\"\n [modal]=\"true\"\n [draggable]=\"false\"\n [resizable]=\"false\"\n [contentStyle]=\"{ width: '50vw', height: '50vh' }\">\n <div class=\"upload-dialog\">\n @if(!fileSelected()){\n <div class=\"file-input-container\">\n <input #fileInput type=\"file\" [id]=\"fileInputId\" (change)=\"onFileSelected($event)\" [accept]=\"accept()\" style=\"display: none\" />\n <p-button label=\"Select File\" (click)=\"triggerFileInputClick(fileInput)\"></p-button>\n </div>\n } @else {\n <div class=\"file-details\">\n <p>File: {{ fileSelected()?.name }}</p>\n <p>Size: {{ fileSelected()?.size }} bytes</p>\n </div>\n\n <div class=\"metadata-container\">\n <h5>Metadata</h5>\n <div class=\"p-fluid\">\n @for (key of objectKeys(metadata()); track key) {\n <div class=\"p-field\">\n <label [for]=\"key\">{{ key }}</label>\n <input pInputText [id]=\"key\" [(ngModel)]=\"metadataInput[key]\" />\n </div>\n }\n\n <div class=\"p-field\">\n <label for=\"emotion\">Emotion</label>\n <br />\n <p-select [options]=\"MoodStateOptions\" [(ngModel)]=\"moodSelected\" optionLabel=\"label\" optionValue=\"value\" placeholder=\"Select an emotion\"></p-select>\n </div>\n <div class=\"p-field\">\n <label for=\"emotion\">Event</label>\n <br />\n <p-select\n [options]=\"CharacterEventActions\"\n [(ngModel)]=\"eventSelected\"\n optionLabel=\"label\"\n optionValue=\"value\"\n placeholder=\"Select an event\"></p-select>\n </div>\n </div>\n </div>\n }\n </div>\n\n <ng-template pTemplate=\"footer\">\n <div class=\"dialog-footer\">\n <p-button label=\"Cancel\" styleClass=\"p-button-secondary\" (click)=\"displayDialog.set(false)\"></p-button>\n <p-button label=\"Upload\" (click)=\"uploadFile()\" [disabled]=\"!fileSelected() || isLoading()\"></p-button>\n </div>\n </ng-template>\n</p-dialog>\n}\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "component", type: i2.Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "raised", "rounded", "text", "plain", "severity", "outlined", "link", "tabindex", "size", "variant", "style", "styleClass", "badgeClass", "badgeSeverity", "ariaLabel", "buttonProps", "autofocus", "fluid"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "directive", type: i3.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "ngmodule", type: TooltipModule }, { kind: "directive", type: i4.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "pTooltip", "tooltipDisabled", "tooltipOptions", "appendTo"] }, { kind: "ngmodule", type: DialogModule }, { kind: "component", type: i5$1.Dialog, selector: "p-dialog", inputs: ["header", "draggable", "resizable", "contentStyle", "contentStyleClass", "modal", "closeOnEscape", "dismissableMask", "rtl", "closable", "breakpoints", "styleClass", "maskStyleClass", "maskStyle", "showHeader", "blockScroll", "autoZIndex", "baseZIndex", "minX", "minY", "focusOnShow", "maximizable", "keepInViewport", "focusTrap", "transitionOptions", "closeIcon", "closeAriaLabel", "closeTabindex", "minimizeIcon", "maximizeIcon", "closeButtonProps", "maximizeButtonProps", "visible", "style", "position", "role", "appendTo", "content", "contentTemplate", "footerTemplate", "closeIconTemplate", "maximizeIconTemplate", "minimizeIconTemplate", "headlessTemplate"], outputs: ["onShow", "onHide", "visibleChange", "onResizeInit", "onResizeEnd", "onDragEnd", "onMaximize"] }, { kind: "ngmodule", type: InputTextModule }, { kind: "directive", type: i7.InputText, selector: "[pInputText]", inputs: ["pSize", "variant", "fluid", "invalid"] }, { kind: "ngmodule", type: SelectModule }, { kind: "component", type: i6.Select, selector: "p-select", inputs: ["id", "scrollHeight", "filter", "panelStyle", "styleClass", "panelStyleClass", "readonly", "editable", "tabindex", "placeholder", "loadingIcon", "filterPlaceholder", "filterLocale", "inputId", "dataKey", "filterBy", "filterFields", "autofocus", "resetFilterOnHide", "checkmark", "dropdownIcon", "loading", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "group", "showClear", "emptyFilterMessage", "emptyMessage", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "ariaLabel", "ariaLabelledBy", "filterMatchMode", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "focusOnHover", "selectOnFocus", "autoOptionFocus", "autofocusFilter", "filterValue", "options", "appendTo"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onShow", "onHide", "onClear", "onLazyLoad"] }] }); }
|
|
760
799
|
}
|
|
761
800
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.6", ngImport: i0, type: SimpleUploaderComponent, decorators: [{
|
|
762
801
|
type: Component,
|
|
@@ -923,7 +962,7 @@ class AssetsLoaderComponent {
|
|
|
923
962
|
this.imageStorageSettings = computed(() => ({
|
|
924
963
|
path: this.storagePath(),
|
|
925
964
|
fileName: undefined,
|
|
926
|
-
cropSettings: { aspectRatio: AspectType.
|
|
965
|
+
cropSettings: { aspectRatio: AspectType.vertical_2_3, resolutions: [ResolutionType.MediumLarge], resizeToWidth: 500 },
|
|
927
966
|
}), ...(ngDevMode ? [{ debugName: "imageStorageSettings" }] : []));
|
|
928
967
|
this.stickerStorageSettings = computed(() => ({
|
|
929
968
|
path: `${this.storagePath()}/stickers`,
|
|
@@ -1025,7 +1064,7 @@ class AssetsLoaderComponent {
|
|
|
1025
1064
|
}
|
|
1026
1065
|
}
|
|
1027
1066
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.6", ngImport: i0, type: AssetsLoaderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
1028
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.6", type: AssetsLoaderComponent, isStandalone: true, selector: "assets-loader", inputs: { assets: { classPropertyName: "assets", publicName: "assets", isSignal: true, isRequired: true, transformFunction: null }, storagePath: { classPropertyName: "storagePath", publicName: "storagePath", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { assetsChange: "assetsChange", assetUpdate: "assetUpdate", onFileSelected: "onFileSelected" }, ngImport: i0, template: "<div class=\"assets-container\">\n <div class=\"assets-card\">\n <p-message severity=\"info\">\n <div class=\"upload-buttons\">\n <div>\n <dc-cropper-modal\n id=\"cropperCardImage\"\n #cropperCardImage\n [buttonLabel]=\"assets()?.image?.url ? 'Cambiar imagen' : 'Cargar una imagen'\"\n [imgStorageSettings]=\"imageStorageSettings()\"\n [currentStorage]=\"assets()?.image\"\n (imageUploaded)=\"onImageUploaded($event, 'image')\"\n (onFileSelected)=\"onFileSelected.emit($event)\"></dc-cropper-modal>\n </div>\n\n <dc-simple-uploader\n [buttonLabel]=\"assets()?.motion?.url ? 'Cambiar video principal' : 'Agregar video principal'\"\n (fileUploaded)=\"onMotionUploaded($event)\"\n [storagePath]=\"storagePath() + '/motions/file'\"\n [accept]=\"'video/*'\"></dc-simple-uploader>\n\n <dc-simple-uploader\n [buttonLabel]=\"'Agregar Movimientos'\"\n (fileUploaded)=\"onMotionAdded($event)\"\n [storagePath]=\"storagePath() + '/motions/file'\"\n [accept]=\"'video/*'\"></dc-simple-uploader>\n\n <dc-cropper-modal\n #cropperBanner\n id=\"cropperBanner\"\n [buttonLabel]=\"assets()?.banner?.url ? 'Cambiar el banner' : 'Cargar un banner'\"\n [imgStorageSettings]=\"bannerImgSettings()\"\n [currentStorage]=\"assets()?.banner\"\n (imageUploaded)=\"onImageUploaded($event, 'banner')\"></dc-cropper-modal>\n\n <dc-cropper-modal\n id=\"cropperStickers\"\n #cropperStickers\n [buttonLabel]=\"'Agregar sticker'\"\n [imgStorageSettings]=\"stickerStorageSettings()\"\n (imageUploaded)=\"onImageUploaded($event, 'sticker')\"></dc-cropper-modal>\n </div>\n </p-message>\n <!-- Banner -->\n\n <div class=\"preview-container\">\n <img [src]=\"assets()?.banner?.url || 'assets/defaults/images/default_banner.webp'\" class=\"main-banner-image-card\" />\n <div class=\"main-image-card\">\n <img [src]=\"assets()?.image?.url || 'assets/defaults/images/default_2_3.webp'\" />\n </div>\n\n <div class=\"motion-container\">\n <video #videoPlayer class=\"main-motion-card\" [src]=\"assets()?.motion?.url\" (ended)=\"onVideoEnded(videoPlayer)\" autoplay muted playsinline></video>\n @if(assets()?.motion?.url){\n <p-button class=\"remove-main-motion-button\" (click)=\"removeMainMotion()\" [rounded]=\"true\" [text]=\"true\" icon=\"pi pi-trash\" severity=\"danger\"></p-button>\n }\n </div>\n </div>\n\n <div class=\"stickers-container\">\n @for (sticker of assets()?.stickers; track sticker.url) {\n <div class=\"sticker-wrapper\">\n <img width=\"100\" [src]=\"sticker.url\" alt=\"\" />\n <p-button (click)=\"removeSticker(sticker)\" class=\"remove-sticker\" icon=\"pi pi-times\" [rounded]=\"true\" [text]=\"true\" severity=\"danger\" />\n </div>\n }\n </div>\n\n <div class=\"motions-container\">\n @for (motion of assets()?.motions; track motion.url) {\n <div class=\"motion-wrapper\">\n <video width=\"150\" [src]=\"motion.url\" controls playsinline preload=\"none\"></video>\n <p-button (click)=\"removeMotion(motion)\" class=\"remove-motion-button\" icon=\"pi pi-trash\" [rounded]=\"true\" [text]=\"true\" severity=\"danger\"></p-button>\n @if(motion.metadata?.moodState){\n <p-tag style=\"position: absolute; top: 4px; left: 4px\" severity=\"secondary\" [value]=\"motion.metadata?.moodState\" />\n } @if(motion.metadata?.event){\n <p-tag style=\"position: absolute; top: 4px; left: 4px\" severity=\"warn\" [value]=\"motion.metadata?.event\" />\n }\n </div>\n }\n </div>\n </div>\n</div>\n", styles: [".main-image-card{max-width:220px;display:block;border-radius:8px;position:absolute;bottom:-100px;left:20px;transform:none;z-index:1;box-shadow:0 4px 8px #0003;overflow:hidden}@media (max-width: 1300px){.main-image-card{max-width:170px}}@media (max-width: 768px){.main-image-card{max-width:130px}}.main-motion-card{max-width:100%;display:block;border-radius:8px}.main-banner-image-card{display:block;width:100%;max-height:400px;object-fit:cover;border-radius:8px}.remove-sticker{position:absolute;top:5px;right:5px}.assets-container{position:relative;min-height:60px}.assets-card{border:1px dashed rgba(12,19,142,.1215686275);padding:4px;border-radius:15px}.upload-buttons{display:flex;gap:10px}.preview-container{position:relative;margin-bottom:100px}.stickers-container{display:flex;flex-wrap:wrap;gap:10px}.sticker-wrapper{position:relative}.motion-container{position:absolute;bottom:-100px;right:20px;z-index:1;box-shadow:0 4px 8px #0003;max-width:220px;border-radius:8px;overflow:hidden}@media (max-width: 1300px){.motion-container{max-width:170px}}@media (max-width: 768px){.motion-container{max-width:130px}}.remove-main-motion-button{position:absolute;top:10px;right:10px;z-index:2}.motions-container{display:flex;flex-wrap:wrap;gap:10px;margin-top:20px}.motion-wrapper{position:relative;width:150px;border-radius:8px;overflow:hidden;box-shadow:0 2px 4px #0000001a}.motion-wrapper video{min-height:220px;display:block;background-color:#f0f0f0}.remove-motion-button{position:absolute;top:5px;right:5px;z-index:2}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: CropperComponentModal, selector: "dc-cropper-modal", inputs: ["imgStorageSettings", "buttonLabel", "currentStorage"], outputs: ["imageUploaded", "onImageCropped", "onFileSelected"] }, { kind: "component", type: SimpleUploaderComponent, selector: "dc-simple-uploader", inputs: ["storagePath", "buttonLabel", "accept", "disabled", "metadata"], outputs: ["fileUploaded", "uploadError"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "component", type: i2.Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "raised", "rounded", "text", "plain", "severity", "outlined", "link", "tabindex", "size", "variant", "style", "styleClass", "badgeClass", "badgeSeverity", "ariaLabel", "buttonProps", "autofocus", "fluid"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "ngmodule", type: MessageModule }, { kind: "component", type:
|
|
1067
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.6", type: AssetsLoaderComponent, isStandalone: true, selector: "assets-loader", inputs: { assets: { classPropertyName: "assets", publicName: "assets", isSignal: true, isRequired: true, transformFunction: null }, storagePath: { classPropertyName: "storagePath", publicName: "storagePath", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { assetsChange: "assetsChange", assetUpdate: "assetUpdate", onFileSelected: "onFileSelected" }, ngImport: i0, template: "<div class=\"assets-container\">\n <div class=\"assets-card\">\n <p-message severity=\"info\">\n <div class=\"upload-buttons\">\n <div>\n <dc-cropper-modal\n id=\"cropperCardImage\"\n #cropperCardImage\n [buttonLabel]=\"assets()?.image?.url ? 'Cambiar imagen' : 'Cargar una imagen'\"\n [imgStorageSettings]=\"imageStorageSettings()\"\n [currentStorage]=\"assets()?.image\"\n (imageUploaded)=\"onImageUploaded($event, 'image')\"\n (onFileSelected)=\"onFileSelected.emit($event)\"></dc-cropper-modal>\n </div>\n\n <dc-simple-uploader\n [buttonLabel]=\"assets()?.motion?.url ? 'Cambiar video principal' : 'Agregar video principal'\"\n (fileUploaded)=\"onMotionUploaded($event)\"\n [storagePath]=\"storagePath() + '/motions/file'\"\n [accept]=\"'video/*'\"></dc-simple-uploader>\n\n <dc-simple-uploader\n [buttonLabel]=\"'Agregar Movimientos'\"\n (fileUploaded)=\"onMotionAdded($event)\"\n [storagePath]=\"storagePath() + '/motions/file'\"\n [accept]=\"'video/*'\"></dc-simple-uploader>\n\n <dc-cropper-modal\n #cropperBanner\n id=\"cropperBanner\"\n [buttonLabel]=\"assets()?.banner?.url ? 'Cambiar el banner' : 'Cargar un banner'\"\n [imgStorageSettings]=\"bannerImgSettings()\"\n [currentStorage]=\"assets()?.banner\"\n (imageUploaded)=\"onImageUploaded($event, 'banner')\"></dc-cropper-modal>\n\n <dc-cropper-modal\n id=\"cropperStickers\"\n #cropperStickers\n [buttonLabel]=\"'Agregar sticker'\"\n [imgStorageSettings]=\"stickerStorageSettings()\"\n (imageUploaded)=\"onImageUploaded($event, 'sticker')\"></dc-cropper-modal>\n </div>\n </p-message>\n <!-- Banner -->\n\n <div class=\"preview-container\">\n <img [src]=\"assets()?.banner?.url || 'assets/defaults/images/default_banner.webp'\" class=\"main-banner-image-card\" />\n <div class=\"main-image-card\">\n <img [src]=\"assets()?.image?.url || 'assets/defaults/images/default_2_3.webp'\" />\n </div>\n\n <div class=\"motion-container\">\n <video #videoPlayer class=\"main-motion-card\" [src]=\"assets()?.motion?.url\" (ended)=\"onVideoEnded(videoPlayer)\" autoplay muted playsinline></video>\n @if(assets()?.motion?.url){\n <p-button class=\"remove-main-motion-button\" (click)=\"removeMainMotion()\" [rounded]=\"true\" [text]=\"true\" icon=\"pi pi-trash\" severity=\"danger\"></p-button>\n }\n </div>\n </div>\n\n <div class=\"stickers-container\">\n @for (sticker of assets()?.stickers; track sticker.url) {\n <div class=\"sticker-wrapper\">\n <img width=\"100\" [src]=\"sticker.url\" alt=\"\" />\n <p-button (click)=\"removeSticker(sticker)\" class=\"remove-sticker\" icon=\"pi pi-times\" [rounded]=\"true\" [text]=\"true\" severity=\"danger\" />\n </div>\n }\n </div>\n\n <div class=\"motions-container\">\n @for (motion of assets()?.motions; track motion.url) {\n <div class=\"motion-wrapper\">\n <video width=\"150\" [src]=\"motion.url\" controls playsinline preload=\"none\"></video>\n <p-button (click)=\"removeMotion(motion)\" class=\"remove-motion-button\" icon=\"pi pi-trash\" [rounded]=\"true\" [text]=\"true\" severity=\"danger\"></p-button>\n @if(motion.metadata?.moodState){\n <p-tag style=\"position: absolute; top: 4px; left: 4px\" severity=\"secondary\" [value]=\"motion.metadata?.moodState\" />\n } @if(motion.metadata?.event){\n <p-tag style=\"position: absolute; top: 4px; left: 4px\" severity=\"warn\" [value]=\"motion.metadata?.event\" />\n }\n </div>\n }\n </div>\n </div>\n</div>\n", styles: [".main-image-card{max-width:220px;display:block;border-radius:8px;position:absolute;bottom:-100px;left:20px;transform:none;z-index:1;box-shadow:0 4px 8px #0003;overflow:hidden}@media (max-width: 1300px){.main-image-card{max-width:170px}}@media (max-width: 768px){.main-image-card{max-width:130px}}.main-motion-card{max-width:100%;display:block;border-radius:8px}.main-banner-image-card{display:block;width:100%;max-height:400px;object-fit:cover;border-radius:8px}.remove-sticker{position:absolute;top:5px;right:5px}.assets-container{position:relative;min-height:60px}.assets-card{border:1px dashed rgba(12,19,142,.1215686275);padding:4px;border-radius:15px}.upload-buttons{display:flex;gap:10px}.preview-container{position:relative;margin-bottom:100px}.stickers-container{display:flex;flex-wrap:wrap;gap:10px}.sticker-wrapper{position:relative}.motion-container{position:absolute;bottom:-100px;right:20px;z-index:1;box-shadow:0 4px 8px #0003;max-width:220px;border-radius:8px;overflow:hidden}@media (max-width: 1300px){.motion-container{max-width:170px}}@media (max-width: 768px){.motion-container{max-width:130px}}.remove-main-motion-button{position:absolute;top:10px;right:10px;z-index:2}.motions-container{display:flex;flex-wrap:wrap;gap:10px;margin-top:20px}.motion-wrapper{position:relative;width:150px;border-radius:8px;overflow:hidden;box-shadow:0 2px 4px #0000001a}.motion-wrapper video{min-height:220px;display:block;background-color:#f0f0f0}.remove-motion-button{position:absolute;top:5px;right:5px;z-index:2}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: CropperComponentModal, selector: "dc-cropper-modal", inputs: ["imgStorageSettings", "buttonLabel", "currentStorage"], outputs: ["imageUploaded", "onImageCropped", "onFileSelected"] }, { kind: "component", type: SimpleUploaderComponent, selector: "dc-simple-uploader", inputs: ["storagePath", "buttonLabel", "accept", "disabled", "metadata"], outputs: ["fileUploaded", "uploadError"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "component", type: i2.Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "raised", "rounded", "text", "plain", "severity", "outlined", "link", "tabindex", "size", "variant", "style", "styleClass", "badgeClass", "badgeSeverity", "ariaLabel", "buttonProps", "autofocus", "fluid"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "ngmodule", type: MessageModule }, { kind: "component", type: i5.Message, selector: "p-message", inputs: ["severity", "text", "escape", "style", "styleClass", "closable", "icon", "closeIcon", "life", "showTransitionOptions", "hideTransitionOptions", "size", "variant"], outputs: ["onClose"] }, { kind: "ngmodule", type: TagModule }, { kind: "component", type: i3$1.Tag, selector: "p-tag", inputs: ["styleClass", "severity", "value", "icon", "rounded"] }] }); }
|
|
1029
1068
|
}
|
|
1030
1069
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.6", ngImport: i0, type: AssetsLoaderComponent, decorators: [{
|
|
1031
1070
|
type: Component,
|
|
@@ -1040,5 +1079,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.6", ngImpor
|
|
|
1040
1079
|
* Generated bundle index. Do not edit.
|
|
1041
1080
|
*/
|
|
1042
1081
|
|
|
1043
|
-
export {
|
|
1082
|
+
export { AllAspectRatioOptions, AspectRatio, AspectRatioOptions, AspectType, AssetsLoaderComponent, CropperComponent, CropperComponentModal, DCFilesCacheService, DEFAULT_SETTINGS, ImageStoragePreviewComponent, MultiImagesStorageService, MultiObjectStorageService, ResolutionType, SafeHtmlPipe, SimpleUploaderComponent, extractBucket, extractPath };
|
|
1044
1083
|
//# sourceMappingURL=dataclouder-ngx-cloud-storage.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dataclouder-ngx-cloud-storage.mjs","sources":["../../../../projects/dataclouder/ngx-cloud-storage/src/lib/classes/storage.models.ts","../../../../projects/dataclouder/ngx-cloud-storage/src/lib/services/multi-images-storage.service.ts","../../../../projects/dataclouder/ngx-cloud-storage/src/lib/components/cropper/cropper.component.ts","../../../../projects/dataclouder/ngx-cloud-storage/src/lib/components/cropper/cropper.component.html","../../../../projects/dataclouder/ngx-cloud-storage/src/lib/pipes/safe-html.pipe.ts","../../../../projects/dataclouder/ngx-cloud-storage/src/lib/components/cropper-modal/cropper-modal.component.ts","../../../../projects/dataclouder/ngx-cloud-storage/src/lib/components/cropper-modal/cropper-modal.component.html","../../../../projects/dataclouder/ngx-cloud-storage/src/lib/components/image-storage-preview/image-storage-preview.ts","../../../../projects/dataclouder/ngx-cloud-storage/src/lib/components/image-storage-preview/image-storage-preview.html","../../../../projects/dataclouder/ngx-cloud-storage/src/lib/components/simple-uploader/simple-uploader.component.ts","../../../../projects/dataclouder/ngx-cloud-storage/src/lib/components/simple-uploader/simple-uploader.component.html","../../../../projects/dataclouder/ngx-cloud-storage/src/lib/services/dc-files-cache.service.ts","../../../../projects/dataclouder/ngx-cloud-storage/src/lib/services/multi-object-storage.service.ts","../../../../projects/dataclouder/ngx-cloud-storage/src/lib/components/assets-loader/assets-loader.ts","../../../../projects/dataclouder/ngx-cloud-storage/src/lib/components/assets-loader/assets-loader.html","../../../../projects/dataclouder/ngx-cloud-storage/src/public-api.ts","../../../../projects/dataclouder/ngx-cloud-storage/src/dataclouder-ngx-cloud-storage.ts"],"sourcesContent":["export interface BasicStorage {\n url: string;\n}\n\nexport interface CloudStorage extends BasicStorage {\n path?: string; // path in the bucket and file name folder/folder2/filename.extension\n bucket?: string; // bucket name\n provider?: string; // Google/Cloudflare\n}\n\nexport interface AudioStorage extends CloudStorage {\n voice?: string;\n transcription?: any;\n}\n\nexport interface FileStorageData extends BasicStorage {\n name?: string; // File name in storage, e.g., 'report.pdf'\n type?: string; // MIME type, e.g., 'application/pdf'\n size?: number; // File size in bytes\n metadata?: any;\n}\n\nexport interface ImgStorageData extends FileStorageData {\n resolution?: string;\n resolutions?: { [key: string]: string };\n}\n\nexport interface ImgGeneratedStorageData extends ImgStorageData {\n model?: string;\n prompt?: string;\n}\n\n// Use as input for uploadImage\nexport interface StorageImageSettings {\n path?: string;\n fileName?: string;\n cropSettings?: ImageCropSettings;\n}\n\nexport interface ImageCropSettings {\n resizeToWidth?: number;\n resolutions: Array<number>; // 400, 800, 1200, 1600\n aspectRatio: AspectType;\n}\n\nexport interface CropImageSettings {\n // Resolutions should be here.\n path: string;\n fileName?: string;\n resizeToWidth?: number;\n}\n\nexport interface ImageMultipleCrops {\n file: File;\n defaultImageBlob?: Blob;\n imagesBlobs: { [resolution: number]: Blob };\n settings: { renameFile: string; width?: number };\n}\n\nexport const AspectRatioOptions: AspectRatioOption[] = [\n {\n value: '1:1',\n label: 'square',\n description: 'Square (1:1)',\n valueRatio: 1 / 1,\n icon: `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"28\" height=\"28\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.7\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"4\" y=\"4\" width=\"16\" height=\"16\" rx=\"2\" /></svg>`,\n resolution: {\n veryLow: { w: 240, h: 240 },\n low: { w: 360, h: 360 },\n sd: { w: 480, h: 480 },\n sdLarge: { w: 540, h: 540 },\n hd: { w: 720, h: 720 },\n fullhd: { w: 1080, h: 1080 },\n '4k': { w: 2160, h: 2160 },\n },\n },\n\n {\n value: '1:2',\n label: 'vertical_1_2',\n description: 'Vertical (1:2)',\n valueRatio: 1 / 2,\n icon: `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"28\" height=\"28\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.7\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"7\" y=\"4\" width=\"9\" height=\"18\" rx=\"2\" /></svg>`,\n resolution: {\n veryLow: { w: 240, h: 480 },\n low: { w: 360, h: 720 },\n sd: { w: 480, h: 960 },\n sdLarge: { w: 540, h: 1080 },\n hd: { w: 720, h: 1440 },\n fullhd: { w: 1080, h: 2160 },\n '4k': { w: 2160, h: 4320 },\n },\n },\n {\n value: '9:16',\n label: 'vertical_9_16',\n description: 'Vertical (9:16)',\n valueRatio: 9 / 16,\n icon: `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"28\" height=\"28\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.7\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"7\" y=\"4\" width=\"9\" height=\"16\" rx=\"2\" /></svg>`,\n resolution: {\n veryLow: { w: 240, h: 427 },\n low: { w: 360, h: 640 },\n sd: { w: 450, h: 800 },\n sdLarge: { w: 540, h: 960 },\n hd: { w: 720, h: 1280 },\n fullhd: { w: 1080, h: 1920 },\n '4k': { w: 2160, h: 3840 },\n },\n },\n {\n value: '2:3',\n label: 'vertical_2_3',\n description: 'Vertical (2:3)',\n valueRatio: 2 / 3,\n icon: `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"28\" height=\"28\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.7\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"6\" y=\"4\" width=\"12\" height=\"18\" rx=\"2\" /></svg>`,\n resolution: {\n veryLow: { w: 240, h: 360 },\n low: { w: 360, h: 540 },\n sd: { w: 480, h: 720 },\n sdLarge: { w: 540, h: 810 },\n hd: { w: 720, h: 1080 },\n fullhd: { w: 1080, h: 1620 },\n '4k': { w: 2160, h: 3240 },\n },\n },\n {\n value: '3:4',\n label: 'vertical_3_4',\n description: 'Vertical (3:4)',\n valueRatio: 3 / 4,\n icon: `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"28\" height=\"28\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.7\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"5\" y=\"4\" width=\"12\" height=\"16\" rx=\"2\" /></svg>`,\n resolution: {\n veryLow: { w: 240, h: 320 },\n low: { w: 360, h: 480 },\n sd: { w: 480, h: 640 },\n sdLarge: { w: 540, h: 720 },\n hd: { w: 720, h: 960 },\n fullhd: { w: 1080, h: 1440 },\n '4k': { w: 2160, h: 2880 },\n },\n },\n {\n value: '4:5',\n label: 'vertical_4_5',\n description: 'Vertical (4:5)',\n valueRatio: 4 / 5,\n icon: `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"28\" height=\"28\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.7\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"4\" y=\"4\" width=\"12\" height=\"15\" rx=\"2\" /></svg>`,\n resolution: {\n veryLow: { w: 240, h: 300 },\n low: { w: 360, h: 450 },\n sd: { w: 480, h: 600 },\n sdLarge: { w: 540, h: 675 },\n hd: { w: 720, h: 900 },\n fullhd: { w: 1080, h: 1350 },\n '4k': { w: 2160, h: 2700 },\n },\n },\n {\n value: '2:1',\n label: 'horizontal_2_1',\n description: 'Horizontal (2:1)',\n valueRatio: 2 / 1,\n icon: `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"28\" height=\"28\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.7\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"3\" y=\"8\" width=\"18\" height=\"9\" rx=\"2\" /></svg>`,\n resolution: {\n veryLow: { w: 480, h: 240 },\n low: { w: 720, h: 360 },\n sd: { w: 960, h: 480 },\n sdLarge: { w: 1080, h: 540 },\n hd: { w: 1440, h: 720 },\n fullhd: { w: 2160, h: 1080 },\n '4k': { w: 4320, h: 2160 },\n },\n },\n {\n value: '16:9',\n label: 'horizontal_16_9',\n description: 'Horizontal (16:9)',\n valueRatio: 16 / 9,\n icon: `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"28\" height=\"28\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.7\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"3\" y=\"7.5\" width=\"18\" height=\"10.125\" rx=\"2\" /></svg>`,\n resolution: {\n veryLow: { w: 240, h: 426 },\n low: { w: 360, h: 640 },\n sd: { w: 468, h: 832 },\n sdLarge: { w: 540, h: 960 },\n hd: { w: 720, h: 1280 },\n fullhd: { w: 1080, h: 1920 },\n '4k': { w: 2160, h: 3840 },\n },\n },\n {\n value: '3:2',\n label: 'horizontal_3_2',\n description: 'Horizontal (3:2)',\n valueRatio: 3 / 2,\n icon: `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"28\" height=\"28\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.7\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"3\" y=\"6\" width=\"18\" height=\"12\" rx=\"2\" /></svg>`,\n resolution: {\n veryLow: { w: 360, h: 240 },\n low: { w: 540, h: 360 },\n sd: { w: 720, h: 480 },\n sdLarge: { w: 810, h: 540 },\n hd: { w: 1080, h: 720 },\n fullhd: { w: 1620, h: 1080 },\n '4k': { w: 3240, h: 2160 },\n },\n },\n {\n value: '4:3',\n label: 'horizontal_4_3',\n description: 'Horizontal (4:3)',\n valueRatio: 4 / 3,\n icon: `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"28\" height=\"28\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.7\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"4\" y=\"6\" width=\"16\" height=\"12\" rx=\"2\" /></svg>`,\n resolution: {\n veryLow: { w: 320, h: 240 },\n low: { w: 480, h: 360 },\n sd: { w: 640, h: 480 },\n sdLarge: { w: 720, h: 540 },\n hd: { w: 960, h: 720 },\n fullhd: { w: 1440, h: 1080 },\n '4k': { w: 2880, h: 2160 },\n },\n },\n {\n value: '5:4',\n label: 'horizontal_5_4',\n description: 'Horizontal (5:4)',\n valueRatio: 5 / 4,\n icon: `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"28\" height=\"28\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.7\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"4\" y=\"5.6\" width=\"16\" height=\"12.8\" rx=\"2\" /></svg>`,\n resolution: {\n veryLow: { w: 300, h: 240 },\n low: { w: 450, h: 360 },\n sd: { w: 600, h: 480 },\n sdLarge: { w: 675, h: 540 },\n hd: { w: 900, h: 720 },\n fullhd: { w: 1350, h: 1080 },\n '4k': { w: 2700, h: 2160 },\n },\n },\n];\n\nexport interface AspectRatioOption {\n label: string;\n description: string;\n value: string;\n valueRatio: number;\n icon: string;\n resolution?: any;\n}\n\nexport enum AspectType {\n Square = 'square',\n Rectangle = 'rectangle',\n Banner = 'banner',\n RectangleLarge = 'rectangleLarge',\n Vertical_9_16 = 'vertical_9_16',\n Vertical_3_5 = 'vertical_3_5',\n Vertical_2_3 = 'vertical_2_3',\n}\n\n// Creo que seria bueno refactorizar para solo enviar aspect ratio asi\nexport enum AspectRatio2 {\n // Vertical\n '9:16' = 16 / 9,\n '3:5' = 3 / 5,\n '5:8' = 5 / 8,\n '2:3' = 2 / 3,\n '1:1' = 1 / 1,\n}\n\nexport enum ResolutionType {\n Small = 200,\n Medium = 400,\n MediumLarge = 800,\n Large = 1200,\n VeryLarge = 1600,\n}\n\nexport const AspectRatio = {\n [AspectType.Square]: 1 / 1,\n [AspectType.Rectangle]: 16 / 9,\n [AspectType.Vertical_9_16]: 9 / 16,\n [AspectType.RectangleLarge]: 16 / 8,\n [AspectType.Banner]: 16 / 7,\n [AspectType.Vertical_3_5]: 3 / 5,\n [AspectType.Vertical_2_3]: 2 / 3,\n};\n\nexport const DEFAULT_SETTINGS: StorageImageSettings = {\n path: '/default-collection/id/please-change-this-subcollection',\n fileName: 'image',\n cropSettings: {\n aspectRatio: AspectType.Square,\n resolutions: [ResolutionType.Small, ResolutionType.MediumLarge],\n resizeToWidth: 450,\n },\n};\n\nconst FIREBASE_STORAGE_URL_REGEX = /https:\\/\\/firebasestorage\\.googleapis\\.com\\/v0\\/b\\/([^/]+)\\/o\\/([^?]+)/;\n\n/**\n * Extracts the bucket name from a Firebase Storage URL.\n * The URL is expected to follow the pattern:\n * 'https://firebasestorage.googleapis.com/v0/b/<bucket>/<path>?<query_params>'\n *\n * @param data The BasicStorage object containing the 'url' property.\n * @returns The bucket name (e.g., 'appingles-pro.appspot.com') or undefined if not found or URL is invalid.\n */\nexport function extractBucket(data: BasicStorage): string | undefined {\n if (!data.url) {\n return undefined;\n }\n const match = data.url.match(FIREBASE_STORAGE_URL_REGEX);\n // match[0] is the full matched string\n // match[1] is the first capturing group (bucket)\n // match[2] is the second capturing group (path)\n return match?.[1];\n}\n\n/**\n * Extracts the file path from a Firebase Storage URL.\n * The URL is expected to follow the pattern:\n * 'https://firebasestorage.googleapis.com/v0/b/<bucket>/<path>?<query_params>'\n * The extracted path is the part after the bucket and before any query parameters.\n *\n * @param data The BasicStorage object containing the 'url' property.\n * @returns The file path (e.g., 'scenarios/666506c3b9b5443f4bfab5e0/images/hairdresser.webp')\n * or undefined if not found or URL is invalid.\n * Note: This function does not perform URL decoding on the path. If URL-decoded paths\n * (e.g., converting %2F to /) are needed, `decodeURIComponent` should be applied to the result.\n */\nexport function extractPath(data: BasicStorage): string | undefined {\n if (data && data?.url) {\n const match = data.url.match(FIREBASE_STORAGE_URL_REGEX);\n // match[0] is the full matched string\n // match[1] is the first capturing group (bucket)\n // match[2] is the second capturing group (path after 'o/')\n if (match && match[2]) {\n try {\n // Decode URI components, e.g., %2F to /\n return decodeURIComponent(match[2]);\n } catch (e) {\n // Log error if decoding fails.\n // Returning the raw path component as a fallback.\n // Consider if undefined or throwing an error would be more appropriate for your use case.\n console.error(`Failed to decode URI component for path: '${match[2]}'`, e);\n return match[2]; // Fallback to raw path component\n }\n }\n return undefined; // URL did not match expected pattern or path component missing\n } else {\n return undefined;\n }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { AngularFireStorage, AngularFireUploadTask } from '@angular/fire/compat/storage';\nimport { getDownloadURL, getStorage, deleteObject, listAll } from '@angular/fire/storage';\n\nimport { ref } from '@angular/fire/storage';\nimport { lastValueFrom } from 'rxjs';\nimport { ImageMultipleCrops, ImgStorageData, FileStorageData } from '../classes/storage.models';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class MultiImagesStorageService {\n private storage = inject(AngularFireStorage);\n\n public async uploadImage(image: Blob, path: string): Promise<ImgStorageData> {\n try {\n const refStorage = this.storage.ref(path);\n const task = await refStorage.put(image);\n const { bucket, name: metadataName, contentType, size } = task.metadata;\n const url = await lastValueFrom(refStorage.getDownloadURL());\n const imageStorage: ImgStorageData = {\n url,\n name: metadataName,\n type: contentType,\n size,\n };\n return imageStorage;\n } catch (error) {\n console.error('uploading image error: ', error);\n return null;\n }\n }\n\n public async delete_directory(imagePath: string): Promise<void> {\n // WARNING!! user very carefully could delete whatever folder\n const storage = getStorage();\n const directoryRef = ref(storage, imagePath);\n\n listAll(directoryRef)\n .then((res) => {\n res.items.forEach((itemRef) => {\n console.log(itemRef);\n deleteObject(itemRef);\n });\n })\n .catch((error) => {\n console.error('error al eliminar imagenes de cloud storage', error);\n });\n }\n\n public async deleteImage(imagePath: string): Promise<void> {\n const storageRef = this.storage.ref(imagePath);\n storageRef.delete().subscribe((res) => {\n console.log('image deleted', res);\n });\n }\n\n public async uploadGenericFile(file: File, storagePath: string, metadata?: any): Promise<FileStorageData | null> {\n try {\n // Ensure storagePath is a directory path, and append file.name\n const fullFilePath = `${storagePath.replace(/\\/$/, '')}/${Date.now()}-${file.name}`;\n const refStorage = this.storage.ref(fullFilePath);\n const task = await refStorage.put(file, { customMetadata: metadata });\n const url = await lastValueFrom(refStorage.getDownloadURL());\n\n const fileData: FileStorageData = {\n url,\n name: file.name,\n type: file.type,\n size: file.size,\n metadata: task.metadata,\n };\n return fileData;\n } catch (error) {\n console.error(`Error uploading file ${file.name} to ${storagePath}:`, error);\n return null;\n }\n }\n}\n","import { Component, OnInit, ViewChild, inject, output, input } from '@angular/core';\nimport { ImageCroppedEvent, ImageCropperComponent, LoadedImage, base64ToFile } from 'ngx-image-cropper';\nimport { Observable } from 'rxjs';\nimport { AspectRatio, AspectType, ImageMultipleCrops, CropImageSettings, ResolutionType } from '../../classes/storage.models';\n\nimport { FormsModule } from '@angular/forms';\nimport { MultiImagesStorageService } from '../../services/multi-images-storage.service';\n\n@Component({\n selector: 'app-cropper',\n templateUrl: './cropper.component.html',\n styleUrls: ['./cropper.component.scss'],\n standalone: true,\n imports: [FormsModule, ImageCropperComponent],\n})\nexport class CropperComponent implements OnInit {\n private multiImagesStorageService = inject(MultiImagesStorageService);\n\n // overrides name, path and resizeToWidth\n readonly imageSettings = input<CropImageSettings>({} as any);\n readonly ratioType = input<AspectType | string>(AspectType.Square);\n readonly resolutions = input<Array<number>>([ResolutionType.MediumLarge]);\n // Outputs\n readonly imageUploaded = output<any>();\n readonly onImageCropped = output<ImageMultipleCrops>();\n readonly onFileSelected = output<any>();\n\n @ViewChild(ImageCropperComponent) imageCropper!: ImageCropperComponent;\n\n public fileMetadata: File | null = null;\n public imageChangedEvent!: Event;\n\n public aspectRatio: number = 1;\n\n public croppedImage: any = '';\n\n public isLoading = false;\n public isUploaded = false;\n public renameFile: any = '';\n public storagePath: string = '';\n public showModal = false;\n\n ngOnInit(): void {\n this.aspectRatio = AspectRatio[this.ratioType()];\n const imageSettings = this.imageSettings();\n if (imageSettings.path) {\n this.storagePath = `${imageSettings.path}/${imageSettings.fileName}.webp`;\n }\n }\n\n public reloadPath(): void {\n this.storagePath = `${this.imageSettings().path}/${this.renameFile}.webp`;\n }\n\n async fileChangeEvent(event: any) {\n this.imageChangedEvent = event;\n const file = event?.target?.files[0];\n if (file) {\n this.fileMetadata = file;\n this.onFileSelected.emit(file);\n this.showModal = true; // Show modal when file is selected\n this.renameFile = this.fileMetadata?.name?.split('.')[0];\n console.log(this.renameFile);\n\n if (!this.imageSettings().fileName) {\n this.reloadPath();\n }\n }\n }\n\n onInnerImageCropped(event: ImageCroppedEvent) {\n this.croppedImage = event.base64;\n }\n\n imageLoaded(image: LoadedImage) {\n // show cropper\n }\n\n loadImageFailed() {\n console.error('fallo al cargar la imagen');\n }\n\n public downloadURL!: Observable<string>;\n\n public async simpleCropAndUpload() {\n const imageCropped: any = await this.imageCropper.crop();\n const imgStorage = await this.multiImagesStorageService.uploadImage(imageCropped?.blob, this.storagePath);\n this.imageUploaded.emit(imgStorage);\n this.closeModal();\n }\n\n closeModal(): void {\n this.showModal = false;\n }\n}\n","<div> path: {{ storagePath }} </div>\n\n<div class=\"options\">\n @if (!isUploaded) {\n <div>\n <input type=\"file\" id=\"file-upload\" class=\"file-input\" (change)=\"fileChangeEvent($event)\" />\n <label for=\"file-upload\" class=\"btn-upload\">Seleccionar archivo</label>\n @if (!fileMetadata) {\n <em>Carga una imagen para comenzar</em>\n }\n </div>\n }\n\n @if (fileMetadata) {\n <span>\n <span style=\"margin: 1px 20px\"> tipo: {{ fileMetadata.type }} </span>\n <span style=\"margin: 1px 20px\"> tamaño {{ fileMetadata.size }} </span>\n <br />\n <input\n [disabled]=\"imageSettings()?.fileName\"\n style=\"margin: 1px 20px; width: 400px\"\n [(ngModel)]=\"renameFile\"\n type=\"text\"\n placeholder=\"Rename File\"\n (ngModelChange)=\"reloadPath()\" />\n <button class=\"btn-crop\" (click)=\"closeModal()\"> Recortar y Subir </button>\n </span>\n }\n</div>\n\n@if (fileMetadata && !isUploaded) {\n <div class=\"modal\" [class.show-modal]=\"showModal\">\n <div class=\"modal-content\">\n <div class=\"modal-header\">\n <h3>Recortar imagen</h3>\n <button class=\"close-button\" (click)=\"closeModal()\">×</button>\n </div>\n <div class=\"modal-body\">\n <h1>Hlloa</h1>\n <image-cropper\n [imageChangedEvent]=\"imageChangedEvent\"\n [maintainAspectRatio]=\"true\"\n [aspectRatio]=\"aspectRatio\"\n format=\"webp\"\n [resizeToWidth]=\"450\"\n (imageCropped)=\"onInnerImageCropped($event)\"\n (loadImageFailed)=\"loadImageFailed()\"\n (imageLoaded)=\"imageLoaded($event)\"\n [autoCrop]=\"false\"></image-cropper>\n <div class=\"modal-footer\">\n <button class=\"btn-crop\" (click)=\"simpleCropAndUpload()\">Recortar y Subir</button>\n </div>\n </div>\n </div>\n </div>\n}\n\n@if (croppedImage && !isUploaded) {\n <button [disabled]=\"isLoading\" nbButton status=\"info\"> upload </button>\n}\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\n\n@Pipe({\n name: 'safeHtml',\n standalone: true,\n})\nexport class SafeHtmlPipe implements PipeTransform {\n constructor(private sanitizer: DomSanitizer) {}\n\n transform(value: string): SafeHtml {\n return this.sanitizer.bypassSecurityTrustHtml(value);\n }\n}\n","import { Component, Input, OnInit, ViewChild, ChangeDetectorRef, inject, output, input } from '@angular/core';\n\nimport { FormsModule } from '@angular/forms';\n\nimport { DialogModule } from 'primeng/dialog';\n\nimport { ImageCroppedEvent, ImageCropperComponent, LoadedImage } from 'ngx-image-cropper';\nimport { Observable } from 'rxjs';\n\nimport { MultiImagesStorageService } from '../../services/multi-images-storage.service';\nimport {\n AspectRatio,\n AspectType,\n ImageMultipleCrops,\n StorageImageSettings,\n ImgStorageData,\n AspectRatioOptions,\n AspectRatioOption,\n DEFAULT_SETTINGS,\n extractPath,\n} from '../../classes/storage.models';\nimport { TooltipModule } from 'primeng/tooltip';\n\nimport { ButtonModule } from 'primeng/button';\nimport { MessageModule } from 'primeng/message';\nimport { SelectModule } from 'primeng/select';\nimport { InputTextModule } from 'primeng/inputtext';\nimport { MoodStateOptions } from '@dataclouder/ngx-core';\nimport { SafeHtmlPipe } from '../../pipes/safe-html.pipe';\n\n@Component({\n selector: 'dc-cropper-modal',\n templateUrl: './cropper-modal.component.html',\n styleUrls: ['./cropper-modal.component.scss'],\n standalone: true,\n imports: [FormsModule, ImageCropperComponent, ButtonModule, DialogModule, TooltipModule, MessageModule, SelectModule, InputTextModule, SafeHtmlPipe],\n})\nexport class CropperComponentModal implements OnInit {\n private multiImagesStorageService = inject(MultiImagesStorageService);\n private changeDetectorRef = inject(ChangeDetectorRef);\n\n // overrides name, path and resizeToWidth\n\n readonly imgStorageSettings = input<StorageImageSettings>(DEFAULT_SETTINGS);\n readonly buttonLabel = input<string>('Seleccionar archivo');\n @Input() currentStorage: ImgStorageData = {} as any;\n\n readonly imageUploaded = output<ImgStorageData>();\n readonly onImageCropped = output<ImageMultipleCrops>();\n readonly onFileSelected = output<any>();\n\n @ViewChild(ImageCropperComponent) imageCropper!: ImageCropperComponent;\n\n public aspectRatioOptions = AspectRatioOptions;\n public MoodStateOptions = MoodStateOptions;\n public fileMetadata: File | null = null;\n public imageChangedEvent!: Event;\n public displayDialog = false;\n public aspectRatioValue: number = 1;\n public croppedImage: any = '';\n public renameFile: any = '';\n public storagePath: string = '';\n public downloadURL!: Observable<string>;\n public resizeToWidth: number = 450;\n public ratioSelected: any = null;\n public emotionSelected: string | null = null;\n\n // Add a unique identifier for the file input\n public fileInputId: string;\n\n constructor() {\n // Generate random ID for file input\n this.fileInputId = `file-upload-${Math.random().toString(36).substring(2, 11)}`;\n }\n\n ngOnInit(): void {\n if (!this.imgStorageSettings().path) {\n console.warn('⚠️ Remember to set imgStorageSettings, path and fileName are required , path example: /collection/id/subcollection ');\n }\n\n this.reloadPath();\n }\n\n public reloadPath(): void {\n const randomCharacters = Math.random().toString(36).substring(2, 15);\n const fileName = this.imgStorageSettings().fileName || 'img';\n this.storagePath = `${this.imgStorageSettings().path}/${fileName}-${randomCharacters}.webp`;\n }\n\n private setSettingsForComponent(): void {\n const imgStorageSettings = this.imgStorageSettings();\n console.log('setSettingsForComponent', imgStorageSettings);\n // TODO: remove all the imageSettings and keep only imgStorageSettings\n\n this.aspectRatioValue = imgStorageSettings?.cropSettings?.aspectRatio\n ? AspectRatio[imgStorageSettings?.cropSettings?.aspectRatio]\n : AspectRatio[AspectType.Square];\n\n if (imgStorageSettings?.path) {\n this.storagePath = `${imgStorageSettings.path}/${imgStorageSettings.fileName}.webp`;\n } else if (imgStorageSettings.path) {\n this.storagePath = `${imgStorageSettings.path}/${imgStorageSettings.fileName}.webp`;\n }\n if (imgStorageSettings?.cropSettings?.resizeToWidth) {\n this.resizeToWidth = imgStorageSettings.cropSettings.resizeToWidth;\n } else if (imgStorageSettings.cropSettings.resizeToWidth) {\n this.resizeToWidth = imgStorageSettings.cropSettings.resizeToWidth;\n }\n if (imgStorageSettings?.fileName) {\n this.renameFile = imgStorageSettings.fileName;\n } else if (imgStorageSettings.fileName) {\n this.renameFile = imgStorageSettings.fileName;\n }\n }\n\n async fileChangeEvent(event: any) {\n this.setSettingsForComponent();\n\n console.log(this.fileInputId);\n\n this.imageChangedEvent = event;\n const file = event?.target?.files[0];\n if (file) {\n this.fileMetadata = file;\n this.onFileSelected.emit(file);\n this.renameFile = this.fileMetadata?.name\n ?.split('.')[0]\n .replace(/[^a-zA-Z0-9]/g, '')\n .slice(0, 80);\n\n console.log(this.renameFile);\n\n if (!this.imgStorageSettings().fileName) {\n this.reloadPath();\n }\n this.displayDialog = true;\n this.changeDetectorRef.detectChanges();\n }\n }\n\n onInnerImageCropped(event: ImageCroppedEvent) {\n this.croppedImage = event.base64;\n }\n\n imageLoaded(image: LoadedImage) {\n this.changeDetectorRef.detectChanges();\n }\n\n cropperReady() {\n this.changeDetectorRef.detectChanges();\n }\n\n loadImageFailed() {\n console.error('fallo al cargar la imagen');\n }\n\n public async simpleCropAndUpload() {\n console.log(this.fileInputId);\n\n console.log('simpleCropAndUpload');\n const imageCropped: any = await this.imageCropper.crop();\n const imgStorage = await this.multiImagesStorageService.uploadImage(imageCropped?.blob, this.storagePath);\n\n const path = extractPath(this.currentStorage);\n\n if (path) {\n console.warn('deleting current Image', path);\n\n this.multiImagesStorageService.deleteImage(path);\n }\n console.log('imgStorage', imgStorage);\n this.imageUploaded.emit({ ...imgStorage, metadata: this.emotionSelected });\n this.displayDialog = false;\n this.changeDetectorRef.detectChanges();\n }\n\n public changeRatio(event: AspectRatioOption) {\n console.log('changeRatio', event);\n // this.imgStorageSettings.cropSettings.aspectRatio = event.valueRatio;\n this.aspectRatioValue = event.valueRatio;\n this.changeDetectorRef.detectChanges();\n }\n\n public addEmotion(event: string) {\n // Will only log for now\n console.log('addEmotion', event);\n this.emotionSelected = event;\n }\n}\n","<div class=\"upload-section\">\n <input type=\"file\" [id]=\"fileInputId\" class=\"file-input\" (change)=\"fileChangeEvent($event)\" />\n <label pButton [for]=\"fileInputId\" [pTooltip]=\"storagePath\" class=\"upload-button\">\n {{ buttonLabel() }}\n </label>\n</div>\n@if(displayDialog) {\n<!-- Cropper Dialog -->\n\n<p-dialog header=\"Recortar imagen\" [(visible)]=\"displayDialog\" [modal]=\"true\" [draggable]=\"false\" [resizable]=\"false\" styleClass=\"cropper-dialog\">\n <!-- Image Settings Section -->\n <div class=\"settings-section\">\n @if(!imgStorageSettings().path) {\n <p-message severity=\"warn\">Developer Note: make sure you have a path to save the image pass object imgStorageSettings</p-message>\n } @if(currentStorage?.url) {\n\n <p-message severity=\"warn\" variant=\"outlined\">\n <div>\n <span class=\"setting-label\">Image will be replaced:</span>\n <img width=\"100\" height=\"Auto\" [src]=\"currentStorage?.url\" />\n </div>\n </p-message>\n\n }\n\n <p-message>\n <b>Estas opciones estan preconfiguradas y no se pueden cambiar</b>\n\n <ul>\n <li> <b>Path to save:</b> {{ storagePath }}< </li>\n <li>\n <b>Resoluciones:</b>\n <span>{{ imgStorageSettings()?.cropSettings?.resolutions }}</span>\n </li>\n </ul>\n </p-message>\n\n <div class=\"setting-item\">\n <span class=\"setting-label\">Aspecto:</span>\n <p class=\"setting-value\">{{ imgStorageSettings()?.cropSettings?.aspectRatio }}</p>\n </div>\n\n <p-select\n [options]=\"aspectRatioOptions\"\n [ngModel]=\"ratioSelected\"\n (ngModelChange)=\"changeRatio($event)\"\n optionLabel=\"description\"\n placeholder=\"Select a ratio\">\n <ng-template pTemplate=\"selectedItem\" let-selectedOption>\n @if(selectedOption) {\n <div class=\"flex items-center gap-2\">\n <div [innerHTML]=\"selectedOption.icon | safeHtml\"></div>\n <div>{{ selectedOption.description }}</div>\n </div>\n }\n </ng-template>\n <ng-template let-ratio pTemplate=\"item\">\n <div class=\"flex items-center gap-2\">\n <div [innerHTML]=\"ratio.icon | safeHtml\"></div>\n <div>{{ ratio.description }}</div>\n </div>\n </ng-template>\n </p-select>\n\n <!-- File Metadata Section -->\n @if (fileMetadata) {\n <div class=\"metadata-section\">\n <span class=\"metadata-item\">tipo: {{ fileMetadata.type }}</span>\n <span class=\"metadata-item\">tamaño: {{ fileMetadata.size }}</span>\n </div>\n }\n\n <!-- Rename Input -->\n <input\n pInputText\n [disabled]=\"imgStorageSettings()?.fileName\"\n [(ngModel)]=\"renameFile\"\n type=\"text\"\n placeholder=\"Rename File\"\n (ngModelChange)=\"reloadPath()\"\n class=\"rename-input\" />\n\n <h5>Datos adicionales</h5>\n\n <p-select\n [options]=\"MoodStateOptions\"\n [(ngModel)]=\"emotionSelected\"\n (ngModelChange)=\"addEmotion($event)\"\n optionLabel=\"label\"\n optionValue=\"value\"\n placeholder=\"Select an emotion\" />\n </div>\n\n <!-- Image Cropper -->\n\n <div class=\"cropper-container-father\">\n <image-cropper\n [imageChangedEvent]=\"imageChangedEvent\"\n [maintainAspectRatio]=\"true\"\n [aspectRatio]=\"aspectRatioValue\"\n format=\"webp\"\n [resizeToWidth]=\"resizeToWidth\"\n (imageCropped)=\"onInnerImageCropped($event)\"\n (loadImageFailed)=\"loadImageFailed()\"\n (cropperReady)=\"cropperReady()\"\n [autoCrop]=\"false\">\n </image-cropper>\n </div>\n <!-- Dialog Footer -->\n <ng-template pTemplate=\"footer\">\n <div class=\"dialog-footer\">\n <button pButton class=\"p-button-primary\" (click)=\"simpleCropAndUpload()\"> Recortar y Subir </button>\n </div>\n </ng-template>\n</p-dialog>\n}\n","import { Component, OnInit, OnDestroy, inject, output } from '@angular/core';\nimport { AngularFireStorage } from '@angular/fire/compat/storage';\nimport { getStorage, ref, listAll, getDownloadURL } from '@angular/fire/storage';\nimport { BehaviorSubject, Subscription } from 'rxjs';\nimport { AspectType, ImgStorageData, ResolutionType, StorageImageSettings } from '../../classes/storage.models';\nimport { AsyncPipe } from '@angular/common';\nimport { CropperComponentModal } from '../cropper-modal/cropper-modal.component';\n\n@Component({\n selector: 'dc-image-storage-preview',\n templateUrl: './image-storage-preview.html',\n styleUrls: ['./image-storage-preview.css'],\n standalone: true,\n imports: [AsyncPipe, CropperComponentModal],\n})\nexport class ImageStoragePreviewComponent implements OnInit, OnDestroy {\n private storage = inject(AngularFireStorage);\n\n readonly imageSelected = output<ImgStorageData>();\n public images$ = new BehaviorSubject<ImgStorageData[]>([]);\n public loading$ = new BehaviorSubject<boolean>(false);\n public error$ = new BehaviorSubject<string | null>(null);\n\n public readonly storagePath = '/images/resources';\n private subscriptions: Subscription[] = [];\n\n /** Inserted by Angular inject() migration for backwards compatibility */\n constructor(...args: unknown[]);\n\n constructor() {}\n\n ngOnInit(): void {\n this.loadImagesFromStorage();\n }\n\n public imgStorageSettings: StorageImageSettings = {\n path: this.storagePath,\n cropSettings: {\n aspectRatio: AspectType.Square,\n resolutions: [ResolutionType.Small],\n },\n };\n\n ngOnDestroy(): void {\n this.subscriptions.forEach((sub) => sub.unsubscribe());\n }\n\n /**\n * Loads images from Firebase Storage at the specified path\n */\n private async loadImagesFromStorage(): Promise<void> {\n try {\n this.loading$.next(true);\n this.error$.next(null);\n\n const storage = getStorage();\n const storageRef = ref(storage, this.storagePath);\n\n const result = await listAll(storageRef);\n\n if (result.items.length === 0) {\n this.images$.next([]);\n this.loading$.next(false);\n return;\n }\n\n const imagePromises = result.items.map(async (itemRef) => {\n try {\n const url = await getDownloadURL(itemRef);\n const image: ImgStorageData = {\n url,\n // fullPath: itemRef.fullPath,\n name: itemRef.name,\n };\n return image;\n } catch (error) {\n console.error(`Error getting download URL for ${itemRef.fullPath}:`, error);\n return null;\n }\n });\n\n const images = (await Promise.all(imagePromises)).filter((img) => img !== null) as ImgStorageData[];\n this.images$.next(images);\n } catch (error) {\n console.error('Error loading images from storage:', error);\n this.error$.next('Failed to load images from storage. Please try again later.');\n } finally {\n this.loading$.next(false);\n }\n }\n\n /**\n * Refreshes the image list\n */\n public refreshImages(): void {\n this.loadImagesFromStorage();\n }\n\n public selectImage(image: ImgStorageData): void {\n this.imageSelected.emit(image);\n }\n}\n","<div class=\"image-storage-preview-container\">\n <div class=\"header\">\n <h2>Storage Images</h2>\n <button class=\"refresh-btn\" (click)=\"refreshImages()\" [disabled]=\"loading$ | async\">\n @if (!(loading$ | async)) {\n <span>Refresh</span>\n }\n @if (loading$ | async) {\n <span>Loading...</span>\n }\n </button>\n </div>\n\n @if (loading$ | async) {\n <div class=\"loading-container\">\n <div class=\"spinner\"></div>\n <p>Loading images...</p>\n </div>\n }\n\n @if (error$ | async) {\n <div class=\"error-container\">\n <p class=\"error-message\">{{ error$ | async }}</p>\n <button (click)=\"refreshImages()\">Try Again</button>\n </div>\n }\n\n @if (!(loading$ | async) && !(error$ | async)) {\n <div class=\"images-grid\">\n @if ((images$ | async)?.length) {\n @for (image of images$ | async; track image) {\n <div class=\"image-card\">\n <div class=\"image-container\">\n <img [src]=\"image.url\" [alt]=\"image.name || 'Storage image'\" loading=\"lazy\" />\n </div>\n <div class=\"image-info\">\n <p class=\"image-name\" [title]=\"image.name\">{{ image.name }}</p>\n <div class=\"image-actions\">\n <a [href]=\"image.url\" target=\"_blank\" class=\"action-btn\">View</a>\n <button (click)=\"selectImage(image)\" class=\"action-btn\">Select</button>\n </div>\n </div>\n </div>\n }\n } @else {\n <div class=\"no-images\">\n <p>No images found in the storage path: {{ storagePath }}</p>\n </div>\n }\n <dc-cropper-modal [imgStorageSettings]=\"imgStorageSettings\"></dc-cropper-modal>\n </div>\n }\n</div>\n","import { Component, inject, input, output, signal } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { ButtonModule } from 'primeng/button';\nimport { MultiImagesStorageService } from '../../services/multi-images-storage.service';\nimport { FileStorageData } from '../../classes/storage.models';\nimport { TooltipModule } from 'primeng/tooltip';\nimport { DialogModule } from 'primeng/dialog';\nimport { InputTextModule } from 'primeng/inputtext';\nimport { SelectModule } from 'primeng/select';\nimport { CharacterEventActions, MoodStateOptions } from '@dataclouder/ngx-core';\n\n@Component({\n selector: 'dc-simple-uploader',\n templateUrl: './simple-uploader.component.html',\n styleUrls: ['./simple-uploader.component.scss'],\n standalone: true,\n imports: [CommonModule, FormsModule, ButtonModule, TooltipModule, DialogModule, InputTextModule, SelectModule],\n})\nexport class SimpleUploaderComponent {\n private multiImagesStorageService = inject(MultiImagesStorageService);\n\n storagePath = input.required<string>();\n buttonLabel = input<string>('Upload File');\n accept = input<string>('*/*');\n disabled = input<boolean>(false);\n metadata = input<any>({});\n\n fileUploaded = output<FileStorageData>();\n uploadError = output<any>();\n\n isLoading = signal(false);\n displayDialog = signal(false);\n fileSelected = signal<File | null>(null);\n moodSelected = signal<string | null>(null);\n eventSelected = signal<string | null>(null);\n fileInputId: string;\n metadataInput: any = {};\n public MoodStateOptions = MoodStateOptions;\n public CharacterEventActions = CharacterEventActions;\n\n constructor() {\n this.fileInputId = `file-upload-${Math.random().toString(36).substring(2, 11)}`;\n }\n\n objectKeys(obj: any): string[] {\n return Object.keys(obj);\n }\n\n openDialog(): void {\n this.metadataInput = { ...this.metadata() };\n this.displayDialog.set(true);\n }\n\n triggerFileInputClick(fileInput: HTMLInputElement): void {\n fileInput.click();\n }\n\n onFileSelected(event: Event): void {\n const fileInput = event.target as HTMLInputElement;\n const file = fileInput.files?.[0];\n if (file) {\n this.fileSelected.set(file);\n }\n }\n\n async uploadFile(): Promise<void> {\n const file = this.fileSelected();\n if (file) {\n this.isLoading.set(true);\n const metadata = {\n // ...this.metadataInput,\n moodState: this.moodSelected(),\n event: this.eventSelected(),\n };\n try {\n const result = await this.multiImagesStorageService.uploadGenericFile(file, this.storagePath(), metadata);\n result.metadata = metadata;\n if (result) {\n this.fileUploaded.emit(result);\n } else {\n this.uploadError.emit({ error: 'Upload failed and no specific error was provided by the service.' });\n }\n } catch (error) {\n console.error('Error during file upload in SimpleUploaderComponent:', error);\n this.uploadError.emit(error);\n } finally {\n this.isLoading.set(false);\n this.displayDialog.set(false);\n this.fileSelected.set(null);\n this.moodSelected.set(null);\n this.eventSelected.set(null);\n }\n }\n }\n}\n","<p-button\n size=\"large\"\n [label]=\"buttonLabel()\"\n (click)=\"openDialog()\"\n [loading]=\"isLoading()\"\n [disabled]=\"disabled() || isLoading()\"\n pTooltip=\"Upload a file with metadata\"></p-button>\n\n@if(displayDialog()){\n<p-dialog\n header=\"Upload File\"\n [(visible)]=\"displayDialog\"\n [modal]=\"true\"\n [draggable]=\"false\"\n [resizable]=\"false\"\n [contentStyle]=\"{ width: '50vw', height: '50vh' }\">\n <div class=\"upload-dialog\">\n @if(!fileSelected()){\n <div class=\"file-input-container\">\n <input #fileInput type=\"file\" [id]=\"fileInputId\" (change)=\"onFileSelected($event)\" [accept]=\"accept()\" style=\"display: none\" />\n <p-button label=\"Select File\" (click)=\"triggerFileInputClick(fileInput)\"></p-button>\n </div>\n } @else {\n <div class=\"file-details\">\n <p>File: {{ fileSelected()?.name }}</p>\n <p>Size: {{ fileSelected()?.size }} bytes</p>\n </div>\n\n <div class=\"metadata-container\">\n <h5>Metadata</h5>\n <div class=\"p-fluid\">\n @for (key of objectKeys(metadata()); track key) {\n <div class=\"p-field\">\n <label [for]=\"key\">{{ key }}</label>\n <input pInputText [id]=\"key\" [(ngModel)]=\"metadataInput[key]\" />\n </div>\n }\n\n <div class=\"p-field\">\n <label for=\"emotion\">Emotion</label>\n <br />\n <p-select [options]=\"MoodStateOptions\" [(ngModel)]=\"moodSelected\" optionLabel=\"label\" optionValue=\"value\" placeholder=\"Select an emotion\"></p-select>\n </div>\n <div class=\"p-field\">\n <label for=\"emotion\">Event</label>\n <br />\n <p-select\n [options]=\"CharacterEventActions\"\n [(ngModel)]=\"eventSelected\"\n optionLabel=\"label\"\n optionValue=\"value\"\n placeholder=\"Select an event\"></p-select>\n </div>\n </div>\n </div>\n }\n </div>\n\n <ng-template pTemplate=\"footer\">\n <div class=\"dialog-footer\">\n <p-button label=\"Cancel\" styleClass=\"p-button-secondary\" (click)=\"displayDialog.set(false)\"></p-button>\n <p-button label=\"Upload\" (click)=\"uploadFile()\" [disabled]=\"!fileSelected() || isLoading()\"></p-button>\n </div>\n </ng-template>\n</p-dialog>\n}\n","import { Injectable, inject } from '@angular/core';\nimport { getDownloadURL, ref, Storage } from '@angular/fire/storage';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class DCFilesCacheService {\n private storage = inject(Storage);\n\n public files: { [key: string]: string } = {};\n\n public async getURLSrcFile(path: string): Promise<string> {\n if (path in this.files) {\n return this.files[path];\n } else {\n const url = await getDownloadURL(ref(this.storage, path));\n const localUrl = await this.donwloadFileAndGetLocalURL(url);\n this.files[path] = localUrl;\n return localUrl;\n }\n }\n\n public getBlob(url: string): Promise<Blob> {\n return new Promise((resolve, reject) => {\n const xhr = new XMLHttpRequest();\n xhr.responseType = 'blob';\n xhr.overrideMimeType('audio/mp3');\n\n xhr.onload = (event) => {\n var blob = xhr.response;\n resolve(blob);\n };\n xhr.onerror = (event) => {\n reject(event);\n };\n\n xhr.open('GET', url);\n xhr.send();\n });\n }\n\n public async donwloadFileAndGetLocalURL(url: string) {\n const blob = await this.getBlob(url);\n\n return URL.createObjectURL(blob);\n }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { AngularFireStorage, AngularFireUploadTask } from '@angular/fire/compat/storage';\nimport { getDownloadURL, getStorage, deleteObject, listAll, StorageReference, ref } from '@angular/fire/storage';\nimport { lastValueFrom } from 'rxjs';\n\n/**\n * Represents the metadata of an object stored in Firebase Storage.\n */\nexport interface ObjectStorageData {\n /** The download URL of the stored object. */\n url: string;\n /** The full path of the object in the storage bucket (e.g., 'folder/subfolder/file.txt'). */\n path: string;\n /** The name of the Firebase Storage bucket where the object is stored. */\n bucket: string;\n /** The name of the object file (e.g., 'file.txt'). */\n name?: string;\n}\n\n@Injectable({\n providedIn: 'root',\n})\nexport class MultiObjectStorageService {\n private storage = inject(AngularFireStorage);\n\n /**\n * Uploads a Blob or File object to a specified path in Firebase Storage.\n * @param objectToUpload The Blob or File to upload.\n * @param path The desired storage path (e.g., 'documents/report.pdf').\n * @returns A promise that resolves with the storage metadata of the uploaded object.\n * @throws Throws an error if the upload fails.\n */\n public async uploadObject(objectToUpload: Blob | File, path: string): Promise<ObjectStorageData> {\n try {\n const refStorage = this.storage.ref(path);\n const task = await refStorage.put(objectToUpload);\n const { fullPath, bucket, name } = task.metadata;\n const url = await lastValueFrom(refStorage.getDownloadURL());\n const storageData: ObjectStorageData = { url, path: fullPath, bucket, name };\n return storageData;\n } catch (error) {\n console.error(`Error uploading object to path \"${path}\": `, error);\n // Re-throw the error to allow calling code to handle it\n throw error;\n }\n }\n\n /**\n * Deletes all objects within a specified directory path in Firebase Storage.\n * WARNING: Use with extreme caution as this will permanently delete all files in the directory.\n * @param directoryPath The path to the directory to delete (e.g., 'users/userId/files/').\n * @returns A promise that resolves when the deletion attempt is complete.\n */\n public async deleteDirectory(directoryPath: string): Promise<void> {\n const storage = getStorage();\n const directoryRef = ref(storage, directoryPath);\n\n try {\n const res = await listAll(directoryRef);\n const deletePromises: Promise<void>[] = [];\n res.items.forEach((itemRef: StorageReference) => {\n console.log(`Deleting object: ${itemRef.fullPath}`);\n deletePromises.push(deleteObject(itemRef));\n });\n // You might want to handle potential errors during individual deletions if needed\n await Promise.all(deletePromises);\n console.log(`Successfully deleted objects in directory: ${directoryPath}`);\n } catch (error) {\n console.error(`Error deleting objects in directory \"${directoryPath}\":`, error);\n // Optionally re-throw or handle the error appropriately\n throw error;\n }\n }\n\n /**\n * Deletes a single object from Firebase Storage based on its full path.\n * @param objectPath The full path of the object to delete (e.g., 'images/profile.jpg').\n * @returns A promise that resolves when the deletion is complete.\n */\n public async deleteObjectByPath(objectPath: string): Promise<void> {\n const storageRef = this.storage.ref(objectPath);\n try {\n await lastValueFrom(storageRef.delete());\n console.log(`Object deleted successfully: ${objectPath}`);\n } catch (error) {\n console.error(`Error deleting object at path \"${objectPath}\":`, error);\n // Optionally re-throw or handle the error appropriately\n throw error;\n }\n }\n\n /**\n * Private helper to get metadata after an upload task completes.\n * @param task The AngularFireUploadTask.\n * @returns A promise resolving with the object's storage metadata.\n */\n private async uploadAndGetObjectMetadata(task: AngularFireUploadTask): Promise<ObjectStorageData> {\n const snap = await task;\n const { fullPath, bucket, name } = snap.metadata;\n const storage = getStorage();\n const storageRef = ref(storage, fullPath);\n const url = await getDownloadURL(storageRef);\n const meta: ObjectStorageData = {\n url,\n path: fullPath, // Use fullPath for the 'path' property\n bucket,\n name,\n };\n return meta;\n }\n}\n","import { Component, input, output, computed, inject, OnDestroy } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { IAssetable } from '../../models/assetable.model';\nimport { AspectType, ResolutionType, StorageImageSettings, BasicStorage, extractPath } from '../../classes/storage.models';\nimport { CropperComponentModal } from '../cropper-modal/cropper-modal.component';\nimport { MultiImagesStorageService } from '../../services/multi-images-storage.service';\nimport { SimpleUploaderComponent } from '../simple-uploader/simple-uploader.component';\nimport { ButtonModule } from 'primeng/button';\nimport { MessageModule } from 'primeng/message';\nimport { TagModule } from 'primeng/tag';\n\n@Component({\n selector: 'assets-loader',\n templateUrl: './assets-loader.html',\n styleUrls: ['./assets-loader.scss'],\n standalone: true,\n imports: [CommonModule, CropperComponentModal, SimpleUploaderComponent, ButtonModule, MessageModule, TagModule],\n})\nexport class AssetsLoaderComponent implements OnDestroy {\n assets = input.required<IAssetable>();\n storagePath = input.required<string>();\n assetsChange = output<IAssetable>();\n assetUpdate = output<{ assets: Partial<IAssetable> }>();\n onFileSelected = output<File>();\n\n private storageService = inject(MultiImagesStorageService);\n private reverseInterval: any;\n\n public bannerImgSettings = computed<StorageImageSettings>(() => ({\n path: this.storagePath(),\n fileName: undefined,\n cropSettings: { aspectRatio: AspectType.Rectangle, resolutions: [ResolutionType.MediumLarge], resizeToWidth: 850 },\n }));\n\n public imageStorageSettings = computed<StorageImageSettings>(() => ({\n path: this.storagePath(),\n fileName: undefined,\n cropSettings: { aspectRatio: AspectType.Vertical_2_3, resolutions: [ResolutionType.MediumLarge], resizeToWidth: 500 },\n }));\n\n public stickerStorageSettings = computed<StorageImageSettings>(() => ({\n path: `${this.storagePath()}/stickers`,\n fileName: undefined,\n cropSettings: { aspectRatio: AspectType.Square, resolutions: [ResolutionType.MediumLarge], resizeToWidth: 400 },\n }));\n\n public onImageUploaded(event: BasicStorage, type: 'image' | 'banner' | 'sticker' = 'image') {\n const currentAssets = this.assets() ?? { image: null, banner: null, stickers: [] };\n let updatedField: Partial<IAssetable>;\n\n switch (type) {\n case 'image':\n updatedField = { image: event };\n break;\n case 'banner':\n updatedField = { banner: event };\n break;\n case 'sticker':\n updatedField = { stickers: [...(currentAssets.stickers || []), event] };\n break;\n }\n\n const newAssets = { ...currentAssets, ...updatedField };\n this.assetUpdate.emit({ assets: updatedField });\n this.assetsChange.emit(newAssets);\n }\n\n public onMotionUploaded(event: BasicStorage) {\n if (!event.url) return;\n\n const currentMotionUrl = this.assets()?.motion?.url;\n if (currentMotionUrl) {\n this.storageService.deleteImage(currentMotionUrl);\n }\n\n const updatedField = { motion: { url: event.url } };\n const newAssets = { ...this.assets(), ...updatedField };\n\n // Emit only the update field\n this.assetUpdate.emit({ assets: updatedField });\n // Assets Changes emit the new object\n this.assetsChange.emit(newAssets);\n }\n\n public onMotionAdded(event: BasicStorage) {\n const currentAssets = this.assets() ?? { motions: [] };\n const updatedField = { motions: [...(currentAssets.motions || []), event] };\n const newAssets = { ...currentAssets, ...updatedField };\n this.assetUpdate.emit({ assets: updatedField });\n this.assetsChange.emit(newAssets);\n }\n\n public removeSticker(sticker: BasicStorage) {\n const path = extractPath(sticker);\n if (path) {\n this.storageService.deleteImage(path);\n }\n\n const currentStickers = this.assets()?.stickers ?? [];\n const updatedStickers = currentStickers.filter((s) => s.url !== sticker.url);\n const updatedField = { stickers: updatedStickers };\n const newAssets = { ...this.assets(), ...updatedField };\n\n this.assetUpdate.emit({ assets: updatedField });\n this.assetsChange.emit(newAssets);\n }\n\n public removeMotion(motion: BasicStorage) {\n const path = extractPath(motion);\n if (path) {\n this.storageService.deleteImage(path);\n }\n\n const currentMotions = this.assets()?.motions ?? [];\n const updatedMotions = currentMotions.filter((m) => m.url !== motion.url);\n const updatedField = { motions: updatedMotions };\n const newAssets = { ...this.assets(), ...updatedField };\n\n this.assetUpdate.emit({ assets: updatedField });\n this.assetsChange.emit(newAssets);\n }\n\n public removeMainMotion() {\n const motionToRemove = this.assets()?.motion;\n if (motionToRemove?.url) {\n const path = extractPath(motionToRemove);\n if (path) {\n this.storageService.deleteImage(path);\n }\n\n const updatedField = { motion: null };\n const newAssets = { ...this.assets(), motion: null };\n\n this.assetUpdate.emit({ assets: updatedField });\n this.assetsChange.emit(newAssets);\n }\n }\n\n public onVideoEnded(video: HTMLVideoElement) {\n video.pause();\n this.reverseInterval = setInterval(() => {\n if (video.currentTime <= 0) {\n clearInterval(this.reverseInterval);\n video.play();\n } else {\n video.currentTime -= 0.03;\n }\n }, 30);\n }\n\n ngOnDestroy() {\n if (this.reverseInterval) {\n clearInterval(this.reverseInterval);\n }\n }\n}\n","<div class=\"assets-container\">\n <div class=\"assets-card\">\n <p-message severity=\"info\">\n <div class=\"upload-buttons\">\n <div>\n <dc-cropper-modal\n id=\"cropperCardImage\"\n #cropperCardImage\n [buttonLabel]=\"assets()?.image?.url ? 'Cambiar imagen' : 'Cargar una imagen'\"\n [imgStorageSettings]=\"imageStorageSettings()\"\n [currentStorage]=\"assets()?.image\"\n (imageUploaded)=\"onImageUploaded($event, 'image')\"\n (onFileSelected)=\"onFileSelected.emit($event)\"></dc-cropper-modal>\n </div>\n\n <dc-simple-uploader\n [buttonLabel]=\"assets()?.motion?.url ? 'Cambiar video principal' : 'Agregar video principal'\"\n (fileUploaded)=\"onMotionUploaded($event)\"\n [storagePath]=\"storagePath() + '/motions/file'\"\n [accept]=\"'video/*'\"></dc-simple-uploader>\n\n <dc-simple-uploader\n [buttonLabel]=\"'Agregar Movimientos'\"\n (fileUploaded)=\"onMotionAdded($event)\"\n [storagePath]=\"storagePath() + '/motions/file'\"\n [accept]=\"'video/*'\"></dc-simple-uploader>\n\n <dc-cropper-modal\n #cropperBanner\n id=\"cropperBanner\"\n [buttonLabel]=\"assets()?.banner?.url ? 'Cambiar el banner' : 'Cargar un banner'\"\n [imgStorageSettings]=\"bannerImgSettings()\"\n [currentStorage]=\"assets()?.banner\"\n (imageUploaded)=\"onImageUploaded($event, 'banner')\"></dc-cropper-modal>\n\n <dc-cropper-modal\n id=\"cropperStickers\"\n #cropperStickers\n [buttonLabel]=\"'Agregar sticker'\"\n [imgStorageSettings]=\"stickerStorageSettings()\"\n (imageUploaded)=\"onImageUploaded($event, 'sticker')\"></dc-cropper-modal>\n </div>\n </p-message>\n <!-- Banner -->\n\n <div class=\"preview-container\">\n <img [src]=\"assets()?.banner?.url || 'assets/defaults/images/default_banner.webp'\" class=\"main-banner-image-card\" />\n <div class=\"main-image-card\">\n <img [src]=\"assets()?.image?.url || 'assets/defaults/images/default_2_3.webp'\" />\n </div>\n\n <div class=\"motion-container\">\n <video #videoPlayer class=\"main-motion-card\" [src]=\"assets()?.motion?.url\" (ended)=\"onVideoEnded(videoPlayer)\" autoplay muted playsinline></video>\n @if(assets()?.motion?.url){\n <p-button class=\"remove-main-motion-button\" (click)=\"removeMainMotion()\" [rounded]=\"true\" [text]=\"true\" icon=\"pi pi-trash\" severity=\"danger\"></p-button>\n }\n </div>\n </div>\n\n <div class=\"stickers-container\">\n @for (sticker of assets()?.stickers; track sticker.url) {\n <div class=\"sticker-wrapper\">\n <img width=\"100\" [src]=\"sticker.url\" alt=\"\" />\n <p-button (click)=\"removeSticker(sticker)\" class=\"remove-sticker\" icon=\"pi pi-times\" [rounded]=\"true\" [text]=\"true\" severity=\"danger\" />\n </div>\n }\n </div>\n\n <div class=\"motions-container\">\n @for (motion of assets()?.motions; track motion.url) {\n <div class=\"motion-wrapper\">\n <video width=\"150\" [src]=\"motion.url\" controls playsinline preload=\"none\"></video>\n <p-button (click)=\"removeMotion(motion)\" class=\"remove-motion-button\" icon=\"pi pi-trash\" [rounded]=\"true\" [text]=\"true\" severity=\"danger\"></p-button>\n @if(motion.metadata?.moodState){\n <p-tag style=\"position: absolute; top: 4px; left: 4px\" severity=\"secondary\" [value]=\"motion.metadata?.moodState\" />\n } @if(motion.metadata?.event){\n <p-tag style=\"position: absolute; top: 4px; left: 4px\" severity=\"warn\" [value]=\"motion.metadata?.event\" />\n }\n </div>\n }\n </div>\n </div>\n</div>\n","/*\n * Public API Surface of storage-uploader\n */\n\nexport * from './lib/components/cropper/cropper.component';\nexport * from './lib/components/cropper-modal/cropper-modal.component';\nexport * from './lib/components/image-storage-preview/image-storage-preview';\nexport * from './lib/components/simple-uploader/simple-uploader.component';\nexport * from './lib/classes/storage.models';\nexport * from './lib/pipes/safe-html.pipe';\n\n// Services\nexport * from './lib/services/multi-images-storage.service';\nexport * from './lib/services/dc-files-cache.service';\nexport * from './lib/services/multi-object-storage.service';\n\n// Components\nexport * from './lib/components/assets-loader/assets-loader';\nexport * from './lib/models/assetable.model';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i4","i5","i3"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"dataclouder-ngx-cloud-storage.mjs","sources":["../../../../projects/dataclouder/ngx-cloud-storage/src/lib/classes/storage.models.ts","../../../../projects/dataclouder/ngx-cloud-storage/src/lib/services/multi-images-storage.service.ts","../../../../projects/dataclouder/ngx-cloud-storage/src/lib/components/cropper/cropper.component.ts","../../../../projects/dataclouder/ngx-cloud-storage/src/lib/components/cropper/cropper.component.html","../../../../projects/dataclouder/ngx-cloud-storage/src/lib/pipes/safe-html.pipe.ts","../../../../projects/dataclouder/ngx-cloud-storage/src/lib/components/cropper-modal/cropper-modal.component.ts","../../../../projects/dataclouder/ngx-cloud-storage/src/lib/components/cropper-modal/cropper-modal.component.html","../../../../projects/dataclouder/ngx-cloud-storage/src/lib/components/image-storage-preview/image-storage-preview.ts","../../../../projects/dataclouder/ngx-cloud-storage/src/lib/components/image-storage-preview/image-storage-preview.html","../../../../projects/dataclouder/ngx-cloud-storage/src/lib/components/simple-uploader/simple-uploader.component.ts","../../../../projects/dataclouder/ngx-cloud-storage/src/lib/components/simple-uploader/simple-uploader.component.html","../../../../projects/dataclouder/ngx-cloud-storage/src/lib/services/dc-files-cache.service.ts","../../../../projects/dataclouder/ngx-cloud-storage/src/lib/services/multi-object-storage.service.ts","../../../../projects/dataclouder/ngx-cloud-storage/src/lib/components/assets-loader/assets-loader.ts","../../../../projects/dataclouder/ngx-cloud-storage/src/lib/components/assets-loader/assets-loader.html","../../../../projects/dataclouder/ngx-cloud-storage/src/public-api.ts","../../../../projects/dataclouder/ngx-cloud-storage/src/dataclouder-ngx-cloud-storage.ts"],"sourcesContent":["export interface BasicStorage {\n url: string;\n}\n\nexport interface CloudStorage extends BasicStorage {\n path?: string; // path in the bucket and file name folder/folder2/filename.extension\n bucket?: string; // bucket name\n provider?: string; // Google/Cloudflare\n}\n\nexport interface AudioStorage extends CloudStorage {\n voice?: string;\n transcription?: any;\n}\n\nexport interface FileStorageData extends BasicStorage {\n name?: string; // File name in storage, e.g., 'report.pdf'\n type?: string; // MIME type, e.g., 'application/pdf'\n size?: number; // File size in bytes\n metadata?: any;\n}\n\nexport interface ImgStorageData extends FileStorageData {\n resolution?: string;\n resolutions?: { [key: string]: string };\n}\n\nexport interface ImgGeneratedStorageData extends ImgStorageData {\n model?: string;\n prompt?: string;\n}\n\n// Use as input for uploadImage\nexport interface StorageImageSettings {\n path?: string;\n fileName?: string;\n cropSettings?: ImageCropSettings;\n}\n\nexport interface ImageCropSettings {\n resizeToWidth?: number;\n resolutions: Array<number>; // 400, 800, 1200, 1600\n aspectRatio: AspectType;\n}\n\nexport interface CropImageSettings {\n // Resolutions should be here.\n path: string;\n fileName?: string;\n resizeToWidth?: number;\n}\n\nexport interface ImageMultipleCrops {\n file: File;\n defaultImageBlob?: Blob;\n imagesBlobs: { [resolution: number]: Blob };\n settings: { renameFile: string; width?: number };\n}\n\nexport const AspectRatioOptions: AspectRatioOption[] = [\n {\n value: '1:1',\n label: 'square',\n description: 'Square (1:1)',\n valueRatio: 1 / 1,\n icon: `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"28\" height=\"28\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.7\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"4\" y=\"4\" width=\"16\" height=\"16\" rx=\"2\" /></svg>`,\n resolution: {\n veryLow: { w: 240, h: 240 },\n low: { w: 360, h: 360 },\n sd: { w: 480, h: 480 },\n sdLarge: { w: 540, h: 540 },\n hd: { w: 720, h: 720 },\n fullhd: { w: 1080, h: 1080 },\n '4k': { w: 2160, h: 2160 },\n },\n },\n\n {\n value: '1:2',\n label: 'vertical_1_2',\n description: 'Vertical (1:2)',\n valueRatio: 1 / 2,\n icon: `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"28\" height=\"28\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.7\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"7\" y=\"4\" width=\"9\" height=\"18\" rx=\"2\" /></svg>`,\n resolution: {\n veryLow: { w: 240, h: 480 },\n low: { w: 360, h: 720 },\n sd: { w: 480, h: 960 },\n sdLarge: { w: 540, h: 1080 },\n hd: { w: 720, h: 1440 },\n fullhd: { w: 1080, h: 2160 },\n '4k': { w: 2160, h: 4320 },\n },\n },\n {\n value: '9:16',\n label: 'vertical_9_16',\n description: 'Vertical (9:16)',\n valueRatio: 9 / 16,\n icon: `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"28\" height=\"28\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.7\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"7\" y=\"4\" width=\"9\" height=\"16\" rx=\"2\" /></svg>`,\n resolution: {\n veryLow: { w: 240, h: 427 },\n low: { w: 360, h: 640 },\n sd: { w: 450, h: 800 },\n sdLarge: { w: 540, h: 960 },\n hd: { w: 720, h: 1280 },\n fullhd: { w: 1080, h: 1920 },\n '4k': { w: 2160, h: 3840 },\n },\n },\n {\n value: '2:3',\n label: 'vertical_2_3',\n description: 'Vertical (2:3)',\n valueRatio: 2 / 3,\n icon: `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"28\" height=\"28\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.7\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"6\" y=\"4\" width=\"12\" height=\"18\" rx=\"2\" /></svg>`,\n resolution: {\n veryLow: { w: 240, h: 360 },\n low: { w: 360, h: 540 },\n sd: { w: 480, h: 720 },\n sdLarge: { w: 540, h: 810 },\n hd: { w: 720, h: 1080 },\n fullhd: { w: 1080, h: 1620 },\n '4k': { w: 2160, h: 3240 },\n },\n },\n {\n value: '3:4',\n label: 'vertical_3_4',\n description: 'Vertical (3:4)',\n valueRatio: 3 / 4,\n icon: `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"28\" height=\"28\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.7\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"5\" y=\"4\" width=\"12\" height=\"16\" rx=\"2\" /></svg>`,\n resolution: {\n veryLow: { w: 240, h: 320 },\n low: { w: 360, h: 480 },\n sd: { w: 480, h: 640 },\n sdLarge: { w: 540, h: 720 },\n hd: { w: 720, h: 960 },\n fullhd: { w: 1080, h: 1440 },\n '4k': { w: 2160, h: 2880 },\n },\n },\n {\n value: '4:5',\n label: 'vertical_4_5',\n description: 'Vertical (4:5)',\n valueRatio: 4 / 5,\n icon: `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"28\" height=\"28\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.7\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"4\" y=\"4\" width=\"12\" height=\"15\" rx=\"2\" /></svg>`,\n resolution: {\n veryLow: { w: 240, h: 300 },\n low: { w: 360, h: 450 },\n sd: { w: 480, h: 600 },\n sdLarge: { w: 540, h: 675 },\n hd: { w: 720, h: 900 },\n fullhd: { w: 1080, h: 1350 },\n '4k': { w: 2160, h: 2700 },\n },\n },\n {\n value: '2:1',\n label: 'horizontal_2_1',\n description: 'Horizontal (2:1)',\n valueRatio: 2 / 1,\n icon: `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"28\" height=\"28\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.7\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"3\" y=\"8\" width=\"18\" height=\"9\" rx=\"2\" /></svg>`,\n resolution: {\n veryLow: { w: 480, h: 240 },\n low: { w: 720, h: 360 },\n sd: { w: 960, h: 480 },\n sdLarge: { w: 1080, h: 540 },\n hd: { w: 1440, h: 720 },\n fullhd: { w: 2160, h: 1080 },\n '4k': { w: 4320, h: 2160 },\n },\n },\n {\n value: '16:9',\n label: 'horizontal_16_9',\n description: 'Horizontal (16:9)',\n valueRatio: 16 / 9,\n icon: `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"28\" height=\"28\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.7\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"3\" y=\"7.5\" width=\"18\" height=\"10.125\" rx=\"2\" /></svg>`,\n resolution: {\n veryLow: { w: 240, h: 426 },\n low: { w: 360, h: 640 },\n sd: { w: 468, h: 832 },\n sdLarge: { w: 540, h: 960 },\n hd: { w: 720, h: 1280 },\n fullhd: { w: 1080, h: 1920 },\n '4k': { w: 2160, h: 3840 },\n },\n },\n {\n value: '3:2',\n label: 'horizontal_3_2',\n description: 'Horizontal (3:2)',\n valueRatio: 3 / 2,\n icon: `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"28\" height=\"28\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.7\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"3\" y=\"6\" width=\"18\" height=\"12\" rx=\"2\" /></svg>`,\n resolution: {\n veryLow: { w: 360, h: 240 },\n low: { w: 540, h: 360 },\n sd: { w: 720, h: 480 },\n sdLarge: { w: 810, h: 540 },\n hd: { w: 1080, h: 720 },\n fullhd: { w: 1620, h: 1080 },\n '4k': { w: 3240, h: 2160 },\n },\n },\n {\n value: '4:3',\n label: 'horizontal_4_3',\n description: 'Horizontal (4:3)',\n valueRatio: 4 / 3,\n icon: `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"28\" height=\"28\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.7\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"4\" y=\"6\" width=\"16\" height=\"12\" rx=\"2\" /></svg>`,\n resolution: {\n veryLow: { w: 320, h: 240 },\n low: { w: 480, h: 360 },\n sd: { w: 640, h: 480 },\n sdLarge: { w: 720, h: 540 },\n hd: { w: 960, h: 720 },\n fullhd: { w: 1440, h: 1080 },\n '4k': { w: 2880, h: 2160 },\n },\n },\n {\n value: '5:4',\n label: 'horizontal_5_4',\n description: 'Horizontal (5:4)',\n valueRatio: 5 / 4,\n icon: `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"28\" height=\"28\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.7\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"4\" y=\"5.6\" width=\"16\" height=\"12.8\" rx=\"2\" /></svg>`,\n resolution: {\n veryLow: { w: 300, h: 240 },\n low: { w: 450, h: 360 },\n sd: { w: 600, h: 480 },\n sdLarge: { w: 675, h: 540 },\n hd: { w: 900, h: 720 },\n fullhd: { w: 1350, h: 1080 },\n '4k': { w: 2700, h: 2160 },\n },\n },\n];\nexport const AllAspectRatioOptions: AspectRatioOption[] = [...AspectRatioOptions];\n\nexport interface AspectRatioOption {\n label: string;\n description: string;\n value: string;\n valueRatio: number;\n icon: string;\n resolution?: any;\n}\n\nexport enum AspectType {\n Square = 'square',\n Rectangle = 'rectangle',\n Banner = 'banner',\n RectangleLarge = 'rectangleLarge',\n vertical_1_2 = 'vertical_1_2',\n vertical_9_16 = 'vertical_9_16',\n vertical_2_3 = 'vertical_2_3',\n vertical_3_4 = 'vertical_3_4',\n vertical_4_5 = 'vertical_4_5',\n horizontal_2_1 = 'horizontal_2_1',\n horizontal_16_9 = 'horizontal_16_9',\n horizontal_3_2 = 'horizontal_3_2',\n horizontal_4_3 = 'horizontal_4_3',\n horizontal_5_4 = 'horizontal_5_4',\n}\n\nexport enum ResolutionType {\n Small = 200,\n Medium = 400,\n MediumLarge = 800,\n Large = 1200,\n VeryLarge = 1600,\n}\n\nexport const AspectRatio = {\n [AspectType.Square]: 1 / 1,\n [AspectType.Rectangle]: 16 / 9,\n [AspectType.vertical_9_16]: 9 / 16,\n [AspectType.RectangleLarge]: 16 / 8,\n [AspectType.Banner]: 16 / 7,\n [AspectType.vertical_1_2]: 1 / 2,\n [AspectType.vertical_2_3]: 2 / 3,\n [AspectType.vertical_3_4]: 3 / 4,\n [AspectType.vertical_4_5]: 4 / 5,\n [AspectType.horizontal_2_1]: 2 / 1,\n [AspectType.horizontal_16_9]: 16 / 9,\n [AspectType.horizontal_3_2]: 3 / 2,\n [AspectType.horizontal_4_3]: 4 / 3,\n [AspectType.horizontal_5_4]: 5 / 4,\n};\n\nexport const DEFAULT_SETTINGS: StorageImageSettings = {\n path: '/default-collection/id/please-change-this-subcollection',\n fileName: 'image',\n cropSettings: {\n aspectRatio: AspectType.Square,\n resolutions: [ResolutionType.Small, ResolutionType.MediumLarge],\n resizeToWidth: 450,\n },\n};\n\nconst FIREBASE_STORAGE_URL_REGEX = /https:\\/\\/firebasestorage\\.googleapis\\.com\\/v0\\/b\\/([^/]+)\\/o\\/([^?]+)/;\n\n/**\n * Extracts the bucket name from a Firebase Storage URL.\n * The URL is expected to follow the pattern:\n * 'https://firebasestorage.googleapis.com/v0/b/<bucket>/<path>?<query_params>'\n *\n * @param data The BasicStorage object containing the 'url' property.\n * @returns The bucket name (e.g., 'appingles-pro.appspot.com') or undefined if not found or URL is invalid.\n */\nexport function extractBucket(data: BasicStorage): string | undefined {\n if (!data.url) {\n return undefined;\n }\n const match = data.url.match(FIREBASE_STORAGE_URL_REGEX);\n // match[0] is the full matched string\n // match[1] is the first capturing group (bucket)\n // match[2] is the second capturing group (path)\n return match?.[1];\n}\n\n/**\n * Extracts the file path from a Firebase Storage URL.\n * The URL is expected to follow the pattern:\n * 'https://firebasestorage.googleapis.com/v0/b/<bucket>/<path>?<query_params>'\n * The extracted path is the part after the bucket and before any query parameters.\n *\n * @param data The BasicStorage object containing the 'url' property.\n * @returns The file path (e.g., 'scenarios/666506c3b9b5443f4bfab5e0/images/hairdresser.webp')\n * or undefined if not found or URL is invalid.\n * Note: This function does not perform URL decoding on the path. If URL-decoded paths\n * (e.g., converting %2F to /) are needed, `decodeURIComponent` should be applied to the result.\n */\nexport function extractPath(data: BasicStorage): string | undefined {\n if (data && data?.url) {\n const match = data.url.match(FIREBASE_STORAGE_URL_REGEX);\n // match[0] is the full matched string\n // match[1] is the first capturing group (bucket)\n // match[2] is the second capturing group (path after 'o/')\n if (match && match[2]) {\n try {\n // Decode URI components, e.g., %2F to /\n return decodeURIComponent(match[2]);\n } catch (e) {\n // Log error if decoding fails.\n // Returning the raw path component as a fallback.\n // Consider if undefined or throwing an error would be more appropriate for your use case.\n console.error(`Failed to decode URI component for path: '${match[2]}'`, e);\n return match[2]; // Fallback to raw path component\n }\n }\n return undefined; // URL did not match expected pattern or path component missing\n } else {\n return undefined;\n }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { AngularFireStorage, AngularFireUploadTask } from '@angular/fire/compat/storage';\nimport { getDownloadURL, getStorage, deleteObject, listAll } from '@angular/fire/storage';\n\nimport { ref } from '@angular/fire/storage';\nimport { lastValueFrom } from 'rxjs';\nimport { ImageMultipleCrops, ImgStorageData, FileStorageData } from '../classes/storage.models';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class MultiImagesStorageService {\n private storage = inject(AngularFireStorage);\n\n public async uploadImage(image: Blob, path: string): Promise<ImgStorageData> {\n try {\n const refStorage = this.storage.ref(path);\n const task = await refStorage.put(image);\n const { bucket, name: metadataName, contentType, size } = task.metadata;\n const url = await lastValueFrom(refStorage.getDownloadURL());\n const imageStorage: ImgStorageData = {\n url,\n name: metadataName,\n type: contentType,\n size,\n };\n return imageStorage;\n } catch (error) {\n console.error('uploading image error: ', error);\n return null;\n }\n }\n\n public async delete_directory(imagePath: string): Promise<void> {\n // WARNING!! user very carefully could delete whatever folder\n const storage = getStorage();\n const directoryRef = ref(storage, imagePath);\n\n listAll(directoryRef)\n .then((res) => {\n res.items.forEach((itemRef) => {\n console.log(itemRef);\n deleteObject(itemRef);\n });\n })\n .catch((error) => {\n console.error('error al eliminar imagenes de cloud storage', error);\n });\n }\n\n public async deleteImage(imagePath: string): Promise<void> {\n const storageRef = this.storage.ref(imagePath);\n storageRef.delete().subscribe((res) => {\n console.log('image deleted', res);\n });\n }\n\n public async uploadGenericFile(file: File, storagePath: string, metadata?: any): Promise<FileStorageData | null> {\n try {\n // Ensure storagePath is a directory path, and append file.name\n const fullFilePath = `${storagePath.replace(/\\/$/, '')}/${Date.now()}-${file.name}`;\n const refStorage = this.storage.ref(fullFilePath);\n const task = await refStorage.put(file, { customMetadata: metadata });\n const url = await lastValueFrom(refStorage.getDownloadURL());\n\n const fileData: FileStorageData = {\n url,\n name: file.name,\n type: file.type,\n size: file.size,\n metadata: task.metadata,\n };\n return fileData;\n } catch (error) {\n console.error(`Error uploading file ${file.name} to ${storagePath}:`, error);\n return null;\n }\n }\n}\n","import { Component, OnInit, ViewChild, inject, output, input } from '@angular/core';\nimport { ImageCroppedEvent, ImageCropperComponent, LoadedImage, base64ToFile } from 'ngx-image-cropper';\nimport { Observable } from 'rxjs';\nimport { AspectRatio, AspectType, ImageMultipleCrops, CropImageSettings, ResolutionType } from '../../classes/storage.models';\n\nimport { FormsModule } from '@angular/forms';\nimport { MultiImagesStorageService } from '../../services/multi-images-storage.service';\n\n@Component({\n selector: 'app-cropper',\n templateUrl: './cropper.component.html',\n styleUrls: ['./cropper.component.scss'],\n standalone: true,\n imports: [FormsModule, ImageCropperComponent],\n})\nexport class CropperComponent implements OnInit {\n private multiImagesStorageService = inject(MultiImagesStorageService);\n\n // overrides name, path and resizeToWidth\n readonly imageSettings = input<CropImageSettings>({} as any);\n readonly ratioType = input<AspectType | string>(AspectType.Square);\n readonly resolutions = input<Array<number>>([ResolutionType.MediumLarge]);\n // Outputs\n readonly imageUploaded = output<any>();\n readonly onImageCropped = output<ImageMultipleCrops>();\n readonly onFileSelected = output<any>();\n\n @ViewChild(ImageCropperComponent) imageCropper!: ImageCropperComponent;\n\n public fileMetadata: File | null = null;\n public imageChangedEvent!: Event;\n\n public aspectRatio: number = 1;\n\n public croppedImage: any = '';\n\n public isLoading = false;\n public isUploaded = false;\n public renameFile: any = '';\n public storagePath: string = '';\n public showModal = false;\n\n ngOnInit(): void {\n this.aspectRatio = AspectRatio[this.ratioType()];\n const imageSettings = this.imageSettings();\n if (imageSettings.path) {\n this.storagePath = `${imageSettings.path}/${imageSettings.fileName}.webp`;\n }\n }\n\n public reloadPath(): void {\n this.storagePath = `${this.imageSettings().path}/${this.renameFile}.webp`;\n }\n\n async fileChangeEvent(event: any) {\n this.imageChangedEvent = event;\n const file = event?.target?.files[0];\n if (file) {\n this.fileMetadata = file;\n this.onFileSelected.emit(file);\n this.showModal = true; // Show modal when file is selected\n this.renameFile = this.fileMetadata?.name?.split('.')[0];\n console.log(this.renameFile);\n\n if (!this.imageSettings().fileName) {\n this.reloadPath();\n }\n }\n }\n\n onInnerImageCropped(event: ImageCroppedEvent) {\n this.croppedImage = event.base64;\n }\n\n imageLoaded(image: LoadedImage) {\n // show cropper\n }\n\n loadImageFailed() {\n console.error('fallo al cargar la imagen');\n }\n\n public downloadURL!: Observable<string>;\n\n public async simpleCropAndUpload() {\n const imageCropped: any = await this.imageCropper.crop();\n const imgStorage = await this.multiImagesStorageService.uploadImage(imageCropped?.blob, this.storagePath);\n this.imageUploaded.emit(imgStorage);\n this.closeModal();\n }\n\n closeModal(): void {\n this.showModal = false;\n }\n}\n","<div> path: {{ storagePath }} </div>\n\n<div class=\"options\">\n @if (!isUploaded) {\n <div>\n <input type=\"file\" id=\"file-upload\" class=\"file-input\" (change)=\"fileChangeEvent($event)\" />\n <label for=\"file-upload\" class=\"btn-upload\">Seleccionar archivo</label>\n @if (!fileMetadata) {\n <em>Carga una imagen para comenzar</em>\n }\n </div>\n }\n\n @if (fileMetadata) {\n <span>\n <span style=\"margin: 1px 20px\"> tipo: {{ fileMetadata.type }} </span>\n <span style=\"margin: 1px 20px\"> tamaño {{ fileMetadata.size }} </span>\n <br />\n <input\n [disabled]=\"imageSettings()?.fileName\"\n style=\"margin: 1px 20px; width: 400px\"\n [(ngModel)]=\"renameFile\"\n type=\"text\"\n placeholder=\"Rename File\"\n (ngModelChange)=\"reloadPath()\" />\n <button class=\"btn-crop\" (click)=\"closeModal()\"> Recortar y Subir </button>\n </span>\n }\n</div>\n\n@if (fileMetadata && !isUploaded) {\n <div class=\"modal\" [class.show-modal]=\"showModal\">\n <div class=\"modal-content\">\n <div class=\"modal-header\">\n <h3>Recortar imagen</h3>\n <button class=\"close-button\" (click)=\"closeModal()\">×</button>\n </div>\n <div class=\"modal-body\">\n <h1>Hlloa</h1>\n <image-cropper\n [imageChangedEvent]=\"imageChangedEvent\"\n [maintainAspectRatio]=\"true\"\n [aspectRatio]=\"aspectRatio\"\n format=\"webp\"\n [resizeToWidth]=\"450\"\n (imageCropped)=\"onInnerImageCropped($event)\"\n (loadImageFailed)=\"loadImageFailed()\"\n (imageLoaded)=\"imageLoaded($event)\"\n [autoCrop]=\"false\"></image-cropper>\n <div class=\"modal-footer\">\n <button class=\"btn-crop\" (click)=\"simpleCropAndUpload()\">Recortar y Subir</button>\n </div>\n </div>\n </div>\n </div>\n}\n\n@if (croppedImage && !isUploaded) {\n <button [disabled]=\"isLoading\" nbButton status=\"info\"> upload </button>\n}\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\n\n@Pipe({\n name: 'safeHtml',\n standalone: true,\n})\nexport class SafeHtmlPipe implements PipeTransform {\n constructor(private sanitizer: DomSanitizer) {}\n\n transform(value: string): SafeHtml {\n return this.sanitizer.bypassSecurityTrustHtml(value);\n }\n}\n","import { Component, Input, OnInit, ViewChild, ChangeDetectorRef, inject, output, input } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { DialogModule } from 'primeng/dialog';\nimport { ImageCroppedEvent, ImageCropperComponent, LoadedImage } from 'ngx-image-cropper';\nimport { Observable } from 'rxjs';\nimport { MultiImagesStorageService } from '../../services/multi-images-storage.service';\nimport {\n AspectRatio,\n AspectType,\n ImageMultipleCrops,\n StorageImageSettings,\n ImgStorageData,\n AspectRatioOptions,\n AspectRatioOption,\n DEFAULT_SETTINGS,\n extractPath,\n} from '../../classes/storage.models';\nimport { TooltipModule } from 'primeng/tooltip';\nimport { ButtonModule } from 'primeng/button';\nimport { MessageModule } from 'primeng/message';\nimport { SelectModule } from 'primeng/select';\nimport { InputTextModule } from 'primeng/inputtext';\nimport { MoodStateOptions } from '@dataclouder/ngx-core';\nimport { FieldsetModule } from 'primeng/fieldset';\nimport { SafeHtmlPipe } from '../../pipes/safe-html.pipe';\nimport { DynamicDialogConfig, DynamicDialogRef, DialogService, DynamicDialogModule } from 'primeng/dynamicdialog';\n\n@Component({\n selector: 'dc-cropper-modal',\n templateUrl: './cropper-modal.component.html',\n styleUrls: ['./cropper-modal.component.scss'],\n standalone: true,\n imports: [\n FormsModule,\n ImageCropperComponent,\n ButtonModule,\n DialogModule,\n TooltipModule,\n MessageModule,\n SelectModule,\n InputTextModule,\n SafeHtmlPipe,\n FieldsetModule,\n DynamicDialogModule,\n ],\n providers: [DialogService],\n})\nexport class CropperComponentModal implements OnInit {\n private multiImagesStorageService = inject(MultiImagesStorageService);\n private changeDetectorRef = inject(ChangeDetectorRef);\n public ref = inject(DynamicDialogRef, { optional: true });\n public config = inject(DynamicDialogConfig, { optional: true });\n private dialogService = inject(DialogService);\n\n // overrides name, path and resizeToWidth\n\n readonly imgStorageSettings = input<StorageImageSettings>(DEFAULT_SETTINGS);\n readonly buttonLabel = input<string>('Seleccionar archivo');\n @Input() currentStorage: ImgStorageData = {} as any;\n\n readonly imageUploaded = output<ImgStorageData>();\n readonly onImageCropped = output<ImageMultipleCrops>();\n readonly onFileSelected = output<any>();\n\n @ViewChild(ImageCropperComponent) imageCropper!: ImageCropperComponent;\n\n public aspectRatioOptions = AspectRatioOptions;\n public MoodStateOptions = MoodStateOptions;\n public fileMetadata: File | null = null;\n public imageChangedEvent!: Event;\n public aspectRatioValue: number = 1;\n public croppedImage: any = '';\n public renameFile: any = '';\n public storagePath: string = '';\n public downloadURL!: Observable<string>;\n public resizeToWidth: number = 450;\n public ratioSelected: any = null;\n public emotionSelected: string | null = null;\n\n // Add a unique identifier for the file input\n public fileInputId: string;\n\n constructor() {\n // Generate random ID for file input\n this.fileInputId = `file-upload-${Math.random().toString(36).substring(2, 11)}`;\n }\n\n ngOnInit(): void {\n if (!this.imgStorageSettings().path) {\n console.warn('⚠️ Remember to set imgStorageSettings, path and fileName are required , path example: /collection/id/subcollection ');\n }\n\n // This happens when the component is opened as a dialog\n if (this.config?.data) {\n this.imageChangedEvent = this.config.data.imageChangedEvent;\n this.fileMetadata = this.config.data.file;\n }\n\n this.setSettingsForComponent();\n this.reloadPath();\n }\n\n public reloadPath(): void {\n const randomCharacters = Math.random().toString(36).substring(2, 15);\n const fileName = this.imgStorageSettings().fileName || 'img';\n this.storagePath = `${this.imgStorageSettings().path}/${fileName}-${randomCharacters}.webp`;\n }\n\n private setSettingsForComponent(): void {\n const settings = this.imgStorageSettings();\n if (!settings) return;\n\n const { cropSettings, path, fileName } = settings;\n\n if (cropSettings) {\n const { aspectRatio, resizeToWidth } = cropSettings;\n\n if (aspectRatio) {\n this.aspectRatioValue = AspectRatio[aspectRatio];\n const defaultRatio = this.aspectRatioOptions.find((option) => option.valueRatio === this.aspectRatioValue);\n if (defaultRatio) {\n this.ratioSelected = defaultRatio;\n }\n }\n\n if (resizeToWidth) {\n this.resizeToWidth = resizeToWidth;\n }\n }\n\n if (path && fileName) {\n this.storagePath = `${path}/${fileName}.webp`;\n }\n\n if (fileName) {\n this.renameFile = fileName;\n }\n }\n\n async fileChangeEvent(event: any) {\n this.setSettingsForComponent();\n\n const file = event?.target?.files[0];\n if (file) {\n this.dialogService\n .open(CropperComponentModal, {\n header: 'Recortar y subir imagen',\n width: '70vw',\n modal: true,\n closable: true,\n maximizable: true,\n data: {\n imageChangedEvent: event,\n file: file,\n },\n })\n .onClose.subscribe((result: ImgStorageData) => {\n if (result) {\n this.imageUploaded.emit(result);\n }\n });\n\n this.fileMetadata = file;\n this.onFileSelected.emit(file);\n this.renameFile = this.fileMetadata?.name\n ?.split('.')[0]\n .replace(/[^a-zA-Z0-9]/g, '')\n .slice(0, 80);\n\n if (!this.imgStorageSettings().fileName) {\n this.reloadPath();\n }\n this.changeDetectorRef.detectChanges();\n }\n }\n\n onInnerImageCropped(event: ImageCroppedEvent) {\n this.croppedImage = event.base64;\n }\n\n imageLoaded(image: LoadedImage) {\n this.changeDetectorRef.detectChanges();\n }\n\n cropperReady() {\n this.changeDetectorRef.detectChanges();\n }\n\n loadImageFailed() {\n console.error('fallo al cargar la imagen');\n }\n\n public async simpleCropAndUpload() {\n console.log(this.fileInputId);\n\n console.log('simpleCropAndUpload');\n const imageCropped: any = await this.imageCropper.crop();\n const imgStorage = await this.multiImagesStorageService.uploadImage(imageCropped?.blob, this.storagePath);\n\n const path = extractPath(this.currentStorage);\n\n if (path) {\n console.warn('deleting current Image', path);\n\n this.multiImagesStorageService.deleteImage(path);\n }\n console.log('imgStorage', imgStorage);\n this.imageUploaded.emit({ ...imgStorage, metadata: this.emotionSelected });\n this.ref.close({ ...imgStorage, metadata: this.emotionSelected });\n this.changeDetectorRef.detectChanges();\n }\n\n public changeRatio(event: AspectRatioOption) {\n console.log('changeRatio', event);\n // this.imgStorageSettings.cropSettings.aspectRatio = event.valueRatio;\n this.aspectRatioValue = event.valueRatio;\n this.changeDetectorRef.detectChanges();\n }\n\n public addEmotion(event: string) {\n // Will only log for now\n console.log('addEmotion', event);\n this.emotionSelected = event;\n }\n}\n","<!-- src/app/components/cropper-modal/cropper-modal.component.html -->\n@if(!config?.data) {\n<div class=\"upload-section\">\n <input type=\"file\" [id]=\"fileInputId\" class=\"file-input\" (change)=\"fileChangeEvent($event)\" />\n <label pButton [for]=\"fileInputId\" [pTooltip]=\"storagePath\" class=\"upload-button\">\n {{ buttonLabel() }}\n </label>\n</div>\n} @else {\n<!-- Image Settings Section -->\n<div class=\"settings-section\">\n @if(!imgStorageSettings().path) {\n <p-message severity=\"warn\">Developer Note: make sure you have a path to save the image pass object imgStorageSettings</p-message>\n } @if(currentStorage?.url) {\n <p-message severity=\"warn\" variant=\"outlined\">\n <div>\n <span class=\"setting-label\">Image will be replaced:</span>\n <img width=\"100\" height=\"Auto\" [src]=\"currentStorage?.url\" />\n </div>\n </p-message>\n }\n\n <div class=\"grid\">\n <div class=\"col-12 md:col-6\">\n <p-message>\n <b>Estas opciones estan preconfiguradas y no se pueden cambiar</b>\n <ul>\n <li><b>Path to save:</b> {{ storagePath }}</li>\n <li>\n <b>Resoluciones:</b>\n <span>{{ imgStorageSettings()?.cropSettings?.resolutions }}</span>\n </li>\n </ul>\n </p-message>\n\n <div class=\"setting-item\">\n <span class=\"setting-label\">Aspecto:</span>\n <p class=\"setting-value\">{{ imgStorageSettings()?.cropSettings?.aspectRatio }}</p>\n </div>\n\n @if (fileMetadata) {\n <div class=\"metadata-section\">\n <span class=\"metadata-item\">tipo: {{ fileMetadata.type }}</span>\n <span class=\"metadata-item\">tamaño: {{ fileMetadata.size }}</span>\n </div>\n }\n </div>\n <div class=\"col-12 md:col-6\">\n <div class=\"flex flex-column gap-2\">\n <div>\n <span>Nombre del archivo</span>\n <p-select\n [options]=\"aspectRatioOptions\"\n [ngModel]=\"ratioSelected\"\n (ngModelChange)=\"changeRatio($event)\"\n optionLabel=\"description\"\n placeholder=\"Select a ratio\">\n <ng-template pTemplate=\"selectedItem\" let-selectedOption>\n @if(selectedOption) {\n <div class=\"flex items-center gap-2\">\n <div [innerHTML]=\"selectedOption.icon | safeHtml\"></div>\n <div>{{ selectedOption.description }}</div>\n </div>\n }\n </ng-template>\n <ng-template let-ratio pTemplate=\"item\">\n <div class=\"flex items-center gap-2\">\n <div [innerHTML]=\"ratio.icon | safeHtml\"></div>\n <div>{{ ratio.description }}</div>\n </div>\n </ng-template>\n </p-select>\n </div>\n\n <div>\n <span>Nombre del archivo</span>\n <input\n pInputText\n [disabled]=\"imgStorageSettings()?.fileName\"\n [(ngModel)]=\"renameFile\"\n type=\"text\"\n placeholder=\"Rename File\"\n (ngModelChange)=\"reloadPath()\"\n class=\"rename-input\" />\n </div>\n\n <div>\n <span>Datos adicionales</span>\n <p-select\n [options]=\"MoodStateOptions\"\n [(ngModel)]=\"emotionSelected\"\n (ngModelChange)=\"addEmotion($event)\"\n optionLabel=\"label\"\n optionValue=\"value\"\n placeholder=\"Select an emotion\" />\n </div>\n </div>\n </div>\n </div>\n</div>\n\n<!-- Image Cropper -->\n<hr />\n\n<div class=\"cropper-container-father\">\n <image-cropper\n [imageChangedEvent]=\"imageChangedEvent\"\n [maintainAspectRatio]=\"true\"\n [aspectRatio]=\"aspectRatioValue\"\n format=\"webp\"\n [resizeToWidth]=\"resizeToWidth\"\n (imageCropped)=\"onInnerImageCropped($event)\"\n (loadImageFailed)=\"loadImageFailed()\"\n (cropperReady)=\"cropperReady()\"\n [autoCrop]=\"false\">\n </image-cropper>\n</div>\n\n<!-- Dialog Footer -->\n<div class=\"p-dialog-footer\">\n <button pButton class=\"p-button-primary\" (click)=\"simpleCropAndUpload()\">Recortar y Subir</button>\n</div>\n}\n","import { Component, OnInit, OnDestroy, inject, output } from '@angular/core';\nimport { AngularFireStorage } from '@angular/fire/compat/storage';\nimport { getStorage, ref, listAll, getDownloadURL } from '@angular/fire/storage';\nimport { BehaviorSubject, Subscription } from 'rxjs';\nimport { AspectType, ImgStorageData, ResolutionType, StorageImageSettings } from '../../classes/storage.models';\nimport { AsyncPipe } from '@angular/common';\nimport { CropperComponentModal } from '../cropper-modal/cropper-modal.component';\n\n@Component({\n selector: 'dc-image-storage-preview',\n templateUrl: './image-storage-preview.html',\n styleUrls: ['./image-storage-preview.css'],\n standalone: true,\n imports: [AsyncPipe, CropperComponentModal],\n})\nexport class ImageStoragePreviewComponent implements OnInit, OnDestroy {\n private storage = inject(AngularFireStorage);\n\n readonly imageSelected = output<ImgStorageData>();\n public images$ = new BehaviorSubject<ImgStorageData[]>([]);\n public loading$ = new BehaviorSubject<boolean>(false);\n public error$ = new BehaviorSubject<string | null>(null);\n\n public readonly storagePath = '/images/resources';\n private subscriptions: Subscription[] = [];\n\n /** Inserted by Angular inject() migration for backwards compatibility */\n constructor(...args: unknown[]);\n\n constructor() {}\n\n ngOnInit(): void {\n this.loadImagesFromStorage();\n }\n\n public imgStorageSettings: StorageImageSettings = {\n path: this.storagePath,\n cropSettings: {\n aspectRatio: AspectType.Square,\n resolutions: [ResolutionType.Small],\n },\n };\n\n ngOnDestroy(): void {\n this.subscriptions.forEach((sub) => sub.unsubscribe());\n }\n\n /**\n * Loads images from Firebase Storage at the specified path\n */\n private async loadImagesFromStorage(): Promise<void> {\n try {\n this.loading$.next(true);\n this.error$.next(null);\n\n const storage = getStorage();\n const storageRef = ref(storage, this.storagePath);\n\n const result = await listAll(storageRef);\n\n if (result.items.length === 0) {\n this.images$.next([]);\n this.loading$.next(false);\n return;\n }\n\n const imagePromises = result.items.map(async (itemRef) => {\n try {\n const url = await getDownloadURL(itemRef);\n const image: ImgStorageData = {\n url,\n // fullPath: itemRef.fullPath,\n name: itemRef.name,\n };\n return image;\n } catch (error) {\n console.error(`Error getting download URL for ${itemRef.fullPath}:`, error);\n return null;\n }\n });\n\n const images = (await Promise.all(imagePromises)).filter((img) => img !== null) as ImgStorageData[];\n this.images$.next(images);\n } catch (error) {\n console.error('Error loading images from storage:', error);\n this.error$.next('Failed to load images from storage. Please try again later.');\n } finally {\n this.loading$.next(false);\n }\n }\n\n /**\n * Refreshes the image list\n */\n public refreshImages(): void {\n this.loadImagesFromStorage();\n }\n\n public selectImage(image: ImgStorageData): void {\n this.imageSelected.emit(image);\n }\n}\n","<div class=\"image-storage-preview-container\">\n <div class=\"header\">\n <h2>Storage Images</h2>\n <button class=\"refresh-btn\" (click)=\"refreshImages()\" [disabled]=\"loading$ | async\">\n @if (!(loading$ | async)) {\n <span>Refresh</span>\n }\n @if (loading$ | async) {\n <span>Loading...</span>\n }\n </button>\n </div>\n\n @if (loading$ | async) {\n <div class=\"loading-container\">\n <div class=\"spinner\"></div>\n <p>Loading images...</p>\n </div>\n }\n\n @if (error$ | async) {\n <div class=\"error-container\">\n <p class=\"error-message\">{{ error$ | async }}</p>\n <button (click)=\"refreshImages()\">Try Again</button>\n </div>\n }\n\n @if (!(loading$ | async) && !(error$ | async)) {\n <div class=\"images-grid\">\n @if ((images$ | async)?.length) {\n @for (image of images$ | async; track image) {\n <div class=\"image-card\">\n <div class=\"image-container\">\n <img [src]=\"image.url\" [alt]=\"image.name || 'Storage image'\" loading=\"lazy\" />\n </div>\n <div class=\"image-info\">\n <p class=\"image-name\" [title]=\"image.name\">{{ image.name }}</p>\n <div class=\"image-actions\">\n <a [href]=\"image.url\" target=\"_blank\" class=\"action-btn\">View</a>\n <button (click)=\"selectImage(image)\" class=\"action-btn\">Select</button>\n </div>\n </div>\n </div>\n }\n } @else {\n <div class=\"no-images\">\n <p>No images found in the storage path: {{ storagePath }}</p>\n </div>\n }\n <dc-cropper-modal [imgStorageSettings]=\"imgStorageSettings\"></dc-cropper-modal>\n </div>\n }\n</div>\n","import { Component, inject, input, output, signal } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { ButtonModule } from 'primeng/button';\nimport { MultiImagesStorageService } from '../../services/multi-images-storage.service';\nimport { FileStorageData } from '../../classes/storage.models';\nimport { TooltipModule } from 'primeng/tooltip';\nimport { DialogModule } from 'primeng/dialog';\nimport { InputTextModule } from 'primeng/inputtext';\nimport { SelectModule } from 'primeng/select';\nimport { CharacterEventActions, MoodStateOptions } from '@dataclouder/ngx-core';\n\n@Component({\n selector: 'dc-simple-uploader',\n templateUrl: './simple-uploader.component.html',\n styleUrls: ['./simple-uploader.component.scss'],\n standalone: true,\n imports: [CommonModule, FormsModule, ButtonModule, TooltipModule, DialogModule, InputTextModule, SelectModule],\n})\nexport class SimpleUploaderComponent {\n private multiImagesStorageService = inject(MultiImagesStorageService);\n\n storagePath = input.required<string>();\n buttonLabel = input<string>('Upload File');\n accept = input<string>('*/*');\n disabled = input<boolean>(false);\n metadata = input<any>({});\n\n fileUploaded = output<FileStorageData>();\n uploadError = output<any>();\n\n isLoading = signal(false);\n displayDialog = signal(false);\n fileSelected = signal<File | null>(null);\n moodSelected = signal<string | null>(null);\n eventSelected = signal<string | null>(null);\n fileInputId: string;\n metadataInput: any = {};\n public MoodStateOptions = MoodStateOptions;\n public CharacterEventActions = CharacterEventActions;\n\n constructor() {\n this.fileInputId = `file-upload-${Math.random().toString(36).substring(2, 11)}`;\n }\n\n objectKeys(obj: any): string[] {\n return Object.keys(obj);\n }\n\n openDialog(): void {\n this.metadataInput = { ...this.metadata() };\n this.displayDialog.set(true);\n }\n\n triggerFileInputClick(fileInput: HTMLInputElement): void {\n fileInput.click();\n }\n\n onFileSelected(event: Event): void {\n const fileInput = event.target as HTMLInputElement;\n const file = fileInput.files?.[0];\n if (file) {\n this.fileSelected.set(file);\n }\n }\n\n async uploadFile(): Promise<void> {\n const file = this.fileSelected();\n if (file) {\n this.isLoading.set(true);\n const metadata = {\n // ...this.metadataInput,\n moodState: this.moodSelected(),\n event: this.eventSelected(),\n };\n try {\n const result = await this.multiImagesStorageService.uploadGenericFile(file, this.storagePath(), metadata);\n result.metadata = metadata;\n if (result) {\n this.fileUploaded.emit(result);\n } else {\n this.uploadError.emit({ error: 'Upload failed and no specific error was provided by the service.' });\n }\n } catch (error) {\n console.error('Error during file upload in SimpleUploaderComponent:', error);\n this.uploadError.emit(error);\n } finally {\n this.isLoading.set(false);\n this.displayDialog.set(false);\n this.fileSelected.set(null);\n this.moodSelected.set(null);\n this.eventSelected.set(null);\n }\n }\n }\n}\n","<p-button\n size=\"large\"\n [label]=\"buttonLabel()\"\n (click)=\"openDialog()\"\n [loading]=\"isLoading()\"\n [disabled]=\"disabled() || isLoading()\"\n pTooltip=\"Upload a file with metadata\"></p-button>\n\n@if(displayDialog()){\n<p-dialog\n header=\"Upload File\"\n [(visible)]=\"displayDialog\"\n [modal]=\"true\"\n [draggable]=\"false\"\n [resizable]=\"false\"\n [contentStyle]=\"{ width: '50vw', height: '50vh' }\">\n <div class=\"upload-dialog\">\n @if(!fileSelected()){\n <div class=\"file-input-container\">\n <input #fileInput type=\"file\" [id]=\"fileInputId\" (change)=\"onFileSelected($event)\" [accept]=\"accept()\" style=\"display: none\" />\n <p-button label=\"Select File\" (click)=\"triggerFileInputClick(fileInput)\"></p-button>\n </div>\n } @else {\n <div class=\"file-details\">\n <p>File: {{ fileSelected()?.name }}</p>\n <p>Size: {{ fileSelected()?.size }} bytes</p>\n </div>\n\n <div class=\"metadata-container\">\n <h5>Metadata</h5>\n <div class=\"p-fluid\">\n @for (key of objectKeys(metadata()); track key) {\n <div class=\"p-field\">\n <label [for]=\"key\">{{ key }}</label>\n <input pInputText [id]=\"key\" [(ngModel)]=\"metadataInput[key]\" />\n </div>\n }\n\n <div class=\"p-field\">\n <label for=\"emotion\">Emotion</label>\n <br />\n <p-select [options]=\"MoodStateOptions\" [(ngModel)]=\"moodSelected\" optionLabel=\"label\" optionValue=\"value\" placeholder=\"Select an emotion\"></p-select>\n </div>\n <div class=\"p-field\">\n <label for=\"emotion\">Event</label>\n <br />\n <p-select\n [options]=\"CharacterEventActions\"\n [(ngModel)]=\"eventSelected\"\n optionLabel=\"label\"\n optionValue=\"value\"\n placeholder=\"Select an event\"></p-select>\n </div>\n </div>\n </div>\n }\n </div>\n\n <ng-template pTemplate=\"footer\">\n <div class=\"dialog-footer\">\n <p-button label=\"Cancel\" styleClass=\"p-button-secondary\" (click)=\"displayDialog.set(false)\"></p-button>\n <p-button label=\"Upload\" (click)=\"uploadFile()\" [disabled]=\"!fileSelected() || isLoading()\"></p-button>\n </div>\n </ng-template>\n</p-dialog>\n}\n","import { Injectable, inject } from '@angular/core';\nimport { getDownloadURL, ref, Storage } from '@angular/fire/storage';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class DCFilesCacheService {\n private storage = inject(Storage);\n\n public files: { [key: string]: string } = {};\n\n public async getURLSrcFile(path: string): Promise<string> {\n if (path in this.files) {\n return this.files[path];\n } else {\n const url = await getDownloadURL(ref(this.storage, path));\n const localUrl = await this.donwloadFileAndGetLocalURL(url);\n this.files[path] = localUrl;\n return localUrl;\n }\n }\n\n public getBlob(url: string): Promise<Blob> {\n return new Promise((resolve, reject) => {\n const xhr = new XMLHttpRequest();\n xhr.responseType = 'blob';\n xhr.overrideMimeType('audio/mp3');\n\n xhr.onload = (event) => {\n var blob = xhr.response;\n resolve(blob);\n };\n xhr.onerror = (event) => {\n reject(event);\n };\n\n xhr.open('GET', url);\n xhr.send();\n });\n }\n\n public async donwloadFileAndGetLocalURL(url: string) {\n const blob = await this.getBlob(url);\n\n return URL.createObjectURL(blob);\n }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { AngularFireStorage, AngularFireUploadTask } from '@angular/fire/compat/storage';\nimport { getDownloadURL, getStorage, deleteObject, listAll, StorageReference, ref } from '@angular/fire/storage';\nimport { lastValueFrom } from 'rxjs';\n\n/**\n * Represents the metadata of an object stored in Firebase Storage.\n */\nexport interface ObjectStorageData {\n /** The download URL of the stored object. */\n url: string;\n /** The full path of the object in the storage bucket (e.g., 'folder/subfolder/file.txt'). */\n path: string;\n /** The name of the Firebase Storage bucket where the object is stored. */\n bucket: string;\n /** The name of the object file (e.g., 'file.txt'). */\n name?: string;\n}\n\n@Injectable({\n providedIn: 'root',\n})\nexport class MultiObjectStorageService {\n private storage = inject(AngularFireStorage);\n\n /**\n * Uploads a Blob or File object to a specified path in Firebase Storage.\n * @param objectToUpload The Blob or File to upload.\n * @param path The desired storage path (e.g., 'documents/report.pdf').\n * @returns A promise that resolves with the storage metadata of the uploaded object.\n * @throws Throws an error if the upload fails.\n */\n public async uploadObject(objectToUpload: Blob | File, path: string): Promise<ObjectStorageData> {\n try {\n const refStorage = this.storage.ref(path);\n const task = await refStorage.put(objectToUpload);\n const { fullPath, bucket, name } = task.metadata;\n const url = await lastValueFrom(refStorage.getDownloadURL());\n const storageData: ObjectStorageData = { url, path: fullPath, bucket, name };\n return storageData;\n } catch (error) {\n console.error(`Error uploading object to path \"${path}\": `, error);\n // Re-throw the error to allow calling code to handle it\n throw error;\n }\n }\n\n /**\n * Deletes all objects within a specified directory path in Firebase Storage.\n * WARNING: Use with extreme caution as this will permanently delete all files in the directory.\n * @param directoryPath The path to the directory to delete (e.g., 'users/userId/files/').\n * @returns A promise that resolves when the deletion attempt is complete.\n */\n public async deleteDirectory(directoryPath: string): Promise<void> {\n const storage = getStorage();\n const directoryRef = ref(storage, directoryPath);\n\n try {\n const res = await listAll(directoryRef);\n const deletePromises: Promise<void>[] = [];\n res.items.forEach((itemRef: StorageReference) => {\n console.log(`Deleting object: ${itemRef.fullPath}`);\n deletePromises.push(deleteObject(itemRef));\n });\n // You might want to handle potential errors during individual deletions if needed\n await Promise.all(deletePromises);\n console.log(`Successfully deleted objects in directory: ${directoryPath}`);\n } catch (error) {\n console.error(`Error deleting objects in directory \"${directoryPath}\":`, error);\n // Optionally re-throw or handle the error appropriately\n throw error;\n }\n }\n\n /**\n * Deletes a single object from Firebase Storage based on its full path.\n * @param objectPath The full path of the object to delete (e.g., 'images/profile.jpg').\n * @returns A promise that resolves when the deletion is complete.\n */\n public async deleteObjectByPath(objectPath: string): Promise<void> {\n const storageRef = this.storage.ref(objectPath);\n try {\n await lastValueFrom(storageRef.delete());\n console.log(`Object deleted successfully: ${objectPath}`);\n } catch (error) {\n console.error(`Error deleting object at path \"${objectPath}\":`, error);\n // Optionally re-throw or handle the error appropriately\n throw error;\n }\n }\n\n /**\n * Private helper to get metadata after an upload task completes.\n * @param task The AngularFireUploadTask.\n * @returns A promise resolving with the object's storage metadata.\n */\n private async uploadAndGetObjectMetadata(task: AngularFireUploadTask): Promise<ObjectStorageData> {\n const snap = await task;\n const { fullPath, bucket, name } = snap.metadata;\n const storage = getStorage();\n const storageRef = ref(storage, fullPath);\n const url = await getDownloadURL(storageRef);\n const meta: ObjectStorageData = {\n url,\n path: fullPath, // Use fullPath for the 'path' property\n bucket,\n name,\n };\n return meta;\n }\n}\n","import { Component, input, output, computed, inject, OnDestroy } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { IAssetable } from '../../models/assetable.model';\nimport { AspectType, ResolutionType, StorageImageSettings, BasicStorage, extractPath } from '../../classes/storage.models';\nimport { CropperComponentModal } from '../cropper-modal/cropper-modal.component';\nimport { MultiImagesStorageService } from '../../services/multi-images-storage.service';\nimport { SimpleUploaderComponent } from '../simple-uploader/simple-uploader.component';\nimport { ButtonModule } from 'primeng/button';\nimport { MessageModule } from 'primeng/message';\nimport { TagModule } from 'primeng/tag';\n\n@Component({\n selector: 'assets-loader',\n templateUrl: './assets-loader.html',\n styleUrls: ['./assets-loader.scss'],\n standalone: true,\n imports: [CommonModule, CropperComponentModal, SimpleUploaderComponent, ButtonModule, MessageModule, TagModule],\n})\nexport class AssetsLoaderComponent implements OnDestroy {\n assets = input.required<IAssetable>();\n storagePath = input.required<string>();\n assetsChange = output<IAssetable>();\n assetUpdate = output<{ assets: Partial<IAssetable> }>();\n onFileSelected = output<File>();\n\n private storageService = inject(MultiImagesStorageService);\n private reverseInterval: any;\n\n public bannerImgSettings = computed<StorageImageSettings>(() => ({\n path: this.storagePath(),\n fileName: undefined,\n cropSettings: { aspectRatio: AspectType.Rectangle, resolutions: [ResolutionType.MediumLarge], resizeToWidth: 850 },\n }));\n\n public imageStorageSettings = computed<StorageImageSettings>(() => ({\n path: this.storagePath(),\n fileName: undefined,\n cropSettings: { aspectRatio: AspectType.vertical_2_3, resolutions: [ResolutionType.MediumLarge], resizeToWidth: 500 },\n }));\n\n public stickerStorageSettings = computed<StorageImageSettings>(() => ({\n path: `${this.storagePath()}/stickers`,\n fileName: undefined,\n cropSettings: { aspectRatio: AspectType.Square, resolutions: [ResolutionType.MediumLarge], resizeToWidth: 400 },\n }));\n\n public onImageUploaded(event: BasicStorage, type: 'image' | 'banner' | 'sticker' = 'image') {\n const currentAssets = this.assets() ?? { image: null, banner: null, stickers: [] };\n let updatedField: Partial<IAssetable>;\n\n switch (type) {\n case 'image':\n updatedField = { image: event };\n break;\n case 'banner':\n updatedField = { banner: event };\n break;\n case 'sticker':\n updatedField = { stickers: [...(currentAssets.stickers || []), event] };\n break;\n }\n\n const newAssets = { ...currentAssets, ...updatedField };\n this.assetUpdate.emit({ assets: updatedField });\n this.assetsChange.emit(newAssets);\n }\n\n public onMotionUploaded(event: BasicStorage) {\n if (!event.url) return;\n\n const currentMotionUrl = this.assets()?.motion?.url;\n if (currentMotionUrl) {\n this.storageService.deleteImage(currentMotionUrl);\n }\n\n const updatedField = { motion: { url: event.url } };\n const newAssets = { ...this.assets(), ...updatedField };\n\n // Emit only the update field\n this.assetUpdate.emit({ assets: updatedField });\n // Assets Changes emit the new object\n this.assetsChange.emit(newAssets);\n }\n\n public onMotionAdded(event: BasicStorage) {\n const currentAssets = this.assets() ?? { motions: [] };\n const updatedField = { motions: [...(currentAssets.motions || []), event] };\n const newAssets = { ...currentAssets, ...updatedField };\n this.assetUpdate.emit({ assets: updatedField });\n this.assetsChange.emit(newAssets);\n }\n\n public removeSticker(sticker: BasicStorage) {\n const path = extractPath(sticker);\n if (path) {\n this.storageService.deleteImage(path);\n }\n\n const currentStickers = this.assets()?.stickers ?? [];\n const updatedStickers = currentStickers.filter((s) => s.url !== sticker.url);\n const updatedField = { stickers: updatedStickers };\n const newAssets = { ...this.assets(), ...updatedField };\n\n this.assetUpdate.emit({ assets: updatedField });\n this.assetsChange.emit(newAssets);\n }\n\n public removeMotion(motion: BasicStorage) {\n const path = extractPath(motion);\n if (path) {\n this.storageService.deleteImage(path);\n }\n\n const currentMotions = this.assets()?.motions ?? [];\n const updatedMotions = currentMotions.filter((m) => m.url !== motion.url);\n const updatedField = { motions: updatedMotions };\n const newAssets = { ...this.assets(), ...updatedField };\n\n this.assetUpdate.emit({ assets: updatedField });\n this.assetsChange.emit(newAssets);\n }\n\n public removeMainMotion() {\n const motionToRemove = this.assets()?.motion;\n if (motionToRemove?.url) {\n const path = extractPath(motionToRemove);\n if (path) {\n this.storageService.deleteImage(path);\n }\n\n const updatedField = { motion: null };\n const newAssets = { ...this.assets(), motion: null };\n\n this.assetUpdate.emit({ assets: updatedField });\n this.assetsChange.emit(newAssets);\n }\n }\n\n public onVideoEnded(video: HTMLVideoElement) {\n video.pause();\n this.reverseInterval = setInterval(() => {\n if (video.currentTime <= 0) {\n clearInterval(this.reverseInterval);\n video.play();\n } else {\n video.currentTime -= 0.03;\n }\n }, 30);\n }\n\n ngOnDestroy() {\n if (this.reverseInterval) {\n clearInterval(this.reverseInterval);\n }\n }\n}\n","<div class=\"assets-container\">\n <div class=\"assets-card\">\n <p-message severity=\"info\">\n <div class=\"upload-buttons\">\n <div>\n <dc-cropper-modal\n id=\"cropperCardImage\"\n #cropperCardImage\n [buttonLabel]=\"assets()?.image?.url ? 'Cambiar imagen' : 'Cargar una imagen'\"\n [imgStorageSettings]=\"imageStorageSettings()\"\n [currentStorage]=\"assets()?.image\"\n (imageUploaded)=\"onImageUploaded($event, 'image')\"\n (onFileSelected)=\"onFileSelected.emit($event)\"></dc-cropper-modal>\n </div>\n\n <dc-simple-uploader\n [buttonLabel]=\"assets()?.motion?.url ? 'Cambiar video principal' : 'Agregar video principal'\"\n (fileUploaded)=\"onMotionUploaded($event)\"\n [storagePath]=\"storagePath() + '/motions/file'\"\n [accept]=\"'video/*'\"></dc-simple-uploader>\n\n <dc-simple-uploader\n [buttonLabel]=\"'Agregar Movimientos'\"\n (fileUploaded)=\"onMotionAdded($event)\"\n [storagePath]=\"storagePath() + '/motions/file'\"\n [accept]=\"'video/*'\"></dc-simple-uploader>\n\n <dc-cropper-modal\n #cropperBanner\n id=\"cropperBanner\"\n [buttonLabel]=\"assets()?.banner?.url ? 'Cambiar el banner' : 'Cargar un banner'\"\n [imgStorageSettings]=\"bannerImgSettings()\"\n [currentStorage]=\"assets()?.banner\"\n (imageUploaded)=\"onImageUploaded($event, 'banner')\"></dc-cropper-modal>\n\n <dc-cropper-modal\n id=\"cropperStickers\"\n #cropperStickers\n [buttonLabel]=\"'Agregar sticker'\"\n [imgStorageSettings]=\"stickerStorageSettings()\"\n (imageUploaded)=\"onImageUploaded($event, 'sticker')\"></dc-cropper-modal>\n </div>\n </p-message>\n <!-- Banner -->\n\n <div class=\"preview-container\">\n <img [src]=\"assets()?.banner?.url || 'assets/defaults/images/default_banner.webp'\" class=\"main-banner-image-card\" />\n <div class=\"main-image-card\">\n <img [src]=\"assets()?.image?.url || 'assets/defaults/images/default_2_3.webp'\" />\n </div>\n\n <div class=\"motion-container\">\n <video #videoPlayer class=\"main-motion-card\" [src]=\"assets()?.motion?.url\" (ended)=\"onVideoEnded(videoPlayer)\" autoplay muted playsinline></video>\n @if(assets()?.motion?.url){\n <p-button class=\"remove-main-motion-button\" (click)=\"removeMainMotion()\" [rounded]=\"true\" [text]=\"true\" icon=\"pi pi-trash\" severity=\"danger\"></p-button>\n }\n </div>\n </div>\n\n <div class=\"stickers-container\">\n @for (sticker of assets()?.stickers; track sticker.url) {\n <div class=\"sticker-wrapper\">\n <img width=\"100\" [src]=\"sticker.url\" alt=\"\" />\n <p-button (click)=\"removeSticker(sticker)\" class=\"remove-sticker\" icon=\"pi pi-times\" [rounded]=\"true\" [text]=\"true\" severity=\"danger\" />\n </div>\n }\n </div>\n\n <div class=\"motions-container\">\n @for (motion of assets()?.motions; track motion.url) {\n <div class=\"motion-wrapper\">\n <video width=\"150\" [src]=\"motion.url\" controls playsinline preload=\"none\"></video>\n <p-button (click)=\"removeMotion(motion)\" class=\"remove-motion-button\" icon=\"pi pi-trash\" [rounded]=\"true\" [text]=\"true\" severity=\"danger\"></p-button>\n @if(motion.metadata?.moodState){\n <p-tag style=\"position: absolute; top: 4px; left: 4px\" severity=\"secondary\" [value]=\"motion.metadata?.moodState\" />\n } @if(motion.metadata?.event){\n <p-tag style=\"position: absolute; top: 4px; left: 4px\" severity=\"warn\" [value]=\"motion.metadata?.event\" />\n }\n </div>\n }\n </div>\n </div>\n</div>\n","/*\n * Public API Surface of storage-uploader\n */\n\nexport * from './lib/components/cropper/cropper.component';\nexport * from './lib/components/cropper-modal/cropper-modal.component';\nexport * from './lib/components/image-storage-preview/image-storage-preview';\nexport * from './lib/components/simple-uploader/simple-uploader.component';\nexport * from './lib/classes/storage.models';\nexport * from './lib/pipes/safe-html.pipe';\n\n// Services\nexport * from './lib/services/multi-images-storage.service';\nexport * from './lib/services/dc-files-cache.service';\nexport * from './lib/services/multi-object-storage.service';\n\n// Components\nexport * from './lib/components/assets-loader/assets-loader';\nexport * from './lib/models/assetable.model';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i5","i7","i3"],"mappings":"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"}
|
package/index.d.ts
CHANGED
|
@@ -3,6 +3,7 @@ import { OnInit, OnDestroy, PipeTransform } from '@angular/core';
|
|
|
3
3
|
import { ImageCropperComponent, ImageCroppedEvent, LoadedImage } from 'ngx-image-cropper';
|
|
4
4
|
import { Observable, BehaviorSubject } from 'rxjs';
|
|
5
5
|
import * as _dataclouder_ngx_core from '@dataclouder/ngx-core';
|
|
6
|
+
import { DynamicDialogRef, DynamicDialogConfig } from 'primeng/dynamicdialog';
|
|
6
7
|
import { DomSanitizer, SafeHtml } from '@angular/platform-browser';
|
|
7
8
|
|
|
8
9
|
interface BasicStorage {
|
|
@@ -60,6 +61,7 @@ interface ImageMultipleCrops {
|
|
|
60
61
|
};
|
|
61
62
|
}
|
|
62
63
|
declare const AspectRatioOptions: AspectRatioOption[];
|
|
64
|
+
declare const AllAspectRatioOptions: AspectRatioOption[];
|
|
63
65
|
interface AspectRatioOption {
|
|
64
66
|
label: string;
|
|
65
67
|
description: string;
|
|
@@ -73,16 +75,16 @@ declare enum AspectType {
|
|
|
73
75
|
Rectangle = "rectangle",
|
|
74
76
|
Banner = "banner",
|
|
75
77
|
RectangleLarge = "rectangleLarge",
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
78
|
+
vertical_1_2 = "vertical_1_2",
|
|
79
|
+
vertical_9_16 = "vertical_9_16",
|
|
80
|
+
vertical_2_3 = "vertical_2_3",
|
|
81
|
+
vertical_3_4 = "vertical_3_4",
|
|
82
|
+
vertical_4_5 = "vertical_4_5",
|
|
83
|
+
horizontal_2_1 = "horizontal_2_1",
|
|
84
|
+
horizontal_16_9 = "horizontal_16_9",
|
|
85
|
+
horizontal_3_2 = "horizontal_3_2",
|
|
86
|
+
horizontal_4_3 = "horizontal_4_3",
|
|
87
|
+
horizontal_5_4 = "horizontal_5_4"
|
|
86
88
|
}
|
|
87
89
|
declare enum ResolutionType {
|
|
88
90
|
Small = 200,
|
|
@@ -97,8 +99,15 @@ declare const AspectRatio: {
|
|
|
97
99
|
vertical_9_16: number;
|
|
98
100
|
rectangleLarge: number;
|
|
99
101
|
banner: number;
|
|
100
|
-
|
|
102
|
+
vertical_1_2: number;
|
|
101
103
|
vertical_2_3: number;
|
|
104
|
+
vertical_3_4: number;
|
|
105
|
+
vertical_4_5: number;
|
|
106
|
+
horizontal_2_1: number;
|
|
107
|
+
horizontal_16_9: number;
|
|
108
|
+
horizontal_3_2: number;
|
|
109
|
+
horizontal_4_3: number;
|
|
110
|
+
horizontal_5_4: number;
|
|
102
111
|
};
|
|
103
112
|
declare const DEFAULT_SETTINGS: StorageImageSettings;
|
|
104
113
|
/**
|
|
@@ -158,6 +167,9 @@ declare class CropperComponent implements OnInit {
|
|
|
158
167
|
declare class CropperComponentModal implements OnInit {
|
|
159
168
|
private multiImagesStorageService;
|
|
160
169
|
private changeDetectorRef;
|
|
170
|
+
ref: DynamicDialogRef<any>;
|
|
171
|
+
config: DynamicDialogConfig<any, any>;
|
|
172
|
+
private dialogService;
|
|
161
173
|
readonly imgStorageSettings: _angular_core.InputSignal<StorageImageSettings>;
|
|
162
174
|
readonly buttonLabel: _angular_core.InputSignal<string>;
|
|
163
175
|
currentStorage: ImgStorageData;
|
|
@@ -173,7 +185,6 @@ declare class CropperComponentModal implements OnInit {
|
|
|
173
185
|
}[];
|
|
174
186
|
fileMetadata: File | null;
|
|
175
187
|
imageChangedEvent: Event;
|
|
176
|
-
displayDialog: boolean;
|
|
177
188
|
aspectRatioValue: number;
|
|
178
189
|
croppedImage: any;
|
|
179
190
|
renameFile: any;
|
|
@@ -374,5 +385,5 @@ declare class AssetsLoaderComponent implements OnDestroy {
|
|
|
374
385
|
static ɵcmp: _angular_core.ɵɵComponentDeclaration<AssetsLoaderComponent, "assets-loader", never, { "assets": { "alias": "assets"; "required": true; "isSignal": true; }; "storagePath": { "alias": "storagePath"; "required": true; "isSignal": true; }; }, { "assetsChange": "assetsChange"; "assetUpdate": "assetUpdate"; "onFileSelected": "onFileSelected"; }, never, never, true, never>;
|
|
375
386
|
}
|
|
376
387
|
|
|
377
|
-
export {
|
|
388
|
+
export { AllAspectRatioOptions, AspectRatio, AspectRatioOptions, AspectType, AssetsLoaderComponent, CropperComponent, CropperComponentModal, DCFilesCacheService, DEFAULT_SETTINGS, ImageStoragePreviewComponent, MultiImagesStorageService, MultiObjectStorageService, ResolutionType, SafeHtmlPipe, SimpleUploaderComponent, extractBucket, extractPath };
|
|
378
389
|
export type { AspectRatioOption, AudioStorage, BasicStorage, CloudStorage, CropImageSettings, FileStorageData, IAssetable, ImageCropSettings, ImageMultipleCrops, ImgGeneratedStorageData, ImgStorageData, ObjectStorageData, StorageImageSettings, VoiceSample };
|
package/package.json
CHANGED