@steedos/standard-object-database 2.6.1-beta.7 → 2.6.2-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 (54) hide show
  1. package/main/default/client/coordtransform.client.js +153 -0
  2. package/main/default/client/object_fields.client.js +150 -44
  3. package/main/default/objectTranslations/object_actions.en/object_actions.en.objectTranslation.yml +2 -0
  4. package/main/default/objectTranslations/object_actions.zh-CN/object_actions.zh-CN.objectTranslation.yml +2 -0
  5. package/main/default/objectTranslations/object_fields.en/object_fields.en.objectTranslation.yml +27 -2
  6. package/main/default/objectTranslations/object_fields.zh-CN/object_fields.zh-CN.objectTranslation.yml +32 -4
  7. package/main/default/objectTranslations/object_layouts.en/object_layouts.en.objectTranslation.yml +2 -0
  8. package/main/default/objectTranslations/object_layouts.zh-CN/object_layouts.zh-CN.objectTranslation.yml +2 -0
  9. package/main/default/objectTranslations/object_listviews.en/object_listviews.en.objectTranslation.yml +29 -1
  10. package/main/default/objectTranslations/object_listviews.zh-CN/object_listviews.zh-CN.objectTranslation.yml +27 -1
  11. package/main/default/objectTranslations/object_triggers.en/object_triggers.en.objectTranslation.yml +7 -1
  12. package/main/default/objectTranslations/object_triggers.zh-CN/object_triggers.zh-CN.objectTranslation.yml +8 -2
  13. package/main/default/objectTranslations/object_validation_rules.en/object_validation_rules.en.objectTranslation.yml +2 -0
  14. package/main/default/objectTranslations/object_validation_rules.zh-CN/object_validation_rules.zh-CN.objectTranslation.yml +2 -0
  15. package/main/default/objects/1.objects.observe.object.js +4 -1
  16. package/main/default/objects/7.object_actions.observe.object.js +7 -1
  17. package/main/default/objects/object_actions.action.js +34 -3
  18. package/main/default/objects/object_actions.object.js +4 -2
  19. package/main/default/objects/object_actions.object.yml +26 -1
  20. package/main/default/objects/object_fields.object.js +33 -19
  21. package/main/default/objects/object_fields.object.yml +129 -83
  22. package/main/default/objects/object_layouts.action.js +4 -4
  23. package/main/default/objects/object_layouts.object.yml +16 -2
  24. package/main/default/objects/object_listviews.object.yml +67 -16
  25. package/main/default/objects/object_triggers.object.yml +13 -4
  26. package/main/default/objects/object_validation_rules.object.yml +10 -0
  27. package/main/default/objects/objects/buttons/custom.button.js +48 -0
  28. package/main/default/objects/objects/buttons/custom.button.yml +6 -0
  29. package/main/default/objects/objects.action.js +26 -3
  30. package/main/default/objects/objects.core.js +17 -1
  31. package/main/default/objects/objects.object.js +3 -2
  32. package/main/default/objects/objects.object.yml +28 -2
  33. package/main/default/objects/objects.tree.js +3 -2
  34. package/main/default/pages/design_field_layout.page.amis.json +418 -0
  35. package/main/default/pages/design_field_layout.page.yml +7 -0
  36. package/main/default/pages/object_detail.page.amis.json +6 -6
  37. package/main/default/pages/object_fields_form.page.amis.json +35 -0
  38. package/main/default/pages/{object_fields.page.yml → object_fields_form.page.yml} +5 -5
  39. package/main/default/pages/object_form.page.amis.json +31 -0
  40. package/main/default/pages/object_form.page.yml +12 -0
  41. package/main/default/routes/amis_button_design.router.js +11 -2
  42. package/main/default/routes/amis_listview_design.router.js +11 -2
  43. package/main/default/services/suggestions.service.js +4 -5
  44. package/main/default/triggers/object_actions.trigger.js +6 -2
  45. package/main/default/triggers/object_fields.trigger.js +67 -10
  46. package/main/default/triggers/object_listviews.trigger.js +11 -4
  47. package/main/default/triggers/objects.trigger.js +4 -26
  48. package/package.json +2 -2
  49. package/package.service.js +132 -3
  50. package/src/triggers/index.js +11 -0
  51. package/src/triggers/object_fields_trigger_create_index.js +58 -0
  52. package/main/default/objects/object_layouts/buttons/standard_edit.button.yml +0 -44
  53. package/main/default/pages/object_fields.page.amis.json +0 -42
  54. package/main/default/services/object_fields.service.js +0 -242
@@ -0,0 +1,418 @@
1
+ {
2
+ "type": "page",
3
+ "title": "Welcome to Steedos",
4
+ "body": [
5
+ {
6
+ "type": "service",
7
+ "body": [
8
+ {
9
+ "type": "service",
10
+ "id": "service_field_design",
11
+ "body": [
12
+ {
13
+ "type": "panel",
14
+ "header": {
15
+ "type": "flex",
16
+ "id": "u:b2c8374e93fe",
17
+ "items": [
18
+ {
19
+ "type": "tpl",
20
+ "tpl": "<p><h4><strong>设计字段布局</strong></h4> ${designObjectLabel}<span style=\"color: rgb(149, 165, 166);\"> ${designObjectName}</span></p>",
21
+ "id": "u:4c7bef616400"
22
+ },
23
+ {
24
+ "type": "flex",
25
+ "id": "u:1bfde03380f8",
26
+ "items": [
27
+ {
28
+ "type": "button",
29
+ "id": "u:ec9931ea883c",
30
+ "actionType": "dialog",
31
+ "dialog": {
32
+ "type": "dialog",
33
+ "title": "设置分组",
34
+ "size": "lg",
35
+ "body": [
36
+ {
37
+ "type": "steedos-input-table",
38
+ "fields": [
39
+ {
40
+ "name": "group_name",
41
+ "label": "名称",
42
+ "type": "text",
43
+ "id": "u:31952daa443c"
44
+ },
45
+ {
46
+ "name": "visible_on",
47
+ "label": "显示条件",
48
+ "type": "text",
49
+ "id": "u:8d7551abcd28",
50
+ "value": null
51
+ }
52
+ ],
53
+ "name": "groups",
54
+ "addable": true,
55
+ "editable": true,
56
+ "removable": true,
57
+ "draggable": false,
58
+ "showIndex": false,
59
+ "id": "u:776ec89804c0"
60
+ }
61
+ ],
62
+ "onEvent": {
63
+ "confirm": {
64
+ "actions": [
65
+ {
66
+ "actionType": "custom",
67
+ "script": "//整理分组数据\nlet setting_groups = _.cloneDeep(event.data.groups);\nif (!_.find(setting_groups, { is_default: true })) {\n setting_groups.unshift({\n \"id\": \"未分组\",\n \"group_name\": \"未分组\",\n \"visible_on\": \"\",\n \"is_default\": true\n })\n}\nif (!_.find(setting_groups, { is_hidden: true })) {\n setting_groups.push({\n id: \"隐藏\",\n group_name: \"隐藏\",\n visible_on: \"\",\n is_hidden: true\n });\n}\nsetting_groups.forEach(function (group) {\n if (group.is_hidden) {\n group.group_name = \"隐藏\";\n group.visible_on = \"\";\n }\n if (group.is_default) {\n group.group_name = \"未分组\";\n group.visible_on = \"\";\n }\n if (!group.id) {\n group.id = group.group_name;\n }\n if (!group.visible_on) {\n group.visible_on = \"\"\n }\n})\n\n//整理字段与分组关系的数据\nlet fieldForGroup = {};\nlet oldGroup = _.cloneDeep(event.data.fieldForGroup);\nsetting_groups.forEach(function (group) {\n if (_.has(oldGroup, group.id)) {\n fieldForGroup[group.id] = oldGroup[group.id];\n oldGroup = _.omit(oldGroup, group.id);\n } else {\n fieldForGroup[group.id] = [];\n }\n})\nif (oldGroup && !_.isEmpty(oldGroup)) {\n _.forEach(oldGroup, function (value, key) {\n fieldForGroup[\"未分组\"] = _.unionBy(fieldForGroup[\"未分组\"], value);\n });\n}\n\n//未分组 放在所有分组开头,隐藏 放在所有分组最后\nconst defaultGroup = fieldForGroup[\"未分组\"];\nconst hiddenGroup = fieldForGroup[\"隐藏\"];\ndelete fieldForGroup[\"未分组\"];\ndelete fieldForGroup[\"隐藏\"];\nfieldForGroup = _.merge({ \"未分组\": defaultGroup }, fieldForGroup, { \"隐藏\": hiddenGroup });\n\n//根据fieldForGroup调整groups顺序,设置分组与保存时需要groups按照顺序\nconst keys = _.keys(fieldForGroup);\nsetting_groups = _.sortBy(setting_groups, function (group) { return _.findIndex(keys, function (key) { return key == group.group_name }) });\n\ndoAction({\n actionType: 'setValue',\n componentId: 'service_field_design',\n args: {\n value: {\n groups: setting_groups\n }\n }\n});\n\ndoAction({\n actionType: 'setValue',\n componentId: \"form_field_design\",\n args: {\n value: { design_field: fieldForGroup }\n }\n});"
68
+ }
69
+ ]
70
+ }
71
+ },
72
+ "id": "u:e02c8f59216e",
73
+ "closeOnEsc": false,
74
+ "closeOnOutside": false,
75
+ "showCloseButton": true,
76
+ "showErrorMsg": true,
77
+ "showLoading": true
78
+ },
79
+ "label": "设置分组",
80
+ "className": ""
81
+ },
82
+ {
83
+ "type": "button",
84
+ "label": "新增字段",
85
+ "actionType": "dialog",
86
+ "id": "u:5857ae729799",
87
+ "visible": false,
88
+ "dialog": {
89
+ "type": "dialog",
90
+ "title": "新增字段",
91
+ "data": {
92
+ "appId": "${appId}",
93
+ "global": "${global}",
94
+ "context": "${context}",
95
+ "designObjectName": "${designObjectName}",
96
+ "_master": "${_master}"
97
+ },
98
+ "body": [
99
+ {
100
+ "type": "steedos-object-form",
101
+ "label": "对象表单",
102
+ "objectApiName": "object_fields",
103
+ "recordId": "",
104
+ "mode": "edit",
105
+ "defaultData": {
106
+ "name": "",
107
+ "shared": false,
108
+ "object": "${designObjectName}"
109
+ },
110
+ "fieldsExtend": {
111
+ "object": {
112
+ "amis": {
113
+ "disabledOn": "true"
114
+ }
115
+ },
116
+ "group": {
117
+ "amis": {
118
+ "hidden": true
119
+ }
120
+ }
121
+ },
122
+ "fields": "",
123
+ "id": "u:b71796d3cb8c",
124
+ "className": "mb-4",
125
+ "enableTabs": true,
126
+ "tabsMode": "line"
127
+ }
128
+ ],
129
+ "showCloseButton": true,
130
+ "showErrorMsg": true,
131
+ "showLoading": true,
132
+ "closeOnEsc": false,
133
+ "dataMapSwitch": false,
134
+ "size": "lg",
135
+ "id": "u:066b3884bdd8"
136
+ }
137
+ },
138
+ {
139
+ "type": "button",
140
+ "label": "保存",
141
+ "actionType": "submit",
142
+ "id": "u:d9039421ea6b",
143
+ "target": "form_field_design",
144
+ "level": "primary"
145
+ }
146
+ ]
147
+ }
148
+ ],
149
+ "style": {
150
+ "position": "static",
151
+ "flexWrap": "nowrap",
152
+ "justifyContent": "space-between",
153
+ "alignItems": "baseline"
154
+ },
155
+ "isFixedHeight": false,
156
+ "isFixedWidth": false
157
+ },
158
+ "body": [
159
+ {
160
+ "type": "form",
161
+ "title": "",
162
+ "body": [
163
+ {
164
+ "type": "steedos-board",
165
+ "id": "steedos_field_deign",
166
+ "columns": 2,
167
+ "name": "design_field",
168
+ "boardSource": "${groups}",
169
+ "boardClassName": "bg-gray-50 p-2 ",
170
+ "header": {
171
+ "className": ""
172
+ },
173
+ "boardHeader": {
174
+ "type": "tpl",
175
+ "tpl": "${group_name}",
176
+ "id": "u:76d9a6c7d401"
177
+ },
178
+ "cardClassName": "p-1 bg-white border w-full rounded shadow",
179
+ "cardSchema": {
180
+ "type": "card",
181
+ "body": [
182
+ {
183
+ "type": "tpl",
184
+ "tpl": "<p><strong>${label}</strong> ${designObjectLabel}<span style=\"color: rgb(149, 165, 166);\">${_name}</span></p>",
185
+ "className": "w-4/5 field-amplify",
186
+ "inline": true,
187
+ "onEvent": {
188
+ "click": {
189
+ "actions": [
190
+ {
191
+ "actionType": "dialog",
192
+ "dialog": {
193
+ "type": "dialog",
194
+ "title": "编辑字段",
195
+ "data": {
196
+ "appId": "${appId}",
197
+ "global": "${global}",
198
+ "context": "${context}",
199
+ "designObjectName": "${designObjectName}",
200
+ "_master": "${_master}",
201
+ "_id": "${_id}"
202
+ },
203
+ "body": [
204
+ {
205
+ "type": "steedos-object-form",
206
+ "label": "对象表单",
207
+ "objectApiName": "object_fields",
208
+ "recordId": "${_id}",
209
+ "mode": "edit",
210
+ "defaultData": {
211
+ "name": "",
212
+ "shared": false,
213
+ "object": "${designObjectName}"
214
+ },
215
+ "fields": [
216
+ "label",
217
+ "readonly",
218
+ "is_wide"
219
+ ],
220
+ "fieldsExtend": {
221
+ "label": {
222
+ "is_wide": true,
223
+ "group": ""
224
+ },
225
+ "readonly": {
226
+ "group": ""
227
+ },
228
+ "is_wide": {
229
+ "group": ""
230
+ }
231
+ },
232
+ "id": "u:b71796d3cb8c",
233
+ "className": "mb-4",
234
+ "apiRequestAdaptor": "api.data.query = api.data.query.replace('object_fields__update', 'object_fields__upsert')",
235
+ "onEvent": {
236
+ "submitSucc": {
237
+ "weight": 0,
238
+ "actions": [
239
+ {
240
+ "actionType": "custom",
241
+ "script": "setTimeout(() => {\n doAction({\n \"actionType\": \"broadcast\",\n \"args\": {\n \"eventName\": \"@data.changed.object_fields\"\n }\n });\n}, 500);\n\n\n"
242
+ }
243
+ ]
244
+ }
245
+ }
246
+ }
247
+ ],
248
+ "showCloseButton": true,
249
+ "showErrorMsg": true,
250
+ "showLoading": true,
251
+ "closeOnEsc": false,
252
+ "dataMapSwitch": false,
253
+ "size": "md",
254
+ "id": "u:066b3884bdd8"
255
+ }
256
+ }
257
+ ]
258
+ }
259
+ }
260
+ }
261
+ ],
262
+ "bodyClassName": "h-7 flex justify-between items-center p-0 pl-10 my-2",
263
+ "toolbar": [
264
+ ],
265
+ "className": "mb-0 border-0 bg-none card",
266
+ "id": "u:296298da1bef"
267
+ },
268
+ "cardSource": "${fields}",
269
+ "vertical": true,
270
+ "onEvent": {
271
+ "change": {
272
+ "actions": [
273
+ {
274
+ "actionType": "custom",
275
+ "script": "const newGroups = _.keys(event.data.value);\nconst lastGroups = _.map(context.props.data.groups, 'group_name');\nif (newGroups != lastGroups) {\n doAction({\n actionType: 'setValue',\n componentId: 'service_field_design',\n args: {\n value: {\n fieldForGroup: event.data.value, groups: field_groups = _.sortBy(context.props.data.groups, function (group) { return _.findIndex(newGroups, function (group_name) { return group.group_name === group_name; }); })\n }\n }\n });\n}\n"
276
+ }
277
+ ]
278
+ }
279
+ },
280
+ "value": "${fieldForGroup}"
281
+ }
282
+ ],
283
+ "id": "form_field_design",
284
+ "api": {
285
+ "url": "${context.rootUrl}/graphql",
286
+ "method": "post",
287
+ "dataType": "json",
288
+ "headers": {
289
+ "Authorization": "Bearer ${context.tenantId},${context.authToken}"
290
+ },
291
+ "requestAdaptor": "var graphqlOrder = \"\";\n//先修改字段,使系统对象自行自定义\n//根据design_field,修改对象字段的sort_no与groups\nvar index = 1;\n_.forEach(api.data.design_field, function (items, key) {\n let group = key;\n if (key == \"未分组\" || key == \"隐藏\") {\n group = null;\n }\n _.forEach(items, function (item) {\n const field = _.find(api.data.fields, { 'id': item });\n //如果是在隐藏分组里的字段,就给visible_on属性赋予{{false}};如果不在隐藏分组里,就判断来自数据库内的visible_on属性是不是{{false}},是就清除,不是就保持不变\n const visible_on = key == \"隐藏\" ? \"{{false}}\" : (field.attr_visible_on == \"{{false}}\" ? \"{{true}}\" : field.attr_visible_on);\n let docJson = {\n sort_no: index * 10,\n group, visible_on\n }\n if (field.id == field._id && field.is_system) {\n docJson = {\n object: api.data.$self.designObjectName,\n type: field.type,\n _name: field._name,\n label: field.label,\n sort_no: index * 10,\n group,\n visible_on,\n is_system: field.is_system\n }\n }\n if (key != \"隐藏\") {\n docJson.hidden = false;\n }\n let itemOrder = 'upsert' + index + ':object_fields__upsert(id:\"' + item + '\" , doc:' + JSON.stringify(JSON.stringify(docJson)) + '){_id}\\n';\n graphqlOrder += itemOrder;\n index++;\n })\n})\n\n//根据groups,修改对象的字段分组field_groups\nvar field_groups = _.cloneDeep(api.data.groups);\n_.remove(field_groups, { is_default: true });\n_.remove(field_groups, { is_hidden: true });\nfield_groups = field_groups.map(function (group) {\n return _.omit(group, 'id');\n})\nconst keys = _.keys(api.data.design_field);\nfield_groups = _.sortBy(field_groups, function (group) { return _.findIndex(keys, function (key) { return key == group.group_name }) });\nconst groupOrder = 'upsert0:objects__upsert(id:\"' + api.data.$self.designObjectId + '\" , doc:' + JSON.stringify(JSON.stringify({ field_groups, name: api.data.$self.designObjectName })) + ') {_id}';\ngraphqlOrder += groupOrder;\n\n\ngraphqlOrder = 'mutation {' + graphqlOrder + '}';\nreturn {\n ...api,\n data: {\n query: graphqlOrder\n }\n}",
292
+ "adaptor": "if (payload.errors) {\n payload.status = 2;\n payload.msg = window.t ? window.t(payload.errors[\n 0\n ].message) : payload.errors[\n 0\n ].message;\n}\nreturn payload;",
293
+ "messages": {
294
+ },
295
+ "data": {
296
+ "design_field": "${design_field}",
297
+ "groups": "${groups}",
298
+ "fields": "${fields}",
299
+ "$self": "$$"
300
+ }
301
+ },
302
+ "visibleOn": "${dataInitialed}",
303
+ "wrapWithPanel": false,
304
+ "name": "form_field_design",
305
+ "onEvent": {
306
+ "submitSucc": {
307
+ "weight": 0,
308
+ "actions": [
309
+ {
310
+ "actionType": "custom",
311
+ "script": "setTimeout(() => {\n doAction({\n \"actionType\": \"broadcast\",\n \"args\": {\n \"eventName\": \"@data.changed.object_fields\"\n }\n });\n}, 500);\n\n\n"
312
+ }
313
+ ]
314
+ }
315
+ }
316
+ }
317
+ ],
318
+ "className": "Panel--default max-w-4xl m-auto",
319
+ "id": "u:3a90104cb6b4"
320
+ }
321
+ ],
322
+ "api": {
323
+ "method": "post",
324
+ "url": "${context.rootUrl}/graphql?designObjectId=${designObjectId}",
325
+ "data": {
326
+ "query": "{fields:object_fields(filters: [[\"object\",\"=\",\"${designObjectName}\"]],sort: \"sort_no asc\"){_id,label,_name,group,type,sort_no,modified,is_wide,is_system,hidden,visible_on,recordPermissions: _permissions{allowEdit}}}",
327
+ "field_groups": "${field_groups}",
328
+ "dataInitialed": "${dataInitialed}",
329
+ "designObjectName": "${designObjectName}",
330
+ "eventData": "${eventData}",
331
+ "fieldForGroup": "${fieldForGroup}"
332
+ },
333
+ "headers": {
334
+ "Authorization": "Bearer ${context.tenantId},${context.authToken}"
335
+ },
336
+ "messages": {
337
+ },
338
+ "requestAdaptor": "",
339
+ "adaptor": "//筛选出可编辑的字段\r\nvar oldFields = _.filter(payload.data.fields, function (obj) { return obj.recordPermissions.allowEdit; });\r\n//将group为空的字段分为未分组的组中,将系统字段的_id改为对象名.字段名\r\noldFields = _.map(oldFields, function (obj) {\r\n obj.originId = obj._id;\r\n if (obj.hidden || obj.visible_on == \"{{false}}\") {\r\n obj.group = \"隐藏\";\r\n }else if (obj.group === null) {\r\n obj.group = \"未分组\";\r\n }\r\n if (obj.is_system) {\r\n obj._id = api.data.designObjectName + \".\" + obj._name;\r\n }\r\n return obj;\r\n});\r\n\r\n//整合出字段的属性集合\r\nconst fields = oldFields.map((field) => {\r\n return {\r\n \"id\": field._id,//用与steedos-board组件的关系分辨\r\n \"_name\": field._name,\r\n \"label\": field.label,\r\n \"_id\": field.originId,//用于打开steedos-objectform\r\n \"columnSpan\": field.is_wide ? 2 : 1,\r\n \"is_system\": field.is_system,\r\n \"type\": field.type,\r\n \"attr_visible_on\": field.visible_on\r\n }\r\n})\r\n\r\n//从字段的group属性中,整合出字段分组的属性集合\r\nlet field_groups = _.map(_.uniqBy(oldFields, \"group\"), function (obj) {\r\n return {\r\n \"id\": obj.group,\r\n \"group_name\": obj.group,\r\n \"visible_on\": \"\"\r\n };\r\n});\r\n\r\n//合并对象上的field_groups与字段上的group\r\nlet groups = _.unionBy(api.data.field_groups, field_groups, 'id');\r\n\r\n//判断是否第一次调用接口,不是的话(说明是触发了datachange事件),返回fields与fieldUpdateData\r\nif (api.data.dataInitialed) {\r\n const eventData = api.data.eventData;\r\n let fieldUpdateData = \"\";\r\n const fieldForGroup = api.data.fieldForGroup;\r\n let fieldForGroupLength = 0;\r\n _.forIn(fieldForGroup, function (value, key) {\r\n fieldForGroupLength += value.length;\r\n });\r\n if (fieldForGroupLength < fields.length) {\r\n fieldUpdateData = {\r\n type: \"insert\",\r\n id: eventData.result.data.recordId\r\n }\r\n } else if (fieldForGroupLength > fields.length) {\r\n fieldUpdateData = {\r\n type: \"delete\",\r\n id: eventData._id\r\n }\r\n }\r\n return payload = {\r\n data: {\r\n fields,\r\n fieldUpdateData\r\n }\r\n }\r\n}\r\n\r\n//整合字段与分组的关系\r\nconst oldFieldsInGroups = _.groupBy(oldFields, \"group\");\r\nlet fieldForGroup = _.mapValues(_.groupBy(groups, \"id\"), function (group,key) {\r\n if (oldFieldsInGroups[key]) {\r\n return _.map(oldFieldsInGroups[key], function (obj) {\r\n return obj._id;\r\n });\r\n } else {\r\n return [];\r\n }\r\n});\r\n\r\n//未分组 放在所有分组开头,隐藏 放在所有分组最后\r\nconst defaultGroup = fieldForGroup[\"未分组\"];\r\nconst hiddenGroup = fieldForGroup[\"隐藏\"];\r\ndelete fieldForGroup[\"未分组\"];\r\ndelete fieldForGroup[\"隐藏\"];\r\nfieldForGroup = _.merge({ \"未分组\": defaultGroup }, fieldForGroup, { \"隐藏\": hiddenGroup });\r\n\r\n//根据fieldForGroup调整groups顺序,设置分组与保存时需要groups按照顺序\r\nconst keys = _.keys(fieldForGroup);\r\ngroups = _.sortBy(groups, function (group) { return _.findIndex(keys, function (key) { return key == group.group_name }) });\r\n\r\nreturn payload = {\r\n data: {\r\n fields,\r\n groups,\r\n fieldForGroup,\r\n dataInitialed: true\r\n }\r\n};",
340
+ "sendOn": "!!this.designObjectId"
341
+ },
342
+ "messages": {
343
+ },
344
+ "onEvent": {
345
+ "fetchInited": {
346
+ "actions": [
347
+ {
348
+ "actionType": "custom",
349
+ "script": "\nconst fieldForGroup = context.props.data.fieldForGroup;\nconst fieldUpdateData = event.data.fieldUpdateData;\nif (fieldUpdateData && fieldUpdateData.type == \"delete\") {\n _.forIn(fieldForGroup, function (group, group_name) {\n _.remove(group, function (field) {\n return field === fieldUpdateData.id;\n })\n });\n} else if (fieldUpdateData && fieldUpdateData.type == \"insert\") {\n fieldForGroup[\"未分组\"].push(fieldUpdateData.id);\n}\n// doAction({\n// actionType: 'setValue',\n// componentId: \"service_field_design\",\n// args: {\n// value: { fieldForGroup }\n// }\n// });\n\ndoAction({\n actionType: 'setValue',\n componentId: \"form_field_design\",\n args: {\n value: { design_field:fieldForGroup }\n }\n});\n\n",
350
+ "expression": "${event.data.fieldUpdateData}"
351
+ }
352
+ ]
353
+ }
354
+ },
355
+ "initFetch": false,
356
+ "data": {
357
+ "eventData": ""
358
+ }
359
+ }
360
+ ],
361
+ "id": "u:02f594329e1e",
362
+ "api": {
363
+ "method": "post",
364
+ "url": "${context.rootUrl}/graphql",
365
+ "data": {
366
+ "query": "{objects(filters: [[\"name\",\"=\",\"${designObjectName}\"]]){_id,name,label,field_groups}}"
367
+ },
368
+ "headers": {
369
+ "Authorization": "Bearer ${context.tenantId},${context.authToken}"
370
+ },
371
+ "messages": {
372
+ },
373
+ "requestAdaptor": "",
374
+ "adaptor": "const field_groups = payload.data.objects[0] && _.map(payload.data.objects[0].field_groups, function (obj) {\r\n return {\r\n \"id\": obj.group_name,\r\n \"group_name\": obj.group_name,\r\n \"visible_on\": obj.visible_on\r\n }\r\n});\r\nfield_groups.unshift({\r\n id: \"隐藏\",\r\n group_name: \"隐藏\",\r\n visible_on: \"\",\r\n is_hidden: true\r\n});\r\nfield_groups.unshift({\r\n id: \"未分组\",\r\n group_name: \"未分组\",\r\n visible_on: \"\",\r\n is_default: true\r\n});\r\n\r\n\r\n\r\nconst designObjectId = payload.data.objects[0] && payload.data.objects[0]._id;\r\nreturn payload = {\r\n data: {\r\n field_groups,\r\n designObjectId,\r\n designObjectLabel: payload.data.objects[0] && payload.data.objects[0].label,\r\n _master: {\r\n recordId: designObjectId\r\n }\r\n }\r\n}"
375
+ },
376
+ "messages": {
377
+ },
378
+ "onEvent": {
379
+ "@data.changed.object_fields": {
380
+ "actions": [
381
+ {
382
+ "actionType": "reload",
383
+ "data": {
384
+ "eventData": "${event.data}"
385
+ },
386
+ "componentId": "service_field_design"
387
+ }
388
+ ]
389
+ }
390
+ }
391
+ }
392
+ ],
393
+ "regions": [
394
+ "body"
395
+ ],
396
+ "data": {
397
+ "initialValues": {
398
+ },
399
+ "appId": "builder",
400
+ "title": "",
401
+ "context": "${context}",
402
+ "dataInitialed": false
403
+ },
404
+ "id": "u:993ee4316643",
405
+ "css": {
406
+ ".antd-TplField p": {
407
+ "margin": "0.625rem 0.625rem"
408
+ },
409
+ ".steedos-design-field li.p-1 .field-amplify:hover": {
410
+ "font-size": "17px"
411
+ }
412
+ },
413
+ "className": "steedos-design-field",
414
+ "asideResizor": false,
415
+ "pullRefresh": {
416
+ "disabled": true
417
+ }
418
+ }
@@ -0,0 +1,7 @@
1
+ name: design_field_layout
2
+ is_active: true
3
+ label: 设计字段布局
4
+ pageAssignments: []
5
+ render_engine: amis
6
+ type: app
7
+ widgets: []
@@ -125,18 +125,18 @@
125
125
  ]
126
126
  },
127
127
  {
128
- "title": "${'objects_amis_process_mapping' | t}",
128
+ "title": "${'objects_amis_object_workflows' | t}",
129
+ "hiddenOn": "${_master.record.enable_workflow != true}",
129
130
  "body": [
130
131
  {
131
132
  "type": "steedos-object-related-listview",
132
133
  "objectApiName": "objects",
133
134
  "recordId": "${recordId}",
134
135
  "relatedObjectApiName": "object_workflows",
135
- "perPage": 20,
136
- "id": "u:e14df76cfa51"
136
+ "relatedKey": "object_name",
137
+ "perPage": 20
137
138
  }
138
- ],
139
- "id": "u:cbc13e1a7033"
139
+ ]
140
140
  },
141
141
  {
142
142
  "title": "${'objects_amis_validation_rule' | t}",
@@ -179,7 +179,7 @@
179
179
  ],
180
180
  "id": "u:6a3b45d7adcf",
181
181
  "tabsMode": "vertical",
182
- "className": "object-detail-tabs mt-3 bg-white border-b sm:shadow sm:rounded sm:border border-slate-300",
182
+ "className": "object-detail-tabs mt-3 bg-white border-b sm:rounded sm:border border-gray-300",
183
183
  "toolbarClassName": "",
