## 1、侧滑弹框等打开eb卡片感知加载和卸载

> 支持钩子拦截详情组件props复写
> 
> 基线：250801基线

```
import { regOvProps } from '@weapp/utils';

regOvProps('weappEbdfpage', 'CardDetailDlg', (props) => {
  console.log("===",props)

  return {
    ...props,
    onDidMount:()=>{
      console.log("==onDidMount=",props)
    },
    onWillUnmount:()=>{
      console.log("==onWillUnmount=",props)
    },
  }

})
```

## 2、eb部分业务逻辑判断跳过

概述

     eb表单的一些功能考虑到历史用户或者部分客户使用的情况，标准内部不好调整，但是多数情况客户是不需要的但又是同步接口阻塞，现考虑结合ecode的方式统一加开关限制

> 支持基线：250401

```
/**
 * eb一些功能多数场景不常用，但是业务逻辑属于同步阻塞，标准无法跳过，结合ecode跳过
 */

/**
 * 1、eb流程判断sdk模式还是服务模式，240401基线后默认全是服务模式了，可以跳过判断，noJudgeEbWfService置为true即可
 *   url：/api/ebuilder/flow/approval/checkIsFlowCard
 */

// window.ebdfpageCommonConsts = {
//   noJudgeEbWfService:true,
// }

/**
 * 2、表格视图、表单等二次身份验证
 *   url:/api/ebuilder/form/secondAuth/getSecondAuthSetting
 */

// window.ebdfpageCommonConsts = {
//   noJudgeEbWfService:true,
//   noGetSecondAuthSetting:true,
// }

/**
 * 3、eb表单主次身份和兼岗逻辑
 * url：/api/ebuilder/form/data/fetchFirstOtherRolePerms/XXX
 */
window.ebdfpageCommonConsts = {
  noJudgeEbWfService:true,
  noGetSecondAuthSetting:true,
  noFetchRolePerms:true
}
```

## 3、表格视图给em底部留白去掉

> !window.TEAMS?.isDisplayModule?.('im') && !window.TEAMS?.isDisplayModule?.('emmsg') 获取，得到false就是没部署

```typescript
import { regOvProps  } from '@weapp/utils';

regOvProps('weappEbdfpage', 'TableComponent', (props) => {
  return {...props,needEmpty:false };
}, 0);
```

## 4、表格视图导入附件大小复写

```

import { regOvProps  } from '@weapp/utils';

regOvProps('weappEbdfpage', 'BatchImpContent', (props) => {

  return {...props, needLimitSize:false,maxSize:10 };
}, 0);
```

## 5、eb表单关联link的iframe解析自定义复写

```
import { regOvProps  } from '@weapp/utils';

regOvProps('weappEbdfpage', 'DockerLinkIframe', (props) => {
  return {...props,customRender :(src,content)=>{
    console.log("src",src);
    if(src.indexOf("https://www.baidu.com/s")>-1){
      return <span>我是百度</span>
    }
    return <>{content}</>
  } };
}, 0);

regOvProps('weappEbdfpage', 'MDockerLinkIframe', (props) => {
  return {...props,customRender :(src,content)=>{
    console.log("src",src);
    if(src.indexOf("https://www.baidu.com/s")>-1){
      return <span>我是百度</span>
    }
    return <>{content}</>
  } };
}, 0);
```

## 6、自定义表单标题或增加后缀

```javascript
//属性说明：
appId//应用id
dataId//数据id
title//原本的标题字符串
//其他...

weappUtils.regOvProps('weappEbdfpage','CommonTitleNew',(props)=>{
console.log(props)
    return {
        ...props,
        customLeftContent:()=>'123123'
    }
})
```

## 7、h5的表格视图列点击事件支持自定义复写

> 也可以用此方法拦截默认事件
> 
> 需要写在ecode生效

```
案例：

import { regOvProps  } from '@weapp/utils';
 
regOvProps('weappEbdfpage', 'MListView', (props) => {
    // 按需改动 :表格视图id
  if(props.mTableViewStore?.viewId==="1074527622716760064"){

      console.log('p222222222221074527622716760064rops',props);

      return {...props, onCustomRowClick:(data)=>{

        console.log("onCustomRowClick",data)

      } };

  }

  return {...props,  };

}, 0);
```

