Tower: upload queue_job 16.0.2.12.0 (via marketplace)
This commit is contained in:
@@ -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);
|
||||||
Reference in New Issue
Block a user