@steedos/service-plugin-amis 2.2.36 → 2.2.37

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.
@@ -7,7 +7,164 @@
7
7
  const objectql = require("@steedos/objectql");
8
8
  const steedosI18n = require("@steedos/i18n");
9
9
  const _ = require("underscore");
10
- const clone = require("clone");
10
+
11
+ const DATE_DATETIME_OPERATORS = [
12
+ 'equal',
13
+ 'not_equal',
14
+ 'less',
15
+ 'less_or_equal',
16
+ 'greater',
17
+ 'greater_or_equal',
18
+ 'between',
19
+ {
20
+ "label": "去年",
21
+ "value": "between:last_year",
22
+ "values": []
23
+ },
24
+ {
25
+ "label": "今年",
26
+ "value": "between:this_year",
27
+ "values": []
28
+ },
29
+ {
30
+ "label": "明年",
31
+ "value": "between:next_year",
32
+ "values": []
33
+ },
34
+ {
35
+ "label": "上季度",
36
+ "value": "between:last_quarter",
37
+ "values": []
38
+ },
39
+ {
40
+ "label": "本季度",
41
+ "value": "between:this_quarter",
42
+ "values": []
43
+ },
44
+ {
45
+ "label": "下季度",
46
+ "value": "between:next_quarter",
47
+ "values": []
48
+ },
49
+ {
50
+ "label": "上月",
51
+ "value": "between:last_month",
52
+ "values": []
53
+ },
54
+ {
55
+ "label": "本月",
56
+ "value": "between:this_month",
57
+ "values": []
58
+ },
59
+ {
60
+ "label": "下月",
61
+ "value": "between:next_month",
62
+ "values": []
63
+ },
64
+ {
65
+ "label": "上周",
66
+ "value": "between:last_week",
67
+ "values": []
68
+ },
69
+ {
70
+ "label": "本周",
71
+ "value": "between:this_week",
72
+ "values": []
73
+ },
74
+ {
75
+ "label": "下周",
76
+ "value": "between:next_week",
77
+ "values": []
78
+ },
79
+ {
80
+ "label": "昨天",
81
+ "value": "between:yestday", // 一个错误的拼写, 待@steedos/filters 修正
82
+ "values": []
83
+ },
84
+ {
85
+ "label": "今天",
86
+ "value": "between:today",
87
+ "values": []
88
+ },
89
+ {
90
+ "label": "明天",
91
+ "value": "between:tomorrow",
92
+ "values": []
93
+ },
94
+ {
95
+ "label": "过去7天",
96
+ "value": "between:last_7_days",
97
+ "values": []
98
+ },
99
+ {
100
+ "label": "过去30天",
101
+ "value": "between:last_30_days",
102
+ "values": []
103
+ },
104
+ {
105
+ "label": "过去60天",
106
+ "value": "between:last_60_days",
107
+ "values": []
108
+ },
109
+ {
110
+ "label": "过去90天",
111
+ "value": "between:last_90_days",
112
+ "values": []
113
+ },
114
+ {
115
+ "label": "过去120天",
116
+ "value": "between:last_120_days",
117
+ "values": []
118
+ },
119
+ {
120
+ "label": "未来7天",
121
+ "value": "between:next_7_days",
122
+ "values": []
123
+ },
124
+ {
125
+ "label": "未来30天",
126
+ "value": "between:next_30_days",
127
+ "values": []
128
+ },
129
+ {
130
+ "label": "未来60天",
131
+ "value": "between:next_60_days",
132
+ "values": []
133
+ },
134
+ {
135
+ "label": "未来90天",
136
+ "value": "between:next_90_days",
137
+ "values": []
138
+ },
139
+ {
140
+ "label": "未来120天",
141
+ "value": "between:next_120_days",
142
+ "values": []
143
+ }
144
+ ]
145
+
146
+
147
+ const getFieldOperators = (type)=>{
148
+ switch (type) {
149
+ case 'text':
150
+ return ['equal', 'not_equal', 'like', 'not_like', 'starts_with', 'ends_with']
151
+ case 'number':
152
+ return [ 'equal', 'not_equal', 'less', 'less_or_equal', 'greater', 'greater_or_equal', 'between']
153
+ case 'date':
154
+ return DATE_DATETIME_OPERATORS
155
+ case 'datetime':
156
+ return DATE_DATETIME_OPERATORS
157
+ case 'time':
158
+ return [ 'equal', 'not_equal', 'less', 'less_or_equal', 'greater', 'greater_or_equal', 'between']
159
+ case 'lookup':
160
+ case 'master_detail':
161
+ case 'select':
162
+ return [ 'select_equals', 'select_not_equals', 'select_any_in', 'select_not_any_in' ]
163
+ default:
164
+ return ;
165
+ }
166
+
167
+ }
11
168
 
