@steedos/steedos-plugin-schema-builder 2.5.13 → 2.5.14-beta.10

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 (47) hide show
  1. package/package.json +3 -3
  2. package/package.service.js +7 -5
  3. package/plugin.config.yml +0 -4
  4. package/webapp/index.html +0 -0
  5. package/webapp/package.json +0 -53
  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/hook/index.tsx +0 -47
  20. package/webapp/src/index.tsx +0 -25
  21. package/webapp/src/page/dva-model/index.tsx +0 -70
  22. package/webapp/src/page/dva-model/reducer/arrange.tsx +0 -16
  23. package/webapp/src/page/dva-model/reducer/index.tsx +0 -7
  24. package/webapp/src/page/dva-model/reducer/init.tsx +0 -61
  25. package/webapp/src/page/dva-model/reducer/model.tsx +0 -126
  26. package/webapp/src/page/dva-model/reducer/on-expand.tsx +0 -27
  27. package/webapp/src/page/dva-model/style.tsx +0 -88
  28. package/webapp/src/page/hooks/callback.tsx +0 -54
  29. package/webapp/src/page/hooks/fullscreen.tsx +0 -34
  30. package/webapp/src/page/hooks/pagehooks.tsx +0 -127
  31. package/webapp/src/page/hooks/resize.tsx +0 -20
  32. package/webapp/src/page/index.tsx +0 -393
  33. package/webapp/src/page/model-navi/index.tsx +0 -329
  34. package/webapp/src/page/model-navi/style.scss +0 -111
  35. package/webapp/src/page/util/index.tsx +0 -234
  36. package/webapp/src/page/util/layout-nodes/index.tsx +0 -185
  37. package/webapp/src/pdm/index.tsx +0 -50
  38. package/webapp/src/pdm/pdm-json/index.js +0 -224
  39. package/webapp/src/pdm/pdm-json/removeDiacritics.js +0 -96
  40. package/webapp/src/style.less +0 -14
  41. package/webapp/src/tree/index.tsx +0 -46
  42. package/webapp/src/tree/style.scss +0 -26
  43. package/webapp/src/type/field.tsx +0 -10
  44. package/webapp/src/type/index.tsx +0 -3
  45. package/webapp/src/type/model.tsx +0 -12
  46. package/webapp/src/type/module.tsx +0 -4
  47. package/webapp/webconfig.config.js +0 -57
