@steedos/standard-object-database 2.5.20-beta.2 → 2.5.20-beta.20

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.
@@ -356,6 +356,7 @@ fields:
356
356
  groups:
357
357
  external_data_source: External data source
358
358
  advanced: Advanced
359
+ ui: UI
359
360
  listviews:
360
361
  all:
361
362
  label: All
@@ -332,6 +332,7 @@ fields:
332
332
  groups:
333
333
  external_data_source: 外部数据源
334
334
  advanced: 高级
335
+ ui: 界面布局
335
336
  listviews:
336
337
  all:
337
338
  label: 所有
@@ -3,6 +3,19 @@ var objectql = require('@steedos/objectql');
3
3
  var clone = require('clone');
4
4
  var objectCore = require('./objects.core.js');
5
5
 
6
+ const objectFieldsFind = function (filter) {
7
+ return objectql.wrapAsync(async function () {
8
+ return await objectql.getObject('object_fields').find(this.filter);
9
+ }, { filter: filter })
10
+ }
11
+
12
+
13
+ const getRecords = function (objectName) {
14
+ return objectql.wrapAsync(async function () {
15
+ return await objectql.getObject(this.objectName).directFind({fields:["_id"], top: 1});
16
+ }, { objectName: objectName })
17
+ }
18
+
6
19
  const MAX_MASTER_DETAIL_LEAVE = objectql.MAX_MASTER_DETAIL_LEAVE;
7
20
 
8
21
  function canRemoveNameFileld(doc){
@@ -105,20 +118,18 @@ function _syncToObject(doc, event) {
105
118
  };
106
119
 
107
120
  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
- }
121
+ var other = objectFieldsFind({
122
+ filters: [[
123
+ 'object', '=', doc.object
124
+ ], [
125
+ 'space', '=', doc.space
126
+ ], [
127
+ '_id', '!=', doc._id
128
+ ], [
129
+ 'name', '=', name || doc.name
130
+ ]]
120
131
  });
121
- if (other.count() > 0) {
132
+ if (other.length > 0) {
122
133
  return true;
123
134
  }
124
135
  return false;
@@ -428,11 +439,11 @@ var triggers = {
428
439
  }
429
440
  });
