@steedos/standard-process-approval 2.3.1 → 2.3.2-beta.10

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 (19) hide show
  1. package/main/default/objectTranslations/workflow_outbound_messages.en/workflow_outbound_messages.en.objectTranslation.yml +38 -0
  2. package/main/default/objectTranslations/workflow_outbound_messages.zh-CN/workflow_outbound_messages.zh-CN.objectTranslation.yml +38 -0
  3. package/main/default/objectTranslations/workflow_rule.en/workflow_rule.en.objectTranslation.yml +27 -0
  4. package/main/default/objectTranslations/workflow_rule.zh-CN/workflow_rule.zh-CN.objectTranslation.yml +23 -0
  5. package/main/default/objects/workflow-actions/workflow_notifications.object.yml +1 -0
  6. package/main/default/objects/workflow-actions/workflow_outbound_messages/fields/description.field.yml +5 -0
  7. package/main/default/objects/workflow-actions/workflow_outbound_messages/fields/endpoint_url.field.yml +6 -0
  8. package/main/default/objects/workflow-actions/workflow_outbound_messages/fields/label.field.yml +8 -0
  9. package/main/default/objects/workflow-actions/workflow_outbound_messages/fields/name.field.yml +7 -0
  10. package/main/default/objects/workflow-actions/workflow_outbound_messages/fields/object_fields_to_send.field.yml +18 -0
  11. package/main/default/objects/workflow-actions/workflow_outbound_messages/fields/object_name.field.yml +11 -0
  12. package/main/default/objects/workflow-actions/workflow_outbound_messages/fields/user_to_send_as.field.yml +6 -0
  13. package/main/default/objects/workflow-actions/workflow_outbound_messages/listviews/all.listview.yml +16 -0
  14. package/main/default/objects/workflow-actions/workflow_outbound_messages/permissions/admin.permission.yml +14 -0
  15. package/main/default/objects/workflow-actions/workflow_outbound_messages/permissions/user.permission.yml +14 -0
  16. package/main/default/objects/workflow-actions/workflow_outbound_messages/workflow_outbound_messages.object.yml +7 -0
  17. package/main/default/objects/workflow-actions/workflow_rule.object.yml +132 -1
  18. package/main/default/triggers/workflow_outbound_messages.trigger.js +236 -0
  19. package/package.json +2 -2
@@ -0,0 +1,38 @@
1
+ name: workflow_outbound_messages
2
+ label: Outbound Message Actions
3
+ description:
4
+ fields:
5
+ name:
6
+ label: API Name
7
+ help:
8
+ description:
9
+ label:
10
+ label: Label
11
+ help:
12
+ description:
13
+ object_name:
14
+ label: Object
15
+ help:
16
+ description:
17
+ description:
18
+ label: Description
19
+ help:
20
+ description:
21
+ endpoint_url:
22
+ label: Endpoint URL
23
+ help:
24
+ description:
25
+ user_to_send_as:
26
+ label: User to send as
27
+ help:
28
+ description:
29
+ object_fields_to_send:
30
+ label: Object fields to send
31
+ help:
32
+ description:
33
+ listviews:
34
+ all:
35
+ label: All
36
+ actions:
37
+ customize:
38
+ label: Customize
@@ -0,0 +1,38 @@
1
+ name: workflow_outbound_messages
2
+ label: 出站消息
3
+ description:
4
+ fields:
5
+ name:
6
+ label: API 名称
7
+ help: API 名称只能包含小写字母、数字,必须以字母开头,不能以下划线字符结尾或包含两个连续的下划线字符
8
+ description:
9
+ label:
10
+ label: 显示名称
11
+ help:
12
+ description:
13
+ object_name:
14
+ label: 对象
15
+ help:
16
+ description:
17
+ description:
18
+ label: 描述
19
+ help:
20
+ description:
21
+ endpoint_url:
22
+ label: 端点 URL
23
+ help:
24
+ description:
25
+ user_to_send_as:
26
+ label: 发送方用户
27
+ help:
28
+ description:
29
+ object_fields_to_send:
30
+ label: 要发送的字段
31
+ help:
32
+ description:
33
+ listviews:
34
+ all:
35
+ label: 所有
36
+ actions:
37
+ customize:
38
+ label: 自定义
@@ -37,13 +37,40 @@ fields:
37
37
  label: Field Update