#### 7.1 表格视图h5行事件配置成侧滑打开，优化性能体验

> 需要写在ecode生效

```
mport { regOvProps  } from '@weapp/utils';

regOvProps('weappEbdfpage', 'MListView', (props) => {
   //1、控制某个视图侧滑 1074527622716760064  ：表格视图id
  //if(props.mTableViewStore?.viewId==="1074527622716760064"){
     
  //}
  //2、默认全部侧滑
  return {...props,  openDetailPageMode:"right"};
}, 0);
```

## 8、h5的表格视图列表默认行动作无法取消

```
//通过ecode实现css复写禁止掉点击动作

//weapp-ebdf-mtablev
//1047832562838134797  为具体的某一个表格视图id，如果禁止掉所有的列表可以去掉-1047832562838134797 即可
 .weapp-ebdf-mtablev-1047832562838134797  .weapp-ebdf-mtablev-listview .mlist-view-content .ui-m-list-body .ui-m-list-item .ui-m-list-content .mlist-view-item-content {
    pointer-events: none;
}

.weapp-ebdf-mtablev-1047832562838134797  .weapp-ebdf-mtablev-listview .mlist-view-content .ui-m-list-body .ui-m-list-item .ui-m-list-content .mlist-view-item-content .mlist-view-bottom-extra-btn {
    pointer-events: visible;
}
```

## 9、评论组件附件开启默认上传

> 评论新建编辑的时候，附件数据只是一个前端状态，没有实际上传

```
import { regOvProps  } from '@weapp/utils';

regOvProps('weappUi', 'Comment', (props) => {

  return {...props, uploadProps:{...props.uploadProps,autoUpload:true}};
}, 0)
```

## 10、关联中的布局通过参数隐藏评论

> 背景：项目详情关联中关联几个布局展示都是当前数据，评论重复展示多余

```
关联不要评论地方添加固定参数
hideComment=1
```

## 11、系统Table组件添加列分割线

> eb表格视图默认只有主表字段时没边线，可以ecode自行处理

```
//注意这种复写比较暴力，系统中所有的Table都会出现边线，如需控制自行处理
import { regOvProps } from '@weapp/utils';

regOvProps('weappUi', 'Table', (props) => {

  return {...props,bordered:true}

})
```

## [图片附件未整合: ../../../../_assets/364946059744509952/001-0b5f833610.png]

12、eb表格视图去掉列国际化时区转换

```
import { regOvProps } from '@weapp/utils';
/**基于ui table**/
regOvProps('weappUi', 'Table', (props) => {
  // console.log("===",props)
  //全部表格视图都去掉国际化时区转换，如果需要根据视图来可以修改判断属性
  if(props.rowKey==="ebrecord_rowkey"){
      return {
        ...props,
        columns:props.columns.map(col=>({...col,isLocaleDate:false}))
      }
  }
  return props;

})

/**
 * 拦截复写表格视图显示列去掉时区转换
 */
axios.interceptors.response.use(function (response) {

  if (response.status === 200 && response.config.url.includes('/api/ebuilder/form/list/getListDatas')) {

    response.data.data.columns = (response.data.data.columns||[]).map(col=>({...col,isLocaleDate:false}));
    // console.log("response",response)
    return response;
  }else {
    return response;
  }
}, function (error) {
  return Promise.reject(error);
});
```

## 13、表格视图运行分页设置复写

**注意事项：**

> 1、基线条件： 2511.01及以上基线支持
> 
> 2、后台最大支持1000  不可超过，考虑性能问题按需使用

**步骤：**

1、增加配置文件（注意：单体部署需要重启后端E10服务）

**需在nacos中(单体部署为E10目录/webapps/ROOT/WEB-INF/classes/weaver/config/config-center/)的weaver-ebuilder-form-service.properties下添加配置项**：

weaver.ebuilder.form.list.disablePageSizeLimitObjs=表单模型id，支持逗号分隔多个表单，支持填写all\_obj

> 实体表获取表单模型id