430
441
  if (object) {
431
- object_documents = Creator.getCollection(object.name).find();
432
- if ((modifier != null ? (ref6 = modifier.$set) != null ? ref6.reference_to : void 0 : void 0) && doc.reference_to !== _reference_to && object_documents.count() > 0) {
442
+ object_documents = getRecords(object.name);
443
+ if ((modifier != null ? (ref6 = modifier.$set) != null ? ref6.reference_to : void 0 : void 0) && doc.reference_to !== _reference_to && object_documents.length > 0) {
433
444
  throw new Meteor.Error(500, `对象${object.label}中已经有记录,不能修改reference_to字段`);
434
445
  }
435
- if ((modifier != null ? (ref7 = modifier.$unset) != null ? ref7.reference_to : void 0 : void 0) && doc.reference_to !== _reference_to && object_documents.count() > 0) {
446
+ if ((modifier != null ? (ref7 = modifier.$unset) != null ? ref7.reference_to : void 0 : void 0) && doc.reference_to !== _reference_to && object_documents.length > 0) {
436
447
  throw new Meteor.Error(500, `对象${object.label}中已经有记录,不能修改reference_to字段`);
437
448
  }
438
449
  }
@@ -455,33 +466,6 @@ var triggers = {
455
466
  throw new Meteor.Error(500, "华炎云服务不包含自定义业务对象的功能,请部署私有云版本");
456
467
  }
457
468
 
458
- const staticRequiredFields = ['object','label','_name','type'];
459
- // const staticRequiredFieldLabel = ['所属对象','显示名称','字段名','字段类型'];
460
- for(let i = 0; i<staticRequiredFields.length; i++){
461
- const fieldName = staticRequiredFields[i];
462
- const fieldValue = doc[fieldName];
463
- if(!fieldValue){
464
- throw new Meteor.Error(fieldName, "必填字段");
465
- }
466
- }
467
- // options子字段、precision、scale、summary_field不参与以下简单动态必填字段组。
468
- const dynamicsRequired = [
469
- ['language',['code']],['reference_to',['lookup', 'master_detail']],['formula',['autonumber', 'formula']],
470
- ['data_type',['formula']],['rows',['textarea']],['options',['select']],
471
- ['formula_blank_value',['formula']],['summary_object',['summary']],['summary_type',['summary']],
472
- ['deleted_lookup_record_behavior',['lookup']]
473
- ];
474
-
475
- for(let i = 0; i<dynamicsRequired.length; i++){
476
- if( dynamicsRequired[i][1].indexOf(doc.type) > -1 ){
477
- const fieldName = dynamicsRequired[i][0];
478
- const fieldValue = doc[fieldName];
479
- if(!fieldValue){
480
- throw new Meteor.Error(fieldName, "动态必填字段");
481
- }
482
- }
483
- }
484
-
485
469
  checkName(doc._name);
486
470
  if(['name','owner','parent','children'].indexOf(doc._name)>-1){
487
471
  doc.name = doc._name;
@@ -492,8 +476,9 @@ var triggers = {
492
476
  if(doc.name === 'name' || doc.is_name){
493
477
  checkNameField({type: doc.type})
494
478
  }
495
-
479
+ console.log('insert', doc)
496
480
  if (isRepeatedName(doc)) {
481
+
497
482
  throw new Meteor.Error(doc.name, "字段名不能重复");
498
483
  }
499
484
 
@@ -689,12 +689,12 @@ fields:
689
689
  defaultValue: 100
690
690
  scale: 0
691
691
  sortable: true
692
- group: Advanced
692
+ group: ui
693
693
  sort_no: 370
694
694
  is_name:
695
695
  type: boolean
696
696
  label: Is Name
697
- group: Advanced
697
+ group: External data source
698
698
  sort_no: 380
699
699
  amis:
700
700
  disabledOn: "${is_system == true}"
@@ -731,24 +731,25 @@ fields:
731
731
  defaultValue: clear
732
732
  amis:
733
733
  "id": "u:6a556d8a8514"
734
- "disabledOn": "${required==true || is_system == true}"
734
+ "disabledOn": "${required==true}"
735
735
  is_wide:
736
736
  type: boolean
737
737
  label: Is Wide
738
738
  # group: Advanced
739
- # readonly:
740
- # type: boolean
741
- # label: Readonly
742
- # group: Advanced
743
- # hidden:
744
- # type: boolean
745
- # label: Hidden
746
- # group: Advanced
739
+ sort_no: 274
740
+ group: ui
741
+ readonly:
742
+ type: boolean
743
+ label: Readonly
744
+ group: ui
745
+ hidden:
746
+ type: boolean
747
+ label: Hidden
748
+ group: ui
747
749
  # omit:
748
750
  # type: boolean
749
751
  # label: Omit
750
752
  # group: Advanced
751
- sort_no: 274
752
753
  index:
753
754
  type: boolean
754
755
  label: Is Index Field
@@ -764,17 +765,17 @@ fields:
764
765
  sortable:
765
766
  type: boolean
766
767
  label: Sortable
767
- group: Advanced
768
+ group: ui
768
769
  sort_no: 420
769
770
  searchable:
770
771
  type: boolean
771
772
  label: Searchable
772
- group: Advanced
773
+ group: ui
773
774
  sort_no: 428
774
775
  filterable:
775
776
  type: boolean
776
777
  label: Filterable
777
- group: Advanced
778
+ group: ui
778
779
  sort_no: 430
779
780
  show_as_qr:
780
781
  type: boolean
@@ -788,7 +789,7 @@ fields:
788
789
  type: textarea
789
790
  label: Visible On
790
791
  is_wide: true
791
- group: Advanced
792
+ group: ui
792
793
  sort_no: 450
793
794
  inlineHelpText: <a href='https://docs.steedos.com/zh-CN/no-code/customize/fields/field-attributes#%E5%AD%97%E6%AE%B5%E6%98%BE%E7%A4%BA%E5%85%AC%E5%BC%8F' target='_blank'>查看帮助</a>
794
795
  inlineHelpText:
@@ -831,6 +832,8 @@ list_views:
831
832
  - object
832
833
  - sort_no
833
834
  - modified
835
+ - hidden
836
+ - readonly
834
837
  - is_system
835
838
  sort:
836
839
  - field_name: sort_no
@@ -846,6 +849,8 @@ list_views:
846
849
  - object
847
850
  - sort_no
848
851
  - modified
852
+ - hidden
853
+ - readonly
849
854
  - is_system
850
855
  label: 自定义
851
856
  filters:
@@ -0,0 +1,48 @@
1
+ /*
2
+ * @Author: baozhoutaon@hotoa.com
3
+ * @Date: 2022-03-29 20:33:44
4
+ * @LastEditors: baozhoutao@steedos.com
5
+ * @LastEditTime: 2023-11-19 17:06:18
6
+ * @Description:
7
+ */
8
+ module.exports = {
9
+ custom: function (object_name, record_id) {
10
+ $(document.body).addClass('loading');
11
+ let url = `/graphql`;
12
+ const obj = Creator.odata.get("objects", record_id);
13
+ delete obj.record_permissions;
14
+ delete obj["@odata.context"]
15
+ delete obj["@odata.editLink"]
16
+ delete obj["@odata.etag"]
17
+ delete obj["@odata.id"]
18
+ delete obj.idFieldName;
19
+ let options = {
20
+ type: 'post',
21
+ async: true,
22
+ data: JSON.stringify({
23
+ query: `mutation{objects__upsert(id: "${obj.name}", doc: ${JSON.stringify(JSON.stringify(obj))}){_id,name}}`
24
+ }),
25
+ success: function (data) {
26
+ console.log(`data====>`, data)
27
+ SteedosUI.notification.success({
28
+ message: '对象已自定义。'
29
+ });
30
+ // SteedosUI.router.go({}, "/app/" + Session.get("app_id") + "/" + object_name + "/view/" + data.data.objects__upsert._id);
31
+ FlowRouter.reload()
32
+ $(document.body).removeClass('loading');
33
+ },
34
+ error: function (XMLHttpRequest, textStatus, errorThrown) {
35
+ SteedosUI.notification.error({
36
+ message: '操作失败',
37
+ description: t(XMLHttpRequest.responseJSON.error),
38
+ });
39
+ $(document.body).removeClass('loading');
40
+ }
41
+ };
42
+ Steedos.authRequest(url, options);
43
+ },
44
+ customVisible: function (object_name, record_id, permission, data) {
45
+ var record = data && data.record;
46
+ return record && record.is_system && !record.created;
47
+ }
48
+ }
@@ -0,0 +1,6 @@
1
+ name: custom
2
+ is_enable: true
3
+ label: 自定义
4
+ 'on': record_only
5
+ visible: true
6
+ sort: 200
@@ -216,6 +216,16 @@ function loadObject(doc, oldDoc) {
216
216
 
217
217
  originalObject.isMain = true;
218
218
 
219
+ const objConfig = register.getOriginalObjectConfig(doc.name);
220
+
221
+ if(objConfig){
222
+ _.each(objConfig.fields, (config, name)=>{
223
+ if(!config._id && !doc.fields[name]){
224
+ doc.fields[name] = config;
225
+ }
226
+ })
227
+ }
228
+
219
229
  register.addObjectConfig(doc, datasourceName);
220
230
  register.loadObjectLazyListViews(doc.name);
221
231
  register.loadObjectLazyActions(doc.name);
@@ -1,8 +1,8 @@
1
1
  /*
2
2
  * @Author: yinlianghui@steedos.com
3
3
  * @Date: 2022-04-13 10:31:03
4
- * @LastEditors: yinlianghui@steedos.com
5
- * @LastEditTime: 2022-05-24 14:03:39
4
+ * @LastEditors: liaodaxue
5
+ * @LastEditTime: 2023-11-17 15:48:30
6
6
  * @Description:
7
7
  */
8
8
  var objectql = require('@steedos/objectql');
@@ -11,6 +11,7 @@ async function insertParentAndChildrenFieldForTreeObject(doc, needToCheckExists)
11
11
  const baseProps = {
12
12
  object: doc.name,
13
13
  reference_to: doc.name,
14
+ deleted_lookup_record_behavior: "clear",
14
15
  type: 'lookup',
15
16
  owner: doc.owner,
16
17
  space: doc.space,
@@ -60,7 +60,7 @@
60
60
  "actions": [
61
61
  {
62
62
  "actionType": "custom",
63
- "script": "//整理分组数据\nlet setting_groups = event.data.setting_groups;\nif (!_.find(setting_groups, { is_default: true })) {\n setting_groups.unshift({\n \"id\": \"未分组\",\n \"group_name\": \"未分组\",\n \"visible_on\": \"\",\n \"is_default\": true\n })\n}\nsetting_groups.forEach(function (group) {\n if (group.is_default) {\n group.group_name = \"未分组\";\n group.visible_on = \"\";\n }\n if (!group.id) {\n group.id = group.group_name;\n }\n})\n\n//整理字段与分组关系的数据\nconst fieldForGroup = {};\nlet oldGroup = _.cloneDeep(event.data.fieldForGroup);\nsetting_groups.forEach(function (group) {\n if (_.has(oldGroup, group.id)) {\n fieldForGroup[group.id] = oldGroup[group.id];\n oldGroup = _.omit(oldGroup, group.id);\n } else {\n fieldForGroup[group.id] = [];\n }\n})\nif (oldGroup && !_.isEmpty(oldGroup)) {\n _.forEach(oldGroup, function (value, key) {\n fieldForGroup[\"未分组\"] = _.unionBy(fieldForGroup[\"未分组\"], value);\n });\n}\nconsole.log(\"setting_groups,fieldForGroup===>\", setting_groups, fieldForGroup);\n\ndoAction({\n actionType: 'setValue',\n componentId: 'service_field_design',\n args: {\n value: {\n groups: setting_groups,\n fieldForGroup\n }\n }\n});"
63
+ "script": "//整理分组数据\nlet setting_groups = _.cloneDeep(event.data.setting_groups);\nif (!_.find(setting_groups, { is_default: true })) {\n setting_groups.unshift({\n \"id\": \"未分组\",\n \"group_name\": \"未分组\",\n \"visible_on\": \"\",\n \"is_default\": true\n })\n}\nif (!_.find(setting_groups, { is_hidden: true })) {\n setting_groups.push({\n id: \"隐藏\",\n group_name: \"隐藏\",\n visible_on: \"\",\n is_hidden: true\n });\n}\nsetting_groups.forEach(function (group) {\n if (group.is_hidden) {\n group.group_name = \"隐藏\";\n group.visible_on = \"\";\n }\n if (group.is_default) {\n group.group_name = \"未分组\";\n group.visible_on = \"\";\n }\n if (!group.id) {\n group.id = group.group_name;\n }\n})\n\n//整理字段与分组关系的数据\nlet fieldForGroup = {};\nlet oldGroup = _.cloneDeep(event.data.fieldForGroup);\nsetting_groups.forEach(function (group) {\n if (_.has(oldGroup, group.id)) {\n fieldForGroup[group.id] = oldGroup[group.id];\n oldGroup = _.omit(oldGroup, group.id);\n } else {\n fieldForGroup[group.id] = [];\n }\n})\nif (oldGroup && !_.isEmpty(oldGroup)) {\n _.forEach(oldGroup, function (value, key) {\n fieldForGroup[\"未分组\"] = _.unionBy(fieldForGroup[\"未分组\"], value);\n });\n}\n\n//未分组 放在所有分组开头,隐藏 放在所有分组最后\nconst defaultGroup = fieldForGroup[\"未分组\"];\nconst hiddenGroup = fieldForGroup[\"隐藏\"];\ndelete fieldForGroup[\"未分组\"];\ndelete fieldForGroup[\"隐藏\"];\nfieldForGroup = _.merge({ \"未分组\": defaultGroup }, fieldForGroup, { \"隐藏\": hiddenGroup });\n\n//根据fieldForGroup调整groups顺序,设置分组与保存时需要groups按照顺序\nconst keys = _.keys(fieldForGroup);\nsetting_groups = _.sortBy(setting_groups, function (group) { return _.findIndex(keys, function (key) { return key == group.group_name }) });\n\ndoAction({\n actionType: 'setValue',\n componentId: 'service_field_design',\n args: {\n value: {\n groups: setting_groups\n }\n }\n});\n\ndoAction({\n actionType: 'setValue',\n componentId: \"form_field_design\",\n args: {\n value: { design_field: fieldForGroup }\n }\n});"
64
64
  }
65
65
  ]
66
66
  }
@@ -136,7 +136,7 @@
136
136
  "label": "保存",
137
137
  "actionType": "submit",
138
138
  "id": "u:d9039421ea6b",
139
- "target": "form_design_form",
139
+ "target": "form_field_design",
140
140
  "level": "primary"
141
141
  }
142
142
  ]
@@ -210,7 +210,8 @@
210
210
  }
211
211
  ],
212
212
  "bodyClassName": "h-7 flex justify-between items-center p-0 pl-10 my-2",
213
- "toolbar": [ ],
213
+ "toolbar": [
214
+ ],
214
215
  "className": "mb-0 border-0 bg-none card",
215
216
  "id": "u:296298da1bef"
216
217
  },
