Skip to content

Commit

Permalink
feat(Image): imageRender、toolbarRender、onTransform、items、minScale、max…
Browse files Browse the repository at this point in the history
…Scale
  • Loading branch information
linxianxi committed Jun 19, 2023
1 parent 4af6a52 commit 34cfae4
Show file tree
Hide file tree
Showing 9 changed files with 343 additions and 65 deletions.
7 changes: 7 additions & 0 deletions components/image/demo/imageRender.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
## zh-CN

自定义预览内容。

## en-US

Custom preview render.
24 changes: 24 additions & 0 deletions components/image/demo/imageRender.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
import { Image } from 'antd';
import React from 'react';

const App: React.FC = () => (
<Image
width={200}
preview={{
imageRender: () => (
<video
muted
width="100%"
controls
src="https://mdn.alipayobjects.com/huamei_iwk9zp/afts/file/A*uYT7SZwhJnUAAAAAAAAAAAAADgCCAQ"
/>
),
toolbarRender: ({ icons: { closeIcon } }) => (
<ul className="ant-image-preview-operations">{closeIcon}</ul>
),
}}
src="https://zos.alipayobjects.com/rmsportal/jkjgkEfvpUPVyRjUImniVslZfWPnJuuZ.png"
/>
);

export default App;
37 changes: 15 additions & 22 deletions components/image/demo/preview-group-visible.tsx
Original file line number Diff line number Diff line change
@@ -1,26 +1,19 @@
import React, { useState } from 'react';
import { Image } from 'antd';
import React from 'react';

const App: React.FC = () => {
const [visible, setVisible] = useState(false);

return (
<>
<Image
preview={{ visible: false }}
width={200}
src="https://gw.alipayobjects.com/zos/antfincdn/LlvErxo8H9/photo-1503185912284-5271ff81b9a8.webp"
onClick={() => setVisible(true)}
/>
<div style={{ display: 'none' }}>
<Image.PreviewGroup preview={{ visible, onVisibleChange: (vis) => setVisible(vis) }}>
<Image src="https://gw.alipayobjects.com/zos/antfincdn/LlvErxo8H9/photo-1503185912284-5271ff81b9a8.webp" />
<Image src="https://gw.alipayobjects.com/zos/antfincdn/cV16ZqzMjW/photo-1473091540282-9b846e7965e3.webp" />
<Image src="https://gw.alipayobjects.com/zos/antfincdn/x43I27A55%26/photo-1438109491414-7198515b166b.webp" />
</Image.PreviewGroup>
</div>
</>
);
};
const App: React.FC = () => (
<Image.PreviewGroup
items={[
'https://gw.alipayobjects.com/zos/antfincdn/LlvErxo8H9/photo-1503185912284-5271ff81b9a8.webp',
'https://gw.alipayobjects.com/zos/antfincdn/cV16ZqzMjW/photo-1473091540282-9b846e7965e3.webp',
'https://gw.alipayobjects.com/zos/antfincdn/x43I27A55%26/photo-1438109491414-7198515b166b.webp',
]}
>
<Image
width={200}
src="https://gw.alipayobjects.com/zos/antfincdn/LlvErxo8H9/photo-1503185912284-5271ff81b9a8.webp"
/>
</Image.PreviewGroup>
);

export default App;
7 changes: 7 additions & 0 deletions components/image/demo/toolbarRender.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
## zh-CN

自定义工具栏。

## en-US

Custom toolbar render.
56 changes: 56 additions & 0 deletions components/image/demo/toolbarRender.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
import { DownloadOutlined } from '@ant-design/icons';
import { Image } from 'antd';
import React from 'react';

const src = 'https://zos.alipayobjects.com/rmsportal/jkjgkEfvpUPVyRjUImniVslZfWPnJuuZ.png';

