1
1
import $ from "jquery" ;
2
2
import Base from "../../core/base" ;
3
+ import events from "../../core/events" ;
3
4
import Parser from "../../core/parser" ;
4
5
5
6
export const parser = new Parser ( "sortable" ) ;
@@ -28,12 +29,25 @@ export default Base.extend({
28
29
/* Handler which gets called when pat-update is triggered within
29
30
* the .pat-sortable element.
30
31
*/
31
- if ( data ?. pattern == "clone" ) {
32
- this . recordPositions ( ) ;
33
- data . $el . on ( "dragstart" , this . onDragStart . bind ( this ) ) ;
34
- data . $el . on ( "dragend" , this . onDragEnd . bind ( this ) ) ;
32
+ if ( data ?. pattern !== "clone" || data ?. action !== "added" || ! data ?. dom ) {
33
+ // Nothing to do.
34
+ return ;
35
35
}
36
- return true ;
36
+
37
+ this . recordPositions ( ) ;
38
+
39
+ events . add_event_listener (
40
+ data . dom ,
41
+ "dragstart" ,
42
+ "pat-sortable--dragstart" ,
43
+ this . onDragStart . bind ( this )
44
+ ) ;
45
+ events . add_event_listener (
46
+ data . dom ,
47
+ "dragend" ,
48
+ "pat-sortable--dragend" ,
49
+ this . onDragEnd . bind ( this )
50
+ ) ;
37
51
} ,
38
52
39
53
recordPositions : function ( ) {
@@ -49,22 +63,37 @@ export default Base.extend({
49
63
} ,
50
64
51
65
addHandles : function ( ) {
52
- var $sortables_without_handles = this . $sortables . filter ( function ( ) {
53
- return $ ( this ) . find ( ".sortable-handle" ) . length === 0 ;
54
- } ) ;
55
- var $handles = $ ( '<a href="#" class="sortable-handle">⇕</a>' ) . appendTo (
56
- $sortables_without_handles
57
- ) ;
58
- if ( "draggable" in document . createElement ( "span" ) ) {
59
- $handles . attr ( "draggable" , true ) ;
60
- } else {
61
- $handles . on ( "selectstart" , function ( ev ) {
62
- ev . preventDefault ( ) ;
66
+ for ( const sortable of [ ...this . $sortables ] . filter (
67
+ ( it ) => ! it . querySelector ( ".sortable-handle" )
68
+ ) ) {
69
+ // TODO: we should change to a <button>.
70
+ const handle = document . createElement ( "a" ) ;
71
+ handle . textContent = "⇕" ;
72
+ handle . classList . add ( "sortable-handle" ) ;
73
+ handle . setAttribute ( "draggable" , "true" ) ;
74
+ handle . setAttribute ( "href" , "#" ) ;
75
+ handle . setAttribute ( "title" , "Drag to reorder" ) ;
76
+ handle . setAttribute ( "aria-label" , "Drag to reorder" ) ;
77
+ sortable . insertBefore ( handle , sortable . firstChild ) ;
78
+
79
+ // TODO: remove when element is a button.
80
+ events . add_event_listener ( handle , "click" , "pat-sortable--click" , ( e ) => {
81
+ e . preventDefault ( ) ;
63
82
} ) ;
83
+
84
+ events . add_event_listener (
85
+ handle ,
86
+ "dragstart" ,
87
+ "pat-sortable--dragstart" ,
88
+ this . onDragStart . bind ( this )
89
+ ) ;
90
+ events . add_event_listener (
91
+ handle ,
92
+ "dragend" ,
93
+ "pat-sortable--dragend" ,
94
+ this . onDragEnd . bind ( this )
95
+ ) ;
64
96
}
65
- $handles . on ( "dragstart" , this . onDragStart . bind ( this ) ) ;
66
- $handles . on ( "dragend" , this . onDragEnd . bind ( this ) ) ;
67
- return this ;
68
97
} ,
69
98
70
99
initScrolling : function ( ) {
@@ -140,12 +169,12 @@ export default Base.extend({
140
169
} ,
141
170
142
171
onDragStart : function ( ev ) {
143
- var $handle = $ ( ev . target ) ,
144
- $dragged = $handle . parent ( ) ,
145
- that = this ;
146
- if ( typeof ev . originalEvent !== "undefined" ) {
172
+ var $handle = $ ( ev . target ) ;
173
+ var $dragged = $handle . parent ( ) ;
174
+ var that = this ;
175
+ if ( ev . originalEvent ?. dataTransfer ) {
147
176
// Firefox seems to need this set to any value
148
- ev . originalEvent . dataTransfer . setData ( "Text" , "" ) ;
177
+ ev . originalEvent . dataTransfer ? .setData ( "Text" , "" ) ;
149
178
ev . originalEvent . dataTransfer . effectAllowed = [ "move" ] ;
150
179
if ( "setDragImage" in ev . originalEvent . dataTransfer ) {
151
180
ev . originalEvent . dataTransfer . setDragImage ( $dragged [ 0 ] , 0 , 0 ) ;
0 commit comments