can add filter node to diagram

This commit is contained in:
BroodjeAap 2022-09-18 12:34:20 +00:00
parent bbe3500928
commit 6c32004b37
5 changed files with 265 additions and 5 deletions

View file

@ -1,14 +1,17 @@
var DiagramNode = /** @class */ (function () { var DiagramNode = /** @class */ (function () {
function DiagramNode(id, x, y, width, height, label) { function DiagramNode(id, x, y, width, height, label, meta) {
if (meta === void 0) { meta = {}; }
this.hover = false; this.hover = false;
this.inputHover = false; this.inputHover = false;
this.outputHover = false; this.outputHover = false;
this.meta = {};
this.id = id; this.id = id;
this.x = x; this.x = x;
this.y = y; this.y = y;
this.width = width; this.width = width;
this.height = height; this.height = height;
this.label = label; this.label = label;
this.meta = meta;
} }
DiagramNode.prototype.pointInNode = function (x, y) { DiagramNode.prototype.pointInNode = function (x, y) {
if (x < this.x) { if (x < this.x) {
@ -320,10 +323,11 @@ var Diagrams = /** @class */ (function () {
this.ctx.fill(); this.ctx.fill();
} }
}; };
Diagrams.prototype.addNode = function (id, x, y, label) { Diagrams.prototype.addNode = function (id, x, y, label, meta) {
if (meta === void 0) { meta = {}; }
var textSize = this.ctx.measureText(label); var textSize = this.ctx.measureText(label);
var textHeight = 2 * (textSize.actualBoundingBoxAscent + textSize.actualBoundingBoxDescent); var textHeight = 2 * (textSize.actualBoundingBoxAscent + textSize.actualBoundingBoxDescent);
this.nodes.push(new DiagramNode(id, x, y, textSize.width + textHeight, textHeight, label)); this.nodes.push(new DiagramNode(id, x, y, textSize.width + textHeight, textHeight, label, meta));
}; };
Diagrams.prototype.addConnection = function (A, B) { Diagrams.prototype.addConnection = function (A, B) {
this.connections.push([A, B]); this.connections.push([A, B]);

View file

@ -13,6 +13,8 @@ class DiagramNode {
parents: Array<DiagramNode>; parents: Array<DiagramNode>;
children: Array<DiagramNode>; children: Array<DiagramNode>;
meta: Object = {};
constructor( constructor(
id: number, id: number,
x: number, x: number,
@ -20,6 +22,7 @@ class DiagramNode {
width: number, width: number,
height: number, height: number,
label: string, label: string,
meta: Object = {}
){ ){
this.id = id; this.id = id;
this.x = x; this.x = x;
@ -27,6 +30,7 @@ class DiagramNode {
this.width = width; this.width = width;
this.height = height; this.height = height;
this.label = label; this.label = label;
this.meta = meta;
} }
pointInNode(x: number, y: number){ pointInNode(x: number, y: number){
@ -384,10 +388,10 @@ class Diagrams {
} }
} }
addNode(id: number, x: number, y: number, label: string){ addNode(id: number, x: number, y: number, label: string, meta: Object = {}){
let textSize = this.ctx.measureText(label); let textSize = this.ctx.measureText(label);
let textHeight = 2 * (textSize.actualBoundingBoxAscent + textSize.actualBoundingBoxDescent); let textHeight = 2 * (textSize.actualBoundingBoxAscent + textSize.actualBoundingBoxDescent);
this.nodes.push(new DiagramNode(id, x, y, textSize.width + textHeight, textHeight, label)); this.nodes.push(new DiagramNode(id, x, y, textSize.width + textHeight, textHeight, label, meta));
} }
addConnection(A: DiagramNode, B: DiagramNode){ addConnection(A: DiagramNode, B: DiagramNode){

90
static/edit.js Normal file
View file

@ -0,0 +1,90 @@
function onTypeChange() {
var select = document.getElementById("typeInput");
var type = select.value;
var var1Input = document.getElementById("var1Input");
var var1Label = document.getElementById("var1Label");
var var2Input = document.getElementById("var2Input");
var var2Label = document.getElementById("var2Label");
var var3Input = document.getElementById("var3Input");
var var3Label = document.getElementById("var3Label");
switch (type) {
case "xpath": {
var1Label.innerHTML = "XPath";
var1Input.placeholder = "//a[@class='price";
var2Input.disabled = true;
var2Input.placeholder = "";
var2Label.innerHTML = "-";
var3Input.disabled = true;
var3Input.placeholder = "";
var3Label.innerHTML = "-";
break;
}
case "json": {
var1Label.innerHTML = "JSON";
var1Input.placeholder = "products.#.price";
var2Input.disabled = true;
var2Label.innerHTML = "-";
var3Input.disabled = true;
var3Label.innerHTML = "-";
break;
}
case "css": {
var1Label.innerHTML = "Selector";
var1Input.placeholder = ".price";
var2Input.disabled = true;
var2Label.innerHTML = "-";
var3Input.disabled = true;
var3Label.innerHTML = "-";
break;
}
case "replace": {
var1Label.innerHTML = "Regex";
var1Input.placeholder = "So[mM]e(thing|where)";
var2Input.disabled = false;
var2Label.innerHTML = "With";
var3Input.disabled = true;
var3Label.innerHTML = "-";
break;
}
case "match": {
var1Label.innerHTML = "Regex";
var1Input.placeholder = "So[mM]e(thing|where)";
var2Input.disabled = true;
var2Label.innerHTML = "-";
var3Input.disabled = true;
var3Label.innerHTML = "-";
break;
}
case "substring": {
var1Label.innerHTML = "Substring";
var1Input.placeholder = ":20,25-40,45,47,49,-20:";
var2Input.disabled = true;
var2Label.innerHTML = "-";
var3Input.disabled = true;
var3Label.innerHTML = "-";
break;
}
}
}
function onSubmitNewFilter() {
var nameInput = document.getElementById("nameInput");
var name = nameInput.value;
var selectType = document.getElementById("typeInput");
var type = selectType.value;
var var1Input = document.getElementById("var1Input");
var var2Input = document.getElementById("var2Input");
var var3Input = document.getElementById("var3Input");
_diagram.addNode(Math.max.apply(Math, _diagram.nodes.map(function (n) { return n.id; })) + 1, _diagram.canvas.width / 2, _diagram.canvas.height / 2, name, {
type: type,
var1: var1Input.value,
var2: var2Input.value,
var3: var3Input.value
});
}
function newFilterInit() {
var select = document.getElementById("typeInput");
select.onchange = onTypeChange;
var button = document.getElementById("newFilterButton");
button.onclick = onSubmitNewFilter;
}
document.addEventListener('DOMContentLoaded', newFilterInit, false);

105
static/edit.ts Normal file
View file

@ -0,0 +1,105 @@
function onTypeChange(){
let select = document.getElementById("typeInput") as HTMLSelectElement;
let type = select.value;
let var1Input = document.getElementById("var1Input") as HTMLInputElement;
let var1Label = document.getElementById("var1Label") as HTMLLabelElement;
let var2Input = document.getElementById("var2Input") as HTMLInputElement;
let var2Label = document.getElementById("var2Label") as HTMLLabelElement;
let var3Input = document.getElementById("var3Input") as HTMLInputElement;
let var3Label = document.getElementById("var3Label") as HTMLLabelElement;
switch(type){
case "xpath": {
var1Label.innerHTML = "XPath";
var1Input.placeholder = "//a[@class='price";
var2Input.disabled = true;
var2Input.placeholder = ""
var2Label.innerHTML = "-";
var3Input.disabled = true;
var3Input.placeholder = ""
var3Label.innerHTML = "-";
break;
}
case "json": {
var1Label.innerHTML = "JSON";
var1Input.placeholder = "products.#.price";
var2Input.disabled = true;
var2Label.innerHTML = "-";
var3Input.disabled = true;
var3Label.innerHTML = "-";
break;
}
case "css": {
var1Label.innerHTML = "Selector";
var1Input.placeholder = ".price";
var2Input.disabled = true;
var2Label.innerHTML = "-";
var3Input.disabled = true;
var3Label.innerHTML = "-";
break;
}
case "replace": {
var1Label.innerHTML = "Regex";
var1Input.placeholder = "So[mM]e(thing|where)";
var2Input.disabled = false;
var2Label.innerHTML = "With";
var3Input.disabled = true;
var3Label.innerHTML = "-";
break;
}
case "match": {
var1Label.innerHTML = "Regex";
var1Input.placeholder = "So[mM]e(thing|where)";
var2Input.disabled = true;
var2Label.innerHTML = "-";
var3Input.disabled = true;
var3Label.innerHTML = "-";
break;
}
case "substring": {
var1Label.innerHTML = "Substring";
var1Input.placeholder = ":20,25-40,45,47,49,-20:";
var2Input.disabled = true;
var2Label.innerHTML = "-";
var3Input.disabled = true;
var3Label.innerHTML = "-";
break;
}
}
}
function onSubmitNewFilter(){
let nameInput = document.getElementById("nameInput") as HTMLInputElement;
let name = nameInput.value;
let selectType = document.getElementById("typeInput") as HTMLSelectElement;
let type = selectType.value;
let var1Input = document.getElementById("var1Input") as HTMLInputElement;
let var2Input = document.getElementById("var2Input") as HTMLInputElement;
let var3Input = document.getElementById("var3Input") as HTMLInputElement;
_diagram.addNode(
Math.max(..._diagram.nodes.map(n => n.id)) + 1,
_diagram.canvas.width / 2,
_diagram.canvas.height / 2,
name, {
type: type,
var1: var1Input.value,
var2: var2Input.value,
var3: var3Input.value,
})
}
function newFilterInit(){
let select = document.getElementById("typeInput") as HTMLSelectElement;
select.onchange = onTypeChange;
let button = document.getElementById("newFilterButton") as HTMLButtonElement;
button.onclick = onSubmitNewFilter
}
document.addEventListener('DOMContentLoaded', newFilterInit, false);

View file

@ -1,5 +1,6 @@
{{define "head"}} {{define "head"}}
<script src="/static/diagram.js"></script> <script src="/static/diagram.js"></script>
<script src="/static/edit.js"></script>
{{ end }} {{ end }}
{{define "content"}} {{define "content"}}
<div class="canvas_parent"> <div class="canvas_parent">
@ -9,6 +10,62 @@
</div> </div>
{{ end }} {{ end }}
{{ define "left" }}
<div>
<button type="button" class="btn btn-primary btn-block btn-sm" data-bs-toggle="modal" data-bs-target="#newFilterModal">
Add Filter
</button>
</div>
<div class="modal fade" id="newFilterModal" tabindex="-1" aria-labelledby="newFilterModalLabel" aria-hidden="true">
<div class="modal-dialog modal-lg">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="newFilterModalLabel">Add Filter</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<div>
<form action="/filter/create" method="post">
<div class="mb-3 m-3 row">
<label for="nameInput" class="col-sm-2 col-form-label">Name:</label>
<div class="col-sm-10 p-2">
<input type="text" class="form-control" name="filter_name" id="nameInput" placeholder="Name">
</div>
<label for="typeInput" class="col-sm-2 col-form-label">Type:</label>
<div class="col-sm-10 p-2">
<select id="typeInput" class="form-control" name="type">
<option value="xpath" selected="true">XPath</option>
<option value="json">JSON</option>
<option value="css">CSS</option>
<option value="replace">Replace</option>
<option value="match">Match</option>
<option value="substring">Substring</option>
</select>
</div>
<label for="var1" id="var1Label" class="col-sm-2 col-form-label">XPath:</label>
<div class="col-sm-10 p-2">
<input type="text" class="form-control" name="var1" id="var1Input" placeholder="//a[@class='price']">
</div>
<label for="var2" id="var2Label" class="col-sm-2 col-form-label">-</label>
<div class="col-sm-10 p-2">
<input type="text" class="form-control" name="var2" id="var2Input" placeholder="" disabled>
</div>
<label for="var3" id="var3Label" class="col-sm-2 col-form-label">-</label>
<div class="col-sm-10 p-2">
<input type="text" class="form-control" name="var3" id="var3Input" placeholder="" disabled>
</div>
</div>
</form>
<button class="btn btn-primary mt-4" data-bs-dismiss="modal" id="newFilterButton">Add Filter</button>
</div>
</div>
</div>
</div>
</div>
{{ end }}
{{define "scripts"}} {{define "scripts"}}
<script> <script>
var diagrams; var diagrams;