[图片附件未整合: ../../../../_assets/364946059744509952/002-cee5e7c9b0.png]

> 虚拟表获取表单模型id

[图片附件未整合: ../../../../_assets/364946059744509952/003-6e5911a77c.png]

**2、增加ecode复写，复写案例如下**

1、简单修改一两个表格视图可以参考

```
import { regOvProps } from '@weapp/utils';

regOvProps('weappUi', 'ListView', (props) => {
 
  //表格视图id  --  在这里维护即可
  if(props.weId.indexOf("991078023112794114") > -1 || props.weId.indexOf("1019335892856971267") > -1 ){
    const pageSizeOptions = props.pageInfo.pageSizeOptions;
    const _props = {
        ...props,
       pageInfo:{
         ...props.pageInfo,
         //1000允许自定义
         pageSizeOptions:pageSizeOptions.includes(1000) ? pageSizeOptions: [...pageSizeOptions,1000],
       }
      }

      return _props
  }
  return props;

})
```

2、很多个表格视图都要支持，可以参考

```
import { regOvProps } from '@weapp/utils';

// 所有开放1000条的表格ID数组  --  在这里维护即可
const listidArr = ["884192702577623056", "884192702577623057", "884192702577623058"];

// 缓存已经判断过的结果 {weId: boolean}
const processedCache = new Map();

// 将ID数组转换为Set提高查找性能
const listidSet = new Set(listidArr);

regOvProps('weappUi', 'ListView', (props) => {
  const propsWeId = props.weId;
  
  // 1. 先查缓存
  if (processedCache.has(propsWeId)) {
    const shouldAdd = processedCache.get(propsWeId);
    if (!shouldAdd ) {
      return props; // 不需要处理直接返回
    }
  } else {
    // 2. 缓存中没有，进行计算并缓存
    let shouldAdd = false;
    
    // 优化1：使用Set的has方法代替循环
    for (const id of listidSet) {
      if (propsWeId.includes(id)) {
        shouldAdd = true;
        break;
      }
    }
    
    processedCache.set(propsWeId, shouldAdd );
    
    if (!shouldAdd ) {
      return props; // 不需要处理直接返回
    }
  }
  
  // 3. 需要添加1000选项的逻辑
  const pageSizeOptions = props.pageInfo.pageSizeOptions;
  
  // 优化2：避免重复创建数组
  if (!pageSizeOptions.includes(1000)) {
    return {
      ...props,
      pageInfo: {
        ...props.pageInfo,
        pageSizeOptions: [...pageSizeOptions, 1000]
      }
    };
  }
  
  return props;
});
```

表格视图id：

[图片附件未整合: ../../../../_assets/364946059744509952/004-3074a816f3.png]

## 14、筛选、高级搜索二开隐藏选择框选项

```

import { regOvProps } from '@weapp/utils';
 
/*********** 筛选的选择框复写 ********** */
regOvProps('weappComponents', 'FilterSearch', (props) => {
  console.log("FilterSearch",props)
  /**
   * 1、conditionId：使用表格视图id进行开启匹配，需客户配置
   * 2、hideOptionInfo：对象结构，key是需要隐藏选项的字段fieldName；value是隐藏的选项id
   */
  if(props.conditionId && props.conditionId === '1183917888613269505'){
    const hideOptionInfo = {
      "field_1183654164749877249":['0','1'],
      'field_8':['1']
    }

    const formatData = (data) => {
      let newData = [];
      data.forEach((d)=>{
        const hideKeys = hideOptionInfo[d.fieldName] || [];
        if(['checkbox','select','radiobox'].includes(d.componentKey?.toLowerCase()) && hideKeys.length > 0){
          newData.push({
            ...d,
            options: d.options.filter((opt)=> !hideKeys.includes(opt.value))
          })
        }else{
          newData.push(d);
        }
      });
      return newData;
    }

    const _props = {
        ...props,
        customInitFilterData:formatData,
        customInitAllFilterData:formatData
      }
    return _props
  }
  return props;
})

/*********** 高级搜索的选择框复写 ********** */
axios.interceptors.response.use(function (response) {
  /**
   * 1、getListSearch/xxx：使用表格视图id进行开启匹配，需客户配置
   * 2、hideOptionInfo：对象结构，key是需要隐藏选项的字段fieldName；value是隐藏的选项id
   */
  if (response.status === 200 && response.config.url.includes('api/ebuilder/form/listSearch/getListSearch/1183917888613269505')) {
    const hideOptionInfo = {
      "field_1183654164749877249":['0','1'],
      'field_8':['1']
    }
  
    const items = {};
    const orginItems = response.data.data.items||{}
    Object.keys(orginItems).forEach((fieldName)=>{
      const orginItem = orginItems[fieldName];

      let itemType = orginItem.itemType?.toLowerCase();
      if(itemType === 'custom'){
        itemType = orginItem.otherParams.componentKey?.toLowerCase()
      }
      const hideKeys = hideOptionInfo[fieldName] || [];
      if(['checkbox','select','radiobox'].includes(itemType) && hideKeys.length > 0){
        items[fieldName] = {
          ...orginItem,
          options:orginItem.options?.filter((opt)=> !hideKeys.includes(opt.id))
        }
      }else{
        items[fieldName] = orginItem
      }
    })

    response.data.data = {
      ...response.data.data,
      items:items
    }

    return response;
  }else {
    return response;
  }
}, function (error) {
  return Promise.reject(error);
});
```

