@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,501 @@
1
+ var _ = require("underscore");
2
+ var objectql = require('@steedos/objectql');
3
+ var clone = require('clone');
4
+ var objectCore = require('./objects.core.js');
5
+
6
+ const MAX_MASTER_DETAIL_LEAVE = objectql.MAX_MASTER_DETAIL_LEAVE;
7
+
8
+ function canRemoveNameFileld(doc){
9
+ var object = Creator.getCollection("objects").findOne({name: doc.object}, {fields: {datasource: 1}});
10
+ if(object && object.datasource && object.datasource != 'default'){
11
+ return true;
12
+ }
13
+ return false;
14
+ }
15
+
16
+ function getFieldName(objectName, fieldName, spaceId, oldFieldName){
17
+ var object = Creator.getCollection("objects").findOne({name: objectName}, {fields: {datasource: 1}})
18
+ if(object && object.datasource && object.datasource != 'default'){
19
+ return fieldName;
20
+ }else{
21
+ if(fieldName != 'name' && fieldName != 'owner'){
22
+ return objectql._makeNewFieldName(fieldName, spaceId, oldFieldName);
23
+ }else{
24
+ return fieldName
25
+ }
26
+ }
27
+ }
28
+
29
+ function _syncToObject(doc, event) {
30
+ // var fields, object_fields, table_fields;
31
+ var object_field = Creator.getCollection("object_fields").findOne({
32
+ space: doc.space,
33
+ object: doc.object
34
+ }, {
35
+ fields: {
36
+ created: 0,
37
+ modified: 0,
38
+ owner: 0,
39
+ created_by: 0,
40
+ modified_by: 0
41
+ },
42
+ sort: {
43
+ sort_no: -1
44
+ }
45
+ });
46
+ // fields = {};
47
+ // table_fields = {};
48
+ // _.forEach(object_fields, function (f) {
49
+ // var cf_arr, child_fields;
50
+ // if (/^[a-zA-Z_]\w*(\.\$\.\w+){1}[a-zA-Z0-9]*$/.test(f.name)) {
51
+ // cf_arr = f.name.split(".$.");
52
+ // child_fields = {};
53
+ // child_fields[cf_arr[1]] = f;
54
+ // if (!_.size(table_fields[cf_arr[0]])) {
55
+ // table_fields[cf_arr[0]] = {};
56
+ // }
57
+ // return _.extend(table_fields[cf_arr[0]], child_fields);
58
+ // } else {
59
+ // return fields[f.name] = f;
60
+ // }
61
+ // });
62
+ // _.each(table_fields, function (f, k) {
63
+ // k = getFieldName(doc.object, k, doc.space);
64
+ // if (fields[k].type === "grid") {
65
+ // if (!_.size(fields[k].fields)) {
66
+ // fields[k].fields = {};
67
+ // }
68
+ // return _.extend(fields[k].fields, f);
69
+ // }
70
+ // });
71
+
72
+ if('insert' === event){
73
+ const objectRecord = Creator.getCollection("objects").findOne({
74
+ space: doc.space,
75
+ name: doc.object
76
+ })
77
+ if(objectRecord){
78
+ let fields_serial_number = null;
79
+ if(!objectRecord.fields_serial_number || objectRecord.fields_serial_number < 100){
80
+ fields_serial_number = object_field.sort_no + 10
81
+ }else{
82
+ fields_serial_number = objectRecord.fields_serial_number + 10
83
+ }
84
+
85
+ return Creator.getCollection("objects").update({
86
+ space: doc.space,
87
+ name: doc.object
88
+ }, {
89
+ $set: {fields_serial_number: fields_serial_number}
90
+ });
91
+
92
+ }else{
93
+ // objectql.addObjectFieldConfig(doc.object, doc);
94
+
95
+ // const datasource = objectql.getDataSource();
96
+ // const _doc = objectql.getObjectConfig(doc.object);
97
+ // datasource.setObject(doc.object, _doc);
98
+ // datasource.init();
99
+ // Creator.Objects[doc.object] = _doc;
100
+ // Creator.loadObjects(_doc, _doc.name);
101
+ }
102
+ }
103
+ // console.log('reloadObject', doc.object);
104
+ objectCore.triggerReloadObject(doc.object, 'field', doc, event);
105
+ };
106
+
107
+ function isRepeatedName(doc, name) {
108
+ var other;
109
+ other = Creator.getCollection("object_fields").find({
110
+ object: doc.object,
111
+ space: doc.space,
112
+ _id: {
113
+ $ne: doc._id
114
+ },
115
+ name: name || doc.name
116
+ }, {
117
+ fields: {
118
+ _id: 1
119
+ }
120
+ });
121
+ if (other.count() > 0) {
122
+ return true;
123
+ }
124
+ return false;
125
+ };
126
+ //每个对象只能有一个master_detail
127
+ function hasMultipleMasterDetailTypeFiled(doc) {
128
+ var other;
129
+ other = Creator.getCollection("object_fields").find({
130
+ object: doc.object,
131
+ space: doc.space,
132
+ _id: {
133
+ $ne: doc._id
134
+ },
135
+ type: "master_detail"
136
+ }, {
137
+ fields: {
138
+ _id: 1
139
+ }
140
+ });
141
+ if (other.count() > 0) {
142
+ return true;
143
+ }
144
+ return false;
145
+ };
146
+
147
+ function checkOwnerField(doc) {
148
+ if(doc.name !== "owner"){
149
+ return;
150
+ }
151
+ if(!doc.omit){
152
+ const obj = objectql.getObject(doc.object);
153
+ if(obj.masters && obj.masters.length){
154
+ throw new Meteor.Error(doc.name, "您无法取消勾选“新建、编辑时隐藏”属性,因为当前对象上有主表子表关系字段!");
155
+ }
156
+ }
157
+ }
158
+
159
+ function checkMasterDetailPathsRepeat(doc, masterPaths, detailPaths) {
160
+ // 交叉叠加传入的两个方向的路径判断是否存在同一链条上同名对象可能,同名就直接报错
161
+ _.each(masterPaths, (masterPathItems)=>{
162
+ _.each(detailPaths, (detailPathItems)=>{
163
+ const repeatName = objectql.getRepeatObjectNameFromPaths([masterPathItems.concat(detailPathItems)]);
164
+ if(repeatName){
165
+ throw new Meteor.Error(doc.name, "您无法创建此类字段,因为在主表子表关系链条中存在同名对象:" + repeatName);
166
+ }
167
+ });
168
+ });
169
+ }
170
+
171
+ function checkMasterDetailTypeField(doc, oldReferenceTo) {
172
+ if(!doc || !doc.type || doc.type !== "master_detail"){
173
+ return;
174
+ }
175
+ if(doc.reference_to === doc.object){
176
+ throw new Meteor.Error(doc.name, "您无法创建一个指向自身的[主表/子表]类型字段!");
177
+ }
178
+ const obj = objectql.getObject(doc.object);
179
+ if(!obj){
180
+ throw new Meteor.Error(doc.name, `所属对象未加载!`);
181
+ }
182
+
183
+ const refObj = objectql.getObject(doc.reference_to);
184
+ if(!refObj){
185
+ throw new Meteor.Error(doc.name, `引用对象未加载!`);
186
+ }
187
+
188
+ let currentMasters = obj.masters;
189
+ let currentDetails = obj.details;
190
+ if(oldReferenceTo){
191
+ let index = currentMasters.indexOf(oldReferenceTo);
192
+ if(index >= 0){
193
+ currentMasters.splice(index, 1);
194
+ }
195
+ }
196
+
197
+ if(currentMasters.indexOf(doc.reference_to) > -1){
198
+ throw new Meteor.Error(doc.name, `该对象上已经存在指向相同“引用对象”的其它主表子表关系,无法创建该字段。`);
199
+ }
200
+
201
+ const mastersCount = currentMasters.length;
202
+ const detailsCount = currentDetails.length;
203
+ if(mastersCount > 1){
204
+ throw new Meteor.Error(doc.name, "您无法创建此类型的字段,因为此对象已有两种主表子表关系。");
205
+ }
206
+ else if(mastersCount > 0){
207
+ if(detailsCount > 0){
208
+ throw new Meteor.Error(doc.name, "由于此对象上已经存在主表子表关系,同时是另一个主表子表关系的主对象,无法创建此类字段。");
209
+ }
210
+ }
211
+
212
+ const detailPaths = obj.getDetailPaths();
213
+ // console.log("===detailPaths===", detailPaths);
214
+ const masterPaths = refObj.getMasterPaths();
215
+ // console.log("===masterPaths===", masterPaths);
216
+ // 当有同名对象时肯定会死循环进而超出最大层级限制,所以优先判断提示同名对象问题
217
+ checkMasterDetailPathsRepeat(doc, masterPaths, detailPaths);
218
+
219
+ // 新加主表子表关系后,当前对象作为主表往下最多允许有MAX_MASTER_DETAIL_LEAVE层深度。
220
+ const maxDetailLeave = obj.getMaxDetailsLeave(detailPaths);
221
+ // console.log("===maxDetailLeave===", maxDetailLeave);
222
+ if(maxDetailLeave > MAX_MASTER_DETAIL_LEAVE - 1){
223
+ throw new Meteor.Error(doc.name, "您无法创建此类字段,因为这将超出主表子表关系的最大深度。");
224
+ }
225
+
226
+ // 新加主表子表关系后,当前对象作为子表往上和往下加起来最多允许有MAX_DETAIL_LEAVE层深度。
227
+ const maxMasterLeave = refObj.getMaxMastersLeave(masterPaths);
228
+ // console.log("===maxMasterLeave===", maxMasterLeave);
229
+ if(maxMasterLeave + maxDetailLeave > MAX_MASTER_DETAIL_LEAVE - 1){
230
+ throw new Meteor.Error(doc.name, "您无法创建此类字段,因为这将超出主表子表关系的最大深度。");
231
+ }
232
+
233
+ // const ownerField = _.find(obj.fields,(n)=>{ return n.name === "owner";});
234
+ // if(!ownerField.omit){
235
+ // throw new Meteor.Error(doc.name, "您无法创建此类字段,因为该对象上“所有者”字段未勾选“新建、编辑时隐藏”属性。");
236
+ // }
237
+ }
238
+
239
+ function onChangeName(oldName, newDoc){
240
+ var newName = newDoc.name
241
+ Creator.getCollection("object_listviews").direct.find({space: newDoc.space, object_name: newDoc.object}, {fields: {_id:1, columns: 1}}).forEach(function(view){
242
+ if(_.isArray(view.columns)){
243
+ var columns = [];
244
+ _.each(view.columns, function(column){
245
+ if(_.isString(column)){
246
+ if(oldName === column){
247
+ columns.push(newName)
248
+ }else{
249
+ columns.push(column)
250
+ }
251
+ }else if(_.has(column, 'field')){
252
+ if(oldName === column.field){
253
+ columns.push(Object.assign({}, column, {field: newName}))
254
+ }else{
255
+ columns.push(column)
256
+ }
257
+ }else{
258
+ columns.push(column)
259
+ }
260
+ });
261
+ Creator.getCollection("object_listviews").update({_id: view._id}, {$set: {columns: columns}});
262
+ }
263
+ })
264
+ }
265
+
266
+ //只能包含小写字母、数字,必须以字母开头,不能以下划线字符结尾或包含两个连续的下划线字符 TODO 支持表格
267
+ function checkName(name){
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
+ //TODO 撤销注释
270
+ if(!reg.test(name)){
271
+ throw new Error("名称只能包含小写字母、数字,必须以字母开头,不能以下划线字符结尾或包含两个连续的下划线字符");
272
+ }
273
+ if(name.length > 50){
274
+ throw new Error("名称长度不能大于50个字符");
275
+ }
276
+ return true
277
+ }
278
+
279
+ function allowChangeObject(){
280
+ var config = objectql.getSteedosConfig();
281
+ if(config.tenant && config.tenant.saas){
282
+ return false
283
+ }else{
284
+ return true;
285
+ }
286
+ }
287
+
288
+ function checkNameField(nameField){
289
+ if(["text", "textarea", "autonumber", "date", "datetime", "time", "formula"].indexOf(nameField.type) < 0){
290
+ throw new Error("只有文本、长文本、自动编号、日期、日期时间、时间、公式这些类型的字段可以被设置为名称字段");
291
+ }
292
+ }
293
+
294
+ function getFieldDefaultProps(field){
295
+ let prosp = {}
296
+ switch (field.type) {
297
+ case 'autonumber':
298
+ if(!field.formula || !field.formula.trim()){
299
+ prosp.formula = '{0000}';
300
+ }
301
+ break;
302
+ default:
303
+ break;
304
+ }
305
+ return prosp;
306
+ }
307
+
308
+ // const checkFormulaInfiniteLoop = function(_doc){
309
+ // if(_doc.type === "formula"){
310
+ // doc = clone(_doc)
311
+ // delete doc._id
312
+ // let objectConfig = Creator.getCollection("objects").findOne({
313
+ // space: doc.space,
314
+ // name: doc.object
315
+ // });
316
+ // if(!objectConfig){
317
+ // objectConfig = objectql.getObjectConfig(doc.object);
318
+ // }
319
+ // objectCore.loadDBObject(objectConfig)
320
+ // delete objectConfig._id;
321
+ // try {
322
+ // await objectql.verifyObjectFieldFormulaConfig(doc, objectConfig);
323
+ // } catch (error) {
324
+ // if(error.message.startsWith('Infinite Loop')){
325
+ // throw new Error('字段公式配置异常,禁止循环引用对象字段');
326
+ // }else{
327
+ // throw error;
328
+ // }
329
+ // }
330
+ // }
331
+ // }
332
+
333
+ var triggers = {
334
+ "after.insert.server.object_fields": {
335
+ on: "server",
336
+ when: "after.insert",
337
+ todo: function (userId, doc) {
338
+ _syncToObject(doc, 'insert');
339
+ }
340
+ },
341
+ "after.update.server.object_fields": {
342
+ on: "server",
343
+ when: "after.update",
344
+ todo: function (userId, doc, fieldNames, modifier, options) {
345
+ doc._previousName = this.previous.name
346
+ _syncToObject(doc, 'update');
347
+ var set = modifier.$set || {}
348
+ if(set._name && this.previous.name != doc.name){
349
+ onChangeName(this.previous.name, doc);
350
+ }
351
+ }
352
+ },
353
+ "after.remove.server.object_fields": {
354
+ on: "server",
355
+ when: "after.remove",
356
+ todo: function (userId, doc) {
357
+ return _syncToObject(doc, 'remove');
358
+ }
359
+ },
360
+ "before.update.server.object_fields": {
361
+ on: "server",
362
+ when: "before.update",
363
+ todo: function (userId, doc, fieldNames, modifier, options) {
364
+ if(!allowChangeObject()){
365
+ throw new Meteor.Error(500, "华炎云服务不包含自定义业务对象的功能,请部署私有云版本");
366
+ }
367
+ modifier.$set = modifier.$set || {}
368
+ if(_.has(modifier.$set, "name")){
369
+ throw new Error("不能修改对象的name属性");
370
+ }
371
+
372
+ let fname = modifier.$set.name || doc.name
373
+ let ftype = modifier.$set.type || doc.type
374
+ let fisName = doc.is_name
375
+
376
+ if(_.has(modifier.$set, "is_name")){
377
+ fisName = modifier.$set.is_name
378
+ }
379
+
380
+ if(fname === 'name' || fisName){
381
+ checkNameField({type: ftype})
382
+ }
383
+
384
+ // if(_.has(modifier.$set, "object") && modifier.$set.object != doc.object){
385
+ // throw new Error("不能修改所属对象");
386
+ // }
387
+
388
+ if (doc.name === 'name' && _.has(modifier.$set, '_name') && doc.name !== modifier.$set._name) {
389
+ throw new Meteor.Error(500, "不能修改此记录的name属性");
390
+ }
391
+
392
+ if(_.has(modifier.$set, "_name")){
393
+ checkName(modifier.$set._name)
394
+ modifier.$set.name = getFieldName(doc.object, modifier.$set._name, doc.space, doc.name);
395
+ }
396
+
397
+ var _reference_to, object, object_documents, ref, ref1, ref2, ref3, ref4, ref5, ref6, ref7;
398
+
399
+ if(_.has(modifier.$set, 'name') && isRepeatedName(doc, modifier.$set.name)){
400
+ throw new Meteor.Error(doc._name, "字段名不能重复");
401
+ }
402
+
403
+ // if(_.has(modifier.$set, 'type') && modifier.$set.type === 'master_detail' && hasMultipleMasterDetailTypeFiled(doc)){
404
+ // throw new Meteor.Error(doc.name, "每个对象只能有一个[主表/子表]类型字段");
405
+ // }
406
+
407
+ // let oldReferenceTo = doc.type === "master_detail" && doc.reference_to;
408
+ // checkMasterDetailTypeField(modifier.$set, oldReferenceTo);
409
+ // checkOwnerField(modifier.$set);
410
+
411
+ if (modifier != null ? (ref2 = modifier.$set) != null ? ref2.reference_to : void 0 : void 0) {
412
+ if (modifier.$set.reference_to.length === 1) {
413
+ _reference_to = modifier.$set.reference_to[0];
414
+ } else {
415
+ _reference_to = modifier.$set.reference_to;
416
+ }
417
+ }
418
+ if ((modifier != null ? (ref3 = modifier.$set) != null ? ref3.index : void 0 : void 0) && ((modifier != null ? (ref4 = modifier.$set) != null ? ref4.type : void 0 : void 0) === 'textarea' || (modifier != null ? (ref5 = modifier.$set) != null ? ref5.type : void 0 : void 0) === 'html')) {
419
+ throw new Meteor.Error(500, "多行文本不支持建立索引");
420
+ }
421
+ object = Creator.getCollection("objects").findOne({
422
+ _id: doc.object
423
+ }, {
424
+ fields: {
425
+ name: 1,
426
+ label: 1
427
+ }
428
+ });
429
+ if (object) {
430
+ object_documents = Creator.getCollection(object.name).find();
431
+ if ((modifier != null ? (ref6 = modifier.$set) != null ? ref6.reference_to : void 0 : void 0) && doc.reference_to !== _reference_to && object_documents.count() > 0) {
432
+ throw new Meteor.Error(500, `对象${object.label}中已经有记录,不能修改reference_to字段`);
433
+ }
434
+ if ((modifier != null ? (ref7 = modifier.$unset) != null ? ref7.reference_to : void 0 : void 0) && doc.reference_to !== _reference_to && object_documents.count() > 0) {
435
+ throw new Meteor.Error(500, `对象${object.label}中已经有记录,不能修改reference_to字段`);
436
+ }
437
+ }
438
+
439
+ if(!_.isEmpty(modifier.$set)){
440
+ let defProps = getFieldDefaultProps(Object.assign(clone(doc), modifier.$set));
441
+ Object.assign(modifier.$set, defProps);
442
+ }
443
+ // checkFormulaInfiniteLoop(modifier.$set);
444
+ }
445
+ },
446
+ // if modifier?.$set?.reference_to
447
+ // if modifier.$set.reference_to.length == 1
448
+ // modifier.$set.reference_to = modifier.$set.reference_to[0]
449
+ "before.insert.server.object_fields": {
450
+ on: "server",
451
+ when: "before.insert",
452
+ todo: function (userId, doc) {
453
+ if(!allowChangeObject()){
454
+ throw new Meteor.Error(500, "华炎云服务不包含自定义业务对象的功能,请部署私有云版本");
455
+ }
456
+ checkName(doc._name);
457
+ if(['name','owner','parent','children'].indexOf(doc._name)>-1){
458
+ doc.name = doc._name;
459
+ }else{
460
+ doc.name = getFieldName(doc.object,doc._name,doc.space);
461
+ }
462
+
463
+ if(doc.name === 'name' || doc.is_name){
464
+ checkNameField({type: doc.type})
465
+ }
466
+
467
+ if (isRepeatedName(doc)) {
468
+ throw new Meteor.Error(doc.name, "字段名不能重复");
469
+ }
470
+
471
+ // if(doc.type === 'master_detail' && hasMultipleMasterDetailTypeFiled(doc)){
472
+ // throw new Meteor.Error(doc.name, "每个对象只能有一个[主表/子表]类型字段");
473
+ // }
474
+ // checkMasterDetailTypeField(doc);
475
+ // checkOwnerField(doc);
476
+
477
+ let defProps = getFieldDefaultProps(doc);
478
+ Object.assign(doc, defProps);
479
+
480
+ if ((doc != null ? doc.index : void 0) && ((doc != null ? doc.type : void 0) === 'textarea' || (doc != null ? doc.type : void 0) === 'html')) {
481
+ throw new Meteor.Error(500, '多行文本不支持建立索引');
482
+ }
483
+
484
+ // checkFormulaInfiniteLoop(doc);
485
+ }
486
+ },
487
+ "before.remove.server.object_fields": {
488
+ on: "server",
489
+ when: "before.remove",
490
+ todo: function (userId, doc) {
491
+ if(!allowChangeObject()){
492
+ throw new Meteor.Error(500, "华炎云服务不包含自定义业务对象的功能,请部署私有云版本");
493
+ }
494
+ if (doc.name === "name" && !canRemoveNameFileld(doc)) {
495
+ throw new Meteor.Error(500, "不能删除此纪录");
496
+ }
497
+ }
498
+ }
499
+ }
500
+
501
+ Creator.Objects.object_fields.triggers = Object.assign({}, Creator.Objects.object_fields.triggers, triggers);