12
169
  module.exports = {
13
170
  name: "amis-metadata-listviews",
@@ -32,9 +189,20 @@ module.exports = {
32
189
  path: "/getFilterFields",
33
190
  },
34
191
  async handler(ctx) {
35
- return await this.getObjects(ctx);
192
+ const fields = await this.getFilterFields(ctx);
193
+ return { fields }
36
194
  },
37
195
  },
196
+ getSelectFieldOptions: {
197
+ rest: {
198
+ method: "GET",
199
+ path: "/getSelectFieldOptions",
200
+ },
201
+ async handler(ctx) {
202
+ const options = await this.getSelectFieldOptions(ctx);
203
+ return { status: 0, data: { options } }
204
+ },
205
+ }
38
206
  },
39
207
 
40
208
  /**
@@ -54,62 +222,103 @@ module.exports = {
54
222
  const spaceId = userSession.spaceId;
55
223
  const objectConfig = await objectql.getObjectConfig(objectName);
56
224
 
57
- steedosI18n.translationObject(lng, object.name, object);
225
+ steedosI18n.translationObject(lng, objectConfig.name, objectConfig);
58
226
 
227
+ const fieldsArr = [];
228
+ _.each(objectConfig.fields , (field, field_name)=>{
229
+ if(!_.has(field, "name")){
230
+ field.name = field_name
231
+ }
232
+ fieldsArr.push(field)
233
+ })
59
234
  const fields = [];
60
- _.each(objectConfig.fields, (field) => {
61
- switch (field.type) {
62
- case 'text':
63
- fields.push({
64
- label: field.label,
65
- type: field.type,
66
- name: field.name,
67
- });
68
- break;
69
- case 'number':
70
- fields.push({
71
- label: field.label,
72
- type: field.type,
73
- name: field.name,
74
- });
75
- break;
76
- case 'date':
77
- fields.push({
78
- label: field.label,
79
- type: field.type,
80
- name: field.name,
81
- });
82
- break;
83
- case 'datetime':
84
- fields.push({
85
- label: field.label,
86
- type: field.type,
87
- name: field.name,
88
- });
89
- break;
90
- case 'time':
91
- fields.push({
92
- label: field.label,
93
- type: field.type,
94
- name: field.name,
95
- });
96
- break;
97
- case 'select':
98
- fields.push({
99
- label: field.label,
100
- type: field.type,
101
- name: field.name,
102
- source: "/amis/api/mock2/form/getOptions?waitSeconds=1", //TODO
103
- searchable: true
104
- });
105
- break;
106
- default:
107
- break;
235
+ _.each(_.sortBy(fieldsArr, "sort_no"), function(field){
236
+ if(!field.hidden && !_.includes(["grid", "object", "[Object]", "[object]", "Object", "markdown", "html"], field.type)){
237
+ field.label = field.label || field.name
238
+ switch (field.type) {
239
+ case 'text':
240
+ fields.push({
241
+ label: field.label,
242
+ type: field.type,
243
+ name: field.name,
244
+ operators: getFieldOperators(field.type)
245
+ });
246
+ break;
247
+ case 'number':
248
+ fields.push({
249
+ label: field.label,
250
+ type: field.type,
251
+ name: field.name,
252
+ operators: getFieldOperators(field.type)
253
+ });
254
+ break;
255
+ case 'date':
256
+ fields.push({
257
+ label: field.label,
258
+ type: field.type,
259
+ name: field.name,
260
+ operators: getFieldOperators(field.type)
261
+ });
262
+ break;
263
+ case 'datetime':
264
+ fields.push({
265
+ label: field.label,
266
+ type: field.type,
267
+ name: field.name,
268
+ operators: getFieldOperators(field.type)
269
+ });
270
+ break;
271
+ case 'time':
272
+ fields.push({
273
+ label: field.label,
274
+ type: field.type,
275
+ name: field.name,
276
+ operators: getFieldOperators(field.type)
277
+ });
278
+ break;
279
+ case 'lookup':
280
+ case 'master_detail':
281
+ case 'select':
282
+ fields.push({
283
+ label: field.label,
284
+ type: 'select',
285
+ name: field.name,
286
+ source: "${context.rootUrl}" + `/service/api/amis-metadata-listviews/getSelectFieldOptions?objectName=${objectName}&fieldName=${field.name}`,
287
+ searchable: true,
288
+ operators: getFieldOperators(field.type)
289
+ });
290
+ break;
291
+ default:
292
+ break;
293
+ }
108
294
  }
109
295
  });
110
296
 
111
- return objects;
297
+ return fields;
112
298
  },
113
299
  },
300
+ getSelectFieldOptions: {
301
+ async handler(ctx) {
302
+ const userSession = ctx.meta.user;
303
+ const { objectName, fieldName } = ctx.params;
304
+ const lng = userSession.language || "zh-CN";
305
+ const objectConfig = await objectql.getObjectConfig(objectName);
306
+
307
+ steedosI18n.translationObject(lng, objectConfig.name, objectConfig);
308
+
309
+ const field = objectConfig.fields[fieldName];
310
+ if(field.type === 'select'){
311
+ return field.options;
312
+ }else if(field.reference_to){
313
+ const records = await objectql.getObject(field.reference_to).find({filters: [[]]})
314
+ return _.map(records, (record)=>{
315
+ return {
316
+ label: record[objectConfig._NAME_FIELD_KEY || 'name'],
317
+ value: record[objectConfig._idFieldName || '_id']
318
+ };
319
+ })
320
+ }
321
+ },
322
+ }
114
323
  },
115
324
  };
@@ -0,0 +1,166 @@
1
+ /*
2
+ * @Date: 2022-04-19 11:36:12
3
+ * @Description: 提供设计器需要的数据接口
4
+ */
5
+
6
+ const objectql = require("@steedos/objectql");
7
+ const steedosI18n = require("@steedos/i18n");
8
+ const _ = require("lodash");
9
+ const clone = require("clone");
10
+
11
+ const ExcludeObjectNames = [
12
+ 'cfs_instances_filerecord',
13
+ 'cfs_files_filerecord',
14
+ 'cms_files',
15
+ 'chat_messages',
16
+ 'api_keys',
17
+ 'object_webhooks_queue',
18
+ 'users',
19
+ 'cms_posts',
20
+ ];
21
+
22
+
23
+ module.exports = {
24
+ name: "amis-metadata-objects",
25
+ mixins: [],
26
+ /**
27
+ * Settings
28
+ */
29
+ settings: {
30
+
31
+ },
32
+
33
+ /**
34
+ * Dependencies
35
+ */
36
+ dependencies: [],
37
+
38
+ /**
39
+ * Actions
40
+ */
41
+ actions: {
42
+ getObjectsOptions: {
43
+ rest: {
44
+ method: "GET",
45
+ path: "/objects/options"
46
+ },
47
+ async handler(ctx) {
48
+ const options = await this.getObjectsOptions(ctx);
49
+ return { status: 0, data: { options } }
50
+ }
51
+ },
52
+ getObjectFieldsOptions: {
53
+ rest: {
54
+ method: "GET",
55
+ path: "/objects/:objectName/fields/options"
56
+ },
57
+ async handler(ctx) {
58
+ const options = await this.getObjectFieldsOptions(ctx);
59
+ return { status: 0, data: { options } }
60
+ }
61
+ },
62
+ getObjectSortFieldsOptions: {
63
+ rest: {
64
+ method: "GET",
65
+ path: "/objects/:objectName/sortFields/options",
66
+ },
67
+ async handler(ctx) {
68
+ const fieldsOptions = await this.getObjectFieldsOptions(ctx);
69
+ const options = [
70
+ {
71
+ label: "正序",
72
+ searchable: true,
73
+ children: _.map(fieldsOptions, (opt)=>{
74
+ return {label: `${opt.label}(正序)`, value: `${opt.value}:asc`}
75
+ })
76
+ },
77
+ {
78
+ label: "倒序",
79
+ searchable: true,
80
+ children: _.map(fieldsOptions, (opt)=>{
81
+ return {label: `${opt.label}(倒序)`, value: `${opt.value}:desc`}
82
+ })
83
+ }
84
+ ];
85
+
86
+ return { status: 0, data: { options } }
87
+ },
88
+ }
89
+ },
90
+
91
+ /**
92
+ * Events
93
+ */
94
+ events: {
95
+
96
+ },
97
+
98
+ /**
99
+ * Methods
100
+ */
101
+ methods: {
102
+ getObjectsOptions: {
103
+ async handler(ctx) {
104
+ const userSession = ctx.meta.user;
105
+ const lng = userSession.language || 'zh-CN';
106
+ const spaceId = userSession.spaceId;
107
+ const allMetadataObjects = await objectql.getSteedosSchema().getAllObject();
108
+ const allObjects = _.map(clone(allMetadataObjects), 'metadata');
109
+ const query = {
110
+ filters: [ ['name', '<>', ExcludeObjectNames]], //['hidden', '!=', true] ,
111
+ projection: {
112
+ name: 1,
113
+ label: 1
114
+ }
115
+ };
116
+
117
+ const objects = objectql.getSteedosSchema().metadataDriver.find(allObjects, query, spaceId);
118
+
119
+ _.each(objects, (object)=>{
120
+ if(object && object.name){
121
+ steedosI18n.translationObject(lng, object.name, object)
122
+ }
123
+ })
124
+ return _.map(objects, (object)=>{
125
+ return {
126
+ value: object.name,
127
+ label: object.label || object.name
128
+ }
129
+ });
130
+ }
131
+ },
132
+ getObjectFieldsOptions: {
133
+ async handler(ctx) {
134
+ const userSession = ctx.meta.user;
135
+ const lng = userSession.language || 'zh-CN';
136
+ const objectName = ctx.params.objectName;
137
+ const objectConfig = await objectql.getSteedosSchema().getObject(objectName).toConfig();
138
+ steedosI18n.translationObject(lng, objectConfig.name, objectConfig);
139
+
140
+ if(objectConfig.enable_workflow){
141
+ try {
142
+ objectConfig.fields.instance_state.hidden = false;
143
+ } catch (error) {
144
+ console.log("error", error)
145
+ }
146
+ }
147
+
148
+ const fieldsArr = [];
149
+ _.each(objectConfig.fields , (field, field_name)=>{
150
+ if(!_.has(field, "name")){
151
+ field.name = field_name
152
+ }
153
+ fieldsArr.push(field)
154
+ })
155
+ return _.uniq(_.compact(_.map(_.sortBy(fieldsArr, "sort_no"), (field)=>{
156
+ if(!field.hidden && !_.includes(["grid", "object", "[Object]", "[object]", "Object", "markdown", "html"], field.type)){
157
+ return {
158
+ value: field.name,
159
+ label: field.label || field.name
160
+ }
161
+ }
162
+ })));
163
+ }
164
+ }
165
+ }
166
+ };
@@ -0,0 +1,27 @@
1
+ const _ = require('underscore');
2
+ const objectql = require('@steedos/objectql');
3
+ const steedosI18n = require("@steedos/i18n");
4
+ const clone = require('clone');
5
+ const ObjectRecord = require('./object-record');
6
+ const ObjectList = require('./object-list');
7
+ /**
8
+ *
9
+ * @param {*} mainObjectName
10
+ * @param {*} fields : TODO
11
+ * @param {*} recordId : 可以为record:doc
12
+ * @param {*} readonly
13
+ * @param {*} userSession
14
+ */
15
+ function getRecordSchema(mainObjectName, recordId, readonly, userSession) {
16
+ const object = clone(objectql.getObject(mainObjectName).toConfig());
17
+ let lng = objectql.getUserLocale(userSession);
18
+ steedosI18n.translationObject(lng, object.name, object)
19
+ return ObjectRecord.convertSObjectToAmisSchema(object, recordId, readonly);
20
+ }
21
+
22
+ function getListSchema(mainObject, fields, options, userSession){
23
+ return ObjectList.getObjectList(mainObject, fields, options)
24
+ }
25
+
26
+ exports.getListSchema = getListSchema
27
+ exports.getRecordSchema = getRecordSchema