@steedos/service-object-graphql 2.4.8-beta.1

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.
@@ -0,0 +1,680 @@
1
+ import _ = require("underscore");
2
+ import { translationObject } from '@steedos/i18n';
3
+ import moment = require('moment');
4
+ import { getSteedosSchema, SteedosObjectTypeConfig, getUserLocale, absoluteUrl } from "@steedos/objectql";
5
+ import { EXPAND_SUFFIX, DISPLAY_PREFIX, RELATED_PREFIX, GRAPHQL_ACTION_PREFIX, UI_PREFIX, PERMISSIONS_PREFIX } from "./consts";
6
+ import { getQueryFields } from "./getQueryFields";
7
+ import {
8
+ callObjectServiceAction,
9
+ _getRelatedType,
10
+ formatBasicFieldValue,
11
+ formatFileSize,
12
+ numberToString,
13
+ getFileStorageName
14
+ } from "./utils"
15
+
16
+ export function getGraphqlActions(
17
+ // objectConfig: SteedosObjectTypeConfig
18
+ ) {
19
+ let actions = {};
20
+ // let objName = objectConfig.name;
21
+
22
+ actions[`${GRAPHQL_ACTION_PREFIX}${EXPAND_SUFFIX}_multiple`] = {
23
+ handler: async function (ctx) {
24
+ let { ids, objectName, referenceToField } = ctx.params;
25
+ if (_.isEmpty(ids)) {
26
+ return null;
27
+ }
28
+ let filters = [[referenceToField || "_id", "in", ids]];
29
+ const selector: any = { filters: filters };
30
+ let steedosSchema = getSteedosSchema();
31
+ let obj = steedosSchema.getObject(objectName);
32
+
33
+ const { resolveInfo } = ctx.meta;
34
+ const fieldNames = getQueryFields(resolveInfo);
35
+ if (!_.isEmpty(fieldNames)) {
36
+ selector.fields = fieldNames;
37
+ }
38
+
39
+ return obj.find(selector);
40
+ },
41
+ };
42
+ actions[`${GRAPHQL_ACTION_PREFIX}${EXPAND_SUFFIX}`] = {
43
+ handler: async function (ctx) {
44
+ let { id, objectName, referenceToField } = ctx.params;
45
+ if (!id) {
46
+ return;
47
+ }
48
+ let steedosSchema = getSteedosSchema();
49
+ let obj = steedosSchema.getObject(objectName);
50
+
51
+ const selector: any = { filters: [[referenceToField || "_id", "=", id]] };
52
+ const { resolveInfo } = ctx.meta;
53
+ const fieldNames = getQueryFields(resolveInfo);
54
+ if (!_.isEmpty(fieldNames)) {
55
+ selector.fields = fieldNames;
56
+ }
57
+
58
+ return (await obj.find(selector))[0];
59
+ },
60
+ };
61
+
62
+ // if (
63
+ // [
64
+ // "cms_files",
65
+ // "tasks",
66
+ // "notes",
67
+ // "events",
68
+ // "audit_records",
69
+ // "instances",
70
+ // "approvals",
71
+ // ].includes(objName)
72
+ // ) {
73
+ actions[`${GRAPHQL_ACTION_PREFIX}${RELATED_PREFIX}_enabled`] = {
74
+ handler: async function (ctx) {
75
+ let params = ctx.params;
76
+ let { _parentId, _related_params } = params;
77
+ let { objectName, parentObjectName, foreignKey } = _related_params;
78
+ let userSession = ctx.meta.user;
79
+ let steedosSchema = getSteedosSchema();
80
+ let object = steedosSchema.getObject(objectName);
81
+ let filters = [];
82
+ filters = [
83
+ [`${foreignKey}.o`, "=", parentObjectName],
84
+ [`${foreignKey}.ids`, "=", _parentId],
85
+ ];
86
+ if (params.filters) {
87
+ filters.push(params.filters);
88
+ }
89
+ params.filters = filters;
90
+ return await object.find(params, userSession);
91
+ },
92
+ };
93
+ // }
94
+
95
+ actions[`${GRAPHQL_ACTION_PREFIX}${RELATED_PREFIX}`] = {
96
+ handler: async function (ctx) {
97
+ let params = ctx.params;
98
+ let { _parentId, _related_params } = params;
99
+ let {
100
+ objectName,
101
+ parentObjectName,
102
+ fieldName,
103
+ referenceToParentFieldName,
104
+ } = _related_params;
105
+ let userSession = ctx.meta.user;
106
+ let steedosSchema = getSteedosSchema();
107
+ let object = steedosSchema.getObject(objectName);
108
+ let parentObj = steedosSchema.getObject(parentObjectName);
109
+ let parent = await parentObj.findOne(_parentId);
110
+ let filters = [];
111
+ let _idValue = parent._id;
112
+ if (referenceToParentFieldName) {
113
+ _idValue = parent[referenceToParentFieldName];
114
+ }
115
+ filters = [[fieldName, "=", _idValue]];
116
+ if (params.filters) {
117
+ filters.push(params.filters);
118
+ }
119
+ params.filters = filters;
120
+
121
+ const { resolveInfo } = ctx.meta;
122
+ const fieldNames = getQueryFields(resolveInfo);
123
+ if (!_.isEmpty(fieldNames)) {
124
+ params.fields = fieldNames;
125
+ }
126
+ return await object.find(params, userSession);
127
+ },
128
+ };
129
+
130
+ actions[`${GRAPHQL_ACTION_PREFIX}${DISPLAY_PREFIX}`] = {
131
+ handler: async function (ctx) {
132
+ let params = ctx.params;
133
+ let { __objectName } = params;
134
+ let userSession = ctx.meta.user;
135
+ let selectFieldNames = [];
136
+ const { resolveInfo } = ctx.meta;
137
+ const fieldNames = getQueryFields(resolveInfo);
138
+ if (!_.isEmpty(fieldNames)) {
139
+ selectFieldNames = fieldNames;
140
+ }
141
+ let result = await translateToDisplay(__objectName, params, userSession, selectFieldNames);
142
+ return result;
143
+ },
144
+ };
145
+
146
+ actions[`${GRAPHQL_ACTION_PREFIX}${UI_PREFIX}`] = {
147
+ handler: async function (ctx) {
148
+ let params = ctx.params;
149
+ let { __objectName } = params;
150
+ let userSession = ctx.meta.user;
151
+ let selectFieldNames = [];
152
+ const { resolveInfo } = ctx.meta;
153
+ const fieldNames = getQueryFields(resolveInfo);
154
+ if (!_.isEmpty(fieldNames)) {
155
+ selectFieldNames = fieldNames;
156
+ }
157
+ let result = await translateToUI(__objectName, params, userSession, selectFieldNames);
158
+
159
+ return result;
160
+ },
161
+ };
162
+
163
+ actions[`${GRAPHQL_ACTION_PREFIX}${PERMISSIONS_PREFIX}`] = {
164
+ handler: async function (ctx) {
165
+ let params = ctx.params;
166
+ let { __objectName } = params;
167
+ let userSession = ctx.meta.user;
168
+ return await callObjectServiceAction(`objectql.getRecordPermissionsById`, userSession, {
169
+ objectName: __objectName,
170
+ recordId: params._id
171
+ });;
172
+ },
173
+ };
174
+
175
+ return actions;
176
+ }
177
+
178
+ async function translateToDisplay(objectName, doc, userSession: any, selectorFieldNames) {
179
+ const lng = getUserLocale(userSession);
180
+ let steedosSchema = getSteedosSchema();
181
+ let object = steedosSchema.getObject(objectName);
182
+ let objConfig = await object.toConfig();
183
+ let fields = objConfig.fields;
184
+ // let _object = clone(objConfig);
185
+ translationObject(lng, objConfig.name, objConfig, true);
186
+
187
+ let utcOffset = userSession.utcOffset || 8;
188
+ async function _translateToDisplay(doc, selectorFieldNames) {
189
+ let displayObj = {};
190
+ for (const name of selectorFieldNames) {
191
+ if (Object.prototype.hasOwnProperty.call(fields, name)) {
192
+ const field = fields[name];
193
+ if (_.has(doc, name)) {
194
+ const fType = field.type;
195
+ if (fType == "text") {
196
+ displayObj[name] = doc[name] || "";
197
+ } else if (fType == "textarea") {
198
+ displayObj[name] = doc[name] || "";
199
+ } else if (fType == "html_text") {
200
+ displayObj[name] = doc[name] || "";
201
+ } else if (fType == "html") {
202
+ displayObj[name] = doc[name] || "";
203
+ } else if (fType == "select") {
204
+ let label = "";
205
+ let map = {};
206
+ let value = doc[name];
207
+ let translatedField = getTranslatedFieldConfig(objConfig, name);
208
+ let translatedFieldOptions =
209
+ translatedField && translatedField.options;
210
+ _.forEach(translatedFieldOptions, function (o) {
211
+ map[o.value] = o.label;
212
+ });
213
+ if (field.multiple) {
214
+ let labels = [];
215
+ _.forEach(value, function (v) {
216
+ labels.push(map[v]);
217
+ });
218
+ label = labels.join(",");
219
+ } else {
220
+ label = map[value];
221
+ }
222
+ displayObj[name] = label;
223
+ } else if (fType == "boolean") {
224
+ if (doc[name]) {
225
+ displayObj[name] = "√";
226
+ } else {
227
+ displayObj[name] = "";
228
+ }
229
+ } else if (fType == "date") {
230
+ // 注意日期类型存的是utc0点,不需要执行utcOffset
231
+ displayObj[name] = doc[name] ? moment.utc(doc[name])
232
+ .format("YYYY-MM-DD") : '';
233
+ } else if (fType == "datetime") {
234
+ displayObj[name] = doc[name] ? moment(doc[name])
235
+ .utcOffset(utcOffset)
236
+ .format("YYYY-MM-DD HH:mm") : '';
237
+ } else if (fType == "time") {
238
+ // 注意时间类型走的是utc时间,不需要执行utcOffset
239
+ displayObj[name] = doc[name] ? moment.utc(doc[name])
240
+ .format("HH:mm") : '';
241
+ } else if (fType == "number") {
242
+ displayObj[name] = doc[name] ? numberToString(doc[name], field.scale) : "";
243
+ } else if (fType == "currency") {
244
+ displayObj[name] = doc[name] ? numberToString(doc[name], field.scale) : "";
245
+ } else if (fType == "percent") {
246
+ displayObj[name] = doc[name] ? `${doc[name] * 100}%` : "";
247
+ } else if (fType == "password") {
248
+ displayObj[name] = "";
249
+ if (_.isString(doc[name])) {
250
+ for (let i = 0; i < doc[name].length; i++) {
251
+ displayObj[name] += "*";
252
+ }
253
+ }
254
+ } else if (fType == "lookup" && _.isString(field.reference_to)) {
255
+ let refTo = field.reference_to;
256
+
257
+ let refField = field.reference_to_field || '_id';
258
+
259
+ if (refTo === 'users') {
260
+ refTo = 'space_users';
261
+ refField = 'user'
262
+ }
263
+
264
+ let refValue = doc[name];
265
+ if (!refValue) {
266
+ continue;
267
+ }
268
+ let refObj = steedosSchema.getObject(refTo);
269
+ let nameFieldKey = await refObj.getNameFieldKey();
270
+ if (field.multiple) {
271
+ let refRecords = await refObj.find({
272
+ filters: [refField, "in", refValue],
273
+ fields: [nameFieldKey],
274
+ });
275
+ displayObj[name] = _.pluck(refRecords, nameFieldKey).join(',')
276
+ } else {
277
+ let refRecord = (
278
+ await refObj.find({
279
+ filters: [refField, "=", refValue],
280
+ fields: [nameFieldKey],
281
+ })
282
+ )[0];
283
+ if (refRecord) {
284
+ displayObj[name] = refRecord[nameFieldKey];
285
+ }
286
+ }
287
+ } else if (fType == "master_detail" && _.isString(field.reference_to)) {
288
+ let refTo = field.reference_to;
289
+ let refField = field.reference_to_field || '_id';
290
+
291
+ if (refTo === 'users') {
292
+ refTo = 'space_users';
293
+ refField = 'user'
294
+ }
295
+ let refValue = doc[name];
296
+ if (!refValue) {
297
+ continue;
298
+ }
299
+ let refObj = steedosSchema.getObject(refTo);
300
+ let nameFieldKey = await refObj.getNameFieldKey();
301
+ if (field.multiple) {
302
+ let refRecords = await refObj.find({
303
+ filters: [refField, "in", refValue],
304
+ fields: [nameFieldKey],
305
+ });
306
+ displayObj[name] = _.pluck(refRecords, nameFieldKey).join(',')
307
+ } else {
308
+ let refRecord = (
309
+ await refObj.find({
310
+ filters: [refField, "=", refValue],
311
+ fields: [nameFieldKey],
312
+ })
313
+ )[0];
314
+ if (refRecord) {
315
+ displayObj[name] = refRecord[nameFieldKey];
316
+ }
317
+ }
318
+ } else if ((fType == "master_detail" || fType == "lookup") && field.reference_to && !_.isString(field.reference_to)) {
319
+ let refValue = doc[name];
320
+ if (!refValue) {
321
+ continue;
322
+ }
323
+ let refTo = refValue.o;
324
+ let refValues = refValue.ids;
325
+ if (!refTo) {
326
+ continue;
327
+ }
328
+ let refObj = steedosSchema.getObject(refTo);
329
+ let nameFieldKey = await refObj.getNameFieldKey();
330
+ let refRecords = await refObj.find({
331
+ filters: [`_id`, "in", refValues],
332
+ fields: [nameFieldKey]
333
+ });
334
+
335
+ displayObj[name] = _.pluck(refRecords, nameFieldKey).join(',')
336
+ } else if (fType == "autonumber") {
337
+ displayObj[name] = doc[name] || "";
338
+ } else if (fType == "url") {
339
+ displayObj[name] = doc[name] || "";
340
+ } else if (fType == "email") {
341
+ displayObj[name] = doc[name] || "";
342
+ } else if (fType == "formula") {
343
+ displayObj[name] = doc[name] || "";
344
+ } else if (fType == "summary") {
345
+ displayObj[name] = doc[name] || "";
346
+ } else if (fType == "image" || fType == "file") {
347
+ let fileLabel = "";
348
+ let value = doc[name];
349
+ if (!value) {
350
+ continue;
351
+ }
352
+ // TODO: cfs_images_filerecord对象不存在,需要额外处理
353
+ let fileObjectName = fType == "image" ? "cfs_images_filerecord" : "cfs_files_filerecord";
354
+ let fileObject = steedosSchema.getObject(fileObjectName);
355
+ const fileNameFieldKey = "original.name";
356
+ if (field.multiple) {
357
+ let fileRecords = await fileObject.find({
358
+ filters: [`_id`, "in", value],
359
+ fields: [fileNameFieldKey],
360
+ });
361
+ fileLabel = _.map(fileRecords, (fileRecord) => {
362
+ return fileRecord.original?.name;
363
+ }).join(",");
364
+ } else {
365
+ let fileRecord = (
366
+ await fileObject.find({
367
+ filters: [`_id`, "=", value],
368
+ fields: [fileNameFieldKey],
369
+ })
370
+ )[0];
371
+ if (fileRecord) {
372
+ fileLabel = fileRecord["original"]["name"];
373
+ }
374
+ }
375
+ displayObj[name] = fileLabel;
376
+ }
377
+ else {
378
+ console.error(
379
+ `Graphql Display: need to handle new field type ${field.type} for ${objectName}.`
380
+ );
381
+ displayObj[name] = doc[name] || "";
382
+ }
383
+ } else {
384
+ displayObj[name] = ""; // 如果值为空,均返回空字符串
385
+ }
386
+ }
387
+ }
388
+ return displayObj
389
+ }
390
+ let displayDoc = await _translateToDisplay(doc, selectorFieldNames)
391
+ displayDoc['_id'] = doc._id;
392
+ return displayDoc;
393
+ }
394
+
395
+ async function translateToUI(objectName, doc, userSession: any, selectorFieldNames) {
396
+ const lng = getUserLocale(userSession);
397
+ let steedosSchema = getSteedosSchema();
398
+ let object = steedosSchema.getObject(objectName);
399
+ let objConfig = await object.toConfig();
400
+ let fields = objConfig.fields;
401
+ // let _object = clone(objConfig);
402
+ translationObject(lng, objConfig.name, objConfig, true);
403
+ async function _translateToUI(doc, selectorFieldNames, parentDoc?) {
404
+ let displayObj = {};
405
+ for (const name of selectorFieldNames) {
406
+ if (Object.prototype.hasOwnProperty.call(fields, name)) {
407
+ const field = fields[name];
408
+ try {
409
+ if (_.has(doc, name)) {
410
+ const fType = field.type;
411
+ if (fType == "select") {
412
+ let label = "";
413
+ let map = {};
414
+ let value = doc[name];
415
+ let translatedField = getTranslatedFieldConfig(objConfig, name);
416
+ let translatedFieldOptions =
417
+ translatedField && translatedField.options;
418
+ _.forEach(translatedFieldOptions, function (o) {
419
+ map[o.value] = o.label;
420
+ });
421
+ if (field.multiple) {
422
+ let labels = [];
423
+ _.forEach(value, function (v) {
424
+ labels.push(map[v]);
425
+ });
426
+ label = labels.join(",");
427
+ } else {
428
+ label = map[value];
429
+ }
430
+ displayObj[name] = label;
431
+ } else if (fType == "lookup" && _.isString(field.reference_to)) {
432
+ let refTo = field.reference_to;
433
+
434
+ let refField = field.reference_to_field || '_id';
435
+
436
+ if (refTo === 'users') {
437
+ refTo = 'space_users';
438
+ refField = 'user'
439
+ }
440
+
441
+ let refValue = doc[name];
442
+ if (!refValue) {
443
+ continue;
444
+ }
445
+
446
+ let refFilters = null;
447
+
448
+ if (field.multiple) {
449
+ refFilters = [refField, "in", refValue]
450
+ } else {
451
+ refFilters = [refField, "=", refValue]
452
+ }
453
+
454
+ // 判断如果是 reference_to = object_fields && reference_to_field = name, 则额外添加查询条件 object 查询条件;
455
+ if (refTo === 'object_fields' && refField == 'name') {
456
+ const refToObjectsField = _.find(fields, (_field) => {
457
+ return _field.reference_to === 'objects'
458
+ })
459
+ if (refToObjectsField) {
460
+ refFilters = [['object', '=', parentDoc[refToObjectsField.name]], refFilters]
461
+ }
462
+ }
463
+
464
+ // 判断如果是 reference_to = object_actions && reference_to_field = name, 则额外添加查询条件 object 查询条件;
465
+ if (refTo === 'object_actions' && refField == 'name') {
466
+ const refToObjectsField = _.find(fields, (_field) => {
467
+ return _field.reference_to === 'objects'
468
+ })
469
+ if (refToObjectsField) {
470
+ refFilters = [['object', '=', parentDoc[refToObjectsField.name]], refFilters]
471
+ }
472
+ }
473
+
474
+ let refObj = steedosSchema.getObject(refTo);
475
+ let nameFieldKey = await refObj.getNameFieldKey();
476
+ if (field.multiple) {
477
+ let refRecords = await refObj.find({
478
+ filters: refFilters,
479
+ fields: [nameFieldKey],
480
+ });
481
+ displayObj[name] = _.map(refRecords, (item) => {
482
+ return {
483
+ objectName: refTo,
484
+ value: item._id,
485
+ label: item[nameFieldKey]
486
+ }
487
+ })
488
+ } else {
489
+ let refRecord = (
490
+ await refObj.find({
491
+ filters: refFilters,
492
+ fields: [nameFieldKey],
493
+ })
494
+ )[0];
495
+ if (refRecord) {
496
+ displayObj[name] = {
497
+ objectName: refTo,
498
+ value: refRecord._id,
499
+ label: refRecord[nameFieldKey]
500
+ };
501
+ }
502
+ }
503
+ } else if (fType == "master_detail" && _.isString(field.reference_to)) {
504
+ let refTo = field.reference_to;
505
+ let refField = field.reference_to_field || '_id';
506
+
507
+ if (refTo === 'users') {
508
+ refTo = 'space_users';
509
+ refField = 'user'
510
+ }
511
+ let refValue = doc[name];
512
+ if (!refValue) {
513
+ continue;
514
+ }
515
+ let refObj = steedosSchema.getObject(refTo);
516
+ let nameFieldKey = await refObj.getNameFieldKey();
517
+ if (field.multiple) {
518
+ let refRecords = await refObj.find({
519
+ filters: [refField, "in", refValue],
520
+ fields: [nameFieldKey],
521
+ });
522
+ displayObj[name] = _.map(refRecords, (item) => {
523
+ return {
524
+ objectName: refTo,
525
+ value: item._id,
526
+ label: item[nameFieldKey]
527
+ }
528
+ })
529
+ } else {
530
+ let refRecord = (
531
+ await refObj.find({
532
+ filters: [refField, "=", refValue],
533
+ fields: [nameFieldKey],
534
+ })
535
+ )[0];
536
+ if (refRecord) {
537
+ displayObj[name] = {
538
+ objectName: refTo,
539
+ value: refRecord._id,
540
+ label: refRecord[nameFieldKey]
541
+ };
542
+ }
543
+ }
544
+ } else if ((fType == "master_detail" || fType == "lookup") && field.reference_to && !_.isString(field.reference_to)) {
545
+ let refValue = doc[name];
546
+ if (!refValue) {
547
+ continue;
548
+ }
549
+ let refTo = refValue.o;
550
+ let refValues = refValue.ids;
551
+ if (!refTo) {
552
+ continue;
553
+ }
554
+ let refObj = steedosSchema.getObject(refTo);
555
+ let nameFieldKey = await refObj.getNameFieldKey();
556
+ let refRecords = await refObj.find({
557
+ filters: [`_id`, "in", refValues],
558
+ fields: [nameFieldKey]
559
+ });
560
+
561
+ displayObj[name] = _.map(refRecords, (item) => {
562
+ return {
563
+ objectName: refTo,
564
+ value: item._id,
565
+ label: item[nameFieldKey]
566
+ }
567
+ })
568
+ } else if (fType == "formula") {
569
+ displayObj[name] = formatBasicFieldValue(field.data_type, field, doc[name], objConfig, userSession);
570
+ } else if (fType == "summary") {
571
+ displayObj[name] = formatBasicFieldValue('number', field, doc[name], objConfig, userSession);
572
+ } else if (fType == "image" || fType == "file" || fType === 'avatar') {
573
+ let fileValue: any = null;
574
+ let value = doc[name];
575
+ if (!value) {
576
+ continue;
577
+ }
578
+ // TODO: cfs_images_filerecord对象不存在,需要额外处理
579
+ let storageName = getFileStorageName(fType)
580
+ let fileObjectName = `cfs_${storageName}_filerecord`;
581
+ let fileObject = steedosSchema.getObject(fileObjectName);
582
+ const fileNameFieldKey = "original.name";
583
+ if (field.multiple) {
584
+ let fileRecords = await fileObject.find({
585
+ filters: [`_id`, "in", value],
586
+ fields: ['_id', fileNameFieldKey, 'original.size', 'original.type'],
587
+ });
588
+ fileValue = _.map(fileRecords, (fileRecord) => {
589
+ return {
590
+ name: fileRecord.original?.name,
591
+ url: absoluteUrl(`/api/files/${storageName}/${fileRecord._id}`),
592
+ size: fileRecord.original?.size,
593
+ type: fileRecord.original?.type,
594
+ };
595
+ });
596
+ } else {
597
+ let fileRecord = (
598
+ await fileObject.find({
599
+ filters: [`_id`, "=", value],
600
+ fields: ['_id', fileNameFieldKey, 'original.size', 'original.type'],
601
+ })
602
+ )[0];
603
+ if (fileRecord) {
604
+ fileValue = {
605
+ name: fileRecord["original"]["name"],
606
+ url: absoluteUrl(`/api/files/${storageName}/${value}`),
607
+ size: fileRecord.original?.size,
608
+ type: fileRecord.original?.type
609
+ };
610
+ } else {
611
+ fileValue = {
612
+ url: value
613
+ };
614
+ }
615
+ }
616
+ displayObj[name] = fileValue;
617
+ } else if (fType == "filesize") {
618
+ displayObj[name] = formatFileSize(doc[name]);
619
+ }
620
+ else if (fType === 'object') {
621
+ if (doc[name] && _.isObject(doc[name])) {
622
+ const _doc = {}
623
+ _.each(doc[name], function (v, k) {
624
+ const newKey = `${name}.${k}`
625
+ _doc[newKey] = v
626
+ })
627
+ const objectFieldDoc = await _translateToUI(_doc, Object.keys(_doc), doc)
628
+ const objectDoc = {}
629
+ _.each(objectFieldDoc, function (v, k) {
630
+ const newKey = k.replace(`${name}.`, '')
631
+ objectDoc[newKey] = v
632
+ })
633
+ displayObj[name] = objectDoc
634
+ }
635
+ }
636
+ else if (fType === 'grid') {
637
+ if (doc[name] && _.isArray(doc[name])) {
638
+ const gridDocs = []
639
+ for (const gridDoc of doc[name]) {
640
+ const _doc = {}
641
+ _.each(gridDoc, function (v, k) {
642
+ const newKey = `${name}.$.${k}`
643
+ _doc[newKey] = v
644
+ })
645
+ const objectFieldDoc = await _translateToUI(_doc, Object.keys(_doc), doc)
646
+ const objectDoc = {}
647
+ _.each(objectFieldDoc, function (v, k) {
648
+ const newKey = k.replace(`${name}.$.`, '')
649
+ objectDoc[newKey] = v
650
+ })
651
+ gridDocs.push(objectDoc)
652
+ }
653
+
654
+ displayObj[name] = gridDocs
655
+ }
656
+ }
657
+ else {
658
+ displayObj[name] = formatBasicFieldValue(fType, field, doc[name], objConfig, userSession);
659
+ }
660
+ }
661
+ else {
662
+ displayObj[name] = ""; // 如果值为空,均返回空字符串
663
+ }
664
+ } catch (error) {
665
+ displayObj[name] = doc[name];
666
+ // console.warn(error)
667
+ }
668
+ }
669
+ }
670
+ return displayObj
671
+ }
672
+
673
+ let uiDoc = await _translateToUI(doc, selectorFieldNames, doc)
674
+ uiDoc['_id'] = doc._id;
675
+ return uiDoc;
676
+ }
677
+
678
+ function getTranslatedFieldConfig(translatedObject: any, name: string) {
679
+ return translatedObject.fields[name.replace(/__label$/, "")];
680
+ }