@steedos-widgets/amis-lib 1.3.17-beta.2 → 1.3.18

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
@@ -2013,9 +2013,9 @@ function getFieldWidth(width){
2013
2013
  const defaultWidth = "unset";//用于使table内的td标签下生成div,实现将快速编辑按钮固定在右侧的效果,并不是为了unset效果
2014
2014
  if(typeof width == 'string'){
2015
2015
  if(isNaN(width)){
2016
- return width;
2016
+ return width || defaultWidth;
2017
2017
  }else {
2018
- return Number(width);
2018
+ return Number(width) || defaultWidth;
2019
2019
  }
2020
2020
  }else if(typeof width == 'number'){
2021
2021
  return width;
@@ -2116,6 +2116,7 @@ async function getTableColumns(fields, options){
2116
2116
  width: getFieldWidth(field.width),
2117
2117
  toggled: field.toggled,
2118
2118
  className,
2119
+ inputClassName: "inline",
2119
2120
  static: true,
2120
2121
  }, field.amis, {name: field.name});
2121
2122
  }
@@ -2153,6 +2154,7 @@ async function getTableColumns(fields, options){
2153
2154
  tpl: tpl,
2154
2155
  toggled: field.toggled,
2155
2156
  className,
2157
+ inputClassName: "inline",
2156
2158
  static: true,
2157
2159
  options: field.type === 'html' ? {html: true} : null
2158
2160
  // toggled: true
@@ -2174,8 +2176,8 @@ async function getTableColumns(fields, options){
2174
2176
  const href = Router.getObjectDetailPath({
2175
2177
  ...options, formFactor: options.formFactor, appId: "${appId}", objectName: options.objectName || "${objectName}", recordId: `\${${options.idFieldName}}`
2176
2178
  });
2177
- columns[0].type = "tpl";
2178
- columns[0].tpl = `<a href="${href}">\${${columns[0].name}}</a>`;
2179
+ columns[1].type = "tpl";
2180
+ columns[1].tpl = `<a href="${href}">\${${columns[1].name}}</a>`;
2179
2181
  }
2180
2182
  return columns;
2181
2183
  }
