1
1
import Sortable from "sortablejs" ;
2
- import { console , camelize } from "./util/helper" ;
2
+ import { insertNodeAt , camelize , console , removeNode } from "./util/helper" ;
3
3
4
4
function buildAttribute ( object , propName , value ) {
5
5
if ( value == undefined ) {
@@ -10,20 +10,6 @@ function buildAttribute(object, propName, value) {
10
10
return object ;
11
11
}
12
12
13
- function removeNode ( node ) {
14
- if ( node . parentElement !== null ) {
15
- node . parentElement . removeChild ( node ) ;
16
- }
17
- }
18
-
19
- function insertNodeAt ( fatherNode , node , position ) {
20
- const refNode =
21
- position === 0
22
- ? fatherNode . children [ 0 ]
23
- : fatherNode . children [ position - 1 ] . nextSibling ;
24
- fatherNode . insertBefore ( node , refNode ) ;
25
- }
26
-
27
13
function computeVmIndex ( vnodes , element ) {
28
14
return vnodes . map ( elt => elt . elm ) . indexOf ( element ) ;
29
15
}
@@ -54,6 +40,54 @@ function delegateAndEmit(evtName) {
54
40
} ;
55
41
}
56
42
43
+ function isTransition ( slots ) {
44
+ if ( ! slots || slots . length !== 1 ) {
45
+ return false ;
46
+ }
47
+ const [ { componentOptions } ] = slots ;
48
+ if ( ! componentOptions ) {
49
+ return false ;
50
+ }
51
+ return [ "transition-group" , "TransitionGroup" ] . includes ( componentOptions . tag ) ;
52
+ }
53
+
54
+ function computeChildrenAndOffsets ( children , { header, footer } ) {
55
+ let headerOffset = 0 ;
56
+ let footerOffset = 0 ;
57
+ if ( header ) {
58
+ headerOffset = header . length ;
59
+ children = children ? [ ...header , ...children ] : [ ...header ] ;
60
+ }
61
+ if ( footer ) {
62
+ footerOffset = footer . length ;
63
+ children = children ? [ ...children , ...footer ] : [ ...footer ] ;
64
+ }
65
+ return { children, headerOffset, footerOffset } ;
66
+ }
67
+
68
+ function getComponentAttributes ( $attrs , componentData ) {
69
+ let attributes = null ;
70
+ const update = ( name , value ) => {
71
+ attributes = buildAttribute ( attributes , name , value ) ;
72
+ } ;
73
+ const attrs = Object . keys ( $attrs )
74
+ . filter ( key => key === "id" || key . startsWith ( "data-" ) )
75
+ . reduce ( ( res , key ) => {
76
+ res [ key ] = $attrs [ key ] ;
77
+ return res ;
78
+ } , { } ) ;
79
+ update ( "attrs" , attrs ) ;
80
+
81
+ if ( ! componentData ) {
82
+ return attributes ;
83
+ }
84
+ const { on, props, attrs : componentDataAttrs } = componentData ;
85
+ update ( "on" , on ) ;
86
+ update ( "props" , props ) ;
87
+ Object . assign ( attributes . attrs , componentDataAttrs ) ;
88
+ return attributes ;
89
+ }
90
+
57
91
const eventsListened = [ "Start" , "Add" , "Remove" , "Update" , "End" ] ;
58
92
const eventsToEmit = [ "Choose" , "Sort" , "Filter" , "Clone" ] ;
59
93
const readonlyProperties = [ "Move" , ...eventsListened , ...eventsToEmit ] . map (
@@ -119,49 +153,11 @@ const draggableComponent = {
119
153
120
154
render ( h ) {
121
155
const slots = this . $slots . default ;
122
- if ( slots && slots . length === 1 ) {
123
- const child = slots [ 0 ] ;
124
- if (
125
- child . componentOptions &&
126
- [ "transition-group" , "TransitionGroup" ] . includes (
127
- child . componentOptions . tag
128
- )
129
- ) {
130
- this . transitionMode = true ;
131
- }
132
- }
133
- let headerOffset = 0 ;
134
- let footerOffset = 0 ;
135
- let children = slots ;
136
- const { header, footer } = this . $slots ;
137
- if ( header ) {
138
- headerOffset = header . length ;
139
- children = children ? [ ...header , ...children ] : [ ...header ] ;
140
- }
141
- if ( footer ) {
142
- footerOffset = footer . length ;
143
- children = children ? [ ...children , ...footer ] : [ ...footer ] ;
144
- }
156
+ this . transitionMode = isTransition ( slots ) ;
157
+ const { children, headerOffset, footerOffset } = computeChildrenAndOffsets ( slots , this . $slots ) ;
145
158
this . headerOffset = headerOffset ;
146
159
this . footerOffset = footerOffset ;
147
- var attributes = null ;
148
- const update = ( name , value ) => {
149
- attributes = buildAttribute ( attributes , name , value ) ;
150
- } ;
151
- const attrs = Object . keys ( this . $attrs )
152
- . filter ( key => key === "id" || key . startsWith ( "data-" ) )
153
- . reduce ( ( res , key ) => {
154
- res [ key ] = this . $attrs [ key ] ;
155
- return res ;
156
- } , { } ) ;
157
- update ( "attrs" , attrs ) ;
158
-
159
- if ( this . componentData ) {
160
- const { on, props, attrs } = this . componentData ;
161
- update ( "on" , on ) ;
162
- update ( "props" , props ) ;
163
- Object . assign ( attributes . attrs , attrs ) ;
164
- }
160
+ const attributes = getComponentAttributes ( this . $attrs , this . componentData ) ;
165
161
return h ( this . getTag ( ) , attributes , children ) ;
166
162
} ,
167
163
0 commit comments