refactor: html node support dx, dy (#6237)

* refactor(elements): html node support dx, dy

* docs: add html demo

---------

Co-authored-by: antv <antv@antfin.com>
This commit is contained in:
Aaron 2024-08-27 15:01:58 +08:00 committed by GitHub
parent df139d4b6e
commit c9ba7fcce6
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 113 additions and 2 deletions

View File

@ -26,6 +26,20 @@ export interface HTMLStyleProps extends BaseNodeStyleProps {
* <en/> HTML content, can be a string or `HTMLElement`
*/
innerHTML: string | HTMLElement;
/**
* <zh/> HTML dx
*
* <en/> Horizontal offset. The HTML container defaults to the upper left corner as the origin, and the horizontal offset is performed through dx
* @defaultValue 0
*/
dx?: number;
/**
* <zh/> HTML dy
*
* <en/> Vertical offset. The HTML container defaults to the upper left corner as the origin, and the vertical offset is performed through dy
* @defaultValue 0
*/
dy?: number;
}
/**
@ -69,9 +83,13 @@ export class HTML extends BaseNode<HTMLStyleProps> {
}
protected getKeyStyle(attributes: Required<HTMLStyleProps>): GHTMLStyleProps {
const style = pick(attributes, ['innerHTML', 'pointerEvents', 'cursor']) as unknown as HTMLStyleProps;
const {
dx = 0,
dy = 0,
...style
} = pick(attributes, ['dx', 'dy', 'innerHTML', 'pointerEvents', 'cursor']) as unknown as HTMLStyleProps;
const [width, height] = this.getSize(attributes);
return { ...style, width, height };
return { x: dx, y: dy, ...style, width, height };
}
protected drawKeyShape(attributes: Required<HTMLStyleProps>, container: Group) {

View File

@ -0,0 +1,72 @@
import { Graph } from '@antv/g6';
const ICON_MAP = {
error: '&#10060;',
overload: '&#9889;',
running: '&#9989;',
};
const COLOR_MAP = {
error: '#f5222d',
overload: '#faad14',
running: '#52c41a',
};
const graph = new Graph({
container: 'container',
data: {
nodes: [
{ id: 'node-1', data: { location: 'East', status: 'error', ip: '192.168.1.2' } },
{ id: 'node-2', data: { location: 'West', status: 'overload', ip: '192.168.1.3' } },
{ id: 'node-3', data: { location: 'South', status: 'running', ip: '192.168.1.4' } },
],
},
node: {
type: 'html',
style: {
size: [240, 80],
dx: -120,
dy: -40,
innerHTML: (d) => {
const {
data: { location, status, ip },
} = d;
const color = COLOR_MAP[status];
return `
<div
style="
width:100%;
height: 100%;
background: ${color}bb;
border: 1px solid ${color};
color: #fff;
user-select: none;
display: flex;
padding: 10px;
"
>
<div style="display: flex;flex-direction: column;flex: 1;">
<div style="font-weight: bold;">
${location} Node
</div>
<div>
status: ${status} ${ICON_MAP[status]}
</div>
</div>
<div>
<span style="border: 1px solid white; padding: 2px;">
${ip}
</span>
</div>
</div>`;
},
},
},
layout: {
type: 'grid',
},
behaviors: ['drag-element', 'zoom-canvas'],
});
graph.render();

View File

@ -76,6 +76,14 @@
},
"screenshot": "https://mdn.alipayobjects.com/huamei_qa8qxu/afts/img/A*YSVjSLyYNwIAAAAAAAAAAAAADmJ7AQ/original"
},
{
"filename": "html.js",
"title": {
"zh": "HTML节点",
"en": "HTML节点"
},
"screenshot": "https://mdn.alipayobjects.com/huamei_qa8qxu/afts/img/A*TvSOSINFbBIAAAAAAAAAAAAADmJ7AQ/original"
},
{
"filename": "donut.js",
"title": {

View File

@ -0,0 +1,13 @@
import { expect, test } from '@playwright/test';
test.describe('element node html', () => {
test('html', async ({ page }) => {
await page.goto('/?Demo=elementNodeHTML&Renderer=canvas&GridLine=true&Theme=light&Animation=false');
await page.waitForSelector('.key');
const clip = { x: 100, y: 100, width: 240, height: 180 };
await expect(page).toHaveScreenshot({ clip });
});
});

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB