在 Odoo 18 中创建进度条
一、创建进度条模板
首先在名为 progress_bar_widget.xml 的文件中定义一个名为 ProgressBarWidget 的新模板。该模板使用两个 CSS 类:progress-bar-inner 用于样式化进度条,progress_number 用于显示进度百分比。您可以根据需要自定义外观和样式。
<?xml version="1.0" encoding="utf-8"?>
<templates id="template" xml:space="preserve">
<t t-name="ProgressBarWidget" owl="1">
<div t-ref="ProgressBarWidget-root">
<div class="progress_bar">
<div class="pro-bar">
<span class="progress-bar-inner"/>
<span class="progress_number"/>
</div>
</div>
</div>
</t>
</templates>
二、为进度条添加样式
使用 CSS 定义进度条的样式:
- .progress-bar-inner 类控制进度条的宽度和背景颜色
- .progress_number 定位百分比文本
.progress_bar .pro-bar {
background: hsl(0, 0%, 97%);
box-shadow: 0 1px 2px hsla(0, 0%, 0%, 0.1) inset;
height: 4px;
width: 200px;
margin-bottom: 15px;
margin-top: 10px;
position: relative;
}
.progress_bar .progress_number {
float: right;
margin-top: -6px;
margin-right: -50px;
}
.progress_bar .progress-bar-inner {
background-color: green;
display: block;
width: 0;
height: 100%;
position: absolute;
top: 0;
left: 0;
transition: width 1s linear 0s;
}
.progress_bar .progress-bar-inner:before {
content: "";
background-color: hsl(0, 0%, 100%);
border-radius: 50%;
width: 4px;
height: 4px;
position: absolute;
right: 1px;
top: 0;
z-index: 1;
}
.progress_bar .progress-bar-inner:after {
content: "";
width: 14px;
height: 14px;
background-color: inherit;
border-radius: 50%;
position: absolute;
right: -4px;
top: -5px;
}
三、更新进度条的 JavaScript 逻辑
使用 JavaScript 创建进度条的逻辑。组件将通过 setup 方法初始化,并通过 onUpdateProgressBar 函数更新进度条。该函数根据提供的值(浮点数或整数)计算进度条的宽度。
/** @odoo-module **/
import { registry } from "@web/core/registry";
Import { standardFieldProps } from "@web/views/fields/standard_field_props";
import { Component, useRef, onMounted, onPatched } from "@odoo/owl";
export class ProgressBarWidget extends Component {
setup() {
this.root = useRef('ProgressBarWidget-root');
onMounted(this.onUpdateProgressBar);
onPatched(this.onUpdateProgressBar);
}
onUpdateProgressBar() {
if (this.props.record.data[this.props.name] <= 100) {
this.widthComplete = parseInt(this.props.record.data[this.props.name] / 100 * 100);
} else {
this.widthComplete = 100;
}
this.root.el.querySelector('.progress-bar-inner').style.width = this.widthComplete + '%';
this.root.el.querySelector('.progress_number').textContent = this.widthComplete + '%';
}
}
ProgressBarWidget.template = 'ProgressBarWidget';
ProgressBarWidget.props = standardFieldProps;
ProgressBarWidget.supportedTypes = ["float", "integer"];
registry.category("fields").add("progress_bar_widget", {
component: ProgressBarWidget,
});
通过将组件添加到 "fields" 类别中,将其注册到 Odoo 注册表。该部件支持浮点数(float)和整数字段(integer)类型。
四、在表单视图中使用部件
进度条组件创建完成后,通过在 XML 表单视图中指定字段的 widget 属性来应用该组件。
<field name="progress" widget="progress_bar_widget"/>
以项目模型的 milestone_progress 字段为例,继承表单视图并替换原有字段:
<odoo>
<record id="view_project_form_inherit" model="ir.ui.view">
<field name="name">project.project.form.inherit</field>
<field name="model">project.project</field>
<field name="inherit_id" ref="project.view_project" />
<field name="arch" type="xml">
<xpath expr="//field[@name='milestone_progress']" position="replace">
<field name="milestone_progress" widget="progress_bar_widget"/>
</xpath>
</field>
</record>
</odoo>
最终将显示动态进度条,直观展示项目里程碑的完成情况。
注意:项目的 "Milestones Reached" 字段的显示需要先打开项目配置中的里程碑功能。
结语
通过 Odoo 18 的进度条组件,您可以在多个模块中以可视化方式展示任务完成度。该方案提供了一种直观的图形化方式,用户可通过工时记录或其他相关指标自动跟踪任务进度。这不仅提升了用户体验,还使项目绩效监控变得简单且直观。