neo-cmp-cli 1.8.3 → 1.8.6-beta.1

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 (193) hide show
  1. package/{src → bin}/index.js +18 -13
  2. package/bin/neo.js +1 -1
  3. package/package.json +4 -3
  4. package/src/main.js +15 -0
  5. package/src/utils/cmpUtils/createCmpByTemplate.js +1 -1
  6. package/src/utils/projectUtils/createCmpProjectByTemplate.js +1 -1
  7. package/template/antd-custom-cmp-template/.prettierrc.js +12 -0
  8. package/template/antd-custom-cmp-template/README.md +153 -0
  9. package/template/antd-custom-cmp-template/commitlint.config.js +59 -0
  10. package/template/antd-custom-cmp-template/neo.config.js +144 -0
  11. package/template/antd-custom-cmp-template/package.json +60 -0
  12. package/template/antd-custom-cmp-template/public/css/base.css +283 -0
  13. package/template/antd-custom-cmp-template/public/scripts/app/bluebird.js +6679 -0
  14. package/template/antd-custom-cmp-template/public/template.html +13 -0
  15. package/template/antd-custom-cmp-template/src/assets/css/common.scss +127 -0
  16. package/template/antd-custom-cmp-template/src/assets/css/mixin.scss +47 -0
  17. package/template/antd-custom-cmp-template/src/assets/img/NeoCRM.jpg +0 -0
  18. package/template/antd-custom-cmp-template/src/assets/img/custom-widget.svg +1 -0
  19. package/template/antd-custom-cmp-template/src/assets/img/favicon.png +0 -0
  20. package/template/antd-custom-cmp-template/src/components/dataDashboard/README.md +39 -0
  21. package/template/antd-custom-cmp-template/src/components/dataDashboard/index.tsx +462 -0
  22. package/template/antd-custom-cmp-template/src/components/dataDashboard/model.ts +75 -0
  23. package/template/antd-custom-cmp-template/src/components/dataDashboard/style.scss +1667 -0
  24. package/template/antd-custom-cmp-template/src/components/infoCard/index.tsx +87 -0
  25. package/template/antd-custom-cmp-template/src/components/infoCard/model.ts +80 -0
  26. package/template/antd-custom-cmp-template/src/components/infoCard/style.scss +105 -0
  27. package/template/antd-custom-cmp-template/tsconfig.json +68 -0
  28. package/template/develop/neo-custom-cmp-template/.prettierrc.js +12 -0
  29. package/template/develop/neo-custom-cmp-template/README.md +48 -0
  30. package/template/develop/neo-custom-cmp-template/commitlint.config.js +59 -0
  31. package/template/develop/neo-custom-cmp-template/docs/README.md +13 -0
  32. package/template/develop/neo-custom-cmp-template/neo.config.js +121 -0
  33. package/template/develop/neo-custom-cmp-template/package.json +63 -0
  34. package/template/develop/neo-custom-cmp-template/public/css/base.css +283 -0
  35. package/template/develop/neo-custom-cmp-template/public/scripts/app/bluebird.js +6679 -0
  36. package/template/develop/neo-custom-cmp-template/public/template.html +13 -0
  37. package/template/develop/neo-custom-cmp-template/src/assets/css/common.scss +127 -0
  38. package/template/develop/neo-custom-cmp-template/src/assets/css/mixin.scss +47 -0
  39. package/template/develop/neo-custom-cmp-template/src/assets/img/NeoCRM.jpg +0 -0
  40. package/template/develop/neo-custom-cmp-template/src/assets/img/custom-widget.svg +1 -0
  41. package/template/develop/neo-custom-cmp-template/src/assets/img/favicon.png +0 -0
  42. package/template/develop/neo-custom-cmp-template/src/assets/img/table.svg +1 -0
  43. package/template/develop/neo-custom-cmp-template/src/components/contactCardList/README.md +65 -0
  44. package/template/develop/neo-custom-cmp-template/src/components/contactCardList/index.tsx +180 -0
  45. package/template/develop/neo-custom-cmp-template/src/components/contactCardList/model.ts +50 -0
  46. package/template/develop/neo-custom-cmp-template/src/components/contactCardList/style.scss +260 -0
  47. package/template/develop/neo-custom-cmp-template/src/components/contactForm/README.md +94 -0
  48. package/template/develop/neo-custom-cmp-template/src/components/contactForm/index.tsx +251 -0
  49. package/template/develop/neo-custom-cmp-template/src/components/contactForm/model.ts +56 -0
  50. package/template/develop/neo-custom-cmp-template/src/components/contactForm/style.scss +120 -0
  51. package/template/develop/neo-custom-cmp-template/src/components/neoEntityGrid/README.md +115 -0
  52. package/template/develop/neo-custom-cmp-template/src/components/neoEntityGrid/index.tsx +304 -0
  53. package/template/develop/neo-custom-cmp-template/src/components/neoEntityGrid/model.ts +87 -0
  54. package/template/develop/neo-custom-cmp-template/src/components/neoEntityGrid/style.scss +127 -0
  55. package/template/develop/neo-custom-cmp-template/src/utils/axiosFetcher.ts +29 -0
  56. package/template/develop/neo-custom-cmp-template/src/utils/queryObjectData.ts +39 -0
  57. package/template/develop/neo-custom-cmp-template/src/utils/xobjects.ts +203 -0
  58. package/template/develop/neo-custom-cmp-template/tsconfig.json +68 -0
  59. package/template/echarts-custom-cmp-template/.prettierrc.js +12 -0
  60. package/template/echarts-custom-cmp-template/README.md +198 -0
  61. package/template/echarts-custom-cmp-template/commitlint.config.js +59 -0
  62. package/template/echarts-custom-cmp-template/neo.config.js +140 -0
  63. package/template/echarts-custom-cmp-template/package.json +61 -0
  64. package/template/echarts-custom-cmp-template/public/css/base.css +283 -0
  65. package/template/echarts-custom-cmp-template/public/scripts/app/bluebird.js +6679 -0
  66. package/template/echarts-custom-cmp-template/public/template.html +13 -0
  67. package/template/echarts-custom-cmp-template/src/assets/css/common.scss +127 -0
  68. package/template/echarts-custom-cmp-template/src/assets/css/mixin.scss +47 -0
  69. package/template/echarts-custom-cmp-template/src/assets/img/NeoCRM.jpg +0 -0
  70. package/template/echarts-custom-cmp-template/src/assets/img/chart.svg +1 -0
  71. package/template/echarts-custom-cmp-template/src/assets/img/custom-widget.svg +1 -0
  72. package/template/echarts-custom-cmp-template/src/assets/img/favicon.png +0 -0
  73. package/template/echarts-custom-cmp-template/src/components/chartWidget/README.md +186 -0
  74. package/template/echarts-custom-cmp-template/src/components/chartWidget/index.tsx +724 -0
  75. package/template/echarts-custom-cmp-template/src/components/chartWidget/model.ts +151 -0
  76. package/template/echarts-custom-cmp-template/src/components/chartWidget/style.scss +209 -0
  77. package/template/echarts-custom-cmp-template/src/components/mapWidget/README.md +125 -0
  78. package/template/echarts-custom-cmp-template/src/components/mapWidget/USAGE.md +190 -0
  79. package/template/echarts-custom-cmp-template/src/components/mapWidget/index.tsx +385 -0
  80. package/template/echarts-custom-cmp-template/src/components/mapWidget/model.ts +107 -0
  81. package/template/echarts-custom-cmp-template/src/components/mapWidget/style.scss +192 -0
  82. package/template/echarts-custom-cmp-template/src/utils/url.ts +82 -0
  83. package/template/echarts-custom-cmp-template/tsconfig.json +68 -0
  84. package/template/empty-cmp/index.tsx +58 -0
  85. package/template/empty-cmp/model.ts +79 -0
  86. package/template/empty-cmp/style.scss +72 -0
  87. package/template/empty-custom-cmp-template/.prettierrc.js +12 -0
  88. package/template/empty-custom-cmp-template/README.md +154 -0
  89. package/template/empty-custom-cmp-template/commitlint.config.js +59 -0
  90. package/template/empty-custom-cmp-template/neo.config.js +138 -0
  91. package/template/empty-custom-cmp-template/package.json +58 -0
  92. package/template/empty-custom-cmp-template/public/css/base.css +283 -0
  93. package/template/empty-custom-cmp-template/public/scripts/app/bluebird.js +6679 -0
  94. package/template/empty-custom-cmp-template/public/template.html +13 -0
  95. package/template/empty-custom-cmp-template/src/assets/css/common.scss +127 -0
  96. package/template/empty-custom-cmp-template/src/assets/css/mixin.scss +47 -0
  97. package/template/empty-custom-cmp-template/src/assets/img/NeoCRM.jpg +0 -0
  98. package/template/empty-custom-cmp-template/src/assets/img/custom-widget.svg +1 -0
  99. package/template/empty-custom-cmp-template/src/assets/img/favicon.png +0 -0
  100. package/template/empty-custom-cmp-template/src/assets/img/map.svg +1 -0
  101. package/template/empty-custom-cmp-template/src/components/README.md +3 -0
  102. package/template/empty-custom-cmp-template/tsconfig.json +68 -0
  103. package/template/neo-custom-cmp-template/.prettierrc.js +12 -0
  104. package/template/neo-custom-cmp-template/README.md +155 -0
  105. package/template/neo-custom-cmp-template/commitlint.config.js +59 -0
  106. package/template/neo-custom-cmp-template/docs/README.md +244 -0
  107. package/template/neo-custom-cmp-template/neo.config.js +140 -0
  108. package/template/neo-custom-cmp-template/package.json +66 -0
  109. package/template/neo-custom-cmp-template/public/css/base.css +283 -0
  110. package/template/neo-custom-cmp-template/public/scripts/app/bluebird.js +6679 -0
  111. package/template/neo-custom-cmp-template/public/template.html +13 -0
  112. package/template/neo-custom-cmp-template/src/assets/css/common.scss +127 -0
  113. package/template/neo-custom-cmp-template/src/assets/css/mixin.scss +47 -0
  114. package/template/neo-custom-cmp-template/src/assets/img/NeoCRM.jpg +0 -0
  115. package/template/neo-custom-cmp-template/src/assets/img/card-list.svg +1 -0
  116. package/template/neo-custom-cmp-template/src/assets/img/contact-form.svg +1 -0
  117. package/template/neo-custom-cmp-template/src/assets/img/custom-form.svg +1 -0
  118. package/template/neo-custom-cmp-template/src/assets/img/custom-widget.svg +1 -0
  119. package/template/neo-custom-cmp-template/src/assets/img/data-list.svg +1 -0
  120. package/template/neo-custom-cmp-template/src/assets/img/detail.svg +1 -0
  121. package/template/neo-custom-cmp-template/src/assets/img/table.svg +1 -0
  122. package/template/neo-custom-cmp-template/src/components/entityCardList/README.md +61 -0
  123. package/template/neo-custom-cmp-template/src/components/entityCardList/index.tsx +202 -0
  124. package/template/neo-custom-cmp-template/src/components/entityCardList/model.ts +74 -0
  125. package/template/neo-custom-cmp-template/src/components/entityCardList/style.scss +260 -0
  126. package/template/neo-custom-cmp-template/src/components/entityDetail/README.md +176 -0
  127. package/template/neo-custom-cmp-template/src/components/entityDetail/index.tsx +334 -0
  128. package/template/neo-custom-cmp-template/src/components/entityDetail/model.ts +123 -0
  129. package/template/neo-custom-cmp-template/src/components/entityDetail/style.scss +292 -0
  130. package/template/neo-custom-cmp-template/src/components/entityForm/README.md +176 -0
  131. package/template/neo-custom-cmp-template/src/components/entityForm/index.tsx +615 -0
  132. package/template/neo-custom-cmp-template/src/components/entityForm/model.ts +107 -0
  133. package/template/neo-custom-cmp-template/src/components/entityForm/style.scss +370 -0
  134. package/template/neo-custom-cmp-template/src/components/entityTable/README.md +92 -0
  135. package/template/neo-custom-cmp-template/src/components/entityTable/index.tsx +784 -0
  136. package/template/neo-custom-cmp-template/src/components/entityTable/model.ts +134 -0
  137. package/template/neo-custom-cmp-template/src/components/entityTable/style.scss +304 -0
  138. package/template/neo-custom-cmp-template/src/utils/axiosFetcher.ts +37 -0
  139. package/template/neo-custom-cmp-template/src/utils/queryObjectData.ts +76 -0
  140. package/template/neo-custom-cmp-template/src/utils/xobjects.ts +162 -0
  141. package/template/neo-custom-cmp-template/tsconfig.json +49 -0
  142. package/template/react-custom-cmp-template/.prettierrc.js +12 -0
  143. package/template/react-custom-cmp-template/README.md +154 -0
  144. package/template/react-custom-cmp-template/commitlint.config.js +59 -0
  145. package/template/react-custom-cmp-template/neo.config.js +137 -0
  146. package/template/react-custom-cmp-template/package.json +57 -0
  147. package/template/react-custom-cmp-template/public/css/base.css +283 -0
  148. package/template/react-custom-cmp-template/public/scripts/app/bluebird.js +6679 -0
  149. package/template/react-custom-cmp-template/public/template.html +13 -0
  150. package/template/react-custom-cmp-template/src/assets/css/common.scss +127 -0
  151. package/template/react-custom-cmp-template/src/assets/css/mixin.scss +47 -0
  152. package/template/react-custom-cmp-template/src/assets/img/NeoCRM.jpg +0 -0
  153. package/template/react-custom-cmp-template/src/assets/img/custom-widget.svg +1 -0
  154. package/template/react-custom-cmp-template/src/assets/img/favicon.png +0 -0
  155. package/template/react-custom-cmp-template/src/components/infoCard/index.jsx +45 -0
  156. package/template/react-custom-cmp-template/src/components/infoCard/model.js +81 -0
  157. package/template/react-custom-cmp-template/src/components/infoCard/style.scss +67 -0
  158. package/template/react-ts-custom-cmp-template/.prettierrc.js +12 -0
  159. package/template/react-ts-custom-cmp-template/README.md +154 -0
  160. package/template/react-ts-custom-cmp-template/commitlint.config.js +59 -0
  161. package/template/react-ts-custom-cmp-template/neo.config.js +138 -0
  162. package/template/react-ts-custom-cmp-template/package.json +59 -0
  163. package/template/react-ts-custom-cmp-template/public/css/base.css +283 -0
  164. package/template/react-ts-custom-cmp-template/public/scripts/app/bluebird.js +6679 -0
  165. package/template/react-ts-custom-cmp-template/public/template.html +13 -0
  166. package/template/react-ts-custom-cmp-template/src/assets/css/common.scss +127 -0
  167. package/template/react-ts-custom-cmp-template/src/assets/css/mixin.scss +47 -0
  168. package/template/react-ts-custom-cmp-template/src/assets/img/NeoCRM.jpg +0 -0
  169. package/template/react-ts-custom-cmp-template/src/assets/img/custom-widget.svg +1 -0
  170. package/template/react-ts-custom-cmp-template/src/assets/img/favicon.png +0 -0
  171. package/template/react-ts-custom-cmp-template/src/assets/img/map.svg +1 -0
  172. package/template/react-ts-custom-cmp-template/src/components/listWidget/README.md +2 -0
  173. package/template/react-ts-custom-cmp-template/src/components/listWidget/index.tsx +208 -0
  174. package/template/react-ts-custom-cmp-template/src/components/listWidget/model.ts +92 -0
  175. package/template/react-ts-custom-cmp-template/src/components/listWidget/style.scss +350 -0
  176. package/template/react-ts-custom-cmp-template/tsconfig.json +68 -0
  177. package/template/vue2-custom-cmp-template/.prettierrc.js +12 -0
  178. package/template/vue2-custom-cmp-template/README.md +154 -0
  179. package/template/vue2-custom-cmp-template/commitlint.config.js +59 -0
  180. package/template/vue2-custom-cmp-template/neo.config.js +146 -0
  181. package/template/vue2-custom-cmp-template/package.json +59 -0
  182. package/template/vue2-custom-cmp-template/public/css/base.css +283 -0
  183. package/template/vue2-custom-cmp-template/public/scripts/app/bluebird.js +6679 -0
  184. package/template/vue2-custom-cmp-template/public/template.html +13 -0
  185. package/template/vue2-custom-cmp-template/src/assets/css/common.scss +126 -0
  186. package/template/vue2-custom-cmp-template/src/assets/css/mixin.scss +47 -0
  187. package/template/vue2-custom-cmp-template/src/assets/img/NeoCRM.jpg +0 -0
  188. package/template/vue2-custom-cmp-template/src/assets/img/custom-widget.svg +1 -0
  189. package/template/vue2-custom-cmp-template/src/assets/img/favicon.png +0 -0
  190. package/template/vue2-custom-cmp-template/src/components/vueInfoCard/index.vue +131 -0
  191. package/template/vue2-custom-cmp-template/src/components/vueInfoCard/model.js +81 -0
  192. package/test/demo.js +2 -2
  193. package/test/deprecate-versions.js +1 -1
