@steedos-widgets/amis-lib 1.2.3 → 1.2.6-beta.10

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.
package/dist/index.esm.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import * as _$1 from 'lodash';
2
- import ___default, { isEmpty, isArray, each, find, endsWith, cloneDeep, includes, get, map, keys, sortBy, compact, toArray, mergeWith, isBoolean, omitBy, isNil, isString, slice, defaultsDeep as defaultsDeep$1, isObject as isObject$1, has, filter, startsWith } from 'lodash';
2
+ import ___default, { isEmpty, isArray, each, find, endsWith, cloneDeep, includes, get, map, toArray, mergeWith, isBoolean, omitBy, isNil, isString, union, has, slice, defaultsDeep as defaultsDeep$1, isObject as isObject$1, filter, startsWith } from 'lodash';
3
3
  import { Router as Router$1, getSteedosAuth as getSteedosAuth$1, lookupToAmis as lookupToAmis$1, fetchAPI as fetchAPI$1 } from '@steedos-widgets/amis-lib';
4
4
  import isPlainObject from 'lodash/isPlainObject';
5
5
 
@@ -334,7 +334,7 @@ const getSteedosAuth = () => {
334
334
  * @Author: baozhoutao@steedos.com
335
335
  * @Date: 2022-08-16 17:02:08
336
336
  * @LastEditors: baozhoutao@steedos.com
337
- * @LastEditTime: 2023-04-17 15:24:21
337
+ * @LastEditTime: 2023-04-19 15:25:50
338
338
  * @Description:
339
339
  */
340
340
 
@@ -346,7 +346,7 @@ const Router = {
346
346
  return urlSearch.get('display')
347
347
  }
348
348
  // const key = `tab.${tab_id}.display`;
349
- const key = `page.display`;
349
+ const key = `page_display`;
350
350
  const value = localStorage.getItem(key);
351
351
  return value ? value : 'grid'
352
352
  },
@@ -1368,8 +1368,8 @@ var config = {
1368
1368
  /*
1369
1369
  * @Author: baozhoutao@steedos.com
1370
1370
  * @Date: 2022-11-01 15:51:00
1371
- * @LastEditors: 殷亮辉 yinlianghui@hotoa.com
1372
- * @LastEditTime: 2023-04-16 17:04:16
1371
+ * @LastEditors: baozhoutao@steedos.com
1372
+ * @LastEditTime: 2023-04-19 20:26:27
1373
1373
  * @Description:
1374
1374
  */
1375
1375
 
@@ -1479,7 +1479,27 @@ const getSchema$4 = async (uiSchema, ctx) => {
1479
1479
  "id": "u:e11347411d2d",
1480
1480
  "closeOnEsc": false,
1481
1481
  "closeOnOutside": false,
1482
- "size": "lg"
1482
+ "size": "lg",
1483
+ "actions": [
1484
+ {
1485
+ type: 'button',
1486
+ actionType: 'cancel',
1487
+ label: "取消"
1488
+ },
1489
+ {
1490
+ type: 'button',
1491
+ label: "保存并新建",
1492
+ actionType: 'confirm',
1493
+ close: false,
1494
+ id: "confirmAndNew"
1495
+ },
1496
+ {
1497
+ type: 'button',
1498
+ actionType: 'confirm',
1499
+ label: "保存",
1500
+ primary: true
1501
+ },
1502
+ ]
1483
1503
  }
1484
1504
  }
1485
1505
  ]
@@ -2381,96 +2401,97 @@ async function getObjectFieldsFilterButtonSchema(objectSchema) {
2381
2401
  }
2382
2402
  }
2383
2403
 
