Skip to content

Commit 18c88c5

Browse files
committed
fix(image-cropper-web): swap placeholder to SVG and fix editor preview captions
1 parent 5f39c07 commit 18c88c5

5 files changed

Lines changed: 18 additions & 9 deletions

File tree

packages/pluggableWidgets/image-cropper-web/src/ImageCropper.editorPreview.tsx

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
1-
import { parseStyle } from "@mendix/widget-plugin-platform/preview/parse-style";
21
import classNames from "classnames";
32
import { ReactElement, createRef, useState } from "react";
43
import { type Crop } from "react-image-crop";
4+
import { parseStyle } from "@mendix/widget-plugin-platform/preview/parse-style";
55
import { ImageCropperPreviewProps } from "../typings/ImageCropperProps";
6+
import CropperPlaceholderIcon from "./assets/cropper-placeholder.svg";
67
import { CropArea } from "./components/CropArea";
78
import { resolveAspectRatio } from "./utils/aspectRatio";
89
import { describeConfig } from "./utils/describeConfig";
9-
import CropperPlaceholderIcon from "./assets/cropper-placeholder.png";
1010

1111
declare function require(name: string): string;
1212

@@ -59,7 +59,13 @@ function StaticCropPreview(props: { imageUrl: string; values: ImageCropperPrevie
5959
}
6060

6161
export function preview(props: ImageCropperPreviewProps): ReactElement {
62+
// Narrow on the object (not a derived boolean) so TS keeps .imageUrl / .entity typed.
6263
const staticImage = props.image?.type === "static" ? props.image : undefined;
64+
const dynamicEntity = props.image?.type === "dynamic" ? props.image.entity : undefined;
65+
66+
// Dynamic bindings carry only the entity name — no design-time pixels — so they still show the
67+
// placeholder, but the caption must reflect that an attribute IS bound (not "nothing selected").
68+
const caption = staticImage ? describeConfig(props) : dynamicEntity || "[No image selected yet]";
6369

6470
return (
6571
<div
@@ -74,9 +80,7 @@ export function preview(props: ImageCropperPreviewProps): ReactElement {
7480
<img className="widget-image-cropper__preview-glyph" src={CropperPlaceholderIcon} alt="" />
7581
)}
7682
</div>
77-
<p className="widget-image-cropper__preview-caption">
78-
{staticImage ? describeConfig(props) : "[No image selected yet]"}
79-
</p>
83+
<p className="widget-image-cropper__preview-caption">{caption}</p>
8084
</div>
8185
);
8286
}

packages/pluggableWidgets/image-cropper-web/src/__tests__/ImageCropper.editor.spec.tsx

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -81,11 +81,12 @@ describe("ImageCropper design mode (preview)", () => {
8181
expect(getByText("[No image selected yet]")).toBeInTheDocument();
8282
});
8383

84-
test("treats a dynamic image as not previewable (glyph + empty caption)", () => {
84+
test("shows the bound entity for a dynamic image (placeholder glyph, not previewable)", () => {
8585
const props = makePreviewProps({ image: { type: "dynamic", entity: "MyModule.Photo" } });
86-
const { container, getByText } = render(preview(props));
86+
const { container, getByText, queryByText } = render(preview(props));
8787
expect(container.querySelector(".widget-image-cropper__preview-glyph")).not.toBeNull();
88-
expect(getByText("[No image selected yet]")).toBeInTheDocument();
88+
expect(getByText("MyModule.Photo")).toBeInTheDocument();
89+
expect(queryByText("[No image selected yet]")).toBeNull();
8990
});
9091

9192
test("renders the real image and config caption for a static image", () => {
Binary file not shown.
Lines changed: 5 additions & 0 deletions
Loading

packages/pluggableWidgets/image-cropper-web/src/components/CropArea.tsx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,6 @@ export function CropArea(props: CropAreaProps): ReactElement {
113113
ref={props.imageRef}
114114
src={safeSrc}
115115
alt=""
116-
crossOrigin="anonymous"
117116
style={{
118117
width: displaySize?.width,
119118
height: displaySize?.height,

0 commit comments

Comments
 (0)