@@ -0,0 +1,334 @@
1
+ import * as React from 'react';
2
+ import {
3
+ Card,
4
+ Row,
5
+ Col,
6
+ Spin,
7
+ Empty,
8
+ Descriptions,
9
+ Button,
10
+ Tag,
11
+ Divider,
12
+ Typography,
13
+ } from 'antd';
14
+ import {
15
+ ReloadOutlined,
16
+ InfoCircleOutlined,
17
+ CheckCircleOutlined,
18
+ CloseCircleOutlined,
19
+ } from '@ant-design/icons';
20
+ // @ts-ignore
21
+ import { xObject } from 'neo-open-api'; // Neo OpenAPI SDK
22
+ import './style.scss';
23
+
24
+ const { Title, Text } = Typography;
25
+
26
+ interface EntityDetailProps {
27
+ title?: string;
28
+ xObjectDetailApi?: {
29
+ xObjectApiKey: string;
30
+ objectId: string;
31
+ fieldDescList?: any[];
32
+ autoFetchData?: boolean;
33
+ };
34
+ columnCount?: number;
35
+ showTitle?: boolean;
36
+ data?: any;
37
+ entityData?: any;
38
+ }
39
+
40
+ interface FieldDescription {
41
+ apiKey: string;
42
+ label: string;
43
+ type: string;
44
+ [key: string]: any;
45
+ }
46
+
47
+ interface EntityDetailState {
48
+ detailData: any;
49
+ fieldDescriptions: FieldDescription[];
50
+ loading: boolean;
51
+ error: string | null;
52
+ }
53
+
54
+ export default class EntityDetail extends React.PureComponent<
55
+ EntityDetailProps,
56
+ EntityDetailState
57
+ > {
58
+ constructor(props: EntityDetailProps) {
59
+ super(props);
60
+
61
+ this.state = {
62
+ detailData: {},
63
+ fieldDescriptions: [],
64
+ loading: false,
65
+ error: null,
66
+ };
67
+
68
+ this.loadEntityDetail = this.loadEntityDetail.bind(this);
69
+ this.loadFieldDescriptions = this.loadFieldDescriptions.bind(this);
70
+ }
71
+
72
+ componentDidMount() {
73
+ this.loadData();
74
+ }
75
+
76
+ componentDidUpdate(prevProps: EntityDetailProps) {
77
+ const { xObjectDetailApi } = this.props;
78
+ if (
79
+ xObjectDetailApi?.xObjectApiKey !==
80
+ prevProps.xObjectDetailApi?.xObjectApiKey ||
81
+ xObjectDetailApi?.objectId !== prevProps.xObjectDetailApi?.objectId
82
+ ) {
83
+ this.loadData();
84
+ }
85
+ }
86
+
87
+ async loadData() {
88
+ const { xObjectDetailApi } = this.props;
89
+ if (!xObjectDetailApi?.xObjectApiKey || !xObjectDetailApi?.objectId) {
90
+ this.setState({
91
+ error: '缺少必要参数:实体类型或业务数据ID',
92
+ loading: false,
93
+ });
94
+ return;
95
+ }
96
+
97
+ await Promise.all([this.loadFieldDescriptions(), this.loadEntityDetail()]);
98
+ }
99
+
100
+ async loadFieldDescriptions() {
101
+ const xObjectDetailApi: any = this.props.xObjectDetailApi || {};
102
+ const { autoFetchData } = xObjectDetailApi;
103
+
104
+ if (autoFetchData) {
105
+ // 方式一:直接从 props.xObjectDetailApi 中获取字段描述(当开启「自动获取数据」时可用)
106
+ if (xObjectDetailApi && xObjectDetailApi.fieldDescList) {
107
+ this.setState({ fieldDescriptions: xObjectDetailApi.fieldDescList });
108
+ }
109
+ } else {
110
+ // 方式二:自行通过 OpenAPI SDK 获取字段描述
111
+ if (!xObjectDetailApi.xObjectApiKey) return;
112
+ const result = await xObject.getDesc(xObjectDetailApi.xObjectApiKey);
113
+ if (result?.status) {
114
+ const fields = result.data?.fields || [];
115
+ this.setState({ fieldDescriptions: fields });
116
+ }
117
+ }
118
+ }
119
+
120
+ async loadEntityDetail() {
121
+ const xObjectDetailApi: any = this.props.xObjectDetailApi || {};
122
+ if (!xObjectDetailApi.xObjectApiKey || !xObjectDetailApi.objectId) return;
123
+ const { autoFetchData } = xObjectDetailApi;
124
+
125
+ if (autoFetchData) {
126
+ // 方式一:直接从 props 中取实体数据源相关数据
127
+ const { entityData: detailData } = this.props;
128
+ if (detailData) {
129
+ this.setState({ detailData });
130
+ }
131
+ } else {
132
+ // 方式二:使用 Neo Open API SDK 获取详情数据
133
+ this.setState({ loading: true, error: null });
134
+
135
+ const result = await xObject.get(xObjectDetailApi);
136
+
137
+ if (result?.status) {
138
+ const data = result.data || {};
139
+ this.setState({
140
+ detailData: data,
141
+ loading: false,
142
+ });
143
+ } else {
144
+ this.setState({
145
+ error: result?.msg || '获取详情数据失败',
146
+ loading: false,
147
+ });
148
+ }
149
+ }
150
+ }
151
+
152
+ getFieldLabel(apiKey: string): string {
153
+ const { fieldDescriptions } = this.state;
154
+ const field = fieldDescriptions.find((f) => f.apiKey === apiKey);
155
+ return field?.label || apiKey;
156
+ }
157
+
158
+ getFieldType(apiKey: string): string {
159
+ const { fieldDescriptions } = this.state;
160
+ const field = fieldDescriptions.find((f) => f.apiKey === apiKey);
161
+ return field?.type || 'text';
162
+ }
163
+
164
+ renderFieldValue(value: any, fieldType: string) {
165
+ if (value === null || value === undefined || value === '') {
166
+ return <Text type="secondary">-</Text>;
167
+ }
168
+
169
+ // 根据字段类型渲染不同的值
170
+ switch (fieldType) {
171
+ case 'boolean':
172
+ return value ? (
173
+ <Tag icon={<CheckCircleOutlined />} color="success">
174
+
175
+ </Tag>
176
+ ) : (
177
+ <Tag icon={<CloseCircleOutlined />} color="default">
178
+
179
+ </Tag>
180
+ );
181
+ case 'date':
182
+ case 'datetime':
183
+ return new Date(value).toLocaleString('zh-CN');
184
+ case 'number':
185
+ case 'currency':
186
+ case 'percent':
187
+ return typeof value === 'number'
188
+ ? value.toLocaleString('zh-CN')
189
+ : value;
190
+ case 'url':
191
+ return (
192
+ <a href={value} target="_blank" rel="noopener noreferrer">
193
+ {value}
194
+ </a>
195
+ );
196
+ case 'email':
197
+ return <a href={`mailto:${value}`}>{value}</a>;
198
+ case 'phone':
199
+ return <a href={`tel:${value}`}>{value}</a>;
200
+ default:
201
+ return String(value);
202
+ }
203
+ }
204
+
205
+ renderDetailContent() {
206
+ const { detailData } = this.state;
207
+ const { columnCount = 3 } = this.props;
208
+
209
+ if (!detailData || Object.keys(detailData).length === 0) {
210
+ return (
211
+ <Empty
212
+ image={Empty.PRESENTED_IMAGE_SIMPLE}
213
+ description="暂无详情数据"
214
+ />
215
+ );
216
+ }
217
+
218
+ // 过滤系统字段和空字段
219
+ const displayFields = Object.keys(detailData).filter(
220
+ (key) =>
221
+ // 可以根据需要自定义过滤规则
222
+ !key.startsWith('_') && detailData[key] !== undefined,
223
+ );
224
+
225
+ // 将字段分成多组,每组对应一列
226
+ const fieldsPerColumn = Math.ceil(displayFields.length / columnCount);
227
+ const columnGroups: string[][] = [];
228
+
229
+ for (let i = 0; i < columnCount; i++) {
230
+ const start = i * fieldsPerColumn;
231
+ const end = start + fieldsPerColumn;
232
+ columnGroups.push(displayFields.slice(start, end));
233
+ }
234
+
235
+ return (
236
+ <Row gutter={[24, 24]}>
237
+ {columnGroups.map((fields, colIndex) => (
238
+ <Col xs={24} sm={24} md={24 / columnCount} key={colIndex}>
239
+ <Card className="detail-column-card" bordered={false} size="small">
240
+ <Descriptions
241
+ column={1}
242
+ size="middle"
243
+ bordered
244
+ labelStyle={{
245
+ fontWeight: 500,
246
+ backgroundColor: '#fafafa',
247
+ width: '35%',
248
+ }}
249
+ contentStyle={{
250
+ backgroundColor: '#ffffff',
251
+ }}
252
+ >
253
+ {fields.map((fieldKey) => {
254
+ const fieldType = this.getFieldType(fieldKey);
255
+ const fieldLabel = this.getFieldLabel(fieldKey);
256
+ const fieldValue = detailData[fieldKey];
257
+
258
+ return (
259
+ <Descriptions.Item label={fieldLabel} key={fieldKey}>
260
+ {this.renderFieldValue(fieldValue, fieldType)}
261
+ </Descriptions.Item>
262
+ );
263
+ })}
264
+ </Descriptions>
265
+ </Card>
266
+ </Col>
267
+ ))}
268
+ </Row>
269
+ );
270
+ }
271
+
272
+ render() {
273
+ const { title, showTitle = true } = this.props;
274
+ const { loading, error } = this.state;
275
+ const curAmisData = this.props.data || {};
276
+ const systemInfo = curAmisData.__NeoSystemInfo || {};
277
+ console.log('this.props:', this.props);
278
+
279
+ return (
280
+ <div className="entity-detail-container">
281
+ {showTitle && (
282
+ <div className="detail-header">
283
+ <div className="header-content">
284
+ <Title level={4} className="header-title">
285
+ <InfoCircleOutlined className="title-icon" />
286
+ {title || '实体数据详情'}
287
+ {systemInfo.tenantName ? (
288
+ <Tag color="blue" style={{ marginLeft: 8 }}>
289
+ {systemInfo.tenantName}
290
+ </Tag>
291
+ ) : null}
292
+ </Title>
293
+ <Button
294
+ type="primary"
295
+ icon={<ReloadOutlined />}
296
+ onClick={this.loadEntityDetail}
297
+ loading={loading}
298
+ className="refresh-button"
299
+ size="small"
300
+ >
301
+ 刷新
302
+ </Button>
303
+ </div>
304
+ <Divider style={{ margin: '12px 0' }} />
305
+ </div>
306
+ )}
307
+
308
+ <div className="detail-content">
309
+ <Spin spinning={loading} tip="加载详情数据中...">
310
+ {error ? (
311
+ <div className="error-container">
312
+ <Empty
313
+ image={Empty.PRESENTED_IMAGE_SIMPLE}
314
+ description={
315
+ <div>
316
+ <div style={{ color: '#ff4d4f', marginBottom: 8 }}>
317
+ {error}
318
+ </div>
319
+ <Button type="primary" onClick={this.loadEntityDetail}>
320
+ 重新加载
321
+ </Button>
322
+ </div>
323
+ }
324
+ />
325
+ </div>
326
+ ) : (
327
+ this.renderDetailContent()
328
+ )}
329
+ </Spin>
330
+ </div>
331
+ </div>
332
+ );
333
+ }
334
+ }
@@ -0,0 +1,123 @@
1
+ /**
2
+ * @file 实体数据详情组件对接编辑器的描述文件
3
+ * @description 定义组件在 Neo 平台编辑器中的配置信息
4
+ */
5
+ export class EntityDetailModel {
6
+ /**
7
+ * 组件类型标识
8
+ * 用于标识组件的唯一性,在构建时根据当前组件目录名称自动生成
9
+ * 注意:此字段在构建时会被自动替换,不需要手动设置
10
+ */
11
+ // cmpType: string = 'entityDetail';
12
+
13
+ /** 组件名称,用于设置在编辑器左侧组件面板中展示的名称 */
14
+ label: string = '实体数据详情';
15
+
16
+ /** 组件描述,用于设置在编辑器左侧组件面板中展示的描述 */
17
+ description: string = '展示实体数据详情信息,支持多列布局和字段类型识别';
18
+
19
+ /** 分类标签,用于设置在编辑器左侧组件面板哪个分类中展示(可设置多个分类标签) */
20
+ // tags: string[] = ['自定义组件'];
21
+
22
+ /**
23
+ * 用于设置组件支持的页面类型
24
+ *
25
+ * 当前 NeoCRM 平台存在的页面类型:
26
+ * all: 1 全页面
27
+ * indexPage: 2 首页
28
+ * entityListPage: 3 实体列表页
29
+ * entityFormPage: 4 实体表单页
30
+ * entityDetailPage: 5 实体详情页
31
+ * customPage: 6 自定义页面
32
+ * bizPage: 7 业务页面
33
+ */
34
+ // targetPage: string[] = ['customPage'];
35
+
36
+ /** 组件图标,用于设置在编辑器左侧组件面板中展示的图标 */
37
+ iconSrc: string = 'https://custom-widgets.bj.bcebos.com/detail.svg';
38
+
39
+ /** 初次插入页面的默认属性数据 */
40
+ defaultComProps = {
41
+ title: '实体数据详情',
42
+ xObjectDetailApi: {
43
+ xObjectApiKey: 'account',
44
+ objectId: '',
45
+ },
46
+ columnCount: 3,
47
+ showTitle: true,
48
+ };
49
+
50
+ /**
51
+ * 组件属性配置模式
52
+ * 定义组件在编辑器中可配置的属性
53
+ */
54
+ propsSchema = [
55
+ {
56
+ type: 'text',
57
+ name: 'title',
58
+ label: '标题',
59
+ value: '实体数据详情',
60
+ placeholder: '请输入标题',
61
+ description: '组件顶部显示的标题',
62
+ },
63
+ {
64
+ type: 'switch',
65
+ name: 'showTitle',
66
+ label: '显示标题栏',
67
+ value: true,
68
+ description: '是否显示组件顶部的标题和刷新按钮',
69
+ },
70
+ {
71
+ type: 'xObjectDetailApi', // 用于选取对象业务详情数据的配置项
72
+ name: 'xObjectDetailApi',
73
+ label: '业务详情数据',
74
+ showPage: false,
75
+ showPageSize: false,
76
+ },
77
+ /*
78
+ {
79
+ type: 'xObjectEntityList', // 用于选取实体的配置项
80
+ name: 'xObjectDetailApi.xObjectApiKey',
81
+ label: '实体对象',
82
+ helpText: '请选择要展示详情的实体对象',
83
+ custom: false,
84
+ value: 'account'
85
+ },
86
+ {
87
+ type: 'text',
88
+ name: 'xObjectDetailApi.objectId',
89
+ label: '数据ID',
90
+ value: '',
91
+ placeholder: '请输入数据ID或使用上下文变量',
92
+ description: '要展示的数据记录ID,支持变量:${recordId}',
93
+ },
94
+ */
95
+ {
96
+ type: 'select',
97
+ name: 'columnCount',
98
+ label: '列数',
99
+ value: 3,
100
+ options: [
101
+ {
102
+ label: '1列',
103
+ value: 1,
104
+ },
105
+ {
106
+ label: '2列',
107
+ value: 2,
108
+ },
109
+ {
110
+ label: '3列',
111
+ value: 3,
112
+ },
113
+ {
114
+ label: '4列',
115
+ value: 4,
116
+ },
117
+ ],
118
+ description: '详情页面的列数布局',
119
+ },
120
+ ];
121
+ }
122
+
123
+ export default EntityDetailModel;