@@ -237,7 +238,7 @@
237
238
  "headers": {
238
239
  "Authorization": "Bearer ${context.tenantId},${context.authToken}"
239
240
  },
240
- "requestAdaptor": "var graphqlOrder = \"\";\n//根据groups,修改对象的字段分组field_groups\nvar field_groups = _.cloneDeep(api.data.groups);\n_.remove(field_groups, { is_default: true });\nfield_groups = field_groups.map(function (group) {\n return _.omit(group, 'id');\n})\nconst groupOrder = 'upsert0:objects__upsert(id:\"' + api.data.$self.designObjectId + '\" , doc:' + JSON.stringify(JSON.stringify({ field_groups })) + ') {_id}';\ngraphqlOrder += groupOrder;\n\n//根据design_field,修改对象字段的sort_no与groups\nvar index = 1;\n_.forEach(api.data.design_field, function (items, key) {\n _.forEach(items, function (item) {\n const field = _.find(api.data.fields, { 'id': item });\n const itemOrder = 'upsert' + index + ':object_fields__upsert(id:\"' + item + '\" , doc:' + JSON.stringify(JSON.stringify({ object: api.data.$self.designObjectName, _name: field._name, label: field.label, sort_no: index * 10, group: key == \"未分组\" ? null : key })) + '){_id}\\n';\n graphqlOrder += itemOrder;\n index++;\n })\n})\n\ngraphqlOrder = 'mutation {' + graphqlOrder + '}';\nreturn {\n ...api,\n data: {\n query: graphqlOrder\n }\n}",
241
+ "requestAdaptor": "var graphqlOrder = \"\";\n\n//先修改字段,使系统对象自行自定义\n//根据design_field,修改对象字段的sort_no与groups\nvar index = 1;\n_.forEach(api.data.design_field, function (items, key) {\n let group = key;\n if (key == \"未分组\" || key == \"隐藏\") {\n group = null;\n }\n _.forEach(items, function (item) {\n const field = _.find(api.data.fields, { 'id': item });\n let itemOrder = 'upsert' + index + ':object_fields__upsert(id:\"' + item + '\" , doc:' + JSON.stringify(JSON.stringify({ sort_no: index * 10, group, hidden: key == \"隐藏\" ? true : false })) + '){_id}\\n';\n if (field.id == field._id && field.is_system) {\n itemOrder = 'upsert' + index + ':object_fields__upsert(id:\"' + item + '\" , doc:' + JSON.stringify(JSON.stringify({ object: api.data.$self.designObjectName,type:field.type, _name: field._name, label: field.label, sort_no: index * 10, group, hidden: key == \"隐藏\" ? true : false, is_system: field.is_system })) + '){_id}\\n';\n }\n graphqlOrder += itemOrder;\n index++;\n })\n})\n\n//根据groups,修改对象的字段分组field_groups\nvar field_groups = _.cloneDeep(api.data.groups);\n_.remove(field_groups, { is_default: true });\n_.remove(field_groups, { is_hidden: true });\nfield_groups = field_groups.map(function (group) {\n return _.omit(group, 'id');\n})\nconst keys = _.keys(api.data.design_field);\nfield_groups = _.sortBy(field_groups, function (group) { return _.findIndex(keys, function (key) { return key == group.group_name }) });\nconst groupOrder = 'upsert0:objects__upsert(id:\"' + api.data.$self.designObjectId + '\" , doc:' + JSON.stringify(JSON.stringify({ field_groups, name: api.data.$self.designObjectName })) + ') {_id}';\ngraphqlOrder += groupOrder;\n\n\ngraphqlOrder = 'mutation {' + graphqlOrder + '}';\nreturn {\n ...api,\n data: {\n query: graphqlOrder\n }\n}",
241
242
  "adaptor": "if (payload.errors) {\n payload.status = 2;\n payload.msg = window.t ? window.t(payload.errors[\n 0\n ].message) : payload.errors[\n 0\n ].message;\n}\nreturn payload;",
