Tower: upload queue_job 16.0.2.12.0 (via marketplace)

This commit is contained in:
2026-04-27 08:46:53 +00:00
parent bfc350252a
commit a6209db573

View File

@@ -0,0 +1,143 @@
/* @odoo-module */
/* global vis */
import {loadCSS, loadJS} from "@web/core/assets";
import {registry} from "@web/core/registry";
import {standardFieldProps} from "@web/views/fields/standard_field_props";
import {useService} from "@web/core/utils/hooks";
const {Component, onWillStart, useEffect, useRef} = owl;
export class JobDirectGraph extends Component {
setup() {
this.orm = useService("orm");
this.action = useService("action");
this.rootRef = useRef("root_vis");
this.network = null;
onWillStart(async () => {
await loadJS("/queue_job/static/lib/vis/vis-network.min.js");
loadCSS("/queue_job/static/lib/vis/vis-network.min.css");
});
useEffect(() => {
this.renderNetwork();
this._fitNetwork();
return () => {
if (this.network) {
this.$el.empty();
}
return this.rootRef.el;
};
});
}
get $el() {
return $(this.rootRef.el);
}
get resId() {
return this.props.record.data.id;
}
get context() {
return this.props.record.getFieldContext(this.props.name);
}
get model() {
return this.props.record.resModel;
}
htmlTitle(html) {
const container = document.createElement("div");
container.innerHTML = html;
return container;
}
renderNetwork() {
if (this.network) {
this.$el.empty();
}
let nodes = this.props.value.nodes || [];
if (!nodes.length) {
return;
}
nodes = nodes.map((node) => {
node.title = this.htmlTitle(node.title || "");
return node;
});
const edges = [];
_.each(this.props.value.edges || [], function (edge) {
const edgeFrom = edge[0];
const edgeTo = edge[1];
edges.push({
from: edgeFrom,
to: edgeTo,
arrows: "to",
});
});
const data = {
nodes: new vis.DataSet(nodes),
edges: new vis.DataSet(edges),
};
const options = {
// Fix the seed to have always the same result for the same graph
layout: {randomSeed: 1},
};
// Arbitrary threshold, generation becomes very slow at some
// point, and disabling the stabilization helps to have a fast result.
// Actually, it stabilizes, but is displayed while stabilizing, rather
// than showing a blank canvas.
if (nodes.length > 100) {
options.physics = {stabilization: false};
}
const network = new vis.Network(this.$el[0], data, options);
network.selectNodes([this.resId]);
var self = this;
network.on("dragging", function () {
// By default, dragging changes the selected node
// to the dragged one, we want to keep the current
// job selected
network.selectNodes([self.resId]);
});
network.on("click", function (params) {
if (params.nodes.length > 0) {
var resId = params.nodes[0];
if (resId !== self.resId) {
self.openDependencyJob(resId);
}
} else {
// Clicked outside of the nodes, we want to
// keep the current job selected
network.selectNodes([self.resId]);
}
});
this.network = network;
}
async openDependencyJob(resId) {
const action = await this.orm.call(
this.model,
"get_formview_action",
[[resId]],
{
context: this.context,
}
);
await this.action.doAction(action);
}
_fitNetwork() {
if (this.network) {
this.network.fit(this.network.body.nodeIndices);
}
}
}
JobDirectGraph.props = {
...standardFieldProps,
};
JobDirectGraph.template = "queue.JobDirectGraph";
registry.category("fields").add("job_directed_graph", JobDirectGraph);