@steedos/standard-object-database 2.5.19-beta.2 → 2.5.19-beta.4

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.
@@ -17,6 +17,8 @@ fields:
17
17
  write_requires_master_read: true
18
18
  filters: ['name', 'notcontains', ['base','core','space_users_invite','_object_reload_logs']]
19
19
  sort_no: 110
20
+ amis:
21
+ disabledOn: "true"
20
22
  label:
21
23
  type: text
22
24
  required: true
@@ -103,6 +105,7 @@ fields:
103
105
  sort_no: 150
104
106
  amis:
105
107
  disabledOn: "${is_system == true}"
108
+ searchable: true
106
109
  onEvent:
107
110
  change:
108
111
  weight: 0
@@ -19,7 +19,7 @@ module.exports = {
19
19
  record = Creator.odata.get("objects", record_id, "is_deleted");
20
20
  }
21
21
 
22
- if (record && !record.is_deleted && record.name != 'users' && !record.is_system) {
22
+ if (record && !record.is_deleted && record.name != 'users') {
23
23
  return true;
24
24
  }
25
25
  },
@@ -195,7 +195,8 @@
195
195
  "type": "steedos-object-button",
196
196
  "name": "standard_delete",
197
197
  "objectName": "object_fields",
198
- "className": "antd-Button--default"
198
+ "className": "antd-Button--default",
199
+ "visibleOn": "false"
199
200
  }
200
201
  ],
201
202
  "placement": "bottomRight",
@@ -273,7 +274,7 @@
273
274
  "messages": {
274
275
  },
275
276
  "requestAdaptor": "",
276
- "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 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._id,\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};",
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};",
277
278
  "sendOn": "!!this.designObjectId"
278
279
  },
279
280
  "messages": {
@@ -283,7 +284,7 @@
283
284
  "actions": [
284
285
  {
285
286
  "actionType": "custom",
286
- "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}\ndoAction({\n actionType: 'setValue',\n componentId: \"form_field_design\",\n args: {\n value: { design_field: fieldForGroup }\n }\n});\n\n",
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",
287
288
  "expression": "${event.data.fieldUpdateData}"
288
289
  }
289
290
  ]
@@ -10,13 +10,6 @@
10
10
  "enableTabs": true,
11
11
  "mode": "edit",
12
12
  "layout": "normal",
13
- "fieldsExtend": {
14
- "type": {
15
- "amis": {
16
- "searchable": true
17
- }
18
- }
19
- },
20
13
  "apiRequestAdaptor": "api.data.query = api.data.query.replace('object_fields__update', 'object_fields__upsert')",
21
14
  "submitSuccActions": [
22
15
  {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@steedos/standard-object-database",
3
- "version": "2.5.19-beta.2",
3
+ "version": "2.5.19-beta.4",
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": "fc946a6dd1aa34db1809edf505ddd1edce91fe1c"
18
+ "gitHead": "1dba5cd1c2522748e824b724d323f55412a3ade5"
19
19
  }
@@ -1,8 +1,8 @@
1
1
  /*
2
2
  * @Author: sunhaolin@hotoa.com
3
3
  * @Date: 1985-10-26 16:15:00
4
- * @LastEditors: baozhoutao@steedos.com
5
- * @LastEditTime: 2023-10-31 10:25:17
4
+ * @LastEditors: 孙浩林 sunhaolin@steedos.com
5
+ * @LastEditTime: 2023-11-04 16:05:25
6
6
  * @Description:
7
7
  */
8
8
  "use strict";
@@ -10,6 +10,9 @@ const project = require('./package.json');
10
10
  const packageName = project.name;
11
11
  const packageLoader = require('@steedos/service-meteor-package-loader');
12
12
  const serviceObjectMixin = require('@steedos/service-object-mixin');
13
+
14
+ const triggers = require('./src/triggers');
15
+
13
16
  /**
14
17
  * @typedef {import('moleculer').Context} Context Moleculer's Context
15
18
  */
@@ -37,6 +40,8 @@ module.exports = {
37
40
  * Actions
38
41
  */
39
42
  actions: {
43
+ ...triggers,
44
+
40
45
  objects__upsert: {
41
46
  graphql: {
42
47
  mutation:
@@ -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
+ }