From 46e8c6f6b3b3e228f510529c82c1ca6dbd50a060 Mon Sep 17 00:00:00 2001 From: D31T4 Date: Thu, 2 Mar 2023 23:42:21 +1100 Subject: [PATCH 1/2] added test in `transformer.nodes()` --- src/shapes/Transformer.ts | 32 +++++++++++++++++++++++++++++++- test/unit/Transformer-test.ts | 28 ++++++++++++++++++++++++++++ 2 files changed, 59 insertions(+), 1 deletion(-) diff --git a/src/shapes/Transformer.ts b/src/shapes/Transformer.ts index 42e67062..97951840 100644 --- a/src/shapes/Transformer.ts +++ b/src/shapes/Transformer.ts @@ -288,7 +288,37 @@ export class Transformer extends Group { if (this._nodes && this._nodes.length) { this.detach(); } - this._nodes = nodes; + + const ancestors = this.getAncestors(); + + const filteredNodes = nodes.filter(node => { + // check if ancestor of the transformer + if (ancestors.includes(node)) + return false; + + let pointer = node.parent; + + // check if descendant of any transformer + while (pointer) { + const type = pointer.getType(); + if (type != 'Group' && type != 'Shape') + break; + + if (pointer.className == Transformer.prototype.className) + return false; + + pointer = pointer.parent; + } + + return true; + }); + + if (filteredNodes.length != nodes.length) { + Util.error('nodes should not be descendants of a transformer, or ancestors of this transformer.'); + return; + } + + this._nodes = nodes = filteredNodes; if (nodes.length === 1 && this.useSingleNodeRotation()) { this.rotation(nodes[0].getAbsoluteRotation()); } else { diff --git a/test/unit/Transformer-test.ts b/test/unit/Transformer-test.ts index 8cdfcf57..4fb42cd0 100644 --- a/test/unit/Transformer-test.ts +++ b/test/unit/Transformer-test.ts @@ -4769,4 +4769,32 @@ describe('Transformer', function () { assert.equal(clone.getChildren().length, tr.getChildren().length); assert.equal(clone.nodes().length, 0); }); + + describe('`transformer.nodes( )` should filter invalid nodes if they are descendants of a transformer or parent of the transformer', function () { + it('should filter children of a transformer', function () { + const stage = addStage()!; + + const layer = new Konva.Layer(); + stage.add(layer); + + const tr = new Konva.Transformer(); + layer.add(tr); + + tr.nodes([tr.children![0]]); + assert.equal(tr.nodes().length, 0); + }); + + it('should filter parent of the transformer', function () { + const stage = addStage(); + + const layer = new Konva.Layer(); + stage.add(layer); + + const tr = new Konva.Transformer(); + layer.add(tr); + + tr.nodes([layer]); + assert.equal(tr.nodes().length, 0); + }); + }); }); From bfb6be6e6f89b9bd6eedaea288a89f6979f69b9d Mon Sep 17 00:00:00 2001 From: Anton Lavrenov Date: Thu, 23 Mar 2023 16:54:44 -0500 Subject: [PATCH 2/2] simlify code a bit --- src/shapes/Transformer.ts | 27 +++++---------------------- test/unit/Transformer-test.ts | 33 +++++++++------------------------ 2 files changed, 14 insertions(+), 46 deletions(-) diff --git a/src/shapes/Transformer.ts b/src/shapes/Transformer.ts index 62370823..43ae6119 100644 --- a/src/shapes/Transformer.ts +++ b/src/shapes/Transformer.ts @@ -289,35 +289,18 @@ export class Transformer extends Group { this.detach(); } - const ancestors = this.getAncestors(); - - const filteredNodes = nodes.filter(node => { + const filteredNodes = nodes.filter((node) => { // check if ancestor of the transformer - if (ancestors.includes(node)) + if (node.isAncestorOf(this)) { + Util.error( + 'Konva.Transformer cannot be an a child of the node you are trying to attach' + ); return false; - - let pointer = node.parent; - - // check if descendant of any transformer - while (pointer) { - const type = pointer.getType(); - if (type != 'Group' && type != 'Shape') - break; - - if (pointer.className == Transformer.prototype.className) - return false; - - pointer = pointer.parent; } return true; }); - if (filteredNodes.length != nodes.length) { - Util.error('nodes should not be descendants of a transformer, or ancestors of this transformer.'); - return; - } - this._nodes = nodes = filteredNodes; if (nodes.length === 1 && this.useSingleNodeRotation()) { this.rotation(nodes[0].getAbsoluteRotation()); diff --git a/test/unit/Transformer-test.ts b/test/unit/Transformer-test.ts index 4fb42cd0..b9e4e552 100644 --- a/test/unit/Transformer-test.ts +++ b/test/unit/Transformer-test.ts @@ -36,7 +36,7 @@ function simulateMouseUp(tr: Transformer, pos = { x: 0, y: 0 }) { su(tr.getStage(), pos || { x: 1, y: 1 }); } -describe('Transformer', function () { +describe.only('Transformer', function () { // ====================================================== it('init transformer on simple rectangle', function () { var stage = addStage(); @@ -4770,31 +4770,16 @@ describe('Transformer', function () { assert.equal(clone.nodes().length, 0); }); - describe('`transformer.nodes( )` should filter invalid nodes if they are descendants of a transformer or parent of the transformer', function () { - it('should filter children of a transformer', function () { - const stage = addStage()!; - - const layer = new Konva.Layer(); - stage.add(layer); - - const tr = new Konva.Transformer(); - layer.add(tr); - - tr.nodes([tr.children![0]]); - assert.equal(tr.nodes().length, 0); - }); + it('should filter parent of the transformer', function () { + const stage = addStage(); - it('should filter parent of the transformer', function () { - const stage = addStage(); - - const layer = new Konva.Layer(); - stage.add(layer); + const layer = new Konva.Layer(); + stage.add(layer); - const tr = new Konva.Transformer(); - layer.add(tr); + const tr = new Konva.Transformer(); + layer.add(tr); - tr.nodes([layer]); - assert.equal(tr.nodes().length, 0); - }); + tr.nodes([layer]); + assert.equal(tr.nodes().length, 0); }); });