38
38
  help:
39
39
  description:
40
+ workflow_notifications_actions:
41
+ label: Notification
42
+ help:
43
+ description:
44
+ workflow_outbound_messages_actions:
45
+ label: Outbound Message
46
+ help:
47
+ description:
40
48
  description:
41
49
  label:
42
50
  help:
43
51
  description:
52
+ time_triggers:
53
+ label: Time Triggers
54
+ time_triggers.$:
55
+ label: Field
56
+ time_triggers.$.number:
57
+ label: Number
58
+ time_triggers.$.unit:
59
+ label: Unit
60
+ time_triggers.$.type:
61
+ label: Type
62
+ time_triggers.$.date_field:
63
+ label: Date Field
64
+ time_triggers.$.updates_field_actions:
65
+ label: Field Update
66
+ time_triggers.$.workflow_notifications_actions:
67
+ label: Notification
68
+ time_triggers.$.workflow_outbound_messages_actions:
69
+ label: Outbound Message Actions
44
70
  groups:
45
71
  rule_criteria: Rule Criteria
46
72
  immediate_actions: Immediate Actions
73
+ time_triggers: Time-Dependent Action
47
74
  listviews:
48
75
  all:
49
76
  label: All
@@ -41,13 +41,36 @@ fields:
41
41
  label: 工作流通知
42
42
  help:
43
43
  description:
44
+ workflow_outbound_messages_actions:
45
+ label: 出站消息
46
+ help:
47
+ description:
44
48
  description:
45
49
  label: 描述
46
50
  help:
47
51
  description:
52
+ time_triggers:
53
+ label: 时间触发器
54
+ time_triggers.$:
55
+ label: Field
56
+ time_triggers.$.number:
57
+ label: 数值
58
+ time_triggers.$.unit:
59
+ label: 单位
60
+ time_triggers.$.type:
61
+ label: 类型
62
+ time_triggers.$.date_field:
63
+ label: 日期字段
64
+ time_triggers.$.updates_field_actions:
65
+ label: 工作流操作:字段更新
66
+ time_triggers.$.workflow_notifications_actions:
67
+ label: 工作流操作:工作流通知
68
+ time_triggers.$.workflow_outbound_messages_actions:
69
+ label: 工作流操作:出站消息
48
70
  groups:
49
71
  rule_criteria: 规则条件
50
72
  immediate_actions: 即时操作
73
+ time_triggers: 依赖于时间的工作流操作
51
74
  listviews:
52
75
  all:
53
76
  label: 所有
@@ -3,6 +3,7 @@ label: Workflow Notification
3
3
  icon: quick_text
4
4
  hidden: true
5
5
  enable_inline_edit: false
6
+ enable_enhanced_lookup: true
6
7
  version: 2
7
8
  fields:
8
9
  name:
