@steedos/standard-object-database 2.7.1-beta.7 → 2.7.1-beta.9
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.
- package/main/default/objectTranslations/objects.en/objects.en.objectTranslation.yml +4 -0
- package/main/default/objectTranslations/objects.zh-CN/objects.zh-CN.objectTranslation.yml +4 -0
- package/main/default/objects/object_fields/fields/auto_fill_mapping.$.from.field.yml +8 -6
- package/main/default/objects/object_fields/fields/auto_fill_mapping.$.to.field.yml +13 -0
- package/main/default/objects/object_fields/fields/auto_fill_mapping.field.yml +1 -1
- package/main/default/objects/object_fields/fields/is_name.field.yml +1 -0
- package/main/default/objects/object_fields/fields/sortable.field.yml +0 -1
- package/main/default/objects/object_webhooks/fields/fields.field.yml +1 -0
- package/main/default/objects/objects/fields/enable_form_tabs.field.yml +6 -0
- package/main/default/pages/design_field_layout.page.amis.json +4 -4
- package/main/default/pages/object_fields_form.page.amis.json +26 -10
- package/main/default/pages/object_webhooks_form.page.amis.json +1 -1
- package/main/default/server/object_fields.object.js +4 -2
- package/main/default/services/object_webhooks.service.js +12 -7
- package/main/default/triggers/datasources.trigger.js +4 -2
- package/main/default/triggers/object_actions.trigger.js +6 -4
- package/main/default/triggers/object_fields.trigger.js +3 -25
- package/main/default/triggers/object_validation_rules.trigger.js +4 -5
- package/package.json +6 -5
|
@@ -54,6 +54,10 @@ fields:
|
|
|
54
54
|
label: Enable Notes
|
|
55
55
|
help:
|
|
56
56
|
description:
|
|
57
|
+
enable_form_tabs:
|
|
58
|
+
label: Enable Form Tabs
|
|
59
|
+
help: This feature exclusively affects the editable pages, with precedence given to configurations specified on the components.
|
|
60
|
+
description:
|
|
57
61
|
enable_events:
|
|
58
62
|
label: Enable Events
|
|
59
63
|
help:
|
|
@@ -4,17 +4,19 @@ depend_on:
|
|
|
4
4
|
filtersFunction: !<tag:yaml.org,2002:js/function> |-
|
|
5
5
|
function(filters,values
|
|
6
6
|
) {
|
|
7
|
-
|
|
8
|
-
|
|
7
|
+
var currentFilter = [];
|
|
8
|
+
//当前字段为多选时,from的字段不能选择multiple为true的
|
|
9
|
+
if (values.multiple) {
|
|
10
|
+
currentFilter.push(['multiple', '!=', true]);
|
|
11
|
+
}
|
|
9
12
|
|
|
10
13
|
if(values && values.reference_to){
|
|
11
|
-
|
|
14
|
+
currentFilter.push(['object', '=', values.reference_to]);
|
|
12
15
|
}else{
|
|
13
|
-
|
|
16
|
+
currentFilter.push(['_id', '=', 'no']);
|
|
14
17
|
}
|
|
15
18
|
|
|
16
|
-
|
|
17
|
-
|
|
19
|
+
return currentFilter;
|
|
18
20
|
}
|
|
19
21
|
group: auto_fill
|
|
20
22
|
hidden: false
|
|
@@ -24,6 +24,19 @@ filtersFunction: !<tag:yaml.org,2002:js/function> |-
|
|
|
24
24
|
var referenceObject = BuilderAmisObject && BuilderAmisObject.AmisLib && BuilderAmisObject.AmisLib.getUISchemaSync(values.reference_to);
|
|
25
25
|
var fromField = referenceObject && referenceObject.fields[values.from];
|
|
26
26
|
|
|
27
|
+
if (values.multiple) {
|
|
28
|
+
//当前字段为多选时,若from的字段类型为lookup、master_detail、select时,to的字段则必须选择multiple为true的
|
|
29
|
+
if (_.includes(["lookup","master_detail","select"], fromField.type)) {
|
|
30
|
+
currentFilter.push(['multiple', '=', true]);
|
|
31
|
+
}
|
|
32
|
+
}else {
|
|
33
|
+
//当前字段为单选时,若from的字段多选,to的字段则也必须多选;若from不是多选,则to也不能是多选
|
|
34
|
+
if (fromField.multiple){
|
|
35
|
+
currentFilter.push(['multiple', '=', true]);
|
|
36
|
+
} else {
|
|
37
|
+
currentFilter.push(['multiple', '!=', true]);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
27
40
|
if (fromField && fromField.data_type) {
|
|
28
41
|
currentFilter.push(['type', 'in', fieldFilters[fromField.data_type] || fromField.data_type.split()]);
|
|
29
42
|
}else if (fromField) {
|
|
@@ -162,7 +162,7 @@
|
|
|
162
162
|
"actions": [
|
|
163
163
|
{
|
|
164
164
|
"actionType": "custom",
|
|
165
|
-
"script": "///整理分组数据\nconst defaultGroupName = \"未分组\";\nconst hiddenGroupName = \"隐藏\";\nlet setting_groups = _.cloneDeep(event.data.groups);\nif (!_.find(setting_groups, { is_default: true })) {\n setting_groups.unshift({\n \"id\":
|
|
165
|
+
"script": "///整理分组数据\nconst defaultGroupName = \"未分组\";\nconst hiddenGroupName = \"隐藏\";\nlet setting_groups = _.cloneDeep(event.data.groups);\nif (!_.find(setting_groups, { is_default: true })) {\n setting_groups.unshift({\n \"id\": \"default-group\",\n \"group_name\": defaultGroupName,\n \"visible_on\": \"\",\n \"is_default\": true\n })\n}\nif (!_.find(setting_groups, { is_hidden: true })) {\n setting_groups.push({\n id: \"hidden-group\",\n group_name: hiddenGroupName,\n visible_on: \"\",\n is_hidden: true\n });\n}\nsetting_groups.forEach(function (group) {\n if (!group.id) {\n group.id = window.crypto.randomUUID();\n }\n if (/\\$\\{.+\\}/.test(group.visible_on)) {\n group.visible_on = group.visible_on.replaceAll('${', '\\\\${');\n }\n})\n\n//整理字段与分组关系的数据\nlet design_field = {};\nlet oldGroup = _.cloneDeep(event.data.design_field);\nsetting_groups.forEach(function (group) {\n if (_.has(oldGroup, group.id)) {\n design_field[group.id] = oldGroup[group.id];\n oldGroup = _.omit(oldGroup, group.id);\n } else {\n design_field[group.id] = [];\n }\n})\n//当有分组被删除时,会进入以下if,将该分组下所有字段放入未分组中\nif (oldGroup && !_.isEmpty(oldGroup)) {\n _.forEach(oldGroup, function (value, key) {\n design_field[\"default-group\"] = _.unionBy(design_field[\"default-group\"], value);\n });\n}\n\n//未分组 放在所有分组开头,隐藏 放在所有分组最后\nconst defaultGroup = design_field['default-group'];\nconst hiddenGroup = design_field['hidden-group'];\ndelete design_field['default-group'];\ndelete design_field['hidden-group'];\ndesign_field = _.merge({ 'default-group': defaultGroup }, design_field, { 'hidden-group': hiddenGroup });\n\n//根据design_field调整groups顺序,设置分组与保存时需要groups按照顺序\nconst keys = _.keys(design_field);\nsetting_groups = _.sortBy(setting_groups, function (group) { return _.findIndex(keys, function (key) { return key == group.id }) });\n\ndoAction({\n actionType: 'setValue',\n componentId: 'form_field_design',\n args: {\n value: {\n groups: setting_groups,\n design_field\n }\n }\n});"
|
|
166
166
|
},
|
|
167
167
|
{
|
|
168
168
|
"actionType": "closeDialog"
|
|
@@ -421,7 +421,7 @@
|
|
|
421
421
|
"headers": {
|
|
422
422
|
"Authorization": "Bearer ${context.tenantId},${context.authToken}"
|
|
423
423
|
},
|
|
424
|
-
"requestAdaptor": "var graphqlOrder = \"\";\nvar field_groups = _.cloneDeep(api.data.groups);\n//先修改字段,使系统对象自行自定义\n//根据design_field,修改对象字段的sort_no与groups\nvar index = 1;\nconst
|
|
424
|
+
"requestAdaptor": "var graphqlOrder = \"\";\nvar field_groups = _.cloneDeep(api.data.groups);\n//先修改字段,使系统对象自行自定义\n//根据design_field,修改对象字段的sort_no与groups\nvar index = 1;\nconst defaultGroupId = _.find(field_groups, { 'is_default': true })?.id;\nconst hiddenGroupId = _.find(field_groups, { 'is_hidden': true })?.id;\n_.forEach(api.data.design_field, function (items, key) {\n let group = _.find(field_groups, { 'id': key }).group_name;\n if (key == defaultGroupId || key == hiddenGroupId) {\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 == hiddenGroupId ? \"{{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 != hiddenGroupId) {\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\n_.remove(field_groups, { is_default: true });\n_.remove(field_groups, { is_hidden: true });\nconst keys = _.keys(api.data.design_field);\nfield_groups = _.sortBy(field_groups, function (group) { return _.findIndex(keys, function (key) { return key == group.id }) });\nfield_groups = field_groups.map(function (group) {\n return _.omit(group, 'id');\n})\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}",
|
|
425
425
|
"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;",
|
|
426
426
|
"messages": {},
|
|
427
427
|
"data": {
|
|
@@ -476,7 +476,7 @@
|
|
|
476
476
|
},
|
|
477
477
|
"messages": {},
|
|
478
478
|
"requestAdaptor": "",
|
|
479
|
-
"adaptor": "//筛选出可编辑的字段\nvar oldFields = _.filter(payload.data.fields, function (obj) { return obj.recordPermissions.allowEdit; });\n//将group为空的字段分为未分组的组中,将系统字段的_id改为对象名.字段名\noldFields = _.map(oldFields, function (obj) {\n obj.originId = obj._id;\n if (obj.hidden || obj.visible_on == \"{{false}}\") {\n obj.group = \"隐藏\";\n }else if (obj.group === null) {\n obj.group = \"未分组\";\n }\n if (obj.is_system) {\n obj._id = api.data.designObjectName + \".\" + obj._name;\n }\n return obj;\n});\n\n//整合出字段的属性集合\nconst fields = oldFields.map((field) => {\n return {\n \"id\": field._id,//用与steedos-board组件的关系分辨\n \"_name\": field._name,\n \"label\": field.label,\n \"_id\": field.originId,//用于打开steedos-
|
|
479
|
+
"adaptor": "//筛选出可编辑的字段\nvar oldFields = _.filter(payload.data.fields, function (obj) { return obj.recordPermissions.allowEdit; });\n//将group为空的字段分为未分组的组中,将系统字段的_id改为对象名.字段名\noldFields = _.map(oldFields, function (obj) {\n obj.originId = obj._id;\n if (obj.hidden || obj.visible_on == \"{{false}}\") {\n obj.group = \"隐藏\";\n }else if (obj.group === null) {\n obj.group = \"未分组\";\n }\n if (obj.is_system) {\n obj._id = api.data.designObjectName + \".\" + obj._name;\n }\n return obj;\n});\n\n//整合出字段的属性集合\nconst fields = oldFields.map((field) => {\n return {\n \"id\": field._id,//用与steedos-board组件的关系分辨\n \"_name\": field._name,\n \"label\": field.label,\n \"_id\": field.originId,//用于打开steedos-object-form\n \"columnSpan\": field.is_wide ? 2 : 1,\n \"is_system\": field.is_system,\n \"type\": field.type,\n \"attr_visible_on\": field.visible_on\n }\n})\n\n//去重并去除隐藏和未分组\nlet newArray = _.reject(_.uniqBy(oldFields, \"group\"), function(obj) {\n return obj.group == \"隐藏\" || obj.group == \"未分组\";\n});\n//从字段的group属性中,整合出字段分组的属性集合\nlet field_groups = _.map(newArray, function (obj) {\n return {\n \"id\": window.crypto.randomUUID(), \n \"group_name\": obj.group,\n \"visible_on\": \"\"\n };\n});\n\n//合并对象上的field_groups与字段上的group\nlet groups = _.unionBy(api.data.field_groups, field_groups, 'group_name');\n\n//判断是否第一次调用接口,不是的话(说明是触发了datachange事件),返回fields与fieldUpdateData;目前新增与删除都不支持\nif (api.data.dataInitialed) {\n const eventData = api.data.eventData;\n let fieldUpdateData = \"\";\n const fieldForGroup = api.data.fieldForGroup;\n let fieldForGroupLength = 0;\n _.forIn(fieldForGroup, function (value, key) {\n fieldForGroupLength += value.length;\n });\n if (fieldForGroupLength < fields.length) {\n fieldUpdateData = {\n type: \"insert\",\n id: eventData.result.data.recordId\n }\n } else if (fieldForGroupLength > fields.length) {\n fieldUpdateData = {\n type: \"delete\",\n id: eventData._id\n }\n }\n return payload = {\n data: {\n fields,\n fieldUpdateData\n }\n }\n}\n\n//整合字段与分组的关系\nconst oldFieldsInGroups = _.groupBy(oldFields, \"group\");\nlet fieldForGroup = _.mapValues(_.groupBy(groups, \"id\"), function (group,key) {\n if (oldFieldsInGroups[group[0].group_name]) {\n return _.map(oldFieldsInGroups[group[0].group_name], function (obj) {\n return obj._id;\n });\n } else {\n return [];\n }\n});\n\n//未分组 放在所有分组开头,隐藏 放在所有分组最后\nconst defaultGroupId = _.find(groups, { 'is_default': true }).id;\nconst hiddenGroupId = _.find(groups, { 'is_hidden': true }).id;\nconst defaultGroup = fieldForGroup[defaultGroupId];\nconst hiddenGroup = fieldForGroup[hiddenGroupId];\ndelete fieldForGroup[defaultGroupId];\ndelete fieldForGroup[hiddenGroupId];\nfieldForGroup = _.merge({ [defaultGroupId]: defaultGroup }, fieldForGroup, { [hiddenGroupId]: hiddenGroup });\n\n//根据fieldForGroup调整groups顺序,设置分组与保存时需要groups按照顺序\nconst keys = _.keys(fieldForGroup);\ngroups = _.sortBy(groups, function (group) { return _.findIndex(keys, function (key) { return key == group.id }) });\n\nreturn payload = {\n data: {\n fields,\n groups,\n fieldForGroup,\n dataInitialed: true\n }\n};",
|
|
480
480
|
"sendOn": "!!this.designObjectId"
|
|
481
481
|
},
|
|
482
482
|
"messages": {},
|
|
@@ -510,7 +510,7 @@
|
|
|
510
510
|
},
|
|
511
511
|
"messages": {},
|
|
512
512
|
"requestAdaptor": "",
|
|
513
|
-
"adaptor": "const field_groups = payload.data.objects[0] && _.map(payload.data.objects[0].field_groups, function (obj) {\n return {\n \"id\":
|
|
513
|
+
"adaptor": "const field_groups = payload.data.objects[0] && _.map(payload.data.objects[0].field_groups, function (obj) {\n return {\n \"id\": window.crypto.randomUUID(), //唯一性id\n \"group_name\": obj.group_name,\n \"visible_on\": obj.visible_on,\n \"collapsed\": obj.collapsed\n }\n});\nfield_groups.unshift({\n id: \"hidden-group\",\n group_name: \"隐藏\",\n visible_on: \"\",\n is_hidden: true\n});\nfield_groups.unshift({\n id: \"default-group\",\n group_name: \"未分组\",\n visible_on: \"\",\n is_default: true\n});\n\n\n\nconst designObjectId = payload.data.objects[0] && payload.data.objects[0]._id;\nreturn payload = {\n data: {\n field_groups,\n designObjectId,\n designObjectLabel: payload.data.objects[0] && payload.data.objects[0].label,\n _master: {\n recordId: designObjectId\n }\n }\n}"
|
|
514
514
|
},
|
|
515
515
|
"messages": {},
|
|
516
516
|
"onEvent": {
|
|
@@ -143,15 +143,18 @@
|
|
|
143
143
|
"amis": {
|
|
144
144
|
"onEvent": {
|
|
145
145
|
"change": {
|
|
146
|
-
"actions": [
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
"
|
|
150
|
-
"
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
146
|
+
"actions": [
|
|
147
|
+
{
|
|
148
|
+
"actionType": "setValue",
|
|
149
|
+
"args": {
|
|
150
|
+
"value": {
|
|
151
|
+
"defaultValue": null,
|
|
152
|
+
"sortable": "${ARRAYSOME(allowSort, item => item === event.data.value)}"
|
|
153
|
+
}
|
|
154
|
+
},
|
|
155
|
+
"componentId": "steedos_object_fields_form"
|
|
156
|
+
}
|
|
157
|
+
]
|
|
155
158
|
}
|
|
156
159
|
},
|
|
157
160
|
"disabledOn": "${is_system == true}",
|
|
@@ -197,7 +200,20 @@
|
|
|
197
200
|
"tabsMode": "line"
|
|
198
201
|
}],
|
|
199
202
|
"data": {
|
|
200
|
-
"context": {}
|
|
203
|
+
"context": {},
|
|
204
|
+
"allowSort": [
|
|
205
|
+
"text",
|
|
206
|
+
"select",
|
|
207
|
+
"date",
|
|
208
|
+
"datetime",
|
|
209
|
+
"time",
|
|
210
|
+
"number",
|
|
211
|
+
"currency",
|
|
212
|
+
"percent",
|
|
213
|
+
"autoumber",
|
|
214
|
+
"summary",
|
|
215
|
+
"formula"
|
|
216
|
+
]
|
|
201
217
|
},
|
|
202
218
|
"onEvent": {
|
|
203
219
|
"init": {
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
"method": "get",
|
|
17
17
|
"url": "/service/api/amis-metadata-objects/objects/${object_name}/fields/options",
|
|
18
18
|
"cache": 30000,
|
|
19
|
-
"adaptor": "const visibleOnVariables = SteedosUI.getFormulaVariables(payload.data.options);\n const defaultValueVariables = [visibleOnVariables[1]];\n const variables = [];\n const varItem = {\n label: '对象字段',\n children: _.map(payload.data.options, (item)=>{\n return {\n label: item.label,\n value: item.value\n }\n })\n };\n variables.push(varItem);\n payload.data={label:
|
|
19
|
+
"adaptor": "const field = context.uiSchema.fields.condition; const visibleOnVariables = SteedosUI.getFormulaVariables(payload.data.options);\n const defaultValueVariables = [visibleOnVariables[1]];\n const variables = [];\n const varItem = {\n label: '对象字段',\n children: _.map(payload.data.options, (item)=>{\n return {\n label: item.label,\n value: item.value\n }\n })\n };\n variables.push(varItem);\n payload.data={label: field.label, type:'input-formula', name: 'condition', variables: variables, labelRemark: field.inlineHelpText, description: field.description } \n return payload;",
|
|
20
20
|
"trackExpression": "${object_name}",
|
|
21
21
|
"sendOn": "${object_name}"
|
|
22
22
|
}
|
|
@@ -299,8 +299,10 @@ function allowChangeObject(){
|
|
|
299
299
|
}
|
|
300
300
|
|
|
301
301
|
function checkNameField(nameField){
|
|
302
|
-
if(["text", "textarea", "autonumber", "date", "datetime", "time", "formula"].indexOf(nameField.type) < 0){
|
|
303
|
-
throw new Error("
|
|
302
|
+
if(["text", "textarea", "autonumber", "date", "datetime", "time", "formula", "lookup"].indexOf(nameField.type) < 0){
|
|
303
|
+
throw new Error("只有文本、长文本、自动编号、日期、日期时间、时间、公式、相关表这些类型的字段可以被设置为名称字段");
|
|
304
|
+
} else if(nameField.type == "lookup" && nameField.multiple) {
|
|
305
|
+
throw new Error("多选的相关表字段不可以被设置为名称字段");
|
|
304
306
|
}
|
|
305
307
|
}
|
|
306
308
|
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* @Author: baozhoutao@steedos.com
|
|
3
3
|
* @Date: 2024-04-23 14:35:03
|
|
4
4
|
* @LastEditors: baozhoutao@steedos.com
|
|
5
|
-
* @LastEditTime: 2024-
|
|
5
|
+
* @LastEditTime: 2024-05-06 11:45:46
|
|
6
6
|
* @Description:
|
|
7
7
|
*/
|
|
8
8
|
|
|
@@ -22,22 +22,28 @@ module.exports = {
|
|
|
22
22
|
},
|
|
23
23
|
events: {
|
|
24
24
|
"*.inserted": async function(ctx){
|
|
25
|
-
// TODO 校验是否是objectql的记录新增事件. 使用@objectApiName + .inserted 后,与ctx.eventName对比,看是否相同
|
|
26
25
|
const { objectApiName, id, spaceId, userId } = ctx.params;
|
|
26
|
+
if(ctx.eventName != `@${objectApiName}.inserted`){
|
|
27
|
+
return
|
|
28
|
+
}
|
|
27
29
|
if(objectApiName && id && spaceId){
|
|
28
30
|
await this.addQueue(ctx, objectApiName, "create", id, spaceId, userId)
|
|
29
31
|
}
|
|
30
32
|
},
|
|
31
33
|
"*.updated": async function(ctx){
|
|
32
|
-
// TODO 校验是否是objectql的记录新增事件. 使用@objectApiName + .updated 后,与ctx.eventName对比,看是否相同
|
|
33
34
|
const { objectApiName, id, spaceId, userId, previousDoc } = ctx.params;
|
|
35
|
+
if(ctx.eventName != `@${objectApiName}.updated`){
|
|
36
|
+
return
|
|
37
|
+
}
|
|
34
38
|
if(objectApiName && id && spaceId){
|
|
35
39
|
await this.addQueue(ctx, objectApiName, "update", id, spaceId, userId, previousDoc)
|
|
36
40
|
}
|
|
37
41
|
},
|
|
38
42
|
"*.deleted": async function(ctx){
|
|
39
|
-
// TODO 校验是否是objectql的记录新增事件. 使用@objectApiName + .deleted 后,与ctx.eventName对比,看是否相同
|
|
40
43
|
const { objectApiName, id, spaceId, userId, previousDoc } = ctx.params;
|
|
44
|
+
if(ctx.eventName != `@${objectApiName}.deleted`){
|
|
45
|
+
return
|
|
46
|
+
}
|
|
41
47
|
if(objectApiName && id){
|
|
42
48
|
await this.addQueue(ctx, objectApiName, "delete", id, spaceId, userId, previousDoc)
|
|
43
49
|
}
|
|
@@ -50,7 +56,6 @@ module.exports = {
|
|
|
50
56
|
const { url, data } = ctx.params
|
|
51
57
|
const result = await axios.post(url, data);
|
|
52
58
|
ctx.locals.job.updateProgress(100)
|
|
53
|
-
console.log('====>send', url, data.doc?.name)
|
|
54
59
|
return result.data;
|
|
55
60
|
}
|
|
56
61
|
}
|
|
@@ -71,14 +76,14 @@ module.exports = {
|
|
|
71
76
|
const userSession = await ctx.call('@steedos/service-accounts.getUserSession', {userId, spaceId})
|
|
72
77
|
if(userSession){
|
|
73
78
|
sender = {
|
|
74
|
-
|
|
79
|
+
_id: userSession.userId,
|
|
75
80
|
username: userSession.username,
|
|
76
81
|
name: userSession.name,
|
|
77
82
|
email: userSession.email
|
|
78
83
|
}
|
|
79
84
|
|
|
80
85
|
space = {
|
|
81
|
-
|
|
86
|
+
_id: userSession.space._id,
|
|
82
87
|
name: userSession.space.name
|
|
83
88
|
}
|
|
84
89
|
}
|
|
@@ -7,6 +7,7 @@ const InternalData = require('@steedos/standard-objects').internalData;
|
|
|
7
7
|
const objectql = require('@steedos/objectql');
|
|
8
8
|
const auth = require('@steedos/auth');
|
|
9
9
|
const _ = require('underscore');
|
|
10
|
+
const clone = require('clone');
|
|
10
11
|
//由于新版lookup 组件限制。需编写trigger处理在只读页面不显示已选中项的问题
|
|
11
12
|
//由于lookup组件强依赖_id 字段,所以必须返回_id
|
|
12
13
|
|
|
@@ -35,14 +36,15 @@ module.exports = {
|
|
|
35
36
|
dataList.push({_id: 'meteor', name: 'meteor', label: TAPi18n.__(`objects_field_datasource_meteor`, {}, lng), ...BASERECORD})
|
|
36
37
|
}
|
|
37
38
|
if (!_.isEmpty(dataList)) {
|
|
39
|
+
const cloneValues = clone(this.data.values, false);
|
|
38
40
|
dataList.forEach((doc) => {
|
|
39
41
|
if (!_.find(this.data.values, (value) => {
|
|
40
42
|
return value.name === doc.name
|
|
41
43
|
})) {
|
|
42
|
-
|
|
44
|
+
cloneValues.push(doc);
|
|
43
45
|
}
|
|
44
46
|
})
|
|
45
|
-
const records = objectql.getSteedosSchema().metadataDriver.find(
|
|
47
|
+
const records = objectql.getSteedosSchema().metadataDriver.find(cloneValues, this.query, spaceId);
|
|
46
48
|
if (records.length > 0) {
|
|
47
49
|
this.data.values = records;
|
|
48
50
|
} else {
|
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
/*
|
|
2
2
|
* @Author: sunhaolin@hotoa.com
|
|
3
3
|
* @Date: 2022-05-28 11:07:57
|
|
4
|
-
* @LastEditors:
|
|
5
|
-
* @LastEditTime: 2024-
|
|
4
|
+
* @LastEditors: 孙浩林 sunhaolin@steedos.com
|
|
5
|
+
* @LastEditTime: 2024-05-11 13:57:23
|
|
6
6
|
* @Description:
|
|
7
7
|
*/
|
|
8
8
|
const InternalData = require('@steedos/standard-objects').internalData;
|
|
9
9
|
const objectql = require('@steedos/objectql');
|
|
10
10
|
const auth = require("@steedos/auth");
|
|
11
|
+
const clone = require('clone');
|
|
11
12
|
const sleep = async (ms) => new Promise(resolve => setTimeout(resolve, ms));
|
|
12
13
|
module.exports = {
|
|
13
14
|
beforeInsert: async function(){
|
|
@@ -35,14 +36,15 @@ module.exports = {
|
|
|
35
36
|
if(objectName){
|
|
36
37
|
let dataList = await InternalData.getObjectActions(objectName, this.userId);
|
|
37
38
|
if (!_.isEmpty(dataList)) {
|
|
39
|
+
const cloneValues = clone(this.data.values, false);
|
|
38
40
|
dataList.forEach((doc) => {
|
|
39
41
|
if (!_.find(this.data.values, (value) => {
|
|
40
42
|
return value.name === doc.name
|
|
41
43
|
})) {
|
|
42
|
-
|
|
44
|
+
cloneValues.push(Object.assign({_id: `${objectName}.${doc.name}`}, doc));
|
|
43
45
|
}
|
|
44
46
|
})
|
|
45
|
-
const records = objectql.getSteedosSchema().metadataDriver.find(
|
|
47
|
+
const records = objectql.getSteedosSchema().metadataDriver.find(cloneValues, this.query, spaceId);
|
|
46
48
|
if (records.length > 0) {
|
|
47
49
|
this.data.values = records;
|
|
48
50
|
} else {
|
|
@@ -231,15 +231,16 @@ module.exports = {
|
|
|
231
231
|
if(objectName){
|
|
232
232
|
let fields = await InternalData.getObjectFields(objectName, this.userId, filters.name ? true : false);
|
|
233
233
|
if(fields){
|
|
234
|
+
const cloneValues = clone(this.data.values, false);
|
|
234
235
|
_.each(fields, (field)=>{
|
|
235
236
|
if(!_.find(this.data.values, (item)=>{
|
|
236
237
|
return item.object == field.object && item.name == field.name
|
|
237
238
|
})){
|
|
238
|
-
|
|
239
|
+
cloneValues.push(Object.assign({_id: `${objectName}.${field.name}`}, field))
|
|
239
240
|
}
|
|
240
241
|
})
|
|
241
242
|
// this.data.values = this.data.values.concat(fields)
|
|
242
|
-
this.data.values = objectql.getSteedosSchema().metadataDriver.find(
|
|
243
|
+
this.data.values = objectql.getSteedosSchema().metadataDriver.find(cloneValues, this.query, this.spaceId);
|
|
243
244
|
}
|
|
244
245
|
}
|
|
245
246
|
|
|
@@ -282,29 +283,6 @@ module.exports = {
|
|
|
282
283
|
}
|
|
283
284
|
|
|
284
285
|
|
|
285
|
-
},
|
|
286
|
-
beforeAggregate: async function(){
|
|
287
|
-
const { query } = this;
|
|
288
|
-
if(query.fields && _.isArray(query.fields) && !_.include(query.fields, 'object')){
|
|
289
|
-
query.fields.push('object')
|
|
290
|
-
}
|
|
291
|
-
},
|
|
292
|
-
afterAggregate: async function(){
|
|
293
|
-
let filters = InternalData.parserFilters(this.query.filters);
|
|
294
|
-
let objectName = filters.object;
|
|
295
|
-
if(!objectName && filters._id && filters._id.indexOf(".") > -1){
|
|
296
|
-
objectName = filters._id.split('.')[0];
|
|
297
|
-
}
|
|
298
|
-
if(objectName){
|
|
299
|
-
let fields = await InternalData.getObjectFields(objectName, this.userId, true);
|
|
300
|
-
if(fields){
|
|
301
|
-
_.each(fields, (field)=>{
|
|
302
|
-
this.data.values.push(Object.assign({_id: `${objectName}.${field.name}`}, field))
|
|
303
|
-
})
|
|
304
|
-
// this.data.values = this.data.values.concat(fields)
|
|
305
|
-
this.data.values = objectql.getSteedosSchema().metadataDriver.find(this.data.values, this.query, this.spaceId);
|
|
306
|
-
}
|
|
307
|
-
}
|
|
308
286
|
},
|
|
309
287
|
afterCount: async function(){
|
|
310
288
|
let result = await objectql.getObject('object_fields').find(this.query, await auth.getSessionByUserId(this.userId, this.spaceId))
|
|
@@ -8,26 +8,25 @@ const util = require('@steedos/standard-objects').util;
|
|
|
8
8
|
const objectql = require("@steedos/objectql");
|
|
9
9
|
const register = require('@steedos/metadata-registrar')
|
|
10
10
|
const auth = require('@steedos/auth');
|
|
11
|
+
const clone = require('clone');
|
|
11
12
|
|
|
12
13
|
module.exports = {
|
|
13
14
|
beforeFind: async function(){
|
|
14
15
|
delete this.query.fields;
|
|
15
16
|
},
|
|
16
|
-
beforeAggregate: async function(){
|
|
17
|
-
delete this.query.fields;
|
|
18
|
-
},
|
|
19
17
|
afterFind: async function(){
|
|
20
18
|
const { spaceId } = this;
|
|
21
19
|
let dataList = await register.getAllObjectValidationRules();
|
|
22
20
|
if (!_.isEmpty(dataList)) {
|
|
21
|
+
const cloneValues = clone(this.data.values, false);
|
|
23
22
|
dataList.forEach((doc) => {
|
|
24
23
|
if (!_.find(this.data.values, (value) => {
|
|
25
24
|
return value.name === doc.name
|
|
26
25
|
})) {
|
|
27
|
-
|
|
26
|
+
cloneValues.push(doc);
|
|
28
27
|
}
|
|
29
28
|
})
|
|
30
|
-
const records = objectql.getSteedosSchema().metadataDriver.find(
|
|
29
|
+
const records = objectql.getSteedosSchema().metadataDriver.find(cloneValues, this.query, spaceId);
|
|
31
30
|
if (records.length > 0) {
|
|
32
31
|
this.data.values = records;
|
|
33
32
|
} else {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@steedos/standard-object-database",
|
|
3
|
-
"version": "2.7.1-beta.
|
|
3
|
+
"version": "2.7.1-beta.9",
|
|
4
4
|
"main": "package.service.js",
|
|
5
5
|
"private": false,
|
|
6
6
|
"publishConfig": {
|
|
@@ -12,13 +12,14 @@
|
|
|
12
12
|
"description": "steedos package",
|
|
13
13
|
"dependencies": {
|
|
14
14
|
"@steedos-widgets/amis-lib": "^1.0.22",
|
|
15
|
-
"@steedos/metadata-core": "2.7.1-beta.
|
|
16
|
-
"@steedos/service-object-mixin": "2.7.1-beta.
|
|
17
|
-
"@steedos/standard-objects": "2.7.1-beta.
|
|
15
|
+
"@steedos/metadata-core": "2.7.1-beta.9",
|
|
16
|
+
"@steedos/service-object-mixin": "2.7.1-beta.9",
|
|
17
|
+
"@steedos/standard-objects": "2.7.1-beta.9",
|
|
18
18
|
"amis-formula": "~6.3.0",
|
|
19
|
+
"clone": "^2.1.2",
|
|
19
20
|
"moleculer-bullmq": "3.0.0"
|
|
20
21
|
},
|
|
21
22
|
"repository": {},
|
|
22
23
|
"license": "MIT",
|
|
23
|
-
"gitHead": "
|
|
24
|
+
"gitHead": "63b5ff5367f88ad33c4de6e04a1f432a1e2f5e8e"
|
|
24
25
|
}
|