Compare commits

..

254 Commits

Author SHA1 Message Date
vector
44a5cfdbc3 chore: remove some workflows (#3400) 2023-03-19 09:24:04 +08:00
vector
cbae927138 chore: change pnpm registry (#3401) 2023-03-19 09:19:09 +08:00
vector
adc06ada96 fix: add timeout to wait target node is connected (#3392) 2023-03-17 10:38:50 +08:00
x6-bot[bot]
96ed42b5eb chore: update contributors [skip ci] 2023-03-16 08:37:56 +00:00
Struggle Roue
4b1a0f8b31 feat: createWidget and clearWidget (#3337)
* feat: createWidget and clearWidget

* feat: createWidget and clearWidget

* feat: 手动触发transofrom和clear

* chore: code optimize

* chore: code optimize
2023-03-16 16:37:31 +08:00
vector
ac71e239cf chore: remove corejs deps (#3390)
* docs: update warnning for x6-react-shape

* chore: remove corejs deps
2023-03-16 11:19:07 +08:00
x6-bot[bot]
f4afde62d1 chore: update contributors [skip ci] 2023-03-16 03:18:31 +00:00
Xia Wenqi
a277a8995d docs: 补充 view:mounted 和 view:unmounted 文档 (#3385) 2023-03-16 11:18:08 +08:00
vector
e93021bfb7 docs: update warnning for x6-react-shape (#3388) 2023-03-16 11:06:21 +08:00
x6-bot[bot]
c1dedfa515 chore: update contributors [skip ci] 2023-03-16 01:29:05 +00:00
x6-bot[bot]
baabd328b6 chore: update contributors [skip ci] 2023-03-15 03:20:01 +00:00
vector
37515c45c8 fix: add dependencies for x6-devtools (#3381)
* fix: add dependencies for x6-devtools

* docs: add tips for react-shape
2023-03-15 11:19:37 +08:00
x6-bot[bot]
efc45f6f01 chore: update CONTRIBUTORS [skip ci] 2023-03-15 03:13:38 +00:00
vector
be8f734aa6 chore: release 3 packages (#3377)
@antv/x6-react-shape@2.1.1
@antv/x6-vue-shape@2.0.10
@antv/x62.5.5
2023-03-15 11:08:25 +08:00
Lloyd Zhou
68e3ef1535 feat: devtool show plugin (#3373)
* feat: add show plugin

* feat: add show plugin

* feat: add show plugin
2023-03-15 11:07:04 +08:00
Lloyd Zhou
6cb7a60e5d Feature devtool (#3363)
* feat: add x6-devtool

* feat: add x6-devtool

* feat: add x6-devtool

* chore: update prettierignore

* feat: calc inspect div location

* feat: change icon

* feat: modify value for node/edge
2023-03-09 22:47:49 +08:00
Lloyd Zhou
943c06b272 refactor: using Object.values instead of Object.keys (#3352)
* refactor: using Object.values instead of Object.keys

* refactor: using Object.values instead of Object.keys
2023-03-09 22:44:27 +08:00
vector
8b1f661585 fix: confirm viewitem exist (#3357) 2023-03-07 16:06:37 +08:00
Lloyd Zhou
d72ff80be7 fix: hotfix #3351 error when call resetViews (#3356) 2023-03-07 15:47:49 +08:00
vector
1a22248945 chore: release 1 packages (x6-angular-shape) (#3348) 2023-03-06 15:23:27 +08:00
vector
5d68501568 chore: release 1 packages (#3347) 2023-03-06 11:44:05 +08:00
vector
1de8ebe77a fix: reset all views when fromjson (#3346) 2023-03-06 11:35:25 +08:00
x6-bot[bot]
42011b7bb2 chore: update contributors [skip ci] 2023-03-03 10:58:27 +00:00
wseven7677
3bb76edd2e docs: update warning block style (#3343) 2023-03-03 18:58:04 +08:00
Struggle Roue
05fd60952e docs: transform (#3339) 2023-03-03 16:41:06 +08:00
x6-bot[bot]
0138ef02ea chore(release): release 2 packages [skip ci]
[@antv/x6@2.5.2](https://www.npmjs.com/package/@antv/x6/v/2.5.2)
[@antv/x6@2.5.2](https://github.com/antvis/X6/releases/tag/%40antv/x6%402.5.2)

[@antv/x6-sites@1.6.5](https://github.com/antvis/X6/releases/tag/%40antv/x6-sites%401.6.5)
2023-03-02 09:48:09 +00:00
vector
2685e331bb chore: release 2 packages (#3336) 2023-03-02 17:36:39 +08:00
vector
ab0c7fe8f2 docs: fix error in cylinder shape (#3335) 2023-03-02 17:24:58 +08:00
vector
c76a23b534 fix: add excludeShapes options for manhattan router (#3334) 2023-03-02 17:24:46 +08:00
vector
2285e5592e chore: add src to files (#3333) 2023-03-02 17:01:55 +08:00
Struggle Roue
8ebd6dfd76 Feat/history add getSize (#3291)
* feat: add getSize api

* doc: history doc

* feat: add setSize api

* feat: change order

* feat: fix setSize

* fix: add get  hisotry undo stack remain size

* feat: plugin get size

* feat: add doc
2023-03-02 16:53:57 +08:00
vector
a1d86424cf fix: throw error when render edge without terminal (#3331) 2023-03-02 16:39:04 +08:00
vector
309b5a7ff7 docs: remove freeze call (#3332) 2023-03-02 16:38:46 +08:00
x6-bot[bot]
5338b73861 chore(release): release 1 package [skip ci]
[@antv/x6-sites@1.6.3](https://github.com/antvis/X6/releases/tag/%40antv/x6-sites%401.6.3)
2023-03-02 06:13:24 +00:00
vector
90f5912529 docs: update screenshot for curve demo (#3329) 2023-03-02 14:02:12 +08:00
x6-bot[bot]
3cd75ec40e chore: update contributors [skip ci] 2023-03-01 11:13:18 +00:00
Struggle Roue
1904e28f77 chore: should toast pnpm >= 7 (#3325)
feat: should limit pnpm >= 7
2023-03-01 19:12:53 +08:00
x6-bot[bot]
75c878009e chore: update contributors [skip ci] 2023-03-01 06:31:31 +00:00
Lloyd Zhou
ece81529bb chore: add awesome-x6 link (#3314)
* chore: add awesome-x6 link

* chore: add awesome-x6 link
2023-03-01 14:31:09 +08:00
Struggle Roue
94a7f85882 chore: not required plugin should use optional options (#3313)
chore: not required should use optional
2023-03-01 10:18:31 +08:00
x6-bot[bot]
11ae288eb0 chore: update contributors [skip ci] 2023-03-01 01:30:28 +00:00
x6-bot[bot]
3cc8b764b1 chore(release): release 1 package [skip ci]
[@antv/x6-sites@1.6.2](https://github.com/antvis/X6/releases/tag/%40antv/x6-sites%401.6.2)
2023-02-28 07:41:12 +00:00
Struggle Roue
5758ef80ef docs: getstart (#3318) 2023-02-28 15:25:42 +08:00
x6-bot[bot]
3811a6c0b2 chore(release): release 1 package [skip ci]
[@antv/x6-sites@1.6.1](https://github.com/antvis/X6/releases/tag/%40antv/x6-sites%401.6.1)
2023-02-27 09:14:54 +00:00
vector
672f104991 docs: update example styles for website (#3310) 2023-02-27 17:00:15 +08:00
vector
2571cb4ceb chore: update license (#3309) 2023-02-27 16:19:16 +08:00
x6-bot[bot]
d83bcea863 chore: update contributors [skip ci] 2023-02-27 07:59:22 +00:00
Eve-Sama
38bdf65dde feat: support angular shape for 2.x (#3278)
* feat: add angular shape

* docs: add angular shape docs

* docs: update docs

* fix: 修复无法在 shape 内部安装依赖的问题
2023-02-27 15:59:01 +08:00
x6-bot[bot]
f5db2bb415 chore: update contributors [skip ci] 2023-02-27 07:43:52 +00:00
vector
a3aa2a0da2 fix: fix editor-tool for edge (#3308) 2023-02-27 15:43:29 +08:00
x6-bot[bot]
2bce01dee8 chore: update CONTRIBUTORS [skip ci] 2023-02-27 03:42:56 +00:00
vector
a30b6632a0 feat: add view:mounted and view:unmounted event (#3307) 2023-02-27 11:41:22 +08:00
Ko.Rei
7656b38735 fix: cannot be invoked without new (#3296)
fix Class constructor xx cannot be invoked without 'new'
2023-02-27 11:35:37 +08:00
x6-bot[bot]
d953a732b3 chore(release): release 1 package [skip ci]
[@antv/x6-sites@1.5.5](https://github.com/antvis/X6/releases/tag/%40antv/x6-sites%401.5.5)
2023-02-27 03:05:34 +00:00
vector
6317493347 docs: optimize examples style for doc (#3306) 2023-02-27 10:54:45 +08:00
x6-bot[bot]
8fc0b72b66 chore: update contributors [skip ci] 2023-02-27 01:29:39 +00:00
x6-bot[bot]
18fca29bd7 chore: update contributors [skip ci] 2023-02-24 12:33:15 +00:00
vector
7e61014b65 docs: set version list to 2.x and 1.x (#3301) 2023-02-24 20:32:48 +08:00
x6-bot[bot]
8dd2b66633 chore(release): release 3 packages [skip ci]
[@antv/x6-common@2.0.10](https://www.npmjs.com/package/@antv/x6-common/v/2.0.10)
[@antv/x6-common@2.0.10](https://github.com/antvis/X6/releases/tag/%40antv/x6-common%402.0.10)

[@antv/x6-plugin-transform@2.1.6](https://www.npmjs.com/package/@antv/x6-plugin-transform/v/2.1.6)
[@antv/x6-plugin-transform@2.1.6](https://github.com/antvis/X6/releases/tag/%40antv/x6-plugin-transform%402.1.6)

[@antv/x6-sites@1.5.4](https://github.com/antvis/X6/releases/tag/%40antv/x6-sites%401.5.4)
2023-02-24 08:56:41 +00:00
HQidea
76fb1acf74 fix: add textLength & lengthAdjust to CASE_SENSITIVE_ATTR (#3281) 2023-02-24 16:45:35 +08:00
Struggle Roue
709a141e28 fix: transform active-handle class should remove when active removed (#3298)
fix: transform
2023-02-24 16:42:49 +08:00
x6-bot[bot]
2ee81fd94b chore: update CONTRIBUTORS [skip ci] 2023-02-23 15:00:09 +00:00
x6-bot[bot]
054eb998fa chore: update contributors [skip ci] 2023-02-23 14:53:56 +00:00
wseven7677
e32227ae31 docs: fix warning display style (#3294) 2023-02-23 22:53:33 +08:00
x6-bot[bot]
278b798c0a chore: update CONTRIBUTORS [skip ci] 2023-02-23 13:37:37 +00:00
x6-bot[bot]
c4e11dc98f chore: update contributors [skip ci] 2023-02-23 13:29:51 +00:00
nobugforever
df8466aa33 doc: 修复graph文档 (#3293) 2023-02-23 21:29:31 +08:00
vector
1b958d626f chore: release x6@2.5.1 (#3284) 2023-02-23 11:17:21 +08:00
vector
946582c242 fix: add judgment for edge view (#3282) 2023-02-23 11:12:42 +08:00
x6-bot[bot]
482d77ad09 chore(release): release 1 package [skip ci]
[@antv/x6-sites@1.5.3](https://github.com/antvis/X6/releases/tag/%40antv/x6-sites%401.5.3)
2023-02-23 03:01:42 +00:00
vector
3103c11991 chore: change docsearch appid (#3280) 2023-02-23 10:50:48 +08:00
vector
3c9093f3ec chore: release 2 packages (#3279) 2023-02-23 10:50:29 +08:00
x6-bot[bot]
8a89caab27 chore: update contributors [skip ci] 2023-02-23 01:29:28 +00:00
HQidea
ed999c630c docs: fix a broken link in model.zh.md (#3275) 2023-02-22 21:03:46 +08:00
x6-bot[bot]
34bcd12038 chore: update CONTRIBUTORS [skip ci] 2023-02-22 08:09:25 +00:00
vector
9138978918 fix: leading reset render area when init (#3272)
feat: refactor the virtual rendering logic
2023-02-22 16:02:44 +08:00
x6-bot[bot]
46f4c8ac2a chore: update CONTRIBUTORS [skip ci] 2023-02-21 07:09:05 +00:00
x6-bot[bot]
7519b11e66 chore: update contributors [skip ci] 2023-02-21 07:01:22 +00:00
HQidea
5882b6a599 docs: fix typo in stencil.md (#3267) 2023-02-21 15:01:00 +08:00
x6-bot[bot]
9781fb48f5 chore: update CONTRIBUTORS [skip ci] 2023-02-20 07:21:00 +00:00
x6-bot[bot]
c8a03ed2ba chore: update contributors [skip ci] 2023-02-20 07:14:36 +00:00
linkun
b944419572 docs: fix typo in labels.zh.md (#3261) 2023-02-20 15:14:14 +08:00
x6-bot[bot]
bebc5652d1 chore: update contributors [skip ci] 2023-02-19 01:29:30 +00:00
x6-bot[bot]
8daa2c9b98 chore(release): release 3 packages [skip ci]
[@antv/x6-common@2.0.8](https://www.npmjs.com/package/@antv/x6-common/v/2.0.8)
[@antv/x6-common@2.0.8](https://github.com/antvis/X6/releases/tag/%40antv/x6-common%402.0.8)

[@antv/x6-example-features@2.1.1](https://github.com/antvis/X6/releases/tag/%40antv/x6-example-features%402.1.1)

[@antv/x6-sites@1.5.2](https://github.com/antvis/X6/releases/tag/%40antv/x6-sites%401.5.2)
2023-02-18 22:39:19 +00:00
Lloyd Zhou
c510756fe4 fix: mindmap demo duplicate node id, close #3256 (#3257) 2023-02-19 06:28:20 +08:00
vector
9b4fa86daa fix: fix typo for dom event handlers (#3255) 2023-02-19 06:28:02 +08:00
x6-bot[bot]
7e86ba90d6 chore: update contributors [skip ci] 2023-02-18 01:29:04 +00:00
x6-bot[bot]
f27bec6bb8 chore: update CONTRIBUTORS [skip ci] 2023-02-17 15:37:04 +00:00
张子睿
c38006a358 docs: history插件文档补充stackSize属性的说明 (#3254) 2023-02-17 23:28:02 +08:00
x6-bot[bot]
5f2783aade chore(release): release 2 packages [skip ci]
[@antv/x6-example-features@2.1.0](https://github.com/antvis/X6/releases/tag/%40antv/x6-example-features%402.1.0)

[@antv/x6-plugin-history@2.2.0](https://www.npmjs.com/package/@antv/x6-plugin-history/v/2.2.0)
[@antv/x6-plugin-history@2.2.0](https://github.com/antvis/X6/releases/tag/%40antv/x6-plugin-history%402.2.0)
2023-02-17 13:57:56 +00:00
Struggle Roue
fba531064a feat: history add max stack size (#3253)
* feat: init

* feat: add demo

* feat: add demo

* feat: add demo

* feat: limit undoStack size

* feat: 0 means not limit

---------

Co-authored-by: lijianqiang.seven <lijianqiang.seven@bytedance.com>
Co-authored-by: zhangzirui.1993 <zhangzirui.1993@bytedance.com>
2023-02-17 21:46:59 +08:00
Lloyd Zhou
04656f33f4 feat: add updateNode/updateEdge API #3235 (#3239)
* feat: add updateNode/updateEdge API #3235

* feat: add updateNode/updateEdge API #3235

* feat: update return value

* fix: call error create function
2023-02-17 21:27:40 +08:00
x6-bot[bot]
441dd564b4 chore: update CONTRIBUTORS [skip ci] 2023-02-16 11:11:30 +00:00
vector
9ccda3e96f fix: donot empty text when only has title elem (#3248) 2023-02-16 19:04:46 +08:00
x6-bot[bot]
979b2556e9 chore: update contributors [skip ci] 2023-02-16 01:29:34 +00:00
x6-bot[bot]
153013a606 chore: update CONTRIBUTORS [skip ci] 2023-02-15 03:16:40 +00:00
Struggle Roue
2c7b966f45 chore: queueJob optimize (#3226)
* chore: queueJob optimize

* chore: queueJob optimize

* chore: queueJob optimize
2023-02-15 11:10:00 +08:00
x6-bot[bot]
b199153f3b chore: update CONTRIBUTORS [skip ci] 2023-02-13 15:12:24 +00:00
x6-bot[bot]
608ce9ac6c chore: update contributors [skip ci] 2023-02-13 15:05:20 +00:00
Xia Wenqi
eb921f7018 docs: fix typo (#3234) 2023-02-13 23:04:59 +08:00
x6-bot[bot]
68e7132213 chore: update contributors [skip ci] 2023-02-12 01:29:21 +00:00
x6-bot[bot]
62aa5323ce chore: update contributors [skip ci] 2023-02-11 01:28:45 +00:00
x6-bot[bot]
e380cba7d9 chore: update CONTRIBUTORS [skip ci] 2023-02-10 02:03:59 +00:00
vector
8fada570e4 fix: add padding options for position api (#3225) 2023-02-10 09:57:41 +08:00
vector
1096bf171b fix: fix scroller options typo (#3224) 2023-02-10 09:57:22 +08:00
x6-bot[bot]
1834cd2143 chore: update contributors [skip ci] 2023-02-09 06:26:51 +00:00
Struggle Roue
1cf9cb654f chore: should use local to format (#3222) 2023-02-09 14:26:30 +08:00
x6-bot[bot]
b392d78856 chore(release): release 3 packages [skip ci]
[@antv/x6@2.3.0](https://www.npmjs.com/package/@antv/x6/v/2.3.0)
[@antv/x6@2.3.0](https://github.com/antvis/X6/releases/tag/%40antv/x6%402.3.0)

[@antv/x6-plugin-keyboard@2.2.0](https://www.npmjs.com/package/@antv/x6-plugin-keyboard/v/2.2.0)
[@antv/x6-plugin-keyboard@2.2.0](https://github.com/antvis/X6/releases/tag/%40antv/x6-plugin-keyboard%402.2.0)

[@antv/x6-sites@1.5.0](https://github.com/antvis/X6/releases/tag/%40antv/x6-sites%401.5.0)
2023-02-06 14:39:13 +00:00
vector
58c0fe459c feat: add options for positionCell api (#3208) 2023-02-06 22:28:20 +08:00
x6-bot[bot]
8a510fa8f8 chore: update contributors [skip ci] 2023-02-06 14:16:48 +00:00
Struggle Roue
668c93242f feat: keyboard support clear and custom trigger (#3202)
* feat: keyboard support clear and custom trigger

* feat: keyboard support clear and custom trigger

* feat: add return this

* feat: add doc

* feat: add doc

* feat: adjust order

* feat: change order

---------

Co-authored-by: Struggle <lijianqiang.seven@bytedance.com>
2023-02-06 22:16:28 +08:00
x6-bot[bot]
c122b2122c chore: update CONTRIBUTORS [skip ci] 2023-02-06 04:14:50 +00:00
x6-bot[bot]
3b9957efbb chore: update contributors [skip ci] 2023-02-06 04:08:38 +00:00
Samuel Bodin
1f83a2b8a8 fix(scheduler): remove spammy console.log (#3200)
fix: remove spammy console.log

Hey, 
This console.log ended up in production build, not sure it was on purpose.
2023-02-06 12:08:14 +08:00
x6-bot[bot]
6699c2bd00 chore: update contributors [skip ci] 2023-02-03 06:10:28 +00:00
Struggle Roue
7192209a5c Feat plugins dis and en (#3171)
* fix: graph plugin support disable and enable

* fix: graph plugin support disable and enable

* fix: graph plugin support disable and enable and add getPlugins

* fix: deal compatibility problem

* chore: unify plugin disable and enable return value

* chore: unify plugin disable and enable return value

* feat: add disposePlugins and isEnabled

* feat: optimize test form

---------

Co-authored-by: seven <lijianqiang.seven@bytedance.com>
2023-02-03 14:10:03 +08:00
bubkoo
5da5575451 chore: remove empty line in comment 2023-02-03 12:13:15 +08:00
bubkoo
3377049a49 chore: checkout repo without credentials 2023-02-03 12:13:15 +08:00
x6-bot[bot]
4e76734cee chore(release): release 1 package [skip ci]
[@antv/x6@2.2.1](https://www.npmjs.com/package/@antv/x6/v/2.2.1)
[@antv/x6@2.2.1](https://github.com/antvis/X6/releases/tag/%40antv/x6%402.2.1)
2023-02-02 09:13:25 +00:00
vector
3a59703f1c fix: ensure the container in html view (#3196) 2023-02-02 17:00:48 +08:00
vector
45218c36f6 fix: set correct scroller options (#3195) 2023-02-02 16:39:46 +08:00
vector
17b36e21c7 fix: clear old background when background enabled in background (#3192) 2023-02-01 22:55:29 +08:00
x6-bot[bot]
1682a1d953 chore: update CONTRIBUTORS [skip ci] 2023-02-01 11:27:54 +00:00
vector
bcf3380d2b fix: get correct clipboard content when useLocalStorage enabed (#3189) 2023-02-01 19:20:26 +08:00
x6-bot[bot]
24368d4f86 chore(release): release 4 packages [skip ci]
[@antv/x6@2.2.0](https://www.npmjs.com/package/@antv/x6/v/2.2.0)
[@antv/x6@2.2.0](https://github.com/antvis/X6/releases/tag/%40antv/x6%402.2.0)

[@antv/x6-common@2.0.6](https://www.npmjs.com/package/@antv/x6-common/v/2.0.6)
[@antv/x6-common@2.0.6](https://github.com/antvis/X6/releases/tag/%40antv/x6-common%402.0.6)

[@antv/x6-react-components@2.0.7](https://www.npmjs.com/package/@antv/x6-react-components/v/2.0.7)
[@antv/x6-react-components@2.0.7](https://github.com/antvis/X6/releases/tag/%40antv/x6-react-components%402.0.7)

[@antv/x6-sites@1.4.0](https://github.com/antvis/X6/releases/tag/%40antv/x6-sites%401.4.0)
2023-01-31 09:52:16 +00:00
vector
3265fe5b98 feat: add port events (#3185) 2023-01-31 17:41:12 +08:00
x6-bot[bot]
5599286473 chore: update CONTRIBUTORS [skip ci] 2023-01-30 19:48:36 +00:00
vector
d64150bfad fix: fix index error for priorityQueue (#3179) 2023-01-31 03:41:53 +08:00
vector
cae8625feb fix: don't hide when click on color picker (#3172) 2023-01-29 14:47:43 +08:00
x6-bot[bot]
d8f1729f09 chore: update contributors [skip ci] 2023-01-28 07:57:12 +00:00
Struggle Roue
20c170b44a Fix/edge mousedown (#3169)
* fix: onMousedown add event notify

* fix: onMousedown add super event notify

* fix: use notifyMouseDown

---------

Co-authored-by: seven <lijianqiang.seven@bytedance.com>
2023-01-28 15:56:54 +08:00
x6-bot[bot]
0e8769642a chore: update contributors [skip ci] 2023-01-28 06:20:00 +00:00
vector
bd30f7f61d fix: prevent highlighting new edge (#3170) 2023-01-28 14:19:38 +08:00
x6-bot[bot]
e3e7cfc66f chore: update CONTRIBUTORS [skip ci] 2023-01-28 02:17:37 +00:00
Struggle Roue
c86ed1a031 chore: use find to repalce forEach (#3159)
Co-authored-by: seven <lijianqiang.seven@bytedance.com>
2023-01-28 10:09:53 +08:00
x6-bot[bot]
ae179eb2cd chore(release): release 1 package [skip ci]
[@antv/x6@2.1.6](https://www.npmjs.com/package/@antv/x6/v/2.1.6)
[@antv/x6@2.1.6](https://github.com/antvis/X6/releases/tag/%40antv/x6%402.1.6)
2023-01-19 02:28:11 +00:00
vector
2a3e523b1b refactor: refactor cell remove schedule (#3154) 2023-01-19 10:17:11 +08:00
x6-bot[bot]
b5af7844af chore(release): release 1 package [skip ci]
[@antv/x6-common@2.0.5](https://www.npmjs.com/package/@antv/x6-common/v/2.0.5)
[@antv/x6-common@2.0.5](https://github.com/antvis/X6/releases/tag/%40antv/x6-common%402.0.5)
2023-01-18 15:08:37 +00:00
vector
9c48ad8dfc fix: optimize css loader (#3156) 2023-01-18 22:55:16 +08:00
x6-bot[bot]
1a5f1655df chore(release): release 2 packages [skip ci]
[@antv/x6-example-features@2.0.2](https://github.com/antvis/X6/releases/tag/%40antv/x6-example-features%402.0.2)

[@antv/x6-react-components@2.0.6](https://www.npmjs.com/package/@antv/x6-react-components/v/2.0.6)
[@antv/x6-react-components@2.0.6](https://github.com/antvis/X6/releases/tag/%40antv/x6-react-components%402.0.6)
2023-01-17 01:56:18 +00:00
vector
90dad14d7e fix: stop propagation when click menu item (#3147) 2023-01-17 09:42:30 +08:00
x6-bot[bot]
323e01559d chore: update contributors [skip ci] 2023-01-16 15:20:32 +00:00
Lloyd Zhou
bfc8d7f17a fix(mindmap demo): can not find target id when create edge (#3144) 2023-01-16 23:20:08 +08:00
x6-bot[bot]
df24392728 chore: update contributors [skip ci] 2023-01-15 13:21:33 +00:00
Lloyd Zhou
fc940fa53c refactor: mindmap demo remove resetCells (#3141) 2023-01-15 21:21:12 +08:00
x6-bot[bot]
604c848c2a chore(release): release 3 packages [skip ci]
[@antv/x6@2.1.5](https://www.npmjs.com/package/@antv/x6/v/2.1.5)
[@antv/x6@2.1.5](https://github.com/antvis/X6/releases/tag/%40antv/x6%402.1.5)

[@antv/x6-plugin-dnd@2.0.4](https://www.npmjs.com/package/@antv/x6-plugin-dnd/v/2.0.4)
[@antv/x6-plugin-dnd@2.0.4](https://github.com/antvis/X6/releases/tag/%40antv/x6-plugin-dnd%402.0.4)

[@antv/x6-sites@1.3.2](https://github.com/antvis/X6/releases/tag/%40antv/x6-sites%401.3.2)
2023-01-13 14:20:05 +00:00
vector
7b091f35de fix: change dragging container options (#3139) 2023-01-13 22:09:21 +08:00
x6-bot[bot]
95c72c3033 chore: update CONTRIBUTORS [skip ci] 2023-01-13 13:13:12 +00:00
x6-bot[bot]
0c91218b64 chore: update contributors [skip ci] 2023-01-13 13:06:09 +00:00
_XiaoTian
61c030a162 docs: fix document formatting (#3135)
docs: fix document formatting
2023-01-13 21:05:46 +08:00
x6-bot[bot]
5c5f3e5319 chore: update contributors [skip ci] 2023-01-11 02:13:33 +00:00
x6-bot[bot]
06a8f28c2d chore: update contributors [skip ci] 2023-01-10 02:17:09 +00:00
x6-bot[bot]
ece198265b chore: update contributors [skip ci] 2023-01-05 14:48:42 +00:00
vector
6abd0683ea fix: update group even group is empty (#3117) 2023-01-05 22:48:20 +08:00
vector
fff95806c8 docs: add LEGAL for sites (#3112) 2023-01-04 20:41:06 +08:00
a069449782 chore: update badge style 2023-01-04 12:18:58 +08:00
x6-bot[bot]
3b25683529 chore(release): release 2 packages [skip ci]
[@antv/x6@2.1.4](https://www.npmjs.com/package/@antv/x6/v/2.1.4)
[@antv/x6@2.1.4](https://github.com/antvis/X6/releases/tag/%40antv/x6%402.1.4)

[@antv/x6-sites@1.3.1](https://github.com/antvis/X6/releases/tag/%40antv/x6-sites%401.3.1)
2023-01-03 14:07:28 +00:00
vector
45337e4a62 fix: optimize rendering logic to prevent loops (#3108) 2023-01-03 21:56:57 +08:00
x6-bot[bot]
91fc97791b chore(release): release 1 package [skip ci]
[@antv/x6-sites@1.3.0](https://github.com/antvis/X6/releases/tag/%40antv/x6-sites%401.3.0)
2023-01-01 11:58:39 +00:00
x6-bot[bot]
cdd0913eee Update license copyright year(s) (#3104)
docs(license): update copyright year(s)

Co-authored-by: github-actions <github-actions@github.com>
2023-01-01 19:48:23 +08:00
x6-bot[bot]
a696009ede chore: update contributors [skip ci] 2022-12-27 01:29:01 +00:00
x6-bot[bot]
c808ca6d2b chore: update CONTRIBUTORS [skip ci] 2022-12-26 03:30:48 +00:00
依枫
d3301d33d5 feat: add data processing dag example (#3091)
chore: stash code

feat: add dataProcessingDagre demo

feat: dataProcessingDagre demo add animate and cell status style

chore: perf code

chore: perf code

chore: perf code

chore: perf code
2022-12-26 03:23:31 +00:00
bubkoo
0029555458 chore: force use pnpm package manager in this project 2022-12-25 16:13:18 +08:00
x6-bot[bot]
cc18463c53 chore(release): release 3 packages [skip ci]
[@antv/x6@2.1.3](https://www.npmjs.com/package/@antv/x6/v/2.1.3)
[@antv/x6@2.1.3](https://github.com/antvis/X6/releases/tag/%40antv/x6%402.1.3)

[@antv/x6-plugin-transform@2.1.5](https://www.npmjs.com/package/@antv/x6-plugin-transform/v/2.1.5)
[@antv/x6-plugin-transform@2.1.5](https://github.com/antvis/X6/releases/tag/%40antv/x6-plugin-transform%402.1.5)

[@antv/x6-sites@1.2.2](https://github.com/antvis/X6/releases/tag/%40antv/x6-sites%401.2.2)
2022-12-24 14:05:12 +00:00
vector
fb8098c1c0 fix: add defense for view in transform plugin (#3092) 2022-12-24 21:54:09 +08:00
x6-bot[bot]
c250caba6a chore: update CONTRIBUTORS [skip ci] 2022-12-23 12:08:08 +00:00
vector
019333d79d fix: schedule edge when source and target is not ready (#3090) 2022-12-23 20:00:15 +08:00
x6-bot[bot]
33c2e59207 chore(release): release 1 package [skip ci]
[@antv/x6-vue-shape@2.0.9](https://www.npmjs.com/package/@antv/x6-vue-shape/v/2.0.9)
[@antv/x6-vue-shape@2.0.9](https://github.com/antvis/X6/releases/tag/%40antv/x6-vue-shape%402.0.9)
2022-12-21 04:03:39 +00:00
vector
844ee5fa04 fix: get graph from right place (#3078) 2022-12-21 11:52:57 +08:00
vector
96010e3b52 fix: add createView options (#3075) 2022-12-20 20:18:59 +08:00
vector
a98e97db11 fix: add getGraph provide (#3072) 2022-12-20 20:16:07 +08:00
vector
30c2ed2655 fix: optimize snapToGrid options for manhattan (#3071) 2022-12-20 20:15:55 +08:00
x6-bot[bot]
3a020d17c3 chore(release): release 1 package [skip ci]
[@antv/x6-common@2.0.4](https://www.npmjs.com/package/@antv/x6-common/v/2.0.4)
[@antv/x6-common@2.0.4](https://github.com/antvis/X6/releases/tag/%40antv/x6-common%402.0.4)
2022-12-20 03:52:49 +00:00
vector
d8e1e637d8 fix: fix window incompatibility problem (#3070) 2022-12-20 11:39:53 +08:00
x6-bot[bot]
2d04848d52 chore(release): release 1 package [skip ci]
[@antv/x6@2.1.1](https://www.npmjs.com/package/@antv/x6/v/2.1.1)
[@antv/x6@2.1.1](https://github.com/antvis/X6/releases/tag/%40antv/x6%402.1.1)
2022-12-19 14:40:16 +00:00
vector
e2bb71d954 fix: set snapToGrid to false by default (#3066) 2022-12-19 22:29:40 +08:00
x6-bot[bot]
8b145941ec chore: update contributors [skip ci] 2022-12-19 14:28:26 +00:00
bubkoo
2c7a04a6f4 chore: move file 2022-12-19 22:27:23 +08:00
x6-bot[bot]
dfa8c492da chore: update CONTRIBUTORS [skip ci] 2022-12-19 12:57:10 +00:00
Kent Wood
3b668feb4e fix: arrowhead not get options bug (#3065) 2022-12-19 20:49:55 +08:00
x6-bot[bot]
07f4739979 chore(release): release 1 package [skip ci]
[@antv/x6@2.1.0](https://www.npmjs.com/package/@antv/x6/v/2.1.0)
[@antv/x6@2.1.0](https://github.com/antvis/X6/releases/tag/%40antv/x6%402.1.0)
2022-12-19 01:46:51 +00:00
vector
824560ddda feat: add snapToGrid options for manhattan router (#3062)
* docs: update github url

* fix: debounce update to improve performance

* feat: add snapToGrid options for manhattan router
2022-12-19 09:36:17 +08:00
vector
9e37ea9f78 fix: debounce update to improve performance (#3061)
* docs: update github url

* fix: debounce update to improve performance
2022-12-18 21:44:03 +08:00
x6-bot[bot]
610349d924 chore(release): release 3 packages [skip ci]
[@antv/x6@2.0.9](https://www.npmjs.com/package/@antv/x6/v/2.0.9)
[@antv/x6@2.0.9](https://github.com/antvis/X6/releases/tag/%40antv/x6%402.0.9)

[@antv/x6-example-features@2.0.1](https://github.com/antvis/X6/releases/tag/%40antv/x6-example-features%402.0.1)

[@antv/x6-sites@1.2.0](https://github.com/antvis/X6/releases/tag/%40antv/x6-sites%401.2.0)
2022-12-16 10:44:52 +00:00
bubkoo
2f92e33d0e fix: remove useless repo url 2022-12-16 18:33:03 +08:00
bubkoo
df540d9b79 chore: rename dir 2022-12-16 18:19:58 +08:00
bubkoo
3bc37971f8 chore: update deprecated terser plugin
Co-authored-by: NewByVector <vectorse@126.com>
2022-12-16 18:07:58 +08:00
x6-bot[bot]
50284c2d51 chore: update contributors [skip ci] 2022-12-16 08:44:49 +00:00
njshuisheng
15284e778a fix: 🐛 char ghosting when edit text (#2560) (#3043)
* fix: 🐛 char ghosting when edit text (#2560)

* fix: 🐛 grammar style improvement
2022-12-16 16:44:28 +08:00
1a0e8cf969 docs: fix broken CI status badge 2022-12-16 15:44:05 +08:00
vector
1089109b08 chore: update build:watch script (#3035) 2022-12-12 21:26:40 +08:00
vector
faf294a5ec chore: only support react18 in 2.1.x (#3034) 2022-12-12 21:21:41 +08:00
vector
25461fd985 docs: update vue demo (#3033)
* chore: refactor x6-site

* docs: update vue demo
2022-12-12 16:38:16 +08:00
vector
35f2966219 chore: refactor x6-site (#3032)
* chore: refactor x6-site

* chore: fix ts lint and style lint error
2022-12-12 16:21:09 +08:00
vector
26df790b8c chore: remove sites files (#3029) 2022-12-12 10:25:03 +08:00
vector
bc7efe8db9 chore: update package version (#3028) 2022-12-11 20:15:16 +08:00
vector
abeb009d0a fix: cancel debounce update for scroller plugin (#3027) 2022-12-11 17:44:13 +08:00
x6-bot[bot]
ad08cf87ef chore: update contributors [skip ci] 2022-12-10 01:29:38 +00:00
x6-bot[bot]
16c2ef35e0 chore(release): release 1 package [skip ci]
[@antv/x6-vue-shape@2.0.7](https://www.npmjs.com/package/@antv/x6-vue-shape/v/2.0.7)
[@antv/x6-vue-shape@2.0.7](https://github.com/antvis/X6/releases/tag/%40antv/x6-vue-shape%402.0.7)
2022-12-09 07:37:48 +00:00
Lloyd Zhou
187e318aee fix: cannot read properties of undefined when unmount vue component (#3024)
* fix: cannot read properties of undefined when unmount vue component

* fix: cannot read properties of undefined when unmount vue component
2022-12-09 15:26:57 +08:00
x6-bot[bot]
f07abff980 chore(release): release 1 package [skip ci]
[@antv/x6@2.0.8](https://www.npmjs.com/package/@antv/x6/v/2.0.8)
[@antv/x6@2.0.8](https://github.com/antvis/X6/releases/tag/%40antv/x6%402.0.8)
2022-12-08 01:44:43 +00:00
vector
4a6a634a8a fix: trigger preventDefault by origin event (#3017) 2022-12-08 09:35:17 +08:00
x6-bot[bot]
627368e0dd chore(release): release 1 package [skip ci]
[@antv/x6-plugin-transform@2.1.4](https://www.npmjs.com/package/@antv/x6-plugin-transform/v/2.1.4)
[@antv/x6-plugin-transform@2.1.4](https://github.com/antvis/X6/releases/tag/%40antv/x6-plugin-transform%402.1.4)
2022-12-07 09:03:49 +00:00
vector
604c0244cd fix: make resizing options take effect (#3014) 2022-12-07 16:53:46 +08:00
x6-bot[bot]
80898ada1c chore(release): release 1 package [skip ci]
[@antv/x6@2.0.7](https://www.npmjs.com/package/@antv/x6/v/2.0.7)
[@antv/x6@2.0.7](https://github.com/antvis/X6/releases/tag/%40antv/x6%402.0.7)
2022-12-06 09:38:57 +00:00
vector
057d5209ff fix: hide elems when visible is false (#3007) 2022-12-06 17:26:38 +08:00
vector
2070828425 chore: remove ts and style lint error (#2995) 2022-12-05 17:20:38 +08:00
502422fe24 Delete .lgtm.yml 2022-12-05 17:06:19 +08:00
bubkoo
8daf0fd62c chore: config codeql 2022-12-05 16:55:39 +08:00
x6-bot[bot]
a108b50a66 chore: update contributors [skip ci] 2022-12-03 03:49:59 +00:00
vector
525bac1907 chore: release @antv/x6-plugin-selection@2.1.5 (#2994) 2022-12-03 11:49:38 +08:00
x6-bot[bot]
34ec3d29ab chore: update CONTRIBUTORS [skip ci] 2022-12-03 03:34:26 +00:00
Simon He
74fb7b86d7 chore: add eslintcache (#2993)
* chore: add eslintcache

* chore: add eslintcache
2022-12-03 11:27:56 +08:00
vector
1fb2d8308a fix: use geometry in selection box (#2992) 2022-12-02 17:49:13 +08:00
x6-bot[bot]
b2b8ac578c chore: update CONTRIBUTORS [skip ci] 2022-12-02 08:51:57 +00:00
x6-bot[bot]
1b03004ee5 chore: update contributors [skip ci] 2022-12-02 08:44:34 +00:00
njshuisheng
53c9eaf626 chore: update wrong comment word (#2991)
Co-authored-by: hehongsheng <hehongsheng@dolinkhub.com>
2022-12-02 16:44:14 +08:00
vector
05d1fe35d6 fix: remove lint error (#2979)
* chore: release 4 packages

x6@2.0.6
x6-plugin-export@2.1.4
x6-plugin-snapline@2.1.6
x6-react-shape@2.0.6

* fix: remove lint error
2022-12-01 11:51:31 +08:00
bubkoo
b05d1596dd chore: update deps 2022-12-01 11:38:15 +08:00
bubkoo
8843212f53 chore: move '--debug' to env variable 'SRM_DEBUG' 2022-12-01 11:38:15 +08:00
vector
f920d5a4ee fix: export toJpeg methods in export plugin (#2974) 2022-11-30 10:50:30 +08:00
vector
6a81805075 fix: render react shape in dnd graph (#2970) 2022-11-29 21:22:49 +08:00
vector
94f90425f6 fix: support react 17 (#2968) 2022-11-29 19:40:46 +08:00
x6-bot[bot]
cd85c5bd26 chore(release): release 1 package [skip ci]
[@antv/x6-geometry@2.0.4](https://www.npmjs.com/package/@antv/x6-geometry/v/2.0.4)
[@antv/x6-geometry@2.0.4](https://github.com/antvis/X6/releases/tag/%40antv/x6-geometry%402.0.4)
2022-11-29 09:41:38 +00:00
bubkoo
16b6c89e6b fix: regex for excluding coverage 2022-11-29 17:29:47 +08:00
bubkoo
76be8db8ca docs: update sites url 2022-11-29 17:27:40 +08:00
x6-bot[bot]
18c0edf483 chore(release): release 1 package [skip ci]
[@antv/x6-plugin-keyboard@2.1.4](https://www.npmjs.com/package/@antv/x6-plugin-keyboard/v/2.1.4)
[@antv/x6-plugin-keyboard@2.1.4](https://github.com/antvis/X6/releases/tag/%40antv/x6-plugin-keyboard%402.1.4)
2022-11-29 08:53:51 +00:00
vector
4978110b45 fix: not trigger keyboard event whith delete key in contenteditable elem (#2965) 2022-11-29 16:44:32 +08:00
lgtm-com[bot]
8eb43874a5 Add CodeQL workflow for GitHub code scanning (#2948)
Co-authored-by: LGTM Migrator <lgtm-migrator@users.noreply.github.com>
2022-11-29 15:53:33 +08:00
vector
83d0295596 chore: update readme (#2962) 2022-11-29 14:58:10 +08:00
2c40e3d129 chore: hide coverage badge 2022-11-29 10:03:52 +08:00
vector
d903e5a5b6 fix: trigger transform knob after click node (#2956) 2022-11-28 20:19:27 +08:00
vector
c350371d3c fix: dom.data support custom object (#2954) 2022-11-28 16:10:34 +08:00
x6-bot[bot]
9f3ba0f3b4 chore: update contributors [skip ci] 2022-11-28 01:30:11 +00:00
Lloyd Zhou
b0555151e9 fix: render vue shape in minimap with same cellid when using teleport (#2949)
* fix: render vue shape in minimap with same cellid when using teleport

* fix: render vue shape in minimap with same cellid when using teleport
2022-11-27 10:42:13 +08:00
x6-bot[bot]
1d324df545 chore(release): release 1 package [skip ci]
[@antv/x6-plugin-clipboard@2.1.3](https://www.npmjs.com/package/@antv/x6-plugin-clipboard/v/2.1.3)
[@antv/x6-plugin-clipboard@2.1.3](https://github.com/antvis/X6/releases/tag/%40antv/x6-plugin-clipboard%402.1.3)
2022-11-25 11:48:13 +00:00
bubkoo
d6df2d5981 fix: broken file 2022-11-25 18:15:46 +08:00
vector
273102322b chore: update package version (#2943)
* chore: update package version

* chore: fix repository url

* chore: enable publish to npm

Co-authored-by: bubkoo <bubkoo.wy@gmail.com>
2022-11-25 18:13:10 +08:00
x6-bot[bot]
1dcab69b18 chore(release): release 17 packages [skip ci]
[@antv/x6@2.0.4](https://github.com/antvis/X6/releases/tag/%40antv/x6%402.0.4)

[@antv/x6-common@2.0.1](https://github.com/antvis/X6/releases/tag/%40antv/x6-common%402.0.1)

[@antv/x6-geometry@2.0.3](https://github.com/antvis/X6/releases/tag/%40antv/x6-geometry%402.0.3)

[@antv/x6-plugin-clipboard@2.1.2](https://github.com/antvis/X6/releases/tag/%40antv/x6-plugin-clipboard%402.1.2)

[@antv/x6-plugin-dnd@2.0.3](https://github.com/antvis/X6/releases/tag/%40antv/x6-plugin-dnd%402.0.3)

[@antv/x6-plugin-export@2.1.2](https://github.com/antvis/X6/releases/tag/%40antv/x6-plugin-export%402.1.2)

[@antv/x6-plugin-history@2.1.3](https://github.com/antvis/X6/releases/tag/%40antv/x6-plugin-history%402.1.3)

[@antv/x6-plugin-keyboard@2.1.3](https://github.com/antvis/X6/releases/tag/%40antv/x6-plugin-keyboard%402.1.3)

[@antv/x6-plugin-minimap@2.0.3](https://github.com/antvis/X6/releases/tag/%40antv/x6-plugin-minimap%402.0.3)

[@antv/x6-plugin-scroller@2.0.3](https://github.com/antvis/X6/releases/tag/%40antv/x6-plugin-scroller%402.0.3)

[@antv/x6-plugin-selection@2.1.4](https://github.com/antvis/X6/releases/tag/%40antv/x6-plugin-selection%402.1.4)

[@antv/x6-plugin-snapline@2.1.4](https://github.com/antvis/X6/releases/tag/%40antv/x6-plugin-snapline%402.1.4)

[@antv/x6-plugin-stencil@2.0.3](https://github.com/antvis/X6/releases/tag/%40antv/x6-plugin-stencil%402.0.3)

[@antv/x6-plugin-transform@2.1.2](https://github.com/antvis/X6/releases/tag/%40antv/x6-plugin-transform%402.1.2)

[@antv/x6-react-components@2.0.5](https://github.com/antvis/X6/releases/tag/%40antv/x6-react-components%402.0.5)

[@antv/x6-react-shape@2.0.4](https://github.com/antvis/X6/releases/tag/%40antv/x6-react-shape%402.0.4)

[@antv/x6-vue-shape@2.0.4](https://github.com/antvis/X6/releases/tag/%40antv/x6-vue-shape%402.0.4)
2022-11-25 09:50:08 +00:00
bubkoo
cb0cfdeb4d fix: npm version 2022-11-25 17:44:42 +08:00
x6-bot[bot]
bdba8cef5c chore(release): release 16 packages [skip ci]
[@antv/x6@2.0.3](https://github.com/antvis/X6/releases/tag/%40antv/x6%402.0.3)

[@antv/x6-geometry@2.0.2](https://github.com/antvis/X6/releases/tag/%40antv/x6-geometry%402.0.2)

[@antv/x6-plugin-clipboard@2.1.1](https://github.com/antvis/X6/releases/tag/%40antv/x6-plugin-clipboard%402.1.1)

[@antv/x6-plugin-dnd@2.0.2](https://github.com/antvis/X6/releases/tag/%40antv/x6-plugin-dnd%402.0.2)

[@antv/x6-plugin-export@2.1.1](https://github.com/antvis/X6/releases/tag/%40antv/x6-plugin-export%402.1.1)

[@antv/x6-plugin-history@2.1.2](https://github.com/antvis/X6/releases/tag/%40antv/x6-plugin-history%402.1.2)

[@antv/x6-plugin-keyboard@2.1.2](https://github.com/antvis/X6/releases/tag/%40antv/x6-plugin-keyboard%402.1.2)

[@antv/x6-plugin-minimap@2.0.2](https://github.com/antvis/X6/releases/tag/%40antv/x6-plugin-minimap%402.0.2)

[@antv/x6-plugin-scroller@2.0.2](https://github.com/antvis/X6/releases/tag/%40antv/x6-plugin-scroller%402.0.2)

[@antv/x6-plugin-selection@2.1.3](https://github.com/antvis/X6/releases/tag/%40antv/x6-plugin-selection%402.1.3)

[@antv/x6-plugin-snapline@2.1.3](https://github.com/antvis/X6/releases/tag/%40antv/x6-plugin-snapline%402.1.3)

[@antv/x6-plugin-stencil@2.0.2](https://github.com/antvis/X6/releases/tag/%40antv/x6-plugin-stencil%402.0.2)

[@antv/x6-plugin-transform@2.1.1](https://github.com/antvis/X6/releases/tag/%40antv/x6-plugin-transform%402.1.1)

[@antv/x6-react-components@2.0.4](https://github.com/antvis/X6/releases/tag/%40antv/x6-react-components%402.0.4)

[@antv/x6-react-shape@2.0.3](https://github.com/antvis/X6/releases/tag/%40antv/x6-react-shape%402.0.3)

[@antv/x6-vue-shape@2.0.3](https://github.com/antvis/X6/releases/tag/%40antv/x6-vue-shape%402.0.3)
2022-11-25 09:27:28 +00:00
bubkoo
6c4244c747 chore: ignore build 2022-11-25 17:06:13 +08:00
bubkoo
e6a1a71932 chore: disable publish to npm 2022-11-25 17:01:54 +08:00
bubkoo
7d64596767 chore: disable breaking changes 2022-11-25 16:11:46 +08:00
bubkoo
54725040f2 fix: type errors 2022-11-25 15:12:22 +08:00
bubkoo
a2a2e657e9 chore: disable breaking changes 2022-11-25 15:11:02 +08:00
bubkoo
593416d8d9 docs: update homepage of packages 2022-11-25 14:34:56 +08:00
bubkoo
96fc0d79cb chore: remove "gitHead" field 2022-11-25 14:34:56 +08:00
x6-bot[bot]
85aa3c82ca chore(release): release 3 packages [skip ci]
[@antv/x6-plugin-keyboard@2.1.1](https://www.npmjs.com/package/@antv/x6-plugin-keyboard/v/2.1.1)
[@antv/x6-plugin-keyboard@2.1.1](https://github.com/antvis/X6/releases/tag/%40antv/x6-plugin-keyboard%402.1.1)

[@antv/x6-react-components@2.0.3](https://www.npmjs.com/package/@antv/x6-react-components/v/2.0.3)
[@antv/x6-react-components@2.0.3](https://github.com/antvis/X6/releases/tag/%40antv/x6-react-components%402.0.3)

[@antv/x6-react-shape@2.0.2](https://www.npmjs.com/package/@antv/x6-react-shape/v/2.0.2)
[@antv/x6-react-shape@2.0.2](https://github.com/antvis/X6/releases/tag/%40antv/x6-react-shape%402.0.2)
2022-11-25 06:25:01 +00:00
bubkoo
f20127af55 perf: update deps 2022-11-25 14:00:58 +08:00
bubkoo
f275d3df1e chore: combine release commits 2022-11-25 14:00:01 +08:00
bubkoo
3a1f34ecfd chore: do not release with "ci" and "chore" commits 2022-11-25 14:00:01 +08:00
x6-bot[bot]
279caf5173 chore(release): @antv/x6-react-components@2.0.3 [skip ci] 2022-11-24 14:19:16 +00:00
1716 changed files with 69935 additions and 104729 deletions

View File

@@ -1,19 +0,0 @@
name: 🧑 Auto Assign
on:
issues:
types: [opened]
pull_request_target:
types: [opened]
jobs:
run:
runs-on: ubuntu-latest
steps:
- uses: wow-actions/use-app-token@v2
with:
app_id: ${{ secrets.APP_ID }}
private_key: ${{ secrets.PRIVATE_KEY }}
- uses: wow-actions/auto-assign@v1
with:
GITHUB_TOKEN: ${{ env.BOT_TOKEN }}
CONFIG_FILE: .github/workflows/config/auto-assign.yml

View File

@@ -1,48 +0,0 @@
name: 🚫 Delete Stale Releases
# on:
# repository_dispatch:
# types: [released]
# jobs:
# clean:
# runs-on: ubuntu-latest
# steps:
# - uses: wow-actions/use-app-token@v2
# with:
# app_id: ${{ secrets.APP_ID }}
# private_key: ${{ secrets.PRIVATE_KEY }}
#
# - uses: wow-actions/delete-stale-releases@v1
# with:
# GITHUB_TOKEN: ${{ env.BOT_TOKEN }}
# delete_tags: true
# keep_latest_count: 3
# group: '(?!^)@.*$'
# exclude: |
# @antv/x6@**
# @antv/x6-common@**
# @antv/x6-geometry@**
# @antv/x6-plugin-**@**
# @antv/x6-vue-shape@**
# @antv/x6-react-shape@**
# @antv/x6-angular-shape@**
# @antv/x6-react-components@**
# delete all releases and tag
on:
push:
branches:
- master
jobs:
clean:
runs-on: ubuntu-latest
steps:
- uses: wow-actions/use-app-token@v2
with:
app_id: ${{ secrets.APP_ID }}
private_key: ${{ secrets.PRIVATE_KEY }}
- uses: wow-actions/delete-stale-releases@v1
with:
GITHUB_TOKEN: ${{ env.BOT_TOKEN }}
delete_tags: true
keep_latest_count: -1

View File

@@ -1,7 +0,0 @@
assignees:
- NewByVector
reviewers:
- bubkoo
- NewByVector
skipKeywords:
- wip

View File

@@ -1,16 +0,0 @@
name: 🚧 Create Issue Branch
on:
issue_comment:
types: [created]
jobs:
cib:
runs-on: ubuntu-latest
steps:
- uses: wow-actions/use-app-token@v2
with:
app_id: ${{ secrets.APP_ID }}
private_key: ${{ secrets.PRIVATE_KEY }}
- uses: robvanderleek/create-issue-branch@main
env:
GITHUB_TOKEN: ${{ env.BOT_TOKEN }}

View File

@@ -1,78 +0,0 @@
name: 🚀 Deploy Sites
on:
repository_dispatch:
types: [released]
jobs:
deploy:
runs-on: ubuntu-latest
strategy:
matrix:
node-version: [16.x]
steps:
- name:  Checkout
uses: actions/checkout@v3
- name: 🎉 Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v1
with:
node-version: ${{ matrix.node-version }}
- name: 🌱 Get Yarn Cache Directory
id: yarn-cache-dir-path
run: echo "::set-output name=dir::$(yarn cache dir)"
- name: 🚸 Setup Cache
uses: actions/cache@v2
with:
path: ${{ steps.yarn-cache-dir-path.outputs.dir }}
key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}
restore-keys: |
${{ runner.os }}-yarn-
## cache webpack(babel-loader, eslint-loader)
- name: 💩 Setup Webpack Cache
uses: actions/cache@v2
with:
path: |
node_modules
sites/x6-sites-demos/packages/**/node_modules
key: ${{ runner.os }}-webpack-${{ hashFiles('**/yarn.lock') }}
restore-keys: |
${{ runner.os }}-webpack-
## cache sites
- name: 💩 Setup Sites Cache
uses: actions/cache@v2
with:
path: sites/x6-sites/static/demos
key: ${{ runner.os }}-sites-${{ hashFiles('./packages/x6/package.json', './sites/x6-sites-demos/**/src') }}
restore-keys: |
${{ runner.os }}-sites-
- name: 🚧 Prepare
run: yarn global add lerna
- name: 🚀 Bootstrap
run: yarn bootstrap
- name: 🧲 Build Apps
run: yarn build:apps
- name: 📦 Build Demos
run: yarn build:demos
- name:  Build Sites
run: yarn build:sites
- name: 🔑 Generate Token
uses: wow-actions/use-app-token@v2
with:
app_id: ${{ secrets.APP_ID }}
private_key: ${{ secrets.PRIVATE_KEY }}
- name:  Deploy sites
uses: peaceiris/actions-gh-pages@v3
with:
github_token: ${{ env.BOT_TOKEN }}
publish_dir: ./sites/x6-sites/public
publish_branch: gh-pages

View File

@@ -1,85 +0,0 @@
name: 🔂 Surge PR Preview
on:
pull_request_target:
paths:
- sites/x6-sites/**
- sites/x6-sites-demos/**
- sites/x6-sites-demos-helper/**
- examples/x6-app-**
jobs:
surge:
runs-on: ubuntu-latest
strategy:
matrix:
node-version: [16.x]
steps:
- uses: actions/checkout@v3
- name: 🌱 Get yarn cache directory path
id: yarn-cache-dir-path
run: echo "::set-output name=dir::$(yarn cache dir)"
- name: 🚸 Setup yarn cacha
uses: actions/cache@v2
with:
path: ${{ steps.yarn-cache-dir-path.outputs.dir }}
key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}
restore-keys: |
${{ runner.os }}-yarn-
## cache webpack(babel-loader, eslint-loader)
- name: 💩 Setup webpack cache
uses: actions/cache@v2
with:
path: |
node_modules
sites/x6-sites-demos/packages/**/node_modules
key: ${{ runner.os }}-webpack-${{ hashFiles('**/yarn.lock') }}
restore-keys: |
${{ runner.os }}-webpack-
## cache sites
- name: 💩 Setup sites cache
uses: actions/cache@v2
with:
path: sites/x6-sites/static/demos
key: ${{ runner.os }}-sites-${{ hashFiles('./packages/x6/package.json', './sites/x6-sites-demos/**/src') }}
restore-keys: |
${{ runner.os }}-sites-
- name: 🎉 Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v1
with:
node-version: ${{ matrix.node-version }}
- name: 🚧 Prepare Environment
run: |
yarn global add lerna
- name: 🚀 Bootstrap
run: yarn bootstrap
- name: 📦 Build Demos
run: yarn build:demos
- name: 🧲 Build Apps
run: yarn build:apps
- name:  Build Sites
run: yarn build:sites
- name: 🔑 Generate Token
uses: wow-actions/use-app-token@v2
with:
app_id: ${{ secrets.APP_ID }}
private_key: ${{ secrets.PRIVATE_KEY }}
- name:  Deploy Sites
uses: afc163/surge-preview@v1
with:
surge_token: ${{ secrets.SURGE_TOKEN }}
github_token: ${{ env.BOT_TOKEN }}
build: |
echo Create sites preview
dist: sites/x6-sites/public

View File

@@ -15,7 +15,8 @@ jobs:
steps:
- name:  Checkout
uses: actions/checkout@v3
with:
persist-credentials: false
- name: 🎉 Setup nodejs
uses: actions/setup-node@v3
with:
@@ -57,8 +58,9 @@ jobs:
private_key: ${{ secrets.PRIVATE_KEY }}
- name: 📦 Semantic Release
run: pnpm srm --debug --comment-footer 'Thanks for being a part of the [AntV](https://github.com/antvis) community! 💪💯'
run: pnpm srm --combine-commits --comment-footer 'Thanks for being a part of the [AntV](https://github.com/antvis) community! 💪💯'
env:
SRM_DEBUG: ${{ secrets.SRM_DEBUG }}
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
GITHUB_TOKEN: ${{ env.BOT_TOKEN }}

View File

@@ -1,16 +0,0 @@
name: 📆 Monthly Report
on:
schedule:
- cron: '0 3 1 * *'
jobs:
run:
runs-on: ubuntu-latest
steps:
- uses: wow-actions/use-app-token@v2
with:
app_id: ${{ secrets.APP_ID }}
private_key: ${{ secrets.PRIVATE_KEY }}
- uses: wow-actions/activity-report@v1
with:
GITHUB_TOKEN: ${{ env.BOT_TOKEN }}

View File

@@ -1,16 +0,0 @@
name: 📆 Weekly Report
on:
schedule:
- cron: '30 17 * * 5'
jobs:
run:
runs-on: ubuntu-latest
steps:
- uses: wow-actions/use-app-token@v2
with:
app_id: ${{ secrets.APP_ID }}
private_key: ${{ secrets.PRIVATE_KEY }}
- uses: wow-actions/activity-report@v1
with:
GITHUB_TOKEN: ${{ env.BOT_TOKEN }}

View File

@@ -1,58 +0,0 @@
name: 👻 Stale
on:
schedule:
- cron: "0 0 * * *"
jobs:
stale:
runs-on: ubuntu-latest
steps:
- uses: wow-actions/use-app-token@v2
with:
app_id: ${{ secrets.APP_ID }}
private_key: ${{ secrets.PRIVATE_KEY }}
- uses: actions/stale@v3
with:
repo-token: ${{ env.BOT_TOKEN }}
stale-issue-message: |
Hiya!
This issue has gone quiet. Spooky quiet. 👻
We get a lot of issues, so we currently close issues after 60 days of inactivity. Its been at least 20 days since the last update here. If we missed this issue or if you want to keep it open, please reply here. You can also add the label "not-stale" to keep this issue open!
As a friendly reminder: the best way to see this issue, or any other, fixed is to open a Pull Request. Check out [contribute](https://github.com/antvis/X6/blob/master/CONTRIBUTING.md) for more information about opening PRs, triaging issues, and contributing!
Thanks for being a part of the AntV community! 💪💯
close-issue-message: |
Hey again!
Its been 60 days since anything happened on this issue, so our friendly neighborhood robot (thats me!) is going to close it. Please keep in mind that Im only a robot 🤖, so if Ive closed this issue in error, Im `HUMAN_EMOTION_SORRY`. Please feel free to comment on this issue or create a new one if you need anything else.
As a friendly reminder: the best way to see this issue, or any other, fixed is to open a Pull Request. Check out [contribute](https://github.com/antvis/X6/blob/master/CONTRIBUTING.md) for more information about opening PRs, triaging issues, and contributing!
Thanks again for being part of the AntV community! 💪💯
stale-pr-message: |
Hiya!
This PR has gone quiet. Spooky quiet. 👻
We get a lot of PRs, so we currently close PRs after 60 days of inactivity. Its been at least 20 days since the last update here. If we missed this PR or if you want to keep it open, please reply here. You can also add the label "not-stale" to keep this PR open!
Thanks for being a part of the AntV community! 💪💯
close-pr-message: |
Hey again!
Its been 60 days since anything happened on this PR, so our friendly neighborhood robot (thats me!) is going to close it. Please keep in mind that Im only a robot 🤖, so if Ive closed this PR in error, Im `HUMAN_EMOTION_SORRY`. Please feel free to comment on this PR or create a new one if you need anything else.
Thanks again for being part of the AntV community! 💪💯
days-before-stale: 20
days-before-close: 40
stale-issue-label: 'stale'
exempt-issue-label: 'not-stale,awaiting-approval,work-in-progress'
stale-pr-label: 'stale'
exempt-pr-label: 'not-stale,awaiting-approval,work-in-progress'

View File

@@ -1,21 +0,0 @@
name: 🔄 Sync Labels
on:
push:
branches:
- master
paths:
- .github/workflows/config/labels.yml
jobs:
sync:
runs-on: ubuntu-latest
steps:
- uses: wow-actions/use-app-token@v2
with:
app_id: ${{ secrets.APP_ID }}
private_key: ${{ secrets.PRIVATE_KEY }}
- uses: micnncim/action-label-syncer@v1
env:
GITHUB_TOKEN: ${{ env.BOT_TOKEN }}
with:
manifest: .github/workflows/config/labels.yml

View File

@@ -1,34 +0,0 @@
# https://github.com/marketplace/actions/gitee-pages-action
# 配置步骤如下
# 1. 在命令行终端或 Git Bash 使用命令 ssh-keygen -t rsa -C "youremail@example.com" 生成 SSH Key注意替换为自己的邮箱。生成的 id_rsa 是私钥id_rsa.pub 是公钥。(⚠️注意此处不要设置密码)
# 2. 在 GitHub 项目的「Settings -> Secrets」路径下配置好命名为 GITEE_RSA_PRIVATE_KEY 和 GITEE_PASSWORD 的两个密钥。其中GITEE_RSA_PRIVATE_KEY 存放 id_rsa 私钥GITEE_PASSWORD 存放 Gitee 帐号的密码。
# 3. 在 GitHub 的个人设置页面「Settings -> SSH and GPG keys」 配置 SSH 公钥id_rsa.pub命名随意。或者在仓库设置页面添加一个部署公钥。
# 4. 在 Gitee 的个人设置页面「安全设置 -> SSH 公钥」​ 配置 SSH 公钥id_rsa.pub命名随意。
name: 🔁 Sync to Gitee
on: [push]
jobs:
sync:
runs-on: ubuntu-latest
steps:
- name: 🔁 Sync to Gitee
uses: wearerequired/git-mirror-action@master
env:
# 注意在 Settings->Secrets 配置 GITEE_RSA_PRIVATE_KEY
SSH_PRIVATE_KEY: ${{ secrets.GITEE_RSA_PRIVATE_KEY }}
with:
# 注意替换为你的 GitHub 源仓库地址
source-repo: 'git@github.com:antvis/X6.git'
# 注意替换为你的 Gitee 目标仓库地址
destination-repo: 'git@gitee.com:antv-x6/antv-x6.git'
- name: 📦 Build Gitee Pages
uses: yanglbme/gitee-pages-action@master
with:
# 注意替换为你的 Gitee 用户名
gitee-username: afc163
# 注意在 Settings->Secrets 配置 GITEE_PASSWORD
gitee-password: ${{ secrets.GITEE_PASSWORD }}
# 注意替换为你的 Gitee 仓库
gitee-repo: antv-x6/antv-x6
# 要部署的分支
branch: gh-pages

View File

@@ -20,9 +20,7 @@ jobs:
👋 @{{ author }}
Thanks for opening your first issue here! If you're reporting a 🐞 bug, please make sure you include steps to reproduce it.
To help make it easier for us to investigate your issue, please follow the [contributing guidelines](https://github.com/antvis/X6/blob/master/CONTRIBUTING.md).
We get a lot of issues on this repo, so please be patient and we will get back to you as soon as we can.
FIRST_PR: |

2
.gitignore vendored
View File

@@ -15,3 +15,5 @@ dist
tmp
test/coverage
packages/**/src/style/raw.ts
.eslintcache
.stylelintcache

View File

@@ -1,12 +0,0 @@
# @see https://help.semmle.com/lgtm-enterprise/user/help/lgtm.yml-configuration-file.html
# @template https://lgtm.com/static/downloads/lgtm.template.yml
queries:
- exclude: js/use-before-declaration
- exclude: js/polynomial-redos
extraction:
javascript:
index:
filters:
- exclude: "sites/x6-sites/static"

2
.npmrc Normal file
View File

@@ -0,0 +1,2 @@
registry=https://registry.npm.taobao.org
strict-peer-dependencies=false

View File

@@ -12,5 +12,6 @@ es/
lib/
dist/
coverage/
sites/x6-sites/static/demos
sites/public
csstype.ts
ui.js

View File

@@ -11,22 +11,17 @@
[
"@semantic-release/commit-analyzer",
{
"preset": "angular",
"parserOpts": {
"noteKeywords": ["BREAKING CHANGE", "BREAKING CHANGES"]
},
"releaseRules": [
{ "breaking": true, "release": "major" },
{ "revert": true, "release": "patch" },
{ "type": "feat", "release": "minor" },
{ "type": "ci", "release": "patch" },
{ "type": "build", "release": "patch" },
{ "type": "chore", "release": "patch" },
{ "type": "docs", "release": "patch" },
{ "type": "perf", "release": "patch" },
{ "type": "style", "release": "patch" },
{ "type": "test", "release": "patch" },
{ "type": "refactor", "release": "patch" },
{ "type": "ci", "release": false },
{ "type": "chore", "release": false },
{ "scope": "no-release", "release": false }
]
}

View File

@@ -15,6 +15,11 @@
"no-invalid-double-slash-comments": null,
"no-descending-specificity": null,
"declaration-empty-line-before": null,
"no-duplicate-selectors": null
"no-duplicate-selectors": null,
"value-no-vendor-prefix": null,
"selector-pseudo-class-no-unknown": null,
"selector-class-pattern": null,
"keyframes-name-pattern": null,
"number-max-precision": null
}
}

View File

@@ -1,21 +1,25 @@
BARM <284942955@qq.com>
Candy <563378816@qq.com>
Chaoqi <HAN>
Clifford <ajard>
Chaoqi ZHANG <prncoprs@163.com>
Clifford Fajardo <cliffordfajardo@users.noreply.github.com>
DaiGang <42136433+daigang666@users.noreply.github.com>
Dong <48054715+halodong@users.noreply.github.com>
Draco <Draco.coder@gmail.com>
Eve-Sama <17764594863@163.com>
Eve-Sama <948832626@qq.com>
Gossypol <31892817+gossypol@users.noreply.github.com>
HQidea <HQidea@users.noreply.github.com>
ImgBotApp <ImgBotHelp@gmail.com>
Indomi <indomi126@gmail.com>
James <san>
Jógvan <lse>
Ken <ei>
James Tsang <wtzeng1@gmail.com>
JasonSun <42314340+LolipopJ@users.noreply.github.com>
Jógvan Olsen <jogvanolsen@hotmail.com>
Ken Geis <geis.ken@gmail.com>
Kent Wood <minzojian@hotmail.com>
Ko.Rei <32183014+Ko-Rei@users.noreply.github.com>
Limbo <49612796+JUST-Limbo@users.noreply.github.com>
Lixu <37231473+wflixu@users.noreply.github.com>
Lloyd <ho>
Lloyd Zhou <lloydzhou@users.noreply.github.com>
Lyn <47809781+lyn-boyu@users.noreply.github.com>
MOMO <329053928@qq.com>
Mingfei <az8641683@163.com>
@@ -25,16 +29,22 @@ NewByVector <NewByVector@users.noreply.github.com>
Olive.Wang <olivewind.wang@gmail.com>
Opportunity <opportunity@live.in>
Questions <chip@twostewards.com>
RuiLin <on>
RuiLin Dong <48054715+halodong@users.noreply.github.com>
SSC <273702440@qq.com>
Samuel Bodin <1637651+bodinsamuel@users.noreply.github.com>
Simon He <57086651+Simon-He95@users.noreply.github.com>
Sindori <441933726@qq.com>
Struggle <1178825961@qq.com>
Struggle Roue <47975400+struggleRoue@users.noreply.github.com>
Susan <527971893@qq.com>
Thomas <eugne>
Tony <>
Thomas Zeugner <tomsoftware@gmx.de>
Tony Wu <93302820+tonywu6@users.noreply.github.com>
Utopia <greatauk11@gmail.com>
XLZY <1017866168@qq.com>
Xingjian <han>
Zhenyu <o>
Xia Wenqi <xiawenqi90@gmail.com>
Xingjian Zhang <44231913+THUzxj@users.noreply.github.com>
Zhenyu Hou <skyking_H@hotmail.com>
_XiaoTian <istianlei@qq.com>
arthur657834 <kingkom7834@126.com>
boyu.zlj <boyu.zlj@antgroup.com>
breezefaith <nyzhangzc@qq.com>
@@ -50,6 +60,8 @@ kelin.zrh <34393362+AricZhu@users.noreply.github.com>
kingshuaishuai <ken.wang@mrs.ai>
kio <1421104933@qq.com>
lijing666 <lijing241@yeah.net>
linkun <33945539+linkun-wang@users.noreply.github.com>
linkun <linkun0922@163.com>
lopn <lopnxrp@126.com>
luchunwei <luchunwei@gmail.com>
luzhuang <364439895@qq.com>
@@ -58,17 +70,21 @@ myzxlin <myzxlin@163.com>
newbyvector <vectorse@126.com>
niexq <1879633916@qq.com>
niexq <niexq@firstgrid.cn>
njshuisheng <34205271+njshuisheng@users.noreply.github.com>
nobugforever <84232410+mengYu-Jin@users.noreply.github.com>
pengxingjian.pxj <pengxingjian.pxj@alibaba-inc.com>
pfdgithub <pfdgithub@users.noreply.github.com>
qingchi <qinky94@163.com>
qu <33251372+Qujh97@users.noreply.github.com>
sallen450 <qinghua10199@gmail.com>
semantic-release-bot <semantic-release-bot@martynus.net>
siaikin <abc1310054026@outlook.com>
vector <vectorse@126.com>
wenbei <38773084+wb-wenbei@users.noreply.github.com>
wgf <34190465+evelope@users.noreply.github.com>
wind <>
wind X <35559153+XueMeijing@users.noreply.github.com>
wjqsummer <52412389+wjqsummer@users.noreply.github.com>
wseven7677 <caoyu_92@126.com>
wtzeng1 <wtzeng1@gmail.com>
x6-bot <x6-bot@users.noreply.github.com>
xrkffgg <xrkffgg@gmail.com>
@@ -77,10 +93,12 @@ zdc1111 <39116292+zdc1111@users.noreply.github.com>
€alix <qq287649920@gmail.com>
九思⚡⚡⚡ <2228429150@qq.com>
何腾飞 <avrin.live.cn@outlook.com>
依枫 <deng25st@163.com>
偏右 <afc163@gmail.com>
小耀 <jinyue.gjy@antfin.com>
崖 <bubkoo.wy@gmail.com>
崖崖崖 <bubkoo.wy@gmail.com>
张子睿 <411489774@qq.com>
文瑀 <wenyu.jqq@antfin.com>
映月 <38279397+orientMoon@users.noreply.github.com>
杨凌 <89915256@qq.com>

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 11 MiB

After

Width:  |  Height:  |  Size: 14 MiB

View File

@@ -1,6 +1,6 @@
MIT License
Copyright (c) 2021-2022 Alipay.inc
Copyright (c) 2021-2023 Alipay.inc
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal

View File

@@ -17,7 +17,7 @@
<a href="/LICENSE"><img src="https://img.shields.io/github/license/antvis/x6?style=flat-square" alt="MIT License"></a>
<a href="https://www.typescriptlang.org"><img alt="Language" src="https://img.shields.io/badge/language-TypeScript-blue.svg?style=flat-square"></a>
<a href="https://github.com/antvis/x6/pulls"><img alt="PRs Welcome" src="https://img.shields.io/badge/PRs-Welcome-brightgreen.svg?style=flat-square"></a>
<a href="https://x6.antv.vision"><img alt="website" src="https://img.shields.io/static/v1?label=&labelColor=505050&message=website&color=0076D6&style=flat-square&logo=google-chrome&logoColor=0076D6"></a>
<a href="https://x6.antv.antgroup.com/"><img alt="website" src="https://img.shields.io/static/v1?label=&labelColor=505050&message=website&color=0076D6&style=flat-square&logo=google-chrome&logoColor=0076D6"></a>
</p>
## Features
@@ -84,12 +84,13 @@ graph.addEdge({
## Links
- [Documents](https://x6.antv.vision/zh/docs/tutorial/about)
- [Samples](https://x6.antv.vision/zh/examples/gallery)
- [Documents](https://x6.antv.antgroup.com/tutorial/about)
- [Samples](https://x6.antv.antgroup.com/examples)
- [Blog](https://www.yuque.com/antv/x6/gcinvi)
- [Versioning Release Note](https://www.yuque.com/antv/x6/bbfu6r)
- [FAQ](https://www.yuque.com/antv/x6/be9pfx)
- [CodeSanbox Template](https://codesandbox.io/s/qosj0?file=/src/app.tsx)
- [awesome-x6](https://github.com/lloydzhou/awesome-x6)
## Development

View File

@@ -6,18 +6,17 @@
<p align="center"><strong>提供简单易用的节点定制能力和开箱即用的交互组件方便我们快速搭建流程图、DAG 图、ER 图等图应用</strong></p>
<p align="center">
<a href="https://github.com/antvis/X6/actions/workflows/ci.yml"><img alt="build" src="https://img.shields.io/github/workflow/status/antvis/x6/%F0%9F%91%B7%E3%80%80CI/master?logo=github&style=flat-square"></a>
<a href="https://app.codecov.io/gh/antvis/X6"><img alt="coverage" src="https://img.shields.io/codecov/c/gh/antvis/x6?logo=codecov&style=flat-square&token=15CO54WYUV"></a>
<a href="https://lgtm.com/projects/g/antvis/x6/context:javascript"><img alt="Language grade: JavaScript" src="https://img.shields.io/lgtm/grade/javascript/g/antvis/x6.svg?logo=lgtm&style=flat-square"></a>
<a href="https://www.npmjs.com/package/@antv/x6"><img alt="NPM Package" src="https://img.shields.io/npm/v/@antv/x6.svg?style=flat-square"></a>
<a href="https://www.npmjs.com/package/@antv/x6"><img alt="NPM Downloads" src="https://img.shields.io/npm/dm/@antv/x6?logo=npm&style=flat-square"></a>
<a href="https://github.com/antvis/X6/actions/workflows/ci.yml"><img alt="build" src="https://img.shields.io/github/actions/workflow/status/antvis/x6/ci.yml?branch=master&style=for-the-badge&logo=github"></a>
<!-- <a href="https://app.codecov.io/gh/antvis/X6"><img alt="coverage" src="https://img.shields.io/codecov/c/gh/antvis/x6?logo=codecov&style=for-the-badge&token=15CO54WYUV"></a> -->
<a href="https://www.npmjs.com/package/@antv/x6"><img alt="NPM Package" src="https://img.shields.io/npm/v/@antv/x6.svg?logo=npm&style=for-the-badge"></a>
<a href="https://www.npmjs.com/package/@antv/x6"><img alt="NPM Downloads" src="https://img.shields.io/npm/dm/@antv/x6?logo=npm&style=for-the-badge"></a>
</p>
<p align="center">
<a href="/LICENSE"><img src="https://img.shields.io/github/license/antvis/x6?style=flat-square" alt="MIT License"></a>
<a href="https://www.typescriptlang.org"><img alt="Language" src="https://img.shields.io/badge/language-TypeScript-blue.svg?style=flat-square"></a>
<a href="https://github.com/antvis/x6/pulls"><img alt="PRs Welcome" src="https://img.shields.io/badge/PRs-Welcome-brightgreen.svg?style=flat-square"></a>
<a href="https://x6.antv.vision"><img alt="website" src="https://img.shields.io/static/v1?label=&labelColor=505050&message=website&color=0076D6&style=flat-square&logo=google-chrome&logoColor=0076D6"></a>
<a href="/LICENSE"><img src="https://img.shields.io/github/license/antvis/x6?style=for-the-badge" alt="MIT License"></a>
<a href="https://www.typescriptlang.org"><img alt="Language" src="https://img.shields.io/badge/language-TypeScript-blue.svg?style=for-the-badge"></a>
<a href="https://github.com/antvis/x6/pulls"><img alt="PRs Welcome" src="https://img.shields.io/badge/PRs-Welcome-brightgreen.svg?style=for-the-badge"></a>
<a href="https://x6.antv.antgroup.com"><img alt="website" src="https://img.shields.io/static/v1?label=&labelColor=505050&message=website&color=0076D6&style=for-the-badge&logo=google-chrome&logoColor=f5f5f5"></a>
</p>
## 特性
@@ -29,12 +28,12 @@
## 兼容环境
- 现代浏览器和 IE11需要 polyfills
- 现代浏览器
- 支持服务端渲染。
| [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/edge/edge_48x48.png" alt="IE / Edge" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)<br>IE / Edge | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/firefox/firefox_48x48.png" alt="Firefox" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)<br>Firefox | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/chrome/chrome_48x48.png" alt="Chrome" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)<br>Chrome | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/safari/safari_48x48.png" alt="Safari" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)<br>Safari |
|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| IE11, Edge | last 2 versions | last 2 versions | last 2 versions |
| [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/firefox/firefox_48x48.png" alt="Firefox" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)<br>Firefox | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/chrome/chrome_48x48.png" alt="Chrome" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)<br>Chrome | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/safari/safari_48x48.png" alt="Safari" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)<br>Safari |
|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| last 2 versions | last 2 versions | last 2 versions |
## 安装
@@ -84,12 +83,13 @@ graph.addEdge({
## 链接
- [文档](https://x6.antv.vision/zh/docs/tutorial/about)
- [示例](https://x6.antv.vision/zh/examples/gallery)
- [博客](https://www.yuque.com/antv/x6/gcinvi)
- [文档](http://x6.antv.antgroup.com/tutorial/about)
- [示例](http://x6.antv.antgroup.com/examples)
- [博客](https://www.yuque.com/antv/x6/huhla47wqalq5n7r)
- [更新日志](https://www.yuque.com/antv/x6/bbfu6r)
- [常见问题](https://www.yuque.com/antv/x6/be9pfx)
- [CodeSanbox 模板](https://codesandbox.io/s/qosj0?file=/src/app.tsx)
- [常见问题](https://www.yuque.com/antv/x6/tox1ukbz5cw57qfy)
- [CodeSanbox 模板](https://codesandbox.io/s/mo-ban-wchooy?file=/src/App.tsx)
- [awesome-x6](https://github.com/lloydzhou/awesome-x6)
## 本地开发

View File

@@ -1,3 +1,31 @@
## @antv/x6-example-features [2.1.1](https://github.com/antvis/X6/compare/@antv/x6-example-features@2.1.0...@antv/x6-example-features@2.1.1) (2023-02-18)
### Bug Fixes
* mindmap demo duplicate node id, close [#3256](https://github.com/antvis/X6/issues/3256) ([#3257](https://github.com/antvis/X6/issues/3257)) ([c510756](https://github.com/antvis/X6/commit/c510756fe4e96c8e7471c2fb558e6019ec69b057))
# @antv/x6-example-features [2.1.0](https://github.com/antvis/X6/compare/@antv/x6-example-features@2.0.3...@antv/x6-example-features@2.1.0) (2023-02-17)
### Features
* history add max stack size ([#3253](https://github.com/antvis/X6/issues/3253)) ([fba5310](https://github.com/antvis/X6/commit/fba531064ad8027c451a81b60d5efd7f7314a0fa))
## @antv/x6-example-features [2.0.2](https://github.com/antvis/X6/compare/@antv/x6-example-features@2.0.1...@antv/x6-example-features@2.0.2) (2023-01-17)
### Bug Fixes
* **mindmap demo:** can not find target id when create edge ([#3144](https://github.com/antvis/X6/issues/3144)) ([bfc8d7f](https://github.com/antvis/X6/commit/bfc8d7f17ac900f70b696c1fa7a3f3f3a389103f))
## @antv/x6-example-features [2.0.1](https://github.com/antvis/X6/compare/@antv/x6-example-features@2.0.0...@antv/x6-example-features@2.0.1) (2022-12-16)
### Bug Fixes
* make resizing options take effect ([#3014](https://github.com/antvis/X6/issues/3014)) ([604c024](https://github.com/antvis/X6/commit/604c0244cd71ec8e911754dfe524f12c04e4e9ad))
# @antv/x6-example-features [2.0.0](https://github.com/antvis/X6/compare/@antv/x6-example-features@1.1.2...@antv/x6-example-features@2.0.0) (2022-11-24)

View File

@@ -1,17 +1,18 @@
{
"private": true,
"name": "@antv/x6-example-features",
"version": "2.0.0",
"version": "2.1.1",
"scripts": {
"start": "umi dev",
"build": "umi build",
"lint": "eslint 'src/**/*.{js,ts}?(x)' --fix",
"precommit": "lint-staged"
"lint": "eslint 'src/**/*.{js,ts}?(x)' --fix"
},
"dependencies": {
"@antv/hierarchy": "^0.6.8",
"@antv/x6": "^2.x",
"@antv/x6-plugin-clipboard": "^2.x",
"@antv/x6-plugin-dnd": "^2.x",
"@antv/x6-plugin-export": "^2.x",
"@antv/x6-plugin-history": "^2.x",
"@antv/x6-plugin-keyboard": "^2.x",
"@antv/x6-plugin-minimap": "^2.x",
@@ -20,42 +21,34 @@
"@antv/x6-plugin-snapline": "^2.x",
"@antv/x6-plugin-stencil": "^2.x",
"@antv/x6-plugin-transform": "^2.x",
"@antv/x6-plugin-export": "^2.x",
"@antv/x6-react-components": "^2.x",
"@antv/x6-react-shape": "^2.x",
"antd": "^4.4.2",
"classnames": "^2.2.6",
"dagre": "^0.8.5",
"elkjs": "^0.7.1",
"elkjs": "^0.8.2",
"react": "^18.0.0",
"react-dom": "^18.0.0",
"react-helmet": "^6.0.0",
"@antv/hierarchy": "^0.6.8"
"react-helmet": "^6.0.0"
},
"devDependencies": {
"@ant-design/icons": "^4.2.2",
"@types/jest": "^25.2.1",
"@types/jest": "^29.2.4",
"@types/react": "^18.0.0",
"@types/react-dom": "^18.0.0",
"@types/react-helmet": "^6.0.0",
"@types/react-test-renderer": "^16.0.3",
"eslint": "^7.16.0",
"@types/react-test-renderer": "^18.0.0",
"babel-plugin-import": "^1.13.5",
"eslint": "^8.29.0",
"eslint-config-umi": "^1.4.0",
"eslint-plugin-flowtype": "^4.7.0",
"eslint-plugin-flowtype": "^8.0.3",
"eslint-plugin-import": "^2.22.1",
"eslint-plugin-jsx-a11y": "^6.2.3",
"eslint-plugin-react": "^7.11.1",
"lint-staged": "^10.5.3",
"react-test-renderer": "^16.7.0",
"umi": "^2.9.0",
"umi-plugin-react": "^1.8.0",
"umi-types": "^0.3.0",
"babel-plugin-import": "^1.13.5"
},
"lint-staged": {
"src/**/*.ts": [
"eslint --fix"
]
"umi-types": "^0.3.0"
},
"engines": {
"node": ">=8.0.0"

View File

@@ -7,17 +7,17 @@
.nav {
position: absolute;
z-index: 101;
top: 0;
bottom: 0;
left: 0;
font-size: 13px;
overflow-x: hidden;
overflow-y: auto;
z-index: 101;
box-sizing: border-box;
width: 220px;
padding: 0 16px;
overflow-x: hidden;
overflow-y: auto;
font-size: 13px;
border-right: 1px solid #e9e9e9;
box-sizing: border-box;
ul {
padding-left: 16px;
@@ -29,11 +29,11 @@
}
.content {
flex-grow: 1;
box-sizing: border-box;
margin-left: 220px;
padding: 34px;
overflow-x: hidden;
overflow-y: auto;
flex-grow: 1;
margin-left: 220px;
background: #ffffff;
padding: 34px;
background: #fff;
}

View File

@@ -8,13 +8,15 @@
border: 1px solid #c2c8d5;
border-left: 4px solid #1890ff;
border-radius: 4px;
box-shadow: 0 2px 5px 1px rgba(0, 0, 0, 0.06);
box-shadow: 0 2px 5px 1px rgb(0 0 0 / 6%);
img {
flex-shrink: 0;
width: 20px;
height: 20px;
flex-shrink: 0;
margin-left: 8px;
}
.label {
display: inline-block;
flex-shrink: 0;
@@ -23,15 +25,19 @@
color: #666;
font-size: 12px;
}
.status {
flex-shrink: 0;
}
&.success {
border-left: 4px solid #52c41a;
}
&.failed {
border-left: 4px solid #ff4d4f;
}
&.running .status img {
animation: spin 1s linear infinite;
}
@@ -43,11 +49,13 @@
border-radius: 2px;
box-shadow: 0 0 0 4px #d4e8fe;
}
.node.success {
border-color: #52c41a;
border-radius: 2px;
box-shadow: 0 0 0 4px #ccecc0;
}
.node.failed {
border-color: #ff4d4f;
border-radius: 2px;
@@ -80,6 +88,7 @@
from {
transform: rotate(0deg);
}
to {
transform: rotate(360deg);
}

View File

@@ -4,6 +4,7 @@
visibility: hidden;
cursor: pointer;
}
&:hover image {
visibility: visible;
}

View File

@@ -212,12 +212,15 @@ export default class Example extends React.Component {
return 'right'
},
})
const cells: Cell[] = []
const traverse = (hierarchyItem: HierarchyResult) => {
if (hierarchyItem) {
const { data, children } = hierarchyItem
cells.push(
graph.createNode({
// 检查当前遍历的节点已经存在还是需要新添加?
if (graph.hasCell(data.id)) {
const node = graph.getCellById(data.id)
node.prop('position', { x: hierarchyItem.x, y: hierarchyItem.y })
} else {
const node = graph.addNode({
id: data.id,
shape: data.type === 'topic-child' ? 'topic-child' : 'topic',
x: hierarchyItem.x,
@@ -226,13 +229,18 @@ export default class Example extends React.Component {
height: data.height,
label: data.label,
type: data.type,
}),
)
})
}
if (children) {
children.forEach((item: HierarchyResult) => {
const { id, data } = item
cells.push(
graph.createEdge({
// 先遍历子节点里面包含创建逻辑如果画布没有开启async的时候创建边会提示找不到target节点
traverse(item)
const eid = `${hierarchyItem.id}-->${id}`
// 检查当前边是否已经存在
if (!graph.hasCell(eid)) {
graph.addEdge({
id: eid,
shape: 'mindmap-edge',
source: {
cell: hierarchyItem.id,
@@ -257,15 +265,13 @@ export default class Example extends React.Component {
name: 'left',
},
},
}),
)
traverse(item)
})
}
})
}
}
}
traverse(result)
graph.resetCells(cells)
graph.centerContent()
}
@@ -303,9 +309,14 @@ export default class Example extends React.Component {
if (dataItem) {
let item: MindMapData | null = null
const length = dataItem.children ? dataItem.children.length : 0
let nid = `${id}-${length + 1}`
if (graph.hasCell(nid)) {
// 如果通过length + 1拼接出来的节点id在画布中存在了就在id后面加上随机数
nid = nid + Math.random()
}
if (type === 'topic') {
item = {
id: `${id}-${length + 1}`,
id: nid,
type: 'topic-branch',
label: `分支主题${length + 1}`,
width: 100,
@@ -313,7 +324,7 @@ export default class Example extends React.Component {
}
} else if (type === 'topic-branch') {
item = {
id: `${id}-${length + 1}`,
id: nid,
type: 'topic-child',
label: `子主题${length + 1}`,
width: 60,
@@ -334,10 +345,16 @@ export default class Example extends React.Component {
const removeNode = (id: string) => {
const res = findItem(data, id)
const dataItem = res?.parent
if (dataItem && dataItem.children) {
const { children } = dataItem
const parentItem = res?.parent
const nodeItem = res?.node
if (parentItem && parentItem.children) {
const { children } = parentItem
const index = children.findIndex((item) => item.id === id)
// 删除的时候先删节点以及可能存在的子节点再调用render对data数据进行遍历
if (nodeItem && nodeItem.children) {
nodeItem.children.forEach((item) => graph.removeCell(item.id))
}
graph.removeCell(id)
return children.splice(index, 1)
}
return null

View File

@@ -2,24 +2,25 @@
position: relative;
}
.validating:after {
.validating::after {
position: absolute;
top: 4px;
left: 4px;
content: ' ';
display: block;
width: 50px;
height: 50px;
border-radius: 50%;
border: 6px solid #873bf4;
border-color: #873bf4 transparent #873bf4 transparent;
border-color: #873bf4 transparent;
border-radius: 50%;
animation: lds-dual-ring 1.2s linear infinite;
content: ' ';
}
@keyframes lds-dual-ring {
0% {
transform: rotate(0deg);
}
100% {
transform: rotate(360deg);
}

View File

@@ -2,14 +2,14 @@
.x6-example-wrap {
width: 100%;
height: 100%;
background-color: #ffffff;
background-color: #fff;
.left-side {
position: fixed;
width: 336px;
left: 24px;
top: 0px;
top: 0;
bottom: 0;
left: 24px;
width: 336px;
padding: 0 8px;
overflow-x: visible;
overflow-y: auto;
@@ -17,18 +17,18 @@
.right-side {
position: fixed;
top: 0;
right: 24px;
bottom: 0;
width: 336px;
padding: 0 8px;
top: 0px;
bottom: 0;
overflow-x: visible;
overflow-y: auto;
}
.ant-card {
box-shadow: 0 0 10px 1px #e9e9e9;
margin-top: 24px;
box-shadow: 0 0 10px 1px #e9e9e9;
}
.ant-row-flex {
@@ -36,14 +36,14 @@
}
.slider-value {
background: #eee;
color: #333333;
padding: 3px 7px;
border-radius: 10px;
display: inline-block;
font-size: 12px;
margin-left: 8px;
padding: 3px 7px;
color: #333;
font-size: 12px;
line-height: 1.25;
background: #eee;
border-radius: 10px;
}
.x6-graph {
@@ -52,15 +52,15 @@
.x6-node {
path {
fill: #6a6c8a;
stroke-width: 0px;
transition: fill 0.1s;
fill: #6a6c8a;
stroke-width: 0;
}
text {
fill: #fff;
font-size: 12px;
font-weight: lighter;
font-size: 12px;
fill: #fff;
}
&:hover path {
@@ -80,37 +80,37 @@
}
.bbox {
transition-duration: 0.5s;
transition-property: stroke-opacity;
pointer-events: none;
fill: none;
stroke: #16a085;
stroke-width: 2;
stroke-opacity: 0;
fill: none;
transition-property: stroke-opacity;
transition-duration: 0.5s;
pointer-events: none;
}
.axis {
pointer-events: none;
stroke: #95a5a6;
stroke-dasharray: 2, 4;
stroke-width: 1;
pointer-events: none;
}
.padding {
transition-duration: 1s;
transition-property: stroke-opacity;
pointer-events: none;
stroke: #1abc9c;
stroke-opacity: 0;
transition-property: stroke-opacity;
transition-duration: 1s;
pointer-events: none;
}
.grid {
transition-duration: 1s;
transition-property: stroke-opacity;
pointer-events: none;
stroke: #16a085;
stroke-width: 0.5;
stroke-opacity: 0;
transition-property: stroke-opacity;
transition-duration: 1s;
pointer-events: none;
}
.active {

View File

@@ -0,0 +1,104 @@
import React from 'react'
import { Graph } from '@antv/x6'
import { Keyboard } from '@antv/x6-plugin-keyboard'
import { Selection } from '@antv/x6-plugin-selection'
import { History } from '@antv/x6-plugin-history'
import '../index.less'
export default class Example extends React.Component<
{},
{ graph: Graph | undefined }
> {
private container: HTMLDivElement
componentDidMount() {
const graph = new Graph({
container: this.container,
width: 800,
height: 600,
grid: true,
})
this.setState({ graph })
const selection = new Selection({ enabled: true })
const keyboard = new Keyboard({ enabled: true })
const history = new History({ enabled: true, stackSize: 5 })
graph.use(selection)
graph.use(keyboard)
graph.use(history)
graph.addNode({
x: 50,
y: 50,
width: 100,
height: 40,
attrs: { label: { text: 'A' } },
})
graph.addNode({
x: 250,
y: 50,
width: 100,
height: 40,
attrs: { label: { text: 'B' } },
})
graph.addNode({
x: 350,
y: 150,
width: 100,
height: 40,
attrs: { label: { text: 'C' } },
})
keyboard.bindKey('backspace', () => {
graph.removeCells(selection.getSelectedCells())
})
keyboard.bindKey('command+z', () => {
this.undo()
})
keyboard.bindKey('command+shift+z', () => {
this.redo()
})
}
refContainer = (container: HTMLDivElement) => {
this.container = container
}
enablePlugins = () => {
const { graph } = this.state
graph?.enablePlugins('keyboard')
}
disablePlugins = () => {
const { graph } = this.state
graph?.disablePlugins('keyboard')
}
undo = () => {
const { graph } = this.state
const history = graph?.getPlugin('history') as History
history?.undo()
}
redo = () => {
const { graph } = this.state
const history = graph?.getPlugin('history') as History
history?.redo()
}
render() {
return (
<div className="x6-graph-wrap">
<div ref={this.refContainer} className="x6-graph" />
<button onClick={this.enablePlugins}>enable</button>
<button onClick={this.disablePlugins}>disable</button>
<button onClick={this.undo}>undo</button>
<button onClick={this.redo}>redo</button>
</div>
)
}
}

View File

@@ -1,9 +1,9 @@
.custom-html {
width: 100%;
height: 100%;
display: flex;
align-items: center;
justify-content: center;
width: 100%;
height: 100%;
color: #000;
font-size: 16px;
border: 1px solid #000;

View File

@@ -1,27 +1,27 @@
.x6-graph-wrap {
width: 100%;
height: 100%;
background-color: #ffffff;
overflow: auto;
padding: 32px 0;
overflow: auto;
background-color: #fff;
> h1 {
display: block;
width: 800px;
margin: 0 auto 32px auto;
margin: 0 auto 32px;
}
}
.x6-graph-tools {
width: 800px;
margin: 0 auto 32px auto;
margin: 0 auto 32px;
}
.x6-graph {
width: 100%;
height: 100%;
box-shadow: 0 0 10px 1px #e9e9e9;
margin: 0 auto;
box-shadow: 0 0 10px 1px #e9e9e9;
}
.x6-node-selected {

View File

@@ -179,6 +179,10 @@ const dataSource = [
example: 'animation/transition',
description: '动画',
},
{
example: 'history',
description: '时光回溯',
},
].map((item, index) => ({ key: index, ...item }))
const columns = [

View File

@@ -4,7 +4,10 @@ import { Keyboard } from '@antv/x6-plugin-keyboard'
import { Selection } from '@antv/x6-plugin-selection'
import '../index.less'
export default class Example extends React.Component {
export default class Example extends React.Component<
{},
{ graph: Graph | undefined }
> {
private container: HTMLDivElement
componentDidMount() {
@@ -15,6 +18,8 @@ export default class Example extends React.Component {
grid: true,
})
this.setState({ graph })
const selection = new Selection({ enabled: true })
const keyboard = new Keyboard({ enabled: true })
graph.use(selection)
@@ -53,10 +58,22 @@ export default class Example extends React.Component {
this.container = container
}
enablePlugins = () => {
const { graph } = this.state
graph.enablePlugins('keyboard')
}
disablePlugins = () => {
const { graph } = this.state
graph.disablePlugins('keyboard')
}
render() {
return (
<div className="x6-graph-wrap">
<div ref={this.refContainer} className="x6-graph" />
<button onClick={this.enablePlugins}>enable</button>
<button onClick={this.disablePlugins}>disable</button>
</div>
)
}

View File

@@ -1,10 +1,10 @@
.react-algo-node {
display: flex;
align-items: center;
width: 100%;
height: 100%;
border: 1px solid #5f95ff;
border-radius: 14px;
display: flex;
align-items: center;
img {
width: 24px;
@@ -13,8 +13,8 @@
span {
margin-left: 4px;
font-size: 12px;
color: #000000a6;
font-size: 12px;
}
&.dark {

View File

@@ -2,20 +2,20 @@
.my-port {
width: 100%;
height: 100%;
background: #eee;
border: 1px solid #808080;
border-radius: 100%;
background: #eee;
&.connected {
width: 0;
height: 0;
margin-top: 5px;
margin-left: 1px;
border-width: 5px 4px 0;
border-style: solid;
border-color: #808080 transparent transparent;
border-radius: 0;
background-color: transparent;
border-color: #808080 transparent transparent;
border-style: solid;
border-width: 5px 4px 0;
border-radius: 0;
}
}
@@ -30,30 +30,30 @@
}
body > div::before {
content: ' ';
float: left;
box-sizing: border-box;
width: 20px;
height: 20px;
margin-top: -5px;
margin-left: -5px;
background-color: rgb(57 202 116 / 60%);
border-radius: 50%;
background-color: rgba(57, 202, 116, 0.6);
box-sizing: border-box;
content: ' ';
}
body > div::after {
content: ' ';
position: relative;
z-index: 10;
float: left;
clear: both;
box-sizing: border-box;
width: 10px;
height: 10px;
margin-top: -15px;
border-radius: 50%;
background-color: #fff;
border: 1px solid #39ca74;
position: relative;
z-index: 10;
box-sizing: border-box;
border-radius: 50%;
content: ' ';
}
}
@@ -65,30 +65,30 @@
}
body > div::before {
content: ' ';
float: left;
box-sizing: border-box;
width: 28px;
height: 28px;
margin-top: -9px;
margin-left: -9px;
background-color: rgb(57 202 116 / 60%);
border-radius: 50%;
background-color: rgba(57, 202, 116, 0.6);
box-sizing: border-box;
content: ' ';
}
body > div::after {
content: ' ';
position: relative;
z-index: 10;
float: left;
clear: both;
box-sizing: border-box;
width: 10px;
height: 10px;
margin-top: -19px;
border-radius: 50%;
background-color: #fff;
border: 1px solid #39ca74;
position: relative;
z-index: 10;
box-sizing: border-box;
border-radius: 50%;
content: ' ';
}
}
}

View File

@@ -1,4 +1,4 @@
.x6-graph-scroller {
box-shadow: 0 0 10px 1px #e9e9e9;
margin: 0 auto;
box-shadow: 0 0 10px 1px #e9e9e9;
}

View File

@@ -25,7 +25,6 @@ export default class Example extends React.Component {
strict: true,
showNodeSelectionBox: true,
selectCellOnMoved: false,
useCellGeometry: true,
filter(cell) {
return cell !== a
},

View File

@@ -1,20 +1,20 @@
.react-table {
width: 100%;
height: 100%;
border: 1px solid #edf2f5;
background-color: #fff;
border-radius: 5px;
overflow: hidden;
background-color: #fff;
border: 1px solid #edf2f5;
border-radius: 5px;
.inner {
display: flex;
flex-direction: column;
width: 100%;
height: 100%;
padding: 12px;
border: 1px solid #fff;
background: #edf2f5;
border: 1px solid #fff;
border-radius: 5px;
display: flex;
flex-direction: column;
}
.header {
@@ -36,21 +36,21 @@
}
ul {
padding: 0;
margin: 0;
padding: 0;
}
li {
list-style: none;
height: 40px;
line-height: 40px;
padding-left: 16px;
line-height: 40px;
list-style: none;
border: 1px solid transparent;
&:hover {
border: 1px solid #1890ff;
// background: rgba(230,247,255,.92);
z-index: 0;
border: 1px solid #1890ff;
}
}
}
@@ -58,8 +58,8 @@
.react-table-port {
width: 100%;
height: 100%;
overflow: hidden;
background: #eee;
border: 1px solid #808080;
border-radius: 100%;
background: #eee;
overflow: hidden;
}

View File

@@ -1,41 +1,44 @@
.tools {
width: 800px;
margin: 32px auto;
.ant-input {
margin-bottom: 16px;
}
}
.react-node {
display: flex;
align-items: center;
width: 100%;
height: 100%;
border: 1px solid #5f95ff;
border-radius: 14px;
display: flex;
align-items: center;
img {
width: 24px;
height: 24px;
}
span {
margin-left: 4px;
font-size: 12px;
color: #000000a6;
font-size: 12px;
}
}
.stutterer {
transform: scale(1.5);
height: 310px;
width: 310px;
position: absolute;
left: 0;
right: 0;
top: 0;
right: 0;
bottom: 0;
left: 0;
width: 310px;
height: 310px;
margin: auto;
box-shadow: 0 0 10px 10px rgba(0, 0, 0, 0.2);
border-radius: 200px;
box-shadow: 0 0 10px 10px rgb(0 0 0 / 20%);
transform: scale(1.5);
}
.clockHand {
@@ -50,12 +53,12 @@
}
.innerLine {
border-radius: 6px;
position: absolute;
height: 149px;
left: 47.5%;
top: 0%;
left: 47.5%;
width: 5%;
height: 149px;
background-color: red;
border-radius: 6px;
transform-origin: bottom center;
}

View File

@@ -96,7 +96,7 @@ module.exports = function (config, base, karmaTypescriptConfig) {
},
coverageOptions: {
instrumentation: !isDebug,
exclude: /\.test|spec\.ts$/,
exclude: /\.(test|spec)\.ts$/,
},
reports: {
html: reportsDir,

View File

@@ -2,9 +2,9 @@
"name": "x6",
"private": true,
"scripts": {
"preinstall": "node ./scripts/preinstall",
"lint:ts": "eslint '**/src/**/*.{js,ts}?(x)' --fix",
"lint:style": "stylelint '**/src/**/*.less' --syntax less --fix",
"preinstall": "npx only-allow pnpm",
"lint:ts": "eslint '**/src/**/*.{js,ts}?(x)' --cache --fix",
"lint:style": "stylelint '**/src/**/*.less' --customSyntax postcss-less --cache --fix",
"lint": "run-s lint:ts lint:style",
"prettier": "prettier --write '**/*.{js,mjs,jsx,tsx,ts,less,md,json}'",
"pretty-quick": "pretty-quick",
@@ -15,7 +15,6 @@
"build:dev": "turbo run build:dev --filter=./packages/*",
"build:umd": "turbo run build:umd --filter=./packages/*",
"build:demos": "sh ./scripts/build-demos",
"build:sites": "sh ./scripts/build-sites",
"clean:turbo": "pnpm -r --if-present --parallel --filter=./packages/* run clean:turbo",
"clean:build": "pnpm -r --if-present --parallel --filter=./packages/* run clean",
"clean:modules": "pnpm -r --parallel exec rimraf node_modules && rimraf node_modules",
@@ -37,8 +36,8 @@
"build:umd": "pnpm run --if-present build:less && rollup -c ../../rollup.config.js --bundleConfigAsCjs",
"build:dev": "pnpm run --if-present build:less && run-p -s build:cjs build:esm",
"build:watch": "run-s -s build:watch:esm",
"build:watch:esm": "run-s -s 'build:esm -w'",
"build:watch:cjs": "run-s -s 'build:cjs -w'",
"build:watch:esm": "run-s -s 'build:esm -- -w'",
"build:watch:cjs": "run-s -s 'build:cjs -- -w'",
"build": "run-p -s build:dev build:umd",
"prebuild": "run-s -s clean:build",
"test": {
@@ -52,7 +51,7 @@
"prettier --write --ignore-unknown"
],
"*.less": [
"stylelint --syntax less --fix"
"stylelint --customSyntax postcss-less --fix"
],
"*.js": [
"prettier --write"
@@ -89,40 +88,40 @@
}
},
"dependencies": {
"@babel/core": "^7.20.2",
"@babel/core": "^7.20.5",
"@babel/plugin-syntax-flow": "^7.18.6",
"@babel/plugin-transform-react-jsx": "^7.19.0",
"@commitlint/config-conventional": "^17.2.0",
"@rollup/plugin-commonjs": "^23.0.2",
"@commitlint/config-conventional": "^17.3.0",
"@rollup/plugin-commonjs": "^23.0.5",
"@rollup/plugin-node-resolve": "^15.0.1",
"@rollup/plugin-replace": "^5.0.1",
"@rollup/plugin-typescript": "^8.2.5",
"@semantic-release-monorepo/cli": "^2.0.0",
"@semantic-release/changelog": "^6.0.1",
"@rollup/plugin-typescript": "^10.0.1",
"@semantic-release-monorepo/cli": "^2.1.2",
"@semantic-release/changelog": "^6.0.2",
"@semantic-release/git": "^10.0.1",
"@types/jasmine": "^4.3.0",
"@types/jest": "^29.2.2",
"@types/node": "^18.11.9",
"@types/jest": "^29.2.4",
"@types/node": "^18.11.15",
"@types/sinon": "^10.0.2",
"@typescript-eslint/eslint-plugin": "^5.42.0",
"@typescript-eslint/parser": "^5.42.0",
"@typescript-eslint/eslint-plugin": "^5.46.1",
"@typescript-eslint/parser": "^5.46.1",
"boxen": "^7.0.0",
"colors": "^1.4.0",
"coveralls": "^3.1.1",
"eslint": "^8.26.0",
"eslint": "^8.29.0",
"eslint-config-airbnb-base": "^15.0.0",
"eslint-config-prettier": "^8.3.0",
"eslint-plugin-eslint-comments": "^3.2.0",
"eslint-plugin-flowtype": "^8.0.3",
"eslint-plugin-import": "^2.24.2",
"eslint-plugin-jest": "^27.1.4",
"eslint-plugin-jest": "^27.1.7",
"eslint-plugin-jsx-a11y": "^6.4.1",
"eslint-plugin-prettier": "^4.0.0",
"eslint-plugin-promise": "^6.1.1",
"eslint-plugin-react": "^7.25.1",
"eslint-plugin-react": "^7.31.11",
"eslint-plugin-react-hooks": "^4.2.0",
"eslint-plugin-unicorn": "^44.0.2",
"fs-extra": "^10.0.0",
"eslint-plugin-unicorn": "^45.0.2",
"fs-extra": "^11.1.0",
"husky": "^8.0.1",
"is-ci": "^3.0.0",
"jasmine-core": "^4.5.0",
@@ -131,27 +130,27 @@
"karma-chrome-launcher": "^3.1.0",
"karma-cli": "^2.0.0",
"karma-jasmine": "^5.1.0",
"karma-spec-reporter": "^0.0.34",
"karma-spec-reporter": "^0.0.36",
"karma-typescript": "5.5.3",
"karma-typescript-es6-transform": "5.5.3",
"less": "^4.1.1",
"lodash": "^4.17.21",
"npm-run-all": "^4.1.5",
"postcss": "^8.3.6",
"prettier": "^2.4.0",
"postcss": "^8.4.20",
"postcss-less": "^6.0.0",
"prettier": "^2.8.0",
"pretty-quick": "^3.1.1",
"rimraf": "^3.0.2",
"rollup": "^3.2.5",
"rollup": "^3.7.4",
"rollup-plugin-auto-external": "^2.0.0",
"rollup-plugin-filesize": "^9.1.1",
"rollup-plugin-postcss": "^4.0.1",
"rollup-plugin-progress": "^1.1.2",
"rollup-plugin-terser": "^7.0.2",
"run-shared-scripts": "^1.0.2",
"run-shared-scripts": "^1.1.5",
"semantic-release": "^19.0.5",
"sinon": "^14.0.1",
"stylelint": "^14.14.1",
"stylelint-config-prettier": "^9.0.3",
"sinon": "^15.0.1",
"stylelint": "^14.15.0",
"stylelint-config-prettier": "^9.0.4",
"stylelint-config-rational-order": "^0.1.2",
"stylelint-config-standard": "^29.0.0",
"stylelint-declaration-block-no-ignored-properties": "^2.4.0",
@@ -160,6 +159,12 @@
"ts-node": "^10.2.1",
"tslib": "^2.4.1",
"turbo": "^1.6.3",
"typescript": "^4.4.3"
"typescript": "^4.9.3"
},
"devDependencies": {
"@rollup/plugin-terser": "^0.2.0"
},
"engines": {
"pnpm": ">=7"
}
}

View File

@@ -0,0 +1,21 @@
MIT License
Copyright (c) 2021-2023 Alipay.inc
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

View File

@@ -0,0 +1,136 @@
# @antv/x6-angular-shape
## 渲染节点
我们提供了一个独立的包 `@antv/x6-angular-shape` 以支持将 Angular 的组件/模板作为节点进行渲染。
### Component 渲染
```ts
@Component({
selector: 'app-node',
templateUrl: './node.component.html',
styleUrls: ['./node.component.scss'],
})
export class NodeComponent implements AfterViewInit, OnChanges {
@Input() value: string;
}
```
```ts
import { register } from "@antv/x6-angular-shape";
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.scss'],
})
export class AppComponent implements AfterViewInit {
ngAfterViewInit(): void {
register({
shape: 'custom-angular-component-node',
width: 120,
height: 20,
content: NodeComponent,
injector: this.injector,
});
this.graph.addNode({
shape: 'custom-angular-component-node',
x: 100,
y: 100,
data: {
// Input 的参数必须放在这里
ngArguments: {
value: '糟糕糟糕 Oh my god',
},
},
});
}
}
```
### TemplateRef 渲染
```html
<ng-template #template let-data="ngArguments">
<section class="template-container">
<span class="value">{{ data.value }}</span>
</section>
</ng-template>
```
```ts
import { register } from "@antv/x6-angular-shape";
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.scss'],
})
export class AppComponent implements AfterViewInit {
@ViewChild('template') template: TemplateRef<{}>;
ngAfterViewInit(): void {
register({
shape: 'custom-angular-template-node',
width: 120,
height: 20,
content: this.template,
injector: this.injector,
});
this.graph.addNode({
shape: 'custom-angular-template-node',
x: 100,
y: 100,
data: {
ngArguments: {
value: '魔法怎么失灵啦',
},
},
});
}
}
```
## 更新节点
无论是使用 Component 还是 TemplateRef, 都是一样的更新方式.
```ts
node.setData({
ngArguments: {
value: '晚风中闪过 几帧从前啊',
},
});
```
## 有 demo 吗?
有的, 因为X6渲染节点部分与框架是解耦的. 因此 `x6-angular-shape` 包并非是直接在源代码里改的, 而是在一个单独的Angular环境中开发的. 该 demo 还提供了多种节点类型的性能测试, 详情请参考[Eve-Sama/x6-angular-shape](https://github.com/Eve-Sama/x6-angular-shape)、[X6与G6的性能对比, 以及X6多节点类型下的FPS临界点讨论](https://github.com/antvis/X6/issues/3266)
## FAQ
### 为什么输入属性不能直接放在 data 中而需要放在 ngArguments 中? 且为什么不叫 ngInput?
因为并非所有 `node.data` 中的属性都是输入属性, 所以遍历 `data` 中的所有属性进行赋值是不合适的. 至于为什么叫 `ngArguments` 主要是有两点考虑.
- 1.x版本中已经这么用了, 沿用该API可以降低用户升级成本
- `Input` 的概念其实是来自 `Component`, 而 `TemplateRef` 中是 `context`, 在二者的基础上抽象一个 `Arguments` 的概念更通用些
### 2.x版本的 x6-angular-shape 相比较1.x版本有什么新特性吗?
实现思路其实和之前是差不多的. 但是确实有几个点值得一提.
#### demo更聚焦
1.x版本的 demo 除了渲染组件外, 还写了连线、清除等一系列案例. 看似扩展, 实则眼花缭乱. 作为 `x6-angular-shape`的 demo, 2.x版本更加聚焦, 更加聚焦于shape的使用与性能测试等, 与插件无关的内容请查看X6官网.
#### 功能更稳定
在1.x版本中, 虽然实现了功能, 但是使用场景的思考不够全面. 比如`ngArguments`的变化, 对 `TemplateRef`的场景并不生效. 虽然对`Component`生效但是无法触发`ngOnChanges`. 而在新版本中, 这些问题都将不复存在.
### 版本要求
你的Angular版本至少在14及以上才可以. 14以下需要用 hack 的方式实现一些特性, 比较麻烦. 暂时不提供, 如有需要可提issue, 我再专门介绍下如何实现.

View File

@@ -0,0 +1,67 @@
{
"name": "@antv/x6-angular-shape",
"version": "2.0.0",
"description": "X6 shape for rendering angular components.",
"main": "lib/index.js",
"module": "es/index.js",
"unpkg": "dist/index.js",
"jsdelivr": "dist/index.js",
"types": "lib/index.d.ts",
"files": [
"dist",
"es",
"lib",
"src"
],
"keywords": [
"shape",
"angular",
"render",
"x6",
"antv"
],
"scripts": {
"clean:turbo": "rss",
"clean:build": "rss",
"clean:coverage": "rss",
"clean": "rss",
"build:esm": "rss",
"build:cjs": "rss",
"build:umd": "rss",
"build:dev": "rss",
"build:watch": "rss",
"build:watch:esm": "rss",
"build:watch:cjs": "rss",
"build": "rss",
"prebuild": "rss",
"test": "rss",
"coveralls": "rss",
"pretest": "rss"
},
"peerDependencies": {
"@antv/x6": "^2.x",
"@angular/core": ">= 14"
},
"devDependencies": {
"@antv/x6": "^2.x",
"@angular/core": ">= 14"
},
"author": {
"name": "Eve-Sama",
"email": "948832626@qq.com"
},
"license": "MIT",
"homepage": "https://x6.antv.antgroup.com/tutorial/intermediate/angular",
"bugs": {
"url": "https://github.com/antvis/x6/issues"
},
"repository": {
"type": "git",
"url": "https://github.com/antvis/x6.git",
"directory": "packages/x6-angular-shape"
},
"publishConfig": {
"access": "public",
"registry": "https://registry.npmjs.org"
}
}

View File

@@ -0,0 +1,3 @@
export * from './node'
export * from './view'
export * from './registry'

View File

@@ -0,0 +1,102 @@
import { Node, Markup, ObjectExt } from '@antv/x6'
export class AngularShape<
Properties extends AngularShape.Properties = AngularShape.Properties,
> extends Node<Properties> {}
export namespace AngularShape {
export type Primer =
| 'rect'
| 'circle'
| 'path'
| 'ellipse'
| 'polygon'
| 'polyline'
export interface Properties extends Node.Properties {
primer?: Primer
}
}
export namespace AngularShape {
function getMarkup(primer?: Primer) {
const markup: Markup.JSONMarkup[] = []
const content = Markup.getForeignObjectMarkup()
if (primer) {
markup.push(
...[
{
tagName: primer,
selector: 'body',
},
content,
],
)
} else {
markup.push(content)
}
return markup
}
AngularShape.config<Properties>({
view: 'angular-shape-view',
markup: getMarkup(),
attrs: {
body: {
fill: 'none',
stroke: 'none',
refWidth: '100%',
refHeight: '100%',
},
fo: {
refWidth: '100%',
refHeight: '100%',
},
},
propHooks(metadata: Properties) {
if (metadata.markup == null) {
const primer = metadata.primer
if (primer) {
metadata.markup = getMarkup(primer)
let attrs = {}
switch (primer) {
case 'circle':
attrs = {
refCx: '50%',
refCy: '50%',
refR: '50%',
}
break
case 'ellipse':
attrs = {
refCx: '50%',
refCy: '50%',
refRx: '50%',
refRy: '50%',
}
break
default:
break
}
metadata.attrs = ObjectExt.merge(
{},
{
body: {
refWidth: null,
refHeight: null,
...attrs,
},
},
metadata.attrs || {},
)
}
}
return metadata
},
})
Node.registry.register('angular-shape', AngularShape, true)
}

View File

@@ -0,0 +1,32 @@
import { Injector, TemplateRef, Type } from '@angular/core'
import { Graph, Node } from '@antv/x6'
export type Content = TemplateRef<any> | Type<any>
export type AngularShapeConfig = Node.Properties & {
shape: string
injector: Injector
content: Content
}
export const registerInfo: Map<
string,
{
injector: Injector
content: Content
}
> = new Map()
export function register(config: AngularShapeConfig) {
const { shape, injector, content, ...others } = config
registerInfo.set(shape, { injector, content })
Graph.registerNode(
shape,
{
inherit: 'angular-shape',
...others,
},
true,
)
}

View File

@@ -0,0 +1,124 @@
import {
ComponentRef,
EmbeddedViewRef,
TemplateRef,
ViewContainerRef,
} from '@angular/core'
import { Dom, NodeView } from '@antv/x6'
import { AngularShape } from './node'
import { Content, registerInfo } from './registry'
export class AngularShapeView extends NodeView<AngularShape> {
getNodeContainer(): HTMLDivElement {
return this.selectors && (this.selectors.foContent as HTMLDivElement)
}
override confirmUpdate(flag: number): number {
const ret = super.confirmUpdate(flag)
return this.handleAction(ret, AngularShapeView.action, () =>
this.renderAngularContent(),
)
}
private getNgArguments(): Record<string, any> {
const input = (this.cell.data?.ngArguments as Record<string, any>) || {}
return input
}
/** 当执行 node.setData() 时需要对实例设置新的输入值 */
private setInstanceInput(
content: Content,
ref: EmbeddedViewRef<any> | ComponentRef<any>,
): void {
const ngArguments = this.getNgArguments()
if (content instanceof TemplateRef) {
const embeddedViewRef = ref as EmbeddedViewRef<any>
embeddedViewRef.context = { ngArguments }
} else {
const componentRef = ref as ComponentRef<any>
Object.keys(ngArguments).forEach((v) =>
componentRef.setInput(v, ngArguments[v]),
)
componentRef.changeDetectorRef.detectChanges()
}
}
protected renderAngularContent(): void {
this.unmountAngularContent()
const container = this.getNodeContainer()
if (container) {
const node = this.cell
const { injector, content } = registerInfo.get(node.shape)!
const viewContainerRef = injector.get(ViewContainerRef)
if (content instanceof TemplateRef) {
const ngArguments = this.getNgArguments()
const embeddedViewRef = viewContainerRef.createEmbeddedView(content, {
ngArguments,
})
embeddedViewRef.rootNodes.forEach((node) => container.appendChild(node))
embeddedViewRef.detectChanges()
node.on('change:data', () =>
this.setInstanceInput(content, embeddedViewRef),
)
} else {
const componentRef = viewContainerRef.createComponent(content)
const insertNode = (componentRef.hostView as EmbeddedViewRef<any>)
.rootNodes[0] as HTMLElement
container.appendChild(insertNode)
this.setInstanceInput(content, componentRef)
node.on('change:data', () =>
this.setInstanceInput(content, componentRef),
)
}
}
}
protected unmountAngularContent(): HTMLDivElement {
const container = this.getNodeContainer()
container.innerHTML = ''
return container
}
override onMouseDown(e: Dom.MouseDownEvent, x: number, y: number) {
const target = e.target as Element
const tagName = target.tagName.toLowerCase()
if (tagName === 'input') {
const type = target.getAttribute('type')
if (
type == null ||
[
'text',
'password',
'number',
'email',
'search',
'tel',
'url',
].includes(type)
) {
return
}
}
super.onMouseDown(e, x, y)
}
override unmount(): this {
this.unmountAngularContent()
super.unmount()
return this
}
}
export namespace AngularShapeView {
export const action = 'angular' as any
AngularShapeView.config({
bootstrap: [action],
actions: {
component: action,
},
})
NodeView.registry.register('angular-shape-view', AngularShapeView, true)
}

View File

@@ -1 +1,43 @@
## @antv/x6-common [2.0.10](https://github.com/antvis/x6/compare/@antv/x6-common@2.0.9...@antv/x6-common@2.0.10) (2023-02-24)
### Bug Fixes
* add textLength & lengthAdjust to CASE_SENSITIVE_ATTR ([#3281](https://github.com/antvis/x6/issues/3281)) ([76fb1ac](https://github.com/antvis/x6/commit/76fb1acf74b0f1c308f7c824d02c12244b7ac8f3))
## @antv/x6-common [2.0.8](https://github.com/antvis/x6/compare/@antv/x6-common@2.0.7...@antv/x6-common@2.0.8) (2023-02-18)
### Bug Fixes
* fix typo for dom event handlers ([#3255](https://github.com/antvis/x6/issues/3255)) ([9b4fa86](https://github.com/antvis/x6/commit/9b4fa86daa587fe8818f3615bc1e40738a0f2319))
## @antv/x6-common [2.0.6](https://github.com/antvis/x6/compare/@antv/x6-common@2.0.5...@antv/x6-common@2.0.6) (2023-01-31)
### Bug Fixes
* fix index error for priorityQueue ([#3179](https://github.com/antvis/x6/issues/3179)) ([d64150b](https://github.com/antvis/x6/commit/d64150bfadf10fe21f44734a0267261260b8c53b))
## @antv/x6-common [2.0.5](https://github.com/antvis/x6/compare/@antv/x6-common@2.0.4...@antv/x6-common@2.0.5) (2023-01-18)
### Bug Fixes
* optimize css loader ([#3156](https://github.com/antvis/x6/issues/3156)) ([9c48ad8](https://github.com/antvis/x6/commit/9c48ad8dfc99e623a57855295d07c35be5483073))
## @antv/x6-common [2.0.4](https://github.com/antvis/x6/compare/@antv/x6-common@2.0.3...@antv/x6-common@2.0.4) (2022-12-20)
### Bug Fixes
* fix window incompatibility problem ([#3070](https://github.com/antvis/x6/issues/3070)) ([d8e1e63](https://github.com/antvis/x6/commit/d8e1e637d8027b9494cd26efc87815d74bd51366))
## @antv/x6-common [2.0.1](https://github.com/antvis/x6/compare/@antv/x6-common@2.0.0...@antv/x6-common@2.0.1) (2022-11-25)
### Bug Fixes
* npm version ([cb0cfde](https://github.com/antvis/x6/commit/cb0cfdeb4dbe8858569e6899db08ccb9ab8ba4e7))
## @antv/x6-common [2.0.1](https://github.com/antvis/x6/compare/@antv/x6-common@2.0.0...@antv/x6-common@2.0.1) (2022-11-24)

View File

@@ -1,6 +1,6 @@
MIT License
Copyright (c) 2021-2022 Alipay.inc
Copyright (c) 2021-2023 Alipay.inc
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal

View File

@@ -1,6 +1,6 @@
{
"name": "@antv/x6-common",
"version": "2.0.1",
"version": "2.0.11",
"description": "Basic toolkit for X6",
"main": "lib/index.js",
"module": "es/index.js",
@@ -10,7 +10,8 @@
"files": [
"dist",
"es",
"lib"
"lib",
"src"
],
"keywords": [
"util",
@@ -48,13 +49,13 @@
"email": "vectorse@126.com"
},
"license": "MIT",
"homepage": "https://github.com/antvis/x6",
"homepage": "https://x6.antv.antgroup.com",
"bugs": {
"url": "https://github.com/antvis/x6/issues"
},
"repository": {
"type": "git",
"url": "ssh://git@github.com/antvis/x6.git",
"url": "https://github.com/antvis/x6.git",
"directory": "packages/x6-common"
},
"publishConfig": {

View File

@@ -45,7 +45,7 @@ export class PriorityQueue<T> {
*/
insert(priority: number, value: T, id?: string) {
const item: PriorityQueue.DataItem<T> = { priority, value }
const index = this.data.length - 1
const index = this.data.length
if (id) {
item.id = id
this.index[id] = index
@@ -96,7 +96,9 @@ export class PriorityQueue<T> {
const data = this.data
const peek = data[0]
const last = data.pop()!
delete this.index[data.length]
if (peek.id) {
delete this.index[peek.id]
}
if (data.length > 0) {
data[0] = last

View File

@@ -6,5 +6,5 @@ export {
sortBy,
groupBy,
difference,
max
max,
} from 'lodash-es'

View File

@@ -1,3 +1,5 @@
/* eslint-disable no-constructor-return */
import { NumberExt } from '../number'
export class Color {

View File

@@ -2,6 +2,7 @@ import { Platform } from '../platform'
interface CssModule {
name: string
loadTimes: number
styleElement: HTMLStyleElement | null
}
@@ -10,8 +11,11 @@ const cssModules: CssModule[] = []
export function ensure(name: string, content: string) {
const cssModule = cssModules.find((m) => m.name === name)
if (cssModule) {
cssModule.loadTimes += 1
if (cssModule.loadTimes > 1) {
return
}
}
if (!Platform.isApplyingHMR()) {
const styleElement = document.createElement('style')
@@ -25,6 +29,7 @@ export function ensure(name: string, content: string) {
cssModules.push({
name,
loadTimes: 1,
styleElement,
})
}
@@ -34,7 +39,13 @@ export function clean(name: string) {
const index = cssModules.findIndex((m) => m.name === name)
if (index > -1) {
let styleElement = cssModules[index].styleElement
const cssModule = cssModules[index]
cssModule.loadTimes -= 1
if (cssModule.loadTimes > 0) {
return
}
let styleElement = cssModule.styleElement
if (styleElement && styleElement.parentNode) {
styleElement.parentNode.removeChild(styleElement)
}

View File

@@ -6,6 +6,8 @@ export const CASE_SENSITIVE_ATTR = [
'attributeName',
'attributeType',
'repeatCount',
'textLength',
'lengthAdjust',
]
export type Attributes = { [key: string]: string | number | null | undefined }

View File

@@ -33,7 +33,7 @@ export function addClass(
}
if (typeof selector === 'string' && elem.nodeType === 1) {
const classes = selector.match(rnotwhite) || []
const classes: string[] = selector.match(rnotwhite) || []
const oldValue = fillSpaces(getClass(elem)).replace(rclass, ' ')
let newValue = classes.reduce((memo, cls) => {
if (memo.indexOf(fillSpaces(cls)) < 0) {
@@ -63,7 +63,7 @@ export function removeClass(
}
if ((!selector || typeof selector === 'string') && elem.nodeType === 1) {
const classes = (selector || '').match(rnotwhite) || []
const classes: string[] = (selector || '').match(rnotwhite) || []
const oldValue = fillSpaces(getClass(elem)).replace(rclass, ' ')
let newValue = classes.reduce((memo, cls) => {
const className = fillSpaces(cls)

View File

@@ -1,26 +1,25 @@
import { StringExt } from '../string'
export function getData(dataset: Record<string, any>, name: string) {
const value = dataset[name] || dataset[StringExt.camelCase(name)]
try {
return JSON.parse(value)
} catch {
return value
const dataset: WeakMap<Element, Record<string, any>> = new WeakMap()
export function getData(elem: Element, name: string) {
const key = StringExt.camelCase(name)
const cache = dataset.get(elem)
if (cache) {
return cache[key]
}
}
export function setData(
dataset: Record<string, any>,
name: string,
value: any,
) {
let val = value
try {
val = JSON.stringify(val)
} catch (e) {
// paas
export function setData(elem: Element, name: string, value: any) {
const key = StringExt.camelCase(name)
const cache = dataset.get(elem)
if (cache) {
cache[key] = value
} else {
dataset.set(elem, {
[key]: value,
})
}
dataset[StringExt.camelCase(name)] = val
}
export function data(elem: Element): Record<string, any> | undefined
@@ -34,20 +33,17 @@ export function data(
) {
if (!name) {
const datas: Record<string, any> = {}
const dataset = (elem as any).dataset
// eslint-disable-next-line
for (const key in dataset) {
datas[key] = getData(dataset, key)
}
Object.keys(dataset).forEach((key) => {
datas[key] = getData(elem, key)
})
return datas
}
if (typeof name === 'string') {
const dataset = (elem as any).dataset
if (value === undefined) {
return getData(dataset, name)
return getData(elem, name)
}
setData(dataset, name, value)
setData(elem, name, value)
return
}

View File

@@ -729,7 +729,7 @@ type TypeEventHandlersBase<TDelegateTarget, TData, TCurrentTarget, TTarget> = {
TCurrentTarget,
TTarget
>]?:
| TypeEventHandler<TDelegateTarget, TData, TCurrentTarget, TTarget, TType>
| TypeEventHandler<TDelegateTarget, TData, TCurrentTarget, TTarget, string>
| false
| Record<string, unknown>
}

View File

@@ -198,7 +198,14 @@ export function text(
const autoLineHeight = defaultLineHeight === 'auto'
const lineHeight = autoLineHeight ? '1.5em' : defaultLineHeight || '1em'
let needEmptyElem = true
const childs = elem.children
if (childs.length === 1 && childs[0].tagName.toUpperCase() === 'TITLE') {
needEmptyElem = false
}
if (needEmptyElem) {
empty(elem)
}
attr(elem, {
// Preserve spaces, do not consecutive spaces to get collapsed to one.

View File

@@ -1,4 +1,4 @@
export { debounce } from 'lodash-es'
export { debounce, throttle } from 'lodash-es'
type Fn = (...args: any[]) => any

View File

@@ -117,6 +117,7 @@ export function unsetByPath(
return obj
}
// eslint-disable-next-line default-param-last
export function flatten(obj: any, delim = '/', stop?: (val: any) => boolean) {
const ret: { [key: string]: any } = {}

View File

@@ -1,6 +1,10 @@
// compatible with NodeList.prototype.forEach() before chrome 51
// https://developer.mozilla.org/en-US/docs/Web/API/NodeList/forEach
if (window.NodeList && !NodeList.prototype.forEach) {
if (
typeof window === 'object' &&
window.NodeList &&
!NodeList.prototype.forEach
) {
NodeList.prototype.forEach = Array.prototype.forEach as any
}

7
packages/x6-devtool/.gitignore vendored Normal file
View File

@@ -0,0 +1,7 @@
node_modules
yarn.lock
.vscode
devtools.crx
devtools.pem
.DS_Store
.vscode

View File

@@ -0,0 +1,49 @@
# X6 Devtool
> A devtool for @antv/x6 in chrome, it's still WIP, you can load it in unpack way;
## Quick Start
### Import unpacked plugin
![image](https://user-images.githubusercontent.com/15213473/150081309-61f9c451-c35e-4dab-a23c-ed5e425e7ec5.png)
1. Open the Extension Management page by navigating to chrome://extensions.
2. Enable Developer Mode by clicking the toggle switch next to Developer mode.
3. Click the Load unpacked button and select the 'devtool' directory.
### Connect with X6 Graph;
#### In X6
```javascript
// init window hook
window.__x6_instances__ = [];
var graph = new Graph({...blablabla});
window.__x6_instances__.push(graph);
```
### Using devtool
After these steps, the tab 'AntV X6' should show in devtools' tab, select it and choose a canvas
![image](https://user-images.githubusercontent.com/1826685/223881189-bf99f2ad-5158-4c39-8d16-018a287ac2fe.png)
## Features
### Inspect Element in Graph
![image](https://user-images.githubusercontent.com/1826685/223881189-bf99f2ad-5158-4c39-8d16-018a287ac2fe.png)
### View and Modify Attributes of Element
![image](https://user-images.githubusercontent.com/1826685/223881189-bf99f2ad-5158-4c39-8d16-018a287ac2fe.png)
### Using select element directly in graph
![image](https://user-images.githubusercontent.com/1826685/223881189-bf99f2ad-5158-4c39-8d16-018a287ac2fe.png)

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,19 @@
{
"name": "AntV X6 Dev Tool",
"description": "devtool for x6 graph",
"version": "0.0.1",
"devtools_page": "x6_devtools.html",
"minimum_chrome_version": "49",
"manifest_version": 2,
"permissions": ["file:///*", "http://*/*", "https://*/*"],
"icons": {
"16": "icons/16.png",
"32": "icons/32.png",
"48": "icons/48.png",
"128": "icons/128.png"
},
"content_security_policy": "script-src 'self' 'unsafe-eval'; object-src 'self'",
"web_accessible_resources": ["main.html", "panel.html", "script/backend.js"],
"browser_action": {}
}

View File

@@ -0,0 +1,59 @@
<!DOCTYPE html>
<html style="display: flex">
<head>
<meta charset="utf8" />
<style>
html {
display: flex;
}
body {
margin: 0;
padding: 0;
flex: 1;
display: flex;
}
#container {
display: block;
flex: 1;
width: 100%;
position: fixed;
overflow: auto;
height: 100%;
top: 0;
left: 0;
right: 0;
bottom: 0;
}
#desc {
width: 240px;
padding-left: 12px;
height: 100%;
position: fixed;
right: 0;
top: 0;
overflow: auto;
background: white;
border-left: 1px solid #eee;
}
.tag.selected {
background: rgba(135, 59, 244, 0.5);
}
.tag {
background: rgba(128, 128, 128, 0.5);
padding-left: 8px;
}
.tag.selected::after {
display: inline-block;
opacity: 0.4;
font-size: 12px;
content: '$gElement';
}
</style>
</head>
<body>
<div id="container"></div>
<script src="./ui/ui.js"></script>
<script src="./script/panel.js"></script>
</body>
</html>

View File

@@ -0,0 +1,20 @@
chrome.runtime.onMessage.addListener((req, sender) => {
if (req.isAntVX6 && sender && sender.tab) {
if (req.disabled) {
chrome.browserAction.setIcon({
tabId: sender.tab.id,
path: 'icons/48-disabled.png',
})
} else {
chrome.browserAction.setIcon({
tabId: sender.tab.id,
path: {
16: 'icons/16.png',
32: 'icons/32.png',
48: 'icons/48.png',
128: 'icons/128.png',
},
})
}
}
})

View File

@@ -0,0 +1,52 @@
/**
* global instance and flag
*/
var panelInstance
var itv
function createPanelInstance() {
if (panelInstance) {
return
}
chrome.devtools.inspectedWindow.eval(
`!!(window.__x6_instances__ && window.__x6_instances__.length)`,
function (connected, err) {
if (!connected) {
return
}
clearInterval(itv)
panelInstance = chrome.devtools.panels.create(
'AntV X6',
'icons/32.png',
'panel.html',
function (panel) {
panel.onHidden.addListener(function () {
chrome.devtools.inspectedWindow.eval(`(function() {
var elements = document.getElementsByClassName('g_devtool_rect');
[].forEach.apply(elements, [function (e) {
e.remove();
}])
})()`)
})
},
)
chrome.runtime.sendMessage({
isAntVX6: true,
disabled: false,
})
},
)
}
chrome.devtools.network.onNavigated.addListener(function () {
// createPanelIfReactLoaded();
})
createPanelInstance()
itv = setInterval(createPanelInstance, 1000)

View File

@@ -0,0 +1,281 @@
//
// script execute function
//
// execute raw script in inspect window
var executeScriptInInspectWindow = function (script) {
return new Promise(function (resolve, reject) {
chrome.devtools.inspectedWindow.eval(script, function (result, exception) {
if (exception) {
console.error('eval error', script)
reject(exception)
} else {
resolve(result)
}
})
})
}
// execute function in anynomous code block
var executeFuntionInInspectWindow = function (func, args) {
return executeScriptInInspectWindow(
`(${func.toString()}).apply(window, ${JSON.stringify(args)})`,
)
}
//
// these are the function that execute in inspect window
//
function doFPSThings() {
if (window.__x6_fps) {
cancelAnimationFrame(window.__x6_fps)
}
let lastCalledTime
let fps
let delta
function requestAnimFrame() {
if (!lastCalledTime) {
lastCalledTime = performance.now()
fps = 0
} else {
delta = (performance.now() - lastCalledTime) / 1000
lastCalledTime = performance.now()
fps = 1 / delta
}
window.__x6_fps_value = Math.round(fps)
window.__x6_fps = requestAnimationFrame(requestAnimFrame)
}
requestAnimFrame()
}
// get global X6 Graph structure
function getGlobalInstances() {
var instances = window.__x6_instances__
var gmap = {}
var getGraphCells = function (graph) {
// 使用model中的引用直接获取元素
return graph.model.collection.cells
}
window.__x6_instances__.globalMap = gmap
var gInfo = []
function getX6Instance(instance) {
const ga = {}
// antv/g 实现了getChildren可以递归获取x6不行
// if (instance.getChildren && instance.getChildren()) {
// ga.children = instance.getChildren().map(function (p) {
// return getX6Instance(p);
// });
// }
if (!instance.__dev_hash) {
ga.hash = Math.random().toString(16).slice(-8)
instance.__dev_hash = ga.hash
} else {
ga.hash = instance.__dev_hash
}
gmap[ga.hash] = instance
ga.id = instance.id
ga.name = instance.name || instance.prop('shape') || instance.prop('label')
ga.type = instance.isEdge() ? 'edge' : 'node'
return ga
}
if (instances && instances.length) {
gInfo = instances.map(function (instance) {
const hash = instance.hash || Math.random().toString(16).slice(-8)
const cells = getGraphCells(instance).map((e) => getX6Instance(e))
const plugins = Array.from(instance.installedPlugins).map((plugin) => {
const hash = plugin.hash || Math.random().toString(16).slice(-8)
const ga = {
name: plugin.name,
hash,
type: 'plugin',
}
plugin.hash = ga.hash
gmap[ga.hash] = plugin
return ga
})
var ga = {
type: 'svg',
name: 'Graph',
nodeName: 'graph',
hash,
children: cells.concat(plugins),
memory: window.performance.memory.usedJSHeapSize,
fps: window.__x6_fps_value,
}
instance.hash = ga.hash
gmap[ga.hash] = instance
return ga
})
} else {
gInfo.length = 0
}
return gInfo
}
function checkGraphByHash(hash) {
return !!window.__x6_instances__.map((e) => e.hash).includes(hash)
}
function createBoxUsingId(bbox, id, color) {
var el = document.createElement('div')
window[id] = el
el.classList.add('x6_devtool_rect')
document.body.appendChild(el)
el.style.position = 'absolute'
el.style.width = `${bbox.width}px`
el.style.height = `${bbox.height}px`
el.style.top = `${bbox.top}px`
el.style.left = `${bbox.left}px`
el.style.background = color || 'rgba(135, 59, 244, 0.5)'
el.style.border = '2px dashed rgb(135, 59, 244)'
el.style.boxSizing = 'border-box'
}
function removeBoxUsingId(id) {
if (window[id]) {
window[id].remove()
}
}
function removeAllBox() {
var elements = document.getElementsByClassName('x6_devtool_rect')
;[].forEach.apply(elements, [
function (e) {
e.remove()
},
])
}
function getElemetBBoxByHash(hash) {
try {
var targetEl = window.__x6_instances__.globalMap[hash]
if (targetEl) {
const bbox = targetEl.getGraphArea
? targetEl.getGraphArea()
: targetEl.getBBox()
const pageBBox = targetEl.model.graph.localToPage(bbox)
const { width, height, x, y, left, top } = pageBBox
return { width, height, x, y, left, top }
}
} catch (e) {}
return {}
}
function getElementAttrByHash(hash) {
const instance = window.__x6_instances__.globalMap[hash]
if (instance) {
return instance.prop
? instance.prop()
: instance.options
? {
...instance.options,
container: undefined,
}
: {}
}
return {}
}
function setElementAttrByHash(hash, name, value) {
const instance = window.__x6_instances__.globalMap[hash]
// graph can not set prop
if (instance && instance.prop) {
instance.prop(name, value)
}
}
function setGElementByHash(hash) {
window.$gElemet = hash ? window.__x6_instances__.globalMap[hash] : undefined
}
function consoleElementByHash(hash, desc) {
window.console.log(
desc || '<Click To Expand>',
window.__x6_instances__.globalMap[hash],
)
}
//
// these are the functions that run in devtools panel
//
function setRect(bbox, id, color) {
executeFuntionInInspectWindow(removeBoxUsingId, [id]).finally(() => {
executeFuntionInInspectWindow(createBoxUsingId, [bbox, id, color])
})
}
function cleanRect(id) {
executeFuntionInInspectWindow(removeBoxUsingId, [id])
}
function showRect(hash, id, color) {
executeFuntionInInspectWindow(getElemetBBoxByHash, [hash]).then((bbox) => {
setRect(bbox, id, color)
})
}
function cleanAllRect() {
executeFuntionInInspectWindow(removeAllBox)
}
function getAttrs(hash) {
if (hash) {
executeFuntionInInspectWindow(setGElementByHash, [hash])
return executeFuntionInInspectWindow(getElementAttrByHash, [hash])
}
return executeFuntionInInspectWindow(setGElementByHash, [])
}
function updateAttrs(hash, name, attrs) {
return executeFuntionInInspectWindow(setElementAttrByHash, [
hash,
name,
attrs,
])
}
function consoleEl(hash, desc) {
return executeFuntionInInspectWindow(consoleElementByHash, [hash, desc])
}
function checkGraphAlive(hash) {
return executeFuntionInInspectWindow(checkGraphByHash, [hash]).then((res) => {
if (res) {
return true
} else {
return false
}
})
}
function getNowGraphData() {
return executeFuntionInInspectWindow(getGlobalInstances)
}
function startFPSMonitor() {
return executeFuntionInInspectWindow(doFPSThings)
}
getNowGraphData().then(function (data) {
const container = document.getElementById('container')
mount(data, container, {
showRect,
getAttrs,
cleanRect,
updateAttrs,
consoleEl,
checkGraphAlive,
getNowGraphData,
cleanAllRect,
startFPSMonitor,
})
})
startFPSMonitor()

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,49 @@
/*
object-assign
(c) Sindre Sorhus
@license MIT
*/
/*!
Copyright (c) 2018 Jed Watson.
Licensed under the MIT License (MIT), see
http://jedwatson.github.io/classnames
*/
/*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */
/** @license React v0.20.2
* scheduler.production.min.js
*
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
/** @license React v16.13.1
* react-is.production.min.js
*
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
/** @license React v17.0.2
* react-dom.production.min.js
*
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
/** @license React v17.0.2
* react.production.min.js
*
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/

View File

@@ -0,0 +1,8 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<script src="./script/main.js"></script>
</head>
<body></body>
</html>

View File

@@ -0,0 +1,29 @@
{
"name": "@antv/x6-devtool",
"version": "0.0.1",
"private": true,
"description": "devtool for x6 in browser",
"license": "MIT",
"main": "index.js",
"scripts": {
"start": "webpack -w",
"build": "webpack"
},
"dependencies": {
"antd": "4.18.3",
"react": "17.0.2",
"react-dom": "17.0.2",
"react-json-view": "1.21.3",
"@ant-design/icons": "^5.0.1"
},
"devDependencies": {
"@babel/core": "^7.16.7",
"@babel/preset-env": "^7.16.8",
"@babel/preset-react": "^7.16.7",
"babel-loader": "^8.2.3",
"css-loader": "^6.5.1",
"style-loader": "^3.3.1",
"webpack": "^5.66.0",
"webpack-cli": "4.9.1"
}
}

View File

@@ -0,0 +1,189 @@
import React, { useState, useEffect } from 'react'
import { Row, Select, Col, Button, Tooltip, Tag, Empty } from 'antd'
import { CodeOutlined } from '@ant-design/icons'
import GTree from './GTree'
const countTree = (tree) => {
if (!tree) {
return 0
}
const count = tree?.children?.reduce((a, b) => a + countTree(b), 1) || 1
tree.count = count
return count
}
export function convertMemoryUnit(number, digits = 2) {
let value
let unit
if (number > 1000000000) {
unit = 'GB'
value = number / 1000000000
} else if (number > 1000000) {
unit = 'MB'
value = number / 1000000
} else if (number > 1000) {
unit = 'KB'
value = number / 1000
} else {
unit = 'B'
value = number
}
value = value && value % 1 !== 0 ? value.toFixed(digits) : value
return value + unit
}
const HeadBar = (props) => {
const {
data,
setSelectedHash,
actions,
selectedData,
setData,
selectedHash,
} = props
const [graphAlive, setGraphAlive] = useState(true)
useEffect(() => {
const itv = setInterval(() => {
actions.checkGraphAlive(selectedHash).then((res) => {
setGraphAlive(res)
if (res) {
actions.getNowGraphData().then((d) => {
if (d) {
setData(d)
}
})
}
})
}, 1000)
return () => {
clearInterval(itv)
}
}, [actions, setData, selectedData, selectedHash])
useEffect(() => {
if (!graphAlive) {
actions.getNowGraphData().then((d) => {
if (d) {
setData(d)
setSelectedHash(d[0].hash)
}
})
}
}, [actions, graphAlive, setData, setSelectedHash])
return (
<Row
align="middle"
style={{
padding: 2,
marginBottom: 6,
borderBottom: '1px solid #ddd',
background: 'rgba(0, 0, 0, 0.05)',
position: 'fixed',
width: '100%',
top: 0,
left: 0,
zIndex: 999,
}}
gutter={[12, 12]}
>
<Col>
<Select
bordered={false}
size="small"
defaultValue={0}
options={data.map((e, i) => ({
label: `Graph ${i}`,
value: e.hash,
info: e,
}))}
value={selectedHash}
onChange={(val) => {
setSelectedHash(val)
}}
placeholder="Choose a graph to inspect"
style={{ width: '100%' }}
/>
</Col>
{graphAlive ? (
<Col>
<Tag color="green">ALIVE</Tag>
</Col>
) : (
<Col>
<Tag color="red">DEAD</Tag>
<span>Trying to reconnect</span>
</Col>
)}
{selectedData && <Col>{selectedData?.count} Shapes</Col>}
{selectedData?.memory > 0 && (
<Col>HeapMemory:{convertMemoryUnit(selectedData.memory)}</Col>
)}
{selectedData?.fps > 0 && <Col>FPS: {selectedData?.fps}</Col>}
<Col flex={1} />
<Col>
<Button
size="small"
type="text"
onClick={() => {
actions.consoleEl(selectedData.hash)
}}
>
<Tooltip arrowPointAtCenter title="Console X6 Graph">
<CodeOutlined />
</Tooltip>
</Button>
</Col>
</Row>
)
}
const Devtool = (props) => {
const { data: initData = [], actions = {} } = props
const [selectedData, setSelectedData] = useState(initData[0])
const [selectedHash, setSelectedHash] = useState(initData[0].hash)
const [data, setData] = useState(initData)
useEffect(() => {
return () => {
actions.cleanAllRect()
actions.startFPSMonitor()
}
}, [actions, selectedHash])
useEffect(() => {
const target = data.find((e) => e.hash === selectedHash)
countTree(target)
setSelectedData(target)
}, [selectedHash, data])
return (
<div>
<HeadBar
data={data}
setSelectedHash={setSelectedHash}
selectedData={selectedData}
selectedHash={selectedHash}
actions={actions}
setData={setData}
/>
<div
style={{
marginTop: 48,
position: 'relative',
zIndex: 1,
}}
>
{selectedData ? (
<GTree actions={actions} data={selectedData} />
) : (
<Empty />
)}
</div>
</div>
)
}
export default Devtool

View File

@@ -0,0 +1,179 @@
import { Drawer, Empty, Space, Tree, Typography } from 'antd'
import React, { useState, useEffect } from 'react'
import ReactJson from 'react-json-view'
import {
BlockOutlined,
PartitionOutlined,
AppstoreOutlined,
NodeIndexOutlined,
ToolOutlined,
} from '@ant-design/icons'
const iconMap = {
group: <BlockOutlined />,
svg: <PartitionOutlined />,
shape: <AppstoreOutlined />,
node: <AppstoreOutlined />,
edge: <NodeIndexOutlined />,
plugin: <ToolOutlined />,
}
const AttrsDrawer = ({ hash, getAttrs, onCancel, updateAttrs }) => {
const [val, setVal] = useState(hash)
const change = (all) => {
const { updated_src, namespace, name, existing_value, new_value } = all
const key = namespace[0] || name
const value = updated_src[key]
// 这个函数递归对新的value进行预处理。
// input框接收的new_value是字符串需要按照旧值做转换
const setNewValue = (value, paths, existing_value, new_value) => {
const key = paths.shift()
if (paths.length > 0) {
setNewValue(value[key], paths, existing_value, new_value)
} else {
if (new_value === undefined) {
// 删除
delete value[key]
} else if (typeof existing_value === 'undefined') {
// 新增
value[key] = new_value
} else if (typeof existing_value === 'boolean') {
value[key] = Boolean(new_value)
} else if (typeof existing_value === 'number') {
const val = Number(new_value)
if (!isNaN(val)) {
value[key] = val
}
} else if (typeof existing_value === 'string') {
value[key] = '' + new_value
}
}
}
setNewValue(
value,
namespace.slice(1).concat(name),
existing_value,
new_value,
)
updateAttrs(hash, key, value, all)
}
useEffect(() => {
if (hash && getAttrs) {
getAttrs(hash).then((res) => {
setVal(res)
})
} else {
onCancel()
getAttrs()
}
}, [getAttrs, hash, onCancel])
return (
<Drawer mask={false} onClose={onCancel} visible={hash}>
<ReactJson
style={{ fontSize: 12 }}
onAdd={change}
onEdit={change}
onDelete={change}
src={val}
/>
</Drawer>
)
}
const buildTreeData = (data = {}, isRoot) => {
const node = {
title: data.name || data.shape || data.type,
type: data.type,
key: data.hash,
name: data.name,
id: data.id,
hash: data.hash,
count: data.count,
num: data.children?.length || 0,
}
if (data.children) {
node.children = data.children.map((e) => buildTreeData(e))
}
if (isRoot) {
node.type = 'svg'
node.title = 'svg'
// node.key = node.hash || 'svg'
return node
}
return node
}
const GTree = (props) => {
const { data, actions = {} } = props
const [selectedKey, setSelected] = useState()
useEffect(() => {
actions.showRect(selectedKey, '__x6_select__', 'rgba(29, 57, 196, 0.5)')
return () => {
actions.cleanRect('__x6_select__')
}
}, [actions, selectedKey])
if (!data) {
return <Empty />
}
const treeData = buildTreeData(data, true)
return (
<div>
<Tree
selectedKeys={[selectedKey]}
onSelect={(keys) => setSelected(keys[0])}
showLine={{ showLeafIcon: false }}
height={document.body.clientHeight - 45}
titleRender={(node) => (
<div
onMouseEnter={() => {
actions.showRect(node.key, '__x6_hover__')
}}
onMouseLeave={() => {
actions.cleanRect('__x6_hover__')
}}
>
<Space>
{iconMap[node.type]}
{node.title}
{node.name && (
<Typography.Text type="secondary">
name:{node.name}
</Typography.Text>
)}
{node.id && (
<Typography.Text type="secondary">id:{node.id}</Typography.Text>
)}
{node.num > 0 && (
<Typography.Text type="secondary">
({node.num} children / {node.count || 0} descendants)
</Typography.Text>
)}
</Space>
</div>
)}
treeData={[treeData]}
/>
<AttrsDrawer
hash={selectedKey}
onCancel={() => setSelected()}
getAttrs={actions.getAttrs}
updateAttrs={actions.updateAttrs}
/>
</div>
)
}
export default GTree

View File

@@ -0,0 +1,8 @@
import React from 'react'
import ReactDOM from 'react-dom'
import Devtool from './components/Devtool'
import 'antd/dist/antd.css'
window.mount = (data = [], container, actions = {}) => {
ReactDOM.render(<Devtool data={data} actions={actions} />, container)
}

View File

@@ -0,0 +1,30 @@
const path = require('path')
module.exports = {
entry: './ui/index.js',
output: {
path: path.resolve(__dirname, 'devtools', 'ui'),
filename: 'ui.js',
},
optimization: {
usedExports: true,
},
module: {
rules: [
{
test: /\.css$/i,
use: ['style-loader', 'css-loader'],
},
{
test: /\.jsx?$/,
exclude: /(node_modules|bower_components)/,
use: {
loader: 'babel-loader',
options: {
presets: ['@babel/preset-env', '@babel/preset-react'],
},
},
},
],
},
}

View File

@@ -1 +1,12 @@
## @antv/x6-geometry [2.0.4](https://github.com/antvis/x6/compare/@antv/x6-geometry@2.0.3...@antv/x6-geometry@2.0.4) (2022-11-29)
## @antv/x6-geometry [2.0.3](https://github.com/antvis/x6/compare/@antv/x6-geometry@2.0.2...@antv/x6-geometry@2.0.3) (2022-11-25)
### Bug Fixes
* npm version ([cb0cfde](https://github.com/antvis/x6/commit/cb0cfdeb4dbe8858569e6899db08ccb9ab8ba4e7))
## @antv/x6-geometry [2.0.2](https://github.com/antvis/x6/compare/@antv/x6-geometry@2.0.1...@antv/x6-geometry@2.0.2) (2022-11-25)
## @antv/x6-geometry [2.0.1](https://github.com/antvis/x6/compare/@antv/x6-geometry@2.0.0...@antv/x6-geometry@2.0.1) (2022-11-24)

View File

@@ -1,6 +1,6 @@
MIT License
Copyright (c) 2021-2022 Alipay.inc
Copyright (c) 2021-2023 Alipay.inc
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal

View File

@@ -5,7 +5,7 @@
<a href="/LICENSE"><img src="https://img.shields.io/github/license/antvis/x6?style=flat-square" alt="MIT License"></a>
<a href="https://www.typescriptlang.org"><img alt="Language" src="https://img.shields.io/badge/language-TypeScript-blue.svg?style=flat-square"></a>
<a href="https://github.com/antvis/x6/pulls"><img alt="PRs Welcome" src="https://img.shields.io/badge/PRs-Welcome-brightgreen.svg?style=flat-square"></a>
<a href="https://x6.antv.vision"><img alt="website" src="https://img.shields.io/static/v1?label=&labelColor=505050&message=website&color=0076D6&style=flat-square&logo=google-chrome&logoColor=0076D6"></a>
<a href="https://x6.antv.antgroup.com"><img alt="website" src="https://img.shields.io/static/v1?label=&labelColor=505050&message=website&color=0076D6&style=flat-square&logo=google-chrome&logoColor=0076D6"></a>
<a href="https://github.com/antvis/X6/actions/workflows/ci.yml"><img alt="build" src="https://img.shields.io/github/workflow/status/antvis/x6/%F0%9F%91%B7%E3%80%80CI/master?logo=github&style=flat-square"></a>
<a href="https://app.codecov.io/gh/antvis/x6"><img alt="coverage" src="https://img.shields.io/codecov/c/gh/antvis/x6?logo=codecov&flag=x6-geometry&style=flat-square&token=15CO54WYUV"></a>
<a href="https://lgtm.com/projects/g/antvis/x6/context:javascript"><img alt="Language grade: JavaScript" src="https://img.shields.io/lgtm/grade/javascript/g/antvis/x6.svg?logo=lgtm&style=flat-square"></a>

View File

@@ -1,5 +1,5 @@
{
"version": "2.0.1",
"version": "2.0.4",
"name": "@antv/x6-geometry",
"description": "Geometry operations for X6",
"main": "lib/index.js",
@@ -10,7 +10,8 @@
"files": [
"dist",
"es",
"lib"
"lib",
"src"
],
"keywords": [
"geometry",
@@ -41,13 +42,13 @@
"email": "bubkoo.wy@gmail.com"
},
"license": "MIT",
"homepage": "https://github.com/antvis/x6",
"homepage": "https://x6.antv.antgroup.com",
"bugs": {
"url": "https://github.com/antvis/x6/issues"
},
"repository": {
"type": "git",
"url": "ssh://git@github.com/antvis/x6.git",
"url": "https://github.com/antvis/x6.git",
"directory": "packages/x6-geometry"
},
"publishConfig": {

View File

@@ -1,6 +1,8 @@
/* eslint-disable default-param-last */
import { Point } from '../point'
const regexSupportedData = new RegExp(`^[\\s\\dLMCZz,.]*$`)
const regexSupportedData = new RegExp(`^[\\s\\dLMCZz,.]*$`) // eslint-disable-line prefer-regex-literals
export function isValid(data: any) {
if (typeof data !== 'string') {

View File

@@ -1,3 +1,5 @@
/* eslint-disable no-constructor-return */
import { Line } from './line'
import { Point } from './point'
import { Rectangle } from './rectangle'

View File

@@ -1,3 +1,19 @@
## @antv/x6-plugin-clipboard [2.1.3](https://github.com/antvis/x6/compare/@antv/x6-plugin-clipboard@2.1.2...@antv/x6-plugin-clipboard@2.1.3) (2022-11-25)
### Bug Fixes
* broken file ([d6df2d5](https://github.com/antvis/x6/commit/d6df2d59811dc18791208af36b452e11e6391f3b))
## @antv/x6-plugin-clipboard [2.1.2](https://github.com/antvis/x6/compare/@antv/x6-plugin-clipboard@2.1.1...@antv/x6-plugin-clipboard@2.1.2) (2022-11-25)
### Bug Fixes
* npm version ([cb0cfde](https://github.com/antvis/x6/commit/cb0cfdeb4dbe8858569e6899db08ccb9ab8ba4e7))
## @antv/x6-plugin-clipboard [2.1.1](https://github.com/antvis/x6/compare/@antv/x6-plugin-clipboard@2.1.0...@antv/x6-plugin-clipboard@2.1.1) (2022-11-25)
# @antv/x6-plugin-clipboard [2.1.0](https://github.com/antvis/x6/compare/@antv/x6-plugin-clipboard@2.0.0...@antv/x6-plugin-clipboard@2.1.0) (2022-11-24)

View File

@@ -1,6 +1,6 @@
MIT License
Copyright (c) 2021-2022 Alipay.inc
Copyright (c) 2021-2023 Alipay.inc
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal

View File

@@ -1,6 +1,6 @@
{
"name": "@antv/x6-plugin-clipboard",
"version": "2.1.0",
"version": "2.1.3",
"description": "clipboard plugin for X6",
"main": "lib/index.js",
"module": "es/index.js",
@@ -10,7 +10,8 @@
"files": [
"dist",
"es",
"lib"
"lib",
"src"
],
"keywords": [
"plugin",
@@ -47,13 +48,13 @@
"email": "bubkoo.wy@gmail.com"
},
"license": "MIT",
"homepage": "https://github.com/antvis/x6",
"homepage": "https://x6.antv.antgroup.com/tutorial/plugins/clipboard",
"bugs": {
"url": "https://github.com/antvis/x6/issues"
},
"repository": {
"type": "git",
"url": "ssh://git@github.com/antvis/x6.git",
"url": "https://github.com/antvis/x6.git",
"directory": "packages/x6-plugin-clipboard"
},
"publishConfig": {

View File

@@ -7,7 +7,7 @@ declare module '@antv/x6/lib/graph/graph' {
enableClipboard: () => Graph
disableClipboard: () => Graph
toggleClipboard: (enabled?: boolean) => Graph
isClipboardEmpty: () => boolean
isClipboardEmpty: (options?: Clipboard.Options) => boolean
getCellsInClipboard: () => Cell[]
cleanClipboard: () => Graph
copy: (cells: Cell[], options?: Clipboard.CopyOptions) => Graph
@@ -55,10 +55,10 @@ Graph.prototype.toggleClipboard = function (enabled?: boolean) {
return this
}
Graph.prototype.isClipboardEmpty = function () {
Graph.prototype.isClipboardEmpty = function (options?: Clipboard.Options) {
const clipboard = this.getPlugin('clipboard') as Clipboard
if (clipboard) {
return clipboard.isEmpty()
return clipboard.isEmpty(options)
}
return true
}

View File

@@ -89,7 +89,12 @@ export class ClipboardImpl {
}
}
isEmpty() {
isEmpty(options: ClipboardImpl.Options = {}) {
if (options.useLocalStorage) {
// With useLocalStorage turned on, no real cells can be obtained without deserialize first
// https://github.com/antvis/X6/issues/2573
this.deserialize(options)
}
return this.cells.length <= 0
}

Some files were not shown because too many files have changed in this diff Show More