242
243
  "messages": {
243
244
  },
@@ -250,7 +251,18 @@
250
251
  },
251
252
  "visibleOn": "${dataInitialed}",
252
253
  "wrapWithPanel": false,
253
- "name": "form_design_form"
254
+ "name": "form_field_design",
255
+ "onEvent": {
256
+ "submitSucc": {
257
+ "weight": 0,
258
+ "actions": [
259
+ {
260
+ "actionType": "custom",
261
+ "script": "setTimeout(() => {\n doAction({\n \"actionType\": \"broadcast\",\n \"args\": {\n \"eventName\": \"@data.changed.object_fields\"\n }\n });\n}, 500);\n\n\n"
262
+ }
263
+ ]
264
+ }
265
+ }
254
266
  }
255
267
  ],
256
268
  "className": "Panel--default max-w-4xl m-auto",
@@ -261,7 +273,7 @@
261
273
  "method": "post",
262
274
  "url": "${context.rootUrl}/graphql?designObjectId=${designObjectId}",
263
275
  "data": {
264
- "query": "{fields:object_fields(filters: [[\"object\",\"=\",\"${designObjectName}\"]],sort: \"sort_no asc\"){_id,label,_name,group,type,sort_no,modified,is_wide,is_system,recordPermissions: _permissions{allowEdit}}}",
276
+ "query": "{fields:object_fields(filters: [[\"object\",\"=\",\"${designObjectName}\"]],sort: \"sort_no asc\"){_id,label,_name,group,type,sort_no,modified,is_wide,is_system,hidden,recordPermissions: _permissions{allowEdit}}}",
265
277
  "field_groups": "${field_groups}",
266
278
  "dataInitialed": "${dataInitialed}",
267
279
  "designObjectName": "${designObjectName}",
@@ -271,10 +283,9 @@
271
283
  "headers": {
272
284
  "Authorization": "Bearer ${context.tenantId},${context.authToken}"
273
285
  },
274
- "messages": {
275
- },
286
+ "messages": {},
276
287
  "requestAdaptor": "",
277
- "adaptor": "//筛选出可编辑的字段\r\n\r\nvar oldFields = _.filter(payload.data.fields, function (obj) { return obj.recordPermissions.allowEdit; });\r\n//将group为空的字段分为未分组的组中\r\noldFields = _.map(oldFields, function (obj) {\r\n obj.originId = obj._id;\r\n if (obj.group === null) {\r\n obj.group = \"未分组\";\r\n }\r\n if (obj.is_system) {\r\n obj._id = api.data.designObjectName + \".\" + obj._name;\r\n }\r\n return obj;\r\n});\r\n\r\n//整合出字段的属性集合\r\nconst fields = oldFields.map((field) => {\r\n return {\r\n \"id\": field._id,\r\n \"_name\": field._name,\r\n \"label\": field.label,\r\n \"_id\": field.originId,\r\n \"columnSpan\": field.is_wide ? 2 : 1\r\n }\r\n})\r\n\r\n//从字段的group属性中,整合出字段分组的属性集合\r\nlet field_groups = _.map(_.uniqBy(oldFields, \"group\"), function (obj) {\r\n return {\r\n \"id\": obj.group,\r\n \"group_name\": obj.group,\r\n \"visible_on\": \"\"\r\n };\r\n});\r\n\r\n//合并对象上的field_groups与字段上的group\r\nconst groups = _.unionBy(api.data.field_groups, field_groups, 'id');\r\n\r\n//判断是否第一次调用接口,不是的话(说明是触发了datachange事件),返回fields与fieldUpdateData\r\nif (api.data.dataInitialed) {\r\n const eventData = api.data.eventData;\r\n let fieldUpdateData = \"\";\r\n const fieldForGroup = api.data.fieldForGroup;\r\n let fieldForGroupLength = 0;\r\n _.forIn(fieldForGroup, function (value, key) {\r\n fieldForGroupLength += value.length;\r\n });\r\n if (fieldForGroupLength < fields.length) {\r\n fieldUpdateData = {\r\n type: \"insert\",\r\n id: eventData.result.data.recordId\r\n }\r\n } else if (fieldForGroupLength > fields.length) {\r\n fieldUpdateData = {\r\n type: \"delete\",\r\n id: eventData._id\r\n }\r\n }\r\n return payload = {\r\n data: {\r\n fields,\r\n fieldUpdateData\r\n }\r\n }\r\n}\r\n\r\n//整合字段与分组的关系\r\nconst oldFieldsInGroups = _.groupBy(oldFields, \"group\");\r\nconst fieldForGroup = _.mapValues(_.groupBy(groups, \"id\"), function (group,key) {\r\n if (oldFieldsInGroups[key]) {\r\n return _.map(oldFieldsInGroups[key], function (obj) {\r\n return obj._id;\r\n });\r\n } else {\r\n return [];\r\n }\r\n});\r\n\r\nreturn payload = {\r\n data: {\r\n fields,\r\n groups,\r\n fieldForGroup,\r\n dataInitialed: true\r\n }\r\n};",
288
+ "adaptor": "//筛选出可编辑的字段\r\nvar oldFields = _.filter(payload.data.fields, function (obj) { return obj.recordPermissions.allowEdit; });\r\n//将group为空的字段分为未分组的组中,将系统字段的_id改为对象名.字段名\r\noldFields = _.map(oldFields, function (obj) {\r\n obj.originId = obj._id;\r\n if (obj.hidden) {\r\n obj.group = \"隐藏\";\r\n }else if (obj.group === null) {\r\n obj.group = \"未分组\";\r\n }\r\n if (obj.is_system) {\r\n obj._id = api.data.designObjectName + \".\" + obj._name;\r\n }\r\n return obj;\r\n});\r\n\r\n//整合出字段的属性集合\r\nconst fields = oldFields.map((field) => {\r\n return {\r\n \"id\": field._id,//用与steedos-board组件的关系分辨\r\n \"_name\": field._name,\r\n \"label\": field.label,\r\n \"_id\": field.originId,//用于打开steedos-objectform\r\n \"columnSpan\": field.is_wide ? 2 : 1,\r\n \"is_system\": field.is_system,\r\n \"type\": field.type\r\n }\r\n})\r\n\r\n//从字段的group属性中,整合出字段分组的属性集合\r\nlet field_groups = _.map(_.uniqBy(oldFields, \"group\"), function (obj) {\r\n return {\r\n \"id\": obj.group,\r\n \"group_name\": obj.group,\r\n \"visible_on\": \"\"\r\n };\r\n});\r\n\r\n//合并对象上的field_groups与字段上的group\r\nlet groups = _.unionBy(api.data.field_groups, field_groups, 'id');\r\n\r\n//判断是否第一次调用接口,不是的话(说明是触发了datachange事件),返回fields与fieldUpdateData\r\nif (api.data.dataInitialed) {\r\n const eventData = api.data.eventData;\r\n let fieldUpdateData = \"\";\r\n const fieldForGroup = api.data.fieldForGroup;\r\n let fieldForGroupLength = 0;\r\n _.forIn(fieldForGroup, function (value, key) {\r\n fieldForGroupLength += value.length;\r\n });\r\n if (fieldForGroupLength < fields.length) {\r\n fieldUpdateData = {\r\n type: \"insert\",\r\n id: eventData.result.data.recordId\r\n }\r\n } else if (fieldForGroupLength > fields.length) {\r\n fieldUpdateData = {\r\n type: \"delete\",\r\n id: eventData._id\r\n }\r\n }\r\n return payload = {\r\n data: {\r\n fields,\r\n fieldUpdateData\r\n }\r\n }\r\n}\r\n\r\n//整合字段与分组的关系\r\nconst oldFieldsInGroups = _.groupBy(oldFields, \"group\");\r\nlet fieldForGroup = _.mapValues(_.groupBy(groups, \"id\"), function (group,key) {\r\n if (oldFieldsInGroups[key]) {\r\n return _.map(oldFieldsInGroups[key], function (obj) {\r\n return obj._id;\r\n });\r\n } else {\r\n return [];\r\n }\r\n});\r\n\r\n//未分组 放在所有分组开头,隐藏 放在所有分组最后\r\nconst defaultGroup = fieldForGroup[\"未分组\"];\r\nconst hiddenGroup = fieldForGroup[\"隐藏\"];\r\ndelete fieldForGroup[\"未分组\"];\r\ndelete fieldForGroup[\"隐藏\"];\r\nfieldForGroup = _.merge({ \"未分组\": defaultGroup }, fieldForGroup, { \"隐藏\": hiddenGroup });\r\n\r\n//根据fieldForGroup调整groups顺序,设置分组与保存时需要groups按照顺序\r\nconst keys = _.keys(fieldForGroup);\r\ngroups = _.sortBy(groups, function (group) { return _.findIndex(keys, function (key) { return key == group.group_name }) });\r\n\r\nreturn payload = {\r\n data: {\r\n fields,\r\n groups,\r\n fieldForGroup,\r\n dataInitialed: true\r\n }\r\n};",
278
289
  "sendOn": "!!this.designObjectId"
279
290
  },
