allaw-ui 5.2.5 → 5.2.6
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.
|
@@ -268,6 +268,7 @@ var FileUploader = function (_a) {
|
|
|
268
268
|
console.log(" - imageUrl:", imageUrl);
|
|
269
269
|
console.log(" - cropMetadata:", cropMetadata);
|
|
270
270
|
console.log(" - outputWidth:", outputWidth, "outputHeight:", outputHeight);
|
|
271
|
+
console.log(" - cropArea dimensions:", cropMetadata.cropWidth || "default", "x", cropMetadata.cropHeight || "default");
|
|
271
272
|
return [2 /*return*/, new Promise(function (resolve, reject) {
|
|
272
273
|
var img = new window.Image();
|
|
273
274
|
img.crossOrigin = "anonymous";
|
|
@@ -284,18 +285,32 @@ var FileUploader = function (_a) {
|
|
|
284
285
|
reject(new Error("Impossible de créer le contexte canvas"));
|
|
285
286
|
return;
|
|
286
287
|
}
|
|
287
|
-
// Dimensions de la zone de crop dans le modal
|
|
288
|
-
//
|
|
289
|
-
|
|
290
|
-
var
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
288
|
+
// Dimensions de la zone de crop dans le modal
|
|
289
|
+
// Utiliser les dimensions réelles si disponibles dans les métadonnées,
|
|
290
|
+
// sinon utiliser les valeurs par défaut du CSS
|
|
291
|
+
var cropAreaWidth = cropMetadata.cropWidth || 280; // Dimensions réelles du cadre de crop
|
|
292
|
+
var cropAreaHeight = cropMetadata.cropHeight || 280;
|
|
293
|
+
// Si les dimensions ne sont pas dans les métadonnées, utiliser les valeurs par défaut selon la shape
|
|
294
|
+
if (!cropMetadata.cropWidth || !cropMetadata.cropHeight) {
|
|
295
|
+
if (cropMetadata.shape === "banner") {
|
|
296
|
+
cropAreaWidth = 360;
|
|
297
|
+
cropAreaHeight = 120;
|
|
298
|
+
}
|
|
299
|
+
else {
|
|
300
|
+
cropAreaWidth = 280;
|
|
301
|
+
cropAreaHeight = 280;
|
|
302
|
+
}
|
|
294
303
|
}
|
|
295
|
-
// Le zoom dans cropMetadata est le zoom total (baseZoom * zoom relatif)
|
|
296
|
-
// baseZoom est calculé dans le modal comme Math.max(cropWidth / imgWidth, cropHeight / imgHeight)
|
|
304
|
+
// Le zoom dans cropMetadata est le zoom total (baseZoom * zoom relatif * marge)
|
|
305
|
+
// baseZoom est calculé dans le modal comme Math.max(cropWidth / imgWidth, cropHeight / imgHeight) * 1.01
|
|
297
306
|
// puis multiplié par le zoom relatif (1-3) pour obtenir le zoom total
|
|
298
307
|
var totalZoom = cropMetadata.zoom;
|
|
308
|
+
// S'assurer que le zoom est valide (éviter division par zéro ou valeurs négatives)
|
|
309
|
+
if (totalZoom <= 0 || !isFinite(totalZoom)) {
|
|
310
|
+
console.error("❌ [FileUploader] Zoom invalide:", totalZoom);
|
|
311
|
+
reject(new Error("Zoom invalide"));
|
|
312
|
+
return;
|
|
313
|
+
}
|
|
299
314
|
// Dans le modal, la transform CSS est appliquée sur le container de l'image :
|
|
300
315
|
// transform: translate(offsetX, offsetY) scale(totalZoom)
|
|
301
316
|
// transform-origin: center
|
|
@@ -323,16 +338,23 @@ var FileUploader = function (_a) {
|
|
|
323
338
|
// Dimensions de la zone de crop dans l'image originale
|
|
324
339
|
var cropWidthInOriginal = cropAreaWidth / totalZoom;
|
|
325
340
|
var cropHeightInOriginal = cropAreaHeight / totalZoom;
|
|
341
|
+
// S'assurer que les dimensions calculées sont valides (éviter les valeurs négatives ou nulles)
|
|
342
|
+
if (cropWidthInOriginal <= 0 || cropHeightInOriginal <= 0) {
|
|
343
|
+
console.error("❌ [FileUploader] Dimensions de crop invalides:", cropWidthInOriginal, cropHeightInOriginal);
|
|
344
|
+
reject(new Error("Dimensions de crop invalides: ".concat(cropWidthInOriginal, "x").concat(cropHeightInOriginal)));
|
|
345
|
+
return;
|
|
346
|
+
}
|
|
326
347
|
// Coordonnées du coin supérieur gauche de la zone à cropper dans l'image originale
|
|
327
348
|
var sourceX = cropCenterXInOriginal - cropWidthInOriginal / 2;
|
|
328
349
|
var sourceY = cropCenterYInOriginal - cropHeightInOriginal / 2;
|
|
329
350
|
var sourceWidth = cropWidthInOriginal;
|
|
330
351
|
var sourceHeight = cropHeightInOriginal;
|
|
331
352
|
// S'assurer que les coordonnées sont valides (pas en dehors de l'image)
|
|
332
|
-
|
|
333
|
-
var
|
|
334
|
-
var
|
|
335
|
-
var
|
|
353
|
+
// Utiliser Math.floor pour éviter les problèmes de précision avec les pixels
|
|
354
|
+
var clampedSourceX = Math.max(0, Math.min(Math.floor(sourceX), img.width - 1));
|
|
355
|
+
var clampedSourceY = Math.max(0, Math.min(Math.floor(sourceY), img.height - 1));
|
|
356
|
+
var clampedSourceWidth = Math.max(1, Math.min(Math.ceil(sourceWidth), img.width - clampedSourceX));
|
|
357
|
+
var clampedSourceHeight = Math.max(1, Math.min(Math.ceil(sourceHeight), img.height - clampedSourceY));
|
|
336
358
|
// Dessiner l'image croppée sur le canvas
|
|
337
359
|
ctx.drawImage(img, clampedSourceX, clampedSourceY, clampedSourceWidth, clampedSourceHeight, 0, 0, outputWidth, outputHeight);
|
|
338
360
|
// Si c'est un cercle, appliquer un masque
|
|
@@ -29,7 +29,10 @@ var ImageCropperModal = function (_a) {
|
|
|
29
29
|
// Calcul du zoom pour que l'image couvre complètement le cadre
|
|
30
30
|
// On utilise max pour assurer que l'image couvre tout le cadre, sans espace vide
|
|
31
31
|
var fitZoom = Math.max(cropWidth / imgWidth, cropHeight / imgHeight);
|
|
32
|
-
|
|
32
|
+
// Ajouter une marge minimale (1%) pour éviter les problèmes de précision
|
|
33
|
+
// quand le zoom est exactement à 1, garantissant toujours un peu d'espace pour ajuster
|
|
34
|
+
var MIN_ZOOM_MARGIN = 1.01;
|
|
35
|
+
return fitZoom * MIN_ZOOM_MARGIN;
|
|
33
36
|
};
|
|
34
37
|
// Calcule les limites de déplacement pour éviter les zones vides
|
|
35
38
|
var calculateBoundaries = function () {
|
|
@@ -200,12 +203,19 @@ var ImageCropperModal = function (_a) {
|
|
|
200
203
|
React.createElement("div", { className: styles.action_buttons },
|
|
201
204
|
React.createElement("button", { className: styles.cancel_button, onClick: onCancel }, "Annuler"),
|
|
202
205
|
React.createElement("button", { className: styles.confirm_button, onClick: function () {
|
|
203
|
-
|
|
206
|
+
var _a;
|
|
207
|
+
// Récupérer les dimensions réelles du cadre de crop
|
|
208
|
+
var cropRect = (_a = cropAreaRef.current) === null || _a === void 0 ? void 0 : _a.getBoundingClientRect();
|
|
209
|
+
var cropWidth = (cropRect === null || cropRect === void 0 ? void 0 : cropRect.width) || 280;
|
|
210
|
+
var cropHeight = (cropRect === null || cropRect === void 0 ? void 0 : cropRect.height) || 280;
|
|
211
|
+
// Retourner les métadonnées de cadrage avec le zoom total et les dimensions réelles
|
|
204
212
|
onConfirm({
|
|
205
213
|
zoom: baseZoom * zoom,
|
|
206
214
|
offsetX: position.x,
|
|
207
215
|
offsetY: position.y,
|
|
208
216
|
shape: shape,
|
|
217
|
+
cropWidth: cropWidth,
|
|
218
|
+
cropHeight: cropHeight,
|
|
209
219
|
});
|
|
210
220
|
} }, "Valider"))))));
|
|
211
221
|
};
|