author | ymh <ymh.work@gmail.com> |
Fri, 05 Sep 2025 18:52:52 +0200 | |
changeset 22 | 8c2e4d02f4ef |
parent 21 | 48c4eec2b7e6 |
permissions | -rw-r--r-- |
18 | 1 |
/*! |
21
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
2 |
* jQuery UI Selectable 1.13.3 |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
3 |
* https://jqueryui.com |
18 | 4 |
* |
21
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
5 |
* Copyright OpenJS Foundation and other contributors |
18 | 6 |
* Released under the MIT license. |
21
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
7 |
* https://jquery.org/license |
18 | 8 |
*/ |
9 |
||
10 |
//>>label: Selectable |
|
11 |
//>>group: Interactions |
|
12 |
//>>description: Allows groups of elements to be selected with the mouse. |
|
21
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
13 |
//>>docs: https://api.jqueryui.com/selectable/ |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
14 |
//>>demos: https://jqueryui.com/selectable/ |
18 | 15 |
//>>css.structure: ../../themes/base/selectable.css |
16 |
||
17 |
( function( factory ) { |
|
19 | 18 |
"use strict"; |
19 |
||
18 | 20 |
if ( typeof define === "function" && define.amd ) { |
21 |
||
22 |
// AMD. Register as an anonymous module. |
|
23 |
define( [ |
|
24 |
"jquery", |
|
25 |
"./mouse", |
|
21
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
26 |
"../version", |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
27 |
"../widget" |
18 | 28 |
], factory ); |
29 |
} else { |
|
30 |
||
31 |
// Browser globals |
|
32 |
factory( jQuery ); |
|
33 |
} |
|
19 | 34 |
} )( function( $ ) { |
35 |
"use strict"; |
|
18 | 36 |
|
37 |
return $.widget( "ui.selectable", $.ui.mouse, { |
|
21
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
38 |
version: "1.13.3", |
18 | 39 |
options: { |
40 |
appendTo: "body", |
|
41 |
autoRefresh: true, |
|
42 |
distance: 0, |
|
43 |
filter: "*", |
|
44 |
tolerance: "touch", |
|
45 |
||
46 |
// Callbacks |
|
47 |
selected: null, |
|
48 |
selecting: null, |
|
49 |
start: null, |
|
50 |
stop: null, |
|
51 |
unselected: null, |
|
52 |
unselecting: null |
|
53 |
}, |
|
54 |
_create: function() { |
|
55 |
var that = this; |
|
56 |
||
57 |
this._addClass( "ui-selectable" ); |
|
58 |
||
59 |
this.dragged = false; |
|
60 |
||
61 |
// Cache selectee children based on filter |
|
62 |
this.refresh = function() { |
|
63 |
that.elementPos = $( that.element[ 0 ] ).offset(); |
|
64 |
that.selectees = $( that.options.filter, that.element[ 0 ] ); |
|
65 |
that._addClass( that.selectees, "ui-selectee" ); |
|
66 |
that.selectees.each( function() { |
|
67 |
var $this = $( this ), |
|
68 |
selecteeOffset = $this.offset(), |
|
69 |
pos = { |
|
70 |
left: selecteeOffset.left - that.elementPos.left, |
|
71 |
top: selecteeOffset.top - that.elementPos.top |
|
72 |
}; |
|
73 |
$.data( this, "selectable-item", { |
|
74 |
element: this, |
|
75 |
$element: $this, |
|
76 |
left: pos.left, |
|
77 |
top: pos.top, |
|
78 |
right: pos.left + $this.outerWidth(), |
|
79 |
bottom: pos.top + $this.outerHeight(), |
|
80 |
startselected: false, |
|
81 |
selected: $this.hasClass( "ui-selected" ), |
|
82 |
selecting: $this.hasClass( "ui-selecting" ), |
|
83 |
unselecting: $this.hasClass( "ui-unselecting" ) |
|
84 |
} ); |
|
85 |
} ); |
|
86 |
}; |
|
87 |
this.refresh(); |
|
88 |
||
89 |
this._mouseInit(); |
|
90 |
||
91 |
this.helper = $( "<div>" ); |
|
92 |
this._addClass( this.helper, "ui-selectable-helper" ); |
|
93 |
}, |
|
94 |
||
95 |
_destroy: function() { |
|
96 |
this.selectees.removeData( "selectable-item" ); |
|
97 |
this._mouseDestroy(); |
|
98 |
}, |
|
99 |
||
100 |
_mouseStart: function( event ) { |
|
101 |
var that = this, |
|
102 |
options = this.options; |
|
103 |
||
104 |
this.opos = [ event.pageX, event.pageY ]; |
|
105 |
this.elementPos = $( this.element[ 0 ] ).offset(); |
|
106 |
||
107 |
if ( this.options.disabled ) { |
|
108 |
return; |
|
109 |
} |
|
110 |
||
111 |
this.selectees = $( options.filter, this.element[ 0 ] ); |
|
112 |
||
113 |
this._trigger( "start", event ); |
|
114 |
||
115 |
$( options.appendTo ).append( this.helper ); |
|
116 |
||
117 |
// position helper (lasso) |
|
118 |
this.helper.css( { |
|
119 |
"left": event.pageX, |
|
120 |
"top": event.pageY, |
|
121 |
"width": 0, |
|
122 |
"height": 0 |
|
123 |
} ); |
|
124 |
||
125 |
if ( options.autoRefresh ) { |
|
126 |
this.refresh(); |
|
127 |
} |
|
128 |
||
129 |
this.selectees.filter( ".ui-selected" ).each( function() { |
|
130 |
var selectee = $.data( this, "selectable-item" ); |
|
131 |
selectee.startselected = true; |
|
132 |
if ( !event.metaKey && !event.ctrlKey ) { |
|
133 |
that._removeClass( selectee.$element, "ui-selected" ); |
|
134 |
selectee.selected = false; |
|
135 |
that._addClass( selectee.$element, "ui-unselecting" ); |
|
136 |
selectee.unselecting = true; |
|
137 |
||
138 |
// selectable UNSELECTING callback |
|
139 |
that._trigger( "unselecting", event, { |
|
140 |
unselecting: selectee.element |
|
141 |
} ); |
|
142 |
} |
|
143 |
} ); |
|
144 |
||
145 |
$( event.target ).parents().addBack().each( function() { |
|
146 |
var doSelect, |
|
147 |
selectee = $.data( this, "selectable-item" ); |
|
148 |
if ( selectee ) { |
|
149 |
doSelect = ( !event.metaKey && !event.ctrlKey ) || |
|
150 |
!selectee.$element.hasClass( "ui-selected" ); |
|
151 |
that._removeClass( selectee.$element, doSelect ? "ui-unselecting" : "ui-selected" ) |
|
152 |
._addClass( selectee.$element, doSelect ? "ui-selecting" : "ui-unselecting" ); |
|
153 |
selectee.unselecting = !doSelect; |
|
154 |
selectee.selecting = doSelect; |
|
155 |
selectee.selected = doSelect; |
|
156 |
||
157 |
// selectable (UN)SELECTING callback |
|
158 |
if ( doSelect ) { |
|
159 |
that._trigger( "selecting", event, { |
|
160 |
selecting: selectee.element |
|
161 |
} ); |
|
162 |
} else { |
|
163 |
that._trigger( "unselecting", event, { |
|
164 |
unselecting: selectee.element |
|
165 |
} ); |
|
166 |
} |
|
167 |
return false; |
|
168 |
} |
|
169 |
} ); |
|
170 |
||
171 |
}, |
|
172 |
||
173 |
_mouseDrag: function( event ) { |
|
174 |
||
175 |
this.dragged = true; |
|
176 |
||
177 |
if ( this.options.disabled ) { |
|
178 |
return; |
|
179 |
} |
|
180 |
||
181 |
var tmp, |
|
182 |
that = this, |
|
183 |
options = this.options, |
|
184 |
x1 = this.opos[ 0 ], |
|
185 |
y1 = this.opos[ 1 ], |
|
186 |
x2 = event.pageX, |
|
187 |
y2 = event.pageY; |
|
188 |
||
19 | 189 |
if ( x1 > x2 ) { |
190 |
tmp = x2; x2 = x1; x1 = tmp; |
|
191 |
} |
|
192 |
if ( y1 > y2 ) { |
|
193 |
tmp = y2; y2 = y1; y1 = tmp; |
|
194 |
} |
|
18 | 195 |
this.helper.css( { left: x1, top: y1, width: x2 - x1, height: y2 - y1 } ); |
196 |
||
197 |
this.selectees.each( function() { |
|
198 |
var selectee = $.data( this, "selectable-item" ), |
|
199 |
hit = false, |
|
200 |
offset = {}; |
|
201 |
||
202 |
//prevent helper from being selected if appendTo: selectable |
|
203 |
if ( !selectee || selectee.element === that.element[ 0 ] ) { |
|
204 |
return; |
|
205 |
} |
|
206 |
||
207 |
offset.left = selectee.left + that.elementPos.left; |
|
208 |
offset.right = selectee.right + that.elementPos.left; |
|
209 |
offset.top = selectee.top + that.elementPos.top; |
|
210 |
offset.bottom = selectee.bottom + that.elementPos.top; |
|
211 |
||
212 |
if ( options.tolerance === "touch" ) { |
|
213 |
hit = ( !( offset.left > x2 || offset.right < x1 || offset.top > y2 || |
|
21
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
214 |
offset.bottom < y1 ) ); |
18 | 215 |
} else if ( options.tolerance === "fit" ) { |
216 |
hit = ( offset.left > x1 && offset.right < x2 && offset.top > y1 && |
|
21
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
217 |
offset.bottom < y2 ); |
18 | 218 |
} |
219 |
||
220 |
if ( hit ) { |
|
221 |
||
222 |
// SELECT |
|
223 |
if ( selectee.selected ) { |
|
224 |
that._removeClass( selectee.$element, "ui-selected" ); |
|
225 |
selectee.selected = false; |
|
226 |
} |
|
227 |
if ( selectee.unselecting ) { |
|
228 |
that._removeClass( selectee.$element, "ui-unselecting" ); |
|
229 |
selectee.unselecting = false; |
|
230 |
} |
|
231 |
if ( !selectee.selecting ) { |
|
232 |
that._addClass( selectee.$element, "ui-selecting" ); |
|
233 |
selectee.selecting = true; |
|
234 |
||
235 |
// selectable SELECTING callback |
|
236 |
that._trigger( "selecting", event, { |
|
237 |
selecting: selectee.element |
|
238 |
} ); |
|
239 |
} |
|
240 |
} else { |
|
241 |
||
242 |
// UNSELECT |
|
243 |
if ( selectee.selecting ) { |
|
244 |
if ( ( event.metaKey || event.ctrlKey ) && selectee.startselected ) { |
|
245 |
that._removeClass( selectee.$element, "ui-selecting" ); |
|
246 |
selectee.selecting = false; |
|
247 |
that._addClass( selectee.$element, "ui-selected" ); |
|
248 |
selectee.selected = true; |
|
249 |
} else { |
|
250 |
that._removeClass( selectee.$element, "ui-selecting" ); |
|
251 |
selectee.selecting = false; |
|
252 |
if ( selectee.startselected ) { |
|
253 |
that._addClass( selectee.$element, "ui-unselecting" ); |
|
254 |
selectee.unselecting = true; |
|
255 |
} |
|
256 |
||
257 |
// selectable UNSELECTING callback |
|
258 |
that._trigger( "unselecting", event, { |
|
259 |
unselecting: selectee.element |
|
260 |
} ); |
|
261 |
} |
|
262 |
} |
|
263 |
if ( selectee.selected ) { |
|
264 |
if ( !event.metaKey && !event.ctrlKey && !selectee.startselected ) { |
|
265 |
that._removeClass( selectee.$element, "ui-selected" ); |
|
266 |
selectee.selected = false; |
|
267 |
||
268 |
that._addClass( selectee.$element, "ui-unselecting" ); |
|
269 |
selectee.unselecting = true; |
|
270 |
||
271 |
// selectable UNSELECTING callback |
|
272 |
that._trigger( "unselecting", event, { |
|
273 |
unselecting: selectee.element |
|
274 |
} ); |
|
275 |
} |
|
276 |
} |
|
277 |
} |
|
278 |
} ); |
|
279 |
||
280 |
return false; |
|
281 |
}, |
|
282 |
||
283 |
_mouseStop: function( event ) { |
|
284 |
var that = this; |
|
285 |
||
286 |
this.dragged = false; |
|
287 |
||
288 |
$( ".ui-unselecting", this.element[ 0 ] ).each( function() { |
|
289 |
var selectee = $.data( this, "selectable-item" ); |
|
290 |
that._removeClass( selectee.$element, "ui-unselecting" ); |
|
291 |
selectee.unselecting = false; |
|
292 |
selectee.startselected = false; |
|
293 |
that._trigger( "unselected", event, { |
|
294 |
unselected: selectee.element |
|
295 |
} ); |
|
296 |
} ); |
|
297 |
$( ".ui-selecting", this.element[ 0 ] ).each( function() { |
|
298 |
var selectee = $.data( this, "selectable-item" ); |
|
299 |
that._removeClass( selectee.$element, "ui-selecting" ) |
|
300 |
._addClass( selectee.$element, "ui-selected" ); |
|
301 |
selectee.selecting = false; |
|
302 |
selectee.selected = true; |
|
303 |
selectee.startselected = true; |
|
304 |
that._trigger( "selected", event, { |
|
305 |
selected: selectee.element |
|
306 |
} ); |
|
307 |
} ); |
|
308 |
this._trigger( "stop", event ); |
|
309 |
||
310 |
this.helper.remove(); |
|
311 |
||
312 |
return false; |
|
313 |
} |
|
314 |
||
315 |
} ); |
|
316 |
||
19 | 317 |
} ); |