@steedos/steedos-plugin-schema-builder 2.2.50-beta.7 → 2.2.51-beta.2

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 (55) hide show
  1. package/package.json +3 -49
  2. package/webapp/package.json +59 -0
  3. package/src/objects.action.js +0 -5
  4. package/src/objects.object.yml +0 -6
  5. package/webapp/src/custom.d.ts +0 -33
  6. package/webapp/src/g6/behavior/activate-relations/index.tsx +0 -160
  7. package/webapp/src/g6/behavior/darg/index.tsx +0 -146
  8. package/webapp/src/g6/behavior/index.tsx +0 -5
  9. package/webapp/src/g6/model/editor-background.png +0 -0
  10. package/webapp/src/g6/model/index.tsx +0 -574
  11. package/webapp/src/g6/model/model-node.tsx +0 -1080
  12. package/webapp/src/g6/model/model.scss +0 -163
  13. package/webapp/src/g6/model/toolbar.tsx +0 -360
  14. package/webapp/src/g6/shape/base-sharp/index.tsx +0 -19
  15. package/webapp/src/g6/shape/index.tsx +0 -0
  16. package/webapp/src/g6/util/graph.tsx +0 -60
  17. package/webapp/src/g6/util/hooks.tsx +0 -26
  18. package/webapp/src/g6/util/index.tsx +0 -20
  19. package/webapp/src/g6/util/intel.ts +0 -7
  20. package/webapp/src/hook/index.tsx +0 -47
  21. package/webapp/src/index.tsx +0 -25
  22. package/webapp/src/page/dva-model/index.tsx +0 -70
  23. package/webapp/src/page/dva-model/reducer/arrange.tsx +0 -16
  24. package/webapp/src/page/dva-model/reducer/index.tsx +0 -7
  25. package/webapp/src/page/dva-model/reducer/init.tsx +0 -61
  26. package/webapp/src/page/dva-model/reducer/model.tsx +0 -126
  27. package/webapp/src/page/dva-model/reducer/on-expand.tsx +0 -27
  28. package/webapp/src/page/dva-model/style.tsx +0 -88
  29. package/webapp/src/page/hooks/callback.tsx +0 -54
  30. package/webapp/src/page/hooks/fullscreen.tsx +0 -34
  31. package/webapp/src/page/hooks/pagehooks.tsx +0 -127
  32. package/webapp/src/page/hooks/resize.tsx +0 -20
  33. package/webapp/src/page/index.tsx +0 -393
  34. package/webapp/src/page/model-navi/index.tsx +0 -329
  35. package/webapp/src/page/model-navi/style.scss +0 -111
  36. package/webapp/src/page/util/index.tsx +0 -234
  37. package/webapp/src/page/util/layout-nodes/index.tsx +0 -185
  38. package/webapp/src/pdm/index.tsx +0 -50
  39. package/webapp/src/pdm/pdm-json/index.js +0 -224
  40. package/webapp/src/pdm/pdm-json/removeDiacritics.js +0 -96
  41. package/webapp/src/pdm/util.ts +0 -60
  42. package/webapp/src/style.less +0 -14
  43. package/webapp/src/tree/index.tsx +0 -46
  44. package/webapp/src/tree/style.scss +0 -26
  45. package/webapp/src/type/field.tsx +0 -10
  46. package/webapp/src/type/index.tsx +0 -3
  47. package/webapp/src/type/model.tsx +0 -12
  48. package/webapp/src/type/module.tsx +0 -4
  49. package/webapp/test/g6-test/mock/model-test.ts +0 -3620
  50. package/webapp/test/g6-test/mock/module-test.ts +0 -14
  51. package/webapp/test/g6-test/mock/steedos-test.ts +0 -86
  52. package/webapp/test/index.tsx +0 -66
  53. package/webapp/test/testg6.tsx +0 -126
  54. package/webapp/test/unstated/index.tsx +0 -19
  55. package/webapp/tsconfig.json +0 -27
