allaw-ui 5.2.4 → 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.
@@ -63,7 +63,7 @@ function EntityCard(_a) {
63
63
  var entityName = _a.entityName, numberOfMembers = _a.numberOfMembers, formatedAddress = _a.formatedAddress, immat = _a.immat, actionType = _a.actionType, onActionButtonClick = _a.onActionButtonClick, onCardClick = _a.onCardClick, role = _a.role, logoUrl = _a.logoUrl;
64
64
  var _b = useState(false), imgError = _b[0], setImgError = _b[1];
65
65
  return (React.createElement("div", { className: styles.card, style: { cursor: onCardClick ? "pointer" : "default" }, onClick: function () { return onCardClick && onCardClick(); } },
66
- React.createElement("div", { className: styles.picturePlaceHolder }, logoUrl && !imgError ? (React.createElement(Image, { src: logoUrl, alt: "Logo ".concat(entityName), width: 64, height: 64, quality: 100, onError: function () { return setImgError(true); }, style: {
66
+ React.createElement("div", { className: "".concat(styles.picturePlaceHolder, " ").concat(logoUrl && !imgError ? styles.hasLogo : "") }, logoUrl && !imgError ? (React.createElement(Image, { src: logoUrl, alt: "Logo ".concat(entityName), width: 64, height: 64, quality: 100, onError: function () { return setImgError(true); }, style: {
67
67
  objectFit: "cover",
68
68
  width: "100%",
69
69
  height: "100%",
@@ -29,6 +29,10 @@
29
29
  flex-shrink: 0;
30
30
  }
31
31
 
32
+ .picturePlaceHolder.hasLogo {
33
+ padding: 0px;
34
+ }
35
+
32
36
  .dataInfo {
33
37
  display: flex;
34
38
  flex-direction: row;
@@ -210,6 +214,10 @@
210
214
  padding: 6px;
211
215
  }
212
216
 
217
+ .picturePlaceHolder.hasLogo {
218
+ padding: 0px;
219
+ }
220
+
213
221
  .entityName {
214
222
  font-size: 14px;
215
223
  line-height: 20px;
@@ -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 (selon le CSS)
288
- // Ces dimensions correspondent exactement à celles utilisées dans ImageCropperModal.module.css
289
- var cropAreaWidth = 280; // Dimensions réelles du cadre de crop pour square/circle
290
- var cropAreaHeight = 280;
291
- if (cropMetadata.shape === "banner") {
292
- cropAreaWidth = 360;
293
- cropAreaHeight = 120;
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
- var clampedSourceX = Math.max(0, Math.min(sourceX, img.width - 1));
333
- var clampedSourceY = Math.max(0, Math.min(sourceY, img.height - 1));
334
- var clampedSourceWidth = Math.min(sourceWidth, img.width - clampedSourceX);
335
- var clampedSourceHeight = Math.min(sourceHeight, img.height - clampedSourceY);
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
@@ -4,6 +4,8 @@ export interface CropMetadata {
4
4
  offsetX: number;
5
5
  offsetY: number;
6
6
  shape: "circle" | "square" | "banner";
7
+ cropWidth?: number;
8
+ cropHeight?: number;
7
9
  }
8
10
  interface ImageCropperModalProps {
9
11
  file: File;
@@ -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
- return fitZoom;
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
- // Retourner les métadonnées de cadrage avec le zoom total
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
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "allaw-ui",
3
- "version": "5.2.4",
3
+ "version": "5.2.6",
4
4
  "description": "Composants UI pour l'application Allaw",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.esm.js",