@steedos-widgets/amis-lib 1.3.17-beta.2 → 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.cjs.js CHANGED
@@ -2642,19 +2642,25 @@ async function getTableApi(mainObject, fields, options){
2642
2642
  if(options.isRelated){
2643
2643
  api.url += "&recordId=${_master.recordId}";
2644
2644
  }
2645
- // api.cache = 3000;
2646
-
2645
+ api.cache = 3000;
2647
2646
  api.data.$term = "$term";
2648
2647
  api.data.term = "$term";
2649
2648
  api.data.$self = "$$";
2650
2649
  api.data.self = "$$";
2651
2650
  api.data.filter = "$filter";
2652
- api.data.__filterFormValues = "${__filterFormValues}";
2653
- api.data.__serachBoxValues = "${__serachBoxValues}";
2654
2651
  api.data.loaded = "${loaded}";
2655
2652
  api.data.listViewId = "${listViewId}";
2656
2653
  api.data.listName = "${listName}";
2657
2654
  api.requestAdaptor = `
2655
+ let __changedFilterFormValues = api.data.$self.__changedFilterFormValues || {};
2656
+ let __changedSearchBoxValues = api.data.$self.__changedSearchBoxValues || {};
2657
+ // 把表单搜索和快速搜索中的change事件中记录的过滤条件也拼到$self中,是为解决触发搜索请求时,两边输入的过滤条件都带上,即:
2658
+ // 有时在搜索表单中输入过滤条件事,忘记点击回车键或搜索按钮,而是进一步修改快速搜索框中的关键字点击其中回车键触发搜索
2659
+ // 这种情况下,触发的搜索请求中没有带上搜索表单中输入的过滤条件。
2660
+ // 反过来先在快速搜索框中输入过滤条件却不点击其中回车键触发搜索,而是到搜索表单中触发搜索请求也是一样的。
2661
+ // 这里直接合并到api.data.$self,而不是后面定义的selfData变量,是因为可以省去在接收适配器中写一样的合并逻辑
2662
+ // 如果有问题可以改为合并到selfData变量中,但是要在接收适配器中写上一样的合并逻辑,否则里面的过滤条件不会存入本地存储中
2663
+ Object.assign(api.data.$self, __changedSearchBoxValues, __changedFilterFormValues);
2658
2664
  // selfData 中的数据由 CRUD 控制. selfData中,只能获取到 CRUD 给定的data. 无法从数据链中获取数据.
2659
2665
  let selfData = JSON.parse(JSON.stringify(api.data.$self));
2660
2666
  // 保留一份初始data,以供自定义发送适配器中获取原始数据。
@@ -2724,11 +2730,7 @@ async function getTableApi(mainObject, fields, options){
2724
2730
  userFilters = [["${valueField.name}", "=", selfData.value]];
2725
2731
  }
2726
2732
 
2727
- const __filterFormValues = api.data.__filterFormValues;
2728
- const __serachBoxValues = api.data.__serachBoxValues;
2729
- // 筛选按钮
2730
- const filterSelfData = __filterFormValues ? __filterFormValues : selfData;
2731
- var searchableFilter = SteedosUI.getSearchFilter(filterSelfData) || [];
2733
+ var searchableFilter = SteedosUI.getSearchFilter(selfData) || [];
2732
2734
  if(searchableFilter.length > 0){
2733
2735
  if(userFilters.length > 0 ){
2734
2736
  userFilters = [userFilters, 'and', searchableFilter];
@@ -2749,8 +2751,7 @@ async function getTableApi(mainObject, fields, options){
2749
2751
  })
2750
2752
  }
2751
2753
 
2752
- const keyWords = __serachBoxValues ? __serachBoxValues.__keywords : selfData.__keywords;
2753
- var keywordsFilters = SteedosUI.getKeywordsSearchFilter(keyWords, allowSearchFields);
2754
+ var keywordsFilters = SteedosUI.getKeywordsSearchFilter(selfData.__keywords, allowSearchFields);
2754
2755
  if(keywordsFilters && keywordsFilters.length > 0){
2755
2756
  userFilters.push(keywordsFilters);
2756
2757
  }
@@ -2903,19 +2904,6 @@ async function getTableApi(mainObject, fields, options){
2903
2904
  selfData.page = localListViewProps.page || 1;
2904
2905
  }
2905
2906
  }
2906
-
2907
- // 列表视图(对象表格)筛选按钮表单输入框输入内容后,如果不按回车键或者搜索按钮,selfData中该输入框是没有最新值的。
2908
- const __filterFormValues = api.body.__filterFormValues;
2909
- if(__filterFormValues){
2910
- let filterFormValues = JSON.parse(JSON.stringify(__filterFormValues)) || {};
2911
- selfData = Object.assign({}, selfData, filterFormValues);
2912
- }
2913
- // “搜索此列表”搜索框同理。
2914
- const __serachBoxValues = api.body.__serachBoxValues;
2915
- if(__serachBoxValues){
2916
- let serachBoxValues = JSON.parse(JSON.stringify(__serachBoxValues)) || {};
2917
- selfData = Object.assign({}, selfData, serachBoxValues);
2918
- }
2919
2907
 
2920
2908
  delete selfData.context;
2921
2909
  delete selfData.global;
@@ -5690,6 +5678,7 @@ async function getObjectFieldsFilterBarSchema(objectSchema, ctx) {
5690
5678
  const filterFormSchema = await getObjectFieldsFilterFormSchema(ctx);
5691
5679
  const keywordsSearchBoxName = ctx.keywordsSearchBoxName || "__keywords";
5692
5680
  const onSearchScript = `
5681
+ // console.log("===onSearchScript=form==");
5693
5682
  const scope = event.context.scoped;
5694
5683
  var filterForm = scope.parent.parent.getComponents().find(function(n){
5695
5684
  return n.props.type === "form";
@@ -5746,25 +5735,13 @@ async function getObjectFieldsFilterBarSchema(objectSchema, ctx) {
5746
5735
  crudService && crudService.setData({isFieldsFilterEmpty, showFieldsFilter});
5747
5736
  `;
5748
5737
  const onCancelScript = `
5749
- doAction(
5750
- {
5751
- "componentId": 'service_${ctx.crudId}',
5752
- "actionType": "setValue",
5753
- "args": {
5754
- "value": {
5755
- "__filterFormValues": null
5756
- }
5757
- }
5758
- }
5759
- )
5738
+ // console.log("===onCancelScript=form==");
5760
5739
  const scope = event.context.scoped;
5761
5740
  var filterForm = scope.parent.parent.getComponents().find(function(n){
5762
5741
  return n.props.type === "form";
5763
5742
  });
5764
5743
  var filterFormValues = filterForm.getValues();
5765
- var listView = scope.parent.parent.parent.getComponents().find(function(n){
5766
- return n.props.type === "crud";
5767
- });
5744
+ let crud = SteedosUI.getClosestAmisComponentByType(scope, "crud");
5768
5745
  const removedValues = {};
5769
5746
  for(var k in filterFormValues){
5770
5747
  if(/^__searchable__/.test(k)){
@@ -5779,7 +5756,7 @@ async function getObjectFieldsFilterBarSchema(objectSchema, ctx) {
5779
5756
  if(localListViewProps){
5780
5757
  localListViewProps = JSON.parse(localListViewProps);
5781
5758
  for(var k in localListViewProps){
5782
- if(k !== "__keywords"){
5759
+ if(/^__searchable__/.test(k)){
5783
5760
  removedValues[k] = null;
5784
5761
  }
5785
5762
  }
@@ -5790,20 +5767,35 @@ async function getObjectFieldsFilterBarSchema(objectSchema, ctx) {
5790
5767
  //lookup字段保留快速搜索条件
5791
5768
  removedValues[keywordsSearchBoxName] = filterFormValues[keywordsSearchBoxName];
5792
5769
  }
5793
- filterForm.reset();
5794
- setTimeout(()=>{
5795
- listView.handleFilterSubmit(removedValues);
5796
- }, 100);
5797
- const filterService = filterForm.context.getComponents().find(function(n){
5798
- return n.props.type === "service";
5799
- });
5800
- filterService.setData({showFieldsFilter: !!!filterService.props.data.showFieldsFilter});
5770
+ filterForm.setValues(removedValues);//会把表单提交到toolbar的快速搜索区域,造成在快速搜索框中触发搜索时再次把搜索表单中的字段值清除掉的bug,已单独在快速搜索框那边添加搜索事件代码处理过了
5771
+ // 以下方法都无法实现清除表单值
5772
+ // filterForm.setValues({}, true)
5773
+ // filterForm.reset();
5774
+ // filterForm.handleAction({},{
5775
+ // "actionType": "setValue",
5776
+ // "args": {
5777
+ // "value": removedValues
5778
+ // }
5779
+ // });
5780
+ // 下面触发clear动作可以清除表单值,且不会把表单提交到toolbar的快速搜索区域,但是会把金额等范围字段清空成非范围字段
5781
+ // filterForm.handleAction({},{
5782
+ // "actionType": "clear"
5783
+ // });
5784
+
5785
+ // 清除__changedFilterFormValues中的值
5786
+ crud && crud.setData({__changedFilterFormValues: {}});
5787
+ filterForm.handleFormSubmit(event);
5788
+ // crud.handleFilterSubmit(removedValues);
5789
+
5790
+ let filterFormService = SteedosUI.getClosestAmisComponentByType(filterForm.context, "service");
5791
+ filterFormService.setData({showFieldsFilter: !!!filterFormService.props.data.showFieldsFilter});
5801
5792
  //触发amis crud 高度重算
5802
5793
  setTimeout(()=>{
5803
5794
  window.dispatchEvent(new Event("resize"))
5804
5795
  }, 100);
5805
5796
  // 移除搜索按钮上的红点
5806
- let crudService = scope.getComponentById("service_listview_" + event.data.objectName);
5797
+ // let crudService = scope.getComponentById("service_listview_" + event.data.objectName);
5798
+ let crudService = crud && SteedosUI.getClosestAmisComponentByType(crud.context, "service");
5807
5799
  crudService && crudService.setData({isFieldsFilterEmpty: true, showFieldsFilter: false});
5808
5800
  `;
5809
5801
  const dataProviderInited = `
@@ -7669,7 +7661,8 @@ crudService && crudService.setData({showFieldsFilter: toShowFieldsFilter});
7669
7661
  // }
7670
7662
  `;
7671
7663
 
7672
- function getObjectHeaderQuickSearchBox(mainObject, fields, formFactor, { isLookup = false, keywordsSearchBoxName = "__keywords", crudId } = {}){
7664
+ // function getObjectHeaderQuickSearchBox(mainObject, fields, formFactor, { isLookup = false, keywordsSearchBoxName = "__keywords", crudId } = {}){
7665
+ function getObjectHeaderQuickSearchBox(mainObject, fields, formFactor, { isLookup = false, keywordsSearchBoxName = "__keywords" } = {}){
7673
7666
  const searchableFieldsLabel = [];
7674
7667
  _.each(mainObject.fields, function (field) {
7675
7668
  if (isFieldQuickSearchable(field, mainObject.NAME_FIELD_KEY)) {
@@ -7685,6 +7678,33 @@ function getObjectHeaderQuickSearchBox(mainObject, fields, formFactor, { isLooku
7685
7678
  crudKeywords = (localListViewProps && localListViewProps.__keywords) || "";
7686
7679
  }
7687
7680
 
7681
+ const onChangeScript = `
7682
+ const scope = event.context.scoped;
7683
+ let crud = SteedosUI.getClosestAmisComponentByType(scope, "crud");
7684
+ // let crudService = crud && SteedosUI.getClosestAmisComponentByType(crud.context, "service");
7685
+ let __changedSearchBoxValues = {};
7686
+ __changedSearchBoxValues["${keywordsSearchBoxName}"] = event.data["${keywordsSearchBoxName}"];
7687
+ // crudService && crudService.setData({__changedSearchBoxValues: __changedSearchBoxValues});
7688
+ // 这里不用crudService而用crud是因为lookup字段弹出的列表中的crudService中的变量无法传入crud的发送适配器中
7689
+ crud && crud.setData({__changedSearchBoxValues: __changedSearchBoxValues});
7690
+ `;
7691
+
7692
+ // onSearchScript中加上了onChangeScript中的脚本,是因为amis 3.2不能用change事件执行onChangeScript
7693
+ // 而点击回车按键又不会触发blur事件,所以只能每次回车事件中额外再执行一次onChangeScript
7694
+ // 等升级到amis 3.4+,blur事件换成change事件执行onChangeScript,就可以不用在onSearchScript中执行onChangeScript了
7695
+ const onSearchScript = `
7696
+ ${onChangeScript}
7697
+
7698
+ // 下面的脚本只为解决点击搜索表单取消按钮,再重新在其中输入过滤条件但是不点击搜索按钮或回车按键触发搜索,此时在快速搜索框输入过滤条件按回车按键会把搜索表单中的过滤条件清空的问题
7699
+ // const scope = event.context.scoped;
7700
+ // 如果点击过顶部搜索栏表单的取消按钮,会把此处event.data.__super.__super.__super中的搜索表单项的所有字段设置为null
7701
+ // 点击取消按钮后继续在表单项中输入过滤条件且最后没有点击回车按键或点击表单项搜索按钮的话,在快速搜索中点击回车按钮提交搜索会所顶部搜索表单中的字段值清空
7702
+ let filterForm = SteedosUI.getClosestAmisComponentByType(scope, "form");
7703
+ setTimeout(function(){
7704
+ filterForm.setValues(event.data.__changedFilterFormValues);
7705
+ }, 500);
7706
+ `;
7707
+
7688
7708
  return {
7689
7709
  "type": "tooltip-wrapper",
7690
7710
  "id": "steedos_crud_toolbar_quick_search",
@@ -7703,28 +7723,24 @@ function getObjectHeaderQuickSearchBox(mainObject, fields, formFactor, { isLooku
7703
7723
  "placeholder": "搜索此列表",
7704
7724
  "value": crudKeywords,
7705
7725
  "clearable": true,
7706
- "clearAndSubmit": true,
7726
+ // "clearAndSubmit": true,//因为清除并不会触发失去焦点事件,只有禁用,但是它会触发change事件,所以等升级到amis 3.4+后可以重新放开
7707
7727
  "searchImediately": false,
7708
7728
  "onEvent": {
7709
- "change": {
7729
+ "search": {
7710
7730
  "actions": [
7711
7731
  {
7712
7732
  "actionType": "custom",
7713
- "script": `
7714
- doAction(
7715
- {
7716
- "componentId": 'service_${crudId}',
7717
- "actionType": "setValue",
7718
- "args": {
7719
- "value": {
7720
- "__serachBoxValues": event.data
7721
- }
7722
- }
7723
- }
7724
- )
7725
- `
7733
+ "script": onSearchScript
7726
7734
  }
7727
7735
  ]
7736
+ },
7737
+ "blur": { //这里把change事件换成blur是因为amis 3.2change事件中setData会卡,升级到3.4+后就可以换回change事件
7738
+ "actions": [
7739
+ {
7740
+ "actionType": "custom",
7741
+ "script": onChangeScript
7742
+ },
7743
+ ]
7728
7744
  }
7729
7745
  }
7730
7746
  }
@@ -7733,7 +7749,7 @@ function getObjectHeaderQuickSearchBox(mainObject, fields, formFactor, { isLooku
7733
7749
  }
7734
7750
 
7735
7751
  function getObjectHeaderToolbar(mainObject, fields, formFactor, {
7736
- showDisplayAs = false, hiddenCount = false, headerToolbarItems, crudId,
7752
+ showDisplayAs = false, hiddenCount = false, headerToolbarItems,
7737
7753
  filterVisible = true, isLookup = false, keywordsSearchBoxName } = {}){
7738
7754
  // console.log(`getObjectHeaderToolbar====>`, filterVisible)
7739
7755
  // console.log(`getObjectHeaderToolbar`, mainObject)
@@ -7837,7 +7853,7 @@ function getObjectHeaderToolbar(mainObject, fields, formFactor, {
7837
7853
  };
7838
7854
  }
7839
7855
  let toolbarDisplayAsButton = getDisplayAsButton(mainObject?.name);
7840
- let toolbarDQuickSearchBox = getObjectHeaderQuickSearchBox(mainObject, fields, formFactor, { isLookup, keywordsSearchBoxName, crudId });
7856
+ let toolbarDQuickSearchBox = getObjectHeaderQuickSearchBox(mainObject, fields, formFactor, { isLookup, keywordsSearchBoxName });
7841
7857
 
7842
7858
  // toolbars返回的数组元素不可以是空对象{},比如hiddenCount ? {} : {"type": "tpl",...},因为空对象最终还是会生成一个空的.antd-Crud-toolbar-item dom
7843
7859
  // 当出现空的.antd-Crud-toolbar-item dom时会影响toolbar元素的maring-right css样式计算,如果有动态需要应该加到动态数组变量toolbars中
@@ -7985,6 +8001,20 @@ async function getObjectFilter(objectSchema, fields, options) {
7985
8001
  let crudService = crud && SteedosUI.getClosestAmisComponentByType(crud.context, "service");
7986
8002
  crudService && crudService.setData({isFieldsFilterEmpty});
7987
8003
  `;
8004
+ let onChangeScript = `
8005
+ const scope = event.context.scoped;
8006
+ // let filterFormValues = event.data;
8007
+ let filterForm = SteedosUI.getClosestAmisComponentByType(scope, "form");
8008
+ let filterFormService = SteedosUI.getClosestAmisComponentByType(filterForm.context, "service");
8009
+ // 使用event.data的话,并不能拿到本地存储中的过滤条件,所以需要从filterFormService中取。
8010
+ let filterFormValues = filterFormService.getData();
8011
+ let crud = SteedosUI.getClosestAmisComponentByType(scope, "crud");
8012
+ const changedFilterFormValues = _.pickBy(filterFormValues, function(n,k){return /^__searchable__/.test(k);});;
8013
+ // let crudService = crud && SteedosUI.getClosestAmisComponentByType(crud.context, "service");
8014
+ // crudService && crudService.setData({__changedFilterFormValues: changedFilterFormValues});
8015
+ // 这里不用crudService而用crud是因为lookup字段弹出的列表中的crudService中的变量无法传入crud的发送适配器中
8016
+ crud && crud.setData({__changedFilterFormValues: changedFilterFormValues});
8017
+ `;
7988
8018
  return {
7989
8019
  "title": "",
7990
8020
  "submitText": "",
@@ -8008,19 +8038,7 @@ async function getObjectFilter(objectSchema, fields, options) {
8008
8038
  "actions": [
8009
8039
  {
8010
8040
  "actionType": "custom",
8011
- "script": `
8012
- doAction(
8013
- {
8014
- "componentId": 'service_${options.crudId}',
8015
- "actionType": "setValue",
8016
- "args": {
8017
- "value": {
8018
- "__filterFormValues": event.data
8019
- }
8020
- }
8021
- }
8022
- )
8023
- `
8041
+ "script": onChangeScript
8024
8042
  }
8025
8043
  ]
8026
8044
  }
@@ -8095,7 +8113,6 @@ async function getObjectCRUD(objectSchema, fields, options){
8095
8113
  const bulkActions = getBulkActions(objectSchema);
8096
8114
  const defaults = options.defaults;
8097
8115
  const listSchema = (defaults && defaults.listSchema) || {};
8098
- const id = `listview_${objectSchema.name}`;
8099
8116
 
8100
8117
  const bodyProps = {
8101
8118
  // toolbar: getToolbar(),
@@ -8105,7 +8122,7 @@ async function getObjectCRUD(objectSchema, fields, options){
8105
8122
  ...options,
8106
8123
  disableStatistics: options.queryCount === false
8107
8124
  }),
8108
- filter: options.filterVisible !== false && await getObjectFilter(objectSchema, fields, Object.assign({}, options, {crudId: id})),
8125
+ filter: options.filterVisible !== false && await getObjectFilter(objectSchema, fields, options),
8109
8126
  };
8110
8127
  if(options.formFactor !== 'SMALL' || ["split"].indexOf(options.displayAs) == -1){
8111
8128
  if(listSchema.mode !== "cards"){
@@ -8134,8 +8151,7 @@ async function getObjectCRUD(objectSchema, fields, options){
8134
8151
  showDisplayAs,
8135
8152
  hiddenCount: options.queryCount === false,
8136
8153
  headerToolbarItems: options.headerToolbarItems,
8137
- filterVisible: options.filterVisible,
8138
- crudId: id
8154
+ filterVisible: options.filterVisible
8139
8155
  });
8140
8156
 
8141
8157
  options.amisData = createObject(options.amisData, {
@@ -8148,6 +8164,7 @@ async function getObjectCRUD(objectSchema, fields, options){
8148
8164
 
8149
8165
 
8150
8166
  let body = null;
8167
+ const id = `listview_${objectSchema.name}`;
8151
8168
  if(options.formFactor === 'SMALL' && false){
8152
8169
  delete bodyProps.bulkActions;
8153
8170
  delete bodyProps.headerToolbar;
@@ -10379,6 +10396,13 @@ async function lookupToAmisPicker(field, readonly, ctx){
10379
10396
  source.data.$self = "$$";
10380
10397
 
10381
10398
  source.requestAdaptor = `
10399
+ let __changedFilterFormValues = api.data.$self.__changedFilterFormValues || {};
10400
+ let __changedSearchBoxValues = api.data.$self.__changedSearchBoxValues || {};
10401
+ // 把表单搜索和快速搜索中的change事件中记录的过滤条件也拼到$self中,是为解决触发搜索请求时,两边输入的过滤条件都带上,即:
10402
+ // 有时在搜索表单中输入过滤条件事,忘记点击回车键或搜索按钮,而是进一步修改快速搜索框中的关键字点击其中回车键触发搜索
10403
+ // 这种情况下,触发的搜索请求中没有带上搜索表单中输入的过滤条件。
10404
+ // 反过来先在快速搜索框中输入过滤条件却不点击其中回车键触发搜索,而是到搜索表单中触发搜索请求也是一样的。
10405
+ Object.assign(api.data.$self, __changedSearchBoxValues, __changedFilterFormValues);
10382
10406
  const selfData = JSON.parse(JSON.stringify(api.data.$self));
10383
10407
  var filters = [];
10384
10408
  var pageSize = api.data.pageSize || 10;
@@ -12022,9 +12046,7 @@ async function getFieldSearchable(perField, permissionFields, ctx){
12022
12046
 
12023
12047
  const amisField = await convertSFieldToAmisField(_field, false, Object.assign({}, ctx, {fieldNamePrefix: fieldNamePrefix, required: false, showSystemFields: true, inFilterForm: true}));
12024
12048
  if(amisField){
12025
- return Object.assign({}, amisField,{
12026
- submitOnChange: false
12027
- });
12049
+ return amisField;
12028
12050
  }
12029
12051
  }
12030
12052
  }
@@ -12417,12 +12439,16 @@ async function getForm(props, mode = "edit") {
12417
12439
  }
12418
12440
  else if (mode === "new") {
12419
12441
  let onNewItemSubmitScript = `
12420
- event.data["${props.name}"].push(JSON.parse(JSON.stringify(event.data)));
12442
+ let fieldValue = _.cloneDeep(event.data["${props.name}"]);
12443
+ if(!fieldValue){
12444
+ fieldValue = [];
12445
+ }
12446
+ fieldValue.push(JSON.parse(JSON.stringify(event.data)));
12421
12447
  doAction({
12422
12448
  "componentId": "${props.id}",
12423
12449
  "actionType": "setValue",
12424
12450
  "args": {
12425
- "value": event.data["${props.name}"]
12451
+ "value": fieldValue
12426
12452
  }
12427
12453
  });
12428
12454
  `;
@@ -12625,7 +12651,7 @@ const getAmisInputTableSchema = async (props, readonly) => {
12625
12651
  "className": props.className
12626
12652
  };
12627
12653
  if (props.addable) {
12628
- let buttonNewSchema = getButtonNew(props);
12654
+ let buttonNewSchema = await getButtonNew(props);
12629
12655
  schema.body.push(buttonNewSchema);
12630
12656
  }
12631
12657
  if (props.amis) {