184
184
  "linksClassName": "",
185
185
  "contentClassName": "bg-white",
@@ -0,0 +1,35 @@
1
+ {
2
+ "type": "service",
3
+ "body": [
4
+ {
5
+ "type": "steedos-object-form",
6
+ "label": "对象字段表单",
7
+ "objectApiName": "object_fields",
8
+ "recordId": "${recordId}",
9
+ "className": "",
10
+ "enableTabs": true,
11
+ "mode": "edit",
12
+ "layout": "normal",
13
+ "apiRequestAdaptor": "api.data.query = api.data.query.replace('object_fields__update', 'object_fields__upsert')",
14
+ "submitSuccActions": [
15
+ {
16
+ "actionType": "custom",
17
+ "script": "setTimeout(function(){doAction({'actionType': 'setValue','componentId': 'form_object_fields','args': {'value': {'sort_no': event.data.sort_no + 10}}})}, 300)"
18
+ },
19
+ {
20
+ "actionType": "toast",
21
+ "args": {
22
+ "msgType": "success",
23
+ "msg": "操作成功, 请刷新浏览器后查看效果",
24
+ "position": "top-right"
25
+ }
26
+ }
27
+ ]
28
+ }
29
+ ],
30
+ "data": {
31
+ "context": {}
32
+ },
33
+ "name": "object_fields_form",
34
+ "id": "u:bb11df394baf"
35
+ }
@@ -1,12 +1,12 @@
1
- name: object_fields
1
+ name: object_fields_form
2
2
  is_active: true
