Browse Source

Merge pull request #1236 from gormster/fix-1235

Fix #1235
tags/3.1.2
Ulrich-Matthias Schäfer 2 years ago
parent
commit
480e5d77e2
No account linked to committer's email address
2 changed files with 40 additions and 2 deletions
  1. 28
    0
      spec/spec/elements/Element.js
  2. 12
    2
      src/elements/Element.js

+ 28
- 0
spec/spec/elements/Element.js View File

@@ -165,6 +165,7 @@ describe('Element.js', function () {
describe('parents()', () => {
it('returns array of parents until the passed element or root svg', () => {
const canvas = SVG().addTo(container)
const groupA = canvas.group().addClass('test')
const group1 = canvas.group().addClass('test')
const group2 = group1.group()
const group3 = group2.group()
@@ -175,6 +176,33 @@ describe('Element.js', function () {
expect(rect.parents(group1).length).toBe(3)
expect(rect.parents()).toEqual([ group3, group2, group1, canvas ])
})

it('returns array of parents until the closest matching parent', () => {
const canvas = SVG().addTo(container)
const groupA = canvas.group().addClass('test')
const group1 = canvas.group().addClass('test')
const group2 = group1.group().addClass('test').addClass('foo')
const group3 = group2.group().addClass('foo')
const rect = group3.rect(100, 100)

expect(rect.parents('.test')).toEqual([ group3, group2 ])
expect(rect.parents('.foo')).toEqual([ group3 ])
expect(rect.parents('.test:not(.foo)')).toEqual([ group3, group2, group1 ])
})

it('returns null if the passed element is not an ancestor', () => {
const canvas = SVG().addTo(container)
const groupA = canvas.group().addClass('test')
const group1 = canvas.group()
const group2 = group1.group()
const group3 = group2.group()
const rect = group3.rect(100, 100)


expect(rect.parents('.does-not-exist')).toEqual(null)
expect(rect.parents('.test')).toEqual(null)
expect(rect.parents(groupA)).toEqual(null)
})
})

describe('reference()', () => {

+ 12
- 2
src/elements/Element.js View File

@@ -87,7 +87,10 @@ export default class Element extends Dom {

// return array of all ancestors of given type up to the root svg
parents (until = this.root()) {
until = makeInstance(until)
const isSelector = typeof until === 'string'
if (!isSelector) {
until = makeInstance(until)
}
const parents = new List()
let parent = this

@@ -98,9 +101,16 @@ export default class Element extends Dom {

parents.push(parent)

if (parent.node === until.node) {
if (!isSelector && (parent.node === until.node)) {
break
}
if (isSelector && parent.matches(until)) {
break
}
if (parent.node === this.root().node) {
// We worked our way to the root and didn't match `until`
return null
}
}

return parents

Loading…
Cancel
Save