2384
- async function getObjectFieldsFilterFormSchema(objectSchema, fields, ctx) {
2385
- if(!ctx){
2404
+ async function getObjectFieldsFilterFormSchema(ctx) {
2405
+
2406
+ if (!ctx) {
2386
2407
  ctx = {};
2387
2408
  }
2388
- const body = [];
2389
- for (let field of fields) {
2390
- if (
2391
- !includes(
2392
- [
2393
- "grid",
2394
- "avatar",
2395
- "image",
2396
- "object",
2397
- "[object]",
2398
- "[Object]",
2399
- "[grid]",
2400
- "[text]",
2401
- "audio",
2402
- "file",
2403
- ],
2404
- field.type
2405
- )
2406
- ) {
2407
- delete field.defaultValue;
2408
- delete field.required;
2409
- delete field.is_wide;
2410
- delete field.readonly;
2411
- delete field.hidden;
2412
- delete field.omit;
2413
- const amisField = await getFieldSearchable(field, fields, ctx);
2414
- if (amisField) {
2415
- body.push(amisField);
2409
+ const formSchema = {
2410
+ "type": "service",
2411
+ "visibleOn": "this.filterFormSearchableFields && this.filterFormSearchableFields.length",
2412
+ "className": ctx.formFactor === 'SMALL' ? "slds-filters__body p-0 mb-2" : "slds-filters__body p-0 sm:grid sm:gap-2 sm:grid-cols-4 mb-2",
2413
+ "schemaApi": {
2414
+ method: 'post',
2415
+ url: `\${context.rootUrl}/graphql?reload=\${filterFormSearchableFields|join}`,
2416
+ data: {
2417
+ $self: "$$",
2418
+ query: "{\n data: objects(filters: [[\"_id\",\"=\",null]],top: 1, skip: 0){_id}\n }"
2419
+ },
2420
+ requestAdaptor: `
2421
+ return {
2422
+ ...api,
2423
+ data: {
2424
+ query: api.data.query
2425
+ }
2426
+ };
2427
+ `,
2428
+ adaptor: `
2429
+ if(payload.errors){
2430
+ payload.status = 2;
2431
+ payload.msg = window.t ? window.t(payload.errors[0].message) : payload.errors[0].message;
2432
+ }
2433
+ const selfData = api.body.$self;
2434
+ const filterFormSearchableFields = selfData.filterFormSearchableFields;
2435
+ const uiSchema = selfData.uiSchema;
2436
+ const fields = uiSchema.fields;
2437
+ const searchableFields = [];
2438
+
2439
+ const resolveAll = function(values){
2440
+ payload.data = {
2441
+ "body": values
2442
+ };
2443
+ return payload;
2444
+ }
2445
+
2446
+ const rejectAll = function(){
2447
+ console.warn("run function getFieldSearchable failed.");
2448
+ }
2449
+
2450
+ return Promise.all(filterFormSearchableFields.map(function (item) {
2451
+ const field = _.clone(fields[item]);
2452
+ if (
2453
+ !_.includes(
2454
+ [
2455
+ "grid",
2456
+ "avatar",
2457
+ "image",
2458
+ "object",
2459
+ "[object]",
2460
+ "[Object]",
2461
+ "[grid]",
2462
+ "[text]",
2463
+ "audio",
2464
+ "file",
2465
+ ],
2466
+ field.type
2467
+ )
2468
+ ) {
2469
+ delete field.defaultValue;
2470
+ delete field.required;
2471
+ delete field.is_wide;
2472
+ delete field.readonly;
2473
+ delete field.hidden;
2474
+ delete field.omit;
2475
+ var ctx = ${JSON.stringify(ctx)};
2476
+ const amisField = window.getFieldSearchable(field, fields, ctx);
2477
+ return amisField;
2478
+ }
2479
+ })).then(resolveAll, rejectAll);
2480
+ `,
2481
+ headers: {
2482
+ Authorization: "Bearer ${context.tenantId},${context.authToken}"
2416
2483
  }
2417
2484
  }
2418
- }
2419
- map(body, "name");
2420
- if(ctx.enableSearchableFieldsVisibleOn){
2421
- body.forEach(function(fieldItem){
2422
- fieldItem.visibleOn = `this.filterFormSearchableFields && this.filterFormSearchableFields.indexOf("${fieldItem.fieldName}") > -1`;
2423
- // fieldItem.clearValueOnHidden = true;//这个属性会把form字段值删除,但是点击搜索时crud还是把值给传递到过滤条件(api.requestAdaptor的data.$self)中了,应该是crud的bug
2424
- });
2425
- }
2426
-
2427
- // const onBroadcastSearchableFieldsChangeScript = `
2428
- // const data = event.data;
2429
- // const listViewId = data.listViewId;
2430
- // const searchableFields = data.fields;
2431
- // const preSearchableFields = data.__super.__super.fields;
2432
- // const removedFields = _.difference(preSearchableFields, searchableFields);
2433
- // const listViewPropsStoreKey = location.pathname + "/crud/" + listViewId ;
2434
- // let localListViewProps = localStorage.getItem(listViewPropsStoreKey);
2435
- // if(localListViewProps){
2436
- // // 当变更可搜索字段时,如果被移除的可搜索字段在本地存储中已经存入过滤条件中则应该清除本地存储中相关字段的过滤条件。
2437
- // localListViewProps = JSON.parse(localListViewProps);
2438
- // let removedKeys = [];
2439
- // _.each(localListViewProps, function(n,k){
2440
- // // __searchable__开头的不在searchableFields范围则清除其值
2441
- // let isRemoved = !!removedFields.find(function(fieldName){
2442
- // return new RegExp("__searchable__\.*" + fieldName + "$").test(k);
2443
- // });
2444
- // if(isRemoved){
2445
- // removedKeys.push(k);
2446
- // }
2447
- // });
2448
- // const removedValues = {};
2449
- // removedKeys.forEach(function(key){
2450
- // delete localListViewProps[key];
2451
- // removedValues[key] = "";
2452
- // });
2453
- // doAction({
2454
- // actionType: 'setValue',
2455
- // args: {
2456
- // value: removedValues
2457
- // }
2458
- // });
2459
- // localStorage.setItem(listViewPropsStoreKey, JSON.stringify(localListViewProps));
2460
- // }
2461
- // `;
2485
+ };
2462
2486
 
2463
- return body;
2487
+ return formSchema;
2464
2488
  }
2465
2489
 
2466
- async function getObjectFieldsFilterBarSchema(objectSchema, fields, ctx) {
2467
- // console.log(ctx)
2468
- if(!ctx){
2490
+ async function getObjectFieldsFilterBarSchema(objectSchema, ctx) {
2491
+ if (!ctx) {
2469
2492
  ctx = {};
2470
2493
  }
2471
- const filterFormSchema = await getObjectFieldsFilterFormSchema(objectSchema, fields, Object.assign({}, {
2472
- enableSearchableFieldsVisibleOn: true
2473
- }, ctx));
2494
+ const filterFormSchema = await getObjectFieldsFilterFormSchema(ctx);
2474
2495
  const onSearchScript = `
2475
2496
  const scope = event.context.scoped;
2476
2497
  var filterForm = scope.parent.parent.getComponents().find(function(n){
@@ -2503,18 +2524,21 @@ async function getObjectFieldsFilterBarSchema(objectSchema, fields, ctx) {
2503
2524
  searchableFieldsStoreKey += listViewId;
2504
2525
  }
2505
2526
  let defaultSearchableFields = sessionStorage.getItem(searchableFieldsStoreKey);
2506
- if(!defaultSearchableFields && data.uiSchema){
2527
+ if(defaultSearchableFields){
2528
+ defaultSearchableFields = defaultSearchableFields.split(",");
2529
+ }
2530
+ if(_.isEmpty(defaultSearchableFields) && data.uiSchema){
2507
2531
  let listView = data.uiSchema.list_views[data.listName];
2508
- defaultSearchableFields = listView && listView.searchable_fields;
2509
- if(defaultSearchableFields && defaultSearchableFields.length){
2510
- defaultSearchableFields = _.map(defaultSearchableFields, 'field');
2532
+ const sFields = listView && listView.searchable_fields;
2533
+ if(sFields && sFields.length){
2534
+ defaultSearchableFields = _.map(sFields, 'field');
2511
2535
  }
2512
2536
  }
2513
2537
  if(_.isEmpty(defaultSearchableFields) && data.uiSchema){
2514
2538
  defaultSearchableFields = _.map(
2515
- _.filter(_.values(data.uiSchema.fields), (field) => {
2539
+ _.sortBy(_.filter(_.values(data.uiSchema.fields), (field) => {
2516
2540
  return field.searchable;
2517
- }),
2541
+ }), "sort_no"),
2518
2542
  "name"
2519
2543
  );
2520
2544
  }
@@ -2652,7 +2676,7 @@ async function getObjectFieldsFilterBarSchema(objectSchema, fields, ctx) {
2652
2676
  // "filterFormValues": {"__searchable__name": "xxx"},//搜索项表单值
2653
2677
  // "listViewId": "${listViewId}"
2654
2678
  },
2655
- "id": `service_listview_filter_form_${objectSchema.name}`,
2679
+ // "id": `service_listview_filter_form_${objectSchema.name}`,
2656
2680
  "dataProvider": {
2657
2681
  "inited": dataProviderInited
2658
2682
  },
@@ -2660,15 +2684,7 @@ async function getObjectFieldsFilterBarSchema(objectSchema, fields, ctx) {
2660
2684
  "type": "wrapper",
2661
2685
  "body": {
2662
2686
  "type": "wrapper",
2663
- "body": [{
2664
- "type": "wrapper",
2665
- "body": [
2666
- filterFormSchema
2667
- ],
2668
- "size": "xs",
2669
- "visibleOn": "this.filterFormSearchableFields && this.filterFormSearchableFields.length",
2670
- "className": ctx.formFactor === 'SMALL' ? "slds-filters__body p-0 mb-2": "slds-filters__body p-0 sm:grid sm:gap-2 sm:grid-cols-4 mb-2"
2671
- }, {
2687
+ "body": [filterFormSchema, {
2672
2688
  "type": "wrapper",
2673
2689
  "body": {
2674
2690
  "type": "wrapper",
@@ -3027,16 +3043,7 @@ async function getObjectListHeaderSecordLine(objectSchema, listViewName, ctx) {
3027
3043
  * @returns amisSchema
3028
3044
  */
3029
3045
  async function getObjectListHeaderFieldsFilterBar(objectSchema, listViewName, ctx) {
3030
- const searchableFields = keys(objectSchema.fields);
3031
- const fields = sortBy(
3032
- compact(
3033
- map(searchableFields, (fieldName) => {
3034
- return objectSchema.fields[fieldName];
3035
- })
3036
- ),
3037
- "sort_no"
3038
- );
3039
- const fieldsFilterBarSchema = await getObjectFieldsFilterBarSchema(objectSchema, fields, ctx);
3046
+ const fieldsFilterBarSchema = await getObjectFieldsFilterBarSchema(objectSchema, ctx);
3040
3047
  return fieldsFilterBarSchema;
3041
3048
  }
3042
3049
 
@@ -3815,12 +3822,11 @@ function getObjectHeaderToolbar(mainObject, formFactor, {showDisplayAs = false,
3815
3822
  "objectApiName": "object_listviews",
3816
3823
  "recordId": "${recordId}",
3817
3824
  "mode": "edit",
3818
- "initApiAdaptor": "",
3819
3825
  "fields": [
3820
3826
  "filters"
3821
3827
  ],
3822
3828
  "initApiRequestAdaptor": "",
3823
- "initApiAdaptor": "const recordId_tmp = api.body.recordId;\nlet data_tmp;\nif (recordId_tmp) {\n data_tmp = payload.data.initialValues;\n // 数据格式转换\n if (data_tmp) {\n if (data_tmp.filters && lodash.isString(data_tmp.filters)) {\n try {\n data_tmp.filters = JSON.parse(data_tmp.filters);\n } catch (e) { }\n }\n\n if (data_tmp.filters && lodash.isString(data_tmp.filters)) {\n data_tmp._filters_type_controller = 'function';\n } else {\n data_tmp._filters_type_controller = 'conditions'\n }\n\n if (data_tmp._filters_type_controller === 'conditions') {\n data_tmp._filters_conditions = window.amisConvert.filtersToConditions(data_tmp.filters || []);\n data_tmp.filters = data_tmp._filters_conditions;\n } else {\n data_tmp._filters_function = data_tmp.filters;\n }\n }\n}\nfor (key in data_tmp) {\n if (data_tmp[key] === null) {\n delete data_tmp[key];\n }\n}\npayload.data.initialValues = Object.assign(payload.data.initialValues, data_tmp);\ndelete payload.extensions;",
3829
+ "initApiAdaptor": "const recordId_tmp = api.body.recordId;\nlet data_tmp;\nif (recordId_tmp) {\n data_tmp = payload.data;\n // 数据格式转换\n if (data_tmp) {\n if (data_tmp.filters && lodash.isString(data_tmp.filters)) {\n try {\n data_tmp.filters = JSON.parse(data_tmp.filters);\n } catch (e) { }\n }\n\n if (data_tmp.filters && lodash.isString(data_tmp.filters)) {\n data_tmp._filters_type_controller = 'function';\n } else {\n data_tmp._filters_type_controller = 'conditions'\n }\n\n if (data_tmp._filters_type_controller === 'conditions') {\n data_tmp._filters_conditions = window.amisConvert.filtersToConditions(data_tmp.filters || []);\n data_tmp.filters = data_tmp._filters_conditions;\n } else {\n data_tmp._filters_function = data_tmp.filters;\n }\n }\n}\nfor (key in data_tmp) {\n if (data_tmp[key] === null) {\n delete data_tmp[key];\n }\n}\npayload.data = Object.assign(payload.data, data_tmp);\ndelete payload.extensions;",
3824
3830
  "apiRequestAdaptor": "const recordId = api.body.recordId;\nif (formData._filters_type_controller === 'conditions' && formData._filters_conditions) {\n formData.filters = window.amisConvert.conditionsToFilters(formData.filters);\n} else {\n formData.filters = formData._filters_function || null;\n}\n\ndelete formData._filters_type_controller;\ndelete formData._filters_conditions;\ndelete formData._filters_function;\n// 字符串拼接(不支持ES6``语法)\nquery = 'mutation{record: ' + objectName + '__insert(doc: {__saveData}){_id}}';\nif (api.body.recordId) {\n query = 'mutation{record: ' + objectName + '__update(id: \"' + recordId + '\", doc: {__saveData}){_id}}';\n};\n__saveData = JSON.stringify(JSON.stringify(formData));\napi.data = { query: query.replace('{__saveData}', __saveData) };\n",
3825
3831
  "fieldsExtend": "{\"filters\": {\n \"visible_on\": \"true\",\n \"amis\": {\n \"type\": \"condition-builder\",\n \"label\": \"条件组件\",\n \"source\": {\n \"method\": \"get\",\n \"url\": \"${context.rootUrl}/service/api/amis-metadata-listviews/getFilterFields?objectName=${objectName}\",\n \"dataType\": \"json\",\n \"headers\": {\n \"Authorization\": \"Bearer ${context.tenantId},${context.authToken}\"\n }\n }\n }\n }\n}",
3826
3832
  "onEvent": {
@@ -3880,7 +3886,7 @@ function getObjectHeaderToolbar(mainObject, formFactor, {showDisplayAs = false,
3880
3886
  "recordId": "${recordId}",
3881
3887
  "mode": "edit",
3882
3888
  "fieldsExtend": "{\n \"columns\": {\n \"amis\": {\n \"type\": \"transfer\",\n \"sortable\": true,\n \"searchable\": true,\n \"source\": {\n \"method\": \"get\",\n \"url\": \"${context.rootUrl}/service/api/amis-metadata-objects/objects/${objectName}/fields/options\",\n \"headers\": {\n \"Authorization\": \"Bearer ${context.tenantId},${context.authToken}\"\n }\n }\n }\n },\n \"mobile_columns\": {\n \"group\": \"手机端\",\n \"amis\": {\n \"type\": \"transfer\",\n \"sortable\": true,\n \"searchable\": true,\n \"source\": {\n \"method\": \"get\",\n \"url\": \"${context.rootUrl}/service/api/amis-metadata-objects/objects/${objectName}/fields/options\",\n \"headers\": {\n \"Authorization\": \"Bearer ${context.tenantId},${context.authToken}\"\n }\n }\n }\n }\n}",
3883
- "initApiAdaptor": "const recordId_tmp = api.body.recordId;\nlet columns_tmp = {}, mobile_columns_tmp = {};\nif (recordId_tmp) {\n columns_tmp = payload.data.initialValues.columns;\n mobile_columns_tmp = payload.data.initialValues.mobile_columns;\n if (columns_tmp) {\n columns_tmp = lodash.map(columns_tmp, 'field');\n }\n if (mobile_columns_tmp) {\n mobile_columns_tmp = lodash.map(mobile_columns_tmp, 'field');\n }\n}\npayload.data.initialValues.columns = columns_tmp;\npayload.data.initialValues.mobile_columns = mobile_columns_tmp;\n\ndelete payload.extensions;\nreturn payload;",
3889
+ "initApiAdaptor": "const recordId_tmp = api.body.recordId;\nlet columns_tmp = {}, mobile_columns_tmp = {};\nif (recordId_tmp) {\n columns_tmp = payload.data.columns;\n mobile_columns_tmp = payload.data.mobile_columns;\n if (columns_tmp) {\n columns_tmp = lodash.map(columns_tmp, 'field');\n }\n if (mobile_columns_tmp) {\n mobile_columns_tmp = lodash.map(mobile_columns_tmp, 'field');\n }\n}\npayload.data.columns = columns_tmp;\npayload.data.mobile_columns = mobile_columns_tmp;\n\ndelete payload.extensions;\nreturn payload;",
3884
3890
  "apiRequestAdaptor": "const formData_tmp = api.body.$;\nconst objectName_tmp = api.body.objectName;\nconst recordId_tmp = api.body.recordId;\n\nif (typeof formData_tmp.columns == 'string') {\n formData_tmp.columns = formData_tmp.columns?.split(',');\n}\nif (typeof formData_tmp.mobile_columns == 'string') {\n formData_tmp.mobile_columns = formData_tmp.mobile_columns?.split(',');\n}\n\n// 数据格式转换\nformData_tmp.columns = lodash.map(formData_tmp.columns, (item) => {\n return { field: item };\n});\nformData.mobile_columns = lodash.map(formData.mobile_columns, (item) => {\n return { field: item };\n});\n\n// 字符串拼接(不支持ES6语法)\nlet query_tmp = 'mutation{record: ' + objectName_tmp + '__insert(doc: {__saveData}){_id}}';\nif (api.body.recordId) {\n query_tmp = 'mutation{record: ' + objectName_tmp + '__update(id: \"' + recordId_tmp +'\", doc: {__saveData}){_id}}';\n};\ndelete formData_tmp._id;\nlet __saveData_tmp = JSON.stringify(JSON.stringify(formData_tmp));\napi.data = { query: query_tmp.replace('{__saveData}', __saveData_tmp) };\n\nreturn api;",
3885
3891
  "fields": [
3886
3892
  "columns",
@@ -3962,7 +3968,7 @@ function getObjectHeaderToolbar(mainObject, formFactor, {showDisplayAs = false,
3962
3968
  }
3963
3969
  },
3964
3970
  "fieldsExtend": "{\n \"sort\": {\n \"amis\": {\n \"type\": \"tabs-transfer\",\n \"sortable\": true,\n \"searchable\": true,\n \"source\": {\n \"method\": \"get\",\n \"url\": \"${context.rootUrl}/service/api/amis-metadata-objects/objects/${objectName}/sortFields/options\",\n \"headers\": {\n \"Authorization\": \"Bearer ${context.tenantId},${context.authToken}\"\n }\n }\n }\n }\n}",
3965
- "initApiAdaptor": "let sort;\nif (recordId) {\n sort = payload.data.initialValues.sort;\n //数据格式转换\n if (sort instanceof Array) {\n sort = lodash.map(sort, (item) => {\n return item.field_name + ':' + (item.order || 'asc')\n });\n }\n}\npayload.data.initialValues.sort = sort;\ndelete payload.extensions;",
3971
+ "initApiAdaptor": "let sort;\nif (recordId) {\n sort = payload.data.sort;\n //数据格式转换\n if (sort instanceof Array) {\n sort = lodash.map(sort, (item) => {\n return item.field_name + ':' + (item.order || 'asc')\n });\n }\n}\npayload.data.sort = sort;\ndelete payload.extensions;",
3966
3972
  "apiRequestAdaptor": "const recordId = api.body.recordId;\n//数据格式转换\nif (typeof formData.sort == 'string') {\n formData.sort = formData.sort?.split(',');\n}\nformData.sort = lodash.map(formData.sort, (item) => {\n const arr = item.split(':');\n return { field_name: arr[0], order: arr[1] };\n});\nif (recordId) {\n query = 'mutation{record: ' + objectName + '__update(id: \"' + recordId + '\", doc: {__saveData}){_id}}';\n}\n__saveData = JSON.stringify(JSON.stringify(formData));\napi.data = { query: query.replace('{__saveData}', __saveData) };\n"
3967
3973
  }
3968
3974
  ],
@@ -4501,13 +4507,16 @@ async function lookupToAmisPicker(field, readonly, ctx){
4501
4507
  var sort = orderBy + ' ' + orderDir;
4502
4508
  sort = orderBy ? sort : "${sort}";
4503
4509
  var allowSearchFields = ${JSON.stringify(searchableFields)};
4510
+ let fieldValue;
4504
4511
  if(api.data.$term){
4505
4512
  filters = [["name", "contains", "'+ api.data.$term +'"]];
4506
4513
  }else if(selfData.op === 'loadOptions' && selfData.value){
4507
4514
  if(selfData.value?.indexOf(',') > 0){
4508
- filters = [["${referenceTo.valueField.name}", "=", selfData.value.split(',')]];
4515
+ fieldValue = selfData.value.split(',');
4516
+ filters = [["${referenceTo.valueField.name}", "=", fieldValue]];
4509
4517
  }else{
4510
- filters = [["${referenceTo.valueField.name}", "=", selfData.value]];
4518
+ fieldValue = selfData.value;
4519
+ filters = [["${referenceTo.valueField.name}", "=", fieldValue]];
4511
4520
  }
4512
4521
  }
4513
4522
 
@@ -4561,6 +4570,9 @@ async function lookupToAmisPicker(field, readonly, ctx){
4561
4570
  if(enable_tree){
4562
4571
  pageSize = 10000;
4563
4572
  }
4573
+ if(fieldValue && _.isArray(fieldValue) && fieldValue.length > pageSize){
4574
+ pageSize = fieldValue.length;
4575
+ }
4564
4576
  api.data.query = api.data.query.replace(/{__filters}/g, JSON.stringify(filters)).replace('{__top}', pageSize).replace('{__skip}', skip).replace('{__sort}', sort.trim());
4565
4577
  return api;
4566
4578
  `;
@@ -4661,13 +4673,9 @@ async function lookupToAmisPicker(field, readonly, ctx){
4661
4673
  //TODO: 等待放大镜bug修复,if会去掉,始终显示放大镜
4662
4674
  if(referenceTo.objectName != "space_users" || field.reference_to_field != "user"){
4663
4675
  if (ctx.filterVisible !== false) {
4664
- let filterLoopCount = ctx.filterLoopCount || 0;
4665
- filterLoopCount++;
4666
- // 可以传入filterVisible为false防止死循环
4667
4676
  pickerSchema.filter = await getObjectFilter(refObjectConfig, fields, {
4668
4677
  isLookup: true,
4669
- ...ctx,
4670
- filterLoopCount,
4678
+ ...ctx
4671
4679
  });
4672
4680
  }
4673
4681
  }
@@ -5646,7 +5654,7 @@ async function convertSFieldToAmisField(field, readonly, ctx) {
5646
5654
  columnsTogglable: false,
5647
5655
  strictMode:false,
5648
5656
  affixHeader: false, // 是否固定表头, 不固定表头, 否则form有y轴滚动条时, 表头会跟随滚动条滚动.
5649
- // needConfirm: true, 此属性设置为false后,导致table不能编辑。
5657
+ needConfirm: false,
5650
5658
  editable: !readonly,
5651
5659
  addable: !readonly,
5652
5660
  removable: !readonly,
@@ -5725,6 +5733,14 @@ async function convertSFieldToAmisField(field, readonly, ctx) {
5725
5733
  convertData.visibleOn = `${field.visible_on.replace(/formData./g, 'data.')}`;
5726
5734
  }
5727
5735
  }
5736
+
5737
+ if(_$1.isString(baseData.required)){
5738
+ if(baseData.required.startsWith("{{")){
5739
+ baseData.requiredOn = `${baseData.required.substring(2, baseData.required.length -2).replace(/formData./g, 'data.')}`;
5740
+ delete baseData.required;
5741
+ }
5742
+ }
5743
+
5728
5744
  if(convertData.type === 'group'){
5729
5745
  convertData.body[0] = Object.assign({}, baseData, convertData.body[0], { labelClassName: 'text-left', clearValueOnHidden: true, fieldName: field.name});
5730
5746
  return convertData
@@ -5739,8 +5755,9 @@ async function convertSFieldToAmisField(field, readonly, ctx) {
5739
5755
  }
5740
5756
 
5741
5757
  async function getFieldSearchable(perField, permissionFields, ctx){
5742
- const filterLoopCount = ctx.filterLoopCount || 0;
5743
- const maxFilterLoopCount = 5;
5758
+ if(!ctx){
5759
+ ctx = {};
5760
+ }
5744
5761
  let field = perField;
5745
5762
  if(field.type === 'grid'){
5746
5763
  field = await getGridFieldSubFields(perField, permissionFields);
@@ -5801,14 +5818,17 @@ async function getFieldSearchable(perField, permissionFields, ctx){
5801
5818
  _field.multiple = true;
5802
5819
  _field.is_wide = false;
5803
5820
  _field.defaultValue = undefined;
5804
- // filterVisible: false不再生成lookup字段时的filter,否则会死循环
5805
- const amisField = await convertSFieldToAmisField(_field, false, Object.assign({}, ctx, {fieldNamePrefix: fieldNamePrefix, required: false, showSystemFields: true, filterVisible: filterLoopCount < maxFilterLoopCount}));
5821
+ const amisField = await convertSFieldToAmisField(_field, false, Object.assign({}, ctx, {fieldNamePrefix: fieldNamePrefix, required: false, showSystemFields: true}));
5806
5822
  if(amisField){
5807
5823
  return amisField;
5808
5824
  }
5809
5825
  }
5810
5826
  }
5811
5827
 
5828
+ if(typeof window != 'undefined'){
5829
+ window.getFieldSearchable = getFieldSearchable;
5830
+ }
5831
+
5812
5832
  var index = /*#__PURE__*/Object.freeze({
5813
5833
  __proto__: null,
5814
5834
  OMIT_FIELDS: OMIT_FIELDS,
@@ -5988,12 +6008,12 @@ function getScriptForRewriteValueForFileFields(fields){
5988
6008
  });
5989
6009
  }
5990
6010
  }else{
5991
- data[item] = {
6011
+ data[item] = [{
5992
6012
  value: fileFieldValue,
5993
6013
  name: fileFieldDisplayValue.name,
5994
6014
  url: fileFieldDisplayValue.url + "?download=true",
5995
6015
  state: "uploaded"
5996
- };
6016
+ }];
5997
6017
  }
5998
6018
  }
5999
6019
  })
@@ -6069,12 +6089,12 @@ async function getEditFormInitApi(object, recordId, fields, options){
6069
6089
  if(uiSchema.form){
6070
6090
  try{
6071
6091
  var objectFormConfig = JSON.parse(uiSchema.form);
6072
- initialValues = objectFormConfig.initialValues;
6073
- if(initialValues){
6074
- initialValues = new Function("return " + initialValues)();
6092
+ var formInitialValuesFun = objectFormConfig.initialValues;
6093
+ if(formInitialValuesFun){
6094
+ formInitialValuesFun = new Function("return " + formInitialValuesFun)();
6075
6095
  }
6076
- if(typeof initialValues === "function"){
6077
- initialValues = initialValues.apply({doc: defaultValues || {} })
6096
+ if(typeof formInitialValuesFun === "function"){
6097
+ initialValues = formInitialValuesFun.apply({doc: defaultValues || {} , global: api.body.global})
6078
6098
  }
6079
6099
  }
6080
6100
  catch(ex){
@@ -6091,12 +6111,15 @@ async function getEditFormInitApi(object, recordId, fields, options){
6091
6111
  }
6092
6112
  // data下的变量需要在保存接口(getSaveApi)中被删除。
6093
6113
  payload.data = {
6094
- initialValues,
6095
- editFormInited: true
6114
+ ...initialValues
6096
6115
  }
6097
6116
  ${options.initApiAdaptor || ''}
6098
6117
  return payload;
6099
6118
  `,
6119
+ responseData: {
6120
+ initialValues: "$$",
6121
+ editFormInited: true
6122
+ },
6100
6123
  data: data,
6101
6124
  headers: {
6102
6125
  Authorization: "Bearer ${context.tenantId},${context.authToken}"
@@ -6503,6 +6526,8 @@ async function getObjectForm(objectSchema, ctx){
6503
6526
  },
6504
6527
  labelAlign,
6505
6528
  persistData: false,
6529
+ resetAfterSubmit: true,
6530
+ preventEnterSubmit: true,
6506
6531
  promptPageLeave: true,
6507
6532
  canAccessSuperData: false,
6508
6533
  name: `form_edit_${recordId}`,
@@ -6540,10 +6565,14 @@ async function getObjectForm(objectSchema, ctx){
6540
6565
  },
6541
6566
  "expression": `\${_master.objectName != '${objectSchema.name}' && _master.objectName}`
6542
6567
  },
6543
- {
6544
- "args": {},
6545
- "actionType": "closeDialog"
6546
- }
6568
+ // {
6569
+ // "actionType": "custom",
6570
+ // "script": "debugger;"
6571
+ // },
6572
+ // {
6573
+ // "args": {},
6574
+ // "actionType": "closeDialog"
6575
+ // }
6547
6576
  ]
6548
6577
  }
6549
6578
  }
@@ -6711,6 +6740,13 @@ async function getTableColumns(fields, options){
6711
6740
  }else if(field.type === 'html'){
6712
6741
  type = 'markdown';
6713
6742
  }
6743
+ let className = "";
6744
+ if(field.type === 'textarea'){
6745
+ className = 'min-w-56';
6746
+ }
6747
+ if(field.wrap === false){
6748
+ className += " whitespace-nowrap";
6749
+ }
6714
6750
  if(!field.hidden && !field.extra){
6715
6751
  columns.push(Object.assign({}, {
6716
6752
  name: field.name,
@@ -6721,7 +6757,7 @@ async function getTableColumns(fields, options){
6721
6757
  type: type,
6722
6758
  tpl: tpl,
6723
6759
  toggled: field.toggled,
6724
- className: field.type === 'textarea' ? 'min-w-56 whitespace-pre-wrap textarea' : "whitespace-nowrap",
6760
+ className,
6725
6761
  html: field.type === 'html' ? true : null
6726
6762
  // toggled: true
6727
6763
  }, field.amis, {name: field.name}));
@@ -7061,13 +7097,17 @@ async function getTableApi(mainObject, fields, options){
7061
7097
  }
7062
7098
 
7063
7099
  api.data.$term = "$term";
7100
+ api.data.term = "$term";
7064
7101
  api.data.$self = "$$";
7102
+ api.data.self = "$$";
7065
7103
  api.data.filter = "$filter";
7066
7104
  api.data.loaded = "${loaded}";
7067
7105
  api.data.listViewId = "${listViewId}";
7068
7106
  api.requestAdaptor = `
7069
7107
  // selfData 中的数据由 CRUD 控制. selfData中,只能获取到 CRUD 给定的data. 无法从数据链中获取数据.
7070
7108
  let selfData = JSON.parse(JSON.stringify(api.data.$self));
7109
+ // 保留一份初始data,以供自定义发送适配器中获取原始数据。
7110
+ const data = _.cloneDeep(api.data);
7071
7111
  try{
7072
7112
  // TODO: 不应该直接在这里取localStorage,应该从外面传入
7073
7113
  const listViewId = api.data.listViewId;
@@ -7213,7 +7253,6 @@ async function getTableApi(mainObject, fields, options){
7213
7253
  if(_.isEmpty(filters)){
7214
7254
  filters = userFilters;
7215
7255
  }else{
7216
- filters.push('and');
7217
7256
  filters.push(userFilters)
7218
7257
  }
7219
7258
  }
@@ -7251,29 +7290,9 @@ async function getTableApi(mainObject, fields, options){
7251
7290
  })
7252
7291
 
7253
7292
  if(enable_tree){
7254
- const records = payload.data.rows;
7255
- const treeRecords = [];
7256
- const getChildren = (records, childrenIds)=>{
7257
- if(!childrenIds){
7258
- return;
7259
- }
7260
- const children = _.filter(records, (record)=>{
7261
- return _.includes(childrenIds, record._id)
7262
- });
7263
- _.each(children, (item)=>{
7264
- if(item.children){
7265
- item.children = getChildren(records, item.children)
7266
- }
7267
- })
7268
- return children;
7269
- }
7270
-
7271
- _.each(records, (record)=>{
7272
- if(!record.parent){
7273
- treeRecords.push(Object.assign({}, record, {children: getChildren(records, record.children)}));
7274
- }
7275
- });
7276
- payload.data.rows = treeRecords;
7293
+ const records = payload.data.rows || [];
7294
+ const getTreeOptions = SteedosUI.getTreeOptions
7295
+ payload.data.rows = getTreeOptions(records,{"valueField":"_id"});
7277
7296
  }
7278
7297
 
7279
7298
 
@@ -7661,7 +7680,6 @@ async function getObjectCalendar(objectSchema, calendarOptions, options) {
7661
7680
  // ObjectForm会认作用域下的变量值
7662
7681
  // TODO: 待组件支持initValues属性后应该改掉,不应该通过data直接传值
7663
7682
  // TODO: 全天事件属性传入doc了但是没有生效,需要手动在ObjectForm中勾选全天事件
7664
- event.data = doc;
7665
7683
  const title = "新建 ${objectSchema.label}";
7666
7684
  doAction(
7667
7685
  {
@@ -7674,6 +7692,7 @@ async function getObjectCalendar(objectSchema, calendarOptions, options) {
7674
7692
  "type": "steedos-object-form",
7675
7693
  "objectApiName": "\${objectName}",
7676
7694
  "mode": "edit",
7695
+ "defaultData": doc,
7677
7696
  "onEvent": {
7678
7697
  "submitSucc": {
7679
7698
  "weight": 0,
@@ -7966,7 +7985,7 @@ const getRecordPermissions = async (objectName, recordId)=>{
7966
7985
  * @Author: baozhoutao@steedos.com
7967
7986
  * @Date: 2022-07-05 15:55:39
7968
7987
  * @LastEditors: Please set LastEditors
7969
- * @LastEditTime: 2023-04-11 13:13:00
7988
+ * @LastEditTime: 2023-04-20 11:43:14
7970
7989
  * @Description:
7971
7990
  */
7972
7991
 
@@ -8063,10 +8082,12 @@ async function getRecordDetailRelatedListSchema(objectName, recordId, relatedObj
8063
8082
  mainRelated[arr[0]] = arr[1];
8064
8083
  }
8065
8084
  }else {
8066
- const details = mainObjectUiSchema.details || [];
8085
+ const details = union(mainObjectUiSchema.details,mainObjectUiSchema.lookup_details) || [];
8067
8086
  for (const detail of details) {
8068
8087
  const arr = detail.split(".");
8069
- mainRelated[arr[0]] = arr[1];
8088
+ if(!has(mainRelated,arr[0])){
8089
+ mainRelated[arr[0]] = arr[1];
8090
+ }
8070
8091
  }
8071
8092
  }
8072
8093
  }
@@ -8271,13 +8292,17 @@ async function getRelatedListSchema(
8271
8292
  delete ctx.globalFilter;
8272
8293
 
8273
8294
  const adaptor = `
8274
- if(setDataToComponentId){
8275
- if(payload.data.count){
8276
- setTimeout(function(){
8277
- window.$("." + setDataToComponentId + " .antd-Crud").removeClass("hidden");
8278
- }, 10);
8279
- }
8280
- };
8295
+ try{
8296
+ if(setDataToComponentId){
8297
+ if(payload.data.count){
8298
+ setTimeout(function(){
8299
+ window.$("." + setDataToComponentId + " .antd-Crud").removeClass("hidden");
8300
+ }, 10);
8301
+ }
8302
+ };
8303
+ }catch(e){
8304
+ console.log(e);
8305
+ }
8281
8306
  `;
8282
8307
  const amisSchema = {
8283
8308
  "type": "steedos-object-table",
@@ -8288,7 +8313,8 @@ async function getRelatedListSchema(
8288
8313
  "filtersFunction": filtersFunction,
8289
8314
  "sort": listViewSort,
8290
8315
  "filterVisible": false,
8291
- adaptor,
8316
+ "requestAdaptor": ctx.requestAdaptor,
8317
+ "adaptor": adaptor + ctx.adaptor || '',
8292
8318
  "ctx": ctx
8293
8319
  };
8294
8320
  // console.log(`getRelatedListSchema amisSchema`, amisSchema);