@steedos-widgets/amis-lib 6.3.12-beta.3 → 6.3.12-beta.30

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.cjs.js CHANGED
@@ -1240,7 +1240,7 @@ async function getPage({type, pageId = '', appId, objectName = '', recordId = ''
1240
1240
  * @Author: baozhoutao@steedos.com
1241
1241
  * @Date: 2022-10-28 14:15:09
1242
1242
  * @LastEditors: baozhoutao@steedos.com
1243
- * @LastEditTime: 2024-11-14 10:50:01
1243
+ * @LastEditTime: 2025-02-13 09:31:02
1244
1244
  * @Description:
1245
1245
  */
1246
1246
 
@@ -1299,7 +1299,7 @@ async function getLookupLinkOnClick(field, options) {
1299
1299
  "title": " ",
1300
1300
  "headerClassName": "hidden",
1301
1301
  "size": "lg",
1302
- "width": "70%",
1302
+ "width": window.drawerWidth || "70%",
1303
1303
  "bodyClassName": "p-0 m-0 bg-gray-100",
1304
1304
  "closeOnEsc": true,
1305
1305
  "closeOnOutside": true,
@@ -1895,7 +1895,6 @@ async function getQuickEditSchema(object, columnField, options){
1895
1895
  {
1896
1896
  actionType: "custom",
1897
1897
  script: `
1898
- console.log("asdasd");
1899
1898
  let items = _.cloneDeep(event.data.items);
1900
1899
  let selectedItems = _.cloneDeep(event.data.selectedItems);
1901
1900
  if(event.data.isBatchEdit){
@@ -2392,7 +2391,7 @@ async function getColumnItemOnClick(field, options){
2392
2391
  "title": " ",
2393
2392
  "headerClassName": "hidden",
2394
2393
  "size": "lg",
2395
- "width": "70%",
2394
+ "width": window.drawerWidth || "70%",
2396
2395
  "bodyClassName": "p-0 m-0 bg-gray-100",
2397
2396
  "closeOnEsc": true,
2398
2397
  "closeOnOutside": true,
@@ -3436,6 +3435,11 @@ async function getTableApi(mainObject, fields, options){
3436
3435
  }, 600);
3437
3436
  }
3438
3437
  }
3438
+
3439
+ // 列表搜索和快速搜索,有时在某些操作情况下还是会造成crud接口请求使用的过滤条件是上次的,这里强制把正确的过滤条件返回到crud,详细规则见:https://github.com/steedos/steedos-platform/issues/7112
3440
+ // lookup字段的弹出列表搜索不受这里影响,因为lookup字段的弹出列表搜索是单独的接口请求
3441
+ payload.data.__changedFilterFormValues = api.context.__changedFilterFormValues;
3442
+ payload.data.__changedSearchBoxValues = api.context.__changedSearchBoxValues;
3439
3443
  ${options.adaptor || ''}
3440
3444
  return payload;
3441
3445
  `;
@@ -4836,7 +4840,7 @@ const parseSingleExpression = function (func, formData, dataPath, global, userSe
4836
4840
  * @Author: baozhoutao@steedos.com
4837
4841
  * @Date: 2022-11-01 15:51:00
4838
4842
  * @LastEditors: baozhoutao@steedos.com
4839
- * @LastEditTime: 2024-02-18 18:37:35
4843
+ * @LastEditTime: 2024-12-26 20:28:43
4840
4844
  * @Description:
4841
4845
  */
4842
4846
 
@@ -4996,20 +5000,23 @@ const getSchema$5 = async (uiSchema, ctx) => {
4996
5000
  {
4997
5001
  type: 'button',
4998
5002
  actionType: 'cancel',
4999
- label: i18next__default["default"].t('frontend_form_cancel')
5003
+ label: i18next__default["default"].t('frontend_form_cancel'),
5004
+ className: 'form-btn-cancel'
5000
5005
  },
5001
5006
  {
5002
5007
  type: 'button',
5003
5008
  label: i18next__default["default"].t('frontend_form_save_and_new'),
5004
5009
  actionType: 'confirm',
5005
5010
  close: false,
5006
- id: "confirmAndNew"
5011
+ id: "confirmAndNew",
5012
+ className: 'form-btn-save_and_new'
5007
5013
  },
5008
5014
  {
5009
5015
  type: 'button',
5010
5016
  actionType: 'confirm',
5011
5017
  label: i18next__default["default"].t('frontend_form_save'),
5012
- primary: true
5018
+ primary: true,
5019
+ className: 'form-btn-save'
5013
5020
  },
5014
5021
  ]
5015
5022
  }
@@ -6164,15 +6171,38 @@ async function getObjectFieldsFilterBarSchema(objectSchema, ctx) {
6164
6171
  if (!ctx) {
6165
6172
  ctx = {};
6166
6173
  }
6174
+ const searchableFields = ctx.searchable_fields;
6175
+ const autoOpenFilter = !!ctx.auto_open_filter;
6167
6176
  const btnSearchId = "btn_filter_form_search_" + new Date().getTime();
6168
6177
  const filterFormSchema = await getObjectFieldsFilterFormSchema(ctx);
6169
6178
  const keywordsSearchBoxName = ctx.keywordsSearchBoxName || "__keywords";
6170
6179
  const onSearchScript = `
6171
- // console.log("===onSearchScript=form==");
6180
+ let isLookup = event.data.isLookup;
6181
+ let __lookupField = event.data.__lookupField;
6172
6182
  const scope = event.context.scoped;
6183
+ let crud = SteedosUI.getClosestAmisComponentByType(scope, "crud");
6173
6184
  var filterForm = scope.parent.parent.getComponents().find(function(n){
6174
6185
  return n.props.type === "form";
6175
6186
  });
6187
+ // 使用filterForm.getValues()的话,并不能拿到本地存储中的过滤条件,所以需要从event.data中取,因为本地存储中的过滤条件自动填充到表单上时filterForm.getValues()拿不到。
6188
+ let filterFormValues = event.data;
6189
+ filterFormValues = JSON.parse(JSON.stringify(filterFormValues)); //只取当层数据域中数据,去除__super层数据
6190
+ const changedFilterFormValues = _.pickBy(filterFormValues, function(n,k){return /^__searchable__/.test(k);});
6191
+ // 同步__changedFilterFormValues中的值
6192
+ // crud && crud.setData({__changedFilterFormValues: {}});
6193
+ let __changedFilterFormValuesKey = "__changedFilterFormValues";
6194
+ if(isLookup && __lookupField){
6195
+ let lookupTag = "__lookup__" + __lookupField.name + "__" + __lookupField.reference_to;
6196
+ if(__lookupField.reference_to_field){
6197
+ lookupTag += "__" + __lookupField.reference_to_field;
6198
+ }
6199
+ __changedFilterFormValuesKey += lookupTag;
6200
+ }
6201
+ if(crud){
6202
+ let crudData = crud.getData();
6203
+ crudData[__changedFilterFormValuesKey] = changedFilterFormValues;
6204
+ crud.setData(crudData);
6205
+ }
6176
6206
  filterForm.handleFormSubmit(event);
6177
6207
  // var filterFormValues = filterForm.getValues();
6178
6208
  // var listView = scope.parent.parent.parent.getComponents().find(function(n){
@@ -6221,11 +6251,8 @@ async function getObjectFieldsFilterBarSchema(objectSchema, ctx) {
6221
6251
  }
6222
6252
  filterService.setData({showFieldsFilter});
6223
6253
  // resizeWindow();//已迁移到搜索栏表单提交事件中执行,因为表单项change后也会触发表单提交了
6224
- // 使用filterForm.getValues()的话,并不能拿到本地存储中的过滤条件,所以需要从event.data中取。
6225
- let filterFormValues = event.data;
6226
6254
  let isFieldsFilterEmpty = SteedosUI.isFilterFormValuesEmpty(filterFormValues);
6227
- let crud = SteedosUI.getClosestAmisComponentByType(scope, "crud");
6228
- let crudService = crud && SteedosUI.getClosestAmisComponentByType(crud.context, "service");
6255
+ let crudService = crud && SteedosUI.getClosestAmisComponentByType(crud.context, "service", {name: "service_object_table_crud"});
6229
6256
  crudService && crudService.setData({isFieldsFilterEmpty, showFieldsFilter});
6230
6257
  `;
6231
6258
  const onCancelScript = `
@@ -6311,10 +6338,27 @@ async function getObjectFieldsFilterBarSchema(objectSchema, ctx) {
6311
6338
 
6312
6339
  // 移除搜索按钮上的红点
6313
6340
  // let crudService = scope.getComponentById("service_listview_" + event.data.objectName);
6314
- let crudService = crud && SteedosUI.getClosestAmisComponentByType(crud.context, "service");
6341
+ let crudService = crud && SteedosUI.getClosestAmisComponentByType(crud.context, "service", {name: "service_object_table_crud"});
6315
6342
  crudService && crudService.setData({isFieldsFilterEmpty: true, showFieldsFilter: false});
6316
6343
  `;
6344
+ /**
6345
+ 给lookup字段配置filter_form_data时可以配置为amis变量,也可以配置为事态key-value键值对象值:
6346
+ ```
6347
+ "filter_form_data": "${selectedPublicGroupFilterFormData|toJson}"
6348
+ ```
6349
+ or
6350
+ ```
6351
+ "filter_form_data": {
6352
+ "public_group_ids": [
6353
+ "67addbef39f9a4503789b38d"
6354
+ ]
6355
+ }
6356
+ ```
6357
+ */
6358
+ const filterFormValues = ctx.filter_form_data;
6317
6359
  const dataProviderInited = `
6360
+ const searchableFields = ${JSON.stringify(searchableFields)};
6361
+ const autoOpenFilter = ${autoOpenFilter};
6318
6362
  const objectName = data.objectName;
6319
6363
  const isLookup = data.isLookup;
6320
6364
  const listName = data.listName;
@@ -6327,6 +6371,11 @@ async function getObjectFieldsFilterBarSchema(objectSchema, ctx) {
6327
6371
  if(defaultSearchableFields){
6328
6372
  defaultSearchableFields = defaultSearchableFields.split(",");
6329
6373
  }
6374
+ if(_.isEmpty(defaultSearchableFields) && searchableFields){
6375
+ if(searchableFields.length){
6376
+ defaultSearchableFields = _.map(searchableFields, 'field');
6377
+ }
6378
+ }
6330
6379
  if(_.isEmpty(defaultSearchableFields) && data.uiSchema){
6331
6380
  let listView = data.uiSchema.list_views[data.listName];
6332
6381
  const sFields = listView && listView.searchable_fields;
@@ -6344,8 +6393,18 @@ async function getObjectFieldsFilterBarSchema(objectSchema, ctx) {
6344
6393
  }
6345
6394
  setData({ filterFormSearchableFields: defaultSearchableFields });
6346
6395
  if(isLookup){
6396
+ let filterFormValues = ${_.isObject(filterFormValues) ? JSON.stringify(filterFormValues) : ('"' + filterFormValues + '"')} || {};
6397
+ const isAmisFormula = typeof filterFormValues === "string" && filterFormValues.indexOf("\${") > -1;
6398
+ if (isAmisFormula){
6399
+ filterFormValues = AmisCore.evaluate(filterFormValues, data) || {};
6400
+ }
6401
+ if (_.isObject(filterFormValues) || !_.isEmpty(filterFormValues)){
6402
+ let fields = data.uiSchema && data.uiSchema.fields;
6403
+ filterFormValues = SteedosUI.getSearchFilterFormValues(filterFormValues, fields);
6404
+ setData({ ...filterFormValues });
6405
+ }
6347
6406
  // looup字段过滤器不在本地缓存记住过滤条件,所以初始始终隐藏过滤器
6348
- setData({ showFieldsFilter: false });
6407
+ setData({ showFieldsFilter: autoOpenFilter });
6349
6408
  }
6350
6409
  else{
6351
6410
  const listViewPropsStoreKey = location.pathname + "/crud";
@@ -7610,7 +7669,7 @@ async function getObjectListHeaderFieldsFilterBar(objectSchema, listViewName, ct
7610
7669
  * @param {*} objectSchema 对象UISchema
7611
7670
  * @returns amisSchema
7612
7671
  */
7613
- function getObjectListHeader$1(objectSchema, listViewName, ctx) {
7672
+ function getObjectListHeader(objectSchema, listViewName, ctx) {
7614
7673
  if (!ctx) {
7615
7674
  ctx = {};
7616
7675
  }
@@ -8936,10 +8995,9 @@ function getObjectHeaderQuickSearchBox(mainObject, fields, formFactor, { isLooku
8936
8995
  }
8937
8996
 
8938
8997
  const onChangeScript = `
8939
- // console.log("==search=onChangeScript===");
8940
8998
  const scope = event.context.scoped;
8941
8999
  let crud = SteedosUI.getClosestAmisComponentByType(scope, "crud");
8942
- // let crudService = crud && SteedosUI.getClosestAmisComponentByType(crud.context, "service");
9000
+ // let crudService = crud && SteedosUI.getClosestAmisComponentByType(crud.context, "service", {name: "service_object_table_crud"});
8943
9001
  let __changedSearchBoxValues = {};
8944
9002
  __changedSearchBoxValues["${keywordsSearchBoxName}"] = event.data["${keywordsSearchBoxName}"];
8945
9003
  // crudService && crudService.setData({__changedSearchBoxValues: __changedSearchBoxValues});
@@ -9306,10 +9364,28 @@ async function getObjectFilter(objectSchema, fields, options) {
9306
9364
  let filterForm = SteedosUI.getClosestAmisComponentByType(scope, "form");
9307
9365
  let filterFormService = SteedosUI.getClosestAmisComponentByType(filterForm.context, "service");
9308
9366
  // 使用event.data的话,并不能拿到本地存储中的过滤条件,所以需要从filterFormService中取。
9309
- let filterFormValues = filterFormService.getData()
9367
+ let filterFormValues = filterFormService.getData();
9368
+ filterFormValues = JSON.parse(JSON.stringify(filterFormValues)); //只取当层数据域中数据,去除__super层数据
9310
9369
  let isFieldsFilterEmpty = SteedosUI.isFilterFormValuesEmpty(filterFormValues);
9311
9370
  let crud = SteedosUI.getClosestAmisComponentByType(scope, "crud");
9312
- let crudService = crud && SteedosUI.getClosestAmisComponentByType(crud.context, "service");
9371
+ const changedFilterFormValues = _.pickBy(filterFormValues, function(n,k){return /^__searchable__/.test(k);});
9372
+ // 这里不用crudService而用crud是因为lookup字段弹出的列表中的crudService中的变量无法传入crud的发送适配器中
9373
+ // crud && crud.setData({__changedFilterFormValues: changedFilterFormValues});
9374
+ let __changedFilterFormValuesKey = "__changedFilterFormValues";
9375
+ if(isLookup && __lookupField){
9376
+ let lookupTag = "__lookup__" + __lookupField.name + "__" + __lookupField.reference_to;
9377
+ if(__lookupField.reference_to_field){
9378
+ lookupTag += "__" + __lookupField.reference_to_field;
9379
+ }
9380
+ __changedFilterFormValuesKey += lookupTag;
9381
+ }
9382
+ if(crud){
9383
+ let crudData = crud.getData();
9384
+ crudData[__changedFilterFormValuesKey] = changedFilterFormValues;
9385
+ crud.setData(crudData);
9386
+ }
9387
+
9388
+ let crudService = crud && SteedosUI.getClosestAmisComponentByType(crud.context, "service", {name: "service_object_table_crud"});
9313
9389
  crudService && crudService.setData({isFieldsFilterEmpty});
9314
9390
  `;
9315
9391
  let onChangeScript = `
@@ -9324,7 +9400,7 @@ async function getObjectFilter(objectSchema, fields, options) {
9324
9400
  filterFormValues = JSON.parse(JSON.stringify(filterFormValues)); //只取当层数据域中数据,去除__super层数据
9325
9401
  let crud = SteedosUI.getClosestAmisComponentByType(scope, "crud");
9326
9402
  const changedFilterFormValues = _.pickBy(filterFormValues, function(n,k){return /^__searchable__/.test(k);});;
9327
- // let crudService = crud && SteedosUI.getClosestAmisComponentByType(crud.context, "service");
9403
+ // let crudService = crud && SteedosUI.getClosestAmisComponentByType(crud.context, "service", {name: "service_object_table_crud"});
9328
9404
  // crudService && crudService.setData({__changedFilterFormValues: changedFilterFormValues});
9329
9405
  // 这里不用crudService而用crud是因为lookup字段弹出的列表中的crudService中的变量无法传入crud的发送适配器中
9330
9406
  // crud && crud.setData({__changedFilterFormValues: changedFilterFormValues});
@@ -9680,7 +9756,7 @@ async function getObjectCRUD(objectSchema, fields, options){
9680
9756
  className: crudModeClassName,
9681
9757
  //目前crud的service层id不认用户自定义id,只支持默认规则id,许多地方的格式都写死了service_listview_${objectname}
9682
9758
  id: `service_${id}`,
9683
- name: `page`,
9759
+ name: "service_object_table_crud",
9684
9760
  data: options.amisData,
9685
9761
  body: body,
9686
9762
  //监听广播事件,重算crud高度
@@ -10027,8 +10103,8 @@ const getRecordPermissions = async (objectName, recordId)=>{
10027
10103
  /*
10028
10104
  * @Author: baozhoutao@steedos.com
10029
10105
  * @Date: 2022-07-05 15:55:39
10030
- * @LastEditors: baozhoutao@steedos.com
10031
- * @LastEditTime: 2024-02-18 14:46:50
10106
+ * @LastEditors: 殷亮辉 yinlianghui@hotoa.com
10107
+ * @LastEditTime: 2025-01-08 13:32:51
10032
10108
  * @Description:
10033
10109
  */
10034
10110
 
@@ -10102,7 +10178,7 @@ async function getObjectRelatedList(
10102
10178
 
10103
10179
  // 获取单个相关表
10104
10180
  async function getRecordDetailRelatedListSchema(objectName, recordId, relatedObjectName, relatedKey, ctx){
10105
- let { top, perPage, appId, relatedLabel, className, columns, sort, filters, visible_on } = ctx;
10181
+ let { top, perPage, appId, relatedLabel, className, columns, sort, filters, visible_on, enableHeaderToolbar } = ctx;
10106
10182
  // console.log('getRecordDetailRelatedListSchema==>',objectName,recordId,relatedObjectName)
10107
10183
  const relatedObjectUiSchema = await getUISchema(relatedObjectName);
10108
10184
  if(!relatedObjectUiSchema){
@@ -10167,6 +10243,10 @@ async function getRecordDetailRelatedListSchema(objectName, recordId, relatedObj
10167
10243
  let headerToolbar = [];
10168
10244
  if(!isMobile){
10169
10245
  headerToolbar.push("bulkActions");
10246
+ if (enableHeaderToolbar) {
10247
+ // 通过 enableHeaderToolbar = true 可以控制是否显示内置的带过滤器的headerToolbar
10248
+ headerToolbar = undefined;
10249
+ }
10170
10250
  }
10171
10251
  const options = {
10172
10252
  globalFilter,
@@ -10205,7 +10285,7 @@ async function getRecordDetailRelatedListSchema(objectName, recordId, relatedObj
10205
10285
  amisSchema: {
10206
10286
  type: "service",
10207
10287
  id: componentId,
10208
- className: `steedos-record-related-list mb-4 last:mb-0 ${componentId} ${className}`,
10288
+ className: `steedos-record-related-list mb-4 last:mb-0 ${componentId} ${className} ${enableHeaderToolbar ? 'enable-header-toolbar' : ''}`,
10209
10289
  data: {
10210
10290
  relatedKey: relatedKey,
10211
10291
  listViewId: `amis-\${appId}-${relatedObjectName}-listview`,
@@ -10307,6 +10387,7 @@ async function getRelatedListSchema(
10307
10387
  listViewName,
10308
10388
  ctx
10309
10389
  ) {
10390
+ const { enableHeaderToolbar } = ctx;
10310
10391
  const uiSchema = await getUISchema(objectName);
10311
10392
  if(!uiSchema){
10312
10393
  return {}
@@ -10359,10 +10440,14 @@ async function getRelatedListSchema(
10359
10440
  delete ctx.filters;
10360
10441
 
10361
10442
  delete ctx.globalFilter;
10443
+ delete ctx.enableHeaderToolbar;
10362
10444
 
10363
10445
  const adaptor = `
10364
10446
  try{
10365
10447
  if(setDataToComponentId){
10448
+ // 子表列表在headerToolbar过滤器中设置过过滤条件的话,始终显示子表列表,无论是否查询到数据
10449
+ // 改为使用css样式控制子表列表放开headerToolbar时,始终显示crud,只隐藏crud内部的表格,从而始终显示headerToolbar不受这里逻辑影响
10450
+ // var headerToolbarFilterChanged = context.isFieldsFilterEmpty === false;
10366
10451
  if(payload.data.count){
10367
10452
  setTimeout(function(){
10368
10453
  // 设计器中获取不到window.$从而导致报错, 所以用纯js替换下。
@@ -10385,7 +10470,7 @@ async function getRelatedListSchema(
10385
10470
  "filters": listviewFilter,
10386
10471
  "filtersFunction": filtersFunction,
10387
10472
  "sort": listViewSort,
10388
- "filterVisible": false,
10473
+ "filterVisible": !!enableHeaderToolbar,
10389
10474
  "requestAdaptor": ctx.requestAdaptor,
10390
10475
  "adaptor": adaptor + ctx.adaptor || '',
10391
10476
  "ctx": ctx,
@@ -10941,7 +11026,8 @@ async function getRecordDetailHeaderSchema(objectName,recordId, options){
10941
11026
  }
10942
11027
 
10943
11028
  async function getRecordDetailSchema(objectName, appId, props = {}){
10944
- const uiSchema = await getUISchema(objectName);
11029
+ const uiSchema = await getUISchema(objectName);
11030
+
10945
11031
  const relatedLists = await getObjectRelatedList(objectName);
10946
11032
  const detailed = {
10947
11033
  "title": i18next__default["default"].t('frontend_record_detail_tab_detailed'),
@@ -10980,6 +11066,21 @@ async function getRecordDetailSchema(objectName, appId, props = {}){
10980
11066
  if(relatedLists.length){
10981
11067
  content.tabs.push(related);
10982
11068
  }
11069
+ const contents = [content];
11070
+ if (uiSchema.enable_chatter && window.BuilderLiveblocks) {
11071
+ const chatter = {
11072
+ "type": "rooms-provider",
11073
+ "baseUrl": "${context.rootUrl}",
11074
+ "body": [
11075
+ {
11076
+ "type": "rooms-comments",
11077
+ "className": "flex flex-col gap-3 m-4",
11078
+ "roomId": "objects:${objectName}:${recordId}",
11079
+ }
11080
+ ]
11081
+ };
11082
+ contents.push(chatter);
11083
+ }
10983
11084
  // content.tabs = reverse(content.tabs)
10984
11085
  return {
10985
11086
  uiSchema,
@@ -10995,7 +11096,7 @@ async function getRecordDetailSchema(objectName, appId, props = {}){
10995
11096
  "showButtons": props.showButtons,
10996
11097
  "showBackButton": props.showBackButton,
10997
11098
  },
10998
- content
11099
+ ...contents,
10999
11100
  ],
11000
11101
  "objectApiName": "${objectName}",
11001
11102
  "recordId": "${recordId}",
@@ -11779,14 +11880,42 @@ function getLookupSapceUserTreeSchema(isMobile){
11779
11880
  {
11780
11881
  "actionType": "custom",
11781
11882
  "script": `
11883
+ console.log("lookup-tree-event.data:",event.data);
11884
+ console.log("lookup-tree-event.data.value.label:",event.data.value.label);
11885
+ console.log("lookup-tree-event.data.value.value:",event.data.value.value);
11782
11886
  const scope = event.context.scoped;
11783
- var filterFormValues={
11887
+ var treeFilterFormValues={
11784
11888
  "__searchable__organizations_parents":event.data.value.value
11785
11889
  }
11786
- var listView = scope.parent.getComponents().find(function(n){
11787
- return n.props.type === "crud";
11890
+ // var listView = scope.parent.getComponents().find(function(n){
11891
+ // return n.props.type === "crud";
11892
+ // });
11893
+ // listView.handleFilterSubmit(Object.assign({}, filterFormValues));
11894
+ let __lookupField = event.data.__lookupField;
11895
+ let crud = SteedosUI.getClosestAmisComponentByType(scope, "crud");
11896
+ var filterForm = scope.getComponents().find(function(n){
11897
+ return n.props.type === "form";
11788
11898
  });
11789
- listView.handleFilterSubmit(Object.assign({}, filterFormValues));
11899
+ let filterFormValues = filterForm.getData();
11900
+ filterFormValues = JSON.parse(JSON.stringify(filterFormValues)); //只取当层数据域中数据,去除__super层数据
11901
+ const changedFilterFormValues = _.pickBy(filterFormValues, function(n,k){return /^__searchable__/.test(k);});
11902
+ Object.assign(changedFilterFormValues, treeFilterFormValues);
11903
+ // 同步__changedFilterFormValues中的值
11904
+ let __changedFilterFormValuesKey = "__changedFilterFormValues";
11905
+ if(__lookupField){
11906
+ let lookupTag = "__lookup__" + __lookupField.name + "__" + __lookupField.reference_to;
11907
+ if(__lookupField.reference_to_field){
11908
+ lookupTag += "__" + __lookupField.reference_to_field;
11909
+ }
11910
+ __changedFilterFormValuesKey += lookupTag;
11911
+ }
11912
+ if(crud){
11913
+ let crudData = crud.getData();
11914
+ crudData[__changedFilterFormValuesKey] = changedFilterFormValues;
11915
+ crud.setData(crudData);
11916
+ }
11917
+ filterForm.setData(treeFilterFormValues);
11918
+ filterForm.handleFormSubmit(event);
11790
11919
  `
11791
11920
  },
11792
11921
  {
@@ -11880,6 +12009,9 @@ async function lookupToAmisPicker(field, readonly, ctx){
11880
12009
  ctx.idFieldName = refObjectConfig.idFieldName;
11881
12010
  ctx.objectName = refObjectConfig.name;
11882
12011
 
12012
+ // 是否显示lookup字段左侧的过滤器(如果有的话),默认为true,目前只有lookup选人字段有左侧树过滤器
12013
+ const showLeftFilter = field.show_left_filter !== false;
12014
+
11883
12015
  let tableFields = [];
11884
12016
  const searchableFields = [];
11885
12017
 
@@ -12001,6 +12133,7 @@ async function lookupToAmisPicker(field, readonly, ctx){
12001
12133
  // field.name可能是带点的名称,比如审批王中子表字段'instances.instances_submitter',如果不替换掉点,会造成审批王表单中新建子表行时报错
12002
12134
  let keywordsSearchBoxName = `__keywords_lookup__${field.name.replace(/\./g, "_")}__to__${refObjectConfig.name}`;
12003
12135
 
12136
+ const filterFormValues = field.filter_form_data;
12004
12137
  source.requestAdaptor = `
12005
12138
  let __changedFilterFormValuesKey = "__changedFilterFormValues";
12006
12139
  let __lookupField = api.data.$self.__lookupField;
@@ -12043,7 +12176,20 @@ async function lookupToAmisPicker(field, readonly, ctx){
12043
12176
  }
12044
12177
  }
12045
12178
 
12046
- var searchableFilter = SteedosUI.getSearchFilter(selfData) || [];
12179
+ let filterFormValues = {};
12180
+ if (selfData.op !== 'loadOptions'){
12181
+ filterFormValues = ${___namespace.isObject(filterFormValues) ? JSON.stringify(filterFormValues) : ('"' + filterFormValues + '"')} || {};
12182
+ const isAmisFormula = typeof filterFormValues === "string" && filterFormValues.indexOf("\${") > -1;
12183
+ if (isAmisFormula){
12184
+ filterFormValues = AmisCore.evaluate(filterFormValues, context) || {};
12185
+ }
12186
+ if (_.isObject(filterFormValues) || !_.isEmpty(filterFormValues)){
12187
+ let fields = api.data.$self.uiSchema && api.data.$self.uiSchema.fields;
12188
+ filterFormValues = SteedosUI.getSearchFilterFormValues(filterFormValues, fields);
12189
+ }
12190
+ }
12191
+
12192
+ var searchableFilter = SteedosUI.getSearchFilter(Object.assign({}, { ...filterFormValues }, selfData)) || [];
12047
12193
 
12048
12194
  if(searchableFilter.length > 0){
12049
12195
  if(filters.length > 0 ){
@@ -12211,6 +12357,20 @@ async function lookupToAmisPicker(field, readonly, ctx){
12211
12357
  });
12212
12358
  payload.data.rows = updatedResult;
12213
12359
  }
12360
+ let __changedFilterFormValuesKey = "__changedFilterFormValues";
12361
+ let __lookupField = api.data.$self.__lookupField;
12362
+ if(__lookupField){
12363
+ let lookupTag = "__lookup__" + __lookupField.name + "__" + __lookupField.reference_to;
12364
+ if(__lookupField.reference_to_field){
12365
+ lookupTag += "__" + __lookupField.reference_to_field;
12366
+ }
12367
+ __changedFilterFormValuesKey += lookupTag;
12368
+ }
12369
+ let __changedFilterFormValues = api.context[__changedFilterFormValuesKey] || {};
12370
+ let __changedSearchBoxValues = api.context.__changedSearchBoxValues || {};
12371
+ // 列表搜索和快速搜索,有时在某些操作情况下还是会造成crud接口请求使用的过滤条件是上次的,这里强制把正确的过滤条件返回到crud,详细规则见:https://github.com/steedos/steedos-platform/issues/7112
12372
+ payload.data[__changedFilterFormValuesKey] = __changedFilterFormValues;
12373
+ payload.data.__changedSearchBoxValues = __changedSearchBoxValues;
12214
12374
  return payload;
12215
12375
  `;
12216
12376
  if(field.optionsFunction || field._optionsFunction){
@@ -12219,7 +12379,7 @@ async function lookupToAmisPicker(field, readonly, ctx){
12219
12379
  return payload;
12220
12380
  `;
12221
12381
  }
12222
- let top = 20;
12382
+ let top = 500;
12223
12383
 
12224
12384
  if(refObjectConfig.paging && refObjectConfig.paging.enabled === false){
12225
12385
  top = 1000;
@@ -12246,7 +12406,7 @@ async function lookupToAmisPicker(field, readonly, ctx){
12246
12406
 
12247
12407
  pickerSchema.headerToolbar = getObjectHeaderToolbar(refObjectConfig, fieldsArr, ctx.formFactor, { isLookup: true, keywordsSearchBoxName });
12248
12408
 
12249
- if(referenceTo.objectName === "space_users" && field.reference_to_field === "user"){
12409
+ if(referenceTo.objectName === "space_users" && field.reference_to_field === "user" && showLeftFilter){
12250
12410
  pickerSchema.headerToolbar.push(getLookupSapceUserTreeSchema(isMobile));
12251
12411
  pickerSchema.className = pickerSchema.className || "" + " steedos-select-user";
12252
12412
  }
@@ -12266,7 +12426,11 @@ async function lookupToAmisPicker(field, readonly, ctx){
12266
12426
  pickerSchema.filter = await getObjectFilter(refObjectConfig, fields, {
12267
12427
  ...ctx,
12268
12428
  isLookup: true,
12269
- keywordsSearchBoxName
12429
+ keywordsSearchBoxName,
12430
+ searchable_fields: field.searchable_fields,
12431
+ auto_open_filter: field.auto_open_filter,
12432
+ show_left_filter: field.show_left_filter,
12433
+ filter_form_data: field.filter_form_data
12270
12434
  });
12271
12435
  }
12272
12436
  pickerSchema.data = Object.assign({}, pickerSchema.data, {
@@ -12760,6 +12924,10 @@ async function lookupToAmis(field, readonly, ctx){
12760
12924
  }
12761
12925
  let amisSchema;
12762
12926
  // 默认使用下拉框模式显示lookup选项,只能配置了enable_enhanced_lookup才使用弹出增强模式
12927
+ if(enableEnhancedLookup == true && field.amis && field.amis.type && field.amis.type !== 'picker'){
12928
+ // 如果配置了amis.type且其值不是picker,则不使用弹出增强模式
12929
+ enableEnhancedLookup = false;
12930
+ }
12763
12931
  if(enableEnhancedLookup == true){
12764
12932
  amisSchema = await lookupToAmisPicker(field, readonly, ctx);
12765
12933
  }else if(refObject.enable_tree) {
@@ -13891,7 +14059,16 @@ async function convertSFieldToAmisField(field, readonly, ctx) {
13891
14059
  return convertData
13892
14060
  }
13893
14061
  // if(ctx.mode === 'edit'){
13894
- let convertDataResult = Object.assign({}, baseData, convertData, { labelClassName: 'text-left', clearValueOnHidden: true, fieldName: field.name}, field.amis, {name: baseData.name});
14062
+ let convertDataResult;
14063
+ if(convertData.type == "steedos-field"){
14064
+ // 如果是steedos-field,不能把amis属性合并到steedos-field根属性中,要合并也是合并到steedos-field的config.amis中
14065
+ // 而steedos-field字段的amis属性本身就在config.amis中了,所以这里不需要再合并field.amis
14066
+ // 目前测试到受影响的是,把字段的amis属性配置为{"type": "checkboxes"}时,ObjectForm只读模式下,lookup字段返回的是type为steedos-field的组件,此时field.amis中的type不应该合并到steedos-field根属性中
14067
+ convertDataResult = Object.assign({}, baseData, convertData, { labelClassName: 'text-left', clearValueOnHidden: true, fieldName: field.name}, {name: baseData.name});
14068
+ }
14069
+ else {
14070
+ convertDataResult = Object.assign({}, baseData, convertData, { labelClassName: 'text-left', clearValueOnHidden: true, fieldName: field.name}, field.amis, {name: baseData.name});
14071
+ }
13895
14072
  // 只读时file字段的外层control层若存在name,内部each组件存在问题
13896
14073
  if(readonly && field.type == "file") {
13897
14074
  convertDataResult.name = "";
@@ -16036,7 +16213,7 @@ async function getListviewInitSchema(objectApiName, listViewName, ctx) {
16036
16213
  const defaults = ctx.defaults || {};
16037
16214
  if(!defaults.headerSchema){
16038
16215
  //传入isListviewInit是区别于对象列表类型的微页面,即getListPageInitSchema函数中该属性为false
16039
- const headerSchema = await getObjectListHeader$1(uiSchema, listViewName, {
16216
+ const headerSchema = await getObjectListHeader(uiSchema, listViewName, {
16040
16217
  onlySecordLine: true,
16041
16218
  isListviewInit: true
16042
16219
  });
@@ -18587,7 +18764,7 @@ exports.getObjectDetailMoreButtons = getObjectDetailMoreButtons;
18587
18764
  exports.getObjectFieldsFilterBarSchema = getObjectFieldsFilterBarSchema;
18588
18765
  exports.getObjectFieldsFilterButtonSchema = getObjectFieldsFilterButtonSchema;
18589
18766
  exports.getObjectFieldsFilterFormSchema = getObjectFieldsFilterFormSchema;
18590
- exports.getObjectListHeader = getObjectListHeader$1;
18767
+ exports.getObjectListHeader = getObjectListHeader;
18591
18768
  exports.getObjectListHeaderFieldsFilterBar = getObjectListHeaderFieldsFilterBar;
18592
18769
  exports.getObjectListHeaderFirstLine = getObjectListHeaderFirstLine;
18593
18770
  exports.getObjectListHeaderSecordLine = getObjectListHeaderSecordLine;