blob: 2ad5cb9443ff60a1e2054fe6ba0b8e0c9b64a6d7 [file] [log] [blame]
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
import * as d3 from "d3";
import { graphviz } from "d3-graphviz";
const vscode = acquireVsCodeApi();
const scale = 0.8;
function attributer(datum: any, index: any, nodes: any) {
var selection = d3.select(this);
if (datum.tag == "svg") {
datum.attributes = {
...datum.attributes,
width: "100%",
height: "100%",
};
// svg is constructed by hpcc-js/wasm, which uses pt instead of px, so need to convert
const px2pt = 3 / 4;
// get graph dimensions in px. These can be grabbed from the viewBox of the svg
// that hpcc-js/wasm generates
const graphWidth = datum.attributes.viewBox.split(" ")[2] / px2pt;
const graphHeight = datum.attributes.viewBox.split(" ")[3] / px2pt;
// new viewBox width and height
const w = graphWidth / scale;
const h = graphHeight / scale;
// new viewBox origin to keep the graph centered
const x = -(w - graphWidth) / 2;
const y = -(h - graphHeight) / 2;
const viewBox = `${x * px2pt} ${y * px2pt} ${w * px2pt} ${h * px2pt}`;
selection.attr("viewBox", viewBox);
datum.attributes.viewBox = viewBox;
}
}
window.addEventListener("message", (event) => {
const message = event.data;
switch (message.command) {
case "update":
graphviz("#dataflow").attributer(attributer).renderDot(message.details.dot);
break;
}
});