280
291
  "messages": {
@@ -284,7 +295,7 @@
284
295
  "actions": [
285
296
  {
286
297
  "actionType": "custom",
287
- "script": "const fieldForGroup = context.props.data.fieldForGroup;\nconst fieldUpdateData = event.data.fieldUpdateData;\nif (fieldUpdateData && fieldUpdateData.type == \"delete\") {\n _.forIn(fieldForGroup, function (group, group_name) {\n _.remove(group, function (field) {\n return field === fieldUpdateData.id;\n })\n });\n} else if (fieldUpdateData && fieldUpdateData.type == \"insert\") {\n fieldForGroup[\"未分组\"].push(fieldUpdateData.id);\n}\n// doAction({\n// actionType: 'setValue',\n// componentId: \"service_field_design\",\n// args: {\n// value: { fieldForGroup }\n// }\n// });\n\ndoAction({\n actionType: 'setValue',\n componentId: \"form_field_design\",\n args: {\n value: { design_field:fieldForGroup }\n }\n});\n\n",
298
+ "script": "debugger;\nconst fieldForGroup = context.props.data.fieldForGroup;\nconst fieldUpdateData = event.data.fieldUpdateData;\nif (fieldUpdateData && fieldUpdateData.type == \"delete\") {\n _.forIn(fieldForGroup, function (group, group_name) {\n _.remove(group, function (field) {\n return field === fieldUpdateData.id;\n })\n });\n} else if (fieldUpdateData && fieldUpdateData.type == \"insert\") {\n fieldForGroup[\"未分组\"].push(fieldUpdateData.id);\n}\n// doAction({\n// actionType: 'setValue',\n// componentId: \"service_field_design\",\n// args: {\n// value: { fieldForGroup }\n// }\n// });\n\ndoAction({\n actionType: 'setValue',\n componentId: \"form_field_design\",\n args: {\n value: { design_field:fieldForGroup }\n }\n});\n\n",
288
299
  "expression": "${event.data.fieldUpdateData}"
289
300
  }
290
301
  ]
@@ -309,7 +320,7 @@
309
320
  "messages": {
310
321
  },
311
322
  "requestAdaptor": "",
312
- "adaptor": "const field_groups = payload.data.objects[0] && _.map(payload.data.objects[0].field_groups, function (obj) {\r\n return {\r\n \"id\": obj.group_name,\r\n \"group_name\": obj.group_name,\r\n \"visible_on\": obj.visible_on\r\n }\r\n});\r\nfield_groups.unshift({\r\n id: \"未分组\",\r\n group_name: \"未分组\",\r\n visible_on: \"\",\r\n is_default: true\r\n});\r\nconst designObjectId = payload.data.objects[0] && payload.data.objects[0]._id;\r\nreturn payload = {\r\n data: {\r\n field_groups,\r\n designObjectId,\r\n designObjectLabel: payload.data.objects[0] && payload.data.objects[0].label,\r\n _master: {\r\n recordId: designObjectId\r\n }\r\n }\r\n}"
323
+ "adaptor": "const field_groups = payload.data.objects[0] && _.map(payload.data.objects[0].field_groups, function (obj) {\r\n return {\r\n \"id\": obj.group_name,\r\n \"group_name\": obj.group_name,\r\n \"visible_on\": obj.visible_on\r\n }\r\n});\r\nfield_groups.unshift({\r\n id: \"隐藏\",\r\n group_name: \"隐藏\",\r\n visible_on: \"\",\r\n is_hidden: true\r\n});\r\nfield_groups.unshift({\r\n id: \"未分组\",\r\n group_name: \"未分组\",\r\n visible_on: \"\",\r\n is_default: true\r\n});\r\n\r\n\r\n\r\nconst designObjectId = payload.data.objects[0] && payload.data.objects[0]._id;\r\nreturn payload = {\r\n data: {\r\n field_groups,\r\n designObjectId,\r\n designObjectLabel: payload.data.objects[0] && payload.data.objects[0].label,\r\n _master: {\r\n recordId: designObjectId\r\n }\r\n }\r\n}"
313
324
  },
