Odoo 10看板视图拖拽任务阶段变更添加确认提示需求
解决看板视图拖拽任务阶段的确认提示需求
嗨,我明白你的需求了——你希望用户在看板视图拖拽任务变更阶段时,先弹出一个确认提示,而不是直接触发后端write方法的报错。之前用write方法加验证报错的方式确实达不到“先确认再执行”的效果,因为后端报错是操作已经发起后的拦截,而我们需要在前端拖拽操作完成前就询问用户。下面给你一套具体的实现方案:
实现思路
Odoo的看板拖拽逻辑是由前端的KanbanRecord组件处理的,我们可以通过继承这个组件,重写拖拽放置的处理方法,在真正执行阶段变更操作前插入确认弹窗,用户确认后再继续执行原逻辑,取消则终止操作。
具体代码实现
1. 创建自定义模块的JS文件
在你的自定义模块下创建static/src/js/task_kanban.js,写入以下代码:
odoo.define('your_custom_module.task_kanban', function (require) { "use strict"; // 引入需要的Odoo前端组件 const KanbanRecord = require('web.KanbanRecord'); const Dialog = require('web.Dialog'); // 继承KanbanRecord组件,重写拖拽放置方法 KanbanRecord.include({ async _onDrop(ev) { // 获取当前任务的阶段ID和目标阶段ID const currentStageId = this.record.data.stage_id?.data?.id; const targetStageId = ev.data.stageId; // 如果阶段没有变化,直接执行原逻辑 if (currentStageId === targetStageId) { return this._super(...arguments); } // 弹出确认对话框,等待用户选择 return new Promise((resolve, reject) => { Dialog.confirm(this, "确定要将此任务移动到新的阶段吗?", { title: "确认阶段变更", confirm_callback: () => { // 用户确认后,执行原拖拽逻辑 this._super(...arguments).then(resolve).catch(reject); }, cancel_callback: () => { // 用户取消后,拒绝Promise,阻止操作 reject(new Error("用户取消了阶段变更")); }, }); }); }, }); return { KanbanRecord: KanbanRecord, }; });
2. 在模块配置中加载JS文件
修改模块的__manifest__.py,添加JS文件到后端资源中:
{ 'name': 'Task Stage Drag Confirmation', 'version': '1.0', 'category': 'Project Management', 'depends': ['project'], 'data': [], 'assets': { 'web.assets_backend': [ 'your_custom_module/static/src/js/task_kanban.js', ], }, 'installable': True, 'auto_install': False, 'license': 'LGPL-3', }
自定义扩展(可选)
如果你只想在特定阶段(比如“已完成”)触发确认提示,可以在判断阶段变化后,额外获取目标阶段的信息进行判断:
// 在_onDrop方法中,获取目标阶段名称 const targetStage = await this.model.env['project.task.type'].searchRead( [['id', '=', targetStageId]], ['name'] ); if (targetStage[0].name === '已完成') { // 仅当移动到已完成阶段时弹出确认框 return new Promise((resolve, reject) => { Dialog.confirm(this, "确定要将此任务标记为已完成吗?", { confirm_callback: () => this._super(...arguments).then(resolve).catch(reject), cancel_callback: reject, }); }); } else { // 其他阶段直接执行原逻辑 return this._super(...arguments); }
测试步骤
- 替换代码中的
your_custom_module为你实际的模块名称 - 安装并升级你的自定义模块
- 刷新浏览器页面,进入任务看板视图,拖拽任务到不同阶段测试确认提示效果
这样就能实现你想要的“拖拽前确认”的需求,而不是直接触发后端报错啦!
内容的提问来源于stack exchange,提问作者Ridma Gimhani
相关产品推荐
相关产品推荐

