@riil-frontend/component-topology 9.0.0-a.10 → 9.0.0-a.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/build/1.js +2 -2
  2. package/build/2.js +1 -1
  3. package/build/index.css +1 -1
  4. package/build/index.js +17 -17
  5. package/es/components/VerticalIconTab/VerticalIconTab.module.scss +11 -5
  6. package/es/core/editor/components/BackgroundView/index.module.scss +3 -0
  7. package/es/core/editor/components/Sidebar/Sidebar.module.scss +7 -7
  8. package/es/core/editor/components/Sidebar/views/CanvasPanel/CanvasPanel.module.scss +1 -0
  9. package/es/core/editor/components/Sidebar/views/ComponentPanel.js +1 -1
  10. package/es/core/editor/components/Sidebar/views/ImagePanel/ImagePanel.js +2 -1
  11. package/es/core/editor/components/Sidebar/views/LinkPanel.js +1 -1
  12. package/es/core/editor/components/settings/core/updateElementProperty.js +6 -1
  13. package/es/core/editor/components/settings/propertyViews/node/data/BindIpInput.js +61 -0
  14. package/es/core/editor/components/settings/propertyViews/node/data/Data.js +27 -8
  15. package/es/core/hooks/useTopoEdit.js +133 -16
  16. package/es/core/models/TopoApp.js +1 -1
  17. package/es/core/models/utils/linkUtils.js +18 -0
  18. package/es/core/store/models/topoConfig.js +36 -7
  19. package/es/core/test/Test.js +52 -0
  20. package/es/core/viewer/components/plugins/ResourceDetail/components/ResourceOverview/ResourceOverview.js +7 -78
  21. package/es/core/viewer/components/plugins/ResourceDetail/components/ResourceOverview/components/LinkTopo/hooks/useMetricPolling.js +27 -37
  22. package/es/core/viewer/components/plugins/ResourceDetail/components/ResourceOverview/components/LinkTopo/services/index.js +57 -1
  23. package/es/networkTopo/services/link.js +1 -1
  24. package/es/networkTopo/services/topo/basic.js +4 -3
  25. package/es/networkTopo/services/topo/networkLink.js +45 -3
  26. package/es/networkTopo/utils/exitLinkUtil.js +110 -0
  27. package/es/utils/htElementUtils.js +43 -21
  28. package/lib/components/VerticalIconTab/VerticalIconTab.module.scss +11 -5
  29. package/lib/core/editor/components/BackgroundView/index.module.scss +3 -0
  30. package/lib/core/editor/components/Sidebar/Sidebar.module.scss +7 -7
  31. package/lib/core/editor/components/Sidebar/views/CanvasPanel/CanvasPanel.module.scss +1 -0
  32. package/lib/core/editor/components/Sidebar/views/ComponentPanel.js +1 -1
  33. package/lib/core/editor/components/Sidebar/views/ImagePanel/ImagePanel.js +2 -1
  34. package/lib/core/editor/components/Sidebar/views/LinkPanel.js +1 -1
  35. package/lib/core/editor/components/settings/core/updateElementProperty.js +6 -1
  36. package/lib/core/editor/components/settings/propertyViews/node/data/BindIpInput.js +74 -0
  37. package/lib/core/editor/components/settings/propertyViews/node/data/Data.js +28 -8
  38. package/lib/core/hooks/useTopoEdit.js +133 -15
  39. package/lib/core/models/TopoApp.js +1 -1
  40. package/lib/core/models/utils/linkUtils.js +21 -1
  41. package/lib/core/store/models/topoConfig.js +37 -7
  42. package/lib/core/test/Test.js +52 -0
  43. package/lib/core/viewer/components/plugins/ResourceDetail/components/ResourceOverview/ResourceOverview.js +6 -78
  44. package/lib/core/viewer/components/plugins/ResourceDetail/components/ResourceOverview/components/LinkTopo/hooks/useMetricPolling.js +27 -36
  45. package/lib/core/viewer/components/plugins/ResourceDetail/components/ResourceOverview/components/LinkTopo/services/index.js +58 -1
  46. package/lib/networkTopo/services/topo/basic.js +5 -3
  47. package/lib/networkTopo/services/topo/networkLink.js +45 -3
  48. package/lib/networkTopo/utils/exitLinkUtil.js +115 -0
  49. package/lib/utils/htElementUtils.js +45 -21
  50. package/package.json +2 -2