314
325
  "messages": {
315
326
  },
@@ -348,5 +359,9 @@
348
359
  "margin": "0.625rem 0.625rem"
349
360
  }
350
361
  },
351
- "className": "steedos-design-field"
362
+ "className": "steedos-design-field",
363
+ "asideResizor": false,
364
+ "pullRefresh": {
365
+ "disabled": true
366
+ }
352
367
  }
@@ -125,18 +125,18 @@
125
125
  ]
126
126
  },
127
127
  {
128
- "title": "${'objects_amis_process_mapping' | t}",
128
+ "title": "${'objects_amis_object_workflows' | t}",
129
+ "hiddenOn": "${_master.record.enable_workflow != true}",
129
130
  "body": [
130
131
  {
131
132
  "type": "steedos-object-related-listview",
132
133
  "objectApiName": "objects",
133
134
  "recordId": "${recordId}",
134
135
  "relatedObjectApiName": "object_workflows",
135
- "perPage": 20,
136
- "id": "u:e14df76cfa51"
136
+ "relatedKey": "object_name",
137
+ "perPage": 20
137
138
  }
138
- ],
139
- "id": "u:cbc13e1a7033"
139
+ ]
140
140
  },
141
141
  {
142
142
  "title": "${'objects_amis_validation_rule' | t}",
@@ -175,20 +175,6 @@
175
175
  "perPage": 20
176
176
  }
