1 | import React from 'react'
|
2 | import { AppLoader } from 'edf-app-loader'
|
3 | import componentFactory from './componentFactory'
|
4 | import omit from 'omit.js'
|
5 | import config from './config'
|
6 | import utils from 'edf-utils'
|
7 |
|
8 | function parseMetaProps(meta, props, data) {
|
9 | const ret = {}
|
10 |
|
11 | Object.keys(meta).forEach(key => {
|
12 | let v = meta[key],
|
13 | t = typeof v
|
14 |
|
15 | if (v instanceof Array) {
|
16 | ret[key] = []
|
17 | v.forEach(c => {
|
18 | let mc = metaToComponent(c, props, data)
|
19 | if (mc instanceof Array)
|
20 | ret[key] = ret[key].concat(mc)
|
21 | else
|
22 | ret[key].push(mc)
|
23 | })
|
24 | }
|
25 | else if (t == 'object') {
|
26 | if (v && v._notParse) {
|
27 | ret[key] = v
|
28 | }
|
29 | else {
|
30 | ret[key] = metaToComponent(v, props, data)
|
31 | }
|
32 | }
|
33 | |
34 |
|
35 |
|
36 | else {
|
37 | ret[key] = v
|
38 | }
|
39 | })
|
40 |
|
41 | return ret
|
42 | }
|
43 |
|
44 | function metaToComponent(meta, props, data) {
|
45 | if (!meta)
|
46 | return meta
|
47 |
|
48 | const metaType = typeof meta
|
49 |
|
50 | if (metaType == 'object' && meta['$$typeof']) {
|
51 | return meta
|
52 | }
|
53 | else if (metaType == 'object' && meta['_isAMomentObject']) {
|
54 | return meta
|
55 | }
|
56 | else if (metaType == 'object') {
|
57 |
|
58 | if (meta.component) {
|
59 | if (typeof meta.component == 'function') {
|
60 | meta.component = meta.component()
|
61 | }
|
62 | if (meta['_visible'] === false)
|
63 | return null
|
64 |
|
65 | if (typeof meta['_visible'] === 'function' && meta['_visible']() === false)
|
66 | return null
|
67 |
|
68 | if (meta['_power'] && /for[ ]+in/.test(meta['_power'])) {
|
69 | var p = meta['_power']
|
70 | .replace(/for[ ]+in/, '')
|
71 | .replace(' ', '')
|
72 |
|
73 | if (p.indexOf('_rowIndex') != -1)
|
74 | p = p.replace('_rowIndex', meta.path.split(',').length > 1 ? meta.path.split(',')[1].replace(' ', '') : 0)
|
75 |
|
76 | let items = props.gf(p)
|
77 |
|
78 | if (!items || items.size == 0) return
|
79 | items = items.toJS()
|
80 | return items.map((o, index) => {
|
81 | let childMeta = props.gm(meta.path + ',' + index, undefined, data)
|
82 | delete childMeta._power
|
83 | return metaToComponent(childMeta, props, data)
|
84 | })
|
85 | }
|
86 |
|
87 | if (meta['_power'] && meta['_power'].indexOf('=>') != -1) {
|
88 | return (...args) => {
|
89 | let varsString = ''
|
90 |
|
91 | if (meta['_power'] == '({rowIndex})=>rowIndex') {
|
92 | varsString = (new Function('return (function(_ref) {var rowIndex = _ref.rowIndex;return rowIndex})'))()(...args)
|
93 | }
|
94 | else {
|
95 | varsString = (new Function('return ' + meta['_power']))()(...args)
|
96 | }
|
97 |
|
98 |
|
99 | |
100 |
|
101 |
|
102 |
|
103 |
|
104 |
|
105 |
|
106 |
|
107 |
|
108 |
|
109 |
|
110 | let childMeta = props.gm(meta.path + ',' + varsString, undefined, data)
|
111 | delete childMeta._power
|
112 | return metaToComponent(childMeta, props, data)
|
113 |
|
114 | }
|
115 | }
|
116 |
|
117 | const componentName = meta.component,
|
118 | component = componentFactory.getComponent(props.appName, componentName)
|
119 |
|
120 | var allProps = {
|
121 | key: meta.path,
|
122 | ...props,
|
123 | ...parseMetaProps(meta, props, data),
|
124 | }
|
125 |
|
126 |
|
127 | delete allProps.clearAppState
|
128 | delete allProps.component
|
129 | delete allProps.name
|
130 | delete allProps.getDirectFuns
|
131 | delete allProps.initView
|
132 | delete allProps.payload
|
133 | delete allProps.componentWillMount
|
134 | delete allProps.componentDidMount
|
135 | delete allProps.shouldComponentUpdate
|
136 | delete allProps.componentWillReceiveProps
|
137 | delete allProps.componentWillUpdate
|
138 | delete allProps.componentDidCatch
|
139 | delete allProps.componentWillUnmount
|
140 | delete allProps.componentDidUpdate
|
141 | delete allProps.unmount
|
142 |
|
143 |
|
144 |
|
145 |
|
146 | if (componentName == 'AppLoader') {
|
147 | if (!allProps.appName)
|
148 | return null
|
149 | return React.createElement(component, { ...allProps, key: allProps.appName, name: allProps.appName })
|
150 | }
|
151 |
|
152 | delete allProps.store
|
153 | delete allProps.appName
|
154 | delete allProps.appFullName
|
155 | delete allProps.appQuery
|
156 | delete allProps.appParams
|
157 | delete allProps.storeSubscription
|
158 |
|
159 | return React.createElement(component, allProps)
|
160 | }
|
161 | else {
|
162 | return parseMetaProps(meta, props, data)
|
163 | }
|
164 | }
|
165 | else {
|
166 | return meta
|
167 | }
|
168 | }
|
169 |
|
170 | const MonkeyKing = (props) => {
|
171 | const { path, gm, gf } = props
|
172 | const data = gf().toJS()
|
173 | return metaToComponent(gm(path, undefined, data), props, data)
|
174 | }
|
175 |
|
176 | export default MonkeyKing |
\ | No newline at end of file |