@@ -15,7 +15,7 @@ function getElementData(element) {
15
15
  styleMap: element.getStyleMap()
16
16
  };
17
17
 
18
- if (className === 'ht.Edge') {
18
+ if (className === "ht.Edge") {
19
19
  return _extends({}, commonData);
20
20
  }
21
21
 
@@ -27,7 +27,7 @@ function getElementData(element) {
27
27
  export function isNode(element) {
28
28
  // HT为了支持区域内无节点可展开增加了站位节点,因此 节点的layer等于container_blank的过滤掉就可以了
29
29
  // eslint-disable-next-line no-underscore-dangle
30
- return element instanceof ht.Node && !isLayer(element) && element._layer !== 'container_blank';
30
+ return element instanceof ht.Node && !isLayer(element) && element._layer !== "container_blank";
31
31
  }
32
32
  export function isEdge(element) {
33
33
  return element instanceof ht.Edge;
@@ -38,7 +38,7 @@ export function isValidEdge(element) {
38
38
  }
39
39
 
40
40
  if (!element.getSource() || !element.getTarget()) {
41
- rlog.error('isValidEdge 连线异常:源或目的为空', element);
41
+ rlog.error("isValidEdge 连线异常:源或目的为空", element);
42
42
  return false;
43
43
  }
44
44
 
@@ -51,7 +51,29 @@ export function isLayer(element) {
51
51
  return element instanceof ht.Grid;
52
52
  }
53
53
  export function isText(element) {
54
- return element instanceof ht.Text && element.a('isText');
54
+ return element instanceof ht.Text && element.a("isText");
55
+ }
56
+ export function isUniqueIp(dataModel, ip) {
57
+ console.log("isUniqueIp", ip);
58
+ var nodes = getNodes(dataModel);
59
+ var isUnique = true;
60
+
61
+ for (var i = 0; i < nodes.length; i++) {
62
+ var element = nodes[i];
63
+ var tagTxt = element.getTag();
64
+ console.log("isUniqueIp-element", tagTxt, ip);
65
+
66
+ if (tagTxt !== null && tagTxt !== void 0 && tagTxt.startsWith("ip_")) {
67
+ var ipTxt = tagTxt.replace("ip_", '');
68
+
69
+ if (ipTxt === ip) {
70
+ isUnique = false;
71
+ break;
72
+ }
73
+ }
74
+ }
75
+
76
+ return isUnique;
55
77
  }
56
78
  export function getElements(dataModel) {
57
79
  // console.error(111, dataModel.getDatas().getArray())
@@ -72,7 +94,7 @@ export function getGroupDatas(dataModel) {
72
94
  }
73
95
  export function getGroupElementByTag(dataModel, tag) {
74
96
  return dataModel.getDataByTag(tag) || dataModel.getDatas().toArray().filter(function (item) {
75
- return item.a('tag') === tag;
97
+ return item.a("tag") === tag;
76
98
  })[0];
77
99
  }
78
100
  export function getGroupData(element) {
@@ -83,14 +105,14 @@ export function getGroupData(element) {
83
105
  var parent = element.getParent();
84
106
  var groupInfo = parent ? {
85
107
  groupId: parent.getTag(),
86
- groupTag: parent.a('tag') // 父容器
108
+ groupTag: parent.a("tag") // 父容器
87
109
 
88
110
  } : {};
89
111
  return _extends({
90
112
  name: element.getStyleMap().label
91
113
  }, element.getAttrObject(), {
92
114
  id: element.getTag(),
93
- tag: element.a('tag'),
115
+ tag: element.a("tag"),
94
116
  image: element.getImage()
95
117
  }, groupInfo);
96
118
  }
@@ -104,7 +126,7 @@ export function getNodeData(element) {
104
126
  var parent = element.getParent();
105
127
  var groupInfo = parent ? {
106
128
  groupId: parent.getTag(),
107
- groupTag: parent.a('tag') // 父容器
129
+ groupTag: parent.a("tag") // 父容器
108
130
 
109
131
  } : {};
110
132
  return _extends({}, element.getAttrObject(), {
@@ -116,12 +138,12 @@ export function getEdges(dataModel) {
116
138
  return getElements(dataModel).filter(isValidEdge);
117
139
  }
118
140
  export function isEdgeGroupExpanded(edge) {
119
- return isEdge(edge) && edge.getEdgeGroup() && !!edge.s('edge.expanded');
141
+ return isEdge(edge) && edge.getEdgeGroup() && !!edge.s("edge.expanded");
120
142
  }
121
143
  /**
122
144
  * 是否连线组代理
123
- * @param {*} edge
124
- * @returns
145
+ * @param {*} edge
146
+ * @returns
125
147
  */
126
148
 
127
149
  export function isEdgeGroupAgent(edge) {
@@ -129,9 +151,9 @@ export function isEdgeGroupAgent(edge) {
129
151
  }
130
152
  /**
131
153
  * 获得两个节点间的连线列表
132
- * @param {*} node1
133
- * @param {*} node2
134
- * @returns
154
+ * @param {*} node1
155
+ * @param {*} node2
156
+ * @returns
135
157
  */
136
158
 
137
159
  export function getEdgesBetweenNodes(node1, node2) {
@@ -153,7 +175,7 @@ export function getEdgesBetweenNodes(node1, node2) {
153
175
  }
154
176
  /**
155
177
  * 获得节点间的连线组,连线<=1时返回null
156
- * @returns
178
+ * @returns
157
179
  */
158
180
 
159
181
  export function getEdgeGroupByNodes(node1, node2) {
@@ -172,7 +194,7 @@ export function getEdgeGroupByNodes(node1, node2) {
172
194
  }
173
195
  /**
174
196
  * 获得节点间的连线组,连线<=1时返回null
175
- * @returns
197
+ * @returns
176
198
  */
177
199
 
178
200
  export function getEdgeGroupByNodeTags(dataModel, nodeTag1, nodeTag2) {
@@ -180,7 +202,7 @@ export function getEdgeGroupByNodeTags(dataModel, nodeTag1, nodeTag2) {
180
202
  var node2 = dataModel.getDataByTag(nodeTag2);
181
203
 
182
204
  if (!node1 || !node2) {
183
- console.warn('getEdgeGroupByNodes 未找到节点', {
205
+ console.warn("getEdgeGroupByNodes 未找到节点", {
184
206
  node1: node1,
185
207
  node2: node2,
186
208
  nodeTag1: nodeTag1,
@@ -261,7 +283,7 @@ export function getGroupChildren(group) {
261
283
 
262
284
 
263
285
  return group.getChildren().getArray().filter(function (node) {
264
- return node._layer !== 'container_blank';
286
+ return node._layer !== "container_blank";
265
287
  });
266
288
  }
267
289
  /**
@@ -291,7 +313,7 @@ export function getGroupChildrenData(group) {
291
313
  export function setElementRuntimeStyle(element, name, value) {
292
314
  var _extends2;
293
315
 
294
- var prevRuntimeStyle = element.a('runtimeStyles') || {};
316
+ var prevRuntimeStyle = element.a("runtimeStyles") || {};
295
317
 
296
318
  var runtimeStyle = _extends({}, prevRuntimeStyle, (_extends2 = {}, _extends2[name] = value, _extends2)); // if (prevRuntimeStyle[name] === undefined && value === undefined) {
297
319
  // return
@@ -302,7 +324,7 @@ export function setElementRuntimeStyle(element, name, value) {
302
324
  runtimeStyle[name] = undefined; // delete runtimeStyle[name]
303
325
  }
304
326
 
305
- element.a('runtimeStyles', runtimeStyle);
327
+ element.a("runtimeStyles", runtimeStyle);
306
328
  }
307
329
  /**
308
330
  * 判断拓扑图是否存在元素
@@ -315,7 +337,7 @@ export function isExistedElement(htTopo, dataModel, data) {
315
337
 
316
338
 
317
339
  var element = getElements(dataModel).find(function (item) {
318
- return data.tag && item.a('tag') === data.tag;
340
+ return data.tag && item.a("tag") === data.tag;
319
341
  });
320
342
 
321
343
  if (element) {
@@ -3,8 +3,8 @@
3
3
 
4
4
  .tabs {
5
5
  height: 100%;
6
-
7
- }
6
+ display: flex;
7
+ }
8
8
 
9
9
  // 导航
10
10
  .nav {
@@ -49,17 +49,23 @@
49
49
 
50
50
  // 标签页内容区
51
51
  .content {
52
- width: 260px;
52
+ // width: 260px;
53
53
  height: 100%;
54
54
  border-left: none !important;
55
- border-right: 1px solid var(--tab-wrapped-border-line-color);
56
55
  transition: width .1s linear;
56
+ overflow: initial !important;
57
57
 
58
58
  :global {
59
59
  .#{$css-prefix}tabs-tabpane {
60
- width: 100%;
60
+ position: absolute;
61
+ left: 0;
62
+ top: 0;
63
+ z-index: 1;
64
+ // width: 250px;
61
65
  height: 100%;
62
66
  overflow: auto;
67
+ background: #FFF;
68
+ border-right: 1px solid var(--tab-wrapped-border-line-color);
63
69
  }
64
70
  }
65
71
 
@@ -1,8 +1,11 @@
1
1
  @import "~@alifd/next/variables.scss";
2
2
 
3
3
  .background-view {
4
+ width: 260px;
4
5
  padding: 16px;
5
6
  background: #fff;
7
+ height: 100%;
8
+ overflow: auto;
6
9
  .option {
7
10
  text-align: right;
8
11
  button {
@@ -1,19 +1,19 @@
1
1
  .sidebar {
2
2
  // border-right: 1px solid #E6E7EB;
3
3
  position: relative;
4
- width: 60px;
4
+ // width: 60px;
5
5
 
6
6
  .tabsContainer {
7
- position: absolute;
8
- width: 60px;
7
+ // position: absolute;
8
+ // left: 0;
9
+ // top: 0;
10
+ // z-index: 1;
11
+ // width: 60px;
9
12
  height: 100%;
10
- left: 0;
11
- top: 0;
12
- z-index: 1;
13
13
  background: #FFF;
14
14
 
15
15
  &.expanded {
16
- width: 320px;
16
+ // width: 320px;
17
17
  }
18
18
  }
19
19
  }
@@ -1,6 +1,7 @@
1
1
  @import "~@alifd/next/variables.scss";
2
2
 
3
3
  .canvasToggle {
4
+ width: 260px;
4
5
  display: flex;
5
6
  flex-wrap: wrap;
6
7
  .canvas {
@@ -46,7 +46,7 @@ function ComponentPanel(props) {
46
46
  return /*#__PURE__*/_react["default"].createElement("div", {
47
47
  ref: divRef,
48
48
  style: {
49
- width: '100%',
49
+ width: '260px',
50
50
  height: '100%'
51
51
  }
52
52
  });
@@ -46,7 +46,8 @@ function ImagePanel(props) {
46
46
  accordion: true,
47
47
  defaultExpandedKeys: ['资源图片'],
48
48
  style: {
49
- border: 'none'
49
+ border: 'none',
50
+ minWidth: '300px'
50
51
  },
51
52
  fullheight: true,
52
53
  noContentPadding: true
@@ -46,7 +46,7 @@ function LinkPanel(props) {
46
46
  return /*#__PURE__*/_react["default"].createElement("div", {
47
47
  ref: divRef,
48
48
  style: {
49
- width: '100%',
49
+ width: '260px',
50
50
  height: '100%'
51
51
  }
52
52
  });
@@ -5,7 +5,12 @@ exports["default"] = updateElementProperty;
5
5
 
6
6
  function updateElementProperty(topo, name, value) {
7
7
  // const element = topo.getDataModel().getDataById(selection[0].id);
8
- var element = topo.getSelectionModel().getFirstData(); // console.info("updateElementProperty",topo.getSelectionModel().getSelection(), { selection, element, name, value });
8
+ var element = topo.getSelectionModel().getFirstData();
9
+ console.info("updateElementProperty", topo.getSelectionModel().getSelection(), {
10
+ element: element,
11
+ name: name,
12
+ value: value
13
+ });
9
14
 
10
15
  if (name.startsWith('attrObject.')) {
11
16
  element.setAttr(name.replace('attrObject.', ''), value);
@@ -0,0 +1,74 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ exports.__esModule = true;
6
+ exports["default"] = BindIpInput;
7
+
8
+ var _button = _interopRequireDefault(require("@alifd/next/lib/button"));
9
+
10
+ var _input = _interopRequireDefault(require("@alifd/next/lib/input"));
11
+
12
+ var _react = _interopRequireWildcard(require("react"));
13
+
14
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
15
+
16
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
17
+
18
+ /**
19
+ * @return {React.ReactNode | null}
20
+ */
21
+ function BindIpInput(props) {
22
+ var _node$attrObjectIpv;
23
+
24
+ var nodeElement = props.nodeElement,
25
+ topo = props.topo,
26
+ topoEditApi = props.topoEditApi,
27
+ node = props.node,
28
+ onChange = props.onChange,
29
+ value = props.value; // const currentResId = node.tag;
30
+
31
+ console.log("nodeElement, topo, topoEditApi, node", nodeElement, topo, topoEditApi, node, value);
32
+
33
+ var _useState = (0, _react.useState)(''),
34
+ error = _useState[0],
35
+ setError = _useState[1];
36
+
37
+ var _useState2 = (0, _react.useState)((_node$attrObjectIpv = node["attrObject.ipv4"]) !== null && _node$attrObjectIpv !== void 0 ? _node$attrObjectIpv : ""),
38
+ txtValue = _useState2[0],
39
+ setTxtValue = _useState2[1];
40
+
41
+ var saveIp = function saveIp(v) {
42
+ console.log("saveIp", txtValue);
43
+ var rex = /^((25[0-5]|2[0-4]\d|((1\d{2})|([1-9]?\d)))\.){3}(25[0-5]|2[0-4]\d|((1\d{2})|([1-9]?\d)))$/;
44
+ var reg = txtValue.match(rex);
45
+
46
+ if (reg === null) {
47
+ setError('error');
48
+ } else {
49
+ setError('');
50
+ onChange(txtValue);
51
+ topoEditApi.relateNodeIp(txtValue, nodeElement);
52
+ }
53
+ };
54
+
55
+ return /*#__PURE__*/_react["default"].createElement("div", {
56
+ style: {
57
+ display: "flex"
58
+ }
59
+ }, /*#__PURE__*/_react["default"].createElement(_input["default"], {
60
+ placeholder: "\u8BF7\u8F93\u5165Ip\u5730\u5740",
61
+ name: "attrObject.ipv4",
62
+ state: error,
63
+ value: txtValue,
64
+ maxLength: 128,
65
+ onChange: setTxtValue
66
+ }), /*#__PURE__*/_react["default"].createElement(_button["default"], {
67
+ type: "primary",
68
+ text: true,
69
+ onClick: saveIp,
70
+ style: {
71
+ marginLeft: 10
72
+ }
73
+ }, "\u4FDD\u5B58"));
74
+ }
@@ -27,6 +27,8 @@ var _NodeRelateResourceButton = _interopRequireDefault(require("./NodeRelateReso
27
27
 
28
28
  var _PlatformDisplay = _interopRequireDefault(require("./PlatformDisplay"));
29
29
 
30
+ var _BindIpInput = _interopRequireDefault(require("./BindIpInput"));
31
+
30
32
  function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
31
33
 
32
34
  function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
@@ -37,13 +39,14 @@ var CollapsePanel = _collapse["default"].Panel;
37
39
  function parseValues(values) {
38
40
  return (0, _extends2["default"])({}, values, {
39
41
  "attrObject.customName": values["attrObject.customName"] || values["attrObject.name"],
40
- "attrObject.bindTopo": values["attrObject.bindTopo"] || "" // 解决切换节点时关联拓扑选项未重置
41
-
42
+ "attrObject.bindTopo": values["attrObject.bindTopo"] || "",
43
+ // 解决切换节点时关联拓扑选项未重置
44
+ "attrObject.ipv4": values["attrObject.ipv4"] || ""
42
45
  });
43
46
  }
44
47
 
45
48
  function getBindType(values) {
46
- if (values.tag) {
49
+ if (values.tag && !values.tag.startsWith('Ip_')) {
47
50
  return "resource";
48
51
  }
49
52
 
@@ -62,6 +65,7 @@ function Data(props) {
62
65
  _onChange = props.onChange,
63
66
  editorProps = props.editorProps;
64
67
  var bindType = getBindType(values);
68
+ console.log("node, values", node, values);
65
69
 
66
70
  var field = _field["default"].useField({
67
71
  autoUnmount: false,
@@ -129,7 +133,7 @@ function Data(props) {
129
133
  }, /*#__PURE__*/_react["default"].createElement(_form["default"], {
130
134
  field: field,
131
135
  labelAlign: "top"
132
- }, !values.tag && /*#__PURE__*/_react["default"].createElement(_form["default"].Item, {
136
+ }, (!values.tag || bindType === "ip") && /*#__PURE__*/_react["default"].createElement(_form["default"].Item, {
133
137
  label: "\u5173\u8054\u7C7B\u578B"
134
138
  }, /*#__PURE__*/_react["default"].createElement(_select["default"], {
135
139
  name: "bindType",
@@ -143,7 +147,9 @@ function Data(props) {
143
147
  value: "none"
144
148
  }, "\u672A\u5173\u8054"), /*#__PURE__*/_react["default"].createElement(Option, {
145
149
  value: "resource"
146
- }, "\u5173\u8054\u8D44\u6E90"), RelateTopoTree && /*#__PURE__*/_react["default"].createElement(Option, {
150
+ }, "\u5173\u8054\u8D44\u6E90"), /*#__PURE__*/_react["default"].createElement(Option, {
151
+ value: "ip"
152
+ }, "\u5173\u8054IP"), RelateTopoTree && /*#__PURE__*/_react["default"].createElement(Option, {
147
153
  value: "topo"
148
154
  }, "\u5173\u8054\u62D3\u6251"))), bindType === "resource" && /*#__PURE__*/_react["default"].createElement(_form["default"].Item, {
149
155
  label: "\u5173\u8054\u8D44\u6E90"
@@ -157,7 +163,7 @@ function Data(props) {
157
163
  flex: 1,
158
164
  paddingRight: 16,
159
165
  color: "#4D6277",
160
- lineHeight: '20px'
166
+ lineHeight: "20px"
161
167
  },
162
168
  title: values.tag ? values.name : null
163
169
  }, values.tag ? values.name : "—"), /*#__PURE__*/_react["default"].createElement(_NodeRelateResourceButton["default"], {
@@ -166,13 +172,27 @@ function Data(props) {
166
172
  topo: topo,
167
173
  topoEditApi: topoEditApi,
168
174
  nodeBindResourceDrawerComponent: editorProps.nodeBindResourceDrawerComponent
169
- }))), bindType === "topo" && RelateTopoTree && /*#__PURE__*/_react["default"].createElement(_form["default"].Item, {
175
+ }))), bindType === "ip" && /*#__PURE__*/_react["default"].createElement(_form["default"].Item, {
176
+ label: "\u5173\u8054IP" // style={{ display: "flex" }}
177
+ ,
178
+ pattern: /^((25[0-5]|2[0-4]\d|((1\d{2})|([1-9]?\d)))\.){3}(25[0-5]|2[0-4]\d|((1\d{2})|([1-9]?\d)))$/,
179
+ patternTrigger: "onBlur",
180
+ patternMessage: "IP\u5730\u5740\u683C\u5F0F\u4E0D\u6B63\u786E"
181
+ }, /*#__PURE__*/_react["default"].createElement(_BindIpInput["default"], {
182
+ nodeElement: node,
183
+ node: values,
184
+ topo: topo,
185
+ topoEditApi: topoEditApi,
186
+ placeholder: "\u8BF7\u8F93\u5165",
187
+ name: "attrObject.ipv4",
188
+ maxLength: 128
189
+ })), bindType === "topo" && RelateTopoTree && /*#__PURE__*/_react["default"].createElement(_form["default"].Item, {
170
190
  label: "\u5173\u8054\u62D3\u6251"
171
191
  }, /*#__PURE__*/_react["default"].createElement(RelateTopoTree, {
172
192
  name: "attrObject.bindTopo",
173
193
  topo: topo,
174
194
  onChange: handleBindTopoChange
175
- })), (editorProps === null || editorProps === void 0 ? void 0 : editorProps.topoType) === 'cmpTopo' && node.getTag() && /*#__PURE__*/_react["default"].createElement(_form["default"].Item, {
195
+ })), (editorProps === null || editorProps === void 0 ? void 0 : editorProps.topoType) === "cmpTopo" && node.getTag() && /*#__PURE__*/_react["default"].createElement(_form["default"].Item, {
176
196
  label: "\u6240\u5C5E\u5E73\u53F0"
177
197
  }, /*#__PURE__*/_react["default"].createElement(_PlatformDisplay["default"], props)))));
178
198
  }