177
177
  ]
178
- },
179
- {
180
- "title": "${'objects_amis_object_workflows' | t}",
181
- "hiddenOn": "${_master.record.enable_workflow != true}",
182
- "body": [
183
- {
184
- "type": "steedos-object-related-listview",
185
- "objectApiName": "objects",
186
- "recordId": "${recordId}",
187
- "relatedObjectApiName": "object_workflows",
188
- "relatedKey": "object_name",
189
- "perPage": 20
190
- }
191
- ]
192
178
  }
193
179
  ],
194
180
  "id": "u:6a3b45d7adcf",
@@ -3,7 +3,7 @@
3
3
  "body": [
4
4
  {
5
5
  "type": "steedos-object-form",
6
- "label": "对象表单",
6
+ "label": "对象字段表单",
7
7
  "objectApiName": "object_fields",
8
8
  "recordId": "${recordId}",
9
9
  "className": "",
@@ -1,6 +1,6 @@
1
1
  name: object_form
2
2
  is_active: true
3
- label: 对象字段表单
3
+ label: 对象表单
4
4
  object_name: objects
5
5
  pageAssignments:
6
6
  - type: orgDefault
@@ -226,7 +226,11 @@ module.exports = {
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);
@@ -255,6 +259,9 @@ module.exports = {
255
259
  if(query.fields && _.isArray(query.fields) && !_.include(query.fields, 'name')){
256
260
  query.fields.push('name')
257
261
  }
262
+ if(query.fields && _.isArray(query.fields) && !_.include(query.fields, 'type')){
263
+ query.fields.push('type')
264
+ }
258
265
  },
259
266
  beforeAggregate: async function(){
260
267
  const { query } = this;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@steedos/standard-object-database",
3
- "version": "2.5.20-beta.2",
3
+ "version": "2.5.20-beta.20",
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": "b9fc3773ae163df5d0062113bf6b21635c898b13"
18
+ "gitHead": "3e2075bd76af1a521e6dc1bf12c9fabb67e52f7a"
19
19
  }