## 15、eb表单新建布局关闭提示

```
import { regOvProps } from '@weapp/utils';

regOvProps('weappEbdfpage', 'CardDetailDlg', (props) => {
  //needConfirmInClose 关闭弹窗是否需要确认数据更改提示
  //注意： 添加这个自己通过props做好参数判断，不要影响全局
  return {...props,needConfirmInClose:false};
}, 0);
```

[图片附件未整合: ../../../../_assets/364946059744509952/005-47f70cf54b.png]

## 16、表格视图或布局自定义调整页头左右比例

```
import { regOvProps } from '@weapp/utils';

regOvProps('weappUi', 'Title', (props) => {
   /**
    * 1、表格视图- 替换视图id
    * 2、表单布局 - 用对应的eb表单id
    */
 if(props.weId.indexOf("1189493997500194823")>-1){
    //遵守24栅格，左右自定义加为24即可
    return  {...props,leftCol:6,rightCol:18}
 }
  
  return props;

})
```

## 17、批量导入接口在调用导入时把url参数或prop参数传入到数据导入接口在导入前置处理接口中能获取到

> 251201基线默认支持带入到，/api/ebatch/uploadFileId中,之前基线需要自行ecode添加参数
> 
> 前端：

```
251201基线之前自行复写添加参数：
{
  uploadSet：{
    customObj：{
        customParams: { //这里
             }
    }
  }
}
```

[图片附件未整合: ../../../../_assets/364946059744509952/006-e5e3bf7606.png]

## 18、获取指定字段的筛选数据值

