Odoo 免费开源 ERP:通过 JavaScript 创建对话框窗口的技术实践分享

ops/2024/12/25 23:41:39/

作者 | 老杨

出品 | 上海开源智造软件有限公司(OSCG)

概述

在本文中,我们将深入研讨如何于 Odoo 18 中构建 JavaScript(JS)对话框或弹出窗口。对话框乃是展现重要讯息、确认用户操作以及警示用户留意警告或错误的行之有效的手段。对话框作为一个小巧的窗口,当由特定的操作(诸如单击按钮或者与 Many2many 等字段进行交互)所触发时,便会呈现在当前页面之上。此类对话框强化了前端与后端的用户体验,并且能够以确认、警报等的模式抑或弹出窗口的形式予以呈现。

我们将予以介绍 Odoo 18 当中的若干关键对话框类型,涵盖 WarningDialog、ConfirmationDialog、AlertDialog、FormViewDialog 以及 MessageConfirmDialog。

ConfirmationDialog (确认对话框)

ConfirmationDialog 能够用于呈现涵盖两个选项(通常为“Ok”与“Cancel”)的简短讯息。用户能够通过点击 Cancel 按钮或者关闭(X)图标来将对话框关闭。

要实现此对话框,请先导入所需的组件:

import { ConfirmationDialog } from "@web/core/confirmation_dialog/confirmation_dialog";
import { useService } from "@web/core/utils/hooks";

然后,在组件的 setup 方法中设置对话框:

setup() {super.setup();this.notification = useService("notification");this.dialogService = useService("dialog");
},

添加带有确认消息的对话服务,如下所示:

this.dialogService.add(ConfirmationDialog, {body: _t("Sample text to confirm here"),confirmClass: "btn-primary",confirmLabel: _t("Confirm"),confirm: () => {this.notification.add(_t("Confirmed"), {type: "success",});},cancelLabel: _t("Cancel"),cancel: () => { },
});

示例:增添确认对话框,以自 Many2many 字段标记开启表单视图
在此示例当中,我们将会达成一个确认对话框的实现,当用户点击 Many2many 字段标签之时,该对话框将会开启一个表单视图。

/** @odoo-module **/
import { _t } from "@web/core/l10n/translation";
import { useService } from "@web/core/utils/hooks";
import { Many2ManyTagsFieldColorEditable } from "@web/views/fields/many2many_tags/many2many_tags_field";
import { ConfirmationDialog } from "@web/core/confirmation_dialog/confirmation_dialog";
import { patch } from "@web/core/utils/patch";
patch(Many2ManyTagsFieldColorEditable.prototype, {setup() {super.setup();this.action = useService("action");this.dialogService = useService("dialog");},onTagClick(ev, record) {this.dialogService.add(ConfirmationDialog, {body: _t("If you want to open the form view, click 'Open Form View'."),confirmClass: "btn-primary",confirmLabel: _t("Open Form View"),confirm: () => {this.action.doAction({type: 'ir.actions.act_window',res_model: this.relation,res_id: record.resId,views: [[false, 'form']],target: 'current',});},cancelLabel: _t("Cancel"),cancel: () => { },});}
});


以下是显示确认对话框的输出:

WarningDialog(完整报错信息)

WarningDialog 主要用以向用户呈现重要的警告或报错。其通常涵盖标题、消息以及用户交互按钮。

要使用此对话框,请先导入所需的组件:

import { WarningDialog } from "@web/core/errors/error_dialogs";
import { useService } from "@web/core/utils/hooks";

在设置方法中,指定对话框服务:

setup() {super.setup();this.dialogService = useService("dialog");
}

添加带有报错信息的对话框,如下所示:

this.dialogService.add(WarningDialog, {title: _t("Warning: Title goes here"),message: _t("Warning message goes here."),
});

完整报错信息如下所示:

AlertDialog(简易报错信息)

AlertDialog 能够用于展示简易的报错或者警报消息。它与 ConfirmationDialog 处于同一模块之中。

要实现它,请先导入所需的组件:

import { AlertDialog } from "@web/core/confirmation_dialog/confirmation_dialog";
import { useService } from "@web/core/utils/hooks";

在设置方法中,包括对话框服务:

setup() {super.setup();this.dialog = useService("dialog");
},

添加警报消息的对话框,如下所示:

this.dialog.add(AlertDialog, {body: _t("Error trying to connect to Odoo. Check your internet connection"),
});

简易报错将如下所示:

FormView(表单对话框)

对话框类型,如 FormViewDialog 和 MessageConfirmDialog。针对不同的使用案例量身定制,在确认用户操作、显示表单或显示消息时提供灵活性。

如果我们使用 FormViewDialog 打开项目任务中标签的表单视图,以下是实现它的方法:

导入所需的组件:

import { FormViewDialog } from "@web/views/view_dialogs/form_view_dialog";
import { useService } from "@web/core/utils/hooks";

在您的设置方法中,设置对话服务:

setup() {super.setup();this.dialog = useService("dialog");
},

在 tag click 函数中,添加以下内容:

onTagClick(ev, record) {this.dialog.add(FormViewDialog, {resModel: "project.tags",resId: record.resId,onRecordSaved: async (record) => {//add the action herethis.action.doAction({type: "ir.actions.act_window_close",});},});}

输出结果如下所示:

MessageConfirmDialog 专门为处理消息所设计。让我们来看一个在将 Chatter 消息标记为“To Do”是集成此对话框的示例。为此,我们将修补消息模型并更新 toggleStar 函数以融合 MessageConfirmDialog,如下所示:

import { patch } from "@web/core/utils/patch";
import { Message } from "@mail/core/common/message_model";
import { _t } from "@web/core/l10n/translation";
import { MessageConfirmDialog } from "@mail/core/common/message_confirm_dialog";
patch(Message.prototype, {async toggleStar() {this.store.env.services.dialog.add(MessageConfirmDialog, {message: this,onConfirm: async () => {await super.toggleStar();},prompt: _t("Are you sure you want to mark this message as todo?"),});},
});

当您点击消息上的“Star”图标之际,会呈现出一个弹出窗口。其结果将会如下所呈:

集成这些 JavaScript 对话框能够于 Odoo 18 中赋予更具交互性与响应性的用户体验。不管是用于展示警告、确认操作,还是提醒用户,这些弹出窗口皆能保证清晰且有效地传递重要消息,进而提升整体的可用性与参与度。


http://www.ppmy.cn/ops/144964.html

相关文章

K8s - openeuler2203SP1安装 K8s + flannel

环境说明 [rootmaster-1 ~]# uname -a Linux master-1 5.10.0-136.12.0.86.oe2203sp1.x86_64 #1 SMP Tue Dec 27 17:50:15 CST 2022 x86_64 x86_64 x86_64 GNU/Linux安装过程 1、安装 containerd 下载 tar 包 # 确保没有使用官方仓库的containerd [rootlocalhost ~]# yum rem…

如何处理对象的创建和销毁?

概念 处理对象的创建和销毁是软件开发中的核心问题,尤其是在确保资源管理、性能优化和代码清晰性方面。以下是一些常用的方法和设计模式,用于有效管理对象的创建和销毁。 方法 构造函数和析构函数 在C等语言中,使用构造函数和析构函数是最…

自动屏蔽频繁访问IP,提升服务器安全:实战脚本解析

在当前的数字化时代,服务器安全成为了一个不可忽视的重要环节。无论是企业网站还是个人博客,都面临着来自各方的潜在威胁。其中,恶意访问和频繁登录尝试更是让管理员头疼不已。本文将为大家介绍如何通过脚本自动屏蔽频繁访问和尝试SSH登录的I…

ubuntu,自动休眠后,程序自动暂停。如何破?

昨天挂机想让出图,今天一看,不错,有一张。原来是机器休眠了,暂停了。 在Ubuntu系统中,当计算机进入休眠状态后,所有正在运行的应用程序都会被暂停,包括图形处理程序。为了避免这种情况&#xf…

Docker环境下数据库持久化与多实例扩展实践指南

引言 在Docker容器化技术中,数据库的持久化和多实例管理是两个关键问题。本文将详细介绍如何在Docker中实现数据库的持久化,并有效地管理多个数据库实例。 数据库持久化实现步骤 1. 创建Docker卷 Docker卷是实现数据持久化的关键。以下是创建Docker卷…

Flutter 实现全局悬浮按钮学习

Flutter 代码如何实现了一个全局悬浮按钮,当点击按钮时,会显示一个可以拖动并且通过长按可以移除的悬浮控件。 前置知识点学习 Offset Offset 是 Flutter 中的一个类,用于表示二维平面中的位置或位移。它通常用于描述坐标系中的一个点&…

《C 语言 Socket 网络编程:深入剖析与实战》

目录 一、引言 二、Socket 网络编程基础 (一)Socket 概念 (二)网络协议与 Socket 类型 (三)IP 地址与端口号 三、C 语言 Socket 编程实战步骤 (一)TCP 服务器端编程 &#x…

南海区2021年C++甲组真题第3题——Excel地址

题目描述 Excel单元格的地址表示很有趣,它使用字母来表示列号。 比如: A表示第1列, B表示第2列, Z表示第26列, AA表示第27列, AB表示第28列, BA表示第53列, ... 当然Excel的最大列…