@@ -2642,19 +2644,25 @@ async function getTableApi(mainObject, fields, options){
2642
2644
  if(options.isRelated){
2643
2645
  api.url += "&recordId=${_master.recordId}";
2644
2646
  }
2645
- // api.cache = 3000;
2646
-
2647
+ api.cache = 3000;
2647
2648
  api.data.$term = "$term";
2648
2649
  api.data.term = "$term";
2649
2650
  api.data.$self = "$$";
2650
2651
  api.data.self = "$$";
2651
2652
  api.data.filter = "$filter";
2652
- api.data.__filterFormValues = "${__filterFormValues}";
2653
- api.data.__serachBoxValues = "${__serachBoxValues}";
2654
2653
  api.data.loaded = "${loaded}";
2655
2654
  api.data.listViewId = "${listViewId}";
2656
2655
  api.data.listName = "${listName}";
2657
2656
  api.requestAdaptor = `
2657
+ let __changedFilterFormValues = api.data.$self.__changedFilterFormValues || {};
2658
+ let __changedSearchBoxValues = api.data.$self.__changedSearchBoxValues || {};
2659
+ // 把表单搜索和快速搜索中的change事件中记录的过滤条件也拼到$self中,是为解决触发搜索请求时,两边输入的过滤条件都带上,即:
2660
+ // 有时在搜索表单中输入过滤条件事,忘记点击回车键或搜索按钮,而是进一步修改快速搜索框中的关键字点击其中回车键触发搜索
2661
+ // 这种情况下,触发的搜索请求中没有带上搜索表单中输入的过滤条件。
2662
+ // 反过来先在快速搜索框中输入过滤条件却不点击其中回车键触发搜索,而是到搜索表单中触发搜索请求也是一样的。
2663
+ // 这里直接合并到api.data.$self,而不是后面定义的selfData变量,是因为可以省去在接收适配器中写一样的合并逻辑
2664
+ // 如果有问题可以改为合并到selfData变量中,但是要在接收适配器中写上一样的合并逻辑,否则里面的过滤条件不会存入本地存储中
2665
+ Object.assign(api.data.$self, __changedSearchBoxValues, __changedFilterFormValues);
2658
2666
  // selfData 中的数据由 CRUD 控制. selfData中,只能获取到 CRUD 给定的data. 无法从数据链中获取数据.
2659
2667
  let selfData = JSON.parse(JSON.stringify(api.data.$self));
2660
2668
  // 保留一份初始data,以供自定义发送适配器中获取原始数据。
@@ -2724,11 +2732,7 @@ async function getTableApi(mainObject, fields, options){
2724
2732
  userFilters = [["${valueField.name}", "=", selfData.value]];
2725
2733
  }
2726
2734
 
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) || [];
2735
+ var searchableFilter = SteedosUI.getSearchFilter(selfData) || [];
2732
2736
  if(searchableFilter.length > 0){
2733
2737
  if(userFilters.length > 0 ){
2734
2738
  userFilters = [userFilters, 'and', searchableFilter];
@@ -2749,8 +2753,7 @@ async function getTableApi(mainObject, fields, options){
2749
2753
  })
2750
2754
  }
2751
2755
 
2752
- const keyWords = __serachBoxValues ? __serachBoxValues.__keywords : selfData.__keywords;
2753
- var keywordsFilters = SteedosUI.getKeywordsSearchFilter(keyWords, allowSearchFields);
2756
+ var keywordsFilters = SteedosUI.getKeywordsSearchFilter(selfData.__keywords, allowSearchFields);
2754
2757
  if(keywordsFilters && keywordsFilters.length > 0){
2755
2758
  userFilters.push(keywordsFilters);
2756
2759
  }
@@ -2870,7 +2873,25 @@ async function getTableApi(mainObject, fields, options){
2870
2873
  if(enable_tree){
2871
2874
  const records = payload.data.rows || [];
2872
2875
  const getTreeOptions = SteedosUI.getTreeOptions
2873
- payload.data.rows = getTreeOptions(records,{"valueField":"_id"});
2876
+ let isTreeOptionsComputed = false;
2877
+ if(records.length === 1 && records[0].children){
2878
+ isTreeOptionsComputed = true;
2879
+ }
2880
+ if(!isTreeOptionsComputed){
2881
+ // 如果api接口设置在缓存,缓存期间并不会重新请求接口,payload.data.rows是上次计算后的结果
2882
+ payload.data.rows = getTreeOptions(records,{"valueField":"_id"});
2883
+ }
2884
+ try{
2885
+ setTimeout(() => {
2886
+ let expandBtn = $('.steedos-object-listview-content .antd-Table-content .antd-Table-table thead .antd-Table-expandBtn');
2887
+ if(expandBtn && expandBtn.length > 0 && !expandBtn.hasClass("is-active")){
2888
+ expandBtn[0].click();
2889
+ }
2890
+ }, 600);
2891
+ }
2892
+ catch(ex){
2893
+ console.error("tree数据格式展开异常:", ex);
2894
+ }
2874
2895
  }
2875
2896
 
2876
2897
 
@@ -2903,19 +2924,6 @@ async function getTableApi(mainObject, fields, options){
2903
2924
  selfData.page = localListViewProps.page || 1;
2904
2925
  }
2905
2926
  }
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
2927
 
2920
2928
  delete selfData.context;
2921
2929
  delete selfData.global;
@@ -5690,6 +5698,7 @@ async function getObjectFieldsFilterBarSchema(objectSchema, ctx) {
5690
5698
  const filterFormSchema = await getObjectFieldsFilterFormSchema(ctx);
5691
5699
  const keywordsSearchBoxName = ctx.keywordsSearchBoxName || "__keywords";
5692
5700
  const onSearchScript = `
5701
+ // console.log("===onSearchScript=form==");
5693
5702
  const scope = event.context.scoped;
5694
5703
  var filterForm = scope.parent.parent.getComponents().find(function(n){
5695
5704
  return n.props.type === "form";
@@ -5746,25 +5755,13 @@ async function getObjectFieldsFilterBarSchema(objectSchema, ctx) {
5746
5755
  crudService && crudService.setData({isFieldsFilterEmpty, showFieldsFilter});
5747
5756
  `;
5748
5757
  const onCancelScript = `
5749
- doAction(
5750
- {
5751
- "componentId": 'service_${ctx.crudId}',
5752
- "actionType": "setValue",
5753
- "args": {
5754
- "value": {
5755
- "__filterFormValues": null
5756
- }
5757
- }
5758
- }
5759
- )
5758
+ // console.log("===onCancelScript=form==");
5760
5759
  const scope = event.context.scoped;
5761
5760
  var filterForm = scope.parent.parent.getComponents().find(function(n){
5762
5761
  return n.props.type === "form";
5763
5762
  });
5764
5763
  var filterFormValues = filterForm.getValues();
5765
- var listView = scope.parent.parent.parent.getComponents().find(function(n){
5766
- return n.props.type === "crud";
5767
- });
5764
+ let crud = SteedosUI.getClosestAmisComponentByType(scope, "crud");
5768
5765
  const removedValues = {};
5769
5766
  for(var k in filterFormValues){
5770
5767
  if(/^__searchable__/.test(k)){
@@ -5779,7 +5776,7 @@ async function getObjectFieldsFilterBarSchema(objectSchema, ctx) {
5779
5776
  if(localListViewProps){
5780
5777
  localListViewProps = JSON.parse(localListViewProps);
5781
5778
  for(var k in localListViewProps){
5782
- if(k !== "__keywords"){
5779
+ if(/^__searchable__/.test(k)){
5783
5780
  removedValues[k] = null;
5784
5781
  }
5785
5782
  }
@@ -5790,20 +5787,35 @@ async function getObjectFieldsFilterBarSchema(objectSchema, ctx) {
5790
5787
  //lookup字段保留快速搜索条件
5791
5788
  removedValues[keywordsSearchBoxName] = filterFormValues[keywordsSearchBoxName];
5792
5789
  }
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});
5790
+ filterForm.setValues(removedValues);//会把表单提交到toolbar的快速搜索区域,造成在快速搜索框中触发搜索时再次把搜索表单中的字段值清除掉的bug,已单独在快速搜索框那边添加搜索事件代码处理过了
5791
+ // 以下方法都无法实现清除表单值
5792
+ // filterForm.setValues({}, true)
5793
+ // filterForm.reset();
5794
+ // filterForm.handleAction({},{
5795
+ // "actionType": "setValue",
5796
+ // "args": {
5797
+ // "value": removedValues
5798
+ // }
5799
+ // });
5800
+ // 下面触发clear动作可以清除表单值,且不会把表单提交到toolbar的快速搜索区域,但是会把金额等范围字段清空成非范围字段
5801
+ // filterForm.handleAction({},{
5802
+ // "actionType": "clear"
5803
+ // });
5804
+
5805
+ // 清除__changedFilterFormValues中的值
5806
+ crud && crud.setData({__changedFilterFormValues: {}});
5807
+ filterForm.handleFormSubmit(event);
5808
+ // crud.handleFilterSubmit(removedValues);
5809
+
5810
+ let filterFormService = SteedosUI.getClosestAmisComponentByType(filterForm.context, "service");
5811
+ filterFormService.setData({showFieldsFilter: !!!filterFormService.props.data.showFieldsFilter});
5801
5812
  //触发amis crud 高度重算
5802
5813
  setTimeout(()=>{
5803
5814
  window.dispatchEvent(new Event("resize"))
5804
5815
  }, 100);
5805
5816
  // 移除搜索按钮上的红点
5806
- let crudService = scope.getComponentById("service_listview_" + event.data.objectName);
5817
+ // let crudService = scope.getComponentById("service_listview_" + event.data.objectName);
5818
+ let crudService = crud && SteedosUI.getClosestAmisComponentByType(crud.context, "service");
5807
5819
  crudService && crudService.setData({isFieldsFilterEmpty: true, showFieldsFilter: false});
5808
5820
  `;
5809
5821
  const dataProviderInited = `
@@ -6743,78 +6755,97 @@ function fields$1(){
6743
6755
 
6744
6756
  function fieldsExtend$4(){
6745
6757
  return {
6758
+ "group": "",
6746
6759
  "label": {
6747
6760
  "is_wide": true
6748
6761
  },
6749
6762
  "name": {
6763
+ "group": "",
6750
6764
  "amis": {
6751
6765
  "hidden": true,
6752
6766
  "required": false
6753
6767
  }
6754
6768
  },
6755
6769
  "object_name": {
6770
+ "group": "",
6756
6771
  "amis": {
6757
6772
  "hidden": true
6758
6773
  }
6759
6774
  },
6760
6775
  "filter_scope": {
6776
+ "group": "",
6761
6777
  "amis": {
6762
6778
  "hidden": true,
6763
6779
  "required": false
6764
6780
  }
6765
6781
  },
6766
6782
  "columns": {
6783
+ "group": "",
6767
6784
  "amis": {
6768
6785
  "hidden": true,
6769
6786
  "required": false
6770
6787
  }
6771
6788
  },
6772
6789
  "mobile_columns":{
6790
+ "group": "",
6773
6791
  "amis": {
6774
6792
  "hidden": true,
6775
6793
  "required": false
6776
6794
  }
6777
6795
  },
6778
6796
  "searchable_fields":{
6797
+ "group": "",
6779
6798
  "amis": {
6780
6799
  "hidden": true,
6781
6800
  "required": false
6782
6801
  }
6783
6802
  },
6784
6803
  "filter_fields": {
6804
+ "group": "",
6785
6805
  "amis": {
6786
6806
  "hidden": true,
6787
6807
  "required": false
6788
6808
  }
6789
6809
  },
6790
6810
  "scrolling_mode": {
6811
+ "group": "",
6791
6812
  "amis": {
6792
6813
  "hidden": true,
6793
6814
  "required": false
6794
6815
  }
6795
6816
  },
6796
6817
  "sort": {
6818
+ "group": "",
6797
6819
  "amis": {
6798
6820
  "hidden": true,
6799
6821
  "required": false
6800
6822
  }
6801
6823
  },
6802
6824
  "show_count": {
6825
+ "group": "",
6803
6826
  "amis": {
6804
6827
  "hidden": true,
6805
6828
  "required": false
6806
6829
  }
6807
6830
  },
6808
6831
  "type": {
6832
+ "group": "",
6809
6833
  "amis": {
6810
6834
  "hidden": true,
6811
6835
  "required": false
6812
6836
  }
6813
6837
  },
6814
6838
  "shared": {
6839
+ "group": "",
6815
6840
  "amis": {
6816
6841
  "visibleOn": "${global.user.is_space_admin}"
6817
6842
  }
6843
+ },
6844
+ "filters": {
6845
+ "group": "",
6846
+ "amis": {
6847
+ "hidden": true
6848
+ }
6818
6849
  }
6819
6850
  }
6820
6851
  }
@@ -6961,6 +6992,12 @@ function fieldsExtend$3(){
6961
6992
  "amis": {
6962
6993
  "visibleOn": "${global.user.is_space_admin}"
6963
6994
  }
6995
+ },
6996
+ "filters": {
6997
+ "group": "",
6998
+ "amis": {
6999
+ "hidden": true
7000
+ }
6964
7001
  }
6965
7002
  }
6966
7003
  }
@@ -7299,7 +7336,6 @@ function fieldsExtend$1(){
7299
7336
  }
7300
7337
  },
7301
7338
  "mobile_columns": {
7302
- "group": i18next__default["default"].t('frontend_listview_control_columns_mobile_group'),
7303
7339
  "amis": {
7304
7340
  "type": "transfer",
7305
7341
  "sortable": true,
@@ -7669,7 +7705,8 @@ crudService && crudService.setData({showFieldsFilter: toShowFieldsFilter});
7669
7705
  // }
7670
7706
  `;
7671
7707
 
7672
- function getObjectHeaderQuickSearchBox(mainObject, fields, formFactor, { isLookup = false, keywordsSearchBoxName = "__keywords", crudId } = {}){
7708
+ // function getObjectHeaderQuickSearchBox(mainObject, fields, formFactor, { isLookup = false, keywordsSearchBoxName = "__keywords", crudId } = {}){
7709
+ function getObjectHeaderQuickSearchBox(mainObject, fields, formFactor, { isLookup = false, keywordsSearchBoxName = "__keywords" } = {}){
7673
7710
  const searchableFieldsLabel = [];
7674
7711
  _.each(mainObject.fields, function (field) {
7675
7712
  if (isFieldQuickSearchable(field, mainObject.NAME_FIELD_KEY)) {
@@ -7685,6 +7722,33 @@ function getObjectHeaderQuickSearchBox(mainObject, fields, formFactor, { isLooku
7685
7722
  crudKeywords = (localListViewProps && localListViewProps.__keywords) || "";
7686
7723
  }
7687
7724
 
7725
+ const onChangeScript = `
7726
+ const scope = event.context.scoped;
7727
+ let crud = SteedosUI.getClosestAmisComponentByType(scope, "crud");
7728
+ // let crudService = crud && SteedosUI.getClosestAmisComponentByType(crud.context, "service");
7729
+ let __changedSearchBoxValues = {};
7730
+ __changedSearchBoxValues["${keywordsSearchBoxName}"] = event.data["${keywordsSearchBoxName}"];
7731
+ // crudService && crudService.setData({__changedSearchBoxValues: __changedSearchBoxValues});
7732
+ // 这里不用crudService而用crud是因为lookup字段弹出的列表中的crudService中的变量无法传入crud的发送适配器中
7733
+ crud && crud.setData({__changedSearchBoxValues: __changedSearchBoxValues});
7734
+ `;
7735
+
7736
+ // onSearchScript中加上了onChangeScript中的脚本,是因为amis 3.2不能用change事件执行onChangeScript
7737
+ // 而点击回车按键又不会触发blur事件,所以只能每次回车事件中额外再执行一次onChangeScript
7738
+ // 等升级到amis 3.4+,blur事件换成change事件执行onChangeScript,就可以不用在onSearchScript中执行onChangeScript了
7739
+ const onSearchScript = `
7740
+ ${onChangeScript}
7741
+
7742
+ // 下面的脚本只为解决点击搜索表单取消按钮,再重新在其中输入过滤条件但是不点击搜索按钮或回车按键触发搜索,此时在快速搜索框输入过滤条件按回车按键会把搜索表单中的过滤条件清空的问题
7743
+ // const scope = event.context.scoped;
7744
+ // 如果点击过顶部搜索栏表单的取消按钮,会把此处event.data.__super.__super.__super中的搜索表单项的所有字段设置为null
7745
+ // 点击取消按钮后继续在表单项中输入过滤条件且最后没有点击回车按键或点击表单项搜索按钮的话,在快速搜索中点击回车按钮提交搜索会所顶部搜索表单中的字段值清空
7746
+ let filterForm = SteedosUI.getClosestAmisComponentByType(scope, "form");
7747
+ setTimeout(function(){
7748
+ filterForm.setValues(event.data.__changedFilterFormValues);
7749
+ }, 500);
7750
+ `;
7751
+
7688
7752
  return {
7689
7753
  "type": "tooltip-wrapper",
7690
7754
  "id": "steedos_crud_toolbar_quick_search",
@@ -7703,28 +7767,24 @@ function getObjectHeaderQuickSearchBox(mainObject, fields, formFactor, { isLooku
7703
7767
  "placeholder": "搜索此列表",
7704
7768
  "value": crudKeywords,
7705
7769
  "clearable": true,
7706
- "clearAndSubmit": true,
7770
+ // "clearAndSubmit": true,//因为清除并不会触发失去焦点事件,只有禁用,但是它会触发change事件,所以等升级到amis 3.4+后可以重新放开
7707
7771
  "searchImediately": false,
7708
7772
  "onEvent": {
7709
- "change": {
7773
+ "search": {
7710
7774
  "actions": [
7711
7775
  {
7712
7776
  "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
- `
7777
+ "script": onSearchScript
7726
7778
  }
7727
7779
  ]
7780
+ },
7781
+ "blur": { //这里把change事件换成blur是因为amis 3.2change事件中setData会卡,升级到3.4+后就可以换回change事件
7782
+ "actions": [
7783
+ {
7784
+ "actionType": "custom",
7785
+ "script": onChangeScript
7786
+ },
7787
+ ]
7728
7788
  }
7729
7789
  }
7730
7790
  }
@@ -7733,7 +7793,7 @@ function getObjectHeaderQuickSearchBox(mainObject, fields, formFactor, { isLooku
7733
7793
  }
7734
7794
 
7735
7795
  function getObjectHeaderToolbar(mainObject, fields, formFactor, {
7736
- showDisplayAs = false, hiddenCount = false, headerToolbarItems, crudId,
7796
+ showDisplayAs = false, hiddenCount = false, headerToolbarItems,
7737
7797
  filterVisible = true, isLookup = false, keywordsSearchBoxName } = {}){
7738
7798
  // console.log(`getObjectHeaderToolbar====>`, filterVisible)
7739
7799
  // console.log(`getObjectHeaderToolbar`, mainObject)
@@ -7837,7 +7897,7 @@ function getObjectHeaderToolbar(mainObject, fields, formFactor, {
7837
7897
  };
7838
7898
  }
7839
7899
  let toolbarDisplayAsButton = getDisplayAsButton(mainObject?.name);
7840
- let toolbarDQuickSearchBox = getObjectHeaderQuickSearchBox(mainObject, fields, formFactor, { isLookup, keywordsSearchBoxName, crudId });
7900
+ let toolbarDQuickSearchBox = getObjectHeaderQuickSearchBox(mainObject, fields, formFactor, { isLookup, keywordsSearchBoxName });
7841
7901
 
7842
7902
  // toolbars返回的数组元素不可以是空对象{},比如hiddenCount ? {} : {"type": "tpl",...},因为空对象最终还是会生成一个空的.antd-Crud-toolbar-item dom
7843
7903
  // 当出现空的.antd-Crud-toolbar-item dom时会影响toolbar元素的maring-right css样式计算,如果有动态需要应该加到动态数组变量toolbars中
@@ -7985,6 +8045,20 @@ async function getObjectFilter(objectSchema, fields, options) {
7985
8045
  let crudService = crud && SteedosUI.getClosestAmisComponentByType(crud.context, "service");
7986
8046
  crudService && crudService.setData({isFieldsFilterEmpty});
7987
8047
  `;
8048
+ let onChangeScript = `
8049
+ const scope = event.context.scoped;
8050
+ // let filterFormValues = event.data;
8051
+ let filterForm = SteedosUI.getClosestAmisComponentByType(scope, "form");
8052
+ let filterFormService = SteedosUI.getClosestAmisComponentByType(filterForm.context, "service");
8053
+ // 使用event.data的话,并不能拿到本地存储中的过滤条件,所以需要从filterFormService中取。
8054
+ let filterFormValues = filterFormService.getData();
8055
+ let crud = SteedosUI.getClosestAmisComponentByType(scope, "crud");
8056
+ const changedFilterFormValues = _.pickBy(filterFormValues, function(n,k){return /^__searchable__/.test(k);});;
8057
+ // let crudService = crud && SteedosUI.getClosestAmisComponentByType(crud.context, "service");
8058
+ // crudService && crudService.setData({__changedFilterFormValues: changedFilterFormValues});
8059
+ // 这里不用crudService而用crud是因为lookup字段弹出的列表中的crudService中的变量无法传入crud的发送适配器中
8060
+ crud && crud.setData({__changedFilterFormValues: changedFilterFormValues});
8061
+ `;
7988
8062
  return {
7989
8063
  "title": "",
7990
8064
  "submitText": "",
@@ -8008,19 +8082,7 @@ async function getObjectFilter(objectSchema, fields, options) {
8008
8082
  "actions": [
8009
8083
  {
8010
8084
  "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
- `
8085
+ "script": onChangeScript
8024
8086
  }
8025
8087
  ]
8026
8088
  }
@@ -8095,7 +8157,6 @@ async function getObjectCRUD(objectSchema, fields, options){
8095
8157
  const bulkActions = getBulkActions(objectSchema);
8096
8158
  const defaults = options.defaults;
8097
8159
  const listSchema = (defaults && defaults.listSchema) || {};
8098
- const id = `listview_${objectSchema.name}`;
8099
8160
 
8100
8161
  const bodyProps = {
8101
8162
  // toolbar: getToolbar(),
@@ -8105,7 +8166,7 @@ async function getObjectCRUD(objectSchema, fields, options){
8105
8166
  ...options,
8106
8167
  disableStatistics: options.queryCount === false
8107
8168
  }),
8108
- filter: options.filterVisible !== false && await getObjectFilter(objectSchema, fields, Object.assign({}, options, {crudId: id})),
8169
+ filter: options.filterVisible !== false && await getObjectFilter(objectSchema, fields, options),
8109
8170
  };
8110
8171
  if(options.formFactor !== 'SMALL' || ["split"].indexOf(options.displayAs) == -1){
8111
8172
  if(listSchema.mode !== "cards"){
@@ -8134,8 +8195,7 @@ async function getObjectCRUD(objectSchema, fields, options){
8134
8195
  showDisplayAs,
8135
8196
  hiddenCount: options.queryCount === false,
8136
8197
  headerToolbarItems: options.headerToolbarItems,
8137
- filterVisible: options.filterVisible,
8138
- crudId: id
8198
+ filterVisible: options.filterVisible
8139
8199
  });
8140
8200
 
8141
8201
  options.amisData = createObject(options.amisData, {
@@ -8148,6 +8208,7 @@ async function getObjectCRUD(objectSchema, fields, options){
8148
8208
 
8149
8209
 
8150
8210
  let body = null;
8211
+ const id = `listview_${objectSchema.name}`;
8151
8212
  if(options.formFactor === 'SMALL' && false){
8152
8213
  delete bodyProps.bulkActions;
8153
8214
  delete bodyProps.headerToolbar;
@@ -8226,7 +8287,12 @@ async function getObjectCRUD(objectSchema, fields, options){
8226
8287
  hiddenOn: options.tableHiddenOn,
8227
8288
  autoFillHeight,
8228
8289
  className: `flex-auto ${crudClassName || ""}`,
8229
- bodyClassName: "bg-white",
8290
+ // 这里不可以用动态className,因为它会把样式类加到.antd-Crud和.antd-Table.antd-Crud-body这两层div中,而子表列表中crudClassName中有hidden样式类会造成所有子表都不显示的bug
8291
+ // className: {
8292
+ // [`flex-auto ${crudClassName || ""}`]: "true",
8293
+ // "is-steedos-crud-data-empty": "${!items || COUNT(items) == 0}"
8294
+ // },
8295
+ bodyClassName: "bg-white",//上面className写成动态的class变量对象的话,bodyClassName不会生效,会被上面的className值覆盖
8230
8296
  crudClassName: crudClassName,
8231
8297
  quickSaveApi: {
8232
8298
  url: `\${context.rootUrl}/graphql`,
@@ -10117,8 +10183,6 @@ async function lookupToAmisTreeSelect(field, readonly, ctx) {
10117
10183
  return amisSchema;
10118
10184
  }
10119
10185
 
10120
- const keywordsSearchBoxName = `__keywords_lookup`;
10121
-
10122
10186
  const getReferenceToFieldSchema = (field, refObjectConfig)=>{
10123
10187
  let referenceTo = field.reference_to;
10124
10188
  if(!referenceTo){
@@ -10377,8 +10441,18 @@ async function lookupToAmisPicker(field, readonly, ctx){
10377
10441
 
10378
10442
  source.data.$term = "$term";
10379
10443
  source.data.$self = "$$";
10380
-
10444
+
10445
+ // field.name可能是带点的名称,比如审批王中子表字段'instances.instances_submitter',如果不替换掉点,会造成审批王表单中新建子表行时报错
10446
+ let keywordsSearchBoxName = `__keywords_lookup__${field.name.replace(/\./g, "_")}__to__${refObjectConfig.name}`;
10447
+
10381
10448
  source.requestAdaptor = `
10449
+ let __changedFilterFormValues = api.data.$self.__changedFilterFormValues || {};
10450
+ let __changedSearchBoxValues = api.data.$self.__changedSearchBoxValues || {};
10451
+ // 把表单搜索和快速搜索中的change事件中记录的过滤条件也拼到$self中,是为解决触发搜索请求时,两边输入的过滤条件都带上,即:
10452
+ // 有时在搜索表单中输入过滤条件事,忘记点击回车键或搜索按钮,而是进一步修改快速搜索框中的关键字点击其中回车键触发搜索
10453
+ // 这种情况下,触发的搜索请求中没有带上搜索表单中输入的过滤条件。
10454
+ // 反过来先在快速搜索框中输入过滤条件却不点击其中回车键触发搜索,而是到搜索表单中触发搜索请求也是一样的。
10455
+ Object.assign(api.data.$self, __changedSearchBoxValues, __changedFilterFormValues);
10382
10456
  const selfData = JSON.parse(JSON.stringify(api.data.$self));
10383
10457
  var filters = [];
10384
10458
  var pageSize = api.data.pageSize || 10;
@@ -10513,6 +10587,14 @@ async function lookupToAmisPicker(field, readonly, ctx){
10513
10587
  }
10514
10588
  });
10515
10589
  payload.data.rows = treeRecords;
10590
+ try{
10591
+ setTimeout(() => {
10592
+ $('.amis-dialog-widget.antd-Modal .antd-Table-content .antd-Table-table thead .antd-Table-expandBtn')[0]?.click();
10593
+ }, 600);
10594
+ }
10595
+ catch(ex){
10596
+ console.error("tree数据格式展开异常:", ex);
10597
+ }
10516
10598
  }
10517
10599
  return payload;
10518
10600
  `;
@@ -10685,6 +10767,7 @@ async function lookupToAmisPicker(field, readonly, ctx){
10685
10767
 
10686
10768
  async function lookupToAmisSelect(field, readonly, ctx){
10687
10769
  let referenceTo = await getReferenceTo(field);
10770
+ const isMobile = window.innerWidth <= 768;
10688
10771
  const valueFieldKey = referenceTo && referenceTo.valueField?.name || '_id' ;
10689
10772
  // const labelFieldKey = referenceTo && referenceTo.labelField?.name || 'name';
10690
10773
 
@@ -10865,7 +10948,11 @@ async function lookupToAmisSelect(field, readonly, ctx){
10865
10948
  </span>
10866
10949
  <span class='pl-1.5'>\${label}</span>
10867
10950
  </span>`;
10868
- data.menuTpl = "${icon ? `"+select_menuTpl+"` : label}";
10951
+ const menuTpl = "${icon ? `"+select_menuTpl+"` : label}";
10952
+ // TODO: 待amis修复了此bug, 就可以撤销添加menuTpl的判断。
10953
+ if(!(isMobile && field.multiple)){
10954
+ data.menuTpl = menuTpl;
10955
+ }
10869
10956
  if(field.multiple){
10870
10957
  data.multiple = true;
10871
10958
  data.extractValue = true;
@@ -11373,6 +11460,8 @@ function getSelectFieldOptions(field){
11373
11460
  }
11374
11461
 
11375
11462
  async function convertSFieldToAmisField(field, readonly, ctx) {
11463
+ // console.log('convertSFieldToAmisField====>', field, readonly, ctx)
11464
+ const isMobile = window.innerWidth <= 768;
11376
11465
  // 创建人和修改人、创建时间和修改时间不显示
11377
11466
  if(___namespace.includes(OMIT_FIELDS, field.name) && ctx.showSystemFields != true){
11378
11467
  return;
@@ -11435,7 +11524,11 @@ async function convertSFieldToAmisField(field, readonly, ctx) {
11435
11524
  </span>
11436
11525
  <span class='pl-1.5'>\${label}</span>
11437
11526
  </span>`;
11438
- convertData.menuTpl = "${icon ? `"+select_menuTpl+"` : label}";
11527
+ const menuTpl = "${icon ? `"+select_menuTpl+"` : label}";
11528
+ // TODO: 待amis修复了此bug, 就可以撤销添加menuTpl的判断。
11529
+ if(!(isMobile && field.multiple)){
11530
+ convertData.menuTpl = menuTpl;
11531
+ }
11439
11532
  if(field.multiple){
11440
11533
  convertData.multiple = true;
11441
11534
  convertData.extractValue = true;
@@ -12022,9 +12115,7 @@ async function getFieldSearchable(perField, permissionFields, ctx){
12022
12115
 
12023
12116
  const amisField = await convertSFieldToAmisField(_field, false, Object.assign({}, ctx, {fieldNamePrefix: fieldNamePrefix, required: false, showSystemFields: true, inFilterForm: true}));
12024
12117
  if(amisField){
12025
- return Object.assign({}, amisField,{
12026
- submitOnChange: false
12027
- });
12118
+ return amisField;
12028
12119
  }
12029
12120
  }
12030
12121
  }
@@ -12298,7 +12389,7 @@ async function getFormBody(permissionFields, formFields, ctx){
12298
12389
  * @Author: 殷亮辉 yinlianghui@hotoa.com
12299
12390
  * @Date: 2023-11-15 09:50:22
12300
12391
  * @LastEditors: 殷亮辉 yinlianghui@hotoa.com
12301
- * @LastEditTime: 2023-11-29 17:48:02
12392
+ * @LastEditTime: 2023-12-04 17:36:50
12302
12393
  */
12303
12394
 
12304
12395
  /**
@@ -12417,12 +12508,16 @@ async function getForm(props, mode = "edit") {
12417
12508
  }
12418
12509
  else if (mode === "new") {
12419
12510
  let onNewItemSubmitScript = `
12420
- event.data["${props.name}"].push(JSON.parse(JSON.stringify(event.data)));
12511
+ let fieldValue = _.cloneDeep(event.data["${props.name}"]);
12512
+ if(!fieldValue){
12513
+ fieldValue = [];
12514
+ }
12515
+ fieldValue.push(JSON.parse(JSON.stringify(event.data)));
12421
12516
  doAction({
12422
12517
  "componentId": "${props.id}",
12423
12518
  "actionType": "setValue",
12424
12519
  "args": {
12425
- "value": event.data["${props.name}"]
12520
+ "value": fieldValue
12426
12521
  }
12427
12522
  });
12428
12523
  `;
@@ -12624,11 +12719,20 @@ const getAmisInputTableSchema = async (props, readonly) => {
12624
12719
  ],
12625
12720
  "className": props.className
12626
12721
  };
12722
+ let footerToolbar = _$1.clone(props.footerToolbar || []); //这里不clone的话,会造成死循环,应该是因为props属性变更会让组件重新渲染
12627
12723
  if (props.addable) {
12628
- let buttonNewSchema = getButtonNew(props);
12629
- schema.body.push(buttonNewSchema);
12724
+ let buttonNewSchema = await getButtonNew(props);
12725
+ footerToolbar.unshift(buttonNewSchema);
12726
+ }
12727
+ if (footerToolbar.length) {
12728
+ schema.body.push({
12729
+ "type": "wrapper",
12730
+ "size": "none",
12731
+ "body": footerToolbar
12732
+ });
12630
12733
  }
12631
12734
  if (props.amis) {
12735
+ delete props.amis.id;
12632
12736
  Object.assign(schema.body[0], props.amis);
12633
12737
  }
12634
12738
  return schema;