@@ -1,329 +0,0 @@
1
-
2
- import { Input, Tree, Select, Button, Divider } from 'antd'
3
- import { useDispatch, useSelector } from '../../hook'
4
- import _ from 'lodash'
5
- import React, { forwardRef, useCallback, useEffect, useMemo, useRef, useState } from 'react'
6
- import Scroll from 'react-custom-scrollbars'
7
-
8
- import { useLoadData } from '../hooks/callback'
9
- import './style.scss'
10
- import intl from './../../g6/util/intel'
11
- const { Option } = Select;
12
-
13
- const renderLabel = (isSpec, beforeStr, afterStr, searchValue) => {
14
-
15
- const greenStyle = isSpec ? { color: 'green'} : {}
16
- const searchStyle = {
17
- color: '#f50',
18
- }
19
- return (
20
- <span>
21
- <span style={greenStyle}>{beforeStr}</span>
22
- <span style={searchStyle}>{searchValue}</span>
23
- <span style={greenStyle}>{afterStr}</span>
24
- </span>)
25
- }
26
-
27
- const renderTitleGreen = (isSpec, title) => {
28
- const greenStyle = isSpec ? { color: 'green'} : {}
29
- return (
30
- <span style={greenStyle}>{title}</span>
31
- )
32
- }
33
-
34
- const renderModelTitle = (title, searchValue , showNameOrLabel, originalKey) => {
35
-
36
- if(showNameOrLabel) {
37
- return renderTitle(originalKey, searchValue)
38
- } else {
39
- return renderTitle(title, searchValue)
40
- }
41
-
42
- }
43
-
44
- const renderTitle = (title, searchValue = '', isSpec = false) => {
45
-
46
- if (!searchValue) return title
47
- const index = title.indexOf(searchValue)
48
- const beforeStr = title.substr(0, index)
49
- const afterStr = title.substr(index + searchValue.length)
50
- const titleFilter = index > -1 ? renderLabel(isSpec, beforeStr, afterStr, searchValue) : renderTitleGreen(isSpec, title)
51
- return titleFilter
52
- }
53
-
54
- export interface IProps {
55
- namespace: any
56
- moduleKey: any
57
- getModels: any
58
- getModules: any
59
- clickModelNode: any
60
- toolBarCommand: any
61
- }
62
-
63
- const createItem = (conditionFun , createItemFun) => {
64
- if (conditionFun && conditionFun()) {
65
- const item = createItemFun()
66
- return [item]
67
- } else {
68
- return[]
69
- }
70
- }
71
-
72
- export default forwardRef((props: any, ref) => {
73
- const {
74
- namespace,
75
- getModels,
76
- getModules,
77
- clickModelNode,
78
- toolBarCommand,
79
- primaryColor,
80
- Pdm,
81
- } = props
82
- const {
83
- store,
84
- consoleModelsRef,
85
- dispatch,
86
- } = useLocal({
87
- namespace,
88
- getModels,
89
- getModules,
90
- clickModelNode,
91
- primaryColor,
92
- })
93
-
94
- const searchDispatch = useCallback(_.debounce((value) => {
95
- dispatch({
96
- type: `${namespace}/search`,
97
- text: value,
98
- })
99
-
100
- }, 500), [dispatch])
101
-
102
- const fun = (value) => {
103
- // console.log(e)
104
- setSearchText(value)
105
- // searchDispatch(value)
106
-
107
- }
108
-
109
- const [searchText, setSearchText] = useState(store.search)
110
-
111
- const searchOnChange = useCallback(fun , [dispatch])
112
-
113
- const NaviTree = (props.Tree || Tree)
114
- const NaviInput = (props.Input || Input)
115
- const {
116
- TreeNode,
117
- OptionBuilder,
118
- } = NaviTree
119
-
120
- const [moduleValue, setModuleValue] = useState('')
121
- const changeModuleValue = useCallback((val)=>{setModuleValue(val)},[])
122
-
123
- const selectAfter = (
124
- <Select defaultValue={moduleValue} value={moduleValue} className="select-after" onChange={changeModuleValue}>
125
- {
126
- [
127
- <Option value={''}>所有</Option>,
128
- ...store.modules.map((module) => {
129
- return <Option value={module.key}>{module.name}</Option>
130
- })]
131
- }
132
- </Select>
133
- );
134
-
135
- const checkAllFun = () => {
136
- // alert(models.length)
137
- dispatch({
138
- type: `${namespace}/onCheckByModuleAll`,
139
- moduleKey: moduleValue,
140
- })
141
- }
142
-
143
- const checkAllCancleFun = () => {
144
- // alert(models.length)
145
- dispatch({
146
- type: `${namespace}/onCheckByModuleAllCancle`,
147
- moduleKey: moduleValue,
148
- })
149
- }
150
-
151
- const toggleShowNameOrLabel = useCallback(() => {
152
- dispatch({
153
- type: `${namespace}/showNameOrLabel`,
154
- showNameOrLabel: !store.showNameOrLabel,
155
- })
156
- },[store.showNameOrLabel])
157
-
158
-
159
- return useMemo(() => (
160
- <div className='console-models-tree' style={{paddingBottom: props.bottomHeight}} ref={(refDiv) => {
161
- consoleModelsRef.current = refDiv
162
- }}>
163
- <div className='header'>
164
-
165
- <div className='console-erd-search'>
166
-
167
- <NaviInput allowClear size="small" onChange={(e) => {searchOnChange(e.target.value) }} placeholder={intl.get('模型筛选').d('模型筛选')} addonAfter={selectAfter} />
168
- {/* <Button className='console-erd-add' type='text' icon='plus' onClick={() => { toolBarCommand('insertModel') }} /> */}
169
- </div>
170
- <div className='console-erd-search btns'>
171
- <Button size="small" type="link" onClick={checkAllFun} >选择所有</Button>
172
- <Button size="small" type="link" onClick={checkAllCancleFun}>清除所有</Button>
173
- <Button size="small" type="link" onClick={toggleShowNameOrLabel}>显示{!store.showNameOrLabel?'名称':'标签'}</Button>
174
- </div>
175
- </div>
176
- <div className='navitree-warp'>
177
- <Scroll
178
- autoHide
179
- autoHeight
180
- autoHideTimeout={1000}
181
- autoHideDuration={200}
182
- autoHeightMin={'100%'}
183
- autoHeightMax={'100%'}
184
- >
185
- <NaviTree className='console-models-tree-tree' ref={ref} expandedKeys={store.expandedKeys} onCheck={(checkKeys) => {
186
- dispatch({
187
- type: `${namespace}/onCheckByModule`,
188
- checkKeys,
189
- moduleKey: moduleValue
190
- })
191
- }} onExpand={(_, {
192
- expanded,
193
- node,
194
- }) => {
195
- dispatch({
196
- type: `${namespace}/onExpand`,
197
- expanded,
198
- node,
199
- })
200
- }} checkable multiple selectedKeys={[store.currentModel]} onSelect={(keys , e) => {
201
- // clickModelNodeFun(keys[0])
202
- // alert()
203
- // alert(JSON.stringify(keys))
204
- dispatch({
205
- type: `${namespace}/currentModel`,
206
- model: e.node.props['data-key'],
207
- })
208
-
209
- }} checkedKeys={store.checkedKeys}>
210
- {/* <TreeNode key='allmodels' title={<OptionBuilder data={{
211
- title: intl.get('所有模型').d('所有模型'),
212
- }} />}> */}
213
- {/* {store.modules.map((module) => {
214
- return <TreeNode key={'module-' + module.key} title={
215
- <OptionBuilder data={{
216
- title: renderTitle(module.name, store.search),
217
- options: [
218
- {
219
- title: <span> {intl.get('移除').d('移除')}</span>,
220
- click: () => {
221
- toolBarCommand('click', {
222
- node: 'module-' + module.key,
223
- // arg: '',
224
- click: 'delModule',
225
- })
226
- },
227
- },
228
- ],
229
- }} />
230
-
231
- }> */}
232
- {store.models.filter((m) => !m.delete && (!moduleValue || m.moduleKey === moduleValue)).filter((m) => !searchText || m.name.indexOf(searchText) >= 0).map((m) => {
233
- return <TreeNode title={<OptionBuilder data={{
234
- title: renderModelTitle(m.name, searchText, store.showNameOrLabel, m.originalKey),
235
- options: [{
236
- title: <span> {intl.get('定位模型').d('定位模型')}</span>,
237
- click: () => {
238
- toolBarCommand('centerModel', {
239
- node: 'model-' + m.key,
240
- })
241
- },
242
- },
243
- {
244
- title: <span> {intl.get('查看').d('查看')}</span>,
245
- click: () => {
246
- toolBarCommand('click', {
247
- node: 'model-' + m.key,
248
- // arg: '',
249
- click: 'modelEdit',
250
- })
251
- },
252
- },
253
- ...createItem(() => (!!m.aggregateModelKey), () => {
254
- return {
255
- title: <span> {intl.get('查看聚合关系').d('查看聚合关系')}</span>,
256
- click: () => {
257
- toolBarCommand('click', {
258
- node: 'model-' + m.key,
259
- // arg: '',
260
- click: 'arrangeShow',
261
- arg: m.aggregateModelKey,
262
- })
263
- },
264
- }
265
- }),
266
- {
267
- title: <span> {intl.get('移除').d('移除')}</span>,
268
- click: () => {
269
- toolBarCommand('click', {
270
- node: 'model-' + m.key,
271
- // arg: '',
272
- click: 'delModel',
273
- })
274
- },
275
- },
276
- ],
277
- }} />} data-key={'model-' + m.key} key={'model-' + m.key} isLeaf />
278
- })}
279
- {/* </TreeNode> */}
280
- })}
281
- {/* </TreeNode> */}
282
- </NaviTree>
283
- </Scroll>
284
- </div>
285
- </div>), [store.checkedKeys, store.currentModel, store.expandedKeys, store.modules, store.models, searchText, moduleValue, store.showNameOrLabel])
286
- })
287
-
288
- const useLocal = ({
289
- namespace,
290
- getModels,
291
- getModules,
292
- clickModelNode,
293
- primaryColor,
294
- }) => {
295
- const store = useSelector((s) => s[namespace])
296
- const consoleModelsRef = useRef(null)
297
- const dispatch = useDispatch()
298
- const {
299
- loadData,
300
- } = useLoadData({
301
- dispatch,
302
- namespace,
303
- getModels,
304
- getModules,
305
- primaryColor,
306
- })
307
- useEffect(() => {
308
- loadData()
309
- }, [])
310
- useEffect(() => {
311
- const modelsDiv = consoleModelsRef.current
312
-
313
- if (modelsDiv && store.currentModel) {
314
- const lis: any = document.querySelector(`li[data-key=\'${store.currentModel}\']`)
315
- if (lis && lis.offsetTop) modelsDiv.scrollTop = lis.offsetTop
316
- }
317
- }, [store.currentModel])
318
- const clickModelNodeFun = useCallback((key) => {
319
- if (clickModelNode) {
320
- clickModelNode(key)
321
- }
322
- }, [clickModelNode])
323
- return {
324
- store,
325
- consoleModelsRef,
326
- dispatch,
327
- clickModelNodeFun,
328
- }
329
- }
@@ -1,111 +0,0 @@
1
-
2
- .console-g6-page {
3
- background-color: #fff;
4
- display: flex ;
5
- flex:1;
6
- flex-direction: row;
7
- overflow: hidden;
8
- height: 100%;
9
- .g6-graph {
10
- // width: calc(100% - 250px)
11
- // padding-left: 16px;
12
- margin-right: 16px;
13
- flex:1;
14
- width:0;
15
- height: 100%;
16
- .ant-spin-nested-loading {
17
- height: 100%;
18
- .ant-spin-container {
19
- height: 100%;
20
- }
21
- }
22
- }
23
-
24
- .g6-info {
25
- width: 50px;
26
- }
27
-
28
- .g6-modelnavi {
29
- width: 270px;
30
- margin-bottom: 16px;
31
- height: 100%;
32
-
33
-
34
-
35
-
36
- .console-models-tree {
37
- overflow: hidden;
38
- display: flex ;
39
- flex-direction: column;
40
- padding-bottom: 78px;
41
-
42
- height: 100%;
43
- margin-right: 25px;
44
-
45
- .header {
46
- height: 56px;
47
- }
48
-
49
- .navitree-warp {
50
- flex: 1;
51
- // overflow-y: scroll;
52
- display: flex;
53
- flex-direction:column;
54
- // margin-top: 8px;
55
- // margin-bottom: 24px;
56
- height: 100%;
57
- margin-left: 10px;
58
- border: 1px solid rgba(0, 0, 0, 0.1);
59
- }
60
- .console-erd-search {
61
- margin-top: 3px;
62
- // height:35px;
63
- margin-bottom: 4px;
64
- // float: right;
65
- // margin-right: 30px;
66
- margin-left: 10px;
67
- display: flex;
68
- .console-erd-add {
69
- font-size: 20px;
70
- // margin-right: 25px;
71
- color: rgba(0,0,0,0.40);
72
- cursor: pointer;
73
- margin-left: 5px;
74
- }
75
- }
76
- // .header {
77
- // // height: 50px;
78
- // // border-bottom:1px solid rgba(0, 0, 0, 0.1);
79
- // }
80
-
81
-
82
- .console-models-tree-tree{
83
- flex:1;
84
- // overflow: hidden;
85
- padding-right: 5px;
86
- .ant-tree-treenode {
87
- width: 100%;
88
- }
89
-
90
- .ant-tree-node-selected {
91
- .tree-node-title {
92
- color: white;
93
- background-color: rgba(11,108,149,1);
94
- }
95
- background-color:rgba(11,108,149,1);
96
- }
97
-
98
- // div.ant-tree-treenode:hover {
99
- // background-color: red;
100
- // }
101
- }
102
-
103
-
104
-
105
- }
106
-
107
- }
108
-
109
- }
110
-
111
-
@@ -1,234 +0,0 @@
1
- // import { styleConfig , styleConfigLazy } from '../config'
2
- import { layOutNodes as _layOutNodes, layOutNodesByG6 as _layOutNodesByG6 } from './layout-nodes'
3
-
4
- export const layOutNodes = _layOutNodes
5
- export const layOutNodesByG6 = _layOutNodesByG6
6
-
7
- const showLable = (node) => {
8
- // return !node.name || node.name === node.originalKey
9
- // ? node.originalKey
10
- // : `${node.name} (${node.originalKey})`
11
- return node.name || node.originalKey
12
- }
13
-
14
- const eq = (fun) => {
15
- return fun()
16
- }
17
-
18
- const fields = (node, models) => {
19
- const list = node.fields.map((field) => {
20
- // const field = node.fields[k]
21
- const isForeign = field.typeMeta && field.typeMeta.type === 'Relation'
22
- const relationModel = eq(() => {
23
- if (isForeign && field.typeMeta.relationModel) {
24
- const m = models.find((a) => a.key === field.typeMeta.relationModel)
25
- // if (m) return m.name || m.originalKey
26
- return m || { name: field.typeMeta.relationModel }
27
- }
28
-
29
- return ''
30
- })
31
- return {
32
- ...field,
33
- key: field.key,
34
- label: showLable(field),
35
- type: field.type,
36
- originalKey: field.originalKey,
37
- isForeign,
38
- relationModelKey: relationModel && relationModel.key,
39
- relationModel: isForeign && relationModel ? relationModel.name || relationModel.originalKey : '',
40
- }
41
- })
42
- return list
43
- }
44
-
45
- export const updateLayout = (graph, groups) => {
46
- const nodes = graph.getNodes().filter((a) => !a.isSys).map((n) => {
47
- const model = n.getModel()
48
- return {
49
- data: model.data,
50
- config: model.config,
51
- id: model.id,
52
- }
53
- })
54
- const edges = graph.getEdges().map((edge) => {
55
- const { source, target, fieldIndex, fieldsLength } = edge.getModel()
56
- return {
57
- source,
58
- target,
59
- fieldIndex,
60
- fieldsLength,
61
- }
62
- })
63
- console.log(nodes)
64
- return layOutNodes(nodes, edges, groups)
65
- }
66
-
67
- const createSysNode = () => {
68
-
69
- return {
70
- id: 'model-SYS-CENTER-POINT',
71
- type: 'circle',
72
- isSys: true,
73
- isKeySharp: true,
74
- size: 10,
75
- }
76
-
77
- }
78
-
79
- export const getNodes = (models, checkedKeys styleConfig) => {
80
- // const _key = stateConfig.model_keys.key
81
- const nodeRes = models
82
- .filter(
83
- (model) => (checkedKeys.indexOf('model-' + model.key) >= 0 && !model.delete && model.isShow),
84
- )
85
- .map((model, i) => {
86
- return {
87
- id: 'model-' + model.key,
88
- hide: checkedKeys.indexOf('model-' + model.key) === -1,
89
- // groupId: `module-${model.moduleKey}`,
90
- config: {
91
- width: 300,
92
- headerHeight: 48,
93
- fieldHeight: 32,
94
- labelSize: 14 ,
95
- hide: checkedKeys.indexOf('model-' + model.key) === -1,
96
- styleConfig,
97
- },
98
- data: {
99
- moduleKey: `module-${model.moduleKey}`,
100
- label: showLable(model),
101
- fields: fields(model, models),
102
- key: model.key,
103
- name: model.name || model.key,
104
- tag: 'aggregate',
105
- aggregateRoot: model.aggregateRoot,
106
- aggregateModelKey: model.aggregateModelKey,
107
- belongAggregate: model.belongAggregate,
108
- nodeSize: ((48 + getLength(model.fields.length) * 48) / 6) *
109
- 6 / 6,
110
- },
111
- type: 'console-model-Node',
112
- isKeySharp: true,
113
- size: ((48 + getLength(model.fields.length) * 48) / 6) *
114
- 6 ,
115
- }
116
- })
117
-
118
- return nodeRes.length > 0 ? nodeRes.concat([createSysNode()]) : nodeRes
119
-
120
- // })
121
- }
122
-
123
- const getLength = (length) => {
124
- return length >= 20 ? length : 20
125
- }
126
-
127
- const noInCheckedKeys = (checkedKeys, sourceModel, targetModel) => {
128
- return checkedKeys.indexOf(sourceModel) === -1 || checkedKeys.indexOf(targetModel) === -1
129
- }
130
-
131
- const Relation = {
132
- ToOne: '1:1',
133
- ToMany: '1:n',
134
- lookup:'查找'
135
- }
136
-
137
- export const createLinks = (models, nodes, checkedKeys, styleConfig) => {
138
- const links = models.reduce((pre, model) => {
139
- if (!nodes.find((a) => a.id === 'model-' + model.key)) return pre
140
- const { aggregateRoot , aggregateModelKey , belongAggregate } = model
141
- const hasArrangeLink = (aggregateModelKey) && (aggregateModelKey !== model.key)
142
- const arrangeModel = aggregateModelKey
143
- const arrangeLink = (
144
- hasArrangeLink &&
145
- nodes.find((a) => a.id === 'model-' + arrangeModel) &&
146
- !noInCheckedKeys(checkedKeys, ('model-' + arrangeModel), ('model-' + model.key))) ? [
147
- {
148
- key: 'model-' + model.key + '~' + +'~' + 'model-' + arrangeModel,
149
- target: 'model-' + model.key,
150
- source: 'model-' + arrangeModel,
151
- arrangeLink: true,
152
- style : {
153
- lineDash: [18, 20], // 虚线边
154
- lineWidth: 3,
155
- },
156
- }] : []
157
-
158
- const fieldLinks = Object.keys(model.fields)
159
- .map((k) => model.fields[k])
160
- .reduce((fPre, field, i) => {
161
- const isRelation = field.typeMeta && field.typeMeta.type === 'Relation'
162
- const { originalKey } = field
163
- if (isRelation && !(field.typeMeta.relationModel === 'base_User' && (['createdBy', 'updatedBy'].indexOf(originalKey) >= 0))) {
164
- const sourceModelNode = null
165
- const targetModelNode = null
166
- const sourceModel = sourceModelNode
167
- ? sourceModelNode.getModel()
168
- : nodes.find((a) => a.id === 'model-' + model.key)
169
- const targetModel = targetModelNode
170
- ? targetModelNode.getModel()
171
- : nodes.find(
172
- (a) => a.id === 'model-' + field.typeMeta.relationModel,
173
- )
174
- if (!sourceModel || !targetModel) return fPre
175
- if (
176
- checkedKeys.indexOf(sourceModel.id) === -1 ||
177
- checkedKeys.indexOf(targetModel.id) === -1
178
- )
179
- return fPre
180
- const isTo = targetModel.x > sourceModel.x
181
- const l = Object.keys(model.fields).length
182
- const sourceAnchor = !isTo ? (i + 2) : (2 + i + l)
183
- const targetAnchor = (isTo ? 0 : 1)
184
- return [
185
- ...fPre,
186
- {
187
- key:
188
- 'model-' +
189
- model.key +
190
- '~' +
191
- +'~' +
192
- 'model-' +
193
- field.typeMeta.relationModel,
194
- source: 'model-' + model.key,
195
- target: 'model-' + field.typeMeta.relationModel,
196
- sourceAnchor,
197
- // targetAnchor: sourceAnchor,
198
- // targetAnchor: model.key === field.typeMeta.relationModel ? (sourceAnchor - 1) : undefined,
199
- targetAnchor: model.key === field.typeMeta.relationModel ? (sourceAnchor - 1) : targetAnchor,
200
- self : model.key === field.typeMeta.relationModel,
201
- // targetAnchor,
202
- fieldIndex: i,
203
- fieldsLength: l,
204
- // data: field,
205
- tooltip: `<div>从 <span class='text'>${sourceModel?.data?.label}</span> 到 <span class='text'>${targetModel?.data?.label}</span> ${Relation[field.type]||field.type} 关系</div>`
206
-
207
- type:
208
- model.key === field.typeMeta.relationModel
209
- ? 'loop'
210
- :
211
- 'console-line',
212
- // color: 'black',
213
- style: styleConfig.default.edge,
214
- styleConfig,
215
- // label: model.key === field.typeMeta.relationModel ? undefined : field.type,
216
- // labelAutoRotate: true,
217
- loopCfg: {
218
- // position: 'top',
219
- clockwise: true, // dist: 200,
220
- dist: 100,
221
- },
222
- },
223
- ]
224
- } else return fPre
225
- }, [])
226
-
227
- return [
228
- ...pre,
229
- ...arrangeLink,
230
- ...fieldLinks,
231
- ]
232
- }, [])
233
- return links
234
- }