@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.
Files changed (54) hide show
  1. package/main/default/client/coordtransform.client.js +153 -0
  2. package/main/default/client/object_fields.client.js +150 -44
  3. package/main/default/objectTranslations/object_actions.en/object_actions.en.objectTranslation.yml +2 -0
  4. package/main/default/objectTranslations/object_actions.zh-CN/object_actions.zh-CN.objectTranslation.yml +2 -0
  5. package/main/default/objectTranslations/object_fields.en/object_fields.en.objectTranslation.yml +27 -2
  6. package/main/default/objectTranslations/object_fields.zh-CN/object_fields.zh-CN.objectTranslation.yml +32 -4
  7. package/main/default/objectTranslations/object_layouts.en/object_layouts.en.objectTranslation.yml +2 -0
  8. package/main/default/objectTranslations/object_layouts.zh-CN/object_layouts.zh-CN.objectTranslation.yml +2 -0
  9. package/main/default/objectTranslations/object_listviews.en/object_listviews.en.objectTranslation.yml +29 -1
  10. package/main/default/objectTranslations/object_listviews.zh-CN/object_listviews.zh-CN.objectTranslation.yml +27 -1
  11. package/main/default/objectTranslations/object_triggers.en/object_triggers.en.objectTranslation.yml +7 -1
  12. package/main/default/objectTranslations/object_triggers.zh-CN/object_triggers.zh-CN.objectTranslation.yml +8 -2
  13. package/main/default/objectTranslations/object_validation_rules.en/object_validation_rules.en.objectTranslation.yml +2 -0
  14. package/main/default/objectTranslations/object_validation_rules.zh-CN/object_validation_rules.zh-CN.objectTranslation.yml +2 -0
  15. package/main/default/objects/1.objects.observe.object.js +4 -1
  16. package/main/default/objects/7.object_actions.observe.object.js +7 -1
  17. package/main/default/objects/object_actions.action.js +34 -3
  18. package/main/default/objects/object_actions.object.js +4 -2
  19. package/main/default/objects/object_actions.object.yml +26 -1
  20. package/main/default/objects/object_fields.object.js +33 -19
  21. package/main/default/objects/object_fields.object.yml +129 -83
  22. package/main/default/objects/object_layouts.action.js +4 -4
  23. package/main/default/objects/object_layouts.object.yml +16 -2
  24. package/main/default/objects/object_listviews.object.yml +67 -16
  25. package/main/default/objects/object_triggers.object.yml +13 -4
  26. package/main/default/objects/object_validation_rules.object.yml +10 -0
  27. package/main/default/objects/objects/buttons/custom.button.js +48 -0
  28. package/main/default/objects/objects/buttons/custom.button.yml +6 -0
  29. package/main/default/objects/objects.action.js +26 -3
  30. package/main/default/objects/objects.core.js +17 -1
  31. package/main/default/objects/objects.object.js +3 -2
  32. package/main/default/objects/objects.object.yml +28 -2
  33. package/main/default/objects/objects.tree.js +3 -2
  34. package/main/default/pages/design_field_layout.page.amis.json +418 -0
  35. package/main/default/pages/design_field_layout.page.yml +7 -0
  36. package/main/default/pages/object_detail.page.amis.json +6 -6
  37. package/main/default/pages/object_fields_form.page.amis.json +35 -0
  38. package/main/default/pages/{object_fields.page.yml → object_fields_form.page.yml} +5 -5
  39. package/main/default/pages/object_form.page.amis.json +31 -0
  40. package/main/default/pages/object_form.page.yml +12 -0
  41. package/main/default/routes/amis_button_design.router.js +11 -2
  42. package/main/default/routes/amis_listview_design.router.js +11 -2
  43. package/main/default/services/suggestions.service.js +4 -5
  44. package/main/default/triggers/object_actions.trigger.js +6 -2
  45. package/main/default/triggers/object_fields.trigger.js +67 -10
  46. package/main/default/triggers/object_listviews.trigger.js +11 -4
  47. package/main/default/triggers/objects.trigger.js +4 -26
  48. package/package.json +2 -2
  49. package/package.service.js +132 -3
  50. package/src/triggers/index.js +11 -0
  51. package/src/triggers/object_fields_trigger_create_index.js +58 -0
  52. package/main/default/objects/object_layouts/buttons/standard_edit.button.yml +0 -44
  53. package/main/default/pages/object_fields.page.amis.json +0 -42
  54. 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: sunhaolin@hotoa.com
5
- * @LastEditTime: 2022-07-29 11:26:31
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.push(Object.assign({_id: `${objectName}.${field.name}`}, field))
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 !== dbDoc._name || doc.type !== dbDoc.type || doc.object !== dbDoc.object || doc.reference_to !== dbDoc.reference_to || !!doc.multiple !== !!dbDoc.multiple || ("children" === dbDoc._name && doc.omit !== true)){
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
- const newFieldName = doc._name;
358
- if (newFieldName && (latestDoc._name != newFieldName)) {
359
- throw new Error('禁止修改字段名。');
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
- throw new Error('禁止修改API 名称。');
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.1-beta.7",
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": "b12f271460ef3686face095e875aa38e8ddc4c7f"
18
+ "gitHead": "ddef9fbc34afc7b57c59a31e9ed4f56818dc4c31"
19
19
  }
@@ -1,21 +1,25 @@
1
1
  /*
2
2
  * @Author: sunhaolin@hotoa.com
3
3
  * @Date: 1985-10-26 16:15:00
4
- * @LastEditors: sunhaolin@hotoa.com
5
- * @LastEditTime: 2022-12-09 13:41:16
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
- }