@steedos-widgets/amis-lib 6.10.1-beta.31 → 6.10.1-beta.33

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
@@ -505,8 +505,8 @@ function getComparableAmisVersion() {
505
505
  /*
506
506
  * @Author: baozhoutao@steedos.com
507
507
  * @Date: 2022-05-23 09:53:08
508
- * @LastEditors: baozhoutao@steedos.com
509
- * @LastEditTime: 2024-11-17 13:10:08
508
+ * @LastEditors: 殷亮辉 yinlianghui@hotoa.com
509
+ * @LastEditTime: 2025-04-08 10:55:41
510
510
  * @Description:
511
511
  */
512
512
 
@@ -660,9 +660,10 @@ function getRelatedFieldTpl(field, ctx){
660
660
  const href = Router.getObjectDetailPath({
661
661
  formFactor: ctx.formFactor, appId: "${appId}", objectName: `${objectNameTpl}`, recordId: `${recordIdTpl}`
662
662
  });
663
- if(ctx.isRelated && window.innerWidth >= 768){
663
+ if (window.innerWidth >= 768) { //(ctx.isRelated || isObjectListview) && window.innerWidth >= 768
664
+ // 相关表字段,包括列表视图、对象表格组件中的lookup/master_detail字段,在PC端显示时,点击字段值,不跳转到详情页而是右侧弹出drawer
664
665
  labelTpl = `<a href="${href}" ${linkTarget} onclick="return false;">${labelTpl}</a>`;
665
- }else {
666
+ } else {
666
667
  labelTpl = `<a href="${href}" ${linkTarget}>${labelTpl}</a>`;
667
668
  }
668
669
 
@@ -1460,6 +1461,7 @@ var frontend_download$1 = "Download";
1460
1461
  var frontend_form_save$1 = "Save";
1461
1462
  var frontend_form_save_and_new$1 = "Save and New";
1462
1463
  var frontend_form_cancel$1 = "Cancel";
1464
+ var frontend_form_reset$1 = "Reset";
1463
1465
  var frontend_form_new$1 = "New";
1464
1466
  var frontend_form_edit$1 = "Edit";
1465
1467
  var frontend_form_preview$1 = "Preview";
@@ -1478,7 +1480,7 @@ var frontend_display_type_is_split$1 = "Split View";
1478
1480
  var frontend_display_as$1 = "Displayed as";
1479
1481
  var frontend_record_sum$1 = "items";
1480
1482
  var frontend_button_reload_tooltip$1 = "Refresh";
1481
- var frontend_button_search_tooltip$1 = "Advanced Search";
1483
+ var frontend_button_search_tooltip$1 = "Filter";
1482
1484
  var frontend_fields_filter_button_search$1 = "Search";
1483
1485
  var frontend_fields_filter_button_settings$1 = "Set search options";
1484
1486
  var frontend_button_listview_control_tooltip$1 = "List View Controls";
@@ -1550,6 +1552,7 @@ var en_us = {
1550
1552
  frontend_form_save: frontend_form_save$1,
1551
1553
  frontend_form_save_and_new: frontend_form_save_and_new$1,
1552
1554
  frontend_form_cancel: frontend_form_cancel$1,
1555
+ frontend_form_reset: frontend_form_reset$1,
1553
1556
  frontend_form_new: frontend_form_new$1,
1554
1557
  frontend_form_edit: frontend_form_edit$1,
1555
1558
  frontend_form_preview: frontend_form_preview$1,
@@ -1641,6 +1644,7 @@ var frontend_download = "下载";
1641
1644
  var frontend_form_save = "保存";
1642
1645
  var frontend_form_save_and_new = "保存并新建";
1643
1646
  var frontend_form_cancel = "取消";
1647
+ var frontend_form_reset = "重置";
1644
1648
  var frontend_form_new = "新建";
1645
1649
  var frontend_form_edit = "编辑";
1646
1650
  var frontend_form_preview = "预览";
@@ -1659,7 +1663,7 @@ var frontend_display_type_is_split = "分栏视图";
1659
1663
  var frontend_display_as = "显示为";
1660
1664
  var frontend_record_sum = "个项目";
1661
1665
  var frontend_button_reload_tooltip = "刷新";
1662
- var frontend_button_search_tooltip = "高级搜索";
1666
+ var frontend_button_search_tooltip = "筛选";
1663
1667
  var frontend_fields_filter_button_search = "搜索";
1664
1668
  var frontend_fields_filter_button_settings = "选择搜索项";
1665
1669
  var frontend_button_listview_control_tooltip = "列表视图控制";
@@ -1732,6 +1736,7 @@ var zh_cn = {
1732
1736
  frontend_form_save: frontend_form_save,
1733
1737
  frontend_form_save_and_new: frontend_form_save_and_new,
1734
1738
  frontend_form_cancel: frontend_form_cancel,
1739
+ frontend_form_reset: frontend_form_reset,
1735
1740
  frontend_form_new: frontend_form_new,
1736
1741
  frontend_form_edit: frontend_form_edit,
1737
1742
  frontend_form_preview: frontend_form_preview,
@@ -1899,7 +1904,12 @@ async function getQuickEditSchema(object, columnField, options){
1899
1904
  if (field.disabled) {
1900
1905
  quickEditSchema = false;
1901
1906
  } else {
1902
- var fieldSchema = await convertSFieldToAmisField(field, false, _$1.omit(options, 'buttons'));
1907
+ var fieldCtx = Object.assign({}, _$1.omit(options, 'buttons'), {
1908
+ defaults: Object.assign({}, options.defaults, {
1909
+ formSchema: quickEditSchema
1910
+ })
1911
+ });
1912
+ var fieldSchema = await convertSFieldToAmisField(field, false, fieldCtx);
1903
1913
  //存在属性上可编辑,实际不可编辑的字段,convertSFieldToAmisField函数可能会返回undefined,如summary
1904
1914
  if (!!fieldSchema) {
1905
1915
  quickEditSchema.body.push(fieldSchema);
@@ -2332,14 +2342,19 @@ function getFieldWidth(width){
2332
2342
  }
2333
2343
 
2334
2344
  async function getColumnItemOnClick(field, options){
2335
- const recordPage = await getPage({ type: 'record', appId: options.appId, objectName: options.objectName, formFactor: options.formFactor });
2345
+ let objectApiName = options.objectName;
2346
+ if(!(field.is_name || field.name === options.labelFieldName)){
2347
+ objectApiName = field.reference_to;
2348
+ }
2349
+ const recordPage = await getPage({ type: 'record', appId: options.appId, objectName: objectApiName, formFactor: options.formFactor });
2336
2350
  const drawerRecordDetailSchema = recordPage ? Object.assign({}, recordPage.schema, {
2337
2351
  "recordId": `\${${options.idFieldName}}`,
2338
2352
  "data": {
2339
2353
  ...recordPage.schema.data,
2340
2354
  "_inDrawer": true, // 用于判断是否在抽屉中
2341
2355
  "recordLoaded": false, // 重置数据加载状态
2342
- "recordId": `\${${options.idFieldName}}`//审批微页面依赖了作用域中的recordId
2356
+ "recordId": `\${${options.idFieldName}}`,//审批微页面依赖了作用域中的recordId
2357
+ "_tableObjectName": options.objectName
2343
2358
  }
2344
2359
  }) : {
2345
2360
  "type": "steedos-record-detail",
@@ -2350,12 +2365,16 @@ async function getColumnItemOnClick(field, options){
2350
2365
  "data": {
2351
2366
  "_inDrawer": true, // 用于判断是否在抽屉中
2352
2367
  "recordLoaded": false, // 重置数据加载状态
2368
+ "_tableObjectName": options.objectName
2353
2369
  }
2354
2370
  };
2355
2371
 
2356
2372
  if(!(field.is_name || field.name === options.labelFieldName)){
2357
2373
  drawerRecordDetailSchema.objectApiName = field.reference_to;
2358
2374
  drawerRecordDetailSchema.recordId = `\${_display.${field.name}.value}`;
2375
+ // if (recordPage){
2376
+ // drawerRecordDetailSchema.data.recordId = `\${_display.${field.name}.value}`
2377
+ // }
2359
2378
  }
2360
2379
  return {
2361
2380
  "click": {
@@ -2505,6 +2524,33 @@ async function getTableColumns(object, fields, options){
2505
2524
  static: true,
2506
2525
  }, fieldAmis, {name: field.name});
2507
2526
  }
2527
+ else if(field.type === 'lookup' || field.type === 'master_detail'){
2528
+ columnItem = Object.assign({}, {
2529
+ type: "static-wrapper",
2530
+ name: field.name,
2531
+ label: field.label,
2532
+ sortable: field.sortable,
2533
+ width: getFieldWidth(field.width),
2534
+ toggled: field.toggled,
2535
+ className,
2536
+ size: "none",
2537
+ inputClassName: "inline",
2538
+ body: {
2539
+ type: "steedos-field",
2540
+ static: true,
2541
+ tableObjectName: options.objectName,
2542
+ config: {
2543
+ type: "lookup",
2544
+ reference_to: field.reference_to,
2545
+ name: field.name,
2546
+ is_name: field.is_name,
2547
+ label: null,
2548
+ multiple: field.multiple,
2549
+ amis: Object.assign({}, fieldAmis, { label: null })
2550
+ }
2551
+ }
2552
+ }, fieldAmis, {name: field.name});
2553
+ }
2508
2554
  else {
2509
2555
  const tpl = await getFieldTpl(field, options);
2510
2556
  let type = 'static-text';
@@ -2553,10 +2599,20 @@ async function getTableColumns(object, fields, options){
2553
2599
  columnItem.defaultColor = null;
2554
2600
  }
2555
2601
 
2556
- if(window.innerWidth >= 768 && ((field.is_name || field.name === options.labelFieldName) || ((field.type == 'lookup' || field.type == 'master_detail') && _$1.isString(field.reference_to) && field.multiple != true)) && options.isRelated){
2602
+ let needClickEvent = false;
2603
+ // if (options.isRelated){
2604
+ // // 子表列表上,Lookup字段和名称字段都需要点击事件
2605
+ // needClickEvent = ((field.is_name || field.name === options.labelFieldName) || ((field.type == 'lookup' || field.type == 'master_detail') && _.isString(field.reference_to) && field.multiple != true));
2606
+ // }
2607
+ // else {// if (isObjectListview)
2608
+ // // 列表视图、对象表格中,Lookup字段需要点击事件
2609
+ // needClickEvent = (field.type == 'lookup' || field.type == 'master_detail') && _.isString(field.reference_to) && field.multiple != true;
2610
+ // }
2611
+ // lookup字段走steedos-field组件了,所以这里只需要判断子表名称字段才额外加点击事件弹出右侧详情
2612
+ needClickEvent = options.isRelated && (field.is_name || field.name === options.labelFieldName);
2613
+ if(window.innerWidth >= 768 && needClickEvent){
2557
2614
  columnItem.onEvent = await getColumnItemOnClick(field, options);
2558
2615
  }
2559
-
2560
2616
  }
2561
2617
  }
2562
2618
  if(columnItem){
@@ -4908,9 +4964,9 @@ const getSchema$5 = async (uiSchema, ctx) => {
4908
4964
  "body": [
4909
4965
  {
4910
4966
  "type": "button",
4967
+ "level": "primary",
4911
4968
  "label": i18next.t('frontend_form_new'),
4912
4969
  "id": "u:standard_new",
4913
- "level": "default",
4914
4970
  "onEvent": {
4915
4971
  "click": {
4916
4972
  "weight": 0,
@@ -5111,8 +5167,8 @@ const getSchema$4 = async (uiSchema, ctx) => {
5111
5167
  /*
5112
5168
  * @Author: 殷亮辉 yinlianghui@hotoa.com
5113
5169
  * @Date: 2023-03-22 09:31:21
5114
- * @LastEditors: baozhoutao@steedos.com
5115
- * @LastEditTime: 2024-02-18 16:06:21
5170
+ * @LastEditors: 殷亮辉 yinlianghui@hotoa.com
5171
+ * @LastEditTime: 2025-04-07 16:02:53
5116
5172
  */
5117
5173
  const getSchema$3 = (uiSchema)=>{
5118
5174
  return {
@@ -5172,6 +5228,17 @@ const getSchema$3 = (uiSchema)=>{
5172
5228
  "_isRelated": "${_isRelated}"
5173
5229
  },
5174
5230
  "expression": `\${_master.objectName != '${uiSchema.name}' && _master.objectName}`
5231
+ },
5232
+ // 列表视图、对象表格组件上的lookup字段,点开右侧弹出drawer窗口,删除记录后刷新列表
5233
+ {
5234
+ "actionType": "broadcast",
5235
+ "args": {
5236
+ "eventName": "@data.changed.${_tableObjectName}"
5237
+ },
5238
+ "data": {
5239
+ "objectName": "${_tableObjectName}"
5240
+ },
5241
+ "expression": `\${_tableObjectName != '${uiSchema.name}' && _tableObjectName}`
5175
5242
  }
5176
5243
  ]
5177
5244
  }
@@ -6086,7 +6153,7 @@ async function getObjectFieldsFilterFormSchema(ctx) {
6086
6153
  const formSchema = {
6087
6154
  "type": "service",
6088
6155
  "visibleOn": "this.filterFormSearchableFields && this.filterFormSearchableFields.length",
6089
- "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-4 sm:grid-cols-2 md:grid-cols-3 lg:grid-cols-4 xl:grid-cols-5 2xl:grid-cols-6 p-1",
6156
+ "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-4 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 p-1",
6090
6157
  "style":{
6091
6158
  "max-height":ctx.formFactor === 'SMALL'?"30vh":"unset"
6092
6159
  },
@@ -6321,6 +6388,21 @@ async function getObjectFieldsFilterBarSchema(objectSchema, ctx) {
6321
6388
  let crudService = crud && SteedosUI.getClosestAmisComponentByType(crud.context, "service", {name: "service_object_table_crud"});
6322
6389
  crudService && crudService.setData({isFieldsFilterEmpty: true, showFieldsFilter: false});
6323
6390
  `;
6391
+ /**
6392
+ 给lookup字段配置filter_form_data时可以配置为amis变量,也可以配置为事态key-value键值对象值:
6393
+ ```
6394
+ "filter_form_data": "${selectedPublicGroupFilterFormData|toJson}"
6395
+ ```
6396
+ or
6397
+ ```
6398
+ "filter_form_data": {
6399
+ "public_group_ids": [
6400
+ "67addbef39f9a4503789b38d"
6401
+ ]
6402
+ }
6403
+ ```
6404
+ */
6405
+ const filterFormValues = ctx.filter_form_data;
6324
6406
  const dataProviderInited = `
6325
6407
  const searchableFields = ${JSON.stringify(searchableFields)};
6326
6408
  const autoOpenFilter = ${autoOpenFilter};
@@ -6358,6 +6440,16 @@ async function getObjectFieldsFilterBarSchema(objectSchema, ctx) {
6358
6440
  }
6359
6441
  setData({ filterFormSearchableFields: defaultSearchableFields });
6360
6442
  if(isLookup){
6443
+ let filterFormValues = ${_.isObject(filterFormValues) ? JSON.stringify(filterFormValues) : ('"' + filterFormValues + '"')} || {};
6444
+ const isAmisFormula = typeof filterFormValues === "string" && filterFormValues.indexOf("\${") > -1;
6445
+ if (isAmisFormula){
6446
+ filterFormValues = AmisCore.evaluate(filterFormValues, data) || {};
6447
+ }
6448
+ if (_.isObject(filterFormValues) || !_.isEmpty(filterFormValues)){
6449
+ let fields = data.uiSchema && data.uiSchema.fields;
6450
+ filterFormValues = SteedosUI.getSearchFilterFormValues(filterFormValues, fields);
6451
+ setData({ ...filterFormValues });
6452
+ }
6361
6453
  // looup字段过滤器不在本地缓存记住过滤条件,所以初始始终隐藏过滤器
6362
6454
  setData({ showFieldsFilter: autoOpenFilter });
6363
6455
  }
@@ -6514,6 +6606,7 @@ async function getObjectFieldsFilterBarSchema(objectSchema, ctx) {
6514
6606
  "body": [
6515
6607
  {
6516
6608
  "type": "button",
6609
+ "level": "primary",
6517
6610
  "id": btnSearchId,
6518
6611
  "label": i18next.t('frontend_fields_filter_button_search'),
6519
6612
  "icon": "fa fa-search",
@@ -6531,7 +6624,7 @@ async function getObjectFieldsFilterBarSchema(objectSchema, ctx) {
6531
6624
  },
6532
6625
  {
6533
6626
  "type": "button",
6534
- "label": i18next.t('frontend_form_cancel'),
6627
+ "label": i18next.t('frontend_form_reset'),
6535
6628
  "name": "btn_filter_form_cancel",
6536
6629
  // "visibleOn": "this.filterFormSearchableFields && this.filterFormSearchableFields.length",
6537
6630
  "onEvent": {
@@ -6621,7 +6714,6 @@ async function getObjectFieldsFilterBarSchema(objectSchema, ctx) {
6621
6714
  "className": "steedos-amis-form"
6622
6715
  }
6623
6716
  ],
6624
- "id": "u:ca99fa9fe1b1",
6625
6717
  "actions": [
6626
6718
  {
6627
6719
  "type": "button",
@@ -6649,13 +6741,15 @@ async function getObjectFieldsFilterBarSchema(objectSchema, ctx) {
6649
6741
  "actionType": "custom",
6650
6742
  "script": onSearchableFieldsChangeScript
6651
6743
  },
6652
- {
6653
- "actionType": "click",
6654
- "componentId": btnSearchId,
6655
- "args": {
6656
- "__from_fields_filter_settings_confirm": true
6657
- }
6658
- },
6744
+ // 自动触发搜索事件会造成bug,应该是升级amis到6.4造成的,见:https://github.com/steedos/steedos-platform/issues/7121
6745
+ // 变更搜索项后,用户一般会点击搜索按钮,所以这里不自动触发搜索事件
6746
+ // {
6747
+ // "actionType": "click",
6748
+ // "componentId": btnSearchId,
6749
+ // "args": {
6750
+ // "__from_fields_filter_settings_confirm": true
6751
+ // }
6752
+ // },
6659
6753
  {
6660
6754
  "componentId": "",
6661
6755
  "args": {},
@@ -6686,12 +6780,11 @@ async function getObjectFieldsFilterBarSchema(objectSchema, ctx) {
6686
6780
  ]
6687
6781
  }
6688
6782
  },
6689
- "id": "u:b96d84868a5a",
6690
6783
  "level": "link"
6691
6784
  }
6692
6785
  ],
6693
6786
  "size": "xs",
6694
- "className": "space-x-4"
6787
+ "className": "space-x-2"
6695
6788
  },
6696
6789
  "size": "xs",
6697
6790
  "className": "slds-filters__footer slds-grid slds-shrink-none flex justify-between p-0"
@@ -7395,7 +7488,6 @@ function getObjectListHeaderFirstLine(objectSchema, listViewName, ctx) {
7395
7488
  "id": "u:ce9e3fcc411a"
7396
7489
  }
7397
7490
  ],
7398
- "className": "steedos-overflow-visible-dialog",
7399
7491
  "showCloseButton": true,
7400
7492
  "showErrorMsg": true,
7401
7493
  "showLoading": true,
@@ -7637,7 +7729,7 @@ function getObjectListHeader(objectSchema, listViewName, ctx) {
7637
7729
  let headerSchema = [{
7638
7730
  "type": "wrapper",
7639
7731
  "body": body,
7640
- "className": `p-3 m-4 shadow rounded bg-white`
7732
+ "className": `px-3 pt-3 pb-0 m-1 bg-white`
7641
7733
  }];
7642
7734
  // console.log(`getObjectListHeader`, objectSchema, listViewName, ctx)
7643
7735
  return headerSchema;
@@ -8385,7 +8477,6 @@ const getSetListviewFiltersButtonSchema = ()=>{
8385
8477
  }
8386
8478
  }
8387
8479
  ],
8388
- "className": "steedos-overflow-visible-dialog",
8389
8480
  "showCloseButton": true,
8390
8481
  "showErrorMsg": true,
8391
8482
  "showLoading": true,
@@ -9019,7 +9110,7 @@ function getObjectHeaderQuickSearchBox(mainObject, fields, formFactor, { isLooku
9019
9110
  return {
9020
9111
  "type": "tooltip-wrapper",
9021
9112
  "id": "steedos_crud_toolbar_quick_search",
9022
- "align": "left",
9113
+ "align": "right",
9023
9114
  "title": "",
9024
9115
  "content": "可搜索字段:" + searchableFieldsLabel.join(","),
9025
9116
  "placement": "bottom",
@@ -9033,6 +9124,7 @@ function getObjectHeaderQuickSearchBox(mainObject, fields, formFactor, { isLooku
9033
9124
  "name": keywordsSearchBoxName,
9034
9125
  "placeholder": "快捷搜索",
9035
9126
  "value": crudKeywords,
9127
+ "mini": true,
9036
9128
  "clearable": true,//因为清除并不会触发失去焦点事件,只有禁用,但是它会触发change事件,所以等升级到amis 3.4+后可以重新放开
9037
9129
  "clearAndSubmit": true,
9038
9130
  "searchImediately": false,
@@ -9081,7 +9173,7 @@ function getObjectHeaderToolbar(mainObject, fields, formFactor, {
9081
9173
  if(!hiddenCount){
9082
9174
  toolbarCount = {
9083
9175
  "type": "tpl",
9084
- "align": "right",
9176
+ "align": "left",
9085
9177
  "className": "text-gray-500 mr-2",
9086
9178
  "tpl": "${count} " + i18next.t('frontend_record_sum')
9087
9179
  };
@@ -9165,7 +9257,7 @@ function getObjectHeaderToolbar(mainObject, fields, formFactor, {
9165
9257
  "animation": true,
9166
9258
  "visibleOn": "${isFieldsFilterEmpty == false && isLookup != true}"
9167
9259
  },
9168
- "align": "left",
9260
+ "align": "right",
9169
9261
  "className": "bg-white p-2 rounded text-gray-500",
9170
9262
  "onEvent": {
9171
9263
  "click": {
@@ -9187,27 +9279,27 @@ function getObjectHeaderToolbar(mainObject, fields, formFactor, {
9187
9279
  // 当出现空的.antd-Crud-toolbar-item dom时会影响toolbar元素的maring-right css样式计算,如果有动态需要应该加到动态数组变量toolbars中
9188
9280
  let toolbars = [];
9189
9281
  if(formFactor === 'SMALL'){
9190
- if(toolbarCount){
9191
- toolbars.push(toolbarCount);
9192
- }
9193
- toolbars.push(toolbarReloadButton);
9194
- toolbars.push(toolbarDisplayAsButton);
9282
+ // if(toolbarCount){
9283
+ // toolbars.push(toolbarCount);
9284
+ // }
9285
+ // toolbars.push(toolbarReloadButton);
9286
+ toolbars.push(toolbarDQuickSearchBox);
9195
9287
  if(toolbarFilter){
9196
9288
  toolbars.push(toolbarFilter);
9197
9289
  }
9198
- toolbars.push(toolbarDQuickSearchBox);
9290
+ toolbars.push(toolbarDisplayAsButton);
9199
9291
  return [
9200
9292
  // "bulkActions",
9201
9293
  ...(headerToolbarItems || []),
9202
9294
  ...toolbars,
9203
9295
  ]
9204
9296
  }else {
9297
+ toolbars.push(toolbarDQuickSearchBox);
9205
9298
  toolbars.push(toolbarReloadButton);
9206
9299
  toolbars.push(toolbarDisplayAsButton);
9207
9300
  if(mainObject?.permissions?.allowCreateListViews){
9208
9301
  toolbars.push(getSettingListviewToolbarButtonSchema());
9209
9302
  }
9210
- toolbars.push(toolbarDQuickSearchBox);
9211
9303
  if(toolbarFilter){
9212
9304
  toolbars.push(toolbarFilter);
9213
9305
  }
@@ -9887,6 +9979,17 @@ async function getObjectForm(objectSchema, ctx){
9887
9979
  },
9888
9980
  "expression": `\${_master.objectName != '${objectSchema.name}' && _master.objectName}`
9889
9981
  },
9982
+ // 列表视图、对象表格组件上的lookup字段,点开右侧弹出drawer窗口,修改记录后刷新列表
9983
+ {
9984
+ "actionType": "broadcast",
9985
+ "args": {
9986
+ "eventName": "@data.changed.${_tableObjectName}"
9987
+ },
9988
+ "data": {
9989
+ "objectName": "${_tableObjectName}"
9990
+ },
9991
+ "expression": `\${_tableObjectName != '${objectSchema.name}' && _tableObjectName}`
9992
+ },
9890
9993
  ...submitSuccActions,
9891
9994
  // {
9892
9995
  // "actionType": "custom",
@@ -10489,7 +10592,7 @@ async function getObjectRelatedListsMiniSchema(objectApiName){
10489
10592
  * @Author: baozhoutao@steedos.com
10490
10593
  * @Date: 2022-07-05 15:55:39
10491
10594
  * @LastEditors: 殷亮辉 yinlianghui@hotoa.com
10492
- * @LastEditTime: 2025-05-20 19:29:36
10595
+ * @LastEditTime: 2025-06-17 20:18:18
10493
10596
  * @Description:
10494
10597
  */
10495
10598
 
@@ -10845,12 +10948,13 @@ async function getListSchema(
10845
10948
  "filtersFunction": listview_filters,
10846
10949
  "sort": sort,
10847
10950
  "ctx": ctx,
10848
- "requestAdaptor": listView.requestAdaptor || ctx.requestAdaptor,
10849
- "adaptor": listView.adaptor || ctx.adaptor,
10951
+ "requestAdaptor": ctx.requestAdaptor || listView.requestAdaptor,
10952
+ "adaptor": ctx.adaptor || listView.adaptor,
10850
10953
  "headerToolbarItems": ctx.headerToolbarItems,
10851
10954
  "filterVisible": ctx.filterVisible,
10852
10955
  "rowClassNameExpr": ctx.rowClassNameExpr,
10853
- "crudDataFilter": ctx.crudDataFilter,
10956
+ "crud": ctx.crud || listView.crud,
10957
+ "crudDataFilter": ctx.crudDataFilter || listView.crudDataFilter ,
10854
10958
  "onCrudDataFilter": ctx.onCrudDataFilter
10855
10959
  };
10856
10960
  // console.log(`getListSchema===>`,amisSchema)
@@ -11015,7 +11119,8 @@ async function getRecordDetailHeaderSchema(objectName,recordId, options){
11015
11119
  }
11016
11120
 
11017
11121
  async function getRecordDetailSchema(objectName, appId, props = {}){
11018
- const uiSchema = await getUISchema(objectName);
11122
+ const uiSchema = await getUISchema(objectName);
11123
+
11019
11124
  const relatedLists = await getObjectRelatedList(objectName);
11020
11125
  const detailed = {
11021
11126
  "title": i18next.t('frontend_record_detail_tab_detailed'),
@@ -11056,6 +11161,21 @@ async function getRecordDetailSchema(objectName, appId, props = {}){
11056
11161
  if(relatedLists.length){
11057
11162
  content.tabs.push(related);
11058
11163
  }
11164
+ const contents = [content];
11165
+ if (uiSchema.enable_chatter && window.BuilderLiveblocks) {
11166
+ const chatter = {
11167
+ "type": "rooms-provider",
11168
+ "baseUrl": "${context.rootUrl}",
11169
+ "body": [
11170
+ {
11171
+ "type": "rooms-comments",
11172
+ "className": "flex flex-col gap-3 m-4",
11173
+ "roomId": "objects:${objectName}:${recordId}",
11174
+ }
11175
+ ]
11176
+ };
11177
+ contents.push(chatter);
11178
+ }
11059
11179
  // content.tabs = reverse(content.tabs)
11060
11180
  if(content.tabs.length == 1){
11061
11181
  content.className += " steedos-record-tabs--single";
@@ -11075,7 +11195,7 @@ async function getRecordDetailSchema(objectName, appId, props = {}){
11075
11195
  "showBackButton": props.showBackButton,
11076
11196
  _reloadKey: props._reloadKey
11077
11197
  },
11078
- content
11198
+ ...contents,
11079
11199
  ],
11080
11200
  "objectApiName": "${objectName}",
11081
11201
  "recordId": "${recordId}",
@@ -11859,14 +11979,42 @@ function getLookupSapceUserTreeSchema(isMobile){
11859
11979
  {
11860
11980
  "actionType": "custom",
11861
11981
  "script": `
11982
+ console.log("lookup-tree-event.data:",event.data);
11983
+ console.log("lookup-tree-event.data.value.label:",event.data.value.label);
11984
+ console.log("lookup-tree-event.data.value.value:",event.data.value.value);
11862
11985
  const scope = event.context.scoped;
11863
- var filterFormValues={
11986
+ var treeFilterFormValues={
11864
11987
  "__searchable__organizations_parents":event.data.value.value
11865
11988
  }
11866
- var listView = scope.parent.getComponents().find(function(n){
11867
- return n.props.type === "crud";
11989
+ // var listView = scope.parent.getComponents().find(function(n){
11990
+ // return n.props.type === "crud";
11991
+ // });
11992
+ // listView.handleFilterSubmit(Object.assign({}, filterFormValues));
11993
+ let __lookupField = event.data.__lookupField;
11994
+ let crud = SteedosUI.getClosestAmisComponentByType(scope, "crud");
11995
+ var filterForm = scope.getComponents().find(function(n){
11996
+ return n.props.type === "form";
11868
11997
  });
11869
- listView.handleFilterSubmit(Object.assign({}, filterFormValues));
11998
+ let filterFormValues = filterForm.getData();
11999
+ filterFormValues = JSON.parse(JSON.stringify(filterFormValues)); //只取当层数据域中数据,去除__super层数据
12000
+ const changedFilterFormValues = _.pickBy(filterFormValues, function(n,k){return /^__searchable__/.test(k);});
12001
+ Object.assign(changedFilterFormValues, treeFilterFormValues);
12002
+ // 同步__changedFilterFormValues中的值
12003
+ let __changedFilterFormValuesKey = "__changedFilterFormValues";
12004
+ if(__lookupField){
12005
+ let lookupTag = "__lookup__" + __lookupField.name + "__" + __lookupField.reference_to;
12006
+ if(__lookupField.reference_to_field){
12007
+ lookupTag += "__" + __lookupField.reference_to_field;
12008
+ }
12009
+ __changedFilterFormValuesKey += lookupTag;
12010
+ }
12011
+ if(crud){
12012
+ let crudData = crud.getData();
12013
+ crudData[__changedFilterFormValuesKey] = changedFilterFormValues;
12014
+ crud.setData(crudData);
12015
+ }
12016
+ filterForm.setData(treeFilterFormValues);
12017
+ filterForm.handleFormSubmit(event);
11870
12018
  `
11871
12019
  },
11872
12020
  {
@@ -12084,6 +12232,7 @@ async function lookupToAmisPicker(field, readonly, ctx){
12084
12232
  // field.name可能是带点的名称,比如审批王中子表字段'instances.instances_submitter',如果不替换掉点,会造成审批王表单中新建子表行时报错
12085
12233
  let keywordsSearchBoxName = `__keywords_lookup__${field.name.replace(/\./g, "_")}__to__${refObjectConfig.name}`;
12086
12234
 
12235
+ const filterFormValues = field.filter_form_data;
12087
12236
  source.requestAdaptor = `
12088
12237
  let __changedFilterFormValuesKey = "__changedFilterFormValues";
12089
12238
  let __lookupField = api.data.$self.__lookupField;
@@ -12126,7 +12275,20 @@ async function lookupToAmisPicker(field, readonly, ctx){
12126
12275
  }
12127
12276
  }
12128
12277
 
12129
- var searchableFilter = SteedosUI.getSearchFilter(selfData) || [];
12278
+ let filterFormValues = {};
12279
+ if (selfData.op !== 'loadOptions'){
12280
+ filterFormValues = ${_$1.isObject(filterFormValues) ? JSON.stringify(filterFormValues) : ('"' + filterFormValues + '"')} || {};
12281
+ const isAmisFormula = typeof filterFormValues === "string" && filterFormValues.indexOf("\${") > -1;
12282
+ if (isAmisFormula){
12283
+ filterFormValues = AmisCore.evaluate(filterFormValues, context) || {};
12284
+ }
12285
+ if (_.isObject(filterFormValues) || !_.isEmpty(filterFormValues)){
12286
+ let fields = api.data.$self.uiSchema && api.data.$self.uiSchema.fields;
12287
+ filterFormValues = SteedosUI.getSearchFilterFormValues(filterFormValues, fields);
12288
+ }
12289
+ }
12290
+
12291
+ var searchableFilter = SteedosUI.getSearchFilter(Object.assign({}, { ...filterFormValues }, selfData)) || [];
12130
12292
 
12131
12293
  if(searchableFilter.length > 0){
12132
12294
  if(filters.length > 0 ){
@@ -12316,7 +12478,7 @@ async function lookupToAmisPicker(field, readonly, ctx){
12316
12478
  return payload;
12317
12479
  `;
12318
12480
  }
12319
- let top = 20;
12481
+ let top = 500;
12320
12482
 
12321
12483
  if(refObjectConfig.paging && refObjectConfig.paging.enabled === false){
12322
12484
  top = 1000;
@@ -12366,7 +12528,8 @@ async function lookupToAmisPicker(field, readonly, ctx){
12366
12528
  keywordsSearchBoxName,
12367
12529
  searchable_fields: field.searchable_fields,
12368
12530
  auto_open_filter: field.auto_open_filter,
12369
- show_left_filter: field.show_left_filter
12531
+ show_left_filter: field.show_left_filter,
12532
+ filter_form_data: field.filter_form_data
12370
12533
  });
12371
12534
  }
12372
12535
  pickerSchema.data = Object.assign({}, pickerSchema.data, {
@@ -12400,7 +12563,9 @@ async function lookupToAmisPicker(field, readonly, ctx){
12400
12563
  {
12401
12564
  "actionType": "custom",
12402
12565
  "script": `
12403
- const masterRecord = event.data._master && event.data._master.record;
12566
+ // lookup字段弹出列表,点击新建按钮,新建记录成功后,触发@data.changed.xxx,
12567
+ // 此时context.props.data值是lookup字段所在表单数据,经测试多层lookup弹出列表新建记录成功后context.props.data始终取的是最近一层的lookup字段所在表单数据,符合预期
12568
+ const masterRecord = context.props.data;//event.data._master && event.data._master.record;
12404
12569
  const fieldConfig = ${JSON.stringify(field)};
12405
12570
  let reference_to = fieldConfig.reference_to;
12406
12571
  let saveValue;
@@ -12410,7 +12575,6 @@ async function lookupToAmisPicker(field, readonly, ctx){
12410
12575
  }
12411
12576
  const saveField = fieldConfig.reference_to_field || '_id';
12412
12577
  const saveFieldValue = newRecord[saveField];
12413
-
12414
12578
  if( fieldConfig._reference_to && (_.isArray(fieldConfig._reference_to) || _.isFunction(fieldConfig._reference_to) || fieldConfig._reference_to.startsWith('function') ) ){
12415
12579
 
12416
12580
  const fieldValue = masterRecord ? masterRecord[fieldConfig.name] : {o: reference_to, ids: []};
@@ -12430,8 +12594,10 @@ async function lookupToAmisPicker(field, readonly, ctx){
12430
12594
 
12431
12595
  }else{
12432
12596
  if(fieldConfig.multiple){
12433
- // TODO: 连续新建多个记录时,因为获取的主记录不是实时的,所以只会勾选最后一个新建的记录。
12434
- const fieldValue = (masterRecord && masterRecord[fieldConfig.name]) || [];
12597
+ // const fieldValue = (masterRecord && masterRecord[fieldConfig.name]) || [];
12598
+ // 连续新建多个记录时,因为masterRecord获取的主记录不是实时的,所以只会勾选最后一个新建的记录
12599
+ // 而下面context.context.component指向的是lookup picker组件,可以直接取到用户实时勾选的记录。
12600
+ const fieldValue = context.context.component.props.store.toJSON().selectedItems
12435
12601
  saveValue = fieldValue.concat(saveFieldValue);
12436
12602
  }else{
12437
12603
  saveValue = saveFieldValue;
@@ -12439,7 +12605,7 @@ async function lookupToAmisPicker(field, readonly, ctx){
12439
12605
  }
12440
12606
 
12441
12607
  const ctx = ${JSON.stringify(ctx)};
12442
- const componentId = ctx.defaults.formSchema.id;
12608
+ const componentId = ctx.defaults && ctx.defaults.formSchema && ctx.defaults.formSchema.id;
12443
12609
  doAction({
12444
12610
  actionType: 'setValue',
12445
12611
  componentId: componentId,
@@ -12866,6 +13032,10 @@ async function lookupToAmis(field, readonly, ctx){
12866
13032
  }
12867
13033
  let amisSchema;
12868
13034
  // 默认使用下拉框模式显示lookup选项,只能配置了enable_enhanced_lookup才使用弹出增强模式
13035
+ if(enableEnhancedLookup == true && field.amis && field.amis.type && field.amis.type !== 'picker'){
13036
+ // 如果配置了amis.type且其值不是picker,则不使用弹出增强模式
13037
+ enableEnhancedLookup = false;
13038
+ }
12869
13039
  if(enableEnhancedLookup == true){
12870
13040
  amisSchema = await lookupToAmisPicker(field, readonly, ctx);
12871
13041
  }else if(refObject.enable_tree) {
@@ -13997,7 +14167,16 @@ async function convertSFieldToAmisField(field, readonly, ctx) {
13997
14167
  return convertData
13998
14168
  }
13999
14169
  // if(ctx.mode === 'edit'){
14000
- let convertDataResult = Object.assign({}, baseData, convertData, { labelClassName: 'text-left', clearValueOnHidden: true, fieldName: field.name}, field.amis, {name: baseData.name});
14170
+ let convertDataResult;
14171
+ if(convertData.type == "steedos-field"){
14172
+ // 如果是steedos-field,不能把amis属性合并到steedos-field根属性中,要合并也是合并到steedos-field的config.amis中
14173
+ // 而steedos-field字段的amis属性本身就在config.amis中了,所以这里不需要再合并field.amis
14174
+ // 目前测试到受影响的是,把字段的amis属性配置为{"type": "checkboxes"}时,ObjectForm只读模式下,lookup字段返回的是type为steedos-field的组件,此时field.amis中的type不应该合并到steedos-field根属性中
14175
+ convertDataResult = Object.assign({}, baseData, convertData, { labelClassName: 'text-left', clearValueOnHidden: true, fieldName: field.name}, {name: baseData.name});
14176
+ }
14177
+ else {
14178
+ convertDataResult = Object.assign({}, baseData, convertData, { labelClassName: 'text-left', clearValueOnHidden: true, fieldName: field.name}, field.amis, {name: baseData.name});
14179
+ }
14001
14180
  // 只读时file字段的外层control层若存在name,内部each组件存在问题
14002
14181
  if(readonly && field.type == "file") {
14003
14182
  convertDataResult.name = "";