@steedos-widgets/amis-object 1.2.19 → 1.2.26

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.
@@ -3517,7 +3517,7 @@ const getSteedosAuth = () => {
3517
3517
  * @Author: baozhoutao@steedos.com
3518
3518
  * @Date: 2022-08-16 17:02:08
3519
3519
  * @LastEditors: baozhoutao@steedos.com
3520
- * @LastEditTime: 2023-04-19 15:25:50
3520
+ * @LastEditTime: 2023-06-20 13:50:15
3521
3521
  * @Description:
3522
3522
  */
3523
3523
 
@@ -3528,14 +3528,14 @@ const Router$1 = {
3528
3528
  if(urlSearch.has('display')){
3529
3529
  return urlSearch.get('display')
3530
3530
  }
3531
- // const key = `tab.${tab_id}.display`;
3532
- const key = `page_display`;
3531
+ const key = `tab_${tab_id}_display`;
3532
+ // const key = `page_display`;
3533
3533
  const value = localStorage.getItem(key);
3534
3534
  return value ? value : 'grid'
3535
3535
  },
3536
3536
 
3537
3537
  setTabDisplayAs(tab_id, displayAs){
3538
- const key = `tab.${tab_id}.display`;
3538
+ const key = `tab_${tab_id}_display`;
3539
3539
  localStorage.setItem(key, displayAs);
3540
3540
  },
3541
3541
  getAppPath({formFactor, appId}){
@@ -3549,15 +3549,10 @@ const Router$1 = {
3549
3549
  },
3550
3550
  getObjectDetailPath(props){
3551
3551
  const {formFactor, appId, objectName, recordId, listViewName, _templateType} = props;
3552
- // var urlParams = new URLSearchParams(window.location.search);
3553
- // if(objectName === 'instances'){
3554
- // return `/workflow/space/\${context.tenantId}/\${listName}/${recordId}`;
3555
- // }
3556
- const displayAs = Router$1.getTabDisplayAs(objectName); //urlParams.get("display") ||
3557
3552
  if(_templateType === 'JavaScript'){
3558
- return `/app/${appId}/${objectName}/view/${recordId}?display=${displayAs}&side_object=<%=item.objectName%>&side_listview_id=<%=item.listName%>`;
3553
+ return `/app/${appId}/${objectName}/view/${recordId}?side_object=<%=item.objectName%>&side_listview_id=<%=item.listName%>`;
3559
3554
  }
3560
- return `/app/${appId}/${objectName}/view/${recordId}?display=${displayAs}&side_object=\${objectName}&side_listview_id=\${listName}`;
3555
+ return `/app/${appId}/${objectName}/view/${recordId}?side_object=\${objectName}&side_listview_id=\${listName}`;
3561
3556
  },
3562
3557
  getObjectRelatedViewPath({formFactor, appId, masterObjectName, masterRecordId, objectName, foreignKey}){
3563
3558
  return `/app/${appId}/${masterObjectName}/${masterRecordId}/${objectName}/grid?related_field_name=${foreignKey}`;
@@ -6307,7 +6302,10 @@ async function getObjectFieldsFilterFormSchema(ctx) {
6307
6302
  const formSchema = {
6308
6303
  "type": "service",
6309
6304
  "visibleOn": "this.filterFormSearchableFields && this.filterFormSearchableFields.length",
6310
- "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",
6305
+ "className": ctx.formFactor === 'SMALL' ? "slds-filters__body p-0 mb-2 overflow-y-auto overflow-x-hidden" : "slds-filters__body p-0 sm:grid sm:gap-2 sm:grid-cols-4 mb-2",
6306
+ "style":{
6307
+ "max-height":ctx.formFactor === 'SMALL'?"30vh":"unset"
6308
+ },
6311
6309
  "schemaApi": {
6312
6310
  method: 'post',
6313
6311
  url: `\${context.rootUrl}/graphql?reload=\${filterFormSearchableFields|join}`,
@@ -6396,28 +6394,42 @@ async function getObjectFieldsFilterBarSchema(objectSchema, ctx) {
6396
6394
  // }
6397
6395
  // }
6398
6396
  // listView.handleFilterSubmit(Object.assign({}, removedValues, filterFormValues));
6399
-
6400
- let isMobile = Steedos.isMobile();
6401
- if(isMobile){
6402
- // 手机端点击搜索的时候自动收起搜索栏
6403
- let resizeWindow = function(){
6404
- //触发amis crud 高度重算
6405
- setTimeout(()=>{
6406
- window.dispatchEvent(new Event("resize"))
6407
- }, 500);
6408
- }
6409
- const filterService = filterForm.context.getComponents().find(function(n){
6410
- return n.props.type === "service";
6411
- });
6412
- filterService.setData({showFieldsFilter: false});
6413
- resizeWindow();
6414
- // 使用filterForm.getValues()的话,并不能拿到本地存储中的过滤条件,所以需要从event.data中取。
6415
- let filterFormValues = event.data;
6416
- let isFieldsFilterEmpty = SteedosUI.isFilterFormValuesEmpty(filterFormValues);
6417
- let crud = SteedosUI.getClosestAmisComponentByType(scope, "crud");
6418
- let crudService = crud && SteedosUI.getClosestAmisComponentByType(crud.context, "service");
6419
- crudService && crudService.setData({isFieldsFilterEmpty, showFieldsFilter: false});
6397
+ // 点击搜索的时候自动收起搜索栏
6398
+ let resizeWindow = function(){
6399
+ //触发amis crud 高度重算
6400
+ setTimeout(()=>{
6401
+ window.dispatchEvent(new Event("resize"))
6402
+ }, 500);
6420
6403
  }
6404
+ const filterService = filterForm.context.getComponents().find(function(n){
6405
+ return n.props.type === "service";
6406
+ });
6407
+ let showFieldsFilter = false;
6408
+ const isMobile = window.innerWidth < 768;
6409
+ if(event.data.__from_fields_filter_settings_confirm){
6410
+ // 如果是从设置搜索项点击确认按钮触发的搜索事件不应该自动关闭搜索栏
6411
+ showFieldsFilter = true;
6412
+ }
6413
+ else if(isMobile){
6414
+ // 如果是手机端,点击搜索后自动关闭搜索栏
6415
+ showFieldsFilter = false;
6416
+ }
6417
+ else if(event.data.displayAs === "split") {
6418
+ // PC上分栏模式下的列表,始终按手机上效果处理,即自动关闭搜索栏
6419
+ showFieldsFilter = false;
6420
+ }
6421
+ else if(window.innerHeight >= 1200){
6422
+ // 高分辨率屏幕(2k+),列表高度比较高,没必要自动关闭搜索栏
6423
+ showFieldsFilter = true;
6424
+ }
6425
+ filterService.setData({showFieldsFilter});
6426
+ resizeWindow();
6427
+ // 使用filterForm.getValues()的话,并不能拿到本地存储中的过滤条件,所以需要从event.data中取。
6428
+ let filterFormValues = event.data;
6429
+ let isFieldsFilterEmpty = SteedosUI.isFilterFormValuesEmpty(filterFormValues);
6430
+ let crud = SteedosUI.getClosestAmisComponentByType(scope, "crud");
6431
+ let crudService = crud && SteedosUI.getClosestAmisComponentByType(crud.context, "service");
6432
+ crudService && crudService.setData({isFieldsFilterEmpty, showFieldsFilter});
6421
6433
  `;
6422
6434
  const onCancelScript = `
6423
6435
  const scope = event.context.scoped;
@@ -6456,12 +6468,9 @@ async function getObjectFieldsFilterBarSchema(objectSchema, ctx) {
6456
6468
  setTimeout(()=>{
6457
6469
  window.dispatchEvent(new Event("resize"))
6458
6470
  }, 100);
6459
- let isMobile = Steedos.isMobile();
6460
- if(isMobile){
6461
- // 手机端移除搜索按钮上的红点
6462
- let crudService = scope.getComponentById("service_listview_" + event.data.objectName);
6463
- crudService && crudService.setData({isFieldsFilterEmpty: true, showFieldsFilter: false});
6464
- }
6471
+ // 移除搜索按钮上的红点
6472
+ let crudService = scope.getComponentById("service_listview_" + event.data.objectName);
6473
+ crudService && crudService.setData({isFieldsFilterEmpty: true, showFieldsFilter: false});
6465
6474
  `;
6466
6475
  const dataProviderInited = `
6467
6476
  const objectName = data.objectName;
@@ -6514,17 +6523,11 @@ async function getObjectFieldsFilterBarSchema(objectSchema, ctx) {
6514
6523
  || (_.isArray(n) && _.isEmpty(n.filter(function(item){return !_.isNil(item)})))
6515
6524
  || (_.isString(n) && n.length === 0);
6516
6525
  });
6517
- // 有过滤条件时自动展开搜索栏
6526
+ // 有过滤条件时只显示搜索按钮上的红点,不自动展开搜索栏
6518
6527
  if(!_.isEmpty(omitedEmptyFormValue)){
6519
- let isMobile = Steedos.isMobile();
6520
- if(isMobile){
6521
- // 手机端不展开,只显示搜索按钮上的红点
6522
- let crudService = SteedosUI.getRef(data.$scopeId).getComponentById("service_listview_" + data.objectName)
6523
- crudService && crudService.setData({isFieldsFilterEmpty: false});
6524
- }
6525
- else{
6526
- setData({ showFieldsFilter: true });
6527
- }
6528
+ let crudService = SteedosUI.getRef(data.$scopeId).getComponentById("service_listview_" + data.objectName)
6529
+ crudService && crudService.setData({isFieldsFilterEmpty: false});
6530
+ // setData({ showFieldsFilter: true });//自动展开搜索栏
6528
6531
  }
6529
6532
  }
6530
6533
  }
@@ -6790,7 +6793,10 @@ async function getObjectFieldsFilterBarSchema(objectSchema, ctx) {
6790
6793
  },
6791
6794
  {
6792
6795
  "actionType": "click",
6793
- "componentId": btnSearchId
6796
+ "componentId": btnSearchId,
6797
+ "args": {
6798
+ "__from_fields_filter_settings_confirm": true
6799
+ }
6794
6800
  },
6795
6801
  {
6796
6802
  "componentId": "",
@@ -7322,7 +7328,8 @@ const getNewListviewButtonSchema = ()=>{
7322
7328
  "name":"",
7323
7329
  "label":"",
7324
7330
  "filters":"",
7325
- "shared":false
7331
+ "shared":false,
7332
+ "object_name": "${targetObjectName}",
7326
7333
  },
7327
7334
  "fieldsExtend": fieldsExtend$4(),
7328
7335
  "fields": fields$1(),
@@ -7369,13 +7376,11 @@ function fields$1(){
7369
7376
  "object_name",
7370
7377
  "filter_scope",
7371
7378
  "show_count",
7372
- "columns.$.field",
7373
- "columns.$.width",
7374
- "sort.$.field_name",
7375
- "sort.$.order",
7379
+ "columns",
7380
+ "sort",
7376
7381
  "filters",
7377
- "mobile_columns.$.field",
7378
- "searchable_fields.$.field",
7382
+ "mobile_columns",
7383
+ "searchable_fields",
7379
7384
  "is_system",
7380
7385
  "shared"
7381
7386
  ]
@@ -7388,7 +7393,8 @@ function fieldsExtend$4(){
7388
7393
  },
7389
7394
  "name": {
7390
7395
  "amis": {
7391
- "hidden": true
7396
+ "hidden": true,
7397
+ "required": false
7392
7398
  }
7393
7399
  },
7394
7400
  "object_name": {
@@ -7398,37 +7404,56 @@ function fieldsExtend$4(){
7398
7404
  },
7399
7405
  "filter_scope": {
7400
7406
  "amis": {
7401
- "hidden": true
7407
+ "hidden": true,
7408
+ "required": false
7402
7409
  }
7403
7410
  },
7404
7411
  "columns": {
7405
7412
  "amis": {
7406
- "hidden": true
7413
+ "hidden": true,
7414
+ "required": false
7415
+ }
7416
+ },
7417
+ "mobile_columns":{
7418
+ "amis": {
7419
+ "hidden": true,
7420
+ "required": false
7421
+ }
7422
+ },
7423
+ "searchable_fields":{
7424
+ "amis": {
7425
+ "hidden": true,
7426
+ "required": false
7407
7427
  }
7408
7428
  },
7409
7429
  "filter_fields": {
7410
7430
  "amis": {
7411
- "hidden": true
7431
+ "hidden": true,
7432
+ "required": false
7412
7433
  }
7413
7434
  },
7414
7435
  "scrolling_mode": {
7415
7436
  "amis": {
7416
- "hidden": true
7437
+ "hidden": true,
7438
+ "required": false
7417
7439
  }
7418
7440
  },
7419
7441
  "sort": {
7420
7442
  "amis": {
7421
- "hidden": true
7443
+ "hidden": true,
7444
+ "required": false
7422
7445
  }
7423
7446
  },
7424
7447
  "show_count": {
7425
7448
  "amis": {
7426
- "hidden": true
7449
+ "hidden": true,
7450
+ "required": false
7427
7451
  }
7428
7452
  },
7429
7453
  "type": {
7430
7454
  "amis": {
7431
- "hidden": true
7455
+ "hidden": true,
7456
+ "required": false
7432
7457
  }
7433
7458
  },
7434
7459
  "shared": {
@@ -8213,14 +8238,14 @@ const getDisplayAsButton = function(objectName, showDisplayAs){
8213
8238
  {
8214
8239
  "type": "button",
8215
8240
  "label": instance.t('frontend_display_type_is_table'),
8216
- "onClick": "let url = document.location.pathname; var urlSearch = new URLSearchParams(document.location.search); if(urlSearch.get(\"side_object\") && urlSearch.get(\"side_listview_id\")){url=`/app/${props.data.appId}/${urlSearch.get(\"side_object\")}/grid/${urlSearch.get(\"side_listview_id\")}`;}; props.env.jumpTo(url + '?display=grid');",
8241
+ "onClick": "const key = 'tab_"+objectName+"_display';localStorage.setItem(key, 'grid');let url = document.location.pathname; var urlSearch = new URLSearchParams(document.location.search); if(urlSearch.get(\"side_object\") && urlSearch.get(\"side_listview_id\")){url=`/app/${props.data.appId}/${urlSearch.get(\"side_object\")}/grid/${urlSearch.get(\"side_listview_id\")}`;}; props.env.jumpTo(url + '?display=grid');",
8217
8242
  "rightIcon": displayAs != 'split' ? "fa fa-check" : null,
8218
8243
  "rightIconClassName": "m-l-sm"
8219
8244
  },
8220
8245
  {
8221
8246
  "type": "button",
8222
8247
  "label": instance.t('frontend_display_type_is_split'),
8223
- "onClick": "const url = document.location.pathname + '?display=split'; props.env.jumpTo(url);",
8248
+ "onClick": "const key = 'tab_"+objectName+"_display';localStorage.setItem(key, 'split');const url = document.location.pathname + '?display=split'; props.env.jumpTo(url);",
8224
8249
  "rightIcon": displayAs === 'split' ? "fa fa-check" : null,
8225
8250
  "rightIconClassName": "m-l-sm"
8226
8251
  }
@@ -8251,36 +8276,38 @@ const filterForm = scope.getComponents().find(function(n){
8251
8276
  const filterService = filterForm.context.getComponents().find(function(n){
8252
8277
  return n.props.type === "service";
8253
8278
  });
8254
- // filterService.setData({showFieldsFilter: !!!filterService.props.data.showFieldsFilter});
8279
+ let toShowFieldsFilter = !!!filterService.props.data.showFieldsFilter;
8280
+ filterService.setData({showFieldsFilter: toShowFieldsFilter});
8255
8281
  let resizeWindow = function(){
8256
8282
  //触发amis crud 高度重算
8257
8283
  setTimeout(()=>{
8258
8284
  window.dispatchEvent(new Event("resize"))
8259
8285
  }, 500);
8260
8286
  }
8261
- let isMobile = Steedos.isMobile();
8262
- if(filterService.props.data.showFieldsFilter){
8263
- if(isMobile){
8264
- // 手机上只能通过取消按钮来关闭搜索栏
8265
- return;
8266
- }
8267
- let buttonCancel = SteedosUI.getClosestAmisComponentByType(filterForm.context, "button", {
8268
- direction: "down",
8269
- name: "btn_filter_form_cancel"
8270
- });
8271
- buttonCancel.props.dispatchEvent('click', {}).then(function(){
8272
- resizeWindow();
8273
- });
8274
- }
8275
- else{
8276
- filterService.setData({showFieldsFilter: true});
8277
- resizeWindow();
8278
- if(isMobile){
8279
- // 手机端在显示搜索栏时隐藏刷新按钮
8280
- let crudService = scope.getComponentById("service_listview_" + event.data.objectName);
8281
- crudService && crudService.setData({showFieldsFilter: true});
8282
- }
8283
- }
8287
+ resizeWindow();
8288
+ // 手机端在显示搜索栏时隐藏crud上的刷新按钮,因为点击后crud高度显示有问题
8289
+ let crudService = scope.getComponentById("service_listview_" + event.data.objectName);
8290
+ crudService && crudService.setData({showFieldsFilter: toShowFieldsFilter});
8291
+ // if(filterService.props.data.showFieldsFilter){
8292
+ // if(isMobile){
8293
+ // // 手机上只能通过取消按钮来关闭搜索栏
8294
+ // return;
8295
+ // }
8296
+ // let buttonCancel = SteedosUI.getClosestAmisComponentByType(filterForm.context, "button", {
8297
+ // direction: "down",
8298
+ // name: "btn_filter_form_cancel"
8299
+ // });
8300
+ // buttonCancel.props.dispatchEvent('click', {}).then(function(){
8301
+ // resizeWindow();
8302
+ // });
8303
+ // }
8304
+ // else{
8305
+ // if(isMobile){
8306
+ // // 手机端在显示搜索栏时隐藏crud上的刷新按钮,因为点击后crud高度显示有问题
8307
+ // let crudService = scope.getComponentById("service_listview_" + event.data.objectName);
8308
+ // crudService && crudService.setData({showFieldsFilter: true});
8309
+ // }
8310
+ // }
8284
8311
  `;
8285
8312
 
8286
8313
 
@@ -8326,7 +8353,7 @@ function getObjectHeaderToolbar(mainObject, formFactor, {showDisplayAs = false,
8326
8353
  },
8327
8354
  },
8328
8355
  filterVisible ? {
8329
- "label": "",
8356
+ "label": instance.t('frontend_button_search_tooltip'),
8330
8357
  "icon": "fa fa-search",
8331
8358
  "type": "button",
8332
8359
  "tooltip": instance.t('frontend_button_search_tooltip'),
@@ -8379,12 +8406,23 @@ function getObjectHeaderToolbar(mainObject, formFactor, {showDisplayAs = false,
8379
8406
  "className": "bg-white p-2 rounded border-gray-300 text-gray-500"
8380
8407
  },
8381
8408
  // getExportExcelToolbarButtonSchema(),
8409
+ getSettingListviewToolbarButtonSchema(),
8410
+ getDisplayAsButton(mainObject?.name),
8382
8411
  filterVisible ? {
8383
- "label": "",
8412
+ "label": instance.t('frontend_button_search_tooltip'),
8384
8413
  "icon": "fa fa-search",
8385
8414
  "tooltip": instance.t('frontend_button_search_tooltip'),
8386
8415
  "tooltipPlacement": "bottom",
8387
8416
  "type": "button",
8417
+ "badge": {
8418
+ "offset": [
8419
+ -5,
8420
+ 1
8421
+ ],
8422
+ "size":8,
8423
+ "animation": true,
8424
+ "visibleOn": "${isFieldsFilterEmpty == false}"
8425
+ },
8388
8426
  "align": "right",
8389
8427
  "className": "bg-white p-2 rounded border-gray-300 text-gray-500",
8390
8428
  "onEvent": {
@@ -8397,9 +8435,7 @@ function getObjectHeaderToolbar(mainObject, formFactor, {showDisplayAs = false,
8397
8435
  ]
8398
8436
  }
8399
8437
  }
8400
- } : {},
8401
- getSettingListviewToolbarButtonSchema(),
8402
- getDisplayAsButton(showDisplayAs)
8438
+ } : {}
8403
8439
  // {
8404
8440
  // "type": "search-box",
8405
8441
  // "align": "right",
@@ -9029,6 +9065,58 @@ async function lookupToAmisPicker(field, readonly, ctx){
9029
9065
  "actions": [
9030
9066
  {
9031
9067
  "actionType": "reload"
9068
+ },
9069
+ {
9070
+ "actionType": "custom",
9071
+ "script": `
9072
+ const masterRecord = event.data._master?.record;
9073
+ const fieldConfig = ${JSON.stringify(field)};
9074
+ let reference_to = fieldConfig.reference_to;
9075
+ let saveValue;
9076
+ const newRecord = {
9077
+ _id: event.data.result.data.recordId,
9078
+ ...event.data.__super.__super
9079
+ }
9080
+ const saveField = fieldConfig.reference_to_field || '_id';
9081
+ const saveFieldValue = newRecord[saveField];
9082
+
9083
+ if( fieldConfig._reference_to && (_.isArray(fieldConfig._reference_to) || _.isFunction(fieldConfig._reference_to) || fieldConfig._reference_to.startsWith('function') ) ){
9084
+
9085
+ const fieldValue = masterRecord ? masterRecord[fieldConfig.name] : {o: reference_to, ids: []};
9086
+ const baseSaveValue = {
9087
+ o: reference_to,
9088
+ ids: [saveFieldValue]
9089
+ };
9090
+ if(fieldValue && fieldValue.o){
9091
+ if(fieldValue.o === reference_to){
9092
+ saveValue = fieldConfig.multiple ? { o: reference_to, ids: fieldValue.ids.concat(saveFieldValue)} : baseSaveValue;
9093
+ }else{
9094
+ saveValue = baseSaveValue;
9095
+ }
9096
+ }else{
9097
+ saveValue = baseSaveValue;
9098
+ }
9099
+
9100
+ }else{
9101
+ if(fieldConfig.multiple){
9102
+ // TODO: 连续新建多个记录时,因为获取的主记录不是实时的,所以只会勾选最后一个新建的记录。
9103
+ const fieldValue = (masterRecord && masterRecord[fieldConfig.name]) || [];
9104
+ saveValue = fieldValue.concat(saveFieldValue);
9105
+ }else{
9106
+ saveValue = saveFieldValue;
9107
+ }
9108
+ }
9109
+
9110
+ const ctx = ${JSON.stringify(ctx)};
9111
+ const componentId = ctx.defaults.formSchema.id ? 'service-'+ctx.defaults.formSchema.id : 'new-'+ctx.defaults.formSchema.objectApiName;
9112
+ doAction({
9113
+ actionType: 'setValue',
9114
+ componentId: componentId,
9115
+ args: {
9116
+ value: { [fieldConfig.name]: saveValue }
9117
+ }
9118
+ });
9119
+ `
9032
9120
  }
9033
9121
  ]
9034
9122
  };
@@ -9259,7 +9347,7 @@ async function lookupToAmis(field, readonly, ctx){
9259
9347
  type: 'steedos-field-lookup',
9260
9348
  field,
9261
9349
  readonly,
9262
- ctx: {},
9350
+ ctx,
9263
9351
  }
9264
9352
  // return await lookupToAmisGroup(field, readonly, ctx);
9265
9353
  }
@@ -9413,8 +9501,8 @@ async function getIdsPickerSchema(field, readonly, ctx){
9413
9501
  /*
9414
9502
  * @Author: baozhoutao@steedos.com
9415
9503
  * @Date: 2023-01-13 17:27:54
9416
- * @LastEditors: Please set LastEditors
9417
- * @LastEditTime: 2023-05-31 13:34:22
9504
+ * @LastEditors: liaodaxue
9505
+ * @LastEditTime: 2023-06-16 15:58:21
9418
9506
  * @Description:
9419
9507
  */
9420
9508
 
@@ -9466,6 +9554,7 @@ const getHtmlFieldSchema = (field, readonly, ctx)=>{
9466
9554
  }else {
9467
9555
  return {
9468
9556
  "type": "input-rich-text",
9557
+ "receiver": "${context.rootUrl}/s3/images",
9469
9558
  "name": field.name
9470
9559
  }
9471
9560
  // return {
@@ -11149,13 +11238,13 @@ async function getTableApi(mainObject, fields, options){
11149
11238
  const masterRecord = self._master.record;
11150
11239
  const masterObjectName = self._master.objectName;
11151
11240
  let relatedValue = self._master.recordId;
11152
- if(refField.reference_to_field && refField.reference_to_field != '_id'){
11241
+ if(refField && refField.reference_to_field && refField.reference_to_field != '_id'){
11153
11242
  relatedValue = masterRecord[refField.reference_to_field]
11154
11243
  }
11155
11244
  let relatedFilters;
11156
11245
  if (
11157
- refField._reference_to ||
11158
- (refField.reference_to && !_.isString(refField.reference_to))
11246
+ refField && (refField._reference_to ||
11247
+ (refField.reference_to && !_.isString(refField.reference_to)))
11159
11248
  ) {
11160
11249
  relatedFilters = [
11161
11250
  [relatedKey + "/o", "=", masterObjectName],
@@ -11305,7 +11394,7 @@ function getRecordPermissionsApi(object, recordId, options){
11305
11394
 
11306
11395
  const API_CACHE = 100;
11307
11396
 
11308
- function getReadonlyFormAdaptor(object, fields){
11397
+ function getReadonlyFormAdaptor(object, fields, options){
11309
11398
  let scriptStr = '';
11310
11399
  const selectFields = ___default__namespace.filter(fields, function(field){return field.name.indexOf('.') < 0 && ((field.type == 'select' && field.options) || ((field.type == 'lookup' || field.type == 'master_detail') && !field.reference_to))});
11311
11400
  const gridAndObjectFieldsName = ___default__namespace.map(___default__namespace.filter(fields, function(field){return field.name.indexOf('.') < 0 && (field.type === 'object' || field.type === 'grid')}), 'name');
@@ -11345,9 +11434,16 @@ function getReadonlyFormAdaptor(object, fields){
11345
11434
 
11346
11435
  return `
11347
11436
  if(payload.data.data.length === 0){
11348
- return {
11349
- status: 2,
11350
- msg: "无法找到记录"
11437
+ var isEditor = !!${options && options.isEditor};
11438
+ if(isEditor){
11439
+ // 设计器中始终显示表单,有记录则显示第一条记录,没记录时显示为空表单
11440
+ payload.data.data = [{}];
11441
+ }
11442
+ else{
11443
+ return {
11444
+ status: 2,
11445
+ msg: "无法找到记录"
11446
+ }
11351
11447
  }
11352
11448
  }
11353
11449
  if(payload.data.data){
@@ -11364,7 +11460,7 @@ function getReadonlyFormAdaptor(object, fields){
11364
11460
  var record = _.cloneDeep(data);
11365
11461
  try{
11366
11462
  _.each(gridAndObjectFieldsName, function(name){
11367
- data[name] = data._display[name];
11463
+ data[name] = data._display && data._display[name];
11368
11464
  })
11369
11465
  }catch(e){
11370
11466
  console.error(e)
@@ -11385,10 +11481,10 @@ function getReadonlyFormAdaptor(object, fields){
11385
11481
  async function getReadonlyFormInitApi(object, recordId, fields, options){
11386
11482
  return {
11387
11483
  method: "post",
11388
- url: getApi$2()+"&recordId=${recordId}",
11484
+ url: getApi$2() + '&objectName=${objectName}' + "&recordId=${recordId}",
11389
11485
  cache: API_CACHE,
11390
11486
  // requestAdaptor: "console.log('getReadonlyFormInitApi requestAdaptor', api);return api;",
11391
- adaptor: getReadonlyFormAdaptor(object, fields),
11487
+ adaptor: getReadonlyFormAdaptor(object, fields, options),
11392
11488
  data: await getFindOneQuery$1(object, recordId, fields, options),
11393
11489
  headers: {
11394
11490
  Authorization: "Bearer ${context.tenantId},${context.authToken}"
@@ -12652,6 +12748,8 @@ async function getObjectForm(objectSchema, ctx){
12652
12748
  };
12653
12749
  if(formSchema.id){
12654
12750
  amisSchema.id = `service-${formSchema.id}`;
12751
+ }else {
12752
+ amisSchema.id = `new-${objectSchema.name}`;
12655
12753
  }
12656
12754
  return amisSchema;
12657
12755
  }
@@ -12818,8 +12916,8 @@ const getRecordPermissions = async (objectName, recordId)=>{
12818
12916
  /*
12819
12917
  * @Author: baozhoutao@steedos.com
12820
12918
  * @Date: 2022-07-05 15:55:39
12821
- * @LastEditors: Please set LastEditors
12822
- * @LastEditTime: 2023-05-17 09:09:33
12919
+ * @LastEditors: liaodaxue
12920
+ * @LastEditTime: 2023-06-20 14:05:50
12823
12921
  * @Description:
12824
12922
  */
12825
12923
 
@@ -12862,10 +12960,11 @@ async function getObjectRelatedList(
12862
12960
  if(!___default.isEmpty(relatedLists)){
12863
12961
  for (const relatedList of relatedLists) {
12864
12962
  const arr = relatedList.related_field_fullname.split(".");
12963
+ const foreign_key = arr[2] ? arr[1]+'.'+arr[2] : arr[1];
12865
12964
  related.push({
12866
12965
  masterObjectName: objectName,
12867
12966
  object_name: arr[0],
12868
- foreign_key: arr[1],
12967
+ foreign_key,
12869
12968
  label: relatedList.label,
12870
12969
  columns: relatedList.field_names,
12871
12970
  sort: relatedList.sort,
@@ -12878,10 +12977,11 @@ async function getObjectRelatedList(
12878
12977
  const details = [].concat(uiSchema.details || []);
12879
12978
  for (const detail of details) {
12880
12979
  const arr = detail.split(".");
12980
+ const foreign_key = arr[2] ? arr[1]+'.'+arr[2] : arr[1];
12881
12981
  related.push({
12882
12982
  masterObjectName: objectName,
12883
12983
  object_name: arr[0],
12884
- foreign_key: arr[1]
12984
+ foreign_key
12885
12985
  });
12886
12986
  }
12887
12987
  }
@@ -12913,14 +13013,16 @@ async function getRecordDetailRelatedListSchema(objectName, recordId, relatedObj
12913
13013
  if(!___default.isEmpty(mainRelatedLists)){
12914
13014
  for (const relatedList of mainRelatedLists) {
12915
13015
  const arr = relatedList.related_field_fullname.split(".");
12916
- mainRelated[arr[0]] = arr[1];
13016
+ const foreign_key_value = arr[2] ? arr[1]+'.'+arr[2] : arr[1];
13017
+ mainRelated[arr[0]] = foreign_key_value;
12917
13018
  }
12918
13019
  }else {
12919
13020
  const details = ___default.union(mainObjectUiSchema.details,mainObjectUiSchema.lookup_details) || [];
12920
13021
  for (const detail of details) {
12921
13022
  const arr = detail.split(".");
13023
+ const foreign_key_value = arr[2] ? arr[1]+'.'+arr[2] : arr[1];
12922
13024
  if(!___default.has(mainRelated,arr[0])){
12923
- mainRelated[arr[0]] = arr[1];
13025
+ mainRelated[arr[0]] = foreign_key_value;
12924
13026
  }
12925
13027
  }
12926
13028
  }
@@ -16753,6 +16855,7 @@ var getSchema = function (field, value, ctx) { return __awaiter(void 0, void 0,
16753
16855
  "body": [
16754
16856
  {
16755
16857
  "type": "select",
16858
+ "inputClassName": "select_left",
16756
16859
  "name": leftName,
16757
16860
  "options": options,
16758
16861
  "value": "".concat(value.o)
@@ -17129,11 +17232,22 @@ var AmisObjectForm = function (props) { return __awaiter(void 0, void 0, void 0,
17129
17232
  if (defaultData) {
17130
17233
  // 让ObjectForm支持props中的dafaultData属性与上层组件配置的defaultData混合
17131
17234
  // 为了解决相关表新建时如果是表单类型微页面,因为找不到ObjectForm在哪层而造成无法设置ObjectForm的defaultData的问题
17132
- amisSchema.data.defaultData = __assign$2({ "&": "${defaultData}" }, defaultData);
17235
+ amisSchema.data.defaultData = __assign$2({ "&": "${defaultData}" }, defaultData //这里的defaultData是form组件的defaultData属性值
17236
+ );
17133
17237
  }
17134
17238
  uiSchema = schema.uiSchema;
17135
17239
  return [3 /*break*/, 4];
17136
- case 2: return [4 /*yield*/, getViewSchema(objectApiName, recordId, options)];
17240
+ case 2:
17241
+ // formInitProps
17242
+ if (!recordId && props.$$editor) {
17243
+ // 设计器中只读表单返回第一条记录
17244
+ options.formInitProps = {
17245
+ filters: [],
17246
+ queryOptions: "top: 1",
17247
+ isEditor: true
17248
+ };
17249
+ }
17250
+ return [4 /*yield*/, getViewSchema(objectApiName, recordId, options)];
17137
17251
  case 3:
17138
17252
  schema = _d.sent();
17139
17253
  amisSchema = schema.amisSchema;
@@ -17164,13 +17278,10 @@ var AmisObjectListView = function (props) { return __awaiter(void 0, void 0, voi
17164
17278
  return __generator(this, function (_g) {
17165
17279
  switch (_g.label) {
17166
17280
  case 0:
17167
- // console.time('AmisObjectListView')
17168
- console.log("AmisObjectListView props", props);
17169
17281
  $schema = props.$schema, top = props.top, perPage = props.perPage, _a = props.showHeader, showHeader = _a === void 0 ? true : _a, data = props.data, defaultData = props.defaultData, _b = props.className, className = _b === void 0 ? "" : _b, crudClassName = props.crudClassName, _c = props.showDisplayAs, showDisplayAs = _c === void 0 ? false : _c, sideSchema = props.sideSchema, props.columnsTogglable, _e = props.filterVisible, filterVisible = _e === void 0 ? true : _e, headerToolbarItems = props.headerToolbarItems, rowClassNameExpr = props.rowClassNameExpr;
17170
17282
  headerSchema = props.headerSchema;
17171
17283
  ctx = props.ctx;
17172
17284
  listName = (defaultData === null || defaultData === void 0 ? void 0 : defaultData.listName) || (data === null || data === void 0 ? void 0 : data.listName) || (props === null || props === void 0 ? void 0 : props.listName);
17173
- console.log('AmisObjectListView ==listName=>', listName);
17174
17285
  defaults = {};
17175
17286
  objectApiName = props.objectApiName || "space_users";
17176
17287
  if (!ctx) {
@@ -17225,7 +17336,7 @@ var AmisObjectListView = function (props) { return __awaiter(void 0, void 0, voi
17225
17336
  "actions": [
17226
17337
  {
17227
17338
  "args": {
17228
- "url": "/app/${appId}/${objectName}/view/${event.data.result.data.recordId}?display=${ls:page_display || 'grid'}&side_object=${objectName}&side_listview_id=${listName}",
17339
+ "url": "/app/${appId}/${objectName}/view/${event.data.result.data.recordId}?side_object=${objectName}&side_listview_id=${listName}",
17229
17340
  "blank": false
17230
17341
  },
17231
17342
  "actionType": "link",
@@ -17297,8 +17408,8 @@ var AmisObjectListView = function (props) { return __awaiter(void 0, void 0, voi
17297
17408
  "headers": {
17298
17409
  "Authorization": "Bearer ${context.tenantId},${context.authToken}"
17299
17410
  },
17300
- "requestAdaptor": "console.log('service listview schemaApi requestAdaptor======>');api.data={query: '{spaces__findOne(id: \"none\"){_id,name}}'};return api;",
17301
- "adaptor": "\n // console.log('service listview schemaApi adaptor....', api.body); \n let { appId, objectName, defaultListName: listName, display, formFactor: defaultFormFactor} = api.body;\n if(api.body.listName){\n listName = api.body.listName;\n }\n return new Promise((resolve)=>{\n const listViewSchemaProps = ".concat(JSON.stringify(listViewSchemaProps), ";\n const formFactor = ([\"split\"].indexOf(display) > -1) ? 'SMALL': defaultFormFactor;\n listViewSchemaProps.formFactor = formFactor;\n // console.log(\"====listViewSchemaProps===>\", listName, listViewSchemaProps)\n window.getListSchema(appId, objectName, listName, listViewSchemaProps).then((schema)=>{\n payload.data = schema.amisSchema;\n // console.log(\"payload================>\", payload)\n resolve(payload)\n });\n });\n ")
17411
+ "requestAdaptor": "api.data={query: '{spaces__findOne(id: \"none\"){_id,name}}'};return api;",
17412
+ "adaptor": "\n // console.log('service listview schemaApi adaptor....', api.body); \n let { appId, objectName, defaultListName: listName, display, formFactor: defaultFormFactor} = api.body;\n if(api.body.listName){\n listName = api.body.listName;\n }\n return new Promise((resolve)=>{\n const listViewSchemaProps = ".concat(JSON.stringify(listViewSchemaProps), ";\n const formFactor = ([\"split\"].indexOf(display) > -1) ? 'SMALL': defaultFormFactor;\n listViewSchemaProps.formFactor = formFactor;\n listViewSchemaProps.displayAs = display;\n // console.log(\"====listViewSchemaProps===>\", listName, display, listViewSchemaProps)\n window.getListSchema(appId, objectName, listName, listViewSchemaProps).then((schema)=>{\n payload.data = schema.amisSchema;\n // console.log(\"payload================>\", payload)\n resolve(payload)\n });\n });\n ")
17302
17413
  },
17303
17414
  // "body": body,
17304
17415
  // "data": serviceData
@@ -18098,7 +18209,7 @@ var AmisGlobalFooter = function (props) { return __awaiter(void 0, void 0, void
18098
18209
  schemaApi: {
18099
18210
  "method": "get",
18100
18211
  "url": "${context.rootUrl}/service/api/apps/".concat(appId, "/menus?mobile=true"),
18101
- "adaptor": "\n try {\n\n if(payload.children.length == 0){\n payload.data = {};\n return payload\n }\n const data = { nav: [] };\n const stacked = ".concat(stacked, ";\n const showIcon = ").concat(showIcon, ";\n const selectedId = '").concat(selectedId, "';\n let sum = 0;\n _.each(payload.children, (tab)=>{\n sum++;\n const classIcon = tab.icon.replace(/_/g,\"-\");\n if(sum >= 5){\n data.nav.push({\n \"label\": {\n type: 'tpl',\n tpl: `<span class='fill-slate-500 text-slate-700 block -ml-px no-underline group flex items-center text-[12px] font-medium rounded-md flex-col leading-3 nav-label'><svg class=\"slds-icon slds-icon_container slds-icon-standard-`+classIcon+` flex-shrink-0 h-10 w-10\"><use xlink:href=\"/assets/icons/standard-sprite/svg/symbols.svg#${tab.icon || 'account'}\"></use></svg><span>${tab.name}</span><i class=\"fa fa-angle-right\" aria-hidden=\"true\" style=\"position: absolute;right: 20px;color: #bababa;\"></i></span>`,\n className:'h-full flex items-center'\n },\n \"to\": tab.path,\n \"target\":tab.target\n });\n }else{\n data.nav.push({\n \"label\": {\n type: 'tpl',\n tpl: `<span class='fill-slate-500 text-slate-700 block -ml-px no-underline group flex items-center text-[12px] font-medium rounded-md flex-col leading-3 nav-label'><svg class=\"slds-icon slds-icon_container slds-icon-standard-`+classIcon+` flex-shrink-0 h-10 w-10\"><use xlink:href=\"/assets/icons/standard-sprite/svg/symbols.svg#${tab.icon || 'account'}\"></use></svg>${tab.name}</span>`,\n className:'h-full flex items-center'\n },\n \"to\": tab.path,\n \"target\":tab.target\n });\n }\n \n })\n\n payload.data = {\n \"type\": \"nav\",\n className: payload.children.length ==1 ? '").concat(className1, "' : '").concat(className, "',\n \"stacked\": ").concat(stacked, ",\n \"overflow\": {\n \"enable\": true,\n \"maxVisibleCount\": 4,\n \"overflowPopoverClassName\": \"steedos-global-footer-popup\",\n \"overflowLabel\":{\n \"type\": 'tpl',\n \"tpl\": `<span class='fill-slate-500 text-slate-700 block -ml-px no-underline group flex items-center text-[12px] font-medium rounded-md flex-col leading-3 nav-label'><svg class=\" flex-shrink-0 h-10 w-10\" style=\"padding:7px\"><use xlink:href=\"/assets/icons/utility-sprite/svg/symbols.svg#rows\"></use></svg>").concat(instance.t('Menu'), "</span>`,\n \"className\":'h-full flex items-center'\n },\n \"overflowIndicator\":\"\"\n },\n \"indentSize\": ").concat(indentSize, ",\n \"links\": data.nav,\n };\n } catch (error) {\n console.log(`error`, error)\n }\n return payload;\n "),
18212
+ "adaptor": "\n try {\n\n if(payload.children.length == 0){\n payload.data = {};\n return payload\n }\n const data = { nav: [] };\n const stacked = ".concat(stacked, ";\n const showIcon = ").concat(showIcon, ";\n const selectedId = '").concat(selectedId, "';\n let sum = 0;\n _.each(payload.children, (tab)=>{\n sum++;\n const classIcon = tab.icon.replace(/_/g,\"-\");\n if(sum >= 5){\n data.nav.push({\n \"label\": {\n type: 'tpl',\n tpl: `<span class='fill-slate-500 text-slate-700 block -ml-px no-underline group flex items-center text-[12px] font-medium rounded-md flex-col leading-3 nav-label'><svg class=\"slds-icon slds-icon_container slds-icon-standard-`+classIcon+` flex-shrink-0 h-10 w-10\"><use xlink:href=\"/assets/icons/standard-sprite/svg/symbols.svg#${tab.icon || 'account'}\"></use></svg><span>${tab.name}</span><i class=\"fa fa-angle-right\" aria-hidden=\"true\" style=\"position: absolute;right: 20px;color: #bababa;\"></i></span>`,\n className:'h-full flex items-center'\n },\n \"to\": tab.path,\n \"target\":tab.target\n });\n }else{\n data.nav.push({\n \"label\": {\n type: 'tpl',\n tpl: `<span class='fill-slate-500 truncate text-slate-700 block -ml-px no-underline group flex items-center text-[12px] font-medium rounded-md flex-col leading-3 nav-label'><svg class=\"slds-icon slds-icon_container slds-icon-standard-`+classIcon+` flex-shrink-0 h-10 w-10\"><use xlink:href=\"/assets/icons/standard-sprite/svg/symbols.svg#${tab.icon || 'account'}\"></use></svg><span class=\"truncate\" style=\"max-width: 20vw\">${tab.name}</span></span>`,\n className:'h-full flex items-center'\n },\n \"to\": tab.path,\n \"target\":tab.target\n });\n }\n \n })\n\n payload.data = {\n \"type\": \"nav\",\n className: payload.children.length ==1 ? '").concat(className1, "' : '").concat(className, "',\n \"stacked\": ").concat(stacked, ",\n \"overflow\": {\n \"enable\": true,\n \"maxVisibleCount\": 4,\n \"overflowPopoverClassName\": \"steedos-global-footer-popup\",\n \"overflowLabel\":{\n \"type\": 'tpl',\n \"tpl\": `<span class='fill-slate-500 truncate text-slate-700 block -ml-px no-underline group flex items-center text-[12px] font-medium rounded-md flex-col leading-3 nav-label'><svg class=\" flex-shrink-0 h-10 w-10\" style=\"padding:7px\"><use xlink:href=\"/assets/icons/utility-sprite/svg/symbols.svg#rows\"></use></svg><span class=\"truncate\" style=\"max-width: 20vw\">").concat(instance.t('frontend_menu'), "</span></span>`,\n \"className\":'h-full flex items-center'\n },\n \"overflowIndicator\":\"\"\n },\n \"indentSize\": ").concat(indentSize, ",\n \"links\": data.nav,\n };\n } catch (error) {\n console.log(`error`, error)\n }\n return payload;\n "),
18102
18213
  "headers": {
18103
18214
  "Authorization": "Bearer ${context.tenantId},${context.authToken}"
18104
18215
  }
@@ -18940,8 +19051,9 @@ var PageRecordDetail = function (props) { return __awaiter(void 0, void 0, void
18940
19051
  switch (_a.label) {
18941
19052
  case 0:
18942
19053
  defaultFormFactor = props.formFactor, appId = props.appId, objectApiName = props.objectApiName, props.recordId, display = props.display;
18943
- //TODO 此代码应该在object page template中处理
18944
- Router$1.setTabDisplayAs(objectApiName, display);
19054
+ if (display) {
19055
+ Router$1.setTabDisplayAs(objectApiName, display);
19056
+ }
18945
19057
  recordSchema = {};
18946
19058
  return [4 /*yield*/, getPage({ type: 'record', appId: appId, objectName: objectApiName, formFactor: defaultFormFactor })];
18947
19059
  case 1:
@@ -18999,7 +19111,7 @@ var PageObject = function (props) { return __awaiter(void 0, void 0, void 0, fun
18999
19111
  "type": "wrapper",
19000
19112
  "size": "none",
19001
19113
  "className": {
19002
- "p-0 flex-shrink-0 w-[388px] border-r border-gray-300 bg-gray-100 shadow lg:order-first lg:flex lg:flex-col": "${display == 'split'}",
19114
+ "p-0 flex-shrink-0 min-w-[388px] w-fit border-r border-gray-300 bg-gray-100 shadow lg:order-first lg:flex lg:flex-col": "${display == 'split'}",
19003
19115
  'h-full': "${display != 'split'}",
19004
19116
  },
19005
19117
  "body": {