@steedos/standard-object-database 2.6.1-beta.7 → 2.6.2-beta.2
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/client/coordtransform.client.js +153 -0
- package/main/default/client/object_fields.client.js +150 -44
- package/main/default/objectTranslations/object_actions.en/object_actions.en.objectTranslation.yml +2 -0
- package/main/default/objectTranslations/object_actions.zh-CN/object_actions.zh-CN.objectTranslation.yml +2 -0
- package/main/default/objectTranslations/object_fields.en/object_fields.en.objectTranslation.yml +27 -2
- package/main/default/objectTranslations/object_fields.zh-CN/object_fields.zh-CN.objectTranslation.yml +32 -4
- package/main/default/objectTranslations/object_layouts.en/object_layouts.en.objectTranslation.yml +2 -0
- package/main/default/objectTranslations/object_layouts.zh-CN/object_layouts.zh-CN.objectTranslation.yml +2 -0
- package/main/default/objectTranslations/object_listviews.en/object_listviews.en.objectTranslation.yml +29 -1
- package/main/default/objectTranslations/object_listviews.zh-CN/object_listviews.zh-CN.objectTranslation.yml +27 -1
- package/main/default/objectTranslations/object_triggers.en/object_triggers.en.objectTranslation.yml +7 -1
- package/main/default/objectTranslations/object_triggers.zh-CN/object_triggers.zh-CN.objectTranslation.yml +8 -2
- package/main/default/objectTranslations/object_validation_rules.en/object_validation_rules.en.objectTranslation.yml +2 -0
- package/main/default/objectTranslations/object_validation_rules.zh-CN/object_validation_rules.zh-CN.objectTranslation.yml +2 -0
- package/main/default/objects/1.objects.observe.object.js +4 -1
- package/main/default/objects/7.object_actions.observe.object.js +7 -1
- package/main/default/objects/object_actions.action.js +34 -3
- package/main/default/objects/object_actions.object.js +4 -2
- package/main/default/objects/object_actions.object.yml +26 -1
- package/main/default/objects/object_fields.object.js +33 -19
- package/main/default/objects/object_fields.object.yml +129 -83
- package/main/default/objects/object_layouts.action.js +4 -4
- package/main/default/objects/object_layouts.object.yml +16 -2
- package/main/default/objects/object_listviews.object.yml +67 -16
- package/main/default/objects/object_triggers.object.yml +13 -4
- package/main/default/objects/object_validation_rules.object.yml +10 -0
- package/main/default/objects/objects/buttons/custom.button.js +48 -0
- package/main/default/objects/objects/buttons/custom.button.yml +6 -0
- package/main/default/objects/objects.action.js +26 -3
- package/main/default/objects/objects.core.js +17 -1
- package/main/default/objects/objects.object.js +3 -2
- package/main/default/objects/objects.object.yml +28 -2
- package/main/default/objects/objects.tree.js +3 -2
- package/main/default/pages/design_field_layout.page.amis.json +418 -0
- package/main/default/pages/design_field_layout.page.yml +7 -0
- package/main/default/pages/object_detail.page.amis.json +6 -6
- package/main/default/pages/object_fields_form.page.amis.json +35 -0
- package/main/default/pages/{object_fields.page.yml → object_fields_form.page.yml} +5 -5
- package/main/default/pages/object_form.page.amis.json +31 -0
- package/main/default/pages/object_form.page.yml +12 -0
- package/main/default/routes/amis_button_design.router.js +11 -2
- package/main/default/routes/amis_listview_design.router.js +11 -2
- package/main/default/services/suggestions.service.js +4 -5
- package/main/default/triggers/object_actions.trigger.js +6 -2
- package/main/default/triggers/object_fields.trigger.js +67 -10
- package/main/default/triggers/object_listviews.trigger.js +11 -4
- package/main/default/triggers/objects.trigger.js +4 -26
- package/package.json +2 -2
- package/package.service.js +132 -3
- package/src/triggers/index.js +11 -0
- package/src/triggers/object_fields_trigger_create_index.js +58 -0
- package/main/default/objects/object_layouts/buttons/standard_edit.button.yml +0 -44
- package/main/default/pages/object_fields.page.amis.json +0 -42
- package/main/default/services/object_fields.service.js +0 -242
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
/*
|
|
2
2
|
* @Author: sunhaolin@hotoa.com
|
|
3
3
|
* @Date: 2022-05-28 11:07:57
|
|
4
|
-
* @LastEditors:
|
|
5
|
-
* @LastEditTime:
|
|
4
|
+
* @LastEditors: baozhoutao@steedos.com
|
|
5
|
+
* @LastEditTime: 2023-10-16 13:58:22
|
|
6
6
|
* @Description:
|
|
7
7
|
*/
|
|
8
8
|
const InternalData = require('@steedos/standard-objects').internalData;
|
|
9
9
|
const objectql = require('@steedos/objectql');
|
|
10
10
|
const auth = require("@steedos/auth");
|
|
11
|
+
const sleep = async (ms) => new Promise(resolve => setTimeout(resolve, ms));
|
|
11
12
|
module.exports = {
|
|
12
13
|
beforeInsert: async function(){
|
|
13
14
|
const { doc } = this;
|
|
@@ -94,5 +95,8 @@ module.exports = {
|
|
|
94
95
|
}
|
|
95
96
|
}
|
|
96
97
|
}
|
|
98
|
+
},
|
|
99
|
+
afterDelete: async function(){
|
|
100
|
+
await sleep(1000 * 2);
|
|
97
101
|
}
|
|
98
102
|
}
|
|
@@ -222,16 +222,34 @@ module.exports = {
|
|
|
222
222
|
if(!objectName && filters._id && filters._id.indexOf(".") > -1){
|
|
223
223
|
objectName = filters._id.split('.')[0];
|
|
224
224
|
}
|
|
225
|
-
if(objectName){
|
|
225
|
+
if(objectName){
|
|
226
226
|
let fields = await InternalData.getObjectFields(objectName, this.userId, filters.name ? true : false);
|
|
227
227
|
if(fields){
|
|
228
228
|
_.each(fields, (field)=>{
|
|
229
|
-
this.data.values
|
|
229
|
+
if(!_.find(this.data.values, (item)=>{
|
|
230
|
+
return item.object == field.object && item.name == field.name
|
|
231
|
+
})){
|
|
232
|
+
this.data.values.push(Object.assign({_id: `${objectName}.${field.name}`}, field))
|
|
233
|
+
}
|
|
230
234
|
})
|
|
231
235
|
// this.data.values = this.data.values.concat(fields)
|
|
232
236
|
this.data.values = objectql.getSteedosSchema().metadataDriver.find(this.data.values, this.query, this.spaceId);
|
|
233
237
|
}
|
|
234
238
|
}
|
|
239
|
+
|
|
240
|
+
const dbSystemField = _.find(this.data.values, (field)=>{return field.is_system && field._id && field._id.indexOf('.') == -1})
|
|
241
|
+
if(dbSystemField){
|
|
242
|
+
const obj = await InternalData.getObject(dbSystemField.object, this.userId)
|
|
243
|
+
if(obj){
|
|
244
|
+
this.data.values = _.map(this.data.values, (item)=>{
|
|
245
|
+
if(item.is_system){
|
|
246
|
+
return Object.assign(item, _.find(obj.fields, (field)=>{return field.name === item.name}))
|
|
247
|
+
}else{
|
|
248
|
+
return item;
|
|
249
|
+
}
|
|
250
|
+
})
|
|
251
|
+
}
|
|
252
|
+
}
|
|
235
253
|
},
|
|
236
254
|
beforeFind: async function(){
|
|
237
255
|
const { query } = this;
|
|
@@ -241,6 +259,9 @@ module.exports = {
|
|
|
241
259
|
if(query.fields && _.isArray(query.fields) && !_.include(query.fields, 'name')){
|
|
242
260
|
query.fields.push('name')
|
|
243
261
|
}
|
|
262
|
+
if(query.fields && _.isArray(query.fields) && !_.include(query.fields, 'type')){
|
|
263
|
+
query.fields.push('type')
|
|
264
|
+
}
|
|
244
265
|
},
|
|
245
266
|
beforeAggregate: async function(){
|
|
246
267
|
const { query } = this;
|
|
@@ -327,7 +348,12 @@ module.exports = {
|
|
|
327
348
|
}
|
|
328
349
|
if(["parent","children"].indexOf(dbDoc._name) > -1){
|
|
329
350
|
let isImportField = false;
|
|
330
|
-
if(doc._name
|
|
351
|
+
if((doc._name != undefined && doc._name !== dbDoc._name) ||
|
|
352
|
+
(doc.type != undefined && doc.type !== dbDoc.type) ||
|
|
353
|
+
(doc.object != undefined && doc.object !== dbDoc.object) ||
|
|
354
|
+
(doc.reference_to != undefined && doc.reference_to !== dbDoc.reference_to) ||
|
|
355
|
+
(doc.multiple != undefined && !!doc.multiple !== !!dbDoc.multiple) ||
|
|
356
|
+
(doc.omit != undefined && ("children" === dbDoc._name && doc.omit !== true))){
|
|
331
357
|
isImportField = true;
|
|
332
358
|
}
|
|
333
359
|
if(isImportField){
|
|
@@ -353,16 +379,16 @@ module.exports = {
|
|
|
353
379
|
const obj = this.getObject(object_name);
|
|
354
380
|
const latestDoc = await obj.findOne(id);
|
|
355
381
|
// !!!暂不允许修改name
|
|
356
|
-
if (_.has(doc, '_name')) {
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
}
|
|
382
|
+
// if (_.has(doc, '_name')) {
|
|
383
|
+
// const newFieldName = doc._name;
|
|
384
|
+
// if (newFieldName && (latestDoc._name != newFieldName)) {
|
|
385
|
+
// throw new Error('禁止修改字段名。');
|
|
386
|
+
// }
|
|
387
|
+
// }
|
|
362
388
|
// !!!暂不允许修改字段类型
|
|
363
389
|
if (_.has(doc, 'type')) {
|
|
364
390
|
const newFieldType = doc.type;
|
|
365
|
-
if (newFieldType && (latestDoc.type != newFieldType)) {
|
|
391
|
+
if (latestDoc.type && newFieldType && (latestDoc.type != newFieldType)) {
|
|
366
392
|
throw new Error('禁止修改字段类型。');
|
|
367
393
|
}
|
|
368
394
|
}
|
|
@@ -373,5 +399,36 @@ module.exports = {
|
|
|
373
399
|
if( ["parent","children"].indexOf(field.name) > -1 && enable_tree ){
|
|
374
400
|
throw new Meteor.Error(500, "启用树状结构显示记录的对象不能删除parent、children字段。");
|
|
375
401
|
}
|
|
402
|
+
},
|
|
403
|
+
|
|
404
|
+
afterInsert: async function () {
|
|
405
|
+
const { doc } = this;
|
|
406
|
+
const { type, name, object: objectName } = doc;
|
|
407
|
+
// 如果是地理位置字段,则需立即创建索引,否则mongodb查询地理位置字段时会报错 'unable to find index for $geoNear query' on server'
|
|
408
|
+
if (type === 'location') {
|
|
409
|
+
const defaultAdapter = objectql.getDataSource('default').adapter
|
|
410
|
+
await defaultAdapter.connect();
|
|
411
|
+
const collection = defaultAdapter.collection(objectName);
|
|
412
|
+
|
|
413
|
+
try {
|
|
414
|
+
const indexInfo = {
|
|
415
|
+
key: {
|
|
416
|
+
[`${name}.wgs84`]: "2dsphere"
|
|
417
|
+
},
|
|
418
|
+
name: `c2_${name}_wgs84`,
|
|
419
|
+
unique: false,
|
|
420
|
+
sparse: false,
|
|
421
|
+
background: true
|
|
422
|
+
}
|
|
423
|
+
const key = indexInfo.key;
|
|
424
|
+
try {
|
|
425
|
+
await collection.createIndex(key, indexInfo)
|
|
426
|
+
} catch (error) {
|
|
427
|
+
// DO NOTHING
|
|
428
|
+
}
|
|
429
|
+
} catch (error) {
|
|
430
|
+
console.error(error)
|
|
431
|
+
}
|
|
432
|
+
}
|
|
376
433
|
}
|
|
377
434
|
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
const InternalData = require('@steedos/standard-objects').internalData;
|
|
2
2
|
const util = require('@steedos/standard-objects').util;
|
|
3
3
|
const objectql = require('@steedos/objectql');
|
|
4
|
+
const auth = require("@steedos/auth");
|
|
4
5
|
|
|
5
6
|
const getInternalListviews = async function(sourceListviews, filters, is_system){
|
|
6
7
|
let collection = await objectql.getObject("object_listviews");
|
|
@@ -21,6 +22,16 @@ const getInternalListviews = async function(sourceListviews, filters, is_system)
|
|
|
21
22
|
|
|
22
23
|
module.exports = {
|
|
23
24
|
beforeInsert: async function () {
|
|
25
|
+
const { userId, spaceId } = this;
|
|
26
|
+
if(userId && spaceId){
|
|
27
|
+
const userSession = await auth.getSessionByUserId(userId, spaceId);
|
|
28
|
+
if(userSession){
|
|
29
|
+
const { allowCreateListViews } = await objectql.getObject("object_listviews").getUserObjectPermission(userSession, false);
|
|
30
|
+
if(!allowCreateListViews){
|
|
31
|
+
throw new Error('没有权限创建视图')
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
24
35
|
if (!this.doc.name) {
|
|
25
36
|
this.doc.name = 'listview_' + this.doc._id.toLowerCase();
|
|
26
37
|
}
|
|
@@ -29,10 +40,6 @@ module.exports = {
|
|
|
29
40
|
beforeUpdate: async function () {
|
|
30
41
|
const oldDoc = await objectql.getObject(this.object_name).findOne(this.id)
|
|
31
42
|
let name = oldDoc.name,object_name = oldDoc.object_name;
|
|
32
|
-
|
|
33
|
-
if (!this.doc.name) {
|
|
34
|
-
this.doc.name = 'listview_' + this.id.toLowerCase();
|
|
35
|
-
}
|
|
36
43
|
|
|
37
44
|
if(_.has(this.doc, 'name')){
|
|
38
45
|
name = this.doc.name
|
|
@@ -36,28 +36,6 @@ module.exports = {
|
|
|
36
36
|
}
|
|
37
37
|
})
|
|
38
38
|
},
|
|
39
|
-
afterAggregate: async function(){
|
|
40
|
-
let userId = this.userId
|
|
41
|
-
let spaceId = this.spaceId;
|
|
42
|
-
for (const doc of this.data.values) {
|
|
43
|
-
doc.fields = Object.assign({}, doc.fields, await InternalData.getDefaultSysFields(doc.name, userId)) ;
|
|
44
|
-
}
|
|
45
|
-
// this.data.values = this.data.values.concat(await InternalData.findObjects(userId, this.query.filters));
|
|
46
|
-
|
|
47
|
-
this.data.values = this.data.values.concat(await InternalData.getObjects(userId));
|
|
48
|
-
|
|
49
|
-
this.data.values = objectql.getSteedosSchema().metadataDriver.find(this.data.values, this.query, spaceId);
|
|
50
|
-
|
|
51
|
-
_.each(this.data.values, function(value){
|
|
52
|
-
if(value){
|
|
53
|
-
delete value.actions;
|
|
54
|
-
delete value.fields;
|
|
55
|
-
delete value.list_views;
|
|
56
|
-
delete value.permission_set;
|
|
57
|
-
delete value.triggers;
|
|
58
|
-
}
|
|
59
|
-
})
|
|
60
|
-
},
|
|
61
39
|
afterCount: async function(){
|
|
62
40
|
let userId = this.userId
|
|
63
41
|
let spaceId = this.spaceId;
|
|
@@ -134,9 +112,9 @@ module.exports = {
|
|
|
134
112
|
const latestDoc = await obj.findOne(id);
|
|
135
113
|
const newObjName = doc.name;
|
|
136
114
|
// !!!暂不允许修改name
|
|
137
|
-
if (newObjName && (latestDoc.name != newObjName)) {
|
|
138
|
-
|
|
139
|
-
}
|
|
115
|
+
// if (newObjName && (latestDoc.name != newObjName)) {
|
|
116
|
+
// throw new Error('禁止修改API 名称。');
|
|
117
|
+
// }
|
|
140
118
|
/*
|
|
141
119
|
if (newObjName && (latestDoc.name != newObjName) && latestDoc.datasource === 'default') {
|
|
142
120
|
const datasource = objectql.getDataSource(latestDoc.datasource);
|
|
@@ -169,7 +147,7 @@ module.exports = {
|
|
|
169
147
|
}
|
|
170
148
|
*/
|
|
171
149
|
|
|
172
|
-
await sleep(1000 * 2)
|
|
150
|
+
// await sleep(1000 * 2)
|
|
173
151
|
},
|
|
174
152
|
afterDelete: async function(){
|
|
175
153
|
const { previousDoc: object, spaceId } = this;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@steedos/standard-object-database",
|
|
3
|
-
"version": "2.6.
|
|
3
|
+
"version": "2.6.2-beta.2",
|
|
4
4
|
"main": "package.service.js",
|
|
5
5
|
"private": false,
|
|
6
6
|
"publishConfig": {
|
|
@@ -15,5 +15,5 @@
|
|
|
15
15
|
},
|
|
16
16
|
"repository": {},
|
|
17
17
|
"license": "MIT",
|
|
18
|
-
"gitHead": "
|
|
18
|
+
"gitHead": "ddef9fbc34afc7b57c59a31e9ed4f56818dc4c31"
|
|
19
19
|
}
|
package/package.service.js
CHANGED
|
@@ -1,21 +1,25 @@
|
|
|
1
1
|
/*
|
|
2
2
|
* @Author: sunhaolin@hotoa.com
|
|
3
3
|
* @Date: 1985-10-26 16:15:00
|
|
4
|
-
* @LastEditors: sunhaolin@
|
|
5
|
-
* @LastEditTime:
|
|
4
|
+
* @LastEditors: 孙浩林 sunhaolin@steedos.com
|
|
5
|
+
* @LastEditTime: 2023-11-30 10:13:13
|
|
6
6
|
* @Description:
|
|
7
7
|
*/
|
|
8
8
|
"use strict";
|
|
9
9
|
const project = require('./package.json');
|
|
10
10
|
const packageName = project.name;
|
|
11
11
|
const packageLoader = require('@steedos/service-meteor-package-loader');
|
|
12
|
+
const serviceObjectMixin = require('@steedos/service-object-mixin');
|
|
13
|
+
const validator = require('validator');
|
|
14
|
+
const triggers = require('./src/triggers');
|
|
15
|
+
|
|
12
16
|
/**
|
|
13
17
|
* @typedef {import('moleculer').Context} Context Moleculer's Context
|
|
14
18
|
*/
|
|
15
19
|
module.exports = {
|
|
16
20
|
name: packageName,
|
|
17
21
|
namespace: "steedos",
|
|
18
|
-
mixins: [packageLoader],
|
|
22
|
+
mixins: [packageLoader, serviceObjectMixin],
|
|
19
23
|
/**
|
|
20
24
|
* Settings
|
|
21
25
|
*/
|
|
@@ -36,7 +40,86 @@ module.exports = {
|
|
|
36
40
|
* Actions
|
|
37
41
|
*/
|
|
38
42
|
actions: {
|
|
43
|
+
...triggers,
|
|
44
|
+
|
|
45
|
+
objects__upsert: {
|
|
46
|
+
graphql: {
|
|
47
|
+
mutation:
|
|
48
|
+
"objects__upsert(id: String, doc: JSON): objects"
|
|
49
|
+
},
|
|
50
|
+
async handler(ctx) {
|
|
51
|
+
if(validator.toBoolean(process.env.STEEDOS_TENANT_ENABLE_SAAS || 'false', true) == true){
|
|
52
|
+
throw new Error('No permission')
|
|
53
|
+
}
|
|
54
|
+
const userSession = ctx.meta.user;
|
|
55
|
+
let { id, doc } = ctx.params;
|
|
56
|
+
return this.objectsUpsert(id, doc, userSession)
|
|
57
|
+
},
|
|
58
|
+
},
|
|
59
|
+
object_fields__upsert: {
|
|
60
|
+
graphql: {
|
|
61
|
+
mutation:
|
|
62
|
+
"object_fields__upsert(id: String, doc: JSON): object_fields"
|
|
63
|
+
},
|
|
64
|
+
async handler(ctx) {
|
|
65
|
+
if(validator.toBoolean(process.env.STEEDOS_TENANT_ENABLE_SAAS || 'false', true) == true){
|
|
66
|
+
throw new Error('No permission')
|
|
67
|
+
}
|
|
68
|
+
const userSession = ctx.meta.user;
|
|
69
|
+
let { id, doc } = ctx.params;
|
|
70
|
+
let data = '';
|
|
71
|
+
if (_.isString(doc)) {
|
|
72
|
+
data = JSON.parse(doc);
|
|
73
|
+
} else {
|
|
74
|
+
data = JSON.parse(JSON.stringify(doc));
|
|
75
|
+
}
|
|
76
|
+
delete data.space;
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
const object = await this.getObject('object_fields');
|
|
81
|
+
if(id.indexOf('.') > 0){
|
|
82
|
+
const [objectName, fieldName] = id.split('.');
|
|
83
|
+
|
|
84
|
+
const dbObj = await this.getObject('objects').directFind({filters: ['name','=', objectName]});
|
|
85
|
+
|
|
86
|
+
if(dbObj.length === 0){
|
|
87
|
+
const records = await this.getObject('objects').find({filters: ['name','=', objectName]});
|
|
88
|
+
if(records.length > 0){
|
|
89
|
+
this.objectsUpsert(objectName, records[0], userSession)
|
|
90
|
+
}
|
|
91
|
+
}
|
|
39
92
|
|
|
93
|
+
const dbRecord = await object.directFind({filters: [['object','=',objectName], ['name','=',fieldName]]});
|
|
94
|
+
if(dbRecord.length > 0){
|
|
95
|
+
id = dbRecord[0]._id;
|
|
96
|
+
}else{
|
|
97
|
+
const newId = await object._makeNewID();
|
|
98
|
+
const now = new Date();
|
|
99
|
+
await object.directInsert(Object.assign({}, data, {
|
|
100
|
+
_id: newId,
|
|
101
|
+
name: data._name || fieldName,
|
|
102
|
+
owner: userSession.userId,
|
|
103
|
+
space: userSession.spaceId,
|
|
104
|
+
object: objectName,
|
|
105
|
+
created: now,
|
|
106
|
+
modified: now,
|
|
107
|
+
created_by: userSession.userId,
|
|
108
|
+
modified_by: userSession.userId,
|
|
109
|
+
company_id: userSession.company_id,
|
|
110
|
+
company_ids: userSession.company_ids,
|
|
111
|
+
is_system: true
|
|
112
|
+
}));
|
|
113
|
+
id = newId;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
if(data.is_system){
|
|
117
|
+
// 'label' 先禁止编辑label , 目前由于i18n的问题导致 label无效.
|
|
118
|
+
data = _.pick(data, ['defaultValue', 'group', 'rows', 'sort_no', 'is_wide', 'index', 'sortable', 'searchable', 'filterable', 'visible_on', 'inlineHelpText', 'description', 'amis', 'required', 'unique', 'readonly', 'hidden', 'deleted_lookup_record_behavior']);
|
|
119
|
+
}
|
|
120
|
+
return object.update(id, data, userSession)
|
|
121
|
+
},
|
|
122
|
+
},
|
|
40
123
|
},
|
|
41
124
|
|
|
42
125
|
/**
|
|
@@ -50,7 +133,53 @@ module.exports = {
|
|
|
50
133
|
* Methods
|
|
51
134
|
*/
|
|
52
135
|
methods: {
|
|
136
|
+
objectsUpsert: {
|
|
137
|
+
async handler(id, doc, userSession){
|
|
138
|
+
let data = '';
|
|
139
|
+
if (_.isString(doc)) {
|
|
140
|
+
data = JSON.parse(doc);
|
|
141
|
+
} else {
|
|
142
|
+
data = JSON.parse(JSON.stringify(doc));
|
|
143
|
+
}
|
|
53
144
|
|
|
145
|
+
if(data.form && _.isString(data.form)){
|
|
146
|
+
data.form = JSON.parse(data.form)
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
delete data.space;
|
|
150
|
+
const name = data.name;
|
|
151
|
+
|
|
152
|
+
const object = await this.getObject('objects');
|
|
153
|
+
const dbRecord = await object.directFind({filters: ['_id','=',id]});
|
|
154
|
+
if(dbRecord.length === 0){
|
|
155
|
+
// const newId = await object._makeNewID();
|
|
156
|
+
const now = new Date();
|
|
157
|
+
await object.directInsert(Object.assign({}, data, {
|
|
158
|
+
// _id: newId,
|
|
159
|
+
_id: id, // saas模式不支持修改对象
|
|
160
|
+
name: name,
|
|
161
|
+
owner: userSession.userId,
|
|
162
|
+
space: userSession.spaceId,
|
|
163
|
+
created: now,
|
|
164
|
+
modified: now,
|
|
165
|
+
created_by: userSession.userId,
|
|
166
|
+
modified_by: userSession.userId,
|
|
167
|
+
company_id: userSession.company_id,
|
|
168
|
+
company_ids: userSession.company_ids,
|
|
169
|
+
extend: name,
|
|
170
|
+
custom: false,
|
|
171
|
+
is_system: true
|
|
172
|
+
}));
|
|
173
|
+
// id = newId;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
if(data.is_system){
|
|
177
|
+
data = _.pick(data, ['label', 'icon', 'enable_files', 'enable_tasks', 'enable_notes', 'enable_events', 'enable_workflow', 'enable_instances', 'enable_inline_edit', 'enable_tree', 'enable_enhanced_lookup', 'description', 'is_deleted'])
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
return object.update(id, data, userSession)
|
|
181
|
+
}
|
|
182
|
+
}
|
|
54
183
|
},
|
|
55
184
|
|
|
56
185
|
/**
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* @Author: 孙浩林 sunhaolin@steedos.com
|
|
3
|
+
* @Date: 2023-11-01 10:47:02
|
|
4
|
+
* @LastEditors: 孙浩林 sunhaolin@steedos.com
|
|
5
|
+
* @LastEditTime: 2023-11-04 16:05:05
|
|
6
|
+
* @FilePath: /steedos-platform-2.3/services/standard-object-database/src/triggers/index.js
|
|
7
|
+
* @Description:
|
|
8
|
+
*/
|
|
9
|
+
module.exports = {
|
|
10
|
+
object_fields_trigger_create_index: require('./object_fields_trigger_create_index'),
|
|
11
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* @Author: 孙浩林 sunhaolin@steedos.com
|
|
3
|
+
* @Date: 2023-11-01 10:47:47
|
|
4
|
+
* @LastEditors: 孙浩林 sunhaolin@steedos.com
|
|
5
|
+
* @LastEditTime: 2023-11-08 16:08:35
|
|
6
|
+
* @FilePath: /steedos-platform-2.3/services/standard-object-database/src/triggers/object_fields_trigger_create_index.js
|
|
7
|
+
* @Description: 当管理员新建/编辑字段时勾选了创建索引/创建唯一索引,保存后立即创建索引 https://github.com/steedos/steedos-platform/issues/5650
|
|
8
|
+
*/
|
|
9
|
+
module.exports = {
|
|
10
|
+
trigger: {
|
|
11
|
+
listenTo: 'object_fields',
|
|
12
|
+
when: [
|
|
13
|
+
'afterInsert',
|
|
14
|
+
'afterUpdate',
|
|
15
|
+
],
|
|
16
|
+
},
|
|
17
|
+
async handler(ctx) {
|
|
18
|
+
const { isInsert, isUpdate, isDelete, isFind, isBefore, isAfter, id, doc, previousDoc, size, userId, spaceId, objectName, query, data } = ctx.params;
|
|
19
|
+
|
|
20
|
+
if (isAfter) {
|
|
21
|
+
if (isInsert) {
|
|
22
|
+
const { index, unique, object, name } = doc
|
|
23
|
+
if (object && (index || unique)) {
|
|
24
|
+
const obj = this.getObject(object)
|
|
25
|
+
setTimeout(async function () {
|
|
26
|
+
await obj.createIndex(name)
|
|
27
|
+
}, 6000) // 等待对象重新加载
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
if (isUpdate) {
|
|
31
|
+
const fieldObj = this.getObject(objectName)
|
|
32
|
+
const newDoc = await fieldObj.findOne(id)
|
|
33
|
+
const { index, unique, object, name } = newDoc
|
|
34
|
+
const { index: preIndex, unique: preUnique } = previousDoc
|
|
35
|
+
// 判断是否修改了索引
|
|
36
|
+
if (object) {
|
|
37
|
+
const obj = this.getObject(object)
|
|
38
|
+
if ((index || unique) && ((preIndex != index && !unique) || preUnique != unique)) {
|
|
39
|
+
setTimeout(async function () {
|
|
40
|
+
if ((preIndex || preUnique) && ((preIndex != index && !unique) || preUnique != unique)) { // 之前勾选过,现在调整了
|
|
41
|
+
await obj.dropIndex(name)
|
|
42
|
+
}
|
|
43
|
+
await obj.createIndex(name)
|
|
44
|
+
}, 6000)
|
|
45
|
+
}
|
|
46
|
+
// 取消勾选,删除索引
|
|
47
|
+
if ((!index && !unique) && (preIndex || preUnique)) {
|
|
48
|
+
setTimeout(async function () {
|
|
49
|
+
await obj.dropIndex(name)
|
|
50
|
+
}, 6000)
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
name: standard_edit
|
|
2
|
-
amis_schema: |-
|
|
3
|
-
{
|
|
4
|
-
"type": "service",
|
|
5
|
-
"body": [
|
|
6
|
-
{
|
|
7
|
-
"type": "button",
|
|
8
|
-
"label": "编辑",
|
|
9
|
-
"id": "u:standard_edit",
|
|
10
|
-
"onEvent": {
|
|
11
|
-
"click": {
|
|
12
|
-
"actions": [
|
|
13
|
-
{
|
|
14
|
-
"actionType": "custom",
|
|
15
|
-
"script": "const appId = null;\nconst page = Steedos.Page.getPage('form', appId, null, null, \"object_layouts\");\nif (page && page.schema) {\n const pageSchema = JSON.parse(page.schema);\n let formSchema = pageSchema.body[0];\n // 设置form的canAccessSuperData属性防止弹出窗口从父级取字段默认值\n formSchema.canAccessSuperData = false;\n // 设置form的wrapWithPanel属性隐藏其底部保存取消按钮\n formSchema.wrapWithPanel = false;\n formSchema.className = \"steedos-amis-form\";\n const title = \"编辑 页面布局\";\n doAction({\n \"actionType\": \"dialog\",\n \"dialog\": {\n \"type\": \"dialog\",\n \"title\": title,\n \"body\": [formSchema],\n \"size\": \"lg\"\n }\n });\n}"
|
|
16
|
-
}
|
|
17
|
-
],
|
|
18
|
-
"weight": 0
|
|
19
|
-
}
|
|
20
|
-
},
|
|
21
|
-
"className": ""
|
|
22
|
-
}
|
|
23
|
-
],
|
|
24
|
-
"regions": [
|
|
25
|
-
"body"
|
|
26
|
-
],
|
|
27
|
-
"data": {
|
|
28
|
-
"context": {
|
|
29
|
-
"rootUrl": "http://127.0.0.1:5000"
|
|
30
|
-
},
|
|
31
|
-
"app_id": "",
|
|
32
|
-
"tab_id": "",
|
|
33
|
-
"object_name": "",
|
|
34
|
-
"dataComponentId": "",
|
|
35
|
-
"record_id": "",
|
|
36
|
-
"record": {},
|
|
37
|
-
"permissions": {}
|
|
38
|
-
},
|
|
39
|
-
"bodyClassName": "p-0"
|
|
40
|
-
}
|
|
41
|
-
is_enable: true
|
|
42
|
-
label: 编辑
|
|
43
|
-
'on': record_only
|
|
44
|
-
type: amis_button
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"type": "page",
|
|
3
|
-
"body": [
|
|
4
|
-
{
|
|
5
|
-
"type": "steedos-object-form",
|
|
6
|
-
"label": "对象表单",
|
|
7
|
-
"objectApiName": "object_fields",
|
|
8
|
-
"recordId": "${recordId}",
|
|
9
|
-
"className": "sm:border sm:shadow sm:rounded sm:border-gray-300 bg-white p-4",
|
|
10
|
-
"id": "u:b3d626885b90",
|
|
11
|
-
"mode": "edit",
|
|
12
|
-
"layout": "normal",
|
|
13
|
-
"enableTabs": true,
|
|
14
|
-
"onEvent": {
|
|
15
|
-
"change": {
|
|
16
|
-
"actions": [
|
|
17
|
-
{
|
|
18
|
-
"actionType": "setValue",
|
|
19
|
-
"args": {
|
|
20
|
-
"value": {
|
|
21
|
-
"defaultValue": ""
|
|
22
|
-
}
|
|
23
|
-
},
|
|
24
|
-
"expression": "${!!event.data.defaultValue_formula}"
|
|
25
|
-
}
|
|
26
|
-
]
|
|
27
|
-
}
|
|
28
|
-
},
|
|
29
|
-
"initApiAdaptor": "const defaultValue_field_value = payload.data.defaultValue; if(defaultValue_field_value && _.isString(defaultValue_field_value) && defaultValue_field_value.indexOf('{')>-1 ){ payload.data.defaultValue_formula = defaultValue_field_value; delete payload.data.defaultValue; } return payload;",
|
|
30
|
-
"apiRequestAdaptor": "if(formData.defaultValue_formula){ formData.defaultValue = formData.defaultValue_formula } __saveData = JSON.stringify(JSON.stringify(formData)); api.data = {query: query.replace('{__saveData}', __saveData)};"
|
|
31
|
-
}
|
|
32
|
-
],
|
|
33
|
-
"regions": [
|
|
34
|
-
"body"
|
|
35
|
-
],
|
|
36
|
-
"data": {
|
|
37
|
-
"objectName": "object_fields"
|
|
38
|
-
},
|
|
39
|
-
"name": "page_object_fields_form",
|
|
40
|
-
"bodyClassName": "",
|
|
41
|
-
"id": "u:6e9674f278b0"
|
|
42
|
-
}
|