@steedos-widgets/amis-lib 1.3.17-beta.1 → 1.3.17

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
@@ -2615,19 +2615,25 @@ async function getTableApi(mainObject, fields, options){
2615
2615
  if(options.isRelated){
2616
2616
  api.url += "&recordId=${_master.recordId}";
2617
2617
  }
2618
- api.cache = 3000;
2619
-
2618
+ api.cache = 3000;
2620
2619
  api.data.$term = "$term";
2621
2620
  api.data.term = "$term";
2622
2621
  api.data.$self = "$$";
2623
2622
  api.data.self = "$$";
2624
2623
  api.data.filter = "$filter";
2625
- api.data.__filterFormValues = "${__filterFormValues}";
2626
- api.data.__serachBoxValues = "${__serachBoxValues}";
2627
2624
  api.data.loaded = "${loaded}";
2628
2625
  api.data.listViewId = "${listViewId}";
2629
2626
  api.data.listName = "${listName}";
2630
2627
  api.requestAdaptor = `
2628
+ let __changedFilterFormValues = api.data.$self.__changedFilterFormValues || {};
2629
+ let __changedSearchBoxValues = api.data.$self.__changedSearchBoxValues || {};
2630
+ // 把表单搜索和快速搜索中的change事件中记录的过滤条件也拼到$self中,是为解决触发搜索请求时,两边输入的过滤条件都带上,即:
2631
+ // 有时在搜索表单中输入过滤条件事,忘记点击回车键或搜索按钮,而是进一步修改快速搜索框中的关键字点击其中回车键触发搜索
2632
+ // 这种情况下,触发的搜索请求中没有带上搜索表单中输入的过滤条件。
2633
+ // 反过来先在快速搜索框中输入过滤条件却不点击其中回车键触发搜索,而是到搜索表单中触发搜索请求也是一样的。
2634
+ // 这里直接合并到api.data.$self,而不是后面定义的selfData变量,是因为可以省去在接收适配器中写一样的合并逻辑
2635
+ // 如果有问题可以改为合并到selfData变量中,但是要在接收适配器中写上一样的合并逻辑,否则里面的过滤条件不会存入本地存储中
2636
+ Object.assign(api.data.$self, __changedSearchBoxValues, __changedFilterFormValues);
2631
2637
  // selfData 中的数据由 CRUD 控制. selfData中,只能获取到 CRUD 给定的data. 无法从数据链中获取数据.
2632
2638
  let selfData = JSON.parse(JSON.stringify(api.data.$self));
2633
2639
  // 保留一份初始data,以供自定义发送适配器中获取原始数据。
@@ -2697,11 +2703,7 @@ async function getTableApi(mainObject, fields, options){
2697
2703
  userFilters = [["${valueField.name}", "=", selfData.value]];
2698
2704
  }
2699
2705
 
2700
- const __filterFormValues = api.data.__filterFormValues;
2701
- const __serachBoxValues = api.data.__serachBoxValues;
2702
- // 筛选按钮
2703
- const filterSelfData = __filterFormValues ? __filterFormValues : selfData;
2704
- var searchableFilter = SteedosUI.getSearchFilter(filterSelfData) || [];
2706
+ var searchableFilter = SteedosUI.getSearchFilter(selfData) || [];
2705
2707
  if(searchableFilter.length > 0){
2706
2708
  if(userFilters.length > 0 ){
2707
2709
  userFilters = [userFilters, 'and', searchableFilter];
@@ -2722,8 +2724,7 @@ async function getTableApi(mainObject, fields, options){
2722
2724
  })
2723
2725
  }
2724
2726
 
2725
- const keyWords = __serachBoxValues ? __serachBoxValues.__keywords : selfData.__keywords;
2726
- var keywordsFilters = SteedosUI.getKeywordsSearchFilter(keyWords, allowSearchFields);
2727
+ var keywordsFilters = SteedosUI.getKeywordsSearchFilter(selfData.__keywords, allowSearchFields);
2727
2728
  if(keywordsFilters && keywordsFilters.length > 0){
2728
2729
  userFilters.push(keywordsFilters);
2729
2730
  }
@@ -2876,6 +2877,7 @@ async function getTableApi(mainObject, fields, options){
2876
2877
  selfData.page = localListViewProps.page || 1;
2877
2878
  }
2878
2879
  }
2880
+
2879
2881
  delete selfData.context;
2880
2882
  delete selfData.global;
2881
2883
  sessionStorage.setItem(listViewPropsStoreKey, JSON.stringify(selfData));
@@ -5649,6 +5651,7 @@ async function getObjectFieldsFilterBarSchema(objectSchema, ctx) {
5649
5651
  const filterFormSchema = await getObjectFieldsFilterFormSchema(ctx);
5650
5652
  const keywordsSearchBoxName = ctx.keywordsSearchBoxName || "__keywords";
5651
5653
  const onSearchScript = `
5654
+ // console.log("===onSearchScript=form==");
5652
5655
  const scope = event.context.scoped;
5653
5656
  var filterForm = scope.parent.parent.getComponents().find(function(n){
5654
5657
  return n.props.type === "form";
@@ -5705,25 +5708,13 @@ async function getObjectFieldsFilterBarSchema(objectSchema, ctx) {
5705
5708
  crudService && crudService.setData({isFieldsFilterEmpty, showFieldsFilter});
5706
5709
  `;
5707
5710
  const onCancelScript = `
5708
- doAction(
5709
- {
5710
- "componentId": 'service_${ctx.crudId}',
5711
- "actionType": "setValue",
5712
- "args": {
5713
- "value": {
5714
- "__filterFormValues": null
5715
- }
5716
- }
5717
- }
5718
- )
5711
+ // console.log("===onCancelScript=form==");
5719
5712
  const scope = event.context.scoped;
5720
5713
  var filterForm = scope.parent.parent.getComponents().find(function(n){
5721
5714
  return n.props.type === "form";
5722
5715
  });
5723
5716
  var filterFormValues = filterForm.getValues();
5724
- var listView = scope.parent.parent.parent.getComponents().find(function(n){
5725
- return n.props.type === "crud";
5726
- });
5717
+ let crud = SteedosUI.getClosestAmisComponentByType(scope, "crud");
5727
5718
  const removedValues = {};
5728
5719
  for(var k in filterFormValues){
5729
5720
  if(/^__searchable__/.test(k)){
@@ -5738,7 +5729,7 @@ async function getObjectFieldsFilterBarSchema(objectSchema, ctx) {
5738
5729
  if(localListViewProps){
5739
5730
  localListViewProps = JSON.parse(localListViewProps);
5740
5731
  for(var k in localListViewProps){
5741
- if(k !== "__keywords"){
5732
+ if(/^__searchable__/.test(k)){
5742
5733
  removedValues[k] = null;
5743
5734
  }
5744
5735
  }
@@ -5749,20 +5740,35 @@ async function getObjectFieldsFilterBarSchema(objectSchema, ctx) {
5749
5740
  //lookup字段保留快速搜索条件
5750
5741
  removedValues[keywordsSearchBoxName] = filterFormValues[keywordsSearchBoxName];
5751
5742
  }
5752
- filterForm.reset();
5753
- setTimeout(()=>{
5754
- listView.handleFilterSubmit(removedValues);
5755
- }, 100);
5756
- const filterService = filterForm.context.getComponents().find(function(n){
5757
- return n.props.type === "service";
5758
- });
5759
- filterService.setData({showFieldsFilter: !!!filterService.props.data.showFieldsFilter});
5743
+ filterForm.setValues(removedValues);//会把表单提交到toolbar的快速搜索区域,造成在快速搜索框中触发搜索时再次把搜索表单中的字段值清除掉的bug,已单独在快速搜索框那边添加搜索事件代码处理过了
5744
+ // 以下方法都无法实现清除表单值
5745
+ // filterForm.setValues({}, true)
5746
+ // filterForm.reset();
5747
+ // filterForm.handleAction({},{
5748
+ // "actionType": "setValue",
5749
+ // "args": {
5750
+ // "value": removedValues
5751
+ // }
5752
+ // });
5753
+ // 下面触发clear动作可以清除表单值,且不会把表单提交到toolbar的快速搜索区域,但是会把金额等范围字段清空成非范围字段
5754
+ // filterForm.handleAction({},{
5755
+ // "actionType": "clear"
5756
+ // });
5757
+
5758
+ // 清除__changedFilterFormValues中的值
5759
+ crud && crud.setData({__changedFilterFormValues: {}});
5760
+ filterForm.handleFormSubmit(event);
5761
+ // crud.handleFilterSubmit(removedValues);
5762
+
5763
+ let filterFormService = SteedosUI.getClosestAmisComponentByType(filterForm.context, "service");
5764
+ filterFormService.setData({showFieldsFilter: !!!filterFormService.props.data.showFieldsFilter});
5760
5765
  //触发amis crud 高度重算
5761
5766
  setTimeout(()=>{
5762
5767
  window.dispatchEvent(new Event("resize"))
5763
5768
  }, 100);
5764
5769
  // 移除搜索按钮上的红点
5765
- let crudService = scope.getComponentById("service_listview_" + event.data.objectName);
5770
+ // let crudService = scope.getComponentById("service_listview_" + event.data.objectName);
5771
+ let crudService = crud && SteedosUI.getClosestAmisComponentByType(crud.context, "service");
5766
5772
  crudService && crudService.setData({isFieldsFilterEmpty: true, showFieldsFilter: false});
5767
5773
  `;
5768
5774
  const dataProviderInited = `
@@ -7628,7 +7634,8 @@ crudService && crudService.setData({showFieldsFilter: toShowFieldsFilter});
7628
7634
  // }
7629
7635
  `;
7630
7636
 
7631
- function getObjectHeaderQuickSearchBox(mainObject, fields, formFactor, { isLookup = false, keywordsSearchBoxName = "__keywords", crudId } = {}){
7637
+ // function getObjectHeaderQuickSearchBox(mainObject, fields, formFactor, { isLookup = false, keywordsSearchBoxName = "__keywords", crudId } = {}){
7638
+ function getObjectHeaderQuickSearchBox(mainObject, fields, formFactor, { isLookup = false, keywordsSearchBoxName = "__keywords" } = {}){
7632
7639
  const searchableFieldsLabel = [];
7633
7640
  _.each(mainObject.fields, function (field) {
7634
7641
  if (isFieldQuickSearchable(field, mainObject.NAME_FIELD_KEY)) {
@@ -7644,6 +7651,33 @@ function getObjectHeaderQuickSearchBox(mainObject, fields, formFactor, { isLooku
7644
7651
  crudKeywords = (localListViewProps && localListViewProps.__keywords) || "";
7645
7652
  }
7646
7653
 
7654
+ const onChangeScript = `
7655
+ const scope = event.context.scoped;
7656
+ let crud = SteedosUI.getClosestAmisComponentByType(scope, "crud");
7657
+ // let crudService = crud && SteedosUI.getClosestAmisComponentByType(crud.context, "service");
7658
+ let __changedSearchBoxValues = {};
7659
+ __changedSearchBoxValues["${keywordsSearchBoxName}"] = event.data["${keywordsSearchBoxName}"];
7660
+ // crudService && crudService.setData({__changedSearchBoxValues: __changedSearchBoxValues});
7661
+ // 这里不用crudService而用crud是因为lookup字段弹出的列表中的crudService中的变量无法传入crud的发送适配器中
7662
+ crud && crud.setData({__changedSearchBoxValues: __changedSearchBoxValues});
7663
+ `;
7664
+
7665
+ // onSearchScript中加上了onChangeScript中的脚本,是因为amis 3.2不能用change事件执行onChangeScript
7666
+ // 而点击回车按键又不会触发blur事件,所以只能每次回车事件中额外再执行一次onChangeScript
7667
+ // 等升级到amis 3.4+,blur事件换成change事件执行onChangeScript,就可以不用在onSearchScript中执行onChangeScript了
7668
+ const onSearchScript = `
7669
+ ${onChangeScript}
7670
+
7671
+ // 下面的脚本只为解决点击搜索表单取消按钮,再重新在其中输入过滤条件但是不点击搜索按钮或回车按键触发搜索,此时在快速搜索框输入过滤条件按回车按键会把搜索表单中的过滤条件清空的问题
7672
+ // const scope = event.context.scoped;
7673
+ // 如果点击过顶部搜索栏表单的取消按钮,会把此处event.data.__super.__super.__super中的搜索表单项的所有字段设置为null
7674
+ // 点击取消按钮后继续在表单项中输入过滤条件且最后没有点击回车按键或点击表单项搜索按钮的话,在快速搜索中点击回车按钮提交搜索会所顶部搜索表单中的字段值清空
7675
+ let filterForm = SteedosUI.getClosestAmisComponentByType(scope, "form");
7676
+ setTimeout(function(){
7677
+ filterForm.setValues(event.data.__changedFilterFormValues);
7678
+ }, 500);
7679
+ `;
7680
+
7647
7681
  return {
7648
7682
  "type": "tooltip-wrapper",
7649
7683
  "id": "steedos_crud_toolbar_quick_search",
@@ -7662,28 +7696,24 @@ function getObjectHeaderQuickSearchBox(mainObject, fields, formFactor, { isLooku
7662
7696
  "placeholder": "搜索此列表",
7663
7697
  "value": crudKeywords,
7664
7698
  "clearable": true,
7665
- "clearAndSubmit": true,
7699
+ // "clearAndSubmit": true,//因为清除并不会触发失去焦点事件,只有禁用,但是它会触发change事件,所以等升级到amis 3.4+后可以重新放开
7666
7700
  "searchImediately": false,
7667
7701
  "onEvent": {
7668
- "change": {
7702
+ "search": {
7669
7703
  "actions": [
7670
7704
  {
7671
7705
  "actionType": "custom",
7672
- "script": `
7673
- doAction(
7674
- {
7675
- "componentId": 'service_${crudId}',
7676
- "actionType": "setValue",
7677
- "args": {
7678
- "value": {
7679
- "__serachBoxValues": event.data
7680
- }
7681
- }
7682
- }
7683
- )
7684
- `
7706
+ "script": onSearchScript
7685
7707
  }
7686
7708
  ]
7709
+ },
7710
+ "blur": { //这里把change事件换成blur是因为amis 3.2change事件中setData会卡,升级到3.4+后就可以换回change事件
7711
+ "actions": [
7712
+ {
7713
+ "actionType": "custom",
7714
+ "script": onChangeScript
7715
+ },
7716
+ ]
7687
7717
  }
7688
7718
  }
7689
7719
  }
@@ -7692,7 +7722,7 @@ function getObjectHeaderQuickSearchBox(mainObject, fields, formFactor, { isLooku
7692
7722
  }
7693
7723
 
7694
7724
  function getObjectHeaderToolbar(mainObject, fields, formFactor, {
7695
- showDisplayAs = false, hiddenCount = false, headerToolbarItems, crudId,
7725
+ showDisplayAs = false, hiddenCount = false, headerToolbarItems,
7696
7726
  filterVisible = true, isLookup = false, keywordsSearchBoxName } = {}){
7697
7727
  // console.log(`getObjectHeaderToolbar====>`, filterVisible)
7698
7728
  // console.log(`getObjectHeaderToolbar`, mainObject)
@@ -7796,7 +7826,7 @@ function getObjectHeaderToolbar(mainObject, fields, formFactor, {
7796
7826
  };
7797
7827
  }
7798
7828
  let toolbarDisplayAsButton = getDisplayAsButton(mainObject?.name);
7799
- let toolbarDQuickSearchBox = getObjectHeaderQuickSearchBox(mainObject, fields, formFactor, { isLookup, keywordsSearchBoxName, crudId });
7829
+ let toolbarDQuickSearchBox = getObjectHeaderQuickSearchBox(mainObject, fields, formFactor, { isLookup, keywordsSearchBoxName });
7800
7830
 
7801
7831
  // toolbars返回的数组元素不可以是空对象{},比如hiddenCount ? {} : {"type": "tpl",...},因为空对象最终还是会生成一个空的.antd-Crud-toolbar-item dom
7802
7832
  // 当出现空的.antd-Crud-toolbar-item dom时会影响toolbar元素的maring-right css样式计算,如果有动态需要应该加到动态数组变量toolbars中
@@ -7944,6 +7974,20 @@ async function getObjectFilter(objectSchema, fields, options) {
7944
7974
  let crudService = crud && SteedosUI.getClosestAmisComponentByType(crud.context, "service");
7945
7975
  crudService && crudService.setData({isFieldsFilterEmpty});
7946
7976
  `;
7977
+ let onChangeScript = `
7978
+ const scope = event.context.scoped;
7979
+ // let filterFormValues = event.data;
7980
+ let filterForm = SteedosUI.getClosestAmisComponentByType(scope, "form");
7981
+ let filterFormService = SteedosUI.getClosestAmisComponentByType(filterForm.context, "service");
7982
+ // 使用event.data的话,并不能拿到本地存储中的过滤条件,所以需要从filterFormService中取。
7983
+ let filterFormValues = filterFormService.getData();
7984
+ let crud = SteedosUI.getClosestAmisComponentByType(scope, "crud");
7985
+ const changedFilterFormValues = _.pickBy(filterFormValues, function(n,k){return /^__searchable__/.test(k);});;
7986
+ // let crudService = crud && SteedosUI.getClosestAmisComponentByType(crud.context, "service");
7987
+ // crudService && crudService.setData({__changedFilterFormValues: changedFilterFormValues});
7988
+ // 这里不用crudService而用crud是因为lookup字段弹出的列表中的crudService中的变量无法传入crud的发送适配器中
7989
+ crud && crud.setData({__changedFilterFormValues: changedFilterFormValues});
7990
+ `;
7947
7991
  return {
7948
7992
  "title": "",
7949
7993
  "submitText": "",
@@ -7967,19 +8011,7 @@ async function getObjectFilter(objectSchema, fields, options) {
7967
8011
  "actions": [
7968
8012
  {
7969
8013
  "actionType": "custom",
7970
- "script": `
7971
- doAction(
7972
- {
7973
- "componentId": 'service_${options.crudId}',
7974
- "actionType": "setValue",
7975
- "args": {
7976
- "value": {
7977
- "__filterFormValues": event.data
7978
- }
7979
- }
7980
- }
7981
- )
7982
- `
8014
+ "script": onChangeScript
7983
8015
  }
7984
8016
  ]
7985
8017
  }
@@ -8054,7 +8086,6 @@ async function getObjectCRUD(objectSchema, fields, options){
8054
8086
  const bulkActions = getBulkActions(objectSchema);
8055
8087
  const defaults = options.defaults;
8056
8088
  const listSchema = (defaults && defaults.listSchema) || {};
8057
- const id = `listview_${objectSchema.name}`;
8058
8089
 
8059
8090
  const bodyProps = {
8060
8091
  // toolbar: getToolbar(),
@@ -8064,7 +8095,7 @@ async function getObjectCRUD(objectSchema, fields, options){
8064
8095
  ...options,
8065
8096
  disableStatistics: options.queryCount === false
8066
8097
  }),
8067
- filter: options.filterVisible !== false && await getObjectFilter(objectSchema, fields, Object.assign({}, options, {crudId: id})),
8098
+ filter: options.filterVisible !== false && await getObjectFilter(objectSchema, fields, options),
8068
8099
  };
8069
8100
  if(options.formFactor !== 'SMALL' || ["split"].indexOf(options.displayAs) == -1){
8070
8101
  if(listSchema.mode !== "cards"){
@@ -8093,8 +8124,7 @@ async function getObjectCRUD(objectSchema, fields, options){
8093
8124
  showDisplayAs,
8094
8125
  hiddenCount: options.queryCount === false,
8095
8126
  headerToolbarItems: options.headerToolbarItems,
8096
- filterVisible: options.filterVisible,
8097
- crudId: id
8127
+ filterVisible: options.filterVisible
8098
8128
  });
8099
8129
 
8100
8130
  options.amisData = createObject(options.amisData, {
@@ -8107,6 +8137,7 @@ async function getObjectCRUD(objectSchema, fields, options){
8107
8137
 
8108
8138
 
8109
8139
  let body = null;
8140
+ const id = `listview_${objectSchema.name}`;
8110
8141
  if(options.formFactor === 'SMALL' && false){
8111
8142
  delete bodyProps.bulkActions;
8112
8143
  delete bodyProps.headerToolbar;
@@ -10338,6 +10369,13 @@ async function lookupToAmisPicker(field, readonly, ctx){
10338
10369
  source.data.$self = "$$";
10339
10370
 
10340
10371
  source.requestAdaptor = `
10372
+ let __changedFilterFormValues = api.data.$self.__changedFilterFormValues || {};
10373
+ let __changedSearchBoxValues = api.data.$self.__changedSearchBoxValues || {};
10374
+ // 把表单搜索和快速搜索中的change事件中记录的过滤条件也拼到$self中,是为解决触发搜索请求时,两边输入的过滤条件都带上,即:
10375
+ // 有时在搜索表单中输入过滤条件事,忘记点击回车键或搜索按钮,而是进一步修改快速搜索框中的关键字点击其中回车键触发搜索
10376
+ // 这种情况下,触发的搜索请求中没有带上搜索表单中输入的过滤条件。
10377
+ // 反过来先在快速搜索框中输入过滤条件却不点击其中回车键触发搜索,而是到搜索表单中触发搜索请求也是一样的。
10378
+ Object.assign(api.data.$self, __changedSearchBoxValues, __changedFilterFormValues);
10341
10379
  const selfData = JSON.parse(JSON.stringify(api.data.$self));
10342
10380
  var filters = [];
10343
10381
  var pageSize = api.data.pageSize || 10;
@@ -10404,7 +10442,7 @@ async function lookupToAmisPicker(field, readonly, ctx){
10404
10442
  const filtersFunction = ${field.filtersFunction || field._filtersFunction};
10405
10443
 
10406
10444
  if(filtersFunction && !inFilterForm){
10407
- const _filters = filtersFunction(filters, api.data.$self.__super.__super);
10445
+ const _filters = filtersFunction(filters, api.data.$self.__super);
10408
10446
  if(_filters && _filters.length > 0){
10409
10447
  filters.push(_filters);
10410
10448
  }
@@ -11981,9 +12019,7 @@ async function getFieldSearchable(perField, permissionFields, ctx){
11981
12019
 
11982
12020
  const amisField = await convertSFieldToAmisField(_field, false, Object.assign({}, ctx, {fieldNamePrefix: fieldNamePrefix, required: false, showSystemFields: true, inFilterForm: true}));
11983
12021
  if(amisField){
11984
- return Object.assign({}, amisField,{
11985
- submitOnChange: false
11986
- });
12022
+ return amisField;
11987
12023
  }
11988
12024
  }
11989
12025
  }
@@ -12376,12 +12412,16 @@ async function getForm(props, mode = "edit") {
12376
12412
  }
12377
12413
  else if (mode === "new") {
12378
12414
  let onNewItemSubmitScript = `
12379
- event.data["${props.name}"].push(JSON.parse(JSON.stringify(event.data)));
12415
+ let fieldValue = _.cloneDeep(event.data["${props.name}"]);
12416
+ if(!fieldValue){
12417
+ fieldValue = [];
12418
+ }
12419
+ fieldValue.push(JSON.parse(JSON.stringify(event.data)));
12380
12420
  doAction({
12381
12421
  "componentId": "${props.id}",
12382
12422
  "actionType": "setValue",
12383
12423
  "args": {
12384
- "value": event.data["${props.name}"]
12424
+ "value": fieldValue
12385
12425
  }
12386
12426
  });
12387
12427
  `;
@@ -12584,7 +12624,7 @@ const getAmisInputTableSchema = async (props, readonly) => {
12584
12624
  "className": props.className
12585
12625
  };
12586
12626
  if (props.addable) {
12587
- let buttonNewSchema = getButtonNew(props);
12627
+ let buttonNewSchema = await getButtonNew(props);
12588
12628
  schema.body.push(buttonNewSchema);
12589
12629
  }
12590
12630
  if (props.amis) {