@steedos/standard-object-database 2.2.55-beta.16

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 (90) hide show
  1. package/main/default/applications/.gitkeep +0 -0
  2. package/main/default/client/datasources.client.js +7 -0
  3. package/main/default/client/object_fields.client.js +212 -0
  4. package/main/default/client/object_layouts.client.js +86 -0
  5. package/main/default/objectTranslations/_object_reload_logs.en/_object_reload_logs.en.objectTranslation.yml +16 -0
  6. package/main/default/objectTranslations/_object_reload_logs.zh-CN/_object_reload_logs.zh-CN.objectTranslation.yml +16 -0
  7. package/main/default/objectTranslations/datasources.en/datasources.en.objectTranslation.yml +121 -0
  8. package/main/default/objectTranslations/datasources.zh-CN/datasources.zh-CN.objectTranslation.yml +105 -0
  9. package/main/default/objectTranslations/object_actions.en/object_actions.en.objectTranslation.yml +55 -0
  10. package/main/default/objectTranslations/object_actions.zh-CN/object_actions.zh-CN.objectTranslation.yml +50 -0
  11. package/main/default/objectTranslations/object_fields.en/object_fields.en.objectTranslation.yml +335 -0
  12. package/main/default/objectTranslations/object_fields.zh-CN/object_fields.zh-CN.objectTranslation.yml +312 -0
  13. package/main/default/objectTranslations/object_layouts.en/object_layouts.en.objectTranslation.yml +72 -0
  14. package/main/default/objectTranslations/object_layouts.zh-CN/object_layouts.zh-CN.objectTranslation.yml +116 -0
  15. package/main/default/objectTranslations/object_listviews.en/object_listviews.en.objectTranslation.yml +153 -0
  16. package/main/default/objectTranslations/object_listviews.zh-CN/object_listviews.zh-CN.objectTranslation.yml +146 -0
  17. package/main/default/objectTranslations/object_related_list.en/object_related_list.en.objectTranslation.yml +82 -0
  18. package/main/default/objectTranslations/object_related_list.zh-CN/object_related_list.zh-CN.objectTranslation.yml +82 -0
  19. package/main/default/objectTranslations/object_triggers.en/object_triggers.en.objectTranslation.yml +30 -0
  20. package/main/default/objectTranslations/object_triggers.zh-CN/object_triggers.zh-CN.objectTranslation.yml +29 -0
  21. package/main/default/objectTranslations/object_validation_rules.en/object_validation_rules.en.objectTranslation.yml +40 -0
  22. package/main/default/objectTranslations/object_validation_rules.zh-CN/object_validation_rules.zh-CN.objectTranslation.yml +38 -0
  23. package/main/default/objectTranslations/objects.en/objects.en.objectTranslation.yml +219 -0
  24. package/main/default/objectTranslations/objects.zh-CN/objects.zh-CN.objectTranslation.yml +218 -0
  25. package/main/default/objects/0.datasources.observe.object.js +83 -0
  26. package/main/default/objects/0.objects_reload.object.js +26 -0
  27. package/main/default/objects/1.objects.observe.object.js +61 -0
  28. package/main/default/objects/10.tabs.observe.object.js +36 -0
  29. package/main/default/objects/11.restriction_rules.observe.object.js +37 -0
  30. package/main/default/objects/12.share_rules.observe.object.js +37 -0
  31. package/main/default/objects/13.permission_fields.observe.object.js +37 -0
  32. package/main/default/objects/14.object_fields.observe.object.js +44 -0
  33. package/main/default/objects/15.permission_objects.observe.object.js +44 -0
  34. package/main/default/objects/2.object_triggers.observe.object.js +35 -0
  35. package/main/default/objects/3.permission_objects.observe.object.js +29 -0
  36. package/main/default/objects/4.permission_set.observe.object.js +39 -0
  37. package/main/default/objects/5.holidays.observe.object.js +30 -0
  38. package/main/default/objects/6.business_hours.observe.object.js +33 -0
  39. package/main/default/objects/7.object_actions.observe.object.js +43 -0
  40. package/main/default/objects/7.object_layouts.observe.object.js +33 -0
  41. package/main/default/objects/9.apps.observe.object.js +33 -0
  42. package/main/default/objects/_object_reload_logs.object.yml +10 -0
  43. package/main/default/objects/datasources.action.js +51 -0
  44. package/main/default/objects/datasources.core.js +34 -0
  45. package/main/default/objects/datasources.object.js +168 -0
  46. package/main/default/objects/datasources.object.yml +113 -0
  47. package/main/default/objects/object_actions.object.js +152 -0
  48. package/main/default/objects/object_actions.object.yml +142 -0
  49. package/main/default/objects/object_fields.action.js +128 -0
  50. package/main/default/objects/object_fields.function.js +104 -0
  51. package/main/default/objects/object_fields.object.js +501 -0
  52. package/main/default/objects/object_fields.object.yml +690 -0
  53. package/main/default/objects/object_layouts.action.js +31 -0
  54. package/main/default/objects/object_layouts.layouts.action.js +19 -0
  55. package/main/default/objects/object_layouts.object.yml +356 -0
  56. package/main/default/objects/object_listviews.action.js +93 -0
  57. package/main/default/objects/object_listviews.object.js +100 -0
  58. package/main/default/objects/object_listviews.object.yml +309 -0
  59. package/main/default/objects/object_manager.app.todo.yml +11 -0
  60. package/main/default/objects/object_related_list.object.js +110 -0
  61. package/main/default/objects/object_related_list.object.yml +208 -0
  62. package/main/default/objects/object_triggers.core.js +58 -0
  63. package/main/default/objects/object_triggers.object.js +65 -0
  64. package/main/default/objects/object_triggers.object.yml +124 -0
  65. package/main/default/objects/object_validation_rules.action.js +33 -0
  66. package/main/default/objects/object_validation_rules.object.yml +100 -0
  67. package/main/default/objects/objects.action.js +157 -0
  68. package/main/default/objects/objects.core.js +398 -0
  69. package/main/default/objects/objects.erd.data.function.js +85 -0
  70. package/main/default/objects/objects.lib.js +42 -0
  71. package/main/default/objects/objects.object.js +543 -0
  72. package/main/default/objects/objects.object.yml +512 -0
  73. package/main/default/objects/objects.tree.js +58 -0
  74. package/main/default/objects/permission_objects.core.js +75 -0
  75. package/main/default/permissionsets/.gitkeep +0 -0
  76. package/main/default/profiles/.gitkeep +0 -0
  77. package/main/default/tabs/.gitkeep +0 -0
  78. package/main/default/triggers/datasources.trigger.js +93 -0
  79. package/main/default/triggers/object_actions.trigger.js +98 -0
  80. package/main/default/triggers/object_fields.trigger.js +376 -0
  81. package/main/default/triggers/object_layouts.trigger.js +153 -0
  82. package/main/default/triggers/object_listviews.trigger.js +139 -0
  83. package/main/default/triggers/object_triggers.trigger.js +50 -0
  84. package/main/default/triggers/object_validation_rules.trigger.js +80 -0
  85. package/main/default/triggers/objects.trigger.js +136 -0
  86. package/package.json +16 -0
  87. package/package.service.js +75 -0
  88. package/public/.md +3 -0
  89. package/src/.md +3 -0
  90. package/webapp/.md +1 -0