@@ -0,0 +1,5 @@
1
+ name: description
2
+ label: 描述
3
+ type: textarea
4
+ sort_no: 40
5
+ is_wide: true
@@ -0,0 +1,6 @@
1
+ name: endpoint_url
2
+ label: 端点 URL
3
+ type: url
4
+ required: true
5
+ sort_no: 50
6
+ is_wide: true
@@ -0,0 +1,8 @@
1
+ name: label
2
+ label: 名称
3
+ type: text
4
+ required: true
5
+ searchable: true
6
+ index: true
7
+ is_name: true
8
+ sort_no: 20
@@ -0,0 +1,7 @@
1
+ name: name
2
+ label: Api Name
3
+ type: text
4
+ required: true
5
+ searchable: true
6
+ index: true
7
+ sort_no: 30
@@ -0,0 +1,18 @@
1
+ name: object_fields_to_send
2
+ label: 要发送的字段
3
+ type: lookup
4
+ multiple: true
5
+ is_wide: true
6
+ depend_on:
7
+ - object_name
8
+ optionsFunction: !<tag:yaml.org,2002:js/function> |-
9
+ function (values) {
10
+ if (!(values != null ? values.object_name : void 0)) {
11
+ values.object_name = Session.get("object_name");
12
+ }
13
+ if(values.object_name && !_.isString(values.object_name)){
14
+ values.object_name = values.object_name.name
15
+ }
16
+ return Creator.getObjectFieldOptions(values != null ? values.object_name : void 0);
17
+ }
18
+ sort_no: 70
@@ -0,0 +1,11 @@
1
+ name: object_name
2
+ label: 对象
3
+ type: lookup
4
+ required: true
5
+ is_wide: true
6
+ optionsFunction: !!js/function |
7
+ function () {
8
+ return Steedos.getObjectsOptions();
9
+ }
10
+ index: true
11
+ sort_no: 10
@@ -0,0 +1,6 @@
1
+ name: user_to_send_as
2
+ label: 发送方用户
3
+ type: lookup
4
+ reference_to: users
5
+ sort_no: 60
6
+ hidden: true
@@ -0,0 +1,16 @@
1
+ name: all
2
+ columns:
3
+ - field: object_name
4
+ - field: label
5
+ - field: name
6
+ - field: description
7
+ - field: endpoint_url
8
+ - field: modified
9
+ filter_scope: space
10
+ filters: []
11
+ label: 所有
12
+ mobile_columns: []
13
+ scrolling_mode: standard
14
+ shared: true
15
+ sort_no: 100
16
+ type: grid
@@ -0,0 +1,14 @@
1
+ name: 出站消息.管理员
2
+ allowCreate: true
3
+ allowCreateFiles: true
4
+ allowDelete: true
5
+ allowDeleteFiles: true
6
+ allowEdit: true
7
+ allowEditFiles: true
8
+ allowRead: true
9
+ allowReadFiles: true
10
+ modifyAllFiles: true
11
+ modifyAllRecords: true
12
+ permission_set_id: admin
13
+ viewAllFiles: true
14
+ viewAllRecords: true
@@ -0,0 +1,14 @@
1
+ name: 出站消息.用户
2
+ allowCreate: false
3
+ allowCreateFiles: false
4
+ allowDelete: false
5
+ allowDeleteFiles: false
6
+ allowEdit: false
7
+ allowEditFiles: false
8
+ allowRead: true
9
+ allowReadFiles: true
10
+ modifyAllRecords: false
11
+ permission_set_id: user
12
+ viewAllFiles: true
13
+ viewAllRecords: true
14
+ viewCompanyRecords: true
@@ -0,0 +1,7 @@
1
+ name: workflow_outbound_messages
2
+ label: 出站消息
3
+ icon: app
4
+ version: 2
5
+ hidden: true
6
+ enable_inline_edit: false
7
+ enable_enhanced_lookup: true
@@ -71,11 +71,142 @@ fields:
71
71
  return "object_name eq '" + dependValues.object_name + "'";
72
72
  }
73
73
  }
74
+ workflow_outbound_messages_actions:
75
+ type: lookup
76
+ group: Immediate Actions
77
+ multiple: true
78
+ label: 出站消息
79
+ is_wide: true
80
+ reference_to: workflow_outbound_messages
81
+ reference_to_field: name
82
+ depend_on:
83
+ - object_name
84
+ filtersFunction: !!js/function |
85
+ function (filters, dependValues) {
86
+ if(dependValues && dependValues.object_name){
87
+ return "object_name eq '" + dependValues.object_name + "'";
88
+ }
89
+ }
74
90
  # boolean_filter: # TODO 暂不支持
75
91
  # type: text
76
92
  # criteria: # TODO 暂不支持
77
93
  # type: textarea
