@steedos/standard-object-database 2.5.0-beta.3 → 2.5.0-beta.33
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/object_fields.en/object_fields.en.objectTranslation.yml +2 -2
- package/main/default/objectTranslations/object_fields.zh-CN/object_fields.zh-CN.objectTranslation.yml +2 -2
- package/main/default/objectTranslations/object_triggers.zh-CN/object_triggers.zh-CN.objectTranslation.yml +3 -5
- package/main/default/objects/13.permission_fields.observe.object.js +3 -0
- package/main/default/objects/14.object_fields.observe.object.js +3 -3
- package/main/default/objects/15.permission_objects.observe.object.js +5 -2
- package/main/default/objects/2.object_triggers.observe.object.js +42 -34
- package/main/default/objects/3.permission_objects.observe.object.js +39 -6
- package/main/default/objects/datasources.object.js +4 -0
- package/main/default/objects/datasources.object.yml +10 -0
- package/main/default/objects/object_actions.object.yml +16 -10
- package/main/default/objects/object_fields.object.js +1 -1
- package/main/default/objects/object_fields.object.yml +67 -62
- package/main/default/objects/object_triggers.object.yml +56 -52
- package/main/default/objects/objects.core.js +0 -28
- package/main/default/objects/objects.object.yml +1 -1
- package/main/default/pages/object_detail.page.amis.json +188 -149
- package/main/default/routes/amis_button_design.ejs +6 -5
- package/main/default/routes/amis_listview_design.router.js +1 -1
- package/main/default/services/database-objects.service.js +137 -0
- package/main/default/services/suggestions.service.js +187 -0
- package/main/default/triggers/datasources.trigger.js +16 -29
- package/main/default/triggers/object_triggers.trigger.js +78 -33
- package/package.json +2 -2
- package/main/default/objects/object_triggers.core.js +0 -58
- package/main/default/objects/object_triggers.object.js +0 -65
package/main/default/objectTranslations/object_fields.en/object_fields.en.objectTranslation.yml
CHANGED
|
@@ -53,9 +53,9 @@ fields:
|
|
|
53
53
|
value: percent
|
|
54
54
|
- label: Password
|
|
55
55
|
value: password
|
|
56
|
-
- label: Lookup
|
|
56
|
+
- label: Lookup Relationship
|
|
57
57
|
value: lookup
|
|
58
|
-
- label: Master
|
|
58
|
+
- label: Master-Detail Relationship
|
|
59
59
|
value: master_detail
|
|
60
60
|
- label: Autonumber
|
|
61
61
|
value: autonumber
|
|
@@ -14,14 +14,12 @@ fields:
|
|
|
14
14
|
label: 运行时
|
|
15
15
|
help:
|
|
16
16
|
description:
|
|
17
|
-
|
|
17
|
+
isEnabled:
|
|
18
18
|
label: 已启用
|
|
19
19
|
help:
|
|
20
20
|
description:
|
|
21
|
-
|
|
22
|
-
label:
|
|
23
|
-
执行的脚本 <a target="_blank"
|
|
24
|
-
href="https://developer.steedos.com/developer/object_trigger">查看帮助</a>
|
|
21
|
+
handler:
|
|
22
|
+
label: 内容
|
|
25
23
|
help:
|
|
26
24
|
description:
|
|
27
25
|
listviews:
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/*
|
|
2
2
|
* @Author: baozhoutao@steedos.com
|
|
3
3
|
* @Date: 2022-08-05 14:17:44
|
|
4
|
-
* @LastEditors:
|
|
5
|
-
* @LastEditTime: 2023-
|
|
4
|
+
* @LastEditors: sunhaolin@hotoa.com
|
|
5
|
+
* @LastEditTime: 2023-05-12 09:33:27
|
|
6
6
|
* @Description:
|
|
7
7
|
*/
|
|
8
8
|
const objectql = require("@steedos/objectql");
|
|
@@ -13,7 +13,7 @@ Meteor.startup(function () {
|
|
|
13
13
|
// 重置字段权限延迟10秒,防止对象服务未上线
|
|
14
14
|
setTimeout(()=>{
|
|
15
15
|
try {
|
|
16
|
-
console.log("====resetAllPermissionSetFieldPermissions====")
|
|
16
|
+
// console.log("====resetAllPermissionSetFieldPermissions====")
|
|
17
17
|
objectql.getSteedosSchema().broker.call(`permission_fields.resetAllPermissionSetFieldPermissions`, {
|
|
18
18
|
objectName: document.object
|
|
19
19
|
}, {
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/*
|
|
2
2
|
* @Author: baozhoutao@steedos.com
|
|
3
3
|
* @Date: 2022-08-05 14:17:44
|
|
4
|
-
* @LastEditors:
|
|
5
|
-
* @LastEditTime: 2023-
|
|
4
|
+
* @LastEditors: sunhaolin@hotoa.com
|
|
5
|
+
* @LastEditTime: 2023-05-13 17:09:31
|
|
6
6
|
* @Description:
|
|
7
7
|
*/
|
|
8
8
|
const objectql = require("@steedos/objectql");
|
|
@@ -38,6 +38,9 @@ Meteor.startup(function () {
|
|
|
38
38
|
}
|
|
39
39
|
}).observe({
|
|
40
40
|
added: function (newDocument) {
|
|
41
|
+
if (newDocument.copy_from) { // 通过复制简档创建的对象权限,不需要重置字段权限
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
41
44
|
if (inited) {
|
|
42
45
|
return _change(newDocument);
|
|
43
46
|
}
|
|
@@ -1,35 +1,43 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
/*
|
|
2
|
+
* @Author: baozhoutao@steedos.com
|
|
3
|
+
* @Date: 2022-08-05 14:17:44
|
|
4
|
+
* @LastEditors: baozhoutao@steedos.com
|
|
5
|
+
* @LastEditTime: 2023-04-21 17:06:15
|
|
6
|
+
* @Description:
|
|
7
|
+
*/
|
|
8
|
+
// var objectql = require('@steedos/objectql');
|
|
9
|
+
// var triggerCore = require('./object_triggers.core.js');
|
|
3
10
|
|
|
4
|
-
Meteor.startup(function () {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
}
|
|
11
|
+
// Meteor.startup(function () {
|
|
12
|
+
// var _change, _remove;
|
|
13
|
+
// _change = function (document) {
|
|
14
|
+
// console.log("object_triggers===> _change");
|
|
15
|
+
// triggerCore.loadObjectTrigger(document)
|
|
16
|
+
// };
|
|
17
|
+
// _remove = function (document) {
|
|
18
|
+
// triggerCore.removeObjectTrigger(document);
|
|
19
|
+
// };
|
|
20
|
+
// var config = objectql.getSteedosConfig();
|
|
21
|
+
// if(config.tenant && config.tenant.saas){
|
|
22
|
+
// return ;
|
|
23
|
+
// }else{
|
|
24
|
+
// Creator.getCollection("object_triggers").find({is_enable: true}, {
|
|
25
|
+
// fields: {
|
|
26
|
+
// created: 0,
|
|
27
|
+
// created_by: 0,
|
|
28
|
+
// modified: 0,
|
|
29
|
+
// modified_by: 0
|
|
30
|
+
// }
|
|
31
|
+
// }).observe({
|
|
32
|
+
// added: function (newDocument) {
|
|
33
|
+
// return _change(newDocument);
|
|
34
|
+
// },
|
|
35
|
+
// changed: function (newDocument, oldDocument) {
|
|
36
|
+
// return _change(newDocument);
|
|
37
|
+
// },
|
|
38
|
+
// removed: function (oldDocument) {
|
|
39
|
+
// return _remove(oldDocument);
|
|
40
|
+
// }
|
|
41
|
+
// });
|
|
42
|
+
// }
|
|
43
|
+
// });
|
|
@@ -1,13 +1,46 @@
|
|
|
1
|
-
|
|
1
|
+
/*
|
|
2
|
+
* @Author: baozhoutao@steedos.com
|
|
3
|
+
* @Date: 2022-08-05 14:17:44
|
|
4
|
+
* @LastEditors: baozhoutao@steedos.com
|
|
5
|
+
* @LastEditTime: 2023-05-06 18:58:32
|
|
6
|
+
* @Description:
|
|
7
|
+
*/
|
|
2
8
|
|
|
9
|
+
const cachers = require('@steedos/cachers');
|
|
10
|
+
const objectql = require("@steedos/objectql");
|
|
11
|
+
const _ = require('lodash');
|
|
12
|
+
let permissionObjectsLoadSetTimeoutId = null;
|
|
3
13
|
Meteor.startup(function () {
|
|
4
14
|
var _change, _remove;
|
|
5
15
|
_change = function (document) {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
16
|
+
if(permissionObjectsLoadSetTimeoutId){
|
|
17
|
+
clearTimeout(permissionObjectsLoadSetTimeoutId);
|
|
18
|
+
permissionObjectsLoadSetTimeoutId = null;
|
|
19
|
+
}
|
|
20
|
+
permissionObjectsLoadSetTimeoutId = setTimeout(()=>{
|
|
21
|
+
objectql.getObject("permission_set").find({}).then((permissionSets)=>{
|
|
22
|
+
objectql.getObject("permission_objects").directFind({}).then((records)=>{
|
|
23
|
+
records = _.map(records, (doc)=>{
|
|
24
|
+
if(_.includes(['admin', 'user', 'customer', 'supplier'], doc.permission_set_id)){
|
|
25
|
+
doc.name = doc.permission_set_id
|
|
26
|
+
}else{
|
|
27
|
+
const record = _.find(permissionSets, (item)=>{
|
|
28
|
+
return doc.permission_set_id == item._id
|
|
29
|
+
})
|
|
30
|
+
if(record){
|
|
31
|
+
doc.name = record.name;
|
|
32
|
+
}else{
|
|
33
|
+
doc.name = _.last(doc.name.split('.')) || doc.permission_set_id;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return doc;
|
|
37
|
+
})
|
|
38
|
+
cachers.getCacher('permission_objects').set('permission_objects', _.groupBy(records, 'space'));
|
|
39
|
+
})
|
|
40
|
+
})
|
|
41
|
+
}, 1000 * 3)
|
|
10
42
|
};
|
|
43
|
+
|
|
11
44
|
Creator.getCollection("permission_objects").find({}, {
|
|
12
45
|
fields: {
|
|
13
46
|
created: 0,
|
|
@@ -23,7 +56,7 @@ Meteor.startup(function () {
|
|
|
23
56
|
return _change(newDocument);
|
|
24
57
|
},
|
|
25
58
|
removed: function (oldDocument) {
|
|
26
|
-
return
|
|
59
|
+
return _change(oldDocument);
|
|
27
60
|
}
|
|
28
61
|
});
|
|
29
62
|
});
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
const _ = require("underscore");
|
|
2
|
+
const lodash = require("lodash");
|
|
2
3
|
var objectql = require('@steedos/objectql');
|
|
3
4
|
var schema = objectql.getSteedosSchema();
|
|
4
5
|
const datasourceCore = require('./datasources.core');
|
|
@@ -20,6 +21,9 @@ Creator.Objects['datasources'].methods = {
|
|
|
20
21
|
testConnection: async function (req, res) {
|
|
21
22
|
var userSession = req.user
|
|
22
23
|
var recordId = req.params._id;
|
|
24
|
+
if(lodash.includes(defaultDatasourceName, recordId)){
|
|
25
|
+
return res.send({ok: 1});
|
|
26
|
+
}
|
|
23
27
|
var spaceId = userSession.spaceId
|
|
24
28
|
let doc = await objectql.getObject('datasources').findOne(recordId, {filters: `(space eq \'${spaceId}\')`});
|
|
25
29
|
if(doc){
|
|
@@ -82,6 +82,15 @@ fields:
|
|
|
82
82
|
is_enable:
|
|
83
83
|
type: boolean
|
|
84
84
|
label: Enable
|
|
85
|
+
record_permissions:
|
|
86
|
+
type: object
|
|
87
|
+
visible_on: "{{global.mode ==='read' ? true : false}}"
|
|
88
|
+
is_system:
|
|
89
|
+
type: boolean
|
|
90
|
+
label: System
|
|
91
|
+
readonly: true
|
|
92
|
+
visible_on: "{{global.mode ==='read' ? true : false}}"
|
|
93
|
+
disabled: true
|
|
85
94
|
list_views:
|
|
86
95
|
all:
|
|
87
96
|
columns:
|
|
@@ -89,6 +98,7 @@ list_views:
|
|
|
89
98
|
- name
|
|
90
99
|
- is_enable
|
|
91
100
|
- driver
|
|
101
|
+
- is_system
|
|
92
102
|
label: All
|
|
93
103
|
filter_scope: space
|
|
94
104
|
actions:
|
|
@@ -76,6 +76,7 @@ fields:
|
|
|
76
76
|
type:
|
|
77
77
|
type: select
|
|
78
78
|
sort_no: 170
|
|
79
|
+
hidden: true
|
|
79
80
|
options:
|
|
80
81
|
- label: Custom JavaScript
|
|
81
82
|
value: script
|
|
@@ -89,16 +90,16 @@ fields:
|
|
|
89
90
|
# reference_to: word_templates
|
|
90
91
|
# visible_on: "{{formData.type === 'word-print' ? true: false}}"
|
|
91
92
|
# create: false
|
|
92
|
-
todo:
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
93
|
+
# todo:
|
|
94
|
+
# label: Execute Script
|
|
95
|
+
# sort_no: 180
|
|
96
|
+
# type: code
|
|
97
|
+
# language: javascript
|
|
98
|
+
# required: "{{formData.type != 'amis_button' ? true: false}}"
|
|
99
|
+
# # omit: true
|
|
100
|
+
# # hidden: true
|
|
101
|
+
# is_wide: true
|
|
102
|
+
# visible_on: "{{formData.type != 'amis_button' ? true: false}}"
|
|
102
103
|
amis_schema:
|
|
103
104
|
label: Amis Schema
|
|
104
105
|
sort_no: 180
|
|
@@ -108,6 +109,11 @@ fields:
|
|
|
108
109
|
is_wide: true
|
|
109
110
|
hidden: true
|
|
110
111
|
visible_on: "{{formData.type == 'amis_button' ? true: false}}"
|
|
112
|
+
form:
|
|
113
|
+
initialValues: !!js/function |
|
|
114
|
+
function(){
|
|
115
|
+
return {type: 'amis_button'}
|
|
116
|
+
}
|
|
111
117
|
paging:
|
|
112
118
|
enabled: false
|
|
113
119
|
actions:
|
|
@@ -268,7 +268,7 @@ function checkName(name){
|
|
|
268
268
|
var reg = new RegExp('^[a-z]([a-z0-9]|_(?!_))*[a-z0-9]$'); //支持表格类型的验证表达式(待优化.$.限制只能出现一次): new RegExp('^[a-z]([a-z0-9]|_(?!_))*(\\.\\$\\.\\w+)*[a-z0-9]$')
|
|
269
269
|
//TODO 撤销注释
|
|
270
270
|
if(!reg.test(name)){
|
|
271
|
-
throw new Error("
|
|
271
|
+
throw new Error("'字段名'只能包含小写字母、数字,必须以字母开头,不能以下划线字符结尾或包含两个连续的下划线字符");
|
|
272
272
|
}
|
|
273
273
|
if(name.length > 50){
|
|
274
274
|
throw new Error("名称长度不能大于50个字符");
|
|
@@ -110,23 +110,46 @@ fields:
|
|
|
110
110
|
visible_on: "{{['lookup', 'master_detail'].indexOf(formData.type) > -1 ? true: false}}"
|
|
111
111
|
required: "{{['master_detail'].indexOf(formData.type) > -1 ? true: false}}"
|
|
112
112
|
sort_no: 180
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
113
|
+
amis:
|
|
114
|
+
menuTpl: "<div>${label}(${value})</div>"
|
|
115
|
+
depend_on:
|
|
116
|
+
type: lookup
|
|
117
|
+
group: Advanced
|
|
118
|
+
label: 依赖的字段
|
|
119
|
+
reference_to: object_fields
|
|
120
|
+
reference_to_field: name
|
|
121
|
+
multiple: true
|
|
122
|
+
visible_on: "{{['lookup', 'master_detail'].indexOf(formData.type) > -1 ? true: false}}"
|
|
123
|
+
depend_on:
|
|
124
|
+
- object
|
|
125
|
+
filtersFunction: !<tag:yaml.org,2002:js/function> |-
|
|
126
|
+
function (filters, values) {
|
|
127
|
+
if(values && values.object){
|
|
128
|
+
return ['object', '=', values.object]
|
|
129
|
+
}else{
|
|
130
|
+
return ['_id', '=', 'no']
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
sort_no: 450
|
|
134
|
+
reference_to_field:
|
|
135
|
+
type: lookup
|
|
136
|
+
group: Advanced
|
|
137
|
+
label: 关联的字段
|
|
138
|
+
description: '默认为主键'
|
|
139
|
+
reference_to: object_fields
|
|
140
|
+
reference_to_field: name
|
|
141
|
+
visible_on: "{{['lookup', 'master_detail'].indexOf(formData.type) > -1 ? true: false}}"
|
|
142
|
+
depend_on:
|
|
143
|
+
- reference_to
|
|
144
|
+
filtersFunction: !<tag:yaml.org,2002:js/function> |-
|
|
145
|
+
function (filters, values) {
|
|
146
|
+
if(values && values.reference_to){
|
|
147
|
+
return ['object', '=', values.reference_to]
|
|
148
|
+
}else{
|
|
149
|
+
return ['_id', '=', 'no']
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
sort_no: 450
|
|
130
153
|
multiple:
|
|
131
154
|
type: boolean
|
|
132
155
|
label: Multiple
|
|
@@ -163,16 +186,23 @@ fields:
|
|
|
163
186
|
sort_no: 220
|
|
164
187
|
filtersFunction:
|
|
165
188
|
label: filters Function
|
|
166
|
-
type:
|
|
167
|
-
|
|
168
|
-
visible_on: "{{['lookup', 'master_detail'].indexOf(formData.type) > -1 ? true: false}}"
|
|
169
|
-
sort_no: 230
|
|
170
|
-
optionsFunction:
|
|
171
|
-
label: options Function
|
|
172
|
-
type: textarea
|
|
189
|
+
type: code
|
|
190
|
+
language: javascript
|
|
173
191
|
is_wide: true
|
|
174
192
|
visible_on: "{{['lookup', 'master_detail'].indexOf(formData.type) > -1 ? true: false}}"
|
|
175
|
-
sort_no:
|
|
193
|
+
sort_no: 448
|
|
194
|
+
group: Advanced
|
|
195
|
+
amis:
|
|
196
|
+
placeholder: |-
|
|
197
|
+
function(filters, values){
|
|
198
|
+
|
|
199
|
+
}
|
|
200
|
+
# optionsFunction:
|
|
201
|
+
# label: options Function
|
|
202
|
+
# type: textarea
|
|
203
|
+
# is_wide: true
|
|
204
|
+
# visible_on: "{{['lookup', 'master_detail'].indexOf(formData.type) > -1 ? true: false}}"
|
|
205
|
+
# sort_no: 240
|
|
176
206
|
precision:
|
|
177
207
|
type: currency
|
|
178
208
|
label: Precision
|
|
@@ -381,48 +411,23 @@ fields:
|
|
|
381
411
|
summary_field:
|
|
382
412
|
type: lookup
|
|
383
413
|
label: Field to Aggregate
|
|
414
|
+
reference_to: object_fields
|
|
415
|
+
reference_to_field: name
|
|
384
416
|
inlineHelpText: If the field type is a 'Roll-Up Summary' and the 'Roll-Up Type' is not COUNT, this field must be filled in, Only fields that aggregate number, currency, date, and datetime types are supported.
|
|
385
417
|
depend_on:
|
|
386
418
|
- summary_object
|
|
387
419
|
- summary_type
|
|
388
420
|
defaultIcon: service_contract
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
if(
|
|
399
|
-
return [];
|
|
400
|
-
}
|
|
401
|
-
if(values.summary_type === "sum" || values.summary_type === "avg"){
|
|
402
|
-
/*sum/avg类型可以汇总数值、金额、百分比字段*/
|
|
403
|
-
options = options.filter(function(option){
|
|
404
|
-
var optionFieldType = fields[option.value] && fields[option.value].type;
|
|
405
|
-
if(["formula", "summary"].indexOf(optionFieldType) > -1){
|
|
406
|
-
/*要聚合的字段为公式或汇总字段时,按其字段数据类型判断是否支持聚合*/
|
|
407
|
-
optionFieldType = fields[option.value].data_type;
|
|
408
|
-
}
|
|
409
|
-
return ["number", "currency", "percent"].indexOf(optionFieldType) > -1
|
|
410
|
-
});
|
|
411
|
-
}
|
|
412
|
-
else{
|
|
413
|
-
/*min、max类型可以汇总数值、金额、百分比、日期、日期时间字段*/
|
|
414
|
-
options = options.filter(function(option){
|
|
415
|
-
var optionFieldType = fields[option.value] && fields[option.value].type;
|
|
416
|
-
if(["formula", "summary"].indexOf(optionFieldType) > -1){
|
|
417
|
-
/*要聚合的字段为公式或汇总字段时,按其字段数据类型判断是否支持聚合*/
|
|
418
|
-
optionFieldType = fields[option.value].data_type;
|
|
419
|
-
}
|
|
420
|
-
return ["number", "currency", "percent", "date", "datetime"].indexOf(optionFieldType) > -1
|
|
421
|
-
});
|
|
422
|
-
}
|
|
423
|
-
return options;
|
|
424
|
-
}
|
|
425
|
-
}
|
|
421
|
+
amis:
|
|
422
|
+
"autoComplete":
|
|
423
|
+
"method": "get"
|
|
424
|
+
"url": "${context.rootUrl}/service/api/@${summary_object}/uiSchema?summary_object=${summary_object}&summary_type=${summary_type}&term=${term}"
|
|
425
|
+
"data":
|
|
426
|
+
"summary_type": "${summary_type}"
|
|
427
|
+
"headers":
|
|
428
|
+
"Authorization": "Bearer ${context.tenantId},${context.authToken}"
|
|
429
|
+
"sendOn": "!!this.summary_object && !!this.summary_type"
|
|
430
|
+
"adaptor": "const summary_type = api.body.summary_type;\nconst term = api.query.term;\nlet fields = payload.fields;\nlet options = [];\nif (fields) {\n if (summary_type && summary_type !== \"count\") {\n if (summary_type === \"sum\" || summary_type === \"avg\") {\n /*sum/avg类型可以汇总数值、金额、百分比字段*/\n _.forEach(fields, (value, key) => {\n let fieldType = value.type;\n if ([\"formula\", \"summary\"].indexOf(fieldType) > -1) {\n /*要聚合的字段为公式或汇总字段时,按其字段数据类型判断是否支持聚合*/\n fieldType = value.data_type;\n }\n if ([\"number\", \"currency\", \"percent\"].indexOf(fieldType) > -1) {\n options.push({ label: value.label, value: value.name });\n }\n })\n }\n else {\n /*min、max类型可以汇总数值、金额、百分比、日期、日期时间字段*/\n _.forEach(fields, (value, key) => {\n let fieldType = value.type;\n if ([\"formula\", \"summary\"].indexOf(fieldType) > -1) {\n /*要聚合的字段为公式或汇总字段时,按其字段数据类型判断是否支持聚合*/\n fieldType = value.data_type;\n }\n if ([\"number\", \"currency\", \"percent\", \"date\", \"datetime\"].indexOf(fieldType) > -1) {\n options.push({ label: value.label, value: value.name });\n }\n })\n }\n }\n if (term) {\n options = _.filter(options, (item) => {\n return item.label.toLowerCase().indexOf(term.toLowerCase()) > -1;\n })\n }\n}\npayload = {\n data: { options: options },\n msg: \"\",\n status: 0\n}\nreturn payload;"
|
|
426
431
|
visible_on: "{{formData.type === 'summary' && formData.summary_type !== 'count' ? true: false}}"
|
|
427
432
|
required: "{{formData.type === 'summary' && formData.summary_type !== 'count' ? true: false}}"
|
|
428
433
|
sort_no: 320
|
|
@@ -1,94 +1,98 @@
|
|
|
1
1
|
name: object_triggers
|
|
2
2
|
icon: apex
|
|
3
3
|
label: Object Triggers
|
|
4
|
+
version: 2.0
|
|
4
5
|
hidden: true
|
|
5
6
|
fields:
|
|
6
|
-
|
|
7
|
+
_name:
|
|
7
8
|
type: text
|
|
8
|
-
label: Name
|
|
9
|
+
label: Api Name
|
|
9
10
|
searchable: true
|
|
10
11
|
index: true
|
|
11
12
|
required: true
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
13
|
+
name:
|
|
14
|
+
data_type: text
|
|
15
|
+
type: text
|
|
16
|
+
visible_on: "{{false}}"
|
|
17
|
+
listenTo:
|
|
16
18
|
label: Object
|
|
17
19
|
type: master_detail
|
|
18
20
|
reference_to: objects
|
|
19
21
|
reference_to_field: name
|
|
20
22
|
required: true
|
|
21
|
-
# on:
|
|
22
|
-
# label: 运行于
|
|
23
|
-
# type: lookup
|
|
24
|
-
# required: true
|
|
25
|
-
# optionsFunction: !<tag:yaml.org,2002:js/function> |-
|
|
26
|
-
# function () {
|
|
27
|
-
# return [{
|
|
28
|
-
# label: "客户端",
|
|
29
|
-
# value: "client",
|
|
30
|
-
# icon: "address"
|
|
31
|
-
# }, {
|
|
32
|
-
# label: "服务端",
|
|
33
|
-
# value: "server",
|
|
34
|
-
# icon: "address"
|
|
35
|
-
# }];
|
|
36
|
-
# }
|
|
37
23
|
when:
|
|
38
24
|
label: Execution Time Option
|
|
39
|
-
type:
|
|
25
|
+
type: select
|
|
40
26
|
required: true
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
27
|
+
multiple: true
|
|
28
|
+
is_wide: true
|
|
29
|
+
options: [{
|
|
44
30
|
label: "新增记录之前",
|
|
45
|
-
value: "beforeInsert"
|
|
46
|
-
icon: "asset_relationship"
|
|
31
|
+
value: "beforeInsert"
|
|
47
32
|
}, {
|
|
48
33
|
label: "新增记录之后",
|
|
49
|
-
value: "afterInsert"
|
|
50
|
-
icon: "asset_relationship"
|
|
34
|
+
value: "afterInsert"
|
|
51
35
|
}, {
|
|
52
36
|
label: "修改记录之前",
|
|
53
|
-
value: "beforeUpdate"
|
|
54
|
-
icon: "asset_relationship"
|
|
37
|
+
value: "beforeUpdate"
|
|
55
38
|
}, {
|
|
56
39
|
label: "修改记录之后",
|
|
57
|
-
value: "afterUpdate"
|
|
58
|
-
icon: "asset_relationship"
|
|
40
|
+
value: "afterUpdate"
|
|
59
41
|
}, {
|
|
60
42
|
label: "删除记录之前",
|
|
61
|
-
value: "beforeDelete"
|
|
62
|
-
icon: "asset_relationship"
|
|
43
|
+
value: "beforeDelete"
|
|
63
44
|
}, {
|
|
64
45
|
label: "删除记录之后",
|
|
65
|
-
value: "afterDelete"
|
|
66
|
-
icon: "asset_relationship"
|
|
46
|
+
value: "afterDelete"
|
|
67
47
|
}, {
|
|
68
48
|
label: "查下记录之前",
|
|
69
|
-
value: "beforeFind"
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
is_enable:
|
|
74
|
-
label: Enable
|
|
49
|
+
value: "beforeFind"
|
|
50
|
+
}]
|
|
51
|
+
isEnabled:
|
|
52
|
+
label: Enabled
|
|
75
53
|
type: boolean
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
54
|
+
defaultValue: true
|
|
55
|
+
handler:
|
|
56
|
+
label: Handler
|
|
57
|
+
type: code
|
|
58
|
+
language: javascript
|
|
80
59
|
is_wide: true
|
|
60
|
+
required: true
|
|
61
|
+
defaultValue: |-
|
|
62
|
+
// _ : lodash
|
|
63
|
+
// moment: moment
|
|
64
|
+
// validator: validator
|
|
65
|
+
// ctx
|
|
66
|
+
// objects
|
|
67
|
+
// services
|
|
68
|
+
editorDidMount: |-
|
|
69
|
+
if(window._registerCompletionItemProviderTrigger){
|
|
70
|
+
return ;
|
|
71
|
+
}
|
|
72
|
+
window._registerCompletionItemProviderTrigger = true;
|
|
73
|
+
const result = Steedos.authRequest("/service/api/suggestions/trigger.d.ts", {async: false});
|
|
74
|
+
monaco.languages.typescript.javascriptDefaults.addExtraLib(
|
|
75
|
+
result
|
|
76
|
+
);
|
|
77
|
+
record_permissions:
|
|
78
|
+
type: object
|
|
79
|
+
visible_on: "{{global.mode ==='read' ? true : false}}"
|
|
80
|
+
is_system:
|
|
81
|
+
type: boolean
|
|
82
|
+
label: System
|
|
83
|
+
readonly: true
|
|
84
|
+
visible_on: "{{global.mode ==='read' ? true : false}}"
|
|
85
|
+
disabled: true
|
|
81
86
|
paging:
|
|
82
87
|
enabled: false
|
|
83
88
|
list_views:
|
|
84
89
|
all:
|
|
85
90
|
columns:
|
|
86
91
|
- name
|
|
87
|
-
|
|
88
|
-
- object
|
|
89
|
-
# - 'on'
|
|
92
|
+
- listenTo
|
|
90
93
|
- when
|
|
91
|
-
-
|
|
94
|
+
- isEnabled
|
|
95
|
+
- is_system
|
|
92
96
|
label: All
|
|
93
97
|
filter_scope: space
|
|
94
98
|
permission_set:
|