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

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,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
-
@@ -1,224 +0,0 @@
1
- const removeDiacritics = require('./removeDiacritics');
2
- // const util = require('util');
3
- const parser = require('xml2js');
4
- // const fs = require('fs');
5
- // const writeFile = util.promisify(fs.writeFile);
6
- // const readFile = util.promisify(fs.readFile);
7
- const parseString = parser.parseString;
8
- const rtfToHTMLLibFun = require('@iarna/rtf-to-html').fromString;
9
- const rtfToHTMLLib = (aa) => {
10
- return new Promise((res) => {
11
- rtfToHTMLLibFun(aa, (err, result) => { res(ressult)})
12
- })
13
- }
14
-
15
- module.exports = async (xml) => {
16
-
17
- const parseStringPromise = new Promise((res) => {
18
- parseString(xml, (err, result) => { res(result)})
19
- })
20
-
21
- const parseResult = await parseStringPromise
22
- const info = getPdmInfo(parseResult)
23
-
24
-
25
- return info
26
- }
27
-
28
- const First = (a) => {
29
- return a && a.length && a.length[0]
30
- }
31
-
32
- async function getPdmInfo(parsedJson) {
33
- const model = parsedJson['Model']['o:RootObject'][0]['c:Children'][0]['o:Model'][0];
34
- const tables = model['c:Tables'][0]['o:Table'];
35
- const parsedModel = {};
36
- const parsedRoot = {
37
- Name: model['a:Name'][0],
38
- Code:model['a:Code'][0],
39
- }
40
-
41
- for (const table of tables) {
42
- const ref = table['$']['Id'];
43
- const name = codify(table['a:Name'][0]);
44
- const code = table['a:Code'][0];
45
- const constantName = codifyUpper(table['a:Name'][0]);
46
- const conceptualName = table['a:Name'][0];
47
- const comment = table['a:Comment'];
48
- const description = await rtfToHTML(table['a:Description']);
49
- const primaryKeyArray = table["c:PrimaryKey"] ? table["c:PrimaryKey"][0]["o:Key"] : [];
50
- const columns = await getColumns(table);
51
- const keys = getKeys(table, primaryKeyArray, columns);
52
-
53
- parsedModel[code] = {
54
- ref,
55
- name,
56
- code,
57
- constantName,
58
- conceptualName,
59
- comment,
60
- description,
61
- columns,
62
- keys
63
- };
64
- }
65
-
66
- for (const tableCode in parsedModel) {
67
- const table = parsedModel[tableCode];
68
- table.inRelations = [];
69
- table.outRelations = [];
70
- const inReferences = model['c:References'] ? model['c:References'][0]['o:Reference'].filter(r => r['c:ChildTable'][0]['o:Table'][0]['$']['Ref'] === table.ref) : [];
71
- const outReferences = model['c:References'] ? model['c:References'][0]['o:Reference'].filter(r => r['c:ParentTable'][0]['o:Table'][0]['$']['Ref'] === table.ref) : [];
72
-
73
- mapInRelations(inReferences, parsedModel, table);
74
- mapOutRelations(outReferences, parsedModel, table);
75
-
76
- }
77
-
78
- return { parsedModel, parsedRoot };
79
- }
80
-
81
- function mapInRelations(inReferences, parsedModel, table) {
82
- for (const reference of inReferences) {
83
- const parentTable = findTableByRef(parsedModel, reference['c:ParentTable'][0]['o:Table'][0]['$']['Ref']);
84
- let parentColumnRef , childColumnRef, isSuccess = true
85
- try{
86
- parentColumnRef = reference['c:Joins'][0]['o:ReferenceJoin'][0]['c:Object1'][0]['o:Column'][0]['$']['Ref'];
87
- childColumnRef = reference['c:Joins'][0]['o:ReferenceJoin'][0]['c:Object2'][0]['o:Column'][0]['$']['Ref'];
88
-
89
- }
90
- catch {
91
- isSuccess = false
92
- }
93
- isSuccess && table.inRelations.push({
94
- name: reference['a:Name'][0],
95
- code: reference['a:Code'][0],
96
- cardinality: reference['a:Cardinality'][0],
97
- // parentRole: reference['a:ParentRole'][0],
98
- // childRole: reference['a:ChildRole'][0],
99
- parentTable: parentTable.code,
100
- parentColumn: findColumnByRef(parentTable, parentColumnRef)['code'],
101
- childTable: table.code,
102
- childColumn: findColumnByRef(table, childColumnRef)['code']
103
- });
104
- }
105
- }
106
-
107
- function mapOutRelations(outReferences, parsedModel, table) {
108
- for (const reference of outReferences) {
109
- const childTable = findTableByRef(parsedModel, reference['c:ChildTable'][0]['o:Table'][0]['$']['Ref']);
110
- let parentColumnRef , childColumnRef, isSuccess
111
- try{
112
- parentColumnRef = reference['c:Joins'][0]['o:ReferenceJoin'][0]['c:Object1'][0]['o:Column'][0]['$']['Ref'];
113
- childColumnRef = reference['c:Joins'][0]['o:ReferenceJoin'][0]['c:Object2'][0]['o:Column'][0]['$']['Ref'];
114
- isSuccess = true
115
- } catch {
116
- isSuccess = false
117
- }
118
- isSuccess && table.outRelations.push({
119
- name: reference['a:Name'][0],
120
- code: reference['a:Code'][0],
121
- cardinality: reference['a:Cardinality'][0],
122
- // parentRole: reference['a:ParentRole'][0],
123
- // childRole: reference['a:ChildRole'][0],
124
- parentTable: table.conceptualName,
125
- parentColumn: findColumnByRef(table, parentColumnRef)['code'],
126
- childTable: childTable.conceptualName,
127
- childColumn: findColumnByRef(childTable, childColumnRef)['code']
128
- });
129
- }
130
- }
131
-
132
- function getKeys(table, primaryKeyArray, columns) {
133
- return table["c:Keys"] ? table["c:Keys"][0]["o:Key"].map(key => {
134
- const ref = key['$']['Id'];
135
- const name = key['a:Name'][0];
136
- const code = key['a:Code'][0];
137
- const isPrimaryKey = !!primaryKeyArray.find(k => k['$']['Ref'] == key['$']['Id']);
138
- const columnsKey = getColumnsKey(key, columns, isPrimaryKey);
139
- return { ref, name, code, isPrimaryKey, columnsKey };
140
- }) : [];
141
- }
142
-
143
- function getColumnsKey(key, columns, isPrimaryKey) {
144
- return key['c:Key.Columns'][0]['o:Column'].map(cKey => {
145
- const column = columns.find(c => c.ref === cKey['$']['Ref']);
146
- column.isPrimaryKey = isPrimaryKey;
147
- return {
148
- name: column.name,
149
- code: column.code,
150
- conceptualName: column.conceptualName
151
- };
152
- });
153
- }
154
-
155
- async function getColumns(table) {
156
- return await Promise.all(table["c:Columns"][0]["o:Column"].map(async (column) => {
157
- return {
158
- ref: column['$']['Id'],
159
- name: codify(column['a:Name'][0]),
160
- code: column['a:Code'][0],
161
- constantName: codifyUpper(column['a:Name'][0]),
162
- conceptualName: column['a:Name'][0],
163
- description: await rtfToHTML(column['a:Description']),
164
- dataType: column['a:DataType'] && column['a:DataType'][0],
165
- isIdentity: column['a:Identity'] ? !!Number(column['a:Identity'][0]) : false,
166
- isMandatory: column['a:Column.Mandatory'] ? !!Number(column['a:Column.Mandatory'][0]) : false,
167
- isPrimaryKey: false,
168
- length: column['a:Length'] && column['a:Length'].length ? column['a:Length'][0] : null,
169
- listOfValues: column['a:ListOfValues'] && column['a:ListOfValues'].length ? extractListOfValues(column['a:ListOfValues'][0]) : null,
170
- precision: column['a:Precision'] && column['a:Precision'].length ? column['a:Precision'][0] : null,
171
- defaultValue: column['a:DefaultValue'] && column['a:DefaultValue'].length ? column['a:DefaultValue'][0] : null
172
- };
173
- }));
174
- }
175
-
176
- async function rtfToHTML(arr) {
177
- try {
178
- if (arr && arr.length) {
179
- return await rtfToHTMLLib(arr[0]);
180
- }
181
- } catch (error) {
182
- return await arr;
183
- }
184
- }
185
-
186
- function codify(str) {
187
- return removeDiacritics(str)
188
- .replace(/ /g, "")
189
- .replace(/\W/g, "");
190
- }
191
-
192
- function extractListOfValues(str) {
193
- return str.split('\r\n').map(s => {
194
- const elements = s.split('\t');
195
- const obj = {};
196
- obj.code = elements[0];
197
- obj.name = elements[1];
198
- obj.constantName = removeDiacritics(elements[1])
199
- .toUpperCase()
200
- .replace(/ /g, "_")
201
- .replace(/\W/g, "");
202
-
203
- return obj;
204
- });
205
- }
206
-
207
- function codifyUpper(str) {
208
- return removeDiacritics(str)
209
- .toUpperCase()
210
- .replace(/ /g, "_")
211
- .replace(/\W/g, "");
212
- }
213
-
214
- function findColumnByRef(parsedTable, ref) {
215
- return parsedTable.columns.find(c => c.ref === ref);
216
- }
217
-
218
- function findTableByRef(parsedModel, ref) {
219
- for (const key in parsedModel) {
220
- if (parsedModel[key].ref === ref) {
221
- return parsedModel[key];
222
- }
223
- }
224
- }
@@ -1,96 +0,0 @@
1
- module.exports = function removeDiacritics(str) {
2
-
3
- var defaultDiacriticsRemovalMap = [
4
- { 'base': 'A', 'letters': /[\u0041\u24B6\uFF21\u00C0\u00C1\u00C2\u1EA6\u1EA4\u1EAA\u1EA8\u00C3\u0100\u0102\u1EB0\u1EAE\u1EB4\u1EB2\u0226\u01E0\u00C4\u01DE\u1EA2\u00C5\u01FA\u01CD\u0200\u0202\u1EA0\u1EAC\u1EB6\u1E00\u0104\u023A\u2C6F]/g },
5
- { 'base': 'AA', 'letters': /[\uA732]/g },
6
- { 'base': 'AE', 'letters': /[\u00C6\u01FC\u01E2]/g },
7
- { 'base': 'AO', 'letters': /[\uA734]/g },
8
- { 'base': 'AU', 'letters': /[\uA736]/g },
9
- { 'base': 'AV', 'letters': /[\uA738\uA73A]/g },
10
- { 'base': 'AY', 'letters': /[\uA73C]/g },
11
- { 'base': 'B', 'letters': /[\u0042\u24B7\uFF22\u1E02\u1E04\u1E06\u0243\u0182\u0181]/g },
12
- { 'base': 'C', 'letters': /[\u0043\u24B8\uFF23\u0106\u0108\u010A\u010C\u00C7\u1E08\u0187\u023B\uA73E]/g },
13
- { 'base': 'D', 'letters': /[\u0044\u24B9\uFF24\u1E0A\u010E\u1E0C\u1E10\u1E12\u1E0E\u0110\u018B\u018A\u0189\uA779]/g },
14
- { 'base': 'DZ', 'letters': /[\u01F1\u01C4]/g },
15
- { 'base': 'Dz', 'letters': /[\u01F2\u01C5]/g },
16
- { 'base': 'E', 'letters': /[\u0045\u24BA\uFF25\u00C8\u00C9\u00CA\u1EC0\u1EBE\u1EC4\u1EC2\u1EBC\u0112\u1E14\u1E16\u0114\u0116\u00CB\u1EBA\u011A\u0204\u0206\u1EB8\u1EC6\u0228\u1E1C\u0118\u1E18\u1E1A\u0190\u018E]/g },
17
- { 'base': 'F', 'letters': /[\u0046\u24BB\uFF26\u1E1E\u0191\uA77B]/g },
18
- { 'base': 'G', 'letters': /[\u0047\u24BC\uFF27\u01F4\u011C\u1E20\u011E\u0120\u01E6\u0122\u01E4\u0193\uA7A0\uA77D\uA77E]/g },
19
- { 'base': 'H', 'letters': /[\u0048\u24BD\uFF28\u0124\u1E22\u1E26\u021E\u1E24\u1E28\u1E2A\u0126\u2C67\u2C75\uA78D]/g },
20
- { 'base': 'I', 'letters': /[\u0049\u24BE\uFF29\u00CC\u00CD\u00CE\u0128\u012A\u012C\u0130\u00CF\u1E2E\u1EC8\u01CF\u0208\u020A\u1ECA\u012E\u1E2C\u0197]/g },
21
- { 'base': 'J', 'letters': /[\u004A\u24BF\uFF2A\u0134\u0248]/g },
22
- { 'base': 'K', 'letters': /[\u004B\u24C0\uFF2B\u1E30\u01E8\u1E32\u0136\u1E34\u0198\u2C69\uA740\uA742\uA744\uA7A2]/g },
23
- { 'base': 'L', 'letters': /[\u004C\u24C1\uFF2C\u013F\u0139\u013D\u1E36\u1E38\u013B\u1E3C\u1E3A\u0141\u023D\u2C62\u2C60\uA748\uA746\uA780]/g },
24
- { 'base': 'LJ', 'letters': /[\u01C7]/g },
25
- { 'base': 'Lj', 'letters': /[\u01C8]/g },
26
- { 'base': 'M', 'letters': /[\u004D\u24C2\uFF2D\u1E3E\u1E40\u1E42\u2C6E\u019C]/g },
27
- { 'base': 'N', 'letters': /[\u004E\u24C3\uFF2E\u01F8\u0143\u00D1\u1E44\u0147\u1E46\u0145\u1E4A\u1E48\u0220\u019D\uA790\uA7A4]/g },
28
- { 'base': 'NJ', 'letters': /[\u01CA]/g },
29
- { 'base': 'Nj', 'letters': /[\u01CB]/g },
30
- { 'base': 'O', 'letters': /[\u004F\u24C4\uFF2F\u00D2\u00D3\u00D4\u1ED2\u1ED0\u1ED6\u1ED4\u00D5\u1E4C\u022C\u1E4E\u014C\u1E50\u1E52\u014E\u022E\u0230\u00D6\u022A\u1ECE\u0150\u01D1\u020C\u020E\u01A0\u1EDC\u1EDA\u1EE0\u1EDE\u1EE2\u1ECC\u1ED8\u01EA\u01EC\u00D8\u01FE\u0186\u019F\uA74A\uA74C]/g },
31
- { 'base': 'OI', 'letters': /[\u01A2]/g },
32
- { 'base': 'OO', 'letters': /[\uA74E]/g },
33
- { 'base': 'OU', 'letters': /[\u0222]/g },
34
- { 'base': 'P', 'letters': /[\u0050\u24C5\uFF30\u1E54\u1E56\u01A4\u2C63\uA750\uA752\uA754]/g },
35
- { 'base': 'Q', 'letters': /[\u0051\u24C6\uFF31\uA756\uA758\u024A]/g },
36
- { 'base': 'R', 'letters': /[\u0052\u24C7\uFF32\u0154\u1E58\u0158\u0210\u0212\u1E5A\u1E5C\u0156\u1E5E\u024C\u2C64\uA75A\uA7A6\uA782]/g },
37
- { 'base': 'S', 'letters': /[\u0053\u24C8\uFF33\u1E9E\u015A\u1E64\u015C\u1E60\u0160\u1E66\u1E62\u1E68\u0218\u015E\u2C7E\uA7A8\uA784]/g },
38
- { 'base': 'T', 'letters': /[\u0054\u24C9\uFF34\u1E6A\u0164\u1E6C\u021A\u0162\u1E70\u1E6E\u0166\u01AC\u01AE\u023E\uA786]/g },
39
- { 'base': 'TZ', 'letters': /[\uA728]/g },
40
- { 'base': 'U', 'letters': /[\u0055\u24CA\uFF35\u00D9\u00DA\u00DB\u0168\u1E78\u016A\u1E7A\u016C\u00DC\u01DB\u01D7\u01D5\u01D9\u1EE6\u016E\u0170\u01D3\u0214\u0216\u01AF\u1EEA\u1EE8\u1EEE\u1EEC\u1EF0\u1EE4\u1E72\u0172\u1E76\u1E74\u0244]/g },
41
- { 'base': 'V', 'letters': /[\u0056\u24CB\uFF36\u1E7C\u1E7E\u01B2\uA75E\u0245]/g },
42
- { 'base': 'VY', 'letters': /[\uA760]/g },
43
- { 'base': 'W', 'letters': /[\u0057\u24CC\uFF37\u1E80\u1E82\u0174\u1E86\u1E84\u1E88\u2C72]/g },
44
- { 'base': 'X', 'letters': /[\u0058\u24CD\uFF38\u1E8A\u1E8C]/g },
45
- { 'base': 'Y', 'letters': /[\u0059\u24CE\uFF39\u1EF2\u00DD\u0176\u1EF8\u0232\u1E8E\u0178\u1EF6\u1EF4\u01B3\u024E\u1EFE]/g },
46
- { 'base': 'Z', 'letters': /[\u005A\u24CF\uFF3A\u0179\u1E90\u017B\u017D\u1E92\u1E94\u01B5\u0224\u2C7F\u2C6B\uA762]/g },
47
- { 'base': 'a', 'letters': /[\u0061\u24D0\uFF41\u1E9A\u00E0\u00E1\u00E2\u1EA7\u1EA5\u1EAB\u1EA9\u00E3\u0101\u0103\u1EB1\u1EAF\u1EB5\u1EB3\u0227\u01E1\u00E4\u01DF\u1EA3\u00E5\u01FB\u01CE\u0201\u0203\u1EA1\u1EAD\u1EB7\u1E01\u0105\u2C65\u0250]/g },
48
- { 'base': 'aa', 'letters': /[\uA733]/g },
49
- { 'base': 'ae', 'letters': /[\u00E6\u01FD\u01E3]/g },
50
- { 'base': 'ao', 'letters': /[\uA735]/g },
51
- { 'base': 'au', 'letters': /[\uA737]/g },
52
- { 'base': 'av', 'letters': /[\uA739\uA73B]/g },
53
- { 'base': 'ay', 'letters': /[\uA73D]/g },
54
- { 'base': 'b', 'letters': /[\u0062\u24D1\uFF42\u1E03\u1E05\u1E07\u0180\u0183\u0253]/g },
55
- { 'base': 'c', 'letters': /[\u0063\u24D2\uFF43\u0107\u0109\u010B\u010D\u00E7\u1E09\u0188\u023C\uA73F\u2184]/g },
56
- { 'base': 'd', 'letters': /[\u0064\u24D3\uFF44\u1E0B\u010F\u1E0D\u1E11\u1E13\u1E0F\u0111\u018C\u0256\u0257\uA77A]/g },
57
- { 'base': 'dz', 'letters': /[\u01F3\u01C6]/g },
58
- { 'base': 'e', 'letters': /[\u0065\u24D4\uFF45\u00E8\u00E9\u00EA\u1EC1\u1EBF\u1EC5\u1EC3\u1EBD\u0113\u1E15\u1E17\u0115\u0117\u00EB\u1EBB\u011B\u0205\u0207\u1EB9\u1EC7\u0229\u1E1D\u0119\u1E19\u1E1B\u0247\u025B\u01DD]/g },
59
- { 'base': 'f', 'letters': /[\u0066\u24D5\uFF46\u1E1F\u0192\uA77C]/g },
60
- { 'base': 'g', 'letters': /[\u0067\u24D6\uFF47\u01F5\u011D\u1E21\u011F\u0121\u01E7\u0123\u01E5\u0260\uA7A1\u1D79\uA77F]/g },
61
- { 'base': 'h', 'letters': /[\u0068\u24D7\uFF48\u0125\u1E23\u1E27\u021F\u1E25\u1E29\u1E2B\u1E96\u0127\u2C68\u2C76\u0265]/g },
62
- { 'base': 'hv', 'letters': /[\u0195]/g },
63
- { 'base': 'i', 'letters': /[\u0069\u24D8\uFF49\u00EC\u00ED\u00EE\u0129\u012B\u012D\u00EF\u1E2F\u1EC9\u01D0\u0209\u020B\u1ECB\u012F\u1E2D\u0268\u0131]/g },
64
- { 'base': 'j', 'letters': /[\u006A\u24D9\uFF4A\u0135\u01F0\u0249]/g },
65
- { 'base': 'k', 'letters': /[\u006B\u24DA\uFF4B\u1E31\u01E9\u1E33\u0137\u1E35\u0199\u2C6A\uA741\uA743\uA745\uA7A3]/g },
66
- { 'base': 'l', 'letters': /[\u006C\u24DB\uFF4C\u0140\u013A\u013E\u1E37\u1E39\u013C\u1E3D\u1E3B\u017F\u0142\u019A\u026B\u2C61\uA749\uA781\uA747]/g },
67
- { 'base': 'lj', 'letters': /[\u01C9]/g },
68
- { 'base': 'm', 'letters': /[\u006D\u24DC\uFF4D\u1E3F\u1E41\u1E43\u0271\u026F]/g },
69
- { 'base': 'n', 'letters': /[\u006E\u24DD\uFF4E\u01F9\u0144\u00F1\u1E45\u0148\u1E47\u0146\u1E4B\u1E49\u019E\u0272\u0149\uA791\uA7A5]/g },
70
- { 'base': 'nj', 'letters': /[\u01CC]/g },
71
- { 'base': 'o', 'letters': /[\u006F\u24DE\uFF4F\u00F2\u00F3\u00F4\u1ED3\u1ED1\u1ED7\u1ED5\u00F5\u1E4D\u022D\u1E4F\u014D\u1E51\u1E53\u014F\u022F\u0231\u00F6\u022B\u1ECF\u0151\u01D2\u020D\u020F\u01A1\u1EDD\u1EDB\u1EE1\u1EDF\u1EE3\u1ECD\u1ED9\u01EB\u01ED\u00F8\u01FF\u0254\uA74B\uA74D\u0275]/g },
72
- { 'base': 'oi', 'letters': /[\u01A3]/g },
73
- { 'base': 'ou', 'letters': /[\u0223]/g },
74
- { 'base': 'oo', 'letters': /[\uA74F]/g },
75
- { 'base': 'p', 'letters': /[\u0070\u24DF\uFF50\u1E55\u1E57\u01A5\u1D7D\uA751\uA753\uA755]/g },
76
- { 'base': 'q', 'letters': /[\u0071\u24E0\uFF51\u024B\uA757\uA759]/g },
77
- { 'base': 'r', 'letters': /[\u0072\u24E1\uFF52\u0155\u1E59\u0159\u0211\u0213\u1E5B\u1E5D\u0157\u1E5F\u024D\u027D\uA75B\uA7A7\uA783]/g },
78
- { 'base': 's', 'letters': /[\u0073\u24E2\uFF53\u00DF\u015B\u1E65\u015D\u1E61\u0161\u1E67\u1E63\u1E69\u0219\u015F\u023F\uA7A9\uA785\u1E9B]/g },
79
- { 'base': 't', 'letters': /[\u0074\u24E3\uFF54\u1E6B\u1E97\u0165\u1E6D\u021B\u0163\u1E71\u1E6F\u0167\u01AD\u0288\u2C66\uA787]/g },
80
- { 'base': 'tz', 'letters': /[\uA729]/g },
81
- { 'base': 'u', 'letters': /[\u0075\u24E4\uFF55\u00F9\u00FA\u00FB\u0169\u1E79\u016B\u1E7B\u016D\u00FC\u01DC\u01D8\u01D6\u01DA\u1EE7\u016F\u0171\u01D4\u0215\u0217\u01B0\u1EEB\u1EE9\u1EEF\u1EED\u1EF1\u1EE5\u1E73\u0173\u1E77\u1E75\u0289]/g },
82
- { 'base': 'v', 'letters': /[\u0076\u24E5\uFF56\u1E7D\u1E7F\u028B\uA75F\u028C]/g },
83
- { 'base': 'vy', 'letters': /[\uA761]/g },
84
- { 'base': 'w', 'letters': /[\u0077\u24E6\uFF57\u1E81\u1E83\u0175\u1E87\u1E85\u1E98\u1E89\u2C73]/g },
85
- { 'base': 'x', 'letters': /[\u0078\u24E7\uFF58\u1E8B\u1E8D]/g },
86
- { 'base': 'y', 'letters': /[\u0079\u24E8\uFF59\u1EF3\u00FD\u0177\u1EF9\u0233\u1E8F\u00FF\u1EF7\u1E99\u1EF5\u01B4\u024F\u1EFF]/g },
87
- { 'base': 'z', 'letters': /[\u007A\u24E9\uFF5A\u017A\u1E91\u017C\u017E\u1E93\u1E95\u01B6\u0225\u0240\u2C6C\uA763]/g }
88
- ];
89
-
90
- for (var i = 0; i < defaultDiacriticsRemovalMap.length; i++) {
91
- str = str.replace(defaultDiacriticsRemovalMap[i].letters, defaultDiacriticsRemovalMap[i].base);
92
- }
93
-
94
- return str;
95
-
96
- }
@@ -1,60 +0,0 @@
1
- import { IField, IModel, IModule } from './../../../src/type'
2
-
3
- interface IConvertTo {
4
- models: IModel[],
5
- modules: IModule[]
6
- }
7
-
8
- export const ConvertTo = (pdm) => {
9
- const nodes = Object.entries(pdm.parsedModel)
10
- .map(([k, v]) => v)
11
- .reduce((pres, model: any) => {
12
-
13
- const inRelations = model.inRelations
14
- const Relations = inRelations.reduce((preRelation, inRelation) => {
15
- const { parentTable , parentColumn, childColumn } = inRelation
16
- return {
17
- ...preRelation,
18
- [childColumn]: {
19
- parentTable,
20
- parentColumn,
21
- },
22
- }
23
- } , {})
24
-
25
- const node: IModel = {
26
- key: model.code,
27
- originalKey: model.code,
28
- name : model.conceptualName,
29
- type: model.dataType,
30
- moduleKey: pdm.parsedRoot.Code,
31
- fields: model.columns.map((col) => {
32
-
33
- const relationCol = Relations[col.code]
34
- const typeMeta = relationCol ? {
35
- relationModel: relationCol.parentTable,
36
- type: 'Relation',
37
- } : undefined
38
-
39
- return {
40
- type: col. dataType,
41
- key: relationCol ? 'toMany' : col.code,
42
- originalKey: col.code,
43
- typeMeta,
44
- name : col.conceptualName,
45
- }
46
- }),
47
- }
48
- return [
49
- ...pres, node,
50
- ]
51
- } , [])
52
-
53
- return {
54
- models: nodes,
55
- modules: [{
56
- name : pdm.parsedRoot.Name,
57
- key: pdm.parsedRoot.Code,
58
- }],
59
- }
60
- }
@@ -1,14 +0,0 @@
1
-
2
- @import '~antd/lib/style/themes/default.less';
3
- @import '~antd/dist/antd.less'; // 引入官方提供的 less 样式入口文件
4
- body {
5
- height: 100%;
6
- }
7
-
8
- #app {
9
- height : 100%;
10
- }
11
-
12
- @primary-color: rgb(60,61,62); // 全局主色
13
- // @link-color: #000; // 链接色
14
-
@@ -1,46 +0,0 @@
1
- import { Dropdown, Menu, Tree } from 'antd'
2
- import React, { useState, useCallback } from 'react'
3
- import './style.scss'
4
-
5
- const { TreeNode } = Tree
6
- export default () => {
7
- return (
8
- <div className='tree-erd'>
9
- <Tree>
10
- <TreeNode title='111' key='1'>
11
- <TreeNode title='111' key='2' />
12
- <TreeNode title={<OptionBuilder data={{title: 'ddddd', options: [{title: 'aaa'}]}} />} key='3' />
13
- </TreeNode>
14
- </Tree>
15
- </div>)
16
-
17
- }
18
-
19
- const OptionBuilder = ({data}) => {
20
- const { title, options = [] } = data
21
- const [ showMenu , setShowMenu ] = useState(false)
22
- const onShowMenu = useCallback((val)=> () => { setShowMenu(val) } , [])
23
-
24
- const menu = (
25
- <Menu>
26
- { options.map((option) => {
27
- return (
28
- <Menu.Item key={option}>
29
- <a onClick={option.click}>{option.title}</a>
30
- </Menu.Item>
31
- )})
32
- }
33
- </Menu>
34
- )
35
- return (
36
- <div className='tree-node-title' onMouseEnter={onShowMenu(true)} onMouseLeave={onShowMenu(false)} >
37
- <span className='tree-node-title-title'>{title}</span>
38
- {!!options.length && showMenu && <Dropdown overlay={menu}><span className='tree-node-title-options'>...</span></Dropdown>}
39
- </div>)
40
- }
41
- // alert()
42
- Tree.OptionBuilder = OptionBuilder
43
-
44
- export {
45
- Tree,
46
- }