3
3
  label: 对象字段表单
4
4
  object_name: object_fields
5
5
  pageAssignments:
6
- - desktop: true
7
- mobile: true
6
+ - type: orgDefault
8
7
  page: object_fields_form
9
- type: orgDefault
8
+ desktop: true
9
+ mobile: true
10
10
  render_engine: amis
11
11
  type: form
12
- widgets: []
12
+ widgets: []
@@ -0,0 +1,31 @@
1
+ {
2
+ "type": "service",
3
+ "body": [
4
+ {
5
+ "type": "steedos-object-form",
6
+ "label": "对象表单",
7
+ "objectApiName": "objects",
8
+ "recordId": "${recordId}",
9
+ "className": "",
10
+ "enableTabs": true,
11
+ "mode": "edit",
12
+ "layout": "normal",
13
+ "apiRequestAdaptor": "console.log('api.data.query===', api.data.query);api.data.query = api.data.query.replace('objects__update', 'objects__upsert')",
14
+ "submitSuccActions": [
15
+ {
16
+ "actionType": "toast",
17
+ "args": {
18
+ "msgType": "success",
19
+ "msg": "操作成功, 请刷新浏览器后查看效果",
20
+ "position": "top-right"
21
+ }
22
+ }
23
+ ]
24
+ }
25
+ ],
26
+ "data": {
27
+ "context": {}
28
+ },
29
+ "name": "object_fields_form",
30
+ "id": "u:bb11df394baf"
31
+ }
@@ -0,0 +1,12 @@
1
+ name: object_form
2
+ is_active: true
3
+ label: 对象表单
4
+ object_name: objects
5
+ pageAssignments:
6
+ - type: orgDefault
7
+ page: object_form
8
+ desktop: true
9
+ mobile: true
10
+ render_engine: amis
11
+ type: form
12
+ widgets: []
@@ -10,12 +10,21 @@ const ejs = require('ejs');
10
10
  const fs = require('fs');
