Ajout de drag'n drop là ou c'est possible ; ajout de l'import des ennemis depuis foundryVTT
All checks were successful
Build & Push Images / build (brain) (push) Successful in 1m24s
Build & Push Images / build (web) (push) Successful in 1m56s
Build & Push Images / build (core) (push) Successful in 3m33s
Build & Push Images / build-switcher (push) Successful in 17s

This commit is contained in:
2026-06-25 15:21:25 +02:00
parent 18f5a260b0
commit 9bd66613b6
34 changed files with 439 additions and 21 deletions

View File

@@ -0,0 +1,55 @@
import { Directive, EventEmitter, HostBinding, HostListener, Input, Output } from '@angular/core';
/**
* Directive de drag & drop de fichiers réutilisable.
*
* Pose la classe `.drag-over` sur l'élément hôte pendant le survol (à styler côté
* composant) et émet les fichiers déposés.
*
* Usage :
* <div appFileDrop (filesDropped)="onDrop($event)">…</div>
* <div appFileDrop [multiple]="true" (filesDropped)="onDrop($event)">…</div>
*/
@Directive({
selector: '[appFileDrop]',
standalone: true
})
export class FileDropDirective {
/** Autoriser plusieurs fichiers (sinon seul le premier est émis). */
@Input() multiple = false;
/** Désactive le drop (ex: pendant un upload en cours). */
@Input() dropDisabled = false;
@Output() filesDropped = new EventEmitter<File[]>();
@HostBinding('class.drag-over') isOver = false;
@HostListener('dragover', ['$event'])
onDragOver(event: DragEvent): void {
if (this.dropDisabled) return;
event.preventDefault();
event.stopPropagation();
if (event.dataTransfer) event.dataTransfer.dropEffect = 'copy';
this.isOver = true;
}
@HostListener('dragleave', ['$event'])
onDragLeave(event: DragEvent): void {
event.preventDefault();
event.stopPropagation();
this.isOver = false;
}
@HostListener('drop', ['$event'])
onDrop(event: DragEvent): void {
event.preventDefault();
event.stopPropagation();
this.isOver = false;
if (this.dropDisabled) return;
const list = event.dataTransfer?.files;
if (!list || list.length === 0) return;
const files = Array.from(list);
this.filesDropped.emit(this.multiple ? files : [files[0]]);
}
}

View File

@@ -1,6 +1,12 @@
<!-- Mode compact : bouton "+ ajouter" carre, utilise dans les galeries. -->
@if (compact) {
<label class="upload-compact" [class.loading]="uploading" [title]="errorMessage || ('imageUploader.addImage' | translate)">
<label class="upload-compact"
[class.loading]="uploading"
[class.drag-over]="dragOver"
(dragover)="onDragOver($event)"
(dragleave)="onDragLeave()"
(drop)="onDrop($event)"
[title]="errorMessage || ('imageUploader.addImage' | translate)">
@if (!uploading) {
<lucide-icon [img]="Upload" [size]="18"></lucide-icon>
<span>{{ 'common.add' | translate }}</span>

View File

@@ -51,6 +51,7 @@
transition: background 0.15s, border-color 0.15s, color 0.15s;
&:hover { border-color: #6c63ff; color: #a5b4fc; background: #1f1f3a; }
&.drag-over { border-color: #6c63ff; background: #1f1f3a; color: white; }
&.loading { cursor: progress; opacity: 0.7; }
}