const App: React.FC = () => {
const onDownload = () => {
fetch(src)
.then((response) => response.blob())
.then((blob) => {
const url = window.URL.createObjectURL(new Blob([blob]));
const link = document.createElement('a');
link.href = url;
link.download = 'image.jpg';
document.body.appendChild(link);
link.click();
link.remove();
});
};

return (
<Image
width={200}
preview={{
toolbarRender: ({
icons: {
flipYIcon,
flipXIcon,
rotateLeftIcon,
rotateRightIcon,
zoomOutIcon,
zoomInIcon,
closeIcon,
},
}) => (
<ul className="ant-image-preview-operations">
<li className="ant-image-preview-operations-operation" onClick={onDownload}>
<DownloadOutlined className="ant-image-preview-operations-icon" />
</li>
{flipYIcon}
{flipXIcon}
{rotateLeftIcon}
{rotateRightIcon}
{zoomOutIcon}
{zoomInIcon}
{closeIcon}
</ul>
),
}}
src={src}
/>
);
};

export default App;
120 changes: 117 additions & 3 deletions components/image/index.en-US.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,23 +24,29 @@ Previewable image.
<code src="./demo/preview-group-visible.tsx">Preview from one image</code>
<code src="./demo/previewSrc.tsx">Custom preview image</code>
<code src="./demo/controlled-preview.tsx">Controlled Preview</code>
<code src="./demo/toolbarRender.tsx">Custom toolbar render</code>
<code src="./demo/imageRender.tsx">Custom preview render</code>
<code src="./demo/preview-mask.tsx" debug>Custom preview mask</code>
<code src="./demo/preview-group-top-progress.tsx" debug>Top progress customization when previewing multiple images</code>
<code src="./demo/component-token.tsx" debug>Custom component token</code>

## API

### Image

