diff --git a/static/diagram.js b/static/diagram.js index 753e675..183835e 100644 --- a/static/diagram.js +++ b/static/diagram.js @@ -1,14 +1,17 @@ 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.inputHover = false; this.outputHover = false; + this.meta = {}; this.id = id; this.x = x; this.y = y; this.width = width; this.height = height; this.label = label; + this.meta = meta; } DiagramNode.prototype.pointInNode = function (x, y) { if (x < this.x) { @@ -320,10 +323,11 @@ var Diagrams = /** @class */ (function () { 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 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) { this.connections.push([A, B]); diff --git a/static/diagram.ts b/static/diagram.ts index 0b2aa9e..d4acb8b 100644 --- a/static/diagram.ts +++ b/static/diagram.ts @@ -13,6 +13,8 @@ class DiagramNode { parents: Array; children: Array; + meta: Object = {}; + constructor( id: number, x: number, @@ -20,6 +22,7 @@ class DiagramNode { width: number, height: number, label: string, + meta: Object = {} ){ this.id = id; this.x = x; @@ -27,6 +30,7 @@ class DiagramNode { this.width = width; this.height = height; this.label = label; + this.meta = meta; } 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 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){ diff --git a/static/edit.js b/static/edit.js new file mode 100644 index 0000000..9e66453 --- /dev/null +++ b/static/edit.js @@ -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); diff --git a/static/edit.ts b/static/edit.ts new file mode 100644 index 0000000..fa61169 --- /dev/null +++ b/static/edit.ts @@ -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); \ No newline at end of file diff --git a/templates/diagrams.html b/templates/diagrams.html index bd4f80a..e5ebc8b 100644 --- a/templates/diagrams.html +++ b/templates/diagrams.html @@ -1,5 +1,6 @@ {{define "head"}} + {{ end }} {{define "content"}}
@@ -9,6 +10,62 @@
{{ end }} +{{ define "left" }} +
+ +
+ + +{{ end }} + {{define "scripts"}}