A.引言
还记得去年某天我在讨论群里问清空字段映射的操作,今晚实现啦
回想那天,我还正面对着屏幕上的几百个字段映射在发愁。
做这个功能主要是为了练手,好久没写ecode了;
如果你正巧需要,这能减轻你的运维工作量,那便更有意义了!
如果你还在学习路上,配合泛微 EC9 之 ecodeSDK API 文档食用更佳~
B.功能演示
C.曲折过程
很烦!遇到了坑!
这个页面的数据字段下拉框,竟然不能通过Select或WeaSelect组件复写!!!
一开始我做这个需求的时候,还感觉很简单,喵的,不就是个下拉框嘛,分分钟!
令我没想到的是,怎么查也没查到组件名。。。。
最终还是靠我的泛微 ecode 开发辅助 - ecode 组件全局检索
发现竟然用的非标准Select组件,而是,一整个Table组件!!!
一开始我做这个需求的时候,还感觉很简单,
令我没想到的是,怎么查也没查到组件名。。。。
最终还是靠我的泛微 ecode 开发辅助 - ecode 组件全局检索
发现竟然用的非标准Select组件,而是,一整个Table组件!!!
ecodeSDK.overwritePropsFnQueueMapSet('Select', {
fn: (newProps) => {
if (window.location.hash.indexOf('#/workflowengine/path/pathSet/pathDetail/advanceSet/workflowToMode') < 0) return;
console.log('"Select newProps":', newProps);
console.log('!找到Select组件啦!!!!!!');
},
});
ecodeSDK.overwritePropsFnQueueMapSet('WeaSelect', {
fn: (newProps) => {
if (window.location.hash.indexOf('#/workflowengine/path/pathSet/pathDetail/advanceSet/workflowToMode') < 0) return;
console.log('"WeaSelect newProps":', newProps);
console.log('!找到WeaSelect组件啦!!!!!!');
},
});
再看Table组件,好家伙,这个组件没有存值!
好好好,改DOM结构试试!也不行!
a~~ 怎么办呢?思索片刻,行!我直接‘迂回策略’~复写请求!,开搞!
D.最终代码
V1版本(历史):只清空/重置全部字段映射
let isClearButtonClicked = false;
ecodeSDK.overwritePropsFnQueueMapSet('WeaDialog', {
fn: (newProps) => {
if (window.location.hash.indexOf('#/workflowengine/path/pathSet/pathDetail/advanceSet/workflowToMode') < 0) return;
if (newProps.title && newProps.title.includes('流程转数据:')) {
const { Tooltip, Button } = antd;
newProps.buttons.unshift(
<Tooltip placement="topLeft" title="(注:第一个字段映射为空时,将初始化为自动映射,不为空则清空所有字段映射)">
<Button key="clearMapping" onClick={handleClearMapping}>
重置字段映射
</Button>
</Tooltip>
);
function handleClearMapping() {
if (window.antd && window.antd.Modal) {
window.antd.Modal.warning({
title: '风险提示',
content: '即将重置字段映射配置,请谨慎操作!',
okText: '确认重置',
cancelText: '取消操作',
onOk: () => {
isClearButtonClicked = true;
const saveButton = newProps.buttons.find(button => button.props.children === "保存");
if (saveButton && saveButton.props.onClick) {
saveButton.props.onClick();
}
},
});
}
}
}
},
});
ecodeSDK.rewriteApiParamsQueueSet({
fn: (url, method, params) => {
if (isClearButtonClicked && url.indexOf("/api/cube/mode/mode/saveWorkflowToMode") !== -1) {
Object.keys(params).forEach(key => {
if (key.startsWith('wffieldid') && key !== 'wffieldid_0_0') {
params[key] = '';
}
});
}
return {
url: url,
method: method,
params: params
};
}
});
2024年3月29日 15:10:54 丸子根据今日收到的需求,感觉比较合理,所以更新了第二版本
更新内容如下:
- 增加选择清空表功能————可以根据情况,选择自己需要清空的表
- 修复点击重置字段映射按钮后没有取消重置状态的BUG
- 修改为只在字段映射页签显示按钮
emmmm增加选择表功能后,其实可以通过逻辑来处理掉 需要选择主表第一个字段映射的问题,但是,嘿嘿,我就不,略略略!
let isClearButtonClicked = false;
let mainActiveKey = '';
let selectOptions = '';
let selectValue = '';
let clearButton = '';
ecodeSDK.overwritePropsFnQueueMapSet('WeaDialog', {
fn: (newProps) => {
if (window.location.hash.indexOf('#/workflowengine/path/pathSet/pathDetail/advanceSet/workflowToMode') < 0) return;
if (newProps.title && newProps.title.includes('流程转数据:')) {
const { Tooltip, Button,Select } = antd;
newProps.buttons.unshift(
<Tooltip placement="topLeft" title="(注:重置全部映射时,若主表第一个字段映射为空,将初始化为自动映射)">
<Button key="clearMapping" onClick={handleClearMapping} className="clear-button" >
重置字段映射
</Button>
</Tooltip>
);
function handleClearMapping() {
if (window.antd && window.antd.Modal) {
console.log("selectValue 默认值为:", selectValue);
const content = (
<div>
<div>重置字段映射配置,请谨慎操作!</div>
<div>即将清空以下字段映射:</div>
<Select defaultValue={selectOptions.map(option => option.key)} multiple style={{ width: '100%' }} onChange={value => { selectValue = value; }}>
{selectOptions.map(option => (
<Select.Option key={option.key} value={option.key}>{option.value}</Select.Option>
))}
</Select>
</div>
);
window.antd.Modal.warning({
title: '风险提示',
content: content,
okText: '确认重置',
cancelText: '取消操作',
onOk: () => {
isClearButtonClicked = true;
const saveButton = newProps.buttons.find(button => button.props.children === "保存");
if (saveButton && saveButton.props.onClick) {
saveButton.props.onClick();
}
},
});
}
}
}
},
});
ecodeSDK.rewriteApiParamsQueueSet({
fn: (url, method, params) => {
if (isClearButtonClicked && url.indexOf("/api/cube/mode/mode/saveWorkflowToMode") !== -1) {
Object.keys(params).forEach(key => {
if (key.startsWith('wffieldid') && key !== 'wffieldid_0_0') {
if (selectValue.includes(key.split('_')[1])) {
params[key] = '';
}
}
});
isClearButtonClicked = false;
}
return {
url: url,
method: method,
params: params
};
}
});
ecodeSDK.overwritePropsFnQueueMapSet('Tabs', {
fn: (newProps) => {
if (window.location.hash.indexOf('#/workflowengine/path/pathSet/pathDetail/advanceSet/workflowToMode') < 0) return;
if (newProps.children && newProps.children.length > 0 && newProps.children[0].props.tab === '基础信息') {
mainActiveKey = newProps.activeKey;
clearButton = clearButton || document.querySelector('.clear-button');
clearButton && (clearButton.style.display = mainActiveKey !== '2' ? "none" : "");
}
if (newProps.children && newProps.children.length > 0 && newProps.children[0].props.tab === '主表') {
selectOptions = newProps.children.map(child => ({
key: child.key,
value: child.props.tab
}));
selectValue = selectOptions.map(option => option.key);
}
},
});
成功的关键在于不断探索和尝试,直到找到解决问题的方法。
[泛微ecode] 一键重置流程转数据字段映射 by https://oneszhang.com/archives/65.html
这么好用的功能,值得所有交付和运维的兄弟使用。大家可以推广使用起来,丸子牛逼