@@ -0,0 +1,543 @@
1
+ const { getObject, getObjectConfig } = require('@steedos/objectql');
2
+ var objectql = require('@steedos/objectql');
3
+ var yaml = require('js-yaml');
4
+ const _ = require('underscore');
5
+ var objectCore = require('./objects.core.js');
6
+ var objectTree = require('./objects.tree.js');
7
+ const internalBaseObjects = ['base', 'core'];
8
+ const relationalDatabases = ['sqlserver','postgres','oracle','mysql','sqlite'];
9
+ function isCodeObjects(name){
10
+ if(_.include(internalBaseObjects, name)){
11
+ return true;
12
+ }
13
+ let objMap = objectql.getSteedosSchema().getObjectMap(name);
14
+ if(objMap && !objMap._id){
15
+ return true;
16
+ }
17
+ return false;
18
+ }
19
+
20
+ function isRepeatedName(doc) {
21
+ // let datasourceName = objectCore.getDataSourceName(doc);
22
+ if(isCodeObjects(doc.name)){
23
+ return true;
24
+ }
25
+
26
+ var other;
27
+ other = Creator.getCollection("objects").find({
28
+ _id: {
29
+ $ne: doc._id
30
+ },
31
+ // space: doc.space,
32
+ name: doc.name
33
+ }, {
34
+ fields: {
35
+ _id: 1,
36
+ is_deleted: 1
37
+ }
38
+ });
39
+ if (other.count() > 0) {
40
+ const otherObjects = other.fetch();
41
+ if(_.find(otherObjects, function(item){
42
+ return item.is_deleted
43
+ })){
44
+ throw new Error('已存在同名对象,请在「已删除」视图中查看')
45
+ }else{
46
+ return true;
47
+ }
48
+ }
49
+ return false;
50
+ };
51
+
52
+ function checkName(name,spaceId){
53
+ if(objectql.hasObjectSuffix(name, spaceId, true)){
54
+ name = name.replace(objectql.getObjectSuffix(spaceId, true), '')
55
+ }
56
+ var reg = new RegExp('^[a-z]([a-z0-9]|_(?!_))*[a-z0-9]$');
57
+ if(!reg.test(name)){
58
+ throw new Error("API 名称只能包含小写字母、数字,必须以字母开头,不能以下划线字符结尾或包含两个连续的下划线字符");
59
+ }
60
+ if(name.length > 50){
61
+ throw new Error("名称长度不能大于50个字符");
62
+ }
63
+ return true
64
+ }
65
+
66
+ function initObjectPermission(userId, doc){
67
+ let lng = Steedos.locale(userId, true)
68
+ let spaceId = doc.space;
69
+ let psetsAdminId = null;
70
+ let psetsAdminLabel = null;
71
+ let psetsAdmin = Creator.getCollection("permission_set").findOne({space: spaceId, name: 'admin'});
72
+ if(!psetsAdmin){
73
+ psetsAdminLabel = TAPi18n.__(`permission_set_admin`, {}, lng)
74
+ psetsAdminId = Creator.getCollection("permission_set").insert({space: spaceId, name: 'admin', type: 'profile', label: TAPi18n.__(`permission_set_admin`, {}, lng)});
75
+ }else{
76
+ psetsAdminLabel = psetsAdmin.label
77
+ psetsAdminId = psetsAdmin._id
78
+ }
79
+ let psetsUserId = null;
80
+ let psetsUserLabel = null;
81
+ let psetsUser = Creator.getCollection("permission_set").findOne({space: spaceId, name: 'user'});
82
+ if(!psetsUser){
83
+ psetsUserLabel = TAPi18n.__(`permission_set_user`, {}, lng)
84
+ psetsUserId = Creator.getCollection("permission_set").insert({space: spaceId, name: 'user', type: 'profile', label: TAPi18n.__(`permission_set_user`, {}, lng)});
85
+ }else{
86
+ psetsUserLabel = psetsUser.label
87
+ psetsUserId = psetsUser._id;
88
+ }
89
+
90
+ Creator.getCollection("permission_objects").insert(Object.assign({}, Creator.getObject("base").permission_set.user, {
91
+ name: doc.label + '.' + psetsUserLabel,
92
+ permission_set_id : psetsUserId,
93
+ object_name : doc.name,
94
+ space: doc.space
95
+ }));
96
+
97
+ Creator.getCollection("permission_objects").insert(Object.assign({}, Creator.getObject("base").permission_set.admin, {
98
+ name: doc.label + '.' + psetsAdminLabel,
99
+ permission_set_id : psetsAdminId,
100
+ object_name : doc.name,
101
+ space: doc.space
102
+ }));
103
+ }
104
+
105
+ function getObjectName(datasource, objectName, spaceId, oldObjectName){
106
+ if(datasource && datasource != 'default'){
107
+ return objectName;
108
+ }else{
109
+ if(objectql.hasObjectSuffix(objectName, spaceId)){
110
+ return objectName;
111
+ }else{
112
+ return objectql._makeNewObjectName(objectName, spaceId, oldObjectName);
113
+ }
114
+ }
115
+ }
116
+
117
+ function isRelationalDatabase(object){
118
+ var datasource = objectCore.getDataSource(object);
119
+ if(datasource){
120
+ return _.include(relationalDatabases, datasource.driver)
121
+ }
122
+ }
123
+
124
+ function canEnable(object){
125
+ if(isRelationalDatabase(object)){
126
+ if(!object.fields || !_.isObject(object.fields)){
127
+ return false
128
+ }else{
129
+ var hasPrimary = false;
130
+ _.each(object.fields, function(field){
131
+ if(field.primary){
132
+ hasPrimary = true;
133
+ }
134
+ })
135
+ // console.log('hasPrimary', hasPrimary);
136
+ return hasPrimary
137
+ }
138
+ }
139
+ return true;
140
+ }
141
+
142
+ // Creator.Objects.objects.actions = {
143
+ // show_object: {
144
+ // label: "Preview",
145
+ // visible: true,
146
+ // on: "record",
147
+ // todo: function (object_name, record_id, item_element) {
148
+ // var record = this.record || Creator.getObjectById(record_id);
149
+ // if(!record){
150
+ // return toastr.error("未找到记录");
151
+ // }
152
+
153
+ // if(record.is_enable === false){
154
+ // return toastr.warning("请先启动对象");
155
+ // }
156
+
157
+ // if(record.datasource && record.datasource != 'default'){
158
+ // var datasource = Creator.odata.get('datasources', record.datasource, 'is_enable');
159
+ // if(!datasource){
160
+ // return toastr.error("未找到数据源");
161
+ // }
162
+ // if(!datasource.is_enable){
163
+ // return toastr.warning("请先启动数据源");
164
+ // }
165
+ // }
166
+
167
+ // var allViews = Creator.odata.query('object_listviews', {$select: '_id', $filter: `(((contains(tolower(object_name),'${record.name}'))) and ((contains(tolower(name),'all'))))`}, true);
168
+
169
+ // if(allViews && allViews.length > 0){
170
+ // Steedos.openWindow(Creator.getRelativeUrl("/app/-/" + record.name + "/grid/" + allViews[0]._id))
171
+ // }else{
172
+ // Steedos.openWindow(Creator.getRelativeUrl("/app/-/" + record.name + "/grid/all"))
173
+ // }
174
+ // }
175
+ // },
176
+ // copy_odata: {
177
+ // label: "Copy OData URL",
178
+ // visible: true,
179
+ // on: "record",
180
+ // todo: function (object_name, record_id, item_element) {
181
+ // var clipboard, o_name, path, record;
182
+ // record = this.record || Creator.getObjectById(record_id);
183
+ // //enable_api 属性未开放
184
+ // if ((record != null ? record.enable_api : void 0) || true) {
185
+ // o_name = record != null ? record.name : void 0;
186
+ // path = SteedosOData.getODataPath(Session.get("spaceId"), o_name);
187
+ // item_element.attr('data-clipboard-text', path);
188
+ // if (!item_element.attr('data-clipboard-new')) {
189
+ // clipboard = new Clipboard(item_element[0]);
190
+ // item_element.attr('data-clipboard-new', true);
191
+ // clipboard.on('success', function (e) {
192
+ // return toastr.success('复制成功');
193
+ // });
194
+ // clipboard.on('error', function (e) {
195
+ // toastr.error('复制失败');
196
+ // return console.error("e");
197
+ // });
198
+ // if (item_element[0].tagName === 'LI' || item_element.hasClass('view-action')) {
199
+ // return item_element.trigger("click");
200
+ // }
201
+ // }
202
+ // } else {
203
+ // return toastr.error('复制失败: 未启用API');
204
+ // }
205
+ // }
206
+ // }
207
+ // }
208
+
209
+ function allowChangeObject(){
210
+ var config = objectql.getSteedosConfig();
211
+ if(config.tenant && config.tenant.saas){
212
+ return false
213
+ }else{
214
+ return true;
215
+ }
216
+ }
217
+
218
+ function onChangeObjectName(oldName, newDoc){
219
+ //修改字段
220
+ Creator.getCollection("object_fields").update({space: newDoc.space, object: oldName}, {$set: {object: newDoc.name}}, {
221
+ multi: true
222
+ });
223
+ //修改视图
224
+ Creator.getCollection("object_listviews").direct.update({space: newDoc.space, object_name: oldName}, {$set: {object_name: newDoc.name}}, {
225
+ multi: true
226
+ });
227
+ //修改权限
228
+ Creator.getCollection("permission_objects").direct.update({space: newDoc.space, object_name: oldName}, {$set: {object_name: newDoc.name}}, {
229
+ multi: true
230
+ });
231
+ //修改action
232
+ Creator.getCollection("object_actions").direct.update({space: newDoc.space, object: oldName}, {$set: {object: newDoc.name}}, {
233
+ multi: true
234
+ });
235
+ //修改trigger
236
+ Creator.getCollection("object_triggers").direct.update({space: newDoc.space, object: oldName}, {$set: {object: newDoc.name}}, {
237
+ multi: true
238
+ });
239
+ //字段表中的reference_to
240
+ Creator.getCollection("object_fields").update({space: newDoc.space, reference_to: oldName}, {$set: {reference_to: newDoc.name}}, {
241
+ multi: true
242
+ });
243
+
244
+ // TODO 确认是否已处理所有相关子表
245
+ }
246
+
247
+ function beforeRemoveObject(doc){
248
+ const objectName = doc.name;
249
+ const obj = getObject(objectName);
250
+ if(obj && obj.details && obj.details.length){
251
+ throw new Meteor.Error(500, `不能删除该对象,因为在已知的主表子表关系中它是以下对象的主对象:${obj.details}`);
252
+ }
253
+ }
254
+
255
+ function beforeRestoreObject(doc){
256
+ let fields = Creator.getCollection("object_fields").find({
257
+ object: doc.name,
258
+ space: doc.space,
259
+ type: "master_detail"
260
+ }, {
261
+ fields: {
262
+ reference_to: 1
263
+ }
264
+ }).fetch();
265
+ _.each(fields, (field)=>{
266
+ if(field.reference_to && _.isString(field.reference_to)){
267
+ let exist = false;
268
+ try{
269
+ exist = !!getObject(field.reference_to);
270
+ }
271
+ catch(ex){
272
+ exist = false;
273
+ }
274
+ if(!exist){
275
+ throw new Meteor.Error(500, `不能还原该对象,因为在已知的主表子表关系中以下主对象未还原:${field.reference_to}`);
276
+ }
277
+ }
278
+ });
279
+ }
280
+
281
+ let objectTriggers = {
282
+ "before.insert.server.objects": {
283
+ on: "server",
284
+ when: "before.insert",
285
+ todo: function (userId, doc) {
286
+ if(!allowChangeObject()){
287
+ throw new Meteor.Error(500, "华炎云服务不包含自定义业务对象的功能,请部署私有云版本");
288
+ }
289
+ checkName(doc.name, doc.space);
290
+ doc.name = getObjectName(doc.datasource, doc.name, doc.space);
291
+ if (isRepeatedName(doc)) {
292
+ throw new Meteor.Error(500, "对象名称不能重复");
293
+ }
294
+ doc.fields_serial_number = 100;
295
+ // if(isRelationalDatabase(doc)){
296
+ // doc.is_enable = false;
297
+ // }
298
+
299
+ doc.custom = true;
300
+ }
301
+ },
302
+ "after.insert.server.objects": {
303
+ on: "server",
304
+ when: "after.insert",
305
+ todo: function (userId, doc) {
306
+ //新增object时,默认新建一个name字段
307
+ Creator.getCollection("object_fields").insert({
308
+ object: doc.name,
309
+ owner: userId,
310
+ _name: "name",
311
+ label: "名称",
312
+ space: doc.space,
313
+ type: "text",
314
+ required: true,
315
+ index: true,
316
+ searchable: true
317
+ });
318
+ // Creator.getCollection("object_fields").insert({
319
+ // object: doc.name,
320
+ // owner: userId,
321
+ // _name: "owner",
322
+ // label: "所有者",
323
+ // space: doc.space,
324
+ // type: "lookup",
325
+ // reference_to: "users",
326
+ // sortable: true,
327
+ // index: true,
328
+ // defaultValue: "{userId}",
329
+ // omit: true,
330
+ // hidden: true
331
+ // });
332
+ Creator.getCollection("object_listviews").insert({
333
+ name: "all",
334
+ label: "所有",
335
+ space: doc.space,
336
+ owner: userId,
337
+ object_name: doc.name,
338
+ shared: true,
339
+ filter_scope: "space",
340
+ columns: [{field: 'name'}]
341
+ });
342
+ Creator.getCollection("object_listviews").insert({
343
+ name: "recent",
344
+ label: "最近查看",
345
+ space: doc.space,
346
+ owner: userId,
347
+ object_name: doc.name,
348
+ shared: true,
349
+ filter_scope: "space",
350
+ columns: [{field: 'name'}]
351
+ });
352
+
353
+ initObjectPermission(userId, doc);
354
+ }
355
+ },
356
+ "before.update.server.objects": {
357
+ on: "server",
358
+ when: "before.update",
359
+ todo: function (userId, doc, fieldNames, modifier, options) {
360
+ if(!allowChangeObject()){
361
+ throw new Meteor.Error(500, "华炎云服务不包含自定义业务对象的功能,请部署私有云版本");
362
+ }
363
+ modifier.$set = modifier.$set || {}
364
+
365
+ if(!doc.is_deleted && modifier.$set.is_deleted){
366
+ beforeRemoveObject(doc);
367
+ }
368
+ else if(doc.is_deleted && !modifier.$set.is_deleted){
369
+ beforeRestoreObject(doc);
370
+ }
371
+ if(modifier.$set.is_enable){
372
+ let fields = doc.fields;
373
+ if (!fields) {
374
+ fields = Creator.getCollection("object_fields").find({space: doc.space, object: doc.name}).fetch();
375
+ }
376
+ if(!canEnable({fields: fields, datasource: modifier.$set.datasource || doc.datasource})){
377
+ // throw new Meteor.Error(500, "不能启用对象,请先配置主键字段");
378
+ }
379
+ }
380
+
381
+ if ((modifier.$set.name && doc.name !== modifier.$set.name) || modifier.$set.datasource && doc.datasource !== modifier.$set.datasource) {
382
+ checkName(modifier.$set.name || doc.name);
383
+ modifier.$set.name = getObjectName(modifier.$set.datasource || doc.datasource, modifier.$set.name || doc.name, doc.space, doc.name);
384
+ if (isRepeatedName({_id: doc._id, name: modifier.$set.name || doc.name, datasource: modifier.$set.datasource || doc.datasource})) {
385
+ throw new Meteor.Error(500, "对象名称不能重复");
386
+ }
387
+ }
388
+ if (modifier.$set) {
389
+ modifier.$set.custom = true;
390
+ }
391
+ if (modifier.$unset && modifier.$unset.custom) {
392
+ delete modifier.$unset.custom;
393
+ }
394
+ }
395
+ },
396
+ "after.update.server.objects": {
397
+ on: "server",
398
+ when: "after.update",
399
+ todo: function (userId, doc, fieldNames, modifier, options) {
400
+ var set = modifier.$set || {}
401
+ if((set.name || set.datasource) && this.previous.name != doc.name){
402
+ onChangeObjectName(this.previous.name, doc);
403
+ }
404
+ }
405
+ },
406
+ "before.remove.server.objects": {
407
+ on: "server",
408
+ when: "before.remove",
409
+ todo: function (userId, doc) {
410
+ if(!allowChangeObject()){
411
+ throw new Meteor.Error(500, "华炎云服务不包含自定义业务对象的功能,请部署私有云版本");
412
+ }
413
+ beforeRemoveObject(doc);
414
+ // var documents, object_collections;
415
+ // if (doc.app_unique_id && doc.app_version) {
416
+ // return;
417
+ // }
418
+ // object_collections = Creator.getCollection(doc.name, doc.space);
419
+ // documents = object_collections.find({}, {
420
+ // fields: {
421
+ // _id: 1
422
+ // }
423
+ // });
424
+ // if (documents.count() > 0) {
425
+ // throw new Meteor.Error(500, `对象(${doc.name})中已经有记录,请先删除记录后, 再删除此对象`);
426
+ // }
427
+ }
428
+ },
429
+ "after.remove.server.objects": {
430
+ on: "server",
431
+ when: "after.remove",
432
+ todo: function (userId, doc) {
433
+
434
+ if(!objectql.hasObjectSuffix(doc.name, doc.space) && !doc.datasource){
435
+ console.warn('warn: Not remove. Invalid custom object -> ', doc.name);
436
+ return;
437
+ }
438
+
439
+ //删除object 后,自动删除fields、actions、triggers、permission_objects
440
+ Creator.getCollection("object_fields").direct.remove({
441
+ object: doc.name,
442
+ space: doc.space
443
+ });
444
+
445
+ Creator.getCollection("object_listviews").direct.remove({
446
+ object_name: doc.name,
447
+ space: doc.space
448
+ });
449
+
450
+ Creator.getCollection("object_actions").direct.remove({
451
+ object: doc.name,
452
+ space: doc.space
453
+ });
454
+
455
+ Creator.getCollection("object_layouts").direct.remove({
456
+ object_name: doc.name,
457
+ space: doc.space
458
+ });
459
+
460
+ Creator.getCollection("object_triggers").direct.remove({
461
+ object: doc.name,
462
+ space: doc.space
463
+ });
464
+
465
+ Creator.getCollection("permission_objects").direct.remove({
466
+ object_name: doc.name,
467
+ space: doc.space
468
+ });
469
+
470
+ Creator.getCollection("permission_fields").direct.remove({
471
+ object_name: doc.name,
472
+ space: doc.space
473
+ });
474
+
475
+ Creator.getCollection("object_workflows").direct.remove({
476
+ object_name: doc.name,
477
+ space: doc.space
478
+ });
479
+
480
+ Creator.getCollection("object_validation_rules").direct.remove({
481
+ object_name: doc.name,
482
+ space: doc.space
483
+ });
484
+
485
+ Creator.getCollection("restriction_rules").direct.remove({
486
+ object_name: doc.name,
487
+ space: doc.space
488
+ });
489
+
490
+ Creator.getCollection("share_rules").direct.remove({
491
+ object_name: doc.name,
492
+ space: doc.space
493
+ });
494
+
495
+ if(Creator.getCollection("process")){
496
+ Creator.getCollection("process").direct.remove({
497
+ object_name: doc.name,
498
+ space: doc.space
499
+ });
500
+ }
501
+
502
+ Creator.getCollection("pages").direct.remove({
503
+ object_name: doc.name,
504
+ space: doc.space
505
+ });
506
+
507
+ Creator.getCollection("tabs").direct.remove({
508
+ object: doc.name,
509
+ space: doc.space
510
+ });
511
+ }
512
+ },
513
+ // "after.update.server.dynamic_load": {
514
+ // on: "server",
515
+ // when: "after.update",
516
+ // todo: function (userId, doc, fieldNames, modifier, options) {
517
+ // loadObject(doc);
518
+ // }
519
+ // }
520
+
521
+ }
522
+ _.each(Creator.Objects.objects.triggers, function(v, k){
523
+ if(k.endsWith('_afterInsert')){
524
+ objectTriggers[k] = v
525
+ }
526
+ })
527
+
528
+ Creator.Objects.objects.triggers = Object.assign(Creator.Objects.objects.triggers || {}, objectTriggers);
529
+
530
+ // Creator.Objects['objects'].methods = {
531
+ // export_yml: async function (req, res) {
532
+ // return Fiber(function () {
533
+ // let { _id } = req.params
534
+ // let obj = Creator.getCollection("objects").findOne({_id: _id})
535
+ // let dataStr = yaml.safeDump(obj);
536
+ // let fileName = obj.name;
537
+ // res.setHeader('Content-type', 'application/x-msdownload');
538
+ // res.setHeader('Content-Disposition', 'attachment;filename='+encodeURI(fileName)+'.object.yml');
539
+ // res.end(dataStr);
540
+ // }).run();
541
+
542
+ // }
543
+ // }