You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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);
}

测试步骤

  1. 替换代码中的your_custom_module为你实际的模块名称
  2. 安装并升级你的自定义模块
  3. 刷新浏览器页面,进入任务看板视图,拖拽任务到不同阶段测试确认提示效果

这样就能实现你想要的“拖拽前确认”的需求,而不是直接触发后端报错啦!

内容的提问来源于stack exchange,提问作者Ridma Gimhani

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:38:50