@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.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,6 +2904,7 @@ async function getTableApi(mainObject, fields, options){
2903
2904
  selfData.page = localListViewProps.page || 1;
2904
2905
  }
2905
2906
  }
2907
+
2906
2908
  delete selfData.context;
2907
2909
  delete selfData.global;
2908
2910
  sessionStorage.setItem(listViewPropsStoreKey, JSON.stringify(selfData));
@@ -5676,6 +5678,7 @@ async function getObjectFieldsFilterBarSchema(objectSchema, ctx) {
5676
5678
  const filterFormSchema = await getObjectFieldsFilterFormSchema(ctx);
5677
5679
  const keywordsSearchBoxName = ctx.keywordsSearchBoxName || "__keywords";
5678
5680
  const onSearchScript = `
5681
+ // console.log("===onSearchScript=form==");
5679
5682
  const scope = event.context.scoped;
5680
5683
  var filterForm = scope.parent.parent.getComponents().find(function(n){
5681
5684
  return n.props.type === "form";
@@ -5732,25 +5735,13 @@ async function getObjectFieldsFilterBarSchema(objectSchema, ctx) {
5732
5735
  crudService && crudService.setData({isFieldsFilterEmpty, showFieldsFilter});
5733
5736
  `;
5734
5737
  const onCancelScript = `
5735
- doAction(
5736
- {
5737
- "componentId": 'service_${ctx.crudId}',
5738
- "actionType": "setValue",
5739
- "args": {
5740
- "value": {
5741
- "__filterFormValues": null
5742
- }
5743
- }
5744
- }
5745
- )
5738
+ // console.log("===onCancelScript=form==");
5746
5739
  const scope = event.context.scoped;
5747
5740
  var filterForm = scope.parent.parent.getComponents().find(function(n){
5748
5741
  return n.props.type === "form";
5749
5742
  });
5750
5743
  var filterFormValues = filterForm.getValues();
5751
- var listView = scope.parent.parent.parent.getComponents().find(function(n){
5752
- return n.props.type === "crud";
5753
- });
5744
+ let crud = SteedosUI.getClosestAmisComponentByType(scope, "crud");
5754
5745
  const removedValues = {};
5755
5746
  for(var k in filterFormValues){
5756
5747
  if(/^__searchable__/.test(k)){
@@ -5765,7 +5756,7 @@ async function getObjectFieldsFilterBarSchema(objectSchema, ctx) {
5765
5756
  if(localListViewProps){
5766
5757
  localListViewProps = JSON.parse(localListViewProps);
5767
5758
  for(var k in localListViewProps){
5768
- if(k !== "__keywords"){
5759
+ if(/^__searchable__/.test(k)){
5769
5760
  removedValues[k] = null;
5770
5761
  }
5771
5762
  }
@@ -5776,20 +5767,35 @@ async function getObjectFieldsFilterBarSchema(objectSchema, ctx) {
5776
5767
  //lookup字段保留快速搜索条件
5777
5768
  removedValues[keywordsSearchBoxName] = filterFormValues[keywordsSearchBoxName];
5778
5769
  }
5779
- filterForm.reset();
5780
- setTimeout(()=>{
5781
- listView.handleFilterSubmit(removedValues);
5782
- }, 100);
5783
- const filterService = filterForm.context.getComponents().find(function(n){
5784
- return n.props.type === "service";
5785
- });
5786
- 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});
5787
5792
  //触发amis crud 高度重算
5788
5793
  setTimeout(()=>{
5789
5794
  window.dispatchEvent(new Event("resize"))
5790
5795
  }, 100);
5791
5796
  // 移除搜索按钮上的红点
5792
- 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");
5793
5799
  crudService && crudService.setData({isFieldsFilterEmpty: true, showFieldsFilter: false});
5794
5800
  `;
5795
5801
  const dataProviderInited = `
@@ -7655,7 +7661,8 @@ crudService && crudService.setData({showFieldsFilter: toShowFieldsFilter});
7655
7661
  // }
7656
7662
  `;
7657
7663
 
7658
- 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" } = {}){
7659
7666
  const searchableFieldsLabel = [];
7660
7667
  _.each(mainObject.fields, function (field) {
7661
7668
  if (isFieldQuickSearchable(field, mainObject.NAME_FIELD_KEY)) {
@@ -7671,6 +7678,33 @@ function getObjectHeaderQuickSearchBox(mainObject, fields, formFactor, { isLooku
7671
7678
  crudKeywords = (localListViewProps && localListViewProps.__keywords) || "";
7672
7679
  }
7673
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
+
7674
7708
  return {
7675
7709
  "type": "tooltip-wrapper",
7676
7710
  "id": "steedos_crud_toolbar_quick_search",
@@ -7689,28 +7723,24 @@ function getObjectHeaderQuickSearchBox(mainObject, fields, formFactor, { isLooku
7689
7723
  "placeholder": "搜索此列表",
7690
7724
  "value": crudKeywords,
7691
7725
  "clearable": true,
7692
- "clearAndSubmit": true,
7726
+ // "clearAndSubmit": true,//因为清除并不会触发失去焦点事件,只有禁用,但是它会触发change事件,所以等升级到amis 3.4+后可以重新放开
7693
7727
  "searchImediately": false,
7694
7728
  "onEvent": {
7695
- "change": {
7729
+ "search": {
7696
7730
  "actions": [
7697
7731
  {
7698
7732
  "actionType": "custom",
7699
- "script": `
7700
- doAction(
7701
- {
7702
- "componentId": 'service_${crudId}',
7703
- "actionType": "setValue",
7704
- "args": {
7705
- "value": {
7706
- "__serachBoxValues": event.data
7707
- }
7708
- }
7709
- }
7710
- )
7711
- `
7733
+ "script": onSearchScript
7712
7734
  }
7713
7735
  ]
7736
+ },
7737
+ "blur": { //这里把change事件换成blur是因为amis 3.2change事件中setData会卡,升级到3.4+后就可以换回change事件
7738
+ "actions": [
7739
+ {
7740
+ "actionType": "custom",
7741
+ "script": onChangeScript
7742
+ },
7743
+ ]
7714
7744
  }
7715
7745
  }
7716
7746
  }
@@ -7719,7 +7749,7 @@ function getObjectHeaderQuickSearchBox(mainObject, fields, formFactor, { isLooku
7719
7749
  }
7720
7750
 
7721
7751
  function getObjectHeaderToolbar(mainObject, fields, formFactor, {
7722
- showDisplayAs = false, hiddenCount = false, headerToolbarItems, crudId,
7752
+ showDisplayAs = false, hiddenCount = false, headerToolbarItems,
7723
7753
  filterVisible = true, isLookup = false, keywordsSearchBoxName } = {}){
7724
7754
  // console.log(`getObjectHeaderToolbar====>`, filterVisible)
7725
7755
  // console.log(`getObjectHeaderToolbar`, mainObject)
@@ -7823,7 +7853,7 @@ function getObjectHeaderToolbar(mainObject, fields, formFactor, {
7823
7853
  };
7824
7854
  }
7825
7855
  let toolbarDisplayAsButton = getDisplayAsButton(mainObject?.name);
7826
- let toolbarDQuickSearchBox = getObjectHeaderQuickSearchBox(mainObject, fields, formFactor, { isLookup, keywordsSearchBoxName, crudId });
7856
+ let toolbarDQuickSearchBox = getObjectHeaderQuickSearchBox(mainObject, fields, formFactor, { isLookup, keywordsSearchBoxName });
7827
7857
 
7828
7858
  // toolbars返回的数组元素不可以是空对象{},比如hiddenCount ? {} : {"type": "tpl",...},因为空对象最终还是会生成一个空的.antd-Crud-toolbar-item dom
7829
7859
  // 当出现空的.antd-Crud-toolbar-item dom时会影响toolbar元素的maring-right css样式计算,如果有动态需要应该加到动态数组变量toolbars中
@@ -7971,6 +8001,20 @@ async function getObjectFilter(objectSchema, fields, options) {
7971
8001
  let crudService = crud && SteedosUI.getClosestAmisComponentByType(crud.context, "service");
7972
8002
  crudService && crudService.setData({isFieldsFilterEmpty});
7973
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
+ `;
7974
8018
  return {
7975
8019
  "title": "",
7976
8020
  "submitText": "",
@@ -7994,19 +8038,7 @@ async function getObjectFilter(objectSchema, fields, options) {
7994
8038
  "actions": [
7995
8039
  {
7996
8040
  "actionType": "custom",
7997
- "script": `
7998
- doAction(
7999
- {
8000
- "componentId": 'service_${options.crudId}',
8001
- "actionType": "setValue",
8002
- "args": {
8003
- "value": {
8004
- "__filterFormValues": event.data
8005
- }
8006
- }
8007
- }
8008
- )
8009
- `
8041
+ "script": onChangeScript
8010
8042
  }
8011
8043
  ]
8012
8044
  }
@@ -8081,7 +8113,6 @@ async function getObjectCRUD(objectSchema, fields, options){
8081
8113
  const bulkActions = getBulkActions(objectSchema);
8082
8114
  const defaults = options.defaults;
8083
8115
  const listSchema = (defaults && defaults.listSchema) || {};
8084
- const id = `listview_${objectSchema.name}`;
8085
8116
 
8086
8117
  const bodyProps = {
8087
8118
  // toolbar: getToolbar(),
@@ -8091,7 +8122,7 @@ async function getObjectCRUD(objectSchema, fields, options){
8091
8122
  ...options,
8092
8123
  disableStatistics: options.queryCount === false
8093
8124
  }),
8094
- filter: options.filterVisible !== false && await getObjectFilter(objectSchema, fields, Object.assign({}, options, {crudId: id})),
8125
+ filter: options.filterVisible !== false && await getObjectFilter(objectSchema, fields, options),
8095
8126
  };
8096
8127
  if(options.formFactor !== 'SMALL' || ["split"].indexOf(options.displayAs) == -1){
8097
8128
  if(listSchema.mode !== "cards"){
@@ -8120,8 +8151,7 @@ async function getObjectCRUD(objectSchema, fields, options){
8120
8151
  showDisplayAs,
8121
8152
  hiddenCount: options.queryCount === false,
8122
8153
  headerToolbarItems: options.headerToolbarItems,
8123
- filterVisible: options.filterVisible,
8124
- crudId: id
8154
+ filterVisible: options.filterVisible
8125
8155
  });
8126
8156
 
8127
8157
  options.amisData = createObject(options.amisData, {
@@ -8134,6 +8164,7 @@ async function getObjectCRUD(objectSchema, fields, options){
8134
8164
 
8135
8165
 
8136
8166
  let body = null;
8167
+ const id = `listview_${objectSchema.name}`;
8137
8168
  if(options.formFactor === 'SMALL' && false){
8138
8169
  delete bodyProps.bulkActions;
8139
8170
  delete bodyProps.headerToolbar;
@@ -10365,6 +10396,13 @@ async function lookupToAmisPicker(field, readonly, ctx){
10365
10396
  source.data.$self = "$$";
10366
10397
 
10367
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);
10368
10406
  const selfData = JSON.parse(JSON.stringify(api.data.$self));
10369
10407
  var filters = [];
10370
10408
  var pageSize = api.data.pageSize || 10;
@@ -10431,7 +10469,7 @@ async function lookupToAmisPicker(field, readonly, ctx){
10431
10469
  const filtersFunction = ${field.filtersFunction || field._filtersFunction};
10432
10470
 
10433
10471
  if(filtersFunction && !inFilterForm){
10434
- const _filters = filtersFunction(filters, api.data.$self.__super.__super);
10472
+ const _filters = filtersFunction(filters, api.data.$self.__super);
10435
10473
  if(_filters && _filters.length > 0){
10436
10474
  filters.push(_filters);
10437
10475
  }
@@ -12008,9 +12046,7 @@ async function getFieldSearchable(perField, permissionFields, ctx){
12008
12046
 
12009
12047
  const amisField = await convertSFieldToAmisField(_field, false, Object.assign({}, ctx, {fieldNamePrefix: fieldNamePrefix, required: false, showSystemFields: true, inFilterForm: true}));
12010
12048
  if(amisField){
12011
- return Object.assign({}, amisField,{
12012
- submitOnChange: false
12013
- });
12049
+ return amisField;
12014
12050
  }
12015
12051
  }
12016
12052
  }
@@ -12403,12 +12439,16 @@ async function getForm(props, mode = "edit") {
12403
12439
  }
12404
12440
  else if (mode === "new") {
12405
12441
  let onNewItemSubmitScript = `
12406
- 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)));
12407
12447
  doAction({
12408
12448
  "componentId": "${props.id}",
12409
12449
  "actionType": "setValue",
12410
12450
  "args": {
12411
- "value": event.data["${props.name}"]
12451
+ "value": fieldValue
12412
12452
  }
12413
12453
  });
12414
12454
  `;
@@ -12611,7 +12651,7 @@ const getAmisInputTableSchema = async (props, readonly) => {
12611
12651
  "className": props.className
12612
12652
  };
12613
12653
  if (props.addable) {
12614
- let buttonNewSchema = getButtonNew(props);
12654
+ let buttonNewSchema = await getButtonNew(props);
12615
12655
  schema.body.push(buttonNewSchema);
12616
12656
  }
12617
12657
  if (props.amis) {