@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.
- package/main/default/applications/.gitkeep +0 -0
- package/main/default/client/datasources.client.js +7 -0
- package/main/default/client/object_fields.client.js +212 -0
- package/main/default/client/object_layouts.client.js +86 -0
- package/main/default/objectTranslations/_object_reload_logs.en/_object_reload_logs.en.objectTranslation.yml +16 -0
- package/main/default/objectTranslations/_object_reload_logs.zh-CN/_object_reload_logs.zh-CN.objectTranslation.yml +16 -0
- package/main/default/objectTranslations/datasources.en/datasources.en.objectTranslation.yml +121 -0
- package/main/default/objectTranslations/datasources.zh-CN/datasources.zh-CN.objectTranslation.yml +105 -0
- package/main/default/objectTranslations/object_actions.en/object_actions.en.objectTranslation.yml +55 -0
- package/main/default/objectTranslations/object_actions.zh-CN/object_actions.zh-CN.objectTranslation.yml +50 -0
- package/main/default/objectTranslations/object_fields.en/object_fields.en.objectTranslation.yml +335 -0
- package/main/default/objectTranslations/object_fields.zh-CN/object_fields.zh-CN.objectTranslation.yml +312 -0
- package/main/default/objectTranslations/object_layouts.en/object_layouts.en.objectTranslation.yml +72 -0
- package/main/default/objectTranslations/object_layouts.zh-CN/object_layouts.zh-CN.objectTranslation.yml +116 -0
- package/main/default/objectTranslations/object_listviews.en/object_listviews.en.objectTranslation.yml +153 -0
- package/main/default/objectTranslations/object_listviews.zh-CN/object_listviews.zh-CN.objectTranslation.yml +146 -0
- package/main/default/objectTranslations/object_related_list.en/object_related_list.en.objectTranslation.yml +82 -0
- package/main/default/objectTranslations/object_related_list.zh-CN/object_related_list.zh-CN.objectTranslation.yml +82 -0
- package/main/default/objectTranslations/object_triggers.en/object_triggers.en.objectTranslation.yml +30 -0
- package/main/default/objectTranslations/object_triggers.zh-CN/object_triggers.zh-CN.objectTranslation.yml +29 -0
- package/main/default/objectTranslations/object_validation_rules.en/object_validation_rules.en.objectTranslation.yml +40 -0
- package/main/default/objectTranslations/object_validation_rules.zh-CN/object_validation_rules.zh-CN.objectTranslation.yml +38 -0
- package/main/default/objectTranslations/objects.en/objects.en.objectTranslation.yml +219 -0
- package/main/default/objectTranslations/objects.zh-CN/objects.zh-CN.objectTranslation.yml +218 -0
- package/main/default/objects/0.datasources.observe.object.js +83 -0
- package/main/default/objects/0.objects_reload.object.js +26 -0
- package/main/default/objects/1.objects.observe.object.js +61 -0
- package/main/default/objects/10.tabs.observe.object.js +36 -0
- package/main/default/objects/11.restriction_rules.observe.object.js +37 -0
- package/main/default/objects/12.share_rules.observe.object.js +37 -0
- package/main/default/objects/13.permission_fields.observe.object.js +37 -0
- package/main/default/objects/14.object_fields.observe.object.js +44 -0
- package/main/default/objects/15.permission_objects.observe.object.js +44 -0
- package/main/default/objects/2.object_triggers.observe.object.js +35 -0
- package/main/default/objects/3.permission_objects.observe.object.js +29 -0
- package/main/default/objects/4.permission_set.observe.object.js +39 -0
- package/main/default/objects/5.holidays.observe.object.js +30 -0
- package/main/default/objects/6.business_hours.observe.object.js +33 -0
- package/main/default/objects/7.object_actions.observe.object.js +43 -0
- package/main/default/objects/7.object_layouts.observe.object.js +33 -0
- package/main/default/objects/9.apps.observe.object.js +33 -0
- package/main/default/objects/_object_reload_logs.object.yml +10 -0
- package/main/default/objects/datasources.action.js +51 -0
- package/main/default/objects/datasources.core.js +34 -0
- package/main/default/objects/datasources.object.js +168 -0
- package/main/default/objects/datasources.object.yml +113 -0
- package/main/default/objects/object_actions.object.js +152 -0
- package/main/default/objects/object_actions.object.yml +142 -0
- package/main/default/objects/object_fields.action.js +128 -0
- package/main/default/objects/object_fields.function.js +104 -0
- package/main/default/objects/object_fields.object.js +501 -0
- package/main/default/objects/object_fields.object.yml +690 -0
- package/main/default/objects/object_layouts.action.js +31 -0
- package/main/default/objects/object_layouts.layouts.action.js +19 -0
- package/main/default/objects/object_layouts.object.yml +356 -0
- package/main/default/objects/object_listviews.action.js +93 -0
- package/main/default/objects/object_listviews.object.js +100 -0
- package/main/default/objects/object_listviews.object.yml +309 -0
- package/main/default/objects/object_manager.app.todo.yml +11 -0
- package/main/default/objects/object_related_list.object.js +110 -0
- package/main/default/objects/object_related_list.object.yml +208 -0
- package/main/default/objects/object_triggers.core.js +58 -0
- package/main/default/objects/object_triggers.object.js +65 -0
- package/main/default/objects/object_triggers.object.yml +124 -0
- package/main/default/objects/object_validation_rules.action.js +33 -0
- package/main/default/objects/object_validation_rules.object.yml +100 -0
- package/main/default/objects/objects.action.js +157 -0
- package/main/default/objects/objects.core.js +398 -0
- package/main/default/objects/objects.erd.data.function.js +85 -0
- package/main/default/objects/objects.lib.js +42 -0
- package/main/default/objects/objects.object.js +543 -0
- package/main/default/objects/objects.object.yml +512 -0
- package/main/default/objects/objects.tree.js +58 -0
- package/main/default/objects/permission_objects.core.js +75 -0
- package/main/default/permissionsets/.gitkeep +0 -0
- package/main/default/profiles/.gitkeep +0 -0
- package/main/default/tabs/.gitkeep +0 -0
- package/main/default/triggers/datasources.trigger.js +93 -0
- package/main/default/triggers/object_actions.trigger.js +98 -0
- package/main/default/triggers/object_fields.trigger.js +376 -0
- package/main/default/triggers/object_layouts.trigger.js +153 -0
- package/main/default/triggers/object_listviews.trigger.js +139 -0
- package/main/default/triggers/object_triggers.trigger.js +50 -0
- package/main/default/triggers/object_validation_rules.trigger.js +80 -0
- package/main/default/triggers/objects.trigger.js +136 -0
- package/package.json +16 -0
- package/package.service.js +75 -0
- package/public/.md +3 -0
- package/src/.md +3 -0
- package/webapp/.md +1 -0
|
@@ -0,0 +1,398 @@
|
|
|
1
|
+
var objectql = require('@steedos/objectql');
|
|
2
|
+
const clone = require('clone');
|
|
3
|
+
const defaultDatasourceName = 'default';
|
|
4
|
+
const defaultDatasourcesName = ['default','meteor'];
|
|
5
|
+
var triggerCore = require('./object_triggers.core.js');
|
|
6
|
+
var permissionCore = require('./permission_objects.core.js');
|
|
7
|
+
|
|
8
|
+
const DB_OBJECT_SERVICE_NAME = '~database-objects';
|
|
9
|
+
|
|
10
|
+
const _ = require('underscore');
|
|
11
|
+
|
|
12
|
+
function canLoadObject(name, datasource) {
|
|
13
|
+
// if(!datasource || datasource === defaultDatasourceName){
|
|
14
|
+
// if(!name.endsWith('__c')){
|
|
15
|
+
// return false;
|
|
16
|
+
// }else{
|
|
17
|
+
// return true;
|
|
18
|
+
// }
|
|
19
|
+
// }else{
|
|
20
|
+
// return true;
|
|
21
|
+
// }
|
|
22
|
+
return true;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
function getDataSource(doc) {
|
|
26
|
+
if (doc.datasource && !_.include(defaultDatasourcesName, doc.datasource)) {
|
|
27
|
+
let datasource = Creator.getCollection("datasources").findOne({ _id: doc.datasource })
|
|
28
|
+
return datasource;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
function getDataSourceName(doc) {
|
|
33
|
+
if (doc && doc.datasource && !_.include(defaultDatasourcesName, doc.datasource)) {
|
|
34
|
+
let datasource = Creator.getCollection("datasources").findOne({ _id: doc.datasource })
|
|
35
|
+
if (datasource) {
|
|
36
|
+
return datasource.name
|
|
37
|
+
} else {
|
|
38
|
+
throw new Error('not find datasource ', doc.datasource);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
if(doc.datasource && _.include(defaultDatasourcesName, doc.datasource)){
|
|
42
|
+
return doc.datasource
|
|
43
|
+
}
|
|
44
|
+
return defaultDatasourceName
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function loadObjectTriggers(object) {
|
|
48
|
+
Creator.getCollection("object_triggers").find({ space: object.space, object: object.name, is_enable: true }, {
|
|
49
|
+
fields: {
|
|
50
|
+
created: 0,
|
|
51
|
+
created_by: 0,
|
|
52
|
+
modified: 0,
|
|
53
|
+
modified_by: 0
|
|
54
|
+
}
|
|
55
|
+
}).forEach(function (trigger) {
|
|
56
|
+
triggerCore.loadObjectTrigger(trigger);
|
|
57
|
+
})
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
function loadObjectPermission(object) {
|
|
61
|
+
Creator.getCollection("permission_objects").find({ space: object.space, object_name: object.name }, {
|
|
62
|
+
fields: {
|
|
63
|
+
created: 0,
|
|
64
|
+
created_by: 0,
|
|
65
|
+
modified: 0,
|
|
66
|
+
modified_by: 0
|
|
67
|
+
}
|
|
68
|
+
}).forEach(function (permission) {
|
|
69
|
+
permissionCore.loadObjectPermission(permission);
|
|
70
|
+
})
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
function getObjectFields(object) {
|
|
75
|
+
var object_fields = Creator.getCollection("object_fields").find({
|
|
76
|
+
space: object.space,
|
|
77
|
+
object: object.name
|
|
78
|
+
}, {
|
|
79
|
+
fields: {
|
|
80
|
+
created: 0,
|
|
81
|
+
modified: 0,
|
|
82
|
+
owner: 0,
|
|
83
|
+
created_by: 0,
|
|
84
|
+
modified_by: 0
|
|
85
|
+
},
|
|
86
|
+
sort: {
|
|
87
|
+
sort_no: 1
|
|
88
|
+
}
|
|
89
|
+
}).fetch();
|
|
90
|
+
var fields = {};
|
|
91
|
+
var table_fields = {};
|
|
92
|
+
_.forEach(object_fields, function (f) {
|
|
93
|
+
var cf_arr, child_fields;
|
|
94
|
+
if (/^[a-zA-Z_]\w*(\.\$\.\w+){1}[a-zA-Z0-9]*$/.test(f.name)) {
|
|
95
|
+
cf_arr = f.name.split(".$.");
|
|
96
|
+
child_fields = {};
|
|
97
|
+
child_fields[cf_arr[1]] = f;
|
|
98
|
+
if (!_.size(table_fields[cf_arr[0]])) {
|
|
99
|
+
table_fields[cf_arr[0]] = {};
|
|
100
|
+
}
|
|
101
|
+
return _.extend(table_fields[cf_arr[0]], child_fields);
|
|
102
|
+
} else {
|
|
103
|
+
return fields[f.name] = f;
|
|
104
|
+
}
|
|
105
|
+
});
|
|
106
|
+
_.each(table_fields, function (f, k) {
|
|
107
|
+
if (fields[k].type === "grid") {
|
|
108
|
+
if (!_.size(fields[k].fields)) {
|
|
109
|
+
fields[k].fields = {};
|
|
110
|
+
}
|
|
111
|
+
return _.extend(fields[k].fields, f);
|
|
112
|
+
}
|
|
113
|
+
});
|
|
114
|
+
return fields;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
function getObjectActions(object) {
|
|
118
|
+
var object_actions = Creator.getCollection("object_actions").find({
|
|
119
|
+
object: object.name,
|
|
120
|
+
space: object.space,
|
|
121
|
+
is_enable: true
|
|
122
|
+
}, {
|
|
123
|
+
fields: {
|
|
124
|
+
created: 0,
|
|
125
|
+
modified: 0,
|
|
126
|
+
owner: 0,
|
|
127
|
+
created_by: 0,
|
|
128
|
+
modified_by: 0
|
|
129
|
+
}
|
|
130
|
+
}).fetch();
|
|
131
|
+
var actions = {};
|
|
132
|
+
_.forEach(object_actions, function (f) {
|
|
133
|
+
return actions[f.name] = f;
|
|
134
|
+
});
|
|
135
|
+
return actions;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
function getObjectRelateList(object) {
|
|
139
|
+
var relatedList = Creator.getCollection("object_related_list").find({
|
|
140
|
+
space: object.space,
|
|
141
|
+
object_name: object.name
|
|
142
|
+
}, {
|
|
143
|
+
sort: {sort_no: -1},
|
|
144
|
+
fields: {
|
|
145
|
+
_id: 0,
|
|
146
|
+
space: 0,
|
|
147
|
+
object_name: 0,
|
|
148
|
+
created: 0,
|
|
149
|
+
modified: 0,
|
|
150
|
+
owner: 0,
|
|
151
|
+
created_by: 0,
|
|
152
|
+
modified_by: 0
|
|
153
|
+
}
|
|
154
|
+
}).fetch();
|
|
155
|
+
return relatedList;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
function loadDBObject(object){
|
|
160
|
+
let fields = getObjectFields(object);
|
|
161
|
+
let actions = getObjectActions(object);
|
|
162
|
+
let relatedList = getObjectRelateList(object);
|
|
163
|
+
objectql.extend(object, {fields: fields}, {actions: actions}, {relatedList: relatedList});
|
|
164
|
+
_.each(actions, function(action){
|
|
165
|
+
action._visible = action.visible;
|
|
166
|
+
objectql.addLazyLoadButtons(action.object, action);
|
|
167
|
+
})
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
|
|
171
|
+
function loadObject(doc, oldDoc) {
|
|
172
|
+
try {
|
|
173
|
+
if (!canLoadObject(doc.name, doc.datasource)) {
|
|
174
|
+
console.warn('warn: Not loaded. Invalid custom object -> ', doc.name);
|
|
175
|
+
return;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
var datasourceDoc = getDataSource(doc);
|
|
179
|
+
if (doc.datasource && !_.include(defaultDatasourcesName, doc.datasource) && (!datasourceDoc || !datasourceDoc.is_enable)) {
|
|
180
|
+
console.warn('warn: Not loaded. Invalid custom object -> ', doc.name, doc.datasource);
|
|
181
|
+
return;
|
|
182
|
+
}
|
|
183
|
+
var datasourceName = getDataSourceName(doc);
|
|
184
|
+
const datasource = objectql.getDataSource(datasourceName);
|
|
185
|
+
|
|
186
|
+
if (!datasource) {
|
|
187
|
+
console.warn(`warn: Not loaded object [${doc.name}]. Cant not find datasource -> `, datasourceName);
|
|
188
|
+
return;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
if (oldDoc) {
|
|
192
|
+
var oldDatasourceName = getDataSourceName(oldDoc);
|
|
193
|
+
if (datasourceName != oldDatasourceName) {
|
|
194
|
+
const oldDatasource = objectql.getDataSource(oldDatasourceName);
|
|
195
|
+
if (oldDatasource) {
|
|
196
|
+
oldDatasource.removeObject(oldDoc.name);
|
|
197
|
+
objectql.removeObjectConfig(oldDoc.name, oldDatasourceName);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
if (oldDoc && doc.name != oldDoc.name) {
|
|
203
|
+
removeObject(oldDoc, true);
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
if (datasourceName === defaultDatasourceName) {
|
|
207
|
+
delete doc.table_name
|
|
208
|
+
}
|
|
209
|
+
//继承base
|
|
210
|
+
loadDBObject(doc);
|
|
211
|
+
const originalObject = clone(doc);
|
|
212
|
+
|
|
213
|
+
// 由于外部数据源对象的datasource属性存的是datasource._id的值,故这里转换为datasoruce.name
|
|
214
|
+
if(!_.include(defaultDatasourcesName, originalObject.datasource)) {
|
|
215
|
+
originalObject.datasource = datasourceName;
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
originalObject.isMain = true;
|
|
219
|
+
|
|
220
|
+
objectql.addObjectConfig(doc, datasourceName);
|
|
221
|
+
objectql.loadObjectLazyListViews(doc.name);
|
|
222
|
+
objectql.loadObjectLazyActions(doc.name);
|
|
223
|
+
objectql.loadActionScripts(doc.name);
|
|
224
|
+
objectql.loadObjectLazyMethods(doc.name);
|
|
225
|
+
objectql.loadObjectLazyListenners(doc.name);
|
|
226
|
+
objectql.loadObjectLazyButtons(doc.name);
|
|
227
|
+
//获取到继承后的对象
|
|
228
|
+
const _doc = objectql.getObjectConfig(doc.name);
|
|
229
|
+
objectql.getSteedosSchema().metadataRegister.addObjectConfig(DB_OBJECT_SERVICE_NAME, originalObject).then(function(res){
|
|
230
|
+
if(res){
|
|
231
|
+
datasource.setObject(doc.name, _doc);
|
|
232
|
+
try {
|
|
233
|
+
if (!datasourceName || datasourceName == defaultDatasourceName) {
|
|
234
|
+
Creator.Objects[doc.name] = _doc;
|
|
235
|
+
Creator.loadObjects(_doc, _doc.name);
|
|
236
|
+
}
|
|
237
|
+
} catch (error) {
|
|
238
|
+
console.log('error', error);
|
|
239
|
+
}
|
|
240
|
+
if (!oldDoc || (oldDoc && oldDoc.is_enable === false && doc.is_enable)) {
|
|
241
|
+
loadObjectTriggers(doc);
|
|
242
|
+
loadObjectPermission(doc);
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
})
|
|
246
|
+
|
|
247
|
+
|
|
248
|
+
} catch (error) {
|
|
249
|
+
console.error(error)
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
function removeObject(doc, enforce, reInitDatasource) {
|
|
254
|
+
if (!enforce && !objectql.hasObjectSuffix(doc.name, doc.space) && !doc.datasource) {
|
|
255
|
+
console.warn('warn: Not deleted. Invalid custom object -> ', doc.name);
|
|
256
|
+
return;
|
|
257
|
+
}
|
|
258
|
+
var datasourceName = getDataSourceName(doc);
|
|
259
|
+
const datasource = objectql.getDataSource(datasourceName);
|
|
260
|
+
objectql.removeObjectConfig(doc.name, datasourceName);
|
|
261
|
+
if (datasource) {
|
|
262
|
+
datasource.removeObject(doc.name);
|
|
263
|
+
if(reInitDatasource){
|
|
264
|
+
datasource.init();
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
if (!datasourceName || datasourceName == defaultDatasourceName) {
|
|
268
|
+
Creator.removeObject(doc.name);
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
function getObjectFromDB(objectName) {
|
|
273
|
+
if (!objectName) {
|
|
274
|
+
return
|
|
275
|
+
}
|
|
276
|
+
return Creator.getCollection("objects").findOne({ name: objectName })
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
function reloadObject(changeLog){
|
|
280
|
+
var objectName = changeLog.object_name;
|
|
281
|
+
var data = changeLog.change_date;
|
|
282
|
+
const objectRecord = Creator.getCollection("objects").findOne({
|
|
283
|
+
name: objectName
|
|
284
|
+
})
|
|
285
|
+
var objectDataSourceName = '';
|
|
286
|
+
if(objectRecord){
|
|
287
|
+
objectDataSourceName = getDataSourceName(objectRecord);
|
|
288
|
+
}else{
|
|
289
|
+
objectDataSourceName = objectql.getObject(objectName).datasource.name;
|
|
290
|
+
}
|
|
291
|
+
const deleted = {
|
|
292
|
+
fields: [],
|
|
293
|
+
actions: []
|
|
294
|
+
}
|
|
295
|
+
if(!objectRecord && objectDataSourceName){
|
|
296
|
+
|
|
297
|
+
switch (data.type) {
|
|
298
|
+
case 'field':
|
|
299
|
+
if(data.event === 'remove'){
|
|
300
|
+
deleted.fields.push(data.value.name);
|
|
301
|
+
objectql.removeObjectFieldConfig(objectName, data.value);
|
|
302
|
+
}else{
|
|
303
|
+
if(data.event === 'update'){
|
|
304
|
+
if(data.value._previousName != data.value.name){
|
|
305
|
+
deleted.fields.push(data.value._previousName);
|
|
306
|
+
objectql.removeObjectFieldConfig(objectName, {name: data.value._previousName});
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
objectql.addObjectFieldConfig(objectName, data.value);
|
|
310
|
+
}
|
|
311
|
+
break;
|
|
312
|
+
case 'action':
|
|
313
|
+
if(data.event === 'remove'){
|
|
314
|
+
deleted.actions.push(data.value.name);
|
|
315
|
+
objectql.removeObjectButtonsConfig(objectName, data.value);
|
|
316
|
+
}else{
|
|
317
|
+
if(data.event === 'update'){
|
|
318
|
+
if(data.value._previousName != data.value.name){
|
|
319
|
+
deleted.actions.push(data.value._previousName);
|
|
320
|
+
objectql.removeObjectButtonsConfig(objectName, {name: data.value._previousName});
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
if(data.value.is_enable){
|
|
324
|
+
objectql.addObjectButtonsConfig(objectName, data.value);
|
|
325
|
+
}else{
|
|
326
|
+
deleted.actions.push(data.value.name);
|
|
327
|
+
objectql.removeObjectButtonsConfig(objectName, data.value);
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
break;
|
|
331
|
+
case 'related_list':
|
|
332
|
+
console.log('TODO related_list');
|
|
333
|
+
// objectql.addObjectFieldConfig(objectName, data.value);
|
|
334
|
+
break;
|
|
335
|
+
default:
|
|
336
|
+
break;
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
const datasource = objectql.getDataSource(objectDataSourceName);
|
|
340
|
+
if(!datasource){
|
|
341
|
+
return
|
|
342
|
+
}
|
|
343
|
+
//获取到最新的对象
|
|
344
|
+
const object = objectql.getObjectConfig(objectName);
|
|
345
|
+
|
|
346
|
+
let _mf = _.max(_.values(object.fields), function (field) { return field.sort_no; });
|
|
347
|
+
if(_mf && object.name){
|
|
348
|
+
object.fields_serial_number = _mf.sort_no + 10;
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
if(deleted.fields.length == 0){
|
|
352
|
+
deleted.fields = null;
|
|
353
|
+
}
|
|
354
|
+
if(deleted.actions.length == 0){
|
|
355
|
+
deleted.actions = null;
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
objectql.getSteedosSchema().metadataRegister.addObjectConfig(DB_OBJECT_SERVICE_NAME, Object.assign({}, object, {isMain:false, __deleted: deleted})).then(function(res){
|
|
359
|
+
if(res){
|
|
360
|
+
datasource.setObject(object.name, object);
|
|
361
|
+
try {
|
|
362
|
+
if(!objectDataSourceName || objectDataSourceName == defaultDatasourceName){
|
|
363
|
+
Creator.Objects[object.name] = object;
|
|
364
|
+
Creator.loadObjects(object, object.name);
|
|
365
|
+
}
|
|
366
|
+
} catch (error) {
|
|
367
|
+
console.log('error', error);
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
})
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
function triggerReloadObject(objectName, type, value, event){
|
|
376
|
+
const objectRecord = Creator.getCollection("objects").findOne({
|
|
377
|
+
name: objectName
|
|
378
|
+
})
|
|
379
|
+
if(objectRecord){
|
|
380
|
+
//TODO 待支持动态加载related_list后, 删除此行代码
|
|
381
|
+
Creator.getCollection("objects").update({name: objectName}, {$set: {reload_time: new Date()}})
|
|
382
|
+
}else{
|
|
383
|
+
Creator.getCollection("_object_reload_logs").insert({
|
|
384
|
+
object_name: objectName,
|
|
385
|
+
change_date: {
|
|
386
|
+
type: type,
|
|
387
|
+
event: event,
|
|
388
|
+
value: value
|
|
389
|
+
},
|
|
390
|
+
change_time: new Date(),
|
|
391
|
+
space: value.space
|
|
392
|
+
})
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
module.exports = {
|
|
397
|
+
loadObject, removeObject, getDataSourceName, canLoadObject, getObjectFromDB, getDataSource, reloadObject, triggerReloadObject, loadDBObject
|
|
398
|
+
}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* @Author: sunhaolin@hotoa.com
|
|
3
|
+
* @Date: 2021-07-30 09:20:04
|
|
4
|
+
* @LastEditors: sunhaolin@hotoa.com
|
|
5
|
+
* @LastEditTime: 2022-07-29 11:32:40
|
|
6
|
+
* @Description:
|
|
7
|
+
*/
|
|
8
|
+
const InternalData = require('@steedos/standard-objects').internalData;
|
|
9
|
+
const clone = require('clone');
|
|
10
|
+
const steedosI18n = require("@steedos/i18n");
|
|
11
|
+
const objectql = require("@steedos/objectql");
|
|
12
|
+
const _ = require('underscore');
|
|
13
|
+
const auth = require("@steedos/auth");
|
|
14
|
+
const getLng = async function(userId){
|
|
15
|
+
const userSession = await auth.getSessionByUserId(userId);
|
|
16
|
+
return userSession.language;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
function getOriginalObjectFields(objectName){
|
|
20
|
+
return objectql.getOriginalObjectConfig(objectName).fields || {}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
async function getObjectFields(objectName, userId){
|
|
24
|
+
let object = await InternalData.getObject(objectName, userId);
|
|
25
|
+
if(object){
|
|
26
|
+
let fields = [];
|
|
27
|
+
let originalFieldsName = ['created_by', 'modified_by'].concat(_.keys(getOriginalObjectFields(objectName))); //'created', 'modified', 'owner'
|
|
28
|
+
_.each(object.fields, function(field){
|
|
29
|
+
if(_.include(originalFieldsName, field.name)){
|
|
30
|
+
if(!field._id ){
|
|
31
|
+
fields.push(Object.assign({_id: `${objectName}.${field.name}`, _name: field.name, object: objectName}, field))
|
|
32
|
+
}else{
|
|
33
|
+
fields.push(Object.assign({_name: field.name, object: objectName}, field))
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
}
|
|
37
|
+
})
|
|
38
|
+
return fields
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
async function getObjects(userId){
|
|
43
|
+
let objects = {};
|
|
44
|
+
let lng = await getLng(userId)
|
|
45
|
+
let allObjectConfigs = await objectql.getSteedosSchema().getAllObject();
|
|
46
|
+
for (const objectConfig of allObjectConfigs) {
|
|
47
|
+
var _obj = clone(objectConfig.metadata);
|
|
48
|
+
var k = _obj.name;
|
|
49
|
+
if(!_obj.hidden && !_.include(InternalData.hiddenObjects, k)){
|
|
50
|
+
if(!_obj._id){
|
|
51
|
+
_obj._id = k;
|
|
52
|
+
}
|
|
53
|
+
_obj.name = k;
|
|
54
|
+
// _obj.datasource = name;
|
|
55
|
+
_obj.fields = {};
|
|
56
|
+
let oFields = await getObjectFields(k, userId);
|
|
57
|
+
_.each(oFields, function(_f){
|
|
58
|
+
_obj.fields[_f.name] = _f;
|
|
59
|
+
});
|
|
60
|
+
delete _obj.actions
|
|
61
|
+
delete _obj.triggers
|
|
62
|
+
delete _obj.list_views
|
|
63
|
+
delete _obj.permission_set
|
|
64
|
+
if(_obj.enable_inline_edit !== false){
|
|
65
|
+
// 默认值配置为true
|
|
66
|
+
_obj.enable_inline_edit = true;
|
|
67
|
+
}
|
|
68
|
+
objects[_obj.name] = _obj
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
steedosI18n.translationObjects(lng, objects)
|
|
72
|
+
return _.values(objects);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
module.exports = {
|
|
76
|
+
listenTo: 'objects',
|
|
77
|
+
erd: async function(req, res){
|
|
78
|
+
const params = req.params;
|
|
79
|
+
const userSession = req.user;
|
|
80
|
+
const spaceId = userSession.spaceId;
|
|
81
|
+
const userId = userSession.userId;
|
|
82
|
+
const objects = await getObjects(userId);
|
|
83
|
+
res.status(200).send({ value: objects });
|
|
84
|
+
}
|
|
85
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
var objectql = require('@steedos/objectql');
|
|
2
|
+
const defaultDatasourceName = 'default';
|
|
3
|
+
|
|
4
|
+
function canLoadObject(name, datasource){
|
|
5
|
+
var config = objectql.getSteedosConfig();
|
|
6
|
+
if(config.tenant && config.tenant.saas){
|
|
7
|
+
return false;
|
|
8
|
+
}
|
|
9
|
+
return true;
|
|
10
|
+
// if(!datasource || datasource === defaultDatasourceName){
|
|
11
|
+
// if(name.endsWith('__c')){
|
|
12
|
+
// return false;
|
|
13
|
+
// }else{
|
|
14
|
+
// return true;
|
|
15
|
+
// }
|
|
16
|
+
// }else{
|
|
17
|
+
// return true;
|
|
18
|
+
// }
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
function getDataSourceName(doc){
|
|
22
|
+
if(doc && doc.datasource && doc.datasource != defaultDatasourceName){
|
|
23
|
+
let datasource = Creator.getCollection("datasources").findOne({_id: doc.datasource})
|
|
24
|
+
if(datasource){
|
|
25
|
+
return datasource.name
|
|
26
|
+
}else{
|
|
27
|
+
throw new Error('not find datasource ', doc.datasource);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
return defaultDatasourceName
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
function getObjectFromDB(objectName){
|
|
34
|
+
if(!objectName){
|
|
35
|
+
return
|
|
36
|
+
}
|
|
37
|
+
return Creator.getCollection("objects").findOne({name: objectName})
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
module.exports = {
|
|
41
|
+
getDataSourceName,canLoadObject,getObjectFromDB
|
|
42
|
+
}
|