在Odoo 16中动态更改进度条的颜色

Changing the color of a progress bar dynamically in Odoo 16

提问人:chrineuh 提问时间:10/31/2023 更新时间:11/4/2023 访问量:101

问:

我想更改瞬态模型中 one2many 行中的进度条的颜色。 我的想法是从进度条小部件创建一个自定义小部件,然后添加一个获取颜色值的方法,脚本会更改颜色。 颜色值将存储在行中不可见的计算字段中。

所以我的第一次尝试是创建自定义小部件,但这没有用。

odoo.define('your_module_name.custom_progressbar', function (require) {
"use strict";

var field_registry = require('web.field_registry');
var FieldProgressBar = require('web.basic_fields').FieldProgressBar;

var CustomProgressBar = FieldProgressBar.extend({
    template: FieldProgressBar.prototype.template,
    // Your custom methods and properties here
});

field_registry.add('custom_progressbar', CustomProgressBar);

return CustomProgressBar;

});

我不是很擅长 Java 编码,在这种情况下,网络也无济于事。 问题是我在浏览器开发工具中收到一条消息:

web.assets_backend.min.js:2970 Missing widget: CustomProgressBar for field of type integer

在这一点上,我没有尝试用颜色制作零件,直到原始小部件显示在我的视图中。

并且不会显示小部件。

是的,.js 在 manifast 中,也会运行

有人可以帮我吗?

javascript 进度条 odoo-16

评论


答:

1赞 Kenly 11/1/2023 #1

尝试继承进度条字段

例:

/** @odoo-module **/

import { registry } from "@web/core/registry";
import { ProgressBarField } from "@web/views/fields/progress_bar/progress_bar_field";

export class CustomProgressBarField extends ProgressBarField {
    
}

registry.category("fields").add("custom_progressbar", CustomProgressBarField);

您可以按如下方式使用自定义模板:

CustomProgressBarField.template = "web.CustomProgressBarField";

要根据计算字段更改字段颜色,可以使用以下属性:t-attf-class

<?xml version="1.0" encoding="UTF-8"?>
<templates xml:space="preserve">

    <t t-name="web.CustomProgressBarField" t-inherit="web.ProgressBarField" t-inherit-mode="primary" owl="1">
        <xpath expr="//div[hasclass('o_progress')]/div" position="attributes">
            <attribute name="t-attf-class">{{ props.record.data.color_field < 5 ? 'bg-danger' : 'bg-primary' }} h-100</attribute>
        </xpath>
    </t>

</templates>

示例2:

根据通过字段选项传递的颜色字段和字段名称设置进度条背景颜色:

progress_bar_field.js

export class CustomProgressBarField extends ProgressBarField {}

CustomProgressBarField.template = 'chn_event_availability_manager.custom_progressbar_template';

CustomProgressBarField.props = {
    ...ProgressBarField.props,
    colorField: { type: String, optional: true },  // Hinzufügen der colorField-Option
};

CustomProgressBarField.extractProps = ({ attrs }) => {
    const parentProps = ProgressBarField.extractProps({ attrs });  // Extrahieren Sie die Eigenschaften von der übergeordneten Methode
    return {
        ...parentProps,  // Fügen Sie die extrahierten Eigenschaften von der übergeordneten Methode hinzu
        colorField: attrs.options.color_field,  // Extrahieren Sie die neue Eigenschaft 'colorField'
    };
};
registry.category("fields").add("custom_progressbar", CustomProgressBarField);

custom_progressbar_template.xml

<t t-name="chn_event_availability_manager.custom_progressbar_template" t-inherit="web.ProgressBarField" t-inherit-mode="primary" owl="1">
    <xpath expr="//div[hasclass('o_progress')]/div" position="attributes">
        <attribute name="t-att-style">'width: min(' + 100 * state.currentValue / state.maxValue + '%, 100%)' + ';background-color: ' + (props.record.data[props.colorField] or '#007bff') + ' !important'</attribute>
    </xpath>
</t>

更新:

若要使用通过字段选项传递的颜色,请使用而不是在样式表达式中props.colorFieldprops.record.data[props.colorField]

评论

0赞 chrineuh 11/2/2023
谢谢!现在解决了不显示小部件的部分,但是我在进度条中获取颜色时遇到了问题。我将在下一个回复中发布我的代码。
0赞 chrineuh 11/2/2023 #2

所以这是我的最新代码:

/** @odoo-module **/

import { registry } from "@web/core/registry";
import { ProgressBarField } from "@web/views/fields/progress_bar/progress_bar_field";

console.log("Run CustomProgressBarField");

export class CustomProgressBarField extends ProgressBarField {
    template = 'chn_event_availability_manager.custom_progressbar_template';

    constructor() {
           super(...arguments);
           this.color = this.getColorValue(this.props);
           console.log("Run constructor");
           console.log('Color:', this.color);
    }

   renderElement() {
        super.renderElement(...arguments);
        this.el.querySelector('.o_progressbar .o_progress .o_progress_bar').style.backgroundColor = this.color;
        const colorFieldInput = this.el.querySelector('.o_field_widget[name="color_field"]');
        if (colorFieldInput) {
            colorFieldInput.addEventListener('change', this._onColorFieldChange.bind(this));
        }
    }

    _onColorFieldChange(event) {
        this.color = event.target.value;
        this.renderElement();
    }

    getColorValue(p) {
       return p.colorField || '#007bff';  // Standardfarbe ist Blau
    }
}

CustomProgressBarField.props = {
    ...ProgressBarField.props,
    colorField: { type: String, optional: true },  // Hinzufügen der colorField-Option
};

CustomProgressBarField.extractProps = ({ attrs }) => {
    const parentProps = ProgressBarField.extractProps({ attrs });  // Extrahieren Sie die Eigenschaften von der übergeordneten Methode
    return {
        ...parentProps,  // Fügen Sie die extrahierten Eigenschaften von der übergeordneten Methode hinzu
        colorField: attrs.options.color_field,  // Extrahieren Sie die neue Eigenschaft 'colorField'
    };
};

registry.category("fields").add("custom_progressbar", CustomProgressBarField);

现在我试图解决的问题是函数:

RenderElement()没有执行,我不知道为什么,所以颜色没有转移到进度条上。

但是我在constructor()中获得了正确的值。

模板的:

<?xml version="1.0" encoding="UTF-8"?>
<odoo>
    <template id="custom_progressbar_template" inherit_id="web.ProgressBarField" name="Custom Progress Bar">
        <xpath expr="//div[@class='o_progress']" position="attributes">
            <attribute name="t-att-style">`'background-color: ' + (record.color_field ? record.color_field : '#007bff')`</attribute>
        </xpath>
    </template>
</odoo>

和 CSS 来更改颜色:

.custom_progressbar .o_progressbar .o_progress .bg-primary {
    background-color: #007bff !important; /* Default color is blue */
    height: 100% !important;
}

js有什么好的解释吗?在Odoo 16中,这并不容易理解框架。

谢谢

评论

0赞 Kenly 11/2/2023
该组件具有以下功能owlrender
0赞 chrineuh 11/2/2023
所以我必须得到猫头鹰?对不起,我现在正在学习,你有没有例子?
0赞 Kenly 11/2/2023
在上面的代码中,您将定义一个名为 . extends 它有一个功能。 是一个自定义组件框架renderElementProgressBarFieldComponentrenderowl
0赞 chrineuh 11/2/2023
我已经定义了renderElement函数。
0赞 Kenly 11/2/2023
但是你试图覆盖它!确保在父类中定义它