11import $ from "jquery" ;
22import Base from "../../core/base" ;
3+ import events from "../../core/events" ;
34import Parser from "../../core/parser" ;
45
56export const parser = new Parser ( "sortable" ) ;
@@ -28,12 +29,25 @@ export default Base.extend({
2829 /* Handler which gets called when pat-update is triggered within
2930 * the .pat-sortable element.
3031 */
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 ;
3535 }
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+ ) ;
3751 } ,
3852
3953 recordPositions : function ( ) {
@@ -49,22 +63,37 @@ export default Base.extend({
4963 } ,
5064
5165 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 ( ) ;
6382 } ) ;
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+ ) ;
6496 }
65- $handles . on ( "dragstart" , this . onDragStart . bind ( this ) ) ;
66- $handles . on ( "dragend" , this . onDragEnd . bind ( this ) ) ;
67- return this ;
6897 } ,
6998
7099 initScrolling : function ( ) {
@@ -140,12 +169,12 @@ export default Base.extend({
140169 } ,
141170
142171 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 ) {
147176 // Firefox seems to need this set to any value
148- ev . originalEvent . dataTransfer . setData ( "Text" , "" ) ;
177+ ev . originalEvent . dataTransfer ? .setData ( "Text" , "" ) ;
149178 ev . originalEvent . dataTransfer . effectAllowed = [ "move" ] ;
150179 if ( "setDragImage" in ev . originalEvent . dataTransfer ) {
151180 ev . originalEvent . dataTransfer . setDragImage ( $dragged [ 0 ] , 0 , 0 ) ;
0 commit comments