11
11
  const _ = require('lodash');
12
12
  const path = require('path');
13
-
13
+ const getPublicAssetUrls = function(assetUrls){
14
+ const values = _.map(_.split(assetUrls), (item)=>{
15
+ if(_.startsWith(item, '/')){
16
+ return Meteor.absoluteUrl(item) ;
17
+ }else{
18
+ return item;
19
+ }
20
+ })
21
+ return _.join(values, ',')
22
+ }
14
23
  router.get('/api/amisButtonDesign', core.requireAuthentication, async function (req, res) {
15
24
  try {
16
25
  res.set('Content-Type', 'text/html');
17
26
  const userSession = req.user;
18
- let assetUrls = req.query.assetUrls;
27
+ let assetUrls = getPublicAssetUrls(req.query.assetUrls);
19
28
  const assetUrl = `assetUrl=${assetUrls.split(',').join("&assetUrl=")}&`;
20
29
 
21
30
  // const dataContext = {
@@ -11,12 +11,21 @@ const fs = require('fs');
11
11
  const _ = require('lodash');
12
12
  const path = require('path');
13
13
  const objectql = require('@steedos/objectql');
14
-
14
+ const getPublicAssetUrls = function(assetUrls){
15
+ const values = _.map(_.split(assetUrls), (item)=>{
16
+ if(_.startsWith(item, '/')){
17
+ return Meteor.absoluteUrl(item) ;
18
+ }else{
19
+ return item;
20
+ }
21
+ })
22
+ return _.join(values, ',')
23
+ }
15
24
  router.get('/api/amisListviewDesign', core.requireAuthentication, async function (req, res) {
16
25
  try {
17
26
  res.set('Content-Type', 'text/html');
18
27
  const userSession = req.user;
19
- let assetUrls = req.query.assetUrls;
28
+ let assetUrls = getPublicAssetUrls(req.query.assetUrls);
20
29
  const assetUrl = `assetUrl=${assetUrls.split(',').join("&assetUrl=")}&`;
21
30
  // const dataContext = {
22
31
  // rootUrl: __meteor_runtime_config__.ROOT_URL,
@@ -36,10 +36,8 @@ module.exports = {
36
36
  objectsTypes = objectsTypes + '}'
37
37
 
38
38
  return `
39
- declare var _: any;
40
- declare var moment: any;
41
- declare var validator: any;
42
- declare var Filters: any;
39
+
40
+ declare var global = {_: any, moment: any, validator: any, filters: any};
43
41
 
44
42
  declare type TriggerParams = {
45
43
  isInsert?: boolean;
@@ -76,7 +74,7 @@ module.exports = {
76
74
  logger: any;
77
75
  metadata: any;
78
76
  },
79
- getObject(objectName: string): any;
77
+ getObject(objectName: string): SteedosObjectType;
80
78
  getUser(userId: string, spaceId: string): Promise<SteedosUserSession>;
81
79
  makeNewID(): string;
82
80
  };
@@ -125,6 +123,7 @@ module.exports = {
125
123
  directUpdate(id: SteedosIDType, doc: Dictionary<any>, userSession?: SteedosUserSession): Promise<any>;
126
124
  directDelete(id: SteedosIDType, userSession?: SteedosUserSession): Promise<any>;
127
125
  count(query: SteedosQueryOptions, userSession?: SteedosUserSession): Promise<any>;
126
+ _makeNewID(): Promise<any>;
128
127
  }
129
128
  ${objectsTypes}
130
129
  ${servicesTypes}