78
- # time_triggers #TODO 暂不支持
94
+ filters:
95
+ label: 过滤条件
96
+ type: code
97
+ is_wide: true
98
+ hidden: false
99
+ readonly: false
100
+ # visible_on: "{{global.mode ==='read' ? true : false}}"
101
+ depend_on:
102
+ - object_name
103
+ group: 依赖于时间的工作流操作
104
+ time_triggers:
105
+ type: grid
106
+ label: 时间触发器
107
+ is_wide: true
108
+ required: false
109
+ group: 依赖于时间的工作流操作
110
+ time_triggers.$:
111
+ label: Field
112
+ blackbox: true
113
+ type: object
114
+ time_triggers.$.number:
115
+ label: 数值
116
+ type: number
117
+ scale: 0
118
+ required: true
119
+ time_triggers.$.unit:
120
+ label: 单位
121
+ type: select
122
+ options:
123
+ - label: 小时
124
+ value: hour
125
+ - label: 天
126
+ value: day
127
+ required: true
128
+ time_triggers.$.type:
129
+ label: 类型
130
+ type: select
131
+ options:
132
+ - label: 早于
133
+ value: earlier_than
134
+ - label: 晚于
135
+ value: later_than
136
+ required: true
137
+ time_triggers.$.date_field:
138
+ label: 日期字段
139
+ type: select
140
+ depend_on:
141
+ - object_name
142
+ optionsFunction: !!js/function |
143
+ function (values) {
144
+ console.log('values: ', values);
145
+ const object_name = values.object_name;
146
+ const options = [];
147
+ if (object_name) {
148
+ var object = Creator.getObject(object_name);
149
+ var objectLabel = object.label;
150
+ var fields = object.fields;
151
+ for(const key in fields) {
152
+ if (Object.hasOwnProperty.call(fields, key)) {
153
+ const f = fields[key]
154
+ if (!f.hidden && (f.type == 'datetime' || f.type == 'date')) {
155
+ options.push({
156
+ label: objectLabel + ': ' + f.label,
157
+ value: f.name
158
+ })
159
+ }
160
+ }
161
+ }
162
+ }
163
+ return options
164
+ }
165
+ time_triggers.$.updates_field_actions:
166
+ type: lookup
167
+ multiple: true
168
+ label: 工作流操作:字段更新
169
+ is_wide: true
170
+ reference_to: action_field_updates
171
+ reference_to_field: name
172
+ depend_on:
173
+ - object_name
174
+ filtersFunction: !!js/function |
175
+ function (filters, dependValues) {
176
+ if(dependValues && dependValues.object_name){
177
+ return "object_name eq '" + dependValues.object_name + "'";
178
+ }
179
+ }
180
+ time_triggers.$.workflow_notifications_actions:
181
+ type: lookup
182
+ multiple: true
183
+ label: 工作流操作:工作流通知
184
+ is_wide: true
185
+ reference_to: workflow_notifications
186
+ reference_to_field: name
187
+ depend_on:
188
+ - object_name
189
+ filtersFunction: !!js/function |
190
+ function (filters, dependValues) {
191
+ if(dependValues && dependValues.object_name){
192
+ return "object_name eq '" + dependValues.object_name + "'";
193
+ }
194
+ }
195
+ time_triggers.$.workflow_outbound_messages_actions:
196
+ type: lookup
197
+ multiple: true
198
+ label: 工作流操作:出站消息
199
+ is_wide: true
200
+ reference_to: workflow_outbound_messages
201
+ reference_to_field: name
202
+ depend_on:
203
+ - object_name
204
+ filtersFunction: !!js/function |
205
+ function (filters, dependValues) {
206
+ if(dependValues && dependValues.object_name){
207
+ return "object_name eq '" + dependValues.object_name + "'";
208
+ }
209
+ }
79
210
  description:
80
211
  type: textarea
81
212
  is_wide: true