```typescript
  /**
   * 获取指定字段的筛选数据值
   * 先从高级搜索中获取值，再从筛选条件中获取，后者会覆盖前者
   * @param {string} fieldId - 需要获取值的字段ID
   * @return {*} 字段的值，可能是各种类型
   */
  const getFilterDataValue = (fieldId, dataKey, tableStore, _isMobile) => {
    try {
      let searchData = {};
      if (_isMobile) {
        // 检查是否存在高级搜索存储，并获取其中的表单数据
        const store = tableStore.searchAdvancedStore?.formStore;
        if (store) {
          searchData = store.getFormDatas();
        }
      } else {
        // 获取筛选条件的数据
        const filterData = tableStore.filterSearchStore?.searchParams;
        // 检查是否存在高级搜索存储，并获取其中的表单数据
        const store = tableStore.viewHeaderStore?.searchAdvancedStore?.formStore;
        if (store) {
          searchData = store.getFormDatas();
        }
        // 合并搜索数据和筛选数据，筛选数据优先级更高
        searchData = {
          ...searchData, // 高级搜索中的数据
          ...filterData, // 筛选条件中的数据（会覆盖搜索数据中的相同字段）
        };
      }

      // 打印调试信息（生产环境中可考虑移除）
      // console.log('searchData', fieldId, searchData);
      // console.log('filterData', fieldId, filterData);

      // 构造字段在数据对象中可能的键名
      const key = `field_${fieldId}`;
      let val;

      // 尝试获取字段值，先尝试带field_前缀的键，再尝试直接使用字段ID
      if (key in searchData) {
        val = getStringData(searchData[key]);
      } else if (fieldId in searchData) {
        val = getStringData(searchData[fieldId]);
      } else if(dataKey in searchData) {
        val = getStringData(searchData[dataKey]);
      }

      return val; // 返回找到的值或undefined
    } catch (e) {
      console.log(e);
    }
  }; 
/**
   * 注册覆盖Table视图内容的属性
   * 这个函数主要用于拦截和修改TableViewContent的属性
   */
  weappUtils.regOvProps('weappEbdfpage', 'TableComponent', (props) => {
    const { tableViewStore } = props; // 从props中解构出tableViewStore
    const fieldId = ''; //字段id
    const dataKey = ''; //字段key,没有可以不传
    const value = getFilterDataValue(fieldId, dataKey, tableViewStore, false);
    console.log(value);
    // 返回可能修改后的props
    return props;
  }, 0);

  // 移动端
  weappUtils.regOvProps('weappEbdfpage', 'MTableViewContent', (props) => {
    const { mTableViewStore } = props; // 从props中解构出mTableViewStore
    const fieldId = ''; //字段id
    const dataKey = ''; //字段key,没有可以不传
    const value = getFilterDataValue(fieldId, dataKey, mTableViewStore, true);
    console.log(value);
    // 返回可能修改后的props
    return props;
  }, 0);
```

## 19、eb表格视图放开shift滑动选中能力

> 251201基线后默认支持，前面基线ecode放开

```
import { regOvProps } from '@weapp/utils';

/**基于ui table**/
regOvProps('weappUi', 'Table', (props) => {

  return {
     ...props,
        selection:{
          ...props.selection,
          enableShiftSelect: true, // 开启shift快速批量选择
          }
      }

})
```

## 20、评论组件支持富文本

```
使用Ecode，拦截weappUi.Comment

属性 useRichText 更改为true

可以实现将评论转换为富文本组件。
```

## 21、自定义修改打开PC的表单卡片的弹框宽度

```javascript
weappUtils.regOvProps('weappEbdfpage', 'CardDetailDlg', (props) => {
  // 如果需要判断表单，可以根据props.comParams?.objid判断
  // 如果需要判断布局类型，可以根据props.comParams?.type判断，1新建，0显示，2编辑
  // console.log(props)
  if (props.dialogProps?.placement === 'right') {
    // 右侧滑出
    const newProps = {
      ...props,
      dialogWidthParams: {
        ...props?.dialogWidthParams,
        width: '100%', // '1000px'
      },
    };
    return newProps;
  }
  return props;
});
```

22.筛选控制 所有条件/任一条件 的显示

```javascript
import {regOvProps} from '@weapp/utils'
regOvProps('weappComponents', 'FilterSearch', (props) => {
  //如果需要判断表格
  const listId = '1234866551521796097'
  if(props?.conditionId !== listId) return props;

    let newProps = props;
  if (props.getInstance) {
    props.getInstance = (store) => {
      store.conditionTypeChange('or')
      return store;
    };
    newProps = props;
  } else {
    newProps = {
      ...props,
      getInstance: (store) => {
        store.conditionTypeChange('or')
        return store;
      },
    };
  }
  return newProps;
},0);
```

## 23、eb表格视图或布局自定义【按钮】图标自定义

> 260401基线支持

```
import { regHook,  } from '@weapp/utils'

// 注册同步钩子
regHook('weappEbdfpage', 'ebButtonIcon', (data) => {
   /**
    * 需要判断按钮id自定义图标
    * 注意：ui库图标https://weapp.eteams.cn/iconfont/resource/icon ，在图标前加上#键，eb需要
    */
  if(data.id==="1250852441425551362"){
      return data.isMobile  ?   "Icon-Judge" : "#Icon-Judge"
  }
  return  null
})
```

## 24、虚拟表单隐藏实现关联

> 250501基线后标准隐藏

```

```