@@ -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
- }
@@ -1,185 +0,0 @@
1
- import G6 from '@antv/g6'
2
- import dagre from 'dagre'
3
-
4
- const setNodeXY = (nodesDict, node) => {
5
- const { id } = node
6
-
7
- if (nodesDict[id]) {
8
- node.x = nodesDict[id].x
9
- node.y = nodesDict[id].y
10
- return true
11
- }
12
- return false
13
- }
14
-
15
- const getLength = (length) => {
16
- return length >= 20 ? length : 20
17
- }
18
-
19
- export const layOutNodesByG6 = (nodes: any[], edges: any[], groups: any[], setNodeState, setEdgeState, setLayouting, isArrangeLayout) => {
20
- // layOutNodesByG6Force(nodes , edges, [])
21
- if (isArrangeLayout) {
22
- layOutNodesByG6Force(nodes, edges.filter((a) => a.arrangeLink) , [])
23
- if (setNodeState) {
24
- setEdgeState(edges.filter((a) => !a.isSys))
25
- setNodeState([...nodes])
26
- if (setLayouting) setLayouting(false)
27
- }
28
- } else {
29
- const subgraphLayout = new G6.Layout.force({
30
- // center: [500, 450],
31
- // nodeSize: 700,
32
- // nodeStrength: -30,
33
- // linkDistance:200,
34
- nodeSpacing: -180 ,
35
- preventOverlap: true,
36
- onLayoutEnd: () => {
37
- alert('onLayoutEnd')
38
- if (setNodeState) {
39
- setEdgeState(edges)
40
- setNodeState([...nodes])
41
- if (setLayouting) setLayouting(false)
42
- }
43
-
44
- },
45
- // workerEnabled: false,
46
- workerEnabled: true,
47
- })
48
-
49
- // 初始化布局,灌入子图数据
50
- subgraphLayout.init({
51
- nodes,
52
- edges,
53
- })
54
-
55
- // 执行布局
56
- subgraphLayout.execute()
57
- console.log([nodes, edges])
58
-
59
- // const graphString = sessionStorage.getItem('console-erd-graph')
60
- // // alert('force layout')
61
- // const nodesDict = graphString && JSON.parse(graphString)
62
- // nodes.forEach((node) => {
63
- // if (nodesDict) {
64
- // setNodeXY(nodesDict, node)
65
- // }
66
- // })
67
-
68
- // 图实例根据数据更新节点位置
69
- // graph.positionsAnimate()
70
- return [nodes, edges]
71
- }
72
- }
73
-
74
- export const layOutNodesByG6Force = (nodes: any[], edges: any[], groups: any[]) => {
75
- const subgraphLayout = new G6.Layout.dagre({
76
- // center: [500, 450],
77
- workerEnabled: true,
78
- })
79
-
80
- // 初始化布局,灌入子图数据
81
- subgraphLayout.init({
82
- nodes,
83
- edges,
84
- })
85
-
86
- // 执行布局
87
- subgraphLayout.execute()
88
-
89
- const graphString = sessionStorage.getItem('console-erd-graph')
90
- alert(graphString)
91
- const nodesDict = graphString && JSON.parse(graphString)
92
- nodes.forEach((node) => {
93
- if (nodesDict) {
94
- setNodeXY(nodesDict, node)
95
- }
96
- })
97
-
98
- // 图实例根据数据更新节点位置
99
- // graph.positionsAnimate()
100
- return [nodes, edges]
101
- }
102
-
103
- export const layOutNodes = (nodes: any[], edges: any[], groups: any[]) => {
104
- // alert(nodes.length)
105
- let g = new dagre.graphlib.Graph()
106
- g.setGraph({
107
- // ranker: 'network-simplex',
108
- // acyclicer: undefined,
109
- // rankdir: 'LR',
110
- // align: 'UL',
111
- // ranksep: 500,
112
- })
113
- g.setDefaultEdgeLabel((v, w) => ({
114
- label: v + '~' + w,
115
- }))
116
- nodes.filter((a) => !a.isSys).forEach((node) => {
117
- const { config, data } = node
118
- g.setNode(node.id, {
119
- label: node.id,
120
- width: (config.width / 6) * 6,
121
- height:
122
- ((config.headerHeight + getLength(data.fields.length) * config.fieldHeight) / 6) *
123
- 6,
124
- })
125
- })
126
- edges.forEach((edge) => {
127
- g.setEdge(edge.source, edge.target)
128
- })
129
-
130
- // groups.forEach((group) => {
131
-
132
- // const gNodes = nodes.filter((a) => a.moduleKey === group.key)
133
- // if (gNodes.length > 1) {
134
- // gNodes.forEach((n, i) => {
135
- // if (i < (gNodes.length - 1)) {
136
- // // g.setEdge(gNodes[i].id, gNodes[i + 1].id)
137
- // g.setEdge(gNodes[0].id, n.id)
138
- // }
139
- // })
140
- // }
141
-
142
- // })
143
- dagre.layout(g)
144
- const graphString = sessionStorage.getItem('console-erd-graph')
145
- const nodesDict = graphString && JSON.parse(graphString)
146
- nodes.forEach((node) => {
147
- if (nodesDict) {
148
-
149
- const isStorage = setNodeXY(nodesDict, node)
150
- if (isStorage) return
151
- }
152
-
153
- node.x = g.node(node.id).x
154
- node.y = g.node(node.id).y
155
- })
156
-
157
-
158
- // -------
159
-
160
- // edges.forEach((edge) => {
161
- // const { source, target, fieldIndex, fieldsLength } = edge
162
- // const i = fieldIndex
163
- // const l = fieldsLength
164
- // const sourceModel = nodes.find((a) => a.id === source)
165
- // const targetModel = nodes.find((a) => a.id === target)
166
- // const isTo = sourceModel && targetModel && targetModel.x > sourceModel.x // const l = sourceModel.data.fields.length
167
- // if (sourceModel !== targetModel) {
168
- // edge.sourceAnchor = !isTo ? (i + 2) : (2 + i + l)
169
- // // edge.targetAnchor = isTo ? 0 : 1
170
- // edge.targetAnchor = undefined
171
- // }
172
- // // const { points } = g.edge({v: sourceModel.id , w: targetModel.id })
173
- // // edge.controlPoints = points
174
- // // edge.controlPoints = g.edge(edge)
175
- // })
176
-
177
- // g.edges().forEach((e) => {
178
- // console.log('Edge ' + e.v + ' -> ' + e.w + ': ' + JSON.stringify(g.edge(e)))
179
- // })
180
-
181
- return {
182
- nodes: nodes.reduce((pre, item) => ({ ...pre, [item.id]: item }), {}),
183
- edges,
184
- }
185
- }
@@ -1,50 +0,0 @@
1
- import { InboxOutline } from '@ant-design/icons'
2
- import { message, Upload } from 'antd'
3
- import { useDispatch } from '../hook'
4
- import React from 'react'
5
- const PdmToJson = require('./pdm-json')
6
- import { ConvertTo } from './util'
7
-
8
- export default ({children}) => {
9
- const dispatch = useDispatch()
10
-
11
- const props = {
12
- name: 'file',
13
- multiple: true,
14
- transformFile(file) {
15
- return new Promise((resolve) => {
16
- const reader = new FileReader()
17
- reader.readAsText(file)
18
- reader.onload = async (a) => {
19
- // alert(a.target.result)
20
- const aa = await PdmToJson(a.target.result)
21
- console.log(aa)
22
- const erds = ConvertTo(aa)
23
- console.log(erds)
24
- dispatch({
25
- type: `${'erd'}/load`,
26
- ...erds,
27
- })
28
- }
29
- })
30
- },
31
- onChange(info) {
32
- const { status } = info.file
33
- if (status !== 'uploading') {
34
- console.log(info.file, info.fileList)
35
- }
36
- if (status === 'done') {
37
- message.success(`${info.file.name} file uploaded successfully.`)
38
- } else if (status === 'error') {
39
- message.error(`${info.file.name} file upload failed.`)
40
- }
41
- },
42
- }
43
-
44
- return (
45
- <Upload {...props}>
46
- {children}
47
- </Upload>
48
- )
49
- }
50
-