summaryrefslogtreecommitdiffstats
path: root/src/modules/optional/arrange.js
blob: 51e8605b195e96cfe78b80040a8524a6bef7634e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
import { makeInstance } from '../../utils/adopter.js'
import { registerMethods } from '../../utils/methods.js'

// Get all siblings, including myself
export function siblings () {

  return this.parent().children()

}

// Get the curent position siblings
export function position () {

  return this.parent().index( this )

}

// Get the next element (will return null if there is none)
export function next () {

  return this.siblings()[this.position() + 1]

}

// Get the next element (will return null if there is none)
export function prev () {

  return this.siblings()[this.position() - 1]

}

// Send given element one step forward
export function forward () {

  var i = this.position() + 1
  var p = this.parent()

  // move node one step forward
  p.removeElement( this ).add( this, i )

  // make sure defs node is always at the top
  if ( typeof p.isRoot === 'function' && p.isRoot() ) {

    p.node.appendChild( p.defs().node )

  }

  return this

}

// Send given element one step backward
export function backward () {

  var i = this.position()

  if ( i > 0 ) {

    this.parent().removeElement( this ).add( this, i - 1 )

  }

  return this

}

// Send given element all the way to the front
export function front () {

  var p = this.parent()

  // Move node forward
  p.node.appendChild( this.node )

  // Make sure defs node is always at the top
  if ( typeof p.isRoot === 'function' && p.isRoot() ) {

    p.node.appendChild( p.defs().node )

  }

  return this

}

// Send given element all the way to the back
export function back () {

  if ( this.position() > 0 ) {

    this.parent().removeElement( this ).add( this, 0 )

  }

  return this

}

// Inserts a given element before the targeted element
export function before ( element ) {

  element = makeInstance( element )
  element.remove()

  var i = this.position()

  this.parent().add( element, i )

  return this

}

// Inserts a given element after the targeted element
export function after ( element ) {

  element = makeInstance( element )
  element.remove()

  var i = this.position()

  this.parent().add( element, i + 1 )

  return this

}

export function insertBefore ( element ) {

  element = makeInstance( element )
  element.before( this )

}

export function insertAfter ( element ) {

  element = makeInstance( element )
  element.after( this )

}

registerMethods( 'Dom', {
  siblings, position, next, prev, forward, backward, front, back, before, after
} )