| Property | Description | Type | Default | Version |
| --- | --- | --- | --- | --- |
| alt | Image description | string | - | 4.6.0 |
| fallback | Load failure fault-tolerant src | string | - | 4.6.0 |
| height | Image height | string \| number | - | 4.6.0 |
| placeholder | Load placeholder, use default placeholder when set `true` | ReactNode | - | 4.6.0 |
| preview | preview config, disabled when `false` | boolean \| [previewType](#previewtype) | true | 4.6.0 [previewType](#previewtype):4.7.0 |
| preview | preview config, disabled when `false` | boolean \| [PreviewType](#PreviewType) | true | 4.6.0 [PreviewType](#PreviewType):4.7.0 |
| src | Image path | string | - | 4.6.0 |
| width | Image width | string \| number | - | 4.6.0 |
| onError | Load failed callback | (event: Event) => void | - | 4.12.0 |
| rootClassName | add custom className for image root DOM and preview mode root DOM | string | - | 4.20.0 |
| rootClassName | Add custom className for image root DOM and preview mode root DOM | string | - | 4.20.0 |

Other attributes [&lt;img>](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/img#Attributes)

### previewType

Expand All @@ -60,7 +66,115 @@ Previewable image.
}
```

Other attributes [&lt;img>](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/img#Attributes)
### PreviewType

| 参数 | 说明 | 类型 | 默认值 | 版本 |
| --- | --- | --- | --- | --- |
| visible | Whether the preview dialog is visible or not | boolean | - | - |
| src | Custom preview src | string | - | 4.10.0 |
| getContainer | The mounted node for preview dialog but still display at fullScreen | string \| HTMLElement \| (() => HTMLElement) \| false | - | 4.8.0 |
| mask | Thumbnail mask | ReactNode | - | 4.9.0 |
| maskClassName | The className of the mask | string | - | 4.11.0 |
| rootClassName | The classname of the preview root DOM | string | - | 5.4.0 |
| scaleStep | The number to which the scale is increased or decreased | number | - | - |
| minScale | Min scale | number | 1 | 5.7.0 |
| maxScale | Max scale | number | 50 | 5.7.0 |
| forceRender | Force render preview dialog | boolean | - | - |
| toolbarRender | Custom toolbar render | (params: Omit<[ToolbarRenderType](#ToolbarRenderType), 'current' \| 'total'>) => React.ReactNode | - | 5.7.0 |
| imageRender | Custom preview content | { originalNode: React.ReactNode, transform: [TransformType](#TransformType) } => React.ReactNode | - | 5.7.0 |
| onTransform | Callback when the transform of image changed | { transform: [TransformType](#TransformType), action: [TransformAction](#TransformAction) } | - | 5.7.0 |
| onVisibleChange | Callback when `visible` changed | (visible: boolean, prevVisible: boolean) => void | - | - |

## PreviewGroup

| 参数 | 说明 | 类型 | 默认值 | 版本 |
| --- | --- | --- | --- | --- |
| preview | Preview config, `disabled` when false | boolean \| [PreviewGroupType](#PreviewGroupType) | true | 4.6.0 [PreviewGroupType](#PreviewGroupType):4.7.0 |
| items | Preview items | string[] \| { src: string, crossOrigin: string, ... }[] | - | 5.7.0 |

### PreviewGroupType

| 参数 | 说明 | 类型 | 默认值 | 版本 |
| --- | --- | --- | --- | --- |
| visible | Whether the preview dialog is visible or not | boolean | - | - |
| getContainer | The mounted node for preview dialog but still display at fullScreen | string \| HTMLElement \| (() => HTMLElement) \| false | - | 4.8.0 |
| current | The index of the current preview | number | - | 4.12.0 |
| mask | Thumbnail mask | ReactNode | - | 4.9.0 |
| maskClassName | The className of the mask | string | - | 4.11.0 |
| rootClassName | The classname of the preview root DOM | string | - | 5.4.0 |
| scaleStep | The number to which the scale is increased or decreased | number | - | - |
| minScale | Min scale | number | 1 | 5.7.0 |
| maxScale | Max scale | number | 50 | 5.7.0 |
| forceRender | Force render preview dialog | boolean | - | - |
| countRender | Custom preview count content | (current: number, total: number) => string | - | 4.20.0 |
| toolbarRender | Custom toolbar render | (params: [ToolbarRenderType](#ToolbarRenderType)) => React.ReactNode | - | 5.7.0 |
| imageRender | Custom preview content | { originalNode: React.ReactNode, transform: [TransformType](#TransformType), current: number } => React.ReactNode | - | 5.7.0 |
| onTransform | Callback when the transform of image changed | { transform: [TransformType](#TransformType), action: [TransformAction](#TransformAction) } | - | 5.7.0 |
| onChange | Callback when switch preview image | (current: number, prevCurrent: number) => void | - | 5.3.0 |
| onVisibleChange | Callback when `visible` changed | (visible: boolean, prevVisible: boolean, current: number) => void | - | current 参数 5.3.0 |

## Interface

### TransformType

```typescript
{
x: number;
y: number;
rotate: number;
scale: number;
flipX: boolean;
flipY: boolean;
}
```

### TransformAction

```typescript
type TransformAction =
| 'flipY'
| 'flipX'
| 'rotateLeft'
| 'rotateRight'
| 'zoomIn'
| 'zoomOut'
| 'close'
| 'prev'
| 'next'
| 'wheel'
| 'doubleClick'
| 'move'
| 'dragRebound';
```

### ToolbarRenderType

```typescript
{
originalNode: React.ReactNode;
icons: {
flipYIcon: React.ReactNode;
flipXIcon: React.ReactNode;
rotateLeftIcon: React.ReactNode;
rotateRightIcon: React.ReactNode;
zoomOutIcon: React.ReactNode;
zoomInIcon: React.ReactNode;
closeIcon: React.ReactNode;
};
actions: {
flipY: () => void;
flipX: () => void;
rotateLeft: () => void;
rotateRight: () => void;
zoomOut: () => void;
zoomIn: () => void;
close: () => void;
};
transform: TransformType,
current: number;
total: number;
}
```

## Design Token

Expand Down

0 comments on commit 34cfae4

Please sign in to comment.