@@ -0,0 +1,236 @@
1
+ const _ = require("underscore");
2
+ const util = require('@steedos/standard-objects').util;
3
+ const objectql = require("@steedos/objectql");
4
+ const InternalData = require('@steedos/standard-objects').internalData;
5
+
6
+ const getInternalOutboundMessages = function(sourceOutboundMessages, filters){
7
+ let dbOutboundMessages = Creator.getCollection("workflow_outbound_messages").find(filters, {fields:{_id:1, name:1}}).fetch();
8
+ let messages = [];
9
+
10
+ if(!filters.is_system){
11
+ _.forEach(sourceOutboundMessages, function(doc){
12
+ if(!_.find(dbOutboundMessages, function(p){
13
+ return p.name === doc.name
14
+ })){
15
+ messages.push(doc);
16
+ }
17
+ })
18
+ }
19
+ return messages;
20
+ }
21
+
22
+ module.exports = {
23
+ beforeInsert: async function () {
24
+ await util.checkAPIName(this.object_name, 'name', this.doc.name, undefined, [['is_system','!=', true]]);
25
+ },
26
+ beforeUpdate: async function () {
27
+ if (_.has(this.doc, 'name')) {
28
+ await util.checkAPIName(this.object_name, 'name', this.doc.name, this.id, [['is_system','!=', true]]);
29
+ }
30
+ },
31
+ afterFind: async function(){
32
+ let filters = InternalData.parserFilters(this.query.filters)
33
+ let messages = [];
34
+ if(filters.name && filters.name.$in){
35
+ for(let _name of filters.name.$in){
36
+ let message = objectql.getWorkflowOutboundMessage(_name);
37
+ if(message){
38
+ messages.push(message);
39
+ }
40
+ }
41
+ }else if(filters._id && !filters._id.$ne){
42
+ let message = objectql.getWorkflowOutboundMessage(filters._id);
43
+ if(message){
44
+ messages.push(message);
45
+ }
46
+ }else if(filters.object_name){
47
+ messages = objectql.getObjectOutboundMessages(filters.object_name);
48
+ delete filters.object_name;
49
+ }else{
50
+ messages = objectql.getAllWorkflowOutboundMessages();
51
+ }
52
+
53
+ if(filters._id && filters._id.$ne){
54
+ if(!_.isArray(filters._id.$ne)){
55
+ filters._id.$ne = [filters._id.$ne]
56
+ }
57
+ for(let neid of filters._id.$ne){
58
+ messages = _.filter(messages, function(item){
59
+ return item._id !== neid
60
+ })
61
+ }
62
+ }
63
+
64
+ messages = getInternalOutboundMessages(messages, filters);
65
+
66
+ if(messages && messages.length>0){
67
+ this.data.values = this.data.values.concat(messages)
68
+ }
69
+ },
70
+ afterAggregate: async function(){
71
+ let filters = InternalData.parserFilters(this.query.filters)
72
+ let messages = [];
73
+ if(filters._id && filters._id.$in){
74
+ for(let id of filters._id.$in){
75
+ let message = objectql.getWorkflowOutboundMessage(id);
76
+ if(message){
77
+ messages.push(message);
78
+ }
79
+ }
80
+ }else if(filters._id && !filters._id.$ne){
81
+ let message = objectql.getWorkflowOutboundMessage(filters._id);
82
+ if(message){
83
+ messages.push(message);
84
+ }
85
+ }else if(filters.object_name){
86
+ messages = objectql.getObjectOutboundMessages(filters.object_name);
87
+ delete filters.object_name;
88
+ }else{
89
+ messages = objectql.getAllWorkflowOutboundMessages();
90
+ }
91
+
92
+ if(filters._id && filters._id.$ne){
93
+ if(!_.isArray(filters._id.$ne)){
94
+ filters._id.$ne = [filters._id.$ne]
95
+ }
96
+ for(let neid of filters._id.$ne){
97
+ messages = _.filter(messages, function(item){
98
+ return item._id !== neid
99
+ })
100
+ }
101
+ }
102
+ },
103
+ afterFind: async function(){
104
+ let filters = InternalData.parserFilters(this.query.filters)
105
+ let messages = [];
106
+ if(filters.name && filters.name.$in){
107
+ for(let _name of filters.name.$in){
108
+ let message = objectql.getWorkflowOutboundMessage(_name);
109
+ if(message){
110
+ messages.push(message);
111
+ }
112
+ }
113
+ }else if(filters._id && !filters._id.$ne){
114
+ let message = objectql.getWorkflowOutboundMessage(filters._id);
115
+ if(message){
116
+ messages.push(message);
117
+ }
118
+ }else if(filters.object_name){
119
+ messages = objectql.getObjectWorkflowOutboundMessages(filters.object_name);
120
+ delete filters.object_name;
121
+ }else{
122
+ messages = objectql.getAllWorkflowOutboundMessages();
123
+ }
124
+
125
+ if(filters._id && filters._id.$ne){
126
+ if(!_.isArray(filters._id.$ne)){
127
+ filters._id.$ne = [filters._id.$ne]
128
+ }
129
+ for(let neid of filters._id.$ne){
130
+ messages = _.filter(messages, function(item){
131
+ return item._id !== neid
132
+ })
133
+ }
134
+ }
135
+
136
+ messages = getInternalOutboundMessages(messages, filters);
137
+
138
+ if(messages && messages.length>0){
139
+ this.data.values = this.data.values.concat(messages)
140
+ }
141
+ },
142
+ afterAggregate: async function(){
143
+ let filters = InternalData.parserFilters(this.query.filters)
144
+ let messages = [];
145
+ if(filters._id && filters._id.$in){
146
+ for(let id of filters._id.$in){
147
+ let message = objectql.getWorkflowOutboundMessage(id);
148
+ if(message){
149
+ messages.push(message);
150
+ }
151
+ }
152
+ }else if(filters._id && !filters._id.$ne){
153
+ let message = objectql.getWorkflowOutboundMessage(filters._id);
154
+ if(message){
155
+ messages.push(message);
156
+ }
157
+ }else if(filters.object_name){
158
+ messages = objectql.getObjectOutboundMessages(filters.object_name);
159
+ delete filters.object_name;
160
+ }else{
161
+ messages = objectql.getAllWorkflowOutboundMessages();
162
+ }
163
+
164
+ if(filters._id && filters._id.$ne){
165
+ if(!_.isArray(filters._id.$ne)){
166
+ filters._id.$ne = [filters._id.$ne]
167
+ }
168
+ for(let neid of filters._id.$ne){
169
+ messages = _.filter(messages, function(item){
170
+ return item._id !== neid
171
+ })
172
+ }
173
+ }
174
+
175
+ messages = getInternalOutboundMessages(messages, filters);
176
+
177
+ if(messages && messages.length>0){
178
+ this.data.values = this.data.values.concat(messages)
179
+ }
180
+ },
181
+ afterCount: async function(){
182
+ let filters = InternalData.parserFilters(this.query.filters)
183
+ let messages = [];
184
+ if(filters._id && filters._id.$in){
185
+ for(let id of filters._id.$in){
186
+ let message = objectql.getWorkflowOutboundMessage(id);
187
+ if(message){
188
+ messages.push(message);
189
+ }
190
+ }
191
+ }else if(filters._id && !filters._id.$ne){
192
+ let message = objectql.getWorkflowOutboundMessage(filters._id);
193
+ if(message){
194
+ messages.push(message);
195
+ }
196
+ }else if(filters.object_name){
197
+ messages = objectql.getObjectWorkflowOutboundMessages(filters.object_name);
198
+ delete filters.object_name;
199
+ }else{
200
+ messages = objectql.getAllWorkflowOutboundMessages();
201
+ }
202
+
203
+ if(filters._id && filters._id.$ne){
204
+ if(!_.isArray(filters._id.$ne)){
205
+ filters._id.$ne = [filters._id.$ne]
206
+ }
207
+ for(let neid of filters._id.$ne){
208
+ messages = _.filter(messages, function(item){
209
+ return item._id !== neid
210
+ })
211
+ }
212
+ }
213
+
214
+ messages = getInternalOutboundMessages(messages, filters);
215
+
216
+ if(messages && messages.length>0){
217
+ this.data.values = this.data.values + messages.length
218
+ }
219
+ },
220
+ afterFindOne: async function(){
221
+ if(_.isEmpty(this.data.values)){
222
+ let id = this.id
223
+
224
+ let dbNotification = Creator.getCollection("workflow_outbound_messages").find({name: id}).fetch();
225
+ if(dbNotification && dbNotification.length > 0){
226
+ this.data.values = dbNotification[0];
227
+ return;
228
+ }
229
+
230
+ let message = objectql.getWorkflowOutboundMessage(id);
231
+ if(message){
232
+ this.data.values = message;
233
+ }
234
+ }
235
+ },
236
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@steedos/standard-process-approval",
3
- "version": "2.3.1",
3
+ "version": "2.3.2-beta.10",
4
4
  "main": "package.service.js",
5
5
  "private": false,
6
6
  "publishConfig": {
@@ -12,5 +12,5 @@
12
12
  "description": "steedos package",
13
13
  "repository": {},
14
14
  "license": "MIT",
15
- "gitHead": "f8938e298cec11b2f91172e0d3506079daa7d670"
15
+ "gitHead": "44b1617fea53eb016e82e72174e1d33bdbfe3fd1"
16
16
  }